@clerk/ui 1.32.3-snapshot.v20260904162929 → 1.32.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ClerkUI.js +2 -2
- package/dist/components/SignIn/shared.js +1 -1
- package/dist/components/SignIn/shared.js.map +1 -1
- package/dist/components/UserVerification/AlternativeMethods.js +2 -2
- package/dist/components/UserVerification/AlternativeMethods.js.map +1 -1
- package/dist/components/UserVerification/UVFactorTwoBackupCodeCard.js.map +1 -1
- package/dist/components/UserVerification/UserVerificationFactorOne.js +4 -4
- package/dist/components/UserVerification/UserVerificationFactorOne.js.map +1 -1
- package/dist/components/UserVerification/UserVerificationFactorTwo.js +1 -1
- package/dist/components/UserVerification/UserVerificationFactorTwo.js.map +1 -1
- package/dist/components/UserVerification/useReverificationAlternativeStrategies.js +2 -5
- package/dist/components/UserVerification/useReverificationAlternativeStrategies.js.map +1 -1
- package/dist/components/devPrompts/KeylessPrompt/index.js +1 -1
- package/dist/components/devPrompts/KeylessPrompt/index.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{keylessPrompt_ui_11be05_1.32.3-snapshot.v20260904162929.js → keylessPrompt_ui_556274_1.32.3.js} +1 -1
- package/dist/{keylessPrompt_ui_86e282_1.32.3-snapshot.v20260904162929.js → keylessPrompt_ui_7d0851_1.32.3.js} +1 -1
- package/dist/{keylessPrompt_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → keylessPrompt_ui_d0fd36_1.32.3.js} +1 -1
- package/dist/no-rhc/ClerkUI.js +2 -2
- package/dist/no-rhc/components/SignIn/shared.js +1 -1
- package/dist/no-rhc/components/SignIn/shared.js.map +1 -1
- package/dist/no-rhc/components/UserVerification/AlternativeMethods.js +2 -2
- package/dist/no-rhc/components/UserVerification/AlternativeMethods.js.map +1 -1
- package/dist/no-rhc/components/UserVerification/UVFactorTwoBackupCodeCard.js.map +1 -1
- package/dist/no-rhc/components/UserVerification/UserVerificationFactorOne.js +4 -4
- package/dist/no-rhc/components/UserVerification/UserVerificationFactorOne.js.map +1 -1
- package/dist/no-rhc/components/UserVerification/UserVerificationFactorTwo.js +1 -1
- package/dist/no-rhc/components/UserVerification/UserVerificationFactorTwo.js.map +1 -1
- package/dist/no-rhc/components/UserVerification/useReverificationAlternativeStrategies.js +2 -5
- package/dist/no-rhc/components/UserVerification/useReverificationAlternativeStrategies.js.map +1 -1
- package/dist/no-rhc/components/devPrompts/KeylessPrompt/index.js +1 -1
- package/dist/no-rhc/components/devPrompts/KeylessPrompt/index.js.map +1 -1
- package/dist/no-rhc/index.js +1 -1
- package/dist/server.js +1 -1
- package/dist/signin_ui_556274_1.32.3.js +1 -0
- package/dist/signin_ui_7d0851_1.32.3.js +1 -0
- package/dist/signin_ui_d0fd36_1.32.3.js +1 -0
- package/dist/{ui-common_ui_11be05_1.32.3-snapshot.v20260904162929.js → ui-common_ui_556274_1.32.3.js} +3 -3
- package/dist/{ui-common_ui_86e282_1.32.3-snapshot.v20260904162929.js → ui-common_ui_7d0851_1.32.3.js} +1 -1
- package/dist/{ui-common_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → ui-common_ui_d0fd36_1.32.3.js} +4 -4
- package/dist/ui.browser.js +7 -7
- package/dist/ui.legacy.browser.js +1 -1
- package/dist/ui.shared.browser.js +7 -7
- package/dist/userverification_ui_556274_1.32.3.js +1 -0
- package/dist/userverification_ui_7d0851_1.32.3.js +1 -0
- package/dist/userverification_ui_d0fd36_1.32.3.js +1 -0
- package/dist-mosaic/index.d.ts +2 -0
- package/dist-mosaic/index.d.ts.map +1 -1
- package/dist-mosaic/index.js +5 -4
- package/dist-mosaic/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/signin_ui_11be05_1.32.3-snapshot.v20260904162929.js +0 -1
- package/dist/signin_ui_86e282_1.32.3-snapshot.v20260904162929.js +0 -1
- package/dist/signin_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js +0 -1
- package/dist/userverification_ui_11be05_1.32.3-snapshot.v20260904162929.js +0 -1
- package/dist/userverification_ui_86e282_1.32.3-snapshot.v20260904162929.js +0 -1
- package/dist/userverification_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js +0 -1
- /package/dist/{2014_ui_11be05_1.32.3-snapshot.v20260904162929.js → 2014_ui_556274_1.32.3.js} +0 -0
- /package/dist/{2014_ui_86e282_1.32.3-snapshot.v20260904162929.js → 2014_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{2014_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → 2014_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{4424_ui_11be05_1.32.3-snapshot.v20260904162929.js → 4424_ui_556274_1.32.3.js} +0 -0
- /package/dist/{4424_ui_86e282_1.32.3-snapshot.v20260904162929.js → 4424_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{4424_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → 4424_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{6678_ui_11be05_1.32.3-snapshot.v20260904162929.js → 6678_ui_556274_1.32.3.js} +0 -0
- /package/dist/{6678_ui_86e282_1.32.3-snapshot.v20260904162929.js → 6678_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{6678_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → 6678_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{7574_ui_11be05_1.32.3-snapshot.v20260904162929.js → 7574_ui_556274_1.32.3.js} +0 -0
- /package/dist/{7574_ui_86e282_1.32.3-snapshot.v20260904162929.js → 7574_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{7574_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → 7574_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{8316_ui_11be05_1.32.3-snapshot.v20260904162929.js → 8316_ui_556274_1.32.3.js} +0 -0
- /package/dist/{8316_ui_86e282_1.32.3-snapshot.v20260904162929.js → 8316_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{8316_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → 8316_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{8746_ui_11be05_1.32.3-snapshot.v20260904162929.js → 8746_ui_556274_1.32.3.js} +0 -0
- /package/dist/{8746_ui_86e282_1.32.3-snapshot.v20260904162929.js → 8746_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{8746_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → 8746_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{9419_ui_11be05_1.32.3-snapshot.v20260904162929.js → 9419_ui_556274_1.32.3.js} +0 -0
- /package/dist/{9419_ui_86e282_1.32.3-snapshot.v20260904162929.js → 9419_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{9419_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → 9419_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{980_ui_11be05_1.32.3-snapshot.v20260904162929.js → 980_ui_556274_1.32.3.js} +0 -0
- /package/dist/{980_ui_86e282_1.32.3-snapshot.v20260904162929.js → 980_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{980_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → 980_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{apiKeys_ui_11be05_1.32.3-snapshot.v20260904162929.js → apiKeys_ui_556274_1.32.3.js} +0 -0
- /package/dist/{apiKeys_ui_86e282_1.32.3-snapshot.v20260904162929.js → apiKeys_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{apiKeys_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → apiKeys_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{blankcaptcha_ui_11be05_1.32.3-snapshot.v20260904162929.js → blankcaptcha_ui_556274_1.32.3.js} +0 -0
- /package/dist/{blankcaptcha_ui_86e282_1.32.3-snapshot.v20260904162929.js → blankcaptcha_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{blankcaptcha_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → blankcaptcha_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{checkout_ui_11be05_1.32.3-snapshot.v20260904162929.js → checkout_ui_556274_1.32.3.js} +0 -0
- /package/dist/{checkout_ui_86e282_1.32.3-snapshot.v20260904162929.js → checkout_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{checkout_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → checkout_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{configureSSO_ui_11be05_1.32.3-snapshot.v20260904162929.js → configureSSO_ui_556274_1.32.3.js} +0 -0
- /package/dist/{configureSSO_ui_86e282_1.32.3-snapshot.v20260904162929.js → configureSSO_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{configureSSO_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → configureSSO_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{copy-api-key-modal_ui_11be05_1.32.3-snapshot.v20260904162929.js → copy-api-key-modal_ui_556274_1.32.3.js} +0 -0
- /package/dist/{copy-api-key-modal_ui_86e282_1.32.3-snapshot.v20260904162929.js → copy-api-key-modal_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{copy-api-key-modal_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → copy-api-key-modal_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{createorganization_ui_11be05_1.32.3-snapshot.v20260904162929.js → createorganization_ui_556274_1.32.3.js} +0 -0
- /package/dist/{createorganization_ui_86e282_1.32.3-snapshot.v20260904162929.js → createorganization_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{createorganization_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → createorganization_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{credit-history-page_ui_11be05_1.32.3-snapshot.v20260904162929.js → credit-history-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{credit-history-page_ui_86e282_1.32.3-snapshot.v20260904162929.js → credit-history-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{credit-history-page_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → credit-history-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{enableOrganizationsPrompt_ui_11be05_1.32.3-snapshot.v20260904162929.js → enableOrganizationsPrompt_ui_556274_1.32.3.js} +0 -0
- /package/dist/{enableOrganizationsPrompt_ui_86e282_1.32.3-snapshot.v20260904162929.js → enableOrganizationsPrompt_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{enableOrganizationsPrompt_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → enableOrganizationsPrompt_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{framework_ui_86e282_1.32.3-snapshot.v20260904162929.js → framework_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{framework_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → framework_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{impersonationfab_ui_11be05_1.32.3-snapshot.v20260904162929.js → impersonationfab_ui_556274_1.32.3.js} +0 -0
- /package/dist/{impersonationfab_ui_86e282_1.32.3-snapshot.v20260904162929.js → impersonationfab_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{impersonationfab_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → impersonationfab_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{invitemembers_ui_11be05_1.32.3-snapshot.v20260904162929.js → invitemembers_ui_556274_1.32.3.js} +0 -0
- /package/dist/{invitemembers_ui_86e282_1.32.3-snapshot.v20260904162929.js → invitemembers_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{invitemembers_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → invitemembers_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{oauthConsent_ui_11be05_1.32.3-snapshot.v20260904162929.js → oauthConsent_ui_556274_1.32.3.js} +0 -0
- /package/dist/{oauthConsent_ui_86e282_1.32.3-snapshot.v20260904162929.js → oauthConsent_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{oauthConsent_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → oauthConsent_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{oauthDeviceVerification_ui_11be05_1.32.3-snapshot.v20260904162929.js → oauthDeviceVerification_ui_556274_1.32.3.js} +0 -0
- /package/dist/{oauthDeviceVerification_ui_86e282_1.32.3-snapshot.v20260904162929.js → oauthDeviceVerification_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{oauthDeviceVerification_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → oauthDeviceVerification_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{onetap_ui_11be05_1.32.3-snapshot.v20260904162929.js → onetap_ui_556274_1.32.3.js} +0 -0
- /package/dist/{onetap_ui_86e282_1.32.3-snapshot.v20260904162929.js → onetap_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{onetap_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → onetap_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{op-api-keys-page_ui_11be05_1.32.3-snapshot.v20260904162929.js → op-api-keys-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{op-api-keys-page_ui_86e282_1.32.3-snapshot.v20260904162929.js → op-api-keys-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{op-api-keys-page_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → op-api-keys-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{op-billing-page_ui_11be05_1.32.3-snapshot.v20260904162929.js → op-billing-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{op-billing-page_ui_86e282_1.32.3-snapshot.v20260904162929.js → op-billing-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{op-billing-page_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → op-billing-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{op-plans-page_ui_11be05_1.32.3-snapshot.v20260904162929.js → op-plans-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{op-plans-page_ui_86e282_1.32.3-snapshot.v20260904162929.js → op-plans-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{op-plans-page_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → op-plans-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{op-security-page_ui_11be05_1.32.3-snapshot.v20260904162929.js → op-security-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{op-security-page_ui_86e282_1.32.3-snapshot.v20260904162929.js → op-security-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{op-security-page_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → op-security-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{organizationlist_ui_11be05_1.32.3-snapshot.v20260904162929.js → organizationlist_ui_556274_1.32.3.js} +0 -0
- /package/dist/{organizationlist_ui_86e282_1.32.3-snapshot.v20260904162929.js → organizationlist_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{organizationlist_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → organizationlist_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{organizationprofile_ui_11be05_1.32.3-snapshot.v20260904162929.js → organizationprofile_ui_556274_1.32.3.js} +0 -0
- /package/dist/{organizationprofile_ui_86e282_1.32.3-snapshot.v20260904162929.js → organizationprofile_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{organizationprofile_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → organizationprofile_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{organizationswitcher_ui_11be05_1.32.3-snapshot.v20260904162929.js → organizationswitcher_ui_556274_1.32.3.js} +0 -0
- /package/dist/{organizationswitcher_ui_86e282_1.32.3-snapshot.v20260904162929.js → organizationswitcher_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{organizationswitcher_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → organizationswitcher_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{payment-attempt-page_ui_11be05_1.32.3-snapshot.v20260904162929.js → payment-attempt-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{payment-attempt-page_ui_86e282_1.32.3-snapshot.v20260904162929.js → payment-attempt-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{payment-attempt-page_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → payment-attempt-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{planDetails_ui_11be05_1.32.3-snapshot.v20260904162929.js → planDetails_ui_556274_1.32.3.js} +0 -0
- /package/dist/{planDetails_ui_86e282_1.32.3-snapshot.v20260904162929.js → planDetails_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{planDetails_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → planDetails_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{prefetchorganizationlist_ui_11be05_1.32.3-snapshot.v20260904162929.js → prefetchorganizationlist_ui_556274_1.32.3.js} +0 -0
- /package/dist/{prefetchorganizationlist_ui_86e282_1.32.3-snapshot.v20260904162929.js → prefetchorganizationlist_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{prefetchorganizationlist_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → prefetchorganizationlist_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{pricingTable_ui_11be05_1.32.3-snapshot.v20260904162929.js → pricingTable_ui_556274_1.32.3.js} +0 -0
- /package/dist/{pricingTable_ui_86e282_1.32.3-snapshot.v20260904162929.js → pricingTable_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{pricingTable_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → pricingTable_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{revoke-api-key-modal_ui_11be05_1.32.3-snapshot.v20260904162929.js → revoke-api-key-modal_ui_556274_1.32.3.js} +0 -0
- /package/dist/{revoke-api-key-modal_ui_86e282_1.32.3-snapshot.v20260904162929.js → revoke-api-key-modal_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{revoke-api-key-modal_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → revoke-api-key-modal_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{sessionTasks_ui_11be05_1.32.3-snapshot.v20260904162929.js → sessionTasks_ui_556274_1.32.3.js} +0 -0
- /package/dist/{sessionTasks_ui_86e282_1.32.3-snapshot.v20260904162929.js → sessionTasks_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{sessionTasks_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → sessionTasks_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{signup_ui_11be05_1.32.3-snapshot.v20260904162929.js → signup_ui_556274_1.32.3.js} +0 -0
- /package/dist/{signup_ui_86e282_1.32.3-snapshot.v20260904162929.js → signup_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{signup_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → signup_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{statement-page_ui_11be05_1.32.3-snapshot.v20260904162929.js → statement-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{statement-page_ui_86e282_1.32.3-snapshot.v20260904162929.js → statement-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{statement-page_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → statement-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{subscriptionDetails_ui_11be05_1.32.3-snapshot.v20260904162929.js → subscriptionDetails_ui_556274_1.32.3.js} +0 -0
- /package/dist/{subscriptionDetails_ui_86e282_1.32.3-snapshot.v20260904162929.js → subscriptionDetails_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{subscriptionDetails_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → subscriptionDetails_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{taskChooseOrganization_ui_11be05_1.32.3-snapshot.v20260904162929.js → taskChooseOrganization_ui_556274_1.32.3.js} +0 -0
- /package/dist/{taskChooseOrganization_ui_86e282_1.32.3-snapshot.v20260904162929.js → taskChooseOrganization_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{taskChooseOrganization_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → taskChooseOrganization_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{taskResetPassword_ui_11be05_1.32.3-snapshot.v20260904162929.js → taskResetPassword_ui_556274_1.32.3.js} +0 -0
- /package/dist/{taskResetPassword_ui_86e282_1.32.3-snapshot.v20260904162929.js → taskResetPassword_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{taskResetPassword_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → taskResetPassword_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{taskSetupMFA_ui_11be05_1.32.3-snapshot.v20260904162929.js → taskSetupMFA_ui_556274_1.32.3.js} +0 -0
- /package/dist/{taskSetupMFA_ui_86e282_1.32.3-snapshot.v20260904162929.js → taskSetupMFA_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{taskSetupMFA_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → taskSetupMFA_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{up-api-keys-page_ui_11be05_1.32.3-snapshot.v20260904162929.js → up-api-keys-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{up-api-keys-page_ui_86e282_1.32.3-snapshot.v20260904162929.js → up-api-keys-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{up-api-keys-page_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → up-api-keys-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{up-billing-page_ui_11be05_1.32.3-snapshot.v20260904162929.js → up-billing-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{up-billing-page_ui_86e282_1.32.3-snapshot.v20260904162929.js → up-billing-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{up-billing-page_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → up-billing-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{up-plans-page_ui_11be05_1.32.3-snapshot.v20260904162929.js → up-plans-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{up-plans-page_ui_86e282_1.32.3-snapshot.v20260904162929.js → up-plans-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{up-plans-page_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → up-plans-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{useravatar_ui_11be05_1.32.3-snapshot.v20260904162929.js → useravatar_ui_556274_1.32.3.js} +0 -0
- /package/dist/{useravatar_ui_86e282_1.32.3-snapshot.v20260904162929.js → useravatar_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{useravatar_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → useravatar_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{userbutton_ui_11be05_1.32.3-snapshot.v20260904162929.js → userbutton_ui_556274_1.32.3.js} +0 -0
- /package/dist/{userbutton_ui_86e282_1.32.3-snapshot.v20260904162929.js → userbutton_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{userbutton_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → userbutton_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{userprofile_ui_11be05_1.32.3-snapshot.v20260904162929.js → userprofile_ui_556274_1.32.3.js} +0 -0
- /package/dist/{userprofile_ui_86e282_1.32.3-snapshot.v20260904162929.js → userprofile_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{userprofile_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → userprofile_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{vendors_ui_11be05_1.32.3-snapshot.v20260904162929.js → vendors_ui_556274_1.32.3.js} +0 -0
- /package/dist/{vendors_ui_86e282_1.32.3-snapshot.v20260904162929.js → vendors_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{vendors_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → vendors_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{waitlist_ui_11be05_1.32.3-snapshot.v20260904162929.js → waitlist_ui_556274_1.32.3.js} +0 -0
- /package/dist/{waitlist_ui_86e282_1.32.3-snapshot.v20260904162929.js → waitlist_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{waitlist_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → waitlist_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{web3-solana-wallet-buttons_ui_11be05_1.32.3-snapshot.v20260904162929.js → web3-solana-wallet-buttons_ui_556274_1.32.3.js} +0 -0
- /package/dist/{web3-solana-wallet-buttons_ui_86e282_1.32.3-snapshot.v20260904162929.js → web3-solana-wallet-buttons_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{web3-solana-wallet-buttons_ui_ccb7e1_1.32.3-snapshot.v20260904162929.js → web3-solana-wallet-buttons_ui_d0fd36_1.32.3.js} +0 -0
package/dist/ClerkUI.js
CHANGED
|
@@ -22,8 +22,8 @@ import { isVersionAtLeast, parseVersion } from "@clerk/shared/versionCheck";
|
|
|
22
22
|
* @public
|
|
23
23
|
*/
|
|
24
24
|
var ClerkUI = class ClerkUI {
|
|
25
|
-
static version = "1.32.3
|
|
26
|
-
version = "1.32.3
|
|
25
|
+
static version = "1.32.3";
|
|
26
|
+
version = "1.32.3";
|
|
27
27
|
#componentRenderer;
|
|
28
28
|
/**
|
|
29
29
|
* Creates a new `ClerkUI` instance and mounts the internal component renderer.
|
|
@@ -55,7 +55,7 @@ function useHandleAuthenticateWithPasskey(onSecondFactor, protectCheckPath = "..
|
|
|
55
55
|
const { flow } = args[0] || {};
|
|
56
56
|
if (isClerkRuntimeError(err)) {
|
|
57
57
|
if (err.code === "passkey_operation_aborted") return;
|
|
58
|
-
if (flow === "autofill" && err.code === "passkey_retrieval_cancelled") return;
|
|
58
|
+
if (flow === "autofill" && (err.code === "passkey_retrieval_cancelled" || err.code === "passkey_invalid_rpID_or_domain")) return;
|
|
59
59
|
}
|
|
60
60
|
if (isUserLockedError(err)) return __internal_navigateWithError("..", err.errors[0]);
|
|
61
61
|
handleError(err, [], card.setError);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","names":[],"sources":["../../../src/components/SignIn/shared.ts"],"sourcesContent":["import { isClerkRuntimeError, isUserLockedError } from '@clerk/shared/error';\nimport { clerkInvalidFAPIResponse } from '@clerk/shared/internal/clerk-js/errors';\nimport { __internal_WebAuthnAbortService } from '@clerk/shared/internal/clerk-js/passkeys';\nimport { useClerk } from '@clerk/shared/react';\nimport type { EnterpriseSSOFactor, SignInFirstFactor, SignInResource } from '@clerk/shared/types';\nimport { useCallback, useEffect } from 'react';\n\nimport { useCardState } from '@/ui/elements/contexts';\nimport { handleError } from '@/ui/utils/errorHandler';\n\nimport { useCoreSignIn, useSignInContext } from '../../contexts';\nimport { useSupportEmail } from '../../hooks/useSupportEmail';\nimport { useRouter } from '../../router';\nimport { navigateOnSignInProtectGate } from './handleProtectCheck';\n\n/** Search param set when navigating from the start page \"Forgot password?\" action. */\nexport const SIGN_IN_RESET_PASSWORD_INTENT_PARAM = '__clerk_reset_password';\n\n/**\n * @param onSecondFactor - invoked when the passkey attempt resolves to a second factor.\n * @param protectCheckPath - route to the protect-check card relative to the caller's mount.\n * Defaults to the factor-one mount (`'../protect-check'`); `SignInStart` (index route) must pass\n * `'protect-check'`, otherwise an autofill-triggered, gated passkey sign-in dead-ends at the app\n * root instead of `/sign-in/protect-check`.\n */\nfunction useHandleAuthenticateWithPasskey(\n onSecondFactor: () => Promise<unknown>,\n protectCheckPath = '../protect-check',\n): (...args: Parameters<SignInResource['authenticateWithPasskey']>) => Promise<unknown> {\n const card = useCardState();\n // @ts-expect-error -- private method for the time being\n const { setActive, __internal_navigateWithError } = useClerk();\n const supportEmail = useSupportEmail();\n const { afterSignInUrl, navigateOnSetActive } = useSignInContext();\n const { authenticateWithPasskey } = useCoreSignIn();\n const { navigate } = useRouter();\n\n useEffect(() => {\n return () => {\n __internal_WebAuthnAbortService.abort();\n };\n }, []);\n\n return useCallback(async (...args: Parameters<typeof authenticateWithPasskey>) => {\n try {\n const res = await authenticateWithPasskey(...args);\n // A protect_check gate can fire on attempt_first_factor, which is what\n // authenticateWithPasskey calls under the hood.\n if (navigateOnSignInProtectGate(res, navigate, protectCheckPath)) {\n return;\n }\n switch (res.status) {\n case 'complete':\n return setActive({\n session: res.createdSessionId,\n navigate: async ({ session, decorateUrl }) => {\n await navigateOnSetActive({ session, redirectUrl: afterSignInUrl, decorateUrl });\n },\n });\n case 'needs_second_factor':\n return onSecondFactor();\n default:\n return console.error(clerkInvalidFAPIResponse(res.status, supportEmail));\n }\n } catch (err: any) {\n const { flow } = args[0] || {};\n\n if (isClerkRuntimeError(err)) {\n // In any case if the call gets aborted we should skip showing an error. This prevents updating the state of unmounted components.\n if (err.code === 'passkey_operation_aborted') {\n return;\n }\n //
|
|
1
|
+
{"version":3,"file":"shared.js","names":[],"sources":["../../../src/components/SignIn/shared.ts"],"sourcesContent":["import { isClerkRuntimeError, isUserLockedError } from '@clerk/shared/error';\nimport { clerkInvalidFAPIResponse } from '@clerk/shared/internal/clerk-js/errors';\nimport { __internal_WebAuthnAbortService } from '@clerk/shared/internal/clerk-js/passkeys';\nimport { useClerk } from '@clerk/shared/react';\nimport type { EnterpriseSSOFactor, SignInFirstFactor, SignInResource } from '@clerk/shared/types';\nimport { useCallback, useEffect } from 'react';\n\nimport { useCardState } from '@/ui/elements/contexts';\nimport { handleError } from '@/ui/utils/errorHandler';\n\nimport { useCoreSignIn, useSignInContext } from '../../contexts';\nimport { useSupportEmail } from '../../hooks/useSupportEmail';\nimport { useRouter } from '../../router';\nimport { navigateOnSignInProtectGate } from './handleProtectCheck';\n\n/** Search param set when navigating from the start page \"Forgot password?\" action. */\nexport const SIGN_IN_RESET_PASSWORD_INTENT_PARAM = '__clerk_reset_password';\n\n/**\n * @param onSecondFactor - invoked when the passkey attempt resolves to a second factor.\n * @param protectCheckPath - route to the protect-check card relative to the caller's mount.\n * Defaults to the factor-one mount (`'../protect-check'`); `SignInStart` (index route) must pass\n * `'protect-check'`, otherwise an autofill-triggered, gated passkey sign-in dead-ends at the app\n * root instead of `/sign-in/protect-check`.\n */\nfunction useHandleAuthenticateWithPasskey(\n onSecondFactor: () => Promise<unknown>,\n protectCheckPath = '../protect-check',\n): (...args: Parameters<SignInResource['authenticateWithPasskey']>) => Promise<unknown> {\n const card = useCardState();\n // @ts-expect-error -- private method for the time being\n const { setActive, __internal_navigateWithError } = useClerk();\n const supportEmail = useSupportEmail();\n const { afterSignInUrl, navigateOnSetActive } = useSignInContext();\n const { authenticateWithPasskey } = useCoreSignIn();\n const { navigate } = useRouter();\n\n useEffect(() => {\n return () => {\n __internal_WebAuthnAbortService.abort();\n };\n }, []);\n\n return useCallback(async (...args: Parameters<typeof authenticateWithPasskey>) => {\n try {\n const res = await authenticateWithPasskey(...args);\n // A protect_check gate can fire on attempt_first_factor, which is what\n // authenticateWithPasskey calls under the hood.\n if (navigateOnSignInProtectGate(res, navigate, protectCheckPath)) {\n return;\n }\n switch (res.status) {\n case 'complete':\n return setActive({\n session: res.createdSessionId,\n navigate: async ({ session, decorateUrl }) => {\n await navigateOnSetActive({ session, redirectUrl: afterSignInUrl, decorateUrl });\n },\n });\n case 'needs_second_factor':\n return onSecondFactor();\n default:\n return console.error(clerkInvalidFAPIResponse(res.status, supportEmail));\n }\n } catch (err: any) {\n const { flow } = args[0] || {};\n\n if (isClerkRuntimeError(err)) {\n // In any case if the call gets aborted we should skip showing an error. This prevents updating the state of unmounted components.\n if (err.code === 'passkey_operation_aborted') {\n return;\n }\n // Autofill runs in the background, so browser rejections must not surface as form errors.\n if (\n flow === 'autofill' &&\n (err.code === 'passkey_retrieval_cancelled' || err.code === 'passkey_invalid_rpID_or_domain')\n ) {\n return;\n }\n }\n\n if (isUserLockedError(err)) {\n return __internal_navigateWithError('..', err.errors[0]);\n }\n handleError(err, [], card.setError);\n }\n }, []);\n}\n\n/**\n * Type guard that checks if all factors in the array are enterprise SSO factors\n * with both `enterpriseConnectionId` and `enterpriseConnectionName` properties.\n * This is used to determine if the user should be presented with a choice\n * between multiple enterprise connections.\n * @experimental\n */\nfunction hasMultipleEnterpriseConnections(\n factors: SignInFirstFactor[] | null,\n): factors is Array<EnterpriseSSOFactor & { enterpriseConnectionId: string; enterpriseConnectionName: string }> {\n if (!factors?.length) {\n return false;\n }\n\n return (\n factors.filter(\n factor =>\n factor.strategy === 'enterprise_sso' &&\n 'enterpriseConnectionId' in factor &&\n 'enterpriseConnectionName' in factor,\n ).length > 1\n );\n}\n\nexport { hasMultipleEnterpriseConnections, useHandleAuthenticateWithPasskey };\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAa,sCAAsC;;;;;;;;AASnD,SAAS,iCACP,gBACA,mBAAmB,oBACmE;CACtF,MAAM,OAAO,aAAa;CAE1B,MAAM,EAAE,WAAW,iCAAiC,SAAS;CAC7D,MAAM,eAAe,gBAAgB;CACrC,MAAM,EAAE,gBAAgB,wBAAwB,iBAAiB;CACjE,MAAM,EAAE,4BAA4B,cAAc;CAClD,MAAM,EAAE,aAAa,UAAU;CAE/B,gBAAgB;EACd,aAAa;GACX,gCAAgC,MAAM;EACxC;CACF,GAAG,CAAC,CAAC;CAEL,OAAO,YAAY,OAAO,GAAG,SAAqD;EAChF,IAAI;GACF,MAAM,MAAM,MAAM,wBAAwB,GAAG,IAAI;GAGjD,IAAI,4BAA4B,KAAK,UAAU,gBAAgB,GAC7D;GAEF,QAAQ,IAAI,QAAZ;IACE,KAAK,YACH,OAAO,UAAU;KACf,SAAS,IAAI;KACb,UAAU,OAAO,EAAE,SAAS,kBAAkB;MAC5C,MAAM,oBAAoB;OAAE;OAAS,aAAa;OAAgB;MAAY,CAAC;KACjF;IACF,CAAC;IACH,KAAK,uBACH,OAAO,eAAe;IACxB,SACE,OAAO,QAAQ,MAAM,yBAAyB,IAAI,QAAQ,YAAY,CAAC;GAC3E;EACF,SAAS,KAAU;GACjB,MAAM,EAAE,SAAS,KAAK,MAAM,CAAC;GAE7B,IAAI,oBAAoB,GAAG,GAAG;IAE5B,IAAI,IAAI,SAAS,6BACf;IAGF,IACE,SAAS,eACR,IAAI,SAAS,iCAAiC,IAAI,SAAS,mCAE5D;GAEJ;GAEA,IAAI,kBAAkB,GAAG,GACvB,OAAO,6BAA6B,MAAM,IAAI,OAAO,EAAE;GAEzD,YAAY,KAAK,CAAC,GAAG,KAAK,QAAQ;EACpC;CACF,GAAG,CAAC,CAAC;AACP;;;;;;;;AASA,SAAS,iCACP,SAC8G;CAC9G,IAAI,CAAC,SAAS,QACZ,OAAO;CAGT,OACE,QAAQ,QACN,WACE,OAAO,aAAa,oBACpB,4BAA4B,UAC5B,8BAA8B,MAClC,CAAC,CAAC,SAAS;AAEf"}
|
|
@@ -27,7 +27,7 @@ const AlternativeMethodsList = (props) => {
|
|
|
27
27
|
const { onBackLinkClick, onHavingTroubleClick, onFactorSelected } = props;
|
|
28
28
|
const card = useCardState();
|
|
29
29
|
const { data } = useUserVerificationSession();
|
|
30
|
-
const { firstPartyFactors,
|
|
30
|
+
const { firstPartyFactors, hasAlternativeStrategies } = useReverificationAlternativeStrategies({
|
|
31
31
|
filterOutFactor: props?.currentFactor,
|
|
32
32
|
supportedFirstFactors: data?.supportedFirstFactors
|
|
33
33
|
});
|
|
@@ -42,7 +42,7 @@ const AlternativeMethodsList = (props) => {
|
|
|
42
42
|
gap: 6,
|
|
43
43
|
children: /* @__PURE__ */ jsxs(Col, {
|
|
44
44
|
gap: 4,
|
|
45
|
-
children: [
|
|
45
|
+
children: [hasAlternativeStrategies && /* @__PURE__ */ jsx(Flex, {
|
|
46
46
|
elementDescriptor: descriptors.alternativeMethods,
|
|
47
47
|
direction: "col",
|
|
48
48
|
gap: 2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlternativeMethods.js","names":["Envelope","SpeechBubble","Lock","Fingerprint","Building"],"sources":["../../../src/components/UserVerification/AlternativeMethods.tsx"],"sourcesContent":["import type { SessionVerificationFirstFactor, SignInFactor } from '@clerk/shared/types';\nimport React from 'react';\n\nimport { ArrowBlockButton } from '@/ui/elements/ArrowBlockButton';\nimport { BackLink } from '@/ui/elements/BackLink';\nimport { Card } from '@/ui/elements/Card';\nimport { Header } from '@/ui/elements/Header';\nimport { formatSafeIdentifier } from '@/ui/utils/formatSafeIdentifier';\n\nimport type { LocalizationKey } from '../../customizables';\nimport { Col, descriptors, Flex, Flow, localizationKeys } from '../../customizables';\nimport { useCardState } from '../../elements/contexts';\nimport { Building, Envelope, Fingerprint, Lock, SpeechBubble } from '../../icons';\nimport { useReverificationAlternativeStrategies } from './useReverificationAlternativeStrategies';\nimport { useUserVerificationSession } from './useUserVerificationSession';\nimport { withHavingTrouble } from './withHavingTrouble';\n\nexport type AlternativeMethodsProps = {\n onBackLinkClick: React.MouseEventHandler | undefined;\n onFactorSelected: (factor: SignInFactor) => void;\n currentFactor: SignInFactor | undefined | null;\n};\n\nexport type AlternativeMethodListProps = AlternativeMethodsProps & { onHavingTroubleClick: React.MouseEventHandler };\n\nexport const AlternativeMethods = (props: AlternativeMethodsProps) => {\n return withHavingTrouble(AlternativeMethodsList, {\n ...props,\n });\n};\n\nconst AlternativeMethodsList = (props: AlternativeMethodListProps) => {\n const { onBackLinkClick, onHavingTroubleClick, onFactorSelected } = props;\n const card = useCardState();\n const { data } = useUserVerificationSession();\n const { firstPartyFactors,
|
|
1
|
+
{"version":3,"file":"AlternativeMethods.js","names":["Envelope","SpeechBubble","Lock","Fingerprint","Building"],"sources":["../../../src/components/UserVerification/AlternativeMethods.tsx"],"sourcesContent":["import type { SessionVerificationFirstFactor, SignInFactor } from '@clerk/shared/types';\nimport React from 'react';\n\nimport { ArrowBlockButton } from '@/ui/elements/ArrowBlockButton';\nimport { BackLink } from '@/ui/elements/BackLink';\nimport { Card } from '@/ui/elements/Card';\nimport { Header } from '@/ui/elements/Header';\nimport { formatSafeIdentifier } from '@/ui/utils/formatSafeIdentifier';\n\nimport type { LocalizationKey } from '../../customizables';\nimport { Col, descriptors, Flex, Flow, localizationKeys } from '../../customizables';\nimport { useCardState } from '../../elements/contexts';\nimport { Building, Envelope, Fingerprint, Lock, SpeechBubble } from '../../icons';\nimport { useReverificationAlternativeStrategies } from './useReverificationAlternativeStrategies';\nimport { useUserVerificationSession } from './useUserVerificationSession';\nimport { withHavingTrouble } from './withHavingTrouble';\n\nexport type AlternativeMethodsProps = {\n onBackLinkClick: React.MouseEventHandler | undefined;\n onFactorSelected: (factor: SignInFactor) => void;\n currentFactor: SignInFactor | undefined | null;\n};\n\nexport type AlternativeMethodListProps = AlternativeMethodsProps & { onHavingTroubleClick: React.MouseEventHandler };\n\nexport const AlternativeMethods = (props: AlternativeMethodsProps) => {\n return withHavingTrouble(AlternativeMethodsList, {\n ...props,\n });\n};\n\nconst AlternativeMethodsList = (props: AlternativeMethodListProps) => {\n const { onBackLinkClick, onHavingTroubleClick, onFactorSelected } = props;\n const card = useCardState();\n const { data } = useUserVerificationSession();\n const { firstPartyFactors, hasAlternativeStrategies } =\n useReverificationAlternativeStrategies<SessionVerificationFirstFactor>({\n filterOutFactor: props?.currentFactor,\n supportedFirstFactors: data?.supportedFirstFactors,\n });\n\n return (\n <Flow.Part part={'alternativeMethods'}>\n <Card.Root>\n <Card.Content>\n <Header.Root>\n <Header.Title localizationKey={localizationKeys('reverification.alternativeMethods.title')} />\n <Header.Subtitle localizationKey={localizationKeys('reverification.alternativeMethods.subtitle')} />\n </Header.Root>\n <Card.Alert>{card.error}</Card.Alert>\n {/*TODO: extract main in its own component */}\n <Flex\n direction='col'\n elementDescriptor={descriptors.main}\n gap={6}\n >\n <Col gap={4}>\n {hasAlternativeStrategies && (\n <Flex\n elementDescriptor={descriptors.alternativeMethods}\n direction='col'\n gap={2}\n >\n {firstPartyFactors.map((factor, i) => (\n <ArrowBlockButton\n leftIcon={getButtonIcon(factor)}\n textLocalizationKey={getButtonLabel(factor)}\n elementDescriptor={descriptors.alternativeMethodsBlockButton}\n textElementDescriptor={descriptors.alternativeMethodsBlockButtonText}\n arrowElementDescriptor={descriptors.alternativeMethodsBlockButtonArrow}\n key={i}\n textVariant='buttonLarge'\n isDisabled={card.isLoading}\n onClick={() => {\n card.setError(undefined);\n onFactorSelected(factor);\n }}\n />\n ))}\n </Flex>\n )}\n {onBackLinkClick && (\n <BackLink\n boxElementDescriptor={descriptors.backRow}\n linkElementDescriptor={descriptors.backLink}\n onClick={onBackLinkClick}\n />\n )}\n </Col>\n </Flex>\n </Card.Content>\n\n <Card.Footer>\n <Card.Action elementId='havingTrouble'>\n <Card.ActionText localizationKey={localizationKeys('reverification.alternativeMethods.actionText')} />\n <Card.ActionLink\n localizationKey={localizationKeys('reverification.alternativeMethods.actionLink')}\n onClick={onHavingTroubleClick}\n />\n </Card.Action>\n </Card.Footer>\n </Card.Root>\n </Flow.Part>\n );\n};\n\nexport function getButtonLabel(factor: SessionVerificationFirstFactor): LocalizationKey {\n switch (factor.strategy) {\n case 'email_code':\n return localizationKeys('reverification.alternativeMethods.blockButton__emailCode', {\n identifier: formatSafeIdentifier(factor.safeIdentifier) || '',\n });\n case 'phone_code':\n return localizationKeys('reverification.alternativeMethods.blockButton__phoneCode', {\n identifier: formatSafeIdentifier(factor.safeIdentifier) || '',\n });\n case 'password':\n return localizationKeys('reverification.alternativeMethods.blockButton__password');\n case 'passkey':\n return localizationKeys('reverification.alternativeMethods.blockButton__passkey');\n default:\n throw new Error(`Invalid sign in strategy: \"${(factor as any).strategy}\"`);\n }\n}\n\nexport function getButtonIcon(factor: SessionVerificationFirstFactor) {\n const icons = {\n email_code: Envelope,\n phone_code: SpeechBubble,\n password: Lock,\n passkey: Fingerprint,\n enterprise_sso: Building,\n } as const;\n\n return icons[factor.strategy];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAa,sBAAsB,UAAmC;CACpE,OAAO,kBAAkB,wBAAwB,EAC/C,GAAG,MACL,CAAC;AACH;AAEA,MAAM,0BAA0B,UAAsC;CACpE,MAAM,EAAE,iBAAiB,sBAAsB,qBAAqB;CACpE,MAAM,OAAO,aAAa;CAC1B,MAAM,EAAE,SAAS,2BAA2B;CAC5C,MAAM,EAAE,mBAAmB,6BACzB,uCAAuE;EACrE,iBAAiB,OAAO;EACxB,uBAAuB,MAAM;CAC/B,CAAC;CAEH,OACE,oBAAC,KAAK,MAAN;EAAW,MAAM;YACf,qBAAC,KAAK,MAAN,aACE,qBAAC,KAAK,SAAN;GACE,qBAAC,OAAO,MAAR,aACE,oBAAC,OAAO,OAAR,EAAc,iBAAiB,iBAAiB,yCAAyC,EAAI,IAC7F,oBAAC,OAAO,UAAR,EAAiB,iBAAiB,iBAAiB,4CAA4C,EAAI,EACxF;GACb,oBAAC,KAAK,OAAN,YAAa,KAAK,MAAkB;GAEpC,oBAAC,MAAD;IACE,WAAU;IACV,mBAAmB,YAAY;IAC/B,KAAK;cAEL,qBAAC,KAAD;KAAK,KAAK;eAAV,CACG,4BACC,oBAAC,MAAD;MACE,mBAAmB,YAAY;MAC/B,WAAU;MACV,KAAK;gBAEJ,kBAAkB,KAAK,QAAQ,MAC9B,oBAAC,kBAAD;OACE,UAAU,cAAc,MAAM;OAC9B,qBAAqB,eAAe,MAAM;OAC1C,mBAAmB,YAAY;OAC/B,uBAAuB,YAAY;OACnC,wBAAwB,YAAY;OAEpC,aAAY;OACZ,YAAY,KAAK;OACjB,eAAe;QACb,KAAK,SAAS,MAAS;QACvB,iBAAiB,MAAM;OACzB;MACD,GAPM,CAON,CACF;KACG,IAEP,mBACC,oBAAC,UAAD;MACE,sBAAsB,YAAY;MAClC,uBAAuB,YAAY;MACnC,SAAS;KACV,EAEA;;GACD;EACM,MAEd,oBAAC,KAAK,QAAN,YACE,qBAAC,KAAK,QAAN;GAAa,WAAU;aAAvB,CACE,oBAAC,KAAK,YAAN,EAAiB,iBAAiB,iBAAiB,8CAA8C,EAAI,IACrG,oBAAC,KAAK,YAAN;IACE,iBAAiB,iBAAiB,8CAA8C;IAChF,SAAS;GACV,EACU;KACF,EACJ;CACF;AAEf;AAEA,SAAgB,eAAe,QAAyD;CACtF,QAAQ,OAAO,UAAf;EACE,KAAK,cACH,OAAO,iBAAiB,4DAA4D,EAClF,YAAY,qBAAqB,OAAO,cAAc,KAAK,GAC7D,CAAC;EACH,KAAK,cACH,OAAO,iBAAiB,4DAA4D,EAClF,YAAY,qBAAqB,OAAO,cAAc,KAAK,GAC7D,CAAC;EACH,KAAK,YACH,OAAO,iBAAiB,yDAAyD;EACnF,KAAK,WACH,OAAO,iBAAiB,wDAAwD;EAClF,SACE,MAAM,IAAI,MAAM,8BAA+B,OAAe,SAAS,EAAE;CAC7E;AACF;AAEA,SAAgB,cAAc,QAAwC;CASpE,OAAO;EAPL,YAAYA;EACZ,YAAYC;EACZ,UAAUC;EACV,SAASC;EACT,gBAAgBC;CAGP,EAAE,OAAO;AACtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UVFactorTwoBackupCodeCard.js","names":[],"sources":["../../../src/components/UserVerification/UVFactorTwoBackupCodeCard.tsx"],"sourcesContent":["import { useSession } from '@clerk/shared/react';\nimport React from 'react';\n\nimport { Card } from '@/ui/elements/Card';\nimport { useCardState } from '@/ui/elements/contexts';\nimport { Form } from '@/ui/elements/Form';\nimport { Header } from '@/ui/elements/Header';\nimport { handleError } from '@/ui/utils/errorHandler';\nimport { useFormControl } from '@/ui/utils/useFormControl';\n\nimport { Col, descriptors, localizationKeys } from '../../customizables';\nimport { useAfterVerification } from './use-after-verification';\n\ntype UVFactorTwoBackupCodeCardProps = {\n onShowAlternativeMethodsClicked
|
|
1
|
+
{"version":3,"file":"UVFactorTwoBackupCodeCard.js","names":[],"sources":["../../../src/components/UserVerification/UVFactorTwoBackupCodeCard.tsx"],"sourcesContent":["import { useSession } from '@clerk/shared/react';\nimport React from 'react';\n\nimport { Card } from '@/ui/elements/Card';\nimport { useCardState } from '@/ui/elements/contexts';\nimport { Form } from '@/ui/elements/Form';\nimport { Header } from '@/ui/elements/Header';\nimport { handleError } from '@/ui/utils/errorHandler';\nimport { useFormControl } from '@/ui/utils/useFormControl';\n\nimport { Col, descriptors, localizationKeys } from '../../customizables';\nimport { useAfterVerification } from './use-after-verification';\n\ntype UVFactorTwoBackupCodeCardProps = {\n onShowAlternativeMethodsClicked?: React.MouseEventHandler;\n};\n\nexport const UVFactorTwoBackupCodeCard = (props: UVFactorTwoBackupCodeCardProps) => {\n const { onShowAlternativeMethodsClicked } = props;\n const { session } = useSession();\n const { handleVerificationResponse } = useAfterVerification();\n\n const card = useCardState();\n const codeControl = useFormControl('code', '', {\n type: 'text',\n label: localizationKeys('formFieldLabel__backupCode'),\n isRequired: true,\n });\n\n const handleBackupCodeSubmit: React.FormEventHandler = e => {\n e.preventDefault();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return session!\n .attemptSecondFactorVerification({ strategy: 'backup_code', code: codeControl.value })\n .then(handleVerificationResponse)\n .catch(err => handleError(err, [codeControl], card.setError));\n };\n\n return (\n <Card.Root>\n <Card.Content>\n <Header.Root>\n <Header.Title localizationKey={localizationKeys('reverification.backupCodeMfa.title')} />\n <Header.Subtitle localizationKey={localizationKeys('reverification.backupCodeMfa.subtitle')} />\n </Header.Root>\n <Card.Alert>{card.error}</Card.Alert>\n <Col\n elementDescriptor={descriptors.main}\n gap={8}\n >\n <Form.Root onSubmit={handleBackupCodeSubmit}>\n <Form.ControlRow elementId={codeControl.id}>\n <Form.PlainInput\n {...codeControl.props}\n autoFocus\n onActionClicked={onShowAlternativeMethodsClicked}\n />\n </Form.ControlRow>\n <Col gap={3}>\n <Form.SubmitButton hasArrow />\n <Card.Action elementId='alternativeMethods'>\n {onShowAlternativeMethodsClicked && (\n <Card.ActionLink\n localizationKey={localizationKeys('footerActionLink__useAnotherMethod')}\n onClick={onShowAlternativeMethodsClicked}\n />\n )}\n </Card.Action>\n </Col>\n </Form.Root>\n </Col>\n </Card.Content>\n\n <Card.Footer />\n </Card.Root>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,MAAa,6BAA6B,UAA0C;CAClF,MAAM,EAAE,oCAAoC;CAC5C,MAAM,EAAE,YAAY,WAAW;CAC/B,MAAM,EAAE,+BAA+B,qBAAqB;CAE5D,MAAM,OAAO,aAAa;CAC1B,MAAM,cAAc,eAAe,QAAQ,IAAI;EAC7C,MAAM;EACN,OAAO,iBAAiB,4BAA4B;EACpD,YAAY;CACd,CAAC;CAED,MAAM,0BAAiD,MAAK;EAC1D,EAAE,eAAe;EAEjB,OAAO,QACJ,gCAAgC;GAAE,UAAU;GAAe,MAAM,YAAY;EAAM,CAAC,CAAC,CACrF,KAAK,0BAA0B,CAAC,CAChC,OAAM,QAAO,YAAY,KAAK,CAAC,WAAW,GAAG,KAAK,QAAQ,CAAC;CAChE;CAEA,OACE,qBAAC,KAAK,MAAN,aACE,qBAAC,KAAK,SAAN;EACE,qBAAC,OAAO,MAAR,aACE,oBAAC,OAAO,OAAR,EAAc,iBAAiB,iBAAiB,oCAAoC,EAAI,IACxF,oBAAC,OAAO,UAAR,EAAiB,iBAAiB,iBAAiB,uCAAuC,EAAI,EACnF;EACb,oBAAC,KAAK,OAAN,YAAa,KAAK,MAAkB;EACpC,oBAAC,KAAD;GACE,mBAAmB,YAAY;GAC/B,KAAK;aAEL,qBAAC,KAAK,MAAN;IAAW,UAAU;cAArB,CACE,oBAAC,KAAK,YAAN;KAAiB,WAAW,YAAY;eACtC,oBAAC,KAAK,YAAN;MACE,GAAI,YAAY;MAChB;MACA,iBAAiB;KAClB;IACc,IACjB,qBAAC,KAAD;KAAK,KAAK;eAAV,CACE,oBAAC,KAAK,cAAN,EAAmB,eAAU,IAC7B,oBAAC,KAAK,QAAN;MAAa,WAAU;gBACpB,mCACC,oBAAC,KAAK,YAAN;OACE,iBAAiB,iBAAiB,oCAAoC;OACtE,SAAS;MACV;KAEQ,EACV;MACI;;EACR;CACO,MAEd,oBAAC,KAAK,QAAN,CAAc,EACL;AAEf"}
|
|
@@ -44,12 +44,12 @@ function UserVerificationFactorOneInternal() {
|
|
|
44
44
|
currentFactor: determineStartingSignInFactor(availableFactors, null, preferredSignInStrategy),
|
|
45
45
|
prevCurrentFactor: void 0
|
|
46
46
|
}));
|
|
47
|
-
const {
|
|
47
|
+
const { hasAlternativeStrategies } = useReverificationAlternativeStrategies({
|
|
48
48
|
filterOutFactor: currentFactor,
|
|
49
49
|
supportedFirstFactors: availableFactors
|
|
50
50
|
});
|
|
51
51
|
const [showAllStrategies, setShowAllStrategies] = React.useState(() => !currentFactor || !factorHasLocalStrategy(currentFactor));
|
|
52
|
-
const toggleAllStrategies =
|
|
52
|
+
const toggleAllStrategies = hasAlternativeStrategies ? () => {
|
|
53
53
|
card.setError(void 0);
|
|
54
54
|
setShowAllStrategies((s) => !s);
|
|
55
55
|
} : void 0;
|
|
@@ -94,14 +94,14 @@ function UserVerificationFactorOneInternal() {
|
|
|
94
94
|
onFactorPrepare: handleFactorPrepare,
|
|
95
95
|
onShowAlternativeMethodsClicked: toggleAllStrategies,
|
|
96
96
|
factor: currentFactor,
|
|
97
|
-
showAlternativeMethods:
|
|
97
|
+
showAlternativeMethods: hasAlternativeStrategies
|
|
98
98
|
});
|
|
99
99
|
case "phone_code": return /* @__PURE__ */ jsx(UVFactorOnePhoneCodeCard, {
|
|
100
100
|
factorAlreadyPrepared: lastPreparedFactorKeyRef.current === factorKey(currentFactor),
|
|
101
101
|
onFactorPrepare: handleFactorPrepare,
|
|
102
102
|
onShowAlternativeMethodsClicked: toggleAllStrategies,
|
|
103
103
|
factor: currentFactor,
|
|
104
|
-
showAlternativeMethods:
|
|
104
|
+
showAlternativeMethods: hasAlternativeStrategies
|
|
105
105
|
});
|
|
106
106
|
case "passkey": return /* @__PURE__ */ jsx(UVFactorOnePasskeysCard, { onShowAlternativeMethodsClicked: toggleAllStrategies });
|
|
107
107
|
default: return /* @__PURE__ */ jsx(LoadingCard, {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserVerificationFactorOne.js","names":[],"sources":["../../../src/components/UserVerification/UserVerificationFactorOne.tsx"],"sourcesContent":["import type { SessionVerificationFirstFactor, SignInFactor } from '@clerk/shared/types';\nimport React, { useEffect, useMemo } from 'react';\n\nimport { useCardState, withCardStateProvider } from '@/ui/elements/contexts';\nimport { ErrorCard } from '@/ui/elements/ErrorCard';\nimport { LoadingCard } from '@/ui/elements/LoadingCard';\n\nimport { useEnvironment } from '../../contexts';\nimport { localizationKeys } from '../../localization';\nimport { useRouter } from '../../router';\nimport { determineStartingSignInFactor, factorHasLocalStrategy } from '../SignIn/utils';\nimport { AlternativeMethods } from './AlternativeMethods';\nimport { useReverificationAlternativeStrategies } from './useReverificationAlternativeStrategies';\nimport { UserVerificationFactorOnePasswordCard } from './UserVerificationFactorOnePassword';\nimport { useUserVerificationSession, withUserVerificationSessionGuard } from './useUserVerificationSession';\nimport { sortByPrimaryFactor } from './utils';\nimport { UVFactorOneEmailCodeCard } from './UVFactorOneEmailCodeCard';\nimport { UVFactorOnePasskeysCard } from './UVFactorOnePasskeysCard';\nimport { UVFactorOnePhoneCodeCard } from './UVFactorOnePhoneCodeCard';\n\nconst factorKey = (factor: SignInFactor | null | undefined) => {\n if (!factor) {\n return '';\n }\n let key = factor.strategy;\n if ('emailAddressId' in factor) {\n key += factor.emailAddressId;\n }\n if ('phoneNumberId' in factor) {\n key += factor.phoneNumberId;\n }\n return key;\n};\n\nconst SUPPORTED_STRATEGIES: SessionVerificationFirstFactor['strategy'][] = [\n 'password',\n 'email_code',\n 'phone_code',\n 'passkey',\n] as const;\n\nexport function UserVerificationFactorOneInternal(): JSX.Element | null {\n const { data } = useUserVerificationSession();\n const card = useCardState();\n const { navigate } = useRouter();\n\n const lastPreparedFactorKeyRef = React.useRef('');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const sessionVerification = data!;\n\n const availableFactors = useMemo(() => {\n return (\n sessionVerification.supportedFirstFactors\n ?.filter(factor => SUPPORTED_STRATEGIES.includes(factor.strategy))\n ?.sort(sortByPrimaryFactor) || null\n );\n }, [sessionVerification.supportedFirstFactors]);\n const { preferredSignInStrategy } = useEnvironment().displayConfig;\n\n const [{ currentFactor }, setFactor] = React.useState<{\n currentFactor: SignInFactor | undefined | null;\n prevCurrentFactor: SignInFactor | undefined | null;\n }>(() => ({\n currentFactor: determineStartingSignInFactor(availableFactors, null, preferredSignInStrategy),\n prevCurrentFactor: undefined,\n }));\n\n const {
|
|
1
|
+
{"version":3,"file":"UserVerificationFactorOne.js","names":[],"sources":["../../../src/components/UserVerification/UserVerificationFactorOne.tsx"],"sourcesContent":["import type { SessionVerificationFirstFactor, SignInFactor } from '@clerk/shared/types';\nimport React, { useEffect, useMemo } from 'react';\n\nimport { useCardState, withCardStateProvider } from '@/ui/elements/contexts';\nimport { ErrorCard } from '@/ui/elements/ErrorCard';\nimport { LoadingCard } from '@/ui/elements/LoadingCard';\n\nimport { useEnvironment } from '../../contexts';\nimport { localizationKeys } from '../../localization';\nimport { useRouter } from '../../router';\nimport { determineStartingSignInFactor, factorHasLocalStrategy } from '../SignIn/utils';\nimport { AlternativeMethods } from './AlternativeMethods';\nimport { useReverificationAlternativeStrategies } from './useReverificationAlternativeStrategies';\nimport { UserVerificationFactorOnePasswordCard } from './UserVerificationFactorOnePassword';\nimport { useUserVerificationSession, withUserVerificationSessionGuard } from './useUserVerificationSession';\nimport { sortByPrimaryFactor } from './utils';\nimport { UVFactorOneEmailCodeCard } from './UVFactorOneEmailCodeCard';\nimport { UVFactorOnePasskeysCard } from './UVFactorOnePasskeysCard';\nimport { UVFactorOnePhoneCodeCard } from './UVFactorOnePhoneCodeCard';\n\nconst factorKey = (factor: SignInFactor | null | undefined) => {\n if (!factor) {\n return '';\n }\n let key = factor.strategy;\n if ('emailAddressId' in factor) {\n key += factor.emailAddressId;\n }\n if ('phoneNumberId' in factor) {\n key += factor.phoneNumberId;\n }\n return key;\n};\n\nconst SUPPORTED_STRATEGIES: SessionVerificationFirstFactor['strategy'][] = [\n 'password',\n 'email_code',\n 'phone_code',\n 'passkey',\n] as const;\n\nexport function UserVerificationFactorOneInternal(): JSX.Element | null {\n const { data } = useUserVerificationSession();\n const card = useCardState();\n const { navigate } = useRouter();\n\n const lastPreparedFactorKeyRef = React.useRef('');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const sessionVerification = data!;\n\n const availableFactors = useMemo(() => {\n return (\n sessionVerification.supportedFirstFactors\n ?.filter(factor => SUPPORTED_STRATEGIES.includes(factor.strategy))\n ?.sort(sortByPrimaryFactor) || null\n );\n }, [sessionVerification.supportedFirstFactors]);\n const { preferredSignInStrategy } = useEnvironment().displayConfig;\n\n const [{ currentFactor }, setFactor] = React.useState<{\n currentFactor: SignInFactor | undefined | null;\n prevCurrentFactor: SignInFactor | undefined | null;\n }>(() => ({\n currentFactor: determineStartingSignInFactor(availableFactors, null, preferredSignInStrategy),\n prevCurrentFactor: undefined,\n }));\n\n const { hasAlternativeStrategies } = useReverificationAlternativeStrategies({\n filterOutFactor: currentFactor,\n supportedFirstFactors: availableFactors,\n });\n\n const [showAllStrategies, setShowAllStrategies] = React.useState<boolean>(\n () => !currentFactor || !factorHasLocalStrategy(currentFactor),\n );\n\n const toggleAllStrategies = hasAlternativeStrategies\n ? () => {\n card.setError(undefined);\n setShowAllStrategies(s => !s);\n }\n : undefined;\n\n const handleFactorPrepare = () => {\n lastPreparedFactorKeyRef.current = factorKey(currentFactor);\n };\n\n const selectFactor = (factor: SignInFactor) => {\n setFactor(prev => ({\n currentFactor: factor,\n prevCurrentFactor: prev.currentFactor,\n }));\n };\n\n useEffect(() => {\n if (sessionVerification.status === 'needs_second_factor') {\n void navigate('factor-two');\n }\n }, []);\n\n if (!currentFactor) {\n return (\n <ErrorCard\n cardTitle={localizationKeys('reverification.noAvailableMethods.title')}\n cardSubtitle={localizationKeys('reverification.noAvailableMethods.subtitle')}\n message={localizationKeys('reverification.noAvailableMethods.message')}\n shouldNavigateBack={false}\n />\n );\n }\n\n if (showAllStrategies) {\n const canGoBack = factorHasLocalStrategy(currentFactor);\n\n const toggle = toggleAllStrategies;\n const backHandler = () => {\n card.setError(undefined);\n toggle?.();\n };\n\n return (\n <AlternativeMethods\n onBackLinkClick={canGoBack ? backHandler : undefined}\n onFactorSelected={f => {\n selectFactor(f);\n toggle?.();\n }}\n currentFactor={currentFactor}\n />\n );\n }\n\n switch (currentFactor?.strategy) {\n case 'password':\n return <UserVerificationFactorOnePasswordCard onShowAlternativeMethodsClick={toggleAllStrategies} />;\n case 'email_code':\n return (\n <UVFactorOneEmailCodeCard\n factorAlreadyPrepared={lastPreparedFactorKeyRef.current === factorKey(currentFactor)}\n onFactorPrepare={handleFactorPrepare}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n factor={currentFactor}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'phone_code':\n return (\n <UVFactorOnePhoneCodeCard\n factorAlreadyPrepared={lastPreparedFactorKeyRef.current === factorKey(currentFactor)}\n onFactorPrepare={handleFactorPrepare}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n factor={currentFactor}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'passkey':\n return <UVFactorOnePasskeysCard onShowAlternativeMethodsClicked={toggleAllStrategies} />;\n default:\n return <LoadingCard />;\n }\n}\n\nexport const UserVerificationFactorOne = withUserVerificationSessionGuard(\n withCardStateProvider(UserVerificationFactorOneInternal),\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoBA,MAAM,aAAa,WAA4C;CAC7D,IAAI,CAAC,QACH,OAAO;CAET,IAAI,MAAM,OAAO;CACjB,IAAI,oBAAoB,QACtB,OAAO,OAAO;CAEhB,IAAI,mBAAmB,QACrB,OAAO,OAAO;CAEhB,OAAO;AACT;AAEA,MAAM,uBAAqE;CACzE;CACA;CACA;CACA;AACF;AAEA,SAAgB,oCAAwD;CACtE,MAAM,EAAE,SAAS,2BAA2B;CAC5C,MAAM,OAAO,aAAa;CAC1B,MAAM,EAAE,aAAa,UAAU;CAE/B,MAAM,2BAA2B,MAAM,OAAO,EAAE;CAEhD,MAAM,sBAAsB;CAE5B,MAAM,mBAAmB,cAAc;EACrC,OACE,oBAAoB,uBAChB,QAAO,WAAU,qBAAqB,SAAS,OAAO,QAAQ,CAAC,CAAC,EAChE,KAAK,mBAAmB,KAAK;CAErC,GAAG,CAAC,oBAAoB,qBAAqB,CAAC;CAC9C,MAAM,EAAE,4BAA4B,eAAe,CAAC,CAAC;CAErD,MAAM,CAAC,EAAE,iBAAiB,aAAa,MAAM,gBAGnC;EACR,eAAe,8BAA8B,kBAAkB,MAAM,uBAAuB;EAC5F,mBAAmB;CACrB,EAAE;CAEF,MAAM,EAAE,6BAA6B,uCAAuC;EAC1E,iBAAiB;EACjB,uBAAuB;CACzB,CAAC;CAED,MAAM,CAAC,mBAAmB,wBAAwB,MAAM,eAChD,CAAC,iBAAiB,CAAC,uBAAuB,aAAa,CAC/D;CAEA,MAAM,sBAAsB,iCAClB;EACJ,KAAK,SAAS,MAAS;EACvB,sBAAqB,MAAK,CAAC,CAAC;CAC9B,IACA;CAEJ,MAAM,4BAA4B;EAChC,yBAAyB,UAAU,UAAU,aAAa;CAC5D;CAEA,MAAM,gBAAgB,WAAyB;EAC7C,WAAU,UAAS;GACjB,eAAe;GACf,mBAAmB,KAAK;EAC1B,EAAE;CACJ;CAEA,gBAAgB;EACd,IAAI,oBAAoB,WAAW,uBACjC,AAAK,SAAS,YAAY;CAE9B,GAAG,CAAC,CAAC;CAEL,IAAI,CAAC,eACH,OACE,oBAAC,WAAD;EACE,WAAW,iBAAiB,yCAAyC;EACrE,cAAc,iBAAiB,4CAA4C;EAC3E,SAAS,iBAAiB,2CAA2C;EACrE,oBAAoB;CACrB;CAIL,IAAI,mBAAmB;EACrB,MAAM,YAAY,uBAAuB,aAAa;EAEtD,MAAM,SAAS;EACf,MAAM,oBAAoB;GACxB,KAAK,SAAS,MAAS;GACvB,SAAS;EACX;EAEA,OACE,oBAAC,oBAAD;GACE,iBAAiB,YAAY,cAAc;GAC3C,mBAAkB,MAAK;IACrB,aAAa,CAAC;IACd,SAAS;GACX;GACe;EAChB;CAEL;CAEA,QAAQ,eAAe,UAAvB;EACE,KAAK,YACH,OAAO,oBAAC,uCAAD,EAAuC,+BAA+B,oBAAsB;EACrG,KAAK,cACH,OACE,oBAAC,0BAAD;GACE,uBAAuB,yBAAyB,YAAY,UAAU,aAAa;GACnF,iBAAiB;GACjB,iCAAiC;GACjC,QAAQ;GACR,wBAAwB;EACzB;EAEL,KAAK,cACH,OACE,oBAAC,0BAAD;GACE,uBAAuB,yBAAyB,YAAY,UAAU,aAAa;GACnF,iBAAiB;GACjB,iCAAiC;GACjC,QAAQ;GACR,wBAAwB;EACzB;EAEL,KAAK,WACH,OAAO,oBAAC,yBAAD,EAAyB,iCAAiC,oBAAsB;EACzF,SACE,OAAO,oBAAC,aAAD,CAAc;CACzB;AACF;AAEA,MAAa,4BAA4B,iCACvC,sBAAsB,iCAAiC,CACzD"}
|
|
@@ -52,7 +52,7 @@ function UserVerificationFactorTwoComponent() {
|
|
|
52
52
|
onShowAlternativeMethodsClicked: toggleAllStrategies,
|
|
53
53
|
showAlternativeMethods: hasAlternativeStrategies
|
|
54
54
|
});
|
|
55
|
-
case "backup_code": return /* @__PURE__ */ jsx(UVFactorTwoBackupCodeCard, { onShowAlternativeMethodsClicked: toggleAllStrategies });
|
|
55
|
+
case "backup_code": return /* @__PURE__ */ jsx(UVFactorTwoBackupCodeCard, { onShowAlternativeMethodsClicked: hasAlternativeStrategies ? toggleAllStrategies : void 0 });
|
|
56
56
|
default: return /* @__PURE__ */ jsx(LoadingCard, {});
|
|
57
57
|
}
|
|
58
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserVerificationFactorTwo.js","names":[],"sources":["../../../src/components/UserVerification/UserVerificationFactorTwo.tsx"],"sourcesContent":["import type { SessionVerificationResource, SessionVerificationSecondFactor } from '@clerk/shared/types';\nimport { useEffect, useMemo } from 'react';\n\nimport { withCardStateProvider } from '@/elements/contexts';\nimport { LoadingCard } from '@/elements/LoadingCard';\nimport { useRouter } from '@/router';\n\nimport { useSecondFactorSelection } from '../SignIn/useSecondFactorSelection';\nimport { secondFactorsAreEqual } from './useReverificationAlternativeStrategies';\nimport { UserVerificationFactorTwoTOTP } from './UserVerificationFactorTwoTOTP';\nimport { useUserVerificationSession, withUserVerificationSessionGuard } from './useUserVerificationSession';\nimport { sortByPrimaryFactor } from './utils';\nimport { UVFactorTwoAlternativeMethods } from './UVFactorTwoAlternativeMethods';\nimport { UVFactorTwoBackupCodeCard } from './UVFactorTwoBackupCodeCard';\nimport { UVFactorTwoPhoneCodeCard } from './UVFactorTwoPhoneCodeCard';\n\nconst SUPPORTED_STRATEGIES: SessionVerificationSecondFactor['strategy'][] = [\n 'phone_code',\n 'totp',\n 'backup_code',\n] as const;\n\nexport function UserVerificationFactorTwoComponent(): JSX.Element {\n const { navigate } = useRouter();\n const { data } = useUserVerificationSession();\n const sessionVerification = data as SessionVerificationResource;\n\n const availableFactors = useMemo(() => {\n return (\n sessionVerification.supportedSecondFactors\n ?.filter(factor => SUPPORTED_STRATEGIES.includes(factor.strategy))\n ?.sort(sortByPrimaryFactor) || null\n );\n }, [sessionVerification.supportedSecondFactors]);\n\n const {\n currentFactor,\n factorAlreadyPrepared,\n handleFactorPrepare,\n selectFactor,\n showAllStrategies,\n toggleAllStrategies,\n } = useSecondFactorSelection<SessionVerificationSecondFactor>(availableFactors);\n\n const secondFactorsExcludingCurrent = useMemo(\n () => availableFactors?.filter(factor => !secondFactorsAreEqual(factor, currentFactor)),\n [availableFactors, currentFactor],\n );\n\n const hasAlternativeStrategies = useMemo(\n () => (secondFactorsExcludingCurrent && secondFactorsExcludingCurrent.length > 0) || false,\n [secondFactorsExcludingCurrent],\n );\n\n useEffect(() => {\n if (sessionVerification.status === 'needs_first_factor') {\n void navigate('../');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!currentFactor) {\n return <LoadingCard />;\n }\n\n if (showAllStrategies && hasAlternativeStrategies) {\n return (\n <UVFactorTwoAlternativeMethods\n supportedSecondFactors={secondFactorsExcludingCurrent || null}\n onBackLinkClick={toggleAllStrategies}\n onFactorSelected={selectFactor}\n />\n );\n }\n\n switch (currentFactor?.strategy) {\n case 'phone_code':\n return (\n <UVFactorTwoPhoneCodeCard\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'totp':\n return (\n <UserVerificationFactorTwoTOTP\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'backup_code':\n return <UVFactorTwoBackupCodeCard
|
|
1
|
+
{"version":3,"file":"UserVerificationFactorTwo.js","names":[],"sources":["../../../src/components/UserVerification/UserVerificationFactorTwo.tsx"],"sourcesContent":["import type { SessionVerificationResource, SessionVerificationSecondFactor } from '@clerk/shared/types';\nimport { useEffect, useMemo } from 'react';\n\nimport { withCardStateProvider } from '@/elements/contexts';\nimport { LoadingCard } from '@/elements/LoadingCard';\nimport { useRouter } from '@/router';\n\nimport { useSecondFactorSelection } from '../SignIn/useSecondFactorSelection';\nimport { secondFactorsAreEqual } from './useReverificationAlternativeStrategies';\nimport { UserVerificationFactorTwoTOTP } from './UserVerificationFactorTwoTOTP';\nimport { useUserVerificationSession, withUserVerificationSessionGuard } from './useUserVerificationSession';\nimport { sortByPrimaryFactor } from './utils';\nimport { UVFactorTwoAlternativeMethods } from './UVFactorTwoAlternativeMethods';\nimport { UVFactorTwoBackupCodeCard } from './UVFactorTwoBackupCodeCard';\nimport { UVFactorTwoPhoneCodeCard } from './UVFactorTwoPhoneCodeCard';\n\nconst SUPPORTED_STRATEGIES: SessionVerificationSecondFactor['strategy'][] = [\n 'phone_code',\n 'totp',\n 'backup_code',\n] as const;\n\nexport function UserVerificationFactorTwoComponent(): JSX.Element {\n const { navigate } = useRouter();\n const { data } = useUserVerificationSession();\n const sessionVerification = data as SessionVerificationResource;\n\n const availableFactors = useMemo(() => {\n return (\n sessionVerification.supportedSecondFactors\n ?.filter(factor => SUPPORTED_STRATEGIES.includes(factor.strategy))\n ?.sort(sortByPrimaryFactor) || null\n );\n }, [sessionVerification.supportedSecondFactors]);\n\n const {\n currentFactor,\n factorAlreadyPrepared,\n handleFactorPrepare,\n selectFactor,\n showAllStrategies,\n toggleAllStrategies,\n } = useSecondFactorSelection<SessionVerificationSecondFactor>(availableFactors);\n\n const secondFactorsExcludingCurrent = useMemo(\n () => availableFactors?.filter(factor => !secondFactorsAreEqual(factor, currentFactor)),\n [availableFactors, currentFactor],\n );\n\n const hasAlternativeStrategies = useMemo(\n () => (secondFactorsExcludingCurrent && secondFactorsExcludingCurrent.length > 0) || false,\n [secondFactorsExcludingCurrent],\n );\n\n useEffect(() => {\n if (sessionVerification.status === 'needs_first_factor') {\n void navigate('../');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!currentFactor) {\n return <LoadingCard />;\n }\n\n if (showAllStrategies && hasAlternativeStrategies) {\n return (\n <UVFactorTwoAlternativeMethods\n supportedSecondFactors={secondFactorsExcludingCurrent || null}\n onBackLinkClick={toggleAllStrategies}\n onFactorSelected={selectFactor}\n />\n );\n }\n\n switch (currentFactor?.strategy) {\n case 'phone_code':\n return (\n <UVFactorTwoPhoneCodeCard\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'totp':\n return (\n <UserVerificationFactorTwoTOTP\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'backup_code':\n return (\n <UVFactorTwoBackupCodeCard\n onShowAlternativeMethodsClicked={hasAlternativeStrategies ? toggleAllStrategies : undefined}\n />\n );\n default:\n return <LoadingCard />;\n }\n}\n\nexport const UserVerificationFactorTwo = withUserVerificationSessionGuard(\n withCardStateProvider(UserVerificationFactorTwoComponent),\n);\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAM,uBAAsE;CAC1E;CACA;CACA;AACF;AAEA,SAAgB,qCAAkD;CAChE,MAAM,EAAE,aAAa,UAAU;CAC/B,MAAM,EAAE,SAAS,2BAA2B;CAC5C,MAAM,sBAAsB;CAE5B,MAAM,mBAAmB,cAAc;EACrC,OACE,oBAAoB,wBAChB,QAAO,WAAU,qBAAqB,SAAS,OAAO,QAAQ,CAAC,CAAC,EAChE,KAAK,mBAAmB,KAAK;CAErC,GAAG,CAAC,oBAAoB,sBAAsB,CAAC;CAE/C,MAAM,EACJ,eACA,uBACA,qBACA,cACA,mBACA,wBACE,yBAA0D,gBAAgB;CAE9E,MAAM,gCAAgC,cAC9B,kBAAkB,QAAO,WAAU,CAAC,sBAAsB,QAAQ,aAAa,CAAC,GACtF,CAAC,kBAAkB,aAAa,CAClC;CAEA,MAAM,2BAA2B,cACxB,iCAAiC,8BAA8B,SAAS,KAAM,OACrF,CAAC,6BAA6B,CAChC;CAEA,gBAAgB;EACd,IAAI,oBAAoB,WAAW,sBACjC,AAAK,SAAS,KAAK;CAGvB,GAAG,CAAC,CAAC;CAEL,IAAI,CAAC,eACH,OAAO,oBAAC,aAAD,CAAc;CAGvB,IAAI,qBAAqB,0BACvB,OACE,oBAAC,+BAAD;EACE,wBAAwB,iCAAiC;EACzD,iBAAiB;EACjB,kBAAkB;CACnB;CAIL,QAAQ,eAAe,UAAvB;EACE,KAAK,cACH,OACE,oBAAC,0BAAD;GACyB;GACvB,iBAAiB;GACjB,QAAQ;GACR,iCAAiC;GACjC,wBAAwB;EACzB;EAEL,KAAK,QACH,OACE,oBAAC,+BAAD;GACyB;GACvB,iBAAiB;GACjB,QAAQ;GACR,iCAAiC;GACjC,wBAAwB;EACzB;EAEL,KAAK,eACH,OACE,oBAAC,2BAAD,EACE,iCAAiC,2BAA2B,sBAAsB,OACnF;EAEL,SACE,OAAO,oBAAC,aAAD,CAAc;CACzB;AACF;AAEA,MAAa,4BAA4B,iCACvC,sBAAsB,kCAAkC,CAC1D"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { allStrategiesButtonsComparator } from "../../utils/factorSorting.js";
|
|
2
|
-
import { factorHasLocalStrategy
|
|
2
|
+
import { factorHasLocalStrategy } from "../SignIn/utils.js";
|
|
3
3
|
import { useMemo } from "react";
|
|
4
4
|
import { isWebAuthnSupported } from "@clerk/shared/webauthn";
|
|
5
5
|
|
|
@@ -16,12 +16,9 @@ const secondFactorsAreEqual = (a, b) => {
|
|
|
16
16
|
return a.strategy === b.strategy;
|
|
17
17
|
};
|
|
18
18
|
function useReverificationAlternativeStrategies({ filterOutFactor, supportedFirstFactors }) {
|
|
19
|
-
const firstFactors = supportedFirstFactors ? supportedFirstFactors.filter((f) => !isResetPasswordStrategy(f.strategy)) : [];
|
|
20
|
-
const shouldAllowForAlternativeStrategies = firstFactors && firstFactors.length > 0;
|
|
21
19
|
const firstPartyFactors = useMemo(() => supportedFirstFactors ? supportedFirstFactors.filter((f) => !f.strategy.startsWith("oauth_")).filter((factor) => factorHasLocalStrategy(factor)).filter((factor) => !firstFactorsAreEqual(factor, filterOutFactor)).filter((factor) => factor.strategy === "passkey" ? isWebAuthnSupported() : true).sort(allStrategiesButtonsComparator) : [], [supportedFirstFactors, filterOutFactor]);
|
|
22
20
|
return {
|
|
23
|
-
|
|
24
|
-
hasFirstParty: firstPartyFactors && firstPartyFactors.length > 0,
|
|
21
|
+
hasAlternativeStrategies: firstPartyFactors.length > 0,
|
|
25
22
|
firstPartyFactors
|
|
26
23
|
};
|
|
27
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useReverificationAlternativeStrategies.js","names":[],"sources":["../../../src/components/UserVerification/useReverificationAlternativeStrategies.ts"],"sourcesContent":["import type { SignInFactor, SignInFirstFactor, SignInSecondFactor } from '@clerk/shared/types';\nimport { isWebAuthnSupported } from '@clerk/shared/webauthn';\nimport { useMemo } from 'react';\n\nimport { allStrategiesButtonsComparator } from '@/ui/utils/factorSorting';\n\nimport { factorHasLocalStrategy
|
|
1
|
+
{"version":3,"file":"useReverificationAlternativeStrategies.js","names":[],"sources":["../../../src/components/UserVerification/useReverificationAlternativeStrategies.ts"],"sourcesContent":["import type { SignInFactor, SignInFirstFactor, SignInSecondFactor } from '@clerk/shared/types';\nimport { isWebAuthnSupported } from '@clerk/shared/webauthn';\nimport { useMemo } from 'react';\n\nimport { allStrategiesButtonsComparator } from '@/ui/utils/factorSorting';\n\nimport { factorHasLocalStrategy } from '../SignIn/utils';\n\nconst firstFactorsAreEqual = (a: SignInFactor | null | undefined, b: SignInFactor | null | undefined) => {\n if (!a || !b) {\n return false;\n }\n\n if (a.strategy === 'email_code' && b.strategy === 'email_code') {\n return a.emailAddressId === b.emailAddressId;\n }\n\n if (a.strategy === 'phone_code' && b.strategy === 'phone_code') {\n return a.phoneNumberId === b.phoneNumberId;\n }\n\n return a.strategy === b.strategy;\n};\n\nexport const secondFactorsAreEqual = (\n a: SignInSecondFactor | null | undefined,\n b: SignInSecondFactor | null | undefined,\n) => {\n if (!a || !b) {\n return false;\n }\n\n if (a.strategy === 'phone_code' && b.strategy === 'phone_code') {\n return a.phoneNumberId === b.phoneNumberId;\n }\n\n return a.strategy === b.strategy;\n};\n\nexport function useReverificationAlternativeStrategies<T = SignInFirstFactor>({\n filterOutFactor,\n supportedFirstFactors,\n}: {\n filterOutFactor: SignInFactor | null | undefined;\n supportedFirstFactors: SignInFirstFactor[] | null | undefined;\n}) {\n const firstPartyFactors = useMemo(\n () =>\n supportedFirstFactors\n ? (supportedFirstFactors\n .filter(f => !f.strategy.startsWith('oauth_'))\n .filter(factor => factorHasLocalStrategy(factor))\n .filter(factor => !firstFactorsAreEqual(factor, filterOutFactor))\n // Only include passkey if the device supports it.\n // @ts-ignore Types are not public yet.\n .filter(factor => (factor.strategy === 'passkey' ? isWebAuthnSupported() : true))\n .sort(allStrategiesButtonsComparator) as T[])\n : [],\n [supportedFirstFactors, filterOutFactor],\n );\n\n return {\n hasAlternativeStrategies: firstPartyFactors.length > 0,\n firstPartyFactors,\n };\n}\n"],"mappings":";;;;;;AAQA,MAAM,wBAAwB,GAAoC,MAAuC;CACvG,IAAI,CAAC,KAAK,CAAC,GACT,OAAO;CAGT,IAAI,EAAE,aAAa,gBAAgB,EAAE,aAAa,cAChD,OAAO,EAAE,mBAAmB,EAAE;CAGhC,IAAI,EAAE,aAAa,gBAAgB,EAAE,aAAa,cAChD,OAAO,EAAE,kBAAkB,EAAE;CAG/B,OAAO,EAAE,aAAa,EAAE;AAC1B;AAEA,MAAa,yBACX,GACA,MACG;CACH,IAAI,CAAC,KAAK,CAAC,GACT,OAAO;CAGT,IAAI,EAAE,aAAa,gBAAgB,EAAE,aAAa,cAChD,OAAO,EAAE,kBAAkB,EAAE;CAG/B,OAAO,EAAE,aAAa,EAAE;AAC1B;AAEA,SAAgB,uCAA8D,EAC5E,iBACA,yBAIC;CACD,MAAM,oBAAoB,cAEtB,wBACK,sBACE,QAAO,MAAK,CAAC,EAAE,SAAS,WAAW,QAAQ,CAAC,CAAC,CAC7C,QAAO,WAAU,uBAAuB,MAAM,CAAC,CAAC,CAChD,QAAO,WAAU,CAAC,qBAAqB,QAAQ,eAAe,CAAC,CAAC,CAGhE,QAAO,WAAW,OAAO,aAAa,YAAY,oBAAoB,IAAI,IAAK,CAAC,CAChF,KAAK,8BAA8B,IACtC,CAAC,GACP,CAAC,uBAAuB,eAAe,CACzC;CAEA,OAAO;EACL,0BAA0B,kBAAkB,SAAS;EACrD;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/devPrompts/KeylessPrompt/index.tsx"],"sourcesContent":["import { inertProps } from '@clerk/shared/inert';\nimport { useUser } from '@clerk/shared/react';\n// eslint-disable-next-line no-restricted-imports\nimport { css } from '@emotion/react';\nimport { type ReactNode, useId, useMemo, useState } from 'react';\n\nimport { InternalThemeProvider } from '../../../styledSystem';\nimport { handleDashboardUrlParsing } from '../shared';\nimport { useDragToCorner } from './use-drag-to-corner';\nimport { useRevalidateEnvironment } from './use-revalidate-environment';\n\ntype KeylessPromptProps = {\n claimUrl: string;\n copyKeysUrl: string;\n onDismiss: (() => Promise<unknown>) | undefined | null;\n};\n\n/**\n * If we cannot reconstruct the url properly, then simply fallback to Clerk Dashboard\n */\nfunction withLastActiveFallback(callback: () => string): string {\n try {\n return callback();\n } catch {\n return 'https://dashboard.clerk.com/last-active';\n }\n}\n\nconst WIDTH_OPEN = '18rem';\nconst DURATION_OPEN = '220ms';\nconst DURATION_CLOSE = '180ms';\nconst EASE_BEZIER = 'cubic-bezier(0.2, 0, 0, 1)';\nconst CSS_RESET = css`\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n background: none;\n border: none;\n font-family:\n -apple-system,\n BlinkMacSystemFont,\n avenir next,\n avenir,\n segoe ui,\n helvetica neue,\n helvetica,\n Cantarell,\n Ubuntu,\n roboto,\n noto,\n arial,\n sans-serif;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n text-decoration: none;\n color: inherit;\n appearance: none;\n`;\n\nfunction getDuration(isOpen: boolean): string {\n return isOpen ? DURATION_OPEN : DURATION_CLOSE;\n}\n\nconst ctaButtonStyles = css`\n ${CSS_RESET};\n margin: 0.75rem 0 0;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 1.75rem;\n padding: 0.25rem 0.625rem;\n border-radius: 0.375rem;\n font-size: 0.75rem;\n font-weight: 500;\n letter-spacing: 0.12px;\n color: #fde047;\n text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.32);\n white-space: nowrap;\n user-select: none;\n cursor: pointer;\n background: linear-gradient(180deg, rgba(0, 0, 0, 0) 30.5%, rgba(0, 0, 0, 0.05) 100%), #454545;\n box-shadow:\n 0px 0px 0px 1px rgba(255, 255, 255, 0.04) inset,\n 0px 1px 0px 0px rgba(255, 255, 255, 0.04) inset,\n 0px 0px 0px 1px rgba(0, 0, 0, 0.12),\n 0px 1.5px 2px 0px rgba(0, 0, 0, 0.48),\n 0px 0px 4px 0px rgba(243, 107, 22, 0) inset;\n outline: none;\n &:hover {\n background: #4b4b4b;\n transition: background-color 120ms ease-in-out;\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n &:focus-visible {\n outline: 2px solid #6c47ff;\n outline-offset: 2px;\n }\n`;\n\nexport type STATES = 'idle' | 'userCreated' | 'claimed' | 'completed';\n\ntype DescriptionContent = ReactNode | ((context: { appName: string; instanceUrl: string }) => ReactNode);\n\ntype CtaLink = {\n kind: 'link';\n text: string;\n href: string | ((urls: { claimUrl: string; instanceUrl: string }) => string);\n};\n\ntype CtaAction = {\n kind: 'action';\n text: string;\n onClick: (onDismiss: (() => Promise<unknown>) | undefined | null) => void;\n};\n\ntype ContentItem = {\n triggerWidth: string;\n title: string;\n description: DescriptionContent;\n cta: CtaLink | CtaAction;\n};\n\nconst CONTENT: Record<STATES, ContentItem> = {\n idle: {\n triggerWidth: '14.25rem',\n title: 'Configure your application',\n description: (\n <>\n <p>Temporary API keys are enabled so you can get started immediately.</p>\n <ul>\n {['Add SSO connections (eg. GitHub)', 'Set up B2B authentication', 'Enable MFA'].map(item => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n <p>Access the dashboard to customize auth settings and explore Clerk features.</p>\n </>\n ),\n cta: {\n kind: 'link',\n text: 'Configure your application',\n href: ({ claimUrl }) => claimUrl,\n },\n },\n userCreated: {\n triggerWidth: '15.75rem',\n title: \"You've created your first user!\",\n description: (\n <p>Head to the dashboard to customize authentication settings, view user info, and explore more features.</p>\n ),\n cta: {\n kind: 'link',\n text: 'Configure your application',\n href: ({ claimUrl }) => claimUrl,\n },\n },\n claimed: {\n triggerWidth: '14.25rem',\n title: 'Missing environment keys',\n description: (\n <p>\n You claimed this application but haven't set keys in your environment. Get them from the Clerk Dashboard.\n </p>\n ),\n cta: {\n kind: 'link',\n text: 'Get API keys',\n href: ({ claimUrl }) => claimUrl,\n },\n },\n completed: {\n triggerWidth: '10.5rem',\n title: 'Your app is ready',\n description: ({ appName, instanceUrl }) => (\n <p>\n Your application{' '}\n <a\n href={instanceUrl}\n target='_blank'\n rel='noopener noreferrer'\n >\n {appName}\n </a>{' '}\n has been configured. You may now customize your settings in the Clerk dashboard.\n </p>\n ),\n cta: {\n kind: 'action',\n text: 'Dismiss',\n onClick: onDismiss => {\n void onDismiss?.().then(() => {\n window.location.reload();\n });\n },\n },\n },\n};\n\n/**\n * Determines the current state based on application lifecycle flags.\n * State precedence: completed -> claimed -> userCreated -> idle\n *\n * Note: This is a structural refactor - the actual runtime behavior for\n * `claimed` and `success` is determined by environment state and props.\n * Currently, `claimed` comes from `environment.authConfig.claimedAt` and\n * `success` is derived from `onDismiss` prop presence + claimed state.\n */\nexport function getCurrentState(claimed: boolean, success: boolean, isSignedIn: boolean): STATES {\n if (success) {\n return 'completed';\n }\n if (claimed) {\n return 'claimed';\n }\n if (isSignedIn) {\n return 'userCreated';\n }\n return 'idle';\n}\n\ntype ResolvedContentContext = {\n appName: string;\n instanceUrl: string;\n claimUrl: string;\n onDismiss: (() => Promise<unknown>) | undefined | null;\n};\n\ntype ResolvedContent = {\n state: STATES;\n triggerWidth: string;\n title: string;\n description: ReactNode;\n cta:\n | {\n kind: 'link';\n text: string;\n href: string;\n }\n | {\n kind: 'action';\n text: string;\n onClick: () => void;\n };\n};\n\n/**\n * Gets resolved content from state and context.\n * This is a pure function that can be easily unit tested.\n */\nexport function getResolvedContent(state: STATES, context: ResolvedContentContext): ResolvedContent {\n const content = CONTENT[state];\n\n const description =\n typeof content.description === 'function'\n ? content.description({ appName: context.appName, instanceUrl: context.instanceUrl })\n : content.description;\n\n const ctaItem = content.cta;\n const cta: ResolvedContent['cta'] =\n ctaItem.kind === 'link'\n ? {\n kind: 'link',\n text: ctaItem.text,\n href:\n typeof ctaItem.href === 'function'\n ? ctaItem.href({ claimUrl: context.claimUrl, instanceUrl: context.instanceUrl })\n : ctaItem.href,\n }\n : {\n kind: 'action',\n text: ctaItem.text,\n onClick: () => ctaItem.onClick(context.onDismiss),\n };\n\n return {\n state,\n triggerWidth: content.triggerWidth,\n title: content.title,\n description,\n cta,\n };\n}\n\nfunction KeylessPromptInternal(props: KeylessPromptProps) {\n const id = useId();\n const environment = useRevalidateEnvironment();\n const { isDragging, cornerStyle, containerRef, onPointerDown, preventClick, isInitialized } = useDragToCorner();\n\n const claimed = Boolean(environment.authConfig.claimedAt);\n const success = typeof props.onDismiss === 'function' && claimed;\n const { isSignedIn } = useUser();\n const appName = environment.displayConfig.applicationName;\n\n const claimUrlToDashboard = useMemo(() => {\n if (claimed) {\n return props.copyKeysUrl;\n }\n const url = new URL(props.claimUrl);\n url.searchParams.append('return_url', window.location.href);\n return url.href;\n }, [claimed, props.copyKeysUrl, props.claimUrl]);\n\n const instanceUrlToDashboard = useMemo(() => {\n return withLastActiveFallback(() => {\n const redirectUrlParts = handleDashboardUrlParsing(props.copyKeysUrl);\n const url = new URL(\n `${redirectUrlParts.baseDomain}/apps/${redirectUrlParts.appId}/instances/${redirectUrlParts.instanceId}/user-authentication/email-phone-username`,\n );\n return url.href;\n });\n }, [props.copyKeysUrl]);\n\n const [isOpen, setIsOpen] = useState(true);\n const currentState = getCurrentState(claimed, success, Boolean(isSignedIn));\n\n const resolvedContent = useMemo(\n () =>\n getResolvedContent(currentState, {\n appName,\n instanceUrl: instanceUrlToDashboard,\n claimUrl: claimUrlToDashboard,\n onDismiss: props.onDismiss,\n }),\n [currentState, appName, instanceUrlToDashboard, claimUrlToDashboard, props.onDismiss],\n );\n\n const ctaElement: ReactNode =\n resolvedContent.cta.kind === 'link' ? (\n <a\n href={resolvedContent.cta.href}\n target='_blank'\n rel='noopener noreferrer'\n css={ctaButtonStyles}\n >\n {resolvedContent.cta.text}\n </a>\n ) : (\n <button\n type='button'\n onClick={resolvedContent.cta.onClick}\n css={ctaButtonStyles}\n >\n {resolvedContent.cta.text}\n </button>\n );\n\n return (\n <div\n ref={containerRef}\n onPointerDown={isOpen ? undefined : onPointerDown}\n style={{\n ...cornerStyle,\n opacity: isInitialized ? undefined : 0,\n }}\n data-expanded={isOpen}\n css={css`\n ${CSS_RESET};\n position: fixed;\n z-index: 2147483647;\n border-radius: ${isOpen ? '0.75rem' : '2.5rem'};\n background-color: #1f1f1f;\n box-shadow:\n 0px 0px 0px 0.5px #2f3037 inset,\n 0px 1px 0px 0px rgba(255, 255, 255, 0.08) inset,\n 0px 0px 0.8px 0.8px rgba(255, 255, 255, 0.2) inset,\n 0px 0px 0px 0px rgba(255, 255, 255, 0.72),\n 0px 16px 36px -6px rgba(0, 0, 0, 0.36),\n 0px 6px 16px -2px rgba(0, 0, 0, 0.2);\n height: auto;\n isolation: isolate;\n transform: translateZ(0);\n backface-visibility: hidden;\n width: ${isOpen ? WIDTH_OPEN : resolvedContent.triggerWidth};\n cursor: ${isDragging ? 'grabbing' : isOpen ? 'default' : 'grab'};\n touch-action: none;\n transition: ${isDragging\n ? 'none'\n : isInitialized\n ? `width ${getDuration(isOpen)} ${EASE_BEZIER}, border-radius ${getDuration(isOpen)} cubic-bezier(0.2, 0, 0, 1)`\n : 'none'};\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n &:has(button:focus-visible) {\n outline: 2px solid #6c47ff;\n outline-offset: 2px;\n }\n &::before {\n content: '';\n pointer-events: none;\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background-image: linear-gradient(180deg, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);\n opacity: 0.16;\n transition: opacity ${getDuration(isOpen)} ${EASE_BEZIER};\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n &[data-expanded='true']::before,\n &:hover::before {\n opacity: 0.2;\n }\n `}\n >\n <button\n type='button'\n aria-label='Keyless prompt'\n aria-controls={id}\n aria-expanded={isOpen}\n onClick={() => {\n if (preventClick) {\n return;\n }\n setIsOpen(p => !p);\n }}\n css={css`\n ${CSS_RESET};\n display: flex;\n align-items: center;\n width: 100%;\n border-radius: inherit;\n padding-inline: 0.75rem;\n gap: 0.25rem;\n height: 2.5rem;\n outline: none;\n cursor: pointer;\n user-select: none;\n `}\n >\n <svg\n css={css`\n width: 1rem;\n height: 1rem;\n flex-shrink: 0;\n `}\n fill='none'\n viewBox='0 0 128 128'\n >\n <circle\n cx='64'\n cy='64'\n r='20'\n fill='#fff'\n />\n <path\n fill='#fff'\n fillOpacity='.4'\n d='M99.572 10.788c1.999 1.34 2.17 4.156.468 5.858L85.424 31.262c-1.32 1.32-3.37 1.53-5.033.678A35.846 35.846 0 0 0 64 28c-19.882 0-36 16.118-36 36a35.846 35.846 0 0 0 3.94 16.391c.851 1.663.643 3.712-.678 5.033L16.646 100.04c-1.702 1.702-4.519 1.531-5.858-.468C3.974 89.399 0 77.163 0 64 0 28.654 28.654 0 64 0c13.163 0 25.399 3.974 35.572 10.788Z'\n />\n <path\n fill='#fff'\n d='M100.04 111.354c1.702 1.702 1.531 4.519-.468 5.858C89.399 124.026 77.164 128 64 128c-13.164 0-25.399-3.974-35.572-10.788-2-1.339-2.17-4.156-.468-5.858l14.615-14.616c1.322-1.32 3.37-1.53 5.033-.678A35.847 35.847 0 0 0 64 100a35.846 35.846 0 0 0 16.392-3.94c1.662-.852 3.712-.643 5.032.678l14.616 14.616Z'\n />\n </svg>\n <span\n css={css`\n ${CSS_RESET};\n font-size: 0.875rem;\n font-weight: 500;\n color: #d9d9d9;\n white-space: nowrap;\n `}\n >\n {resolvedContent.title}\n </span>\n <svg\n css={css`\n width: 1rem;\n height: 1rem;\n flex-shrink: 0;\n color: #d9d9d9;\n margin-inline-start: auto;\n opacity: ${isOpen ? 0.5 : 0};\n transition: opacity ${getDuration(isOpen)} ease-out;\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n ${isOpen &&\n css`\n button:hover & {\n opacity: 1;\n }\n `}\n `}\n viewBox='0 0 16 16'\n fill='none'\n aria-hidden='true'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M3.75 8H12.25'\n stroke='currentColor'\n strokeWidth='1.5'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n </button>\n <div\n id={id}\n {...inertProps(!isOpen)}\n css={css`\n ${CSS_RESET};\n display: grid;\n grid-template-rows: ${isOpen ? '1fr' : '0fr'};\n transition: grid-template-rows ${getDuration(isOpen)} ${EASE_BEZIER};\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n `}\n >\n <div\n css={css`\n ${CSS_RESET};\n min-height: 0;\n overflow: hidden;\n `}\n >\n <div\n css={css`\n ${CSS_RESET};\n width: ${WIDTH_OPEN};\n padding-inline: 0.75rem;\n padding-block-end: 0.75rem;\n opacity: ${isOpen ? 1 : 0};\n transition: opacity ${getDuration(isOpen)} ${EASE_BEZIER};\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n `}\n >\n <div\n css={css`\n ${CSS_RESET};\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n & ul {\n ${CSS_RESET};\n list-style: disc;\n padding-left: 1rem;\n }\n & p,\n & li {\n ${CSS_RESET};\n color: #b4b4b4;\n font-size: 0.8125rem;\n font-weight: 400;\n line-height: 1rem;\n text-wrap: pretty;\n }\n & a {\n color: #fde047;\n font-weight: 500;\n outline: none;\n text-decoration: underline;\n &:focus-visible {\n outline: 2px solid #6c47ff;\n outline-offset: 2px;\n }\n }\n `}\n >\n {resolvedContent.description}\n </div>\n\n {ctaElement}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport function KeylessPrompt(props: KeylessPromptProps) {\n return (\n <InternalThemeProvider>\n <KeylessPromptInternal {...props} />\n </InternalThemeProvider>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/devPrompts/KeylessPrompt/index.tsx"],"sourcesContent":["import { inertProps } from '@clerk/shared/inert';\nimport { useUser } from '@clerk/shared/react';\n// eslint-disable-next-line no-restricted-imports\nimport { css } from '@emotion/react';\nimport { type ReactNode, useId, useMemo, useState } from 'react';\n\nimport { InternalThemeProvider } from '../../../styledSystem';\nimport { handleDashboardUrlParsing } from '../shared';\nimport { useDragToCorner } from './use-drag-to-corner';\nimport { useRevalidateEnvironment } from './use-revalidate-environment';\n\ntype KeylessPromptProps = {\n claimUrl: string;\n copyKeysUrl: string;\n onDismiss: (() => Promise<unknown>) | undefined | null;\n};\n\n/**\n * If we cannot reconstruct the url properly, then simply fallback to Clerk Dashboard\n */\nfunction withLastActiveFallback(callback: () => string): string {\n try {\n return callback();\n } catch {\n return 'https://dashboard.clerk.com/~';\n }\n}\n\nconst WIDTH_OPEN = '18rem';\nconst DURATION_OPEN = '220ms';\nconst DURATION_CLOSE = '180ms';\nconst EASE_BEZIER = 'cubic-bezier(0.2, 0, 0, 1)';\nconst CSS_RESET = css`\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n background: none;\n border: none;\n font-family:\n -apple-system,\n BlinkMacSystemFont,\n avenir next,\n avenir,\n segoe ui,\n helvetica neue,\n helvetica,\n Cantarell,\n Ubuntu,\n roboto,\n noto,\n arial,\n sans-serif;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n text-decoration: none;\n color: inherit;\n appearance: none;\n`;\n\nfunction getDuration(isOpen: boolean): string {\n return isOpen ? DURATION_OPEN : DURATION_CLOSE;\n}\n\nconst ctaButtonStyles = css`\n ${CSS_RESET};\n margin: 0.75rem 0 0;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 1.75rem;\n padding: 0.25rem 0.625rem;\n border-radius: 0.375rem;\n font-size: 0.75rem;\n font-weight: 500;\n letter-spacing: 0.12px;\n color: #fde047;\n text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.32);\n white-space: nowrap;\n user-select: none;\n cursor: pointer;\n background: linear-gradient(180deg, rgba(0, 0, 0, 0) 30.5%, rgba(0, 0, 0, 0.05) 100%), #454545;\n box-shadow:\n 0px 0px 0px 1px rgba(255, 255, 255, 0.04) inset,\n 0px 1px 0px 0px rgba(255, 255, 255, 0.04) inset,\n 0px 0px 0px 1px rgba(0, 0, 0, 0.12),\n 0px 1.5px 2px 0px rgba(0, 0, 0, 0.48),\n 0px 0px 4px 0px rgba(243, 107, 22, 0) inset;\n outline: none;\n &:hover {\n background: #4b4b4b;\n transition: background-color 120ms ease-in-out;\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n &:focus-visible {\n outline: 2px solid #6c47ff;\n outline-offset: 2px;\n }\n`;\n\nexport type STATES = 'idle' | 'userCreated' | 'claimed' | 'completed';\n\ntype DescriptionContent = ReactNode | ((context: { appName: string; instanceUrl: string }) => ReactNode);\n\ntype CtaLink = {\n kind: 'link';\n text: string;\n href: string | ((urls: { claimUrl: string; instanceUrl: string }) => string);\n};\n\ntype CtaAction = {\n kind: 'action';\n text: string;\n onClick: (onDismiss: (() => Promise<unknown>) | undefined | null) => void;\n};\n\ntype ContentItem = {\n triggerWidth: string;\n title: string;\n description: DescriptionContent;\n cta: CtaLink | CtaAction;\n};\n\nconst CONTENT: Record<STATES, ContentItem> = {\n idle: {\n triggerWidth: '14.25rem',\n title: 'Configure your application',\n description: (\n <>\n <p>Temporary API keys are enabled so you can get started immediately.</p>\n <ul>\n {['Add SSO connections (eg. GitHub)', 'Set up B2B authentication', 'Enable MFA'].map(item => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n <p>Access the dashboard to customize auth settings and explore Clerk features.</p>\n </>\n ),\n cta: {\n kind: 'link',\n text: 'Configure your application',\n href: ({ claimUrl }) => claimUrl,\n },\n },\n userCreated: {\n triggerWidth: '15.75rem',\n title: \"You've created your first user!\",\n description: (\n <p>Head to the dashboard to customize authentication settings, view user info, and explore more features.</p>\n ),\n cta: {\n kind: 'link',\n text: 'Configure your application',\n href: ({ claimUrl }) => claimUrl,\n },\n },\n claimed: {\n triggerWidth: '14.25rem',\n title: 'Missing environment keys',\n description: (\n <p>\n You claimed this application but haven't set keys in your environment. Get them from the Clerk Dashboard.\n </p>\n ),\n cta: {\n kind: 'link',\n text: 'Get API keys',\n href: ({ claimUrl }) => claimUrl,\n },\n },\n completed: {\n triggerWidth: '10.5rem',\n title: 'Your app is ready',\n description: ({ appName, instanceUrl }) => (\n <p>\n Your application{' '}\n <a\n href={instanceUrl}\n target='_blank'\n rel='noopener noreferrer'\n >\n {appName}\n </a>{' '}\n has been configured. You may now customize your settings in the Clerk dashboard.\n </p>\n ),\n cta: {\n kind: 'action',\n text: 'Dismiss',\n onClick: onDismiss => {\n void onDismiss?.().then(() => {\n window.location.reload();\n });\n },\n },\n },\n};\n\n/**\n * Determines the current state based on application lifecycle flags.\n * State precedence: completed -> claimed -> userCreated -> idle\n *\n * Note: This is a structural refactor - the actual runtime behavior for\n * `claimed` and `success` is determined by environment state and props.\n * Currently, `claimed` comes from `environment.authConfig.claimedAt` and\n * `success` is derived from `onDismiss` prop presence + claimed state.\n */\nexport function getCurrentState(claimed: boolean, success: boolean, isSignedIn: boolean): STATES {\n if (success) {\n return 'completed';\n }\n if (claimed) {\n return 'claimed';\n }\n if (isSignedIn) {\n return 'userCreated';\n }\n return 'idle';\n}\n\ntype ResolvedContentContext = {\n appName: string;\n instanceUrl: string;\n claimUrl: string;\n onDismiss: (() => Promise<unknown>) | undefined | null;\n};\n\ntype ResolvedContent = {\n state: STATES;\n triggerWidth: string;\n title: string;\n description: ReactNode;\n cta:\n | {\n kind: 'link';\n text: string;\n href: string;\n }\n | {\n kind: 'action';\n text: string;\n onClick: () => void;\n };\n};\n\n/**\n * Gets resolved content from state and context.\n * This is a pure function that can be easily unit tested.\n */\nexport function getResolvedContent(state: STATES, context: ResolvedContentContext): ResolvedContent {\n const content = CONTENT[state];\n\n const description =\n typeof content.description === 'function'\n ? content.description({ appName: context.appName, instanceUrl: context.instanceUrl })\n : content.description;\n\n const ctaItem = content.cta;\n const cta: ResolvedContent['cta'] =\n ctaItem.kind === 'link'\n ? {\n kind: 'link',\n text: ctaItem.text,\n href:\n typeof ctaItem.href === 'function'\n ? ctaItem.href({ claimUrl: context.claimUrl, instanceUrl: context.instanceUrl })\n : ctaItem.href,\n }\n : {\n kind: 'action',\n text: ctaItem.text,\n onClick: () => ctaItem.onClick(context.onDismiss),\n };\n\n return {\n state,\n triggerWidth: content.triggerWidth,\n title: content.title,\n description,\n cta,\n };\n}\n\nfunction KeylessPromptInternal(props: KeylessPromptProps) {\n const id = useId();\n const environment = useRevalidateEnvironment();\n const { isDragging, cornerStyle, containerRef, onPointerDown, preventClick, isInitialized } = useDragToCorner();\n\n const claimed = Boolean(environment.authConfig.claimedAt);\n const success = typeof props.onDismiss === 'function' && claimed;\n const { isSignedIn } = useUser();\n const appName = environment.displayConfig.applicationName;\n\n const claimUrlToDashboard = useMemo(() => {\n if (claimed) {\n return props.copyKeysUrl;\n }\n const url = new URL(props.claimUrl);\n url.searchParams.append('return_url', window.location.href);\n return url.href;\n }, [claimed, props.copyKeysUrl, props.claimUrl]);\n\n const instanceUrlToDashboard = useMemo(() => {\n return withLastActiveFallback(() => {\n const redirectUrlParts = handleDashboardUrlParsing(props.copyKeysUrl);\n const url = new URL(\n `${redirectUrlParts.baseDomain}/apps/${redirectUrlParts.appId}/instances/${redirectUrlParts.instanceId}/user-authentication/email-phone-username`,\n );\n return url.href;\n });\n }, [props.copyKeysUrl]);\n\n const [isOpen, setIsOpen] = useState(true);\n const currentState = getCurrentState(claimed, success, Boolean(isSignedIn));\n\n const resolvedContent = useMemo(\n () =>\n getResolvedContent(currentState, {\n appName,\n instanceUrl: instanceUrlToDashboard,\n claimUrl: claimUrlToDashboard,\n onDismiss: props.onDismiss,\n }),\n [currentState, appName, instanceUrlToDashboard, claimUrlToDashboard, props.onDismiss],\n );\n\n const ctaElement: ReactNode =\n resolvedContent.cta.kind === 'link' ? (\n <a\n href={resolvedContent.cta.href}\n target='_blank'\n rel='noopener noreferrer'\n css={ctaButtonStyles}\n >\n {resolvedContent.cta.text}\n </a>\n ) : (\n <button\n type='button'\n onClick={resolvedContent.cta.onClick}\n css={ctaButtonStyles}\n >\n {resolvedContent.cta.text}\n </button>\n );\n\n return (\n <div\n ref={containerRef}\n onPointerDown={isOpen ? undefined : onPointerDown}\n style={{\n ...cornerStyle,\n opacity: isInitialized ? undefined : 0,\n }}\n data-expanded={isOpen}\n css={css`\n ${CSS_RESET};\n position: fixed;\n z-index: 2147483647;\n border-radius: ${isOpen ? '0.75rem' : '2.5rem'};\n background-color: #1f1f1f;\n box-shadow:\n 0px 0px 0px 0.5px #2f3037 inset,\n 0px 1px 0px 0px rgba(255, 255, 255, 0.08) inset,\n 0px 0px 0.8px 0.8px rgba(255, 255, 255, 0.2) inset,\n 0px 0px 0px 0px rgba(255, 255, 255, 0.72),\n 0px 16px 36px -6px rgba(0, 0, 0, 0.36),\n 0px 6px 16px -2px rgba(0, 0, 0, 0.2);\n height: auto;\n isolation: isolate;\n transform: translateZ(0);\n backface-visibility: hidden;\n width: ${isOpen ? WIDTH_OPEN : resolvedContent.triggerWidth};\n cursor: ${isDragging ? 'grabbing' : isOpen ? 'default' : 'grab'};\n touch-action: none;\n transition: ${isDragging\n ? 'none'\n : isInitialized\n ? `width ${getDuration(isOpen)} ${EASE_BEZIER}, border-radius ${getDuration(isOpen)} cubic-bezier(0.2, 0, 0, 1)`\n : 'none'};\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n &:has(button:focus-visible) {\n outline: 2px solid #6c47ff;\n outline-offset: 2px;\n }\n &::before {\n content: '';\n pointer-events: none;\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background-image: linear-gradient(180deg, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);\n opacity: 0.16;\n transition: opacity ${getDuration(isOpen)} ${EASE_BEZIER};\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n &[data-expanded='true']::before,\n &:hover::before {\n opacity: 0.2;\n }\n `}\n >\n <button\n type='button'\n aria-label='Keyless prompt'\n aria-controls={id}\n aria-expanded={isOpen}\n onClick={() => {\n if (preventClick) {\n return;\n }\n setIsOpen(p => !p);\n }}\n css={css`\n ${CSS_RESET};\n display: flex;\n align-items: center;\n width: 100%;\n border-radius: inherit;\n padding-inline: 0.75rem;\n gap: 0.25rem;\n height: 2.5rem;\n outline: none;\n cursor: pointer;\n user-select: none;\n `}\n >\n <svg\n css={css`\n width: 1rem;\n height: 1rem;\n flex-shrink: 0;\n `}\n fill='none'\n viewBox='0 0 128 128'\n >\n <circle\n cx='64'\n cy='64'\n r='20'\n fill='#fff'\n />\n <path\n fill='#fff'\n fillOpacity='.4'\n d='M99.572 10.788c1.999 1.34 2.17 4.156.468 5.858L85.424 31.262c-1.32 1.32-3.37 1.53-5.033.678A35.846 35.846 0 0 0 64 28c-19.882 0-36 16.118-36 36a35.846 35.846 0 0 0 3.94 16.391c.851 1.663.643 3.712-.678 5.033L16.646 100.04c-1.702 1.702-4.519 1.531-5.858-.468C3.974 89.399 0 77.163 0 64 0 28.654 28.654 0 64 0c13.163 0 25.399 3.974 35.572 10.788Z'\n />\n <path\n fill='#fff'\n d='M100.04 111.354c1.702 1.702 1.531 4.519-.468 5.858C89.399 124.026 77.164 128 64 128c-13.164 0-25.399-3.974-35.572-10.788-2-1.339-2.17-4.156-.468-5.858l14.615-14.616c1.322-1.32 3.37-1.53 5.033-.678A35.847 35.847 0 0 0 64 100a35.846 35.846 0 0 0 16.392-3.94c1.662-.852 3.712-.643 5.032.678l14.616 14.616Z'\n />\n </svg>\n <span\n css={css`\n ${CSS_RESET};\n font-size: 0.875rem;\n font-weight: 500;\n color: #d9d9d9;\n white-space: nowrap;\n `}\n >\n {resolvedContent.title}\n </span>\n <svg\n css={css`\n width: 1rem;\n height: 1rem;\n flex-shrink: 0;\n color: #d9d9d9;\n margin-inline-start: auto;\n opacity: ${isOpen ? 0.5 : 0};\n transition: opacity ${getDuration(isOpen)} ease-out;\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n ${isOpen &&\n css`\n button:hover & {\n opacity: 1;\n }\n `}\n `}\n viewBox='0 0 16 16'\n fill='none'\n aria-hidden='true'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M3.75 8H12.25'\n stroke='currentColor'\n strokeWidth='1.5'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n </button>\n <div\n id={id}\n {...inertProps(!isOpen)}\n css={css`\n ${CSS_RESET};\n display: grid;\n grid-template-rows: ${isOpen ? '1fr' : '0fr'};\n transition: grid-template-rows ${getDuration(isOpen)} ${EASE_BEZIER};\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n `}\n >\n <div\n css={css`\n ${CSS_RESET};\n min-height: 0;\n overflow: hidden;\n `}\n >\n <div\n css={css`\n ${CSS_RESET};\n width: ${WIDTH_OPEN};\n padding-inline: 0.75rem;\n padding-block-end: 0.75rem;\n opacity: ${isOpen ? 1 : 0};\n transition: opacity ${getDuration(isOpen)} ${EASE_BEZIER};\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n `}\n >\n <div\n css={css`\n ${CSS_RESET};\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n & ul {\n ${CSS_RESET};\n list-style: disc;\n padding-left: 1rem;\n }\n & p,\n & li {\n ${CSS_RESET};\n color: #b4b4b4;\n font-size: 0.8125rem;\n font-weight: 400;\n line-height: 1rem;\n text-wrap: pretty;\n }\n & a {\n color: #fde047;\n font-weight: 500;\n outline: none;\n text-decoration: underline;\n &:focus-visible {\n outline: 2px solid #6c47ff;\n outline-offset: 2px;\n }\n }\n `}\n >\n {resolvedContent.description}\n </div>\n\n {ctaElement}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport function KeylessPrompt(props: KeylessPromptProps) {\n return (\n <InternalThemeProvider>\n <KeylessPromptInternal {...props} />\n </InternalThemeProvider>\n );\n}\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
outline: 2px solid #6c47ff;
|
|
64
64
|
outline-offset: 2px;
|
|
65
65
|
}
|
|
66
|
-
`,k={idle:{triggerWidth:"14.25rem",title:"Configure your application",description:(0,n.FD)(n.FK,{children:[(0,n.Y)("p",{children:"Temporary API keys are enabled so you can get started immediately."}),(0,n.Y)("ul",{children:["Add SSO connections (eg. GitHub)","Set up B2B authentication","Enable MFA"].map(e=>(0,n.Y)("li",{children:e},e))}),(0,n.Y)("p",{children:"Access the dashboard to customize auth settings and explore Clerk features."})]}),cta:{kind:"link",text:"Configure your application",href:({claimUrl:e})=>e}},userCreated:{triggerWidth:"15.75rem",title:"You've created your first user!",description:(0,n.Y)("p",{children:"Head to the dashboard to customize authentication settings, view user info, and explore more features."}),cta:{kind:"link",text:"Configure your application",href:({claimUrl:e})=>e}},claimed:{triggerWidth:"14.25rem",title:"Missing environment keys",description:(0,n.Y)("p",{children:"You claimed this application but haven't set keys in your environment. Get them from the Clerk Dashboard."}),cta:{kind:"link",text:"Get API keys",href:({claimUrl:e})=>e}},completed:{triggerWidth:"10.5rem",title:"Your app is ready",description:({appName:e,instanceUrl:t})=>(0,n.FD)("p",{children:["Your application"," ",(0,n.Y)("a",{href:t,target:"_blank",rel:"noopener noreferrer",children:e})," ","has been configured. You may now customize your settings in the Clerk dashboard."]}),cta:{kind:"action",text:"Dismiss",onClick:e=>{e?.().then(()=>{window.location.reload()})}}}};function Y(e,t,r){return t?"completed":e?"claimed":r?"userCreated":"idle"}function $(e,t){let r=k[e],n="function"==typeof r.description?r.description({appName:t.appName,instanceUrl:t.instanceUrl}):r.description,i=r.cta,o="link"===i.kind?{kind:"link",text:i.text,href:"function"==typeof i.href?i.href({claimUrl:t.claimUrl,instanceUrl:t.instanceUrl}):i.href}:{kind:"action",text:i.text,onClick:()=>i.onClick(t.onDismiss)};return{state:e,triggerWidth:r.triggerWidth,title:r.title,description:n,cta:o}}function L(e){let t=(0,s.useId)(),r=function(){let e=(0,o.ho)(),t=(0,s.useRef)(Date.now()),[,r]=(0,s.useReducer)(e=>e+1,0);return(0,s.useEffect)(()=>{let n=new AbortController;return window.addEventListener("focus",async()=>{let i=e.__internal_environment;if(i){if(null!==i.authConfig.claimedAt)return n.abort();if(!(Date.now()<t.current+1e4)&&"visible"===document.visibilityState)for(let e=0;e<2;e++){let{authConfig:{claimedAt:e}}=await i.fetch();if(t.current=Date.now(),null!==e){r();break}}}},{signal:n.signal}),()=>{n.abort()}},[]),(0,x.O)()}(),{isDragging:l,cornerStyle:k,containerRef:L,onPointerDown:D,preventClick:B,isInitialized:A}=function(){let[e,t]=(0,s.useState)("bottom-right"),[r,n]=(0,s.useState)(!1),[i,o]=(0,s.useState)(!1),[a,l]=(0,s.useState)(!1),c=(0,s.useRef)(null);(0,s.useEffect)(()=>{if("u"<typeof window)return void l(!0);try{let e=localStorage.getItem(u);e&&h.includes(e)&&t(e)}catch{}finally{l(!0)}},[]);let x=(0,s.useRef)(null),b=(0,s.useRef)({state:"idle"}),y=(0,s.useRef)(null),w=(0,s.useRef)({x:0,y:0}),C=(0,s.useRef)({x:0,y:0}),v=(0,s.useRef)(0),k=(0,s.useRef)([]),Y=(0,s.useRef)(null),$=(0,s.useCallback)(e=>{x.current&&(C.current=e,x.current.style.transform=`translate3d(${e.x}px, ${e.y}px, 0)`)},[]),L=(0,s.useCallback)(()=>{let t=x.current;if(!t)return{"top-left":f,"top-right":f,"bottom-left":f,"bottom-right":f};let r=Y.current?.width??t.offsetWidth??0,n=Y.current?.height??t.offsetHeight??0,i=window.innerWidth-document.documentElement.clientWidth;function o(e){let t=e.includes("right"),o=e.includes("bottom");return{x:t?window.innerWidth-i-20-r:20,y:o?window.innerHeight-20-n:20}}let a=o(e);function s(e){let t=o(e);return{x:t.x-a.x,y:t.y-a.y}}return{"top-left":s("top-left"),"top-right":s("top-right"),"bottom-left":s("bottom-left"),"bottom-right":s("bottom-right")}},[e]),D=(0,s.useCallback)(r=>{let n=x.current;if(!n)return;let i=r.translation.x-C.current.x,a=r.translation.y-C.current.y;if(.5>Math.sqrt(i*i+a*a)){m(r.corner),C.current=f,n.style.transition="",n.style.transform=p,b.current={state:"idle"},o(!1);return}let s=i=>{"transform"===i.propertyName&&(n.removeEventListener("transitionend",s),m(r.corner),r.corner===e?(C.current=f,n.style.transition="",n.style.transform=p,b.current={state:"idle"},o(!1)):(b.current={state:"animating"},c.current=r.corner,t(r.corner)))};n.style.transition="transform 350ms cubic-bezier(0.34, 1.2, 0.64, 1)",n.addEventListener("transitionend",s),$(r.translation)},[$,e]),B=(0,s.useCallback)(()=>{"drag"===b.current.state?(x.current?.releasePointerCapture(b.current.pointerId),b.current={state:"animating"}):b.current={state:"idle"},y.current&&(y.current(),y.current=null),k.current=[],n(!1),Y.current=null,x.current?.classList.remove("dev-tools-grabbing"),document.body.style.removeProperty("user-select"),document.body.style.removeProperty("-webkit-user-select")},[]);(0,s.useLayoutEffect)(()=>{if(c.current===e){let e=x.current;e&&"animating"===b.current.state&&(C.current=f,e.style.transition="",e.style.transform=p,b.current={state:"idle"},o(!1),c.current=null)}},[e]),(0,s.useLayoutEffect)(()=>()=>{B()},[B]);let A=(0,s.useCallback)(e=>{let t=e.target;if("A"===t.tagName||t.closest("a")||0!==e.button)return;let r=x.current;if(!r)return;Y.current={width:r.offsetWidth,height:r.offsetHeight},w.current={x:e.clientX,y:e.clientY};let i=r.style.transform;if(i&&"none"!==i&&i!==p){let e=i.match(/translate3d\(([^,]+)px,\s*([^,]+)px/);e&&(C.current={x:parseFloat(e[1])||0,y:parseFloat(e[2])||0})}else C.current=f;b.current={state:"press"},k.current=[],v.current=Date.now();let a=e=>{if("press"===b.current.state){let t=e.clientX-w.current.x,i=e.clientY-w.current.y;if(5>Math.sqrt(t*t+i*i))return;b.current={state:"drag",pointerId:e.pointerId};try{r.setPointerCapture(e.pointerId)}catch{}r.style.transition="none",r.classList.add("dev-tools-grabbing"),document.body.style.userSelect="none",document.body.style.webkitUserSelect="none",n(!0),$({x:C.current.x+t,y:C.current.y+i}),w.current={x:e.clientX,y:e.clientY};return}if("drag"!==b.current.state)return;let t={x:e.clientX,y:e.clientY},i=t.x-w.current.x,o=t.y-w.current.y;w.current=t,$({x:C.current.x+i,y:C.current.y+o});let a=Date.now();a-v.current>=10&&(k.current=[...k.current.slice(-4),{position:t,timestamp:a}],v.current=a)},s=()=>{if("drag"===b.current.state){let e=function(e){if(e.length<2)return f;let t=e[0],r=e[e.length-1],n=r.timestamp-t.timestamp;return 0===n?f:{x:(r.position.x-t.position.x)/n*1e3,y:(r.position.y-t.position.y)/n*1e3}}(k.current),t=L();if(B(),!x.current)return;let r=function(e,t){let r="bottom-right",n=1/0;for(let[i,o]of Object.entries(t)){let t=e.x-o.x,a=e.y-o.y,s=Math.sqrt(t*t+a*a);s<n&&(n=s,r=i)}return r}({x:C.current.x+g(e.x),y:C.current.y+g(e.y)},t),n=t[r];o(!0),D({corner:r,translation:n})}else B()},l=e=>{let t=e.target,r="BUTTON"===t.tagName||t.closest("button"),n="A"===t.tagName||t.closest("a");"animating"!==b.current.state||r||n||(e.preventDefault(),e.stopPropagation())};window.addEventListener("pointermove",a),window.addEventListener("pointerup",s,{once:!0}),window.addEventListener("pointercancel",B,{once:!0}),r.addEventListener("click",l),y.current&&y.current(),y.current=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",s),window.removeEventListener("pointercancel",B),r.removeEventListener("click",l)}},[B,$,D,L]);return{corner:e,isDragging:r,cornerStyle:function(e){switch(e){case"top-left":return{top:d,left:d};case"top-right":return{top:d,right:d};case"bottom-left":return{bottom:d,left:d};case"bottom-right":return{bottom:d,right:d}}}(e),containerRef:x,onPointerDown:A,preventClick:i,isInitialized:a}}(),F=!!r.authConfig.claimedAt,U="function"==typeof e.onDismiss&&F,{isSignedIn:S}=(0,o.Jd)(),_=r.displayConfig.applicationName,M=(0,s.useMemo)(()=>{if(F)return e.copyKeysUrl;let t=new URL(e.claimUrl);return t.searchParams.append("return_url",window.location.href),t.href},[F,e.copyKeysUrl,e.claimUrl]),H=(0,s.useMemo)(()=>(function(e){try{return e()}catch{return"https://dashboard.clerk.com
|
|
66
|
+
`,k={idle:{triggerWidth:"14.25rem",title:"Configure your application",description:(0,n.FD)(n.FK,{children:[(0,n.Y)("p",{children:"Temporary API keys are enabled so you can get started immediately."}),(0,n.Y)("ul",{children:["Add SSO connections (eg. GitHub)","Set up B2B authentication","Enable MFA"].map(e=>(0,n.Y)("li",{children:e},e))}),(0,n.Y)("p",{children:"Access the dashboard to customize auth settings and explore Clerk features."})]}),cta:{kind:"link",text:"Configure your application",href:({claimUrl:e})=>e}},userCreated:{triggerWidth:"15.75rem",title:"You've created your first user!",description:(0,n.Y)("p",{children:"Head to the dashboard to customize authentication settings, view user info, and explore more features."}),cta:{kind:"link",text:"Configure your application",href:({claimUrl:e})=>e}},claimed:{triggerWidth:"14.25rem",title:"Missing environment keys",description:(0,n.Y)("p",{children:"You claimed this application but haven't set keys in your environment. Get them from the Clerk Dashboard."}),cta:{kind:"link",text:"Get API keys",href:({claimUrl:e})=>e}},completed:{triggerWidth:"10.5rem",title:"Your app is ready",description:({appName:e,instanceUrl:t})=>(0,n.FD)("p",{children:["Your application"," ",(0,n.Y)("a",{href:t,target:"_blank",rel:"noopener noreferrer",children:e})," ","has been configured. You may now customize your settings in the Clerk dashboard."]}),cta:{kind:"action",text:"Dismiss",onClick:e=>{e?.().then(()=>{window.location.reload()})}}}};function Y(e,t,r){return t?"completed":e?"claimed":r?"userCreated":"idle"}function $(e,t){let r=k[e],n="function"==typeof r.description?r.description({appName:t.appName,instanceUrl:t.instanceUrl}):r.description,i=r.cta,o="link"===i.kind?{kind:"link",text:i.text,href:"function"==typeof i.href?i.href({claimUrl:t.claimUrl,instanceUrl:t.instanceUrl}):i.href}:{kind:"action",text:i.text,onClick:()=>i.onClick(t.onDismiss)};return{state:e,triggerWidth:r.triggerWidth,title:r.title,description:n,cta:o}}function L(e){let t=(0,s.useId)(),r=function(){let e=(0,o.ho)(),t=(0,s.useRef)(Date.now()),[,r]=(0,s.useReducer)(e=>e+1,0);return(0,s.useEffect)(()=>{let n=new AbortController;return window.addEventListener("focus",async()=>{let i=e.__internal_environment;if(i){if(null!==i.authConfig.claimedAt)return n.abort();if(!(Date.now()<t.current+1e4)&&"visible"===document.visibilityState)for(let e=0;e<2;e++){let{authConfig:{claimedAt:e}}=await i.fetch();if(t.current=Date.now(),null!==e){r();break}}}},{signal:n.signal}),()=>{n.abort()}},[]),(0,x.O)()}(),{isDragging:l,cornerStyle:k,containerRef:L,onPointerDown:D,preventClick:B,isInitialized:A}=function(){let[e,t]=(0,s.useState)("bottom-right"),[r,n]=(0,s.useState)(!1),[i,o]=(0,s.useState)(!1),[a,l]=(0,s.useState)(!1),c=(0,s.useRef)(null);(0,s.useEffect)(()=>{if("u"<typeof window)return void l(!0);try{let e=localStorage.getItem(u);e&&h.includes(e)&&t(e)}catch{}finally{l(!0)}},[]);let x=(0,s.useRef)(null),b=(0,s.useRef)({state:"idle"}),y=(0,s.useRef)(null),w=(0,s.useRef)({x:0,y:0}),C=(0,s.useRef)({x:0,y:0}),v=(0,s.useRef)(0),k=(0,s.useRef)([]),Y=(0,s.useRef)(null),$=(0,s.useCallback)(e=>{x.current&&(C.current=e,x.current.style.transform=`translate3d(${e.x}px, ${e.y}px, 0)`)},[]),L=(0,s.useCallback)(()=>{let t=x.current;if(!t)return{"top-left":f,"top-right":f,"bottom-left":f,"bottom-right":f};let r=Y.current?.width??t.offsetWidth??0,n=Y.current?.height??t.offsetHeight??0,i=window.innerWidth-document.documentElement.clientWidth;function o(e){let t=e.includes("right"),o=e.includes("bottom");return{x:t?window.innerWidth-i-20-r:20,y:o?window.innerHeight-20-n:20}}let a=o(e);function s(e){let t=o(e);return{x:t.x-a.x,y:t.y-a.y}}return{"top-left":s("top-left"),"top-right":s("top-right"),"bottom-left":s("bottom-left"),"bottom-right":s("bottom-right")}},[e]),D=(0,s.useCallback)(r=>{let n=x.current;if(!n)return;let i=r.translation.x-C.current.x,a=r.translation.y-C.current.y;if(.5>Math.sqrt(i*i+a*a)){m(r.corner),C.current=f,n.style.transition="",n.style.transform=p,b.current={state:"idle"},o(!1);return}let s=i=>{"transform"===i.propertyName&&(n.removeEventListener("transitionend",s),m(r.corner),r.corner===e?(C.current=f,n.style.transition="",n.style.transform=p,b.current={state:"idle"},o(!1)):(b.current={state:"animating"},c.current=r.corner,t(r.corner)))};n.style.transition="transform 350ms cubic-bezier(0.34, 1.2, 0.64, 1)",n.addEventListener("transitionend",s),$(r.translation)},[$,e]),B=(0,s.useCallback)(()=>{"drag"===b.current.state?(x.current?.releasePointerCapture(b.current.pointerId),b.current={state:"animating"}):b.current={state:"idle"},y.current&&(y.current(),y.current=null),k.current=[],n(!1),Y.current=null,x.current?.classList.remove("dev-tools-grabbing"),document.body.style.removeProperty("user-select"),document.body.style.removeProperty("-webkit-user-select")},[]);(0,s.useLayoutEffect)(()=>{if(c.current===e){let e=x.current;e&&"animating"===b.current.state&&(C.current=f,e.style.transition="",e.style.transform=p,b.current={state:"idle"},o(!1),c.current=null)}},[e]),(0,s.useLayoutEffect)(()=>()=>{B()},[B]);let A=(0,s.useCallback)(e=>{let t=e.target;if("A"===t.tagName||t.closest("a")||0!==e.button)return;let r=x.current;if(!r)return;Y.current={width:r.offsetWidth,height:r.offsetHeight},w.current={x:e.clientX,y:e.clientY};let i=r.style.transform;if(i&&"none"!==i&&i!==p){let e=i.match(/translate3d\(([^,]+)px,\s*([^,]+)px/);e&&(C.current={x:parseFloat(e[1])||0,y:parseFloat(e[2])||0})}else C.current=f;b.current={state:"press"},k.current=[],v.current=Date.now();let a=e=>{if("press"===b.current.state){let t=e.clientX-w.current.x,i=e.clientY-w.current.y;if(5>Math.sqrt(t*t+i*i))return;b.current={state:"drag",pointerId:e.pointerId};try{r.setPointerCapture(e.pointerId)}catch{}r.style.transition="none",r.classList.add("dev-tools-grabbing"),document.body.style.userSelect="none",document.body.style.webkitUserSelect="none",n(!0),$({x:C.current.x+t,y:C.current.y+i}),w.current={x:e.clientX,y:e.clientY};return}if("drag"!==b.current.state)return;let t={x:e.clientX,y:e.clientY},i=t.x-w.current.x,o=t.y-w.current.y;w.current=t,$({x:C.current.x+i,y:C.current.y+o});let a=Date.now();a-v.current>=10&&(k.current=[...k.current.slice(-4),{position:t,timestamp:a}],v.current=a)},s=()=>{if("drag"===b.current.state){let e=function(e){if(e.length<2)return f;let t=e[0],r=e[e.length-1],n=r.timestamp-t.timestamp;return 0===n?f:{x:(r.position.x-t.position.x)/n*1e3,y:(r.position.y-t.position.y)/n*1e3}}(k.current),t=L();if(B(),!x.current)return;let r=function(e,t){let r="bottom-right",n=1/0;for(let[i,o]of Object.entries(t)){let t=e.x-o.x,a=e.y-o.y,s=Math.sqrt(t*t+a*a);s<n&&(n=s,r=i)}return r}({x:C.current.x+g(e.x),y:C.current.y+g(e.y)},t),n=t[r];o(!0),D({corner:r,translation:n})}else B()},l=e=>{let t=e.target,r="BUTTON"===t.tagName||t.closest("button"),n="A"===t.tagName||t.closest("a");"animating"!==b.current.state||r||n||(e.preventDefault(),e.stopPropagation())};window.addEventListener("pointermove",a),window.addEventListener("pointerup",s,{once:!0}),window.addEventListener("pointercancel",B,{once:!0}),r.addEventListener("click",l),y.current&&y.current(),y.current=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",s),window.removeEventListener("pointercancel",B),r.removeEventListener("click",l)}},[B,$,D,L]);return{corner:e,isDragging:r,cornerStyle:function(e){switch(e){case"top-left":return{top:d,left:d};case"top-right":return{top:d,right:d};case"bottom-left":return{bottom:d,left:d};case"bottom-right":return{bottom:d,right:d}}}(e),containerRef:x,onPointerDown:A,preventClick:i,isInitialized:a}}(),F=!!r.authConfig.claimedAt,U="function"==typeof e.onDismiss&&F,{isSignedIn:S}=(0,o.Jd)(),_=r.displayConfig.applicationName,M=(0,s.useMemo)(()=>{if(F)return e.copyKeysUrl;let t=new URL(e.claimUrl);return t.searchParams.append("return_url",window.location.href),t.href},[F,e.copyKeysUrl,e.claimUrl]),H=(0,s.useMemo)(()=>(function(e){try{return e()}catch{return"https://dashboard.clerk.com/~"}})(()=>{let t=(0,c.CB)(e.copyKeysUrl);return new URL(`${t.baseDomain}/apps/${t.appId}/instances/${t.instanceId}/user-authentication/email-phone-username`).href}),[e.copyKeysUrl]),[E,R]=(0,s.useState)(!0),I=Y(F,U,!!S),z=(0,s.useMemo)(()=>$(I,{appName:_,instanceUrl:H,claimUrl:M,onDismiss:e.onDismiss}),[I,_,H,M,e.onDismiss]),W="link"===z.cta.kind?(0,n.Y)("a",{href:z.cta.href,target:"_blank",rel:"noopener noreferrer",css:v,children:z.cta.text}):(0,n.Y)("button",{type:"button",onClick:z.cta.onClick,css:v,children:z.cta.text});return(0,n.FD)("div",{ref:L,onPointerDown:E?void 0:D,style:{...k,opacity:A?void 0:0},"data-expanded":E,css:(0,a.AH)`
|
|
67
67
|
${w};
|
|
68
68
|
position: fixed;
|
|
69
69
|
z-index: 2147483647;
|