@thunderid/react 0.12.0 → 0.13.1
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/api/getUsersMeMeta.d.ts +22 -0
- package/dist/api/getUsersMeMeta.d.ts.map +1 -0
- package/dist/api/getUsersMeMeta.js +32 -0
- package/dist/api/getUsersMeMeta.js.map +1 -0
- package/dist/cjs/api/getUsersMeMeta.cjs +34 -0
- package/dist/cjs/api/getUsersMeMeta.cjs.map +1 -0
- package/dist/cjs/components/actions/SignInButton/BaseSignInButton.cjs +2 -3
- package/dist/cjs/components/actions/SignInButton/BaseSignInButton.cjs.map +1 -1
- package/dist/cjs/components/actions/SignOutButton/BaseSignOutButton.cjs +2 -3
- package/dist/cjs/components/actions/SignOutButton/BaseSignOutButton.cjs.map +1 -1
- package/dist/cjs/components/actions/SignUpButton/BaseSignUpButton.cjs +2 -3
- package/dist/cjs/components/actions/SignUpButton/BaseSignUpButton.cjs.map +1 -1
- package/dist/cjs/components/adapters/Consent.cjs +34 -27
- package/dist/cjs/components/adapters/Consent.cjs.map +1 -1
- package/dist/cjs/components/adapters/ConsentCheckboxList.cjs +7 -8
- package/dist/cjs/components/adapters/ConsentCheckboxList.cjs.map +1 -1
- package/dist/cjs/components/adapters/ConsentCheckboxList.styles.cjs +8 -9
- package/dist/cjs/components/adapters/ConsentCheckboxList.styles.cjs.map +1 -1
- package/dist/cjs/components/adapters/GoogleButton.cjs +425 -31
- package/dist/cjs/components/adapters/GoogleButton.cjs.map +1 -1
- package/dist/cjs/components/adapters/ImageComponent.cjs +13 -9
- package/dist/cjs/components/adapters/ImageComponent.cjs.map +1 -1
- package/dist/cjs/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.cjs +3 -4
- package/dist/cjs/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.cjs.map +1 -1
- package/dist/cjs/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.styles.cjs +11 -12
- package/dist/cjs/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.styles.cjs.map +1 -1
- package/dist/cjs/components/presentation/UserDropdown/BaseUserDropdown.cjs +12 -16
- package/dist/cjs/components/presentation/UserDropdown/BaseUserDropdown.cjs.map +1 -1
- package/dist/cjs/components/presentation/UserDropdown/BaseUserDropdown.styles.cjs +18 -15
- package/dist/cjs/components/presentation/UserDropdown/BaseUserDropdown.styles.cjs.map +1 -1
- package/dist/cjs/components/presentation/UserProfile/BaseUserProfile.cjs +96 -41
- package/dist/cjs/components/presentation/UserProfile/BaseUserProfile.cjs.map +1 -1
- package/dist/cjs/components/presentation/UserProfile/BaseUserProfile.styles.cjs +25 -26
- package/dist/cjs/components/presentation/UserProfile/BaseUserProfile.styles.cjs.map +1 -1
- package/dist/cjs/components/presentation/UserProfile/UserProfile.cjs +4 -2
- package/dist/cjs/components/presentation/UserProfile/UserProfile.cjs.map +1 -1
- package/dist/cjs/components/presentation/auth/AcceptInvite/BaseAcceptInvite.cjs +10 -31
- package/dist/cjs/components/presentation/auth/AcceptInvite/BaseAcceptInvite.cjs.map +1 -1
- package/dist/cjs/components/presentation/auth/AcceptInvite/BaseAcceptInvite.styles.cjs +41 -9
- package/dist/cjs/components/presentation/auth/AcceptInvite/BaseAcceptInvite.styles.cjs.map +1 -1
- package/dist/cjs/components/presentation/auth/AuthOptionFactory.cjs +75 -71
- package/dist/cjs/components/presentation/auth/AuthOptionFactory.cjs.map +1 -1
- package/dist/cjs/components/presentation/auth/InviteUser/BaseInviteUser.cjs +9 -22
- package/dist/cjs/components/presentation/auth/InviteUser/BaseInviteUser.cjs.map +1 -1
- package/dist/cjs/components/presentation/auth/InviteUser/BaseInviteUser.styles.cjs +22 -9
- package/dist/cjs/components/presentation/auth/InviteUser/BaseInviteUser.styles.cjs.map +1 -1
- package/dist/cjs/components/presentation/auth/Recovery/BaseRecovery.cjs +11 -12
- package/dist/cjs/components/presentation/auth/Recovery/BaseRecovery.cjs.map +1 -1
- package/dist/cjs/components/presentation/auth/SignIn/BaseSignIn.cjs +11 -16
- package/dist/cjs/components/presentation/auth/SignIn/BaseSignIn.cjs.map +1 -1
- package/dist/cjs/components/presentation/auth/SignIn/BaseSignIn.styles.cjs +32 -27
- package/dist/cjs/components/presentation/auth/SignIn/BaseSignIn.styles.cjs.map +1 -1
- package/dist/cjs/components/presentation/auth/SignUp/BaseSignUp.cjs +11 -12
- package/dist/cjs/components/presentation/auth/SignUp/BaseSignUp.cjs.map +1 -1
- package/dist/cjs/components/presentation/auth/SignUp/BaseSignUp.styles.cjs +25 -26
- package/dist/cjs/components/presentation/auth/SignUp/BaseSignUp.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/AffixedField/AffixedField.cjs +6 -7
- package/dist/cjs/components/primitives/AffixedField/AffixedField.cjs.map +1 -1
- package/dist/cjs/components/primitives/AffixedField/AffixedField.styles.cjs +9 -10
- package/dist/cjs/components/primitives/AffixedField/AffixedField.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/Alert/Alert.cjs +6 -7
- package/dist/cjs/components/primitives/Alert/Alert.cjs.map +1 -1
- package/dist/cjs/components/primitives/Alert/Alert.styles.cjs +10 -11
- package/dist/cjs/components/primitives/Alert/Alert.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/Avatar/Avatar.cjs +5 -6
- package/dist/cjs/components/primitives/Avatar/Avatar.cjs.map +1 -1
- package/dist/cjs/components/primitives/Avatar/Avatar.styles.cjs +7 -8
- package/dist/cjs/components/primitives/Avatar/Avatar.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/Button/Button.cjs +8 -12
- package/dist/cjs/components/primitives/Button/Button.cjs.map +1 -1
- package/dist/cjs/components/primitives/Button/Button.styles.cjs +23 -24
- package/dist/cjs/components/primitives/Button/Button.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/Card/Card.cjs +8 -9
- package/dist/cjs/components/primitives/Card/Card.cjs.map +1 -1
- package/dist/cjs/components/primitives/Card/Card.styles.cjs +12 -13
- package/dist/cjs/components/primitives/Card/Card.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/Checkbox/Checkbox.cjs +5 -6
- package/dist/cjs/components/primitives/Checkbox/Checkbox.cjs.map +1 -1
- package/dist/cjs/components/primitives/Checkbox/Checkbox.styles.cjs +7 -8
- package/dist/cjs/components/primitives/Checkbox/Checkbox.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/CopyableText/CopyableText.styles.cjs +6 -7
- package/dist/cjs/components/primitives/CopyableText/CopyableText.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/DatePicker/DatePicker.cjs +4 -5
- package/dist/cjs/components/primitives/DatePicker/DatePicker.cjs.map +1 -1
- package/dist/cjs/components/primitives/DatePicker/DatePicker.styles.cjs +5 -6
- package/dist/cjs/components/primitives/DatePicker/DatePicker.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/Dialog/Dialog.cjs +7 -8
- package/dist/cjs/components/primitives/Dialog/Dialog.cjs.map +1 -1
- package/dist/cjs/components/primitives/Dialog/Dialog.styles.cjs +8 -9
- package/dist/cjs/components/primitives/Dialog/Dialog.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/Divider/Divider.cjs +7 -8
- package/dist/cjs/components/primitives/Divider/Divider.cjs.map +1 -1
- package/dist/cjs/components/primitives/Divider/Divider.styles.cjs +7 -8
- package/dist/cjs/components/primitives/Divider/Divider.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/FormControl/FormControl.cjs +3 -4
- package/dist/cjs/components/primitives/FormControl/FormControl.cjs.map +1 -1
- package/dist/cjs/components/primitives/FormControl/FormControl.styles.cjs +4 -5
- package/dist/cjs/components/primitives/FormControl/FormControl.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/InputLabel/InputLabel.cjs +3 -4
- package/dist/cjs/components/primitives/InputLabel/InputLabel.cjs.map +1 -1
- package/dist/cjs/components/primitives/InputLabel/InputLabel.styles.cjs +6 -7
- package/dist/cjs/components/primitives/InputLabel/InputLabel.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/KeyValueInput/KeyValueInput.cjs +19 -20
- package/dist/cjs/components/primitives/KeyValueInput/KeyValueInput.cjs.map +1 -1
- package/dist/cjs/components/primitives/KeyValueInput/KeyValueInput.styles.cjs +16 -17
- package/dist/cjs/components/primitives/KeyValueInput/KeyValueInput.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/Logo/Logo.cjs +3 -4
- package/dist/cjs/components/primitives/Logo/Logo.cjs.map +1 -1
- package/dist/cjs/components/primitives/Logo/Logo.styles.cjs +9 -10
- package/dist/cjs/components/primitives/Logo/Logo.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/MultiInput/MultiInput.cjs +11 -12
- package/dist/cjs/components/primitives/MultiInput/MultiInput.cjs.map +1 -1
- package/dist/cjs/components/primitives/MultiInput/MultiInput.styles.cjs +10 -11
- package/dist/cjs/components/primitives/MultiInput/MultiInput.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/OtpField/OtpField.cjs +4 -5
- package/dist/cjs/components/primitives/OtpField/OtpField.cjs.map +1 -1
- package/dist/cjs/components/primitives/OtpField/OtpField.styles.cjs +5 -6
- package/dist/cjs/components/primitives/OtpField/OtpField.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/PasswordField/PasswordField.cjs +3 -4
- package/dist/cjs/components/primitives/PasswordField/PasswordField.cjs.map +1 -1
- package/dist/cjs/components/primitives/PasswordField/PasswordField.styles.cjs +4 -5
- package/dist/cjs/components/primitives/PasswordField/PasswordField.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/Select/Select.cjs +3 -4
- package/dist/cjs/components/primitives/Select/Select.cjs.map +1 -1
- package/dist/cjs/components/primitives/Select/Select.styles.cjs +5 -6
- package/dist/cjs/components/primitives/Select/Select.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/Spinner/Spinner.cjs +4 -6
- package/dist/cjs/components/primitives/Spinner/Spinner.cjs.map +1 -1
- package/dist/cjs/components/primitives/Spinner/Spinner.styles.cjs +20 -12
- package/dist/cjs/components/primitives/Spinner/Spinner.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/TextField/TextField.cjs +6 -7
- package/dist/cjs/components/primitives/TextField/TextField.cjs.map +1 -1
- package/dist/cjs/components/primitives/TextField/TextField.styles.cjs +8 -9
- package/dist/cjs/components/primitives/TextField/TextField.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/Toggle/Toggle.cjs +7 -8
- package/dist/cjs/components/primitives/Toggle/Toggle.cjs.map +1 -1
- package/dist/cjs/components/primitives/Toggle/Toggle.styles.cjs +7 -8
- package/dist/cjs/components/primitives/Toggle/Toggle.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/Tooltip/Tooltip.cjs +4 -5
- package/dist/cjs/components/primitives/Tooltip/Tooltip.cjs.map +1 -1
- package/dist/cjs/components/primitives/Tooltip/Tooltip.styles.cjs +13 -14
- package/dist/cjs/components/primitives/Tooltip/Tooltip.styles.cjs.map +1 -1
- package/dist/cjs/components/primitives/Typography/Typography.cjs +2 -3
- package/dist/cjs/components/primitives/Typography/Typography.cjs.map +1 -1
- package/dist/cjs/components/primitives/Typography/Typography.styles.cjs +18 -19
- package/dist/cjs/components/primitives/Typography/Typography.styles.cjs.map +1 -1
- package/dist/cjs/contexts/ThunderID/ThunderIDContext.cjs +1 -0
- package/dist/cjs/contexts/ThunderID/ThunderIDContext.cjs.map +1 -1
- package/dist/cjs/contexts/ThunderID/ThunderIDProvider.cjs +36 -14
- package/dist/cjs/contexts/ThunderID/ThunderIDProvider.cjs.map +1 -1
- package/dist/cjs/contexts/User/UserContext.cjs +2 -1
- package/dist/cjs/contexts/User/UserContext.cjs.map +1 -1
- package/dist/cjs/contexts/User/UserProvider.cjs +5 -3
- package/dist/cjs/contexts/User/UserProvider.cjs.map +1 -1
- package/dist/cjs/index.cjs +2 -0
- package/dist/cjs/styles/emotion.cjs +64 -0
- package/dist/cjs/styles/emotion.cjs.map +1 -0
- package/dist/components/actions/SignInButton/BaseSignInButton.d.ts.map +1 -1
- package/dist/components/actions/SignInButton/BaseSignInButton.js +1 -1
- package/dist/components/actions/SignInButton/BaseSignInButton.js.map +1 -1
- package/dist/components/actions/SignOutButton/BaseSignOutButton.d.ts.map +1 -1
- package/dist/components/actions/SignOutButton/BaseSignOutButton.js +1 -1
- package/dist/components/actions/SignOutButton/BaseSignOutButton.js.map +1 -1
- package/dist/components/actions/SignUpButton/BaseSignUpButton.d.ts.map +1 -1
- package/dist/components/actions/SignUpButton/BaseSignUpButton.js +1 -1
- package/dist/components/actions/SignUpButton/BaseSignUpButton.js.map +1 -1
- package/dist/components/adapters/Consent.d.ts.map +1 -1
- package/dist/components/adapters/Consent.js +34 -27
- package/dist/components/adapters/Consent.js.map +1 -1
- package/dist/components/adapters/ConsentCheckboxList.d.ts.map +1 -1
- package/dist/components/adapters/ConsentCheckboxList.js +1 -1
- package/dist/components/adapters/ConsentCheckboxList.js.map +1 -1
- package/dist/components/adapters/ConsentCheckboxList.styles.d.ts.map +1 -1
- package/dist/components/adapters/ConsentCheckboxList.styles.js +1 -1
- package/dist/components/adapters/ConsentCheckboxList.styles.js.map +1 -1
- package/dist/components/adapters/GoogleButton.d.ts.map +1 -1
- package/dist/components/adapters/GoogleButton.js +425 -31
- package/dist/components/adapters/GoogleButton.js.map +1 -1
- package/dist/components/adapters/ImageComponent.d.ts.map +1 -1
- package/dist/components/adapters/ImageComponent.js +13 -9
- package/dist/components/adapters/ImageComponent.js.map +1 -1
- package/dist/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.d.ts.map +1 -1
- package/dist/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.js +1 -1
- package/dist/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.js.map +1 -1
- package/dist/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.styles.d.ts.map +1 -1
- package/dist/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.styles.js +1 -1
- package/dist/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.styles.js.map +1 -1
- package/dist/components/presentation/UserDropdown/BaseUserDropdown.d.ts.map +1 -1
- package/dist/components/presentation/UserDropdown/BaseUserDropdown.js +5 -8
- package/dist/components/presentation/UserDropdown/BaseUserDropdown.js.map +1 -1
- package/dist/components/presentation/UserDropdown/BaseUserDropdown.styles.d.ts.map +1 -1
- package/dist/components/presentation/UserDropdown/BaseUserDropdown.styles.js +5 -1
- package/dist/components/presentation/UserDropdown/BaseUserDropdown.styles.js.map +1 -1
- package/dist/components/presentation/UserProfile/BaseUserProfile.d.ts +2 -1
- package/dist/components/presentation/UserProfile/BaseUserProfile.d.ts.map +1 -1
- package/dist/components/presentation/UserProfile/BaseUserProfile.js +92 -36
- package/dist/components/presentation/UserProfile/BaseUserProfile.js.map +1 -1
- package/dist/components/presentation/UserProfile/BaseUserProfile.styles.d.ts.map +1 -1
- package/dist/components/presentation/UserProfile/BaseUserProfile.styles.js +1 -1
- package/dist/components/presentation/UserProfile/BaseUserProfile.styles.js.map +1 -1
- package/dist/components/presentation/UserProfile/UserProfile.d.ts.map +1 -1
- package/dist/components/presentation/UserProfile/UserProfile.js +5 -3
- package/dist/components/presentation/UserProfile/UserProfile.js.map +1 -1
- package/dist/components/presentation/auth/AcceptInvite/BaseAcceptInvite.d.ts.map +1 -1
- package/dist/components/presentation/auth/AcceptInvite/BaseAcceptInvite.js +7 -27
- package/dist/components/presentation/auth/AcceptInvite/BaseAcceptInvite.js.map +1 -1
- package/dist/components/presentation/auth/AcceptInvite/BaseAcceptInvite.styles.d.ts.map +1 -1
- package/dist/components/presentation/auth/AcceptInvite/BaseAcceptInvite.styles.js +38 -5
- package/dist/components/presentation/auth/AcceptInvite/BaseAcceptInvite.styles.js.map +1 -1
- package/dist/components/presentation/auth/AuthOptionFactory.d.ts.map +1 -1
- package/dist/components/presentation/auth/AuthOptionFactory.js +68 -63
- package/dist/components/presentation/auth/AuthOptionFactory.js.map +1 -1
- package/dist/components/presentation/auth/InviteUser/BaseInviteUser.d.ts.map +1 -1
- package/dist/components/presentation/auth/InviteUser/BaseInviteUser.js +5 -17
- package/dist/components/presentation/auth/InviteUser/BaseInviteUser.js.map +1 -1
- package/dist/components/presentation/auth/InviteUser/BaseInviteUser.styles.d.ts.map +1 -1
- package/dist/components/presentation/auth/InviteUser/BaseInviteUser.styles.js +19 -5
- package/dist/components/presentation/auth/InviteUser/BaseInviteUser.styles.js.map +1 -1
- package/dist/components/presentation/auth/Recovery/BaseRecovery.d.ts.map +1 -1
- package/dist/components/presentation/auth/Recovery/BaseRecovery.js +1 -1
- package/dist/components/presentation/auth/Recovery/BaseRecovery.js.map +1 -1
- package/dist/components/presentation/auth/SignIn/BaseSignIn.d.ts.map +1 -1
- package/dist/components/presentation/auth/SignIn/BaseSignIn.js +2 -6
- package/dist/components/presentation/auth/SignIn/BaseSignIn.js.map +1 -1
- package/dist/components/presentation/auth/SignIn/BaseSignIn.styles.d.ts.map +1 -1
- package/dist/components/presentation/auth/SignIn/BaseSignIn.styles.js +7 -1
- package/dist/components/presentation/auth/SignIn/BaseSignIn.styles.js.map +1 -1
- package/dist/components/presentation/auth/SignUp/BaseSignUp.d.ts.map +1 -1
- package/dist/components/presentation/auth/SignUp/BaseSignUp.js +1 -1
- package/dist/components/presentation/auth/SignUp/BaseSignUp.js.map +1 -1
- package/dist/components/presentation/auth/SignUp/BaseSignUp.styles.d.ts.map +1 -1
- package/dist/components/presentation/auth/SignUp/BaseSignUp.styles.js +1 -1
- package/dist/components/presentation/auth/SignUp/BaseSignUp.styles.js.map +1 -1
- package/dist/components/primitives/AffixedField/AffixedField.d.ts.map +1 -1
- package/dist/components/primitives/AffixedField/AffixedField.js +1 -1
- package/dist/components/primitives/AffixedField/AffixedField.js.map +1 -1
- package/dist/components/primitives/AffixedField/AffixedField.styles.d.ts.map +1 -1
- package/dist/components/primitives/AffixedField/AffixedField.styles.js +1 -1
- package/dist/components/primitives/AffixedField/AffixedField.styles.js.map +1 -1
- package/dist/components/primitives/Alert/Alert.d.ts.map +1 -1
- package/dist/components/primitives/Alert/Alert.js +1 -1
- package/dist/components/primitives/Alert/Alert.js.map +1 -1
- package/dist/components/primitives/Alert/Alert.styles.d.ts.map +1 -1
- package/dist/components/primitives/Alert/Alert.styles.js +1 -1
- package/dist/components/primitives/Alert/Alert.styles.js.map +1 -1
- package/dist/components/primitives/Avatar/Avatar.d.ts.map +1 -1
- package/dist/components/primitives/Avatar/Avatar.js +1 -1
- package/dist/components/primitives/Avatar/Avatar.js.map +1 -1
- package/dist/components/primitives/Avatar/Avatar.styles.d.ts.map +1 -1
- package/dist/components/primitives/Avatar/Avatar.styles.js +1 -1
- package/dist/components/primitives/Avatar/Avatar.styles.js.map +1 -1
- package/dist/components/primitives/Button/Button.d.ts.map +1 -1
- package/dist/components/primitives/Button/Button.js +2 -5
- package/dist/components/primitives/Button/Button.js.map +1 -1
- package/dist/components/primitives/Button/Button.styles.d.ts.map +1 -1
- package/dist/components/primitives/Button/Button.styles.js +1 -1
- package/dist/components/primitives/Button/Button.styles.js.map +1 -1
- package/dist/components/primitives/Card/Card.d.ts.map +1 -1
- package/dist/components/primitives/Card/Card.js +1 -1
- package/dist/components/primitives/Card/Card.js.map +1 -1
- package/dist/components/primitives/Card/Card.styles.d.ts.map +1 -1
- package/dist/components/primitives/Card/Card.styles.js +1 -1
- package/dist/components/primitives/Card/Card.styles.js.map +1 -1
- package/dist/components/primitives/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/primitives/Checkbox/Checkbox.js +1 -1
- package/dist/components/primitives/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/primitives/Checkbox/Checkbox.styles.d.ts.map +1 -1
- package/dist/components/primitives/Checkbox/Checkbox.styles.js +1 -1
- package/dist/components/primitives/Checkbox/Checkbox.styles.js.map +1 -1
- package/dist/components/primitives/CopyableText/CopyableText.styles.d.ts.map +1 -1
- package/dist/components/primitives/CopyableText/CopyableText.styles.js +1 -1
- package/dist/components/primitives/CopyableText/CopyableText.styles.js.map +1 -1
- package/dist/components/primitives/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/components/primitives/DatePicker/DatePicker.js +1 -1
- package/dist/components/primitives/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/primitives/DatePicker/DatePicker.styles.d.ts.map +1 -1
- package/dist/components/primitives/DatePicker/DatePicker.styles.js +1 -1
- package/dist/components/primitives/DatePicker/DatePicker.styles.js.map +1 -1
- package/dist/components/primitives/Dialog/Dialog.d.ts.map +1 -1
- package/dist/components/primitives/Dialog/Dialog.js +1 -1
- package/dist/components/primitives/Dialog/Dialog.js.map +1 -1
- package/dist/components/primitives/Dialog/Dialog.styles.d.ts.map +1 -1
- package/dist/components/primitives/Dialog/Dialog.styles.js +1 -1
- package/dist/components/primitives/Dialog/Dialog.styles.js.map +1 -1
- package/dist/components/primitives/Divider/Divider.d.ts.map +1 -1
- package/dist/components/primitives/Divider/Divider.js +1 -1
- package/dist/components/primitives/Divider/Divider.js.map +1 -1
- package/dist/components/primitives/Divider/Divider.styles.d.ts.map +1 -1
- package/dist/components/primitives/Divider/Divider.styles.js +1 -1
- package/dist/components/primitives/Divider/Divider.styles.js.map +1 -1
- package/dist/components/primitives/FormControl/FormControl.d.ts.map +1 -1
- package/dist/components/primitives/FormControl/FormControl.js +1 -1
- package/dist/components/primitives/FormControl/FormControl.js.map +1 -1
- package/dist/components/primitives/FormControl/FormControl.styles.d.ts.map +1 -1
- package/dist/components/primitives/FormControl/FormControl.styles.js +1 -1
- package/dist/components/primitives/FormControl/FormControl.styles.js.map +1 -1
- package/dist/components/primitives/InputLabel/InputLabel.d.ts.map +1 -1
- package/dist/components/primitives/InputLabel/InputLabel.js +1 -1
- package/dist/components/primitives/InputLabel/InputLabel.js.map +1 -1
- package/dist/components/primitives/InputLabel/InputLabel.styles.d.ts.map +1 -1
- package/dist/components/primitives/InputLabel/InputLabel.styles.js +1 -1
- package/dist/components/primitives/InputLabel/InputLabel.styles.js.map +1 -1
- package/dist/components/primitives/KeyValueInput/KeyValueInput.d.ts.map +1 -1
- package/dist/components/primitives/KeyValueInput/KeyValueInput.js +1 -1
- package/dist/components/primitives/KeyValueInput/KeyValueInput.js.map +1 -1
- package/dist/components/primitives/KeyValueInput/KeyValueInput.styles.d.ts.map +1 -1
- package/dist/components/primitives/KeyValueInput/KeyValueInput.styles.js +1 -1
- package/dist/components/primitives/KeyValueInput/KeyValueInput.styles.js.map +1 -1
- package/dist/components/primitives/Logo/Logo.d.ts.map +1 -1
- package/dist/components/primitives/Logo/Logo.js +1 -1
- package/dist/components/primitives/Logo/Logo.js.map +1 -1
- package/dist/components/primitives/Logo/Logo.styles.d.ts.map +1 -1
- package/dist/components/primitives/Logo/Logo.styles.js +1 -1
- package/dist/components/primitives/Logo/Logo.styles.js.map +1 -1
- package/dist/components/primitives/MultiInput/MultiInput.d.ts.map +1 -1
- package/dist/components/primitives/MultiInput/MultiInput.js +1 -1
- package/dist/components/primitives/MultiInput/MultiInput.js.map +1 -1
- package/dist/components/primitives/MultiInput/MultiInput.styles.d.ts.map +1 -1
- package/dist/components/primitives/MultiInput/MultiInput.styles.js +1 -1
- package/dist/components/primitives/MultiInput/MultiInput.styles.js.map +1 -1
- package/dist/components/primitives/OtpField/OtpField.d.ts.map +1 -1
- package/dist/components/primitives/OtpField/OtpField.js +1 -1
- package/dist/components/primitives/OtpField/OtpField.js.map +1 -1
- package/dist/components/primitives/OtpField/OtpField.styles.d.ts.map +1 -1
- package/dist/components/primitives/OtpField/OtpField.styles.js +1 -1
- package/dist/components/primitives/OtpField/OtpField.styles.js.map +1 -1
- package/dist/components/primitives/PasswordField/PasswordField.d.ts.map +1 -1
- package/dist/components/primitives/PasswordField/PasswordField.js +1 -1
- package/dist/components/primitives/PasswordField/PasswordField.js.map +1 -1
- package/dist/components/primitives/PasswordField/PasswordField.styles.d.ts.map +1 -1
- package/dist/components/primitives/PasswordField/PasswordField.styles.js +1 -1
- package/dist/components/primitives/PasswordField/PasswordField.styles.js.map +1 -1
- package/dist/components/primitives/Select/Select.d.ts.map +1 -1
- package/dist/components/primitives/Select/Select.js +1 -1
- package/dist/components/primitives/Select/Select.js.map +1 -1
- package/dist/components/primitives/Select/Select.styles.d.ts.map +1 -1
- package/dist/components/primitives/Select/Select.styles.js +1 -1
- package/dist/components/primitives/Select/Select.styles.js.map +1 -1
- package/dist/components/primitives/Spinner/Spinner.d.ts +5 -3
- package/dist/components/primitives/Spinner/Spinner.d.ts.map +1 -1
- package/dist/components/primitives/Spinner/Spinner.js +4 -5
- package/dist/components/primitives/Spinner/Spinner.js.map +1 -1
- package/dist/components/primitives/Spinner/Spinner.styles.d.ts +4 -1
- package/dist/components/primitives/Spinner/Spinner.styles.d.ts.map +1 -1
- package/dist/components/primitives/Spinner/Spinner.styles.js +16 -7
- package/dist/components/primitives/Spinner/Spinner.styles.js.map +1 -1
- package/dist/components/primitives/TextField/TextField.d.ts.map +1 -1
- package/dist/components/primitives/TextField/TextField.js +1 -1
- package/dist/components/primitives/TextField/TextField.js.map +1 -1
- package/dist/components/primitives/TextField/TextField.styles.d.ts.map +1 -1
- package/dist/components/primitives/TextField/TextField.styles.js +1 -1
- package/dist/components/primitives/TextField/TextField.styles.js.map +1 -1
- package/dist/components/primitives/Toggle/Toggle.d.ts.map +1 -1
- package/dist/components/primitives/Toggle/Toggle.js +1 -1
- package/dist/components/primitives/Toggle/Toggle.js.map +1 -1
- package/dist/components/primitives/Toggle/Toggle.styles.d.ts.map +1 -1
- package/dist/components/primitives/Toggle/Toggle.styles.js +1 -1
- package/dist/components/primitives/Toggle/Toggle.styles.js.map +1 -1
- package/dist/components/primitives/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/components/primitives/Tooltip/Tooltip.js +1 -1
- package/dist/components/primitives/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/primitives/Tooltip/Tooltip.styles.d.ts.map +1 -1
- package/dist/components/primitives/Tooltip/Tooltip.styles.js +1 -1
- package/dist/components/primitives/Tooltip/Tooltip.styles.js.map +1 -1
- package/dist/components/primitives/Typography/Typography.d.ts.map +1 -1
- package/dist/components/primitives/Typography/Typography.js +1 -1
- package/dist/components/primitives/Typography/Typography.js.map +1 -1
- package/dist/components/primitives/Typography/Typography.styles.d.ts.map +1 -1
- package/dist/components/primitives/Typography/Typography.styles.js +1 -1
- package/dist/components/primitives/Typography/Typography.styles.js.map +1 -1
- package/dist/contexts/ThunderID/ThunderIDContext.d.ts +5 -1
- package/dist/contexts/ThunderID/ThunderIDContext.d.ts.map +1 -1
- package/dist/contexts/ThunderID/ThunderIDContext.js +1 -0
- package/dist/contexts/ThunderID/ThunderIDContext.js.map +1 -1
- package/dist/contexts/ThunderID/ThunderIDProvider.d.ts.map +1 -1
- package/dist/contexts/ThunderID/ThunderIDProvider.js +36 -14
- package/dist/contexts/ThunderID/ThunderIDProvider.js.map +1 -1
- package/dist/contexts/User/UserContext.d.ts +2 -1
- package/dist/contexts/User/UserContext.d.ts.map +1 -1
- package/dist/contexts/User/UserContext.js +2 -1
- package/dist/contexts/User/UserContext.js.map +1 -1
- package/dist/contexts/User/UserProvider.d.ts +5 -2
- package/dist/contexts/User/UserProvider.d.ts.map +1 -1
- package/dist/contexts/User/UserProvider.js +5 -3
- package/dist/contexts/User/UserProvider.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/models/config.d.ts +10 -1
- package/dist/models/config.d.ts.map +1 -1
- package/dist/styles/emotion.d.ts +36 -0
- package/dist/styles/emotion.d.ts.map +1 -0
- package/dist/styles/emotion.js +58 -0
- package/dist/styles/emotion.js.map +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseLanguageSwitcher.js","names":["BaseLanguageSwitcher: FC<BaseLanguageSwitcherProps>","useTheme","styles: Record<string, string>","useStyles","hasMultipleLanguages: boolean","currentOption: LanguageOption | undefined","ChevronDown","Check"],"sources":["../../../../src/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {
|
|
1
|
+
{"version":3,"file":"BaseLanguageSwitcher.js","names":["BaseLanguageSwitcher: FC<BaseLanguageSwitcherProps>","useTheme","styles: Record<string, string>","useStyles","hasMultipleLanguages: boolean","currentOption: LanguageOption | undefined","ChevronDown","Check"],"sources":["../../../../src/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingPortal,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useInteractions,\n useRole,\n} from '@floating-ui/react';\nimport {FC, ReactElement, ReactNode, useEffect, useState} from 'react';\nimport useStyles from './BaseLanguageSwitcher.styles';\nimport useTheme from '../../../contexts/Theme/useTheme';\nimport {cx} from '../../../styles/emotion';\nimport Check from '../../primitives/Icons/Check';\nimport ChevronDown from '../../primitives/Icons/ChevronDown';\n\n/**\n * A resolved language option with display name and emoji flag.\n */\nexport interface LanguageOption {\n /** BCP 47 language tag (e.g. \"en\", \"fr\", \"en-US\") */\n code: string;\n /** Human-readable display name resolved via Intl.DisplayNames */\n displayName: string;\n /** Flag emoji or globe emoji for the language */\n emoji: string;\n}\n\n/**\n * Render props exposed to consumers when using the render-prop pattern.\n */\nexport interface LanguageSwitcherRenderProps {\n /** The currently active language code */\n currentLanguage: string;\n /** Whether a language switch is in progress */\n isLoading: boolean;\n /** Resolved language options */\n languages: LanguageOption[];\n /** Call this to switch to a different language */\n onLanguageChange: (language: string) => void;\n}\n\nexport interface BaseLanguageSwitcherProps {\n /**\n * Render-props callback. When provided, the default dropdown UI is replaced with\n * whatever JSX the callback returns.\n *\n * @example\n * ```tsx\n * <BaseLanguageSwitcher {...props}>\n * {({languages, currentLanguage, onLanguageChange}) => (\n * <select value={currentLanguage} onChange={e => onLanguageChange(e.target.value)}>\n * {languages.map(l => <option key={l.code} value={l.code}>{l.emoji} {l.displayName}</option>)}\n * </select>\n * )}\n * </BaseLanguageSwitcher>\n * ```\n */\n children?: (props: LanguageSwitcherRenderProps) => ReactNode;\n /** Additional CSS class applied to the root element (default UI only) */\n className?: string;\n /** The currently active language code */\n currentLanguage: string;\n /** Whether a language switch is in progress */\n isLoading?: boolean;\n /** Resolved language options to display */\n languages: LanguageOption[];\n /** Called when the user selects a language */\n onLanguageChange: (language: string) => void;\n}\n\n/**\n * Pure-UI language switcher dropdown.\n * Accepts resolved `LanguageOption[]` (code + displayName + emoji) and delegates\n * language switching to the `onLanguageChange` callback.\n *\n * Supports render props for full UI customisation.\n */\nconst BaseLanguageSwitcher: FC<BaseLanguageSwitcherProps> = ({\n children,\n className,\n currentLanguage,\n isLoading = false,\n languages,\n onLanguageChange,\n}: BaseLanguageSwitcherProps): ReactElement => {\n const {theme, colorScheme} = useTheme();\n const styles: Record<string, string> = useStyles(theme, colorScheme);\n const [isOpen, setIsOpen] = useState(false);\n const hasMultipleLanguages: boolean = languages.length > 1;\n\n useEffect(() => {\n if (!hasMultipleLanguages && isOpen) {\n setIsOpen(false);\n }\n }, [hasMultipleLanguages, isOpen]);\n\n const {refs, floatingStyles, context} = useFloating({\n middleware: [offset(4), flip(), shift()],\n onOpenChange: setIsOpen,\n open: isOpen,\n whileElementsMounted: autoUpdate,\n });\n\n const click: ReturnType<typeof useClick> = useClick(context, {enabled: hasMultipleLanguages});\n const dismiss: ReturnType<typeof useDismiss> = useDismiss(context, {enabled: hasMultipleLanguages});\n const role: ReturnType<typeof useRole> = useRole(context, {enabled: hasMultipleLanguages, role: 'listbox'});\n const {getReferenceProps, getFloatingProps} = useInteractions([click, dismiss, role]);\n\n const currentOption: LanguageOption | undefined = languages.find((l: LanguageOption) => l.code === currentLanguage);\n\n if (children) {\n return (\n <>\n {children({\n currentLanguage,\n isLoading,\n languages,\n onLanguageChange,\n })}\n </>\n );\n }\n\n return (\n <div className={cx(styles['root'], className)}>\n <button\n ref={refs.setReference}\n type=\"button\"\n disabled={isLoading}\n aria-label=\"Switch language\"\n {...getReferenceProps()}\n className={styles['trigger']}\n >\n {currentOption && <span className={styles['triggerEmoji']}>{currentOption.emoji}</span>}\n <span className={styles['triggerLabel']}>{currentOption?.displayName ?? currentLanguage}</span>\n {hasMultipleLanguages && <ChevronDown />}\n </button>\n\n {isOpen && hasMultipleLanguages && (\n <FloatingPortal>\n <FloatingFocusManager context={context} modal={false}>\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n className={styles['content']}\n role=\"listbox\"\n aria-label=\"Select language\"\n >\n {languages.map((lang: LanguageOption) => (\n <button\n key={lang.code}\n type=\"button\"\n role=\"option\"\n aria-selected={lang.code === currentLanguage}\n className={cx(styles['option'], lang.code === currentLanguage && styles['optionActive'])}\n onClick={() => {\n onLanguageChange(lang.code);\n setIsOpen(false);\n }}\n >\n <span className={styles['optionEmoji']}>{lang.emoji}</span>\n <span className={styles['optionLabel']}>{lang.displayName}</span>\n {lang.code === currentLanguage && (\n <span className={styles['checkIcon']}>\n <Check />\n </span>\n )}\n </button>\n ))}\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </div>\n );\n};\n\nexport default BaseLanguageSwitcher;\n"],"mappings":";;;;;;;;;;;;;;;;;AAqFA,MAAMA,wBAAuD,EAC3D,UACA,WACA,iBACA,YAAY,OACZ,WACA,uBAC6C;CAC7C,MAAM,EAAC,OAAO,gBAAeC,kBAAU;CACvC,MAAMC,SAAiCC,oCAAU,OAAO,YAAY;CACpE,MAAM,CAAC,QAAQ,aAAa,SAAS,MAAM;CAC3C,MAAMC,uBAAgC,UAAU,SAAS;AAEzD,iBAAgB;AACd,MAAI,CAAC,wBAAwB,OAC3B,WAAU,MAAM;IAEjB,CAAC,sBAAsB,OAAO,CAAC;CAElC,MAAM,EAAC,MAAM,gBAAgB,YAAW,YAAY;EAClD,YAAY;GAAC,OAAO,EAAE;GAAE,MAAM;GAAE,OAAO;GAAC;EACxC,cAAc;EACd,MAAM;EACN,sBAAsB;EACvB,CAAC;CAKF,MAAM,EAAC,mBAAmB,qBAAoB,gBAAgB;EAHnB,SAAS,SAAS,EAAC,SAAS,sBAAqB,CAAC;EAC9C,WAAW,SAAS,EAAC,SAAS,sBAAqB,CAAC;EAC1D,QAAQ,SAAS;GAAC,SAAS;GAAsB,MAAM;GAAU,CAAC;EACvB,CAAC;CAErF,MAAMC,gBAA4C,UAAU,MAAM,MAAsB,EAAE,SAAS,gBAAgB;AAEnH,KAAI,SACF,QACE,0CACG,SAAS;EACR;EACA;EACA;EACA;EACD,CAAC,GACD;AAIP,QACE,qBAAC;EAAI,WAAW,GAAG,OAAO,SAAS,UAAU;aAC3C,qBAAC;GACC,KAAK,KAAK;GACV,MAAK;GACL,UAAU;GACV,cAAW;GACX,GAAI,mBAAmB;GACvB,WAAW,OAAO;;IAEjB,iBAAiB,oBAAC;KAAK,WAAW,OAAO;eAAkB,cAAc;MAAa;IACvF,oBAAC;KAAK,WAAW,OAAO;eAAkB,eAAe,eAAe;MAAuB;IAC9F,wBAAwB,oBAACC,wBAAc;;IACjC,EAER,UAAU,wBACT,oBAAC,4BACC,oBAAC;GAA8B;GAAS,OAAO;aAC7C,oBAAC;IACC,KAAK,KAAK;IACV,OAAO;IACP,GAAI,kBAAkB;IACtB,WAAW,OAAO;IAClB,MAAK;IACL,cAAW;cAEV,UAAU,KAAK,SACd,qBAAC;KAEC,MAAK;KACL,MAAK;KACL,iBAAe,KAAK,SAAS;KAC7B,WAAW,GAAG,OAAO,WAAW,KAAK,SAAS,mBAAmB,OAAO,gBAAgB;KACxF,eAAe;AACb,uBAAiB,KAAK,KAAK;AAC3B,gBAAU,MAAM;;;MAGlB,oBAAC;OAAK,WAAW,OAAO;iBAAiB,KAAK;QAAa;MAC3D,oBAAC;OAAK,WAAW,OAAO;iBAAiB,KAAK;QAAmB;MAChE,KAAK,SAAS,mBACb,oBAAC;OAAK,WAAW,OAAO;iBACtB,oBAACC,kBAAQ;QACJ;;OAfJ,KAAK,KAiBH,CACT;KACE;IACe,GACR;GAEf;;AAIV,mCAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseLanguageSwitcher.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.styles.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BaseLanguageSwitcher.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.styles.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AAIzC,QAAA,MAAM,SAAS,GAAI,OAAO,KAAK,EAAE,aAAa,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAqHxE,CAAC;AAEL,eAAe,SAAS,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { css } from "../../../styles/emotion.js";
|
|
1
2
|
import { useMemo } from "react";
|
|
2
|
-
import { css } from "@emotion/css";
|
|
3
3
|
|
|
4
4
|
//#region src/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.styles.ts
|
|
5
5
|
const useStyles = (theme, colorScheme) => useMemo(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseLanguageSwitcher.styles.js","names":["root: string","trigger: string","triggerEmoji: string","triggerLabel: string","content: string","option: string","optionActive: string","optionEmoji: string","optionLabel: string"],"sources":["../../../../src/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.styles.ts"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {
|
|
1
|
+
{"version":3,"file":"BaseLanguageSwitcher.styles.js","names":["root: string","trigger: string","triggerEmoji: string","triggerLabel: string","content: string","option: string","optionActive: string","optionEmoji: string","optionLabel: string"],"sources":["../../../../src/components/presentation/LanguageSwitcher/BaseLanguageSwitcher.styles.ts"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {Theme} from '@thunderid/browser';\nimport {useMemo} from 'react';\nimport {css} from '../../../styles/emotion';\n\nconst useStyles = (theme: Theme, colorScheme: string): Record<string, string> =>\n useMemo(() => {\n const root: string = css`\n display: inline-block;\n position: relative;\n font-family: ${theme.vars.typography.fontFamily};\n `;\n\n const trigger: string = css`\n display: inline-flex;\n align-items: center;\n gap: calc(${theme.vars.spacing.unit} * 0.5);\n padding: calc(${theme.vars.spacing.unit} * 0.75) ${theme.vars.spacing.unit};\n border: 1px solid ${theme.vars.colors.border};\n background: ${theme.vars.colors.background.surface};\n cursor: pointer;\n border-radius: ${theme.vars.borderRadius.medium};\n min-width: 120px;\n font-size: 0.875rem;\n color: ${theme.vars.colors.text.primary};\n\n &:hover {\n background-color: ${theme.vars.colors.action?.hover || 'rgba(0, 0, 0, 0.04)'};\n }\n `;\n\n const triggerEmoji: string = css`\n font-size: 1rem;\n line-height: 1;\n `;\n\n const triggerLabel: string = css`\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n `;\n\n const content: string = css`\n min-width: 200px;\n max-width: 320px;\n background-color: ${theme.vars.colors.background.surface};\n border-radius: ${theme.vars.borderRadius.medium};\n box-shadow: ${theme.vars.shadows.medium};\n border: 1px solid ${theme.vars.colors.border};\n outline: none;\n z-index: 1000;\n padding: calc(${theme.vars.spacing.unit} * 0.5) 0;\n `;\n\n const option: string = css`\n display: flex;\n align-items: center;\n gap: ${theme.vars.spacing.unit};\n padding: calc(${theme.vars.spacing.unit} * 1) calc(${theme.vars.spacing.unit} * 1.5);\n width: 100%;\n border: none;\n background-color: transparent;\n cursor: pointer;\n font-size: 0.875rem;\n text-align: start;\n color: ${theme.vars.colors.text.primary};\n transition: background-color 0.15s ease-in-out;\n\n &:hover {\n background-color: ${theme.vars.colors.action?.hover || 'rgba(0, 0, 0, 0.04)'};\n }\n `;\n\n const optionActive: string = css`\n font-weight: 600;\n color: ${theme.vars.colors.primary?.main || theme.vars.colors.text.primary};\n `;\n\n const optionEmoji: string = css`\n font-size: 1rem;\n line-height: 1;\n flex-shrink: 0;\n `;\n\n const optionLabel: string = css`\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `;\n\n const checkIcon: string = css`\n color: ${theme.vars.colors.primary?.main || theme.vars.colors.text.primary};\n flex-shrink: 0;\n margin-inline-start: auto;\n `;\n\n return {\n checkIcon,\n content,\n option,\n optionActive,\n optionEmoji,\n optionLabel,\n root,\n trigger,\n triggerEmoji,\n triggerLabel,\n };\n }, [\n theme.vars.colors.background.surface,\n theme.vars.colors.text.primary,\n theme.vars.colors.border,\n theme.vars.borderRadius.medium,\n theme.vars.shadows.medium,\n theme.vars.spacing.unit,\n theme.vars.colors.action?.hover,\n theme.vars.typography.fontFamily,\n theme.vars.colors.primary?.main,\n colorScheme,\n ]);\n\nexport default useStyles;\n"],"mappings":";;;;AAOA,MAAM,aAAa,OAAc,gBAC/B,cAAc;CACZ,MAAMA,OAAe,GAAG;;;qBAGP,MAAM,KAAK,WAAW,WAAW;;CAGlD,MAAMC,UAAkB,GAAG;;;kBAGb,MAAM,KAAK,QAAQ,KAAK;sBACpB,MAAM,KAAK,QAAQ,KAAK,WAAW,MAAM,KAAK,QAAQ,KAAK;0BACvD,MAAM,KAAK,OAAO,OAAO;oBAC/B,MAAM,KAAK,OAAO,WAAW,QAAQ;;uBAElC,MAAM,KAAK,aAAa,OAAO;;;eAGvC,MAAM,KAAK,OAAO,KAAK,QAAQ;;;4BAGlB,MAAM,KAAK,OAAO,QAAQ,SAAS,sBAAsB;;;CAIjF,MAAMC,eAAuB,GAAG;;;;CAKhC,MAAMC,eAAuB,GAAG;;;;;;;CAQhC,MAAMC,UAAkB,GAAG;;;0BAGL,MAAM,KAAK,OAAO,WAAW,QAAQ;uBACxC,MAAM,KAAK,aAAa,OAAO;oBAClC,MAAM,KAAK,QAAQ,OAAO;0BACpB,MAAM,KAAK,OAAO,OAAO;;;sBAG7B,MAAM,KAAK,QAAQ,KAAK;;CAG1C,MAAMC,SAAiB,GAAG;;;aAGjB,MAAM,KAAK,QAAQ,KAAK;sBACf,MAAM,KAAK,QAAQ,KAAK,aAAa,MAAM,KAAK,QAAQ,KAAK;;;;;;;eAOpE,MAAM,KAAK,OAAO,KAAK,QAAQ;;;;4BAIlB,MAAM,KAAK,OAAO,QAAQ,SAAS,sBAAsB;;;CAIjF,MAAMC,eAAuB,GAAG;;eAErB,MAAM,KAAK,OAAO,SAAS,QAAQ,MAAM,KAAK,OAAO,KAAK,QAAQ;;CAG7E,MAAMC,cAAsB,GAAG;;;;;CAM/B,MAAMC,cAAsB,GAAG;;;;;;AAa/B,QAAO;EACL,WAPwB,GAAG;eAClB,MAAM,KAAK,OAAO,SAAS,QAAQ,MAAM,KAAK,OAAO,KAAK,QAAQ;;;;EAO3E;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;GACA;CACD,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,KAAK,OAAO,KAAK;CACvB,MAAM,KAAK,OAAO;CAClB,MAAM,KAAK,aAAa;CACxB,MAAM,KAAK,QAAQ;CACnB,MAAM,KAAK,QAAQ;CACnB,MAAM,KAAK,OAAO,QAAQ;CAC1B,MAAM,KAAK,WAAW;CACtB,MAAM,KAAK,OAAO,SAAS;CAC3B;CACD,CAAC;AAEJ,0CAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseUserDropdown.d.ts","sourceRoot":"","sources":["../../../../src/components/presentation/UserDropdown/BaseUserDropdown.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BaseUserDropdown.d.ts","sourceRoot":"","sources":["../../../../src/components/presentation/UserDropdown/BaseUserDropdown.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAAC,EAAE,EAAE,YAAY,EAAE,SAAS,EAAW,MAAM,OAAO,CAAC;AAY5D,UAAU,QAAQ;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,gBAAgB,CAAC,EAAE;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;QAC7C,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC9B,CAAC;IACF;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;OAEG;IACH,IAAI,EAAE,GAAG,CAAC;CACX;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CA2NtD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { css, cx } from "../../../styles/emotion.js";
|
|
1
2
|
import useTheme_default from "../../../contexts/Theme/useTheme.js";
|
|
2
3
|
import Button_default from "../../primitives/Button/Button.js";
|
|
3
4
|
import Typography_default from "../../primitives/Typography/Typography.js";
|
|
@@ -10,7 +11,6 @@ import BaseUserDropdown_styles_default from "./BaseUserDropdown.styles.js";
|
|
|
10
11
|
import { withVendorCSSClassPrefix } from "@thunderid/browser";
|
|
11
12
|
import { useState } from "react";
|
|
12
13
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
13
|
-
import { cx } from "@emotion/css";
|
|
14
14
|
import { FloatingFocusManager, FloatingPortal, autoUpdate, flip, offset, shift, useClick, useDismiss, useFloating, useInteractions, useRole } from "@floating-ui/react";
|
|
15
15
|
|
|
16
16
|
//#region src/components/presentation/UserDropdown/BaseUserDropdown.tsx
|
|
@@ -116,11 +116,10 @@ const BaseUserDropdown = ({ fallback = null, className = "", user, isLoading = f
|
|
|
116
116
|
initialFocus: -1,
|
|
117
117
|
children: /* @__PURE__ */ jsxs("div", {
|
|
118
118
|
ref: refs.setFloating,
|
|
119
|
-
className: cx(withVendorCSSClassPrefix("user-dropdown__content"), styles["dropdownContent"]
|
|
120
|
-
style: {
|
|
119
|
+
className: cx(withVendorCSSClassPrefix("user-dropdown__content"), styles["dropdownContent"], css({
|
|
121
120
|
...floatingStyles,
|
|
122
121
|
zIndex: 9999
|
|
123
|
-
},
|
|
122
|
+
})),
|
|
124
123
|
...getFloatingProps(),
|
|
125
124
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
126
125
|
className: cx(withVendorCSSClassPrefix("user-dropdown__header"), styles["dropdownHeader"]),
|
|
@@ -151,8 +150,7 @@ const BaseUserDropdown = ({ fallback = null, className = "", user, isLoading = f
|
|
|
151
150
|
if (item.label === "") return /* @__PURE__ */ jsx("div", { className: cx(withVendorCSSClassPrefix("user-dropdown__menu-divider"), styles["divider"]) });
|
|
152
151
|
if (item.href) return /* @__PURE__ */ jsxs("a", {
|
|
153
152
|
href: item.href,
|
|
154
|
-
|
|
155
|
-
className: cx(withVendorCSSClassPrefix("user-dropdown__menu-item"), styles["menuItemAnchor"]),
|
|
153
|
+
className: cx(withVendorCSSClassPrefix("user-dropdown__menu-item"), styles["menuItemAnchor"], hoveredItemIndex === index && styles["menuItemHighlighted"]),
|
|
156
154
|
onMouseEnter: () => setHoveredItemIndex(index),
|
|
157
155
|
onMouseLeave: () => setHoveredItemIndex(null),
|
|
158
156
|
onFocus: () => setHoveredItemIndex(index),
|
|
@@ -161,8 +159,7 @@ const BaseUserDropdown = ({ fallback = null, className = "", user, isLoading = f
|
|
|
161
159
|
});
|
|
162
160
|
return /* @__PURE__ */ jsx(Button_default, {
|
|
163
161
|
onClick: () => handleMenuItemClick(item),
|
|
164
|
-
|
|
165
|
-
className: cx(withVendorCSSClassPrefix("user-dropdown__menu-item"), styles["menuItem"]),
|
|
162
|
+
className: cx(withVendorCSSClassPrefix("user-dropdown__menu-item"), styles["menuItem"], hoveredItemIndex === index && styles["menuItemHighlighted"]),
|
|
166
163
|
color: "tertiary",
|
|
167
164
|
variant: "text",
|
|
168
165
|
size: "small",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseUserDropdown.js","names":["BaseUserDropdown: FC<BaseUserDropdownProps>","useTheme","styles: Record<string, string>","useStyles","mergedMappings: Record<string, string | string[]>","defaultMenuItems: MenuItem[]","User","LogOut","allMenuItems: MenuItem[]","Button","getMappedUserProfileValue","getDisplayName","Typography"],"sources":["../../../../src/components/presentation/UserDropdown/BaseUserDropdown.tsx"],"sourcesContent":["// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {cx} from '@emotion/css';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n useClick,\n useDismiss,\n useRole,\n useInteractions,\n FloatingFocusManager,\n FloatingPortal,\n} from '@floating-ui/react';\nimport {withVendorCSSClassPrefix} from '@thunderid/browser';\nimport {FC, ReactElement, ReactNode, useState} from 'react';\nimport useStyles from './BaseUserDropdown.styles';\nimport useTheme from '../../../contexts/Theme/useTheme';\nimport getDisplayName from '../../../utils/getDisplayName';\nimport getMappedUserProfileValue from '../../../utils/getMappedUserProfileValue';\nimport {Avatar} from '../../primitives/Avatar/Avatar';\nimport Button from '../../primitives/Button/Button';\nimport LogOut from '../../primitives/Icons/LogOut';\nimport User from '../../primitives/Icons/User';\nimport Typography from '../../primitives/Typography/Typography';\n\ninterface MenuItem {\n href?: string;\n icon?: ReactNode;\n label: ReactNode;\n onClick?: () => void;\n}\n\nexport interface BaseUserDropdownProps {\n /**\n * Mapping of component attribute names to identity provider field names.\n * Allows customizing which user profile fields should be used for each attribute.\n */\n attributeMapping?: {\n [key: string]: string | string[] | undefined;\n firstName?: string | string[];\n lastName?: string | string[];\n picture?: string | string[];\n username?: string | string[];\n };\n /**\n * Optional size for the avatar\n */\n avatarSize?: number;\n /**\n * Optional className for the dropdown container.\n */\n className?: string;\n /**\n * Optional element to render when no user is signed in.\n */\n fallback?: ReactElement | null;\n /**\n * Whether the user data is currently loading\n */\n isLoading?: boolean;\n /**\n * Menu items to display in the dropdown\n */\n menuItems?: MenuItem[];\n /**\n * Callback function for \"Manage Profile\" action\n */\n onManageProfile?: () => void;\n /**\n * Callback function for \"Sign Out\" action\n */\n onSignOut?: () => void;\n /**\n * The HTML element ID where the portal should be mounted\n */\n portalId?: string;\n /**\n * Show dropdown header with user information\n */\n showDropdownHeader?: boolean;\n /**\n * Show user's display name next to avatar in the trigger button\n */\n showTriggerLabel?: boolean;\n /**\n * The user object containing profile information\n */\n user: any;\n}\n\n/**\n * BaseUserDropdown component displays a user avatar with a dropdown menu.\n * When clicked, it shows a popover with customizable menu items.\n * This component serves as the base for framework-specific implementations.\n */\nexport const BaseUserDropdown: FC<BaseUserDropdownProps> = ({\n fallback = null,\n className = '',\n user,\n isLoading = false,\n portalId = 'thunderid-user-dropdown',\n menuItems = [],\n showTriggerLabel = false,\n avatarSize = 32,\n onManageProfile,\n onSignOut,\n attributeMapping = {},\n}: BaseUserDropdownProps): ReactElement | null => {\n const {theme, colorScheme} = useTheme();\n const styles: Record<string, string> = useStyles(theme, colorScheme);\n const [isOpen, setIsOpen] = useState(false);\n const [hoveredItemIndex, setHoveredItemIndex] = useState<number | null>(null);\n\n const {refs, floatingStyles, context} = useFloating({\n middleware: [offset(5), flip({fallbackAxisSideDirection: 'end'}), shift({padding: 5})],\n onOpenChange: setIsOpen,\n open: isOpen,\n placement: 'bottom-end',\n whileElementsMounted: autoUpdate,\n });\n\n const click: any = useClick(context);\n const dismiss: any = useDismiss(context);\n const role: any = useRole(context);\n\n const {getReferenceProps, getFloatingProps} = useInteractions([click, dismiss, role]);\n\n const defaultAttributeMappings: Record<string, string | string[]> = {\n email: ['emails'],\n firstName: ['name.givenName', 'given_name'],\n lastName: ['name.familyName', 'family_name'],\n picture: ['profile', 'profileUrl', 'picture', 'URL'],\n username: ['userName', 'username', 'user_name'],\n };\n\n const mergedMappings: Record<string, string | string[]> = Object.fromEntries(\n Object.entries({...defaultAttributeMappings, ...attributeMapping}).filter(\n (entry): entry is [string, string | string[]] => entry[1] !== undefined,\n ),\n );\n\n if (fallback && !user && !isLoading) {\n return fallback;\n }\n\n const handleMenuItemClick = (item: MenuItem): void => {\n if (item.onClick) {\n item.onClick();\n }\n setIsOpen(false);\n };\n\n const defaultMenuItems: MenuItem[] = [];\n\n if (onManageProfile) {\n defaultMenuItems.push({\n icon: <User width=\"16\" height=\"16\" />,\n label: 'Manage Profile',\n onClick: onManageProfile,\n });\n }\n\n if (onSignOut) {\n defaultMenuItems.push({\n icon: <LogOut width=\"16\" height=\"16\" />,\n label: 'Sign Out',\n onClick: onSignOut,\n });\n }\n\n const allMenuItems: MenuItem[] = [...menuItems];\n\n if (defaultMenuItems.length > 0) {\n if (menuItems.length > 0) {\n allMenuItems.push({label: '', onClick: undefined});\n }\n\n allMenuItems.push(...defaultMenuItems);\n }\n\n return (\n <div className={cx(withVendorCSSClassPrefix('user-dropdown'), className)}>\n <Button\n ref={refs.setReference}\n className={cx(withVendorCSSClassPrefix('user-dropdown__trigger'), styles['trigger'])}\n color=\"tertiary\"\n variant=\"text\"\n size=\"medium\"\n data-testid=\"thunderid-user-dropdown-trigger\"\n startIcon={\n <Avatar\n imageUrl={getMappedUserProfileValue('picture', mergedMappings, user)}\n name={getDisplayName(mergedMappings, user)}\n size={avatarSize}\n alt={`${getDisplayName(mergedMappings, user)}'s avatar`}\n />\n }\n {...getReferenceProps()}\n >\n {showTriggerLabel && (\n <Typography\n variant=\"body2\"\n className={cx(withVendorCSSClassPrefix('user-dropdown__trigger-label'), styles['userName'])}\n >\n {getDisplayName(mergedMappings, user)}\n </Typography>\n )}\n </Button>\n\n {isOpen && (\n <FloatingPortal id={portalId}>\n <FloatingFocusManager context={context} modal={false} initialFocus={-1}>\n <div\n ref={refs.setFloating}\n className={cx(withVendorCSSClassPrefix('user-dropdown__content'), styles['dropdownContent'])}\n style={{\n ...floatingStyles,\n // Floating UI doesn't set a z-index by default, so we set a high value to ensure the dropdown appears above other elements.\n // https://floating-ui.com/docs/misc#z-index-stacking\n zIndex: 9999,\n }}\n {...getFloatingProps()}\n >\n <div className={cx(withVendorCSSClassPrefix('user-dropdown__header'), styles['dropdownHeader'])}>\n <Avatar\n imageUrl={getMappedUserProfileValue('picture', mergedMappings, user)}\n name={getDisplayName(mergedMappings, user)}\n size={avatarSize * 1.25}\n alt={`${getDisplayName(mergedMappings, user)}'s avatar`}\n />\n <div className={cx(withVendorCSSClassPrefix('user-dropdown__header-info'), styles['headerInfo'])}>\n <Typography\n noWrap\n className={withVendorCSSClassPrefix('user-dropdown__header-name')}\n variant=\"body1\"\n fontWeight=\"medium\"\n >\n {getDisplayName(mergedMappings, user)}\n </Typography>\n <Typography\n noWrap\n className={withVendorCSSClassPrefix('user-dropdown__header-email')}\n variant=\"caption\"\n color=\"secondary\"\n >\n {getMappedUserProfileValue('username', mergedMappings, user) ||\n getMappedUserProfileValue('email', mergedMappings, user)}\n </Typography>\n </div>\n </div>\n <div className={cx(withVendorCSSClassPrefix('user-dropdown__menu'), styles['dropdownMenu'])}>\n {allMenuItems.map((item: any, index: number) => (\n <div key={index}>\n {((): ReactElement => {\n if (item.label === '') {\n return (\n <div\n className={cx(withVendorCSSClassPrefix('user-dropdown__menu-divider'), styles['divider'])}\n />\n );\n }\n if (item.href) {\n return (\n <a\n href={item.href}\n style={{\n backgroundColor:\n hoveredItemIndex === index ? theme.vars.colors.action?.hover : 'transparent',\n }}\n className={cx(\n withVendorCSSClassPrefix('user-dropdown__menu-item'),\n styles['menuItemAnchor'],\n )}\n onMouseEnter={(): void => setHoveredItemIndex(index)}\n onMouseLeave={(): void => setHoveredItemIndex(null)}\n onFocus={(): void => setHoveredItemIndex(index)}\n onBlur={(): void => setHoveredItemIndex(null)}\n >\n {item.icon}\n <span>{item.label}</span>\n </a>\n );\n }\n return (\n <Button\n onClick={(): void => handleMenuItemClick(item)}\n style={{\n backgroundColor:\n hoveredItemIndex === index ? theme.vars.colors.action?.hover : 'transparent',\n }}\n className={cx(withVendorCSSClassPrefix('user-dropdown__menu-item'), styles['menuItem'])}\n color=\"tertiary\"\n variant=\"text\"\n size=\"small\"\n startIcon={item.icon}\n onMouseEnter={(): void => setHoveredItemIndex(index)}\n onMouseLeave={(): void => setHoveredItemIndex(null)}\n >\n {item.label}\n </Button>\n );\n })()}\n </div>\n ))}\n </div>\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </div>\n );\n};\n\nexport default BaseUserDropdown;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BaseUserDropdown.js","names":["BaseUserDropdown: FC<BaseUserDropdownProps>","useTheme","styles: Record<string, string>","useStyles","mergedMappings: Record<string, string | string[]>","defaultMenuItems: MenuItem[]","User","LogOut","allMenuItems: MenuItem[]","Button","getMappedUserProfileValue","getDisplayName","Typography"],"sources":["../../../../src/components/presentation/UserDropdown/BaseUserDropdown.tsx"],"sourcesContent":["// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n useClick,\n useDismiss,\n useRole,\n useInteractions,\n FloatingFocusManager,\n FloatingPortal,\n} from '@floating-ui/react';\nimport {withVendorCSSClassPrefix} from '@thunderid/browser';\nimport {FC, ReactElement, ReactNode, useState} from 'react';\nimport useStyles from './BaseUserDropdown.styles';\nimport useTheme from '../../../contexts/Theme/useTheme';\nimport {css, cx} from '../../../styles/emotion';\nimport getDisplayName from '../../../utils/getDisplayName';\nimport getMappedUserProfileValue from '../../../utils/getMappedUserProfileValue';\nimport {Avatar} from '../../primitives/Avatar/Avatar';\nimport Button from '../../primitives/Button/Button';\nimport LogOut from '../../primitives/Icons/LogOut';\nimport User from '../../primitives/Icons/User';\nimport Typography from '../../primitives/Typography/Typography';\n\ninterface MenuItem {\n href?: string;\n icon?: ReactNode;\n label: ReactNode;\n onClick?: () => void;\n}\n\nexport interface BaseUserDropdownProps {\n /**\n * Mapping of component attribute names to identity provider field names.\n * Allows customizing which user profile fields should be used for each attribute.\n */\n attributeMapping?: {\n [key: string]: string | string[] | undefined;\n firstName?: string | string[];\n lastName?: string | string[];\n picture?: string | string[];\n username?: string | string[];\n };\n /**\n * Optional size for the avatar\n */\n avatarSize?: number;\n /**\n * Optional className for the dropdown container.\n */\n className?: string;\n /**\n * Optional element to render when no user is signed in.\n */\n fallback?: ReactElement | null;\n /**\n * Whether the user data is currently loading\n */\n isLoading?: boolean;\n /**\n * Menu items to display in the dropdown\n */\n menuItems?: MenuItem[];\n /**\n * Callback function for \"Manage Profile\" action\n */\n onManageProfile?: () => void;\n /**\n * Callback function for \"Sign Out\" action\n */\n onSignOut?: () => void;\n /**\n * The HTML element ID where the portal should be mounted\n */\n portalId?: string;\n /**\n * Show dropdown header with user information\n */\n showDropdownHeader?: boolean;\n /**\n * Show user's display name next to avatar in the trigger button\n */\n showTriggerLabel?: boolean;\n /**\n * The user object containing profile information\n */\n user: any;\n}\n\n/**\n * BaseUserDropdown component displays a user avatar with a dropdown menu.\n * When clicked, it shows a popover with customizable menu items.\n * This component serves as the base for framework-specific implementations.\n */\nexport const BaseUserDropdown: FC<BaseUserDropdownProps> = ({\n fallback = null,\n className = '',\n user,\n isLoading = false,\n portalId = 'thunderid-user-dropdown',\n menuItems = [],\n showTriggerLabel = false,\n avatarSize = 32,\n onManageProfile,\n onSignOut,\n attributeMapping = {},\n}: BaseUserDropdownProps): ReactElement | null => {\n const {theme, colorScheme} = useTheme();\n const styles: Record<string, string> = useStyles(theme, colorScheme);\n const [isOpen, setIsOpen] = useState(false);\n const [hoveredItemIndex, setHoveredItemIndex] = useState<number | null>(null);\n\n const {refs, floatingStyles, context} = useFloating({\n middleware: [offset(5), flip({fallbackAxisSideDirection: 'end'}), shift({padding: 5})],\n onOpenChange: setIsOpen,\n open: isOpen,\n placement: 'bottom-end',\n whileElementsMounted: autoUpdate,\n });\n\n const click: any = useClick(context);\n const dismiss: any = useDismiss(context);\n const role: any = useRole(context);\n\n const {getReferenceProps, getFloatingProps} = useInteractions([click, dismiss, role]);\n\n const defaultAttributeMappings: Record<string, string | string[]> = {\n email: ['emails'],\n firstName: ['name.givenName', 'given_name'],\n lastName: ['name.familyName', 'family_name'],\n picture: ['profile', 'profileUrl', 'picture', 'URL'],\n username: ['userName', 'username', 'user_name'],\n };\n\n const mergedMappings: Record<string, string | string[]> = Object.fromEntries(\n Object.entries({...defaultAttributeMappings, ...attributeMapping}).filter(\n (entry): entry is [string, string | string[]] => entry[1] !== undefined,\n ),\n );\n\n if (fallback && !user && !isLoading) {\n return fallback;\n }\n\n const handleMenuItemClick = (item: MenuItem): void => {\n if (item.onClick) {\n item.onClick();\n }\n setIsOpen(false);\n };\n\n const defaultMenuItems: MenuItem[] = [];\n\n if (onManageProfile) {\n defaultMenuItems.push({\n icon: <User width=\"16\" height=\"16\" />,\n label: 'Manage Profile',\n onClick: onManageProfile,\n });\n }\n\n if (onSignOut) {\n defaultMenuItems.push({\n icon: <LogOut width=\"16\" height=\"16\" />,\n label: 'Sign Out',\n onClick: onSignOut,\n });\n }\n\n const allMenuItems: MenuItem[] = [...menuItems];\n\n if (defaultMenuItems.length > 0) {\n if (menuItems.length > 0) {\n allMenuItems.push({label: '', onClick: undefined});\n }\n\n allMenuItems.push(...defaultMenuItems);\n }\n\n return (\n <div className={cx(withVendorCSSClassPrefix('user-dropdown'), className)}>\n <Button\n ref={refs.setReference}\n className={cx(withVendorCSSClassPrefix('user-dropdown__trigger'), styles['trigger'])}\n color=\"tertiary\"\n variant=\"text\"\n size=\"medium\"\n data-testid=\"thunderid-user-dropdown-trigger\"\n startIcon={\n <Avatar\n imageUrl={getMappedUserProfileValue('picture', mergedMappings, user)}\n name={getDisplayName(mergedMappings, user)}\n size={avatarSize}\n alt={`${getDisplayName(mergedMappings, user)}'s avatar`}\n />\n }\n {...getReferenceProps()}\n >\n {showTriggerLabel && (\n <Typography\n variant=\"body2\"\n className={cx(withVendorCSSClassPrefix('user-dropdown__trigger-label'), styles['userName'])}\n >\n {getDisplayName(mergedMappings, user)}\n </Typography>\n )}\n </Button>\n\n {isOpen && (\n <FloatingPortal id={portalId}>\n <FloatingFocusManager context={context} modal={false} initialFocus={-1}>\n <div\n ref={refs.setFloating}\n className={cx(\n withVendorCSSClassPrefix('user-dropdown__content'),\n styles['dropdownContent'],\n // Floating UI recomputes the position on every render, so this class is generated\n // fresh each time rather than memoized - Emotion still injects it into the shared,\n // nonce-tagged `<style>` element, so no inline `style` attribute is needed.\n css({\n ...floatingStyles,\n // Floating UI doesn't set a z-index by default, so we set a high value to ensure the dropdown appears above other elements.\n // https://floating-ui.com/docs/misc#z-index-stacking\n zIndex: 9999,\n }),\n )}\n {...getFloatingProps()}\n >\n <div className={cx(withVendorCSSClassPrefix('user-dropdown__header'), styles['dropdownHeader'])}>\n <Avatar\n imageUrl={getMappedUserProfileValue('picture', mergedMappings, user)}\n name={getDisplayName(mergedMappings, user)}\n size={avatarSize * 1.25}\n alt={`${getDisplayName(mergedMappings, user)}'s avatar`}\n />\n <div className={cx(withVendorCSSClassPrefix('user-dropdown__header-info'), styles['headerInfo'])}>\n <Typography\n noWrap\n className={withVendorCSSClassPrefix('user-dropdown__header-name')}\n variant=\"body1\"\n fontWeight=\"medium\"\n >\n {getDisplayName(mergedMappings, user)}\n </Typography>\n <Typography\n noWrap\n className={withVendorCSSClassPrefix('user-dropdown__header-email')}\n variant=\"caption\"\n color=\"secondary\"\n >\n {getMappedUserProfileValue('username', mergedMappings, user) ||\n getMappedUserProfileValue('email', mergedMappings, user)}\n </Typography>\n </div>\n </div>\n <div className={cx(withVendorCSSClassPrefix('user-dropdown__menu'), styles['dropdownMenu'])}>\n {allMenuItems.map((item: any, index: number) => (\n <div key={index}>\n {((): ReactElement => {\n if (item.label === '') {\n return (\n <div\n className={cx(withVendorCSSClassPrefix('user-dropdown__menu-divider'), styles['divider'])}\n />\n );\n }\n if (item.href) {\n return (\n <a\n href={item.href}\n className={cx(\n withVendorCSSClassPrefix('user-dropdown__menu-item'),\n styles['menuItemAnchor'],\n hoveredItemIndex === index && styles['menuItemHighlighted'],\n )}\n onMouseEnter={(): void => setHoveredItemIndex(index)}\n onMouseLeave={(): void => setHoveredItemIndex(null)}\n onFocus={(): void => setHoveredItemIndex(index)}\n onBlur={(): void => setHoveredItemIndex(null)}\n >\n {item.icon}\n <span>{item.label}</span>\n </a>\n );\n }\n return (\n <Button\n onClick={(): void => handleMenuItemClick(item)}\n className={cx(\n withVendorCSSClassPrefix('user-dropdown__menu-item'),\n styles['menuItem'],\n hoveredItemIndex === index && styles['menuItemHighlighted'],\n )}\n color=\"tertiary\"\n variant=\"text\"\n size=\"small\"\n startIcon={item.icon}\n onMouseEnter={(): void => setHoveredItemIndex(index)}\n onMouseLeave={(): void => setHoveredItemIndex(null)}\n >\n {item.label}\n </Button>\n );\n })()}\n </div>\n ))}\n </div>\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </div>\n );\n};\n\nexport default BaseUserDropdown;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseUserDropdown.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/presentation/UserDropdown/BaseUserDropdown.styles.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BaseUserDropdown.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/presentation/UserDropdown/BaseUserDropdown.styles.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AAIzC;;;;;GAKG;AACH,QAAA,MAAM,SAAS,GAAI,OAAO,KAAK,EAAE,aAAa,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CA4MxE,CAAC;AAEL,eAAe,SAAS,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { css } from "../../../styles/emotion.js";
|
|
1
2
|
import { useMemo } from "react";
|
|
2
|
-
import { css } from "@emotion/css";
|
|
3
3
|
|
|
4
4
|
//#region src/components/presentation/UserDropdown/BaseUserDropdown.styles.ts
|
|
5
5
|
/**
|
|
@@ -65,6 +65,9 @@ const useStyles = (theme, colorScheme) => useMemo(() => {
|
|
|
65
65
|
display: flex;
|
|
66
66
|
flex-direction: column;
|
|
67
67
|
width: 100%;
|
|
68
|
+
`;
|
|
69
|
+
const menuItemHighlighted = css`
|
|
70
|
+
background-color: ${theme.vars.colors.action?.hover || "rgba(0, 0, 0, 0.05)"};
|
|
68
71
|
`;
|
|
69
72
|
const menuItem = css`
|
|
70
73
|
display: flex;
|
|
@@ -175,6 +178,7 @@ const useStyles = (theme, colorScheme) => useMemo(() => {
|
|
|
175
178
|
`,
|
|
176
179
|
menuItem,
|
|
177
180
|
menuItemAnchor,
|
|
181
|
+
menuItemHighlighted,
|
|
178
182
|
trigger,
|
|
179
183
|
userName
|
|
180
184
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseUserDropdown.styles.js","names":["trigger: string","userName: string","dropdownContent: string","dropdownMenu: string","menuItem: string","menuItemAnchor: string","divider: string","dropdownHeader: string","headerInfo: string","headerName: string"],"sources":["../../../../src/components/presentation/UserDropdown/BaseUserDropdown.styles.ts"],"sourcesContent":["// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {
|
|
1
|
+
{"version":3,"file":"BaseUserDropdown.styles.js","names":["trigger: string","userName: string","dropdownContent: string","dropdownMenu: string","menuItemHighlighted: string","menuItem: string","menuItemAnchor: string","divider: string","dropdownHeader: string","headerInfo: string","headerName: string"],"sources":["../../../../src/components/presentation/UserDropdown/BaseUserDropdown.styles.ts"],"sourcesContent":["// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {Theme} from '@thunderid/browser';\nimport {useMemo} from 'react';\nimport {css} from '../../../styles/emotion';\n\n/**\n * Creates styles for the BaseUserDropdown component\n * @param theme - The theme object containing design tokens\n * @param colorScheme - The current color scheme (used for memoization)\n * @returns Object containing CSS class names for component styling\n */\nconst useStyles = (theme: Theme, colorScheme: string): Record<string, string> =>\n useMemo(() => {\n const trigger: string = css`\n display: inline-flex;\n align-items: center;\n gap: calc(${theme.vars.spacing.unit} * 0.75);\n padding: calc(${theme.vars.spacing.unit} * 0.5);\n background: none;\n border: none;\n cursor: pointer;\n border-radius: ${theme.vars.borderRadius.medium};\n transition: none;\n box-shadow: none;\n background-color: transparent;\n\n &:hover {\n background-color: ${theme.vars.colors.action?.hover || 'rgba(0, 0, 0, 0.05)'};\n }\n\n &:focus {\n outline: 2px solid ${theme.vars.colors.primary};\n outline-offset: 2px;\n }\n\n &:hover,\n &:focus,\n &:active,\n &:focus-visible {\n transition: none;\n box-shadow: none;\n }\n `;\n\n const userName: string = css`\n color: ${theme.vars.colors.text.primary};\n font-size: 0.875rem;\n font-weight: 500;\n max-width: 150px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `;\n\n const dropdownContent: string = css`\n background: ${theme.vars.colors.background.surface};\n border-radius: ${theme.vars.borderRadius.large};\n box-shadow:\n 0 4px 6px -1px rgba(0, 0, 0, 0.1),\n 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n border: 1px solid ${theme.vars.colors.border};\n font-family: ${theme.vars.typography.fontFamily};\n min-width: 250px;\n max-width: 600px;\n z-index: 1000;\n overflow: hidden;\n `;\n\n const dropdownMenu: string = css`\n display: flex;\n flex-direction: column;\n width: 100%;\n `;\n\n const menuItemHighlighted: string = css`\n background-color: ${theme.vars.colors.action?.hover || 'rgba(0, 0, 0, 0.05)'};\n `;\n\n const menuItem: string = css`\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: ${theme.vars.spacing.unit};\n padding: calc(${theme.vars.spacing.unit} * 1.5) calc(${theme.vars.spacing.unit} * 2);\n width: 100%;\n color: ${theme.vars.colors.text.primary};\n text-decoration: none;\n border: none;\n cursor: pointer;\n font-size: 0.875rem;\n text-align: start;\n border-radius: ${theme.vars.borderRadius.medium};\n transition: none;\n box-shadow: none;\n background: transparent;\n\n &:hover {\n background-color: ${theme.vars.colors.action?.hover || 'rgba(0, 0, 0, 0.05)'};\n }\n\n &:hover,\n &:focus,\n &:active,\n &:focus-visible {\n transition: none;\n box-shadow: none;\n }\n `;\n\n const menuItemAnchor: string = css`\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: ${theme.vars.spacing.unit};\n padding: calc(${theme.vars.spacing.unit} * 1.5) calc(${theme.vars.spacing.unit} * 2);\n width: 100%;\n color: ${theme.vars.colors.text.primary};\n text-decoration: none;\n border: none;\n background: none;\n cursor: pointer;\n font-size: 0.875rem;\n text-align: start;\n border-radius: ${theme.vars.borderRadius.medium};\n transition: background-color 0.15s ease-in-out;\n\n &:hover {\n background-color: ${theme.vars.colors.action?.hover || 'rgba(0, 0, 0, 0.05)'};\n }\n `;\n\n const divider: string = css`\n margin: calc(${theme.vars.spacing.unit} * 0.5) 0;\n border-bottom: 1px solid ${theme.vars.colors.border};\n `;\n\n const dropdownHeader: string = css`\n display: flex;\n align-items: center;\n gap: ${theme.vars.spacing.unit};\n padding: calc(${theme.vars.spacing.unit} * 1.5);\n border-bottom: 1px solid ${theme.vars.colors.border};\n `;\n\n const headerInfo: string = css`\n display: flex;\n flex-direction: column;\n gap: calc(${theme.vars.spacing.unit} / 4);\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `;\n\n const headerName: string = css`\n color: ${theme.vars.colors.text.primary};\n font-size: 1rem;\n font-weight: 500;\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `;\n\n const headerEmail: string = css`\n color: ${theme.vars.colors.text.secondary};\n font-size: 0.875rem;\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `;\n\n const loadingContainer: string = css`\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 80px;\n gap: ${theme.vars.spacing.unit};\n `;\n\n const loadingText: string = css`\n color: ${theme.vars.colors.text.secondary};\n font-size: 0.875rem;\n `;\n\n return {\n divider,\n dropdownContent,\n dropdownHeader,\n dropdownMenu,\n headerEmail,\n headerInfo,\n headerName,\n loadingContainer,\n loadingText,\n menuItem,\n menuItemAnchor,\n menuItemHighlighted,\n trigger,\n userName,\n };\n }, [\n theme.vars.colors.background.surface,\n theme.vars.colors.text.primary,\n theme.vars.colors.text.secondary,\n theme.vars.colors.border,\n theme.vars.colors.primary,\n theme.vars.colors.action?.hover,\n theme.vars.borderRadius.medium,\n theme.vars.borderRadius.large,\n theme.vars.spacing.unit,\n theme.vars.typography.fontFamily,\n colorScheme,\n ]);\n\nexport default useStyles;\n"],"mappings":";;;;;;;;;;AAaA,MAAM,aAAa,OAAc,gBAC/B,cAAc;CACZ,MAAMA,UAAkB,GAAG;;;kBAGb,MAAM,KAAK,QAAQ,KAAK;sBACpB,MAAM,KAAK,QAAQ,KAAK;;;;uBAIvB,MAAM,KAAK,aAAa,OAAO;;;;;;4BAM1B,MAAM,KAAK,OAAO,QAAQ,SAAS,sBAAsB;;;;6BAIxD,MAAM,KAAK,OAAO,QAAQ;;;;;;;;;;;;CAanD,MAAMC,WAAmB,GAAG;eACjB,MAAM,KAAK,OAAO,KAAK,QAAQ;;;;;;;;CAS1C,MAAMC,kBAA0B,GAAG;oBACnB,MAAM,KAAK,OAAO,WAAW,QAAQ;uBAClC,MAAM,KAAK,aAAa,MAAM;;;;0BAI3B,MAAM,KAAK,OAAO,OAAO;qBAC9B,MAAM,KAAK,WAAW,WAAW;;;;;;CAOlD,MAAMC,eAAuB,GAAG;;;;;CAMhC,MAAMC,sBAA8B,GAAG;0BACjB,MAAM,KAAK,OAAO,QAAQ,SAAS,sBAAsB;;CAG/E,MAAMC,WAAmB,GAAG;;;;aAInB,MAAM,KAAK,QAAQ,KAAK;sBACf,MAAM,KAAK,QAAQ,KAAK,eAAe,MAAM,KAAK,QAAQ,KAAK;;eAEtE,MAAM,KAAK,OAAO,KAAK,QAAQ;;;;;;uBAMvB,MAAM,KAAK,aAAa,OAAO;;;;;;4BAM1B,MAAM,KAAK,OAAO,QAAQ,SAAS,sBAAsB;;;;;;;;;;;CAYjF,MAAMC,iBAAyB,GAAG;;;;aAIzB,MAAM,KAAK,QAAQ,KAAK;sBACf,MAAM,KAAK,QAAQ,KAAK,eAAe,MAAM,KAAK,QAAQ,KAAK;;eAEtE,MAAM,KAAK,OAAO,KAAK,QAAQ;;;;;;;uBAOvB,MAAM,KAAK,aAAa,OAAO;;;;4BAI1B,MAAM,KAAK,OAAO,QAAQ,SAAS,sBAAsB;;;CAIjF,MAAMC,UAAkB,GAAG;qBACV,MAAM,KAAK,QAAQ,KAAK;iCACZ,MAAM,KAAK,OAAO,OAAO;;CAGtD,MAAMC,iBAAyB,GAAG;;;aAGzB,MAAM,KAAK,QAAQ,KAAK;sBACf,MAAM,KAAK,QAAQ,KAAK;iCACb,MAAM,KAAK,OAAO,OAAO;;CAGtD,MAAMC,aAAqB,GAAG;;;kBAGhB,MAAM,KAAK,QAAQ,KAAK;;;;;;;CAQtC,MAAMC,aAAqB,GAAG;eACnB,MAAM,KAAK,OAAO,KAAK,QAAQ;;;;;;;;AA+B1C,QAAO;EACL;EACA;EACA;EACA;EACA,aA3B0B,GAAG;eACpB,MAAM,KAAK,OAAO,KAAK,UAAU;;;;;;;EA2B1C;EACA;EACA,kBArB+B,GAAG;;;;;aAK3B,MAAM,KAAK,QAAQ,KAAK;;EAiB/B,aAd0B,GAAG;eACpB,MAAM,KAAK,OAAO,KAAK,UAAU;;;EAc1C;EACA;EACA;EACA;EACA;EACD;GACA;CACD,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,KAAK,OAAO,KAAK;CACvB,MAAM,KAAK,OAAO,KAAK;CACvB,MAAM,KAAK,OAAO;CAClB,MAAM,KAAK,OAAO;CAClB,MAAM,KAAK,OAAO,QAAQ;CAC1B,MAAM,KAAK,aAAa;CACxB,MAAM,KAAK,aAAa;CACxB,MAAM,KAAK,QAAQ;CACnB,MAAM,KAAK,WAAW;CACtB;CACD,CAAC;AAEJ,sCAAe"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { User, Preferences } from '@thunderid/browser';
|
|
1
|
+
import { User, Preferences, AttributeSchema } from '@thunderid/browser';
|
|
2
2
|
import { FC, ReactElement } from 'react';
|
|
3
3
|
export interface BaseUserProfileProps {
|
|
4
4
|
attributeMapping?: {
|
|
@@ -30,6 +30,7 @@ export interface BaseUserProfileProps {
|
|
|
30
30
|
profile?: User;
|
|
31
31
|
showFields?: string[];
|
|
32
32
|
title?: string;
|
|
33
|
+
userSchema?: Record<string, AttributeSchema> | null;
|
|
33
34
|
}
|
|
34
35
|
declare const BaseUserProfile: FC<BaseUserProfileProps>;
|
|
35
36
|
export default BaseUserProfile;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseUserProfile.d.ts","sourceRoot":"","sources":["../../../../src/components/presentation/UserProfile/BaseUserProfile.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BaseUserProfile.d.ts","sourceRoot":"","sources":["../../../../src/components/presentation/UserProfile/BaseUserProfile.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAC,IAAI,EAAiC,WAAW,EAAa,eAAe,EAAC,MAAM,oBAAoB,CAAC;AAChH,OAAO,EAAC,EAAE,EAAE,YAAY,EAAmC,MAAM,OAAO,CAAC;AAyCzE,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,CAAC,EAAE;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;QAC7C,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC9B,CAAC;IACF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/B,gBAAgB,CAAC,EAAE,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,CAAC;CACrD;AA+BD,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAopB7C,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { cx } from "../../../styles/emotion.js";
|
|
1
2
|
import useTheme_default from "../../../contexts/Theme/useTheme.js";
|
|
2
3
|
import useTranslation_default from "../../../hooks/useTranslation.js";
|
|
3
4
|
import Button_default from "../../primitives/Button/Button.js";
|
|
@@ -17,7 +18,6 @@ import MultiInput_default from "../../primitives/MultiInput/MultiInput.js";
|
|
|
17
18
|
import { bem, startCase, withVendorCSSClassPrefix } from "@thunderid/browser";
|
|
18
19
|
import { useCallback, useEffect, useState } from "react";
|
|
19
20
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
20
|
-
import { cx } from "@emotion/css";
|
|
21
21
|
|
|
22
22
|
//#region src/components/presentation/UserProfile/BaseUserProfile.tsx
|
|
23
23
|
const fieldsToSkip = [
|
|
@@ -49,12 +49,14 @@ const readonlyFields = [
|
|
|
49
49
|
"id",
|
|
50
50
|
"isReadOnly",
|
|
51
51
|
"ouId",
|
|
52
|
-
"username"
|
|
52
|
+
"username",
|
|
53
|
+
"sub"
|
|
53
54
|
];
|
|
54
|
-
const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, profile, flattenedProfile, mode = "inline", title, attributeMapping = {}, editable = true, onOpenChange, onUpdate, open = false, error = null, isLoading = false, preferences, showFields = [], hideFields = [], displayNameAttributes = [] }) => {
|
|
55
|
+
const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, profile, flattenedProfile, userSchema, mode = "inline", title, attributeMapping = {}, editable = true, onOpenChange, onUpdate, open = false, error = null, isLoading = false, preferences, showFields = [], hideFields = [], displayNameAttributes = [] }) => {
|
|
55
56
|
const { theme, colorScheme } = useTheme_default();
|
|
56
57
|
const [editedUser, setEditedUser] = useState(flattenedProfile || profile);
|
|
57
58
|
const [editingFields, setEditingFields] = useState({});
|
|
59
|
+
const [fieldErrors, setFieldErrors] = useState({});
|
|
58
60
|
const { t } = useTranslation_default(preferences?.i18n);
|
|
59
61
|
useEffect(() => {
|
|
60
62
|
const nextUser = flattenedProfile ?? profile;
|
|
@@ -73,15 +75,11 @@ const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, p
|
|
|
73
75
|
editingFields
|
|
74
76
|
]);
|
|
75
77
|
/**
|
|
76
|
-
* Determines if a field should be visible based on showFields, hideFields, and fieldsToSkip arrays.
|
|
77
|
-
*
|
|
78
|
-
* 1. fieldsToSkip (always hidden) - highest priority
|
|
79
|
-
* 2. hideFields (explicitly hidden)
|
|
80
|
-
* 3. showFields (explicitly shown, if array is not empty)
|
|
81
|
-
* 4. Default behavior (show all fields not in fieldsToSkip)
|
|
78
|
+
* Determines if a field should be visible based on showFields, hideFields, and fallback fieldsToSkip arrays.
|
|
79
|
+
* When isSchemaBased is true, fieldsToSkip is bypassed so schema-defined fields render dynamically.
|
|
82
80
|
*/
|
|
83
|
-
const shouldShowField = useCallback((fieldName) => {
|
|
84
|
-
if (fieldsToSkip.includes(fieldName)) return false;
|
|
81
|
+
const shouldShowField = useCallback((fieldName, isSchemaBased = false) => {
|
|
82
|
+
if (!isSchemaBased && fieldsToSkip.includes(fieldName)) return false;
|
|
85
83
|
if (hideFields.length > 0 && hideFields.includes(fieldName)) return false;
|
|
86
84
|
if (showFields.length > 0) return showFields.includes(fieldName);
|
|
87
85
|
return true;
|
|
@@ -107,12 +105,11 @@ const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, p
|
|
|
107
105
|
const { type, displayName, description, name } = schema;
|
|
108
106
|
const fieldLabel = displayName || description || name || "value";
|
|
109
107
|
switch (type) {
|
|
110
|
-
case "DATE_TIME":
|
|
111
|
-
case "
|
|
112
|
-
|
|
113
|
-
default: return `Enter your ${fieldLabel.toLowerCase()}`;
|
|
108
|
+
case "DATE_TIME":
|
|
109
|
+
case "STRING":
|
|
110
|
+
default: return t("elements.fields.generic.placeholder", { field: fieldLabel.toLowerCase() });
|
|
114
111
|
}
|
|
115
|
-
}, []);
|
|
112
|
+
}, [t]);
|
|
116
113
|
const formatLabel = useCallback((key) => key.split(/(?=[A-Z])|_/).map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" "), []);
|
|
117
114
|
const styles = BaseUserProfile_styles_default(theme, colorScheme);
|
|
118
115
|
const ObjectDisplay = ({ data }) => {
|
|
@@ -143,11 +140,36 @@ const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, p
|
|
|
143
140
|
const handleFieldSave = useCallback((schema) => {
|
|
144
141
|
if (!onUpdate || !schema.name) return;
|
|
145
142
|
const fieldName = schema.name;
|
|
143
|
+
const currentUser$1 = flattenedProfile || profile;
|
|
146
144
|
let fieldValue;
|
|
147
145
|
if (editedUser && fieldName && editedUser[fieldName] !== void 0) fieldValue = editedUser[fieldName];
|
|
146
|
+
else if (currentUser$1?.attributes?.[fieldName] !== void 0) fieldValue = currentUser$1.attributes[fieldName];
|
|
148
147
|
else if (flattenedProfile?.[fieldName] !== void 0) fieldValue = flattenedProfile[fieldName];
|
|
149
148
|
else fieldValue = "";
|
|
150
149
|
if (Array.isArray(fieldValue)) fieldValue = fieldValue.filter((v) => v !== void 0 && v !== null && v !== "");
|
|
150
|
+
const strVal = String(fieldValue ?? "").trim();
|
|
151
|
+
schema.displayName || schema.name && startCase(schema.name);
|
|
152
|
+
if (schema.required && !strVal) {
|
|
153
|
+
setFieldErrors((prev) => ({
|
|
154
|
+
...prev,
|
|
155
|
+
[fieldName]: t("validations.required.field.error")
|
|
156
|
+
}));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (schema.regex && strVal) try {
|
|
160
|
+
if (!new RegExp(schema.regex).test(strVal)) {
|
|
161
|
+
setFieldErrors((prev) => ({
|
|
162
|
+
...prev,
|
|
163
|
+
[fieldName]: t("validation.pattern.invalid")
|
|
164
|
+
}));
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
} catch (e) {}
|
|
168
|
+
setFieldErrors((prev) => {
|
|
169
|
+
const next = { ...prev };
|
|
170
|
+
delete next[fieldName];
|
|
171
|
+
return next;
|
|
172
|
+
});
|
|
151
173
|
let payload = {};
|
|
152
174
|
set(payload, fieldName, fieldValue);
|
|
153
175
|
onUpdate(payload);
|
|
@@ -155,15 +177,23 @@ const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, p
|
|
|
155
177
|
}, [
|
|
156
178
|
editedUser,
|
|
157
179
|
flattenedProfile,
|
|
180
|
+
profile,
|
|
158
181
|
onUpdate,
|
|
159
|
-
toggleFieldEdit
|
|
182
|
+
toggleFieldEdit,
|
|
183
|
+
t
|
|
160
184
|
]);
|
|
161
185
|
const handleFieldCancel = useCallback((fieldName) => {
|
|
162
186
|
const currentUser$1 = flattenedProfile || profile;
|
|
187
|
+
const initialVal = currentUser$1?.attributes?.[fieldName] ?? currentUser$1?.[fieldName];
|
|
163
188
|
setEditedUser((prev) => ({
|
|
164
189
|
...prev,
|
|
165
|
-
[fieldName]:
|
|
190
|
+
[fieldName]: initialVal
|
|
166
191
|
}));
|
|
192
|
+
setFieldErrors((prev) => {
|
|
193
|
+
const next = { ...prev };
|
|
194
|
+
delete next[fieldName];
|
|
195
|
+
return next;
|
|
196
|
+
});
|
|
167
197
|
toggleFieldEdit(fieldName);
|
|
168
198
|
}, [
|
|
169
199
|
flattenedProfile,
|
|
@@ -337,13 +367,21 @@ const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, p
|
|
|
337
367
|
if (!(hasValue || isFieldEditing || editable && schema.mutability === "READ_WRITE")) return null;
|
|
338
368
|
return /* @__PURE__ */ jsxs("div", {
|
|
339
369
|
className: styles.field,
|
|
340
|
-
children: [/* @__PURE__ */
|
|
370
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
341
371
|
className: styles.fieldInner,
|
|
342
|
-
children: renderSchemaField(schema, isFieldEditing, (value) => {
|
|
372
|
+
children: [renderSchemaField(schema, isFieldEditing, (value) => {
|
|
343
373
|
const tempEditedUser = { ...editedUser };
|
|
344
374
|
tempEditedUser[schema.name] = value;
|
|
345
375
|
setEditedUser(tempEditedUser);
|
|
346
|
-
}, () => toggleFieldEdit(schema.name))
|
|
376
|
+
}, () => toggleFieldEdit(schema.name)), fieldErrors[schema.name] && /* @__PURE__ */ jsx("div", {
|
|
377
|
+
style: {
|
|
378
|
+
color: "#d32f2f",
|
|
379
|
+
fontSize: "0.8rem",
|
|
380
|
+
marginTop: "4px",
|
|
381
|
+
fontWeight: 500
|
|
382
|
+
},
|
|
383
|
+
children: fieldErrors[schema.name]
|
|
384
|
+
})]
|
|
347
385
|
}), editable && schema.mutability !== "READ_ONLY" && !isReadonlyField && /* @__PURE__ */ jsxs("div", {
|
|
348
386
|
className: styles.fieldActions,
|
|
349
387
|
children: [isFieldEditing && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Button_default, {
|
|
@@ -373,13 +411,38 @@ const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, p
|
|
|
373
411
|
if (!profile && !flattenedProfile) return fallback;
|
|
374
412
|
const containerClasses = cx(styles.root, cardLayout ? styles.card : "", withVendorCSSClassPrefix("user-profile"), className);
|
|
375
413
|
const currentUser = flattenedProfile || profile;
|
|
376
|
-
const
|
|
414
|
+
const renderProfileContent = () => {
|
|
377
415
|
if (!currentUser) return null;
|
|
378
416
|
const displayName = getDisplayName_default(mergedMappings, profile, displayNameAttributes);
|
|
379
|
-
|
|
417
|
+
let schemaItems = [];
|
|
418
|
+
if (userSchema && typeof userSchema === "object" && Object.keys(userSchema).length > 0) schemaItems = Object.entries(userSchema).filter(([key, metaAttr]) => {
|
|
419
|
+
if (metaAttr?.credential) return false;
|
|
420
|
+
return shouldShowField(key, true);
|
|
421
|
+
}).map(([key, metaAttr]) => {
|
|
422
|
+
const val = editedUser?.[key] ?? currentUser?.attributes?.[key] ?? currentUser?.[key] ?? "";
|
|
423
|
+
const isReadonly = metaAttr.readOnly === true || metaAttr.mutability === "READ_ONLY" || readonlyFields.includes(key);
|
|
424
|
+
return {
|
|
425
|
+
name: key,
|
|
426
|
+
displayName: metaAttr.displayName ?? (key ? startCase(key) : ""),
|
|
427
|
+
type: (metaAttr.type ?? "STRING").toUpperCase(),
|
|
428
|
+
regex: metaAttr.regex,
|
|
429
|
+
required: !!metaAttr.required,
|
|
430
|
+
mutability: isReadonly ? "READ_ONLY" : "READ_WRITE",
|
|
431
|
+
value: val
|
|
432
|
+
};
|
|
433
|
+
});
|
|
434
|
+
else schemaItems = Object.entries(currentUser).filter(([key, value]) => {
|
|
380
435
|
if (!shouldShowField(key)) return false;
|
|
381
436
|
return value !== void 0 && value !== "" && value !== null;
|
|
382
|
-
}).sort(([a], [b]) => a.localeCompare(b))
|
|
437
|
+
}).sort(([a], [b]) => a.localeCompare(b)).map(([key, value]) => {
|
|
438
|
+
const isReadonly = readonlyFields.includes(key);
|
|
439
|
+
return {
|
|
440
|
+
name: key,
|
|
441
|
+
displayName: startCase(key),
|
|
442
|
+
mutability: isReadonly ? "READ_ONLY" : "READ_WRITE",
|
|
443
|
+
value
|
|
444
|
+
};
|
|
445
|
+
});
|
|
383
446
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
384
447
|
/* @__PURE__ */ jsxs("div", {
|
|
385
448
|
className: styles.profileSummary,
|
|
@@ -404,17 +467,10 @@ const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, p
|
|
|
404
467
|
]
|
|
405
468
|
}),
|
|
406
469
|
/* @__PURE__ */ jsx(Divider_default, {}),
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
value
|
|
412
|
-
};
|
|
413
|
-
return /* @__PURE__ */ jsx("div", {
|
|
414
|
-
className: styles.info,
|
|
415
|
-
children: renderUserInfo(schemaWithValue)
|
|
416
|
-
}, key);
|
|
417
|
-
})
|
|
470
|
+
schemaItems.map((schemaWithValue) => /* @__PURE__ */ jsx("div", {
|
|
471
|
+
className: styles.info,
|
|
472
|
+
children: renderUserInfo(schemaWithValue)
|
|
473
|
+
}, schemaWithValue.name))
|
|
418
474
|
] });
|
|
419
475
|
};
|
|
420
476
|
const profileContent = /* @__PURE__ */ jsxs(Card_default, {
|
|
@@ -425,7 +481,7 @@ const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, p
|
|
|
425
481
|
children: [/* @__PURE__ */ jsx(Alert_default.Title, { children: t("errors.heading") || "Error" }), /* @__PURE__ */ jsx(Alert_default.Description, { children: error })]
|
|
426
482
|
}), /* @__PURE__ */ jsx("div", {
|
|
427
483
|
className: styles.infoContainer,
|
|
428
|
-
children:
|
|
484
|
+
children: renderProfileContent()
|
|
429
485
|
})]
|
|
430
486
|
});
|
|
431
487
|
if (mode === "popup") return /* @__PURE__ */ jsx(Dialog_default, {
|