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

Merge pull request #6475 from weseek/feat/refactor-theme-image-provider

feat: Refactor ThemeImageProvider
Yuki Takei 3 лет назад
Родитель
Сommit
5508d350cf

+ 2 - 15
packages/app/src/components/Layout/RawLayout.tsx

@@ -1,14 +1,12 @@
 import React, {
-  ReactNode, useCallback, useEffect, useState,
+  ReactNode, useEffect, useState,
 } from 'react';
 
 import Head from 'next/head';
-import Image from 'next/image';
 
 import { useGrowiTheme } from '~/stores/context';
 import { Themes, useNextThemes } from '~/stores/use-next-themes';
 
-import { getBackgroundImageSrc } from '../Theme/utils/ThemeImageProvider';
 import { ThemeProvider } from '../Theme/utils/ThemeProvider';
 
 type Props = {
@@ -18,7 +16,6 @@ type Props = {
 }
 
 export const RawLayout = ({ children, title, className }: Props): JSX.Element => {
-
   const classNames: string[] = ['wrapper'];
   if (className != null) {
     classNames.push(className);
@@ -29,19 +26,12 @@ export const RawLayout = ({ children, title, className }: Props): JSX.Element =>
   const { resolvedTheme } = useNextThemes();
 
   const [colorScheme, setColorScheme] = useState<Themes|undefined>(undefined);
-  const [backgroundImageSrc, setBackgroundImageSrc] = useState<string | undefined>(undefined);
 
   // set colorScheme in CSR
   useEffect(() => {
     setColorScheme(resolvedTheme as Themes);
   }, [resolvedTheme]);
 
-  // set background image
-  useEffect(() => {
-    const imgSrc = getBackgroundImageSrc(growiTheme, colorScheme);
-    setBackgroundImageSrc(imgSrc);
-  }, [growiTheme, colorScheme]);
-
   return (
     <>
       <Head>
@@ -49,11 +39,8 @@ export const RawLayout = ({ children, title, className }: Props): JSX.Element =>
         <meta charSet="utf-8" />
         <meta name="viewport" content="initial-scale=1.0, width=device-width" />
       </Head>
-      <ThemeProvider theme={growiTheme}>
+      <ThemeProvider theme={growiTheme} colorScheme={colorScheme}>
         <div className={classNames.join(' ')} data-color-scheme={colorScheme}>
-          {backgroundImageSrc != null && <div className="grw-bg-image-wrapper">
-            <Image className='grw-bg-image' alt='background-image' src={backgroundImageSrc} layout='fill' quality="100" />
-          </div>}
           {children}
         </div>
       </ThemeProvider>

+ 20 - 2
packages/app/src/components/Theme/ThemeAntarctic.tsx

@@ -1,3 +1,5 @@
+import Image from 'next/image';
+
 import { Themes } from '~/stores/use-next-themes';
 
 import { ThemeInjector } from './utils/ThemeInjector';
@@ -11,7 +13,23 @@ export const getBackgroundImageSrc = (colorScheme: Themes): string => {
   }
 };
 
-const ThemeAntarctic = ({ children }: { children: JSX.Element }): JSX.Element => {
-  return <ThemeInjector className={styles.theme}>{children}</ThemeInjector>;
+type Props = {
+  children: JSX.Element,
+  colorScheme?: Themes,
+}
+
+const ThemeAntarctic = ({ children, colorScheme }: Props): JSX.Element => {
+  const newChildren = (
+    <>
+      {colorScheme != null && (
+        <div className='grw-bg-image-wrapper'>
+          <Image className='grw-bg-image' alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
+        </div>
+      )}
+      {children}
+    </>
+  );
+  return <ThemeInjector className={styles.theme}>{newChildren}</ThemeInjector>;
 };
+
 export default ThemeAntarctic;

+ 20 - 2
packages/app/src/components/Theme/ThemeChristmas.tsx

@@ -1,3 +1,5 @@
+import Image from 'next/image';
+
 import { Themes } from '~/stores/use-next-themes';
 
 import { ThemeInjector } from './utils/ThemeInjector';
@@ -11,7 +13,23 @@ export const getBackgroundImageSrc = (colorScheme: Themes): string => {
   }
 };
 
-const ThemeChristmas = ({ children }: { children: JSX.Element }): JSX.Element => {
-  return <ThemeInjector className={styles.theme}>{children}</ThemeInjector>;
+type Props = {
+  children: JSX.Element,
+  colorScheme?: Themes,
+}
+
+const ThemeChristmas = ({ children, colorScheme }: Props): JSX.Element => {
+  const newChildren = (
+    <>
+      {colorScheme != null && (
+        <div className='grw-bg-image-wrapper'>
+          <Image className='grw-bg-image' alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
+        </div>
+      )}
+      {children}
+    </>
+  );
+  return <ThemeInjector className={styles.theme}>{newChildren}</ThemeInjector>;
 };
+
 export default ThemeChristmas;

+ 189 - 185
packages/app/src/components/Theme/ThemeDefault.module.scss

@@ -16,197 +16,201 @@
 
 //== 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%));
+.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%));
+.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%));
+      }
     }
   }
 }

