@micha.bigler/ui-core-micha 2.33.2 → 2.35.0

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.
Files changed (84) hide show
  1. package/WORK_ORDERS.md +9 -2
  2. package/dist/auth/ReauthModal.js +3 -1
  3. package/dist/components/AccessCodeManager.js +16 -14
  4. package/dist/components/AccessCodeSingleUseToggle.js +2 -1
  5. package/dist/components/AllowedEmailDomainsManager.js +3 -1
  6. package/dist/components/AuthFactorRequirementCard.js +2 -1
  7. package/dist/components/BulkInviteCsvTab.js +7 -7
  8. package/dist/components/LoginForm.js +2 -1
  9. package/dist/components/MFAComponent.js +15 -8
  10. package/dist/components/MfaLoginComponent.js +4 -1
  11. package/dist/components/PasskeysComponent.js +4 -2
  12. package/dist/components/QrSignupManager.js +2 -1
  13. package/dist/components/QrSignupValidityManager.js +4 -1
  14. package/dist/components/RegistrationMethodsManager.js +3 -1
  15. package/dist/components/SecurityComponent.js +3 -1
  16. package/dist/components/SocialLoginButtons.js +2 -1
  17. package/dist/components/SupportRecoveryRequestsTab.js +4 -1
  18. package/dist/components/UserInviteComponent.js +8 -8
  19. package/dist/components/UserListComponent.js +8 -4
  20. package/dist/components/charts/ChartFrame.js +8 -3
  21. package/dist/components/charts/TimeSeriesChart.js +7 -4
  22. package/dist/components/charts/exportChart.js +2 -2
  23. package/dist/index.js +1 -1
  24. package/dist/layout/PageLayout.js +3 -2
  25. package/dist/messaging/AttachmentList.js +6 -1
  26. package/dist/messaging/Composer.js +2 -1
  27. package/dist/messaging/DirectMessageLauncher.js +2 -1
  28. package/dist/messaging/MessageBubble.js +29 -8
  29. package/dist/messaging/PollCard.js +6 -4
  30. package/dist/messaging/Thread.js +2 -1
  31. package/dist/notifications/NotificationSettings.js +17 -3
  32. package/dist/notifications/PopupSurface.js +2 -1
  33. package/dist/onboarding/steps/BrowserPushStep.js +2 -1
  34. package/dist/pages/AccountPage.js +2 -1
  35. package/dist/pages/LoginPage.js +2 -1
  36. package/dist/pages/SignUpPage.js +2 -1
  37. package/dist/pages/SignupConfirmPage.js +2 -1
  38. package/dist/theme/index.js +2 -1
  39. package/dist/theme/kitSxRegistry.js +187 -0
  40. package/dist/theme/themeCompleteness.js +422 -1
  41. package/package.json +1 -1
  42. package/src/auth/ReauthModal.jsx +5 -2
  43. package/src/components/AccessCodeManager.jsx +22 -20
  44. package/src/components/AccessCodeSingleUseToggle.jsx +4 -2
  45. package/src/components/AllowedEmailDomainsManager.jsx +6 -3
  46. package/src/components/AuthFactorRequirementCard.jsx +4 -2
  47. package/src/components/BulkInviteCsvTab.jsx +11 -10
  48. package/src/components/LoginForm.jsx +5 -3
  49. package/src/components/MFAComponent.jsx +20 -12
  50. package/src/components/MfaLoginComponent.jsx +9 -5
  51. package/src/components/PasskeysComponent.jsx +7 -4
  52. package/src/components/QrSignupManager.jsx +6 -4
  53. package/src/components/QrSignupValidityManager.jsx +8 -4
  54. package/src/components/RegistrationMethodsManager.jsx +7 -4
  55. package/src/components/SecurityComponent.jsx +10 -7
  56. package/src/components/SocialLoginButtons.jsx +2 -1
  57. package/src/components/SupportRecoveryRequestsTab.jsx +8 -4
  58. package/src/components/UserInviteComponent.jsx +10 -10
  59. package/src/components/UserListComponent.jsx +12 -7
  60. package/src/components/charts/ChartFrame.jsx +13 -3
  61. package/src/components/charts/TimeSeriesChart.jsx +8 -4
  62. package/src/components/charts/exportChart.js +2 -2
  63. package/src/index.js +4 -0
  64. package/src/layout/PageLayout.jsx +4 -2
  65. package/src/messaging/AttachmentList.jsx +9 -3
  66. package/src/messaging/Composer.jsx +3 -1
  67. package/src/messaging/DirectMessageLauncher.jsx +3 -1
  68. package/src/messaging/MessageBubble.jsx +31 -9
  69. package/src/messaging/PollCard.jsx +8 -6
  70. package/src/messaging/Thread.jsx +3 -1
  71. package/src/notifications/NotificationSettings.jsx +24 -9
  72. package/src/notifications/PopupSurface.jsx +3 -1
  73. package/src/onboarding/steps/BrowserPushStep.jsx +3 -1
  74. package/src/pages/AccountPage.jsx +11 -9
  75. package/src/pages/LoginPage.jsx +6 -4
  76. package/src/pages/SignUpPage.jsx +4 -2
  77. package/src/pages/SignupConfirmPage.jsx +4 -2
  78. package/src/theme/index.js +4 -0
  79. package/src/theme/kitSxRegistry.js +246 -0
  80. package/src/theme/themeCompleteness.js +451 -1
  81. package/tests/ChartFrame.test.jsx +5 -0
  82. package/tests/themeCompleteness.test.js +351 -0
  83. package/work-orders/THEME-4.md +86 -0
  84. package/work-orders/THEME-5.md +341 -0
@@ -6,6 +6,7 @@ import { Tabs, Tab, Box, Typography, Alert, CircularProgress, Paper, Stack, } fr
6
6
  import { useTranslation } from 'react-i18next';
7
7
  // Internal context
8
8
  import { AuthContext } from '../auth/AuthContext';
9
+ export const ACCOUNT_PAGE_SECTION_PAPER_SX = { p: 2.5 };
9
10
  // Falls die Komponenten noch lokal sind:
10
11
  import { WidePage } from '../layout/PageLayout';
11
12
  import { ProfileComponent } from '../components/ProfileComponent';
