Просмотр исходного кода

Merge branch 'support/apply-nextjs-2' of https://github.com/weseek/growi into feat/103073-rendering-maintenance-mode

Shun Miyazawa 3 лет назад
Родитель
Сommit
a775b9a4f6
47 измененных файлов с 1300 добавлено и 1353 удалено
  1. 1 0
      packages/app/package.json
  2. 12 8
      packages/app/src/components/Layout/RawLayout.tsx
  3. 1 1
      packages/app/src/components/Navbar/AppearanceModeDropdown.tsx
  4. 8 7
      packages/app/src/components/Navbar/GrowiContextualSubNavigation.tsx
  5. 1 13
      packages/app/src/components/Theme/ThemeAntarctic.global.scss
  6. 4 7
      packages/app/src/components/Theme/ThemeAntarctic.tsx
  7. 1 1
      packages/app/src/components/Theme/ThemeBlackboard.global.scss
  8. 2 2
      packages/app/src/components/Theme/ThemeBlackboard.tsx
  9. 1 13
      packages/app/src/components/Theme/ThemeChristmas.global.scss
  10. 4 7
      packages/app/src/components/Theme/ThemeChristmas.tsx
  11. 212 0
      packages/app/src/components/Theme/ThemeDefault.global.scss
  12. 0 216
      packages/app/src/components/Theme/ThemeDefault.module.scss
  13. 2 2
      packages/app/src/components/Theme/ThemeDefault.tsx
  14. 205 0
      packages/app/src/components/Theme/ThemeFireRed.global.scss
  15. 0 209
      packages/app/src/components/Theme/ThemeFireRed.module.scss
  16. 2 2
      packages/app/src/components/Theme/ThemeFireRed.tsx
  17. 1 1
      packages/app/src/components/Theme/ThemeFuture.global.scss
  18. 2 2
      packages/app/src/components/Theme/ThemeFuture.tsx
  19. 6 13
      packages/app/src/components/Theme/ThemeHalloween.global.scss
  20. 4 7
      packages/app/src/components/Theme/ThemeHalloween.tsx
  21. 308 0
      packages/app/src/components/Theme/ThemeHufflepuff.global.scss
  22. 0 325
      packages/app/src/components/Theme/ThemeHufflepuff.module.scss
  23. 4 7
      packages/app/src/components/Theme/ThemeHufflepuff.tsx
  24. 1 9
      packages/app/src/components/Theme/ThemeIsland.global.scss
  25. 4 7
      packages/app/src/components/Theme/ThemeIsland.tsx
  26. 205 0
      packages/app/src/components/Theme/ThemeJadeGreen.global.scss
  27. 0 209
      packages/app/src/components/Theme/ThemeJadeGreen.module.scss
  28. 2 2
      packages/app/src/components/Theme/ThemeJadeGreen.tsx
  29. 1 1
      packages/app/src/components/Theme/ThemeKibela.global.scss
  30. 2 2
      packages/app/src/components/Theme/ThemeKibela.tsx
  31. 201 0
      packages/app/src/components/Theme/ThemeMonoBlue.global.scss
  32. 0 205
      packages/app/src/components/Theme/ThemeMonoBlue.module.scss
  33. 2 2
      packages/app/src/components/Theme/ThemeMonoBlue.tsx
  34. 1 1
      packages/app/src/components/Theme/ThemeNature.global.scss
  35. 2 2
      packages/app/src/components/Theme/ThemeNature.tsx
  36. 1 14
      packages/app/src/components/Theme/ThemeSpring.global.scss
  37. 4 7
      packages/app/src/components/Theme/ThemeSpring.tsx
  38. 1 14
      packages/app/src/components/Theme/ThemeWood.global.scss
  39. 4 7
      packages/app/src/components/Theme/ThemeWood.tsx
  40. 6 2
      packages/app/src/components/Theme/utils/ThemeInjector.tsx
  41. 5 4
      packages/app/src/pages/_app.page.tsx
  42. 0 22
      packages/app/src/stores/use-next-themes.ts
  43. 45 0
      packages/app/src/stores/use-next-themes.tsx
  44. 11 0
      packages/app/src/styles/_layout.scss
  45. 1 0
      packages/app/src/styles/style-next.scss
  46. 15 0
      packages/app/src/styles/style-themes.scss
  47. 5 0
      yarn.lock

+ 1 - 0
packages/app/package.json

@@ -180,6 +180,7 @@
     "universal-bunyan": "^0.9.2",
     "unzipper": "^0.10.5",
     "url-join": "^4.0.0",
+    "usehooks-ts": "^2.6.0",
     "validator": "^13.7.0",
     "ws": "^8.3.0",
     "xss": "^1.0.6"

+ 12 - 8
packages/app/src/components/Layout/RawLayout.tsx

@@ -1,14 +1,18 @@
-import React, {
-  ReactNode, useEffect, useState,
-} from 'react';
+import React, { ReactNode, useState } from 'react';
 
 import Head from 'next/head';
+import { useIsomorphicLayoutEffect } from 'usehooks-ts';
 
 import { useGrowiTheme } from '~/stores/context';
-import { Themes, useNextThemes } from '~/stores/use-next-themes';
+import { ColorScheme, useNextThemes } from '~/stores/use-next-themes';
+import loggerFactory from '~/utils/logger';
 
 import { ThemeProvider } from '../Theme/utils/ThemeProvider';
 
+
+const logger = loggerFactory('growi:cli:RawLayout');
+
+
 type Props = {
   title?: string,
   className?: string,
@@ -23,13 +27,13 @@ export const RawLayout = ({ children, title, className }: Props): JSX.Element =>
   const { data: growiTheme } = useGrowiTheme();
 
   // get color scheme from next-themes
-  const { resolvedTheme } = useNextThemes();
+  const { resolvedTheme, resolvedThemeByAttributes } = useNextThemes();
 
-  const [colorScheme, setColorScheme] = useState<Themes|undefined>(undefined);
+  const [colorScheme, setColorScheme] = useState<ColorScheme|undefined>(undefined);
 
   // set colorScheme in CSR
-  useEffect(() => {
-    setColorScheme(resolvedTheme as Themes);
+  useIsomorphicLayoutEffect(() => {
+    setColorScheme(resolvedTheme ?? resolvedThemeByAttributes);
   }, [resolvedTheme]);
 
   return (

+ 1 - 1
packages/app/src/components/Navbar/AppearanceModeDropdown.tsx

@@ -55,7 +55,7 @@ export const AppearanceModeDropdown:FC<AppearanceModeDropdownProps> = (props: Ap
   }, [resolvedTheme, setTheme]);
 
   const userPreferenceSwitchModifiedHandler = useCallback((isDarkMode: boolean) => {
-    setTheme(isDarkMode ? 'dark' : 'light');
+    setTheme(isDarkMode ? Themes.dark : Themes.light);
   }, [setTheme]);
 
   /* eslint-disable react/prop-types */

+ 8 - 7
packages/app/src/components/Navbar/GrowiContextualSubNavigation.tsx

@@ -2,7 +2,6 @@ import React, { useState, useEffect, useCallback } from 'react';
 
 
 import { isPopulated } from '@growi/core';
-import { IResTagsUpdateApiv1 } from '~/interfaces/tag';
 import { useTranslation } from 'next-i18next';
 import dynamic from 'next/dynamic';
 import { DropdownItem } from 'reactstrap';
@@ -13,8 +12,8 @@ import { apiPost } from '~/client/util/apiv1-client';
 import {
   IPageToRenameWithMeta, IPageWithMeta, IPageInfoForEntity, IPageHasId,
 } from '~/interfaces/page';
+import { IResTagsUpdateApiv1 } from '~/interfaces/tag';
 import { OnDuplicatedFunction, OnRenamedFunction, OnDeletedFunction } from '~/interfaces/ui';
-import { IUser } from '~/interfaces/user';
 import {
   useCurrentPageId,
   useCurrentPathname,
@@ -243,7 +242,7 @@ const GrowiContextualSubNavigation = (props: GrowiContextualSubNavigationProps):
       toastError(err, 'fail to update tags');
     }
 
-  }, [mutateSWRTagsInfo, mutatePageTagsForEditors, mutateCurrentPage, pageId, revisionId]);
+  }, [currentPage, mutateCurrentPage, mutateSWRTagsInfo, mutatePageTagsForEditors]);
 
   const tagsUpdatedHandlerForEditMode = useCallback((newTags: string[]): void => {
     // It will not be reflected in the DB until the page is refreshed
@@ -355,11 +354,13 @@ const GrowiContextualSubNavigation = (props: GrowiContextualSubNavigationProps):
       </>
     );
   }, [
-    pageId, revisionId, editorMode, mutateEditorMode, isCompactMode,
-    isLinkSharingDisabled, isGuestUser, isSharedUser, currentUser,
-    isViewMode, isAbleToShowPageEditorModeManager, isAbleToShowPageManagement,
+    currentPage, currentUser, pageId, revisionId, shareLinkId, path, editorMode,
+    isCompactMode, isViewMode, isSharedUser, isAbleToShowPageManagement, isAbleToShowPageEditorModeManager,
+    isLinkSharingDisabled, isGuestUser, isPageTemplateModalShown,
     duplicateItemClickedHandler, renameItemClickedHandler, deleteItemClickedHandler,
-    templateMenuItemClickHandler, isPageTemplateModalShown,
+    PageEditorModeManager, SubNavButtons,
+    mutateEditorMode,
+    templateMenuItemClickHandler,
   ]);
 
   if (currentPathname == null) {

+ 1 - 13
packages/app/src/components/Theme/ThemeAntarctic.module.scss → packages/app/src/components/Theme/ThemeAntarctic.global.scss

@@ -33,18 +33,6 @@
   }
 }
 
-.theme :global {
-  .grw-bg-image-wrapper {
-    position: fixed;
-    width: 100%;
-    height: 100%;
-  }
-
-  .grw-bg-image {
-    object-fit: cover;
-  }
-}
-
 $themecolor: #000080;
 $themelight: #f0f8ff;
 $accentcolor: #ffd700;
@@ -55,7 +43,7 @@ $accentcolor: #ffd700;
 
 //== Light Mode
 //