+ 192 - 188
packages/app/src/components/Theme/ThemeFireRed.module.scss

@@ -2,204 +2,208 @@
 @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;
+.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%));
+    // 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;
+.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;
-  }
+    // 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%));
+    // 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%));
+      }
     }
   }
 }

+ 20 - 2
packages/app/src/components/Theme/ThemeHalloween.tsx

@@ -1,3 +1,5 @@
+import Image from 'next/image';
+
 import { Themes } from '~/stores/use-next-themes';
 
 import { ThemeInjector } from './utils/ThemeInjector';
@@ -11,7 +13,23 @@ export const getBackgroundImageSrc = (colorScheme: Themes): string => {
   }
 };
 
-const ThemeHalloween = ({ children }: { children: JSX.Element }): JSX.Element => {
-  return <ThemeInjector className={styles.theme}>{children}</ThemeInjector>;
+type Props = {
+  children: JSX.Element,
+  colorScheme?: Themes,
+}
+
+const ThemeHalloween = ({ children, colorScheme }: Props): JSX.Element => {
+  const newChildren = (
+    <>
+      {colorScheme != null && (
+        <div className='grw-bg-image-wrapper'>
+          <Image className='grw-bg-image' alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
+        </div>
+      )}
+      {children}
+    </>
+  );
+  return <ThemeInjector className={styles.theme}>{newChildren}</ThemeInjector>;
 };
+
 export default ThemeHalloween;

+ 257 - 253
packages/app/src/components/Theme/ThemeHufflepuff.module.scss

@@ -33,289 +33,293 @@
 
 //== 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 {
+.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, 70%), lighten($primary, 5%), lighten($primary, 20%));
+      @include page-editor-mode-manager.btn-page-editor-mode-manager(darken($primary, 50%), darken($primary, 50%), 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;
+    .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%));
+      }
     }
-  }
 
-  // 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;
+    .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;
+      }
     }
 
-    .noLogin-header,
-    .noLogin-dialog {
-      background-color: rgba(black, 0.1);
-    }
+    // 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;
+      }
 
-    .link-switch {
-      color: $color-global;
-    }
+      .noLogin-header,
+      .noLogin-dialog {
+        background-color: rgba(black, 0.1);
+      }
 
-    .grw-external-auth-form {
-      border-color: $accentcolor !important;
+      .link-switch {
+        color: $color-global;
+      }
+
+      .grw-external-auth-form {
+        border-color: $accentcolor !important;
+      }
     }
-  }
 
-  .table {
-    background-color: $bgcolor-global;
-  }
+    .table {
+      background-color: $bgcolor-global;
+    }
 
-  .card-timeline > .card-header {
-    background-color: $third-main-color;
-  }
+    .card-timeline > .card-header {
+      background-color: $third-main-color;
+    }
 
-  .nav.nav-tabs {
-    > .nav-item {
-      > .nav-link.active {
-        color: $subthemecolor;
+    .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;
+.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;
-  }
+    // 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 {
+    // Button
     .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%));