@@ -130,5 +131,5 @@ export function AccountPage({ userListExtraColumns = [], userListExtraRowActions
130
131
  const activeExtraTab = builtInTabValues.has(safeTab)
131
132
  ? null
132
133
  : extraTabs.find((tab) => tab.value === safeTab);
133
- return (_jsxs(WidePage, { title: t('Account.TITLE', 'Account & Administration'), children: [_jsx(Helmet, { children: _jsxs("title", { children: [t('Account.PAGE_TITLE', 'Account'), " \u2013 ", user.email] }) }), _jsx(Tabs, { value: safeTab, onChange: handleTabChange, variant: "scrollable", scrollButtons: "auto", sx: { mb: 3, borderBottom: 1, borderColor: 'divider' }, children: tabs.map((tab) => (_jsx(Tab, { label: tab.label, value: tab.value }, tab.value))) }), safeTab === 'profile' && (_jsx(Box, { sx: { mt: 2 }, children: _jsx(ProfileComponent, { onSubmit: handleProfileSubmit, showName: true, showPrivacy: true, showCookies: true }) })), safeTab === 'security' && (_jsx(Box, { sx: { mt: 2 }, children: _jsx(SecurityComponent, { fromRecovery: fromRecovery, fromWeakLogin: fromWeakLogin }) })), safeTab === 'users' && (_jsx(Box, { sx: { mt: 2 }, children: _jsx(UserListComponent, { roles: activeRoles, currentUser: user, extraColumns: userListExtraColumns, extraRowActions: userListExtraRowActions, extraContext: userListExtraContext, refreshTrigger: userListRefreshTrigger, canEditUser: userListCanEditUser, showNewColumn: userListShowNewColumn, showSuccessfulLoginColumn: userListShowSuccessfulLoginColumn, showRoleColumn: userListShowRoleColumn, onChangeRole: userListOnChangeRole, showDeleteAction: userListShowDeleteAction, canDeleteUser: userListCanDeleteUser, onDeleteUser: userListOnDeleteUser }) })), safeTab === 'invite' && (_jsx(Box, { sx: { mt: 2 }, children: _jsxs(Stack, { spacing: 2.5, children: [canViewAuthPolicy && (_jsx(Paper, { variant: "outlined", sx: { p: 2.5, borderRadius: 2 }, children: _jsx(AuthFactorRequirementCard, { canEdit: canWriteAuthPolicy, policy: authPolicy }) })), canViewAuthPolicy && (_jsx(Paper, { variant: "outlined", sx: { p: 2.5, borderRadius: 2 }, children: _jsx(RegistrationMethodsManager, { policy: authPolicy, error: authPolicyError, onPolicyChange: setAuthPolicy, canEdit: canWriteAuthPolicy }) })), canSendInvites && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_admin_invite) && (_jsx(Paper, { variant: "outlined", sx: { p: 2.5, borderRadius: 2 }, children: _jsx(UserInviteComponent, {}) })), canManageAccessCodes && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_access_code) && (_jsxs(Paper, { variant: "outlined", sx: { p: 2.5, borderRadius: 2 }, children: [_jsx(Typography, { variant: "h6", gutterBottom: true, children: t('Auth.ACCESS_CODE_MANAGER_TITLE', 'Access Codes') }), _jsx(Typography, { variant: "body2", sx: { mb: 2, color: 'text.secondary' }, children: t('Account.ACCESS_CODES_HINT', 'Manage access codes for self-registration.') }), _jsx(AccessCodeManager, {})] })), canManageAccessCodes && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_access_code) && (_jsx(Paper, { variant: "outlined", sx: { p: 2.5, borderRadius: 2 }, children: _jsx(AccessCodeSingleUseToggle, { canEdit: canWriteAuthPolicy, policy: authPolicy, onPolicyChange: setAuthPolicy }) })), canSendInvites && showBulkInviteCsvTab && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_admin_invite) && (_jsx(Paper, { variant: "outlined", sx: { p: 2.5, borderRadius: 2 }, children: _jsx(BulkInviteCsvTab, Object.assign({}, bulkInviteCsvProps)) })), canViewAuthPolicy && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_email_domain) && (_jsx(Paper, { variant: "outlined", sx: { p: 2.5, borderRadius: 2 }, children: _jsx(AllowedEmailDomainsManager, { enabled: Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_email_domain), domains: (authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allowed_email_domains) || [], onPolicyChange: setAuthPolicy, canEdit: canWriteAuthPolicy }) })), canViewAuthPolicy && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_qr) && (_jsx(Paper, { variant: "outlined", sx: { p: 2.5, borderRadius: 2 }, children: _jsx(QrSignupValidityManager, { enabled: Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_qr), expiryDays: authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.signup_qr_expiry_days, onPolicyChange: setAuthPolicy, canEdit: canWriteAuthPolicy }) })), canManageSignupQr && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_qr) && (_jsx(Paper, { variant: "outlined", sx: { p: 2.5, borderRadius: 2 }, children: _jsx(QrSignupManager, { enabled: Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_qr), expiryDays: authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.signup_qr_expiry_days }) }))] }) })), safeTab === 'support' && (_jsx(Box, { sx: { mt: 2 }, children: _jsx(SupportRecoveryRequestsTab, {}) })), activeExtraTab && (_jsx(Box, { sx: { mt: 2 }, children: (_a = activeExtraTab.render) === null || _a === void 0 ? void 0 : _a.call(activeExtraTab, { user, perms, isSuperUser, t }) }))] }));
134
+ return (_jsxs(WidePage, { title: t('Account.TITLE', 'Account & Administration'), children: [_jsx(Helmet, { children: _jsxs("title", { children: [t('Account.PAGE_TITLE', 'Account'), " \u2013 ", user.email] }) }), _jsx(Tabs, { value: safeTab, onChange: handleTabChange, variant: "scrollable", scrollButtons: "auto", sx: { mb: 3, borderBottom: 1, borderColor: 'divider' }, children: tabs.map((tab) => (_jsx(Tab, { label: tab.label, value: tab.value }, tab.value))) }), safeTab === 'profile' && (_jsx(Box, { sx: { mt: 2 }, children: _jsx(ProfileComponent, { onSubmit: handleProfileSubmit, showName: true, showPrivacy: true, showCookies: true }) })), safeTab === 'security' && (_jsx(Box, { sx: { mt: 2 }, children: _jsx(SecurityComponent, { fromRecovery: fromRecovery, fromWeakLogin: fromWeakLogin }) })), safeTab === 'users' && (_jsx(Box, { sx: { mt: 2 }, children: _jsx(UserListComponent, { roles: activeRoles, currentUser: user, extraColumns: userListExtraColumns, extraRowActions: userListExtraRowActions, extraContext: userListExtraContext, refreshTrigger: userListRefreshTrigger, canEditUser: userListCanEditUser, showNewColumn: userListShowNewColumn, showSuccessfulLoginColumn: userListShowSuccessfulLoginColumn, showRoleColumn: userListShowRoleColumn, onChangeRole: userListOnChangeRole, showDeleteAction: userListShowDeleteAction, canDeleteUser: userListCanDeleteUser, onDeleteUser: userListOnDeleteUser }) })), safeTab === 'invite' && (_jsx(Box, { sx: { mt: 2 }, children: _jsxs(Stack, { spacing: 2.5, children: [canViewAuthPolicy && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(AuthFactorRequirementCard, { canEdit: canWriteAuthPolicy, policy: authPolicy }) })), canViewAuthPolicy && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(RegistrationMethodsManager, { policy: authPolicy, error: authPolicyError, onPolicyChange: setAuthPolicy, canEdit: canWriteAuthPolicy }) })), canSendInvites && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_admin_invite) && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(UserInviteComponent, {}) })), canManageAccessCodes && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_access_code) && (_jsxs(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: [_jsx(Typography, { variant: "h6", gutterBottom: true, children: t('Auth.ACCESS_CODE_MANAGER_TITLE', 'Access Codes') }), _jsx(Typography, { variant: "body2", sx: { mb: 2, color: 'text.secondary' }, children: t('Account.ACCESS_CODES_HINT', 'Manage access codes for self-registration.') }), _jsx(AccessCodeManager, {})] })), canManageAccessCodes && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_access_code) && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(AccessCodeSingleUseToggle, { canEdit: canWriteAuthPolicy, policy: authPolicy, onPolicyChange: setAuthPolicy }) })), canSendInvites && showBulkInviteCsvTab && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_admin_invite) && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(BulkInviteCsvTab, Object.assign({}, bulkInviteCsvProps)) })), canViewAuthPolicy && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_email_domain) && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(AllowedEmailDomainsManager, { enabled: Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_email_domain), domains: (authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allowed_email_domains) || [], onPolicyChange: setAuthPolicy, canEdit: canWriteAuthPolicy }) })), canViewAuthPolicy && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_qr) && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(QrSignupValidityManager, { enabled: Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_qr), expiryDays: authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.signup_qr_expiry_days, onPolicyChange: setAuthPolicy, canEdit: canWriteAuthPolicy }) })), canManageSignupQr && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_qr) && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(QrSignupManager, { enabled: Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_qr), expiryDays: authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.signup_qr_expiry_days }) }))] }) })), safeTab === 'support' && (_jsx(Box, { sx: { mt: 2 }, children: _jsx(SupportRecoveryRequestsTab, {}) })), activeExtraTab && (_jsx(Box, { sx: { mt: 2 }, children: (_a = activeExtraTab.render) === null || _a === void 0 ? void 0 : _a.call(activeExtraTab, { user, perms, isSuperUser, t }) }))] }));
134
135
  }
