diff --git a/services/web/app/src/Features/Project/ProjectController.mjs b/services/web/app/src/Features/Project/ProjectController.mjs index 4fb5a65177..9813b45b42 100644 --- a/services/web/app/src/Features/Project/ProjectController.mjs +++ b/services/web/app/src/Features/Project/ProjectController.mjs @@ -880,6 +880,10 @@ const _ProjectController = { user ) + const initialLoadingScreenTheme = getInitialLoadingScreenTheme( + userSettings?.overallTheme + ) + res.render(template, { title: project.name, priority_title: true, @@ -916,6 +920,7 @@ const _ProjectController = { isMemberOfGroupSubscription: userIsMemberOfGroupSubscription, hasInstitutionLicence: userHasInstitutionLicence, }, + initialLoadingScreenTheme, userSettings, labsExperiments: user.labsExperiments ?? [], privilegeLevel, @@ -1275,6 +1280,19 @@ const _ProjectController = { }, } +function getInitialLoadingScreenTheme(overallThemeSetting) { + switch (overallThemeSetting) { + case 'light-': + return 'light' + case '': + return 'dark' + case 'system': + return 'system' + default: + return 'dark' + } +} + const defaultSettingsForAnonymousUser = userId => ({ id: userId, ace: { diff --git a/services/web/app/views/project/ide-react.pug b/services/web/app/views/project/ide-react.pug index db9669ec2f..ef93ae9e8d 100644 --- a/services/web/app/views/project/ide-react.pug +++ b/services/web/app/views/project/ide-react.pug @@ -14,7 +14,7 @@ block entrypointVar block content //- TODO: remove `main` once it's no longer needed by browser extensions main#ide-root - .loading-screen + div(class=['loading-screen', `loading-screen-init-${initialLoadingScreenTheme}`]) .loading-screen-brand-container .loading-screen-brand(style='height: 20%') h3.loading-screen-label #{translate("loading")} diff --git a/services/web/frontend/js/features/ide-react/components/loading.tsx b/services/web/frontend/js/features/ide-react/components/loading.tsx index 3f1aeaed3d..37e51db231 100644 --- a/services/web/frontend/js/features/ide-react/components/loading.tsx +++ b/services/web/frontend/js/features/ide-react/components/loading.tsx @@ -5,6 +5,7 @@ import getMeta from '@/utils/meta' import { useConnectionContext } from '../context/connection-context' import { useIdeReactContext } from '@/features/ide-react/context/ide-react-context' import { LoadingError, LoadingErrorProps } from './loading-error' +import useThemedPage from '@/shared/hooks/use-themed-page' type Part = 'initial' | 'render' | 'connection' | 'translations' | 'project' @@ -22,7 +23,7 @@ export const Loading: FC<{ setLoaded: (value: boolean) => void }> = ({ setLoaded }) => { const [loadedParts, setLoadedParts] = useState(initialParts) - + useThemedPage() const progress = (loadedParts.size / totalParts.size) * 100 useEffect(() => { diff --git a/services/web/frontend/js/features/token-access/components/token-access-root.tsx b/services/web/frontend/js/features/token-access/components/token-access-root.tsx index 6d0faa91a6..121b20ae86 100644 --- a/services/web/frontend/js/features/token-access/components/token-access-root.tsx +++ b/services/web/frontend/js/features/token-access/components/token-access-root.tsx @@ -111,28 +111,25 @@ function TokenAccessRoot() { } return ( -
-
- +
+
+
+
+ {mode === 'access-attempt' && ( + + )} - {mode === 'access-attempt' && ( - - )} - - {V1ImportDataScreen && mode === 'v1Import' && v1ImportData && ( - - )} + {V1ImportDataScreen && mode === 'v1Import' && v1ImportData && ( + + )} +
) } diff --git a/services/web/frontend/js/shared/hooks/use-themed-page.tsx b/services/web/frontend/js/shared/hooks/use-themed-page.tsx index 64e4f7b7d0..1809ffb871 100644 --- a/services/web/frontend/js/shared/hooks/use-themed-page.tsx +++ b/services/web/frontend/js/shared/hooks/use-themed-page.tsx @@ -1,10 +1,10 @@ -import { useEffect } from 'react' +import { useLayoutEffect } from 'react' import { useActiveOverallTheme } from './use-active-overall-theme' export default function useThemedPage(featureFlag?: string) { const activeOverallTheme = useActiveOverallTheme(featureFlag) - useEffect(() => { + useLayoutEffect(() => { // Sets the body's data-theme attribute for theming document.body.dataset.theme = activeOverallTheme === 'dark' ? 'default' : 'light' diff --git a/services/web/frontend/stylesheets/pages/all.scss b/services/web/frontend/stylesheets/pages/all.scss index 4c90da2618..7e9ce17456 100644 --- a/services/web/frontend/stylesheets/pages/all.scss +++ b/services/web/frontend/stylesheets/pages/all.scss @@ -57,3 +57,4 @@ @import 'wiki'; @import 'templates'; @import 'notification-settings'; +@import 'token-access'; diff --git a/services/web/frontend/stylesheets/pages/editor/loading-screen.scss b/services/web/frontend/stylesheets/pages/editor/loading-screen.scss index b6fd6b1f92..9741da00a6 100644 --- a/services/web/frontend/stylesheets/pages/editor/loading-screen.scss +++ b/services/web/frontend/stylesheets/pages/editor/loading-screen.scss @@ -1,5 +1,45 @@ @use 'sass:math'; +@mixin loading-screen-dark { + --loading-screen-ol-logo-empty-url: url(../../../../public/img/ol-brand/overleaf-o-grey.svg); + --loading-screen-ol-logo-full-url: url(../../../../public/img/ol-brand/overleaf-o-white.svg); + --loading-screen-bg-color: var(--bg-dark-primary); + --loading-screen-color: var(--content-secondary-dark); + --loading-screen-danger-color: var(--content-danger-dark); +} + +@mixin loading-screen-light { + --loading-screen-ol-logo-empty-url: url(../../../../public/img/ol-brand/overleaf-o-grey.svg); + --loading-screen-ol-logo-full-url: url(../../../../public/img/ol-brand/overleaf-o.svg); + --loading-screen-bg-color: var(--bg-light-primary); + --loading-screen-color: var(--content-secondary); + --loading-screen-danger-color: var(--content-danger); +} + +:root { + @include loading-screen-light; + + @include theme('default') { + @include loading-screen-dark; + } + + .loading-screen-init-system { + @include loading-screen-light; + + @media (prefers-color-scheme: dark) { + @include loading-screen-dark; + } + } + + .loading-screen-init-light { + @include loading-screen-light; + } + + .loading-screen-init-dark { + @include loading-screen-dark; + } +} + @keyframes blink { 0% { opacity: 0.2; @@ -21,7 +61,7 @@ align-items: center; width: 100%; height: 100%; - background-color: #fff; + background-color: var(--loading-screen-bg-color); .loading-screen-brand-container { min-width: 200px; @@ -31,8 +71,7 @@ position: relative; padding-top: math.percentage(math.div(150, 130)); // dimensions of the SVG height: 0; - background: url(../../../../public/img/ol-brand/overleaf-o-grey.svg) - no-repeat bottom / 100%; + background: var(--loading-screen-ol-logo-empty-url) no-repeat bottom / 100%; &::after { content: ''; @@ -41,8 +80,7 @@ right: 0; bottom: 0; left: 0; - background: url(../../../../public/img/ol-brand/overleaf-o.svg) no-repeat - bottom / 100%; + background: var(--loading-screen-ol-logo-full-url) no-repeat bottom / 100%; transition: height 0.5s; } } @@ -52,7 +90,7 @@ padding-top: var(--spacing-09); font-family: $font-family-serif; font-size: var(--font-size-07); - color: var(--content-secondary); + color: var(--loading-screen-color); } .loading-screen-ellip { @@ -70,6 +108,6 @@ .loading-screen-error { margin: 0; padding-top: var(--spacing-06); - color: var(--content-danger); + color: var(--loading-screen-danger-color); } } diff --git a/services/web/frontend/stylesheets/pages/token-access.scss b/services/web/frontend/stylesheets/pages/token-access.scss new file mode 100644 index 0000000000..a047f02042 --- /dev/null +++ b/services/web/frontend/stylesheets/pages/token-access.scss @@ -0,0 +1,37 @@ +#token-access-page { + height: 100vh; + height: 100dvh; +} + +@include theme('default') { + .token-access-content { + @include dark-bg; + } +} + +.token-access-container { + display: flex; + flex-direction: column; + height: 100%; +} + +.token-access-action-header { + background-color: var(--bg-primary-themed); + flex: 0 0 auto; +} + +.token-access-content { + flex: 1 1 auto; + color: var(--content-primary-themed); + + h1, + h2 { + color: var(--content-primary-themed); + } +} + +.token-access-home-link { + font-size: 2rem; + margin-left: 1rem; + color: var(--content-primary-themed); +}