+      @include page-editor-mode-manager.btn-page-editor-mode-manager(lighten($primary, 40%), lighten($primary, 15%), darken($primary, 10%), 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;
+    .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%));
+      }
     }
-  }
 
-  // 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;
+    .card-timeline > .card-header {
+      background-color: $accentcolor;
     }
 
-    .noLogin-header,
-    .noLogin-dialog {
-      background-color: rgba(black, 0.1);
+    .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;
+      }
     }
 
-    .link-switch {
-      color: $color-global;
-    }
+    // 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;
+      }
 
-    .grw-external-auth-form {
-      border-color: $accentcolor !important;
+      .noLogin-header,
+      .noLogin-dialog {
+        background-color: rgba(black, 0.1);
+      }
+
+      .link-switch {
+        color: $color-global;
+      }
+
+      .grw-external-auth-form {
+        border-color: $accentcolor !important;
+      }
     }
   }
 }

+ 20 - 2
packages/app/src/components/Theme/ThemeHufflepuff.tsx

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

+ 20 - 2
packages/app/src/components/Theme/ThemeIsland.tsx

@@ -1,3 +1,5 @@
+import Image from 'next/image';
+
 import { Themes } from '~/stores/use-next-themes';
 
 import { ThemeInjector } from './utils/ThemeInjector';
@@ -11,7 +13,23 @@ export const getBackgroundImageSrc = (colorScheme: Themes): string => {
   }
 };
 
-const ThemeIsland = ({ children }: { children: JSX.Element }): JSX.Element => {
-  return <ThemeInjector className={styles.theme}>{children}</ThemeInjector>;
+type Props = {
+  children: JSX.Element,
+  colorScheme?: Themes,
+}
+
+const ThemeIsland = ({ children, colorScheme }: Props): JSX.Element => {
+  const newChildren = (
+    <>
+      {colorScheme != null && (
+        <div className='grw-bg-image-wrapper'>
+          <Image className='grw-bg-image' alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
+        </div>
+      )}
+      {children}
+    </>
+  );
+  return <ThemeInjector className={styles.theme}>{newChildren}</ThemeInjector>;
 };
+
 export default ThemeIsland;

+ 192 - 188
packages/app/src/components/Theme/ThemeJadeGreen.module.scss

@@ -2,204 +2,208 @@
 @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;
+.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%));
+    // 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;
+.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;
-  }
+    // 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%));
+    // 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%));
+      }
     }
   }
 }

+ 20 - 20
packages/app/src/components/Theme/ThemeKibela.module.scss

@@ -7,26 +7,6 @@ $themelight: #f4f5f6;
 $subthemecolor: rgb(88, 130, 250);
 $lightthemecolor: rgba(181, 203, 247, 0.61);
 
-.main {
-  .container,
-  .container-sm,
-  .container-md,
-  .container-lg,
-  .container-fluid {
-    padding-top: 30px;
-    padding-bottom: 30px;
-    background-color: white;
-    border-radius: 0.35em;
-  }
-}
-
-.user-page-footer {
-  margin-top: 3rem;
-  margin-bottom: 3rem;
-  background-color: white;
-  border-radius: 0.35em;
-}
-
 // Light Mode
 .theme :global {
   // Background colors
@@ -101,6 +81,26 @@ $lightthemecolor: rgba(181, 203, 247, 0.61);
   @import '../../styles/theme/apply-colors';
   @import '../../styles/theme/apply-colors-light';
 
+  .main {
+    .container,
+    .container-sm,
+    .container-md,
+    .container-lg,
+    .container-fluid {
+      padding-top: 30px;
+      padding-bottom: 30px;
+      background-color: white;
+      border-radius: 0.35em;
+    }
+  }
+
+  .user-page-footer {
+    margin-top: 3rem;
+    margin-bottom: 3rem;
+    background-color: white;
+    border-radius: 0.35em;
+  }
+
   //Button
   .grw-page-editor-mode-manager {
     .btn.btn-outline-primary {

+ 188 - 184
packages/app/src/components/Theme/ThemeMonoBlue.module.scss

@@ -2,200 +2,204 @@
 @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;
+.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%));
+    // 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;
+.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;
-  }
+    // 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%));
+    // 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%));
+      }
     }
   }
 }