@@ -13,6 +13,7 @@ import { loginWithPasskey, startSocialLogin } from '../utils/authService';
13
13
  // Components
14
14
  import { LoginForm } from '../components/LoginForm';
15
15
  import { MfaLoginComponent } from '../components/MfaLoginComponent';
16
+ export const LOGIN_PAGE_ALERT_SX = { mb: 2 };
16
17
  export function LoginPage() {
17
18
  const navigate = useNavigate();
18
19
  const location = useLocation();
@@ -244,7 +245,7 @@ export function LoginPage() {
244
245
  const twoFactorRequired = Boolean(authMethods === null || authMethods === void 0 ? void 0 : authMethods.two_factor_required)
245
246
  || Number((authMethods === null || authMethods === void 0 ? void 0 : authMethods.required_auth_factor_count) || 1) >= 2;
246
247
  // --- Render ---
247
- return (_jsxs(NarrowPage, { title: t('Auth.PAGE_LOGIN_TITLE'), subtitle: t('Auth.PAGE_LOGIN_SUBTITLE'), children: [_jsx(Helmet, { children: _jsxs("title", { children: [t('App.NAME'), " \u2013 ", t('Auth.PAGE_LOGIN_TITLE')] }) }), errorKey && (_jsx(Alert, { severity: "error", sx: { mb: 2 }, children: t(errorKey) })), recoveryFetching && !errorKey && (_jsx(Alert, { severity: "info", sx: { mb: 2 }, children: t('Auth.RECOVERY_LINK_VALIDATING', 'Validating recovery link…') })), recoveryToken && !errorKey && (_jsx(Alert, { severity: "info", sx: { mb: 2 }, children: t('Auth.RECOVERY_LOGIN_WARNING', 'Recovery link validated. Please enter your password.') })), twoFactorRequired && !recoveryToken && !recoveryFetching && (_jsx(Alert, { severity: "info", sx: { mb: 2 }, children: t('Auth.TWO_FACTOR_REQUIRED_HINT', 'This app requires two authentication factors for full access.') })), step === 'credentials' && (_jsx(LoginForm, { onSubmit: passwordLoginEnabled ? handleSubmitCredentials : null, onForgotPassword: passwordResetEnabled ? () => navigate('/reset-request-password') : null, onSocialLogin: socialLoginEnabled ? (provider) => startSocialLogin(provider) : null, socialProviders: socialProviders, onPasskeyLogin: passkeyLoginEnabled ? handlePasskeyLoginInitial : null, onSignUp: signupEnabled ? () => navigate('/signup') : null,
248
+ return (_jsxs(NarrowPage, { title: t('Auth.PAGE_LOGIN_TITLE'), subtitle: t('Auth.PAGE_LOGIN_SUBTITLE'), children: [_jsx(Helmet, { children: _jsxs("title", { children: [t('App.NAME'), " \u2013 ", t('Auth.PAGE_LOGIN_TITLE')] }) }), errorKey && (_jsx(Alert, { severity: "error", sx: LOGIN_PAGE_ALERT_SX, children: t(errorKey) })), recoveryFetching && !errorKey && (_jsx(Alert, { severity: "info", sx: LOGIN_PAGE_ALERT_SX, children: t('Auth.RECOVERY_LINK_VALIDATING', 'Validating recovery link…') })), recoveryToken && !errorKey && (_jsx(Alert, { severity: "info", sx: LOGIN_PAGE_ALERT_SX, children: t('Auth.RECOVERY_LOGIN_WARNING', 'Recovery link validated. Please enter your password.') })), twoFactorRequired && !recoveryToken && !recoveryFetching && (_jsx(Alert, { severity: "info", sx: LOGIN_PAGE_ALERT_SX, children: t('Auth.TWO_FACTOR_REQUIRED_HINT', 'This app requires two authentication factors for full access.') })), step === 'credentials' && (_jsx(LoginForm, { onSubmit: passwordLoginEnabled ? handleSubmitCredentials : null, onForgotPassword: passwordResetEnabled ? () => navigate('/reset-request-password') : null, onSocialLogin: socialLoginEnabled ? (provider) => startSocialLogin(provider) : null, socialProviders: socialProviders, onPasskeyLogin: passkeyLoginEnabled ? handlePasskeyLoginInitial : null, onSignUp: signupEnabled ? () => navigate('/signup') : null,
248
249
  // Block submit while the handoff is in flight so the user does not
249
250
  // race the recovery-token fetch with a normal password POST.
250
251
  disabled: submitting || recoveryFetching, initialIdentifier: recoveryEmail })), step === 'mfa' && mfaState && (_jsx(Box, { children: _jsx(MfaLoginComponent, { availableTypes: mfaState.availableTypes, identifier: mfaState.identifier, onSuccess: handleMfaSuccess, onCancel: handleMfaCancel }) }))] }));
@@ -8,6 +8,7 @@ import { NarrowPage } from '../layout/PageLayout';
8
8
  import { AuthContext } from '../auth/AuthContext';
9
9
  import { submitRegistrationRequest } from '../auth/authApi';
10
10
  import { TurnstileWidget } from '../components/TurnstileWidget';
11
+ export const SIGN_UP_PAGE_ALERT_SX = { mb: 2 };
11
12
  const TURNSTILE_SIGNUP_MODES = new Set([
12
13
  'self_signup_open',
13
14
  'self_signup_email_domain',
@@ -116,7 +117,7 @@ export function SignUpPage() {
116
117
  const handleGoToLogin = () => {
117
118
  navigate('/login');
118
119
  };
119
- return (_jsxs(NarrowPage, { title: t('Auth.LOGIN_SIGNUP_BUTTON'), subtitle: pageSubtitle, children: [_jsx(Helmet, { children: _jsxs("title", { children: [t('App.NAME'), " \u2013 ", t('Auth.LOGIN_SIGNUP_BUTTON')] }) }), successKey && (_jsx(Alert, { severity: "success", sx: { mb: 2 }, children: t(successKey, { email }) })), errorKey && (_jsx(Alert, { severity: "error", sx: { mb: 2 }, children: t(errorKey, t('Auth.INVITE_FAILED', 'Could not complete signup.')) })), signupModes.length > 1 && (_jsx(Stack, { spacing: 1, sx: { mb: 2 }, children: _jsx(Stack, { spacing: 1, children: signupModes.map((entry) => (_jsx(Button, { variant: mode === entry ? 'contained' : 'outlined', onClick: () => setMode(entry), disabled: submitting, fullWidth: true, children: t(MODE_LABELS[entry] || entry, entry) }, entry))) }) })), _jsxs(Box, { component: "form", onSubmit: handleSubmit, sx: { display: 'flex', flexDirection: 'column', gap: 2 }, children: [_jsx(TextField, { label: t('Auth.EMAIL_LABEL'), type: "email", required: true, fullWidth: true, value: email, onChange: (e) => setEmail(e.target.value), disabled: submitting }), mode === 'self_signup_access_code' && (_jsx(TextField, { label: t('Auth.ACCESS_CODE_LABEL'), type: "text", required: true, fullWidth: true, value: accessCode, onChange: (e) => setAccessCode(e.target.value), disabled: submitting })), turnstileRequired && (_jsx(TurnstileWidget, { ref: turnstileWidgetRef, siteKey: authMethods.turnstile_site_key, onToken: setTurnstileToken })), _jsx(Button, { type: "submit", variant: "contained", disabled: submitting || signupModes.length === 0 || (turnstileRequired && !turnstileToken), children: submitting
120
+ return (_jsxs(NarrowPage, { title: t('Auth.LOGIN_SIGNUP_BUTTON'), subtitle: pageSubtitle, children: [_jsx(Helmet, { children: _jsxs("title", { children: [t('App.NAME'), " \u2013 ", t('Auth.LOGIN_SIGNUP_BUTTON')] }) }), successKey && (_jsx(Alert, { severity: "success", sx: SIGN_UP_PAGE_ALERT_SX, children: t(successKey, { email }) })), errorKey && (_jsx(Alert, { severity: "error", sx: SIGN_UP_PAGE_ALERT_SX, children: t(errorKey, t('Auth.INVITE_FAILED', 'Could not complete signup.')) })), signupModes.length > 1 && (_jsx(Stack, { spacing: 1, sx: { mb: 2 }, children: _jsx(Stack, { spacing: 1, children: signupModes.map((entry) => (_jsx(Button, { variant: mode === entry ? 'contained' : 'outlined', onClick: () => setMode(entry), disabled: submitting, fullWidth: true, children: t(MODE_LABELS[entry] || entry, entry) }, entry))) }) })), _jsxs(Box, { component: "form", onSubmit: handleSubmit, sx: { display: 'flex', flexDirection: 'column', gap: 2 }, children: [_jsx(TextField, { label: t('Auth.EMAIL_LABEL'), type: "email", required: true, fullWidth: true, value: email, onChange: (e) => setEmail(e.target.value), disabled: submitting }), mode === 'self_signup_access_code' && (_jsx(TextField, { label: t('Auth.ACCESS_CODE_LABEL'), type: "text", required: true, fullWidth: true, value: accessCode, onChange: (e) => setAccessCode(e.target.value), disabled: submitting })), turnstileRequired && (_jsx(TurnstileWidget, { ref: turnstileWidgetRef, siteKey: authMethods.turnstile_site_key, onToken: setTurnstileToken })), _jsx(Button, { type: "submit", variant: "contained", disabled: submitting || signupModes.length === 0 || (turnstileRequired && !turnstileToken), children: submitting
120
121
  ? t('Auth.SIGNUP_SUBMITTING')
121
122
  : t('Auth.SIGNUP_SUBMIT') })] }), _jsx(Box, { sx: { mt: 3 }, children: _jsxs(Typography, { variant: "body2", children: [t('Auth.SIGNUP_ALREADY_HAVE_ACCOUNT'), ' ', _jsx(Button, { onClick: handleGoToLogin, variant: "text", size: "small", children: t('Auth.SIGNUP_GO_TO_LOGIN') })] }) })] }));
122
123
  }
@@ -13,6 +13,7 @@ import { Helmet } from 'react-helmet';
13
13
  import { useTranslation } from 'react-i18next';
14
14
  import { NarrowPage } from '../layout/PageLayout';
15
15
  import { confirmRegistration } from '../auth/authApi';
16
+ export const SIGNUP_CONFIRM_PAGE_ALERT_SX = { mb: 2 };
16
17
  export function SignupConfirmPage() {
17
18
  const { t } = useTranslation();
18
19
  const location = useLocation();
@@ -57,7 +58,7 @@ export function SignupConfirmPage() {
57
58
  }
58
59
  };
59
60
  const tokenMissing = !tokenFromUrl;
60
- return (_jsxs(NarrowPage, { title: t('Auth.SIGNUP_CONFIRM_TITLE', 'Confirm your registration'), subtitle: t('Auth.SIGNUP_CONFIRM_SUBTITLE', 'Choose a password to finish creating your account.'), children: [_jsx(Helmet, { children: _jsxs("title", { children: [t('App.NAME'), " \u2013 ", t('Auth.SIGNUP_CONFIRM_TITLE', 'Confirm your registration')] }) }), tokenMissing ? (_jsxs(_Fragment, { children: [_jsx(Alert, { severity: "error", sx: { mb: 2 }, children: t('Auth.PENDING_TOKEN_INVALID', 'This confirmation link is invalid or expired.') }), _jsxs(Stack, { direction: "row", spacing: 1, sx: { mt: 1 }, children: [_jsx(Button, { onClick: () => navigate('/signup'), variant: "contained", children: t('Auth.SIGNUP_REQUEST_NEW', 'Request a new invitation') }), _jsx(Button, { onClick: () => navigate('/login'), variant: "text", children: t('Auth.SIGNUP_GO_TO_LOGIN', 'Go to login') })] })] })) : (_jsxs(_Fragment, { children: [errorKey && (_jsx(Alert, { severity: "error", sx: { mb: 2 }, children: t(errorKey, t('Auth.PENDING_TOKEN_INVALID', 'Could not confirm registration.')) })), _jsxs(Box, { component: "form", onSubmit: handleSubmit, sx: { display: 'flex', flexDirection: 'column', gap: 2 }, children: [_jsx(TextField, { label: t('Auth.NEW_PASSWORD_LABEL', 'New password'), type: "password", required: true, fullWidth: true, value: password, onChange: (e) => setPassword(e.target.value), disabled: submitting, autoComplete: "new-password" }), _jsx(TextField, { label: t('Auth.PASSWORD_CONFIRM_LABEL', 'Confirm new password'), type: "password", required: true, fullWidth: true, value: confirmPassword, onChange: (e) => setConfirmPassword(e.target.value), disabled: submitting, autoComplete: "new-password" }), _jsx(Button, { type: "submit", variant: "contained", disabled: submitting, children: submitting
61
+ return (_jsxs(NarrowPage, { title: t('Auth.SIGNUP_CONFIRM_TITLE', 'Confirm your registration'), subtitle: t('Auth.SIGNUP_CONFIRM_SUBTITLE', 'Choose a password to finish creating your account.'), children: [_jsx(Helmet, { children: _jsxs("title", { children: [t('App.NAME'), " \u2013 ", t('Auth.SIGNUP_CONFIRM_TITLE', 'Confirm your registration')] }) }), tokenMissing ? (_jsxs(_Fragment, { children: [_jsx(Alert, { severity: "error", sx: SIGNUP_CONFIRM_PAGE_ALERT_SX, children: t('Auth.PENDING_TOKEN_INVALID', 'This confirmation link is invalid or expired.') }), _jsxs(Stack, { direction: "row", spacing: 1, sx: { mt: 1 }, children: [_jsx(Button, { onClick: () => navigate('/signup'), variant: "contained", children: t('Auth.SIGNUP_REQUEST_NEW', 'Request a new invitation') }), _jsx(Button, { onClick: () => navigate('/login'), variant: "text", children: t('Auth.SIGNUP_GO_TO_LOGIN', 'Go to login') })] })] })) : (_jsxs(_Fragment, { children: [errorKey && (_jsx(Alert, { severity: "error", sx: SIGNUP_CONFIRM_PAGE_ALERT_SX, children: t(errorKey, t('Auth.PENDING_TOKEN_INVALID', 'Could not confirm registration.')) })), _jsxs(Box, { component: "form", onSubmit: handleSubmit, sx: { display: 'flex', flexDirection: 'column', gap: 2 }, children: [_jsx(TextField, { label: t('Auth.NEW_PASSWORD_LABEL', 'New password'), type: "password", required: true, fullWidth: true, value: password, onChange: (e) => setPassword(e.target.value), disabled: submitting, autoComplete: "new-password" }), _jsx(TextField, { label: t('Auth.PASSWORD_CONFIRM_LABEL', 'Confirm new password'), type: "password", required: true, fullWidth: true, value: confirmPassword, onChange: (e) => setConfirmPassword(e.target.value), disabled: submitting, autoComplete: "new-password" }), _jsx(Button, { type: "submit", variant: "contained", disabled: submitting, children: submitting
61
62
  ? t('Auth.SIGNUP_CONFIRM_SUBMITTING', 'Confirming…')
62
63
  : t('Auth.SIGNUP_CONFIRM_SUBMIT', 'Confirm registration') })] }), _jsxs(Stack, { direction: "row", spacing: 1, sx: { mt: 3 }, children: [_jsx(Typography, { variant: "body2", children: t('Auth.SIGNUP_ALREADY_HAVE_ACCOUNT', 'Already have an account?') }), _jsx(Button, { onClick: () => navigate('/login'), variant: "text", size: "small", children: t('Auth.SIGNUP_GO_TO_LOGIN', 'Go to login') })] })] }))] }));
63
64
  }
@@ -1,4 +1,5 @@
1
1
  export { createAppTheme } from './createAppTheme';
2
- export { assertThemeComplete, calculateContrastRatio, reportThemeAdoption, THEME_COMPLETENESS_SURFACES, } from './themeCompleteness';
2
+ export { assertThemeComplete, assertKitSxDisjoint, calculateContrastRatio, reportOffPaletteColours, reportKitSxBypasses, reportThemeAdoption, THEME_COMPLETENESS_SURFACES, } from './themeCompleteness';
3
+ export { KIT_COMPONENT_SX_REGISTRY } from './kitSxRegistry';
3
4
  export { formatShortTime, formatShortDate, formatShortMonth, formatShortYear, } from '../components/charts/chartLabels';
4
5
  export { yearTickInterval } from '../components/charts/yearTickInterval';
@@ -0,0 +1,187 @@
1
+ import { ACCESS_CODE_ACTION_SX, ACCESS_CODE_ALERT_SX, ACCESS_CODE_PRIMARY_ACTION_SX, ACCESS_CODE_VALUE_FIELD_SX, } from '../components/AccessCodeManager';
2
+ import { ACCESS_CODE_SINGLE_USE_ALERT_SX } from '../components/AccessCodeSingleUseToggle';
3
+ import { ALLOWED_EMAIL_DOMAINS_ALERT_SX, ALLOWED_EMAIL_DOMAINS_BUTTON_SX, } from '../components/AllowedEmailDomainsManager';
4
+ import { AUTH_FACTOR_REQUIREMENT_ALERT_SX } from '../components/AuthFactorRequirementCard';
5
+ import { BULK_INVITE_ACTION_SX, BULK_INVITE_ALERT_SX } from '../components/BulkInviteCsvTab';
6
+ import { LOGIN_FORM_DIVIDER_SX } from '../components/LoginForm';
7
+ import { MFA_ACTIVE_CARD_SX, MFA_ALERT_SX, MFA_CARD_SX, MFA_DIVIDER_SX, MFA_RECOVERY_BUTTON_SX, MFA_TEXT_FIELD_SX, } from '../components/MFAComponent';
8
+ import { MFA_LOGIN_ALERT_SX, MFA_LOGIN_DIVIDER_SX, MFA_LOGIN_TEXT_FIELD_SX, } from '../components/MfaLoginComponent';
9
+ import { MOBILE_BOTTOM_NAV_ACTION_SX, MOBILE_BOTTOM_NAV_ROOT_SX, } from '../components/MobileBottomNav';
10
+ import { PASSKEYS_ALERT_SX, PASSKEYS_DIVIDER_SX } from '../components/PasskeysComponent';
11
+ import { QR_SIGNUP_MANAGER_ALERT_SX } from '../components/QrSignupManager';
12
+ import { QR_SIGNUP_VALIDITY_ALERT_SX, QR_SIGNUP_VALIDITY_BUTTON_SX, QR_SIGNUP_VALIDITY_FIELD_SX, } from '../components/QrSignupValidityManager';
13
+ import { REGISTRATION_METHODS_ALERT_SX, REGISTRATION_METHODS_INFO_SX, } from '../components/RegistrationMethodsManager';
14
+ import { SECURITY_ALERT_SX, SECURITY_DIVIDER_SX } from '../components/SecurityComponent';
15
+ import { SUPPORT_RECOVERY_AGENT_BUTTON_SX, SUPPORT_RECOVERY_AGENT_PAPER_SX, SUPPORT_RECOVERY_ALERT_SX, } from '../components/SupportRecoveryRequestsTab';
16
+ import { USER_INVITE_ACTION_SX, USER_INVITE_ALERT_SX } from '../components/UserInviteComponent';
17
+ import { USER_LIST_ACTION_SX, USER_LIST_ALERT_SX, USER_LIST_BODY_CELL_SX, USER_LIST_EMPTY_CELL_SX, USER_LIST_HEADER_CELL_SX, } from '../components/UserListComponent';
18
+ import { CHART_FRAME_ALERT_SX, CHART_FRAME_ROOT_SX } from '../components/charts/ChartFrame';
19
+ import { PAGE_LAYOUT_CONTAINER_SX } from '../layout/PageLayout';
20
+ import { ATTACHMENT_LIST_ALERT_SX, ATTACHMENT_LIST_LIGHTBOX_ACTION_SX, } from '../messaging/AttachmentList';
21
+ import { COMPOSER_EMOJI_BUTTON_SX } from '../messaging/Composer';
22
+ import { DIRECT_MESSAGE_LAUNCHER_ALERT_SX } from '../messaging/DirectMessageLauncher';
23
+ import { MESSAGE_BUBBLE_ACTION_SX, MESSAGE_BUBBLE_ROOT_SX } from '../messaging/MessageBubble';
24
+ import { POLL_CARD_CHECKBOX_SX, POLL_CARD_FORM_CONTROL_SX, POLL_CARD_ROOT_SX, } from '../messaging/PollCard';
25
+ import { THREAD_DAY_SEPARATOR_SX } from '../messaging/Thread';
26
+ import { NOTIFICATION_SETTINGS_ALERT_SX, NOTIFICATION_SETTINGS_CATEGORY_CONTROL_SX, NOTIFICATION_SETTINGS_FORM_CONTROL_SX, NOTIFICATION_SETTINGS_HINT_ALERT_SX, NOTIFICATION_SETTINGS_PUSH_CONTROL_SX, NOTIFICATION_SETTINGS_REACH_ALERT_SX, } from '../notifications/NotificationSettings';
27
+ import { POPUP_SURFACE_DISMISS_BUTTON_SX } from '../notifications/PopupSurface';
28
+ import { BROWSER_PUSH_FORM_CONTROL_LABEL_SX } from '../onboarding/steps/BrowserPushStep';
29
+ import { ACCOUNT_PAGE_SECTION_PAPER_SX } from '../pages/AccountPage';
30
+ import { LOGIN_PAGE_ALERT_SX } from '../pages/LoginPage';
31
+ import { SIGN_UP_PAGE_ALERT_SX } from '../pages/SignUpPage';
32
+ import { SIGNUP_CONFIRM_PAGE_ALERT_SX } from '../pages/SignupConfirmPage';
33
+ import { REAUTH_MODAL_ALERT_SX, REAUTH_MODAL_TEXT_FIELD_SX } from '../auth/ReauthModal';
34
+ const SX_EXPORTS = {
35
+ ACCESS_CODE_ACTION_SX,
36
+ ACCESS_CODE_ALERT_SX,
37
+ ACCESS_CODE_PRIMARY_ACTION_SX,
38
+ ACCESS_CODE_SINGLE_USE_ALERT_SX,
39
+ ACCESS_CODE_VALUE_FIELD_SX,
40
+ ACCOUNT_PAGE_SECTION_PAPER_SX,
41
+ ALLOWED_EMAIL_DOMAINS_ALERT_SX,
42
+ ALLOWED_EMAIL_DOMAINS_BUTTON_SX,
43
+ ATTACHMENT_LIST_ALERT_SX,
44
+ ATTACHMENT_LIST_LIGHTBOX_ACTION_SX,
45
+ AUTH_FACTOR_REQUIREMENT_ALERT_SX,
46
+ BROWSER_PUSH_FORM_CONTROL_LABEL_SX,
47
+ BULK_INVITE_ACTION_SX,
48
+ BULK_INVITE_ALERT_SX,
49
+ CHART_FRAME_ALERT_SX,
50
+ CHART_FRAME_ROOT_SX,
51
+ COMPOSER_EMOJI_BUTTON_SX,
52
+ DIRECT_MESSAGE_LAUNCHER_ALERT_SX,
53
+ LOGIN_FORM_DIVIDER_SX,
54
+ LOGIN_PAGE_ALERT_SX,
55
+ MESSAGE_BUBBLE_ACTION_SX,
56
+ MESSAGE_BUBBLE_ROOT_SX,
57
+ MFA_ACTIVE_CARD_SX,
58
+ MFA_ALERT_SX,
59
+ MFA_CARD_SX,
60
+ MFA_DIVIDER_SX,
61
+ MFA_LOGIN_ALERT_SX,
62
+ MFA_LOGIN_DIVIDER_SX,
63
+ MFA_LOGIN_TEXT_FIELD_SX,
64
+ MFA_RECOVERY_BUTTON_SX,
65
+ MFA_TEXT_FIELD_SX,
66
+ MOBILE_BOTTOM_NAV_ACTION_SX,
67
+ MOBILE_BOTTOM_NAV_ROOT_SX,
68
+ NOTIFICATION_SETTINGS_ALERT_SX,
69
+ NOTIFICATION_SETTINGS_CATEGORY_CONTROL_SX,
70
+ NOTIFICATION_SETTINGS_FORM_CONTROL_SX,
71
+ NOTIFICATION_SETTINGS_HINT_ALERT_SX,
72
+ NOTIFICATION_SETTINGS_PUSH_CONTROL_SX,
73
+ NOTIFICATION_SETTINGS_REACH_ALERT_SX,
74
+ PAGE_LAYOUT_CONTAINER_SX,
75
+ PASSKEYS_ALERT_SX,
76
+ PASSKEYS_DIVIDER_SX,
77
+ POLL_CARD_CHECKBOX_SX,
78
+ POLL_CARD_FORM_CONTROL_SX,
79
+ POLL_CARD_ROOT_SX,
80
+ POPUP_SURFACE_DISMISS_BUTTON_SX,
81
+ QR_SIGNUP_MANAGER_ALERT_SX,
82
+ QR_SIGNUP_VALIDITY_ALERT_SX,
83
+ QR_SIGNUP_VALIDITY_BUTTON_SX,
84
+ QR_SIGNUP_VALIDITY_FIELD_SX,
85
+ REAUTH_MODAL_ALERT_SX,
86
+ REAUTH_MODAL_TEXT_FIELD_SX,
87
+ REGISTRATION_METHODS_ALERT_SX,
88
+ REGISTRATION_METHODS_INFO_SX,
89
+ SECURITY_ALERT_SX,
90
+ SECURITY_DIVIDER_SX,
91
+ SIGNUP_CONFIRM_PAGE_ALERT_SX,
92
+ SIGN_UP_PAGE_ALERT_SX,
93
+ SUPPORT_RECOVERY_AGENT_BUTTON_SX,
94
+ SUPPORT_RECOVERY_AGENT_PAPER_SX,
95
+ SUPPORT_RECOVERY_ALERT_SX,
96
+ THREAD_DAY_SEPARATOR_SX,
97
+ USER_INVITE_ACTION_SX,
98
+ USER_INVITE_ALERT_SX,
99
+ USER_LIST_ACTION_SX,
100
+ USER_LIST_ALERT_SX,
101
+ USER_LIST_BODY_CELL_SX,
102
+ USER_LIST_EMPTY_CELL_SX,
103
+ USER_LIST_HEADER_CELL_SX,
104
+ };
105
+ const SX_EXPORT_NAMES = new Map(Object.entries(SX_EXPORTS).map(([name, sx]) => [sx, name]));
106
+ const entry = (component, muiComponent, sx) => ({
107
+ component,
108
+ muiComponent,
109
+ sx,
110
+ exportName: SX_EXPORT_NAMES.get(sx),
111
+ });
112
+ /**
113
+ * Kit-owned, top-level sx objects paired with the baseline-styled MUI key they
114
+ * target. Conditional and nested sx remain a documented lower bound in the
115
+ * checks rather than being represented here as if they were fully inspected.
116
+ */
117
+ export const KIT_COMPONENT_SX_REGISTRY = [
118
+ entry('AccessCodeManager.action', 'MuiButton', ACCESS_CODE_ACTION_SX),
119
+ entry('AccessCodeManager.primaryAction', 'MuiButton', ACCESS_CODE_PRIMARY_ACTION_SX),
120
+ entry('AccessCodeManager.alert', 'MuiAlert', ACCESS_CODE_ALERT_SX),
121
+ entry('AccessCodeManager.valueField', 'MuiTextField', ACCESS_CODE_VALUE_FIELD_SX),
122
+ entry('AccessCodeSingleUseToggle.alert', 'MuiAlert', ACCESS_CODE_SINGLE_USE_ALERT_SX),
123
+ entry('AllowedEmailDomainsManager.alert', 'MuiAlert', ALLOWED_EMAIL_DOMAINS_ALERT_SX),
124
+ entry('AllowedEmailDomainsManager.action', 'MuiButton', ALLOWED_EMAIL_DOMAINS_BUTTON_SX),
125
+ entry('AuthFactorRequirementCard.alert', 'MuiAlert', AUTH_FACTOR_REQUIREMENT_ALERT_SX),
126
+ entry('BulkInviteCsvTab.action', 'MuiButton', BULK_INVITE_ACTION_SX),
127
+ entry('BulkInviteCsvTab.alert', 'MuiAlert', BULK_INVITE_ALERT_SX),
128
+ entry('LoginForm.divider', 'MuiDivider', LOGIN_FORM_DIVIDER_SX),
129
+ entry('MFAComponent.alert', 'MuiAlert', MFA_ALERT_SX),
130
+ entry('MFAComponent.card', 'MuiCard', MFA_CARD_SX),
131
+ entry('MFAComponent.activeCard', 'MuiCard', MFA_ACTIVE_CARD_SX),
132
+ entry('MFAComponent.field', 'MuiTextField', MFA_TEXT_FIELD_SX),
133
+ entry('MFAComponent.divider', 'MuiDivider', MFA_DIVIDER_SX),
134
+ entry('MFAComponent.recoveryAction', 'MuiButton', MFA_RECOVERY_BUTTON_SX),
135
+ entry('MfaLoginComponent.alert', 'MuiAlert', MFA_LOGIN_ALERT_SX),
136
+ entry('MfaLoginComponent.divider', 'MuiDivider', MFA_LOGIN_DIVIDER_SX),
137
+ entry('MfaLoginComponent.field', 'MuiTextField', MFA_LOGIN_TEXT_FIELD_SX),
138
+ entry('MobileBottomNav.root', 'MuiBottomNavigation', MOBILE_BOTTOM_NAV_ROOT_SX),
139
+ entry('MobileBottomNav.action', 'MuiBottomNavigationAction', MOBILE_BOTTOM_NAV_ACTION_SX),
140
+ entry('PasskeysComponent.alert', 'MuiAlert', PASSKEYS_ALERT_SX),
141
+ entry('PasskeysComponent.divider', 'MuiDivider', PASSKEYS_DIVIDER_SX),
142
+ entry('QrSignupManager.alert', 'MuiAlert', QR_SIGNUP_MANAGER_ALERT_SX),
143
+ entry('QrSignupValidityManager.alert', 'MuiAlert', QR_SIGNUP_VALIDITY_ALERT_SX),
144
+ entry('QrSignupValidityManager.field', 'MuiTextField', QR_SIGNUP_VALIDITY_FIELD_SX),
145
+ entry('QrSignupValidityManager.action', 'MuiButton', QR_SIGNUP_VALIDITY_BUTTON_SX),
146
+ entry('RegistrationMethodsManager.alert', 'MuiAlert', REGISTRATION_METHODS_ALERT_SX),
147
+ entry('RegistrationMethodsManager.info', 'MuiAlert', REGISTRATION_METHODS_INFO_SX),
148
+ entry('SecurityComponent.alert', 'MuiAlert', SECURITY_ALERT_SX),
149
+ entry('SecurityComponent.divider', 'MuiDivider', SECURITY_DIVIDER_SX),
150
+ entry('SupportRecoveryRequestsTab.agentPaper', 'MuiPaper', SUPPORT_RECOVERY_AGENT_PAPER_SX),
151
+ entry('SupportRecoveryRequestsTab.alert', 'MuiAlert', SUPPORT_RECOVERY_ALERT_SX),
152
+ entry('SupportRecoveryRequestsTab.agentAction', 'MuiButton', SUPPORT_RECOVERY_AGENT_BUTTON_SX),
153
+ entry('UserInviteComponent.action', 'MuiButton', USER_INVITE_ACTION_SX),
154
+ entry('UserInviteComponent.alert', 'MuiAlert', USER_INVITE_ALERT_SX),
155
+ entry('UserListComponent.action', 'MuiButton', USER_LIST_ACTION_SX),
156
+ entry('UserListComponent.alert', 'MuiAlert', USER_LIST_ALERT_SX),
157
+ entry('UserListComponent.headerCell', 'MuiTableCell', USER_LIST_HEADER_CELL_SX),
158
+ entry('UserListComponent.emptyCell', 'MuiTableCell', USER_LIST_EMPTY_CELL_SX),
159
+ entry('UserListComponent.bodyCell', 'MuiTableCell', USER_LIST_BODY_CELL_SX),
160
+ entry('ChartFrame.root', 'MuiPaper', CHART_FRAME_ROOT_SX),
161
+ entry('ChartFrame.alert', 'MuiAlert', CHART_FRAME_ALERT_SX),
162
+ entry('PageLayout.container', 'MuiContainer', PAGE_LAYOUT_CONTAINER_SX),
163
+ entry('AttachmentList.lightboxAction', 'MuiIconButton', ATTACHMENT_LIST_LIGHTBOX_ACTION_SX),
164
+ entry('AttachmentList.alert', 'MuiAlert', ATTACHMENT_LIST_ALERT_SX),
165
+ entry('Composer.emojiAction', 'MuiIconButton', COMPOSER_EMOJI_BUTTON_SX),
166
+ entry('DirectMessageLauncher.alert', 'MuiAlert', DIRECT_MESSAGE_LAUNCHER_ALERT_SX),
167
+ entry('MessageBubble.root', 'MuiPaper', MESSAGE_BUBBLE_ROOT_SX),
168
+ entry('MessageBubble.action', 'MuiIconButton', MESSAGE_BUBBLE_ACTION_SX),
169
+ entry('PollCard.root', 'MuiPaper', POLL_CARD_ROOT_SX),
170
+ entry('PollCard.formControl', 'MuiFormControlLabel', POLL_CARD_FORM_CONTROL_SX),
171
+ entry('PollCard.checkbox', 'MuiCheckbox', POLL_CARD_CHECKBOX_SX),
172
+ entry('Thread.daySeparator', 'MuiDivider', THREAD_DAY_SEPARATOR_SX),
173
+ entry('NotificationSettings.alert', 'MuiAlert', NOTIFICATION_SETTINGS_ALERT_SX),
174
+ entry('NotificationSettings.hintAlert', 'MuiAlert', NOTIFICATION_SETTINGS_HINT_ALERT_SX),
175
+ entry('NotificationSettings.reachAlert', 'MuiAlert', NOTIFICATION_SETTINGS_REACH_ALERT_SX),
176
+ entry('NotificationSettings.formControl', 'MuiFormControlLabel', NOTIFICATION_SETTINGS_FORM_CONTROL_SX),
177
+ entry('NotificationSettings.pushControl', 'MuiFormControlLabel', NOTIFICATION_SETTINGS_PUSH_CONTROL_SX),
178
+ entry('NotificationSettings.categoryControl', 'MuiFormControlLabel', NOTIFICATION_SETTINGS_CATEGORY_CONTROL_SX),
179
+ entry('PopupSurface.dismissAction', 'MuiButton', POPUP_SURFACE_DISMISS_BUTTON_SX),
180
+ entry('BrowserPushStep.formControl', 'MuiFormControlLabel', BROWSER_PUSH_FORM_CONTROL_LABEL_SX),
181
+ entry('AccountPage.sectionPaper', 'MuiPaper', ACCOUNT_PAGE_SECTION_PAPER_SX),
182
+ entry('LoginPage.alert', 'MuiAlert', LOGIN_PAGE_ALERT_SX),
183
+ entry('SignUpPage.alert', 'MuiAlert', SIGN_UP_PAGE_ALERT_SX),
184
+ entry('SignupConfirmPage.alert', 'MuiAlert', SIGNUP_CONFIRM_PAGE_ALERT_SX),
185
+ entry('ReauthModal.alert', 'MuiAlert', REAUTH_MODAL_ALERT_SX),
186
+ entry('ReauthModal.field', 'MuiTextField', REAUTH_MODAL_TEXT_FIELD_SX),
187
+ ];