-.theme :global {
+:root .theme-antarctic {
   $primary: $themecolor;
 
   // Background colors

+ 4 - 7
packages/app/src/components/Theme/ThemeAntarctic.tsx

@@ -4,7 +4,7 @@ import { Themes } from '~/stores/use-next-themes';
 
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeAntarctic.module.scss';
+// import styles from './ThemeAntarctic.module.scss';
 
 export const getBackgroundImageSrc = (colorScheme: Themes): string => {
   switch (colorScheme) {
@@ -19,17 +19,14 @@ type Props = {
 }
 
 const ThemeAntarctic = ({ children, colorScheme }: Props): JSX.Element => {
-  const newChildren = (
+  const bgImageNode = (
     <>
       {colorScheme != null && (
-        <div className='grw-bg-image-wrapper'>
-          <Image className='grw-bg-image' alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
-        </div>
+        <Image alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
       )}
-      {children}
     </>
   );
-  return <ThemeInjector className={styles.theme}>{newChildren}</ThemeInjector>;
+  return <ThemeInjector className="theme-antarctic" bgImageNode={bgImageNode}>{children}</ThemeInjector>;
 };
 
 export default ThemeAntarctic;

+ 1 - 1
packages/app/src/components/Theme/ThemeBlackboard.module.scss → packages/app/src/components/Theme/ThemeBlackboard.global.scss

@@ -2,7 +2,7 @@
 @use '../../styles/bootstrap/variables' as *;
 @use '../../styles/theme/mixins/page-editor-mode-manager';
 
-.theme :global {
+:root .theme-blackboard {
   // Theme colors
   $themecolor: #da8506;
   $themelight: #223729;

+ 2 - 2
packages/app/src/components/Theme/ThemeBlackboard.tsx

@@ -1,8 +1,8 @@
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeBlackboard.module.scss';
+// import styles from './ThemeBlackboard.module.scss';
 
 const ThemeBlackboard = ({ children }: { children: JSX.Element }): JSX.Element => {
-  return <ThemeInjector className={styles.theme}>{children}</ThemeInjector>;
+  return <ThemeInjector className="theme-blackboard">{children}</ThemeInjector>;
 };
 export default ThemeBlackboard;

+ 1 - 13
packages/app/src/components/Theme/ThemeChristmas.module.scss → packages/app/src/components/Theme/ThemeChristmas.global.scss

@@ -35,21 +35,9 @@ $color-link-wiki-hover: lighten($color-link-wiki, 15%);
   }
 }
 
-.theme :global {
-  .grw-bg-image-wrapper {
-    position: fixed;
-    width: 100%;
-    height: 100%;
-  }
-
-  .grw-bg-image {
-    object-fit: cover;
-  }
-}
-
 //== Light Mode
 //
-.theme :global {
+:root .theme-christmas {
   $primary: #d3c665;
   // Background colors
   $bgcolor-card: $gray-50;

+ 4 - 7
packages/app/src/components/Theme/ThemeChristmas.tsx

@@ -4,7 +4,7 @@ import { Themes } from '~/stores/use-next-themes';
 
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeChristmas.module.scss';
+// import styles from './ThemeChristmas.module.scss';
 
 export const getBackgroundImageSrc = (colorScheme: Themes): string => {
   switch (colorScheme) {
@@ -19,17 +19,14 @@ type Props = {
 }
 
 const ThemeChristmas = ({ children, colorScheme }: Props): JSX.Element => {
-  const newChildren = (
+  const bgImageNode = (
     <>
       {colorScheme != null && (
-        <div className='grw-bg-image-wrapper'>
-          <Image className='grw-bg-image' alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
-        </div>
+        <Image alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
       )}
-      {children}
     </>
   );
-  return <ThemeInjector className={styles.theme}>{newChildren}</ThemeInjector>;
+  return <ThemeInjector className="theme-christmas" bgImageNode={bgImageNode}>{children}</ThemeInjector>;
 };
 
 export default ThemeChristmas;

+ 212 - 0
packages/app/src/components/Theme/ThemeDefault.global.scss

@@ -0,0 +1,212 @@
+@use '../../styles/variables' as *;
+@use '../../styles/bootstrap/variables' as *;
+@use '../../styles/theme/mixins/page-editor-mode-manager';
+
+// == Define Bootstrap theme colors
+//
+
+// colors for overriding bootstrap $theme-colors
+// $secondary: #;
+// $info: #;
+// $success: #;
+// $warning: #;
+// $danger: #;
+// $light: #;
+// $dark: #;
+
+//== Light Mode
+//
+:root[data-theme='light'] .theme-default {
+  $primary: #122c55;
+  $accent: #209fd8;
+
+  // Background colors
+  $bgcolor-global: white;
+  $bgcolor-inline-code: $gray-100; //optional
+  $bgcolor-card: $gray-50;
+  $bgcolor-blinked-section: rgba($primary, 0.1);
+  //$bgcolor-keyword-highlighted: $grw-marker-yellow;
+
+  // Font colors
+  $color-global: #112744;
+  $color-reversal: $light;
+  // $color-header: #2b2b2b;
+  $color-link: #1938ba;
+  $color-link-hover: lighten($color-link, 20%);
+  $color-link-wiki: $color-link;
+  $color-link-wiki-hover: lighten($color-link-wiki, 20%);
+  $color-link-nabvar: $gray-500;
+  $color-inline-code: darken($red, 15%); // optional
+
+  // List Group colors
+  // $color-list: $color-global; // optional
+  // $bgcolor-list: $bgcolor-global; // optional
+  // $color-list-hover: $color-global; // optional
+  // $bgcolor-list-hover: darken($bgcolor-global, 3%); // optional
+  // $color-list-active: $color-reversal; // optional
+  // $bgcolor-list-active: $primary; // optional
+
+  // Table colors
+  // $bgcolor-subnav: #; // optional
+  // $color-table: #; // optional
+  // $bgcolor-table: #; // optional
+  // $border-color-table: #; // optional
+  // $color-table-hover: #; // optional
+  // $bgcolor-table-hover: #; // optional
+
+  // Navbar
+  $bgcolor-navbar: $gray-900;
+  $bgcolor-search-top-dropdown: $accent;
+  $border-image-navbar: linear-gradient(to right, #36c9ff 0%, #36c9ff 33%, #7926ff 66%, #ff2eff 100%);
+
+  // Logo colors
+  $bgcolor-logo: $bgcolor-navbar;
+  $fillcolor-logo-mark: lighten(desaturate($bgcolor-navbar, 10%), 15%);
+
+  // Sidebar
+  $bgcolor-sidebar: $primary;
+  $bgcolor-sidebar-nav-item-active: rgba(black, 0.37); // optional
+  $text-shadow-sidebar-nav-item-active: 0px 0px 10px #0099ff; // optional
+  // Sidebar resize button
+  $color-resize-button: $color-reversal;
+  $bgcolor-resize-button: $accent;
+  $color-resize-button-hover: $color-reversal;
+  $bgcolor-resize-button-hover: lighten($bgcolor-resize-button, 5%);
+  // Sidebar contents
+  $color-sidebar-context: $color-global;
+  $bgcolor-sidebar-context: lighten($primary, 77%);
+  // Sidebar list group
+  $bgcolor-sidebar-list-group: $gray-50; // optional
+
+  // Subnavigation
+  // $bgcolor-subnav: #fafafa; // optional
+
+  // Tabs
+  // $color-nav-tabs-link-active: #; //optional
+  // $bordercolor-nav-tabs-hover: # # $bordercolor-nav-tabs; // optional
+  // $bordercolor-nav-tabs-active: # # $bgcolor-global; // optional
+
+  // Tags
+  // $color-tags: #; //optional
+  // $bgcolor-tags: #; //optional
+
+  // Icon colors
+  $color-editor-icons: $color-global;
+
+  // Border colors
+  $border-color-theme: $gray-400;
+  $bordercolor-inline-code: $gray-400; // optional
+
+  // Dropdown colors
+  $bgcolor-dropdown-link-active: $growi-blue;
+
+  // admin theme box
+  $color-theme-color-box: lighten($primary, 20%);
+
+  @import '../../styles/theme/apply-colors';
+  @import '../../styles/theme/apply-colors-light';
+
+  // Button
+  .btn-group.grw-page-editor-mode-manager {
+    .btn.btn-outline-primary {
+      @include page-editor-mode-manager.btn-page-editor-mode-manager($primary, lighten($primary, 65%), lighten($primary, 70%));
+    }
+  }
+}
+
+//== Dark Mode
+//
+:root[data-theme='light'] .theme-dark {
+  $primary: #115cd3;
+  $accent: #db00c2;
+
+  // Background colors
+  $bgcolor-global: #131418;
+  $bgcolor-inline-code: #1f1f22; //optional
+  $bgcolor-card: darken($bgcolor-global, 5%);
+  $bgcolor-blinked-section: rgba($primary, 0.4);
+  $bgcolor-keyword-highlighted: darken($grw-marker-red, 30%);
+
+  // Font colors
+  $color-global: $gray-400;
+  $color-reversal: $gray-900;
+  // $color-header: desaturate($primary, 20%);
+  $color-link: #7b9ad5;
+  $color-link-hover: lighten($color-link, 10%);
+  $color-link-wiki: $color-link;
+  $color-link-wiki-hover: lighten($color-link-wiki, 10%);
+  $color-link-nabvar: #a7a7a7;
+  $color-inline-code: #c7254e; // optional
+
+  // List Group colors
+  // $color-list: $color-global; // optional
+  // $bgcolor-list: $bgcolor-global; // optional
+  // $color-list-hover: $color-global; // optional
+  // $bgcolor-list-hover: lighten($bgcolor-global, 3%); // optional
+  // $color-list-active:white ; // optional
+  // $bgcolor-list-active: $primary; // optional
+
+  // Table colors
+  // $color-table: #; // optional
+  // $bgcolor-table: #; // optional
+  // $border-color-table: #; // optional
+  // $color-table-hover: #; // optional
+  // $bgcolor-table-hover: #; // optional
+
+  // Navbar
+  $bgcolor-navbar: #2a2929;
+  $bgcolor-search-top-dropdown: $accent;
+  $border-image-navbar: linear-gradient(to right, #44bfe3 0%, #b04aff 50%, #ff1794 100%);
+
+  // Logo colors
+  $bgcolor-logo: $bgcolor-navbar;
+  $fillcolor-logo-mark: $gray-700;
+
+  // Sidebar
+  $bgcolor-sidebar: #122c55;
+  $bgcolor-sidebar-nav-item-active: rgba(#969494, 0.3); // optional
+  $text-shadow-sidebar-nav-item-active: 0px 0px 10px #0099ff; // optional
+  // Sidebar resize button
+  $color-resize-button: white;
+  $bgcolor-resize-button: $accent;
+  $color-resize-button-hover: white;
+  $bgcolor-resize-button-hover: darken($bgcolor-resize-button, 5%);
+  // Sidebar contents
+  $bgcolor-sidebar-context: lighten($bgcolor-global, 8%);
+  $color-sidebar-context: $color-global;
+  // Sidebar list group
+  $bgcolor-sidebar-list-group: #1c2a3e; // optional
+
+  // Subnavigation
+  $bgcolor-subnav: lighten($bgcolor-global, 4%); // optional
+
+  // Tabs
+  $bordercolor-nav-tabs: $gray-700; // optional
+  // $color-nav-tabs-link-active: #; //optional
+  $bordercolor-nav-tabs-hover: #666 #666 $bordercolor-nav-tabs; // optional
+  // $bordercolor-nav-tabs-active: # # $bgcolor-global; // optional
+
+  // Tags
+  // $color-tags: #; //optional
+  // $bgcolor-tags: #; //optional
+
+  // Icon colors
+  $color-editor-icons: $color-global;
+
+  // Border colors
+  $border-color-theme: $gray-400;
+  $bordercolor-inline-code: $secondary; // optional
+
+  // admin theme box
+  $color-theme-color-box: $primary;
+
+  @import '../../styles/theme/apply-colors';
+  @import '../../styles/theme/apply-colors-dark';
+
+  //Button
+  .btn-group.grw-page-editor-mode-manager {
+    .btn.btn-outline-primary {
+      @include page-editor-mode-manager.btn-page-editor-mode-manager(lighten($primary, 30%), lighten($primary, 20%), $primary, darken($primary, 20%));
+    }
+  }
+}

+ 0 - 216
packages/app/src/components/Theme/ThemeDefault.module.scss

@@ -1,216 +0,0 @@
-@use '../../styles/variables' as *;
-@use '../../styles/bootstrap/variables' as *;
-@use '../../styles/theme/mixins/page-editor-mode-manager';
-
-// == Define Bootstrap theme colors
-//
-
-// colors for overriding bootstrap $theme-colors
-// $secondary: #;
-// $info: #;
-// $success: #;
-// $warning: #;
-// $danger: #;
-// $light: #;
-// $dark: #;
-
-//== Light Mode
-//
-.theme {
-  [data-color-scheme='light'] :global {
-    $primary: #122c55;
-    $accent: #209fd8;
-
-    // Background colors
-    $bgcolor-global: white;
-    $bgcolor-inline-code: $gray-100; //optional
-    $bgcolor-card: $gray-50;
-    $bgcolor-blinked-section: rgba($primary, 0.1);
-    //$bgcolor-keyword-highlighted: $grw-marker-yellow;
-
-    // Font colors
-    $color-global: #112744;
-    $color-reversal: $light;
-    // $color-header: #2b2b2b;
-    $color-link: #1938ba;
-    $color-link-hover: lighten($color-link, 20%);
-    $color-link-wiki: $color-link;
-    $color-link-wiki-hover: lighten($color-link-wiki, 20%);
-    $color-link-nabvar: $gray-500;
-    $color-inline-code: darken($red, 15%); // optional
-
-    // List Group colors
-    // $color-list: $color-global; // optional
-    // $bgcolor-list: $bgcolor-global; // optional
-    // $color-list-hover: $color-global; // optional
-    // $bgcolor-list-hover: darken($bgcolor-global, 3%); // optional
-    // $color-list-active: $color-reversal; // optional
-    // $bgcolor-list-active: $primary; // optional
-
-    // Table colors
-    // $bgcolor-subnav: #; // optional
-    // $color-table: #; // optional
-    // $bgcolor-table: #; // optional
-    // $border-color-table: #; // optional
-    // $color-table-hover: #; // optional
-    // $bgcolor-table-hover: #; // optional
-
-    // Navbar
-    $bgcolor-navbar: $gray-900;
-    $bgcolor-search-top-dropdown: $accent;
-    $border-image-navbar: linear-gradient(to right, #36c9ff 0%, #36c9ff 33%, #7926ff 66%, #ff2eff 100%);
-
-    // Logo colors
-    $bgcolor-logo: $bgcolor-navbar;
-    $fillcolor-logo-mark: lighten(desaturate($bgcolor-navbar, 10%), 15%);
-
-    // Sidebar
-    $bgcolor-sidebar: $primary;
-    $bgcolor-sidebar-nav-item-active: rgba(black, 0.37); // optional
-    $text-shadow-sidebar-nav-item-active: 0px 0px 10px #0099ff; // optional
-    // Sidebar resize button
-    $color-resize-button: $color-reversal;
-    $bgcolor-resize-button: $accent;
-    $color-resize-button-hover: $color-reversal;
-    $bgcolor-resize-button-hover: lighten($bgcolor-resize-button, 5%);
-    // Sidebar contents
-    $color-sidebar-context: $color-global;
-    $bgcolor-sidebar-context: lighten($primary, 77%);
-    // Sidebar list group
-    $bgcolor-sidebar-list-group: $gray-50; // optional
-
-    // Subnavigation
-    // $bgcolor-subnav: #fafafa; // optional
-
-    // Tabs
-    // $color-nav-tabs-link-active: #; //optional
-    // $bordercolor-nav-tabs-hover: # # $bordercolor-nav-tabs; // optional
-    // $bordercolor-nav-tabs-active: # # $bgcolor-global; // optional
-
-    // Tags
-    // $color-tags: #; //optional
-    // $bgcolor-tags: #; //optional
-
-    // Icon colors
-    $color-editor-icons: $color-global;
-
-    // Border colors
-    $border-color-theme: $gray-400;
-    $bordercolor-inline-code: $gray-400; // optional
-
-    // Dropdown colors
-    $bgcolor-dropdown-link-active: $growi-blue;
-
-    // admin theme box
-    $color-theme-color-box: lighten($primary, 20%);
-
-    @import '../../styles/theme/apply-colors';
-    @import '../../styles/theme/apply-colors-light';
-
-    // Button
-    .btn-group.grw-page-editor-mode-manager {
-      .btn.btn-outline-primary {
-        @include page-editor-mode-manager.btn-page-editor-mode-manager($primary, lighten($primary, 65%), lighten($primary, 70%));
-      }
-    }
-  }
-}
-
-//== Dark Mode
-//
-.theme {
-  [data-color-scheme='dark'] :global {
-    $primary: #115cd3;
-    $accent: #db00c2;
-
-    // Background colors
-    $bgcolor-global: #131418;
-    $bgcolor-inline-code: #1f1f22; //optional
-    $bgcolor-card: darken($bgcolor-global, 5%);
-    $bgcolor-blinked-section: rgba($primary, 0.4);
-    $bgcolor-keyword-highlighted: darken($grw-marker-red, 30%);
-
-    // Font colors
-    $color-global: $gray-400;
-    $color-reversal: $gray-900;
-    // $color-header: desaturate($primary, 20%);
-    $color-link: #7b9ad5;
-    $color-link-hover: lighten($color-link, 10%);
-    $color-link-wiki: $color-link;
-    $color-link-wiki-hover: lighten($color-link-wiki, 10%);
-    $color-link-nabvar: #a7a7a7;
-    $color-inline-code: #c7254e; // optional
-
-    // List Group colors
-    // $color-list: $color-global; // optional
-    // $bgcolor-list: $bgcolor-global; // optional
-    // $color-list-hover: $color-global; // optional
-    // $bgcolor-list-hover: lighten($bgcolor-global, 3%); // optional
-    // $color-list-active:white ; // optional
-    // $bgcolor-list-active: $primary; // optional
-
-    // Table colors
-    // $color-table: #; // optional
-    // $bgcolor-table: #; // optional
-    // $border-color-table: #; // optional
-    // $color-table-hover: #; // optional
-    // $bgcolor-table-hover: #; // optional
-
-    // Navbar
-    $bgcolor-navbar: #2a2929;
-    $bgcolor-search-top-dropdown: $accent;
-    $border-image-navbar: linear-gradient(to right, #44bfe3 0%, #b04aff 50%, #ff1794 100%);
-
-    // Logo colors
-    $bgcolor-logo: $bgcolor-navbar;
-    $fillcolor-logo-mark: $gray-700;
-
-    // Sidebar
-    $bgcolor-sidebar: #122c55;
-    $bgcolor-sidebar-nav-item-active: rgba(#969494, 0.3); // optional
-    $text-shadow-sidebar-nav-item-active: 0px 0px 10px #0099ff; // optional
-    // Sidebar resize button
-    $color-resize-button: white;
-    $bgcolor-resize-button: $accent;
-    $color-resize-button-hover: white;
-    $bgcolor-resize-button-hover: darken($bgcolor-resize-button, 5%);
-    // Sidebar contents
-    $bgcolor-sidebar-context: lighten($bgcolor-global, 8%);
-    $color-sidebar-context: $color-global;
-    // Sidebar list group
-    $bgcolor-sidebar-list-group: #1c2a3e; // optional
-
-    // Subnavigation
-    $bgcolor-subnav: lighten($bgcolor-global, 4%); // optional
-
-    // Tabs
-    $bordercolor-nav-tabs: $gray-700; // optional
-    // $color-nav-tabs-link-active: #; //optional
-    $bordercolor-nav-tabs-hover: #666 #666 $bordercolor-nav-tabs; // optional
-    // $bordercolor-nav-tabs-active: # # $bgcolor-global; // optional
-
-    // Tags
-    // $color-tags: #; //optional
-    // $bgcolor-tags: #; //optional
-
-    // Icon colors
-    $color-editor-icons: $color-global;
-
-    // Border colors
-    $border-color-theme: $gray-400;
-    $bordercolor-inline-code: $secondary; // optional
-
-    // admin theme box
-    $color-theme-color-box: $primary;
-
-    @import '../../styles/theme/apply-colors';
-    @import '../../styles/theme/apply-colors-dark';
-
-    //Button
-    .btn-group.grw-page-editor-mode-manager {
-      .btn.btn-outline-primary {
-        @include page-editor-mode-manager.btn-page-editor-mode-manager(lighten($primary, 30%), lighten($primary, 20%), $primary, darken($primary, 20%));
-      }
-    }
-  }
-}

+ 2 - 2
packages/app/src/components/Theme/ThemeDefault.tsx

@@ -1,8 +1,8 @@
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeDefault.module.scss';
+// import styles from './ThemeDefault.module.scss';
 
 const ThemeDefault = ({ children }: { children: JSX.Element }): JSX.Element => {
-  return <ThemeInjector className={styles.theme}>{children}</ThemeInjector>;
+  return <ThemeInjector className="theme-default">{children}</ThemeInjector>;
 };
 export default ThemeDefault;

+ 205 - 0
packages/app/src/components/Theme/ThemeFireRed.global.scss

@@ -0,0 +1,205 @@
+@use '../../styles/variables' as *;
+@use '../../styles/bootstrap/variables' as *;
+@use '../../styles/theme/mixins/page-editor-mode-manager';
+
+:root[data-theme='light'] .theme-fire-red {
+  // Theme colors
+  $themecolor: #ea5532;
+  $themelight: #ffffff;
+  $accentcolor: #bfbfbf;
+  $subthemecolor: #e6e6e6;
+
+  $primary: $themecolor;
+
+  // Background colors
+  $bgcolor-global: $themelight;
+  $bgcolor-inline-code: $gray-100; //optional
+  $bgcolor-card: $accentcolor;
+  $bgcolor-blinked-section: rgba($primary, 0.1);
+  //$bgcolor-keyword-highlighted: $grw-marker-yellow;
+
+  // Font colors
+  $color-global: #2c2c2c;
+  $color-reversal: $gray-100;
+  $color-link: $primary;
+  $color-link-hover: lighten($color-link, 12%);
+  $color-link-wiki: $primary;
+  $color-link-wiki-hover: lighten($color-link-wiki, 12%);
+  $color-link-nabvar: $color-reversal;
+  $color-inline-code: #c7254e; // optional
+  $color-search: $color-global;
+
+  // List Group colors
+  // $color-list: $color-global;
+  $bgcolor-list: transparent;
+  $color-list-hover: $color-search;
+  $bgcolor-list-hover: darken($bgcolor-global, 3%);
+  // $color-list-active: $color-reversal;
+  // $bgcolor-list-active: $primary;
+
+  // Navbar
+  $bgcolor-navbar: $color-global;
+  $bgcolor-search-top-dropdown: $themecolor;
+  $border-image-navbar: linear-gradient(to right, $primary 0%, darken($primary, 5%) 100%);
+
+  // Logo colors
+  $bgcolor-logo: $themelight;
+  $fillcolor-logo-mark: $themelight;
+
+  // Sidebar
+  $bgcolor-sidebar: $accentcolor;
+  // $bgcolor-sidebar-nav-item-active: rgba(#, 0.37); // optional
+  $text-shadow-sidebar-nav-item-active: 0px 0px 10px #ffffff; // optional
+  // Sidebar resize button
+  $color-resize-button: #ffffff;
+  $bgcolor-resize-button: $primary;
+  $color-resize-button-hover: $color-reversal;
+  $bgcolor-resize-button-hover: lighten($bgcolor-resize-button, 5%);
+  // Sidebar contents
+  $color-sidebar-context: $color-global;
+  $bgcolor-sidebar-context: #ececec;
+  // Sidebar list group
+  // $bgcolor-sidebar-list-group: #; // optional
+
+  // Icon colors
+  $color-editor-icons: $color-global;
+
+  // Border colors
+  $border-color-theme: $primary;
+  $bordercolor-inline-code: #ccc8c8; // optional
+
+  // admin theme box
+  $color-theme-color-box: $primary;
+
+  @import '../../styles/theme/apply-colors';
+  @import '../../styles/theme/apply-colors-light';
+
+  // Navs {
+  .nav-tabs {
+    border-bottom: $border-color-theme 1px solid;
+    .nav-link {
+      &:hover {
+        border-color: lighten($border-color-theme, 10%);
+        border-bottom: none;
+      }
+      &.active {
+        background-color: transparent;
+      }
+    }
+  }
+  // Button
+  .btn-group.grw-page-editor-mode-manager {
+    .btn.btn-outline-primary {
+      @include page-editor-mode-manager.btn-page-editor-mode-manager(#ffffff, $primary, $primary, lighten($primary, 20%));
+    }
+  }
+}
+
+:root[data-theme='dark'] .theme-fire-red {
+  // Theme colors
+  $themecolor: #ea5532;
+  $themedark: #333333;
+  $accentcolor: #212121;
+  $subthemecolor: #2e2e2e;
+
+  $primary: #ea5532;
+  $dark: #a7a7a7;
+
+  // Background colors
+  $bgcolor-global: $themedark;
+  $bgcolor-navbar: #2b2b2b;
+  $bgcolor-inline-code: $gray-100; //optional
+  $bgcolor-card: darken($themedark, 5%);
+  $bgcolor-blinked-section: rgba($primary, 0.5);
+  $bgcolor-keyword-highlighted: darken($grw-marker-red, 30%);
+
+  // Font colors
+  $color-global: #ffffff;
+  $color-reversal: $gray-100;
+  $color-link: $primary;
+  $color-link-hover: lighten($color-link, 12%);
+  $color-link-wiki: $primary;
+  $color-link-wiki-hover: lighten($color-link-wiki, 12%);
+  $color-link-nabvar: $color-reversal;
+  $color-inline-code: $subthemecolor;
+  $color-inline-code: #c7254e; // optional
+  $color-search: $dark;
+
+  // List Group colors
+  // $color-list: $color-global;
+  $bgcolor-list: transparent;
+  $color-list-hover: $accentcolor;
+  // $bgcolor-list-hover: lighten($bgcolor-global, 3%);
+  // $color-list-active: $color-reversal;
+  // $bgcolor-list-active: $primary;
+
+  // Navbar
+  $bgcolor-navbar: #2c2c2c;
+  $bgcolor-search-top-dropdown: $themecolor;
+  $border-image-navbar: linear-gradient(to right, #ea5532 0%, #c9171e 100%);
+
+  // Logo colors
+  $bgcolor-logo: #ffffff;
+  $fillcolor-logo-mark: #ffffff;
+  // $fillcolor-logo-mark: #4e5a60;
+
+  // Sidebar
+  $bgcolor-sidebar: $accentcolor;
+  // $bgcolor-sidebar-nav-item-active: rgba(#, 0.3); // optional
+  $text-shadow-sidebar-nav-item-active: 0px 0px 10px $primary; // optional
+  // Sidebar resize button
+  $color-resize-button: $color-global;
+  $bgcolor-resize-button: $primary;
+  $color-resize-button-hover: $color-global;
+  $bgcolor-resize-button-hover: darken($bgcolor-resize-button, 5%);
+  // Sidebar contents
+  $bgcolor-sidebar-context: #413f3f;
+  $color-sidebar-context: $color-global;
+  // Sidebar list group
+  // $bgcolor-sidebar-list-group: #; // optional
+
+  // Icon colors
+  $color-editor-icons: $color-global;
+
+  // Border colors
+  $border-color-theme: $primary;
+  $bordercolor-inline-code: #4d4d4d; // optional
+
+  // Dropdown colors
+  $color-dropdown-link-active: $color-global;
+  $color-dropdown-link-hover: $color-reversal;
+
+  // admin theme box
+  $color-theme-color-box: $primary;
+
+  @import '../../styles/theme/apply-colors';
+  @import '../../styles/theme/apply-colors-dark';
+
+  // Navs
+  .nav-tabs {
+    border-bottom: $border-color-theme 1px solid;
+    .nav-link {
+      &:hover {
+        border-color: lighten($border-color-theme, 10%);
+        border-bottom: none;
+      }
+      &.active {
+        color: $color-link;
+        background-color: transparent;
+        border-color: $border-color-theme;
+      }
+    }
+  }
+
+  // Table
+  .table {
+    color: white;
+  }
+
+  // Button
+  .btn-group.grw-page-editor-mode-manager {
+    .btn.btn-outline-primary {
+      @include page-editor-mode-manager.btn-page-editor-mode-manager(#ffffff, $primary, $primary, darken($primary, 20%));
+    }
+  }
+}

+ 0 - 209
packages/app/src/components/Theme/ThemeFireRed.module.scss

@@ -1,209 +0,0 @@
-@use '../../styles/variables' as *;
-@use '../../styles/bootstrap/variables' as *;
-@use '../../styles/theme/mixins/page-editor-mode-manager';
-
-.theme {
-  [data-color-scheme='light'] :global {
-    // Theme colors
-    $themecolor: #ea5532;
-    $themelight: #ffffff;
-    $accentcolor: #bfbfbf;
-    $subthemecolor: #e6e6e6;
-
-    $primary: $themecolor;
-
-    // Background colors
-    $bgcolor-global: $themelight;
-    $bgcolor-inline-code: $gray-100; //optional
-    $bgcolor-card: $accentcolor;
-    $bgcolor-blinked-section: rgba($primary, 0.1);
-    //$bgcolor-keyword-highlighted: $grw-marker-yellow;
-
-    // Font colors
-    $color-global: #2c2c2c;
-    $color-reversal: $gray-100;
-    $color-link: $primary;
-    $color-link-hover: lighten($color-link, 12%);
-    $color-link-wiki: $primary;
-    $color-link-wiki-hover: lighten($color-link-wiki, 12%);
-    $color-link-nabvar: $color-reversal;
-    $color-inline-code: #c7254e; // optional
-    $color-search: $color-global;
-
-    // List Group colors
-    // $color-list: $color-global;
-    $bgcolor-list: transparent;
-    $color-list-hover: $color-search;
-    $bgcolor-list-hover: darken($bgcolor-global, 3%);
-    // $color-list-active: $color-reversal;
-    // $bgcolor-list-active: $primary;
-
-    // Navbar
-    $bgcolor-navbar: $color-global;
-    $bgcolor-search-top-dropdown: $themecolor;
-    $border-image-navbar: linear-gradient(to right, $primary 0%, darken($primary, 5%) 100%);
-
-    // Logo colors
-    $bgcolor-logo: $themelight;
-    $fillcolor-logo-mark: $themelight;
-
-    // Sidebar
-    $bgcolor-sidebar: $accentcolor;
-    // $bgcolor-sidebar-nav-item-active: rgba(#, 0.37); // optional
-    $text-shadow-sidebar-nav-item-active: 0px 0px 10px #ffffff; // optional
-    // Sidebar resize button
-    $color-resize-button: #ffffff;
-    $bgcolor-resize-button: $primary;
-    $color-resize-button-hover: $color-reversal;
-    $bgcolor-resize-button-hover: lighten($bgcolor-resize-button, 5%);
-    // Sidebar contents
-    $color-sidebar-context: $color-global;
-    $bgcolor-sidebar-context: #ececec;
-    // Sidebar list group
-    // $bgcolor-sidebar-list-group: #; // optional
-
-    // Icon colors
-    $color-editor-icons: $color-global;
-
-    // Border colors
-    $border-color-theme: $primary;
-    $bordercolor-inline-code: #ccc8c8; // optional
-
-    // admin theme box
-    $color-theme-color-box: $primary;
-
-    @import '../../styles/theme/apply-colors';
-    @import '../../styles/theme/apply-colors-light';
-
-    // Navs {
-    .nav-tabs {
-      border-bottom: $border-color-theme 1px solid;
-      .nav-link {
-        &:hover {
-          border-color: lighten($border-color-theme, 10%);
-          border-bottom: none;
-        }
-        &.active {
-          background-color: transparent;
-        }
-      }
-    }
-    // Button
-    .btn-group.grw-page-editor-mode-manager {
-      .btn.btn-outline-primary {
-        @include page-editor-mode-manager.btn-page-editor-mode-manager(#ffffff, $primary, $primary, lighten($primary, 20%));
-      }
-    }
-  }
-}
-
-.theme {
-  [data-color-scheme='dark'] :global {
-    // Theme colors
-    $themecolor: #ea5532;
-    $themedark: #333333;
-    $accentcolor: #212121;
-    $subthemecolor: #2e2e2e;
-
-    $primary: #ea5532;
-    $dark: #a7a7a7;
-
-    // Background colors
-    $bgcolor-global: $themedark;
-    $bgcolor-navbar: #2b2b2b;
-    $bgcolor-inline-code: $gray-100; //optional
-    $bgcolor-card: darken($themedark, 5%);
-    $bgcolor-blinked-section: rgba($primary, 0.5);
-    $bgcolor-keyword-highlighted: darken($grw-marker-red, 30%);
-
-    // Font colors
-    $color-global: #ffffff;
-    $color-reversal: $gray-100;
-    $color-link: $primary;
-    $color-link-hover: lighten($color-link, 12%);
-    $color-link-wiki: $primary;
-    $color-link-wiki-hover: lighten($color-link-wiki, 12%);
-    $color-link-nabvar: $color-reversal;
-    $color-inline-code: $subthemecolor;
-    $color-inline-code: #c7254e; // optional
-    $color-search: $dark;
-
-    // List Group colors
-    // $color-list: $color-global;
-    $bgcolor-list: transparent;
-    $color-list-hover: $accentcolor;
-    // $bgcolor-list-hover: lighten($bgcolor-global, 3%);
-    // $color-list-active: $color-reversal;
-    // $bgcolor-list-active: $primary;
-
-    // Navbar
-    $bgcolor-navbar: #2c2c2c;
-    $bgcolor-search-top-dropdown: $themecolor;
-    $border-image-navbar: linear-gradient(to right, #ea5532 0%, #c9171e 100%);
-
-    // Logo colors
-    $bgcolor-logo: #ffffff;
-    $fillcolor-logo-mark: #ffffff;
-    // $fillcolor-logo-mark: #4e5a60;
-
-    // Sidebar
-    $bgcolor-sidebar: $accentcolor;
-    // $bgcolor-sidebar-nav-item-active: rgba(#, 0.3); // optional
-    $text-shadow-sidebar-nav-item-active: 0px 0px 10px $primary; // optional
-    // Sidebar resize button
-    $color-resize-button: $color-global;
-    $bgcolor-resize-button: $primary;
-    $color-resize-button-hover: $color-global;
-    $bgcolor-resize-button-hover: darken($bgcolor-resize-button, 5%);
-    // Sidebar contents
-    $bgcolor-sidebar-context: #413f3f;
-    $color-sidebar-context: $color-global;
-    // Sidebar list group
-    // $bgcolor-sidebar-list-group: #; // optional
-
-    // Icon colors
-    $color-editor-icons: $color-global;
-
-    // Border colors
-    $border-color-theme: $primary;
-    $bordercolor-inline-code: #4d4d4d; // optional
-
-    // Dropdown colors
-    $color-dropdown-link-active: $color-global;
-    $color-dropdown-link-hover: $color-reversal;
-
-    // admin theme box
-    $color-theme-color-box: $primary;
-
-    @import '../../styles/theme/apply-colors';
-    @import '../../styles/theme/apply-colors-dark';
-
-    // Navs
-    .nav-tabs {
-      border-bottom: $border-color-theme 1px solid;
-      .nav-link {
-        &:hover {
-          border-color: lighten($border-color-theme, 10%);
-          border-bottom: none;
-        }
-        &.active {
-          color: $color-link;
-          background-color: transparent;
-          border-color: $border-color-theme;
-        }
-      }
-    }
-
-    // Table
-    .table {
-      color: white;
-    }
-
-    // Button
-    .btn-group.grw-page-editor-mode-manager {
-      .btn.btn-outline-primary {
-        @include page-editor-mode-manager.btn-page-editor-mode-manager(#ffffff, $primary, $primary, darken($primary, 20%));
-      }
-    }
-  }
-}

+ 2 - 2
packages/app/src/components/Theme/ThemeFireRed.tsx

@@ -1,8 +1,8 @@
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeFireRed.module.scss';
+// import styles from './ThemeFireRed.module.scss';
 
 const ThemeFireRed = ({ children }: { children: JSX.Element }): JSX.Element => {
-  return <ThemeInjector className={styles.theme}>{children}</ThemeInjector>;
+  return <ThemeInjector className="theme-fire-red">{children}</ThemeInjector>;
 };
 export default ThemeFireRed;

+ 1 - 1
packages/app/src/components/Theme/ThemeFuture.module.scss → packages/app/src/components/Theme/ThemeFuture.global.scss

@@ -6,7 +6,7 @@ $primary: #00b5b7;
 $themecolor: #16282d;
 $accentcolor: #00fff5;
 
-.theme :global {
+:root .theme-future {
   // Background colors
   $bgcolor-global: $themecolor;
   $bgcolor-inline-code: #1f1f22; //optional

+ 2 - 2
packages/app/src/components/Theme/ThemeFuture.tsx

@@ -1,8 +1,8 @@
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeFuture.module.scss';
+// import styles from './ThemeFuture.module.scss';
 
 const ThemeFuture = ({ children }: { children: JSX.Element }): JSX.Element => {
-  return <ThemeInjector className={styles.theme}>{children}</ThemeInjector>;
+  return <ThemeInjector className="theme-future">{children}</ThemeInjector>;
 };
 export default ThemeFuture;

+ 6 - 13
packages/app/src/components/Theme/ThemeHalloween.module.scss → packages/app/src/components/Theme/ThemeHalloween.global.scss

@@ -27,21 +27,10 @@ $light: lighten($secondary, 10%);
   }
 }
 
-.theme :global {
-  .grw-bg-image-wrapper {
-    position: fixed;
-    width: 100%;
-    height: 100%;
-  }
-
-  .grw-navbar {
-    background-image: url('/images/themes/halloween/halloween-navbar.jpg') !important;
-  }
-}
 
 //== Light Mode
 //
-.theme :global {
+:root .theme-halloween {
   // Background colors
   $bgcolor-global: #050000;
   $bgcolor-inline-code: #1f1f22; //optional
@@ -115,7 +104,11 @@ $light: lighten($secondary, 10%);
   @import '../../styles/theme/apply-colors';
   @import '../../styles/theme/apply-colors-dark';
 
-  //Button
+  .grw-navbar {
+    background-image: url('/images/themes/halloween/halloween-navbar.jpg') !important;
+  }
+
+  // Button
   .btn-group.grw-page-editor-mode-manager {
     .btn.btn-outline-primary {
       @include page-editor-mode-manager.btn-page-editor-mode-manager(lighten($primary, 35%), $primary, lighten($primary, 5%), darken($primary, 20%));

+ 4 - 7
packages/app/src/components/Theme/ThemeHalloween.tsx

@@ -4,7 +4,7 @@ import { Themes } from '~/stores/use-next-themes';
 
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeHalloween.module.scss';
+// import styles from './ThemeHalloween.module.scss';
 
 export const getBackgroundImageSrc = (colorScheme: Themes): string => {
   switch (colorScheme) {
@@ -19,17 +19,14 @@ type Props = {
 }
 
 const ThemeHalloween = ({ children, colorScheme }: Props): JSX.Element => {
-  const newChildren = (
+  const bgImageNode = (
     <>
       {colorScheme != null && (
-        <div className='grw-bg-image-wrapper'>
-          <Image className='grw-bg-image' alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
-        </div>
+        <Image alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
       )}
-      {children}
     </>
   );
-  return <ThemeInjector className={styles.theme}>{newChildren}</ThemeInjector>;
+  return <ThemeInjector className="theme-halloween" bgImageNode={bgImageNode}>{children}</ThemeInjector>;
 };
 
 export default ThemeHalloween;

+ 308 - 0
packages/app/src/components/Theme/ThemeHufflepuff.global.scss

@@ -0,0 +1,308 @@
+@use '../../styles/variables' as *;
+@use '../../styles/bootstrap/variables' as *;
+@use '../../styles/theme/mixins/page-editor-mode-manager';
+
+// == Define Bootstrap theme colors
+//
+
+// colors for overriding bootstrap $theme-colors
+// $secondary: #;
+// $info: #;
+// $success: #;
+// $warning: #;
+// $danger: #;
+// $light: #;
+// $dark: #;
+
+// .grw-navbar {
+//   border-bottom: $accentcolor 4px solid;
+// }
+
+//== Light Mode
+//
+:root[data-theme='light'] .theme-hufflepuff {
+  // Theme colors
+  $themecolor: #eaab20;
+  $themelight: #efe2cf;
+  $subthemecolor: #231e1d;
+  $third-main-color: #f0c05a;
+  $accentcolor: #993439;
+
+  $primary: $themecolor;
+  // $secondary: $subthemecolor;
+  $secondary: $third-main-color;
+
+  // Background colors
+  $bgcolor-global: lighten($themelight, 10%);
+  $bgcolor-inline-code: $gray-100; //optional
+  $bgcolor-card: $gray-100;
+  $bgcolor-blinked-section: rgba($primary, 0.5);
+  $bgcolor-keyword-highlighted: $grw-marker-green;
+
+  // Font colors
+  $color-global: $subthemecolor;
+  $color-reversal: white;
+  $color-link: $accentcolor;
+  $color-link-hover: lighten($accentcolor, 10%);
+  $color-link-wiki: $accentcolor;
+  $color-link-wiki-hover: lighten($color-link-wiki, 10%);
+  $color-link-nabvar: $color-reversal;
+  $color-inline-code: #c7254e; // optional
+
+  // List Group colors
+  // $color-list: $color-global;
+  $bgcolor-list: transparent;
+  $color-list-hover: lighten($themecolor, 10%);
+  // $bgcolor-list-hover: darken($bgcolor-list, 2%);
+  // $color-list-active: $bgcolor-global;
+  // $bgcolor-list-active: $accentcolor;
+
+  // Navbar
+  $bgcolor-navbar: $third-main-color;
+  $bgcolor-search-top-dropdown: $themecolor;
+  $border-image-navbar: linear-gradient(to right, #90a555 0%, #a84be6 50%, #eaab20 100%);
+
+  // Logo colors
+  $bgcolor-logo: $bgcolor-navbar;
+  $fillcolor-logo-mark: lighten(desaturate($bgcolor-inline-code, 10%), 15%);
+
+  // Sidebar
+  $bgcolor-sidebar: $themecolor;
+  // Sidebar resize button
+  $color-resize-button: $color-reversal;
+  $bgcolor-resize-button: $subthemecolor;
+  $color-resize-button-hover: $color-reversal;
+  $bgcolor-resize-button-hover: lighten($bgcolor-resize-button, 10%);
+  // Sidebar contents
+  $color-sidebar-context: $accentcolor;
+  $bgcolor-sidebar-context: lighten($themelight, 8%);
+  // Sidebar list group
+  $bgcolor-sidebar-list-group: lighten($themelight, 10%);
+
+  // Icon colors
+  $color-editor-icons: $accentcolor;
+
+  // Border colors
+  $border-color-theme: lighten($subthemecolor, 40%);
+  $bordercolor-inline-code: #ccc8c8; // optional
+
+  // Dropdown colors
+  $bgcolor-dropdown-link-active: $growi-blue;
+
+  // admin theme box
+  $color-theme-color-box: darken($primary, 5%);
+
+  @import '../../styles/theme/apply-colors';
+  @import '../../styles/theme/apply-colors-light';
+
+  //Button
+  .btn.btn-outline-primary {
+    @include page-editor-mode-manager.btn-page-editor-mode-manager(darken($primary, 50%), darken($primary, 50%), lighten($primary, 20%));
+  }
+  .btn-group.grw-page-editor-mode-manager {
+    .btn.btn-outline-primary {
+      @include page-editor-mode-manager.btn-page-editor-mode-manager(darken($primary, 70%), lighten($primary, 5%), lighten($primary, 20%));
+    }
+  }
+
+  .growi:not(.login-page) {
+    // add background-image
+    .page-editor-preview-container {
+      background-image: url('/images/themes/hufflepuff/badger-light3.png');
+      background-attachment: fixed;
+      background-position: bottom;
+      background-size: cover;
+    }
+  }
+
+  // login and register
+  .nologin {
+    #page-wrapper {
+      background-color: $themelight;
+      background-image: url('/images/themes/hufflepuff/badger-light.png');
+      background-attachment: fixed;
+      background-position: bottom;
+      background-size: cover;
+    }
+
+    .noLogin-header,
+    .noLogin-dialog {
+      background-color: rgba(black, 0.1);
+    }
+
+    .link-switch {
+      color: $color-global;
+    }
+
+    .grw-external-auth-form {
+      border-color: $accentcolor !important;
+    }
+  }
+
+  .table {
+    background-color: $bgcolor-global;
+  }
+
+  .card-timeline > .card-header {
+    background-color: $third-main-color;
+  }
+
+  .nav.nav-tabs {
+    > .nav-item {
+      > .nav-link.active {
+        color: $subthemecolor;
+      }
+    }
+  }
+}
+
+:root[data-theme='dark'] .theme-hufflepuff {
+  // Theme colors
+  $themecolor: #eaab20;
+  $themedark: #3d3f38;
+  $subthemecolor: #231e1d;
+  $third-main-color: #967224;
+  $accentcolor: #993439;
+
+  $primary: darken($themecolor, 10%);
+  $secondary: $third-main-color;
+  $dark: #031018;
+
+  // Background colors
+  $bgcolor-global: $themedark;
+  // $bgcolor-navbar: #27343b;
+  $bgcolor-inline-code: $subthemecolor;
+  $bgcolor-card: darken($themedark, 5%);
+  $bgcolor-blinked-section: rgba($primary, 0.5);
+  $bgcolor-keyword-highlighted: darken($grw-marker-cyan, 40%);
+
+  // Font colors
+  $color-global: #efe2cf;
+  $color-reversal: $gray-100;
+  $color-link: lighten($themecolor, 20%);
+  $color-link-hover: lighten($color-link, 10%);
+  $color-link-wiki: lighten($primary, 20%);
+  $color-link-wiki-hover: lighten($color-link-wiki, 20%);
+  $color-link-nabvar: $color-reversal;
+  $color-inline-code: $themecolor;
+  // $color-inline-code: #c7254e; // optional
+  // $color-search: #000102;
+
+  // List Group colors
+  // $color-list: $color-global;
+  $bgcolor-list: transparent;
+  $color-list-hover: $accentcolor;
+  // $bgcolor-list-hover: lighten($bgcolor-global, 3%);
+  // $color-list-active: $color-reversal;
+  // $bgcolor-list-active: $primary;
+
+  // Navbar
+  $bgcolor-navbar: $third-main-color;
+  $bgcolor-search-top-dropdown: $themecolor;
+  $border-image-navbar: linear-gradient(to right, #90a555 0%, #3d98a3 50%, #eaab20 100%);
+
+  // Logo colors
+  $bgcolor-logo: #13191c;
+  $fillcolor-logo-mark: white;
+
+  // Sidebar
+  $bgcolor-sidebar: $themecolor;
+  // $bgcolor-sidebar-nav-item-active: rgba(#, 0.3); // optional
+  $text-shadow-sidebar-nav-item-active: 0px 0px 10px #cc951e; // optional
+  // Sidebar resize button
+  $color-resize-button: $color-global;
+  $bgcolor-resize-button: $accentcolor;
+  $color-resize-button-hover: $color-global;
+  $bgcolor-resize-button-hover: darken($bgcolor-resize-button, 7%);
+  // Sidebar contents
+  $color-sidebar-context: $color-global;
+  $bgcolor-sidebar-context: lighten($themedark, 5%);
+  // Sidebar list group
+  $bgcolor-sidebar-list-group: lighten($subthemecolor, 5%);
+
+  // Icon colors
+  $color-editor-icons: $themecolor;
+
+  // Border colors
+  $border-color-theme: darken($themecolor, 25%);
+  $bordercolor-inline-code: #4d4d4d; // optional
+
+  // Dropdown colors
+  $color-dropdown-link-active: $color-reversal;
+  $color-dropdown-link-hover: $color-global;
+
+  // admin theme box
+  $color-theme-color-box: $primary;
+
+  @import '../../styles/theme/apply-colors';
+  @import '../../styles/theme/apply-colors-dark';
+
+  // Navs
+  .nav-tabs {
+    border-bottom: $border-color-theme 1px solid;
+    .nav-link {
+      &:hover {
+        border-color: lighten($border-color-theme, 10%);
+        border-bottom: none;
+      }
+      &.active {
+        color: $color-link;
+        background-color: transparent;
+        border-color: $border-color-theme;
+      }
+    }
+  }
+
+  // Table
+  .table {
+    color: white;
+  }
+
+  // Button
+  .btn.btn-outline-primary {
+    @include page-editor-mode-manager.btn-page-editor-mode-manager(lighten($primary, 40%), lighten($primary, 15%), darken($primary, 10%), darken($primary, 30%));
+  }
+  .btn-group.grw-page-editor-mode-manager {
+    .btn.btn-outline-primary {
+      @include page-editor-mode-manager.btn-page-editor-mode-manager(lighten($primary, 40%), lighten($primary, 15%), darken($primary, 0%), darken($primary, 30%));
+    }
+  }
+
+  .card-timeline > .card-header {
+    background-color: $accentcolor;
+  }
+
+  .growi:not(.login-page) {
+    // add background-image
+    .page-editor-preview-container {
+      background-image: url('/images/themes/hufflepuff/badger-dark.jpg');
+      background-attachment: fixed;
+      background-position: bottom;
+      background-size: cover;
+    }
+  }
+
+  // login and register
+  .nologin {
+    #page-wrapper {
+      background-color: $themedark;
+      background-image: url('/images/themes/hufflepuff/badger-light.png');
+      background-attachment: fixed;
+      background-position: bottom;
+      background-size: cover;
+    }
+
+    .noLogin-header,
+    .noLogin-dialog {
+      background-color: rgba(black, 0.1);
+    }
+
+    .link-switch {
+      color: $color-global;
+    }
+
+    .grw-external-auth-form {
+      border-color: $accentcolor !important;
+    }
+  }
+}

+ 0 - 325
packages/app/src/components/Theme/ThemeHufflepuff.module.scss

@@ -1,325 +0,0 @@
-@use '../../styles/variables' as *;
-@use '../../styles/bootstrap/variables' as *;
-@use '../../styles/theme/mixins/page-editor-mode-manager';
-
-// == Define Bootstrap theme colors
-//
-
-// colors for overriding bootstrap $theme-colors
-// $secondary: #;
-// $info: #;
-// $success: #;
-// $warning: #;
-// $danger: #;
-// $light: #;
-// $dark: #;
-
-// .grw-navbar {
-//   border-bottom: $accentcolor 4px solid;
-// }
-
-.theme :global {
-  .grw-bg-image-wrapper {
-    position: fixed;
-    width: 100%;
-    height: 100%;
-  }
-
-  .grw-bg-image {
-    object-fit: cover;
-    object-position: bottom;
-  }
-}
-
-//== Light Mode
-//
-.theme {
-  [data-color-scheme='light'] :global {
-    // Theme colors
-    $themecolor: #eaab20;
-    $themelight: #efe2cf;
-    $subthemecolor: #231e1d;
-    $third-main-color: #f0c05a;
-    $accentcolor: #993439;
-
-    $primary: $themecolor;
-    // $secondary: $subthemecolor;
-    $secondary: $third-main-color;
-
-    // Background colors
-    $bgcolor-global: lighten($themelight, 10%);
-    $bgcolor-inline-code: $gray-100; //optional
-    $bgcolor-card: $gray-100;
-    $bgcolor-blinked-section: rgba($primary, 0.5);
-    $bgcolor-keyword-highlighted: $grw-marker-green;
-
-    // Font colors
-    $color-global: $subthemecolor;
-    $color-reversal: white;
-    $color-link: $accentcolor;
-    $color-link-hover: lighten($accentcolor, 10%);
-    $color-link-wiki: $accentcolor;
-    $color-link-wiki-hover: lighten($color-link-wiki, 10%);
-    $color-link-nabvar: $color-reversal;
-    $color-inline-code: #c7254e; // optional
-
-    // List Group colors
-    // $color-list: $color-global;
-    $bgcolor-list: transparent;
-    $color-list-hover: lighten($themecolor, 10%);
-    // $bgcolor-list-hover: darken($bgcolor-list, 2%);
-    // $color-list-active: $bgcolor-global;
-    // $bgcolor-list-active: $accentcolor;
-
-    // Navbar
-    $bgcolor-navbar: $third-main-color;
-    $bgcolor-search-top-dropdown: $themecolor;
-    $border-image-navbar: linear-gradient(to right, #90a555 0%, #a84be6 50%, #eaab20 100%);
-
-    // Logo colors
-    $bgcolor-logo: $bgcolor-navbar;
-    $fillcolor-logo-mark: lighten(desaturate($bgcolor-inline-code, 10%), 15%);
-
-    // Sidebar
-    $bgcolor-sidebar: $themecolor;
-    // Sidebar resize button
-    $color-resize-button: $color-reversal;
-    $bgcolor-resize-button: $subthemecolor;
-    $color-resize-button-hover: $color-reversal;
-    $bgcolor-resize-button-hover: lighten($bgcolor-resize-button, 10%);
-    // Sidebar contents
-    $color-sidebar-context: $accentcolor;
-    $bgcolor-sidebar-context: lighten($themelight, 8%);
-    // Sidebar list group
-    $bgcolor-sidebar-list-group: lighten($themelight, 10%);
-
-    // Icon colors
-    $color-editor-icons: $accentcolor;
-
-    // Border colors
-    $border-color-theme: lighten($subthemecolor, 40%);
-    $bordercolor-inline-code: #ccc8c8; // optional
-
-    // Dropdown colors
-    $bgcolor-dropdown-link-active: $growi-blue;
-
-    // admin theme box
-    $color-theme-color-box: darken($primary, 5%);
-
-    @import '../../styles/theme/apply-colors';
-    @import '../../styles/theme/apply-colors-light';
-
-    //Button
-    .btn.btn-outline-primary {
-      @include page-editor-mode-manager.btn-page-editor-mode-manager(darken($primary, 50%), darken($primary, 50%), lighten($primary, 20%));
-    }
-    .btn-group.grw-page-editor-mode-manager {
-      .btn.btn-outline-primary {
-        @include page-editor-mode-manager.btn-page-editor-mode-manager(darken($primary, 70%), lighten($primary, 5%), lighten($primary, 20%));
-      }
-    }
-
-    .growi:not(.login-page) {
-      // add background-image
-      .page-editor-preview-container {
-        background-image: url('/images/themes/hufflepuff/badger-light3.png');
-        background-attachment: fixed;
-        background-position: bottom;
-        background-size: cover;
-      }
-    }
-
-    // login and register
-    .nologin {
-      #page-wrapper {
-        background-color: $themelight;
-        background-image: url('/images/themes/hufflepuff/badger-light.png');
-        background-attachment: fixed;
-        background-position: bottom;
-        background-size: cover;
-      }
-
-      .noLogin-header,
-      .noLogin-dialog {
-        background-color: rgba(black, 0.1);
-      }
-
-      .link-switch {
-        color: $color-global;
-      }
-
-      .grw-external-auth-form {
-        border-color: $accentcolor !important;
-      }
-    }
-
-    .table {
-      background-color: $bgcolor-global;
-    }
-
-    .card-timeline > .card-header {
-      background-color: $third-main-color;
-    }
-
-    .nav.nav-tabs {
-      > .nav-item {
-        > .nav-link.active {
-          color: $subthemecolor;
-        }
-      }
-    }
-  }
-}
-
-.theme {
-  [data-color-scheme='dark'] :global {
-    // Theme colors
-    $themecolor: #eaab20;
-    $themedark: #3d3f38;
-    $subthemecolor: #231e1d;
-    $third-main-color: #967224;
-    $accentcolor: #993439;
-
-    $primary: darken($themecolor, 10%);
-    $secondary: $third-main-color;
-    $dark: #031018;
-
-    // Background colors
-    $bgcolor-global: $themedark;
-    // $bgcolor-navbar: #27343b;
-    $bgcolor-inline-code: $subthemecolor;
-    $bgcolor-card: darken($themedark, 5%);
-    $bgcolor-blinked-section: rgba($primary, 0.5);
-    $bgcolor-keyword-highlighted: darken($grw-marker-cyan, 40%);
-
-    // Font colors
-    $color-global: #efe2cf;
-    $color-reversal: $gray-100;
-    $color-link: lighten($themecolor, 20%);
-    $color-link-hover: lighten($color-link, 10%);
-    $color-link-wiki: lighten($primary, 20%);
-    $color-link-wiki-hover: lighten($color-link-wiki, 20%);
-    $color-link-nabvar: $color-reversal;
-    $color-inline-code: $themecolor;
-    // $color-inline-code: #c7254e; // optional
-    // $color-search: #000102;
-
-    // List Group colors
-    // $color-list: $color-global;
-    $bgcolor-list: transparent;
-    $color-list-hover: $accentcolor;
-    // $bgcolor-list-hover: lighten($bgcolor-global, 3%);
-    // $color-list-active: $color-reversal;
-    // $bgcolor-list-active: $primary;
-
-    // Navbar
-    $bgcolor-navbar: $third-main-color;
-    $bgcolor-search-top-dropdown: $themecolor;
-    $border-image-navbar: linear-gradient(to right, #90a555 0%, #3d98a3 50%, #eaab20 100%);
-
-    // Logo colors
-    $bgcolor-logo: #13191c;
-    $fillcolor-logo-mark: white;
-
-    // Sidebar
-    $bgcolor-sidebar: $themecolor;
-    // $bgcolor-sidebar-nav-item-active: rgba(#, 0.3); // optional
-    $text-shadow-sidebar-nav-item-active: 0px 0px 10px #cc951e; // optional
-    // Sidebar resize button
-    $color-resize-button: $color-global;
-    $bgcolor-resize-button: $accentcolor;
-    $color-resize-button-hover: $color-global;
-    $bgcolor-resize-button-hover: darken($bgcolor-resize-button, 7%);
-    // Sidebar contents
-    $color-sidebar-context: $color-global;
-    $bgcolor-sidebar-context: lighten($themedark, 5%);
-    // Sidebar list group
-    $bgcolor-sidebar-list-group: lighten($subthemecolor, 5%);
-
-    // Icon colors
-    $color-editor-icons: $themecolor;
-
-    // Border colors
-    $border-color-theme: darken($themecolor, 25%);
-    $bordercolor-inline-code: #4d4d4d; // optional
-
-    // Dropdown colors
-    $color-dropdown-link-active: $color-reversal;
-    $color-dropdown-link-hover: $color-global;
-
-    // admin theme box
-    $color-theme-color-box: $primary;
-
-    @import '../../styles/theme/apply-colors';
-    @import '../../styles/theme/apply-colors-dark';
-
-    // Navs
-    .nav-tabs {
-      border-bottom: $border-color-theme 1px solid;
-      .nav-link {
-        &:hover {
-          border-color: lighten($border-color-theme, 10%);
-          border-bottom: none;
-        }
-        &.active {
-          color: $color-link;
-          background-color: transparent;
-          border-color: $border-color-theme;
-        }
-      }
-    }
-
-    // Table
-    .table {
-      color: white;
-    }
-
-    // Button
-    .btn.btn-outline-primary {
-      @include page-editor-mode-manager.btn-page-editor-mode-manager(lighten($primary, 40%), lighten($primary, 15%), darken($primary, 10%), darken($primary, 30%));
-    }
-    .btn-group.grw-page-editor-mode-manager {
-      .btn.btn-outline-primary {
-        @include page-editor-mode-manager.btn-page-editor-mode-manager(lighten($primary, 40%), lighten($primary, 15%), darken($primary, 0%), darken($primary, 30%));
-      }
-    }
-
-    .card-timeline > .card-header {
-      background-color: $accentcolor;
-    }
-
-    .growi:not(.login-page) {
-      // add background-image
-      .page-editor-preview-container {
-        background-image: url('/images/themes/hufflepuff/badger-dark.jpg');
-        background-attachment: fixed;
-        background-position: bottom;
-        background-size: cover;
-      }
-    }
-
-    // login and register
-    .nologin {
-      #page-wrapper {
-        background-color: $themedark;
-        background-image: url('/images/themes/hufflepuff/badger-light.png');
-        background-attachment: fixed;
-        background-position: bottom;
-        background-size: cover;
-      }
-
-      .noLogin-header,
-      .noLogin-dialog {
-        background-color: rgba(black, 0.1);
-      }
-
-      .link-switch {
-        color: $color-global;
-      }
-
-      .grw-external-auth-form {
-        border-color: $accentcolor !important;
-      }
-    }
-  }
-}

+ 4 - 7
packages/app/src/components/Theme/ThemeHufflepuff.tsx

@@ -4,7 +4,7 @@ import { Themes } from '~/stores/use-next-themes';
 
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeHufflepuff.module.scss';
+// import styles from './ThemeHufflepuff.module.scss';
 
 export const getBackgroundImageSrc = (colorScheme: Themes): string => {
   switch (colorScheme) {
@@ -23,17 +23,14 @@ type Props = {
 }
 
 const ThemeHufflepuff = ({ children, colorScheme }: Props): JSX.Element => {
-  const newChildren = (
+  const bgImageNode = (
     <>
       {colorScheme != null && (
-        <div className='grw-bg-image-wrapper'>
-          <Image className='grw-bg-image' alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
-        </div>
+        <Image alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
       )}
-      {children}
     </>
   );
-  return <ThemeInjector className={styles.theme}>{newChildren}</ThemeInjector>;
+  return <ThemeInjector className="theme-hufflepuff" bgImageNode={bgImageNode}>{children}</ThemeInjector>;
 };
 
 export default ThemeHufflepuff;

+ 1 - 9
packages/app/src/components/Theme/ThemeIsland.module.scss → packages/app/src/components/Theme/ThemeIsland.global.scss

@@ -6,15 +6,7 @@
 $color-primary: #97cbc3;
 $color-themelight: rgba(183, 226, 219, 1);
 
-.theme :global {
-  .grw-bg-image-wrapper {
-    position: fixed;
-    width: 100%;
-    height: 100%;
-  }
-}
-
-.theme :global {
+:root .theme-island {
   $primary: $color-primary;
   // Background colors
   $bgcolor-card: $gray-50;

+ 4 - 7
packages/app/src/components/Theme/ThemeIsland.tsx

@@ -4,7 +4,7 @@ import { Themes } from '~/stores/use-next-themes';
 
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeIsland.module.scss';
+// import styles from './ThemeIsland.module.scss';
 
 export const getBackgroundImageSrc = (colorScheme: Themes): string => {
   switch (colorScheme) {
@@ -19,17 +19,14 @@ type Props = {
 }
 
 const ThemeIsland = ({ children, colorScheme }: Props): JSX.Element => {
-  const newChildren = (
+  const bgImageNode = (
     <>
       {colorScheme != null && (
-        <div className='grw-bg-image-wrapper'>
-          <Image className='grw-bg-image' alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
-        </div>
+        <Image alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
       )}
-      {children}
     </>
   );
-  return <ThemeInjector className={styles.theme}>{newChildren}</ThemeInjector>;
+  return <ThemeInjector className="theme-island" bgImageNode={bgImageNode}>{children}</ThemeInjector>;
 };
 
 export default ThemeIsland;

+ 205 - 0
packages/app/src/components/Theme/ThemeJadeGreen.global.scss

@@ -0,0 +1,205 @@
+@use '../../styles/variables' as *;
+@use '../../styles/bootstrap/variables' as *;
+@use '../../styles/theme/mixins/page-editor-mode-manager';
+
+:root[data-theme='light'] .theme-jade-green {
+  // Theme colors
+  $themecolor: #38b48b;
+  $themelight: #ffffff;
+  $accentcolor: #bfbfbf;
+  $subthemecolor: #e6e6e6;
+
+  $primary: $themecolor;
+
+  // Background colors
+  $bgcolor-global: $themelight;
+  $bgcolor-inline-code: $gray-100; //optional
+  $bgcolor-card: $accentcolor;
+  $bgcolor-blinked-section: rgba($primary, 0.1);
+  //$bgcolor-keyword-highlighted: $grw-marker-yellow;
+
+  // Font colors
+  $color-global: #2c2c2c;
+  $color-reversal: $gray-100;
+  $color-link: $primary;
+  $color-link-hover: lighten($color-link, 12%);
+  $color-link-wiki: $primary;
+  $color-link-wiki-hover: lighten($color-link-wiki, 12%);
+  $color-link-nabvar: $color-reversal;
+  $color-inline-code: #c7254e; // optional
+  $color-search: $color-global;
+
+  // List Group colors
+  // $color-list: $color-global;
+  $bgcolor-list: transparent;
+  $color-list-hover: $color-search;
+  $bgcolor-list-hover: darken($bgcolor-global, 3%);
+  // $color-list-active: $color-reversal;
+  // $bgcolor-list-active: $primary;
+
+  // Navbar
+  $bgcolor-navbar: $color-global;
+  $bgcolor-search-top-dropdown: $themecolor;
+  $border-image-navbar: linear-gradient(to right, $primary 0%, darken($primary, 5%) 100%);
+
+  // Logo colors
+  $bgcolor-logo: $themelight;
+  $fillcolor-logo-mark: $themelight;
+
+  // Sidebar
+  $bgcolor-sidebar: $accentcolor;
+  // $bgcolor-sidebar-nav-item-active: rgba(#, 0.37); // optional
+  $text-shadow-sidebar-nav-item-active: 0px 0px 10px #ffffff; // optional
+  // Sidebar resize button
+  $color-resize-button: #ffffff;
+  $bgcolor-resize-button: $primary;
+  $color-resize-button-hover: $color-reversal;
+  $bgcolor-resize-button-hover: lighten($bgcolor-resize-button, 5%);
+  // Sidebar contents
+  $color-sidebar-context: $color-global;
+  $bgcolor-sidebar-context: #ebebeb;
+  // Sidebar list group
+  // $bgcolor-sidebar-list-group: #; // optional
+
+  // Icon colors
+  $color-editor-icons: $color-global;
+
+  // Border colors
+  $border-color-theme: $primary;
+  $bordercolor-inline-code: #ccc8c8; // optional
+
+  // admin theme box
+  $color-theme-color-box: $primary;
+
+  @import '../../styles/theme/apply-colors';
+  @import '../../styles/theme/apply-colors-light';
+
+  // Navs {
+  .nav-tabs {
+    border-bottom: $border-color-theme 1px solid;
+    .nav-link {
+      &:hover {
+        border-color: lighten($border-color-theme, 10%);
+        border-bottom: none;
+      }
+      &.active {
+        background-color: transparent;
+      }
+    }
+  }
+  // Button
+  .btn-group.grw-page-editor-mode-manager {
+    .btn.btn-outline-primary {
+      @include page-editor-mode-manager.btn-page-editor-mode-manager(#ffffff, $primary, $primary, lighten($primary, 20%));
+    }
+  }
+}
+
+:root[data-theme='dark'] .theme-jade-green {
+  // Theme colors
+  $themecolor: #38b48b;
+  $themedark: #333333;
+  $accentcolor: #212121;
+  $subthemecolor: #2e2e2e;
+
+  $primary: #38b48b;
+  $dark: #a7a7a7;
+
+  // Background colors
+  $bgcolor-global: $themedark;
+  $bgcolor-navbar: #2b2b2b;
+  $bgcolor-inline-code: $gray-100; //optional
+  $bgcolor-card: darken($themedark, 5%);
+  $bgcolor-blinked-section: rgba($primary, 0.5);
+  $bgcolor-keyword-highlighted: darken($grw-marker-red, 30%);
+
+  // Font colors
+  $color-global: #ffffff;
+  $color-reversal: $gray-100;
+  $color-link: $primary;
+  $color-link-hover: lighten($color-link, 12%);
+  $color-link-wiki: $primary;
+  $color-link-wiki-hover: lighten($color-link-wiki, 12%);
+  $color-link-nabvar: $color-reversal;
+  $color-inline-code: $subthemecolor;
+  $color-inline-code: #c7254e; // optional
+  $color-search: $dark;
+
+  // List Group colors
+  // $color-list: $color-global;
+  $bgcolor-list: transparent;
+  $color-list-hover: $accentcolor;
+  // $bgcolor-list-hover: lighten($bgcolor-global, 3%);
+  // $color-list-active: $color-reversal;
+  // $bgcolor-list-active: $primary;
+
+  // Navbar
+  $bgcolor-navbar: #2c2c2c;
+  $bgcolor-search-top-dropdown: $themecolor;
+  $border-image-navbar: linear-gradient(to right, $primary 0%, darken($primary, 5%) 100%);
+
+  // Logo colors
+  $bgcolor-logo: #ffffff;
+  $fillcolor-logo-mark: #ffffff;
+  // $fillcolor-logo-mark: #4e5a60;
+
+  // Sidebar
+  $bgcolor-sidebar: $accentcolor;
+  // $bgcolor-sidebar-nav-item-active: rgba(#, 0.3); // optional
+  $text-shadow-sidebar-nav-item-active: 0px 0px 10px $primary; // optional
+  // Sidebar resize button
+  $color-resize-button: $color-global;
+  $bgcolor-resize-button: $primary;
+  $color-resize-button-hover: $color-global;
+  $bgcolor-resize-button-hover: darken($bgcolor-resize-button, 5%);
+  // Sidebar contents
+  $bgcolor-sidebar-context: #3c403c;
+  $color-sidebar-context: $color-global;
+  // Sidebar list group
+  // $bgcolor-sidebar-list-group: #; // optional
+
+  // Icon colors
+  $color-editor-icons: $color-global;
+
+  // Border colors
+  $border-color-theme: $primary;
+  $bordercolor-inline-code: #4d4d4d; // optional
+
+  // Dropdown colors
+  $color-dropdown-link-active: $color-global;
+  $color-dropdown-link-hover: $color-reversal;
+
+  // admin theme box
+  $color-theme-color-box: $primary;
+
+  @import '../../styles/theme/apply-colors';
+  @import '../../styles/theme/apply-colors-dark';
+
+  // Navs
+  .nav-tabs {
+    border-bottom: $border-color-theme 1px solid;
+    .nav-link {
+      &:hover {
+        border-color: lighten($border-color-theme, 10%);
+        border-bottom: none;
+      }
+      &.active {
+        color: $color-link;
+        background-color: transparent;
+        border-color: $border-color-theme;
+      }
+    }
+  }
+
+  // Table
+  .table {
+    color: white;
+  }
+
+  // Button
+  .btn-group.grw-page-editor-mode-manager {
+    .btn.btn-outline-primary {
+      @include page-editor-mode-manager.btn-page-editor-mode-manager(#ffffff, $primary, $primary, darken($primary, 20%));
+    }
+  }
+}

+ 0 - 209
packages/app/src/components/Theme/ThemeJadeGreen.module.scss

@@ -1,209 +0,0 @@
-@use '../../styles/variables' as *;
-@use '../../styles/bootstrap/variables' as *;
-@use '../../styles/theme/mixins/page-editor-mode-manager';
-
-.theme {
-  [data-color-scheme='light'] :global {
-    // Theme colors
-    $themecolor: #38b48b;
-    $themelight: #ffffff;
-    $accentcolor: #bfbfbf;
-    $subthemecolor: #e6e6e6;
-
-    $primary: $themecolor;
-
-    // Background colors
-    $bgcolor-global: $themelight;
-    $bgcolor-inline-code: $gray-100; //optional
-    $bgcolor-card: $accentcolor;
-    $bgcolor-blinked-section: rgba($primary, 0.1);
-    //$bgcolor-keyword-highlighted: $grw-marker-yellow;
-
-    // Font colors
-    $color-global: #2c2c2c;
-    $color-reversal: $gray-100;
-    $color-link: $primary;
-    $color-link-hover: lighten($color-link, 12%);
-    $color-link-wiki: $primary;
-    $color-link-wiki-hover: lighten($color-link-wiki, 12%);
-    $color-link-nabvar: $color-reversal;
-    $color-inline-code: #c7254e; // optional
-    $color-search: $color-global;
-
-    // List Group colors
-    // $color-list: $color-global;
-    $bgcolor-list: transparent;
-    $color-list-hover: $color-search;
-    $bgcolor-list-hover: darken($bgcolor-global, 3%);
-    // $color-list-active: $color-reversal;
-    // $bgcolor-list-active: $primary;
-
-    // Navbar
-    $bgcolor-navbar: $color-global;
-    $bgcolor-search-top-dropdown: $themecolor;
-    $border-image-navbar: linear-gradient(to right, $primary 0%, darken($primary, 5%) 100%);
-
-    // Logo colors
-    $bgcolor-logo: $themelight;
-    $fillcolor-logo-mark: $themelight;
-
-    // Sidebar
-    $bgcolor-sidebar: $accentcolor;
-    // $bgcolor-sidebar-nav-item-active: rgba(#, 0.37); // optional
-    $text-shadow-sidebar-nav-item-active: 0px 0px 10px #ffffff; // optional
-    // Sidebar resize button
-    $color-resize-button: #ffffff;
-    $bgcolor-resize-button: $primary;
-    $color-resize-button-hover: $color-reversal;
-    $bgcolor-resize-button-hover: lighten($bgcolor-resize-button, 5%);
-    // Sidebar contents
-    $color-sidebar-context: $color-global;
-    $bgcolor-sidebar-context: #ebebeb;
-    // Sidebar list group
-    // $bgcolor-sidebar-list-group: #; // optional
-
-    // Icon colors
-    $color-editor-icons: $color-global;
-
-    // Border colors
-    $border-color-theme: $primary;
-    $bordercolor-inline-code: #ccc8c8; // optional
-
-    // admin theme box
-    $color-theme-color-box: $primary;
-
-    @import '../../styles/theme/apply-colors';
-    @import '../../styles/theme/apply-colors-light';
-
-    // Navs {
-    .nav-tabs {
-      border-bottom: $border-color-theme 1px solid;
-      .nav-link {
-        &:hover {
-          border-color: lighten($border-color-theme, 10%);
-          border-bottom: none;
-        }
-        &.active {
-          background-color: transparent;
-        }
-      }
-    }
-    // Button
-    .btn-group.grw-page-editor-mode-manager {
-      .btn.btn-outline-primary {
-        @include page-editor-mode-manager.btn-page-editor-mode-manager(#ffffff, $primary, $primary, lighten($primary, 20%));
-      }
-    }
-  }
-}
-
-.theme {
-  [data-color-scheme='dark'] :global {
-    // Theme colors
-    $themecolor: #38b48b;
-    $themedark: #333333;
-    $accentcolor: #212121;
-    $subthemecolor: #2e2e2e;
-
-    $primary: #38b48b;
-    $dark: #a7a7a7;
-
-    // Background colors
-    $bgcolor-global: $themedark;
-    $bgcolor-navbar: #2b2b2b;
-    $bgcolor-inline-code: $gray-100; //optional
-    $bgcolor-card: darken($themedark, 5%);
-    $bgcolor-blinked-section: rgba($primary, 0.5);
-    $bgcolor-keyword-highlighted: darken($grw-marker-red, 30%);
-
-    // Font colors
-    $color-global: #ffffff;
-    $color-reversal: $gray-100;
-    $color-link: $primary;
-    $color-link-hover: lighten($color-link, 12%);
-    $color-link-wiki: $primary;
-    $color-link-wiki-hover: lighten($color-link-wiki, 12%);
-    $color-link-nabvar: $color-reversal;
-    $color-inline-code: $subthemecolor;
-    $color-inline-code: #c7254e; // optional
-    $color-search: $dark;
-
-    // List Group colors
-    // $color-list: $color-global;
-    $bgcolor-list: transparent;
-    $color-list-hover: $accentcolor;
-    // $bgcolor-list-hover: lighten($bgcolor-global, 3%);
-    // $color-list-active: $color-reversal;
-    // $bgcolor-list-active: $primary;
-
-    // Navbar
-    $bgcolor-navbar: #2c2c2c;
-    $bgcolor-search-top-dropdown: $themecolor;
-    $border-image-navbar: linear-gradient(to right, $primary 0%, darken($primary, 5%) 100%);
-
-    // Logo colors
-    $bgcolor-logo: #ffffff;
-    $fillcolor-logo-mark: #ffffff;
-    // $fillcolor-logo-mark: #4e5a60;
-
-    // Sidebar
-    $bgcolor-sidebar: $accentcolor;
-    // $bgcolor-sidebar-nav-item-active: rgba(#, 0.3); // optional
-    $text-shadow-sidebar-nav-item-active: 0px 0px 10px $primary; // optional
-    // Sidebar resize button
-    $color-resize-button: $color-global;
-    $bgcolor-resize-button: $primary;
-    $color-resize-button-hover: $color-global;
-    $bgcolor-resize-button-hover: darken($bgcolor-resize-button, 5%);
-    // Sidebar contents
-    $bgcolor-sidebar-context: #3c403c;
-    $color-sidebar-context: $color-global;
-    // Sidebar list group
-    // $bgcolor-sidebar-list-group: #; // optional
-
-    // Icon colors
-    $color-editor-icons: $color-global;
-
-    // Border colors
-    $border-color-theme: $primary;
-    $bordercolor-inline-code: #4d4d4d; // optional
-
-    // Dropdown colors
-    $color-dropdown-link-active: $color-global;
-    $color-dropdown-link-hover: $color-reversal;
-
-    // admin theme box
-    $color-theme-color-box: $primary;
-
-    @import '../../styles/theme/apply-colors';
-    @import '../../styles/theme/apply-colors-dark';
-
-    // Navs
-    .nav-tabs {
-      border-bottom: $border-color-theme 1px solid;
-      .nav-link {
-        &:hover {
-          border-color: lighten($border-color-theme, 10%);
-          border-bottom: none;
-        }
-        &.active {
-          color: $color-link;
-          background-color: transparent;
-          border-color: $border-color-theme;
-        }
-      }
-    }
-
-    // Table
-    .table {
-      color: white;
-    }
-
-    // Button
-    .btn-group.grw-page-editor-mode-manager {
-      .btn.btn-outline-primary {
-        @include page-editor-mode-manager.btn-page-editor-mode-manager(#ffffff, $primary, $primary, darken($primary, 20%));
-      }
-    }
-  }
-}

+ 2 - 2
packages/app/src/components/Theme/ThemeJadeGreen.tsx

@@ -1,8 +1,8 @@
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeJadeGreen.module.scss';
+// import styles from './ThemeJadeGreen.module.scss';
 
 const ThemeJadeGreen = ({ children }: { children: JSX.Element }): JSX.Element => {
-  return <ThemeInjector className={styles.theme}>{children}</ThemeInjector>;
+  return <ThemeInjector className="theme-jade-green">{children}</ThemeInjector>;
 };
 export default ThemeJadeGreen;

+ 1 - 1
packages/app/src/components/Theme/ThemeKibela.module.scss → packages/app/src/components/Theme/ThemeKibela.global.scss

@@ -8,7 +8,7 @@ $subthemecolor: rgb(88, 130, 250);
 $lightthemecolor: rgba(181, 203, 247, 0.61);
 
 // Light Mode
-.theme :global {
+:root .theme-kibela {
   // Background colors
   $bgcolor-navbar: white;
   $bgcolor-navbar-active: $bgcolor-theme;

+ 2 - 2
packages/app/src/components/Theme/ThemeKibela.tsx

@@ -1,8 +1,8 @@
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeKibela.module.scss';
+// import styles from './ThemeKibela.module.scss';
 
 const ThemeKibela = ({ children }: { children: JSX.Element }): JSX.Element => {
-  return <ThemeInjector className={styles.theme}>{children}</ThemeInjector>;
+  return <ThemeInjector className="theme-kibela">{children}</ThemeInjector>;
 };
 export default ThemeKibela;

+ 201 - 0
packages/app/src/components/Theme/ThemeMonoBlue.global.scss

@@ -0,0 +1,201 @@
+@use '../../styles/variables' as *;
+@use '../../styles/bootstrap/variables' as *;
+@use '../../styles/theme/mixins/page-editor-mode-manager';
+
+:root[data-theme='light'] .theme-mono-blue {
+  // Theme colors
+  $themecolor: #00587a;
+  $themelight: #f7fbfd;
+  $accentcolor: #16617d;
+  $subthemecolor: #186718;
+
+  $primary: $themecolor;
+
+  // Background colors
+  $bgcolor-global: $themelight;
+  $bgcolor-inline-code: $gray-100; //optional
+  $bgcolor-card: darken($themelight, 5%);
+  $bgcolor-blinked-section: rgba($primary, 0.1);
+  //$bgcolor-keyword-highlighted: $grw-marker-yellow;
+
+  // Font colors
+  $color-global: $themecolor;
+  $color-reversal: $gray-100;
+  $color-link: lighten($primary, 5%);
+  $color-link-hover: lighten($color-link, 12%);
+  $color-link-wiki: lighten($primary, 20%);
+  $color-link-wiki-hover: lighten($color-link-wiki, 20%);
+  $color-link-nabvar: $color-reversal;
+  $color-inline-code: #c7254e; // optional
+  $color-search: #c0d6df;
+
+  // List Group colors
+  // $color-list: $color-global;
+  $bgcolor-list: transparent;
+  $color-list-hover: $color-search;
+  $bgcolor-list-hover: lighten($primary, 70%);
+  // $color-list-active: $color-reversal;
+  // $bgcolor-list-active: $primary;
+
+  // Navbar
+  $bgcolor-navbar: #2a2929;
+  $bgcolor-search-top-dropdown: $themecolor;
+  $border-image-navbar: linear-gradient(to right, #54bafd 0%, #3d98a3 50%, #708b0b 100%);
+
+  // Logo colors
+  $bgcolor-logo: $themecolor;
+  $fillcolor-logo-mark: lighten(desaturate($bgcolor-navbar, 10%), 15%);
+
+  // Sidebar
+  $bgcolor-sidebar: $themecolor;
+  // $bgcolor-sidebar-nav-item-active: rgba(#, 0.37); // optional
+  $text-shadow-sidebar-nav-item-active: 0px 0px 10px #0099ff; // optional
+  // Sidebar resize button
+  $color-resize-button: $color-reversal;
+  $bgcolor-resize-button: #209fd8;
+  $color-resize-button-hover: $color-reversal;
+  $bgcolor-resize-button-hover: lighten($bgcolor-resize-button, 5%);
+  // Sidebar contents
+  $color-sidebar-context: $color-global;
+  $bgcolor-sidebar-context: #f1fcff;
+  // Sidebar list group
+  // $bgcolor-sidebar-list-group: #; // optional
+
+  // Icon colors
+  $color-editor-icons: $color-global;
+
+  // Border colors
+  $border-color-theme: $gray-300;
+  $bordercolor-inline-code: #ccc8c8; // optional
+
+  // admin theme box
+  $color-theme-color-box: lighten($primary, 20%);
+
+  @import '../../styles/theme/apply-colors';
+  @import '../../styles/theme/apply-colors-light';
+
+  // Navs {
+  .nav-tabs {
+    border-bottom: $border-color-theme 1px solid;
+    .nav-link {
+      &:hover {
+        border-color: lighten($border-color-theme, 10%);
+        border-bottom: none;
+      }
+      &.active {
+        background-color: transparent;
+      }
+    }
+  }
+  // Button
+  .btn-group.grw-page-editor-mode-manager {
+    .btn.btn-outline-primary {
+      @include page-editor-mode-manager.btn-page-editor-mode-manager($primary, lighten($primary, 65%), lighten($primary, 70%));
+    }
+  }
+}
+
+:root[data-theme='dark'] .theme-mono-blue {
+  // Theme colors
+  $themecolor: #00587a;
+  $themedark: #061f2f;
+  $accentcolor: #16617d;
+  $subthemecolor: #c1f1f0;
+
+  $primary: #0090c8;
+  $dark: #031018;
+
+  // Background colors
+  $bgcolor-global: $themedark;
+  $bgcolor-navbar: #27343b;
+  $bgcolor-inline-code: #1f1f22; //optional
+  $bgcolor-card: darken($themedark, 5%);
+  $bgcolor-blinked-section: rgba($primary, 0.5);
+  $bgcolor-keyword-highlighted: darken($grw-marker-red, 30%);
+
+  // Font colors
+  $color-global: #d3d4d4;
+  $color-reversal: $gray-100;
+  $color-link: #97d1f0;
+  $color-link-hover: darken($color-link, 12%);
+  $color-link-wiki: lighten($primary, 20%);
+  $color-link-wiki-hover: lighten($color-link-wiki, 20%);
+  $color-link-nabvar: $color-reversal;
+  $color-inline-code: $subthemecolor;
+  $color-inline-code: #c7254e; // optional
+  $color-search: #000102;
+
+  // List Group colors
+  // $color-list: $color-global;
+  $bgcolor-list: transparent;
+  $color-list-hover: $accentcolor;
+  // $bgcolor-list-hover: lighten($bgcolor-global, 3%);
+  // $color-list-active: $color-reversal;
+  // $bgcolor-list-active: $primary;
+
+  // Navbar
+  $bgcolor-navbar: #2a2929;
+  $bgcolor-search-top-dropdown: $themecolor;
+  $border-image-navbar: linear-gradient(to right, #54bafd 0%, #3d98a3 50%, #708b0b 100%);
+
+  // Logo colors
+  $bgcolor-logo: #13191c;
+  $fillcolor-logo-mark: lighten(desaturate($bgcolor-navbar, 10%), 15%);
+  // $fillcolor-logo-mark: #4e5a60;
+
+  // Sidebar
+  $bgcolor-sidebar: $accentcolor;
+  // $bgcolor-sidebar-nav-item-active: rgba(#, 0.3); // optional
+  $text-shadow-sidebar-nav-item-active: 0px 0px 10px #0099ff; // optional
+  // Sidebar resize button
+  $color-resize-button: $color-global;
+  $bgcolor-resize-button: $themecolor;
+  $color-resize-button-hover: $color-global;
+  $bgcolor-resize-button-hover: darken($bgcolor-resize-button, 5%);
+  // Sidebar contents
+  $bgcolor-sidebar-context: darken($bgcolor-sidebar, 13%);
+  $color-sidebar-context: $color-global;
+  // Sidebar list group
+  // $bgcolor-sidebar-list-group: #; // optional
+
+  // Icon colors
+  $color-editor-icons: $color-global;
+
+  // Border colors
+  $border-color-theme: #146aa0;
+  $bordercolor-inline-code: #4d4d4d; // optional
+
+  // admin theme box
+  $color-theme-color-box: $primary;
+
+  @import '../../styles/theme/apply-colors';
+  @import '../../styles/theme/apply-colors-dark';
+
+  // Navs
+  .nav-tabs {
+    border-bottom: $border-color-theme 1px solid;
+    .nav-link {
+      &:hover {
+        border-color: lighten($border-color-theme, 10%);
+        border-bottom: none;
+      }
+      &.active {
+        color: $color-link;
+        background-color: transparent;
+        border-color: $border-color-theme;
+      }
+    }
+  }
+
+  // Table
+  .table {
+    color: white;
+  }
+
+  // Button
+  .btn-group.grw-page-editor-mode-manager {
+    .btn.btn-outline-primary {
+      @include page-editor-mode-manager.btn-page-editor-mode-manager(lighten($primary, 30%), $primary, darken($primary, 10%), darken($primary, 20%));
+    }
+  }
+}

+ 0 - 205
packages/app/src/components/Theme/ThemeMonoBlue.module.scss

@@ -1,205 +0,0 @@
-@use '../../styles/variables' as *;
-@use '../../styles/bootstrap/variables' as *;
-@use '../../styles/theme/mixins/page-editor-mode-manager';
-
-.theme {
-  [data-color-scheme='light'] :global {
-    // Theme colors
-    $themecolor: #00587a;
-    $themelight: #f7fbfd;
-    $accentcolor: #16617d;
-    $subthemecolor: #186718;
-
-    $primary: $themecolor;
-
-    // Background colors
-    $bgcolor-global: $themelight;
-    $bgcolor-inline-code: $gray-100; //optional
-    $bgcolor-card: darken($themelight, 5%);
-    $bgcolor-blinked-section: rgba($primary, 0.1);
-    //$bgcolor-keyword-highlighted: $grw-marker-yellow;
-
-    // Font colors
-    $color-global: $themecolor;
-    $color-reversal: $gray-100;
-    $color-link: lighten($primary, 5%);
-    $color-link-hover: lighten($color-link, 12%);
-    $color-link-wiki: lighten($primary, 20%);
-    $color-link-wiki-hover: lighten($color-link-wiki, 20%);
-    $color-link-nabvar: $color-reversal;
-    $color-inline-code: #c7254e; // optional
-    $color-search: #c0d6df;
-
-    // List Group colors
-    // $color-list: $color-global;
-    $bgcolor-list: transparent;
-    $color-list-hover: $color-search;
-    $bgcolor-list-hover: lighten($primary, 70%);
-    // $color-list-active: $color-reversal;
-    // $bgcolor-list-active: $primary;
-
-    // Navbar
-    $bgcolor-navbar: #2a2929;
-    $bgcolor-search-top-dropdown: $themecolor;
-    $border-image-navbar: linear-gradient(to right, #54bafd 0%, #3d98a3 50%, #708b0b 100%);
-
-    // Logo colors
-    $bgcolor-logo: $themecolor;
-    $fillcolor-logo-mark: lighten(desaturate($bgcolor-navbar, 10%), 15%);
-
-    // Sidebar
-    $bgcolor-sidebar: $themecolor;
-    // $bgcolor-sidebar-nav-item-active: rgba(#, 0.37); // optional
-    $text-shadow-sidebar-nav-item-active: 0px 0px 10px #0099ff; // optional
-    // Sidebar resize button
-    $color-resize-button: $color-reversal;
-    $bgcolor-resize-button: #209fd8;
-    $color-resize-button-hover: $color-reversal;
-    $bgcolor-resize-button-hover: lighten($bgcolor-resize-button, 5%);
-    // Sidebar contents
-    $color-sidebar-context: $color-global;
-    $bgcolor-sidebar-context: #f1fcff;
-    // Sidebar list group
-    // $bgcolor-sidebar-list-group: #; // optional
-
-    // Icon colors
-    $color-editor-icons: $color-global;
-
-    // Border colors
-    $border-color-theme: $gray-300;
-    $bordercolor-inline-code: #ccc8c8; // optional
-
-    // admin theme box
-    $color-theme-color-box: lighten($primary, 20%);
-
-    @import '../../styles/theme/apply-colors';
-    @import '../../styles/theme/apply-colors-light';
-
-    // Navs {
-    .nav-tabs {
-      border-bottom: $border-color-theme 1px solid;
-      .nav-link {
-        &:hover {
-          border-color: lighten($border-color-theme, 10%);
-          border-bottom: none;
-        }
-        &.active {
-          background-color: transparent;
-        }
-      }
-    }
-    // Button
-    .btn-group.grw-page-editor-mode-manager {
-      .btn.btn-outline-primary {
-        @include page-editor-mode-manager.btn-page-editor-mode-manager($primary, lighten($primary, 65%), lighten($primary, 70%));
-      }
-    }
-  }
-}
-
-.theme {
-  [data-color-scheme='dark'] :global {
-    // Theme colors
-    $themecolor: #00587a;
-    $themedark: #061f2f;
-    $accentcolor: #16617d;
-    $subthemecolor: #c1f1f0;
-
-    $primary: #0090c8;
-    $dark: #031018;
-
-    // Background colors
-    $bgcolor-global: $themedark;
-    $bgcolor-navbar: #27343b;
-    $bgcolor-inline-code: #1f1f22; //optional
-    $bgcolor-card: darken($themedark, 5%);
-    $bgcolor-blinked-section: rgba($primary, 0.5);
-    $bgcolor-keyword-highlighted: darken($grw-marker-red, 30%);
-
-    // Font colors
-    $color-global: #d3d4d4;
-    $color-reversal: $gray-100;
-    $color-link: #97d1f0;
-    $color-link-hover: darken($color-link, 12%);
-    $color-link-wiki: lighten($primary, 20%);
-    $color-link-wiki-hover: lighten($color-link-wiki, 20%);
-    $color-link-nabvar: $color-reversal;
-    $color-inline-code: $subthemecolor;
-    $color-inline-code: #c7254e; // optional
-    $color-search: #000102;
-
-    // List Group colors
-    // $color-list: $color-global;
-    $bgcolor-list: transparent;
-    $color-list-hover: $accentcolor;
-    // $bgcolor-list-hover: lighten($bgcolor-global, 3%);
-    // $color-list-active: $color-reversal;
-    // $bgcolor-list-active: $primary;
-
-    // Navbar
-    $bgcolor-navbar: #2a2929;
-    $bgcolor-search-top-dropdown: $themecolor;
-    $border-image-navbar: linear-gradient(to right, #54bafd 0%, #3d98a3 50%, #708b0b 100%);
-
-    // Logo colors
-    $bgcolor-logo: #13191c;
-    $fillcolor-logo-mark: lighten(desaturate($bgcolor-navbar, 10%), 15%);
-    // $fillcolor-logo-mark: #4e5a60;
-
-    // Sidebar
-    $bgcolor-sidebar: $accentcolor;
-    // $bgcolor-sidebar-nav-item-active: rgba(#, 0.3); // optional
-    $text-shadow-sidebar-nav-item-active: 0px 0px 10px #0099ff; // optional
-    // Sidebar resize button
-    $color-resize-button: $color-global;
-    $bgcolor-resize-button: $themecolor;
-    $color-resize-button-hover: $color-global;
-    $bgcolor-resize-button-hover: darken($bgcolor-resize-button, 5%);
-    // Sidebar contents
-    $bgcolor-sidebar-context: darken($bgcolor-sidebar, 13%);
-    $color-sidebar-context: $color-global;
-    // Sidebar list group
-    // $bgcolor-sidebar-list-group: #; // optional
-
-    // Icon colors
-    $color-editor-icons: $color-global;
-
-    // Border colors
-    $border-color-theme: #146aa0;
-    $bordercolor-inline-code: #4d4d4d; // optional
-
-    // admin theme box
-    $color-theme-color-box: $primary;
-
-    @import '../../styles/theme/apply-colors';
-    @import '../../styles/theme/apply-colors-dark';
-
-    // Navs
-    .nav-tabs {
-      border-bottom: $border-color-theme 1px solid;
-      .nav-link {
-        &:hover {
-          border-color: lighten($border-color-theme, 10%);
-          border-bottom: none;
-        }
-        &.active {
-          color: $color-link;
-          background-color: transparent;
-          border-color: $border-color-theme;
-        }
-      }
-    }
-
-    // Table
-    .table {
-      color: white;
-    }
-
-    // Button
-    .btn-group.grw-page-editor-mode-manager {
-      .btn.btn-outline-primary {
-        @include page-editor-mode-manager.btn-page-editor-mode-manager(lighten($primary, 30%), $primary, darken($primary, 10%), darken($primary, 20%));
-      }
-    }
-  }
-}

+ 2 - 2
packages/app/src/components/Theme/ThemeMonoBlue.tsx

@@ -1,8 +1,8 @@
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeMonoBlue.module.scss';
+// import styles from './ThemeMonoBlue.module.scss';
 
 const ThemeMonoBlue = ({ children }: { children: JSX.Element }): JSX.Element => {
-  return <ThemeInjector className={styles.theme}>{children}</ThemeInjector>;
+  return <ThemeInjector className="theme-mono-blue">{children}</ThemeInjector>;
 };
 export default ThemeMonoBlue;

+ 1 - 1
packages/app/src/components/Theme/ThemeNature.module.scss → packages/app/src/components/Theme/ThemeNature.global.scss

@@ -36,7 +36,7 @@ $themecolor: #12b105;
 
 //== Light Mode
 //
-.theme :global {
+:root .theme-nature {
   $primary: #460039;
   $light: $gray-100;
 

+ 2 - 2
packages/app/src/components/Theme/ThemeNature.tsx

@@ -1,8 +1,8 @@
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeNature.module.scss';
+// import styles from './ThemeNature.module.scss';
 
 const ThemeNature = ({ children }: { children: JSX.Element }): JSX.Element => {
-  return <ThemeInjector className={styles.theme}>{children}</ThemeInjector>;
+  return <ThemeInjector className="theme-nature">{children}</ThemeInjector>;
 };
 export default ThemeNature;

+ 1 - 14
packages/app/src/components/Theme/ThemeSpring.module.scss → packages/app/src/components/Theme/ThemeSpring.global.scss

@@ -25,22 +25,9 @@ $accentcolor: #e08dbc;
   border-bottom: $accentcolor 4px solid;
 }
 
-.theme :global {
-  .grw-bg-image-wrapper {
-    position: fixed;
-    width: 100%;
-    height: 100%;
-  }
-
-  .grw-bg-image {
-    object-fit: cover;
-    object-position: bottom;
-  }
-}
-
 //== Light Mode
 //
-.theme :global {
+:root .theme-spring {
   $primary: $themecolor;
   $secondary: $accentcolor;
 

+ 4 - 7
packages/app/src/components/Theme/ThemeSpring.tsx

@@ -4,7 +4,7 @@ import { Themes } from '~/stores/use-next-themes';
 
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeSpring.module.scss';
+// import styles from './ThemeSpring.module.scss';
 
 export const getBackgroundImageSrc = (colorScheme: Themes): string => {
   switch (colorScheme) {
@@ -19,17 +19,14 @@ type Props = {
 }
 
 const ThemeSpring = ({ children, colorScheme }: Props): JSX.Element => {
-  const newChildren = (
+  const bgImageNode = (
     <>
       {colorScheme != null && (
-        <div className='grw-bg-image-wrapper'>
-          <Image className='grw-bg-image' alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
-        </div>
+        <Image alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
       )}
-      {children}
     </>
   );
-  return <ThemeInjector className={styles.theme}>{newChildren}</ThemeInjector>;
+  return <ThemeInjector className="theme-spring" bgImageNode={bgImageNode}>{children}</ThemeInjector>;
 };
 
 export default ThemeSpring;

+ 1 - 14
packages/app/src/components/Theme/ThemeWood.module.scss → packages/app/src/components/Theme/ThemeWood.global.scss

@@ -34,22 +34,9 @@
 $themecolor: #b9b177;
 $themelight: #f5f3ee;
 
-.theme :global {
-  .grw-bg-image-wrapper {
-    position: fixed;
-    width: 100%;
-    height: 100%;
-  }
-
-  .grw-bg-image {
-    object-fit: cover;
-    object-position: center center;
-  }
-}
-
 //== Light Mode
 //
-.theme :global {
+:root .theme-wood {
   $primary: #aaa45f;
 
   // Background colors

+ 4 - 7
packages/app/src/components/Theme/ThemeWood.tsx

@@ -4,7 +4,7 @@ import { Themes } from '~/stores/use-next-themes';
 
 import { ThemeInjector } from './utils/ThemeInjector';
 
-import styles from './ThemeWood.module.scss';
+// import styles from './ThemeWood.module.scss';
 
 export const getBackgroundImageSrc = (colorScheme: Themes): string => {
   switch (colorScheme) {
@@ -19,17 +19,14 @@ type Props = {
 }
 
 const ThemeWood = ({ children, colorScheme }: Props): JSX.Element => {
-  const newChildren = (
+  const bgImageNode = (
     <>
       {colorScheme != null && (
-        <div className='grw-bg-image-wrapper'>
-          <Image className='grw-bg-image' alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
-        </div>
+        <Image alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
       )}
-      {children}
     </>
   );
-  return <ThemeInjector className={styles.theme}>{newChildren}</ThemeInjector>;
+  return <ThemeInjector className="theme-wood" bgImageNode={bgImageNode}>{children}</ThemeInjector>;
 };
 
 export default ThemeWood;

+ 6 - 2
packages/app/src/components/Theme/utils/ThemeInjector.tsx

@@ -4,9 +4,13 @@ import React from 'react';
 type Props = {
   children: JSX.Element,
   className: string,
+  bgImageNode?: React.ReactNode,
 }
 
-export const ThemeInjector = ({ children, className: themeClassName }: Props): JSX.Element => {
+export const ThemeInjector = ({ children, className: themeClassName, bgImageNode }: Props): JSX.Element => {
   const className = `${children.props.className ?? ''} ${themeClassName}`;
-  return React.cloneElement(<div>{children}</div>, { className });
+  return React.cloneElement(children, { className }, [
+    <div key="grw-bg-image-wrapper" className="grw-bg-image-wrapper">{bgImageNode}</div>,
+    children.props.children,
+  ]);
 };

+ 5 - 4
packages/app/src/pages/_app.page.tsx

@@ -1,17 +1,18 @@
 import React, { useEffect } from 'react';
 
 import { appWithTranslation } from 'next-i18next';
-import { ThemeProvider } from 'next-themes';
 import { AppProps } from 'next/app';
 import { DndProvider } from 'react-dnd';
 import { HTML5Backend } from 'react-dnd-html5-backend';
 
 import '~/styles/style-next.scss';
-// import '~/styles/theme/default.scss';
+import '~/styles/style-themes.scss';
 // import InterceptorManager from '~/service/interceptor-manager';
 
 import * as nextI18nConfig from '^/config/next-i18next.config';
 
+import { NextThemesProvider } from '~/stores/use-next-themes';
+
 import { useI18nextHMR } from '../services/i18next-hmr';
 import {
   useAppTitle, useConfidential, useGrowiTheme, useGrowiVersion, useSiteUrl,
@@ -45,11 +46,11 @@ function GrowiApp({ Component, pageProps }: GrowiAppProps): JSX.Element {
   useGrowiVersion(commonPageProps.growiVersion);
 
   return (
-    <ThemeProvider>
+    <NextThemesProvider>
       <DndProvider backend={HTML5Backend}>
         <Component {...pageProps} />
       </DndProvider>
-    </ThemeProvider>
+    </NextThemesProvider>
   );
 }
 

+ 0 - 22
packages/app/src/stores/use-next-themes.ts

@@ -1,22 +0,0 @@
-import { useTheme } from 'next-themes';
-import { UseThemeProps } from 'next-themes/dist/types';
-
-export const Themes = {
-  light: 'light',
-  dark: 'dark',
-  system: 'system',
-} as const;
-export type Themes = typeof Themes[keyof typeof Themes];
-
-export type NextThemesComputedValues = {
-  useOsSettings: boolean,
-  isDarkMode: boolean,
-}
-
-export const useNextThemes = (): UseThemeProps & NextThemesComputedValues => {
-  const props = useTheme();
-  return Object.assign(props, {
-    useOsSettings: props.theme === Themes.system,
-    isDarkMode: props.resolvedTheme === Themes.dark,
-  });
-};

+ 45 - 0
packages/app/src/stores/use-next-themes.tsx

@@ -0,0 +1,45 @@
+import { isClient } from '@growi/core';
+import { ThemeProvider, useTheme } from 'next-themes';
+import { ThemeProviderProps, UseThemeProps } from 'next-themes/dist/types';
+
+export const Themes = {
+  light: 'light',
+  dark: 'dark',
+  system: 'system',
+} as const;
+export type Themes = typeof Themes[keyof typeof Themes];
+
+export const ResolvedThemes = {
+  light: Themes.light,
+  dark: Themes.dark,
+} as const;
+export type ResolvedThemes = typeof ResolvedThemes[keyof typeof ResolvedThemes];
+export const ColorScheme = ResolvedThemes;
+export type ColorScheme = ResolvedThemes;
+
+
+const ATTRIBUTE = 'data-theme';
+
+export const NextThemesProvider: React.FC<ThemeProviderProps> = (props) => {
+  return <ThemeProvider {...props} attribute={ATTRIBUTE} />;
+};
+
+type UseThemeExtendedProps = Omit<UseThemeProps, 'theme'|'resolvedTheme'> & {
+  theme: Themes,
+  resolvedTheme: ResolvedThemes,
+  useOsSettings: boolean,
+  isDarkMode: boolean,
+  resolvedThemeByAttributes?: ResolvedThemes,
+}
+
+export const useNextThemes = (): UseThemeProps & UseThemeExtendedProps => {
+  const props = useTheme();
+
+  return Object.assign(props, {
+    theme: props.theme as Themes,
+    resolvedTheme: props.resolvedTheme as ResolvedThemes,
+    useOsSettings: props.theme === Themes.system,
+    isDarkMode: props.resolvedTheme === ResolvedThemes.dark,
+    resolvedThemeByAttributes: isClient() ? document.documentElement.getAttribute(ATTRIBUTE) as ResolvedThemes : undefined,
+  });
+};

+ 11 - 0
packages/app/src/styles/_layout.scss

@@ -14,6 +14,17 @@ body {
   @extend .container-fluid;
 }
 
+.grw-bg-image-wrapper {
+  position: fixed;
+  width: 100%;
+  height: 100%;
+
+  img {
+    object-fit: cover;
+    object-position: bottom;
+  }
+}
+
 body.not-found-page .grw-container-convertible {
   @extend .container-lg;
 }

+ 1 - 0
packages/app/src/styles/style-next.scss

@@ -77,6 +77,7 @@
 // @import 'sharelink';
 // @import 'linkedit-preview';
 
+
 /*
  * for Guest User Mode
  */

+ 15 - 0
packages/app/src/styles/style-themes.scss

@@ -0,0 +1,15 @@
+@import '~/components/Theme/ThemeAntarctic.global.scss';
+@import '~/components/Theme/ThemeBlackboard.global.scss';
+@import '~/components/Theme/ThemeChristmas.global.scss';
+@import '~/components/Theme/ThemeDefault.global.scss';
+@import '~/components/Theme/ThemeFireRed.global.scss';
+@import '~/components/Theme/ThemeFuture.global.scss';
+@import '~/components/Theme/ThemeHalloween.global.scss';
+@import '~/components/Theme/ThemeHufflepuff.global.scss';
+@import '~/components/Theme/ThemeIsland.global.scss';
+@import '~/components/Theme/ThemeJadeGreen.global.scss';
+@import '~/components/Theme/ThemeKibela.global.scss';
+@import '~/components/Theme/ThemeMonoBlue.global.scss';
+@import '~/components/Theme/ThemeNature.global.scss';
+@import '~/components/Theme/ThemeSpring.global.scss';
+@import '~/components/Theme/ThemeWood.global.scss';

+ 5 - 0
yarn.lock

@@ -24011,6 +24011,11 @@ use@^3.1.0:
   dependencies:
     kind-of "^6.0.2"
 
+usehooks-ts@^2.6.0:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/usehooks-ts/-/usehooks-ts-2.6.0.tgz#aebab367da2350a0bee1c3749bc6dd4bcce3eaae"
+  integrity sha512-Kj/4oc2nOxRDGTDb2v1ZulF7+tpeXFuqI6cUesM0Vic7TPPDlFORxKh4ivsYg+NTvX/YbM+lhqqkfFTiIt23eg==
+
 useragent@^2.2.1:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972"