+ 20 - 2
packages/app/src/components/Theme/ThemeSpring.tsx

@@ -1,3 +1,5 @@
+import Image from 'next/image';
+
 import { Themes } from '~/stores/use-next-themes';
 
 import { ThemeInjector } from './utils/ThemeInjector';
@@ -11,7 +13,23 @@ export const getBackgroundImageSrc = (colorScheme: Themes): string => {
   }
 };
 
-const ThemeSpring = ({ children }: { children: JSX.Element }): JSX.Element => {
-  return <ThemeInjector className={styles.theme}>{children}</ThemeInjector>;
+type Props = {
+  children: JSX.Element,
+  colorScheme?: Themes,
+}
+
+const ThemeSpring = ({ children, colorScheme }: Props): JSX.Element => {
+  const newChildren = (
+    <>
+      {colorScheme != null && (
+        <div className='grw-bg-image-wrapper'>
+          <Image className='grw-bg-image' alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
+        </div>
+      )}
+      {children}
+    </>
+  );
+  return <ThemeInjector className={styles.theme}>{newChildren}</ThemeInjector>;
 };
+
 export default ThemeSpring;

+ 20 - 2
packages/app/src/components/Theme/ThemeWood.tsx

@@ -1,3 +1,5 @@
+import Image from 'next/image';
+
 import { Themes } from '~/stores/use-next-themes';
 
 import { ThemeInjector } from './utils/ThemeInjector';
@@ -11,7 +13,23 @@ export const getBackgroundImageSrc = (colorScheme: Themes): string => {
   }
 };
 
