@micha.bigler/ui-core-micha 3.14.4 → 4.0.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/CHANGELOG.md +29 -0
- package/README.md +7 -0
- package/dist/chat/kitSxRegistry.js +9 -0
- package/dist/components/charts/kitSxRegistry.js +6 -0
- package/dist/entries/charts.js +6 -0
- package/dist/entries/chat.js +8 -0
- package/dist/entries/markdown.js +1 -0
- package/dist/index.js +0 -14
- package/dist/pages/AccountPage.js +1 -2
- package/dist/pages/LoginPage.js +1 -2
- package/dist/pages/PasswordChangePage.js +1 -2
- package/dist/pages/PasswordInvitePage.js +1 -2
- package/dist/pages/PasswordResetRequestPage.js +1 -2
- package/dist/pages/SignUpPage.js +1 -2
- package/dist/pages/SignupConfirmPage.js +1 -2
- package/dist/theme/kitSxEntry.js +11 -0
- package/dist/theme/kitSxRegistry.js +2 -15
- package/package.json +31 -7
- package/.github/workflows/ci.yml +0 -35
- package/.github/workflows/publish.yml +0 -126
- package/DESIGN.md +0 -60
- package/WORK_ORDERS.md +0 -150
- package/dev/entries.jsx +0 -721
- package/dev/fixtures.js +0 -26
- package/dev/main.jsx +0 -75
- package/dev/mockTransport.jsx +0 -128
- package/docs/CHART-LAYOUT.md +0 -157
- package/docs/DARK-TOKENS.md +0 -140
- package/docs/TYPE-SCALE.md +0 -111
- package/docs/messaging-deviations.md +0 -118
- package/index.html +0 -12
- package/renovate.json +0 -10
- package/scripts/chart-api-census.mjs +0 -415
- package/src/auth/AuthContext.jsx +0 -158
- package/src/auth/ReauthModal.jsx +0 -82
- package/src/auth/UserMenu.jsx +0 -121
- package/src/auth/apiClient.jsx +0 -232
- package/src/auth/authApi.jsx +0 -539
- package/src/auth/authConfig.jsx +0 -34
- package/src/auth/reauth.js +0 -47
- package/src/chat/ChatComposer.jsx +0 -36
- package/src/chat/ChatList.jsx +0 -87
- package/src/chat/ChatThread.jsx +0 -128
- package/src/chat/ChatWorkspace.jsx +0 -244
- package/src/chat/MarkdownReply.jsx +0 -22
- package/src/chat/ModelPicker.jsx +0 -85
- package/src/chat/api.js +0 -18
- package/src/chat/useChatSocket.js +0 -32
- package/src/chat/wire.js +0 -7
- package/src/components/AccessCodeManager.jsx +0 -288
- package/src/components/AccessCodeSingleUseToggle.jsx +0 -92
- package/src/components/AllowedEmailDomainsManager.jsx +0 -92
- package/src/components/AuthFactorRequirementCard.jsx +0 -95
- package/src/components/BulkInviteCsvTab.jsx +0 -198
- package/src/components/EmptyState.jsx +0 -38
- package/src/components/LoginForm.jsx +0 -159
- package/src/components/MFAComponent.jsx +0 -350
- package/src/components/MfaLoginComponent.jsx +0 -252
- package/src/components/MobileBottomNav.jsx +0 -82
- package/src/components/PasskeysComponent.jsx +0 -252
- package/src/components/PasswordChangeForm.jsx +0 -87
- package/src/components/PasswordResetRequestForm.jsx +0 -43
- package/src/components/PasswordSetForm.jsx +0 -97
- package/src/components/ProfileComponent.jsx +0 -348
- package/src/components/QrSignupManager.jsx +0 -404
- package/src/components/QrSignupValidityManager.jsx +0 -106
- package/src/components/RegistrationMethodsManager.jsx +0 -150
- package/src/components/SecurityComponent.jsx +0 -141
- package/src/components/SocialLoginButtons.jsx +0 -83
- package/src/components/SoftChip.jsx +0 -93
- package/src/components/StatTile.jsx +0 -39
- package/src/components/SupportRecoveryRequestsTab.jsx +0 -482
- package/src/components/TurnstileWidget.jsx +0 -99
- package/src/components/UserInviteComponent.jsx +0 -76
- package/src/components/UserListComponent.jsx +0 -618
- package/src/components/charts/BarChart.jsx +0 -102
- package/src/components/charts/ChartFrame.jsx +0 -214
- package/src/components/charts/LineChart.jsx +0 -126
- package/src/components/charts/ScatterChart.jsx +0 -299
- package/src/components/charts/TimeSeriesChart.jsx +0 -300
- package/src/components/charts/chartDefaults.js +0 -644
- package/src/components/charts/chartLabels.js +0 -36
- package/src/components/charts/exportChart.js +0 -258
- package/src/components/charts/formatters.js +0 -39
- package/src/components/charts/palette.js +0 -33
- package/src/components/charts/yearTickInterval.js +0 -7
- package/src/i18n/authTranslations.ts +0 -2651
- package/src/i18n/chartsTranslations.ts +0 -91
- package/src/i18n/chatTranslations.ts +0 -55
- package/src/i18n/messagingTranslations.ts +0 -120
- package/src/i18n/notificationsTranslations.ts +0 -32
- package/src/i18n/onboardingTranslations.ts +0 -29
- package/src/i18n/sectionNavTranslations.ts +0 -20
- package/src/i18n/uiCoreTranslations.js +0 -29
- package/src/i18n/userMenuTranslations.ts +0 -5
- package/src/index.js +0 -158
- package/src/layout/PageLayout.jsx +0 -36
- package/src/layout/SectionNav.jsx +0 -320
- package/src/messaging/AttachmentList.jsx +0 -145
- package/src/messaging/Composer.jsx +0 -197
- package/src/messaging/ConversationLaunchers.jsx +0 -51
- package/src/messaging/ConversationList.jsx +0 -109
- package/src/messaging/DirectMessageLauncher.jsx +0 -112
- package/src/messaging/MessageBubble.jsx +0 -183
- package/src/messaging/MessagingProvider.jsx +0 -0
- package/src/messaging/MessagingScopeConfig.jsx +0 -24
- package/src/messaging/PollCard.jsx +0 -163
- package/src/messaging/ReactionBar.jsx +0 -43
- package/src/messaging/ReadTicks.jsx +0 -82
- package/src/messaging/Thread.jsx +0 -195
- package/src/messaging/api.js +0 -48
- package/src/messaging/composerImageCompression.js +0 -35
- package/src/messaging/linkifyText.jsx +0 -37
- package/src/notifications/NotificationBell.jsx +0 -84
- package/src/notifications/NotificationSettings.jsx +0 -330
- package/src/notifications/NotificationsProvider.jsx +0 -224
- package/src/notifications/PopupSurface.jsx +0 -105
- package/src/notifications/api.js +0 -55
- package/src/notifications/feedApi.js +0 -18
- package/src/notifications/realtime.jsx +0 -138
- package/src/notifications/serviceWorker/sw.js +0 -50
- package/src/onboarding/OnboardingProvider.jsx +0 -326
- package/src/onboarding/OnboardingWizard.jsx +0 -61
- package/src/onboarding/WizardDialogShell.jsx +0 -51
- package/src/onboarding/api.js +0 -13
- package/src/onboarding/stepSelection.js +0 -16
- package/src/onboarding/steps/BrowserPushStep.jsx +0 -121
- package/src/onboarding/steps/CompleteNameStep.jsx +0 -46
- package/src/onboarding/steps/CookieConsentStep.jsx +0 -133
- package/src/onboarding/steps/PwaInstallStep.jsx +0 -47
- package/src/pages/AccountPage.jsx +0 -394
- package/src/pages/LoginPage.jsx +0 -343
- package/src/pages/PasswordChangePage.jsx +0 -62
- package/src/pages/PasswordInvitePage.jsx +0 -177
- package/src/pages/PasswordResetRequestPage.jsx +0 -68
- package/src/pages/SignUpPage.jsx +0 -268
- package/src/pages/SignupConfirmPage.jsx +0 -155
- package/src/testing/checkKitIntegration.js +0 -233
- package/src/theme/createAppTheme.js +0 -423
- package/src/theme/fonts.js +0 -3
- package/src/theme/index.js +0 -21
- package/src/theme/kitSxRegistry.js +0 -285
- package/src/theme/themeCompleteness.js +0 -1045
- package/src/theme/tokens.js +0 -478
- package/src/utils/auth-errors.js +0 -76
- package/src/utils/authService.js +0 -223
- package/src/utils/resolveErrorText.js +0 -28
- package/src/utils/webauthn.js +0 -51
- package/tests/AccountPage.profileStatements.test.jsx +0 -162
- package/tests/AccountPage.test.jsx +0 -200
- package/tests/AuthContext.test.jsx +0 -129
- package/tests/BarChart.test.jsx +0 -112
- package/tests/BrowserPushStep.test.jsx +0 -110
- package/tests/ChartFrame.test.jsx +0 -336
- package/tests/ConversationList.test.jsx +0 -144
- package/tests/CookieConsentStep.test.jsx +0 -69
- package/tests/EmptyState.test.jsx +0 -62
- package/tests/LineChart.test.jsx +0 -80
- package/tests/MessagingProvider.test.jsx +0 -50
- package/tests/MobileBottomNav.test.jsx +0 -319
- package/tests/NotificationBell.test.jsx +0 -60
- package/tests/NotificationSettings.test.jsx +0 -276
- package/tests/NotificationsProvider.test.jsx +0 -240
- package/tests/OnboardingProvider.test.jsx +0 -294
- package/tests/OnboardingWizard.test.jsx +0 -143
- package/tests/PasswordChangeForm.test.jsx +0 -70
- package/tests/PasswordInvitePage.test.jsx +0 -142
- package/tests/PasswordSetForm.test.jsx +0 -70
- package/tests/PopupSurface.test.jsx +0 -142
- package/tests/ProfileComponent.refresh.test.jsx +0 -194
- package/tests/QrSignupManager.registrationContext.test.jsx +0 -106
- package/tests/QrSignupManagerInfoBox.test.jsx +0 -49
- package/tests/ScatterChart.test.jsx +0 -270
- package/tests/SectionNav.test.jsx +0 -363
- package/tests/SignUpPage.test.jsx +0 -208
- package/tests/SoftChip.test.jsx +0 -105
- package/tests/StatTile.test.jsx +0 -57
- package/tests/Thread.test.jsx +0 -151
- package/tests/TimeSeriesChart.test.jsx +0 -367
- package/tests/UserListComponent.test.jsx +0 -192
- package/tests/UserMenu.test.jsx +0 -171
- package/tests/apiClientLanguage.test.js +0 -33
- package/tests/apiClientPublicPaths.test.js +0 -178
- package/tests/authApiLogin.test.js +0 -42
- package/tests/authApiRegistration.test.js +0 -31
- package/tests/authErrorCodeRendering.test.jsx +0 -77
- package/tests/authErrors.test.js +0 -74
- package/tests/authTranslations.test.js +0 -74
- package/tests/chart-api-census.test.js +0 -366
- package/tests/chartAxisTickBand.test.jsx +0 -95
- package/tests/chartDefaults.test.js +0 -902
- package/tests/chartLabels.test.js +0 -50
- package/tests/chartsPalette.test.js +0 -99
- package/tests/chatApi.test.js +0 -48
- package/tests/chatDriverNames.test.jsx +0 -71
- package/tests/chatExports.test.js +0 -3
- package/tests/chatList.test.jsx +0 -84
- package/tests/chatPicker.test.jsx +0 -82
- package/tests/chatSocket.test.jsx +0 -26
- package/tests/chatThread.test.jsx +0 -116
- package/tests/chatTranslations.test.js +0 -47
- package/tests/chatWorkspace.test.jsx +0 -234
- package/tests/checkKitIntegration.test.jsx +0 -219
- package/tests/createAppTheme.test.js +0 -132
- package/tests/createAppThemeDark.test.js +0 -127
- package/tests/createAppThemeLightGuard.test.js +0 -40
- package/tests/createAppThemePageContrast.test.js +0 -108
- package/tests/createAppThemeTypography.test.js +0 -53
- package/tests/errorCallSiteGuard.test.js +0 -32
- package/tests/exportChart.test.js +0 -313
- package/tests/feedApi.test.js +0 -46
- package/tests/fixtures/light-theme-baseline.json +0 -2234
- package/tests/i18nAggregate.test.js +0 -120
- package/tests/i18nGermanVariant.test.js +0 -65
- package/tests/loginPageErrorResolution.test.jsx +0 -102
- package/tests/messagingApi.test.js +0 -32
- package/tests/messagingChunk6.test.jsx +0 -116
- package/tests/messagingCompactBubble.test.jsx +0 -64
- package/tests/messagingComposer.test.jsx +0 -136
- package/tests/messagingComposerChunk5.test.jsx +0 -113
- package/tests/messagingContractConformance.test.js +0 -69
- package/tests/messagingDirectMessageLauncher.test.jsx +0 -151
- package/tests/messagingExports.test.js +0 -21
- package/tests/messagingInteractions.test.jsx +0 -136
- package/tests/messagingLastMessagePreview.test.jsx +0 -93
- package/tests/messagingLinkify.test.jsx +0 -51
- package/tests/messagingMessageActions.test.jsx +0 -163
- package/tests/messagingMsg6.test.jsx +0 -105
- package/tests/messagingMsg6f.test.jsx +0 -155
- package/tests/messagingMsg6g.test.jsx +0 -166
- package/tests/messagingMsg6h.test.jsx +0 -136
- package/tests/messagingMsg6i.test.jsx +0 -129
- package/tests/messagingPollRendering.test.jsx +0 -142
- package/tests/messagingReactionMerge.test.jsx +0 -77
- package/tests/messagingReadTicksTooltip.test.jsx +0 -36
- package/tests/messagingThreadReceipts.test.jsx +0 -178
- package/tests/messagingThreadingQuoting.test.jsx +0 -87
- package/tests/messagingUnreadLifecycle.test.jsx +0 -78
- package/tests/notificationsApi.test.js +0 -41
- package/tests/notificationsExports.test.js +0 -34
- package/tests/onboardingDescriptors.test.js +0 -132
- package/tests/packageTreeShaking.test.js +0 -126
- package/tests/realtime.test.jsx +0 -219
- package/tests/resolveErrorText.test.js +0 -72
- package/tests/stepSelection.test.js +0 -53
- package/tests/themeCompleteness.test.js +0 -626
- package/tests/timeSeriesLegend.test.js +0 -99
- package/tests/userScreenTranslations.test.jsx +0 -218
- package/tsconfig.build.json +0 -18
- package/vite.config.mjs +0 -6
- package/work-orders/AUTH-1.md +0 -74
- package/work-orders/AUTH-2.md +0 -74
- package/work-orders/AUTH-4.md +0 -183
- package/work-orders/AUTH-5.md +0 -154
- package/work-orders/AUTH-7.md +0 -181
- package/work-orders/AUTH-8.md +0 -184
- package/work-orders/CHART-1.md +0 -285
- package/work-orders/CHART-2.md +0 -222
- package/work-orders/CHART-3.md +0 -163
- package/work-orders/CHART-4.md +0 -203
- package/work-orders/CHART-5.md +0 -226
- package/work-orders/CHART-6.md +0 -428
- package/work-orders/CHART-7.md +0 -175
- package/work-orders/DX-1.md +0 -169
- package/work-orders/DX-2.md +0 -188
- package/work-orders/DX-3.md +0 -195
- package/work-orders/I18N-1.md +0 -254
- package/work-orders/I18N-3.md +0 -207
- package/work-orders/MSG-3.md +0 -375
- package/work-orders/MSG-3b.md +0 -1002
- package/work-orders/MSG-3c.md +0 -378
- package/work-orders/MSG-3d.md +0 -268
- package/work-orders/MSG-3e.md +0 -164
- package/work-orders/MSG-3f.md +0 -391
- package/work-orders/MSG-6e.md +0 -308
- package/work-orders/MSG-6f.md +0 -214
- package/work-orders/MSG-6g.md +0 -244
- package/work-orders/MSG-6h.md +0 -238
- package/work-orders/MSG-6i.md +0 -271
- package/work-orders/MSG-6j.md +0 -117
- package/work-orders/NOTIF-12.md +0 -214
- package/work-orders/NOTIF-13.md +0 -142
- package/work-orders/NOTIF-14.md +0 -151
- package/work-orders/PRIM-1.md +0 -177
- package/work-orders/SHELL-1.md +0 -255
- package/work-orders/SHELL-2.md +0 -197
- package/work-orders/SHELL-3.md +0 -359
- package/work-orders/SHELL-4.md +0 -351
- package/work-orders/SHELL-5.md +0 -345
- package/work-orders/SHELL-6.md +0 -210
- package/work-orders/THEME-1.md +0 -587
- package/work-orders/THEME-10.md +0 -303
- package/work-orders/THEME-11.md +0 -208
- package/work-orders/THEME-2.md +0 -339
- package/work-orders/THEME-3.md +0 -210
- package/work-orders/THEME-4.md +0 -271
- package/work-orders/THEME-5.md +0 -341
- package/work-orders/THEME-6.md +0 -247
- package/work-orders/THEME-7.md +0 -82
- package/work-orders/THEME-8.md +0 -211
- package/work-orders/THEME-9.md +0 -194
- package/work-orders/UCM-AUTH-10.md +0 -490
- package/work-orders/UCM-AUTH-11.md +0 -185
- package/work-orders/UCM-AUTH-12.md +0 -98
- package/work-orders/UCM-AUTH-13.md +0 -47
- package/work-orders/UCM-AUTH-9.md +0 -207
- package/work-orders/UCM-CHART-10.md +0 -150
- package/work-orders/UCM-CHART-11.md +0 -132
- package/work-orders/UCM-CHART-12.md +0 -348
- package/work-orders/UCM-CHART-13.md +0 -122
- package/work-orders/UCM-CHART-14.md +0 -198
- package/work-orders/UCM-CHART-15.md +0 -187
- package/work-orders/UCM-CHART-16.md +0 -169
- package/work-orders/UCM-CHART-17.md +0 -195
- package/work-orders/UCM-CHART-18.md +0 -200
- package/work-orders/UCM-CHART-8.md +0 -147
- package/work-orders/UCM-CHART-9.md +0 -265
- package/work-orders/UCM-CHAT-1.md +0 -190
- package/work-orders/UCM-CHAT-2.md +0 -75
- package/work-orders/UCM-CI-1.md +0 -65
- package/work-orders/UCM-DEP-1.md +0 -63
- package/work-orders/UCM-I18N-4.md +0 -226
- package/work-orders/UCM-I18N-5.md +0 -211
- package/work-orders/UCM-MSG-20.md +0 -192
- package/work-orders/UCM-PRIM-2.md +0 -114
- package/work-orders/UCM-SHELL-7.md +0 -134
- package/work-orders/UCM-SHELL-8.md +0 -125
- package/work-orders/UCM-TEST-1.md +0 -304
- package/work-orders/UCM-THEME-13.md +0 -69
- package/work-orders/UCM-THEME-14.md +0 -312
- package/work-orders/UCM-THEME-15.md +0 -356
- package/work-orders/UCM-THEME-16.md +0 -80
- package/work-orders/UCM-THEME-17.md +0 -111
- package/work-orders/UCM-THEME-18.md +0 -184
- package/work-orders/assets/AUTH-4-user-list-card.html +0 -407
- package/work-orders/assets/PRIM-1-dashboard-primitives.html +0 -624
- package/work-orders/assets/SHELL-2-account-navigation.html +0 -1159
- package/work-orders/assets/THEME-1-baseline-reference-sheet.html +0 -1352
- package/work-orders/assets/UCM-CHAT-1-ai-chat.html +0 -447
- package/work-orders/assets/UCM-THEME-13-dark-prototype.html +0 -390
- package/work-orders/assets/UCM-THEME-17-type-scale.html +0 -391
|
@@ -1,1159 +0,0 @@
|
|
|
1
|
-
<title>SHELL-2 — AccountPage section navigation</title>
|
|
2
|
-
<style>
|
|
3
|
-
/* ============================================================
|
|
4
|
-
TOKENS
|
|
5
|
-
Two independent token layers, intentionally kept apart:
|
|
6
|
-
- --chrome-* this document's own chrome (headings, coverage
|
|
7
|
-
block, captions). Neutral, low-saturation —
|
|
8
|
-
never confused with the mockup's colours.
|
|
9
|
-
- --mui-* MUI's stock light/dark palette defaults, used
|
|
10
|
-
only inside the phone/desktop mockup frames.
|
|
11
|
-
A consuming app's real theme overrides these;
|
|
12
|
-
see the note under the lede.
|
|
13
|
-
============================================================ */
|
|
14
|
-
:root {
|
|
15
|
-
color-scheme: light dark;
|
|
16
|
-
|
|
17
|
-
--chrome-bg: #f6f7f9;
|
|
18
|
-
--chrome-surface: #ffffff;
|
|
19
|
-
--chrome-border: #e2e5eb;
|
|
20
|
-
--chrome-ink: #1a2130;
|
|
21
|
-
--chrome-ink-soft: #5c6472;
|
|
22
|
-
--chrome-ink-faint: #88909c;
|
|
23
|
-
--chrome-code-bg: #eef0f4;
|
|
24
|
-
|
|
25
|
-
--cov-covers: #1e7d34;
|
|
26
|
-
--cov-covers-bg: #eaf6ee;
|
|
27
|
-
--cov-covers-border: #bfe4c9;
|
|
28
|
-
--cov-excludes: #4b5563;
|
|
29
|
-
--cov-excludes-bg: #f1f2f5;
|
|
30
|
-
--cov-excludes-border: #dadde3;
|
|
31
|
-
--cov-explicit: #92600a;
|
|
32
|
-
--cov-explicit-bg: #fdf3e2;
|
|
33
|
-
--cov-explicit-border: #f1dcab;
|
|
34
|
-
|
|
35
|
-
--mui-bg-default: #f4f6f8;
|
|
36
|
-
--mui-bg-paper: #ffffff;
|
|
37
|
-
--mui-divider: rgba(0, 0, 0, 0.12);
|
|
38
|
-
--mui-text-primary: rgba(0, 0, 0, 0.87);
|
|
39
|
-
--mui-text-secondary: rgba(0, 0, 0, 0.6);
|
|
40
|
-
--mui-text-disabled: rgba(0, 0, 0, 0.38);
|
|
41
|
-
--mui-primary: #1976d2;
|
|
42
|
-
--mui-primary-contrast: #ffffff;
|
|
43
|
-
--mui-action-hover: rgba(0, 0, 0, 0.04);
|
|
44
|
-
--mui-action-selected: rgba(0, 0, 0, 0.08);
|
|
45
|
-
--mui-success: #2e7d32;
|
|
46
|
-
--mui-error: #d32f2f;
|
|
47
|
-
--mui-shadow-1: 0 1px 2px rgba(16, 24, 40, 0.08);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
@media (prefers-color-scheme: dark) {
|
|
51
|
-
:root {
|
|
52
|
-
--chrome-bg: #14171c;
|
|
53
|
-
--chrome-surface: #1b1f26;
|
|
54
|
-
--chrome-border: #2a2f38;
|
|
55
|
-
--chrome-ink: #eef0f3;
|
|
56
|
-
--chrome-ink-soft: #a6adba;
|
|
57
|
-
--chrome-ink-faint: #767e8c;
|
|
58
|
-
--chrome-code-bg: #22262e;
|
|
59
|
-
|
|
60
|
-
--cov-covers: #7fd196;
|
|
61
|
-
--cov-covers-bg: #16261c;
|
|
62
|
-
--cov-covers-border: #234a30;
|
|
63
|
-
--cov-excludes: #b6bcc7;
|
|
64
|
-
--cov-excludes-bg: #21242b;
|
|
65
|
-
--cov-excludes-border: #323744;
|
|
66
|
-
--cov-explicit: #f0c274;
|
|
67
|
-
--cov-explicit-bg: #2b230f;
|
|
68
|
-
--cov-explicit-border: #4a3a17;
|
|
69
|
-
|
|
70
|
-
--mui-bg-default: #121212;
|
|
71
|
-
--mui-bg-paper: #1e1e1e;
|
|
72
|
-
--mui-divider: rgba(255, 255, 255, 0.12);
|
|
73
|
-
--mui-text-primary: rgba(255, 255, 255, 0.87);
|
|
74
|
-
--mui-text-secondary: rgba(255, 255, 255, 0.7);
|
|
75
|
-
--mui-text-disabled: rgba(255, 255, 255, 0.5);
|
|
76
|
-
--mui-primary: #90caf9;
|
|
77
|
-
--mui-primary-contrast: #0a1929;
|
|
78
|
-
--mui-action-hover: rgba(255, 255, 255, 0.08);
|
|
79
|
-
--mui-action-selected: rgba(255, 255, 255, 0.16);
|
|
80
|
-
--mui-success: #66bb6a;
|
|
81
|
-
--mui-error: #f2726a;
|
|
82
|
-
--mui-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.5);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
:root[data-theme="dark"] {
|
|
87
|
-
--chrome-bg: #14171c;
|
|
88
|
-
--chrome-surface: #1b1f26;
|
|
89
|
-
--chrome-border: #2a2f38;
|
|
90
|
-
--chrome-ink: #eef0f3;
|
|
91
|
-
--chrome-ink-soft: #a6adba;
|
|
92
|
-
--chrome-ink-faint: #767e8c;
|
|
93
|
-
--chrome-code-bg: #22262e;
|
|
94
|
-
|
|
95
|
-
--cov-covers: #7fd196;
|
|
96
|
-
--cov-covers-bg: #16261c;
|
|
97
|
-
--cov-covers-border: #234a30;
|
|
98
|
-
--cov-excludes: #b6bcc7;
|
|
99
|
-
--cov-excludes-bg: #21242b;
|
|
100
|
-
--cov-excludes-border: #323744;
|
|
101
|
-
--cov-explicit: #f0c274;
|
|
102
|
-
--cov-explicit-bg: #2b230f;
|
|
103
|
-
--cov-explicit-border: #4a3a17;
|
|
104
|
-
|
|
105
|
-
--mui-bg-default: #121212;
|
|
106
|
-
--mui-bg-paper: #1e1e1e;
|
|
107
|
-
--mui-divider: rgba(255, 255, 255, 0.12);
|
|
108
|
-
--mui-text-primary: rgba(255, 255, 255, 0.87);
|
|
109
|
-
--mui-text-secondary: rgba(255, 255, 255, 0.7);
|
|
110
|
-
--mui-text-disabled: rgba(255, 255, 255, 0.5);
|
|
111
|
-
--mui-primary: #90caf9;
|
|
112
|
-
--mui-primary-contrast: #0a1929;
|
|
113
|
-
--mui-action-hover: rgba(255, 255, 255, 0.08);
|
|
114
|
-
--mui-action-selected: rgba(255, 255, 255, 0.16);
|
|
115
|
-
--mui-success: #66bb6a;
|
|
116
|
-
--mui-error: #f2726a;
|
|
117
|
-
--mui-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.5);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
:root[data-theme="light"] {
|
|
121
|
-
--chrome-bg: #f6f7f9;
|
|
122
|
-
--chrome-surface: #ffffff;
|
|
123
|
-
--chrome-border: #e2e5eb;
|
|
124
|
-
--chrome-ink: #1a2130;
|
|
125
|
-
--chrome-ink-soft: #5c6472;
|
|
126
|
-
--chrome-ink-faint: #88909c;
|
|
127
|
-
--chrome-code-bg: #eef0f4;
|
|
128
|
-
|
|
129
|
-
--cov-covers: #1e7d34;
|
|
130
|
-
--cov-covers-bg: #eaf6ee;
|
|
131
|
-
--cov-covers-border: #bfe4c9;
|
|
132
|
-
--cov-excludes: #4b5563;
|
|
133
|
-
--cov-excludes-bg: #f1f2f5;
|
|
134
|
-
--cov-excludes-border: #dadde3;
|
|
135
|
-
--cov-explicit: #92600a;
|
|
136
|
-
--cov-explicit-bg: #fdf3e2;
|
|
137
|
-
--cov-explicit-border: #f1dcab;
|
|
138
|
-
|
|
139
|
-
--mui-bg-default: #f4f6f8;
|
|
140
|
-
--mui-bg-paper: #ffffff;
|
|
141
|
-
--mui-divider: rgba(0, 0, 0, 0.12);
|
|
142
|
-
--mui-text-primary: rgba(0, 0, 0, 0.87);
|
|
143
|
-
--mui-text-secondary: rgba(0, 0, 0, 0.6);
|
|
144
|
-
--mui-text-disabled: rgba(0, 0, 0, 0.38);
|
|
145
|
-
--mui-primary: #1976d2;
|
|
146
|
-
--mui-primary-contrast: #ffffff;
|
|
147
|
-
--mui-action-hover: rgba(0, 0, 0, 0.04);
|
|
148
|
-
--mui-action-selected: rgba(0, 0, 0, 0.08);
|
|
149
|
-
--mui-success: #2e7d32;
|
|
150
|
-
--mui-error: #d32f2f;
|
|
151
|
-
--mui-shadow-1: 0 1px 2px rgba(16, 24, 40, 0.08);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
* { box-sizing: border-box; }
|
|
155
|
-
|
|
156
|
-
body, .doc {
|
|
157
|
-
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
.doc {
|
|
161
|
-
max-width: 1240px;
|
|
162
|
-
margin: 0 auto;
|
|
163
|
-
padding: 40px 28px 96px;
|
|
164
|
-
color: var(--chrome-ink);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
code, .mono {
|
|
168
|
-
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
|
|
169
|
-
font-size: 0.86em;
|
|
170
|
-
background: var(--chrome-code-bg);
|
|
171
|
-
padding: 0.1em 0.4em;
|
|
172
|
-
border-radius: 4px;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
.tabular { font-variant-numeric: tabular-nums; }
|
|
176
|
-
|
|
177
|
-
/* ---------- header ---------- */
|
|
178
|
-
.doc-head { margin-bottom: 32px; }
|
|
179
|
-
.doc-head .wo-id {
|
|
180
|
-
font-size: 13px;
|
|
181
|
-
color: var(--chrome-ink-faint);
|
|
182
|
-
margin: 0 0 6px;
|
|
183
|
-
}
|
|
184
|
-
h1 {
|
|
185
|
-
font-size: 28px;
|
|
186
|
-
line-height: 1.25;
|
|
187
|
-
font-weight: 700;
|
|
188
|
-
margin: 0 0 10px;
|
|
189
|
-
text-wrap: balance;
|
|
190
|
-
letter-spacing: -0.01em;
|
|
191
|
-
}
|
|
192
|
-
.lede {
|
|
193
|
-
font-size: 15.5px;
|
|
194
|
-
line-height: 1.6;
|
|
195
|
-
color: var(--chrome-ink-soft);
|
|
196
|
-
max-width: 760px;
|
|
197
|
-
margin: 0 0 14px;
|
|
198
|
-
}
|
|
199
|
-
.token-note {
|
|
200
|
-
font-size: 13px;
|
|
201
|
-
line-height: 1.6;
|
|
202
|
-
color: var(--chrome-ink-faint);
|
|
203
|
-
max-width: 760px;
|
|
204
|
-
margin: 0;
|
|
205
|
-
padding: 10px 14px;
|
|
206
|
-
border-left: 2px solid var(--chrome-border);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
h2.section-title {
|
|
210
|
-
font-size: 12.5px;
|
|
211
|
-
font-weight: 700;
|
|
212
|
-
text-transform: uppercase;
|
|
213
|
-
letter-spacing: 0.04em;
|
|
214
|
-
color: var(--chrome-ink-faint);
|
|
215
|
-
margin: 0 0 14px;
|
|
216
|
-
padding-bottom: 10px;
|
|
217
|
-
border-bottom: 1px solid var(--chrome-border);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
section.block { margin: 40px 0; }
|
|
221
|
-
|
|
222
|
-
/* ---------- coverage ---------- */
|
|
223
|
-
.coverage-grid {
|
|
224
|
-
display: grid;
|
|
225
|
-
grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
|
|
226
|
-
gap: 14px;
|
|
227
|
-
}
|
|
228
|
-
.cov {
|
|
229
|
-
border-radius: 8px;
|
|
230
|
-
border: 1px solid;
|
|
231
|
-
padding: 14px 16px;
|
|
232
|
-
}
|
|
233
|
-
.cov h3 {
|
|
234
|
-
margin: 0 0 6px;
|
|
235
|
-
font-size: 13px;
|
|
236
|
-
font-weight: 700;
|
|
237
|
-
}
|
|
238
|
-
.cov p, .cov ul {
|
|
239
|
-
margin: 0;
|
|
240
|
-
font-size: 13.5px;
|
|
241
|
-
line-height: 1.55;
|
|
242
|
-
}
|
|
243
|
-
.cov ul { padding-left: 18px; }
|
|
244
|
-
.cov li { margin-bottom: 4px; }
|
|
245
|
-
.cov-covers { background: var(--cov-covers-bg); border-color: var(--cov-covers-border); }
|
|
246
|
-
.cov-covers h3 { color: var(--cov-covers); }
|
|
247
|
-
.cov-excludes { background: var(--cov-excludes-bg); border-color: var(--cov-excludes-border); }
|
|
248
|
-
.cov-excludes h3 { color: var(--cov-excludes); }
|
|
249
|
-
.cov-explicit { background: var(--cov-explicit-bg); border-color: var(--cov-explicit-border); }
|
|
250
|
-
.cov-explicit h3 { color: var(--cov-explicit); }
|
|
251
|
-
.cov p code, .cov li code { background: rgba(127,127,127,0.16); }
|
|
252
|
-
|
|
253
|
-
/* ---------- trigger-problem note ---------- */
|
|
254
|
-
.problem-note {
|
|
255
|
-
display: grid;
|
|
256
|
-
grid-template-columns: minmax(0, 1fr);
|
|
257
|
-
gap: 10px;
|
|
258
|
-
max-width: 780px;
|
|
259
|
-
}
|
|
260
|
-
.problem-note p {
|
|
261
|
-
margin: 0;
|
|
262
|
-
font-size: 14.5px;
|
|
263
|
-
line-height: 1.65;
|
|
264
|
-
color: var(--chrome-ink);
|
|
265
|
-
}
|
|
266
|
-
.problem-note p.soft { color: var(--chrome-ink-soft); }
|
|
267
|
-
.problem-note .resolved {
|
|
268
|
-
margin-top: 4px;
|
|
269
|
-
font-size: 13px;
|
|
270
|
-
color: var(--chrome-ink-faint);
|
|
271
|
-
border-left: 2px solid var(--chrome-border);
|
|
272
|
-
padding: 8px 14px;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/* ---------- panel scaffolding ---------- */
|
|
276
|
-
.panels-row {
|
|
277
|
-
display: flex;
|
|
278
|
-
align-items: flex-start;
|
|
279
|
-
gap: 28px;
|
|
280
|
-
overflow-x: auto;
|
|
281
|
-
padding: 4px 4px 16px;
|
|
282
|
-
margin: 0 -4px;
|
|
283
|
-
}
|
|
284
|
-
.panels-row.wrap { flex-wrap: wrap; }
|
|
285
|
-
|
|
286
|
-
.panel { flex: 0 0 auto; }
|
|
287
|
-
.panel-label {
|
|
288
|
-
display: flex;
|
|
289
|
-
align-items: baseline;
|
|
290
|
-
gap: 8px;
|
|
291
|
-
margin-bottom: 10px;
|
|
292
|
-
}
|
|
293
|
-
.panel-num {
|
|
294
|
-
font-size: 11px;
|
|
295
|
-
font-weight: 700;
|
|
296
|
-
color: var(--chrome-surface);
|
|
297
|
-
background: var(--chrome-ink-faint);
|
|
298
|
-
border-radius: 999px;
|
|
299
|
-
width: 18px;
|
|
300
|
-
height: 18px;
|
|
301
|
-
display: inline-flex;
|
|
302
|
-
align-items: center;
|
|
303
|
-
justify-content: center;
|
|
304
|
-
flex: none;
|
|
305
|
-
}
|
|
306
|
-
.panel-title { font-size: 14px; font-weight: 700; }
|
|
307
|
-
.panel-sub { font-size: 12px; color: var(--chrome-ink-faint); margin: 2px 0 0 26px; }
|
|
308
|
-
|
|
309
|
-
.frame {
|
|
310
|
-
background: var(--mui-bg-default);
|
|
311
|
-
border: 1px solid var(--chrome-border);
|
|
312
|
-
border-radius: 10px;
|
|
313
|
-
box-shadow: var(--mui-shadow-1);
|
|
314
|
-
overflow: hidden;
|
|
315
|
-
}
|
|
316
|
-
.frame-inner { padding: 20px; }
|
|
317
|
-
|
|
318
|
-
/* ============================================================
|
|
319
|
-
MUI-ish primitives used inside the frames
|
|
320
|
-
============================================================ */
|
|
321
|
-
.m-paper {
|
|
322
|
-
background: var(--mui-bg-paper);
|
|
323
|
-
border: 1px solid var(--mui-divider);
|
|
324
|
-
border-radius: 4px;
|
|
325
|
-
}
|
|
326
|
-
.m-text-primary { color: var(--mui-text-primary); }
|
|
327
|
-
.m-text-secondary { color: var(--mui-text-secondary); font-size: 13px; }
|
|
328
|
-
|
|
329
|
-
.m-group-head {
|
|
330
|
-
padding: 12px 16px;
|
|
331
|
-
border-bottom: 1px solid var(--mui-divider);
|
|
332
|
-
font-size: 13px;
|
|
333
|
-
font-weight: 700;
|
|
334
|
-
color: var(--mui-text-primary);
|
|
335
|
-
}
|
|
336
|
-
.m-list { list-style: none; margin: 0; padding: 4px 0; }
|
|
337
|
-
.m-item {
|
|
338
|
-
display: flex;
|
|
339
|
-
flex-direction: column;
|
|
340
|
-
justify-content: center;
|
|
341
|
-
gap: 1px;
|
|
342
|
-
width: 100%;
|
|
343
|
-
text-align: left;
|
|
344
|
-
background: none;
|
|
345
|
-
border: none;
|
|
346
|
-
border-left: 3px solid transparent;
|
|
347
|
-
padding: 10px 16px 10px 13px;
|
|
348
|
-
min-height: 48px;
|
|
349
|
-
font-size: 14.5px;
|
|
350
|
-
color: var(--mui-text-primary);
|
|
351
|
-
cursor: pointer;
|
|
352
|
-
font-family: inherit;
|
|
353
|
-
}
|
|
354
|
-
.m-item:hover { background: var(--mui-action-hover); }
|
|
355
|
-
.m-item .item-hint { font-size: 11.5px; color: var(--mui-text-secondary); }
|
|
356
|
-
.m-item.is-selected {
|
|
357
|
-
background: var(--mui-action-selected);
|
|
358
|
-
border-left-color: var(--mui-primary);
|
|
359
|
-
color: var(--mui-primary);
|
|
360
|
-
font-weight: 600;
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
/* desktop grid */
|
|
364
|
-
.desktop-grid {
|
|
365
|
-
display: grid;
|
|
366
|
-
grid-template-columns: 280px minmax(0, 1fr);
|
|
367
|
-
gap: 32px;
|
|
368
|
-
align-items: start;
|
|
369
|
-
}
|
|
370
|
-
.desktop-nav { position: sticky; top: 16px; display: flex; flex-direction: column; gap: 16px; }
|
|
371
|
-
.desktop-content { min-width: 0; }
|
|
372
|
-
|
|
373
|
-
.content-heading {
|
|
374
|
-
font-size: 20px;
|
|
375
|
-
font-weight: 600;
|
|
376
|
-
color: var(--mui-text-primary);
|
|
377
|
-
margin: 0 0 4px;
|
|
378
|
-
}
|
|
379
|
-
.content-caption {
|
|
380
|
-
font-size: 13px;
|
|
381
|
-
color: var(--mui-text-secondary);
|
|
382
|
-
margin: 0 0 16px;
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
/* search field */
|
|
386
|
-
.m-search {
|
|
387
|
-
display: inline-flex;
|
|
388
|
-
align-items: center;
|
|
389
|
-
gap: 8px;
|
|
390
|
-
height: 40px;
|
|
391
|
-
padding: 0 12px;
|
|
392
|
-
border: 1px solid var(--mui-divider);
|
|
393
|
-
border-radius: 4px;
|
|
394
|
-
color: var(--mui-text-secondary);
|
|
395
|
-
font-size: 13.5px;
|
|
396
|
-
max-width: 280px;
|
|
397
|
-
margin-bottom: 16px;
|
|
398
|
-
background: var(--mui-bg-paper);
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
/* table */
|
|
402
|
-
.table-scroll { overflow-x: auto; border: 1px solid var(--mui-divider); border-radius: 4px; }
|
|
403
|
-
table.m-table { border-collapse: collapse; width: 100%; min-width: 1020px; }
|
|
404
|
-
table.m-table th {
|
|
405
|
-
text-align: left;
|
|
406
|
-
font-size: 12.5px;
|
|
407
|
-
font-weight: 700;
|
|
408
|
-
color: var(--mui-text-primary);
|
|
409
|
-
background: var(--mui-action-hover);
|
|
410
|
-
padding: 10px 16px;
|
|
411
|
-
white-space: nowrap;
|
|
412
|
-
border-bottom: 1px solid var(--mui-divider);
|
|
413
|
-
}
|
|
414
|
-
table.m-table td {
|
|
415
|
-
padding: 10px 16px;
|
|
416
|
-
font-size: 13.5px;
|
|
417
|
-
color: var(--mui-text-primary);
|
|
418
|
-
border-bottom: 1px solid var(--mui-divider);
|
|
419
|
-
vertical-align: top;
|
|
420
|
-
}
|
|
421
|
-
table.m-table tr:last-child td { border-bottom: none; }
|
|
422
|
-
table.m-table tr:hover td { background: var(--mui-action-hover); }
|
|
423
|
-
.col-email { min-width: 220px; }
|
|
424
|
-
.col-name { min-width: 180px; }
|
|
425
|
-
.col-new { min-width: 90px; text-align: center; }
|
|
426
|
-
.col-login { min-width: 120px; text-align: center; }
|
|
427
|
-
.col-role { min-width: 180px; }
|
|
428
|
-
.col-actions { min-width: 220px; }
|
|
429
|
-
|
|
430
|
-
.status-icon { display: inline-flex; }
|
|
431
|
-
.status-icon.yes { color: var(--mui-success); }
|
|
432
|
-
.status-icon.no { color: var(--mui-text-disabled); }
|
|
433
|
-
|
|
434
|
-
.m-select {
|
|
435
|
-
display: inline-flex;
|
|
436
|
-
align-items: center;
|
|
437
|
-
justify-content: space-between;
|
|
438
|
-
gap: 8px;
|
|
439
|
-
height: 32px;
|
|
440
|
-
padding: 0 10px;
|
|
441
|
-
border: 1px solid var(--mui-divider);
|
|
442
|
-
border-radius: 4px;
|
|
443
|
-
font-size: 13px;
|
|
444
|
-
color: var(--mui-text-primary);
|
|
445
|
-
min-width: 140px;
|
|
446
|
-
background: var(--mui-bg-paper);
|
|
447
|
-
}
|
|
448
|
-
.m-select svg { color: var(--mui-text-secondary); }
|
|
449
|
-
|
|
450
|
-
.m-icon-btn {
|
|
451
|
-
display: inline-flex;
|
|
452
|
-
align-items: center;
|
|
453
|
-
justify-content: center;
|
|
454
|
-
width: 32px;
|
|
455
|
-
height: 32px;
|
|
456
|
-
border-radius: 4px;
|
|
457
|
-
border: 1px solid var(--mui-divider);
|
|
458
|
-
background: var(--mui-bg-paper);
|
|
459
|
-
color: var(--mui-text-secondary);
|
|
460
|
-
cursor: pointer;
|
|
461
|
-
}
|
|
462
|
-
.m-icon-btn.danger { color: var(--mui-error); }
|
|
463
|
-
.m-icon-btn:hover { background: var(--mui-action-hover); }
|
|
464
|
-
.row-actions { display: flex; gap: 8px; }
|
|
465
|
-
|
|
466
|
-
/* card list (mobile users) */
|
|
467
|
-
.card-list { display: flex; flex-direction: column; gap: 12px; }
|
|
468
|
-
.user-card {
|
|
469
|
-
padding: 14px 14px 12px;
|
|
470
|
-
position: relative;
|
|
471
|
-
}
|
|
472
|
-
.user-card-top { display: flex; justify-content: space-between; gap: 8px; align-items: flex-start; }
|
|
473
|
-
.user-card-name { font-size: 15px; font-weight: 600; color: var(--mui-text-primary); margin: 0; }
|
|
474
|
-
.user-card-email { font-size: 12.5px; color: var(--mui-text-secondary); margin: 2px 0 0; word-break: break-all; }
|
|
475
|
-
.chip-new {
|
|
476
|
-
flex: none;
|
|
477
|
-
font-size: 11px;
|
|
478
|
-
font-weight: 700;
|
|
479
|
-
color: var(--mui-primary-contrast);
|
|
480
|
-
background: var(--mui-primary);
|
|
481
|
-
border-radius: 999px;
|
|
482
|
-
padding: 3px 9px;
|
|
483
|
-
line-height: 1.4;
|
|
484
|
-
}
|
|
485
|
-
.user-card-meta {
|
|
486
|
-
display: flex;
|
|
487
|
-
flex-wrap: wrap;
|
|
488
|
-
gap: 6px 18px;
|
|
489
|
-
margin-top: 10px;
|
|
490
|
-
padding-top: 10px;
|
|
491
|
-
border-top: 1px solid var(--mui-divider);
|
|
492
|
-
}
|
|
493
|
-
.meta-item { display: flex; flex-direction: column; gap: 1px; min-width: 96px; }
|
|
494
|
-
.meta-item .meta-label { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--mui-text-secondary); }
|
|
495
|
-
.meta-item .meta-value { font-size: 13px; color: var(--mui-text-primary); }
|
|
496
|
-
.user-card-actions {
|
|
497
|
-
display: flex;
|
|
498
|
-
justify-content: flex-end;
|
|
499
|
-
gap: 8px;
|
|
500
|
-
margin-top: 10px;
|
|
501
|
-
}
|
|
502
|
-
.m-icon-btn.touch { width: 44px; height: 44px; border-radius: 8px; }
|
|
503
|
-
.list-caption { font-size: 12.5px; color: var(--mui-text-secondary); margin: 0 0 10px; }
|
|
504
|
-
|
|
505
|
-
/* ---------- mobile phone frame ---------- */
|
|
506
|
-
.phone {
|
|
507
|
-
width: 375px;
|
|
508
|
-
}
|
|
509
|
-
.phone .frame {
|
|
510
|
-
height: 620px;
|
|
511
|
-
position: relative;
|
|
512
|
-
display: flex;
|
|
513
|
-
flex-direction: column;
|
|
514
|
-
}
|
|
515
|
-
.phone .frame-scroll {
|
|
516
|
-
flex: 1;
|
|
517
|
-
min-height: 0;
|
|
518
|
-
overflow-y: auto;
|
|
519
|
-
padding: 16px;
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
/* mobile trigger */
|
|
523
|
-
.section-trigger {
|
|
524
|
-
width: 100%;
|
|
525
|
-
display: flex;
|
|
526
|
-
align-items: center;
|
|
527
|
-
justify-content: space-between;
|
|
528
|
-
gap: 10px;
|
|
529
|
-
min-height: 56px;
|
|
530
|
-
padding: 8px 14px;
|
|
531
|
-
background: var(--mui-bg-paper);
|
|
532
|
-
border: 1px solid var(--mui-divider);
|
|
533
|
-
border-radius: 8px;
|
|
534
|
-
cursor: pointer;
|
|
535
|
-
font-family: inherit;
|
|
536
|
-
margin-bottom: 16px;
|
|
537
|
-
box-shadow: var(--mui-shadow-1);
|
|
538
|
-
}
|
|
539
|
-
.section-trigger:hover { background: var(--mui-action-hover); }
|
|
540
|
-
.section-trigger:focus-visible {
|
|
541
|
-
outline: 2px solid var(--mui-primary);
|
|
542
|
-
outline-offset: 2px;
|
|
543
|
-
}
|
|
544
|
-
.trigger-text { display: flex; flex-direction: column; gap: 1px; text-align: left; }
|
|
545
|
-
.trigger-eyebrow { font-size: 11.5px; color: var(--mui-text-secondary); }
|
|
546
|
-
.trigger-value { font-size: 16.5px; font-weight: 600; color: var(--mui-text-primary); }
|
|
547
|
-
.trigger-chevron { color: var(--mui-text-secondary); transition: transform 0.18s ease; flex: none; }
|
|
548
|
-
.section-trigger[aria-expanded="true"] .trigger-chevron { transform: rotate(180deg); }
|
|
549
|
-
|
|
550
|
-
.demo-flag {
|
|
551
|
-
font-size: 11px;
|
|
552
|
-
color: var(--chrome-ink-faint);
|
|
553
|
-
text-align: center;
|
|
554
|
-
margin-top: 8px;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
/* drawer overlay confined to the phone frame */
|
|
558
|
-
.scrim {
|
|
559
|
-
position: absolute;
|
|
560
|
-
inset: 0;
|
|
561
|
-
background: rgba(0, 0, 0, 0.5);
|
|
562
|
-
opacity: 0;
|
|
563
|
-
pointer-events: none;
|
|
564
|
-
transition: opacity 0.2s ease;
|
|
565
|
-
}
|
|
566
|
-
.scrim.open { opacity: 1; pointer-events: auto; }
|
|
567
|
-
|
|
568
|
-
.sheet {
|
|
569
|
-
position: absolute;
|
|
570
|
-
left: 0;
|
|
571
|
-
right: 0;
|
|
572
|
-
bottom: 0;
|
|
573
|
-
max-height: 78%;
|
|
574
|
-
background: var(--mui-bg-paper);
|
|
575
|
-
border-top-left-radius: 18px;
|
|
576
|
-
border-top-right-radius: 18px;
|
|
577
|
-
box-shadow: 0 -4px 24px rgba(16, 24, 40, 0.24);
|
|
578
|
-
padding: 18px 16px calc(16px + 0px);
|
|
579
|
-
transform: translateY(102%);
|
|
580
|
-
transition: transform 0.22s ease;
|
|
581
|
-
display: flex;
|
|
582
|
-
flex-direction: column;
|
|
583
|
-
gap: 14px;
|
|
584
|
-
}
|
|
585
|
-
.sheet.open { transform: translateY(0); }
|
|
586
|
-
.sheet-head { display: flex; align-items: center; justify-content: space-between; flex: none; }
|
|
587
|
-
.sheet-head h3 { margin: 0; font-size: 17px; font-weight: 600; color: var(--mui-text-primary); }
|
|
588
|
-
.sheet-close {
|
|
589
|
-
width: 44px; height: 44px;
|
|
590
|
-
display: inline-flex; align-items: center; justify-content: center;
|
|
591
|
-
border-radius: 8px; border: none; background: transparent; color: var(--mui-text-secondary); cursor: pointer;
|
|
592
|
-
}
|
|
593
|
-
.sheet-close:hover { background: var(--mui-action-hover); }
|
|
594
|
-
.sheet-scroll { overflow-y: auto; display: flex; flex-direction: column; gap: 12px; }
|
|
595
|
-
.sheet .m-item { min-height: 48px; }
|
|
596
|
-
|
|
597
|
-
/* always-open reference sheet (panel 3) */
|
|
598
|
-
.sheet-static {
|
|
599
|
-
position: absolute; left: 0; right: 0; bottom: 0;
|
|
600
|
-
max-height: 78%;
|
|
601
|
-
background: var(--mui-bg-paper);
|
|
602
|
-
border-top-left-radius: 18px;
|
|
603
|
-
border-top-right-radius: 18px;
|
|
604
|
-
box-shadow: 0 -4px 24px rgba(16, 24, 40, 0.24);
|
|
605
|
-
padding: 18px 16px 16px;
|
|
606
|
-
display: flex; flex-direction: column; gap: 14px;
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
.content-behind {
|
|
610
|
-
filter: blur(1.5px);
|
|
611
|
-
opacity: 0.55;
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
/* ---------- compact inset (panel 4) ---------- */
|
|
615
|
-
.inset {
|
|
616
|
-
width: 300px;
|
|
617
|
-
}
|
|
618
|
-
.inset .frame-inner { padding: 16px; }
|
|
619
|
-
.inset .m-list { padding: 4px 0; }
|
|
620
|
-
|
|
621
|
-
footer.doc-foot {
|
|
622
|
-
margin-top: 56px;
|
|
623
|
-
padding-top: 20px;
|
|
624
|
-
border-top: 1px solid var(--chrome-border);
|
|
625
|
-
font-size: 12.5px;
|
|
626
|
-
color: var(--chrome-ink-faint);
|
|
627
|
-
line-height: 1.7;
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
@media (prefers-reduced-motion: reduce) {
|
|
631
|
-
.sheet, .scrim, .trigger-chevron { transition: none !important; }
|
|
632
|
-
}
|
|
633
|
-
</style>
|
|
634
|
-
|
|
635
|
-
<div class="doc">
|
|
636
|
-
|
|
637
|
-
<header class="doc-head">
|
|
638
|
-
<p class="wo-id">SHELL-2 prototype · ui-core-micha · visual/UX spec, no behaviour change</p>
|
|
639
|
-
<h1>AccountPage: from a horizontal tab strip to a grouped sidebar + mobile drawer</h1>
|
|
640
|
-
<p class="lede">
|
|
641
|
-
<code>AccountPage</code> currently renders its sections (Profil, Sicherheit, Benutzer, Einladen, Support,
|
|
642
|
-
plus whatever a consuming app injects via <code>extraTabs</code>) behind a horizontally scrollable MUI
|
|
643
|
-
<code>Tabs</code> strip. This prototype replaces it with the grouped-list navigation pattern already
|
|
644
|
-
shipping in jg-ferien’s <code>EventInfoPage</code>: a sticky sidebar on desktop, a bottom-sheet
|
|
645
|
-
drawer on mobile — and, because <code>AccountPage</code> has no header of its own to hang a trigger
|
|
646
|
-
button on, a new full-width trigger bar built for this component specifically.
|
|
647
|
-
</p>
|
|
648
|
-
<p class="token-note">
|
|
649
|
-
Colour and spacing tokens below are MUI’s stock light/dark defaults (primary <code>#1976d2</code> /
|
|
650
|
-
<code>#90caf9</code>, default divider and text-alpha values), used only as placeholders inside the mockup
|
|
651
|
-
frames. <code>ui-core-micha</code> ships to 14 apps with 14 different themes — the host app’s
|
|
652
|
-
<code>ThemeProvider</code> supplies the real values at runtime, exactly as it does for every other shared
|
|
653
|
-
component today.
|
|
654
|
-
</p>
|
|
655
|
-
</header>
|
|
656
|
-
|
|
657
|
-
<section class="block" aria-label="Coverage">
|
|
658
|
-
<h2 class="section-title">Coverage</h2>
|
|
659
|
-
<div class="coverage-grid">
|
|
660
|
-
<div class="cov cov-covers">
|
|
661
|
-
<h3>Covers</h3>
|
|
662
|
-
<ul>
|
|
663
|
-
<li><code>AccountPage</code>’s section navigation: desktop sidebar, mobile drawer, and the new
|
|
664
|
-
mobile trigger bar.</li>
|
|
665
|
-
<li>The <code>users</code> section’s table → card switch below <code>md</code>.</li>
|
|
666
|
-
</ul>
|
|
667
|
-
</div>
|
|
668
|
-
<div class="cov cov-excludes">
|
|
669
|
-
<h3>Does not cover — left untouched</h3>
|
|
670
|
-
<ul>
|
|
671
|
-
<li>The internal content of Profil, Sicherheit, Einladen, Support and Benachrichtigungen.</li>
|
|
672
|
-
<li>The invite / access-code / QR management components.</li>
|
|
673
|
-
<li>Anything outside <code>AccountPage</code>.</li>
|
|
674
|
-
</ul>
|
|
675
|
-
</div>
|
|
676
|
-
<div class="cov cov-explicit">
|
|
677
|
-
<h3>Explicit</h3>
|
|
678
|
-
<p>
|
|
679
|
-
The horizontal MUI <code>Tab</code> strip is <strong>replaced</strong> on both desktop and mobile.
|
|
680
|
-
It is meant to disappear entirely — that is not an omission in this prototype, it is the point
|
|
681
|
-
of the redesign.
|
|
682
|
-
</p>
|
|
683
|
-
<p>
|
|
684
|
-
On mobile, the current section name is carried by the trigger bar alone. The section-title heading
|
|
685
|
-
that would otherwise repeat it just below is <strong>removed</strong>, not merely undrawn —
|
|
686
|
-
do not add it back as a “missing” heading. Desktop keeps its section heading unchanged,
|
|
687
|
-
since desktop has no trigger bar to carry that name instead.
|
|
688
|
-
</p>
|
|
689
|
-
</div>
|
|
690
|
-
</div>
|
|
691
|
-
</section>
|
|
692
|
-
|
|
693
|
-
<section class="block">
|
|
694
|
-
<h2 class="section-title">The mobile trigger problem</h2>
|
|
695
|
-
<div class="problem-note">
|
|
696
|
-
<p>
|
|
697
|
-
jg-ferien’s drawer is opened from a button that lives in <em>that app’s</em> own page header
|
|
698
|
-
(<code>MobileSectionHeaderBar</code>). <code>AccountPage</code> is a bare content component — every
|
|
699
|
-
consuming app mounts it under its own header, and it cannot assume that header exists, has room for a
|
|
700
|
-
button, or is even visible when scrolled. The trigger has to live inside <code>AccountPage</code>’s
|
|
701
|
-
own content, at the very top, before anything else.
|
|
702
|
-
</p>
|
|
703
|
-
<p>
|
|
704
|
-
Panel 2 below shows the answer: a full-width bar, the first thing rendered on mobile, stating the
|
|
705
|
-
current section name at 16.5px semibold with a small “Bereich” label above it for context, and
|
|
706
|
-
a trailing chevron that is the conventional “tap to open a sheet” affordance. The whole 56px-tall
|
|
707
|
-
bar is the tap target (well over the 44px minimum), bordered and shadowed like a raised control so it reads
|
|
708
|
-
as tappable at a glance, not as a static heading.
|
|
709
|
-
</p>
|
|
710
|
-
<p class="resolved">
|
|
711
|
-
Try it: the trigger in panel 2 actually opens/closes its drawer. Panel 3 is a separate, permanently-open
|
|
712
|
-
frame kept alongside it purely for side-by-side comparison.
|
|
713
|
-
</p>
|
|
714
|
-
</div>
|
|
715
|
-
</section>
|
|
716
|
-
|
|
717
|
-
<section class="block">
|
|
718
|
-
<h2 class="section-title">States</h2>
|
|
719
|
-
|
|
720
|
-
<div class="panels-row wrap">
|
|
721
|
-
|
|
722
|
-
<!-- ================= PANEL 1: DESKTOP ================= -->
|
|
723
|
-
<div class="panel" style="width: 1000px;">
|
|
724
|
-
<div class="panel-label">
|
|
725
|
-
<span class="panel-num">1</span>
|
|
726
|
-
<span class="panel-title">Desktop ≥ 900px — Benutzer active</span>
|
|
727
|
-
</div>
|
|
728
|
-
<p class="panel-sub">280px sidebar, sticky · content grid <code>minmax(0,1fr)</code></p>
|
|
729
|
-
<div class="frame">
|
|
730
|
-
<div class="frame-inner">
|
|
731
|
-
<p class="content-caption" style="margin-bottom:16px; font-style:italic;">
|
|
732
|
-
jg-ferien’s pattern has a standalone “Übersicht” entry above the groups.
|
|
733
|
-
AccountPage has no equivalent landing/overview page, so this prototype starts directly at the
|
|
734
|
-
first group — nothing was dropped, there was nothing there to keep.
|
|
735
|
-
</p>
|
|
736
|
-
<div class="desktop-grid">
|
|
737
|
-
<nav class="desktop-nav" aria-label="Account sections">
|
|
738
|
-
<div class="m-paper">
|
|
739
|
-
<div class="m-group-head">Mein Konto</div>
|
|
740
|
-
<ul class="m-list">
|
|
741
|
-
<li><button class="m-item">Profil</button></li>
|
|
742
|
-
<li><button class="m-item">Sicherheit</button></li>
|
|
743
|
-
</ul>
|
|
744
|
-
</div>
|
|
745
|
-
<div class="m-paper">
|
|
746
|
-
<div class="m-group-head">Verwaltung</div>
|
|
747
|
-
<ul class="m-list">
|
|
748
|
-
<li><button class="m-item is-selected" aria-current="true">Benutzer</button></li>
|
|
749
|
-
<li><button class="m-item">Einladen</button></li>
|
|
750
|
-
</ul>
|
|
751
|
-
</div>
|
|
752
|
-
<div class="m-paper">
|
|
753
|
-
<div class="m-group-head">Hilfe</div>
|
|
754
|
-
<ul class="m-list">
|
|
755
|
-
<li><button class="m-item">Support</button></li>
|
|
756
|
-
</ul>
|
|
757
|
-
</div>
|
|
758
|
-
<div class="m-paper">
|
|
759
|
-
<div class="m-group-head">Weitere</div>
|
|
760
|
-
<ul class="m-list">
|
|
761
|
-
<li><button class="m-item">Benachrichtigungen</button></li>
|
|
762
|
-
</ul>
|
|
763
|
-
</div>
|
|
764
|
-
</nav>
|
|
765
|
-
|
|
766
|
-
<div class="desktop-content">
|
|
767
|
-
<h3 class="content-heading">Benutzer</h3>
|
|
768
|
-
<p class="content-caption">5 Ergebnisse</p>
|
|
769
|
-
<div class="m-search">Suchen…</div>
|
|
770
|
-
<div class="table-scroll">
|
|
771
|
-
<table class="m-table">
|
|
772
|
-
<thead>
|
|
773
|
-
<tr>
|
|
774
|
-
<th class="col-email">E-Mail-Adresse</th>
|
|
775
|
-
<th class="col-name">Name</th>
|
|
776
|
-
<th class="col-new">Neu</th>
|
|
777
|
-
<th class="col-login">Letzte Anmeldung</th>
|
|
778
|
-
<th class="col-role">Rolle</th>
|
|
779
|
-
<th class="col-actions">Aktionen</th>
|
|
780
|
-
</tr>
|
|
781
|
-
</thead>
|
|
782
|
-
<tbody>
|
|
783
|
-
<tr>
|
|
784
|
-
<td class="col-email">selina.amrein@swisstph.ch</td>
|
|
785
|
-
<td class="col-name">Selina Amrein</td>
|
|
786
|
-
<td class="col-new">
|
|
787
|
-
<span class="status-icon yes" title="Neu">●</span>
|
|
788
|
-
</td>
|
|
789
|
-
<td class="col-login tabular">07.08.2026, 14:22</td>
|
|
790
|
-
<td class="col-role">
|
|
791
|
-
<span class="m-select">admin <svg width="14" height="14" viewBox="0 0 24 24"><path d="M7 10l5 5 5-5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
792
|
-
</td>
|
|
793
|
-
<td class="col-actions">
|
|
794
|
-
<div class="row-actions">
|
|
795
|
-
<span class="m-icon-btn" title="Bearbeiten" aria-label="Benutzer bearbeiten">✎</span>
|
|
796
|
-
<span class="m-icon-btn danger" title="Löschen" aria-label="Benutzer löschen">🗑</span>
|
|
797
|
-
</div>
|
|
798
|
-
</td>
|
|
799
|
-
</tr>
|
|
800
|
-
<tr>
|
|
801
|
-
<td class="col-email">thabo.ndlovu@swisstph.ch</td>
|
|
802
|
-
<td class="col-name">Thabo Ndlovu</td>
|
|
803
|
-
<td class="col-new">
|
|
804
|
-
<span class="status-icon no" title="Nicht neu">○</span>
|
|
805
|
-
</td>
|
|
806
|
-
<td class="col-login tabular">05.08.2026, 09:10</td>
|
|
807
|
-
<td class="col-role">
|
|
808
|
-
<span class="m-select">teacher <svg width="14" height="14" viewBox="0 0 24 24"><path d="M7 10l5 5 5-5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
809
|
-
</td>
|
|
810
|
-
<td class="col-actions">
|
|
811
|
-
<div class="row-actions">
|
|
812
|
-
<span class="m-icon-btn" title="Bearbeiten" aria-label="Benutzer bearbeiten">✎</span>
|
|
813
|
-
<span class="m-icon-btn danger" title="Löschen" aria-label="Benutzer löschen">🗑</span>
|
|
814
|
-
</div>
|
|
815
|
-
</td>
|
|
816
|
-
</tr>
|
|
817
|
-
<tr>
|
|
818
|
-
<td class="col-email">fatima.elidrissi@swisstph.ch</td>
|
|
819
|
-
<td class="col-name">Fatima El Idrissi</td>
|
|
820
|
-
<td class="col-new">
|
|
821
|
-
<span class="status-icon no" title="Nicht neu">○</span>
|
|
822
|
-
</td>
|
|
823
|
-
<td class="col-login tabular">28.07.2026, 16:45</td>
|
|
824
|
-
<td class="col-role">
|
|
825
|
-
<span class="m-select">student <svg width="14" height="14" viewBox="0 0 24 24"><path d="M7 10l5 5 5-5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
826
|
-
</td>
|
|
827
|
-
<td class="col-actions">
|
|
828
|
-
<div class="row-actions">
|
|
829
|
-
<span class="m-icon-btn" title="Bearbeiten" aria-label="Benutzer bearbeiten">✎</span>
|
|
830
|
-
<span class="m-icon-btn danger" title="Löschen" aria-label="Benutzer löschen">🗑</span>
|
|
831
|
-
</div>
|
|
832
|
-
</td>
|
|
833
|
-
</tr>
|
|
834
|
-
<tr>
|
|
835
|
-
<td class="col-email">jonas.berger@swisstph.ch</td>
|
|
836
|
-
<td class="col-name">Jonas Berger</td>
|
|
837
|
-
<td class="col-new">
|
|
838
|
-
<span class="status-icon no" title="Nicht neu">○</span>
|
|
839
|
-
</td>
|
|
840
|
-
<td class="col-login tabular">01.08.2026, 11:03</td>
|
|
841
|
-
<td class="col-role">
|
|
842
|
-
<span class="m-select">supervisor <svg width="14" height="14" viewBox="0 0 24 24"><path d="M7 10l5 5 5-5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
843
|
-
</td>
|
|
844
|
-
<td class="col-actions">
|
|
845
|
-
<div class="row-actions">
|
|
846
|
-
<span class="m-icon-btn" title="Bearbeiten" aria-label="Benutzer bearbeiten">✎</span>
|
|
847
|
-
<span class="m-icon-btn danger" title="Löschen" aria-label="Benutzer löschen">🗑</span>
|
|
848
|
-
</div>
|
|
849
|
-
</td>
|
|
850
|
-
</tr>
|
|
851
|
-
<tr>
|
|
852
|
-
<td class="col-email">priya.nair@swisstph.ch</td>
|
|
853
|
-
<td class="col-name">Priya Nair</td>
|
|
854
|
-
<td class="col-new">
|
|
855
|
-
<span class="status-icon no" title="Nicht neu">○</span>
|
|
856
|
-
</td>
|
|
857
|
-
<td class="col-login tabular">–</td>
|
|
858
|
-
<td class="col-role">
|
|
859
|
-
<span class="m-select">none <svg width="14" height="14" viewBox="0 0 24 24"><path d="M7 10l5 5 5-5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
860
|
-
</td>
|
|
861
|
-
<td class="col-actions">
|
|
862
|
-
<div class="row-actions">
|
|
863
|
-
<span class="m-icon-btn" title="Bearbeiten" aria-label="Benutzer bearbeiten">✎</span>
|
|
864
|
-
<span class="m-icon-btn danger" title="Löschen" aria-label="Benutzer löschen">🗑</span>
|
|
865
|
-
</div>
|
|
866
|
-
</td>
|
|
867
|
-
</tr>
|
|
868
|
-
</tbody>
|
|
869
|
-
</table>
|
|
870
|
-
</div>
|
|
871
|
-
</div>
|
|
872
|
-
</div>
|
|
873
|
-
</div>
|
|
874
|
-
</div>
|
|
875
|
-
</div>
|
|
876
|
-
|
|
877
|
-
</div>
|
|
878
|
-
|
|
879
|
-
<div class="panels-row wrap" style="margin-top: 32px; align-items: flex-start;">
|
|
880
|
-
|
|
881
|
-
<!-- ================= PANEL 2: MOBILE, TRIGGER CLOSED (interactive) ================= -->
|
|
882
|
-
<div class="panel phone">
|
|
883
|
-
<div class="panel-label">
|
|
884
|
-
<span class="panel-num">2</span>
|
|
885
|
-
<span class="panel-title">Mobile <900px — trigger closed</span>
|
|
886
|
-
</div>
|
|
887
|
-
<p class="panel-sub">Benutzer active, card list · tap the bar to open</p>
|
|
888
|
-
<div class="frame">
|
|
889
|
-
<div class="frame-scroll" id="p2-scroll">
|
|
890
|
-
<button class="section-trigger" id="p2-trigger" aria-expanded="false" aria-controls="p2-sheet">
|
|
891
|
-
<span class="trigger-text">
|
|
892
|
-
<span class="trigger-eyebrow">Bereich</span>
|
|
893
|
-
<span class="trigger-value">Benutzer</span>
|
|
894
|
-
</span>
|
|
895
|
-
<svg class="trigger-chevron" width="20" height="20" viewBox="0 0 24 24"><path d="M7 10l5 5 5-5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
|
896
|
-
</button>
|
|
897
|
-
|
|
898
|
-
<p class="list-caption">5 Ergebnisse</p>
|
|
899
|
-
<div class="m-search" style="max-width:none; width:100%;">Suchen…</div>
|
|
900
|
-
|
|
901
|
-
<div class="card-list">
|
|
902
|
-
<div class="m-paper user-card">
|
|
903
|
-
<div class="user-card-top">
|
|
904
|
-
<div>
|
|
905
|
-
<p class="user-card-name">Selina Amrein</p>
|
|
906
|
-
<p class="user-card-email">selina.amrein@swisstph.ch</p>
|
|
907
|
-
</div>
|
|
908
|
-
<span class="chip-new">Neu</span>
|
|
909
|
-
</div>
|
|
910
|
-
<div class="user-card-meta">
|
|
911
|
-
<div class="meta-item">
|
|
912
|
-
<span class="meta-label">Letzte Anmeldung</span>
|
|
913
|
-
<span class="meta-value tabular">07.08.2026, 14:22</span>
|
|
914
|
-
</div>
|
|
915
|
-
<div class="meta-item">
|
|
916
|
-
<span class="meta-label">Rolle</span>
|
|
917
|
-
<span class="meta-value">admin</span>
|
|
918
|
-
</div>
|
|
919
|
-
</div>
|
|
920
|
-
<div class="user-card-actions">
|
|
921
|
-
<span class="m-icon-btn touch" title="Bearbeiten" aria-label="Benutzer bearbeiten">✎</span>
|
|
922
|
-
<span class="m-icon-btn touch danger" title="Löschen" aria-label="Benutzer löschen">🗑</span>
|
|
923
|
-
</div>
|
|
924
|
-
</div>
|
|
925
|
-
|
|
926
|
-
<div class="m-paper user-card">
|
|
927
|
-
<div class="user-card-top">
|
|
928
|
-
<div>
|
|
929
|
-
<p class="user-card-name">Thabo Ndlovu</p>
|
|
930
|
-
<p class="user-card-email">thabo.ndlovu@swisstph.ch</p>
|
|
931
|
-
</div>
|
|
932
|
-
</div>
|
|
933
|
-
<div class="user-card-meta">
|
|
934
|
-
<div class="meta-item">
|
|
935
|
-
<span class="meta-label">Letzte Anmeldung</span>
|
|
936
|
-
<span class="meta-value tabular">05.08.2026, 09:10</span>
|
|
937
|
-
</div>
|
|
938
|
-
<div class="meta-item">
|
|
939
|
-
<span class="meta-label">Rolle</span>
|
|
940
|
-
<span class="meta-value">teacher</span>
|
|
941
|
-
</div>
|
|
942
|
-
</div>
|
|
943
|
-
<div class="user-card-actions">
|
|
944
|
-
<span class="m-icon-btn touch" title="Bearbeiten" aria-label="Benutzer bearbeiten">✎</span>
|
|
945
|
-
<span class="m-icon-btn touch danger" title="Löschen" aria-label="Benutzer löschen">🗑</span>
|
|
946
|
-
</div>
|
|
947
|
-
</div>
|
|
948
|
-
|
|
949
|
-
<div class="m-paper user-card">
|
|
950
|
-
<div class="user-card-top">
|
|
951
|
-
<div>
|
|
952
|
-
<p class="user-card-name">Priya Nair</p>
|
|
953
|
-
<p class="user-card-email">priya.nair@swisstph.ch</p>
|
|
954
|
-
</div>
|
|
955
|
-
</div>
|
|
956
|
-
<div class="user-card-meta">
|
|
957
|
-
<div class="meta-item">
|
|
958
|
-
<span class="meta-label">Letzte Anmeldung</span>
|
|
959
|
-
<span class="meta-value tabular">–</span>
|
|
960
|
-
</div>
|
|
961
|
-
<div class="meta-item">
|
|
962
|
-
<span class="meta-label">Rolle</span>
|
|
963
|
-
<span class="meta-value">none</span>
|
|
964
|
-
</div>
|
|
965
|
-
</div>
|
|
966
|
-
<div class="user-card-actions">
|
|
967
|
-
<span class="m-icon-btn touch" title="Bearbeiten" aria-label="Benutzer bearbeiten">✎</span>
|
|
968
|
-
<span class="m-icon-btn touch danger" title="Löschen" aria-label="Benutzer löschen">🗑</span>
|
|
969
|
-
</div>
|
|
970
|
-
</div>
|
|
971
|
-
</div>
|
|
972
|
-
|
|
973
|
-
<div class="demo-flag">tap the trigger above — this panel is interactive</div>
|
|
974
|
-
</div>
|
|
975
|
-
|
|
976
|
-
<div class="scrim" id="p2-scrim"></div>
|
|
977
|
-
<div class="sheet" id="p2-sheet" role="dialog" aria-modal="true" aria-labelledby="p2-sheet-title">
|
|
978
|
-
<div class="sheet-head">
|
|
979
|
-
<h3 id="p2-sheet-title">Bereich wechseln</h3>
|
|
980
|
-
<button class="sheet-close" id="p2-close" aria-label="Schliessen">
|
|
981
|
-
<svg width="20" height="20" viewBox="0 0 24 24"><path d="M6 6l12 12M18 6L6 18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>
|
|
982
|
-
</button>
|
|
983
|
-
</div>
|
|
984
|
-
<div class="sheet-scroll" id="p2-list">
|
|
985
|
-
<div class="m-paper">
|
|
986
|
-
<div class="m-group-head">Mein Konto</div>
|
|
987
|
-
<ul class="m-list">
|
|
988
|
-
<li><button class="m-item" data-pick>Profil</button></li>
|
|
989
|
-
<li><button class="m-item" data-pick>Sicherheit</button></li>
|
|
990
|
-
</ul>
|
|
991
|
-
</div>
|
|
992
|
-
<div class="m-paper">
|
|
993
|
-
<div class="m-group-head">Verwaltung</div>
|
|
994
|
-
<ul class="m-list">
|
|
995
|
-
<li><button class="m-item is-selected" aria-current="true" data-pick>Benutzer</button></li>
|
|
996
|
-
<li><button class="m-item" data-pick>Einladen</button></li>
|
|
997
|
-
</ul>
|
|
998
|
-
</div>
|
|
999
|
-
<div class="m-paper">
|
|
1000
|
-
<div class="m-group-head">Hilfe</div>
|
|
1001
|
-
<ul class="m-list">
|
|
1002
|
-
<li><button class="m-item" data-pick>Support</button></li>
|
|
1003
|
-
</ul>
|
|
1004
|
-
</div>
|
|
1005
|
-
<div class="m-paper">
|
|
1006
|
-
<div class="m-group-head">Weitere</div>
|
|
1007
|
-
<ul class="m-list">
|
|
1008
|
-
<li><button class="m-item" data-pick>Benachrichtigungen</button></li>
|
|
1009
|
-
</ul>
|
|
1010
|
-
</div>
|
|
1011
|
-
</div>
|
|
1012
|
-
</div>
|
|
1013
|
-
</div>
|
|
1014
|
-
</div>
|
|
1015
|
-
|
|
1016
|
-
<!-- ================= PANEL 3: MOBILE, DRAWER OPEN (static reference) ================= -->
|
|
1017
|
-
<div class="panel phone">
|
|
1018
|
-
<div class="panel-label">
|
|
1019
|
-
<span class="panel-num">3</span>
|
|
1020
|
-
<span class="panel-title">Mobile — drawer open</span>
|
|
1021
|
-
</div>
|
|
1022
|
-
<p class="panel-sub">static reference · rounded top 18px · max-height 78dvh</p>
|
|
1023
|
-
<div class="frame">
|
|
1024
|
-
<div class="frame-scroll content-behind" aria-hidden="true">
|
|
1025
|
-
<button class="section-trigger" aria-expanded="true" tabindex="-1">
|
|
1026
|
-
<span class="trigger-text">
|
|
1027
|
-
<span class="trigger-eyebrow">Bereich</span>
|
|
1028
|
-
<span class="trigger-value">Benutzer</span>
|
|
1029
|
-
</span>
|
|
1030
|
-
<svg class="trigger-chevron" width="20" height="20" viewBox="0 0 24 24"><path d="M7 10l5 5 5-5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
|
1031
|
-
</button>
|
|
1032
|
-
<p class="list-caption">5 Ergebnisse</p>
|
|
1033
|
-
</div>
|
|
1034
|
-
<div class="scrim open"></div>
|
|
1035
|
-
<div class="sheet-static">
|
|
1036
|
-
<div class="sheet-head">
|
|
1037
|
-
<h3>Bereich wechseln</h3>
|
|
1038
|
-
<span class="sheet-close" aria-hidden="true">
|
|
1039
|
-
<svg width="20" height="20" viewBox="0 0 24 24"><path d="M6 6l12 12M18 6L6 18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>
|
|
1040
|
-
</span>
|
|
1041
|
-
</div>
|
|
1042
|
-
<div class="sheet-scroll">
|
|
1043
|
-
<div class="m-paper">
|
|
1044
|
-
<div class="m-group-head">Mein Konto</div>
|
|
1045
|
-
<ul class="m-list">
|
|
1046
|
-
<li><button class="m-item" tabindex="-1">Profil</button></li>
|
|
1047
|
-
<li><button class="m-item" tabindex="-1">Sicherheit</button></li>
|
|
1048
|
-
</ul>
|
|
1049
|
-
</div>
|
|
1050
|
-
<div class="m-paper">
|
|
1051
|
-
<div class="m-group-head">Verwaltung</div>
|
|
1052
|
-
<ul class="m-list">
|
|
1053
|
-
<li><button class="m-item is-selected" aria-current="true" tabindex="-1">Benutzer</button></li>
|
|
1054
|
-
<li><button class="m-item" tabindex="-1">Einladen</button></li>
|
|
1055
|
-
</ul>
|
|
1056
|
-
</div>
|
|
1057
|
-
<div class="m-paper">
|
|
1058
|
-
<div class="m-group-head">Hilfe</div>
|
|
1059
|
-
<ul class="m-list">
|
|
1060
|
-
<li><button class="m-item" tabindex="-1">Support</button></li>
|
|
1061
|
-
</ul>
|
|
1062
|
-
</div>
|
|
1063
|
-
<div class="m-paper">
|
|
1064
|
-
<div class="m-group-head">Weitere</div>
|
|
1065
|
-
<ul class="m-list">
|
|
1066
|
-
<li><button class="m-item" tabindex="-1">Benachrichtigungen</button></li>
|
|
1067
|
-
</ul>
|
|
1068
|
-
</div>
|
|
1069
|
-
</div>
|
|
1070
|
-
</div>
|
|
1071
|
-
</div>
|
|
1072
|
-
</div>
|
|
1073
|
-
|
|
1074
|
-
<!-- ================= PANEL 4: PERMISSION VARIANT (small inset) ================= -->
|
|
1075
|
-
<div class="panel inset">
|
|
1076
|
-
<div class="panel-label">
|
|
1077
|
-
<span class="panel-num">4</span>
|
|
1078
|
-
<span class="panel-title" style="font-size:13px;">Permission variant</span>
|
|
1079
|
-
</div>
|
|
1080
|
-
<p class="panel-sub" style="margin-left:0;">
|
|
1081
|
-
plain user · no <code>can_view_users</code> / <code>can_invite</code> / support access —
|
|
1082
|
-
the list is genuinely short, not padded out
|
|
1083
|
-
</p>
|
|
1084
|
-
<div class="frame" style="margin-top:10px;">
|
|
1085
|
-
<div class="frame-inner">
|
|
1086
|
-
<div class="m-paper">
|
|
1087
|
-
<div class="m-group-head">Mein Konto</div>
|
|
1088
|
-
<ul class="m-list">
|
|
1089
|
-
<li><button class="m-item is-selected" aria-current="true">Profil</button></li>
|
|
1090
|
-
<li><button class="m-item">Sicherheit</button></li>
|
|
1091
|
-
</ul>
|
|
1092
|
-
</div>
|
|
1093
|
-
</div>
|
|
1094
|
-
</div>
|
|
1095
|
-
</div>
|
|
1096
|
-
|
|
1097
|
-
</div>
|
|
1098
|
-
</section>
|
|
1099
|
-
|
|
1100
|
-
<footer class="doc-foot">
|
|
1101
|
-
<p>
|
|
1102
|
-
Groups are a fixed proposal, not derived from data: “Mein Konto” (Profil, Sicherheit),
|
|
1103
|
-
“Verwaltung” (Benutzer, Einladen), “Hilfe” (Support). Consumer-injected
|
|
1104
|
-
<code>extraTabs</code> without an explicit group — like cockpit’s “Benachrichtigungen”
|
|
1105
|
-
— fall into a trailing catch-all group, shown here as “Weitere”.
|
|
1106
|
-
The <code>?tab=</code> URL contract and the <code>extraTabs</code> API are unchanged by this redesign.
|
|
1107
|
-
</p>
|
|
1108
|
-
<p>
|
|
1109
|
-
Built for both colour schemes via <code>prefers-color-scheme</code> and a <code>data-theme</code> override;
|
|
1110
|
-
typography uses the system font stack rather than an embedded face, since the mockup’s job is to
|
|
1111
|
-
pin structure and interaction, not to preview any one app’s actual type — every consumer already
|
|
1112
|
-
overrides MUI’s typography in its own theme.
|
|
1113
|
-
</p>
|
|
1114
|
-
</footer>
|
|
1115
|
-
|
|
1116
|
-
</div>
|
|
1117
|
-
|
|
1118
|
-
<script>
|
|
1119
|
-
(function () {
|
|
1120
|
-
var trigger = document.getElementById('p2-trigger');
|
|
1121
|
-
var sheet = document.getElementById('p2-sheet');
|
|
1122
|
-
var scrim = document.getElementById('p2-scrim');
|
|
1123
|
-
var closeBtn = document.getElementById('p2-close');
|
|
1124
|
-
var list = document.getElementById('p2-list');
|
|
1125
|
-
|
|
1126
|
-
function openSheet() {
|
|
1127
|
-
sheet.classList.add('open');
|
|
1128
|
-
scrim.classList.add('open');
|
|
1129
|
-
trigger.setAttribute('aria-expanded', 'true');
|
|
1130
|
-
var title = document.getElementById('p2-sheet-title');
|
|
1131
|
-
if (title) title.setAttribute('tabindex', '-1');
|
|
1132
|
-
}
|
|
1133
|
-
function closeSheet() {
|
|
1134
|
-
sheet.classList.remove('open');
|
|
1135
|
-
scrim.classList.remove('open');
|
|
1136
|
-
trigger.setAttribute('aria-expanded', 'false');
|
|
1137
|
-
trigger.focus();
|
|
1138
|
-
}
|
|
1139
|
-
trigger.addEventListener('click', function () {
|
|
1140
|
-
if (sheet.classList.contains('open')) { closeSheet(); } else { openSheet(); }
|
|
1141
|
-
});
|
|
1142
|
-
closeBtn.addEventListener('click', closeSheet);
|
|
1143
|
-
scrim.addEventListener('click', closeSheet);
|
|
1144
|
-
document.addEventListener('keydown', function (e) {
|
|
1145
|
-
if (e.key === 'Escape' && sheet.classList.contains('open')) { closeSheet(); }
|
|
1146
|
-
});
|
|
1147
|
-
list.addEventListener('click', function (e) {
|
|
1148
|
-
var item = e.target.closest('[data-pick]');
|
|
1149
|
-
if (!item) return;
|
|
1150
|
-
var current = list.querySelector('.is-selected');
|
|
1151
|
-
if (current) { current.classList.remove('is-selected'); current.removeAttribute('aria-current'); }
|
|
1152
|
-
item.classList.add('is-selected');
|
|
1153
|
-
item.setAttribute('aria-current', 'true');
|
|
1154
|
-
var valueEl = trigger.querySelector('.trigger-value');
|
|
1155
|
-
if (valueEl) valueEl.textContent = item.textContent;
|
|
1156
|
-
closeSheet();
|
|
1157
|
-
});
|
|
1158
|
-
})();
|
|
1159
|
-
</script>
|