-const ThemeWood = ({ children }: { children: JSX.Element }): JSX.Element => {
-  return <ThemeInjector className={styles.theme}>{children}</ThemeInjector>;
+type Props = {
+  children: JSX.Element,
+  colorScheme?: Themes,
+}
+
+const ThemeWood = ({ children, colorScheme }: Props): JSX.Element => {
+  const newChildren = (
+    <>
+      {colorScheme != null && (
+        <div className='grw-bg-image-wrapper'>
+          <Image className='grw-bg-image' alt='background image' src={getBackgroundImageSrc(colorScheme)} layout='fill' quality="100" />
+        </div>
+      )}
+      {children}
+    </>
+  );
+  return <ThemeInjector className={styles.theme}>{newChildren}</ThemeInjector>;
 };
+
 export default ThemeWood;

+ 0 - 34
packages/app/src/components/Theme/utils/ThemeImageProvider.tsx

@@ -1,34 +0,0 @@
-import { GrowiThemes } from '~/interfaces/theme';
-import { Themes } from '~/stores/use-next-themes';
-
-import { getBackgroundImageSrc as getAntarcticBackgroundImageSrc } from '../ThemeAntarctic';
-import { getBackgroundImageSrc as getChristmasBackgroundImageSrc } from '../ThemeChristmas';
-import { getBackgroundImageSrc as getHalloweenBackgroundImageSrc } from '../ThemeHalloween';
-import { getBackgroundImageSrc as getHuffulePuffBackgroundImageSrc } from '../ThemeHufflepuff';
-import { getBackgroundImageSrc as getIslandBackgroundImageSrc } from '../ThemeIsland';
-import { getBackgroundImageSrc as getSpringBackgroundImageSrc } from '../ThemeSpring';
-import { getBackgroundImageSrc as getWoodBackgroundImageSrc } from '../ThemeWood';
-
-export const getBackgroundImageSrc = (theme: GrowiThemes | undefined, colorScheme: Themes | undefined): string | undefined => {
-  if (theme == null || colorScheme == null) {
-    return undefined;
-  }
-  switch (theme) {
-    case GrowiThemes.ANTARCTIC:
-      return getAntarcticBackgroundImageSrc(colorScheme);
-    case GrowiThemes.CHRISTMAS:
-      return getChristmasBackgroundImageSrc(colorScheme);
-    case GrowiThemes.HALLOWEEN:
-      return getHalloweenBackgroundImageSrc(colorScheme);
-    case GrowiThemes.ISLAND:
-      return getIslandBackgroundImageSrc(colorScheme);
-    case GrowiThemes.HUFFLEPUFF:
-      return getHuffulePuffBackgroundImageSrc(colorScheme);
-    case GrowiThemes.SPRING:
-      return getSpringBackgroundImageSrc(colorScheme);
-    case GrowiThemes.WOOD:
-      return getWoodBackgroundImageSrc(colorScheme);
-    default:
-      return undefined;
-  }
-};

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

@@ -8,5 +8,5 @@ type Props = {
 
 export const ThemeInjector = ({ children, className: themeClassName }: Props): JSX.Element => {
   const className = `${children.props.className ?? ''} ${themeClassName}`;
-  return React.cloneElement(children, { className });
+  return React.cloneElement(<div>{children}</div>, { className });
 };

+ 10 - 8
packages/app/src/components/Theme/utils/ThemeProvider.tsx

@@ -4,6 +4,7 @@ import React from 'react';
 import dynamic from 'next/dynamic';
 
 import { GrowiThemes } from '~/interfaces/theme';
+import { Themes } from '~/stores/use-next-themes';
 
 
 const ThemeAntarctic = dynamic(() => import('../ThemeAntarctic'));
@@ -26,26 +27,27 @@ const ThemeWood = dynamic(() => import('../ThemeWood'));
 type Props = {
   children: JSX.Element,
   theme?: GrowiThemes,
+  colorScheme?: Themes,
 }
 
-export const ThemeProvider = ({ theme, children }: Props): JSX.Element => {
+export const ThemeProvider = ({ theme, children, colorScheme }: Props): JSX.Element => {
   switch (theme) {
     case GrowiThemes.ANTARCTIC:
-      return <ThemeAntarctic>{children}</ThemeAntarctic>;
+      return <ThemeAntarctic colorScheme={colorScheme}>{children}</ThemeAntarctic>;
     case GrowiThemes.BLACKBOARD:
       return <ThemeBlackboard>{children}</ThemeBlackboard>;
     case GrowiThemes.CHRISTMAS:
-      return <ThemeChristmas>{children}</ThemeChristmas>;
+      return <ThemeChristmas colorScheme={colorScheme}>{children}</ThemeChristmas>;
     case GrowiThemes.FIRE_RED:
       return <ThemeFireRed>{children}</ThemeFireRed>;
     case GrowiThemes.FUTURE:
       return <ThemeFuture>{children}</ThemeFuture>;
     case GrowiThemes.HALLOWEEN:
-      return <ThemeHalloween>{children}</ThemeHalloween>;
+      return <ThemeHalloween colorScheme={colorScheme}>{children}</ThemeHalloween>;
     case GrowiThemes.HUFFLEPUFF:
-      return <ThemeHufflepuff>{children}</ThemeHufflepuff>;
+      return <ThemeHufflepuff colorScheme={colorScheme}>{children}</ThemeHufflepuff>;
     case GrowiThemes.ISLAND:
-      return <ThemeIsland>{children}</ThemeIsland>;
+      return <ThemeIsland colorScheme={colorScheme}>{children}</ThemeIsland>;
     case GrowiThemes.JADE_GREEN:
       return <ThemeJadeGreen>{children}</ThemeJadeGreen>;
     case GrowiThemes.KIBELA:
@@ -55,9 +57,9 @@ export const ThemeProvider = ({ theme, children }: Props): JSX.Element => {
     case GrowiThemes.NATURE:
       return <ThemeNature>{children}</ThemeNature>;
     case GrowiThemes.SPRING:
-      return <ThemeSpring>{children}</ThemeSpring>;
+      return <ThemeSpring colorScheme={colorScheme}>{children}</ThemeSpring>;
     case GrowiThemes.WOOD:
-      return <ThemeWood>{children}</ThemeWood>;
+      return <ThemeWood colorScheme={colorScheme}>{children}</ThemeWood>;
     default:
       return <ThemeDefault>{children}</ThemeDefault>;
   }