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

Merge branch 'support/apply-bootstrap4' into imprv/island-theme-display

ryohek 5 лет назад
Родитель
Сommit
3fcd9a7b72
67 измененных файлов с 1013 добавлено и 1792 удалено
  1. 1 0
      babel.config.js
  2. 4 4
      config/webpack.common.js
  3. 1 0
      package.json
  4. 2 4
      src/client/js/app.jsx
  5. 5 5
      src/client/js/components/Admin/Customize/CustomizeFunctionSetting.jsx
  6. 1 1
      src/client/js/components/Drawio.jsx
  7. 51 30
      src/client/js/components/Navbar/GrowiSubNavigation.jsx
  8. 27 5
      src/client/js/components/Navbar/GrowiSubNavigationForUserPage.jsx
  9. 0 55
      src/client/js/components/Page/RevisionPath.jsx
  10. 47 0
      src/client/js/components/Page/RevisionPathControls.jsx
  11. 1 1
      src/client/js/components/PageEditor/HandsontableModal.jsx
  12. 50 0
      src/client/js/components/PageEditor/PagePathNavForEditor.jsx
  13. 1 1
      src/client/js/components/PageEditorByHackmd.jsx
  14. 0 23
      src/client/js/legacy/crowi.js
  15. 0 172
      src/client/styles/agile-admin/inverse/colors/_apply-colors-dark.scss
  16. 0 231
      src/client/styles/agile-admin/inverse/colors/antarctic.scss
  17. 0 51
      src/client/styles/agile-admin/inverse/colors/blue-night.scss
  18. 0 130
      src/client/styles/agile-admin/inverse/colors/christmas.scss
  19. 0 37
      src/client/styles/agile-admin/inverse/colors/future.scss
  20. 0 87
      src/client/styles/agile-admin/inverse/colors/halloween.scss
  21. 0 132
      src/client/styles/agile-admin/inverse/colors/island.scss
  22. 0 43
      src/client/styles/agile-admin/inverse/colors/kibela.scss
  23. 0 40
      src/client/styles/agile-admin/inverse/colors/mono-blue.scss
  24. 0 22
      src/client/styles/agile-admin/inverse/colors/nature.scss
  25. 0 206
      src/client/styles/agile-admin/inverse/colors/spring.scss
  26. 0 90
      src/client/styles/agile-admin/inverse/colors/wood.scss
  27. 10 10
      src/client/styles/agile-admin/inverse/variables.scss
  28. 0 12
      src/client/styles/scss/_handsontable.scss
  29. 0 5
      src/client/styles/scss/_layout_kibela.scss
  30. 3 2
      src/client/styles/scss/_login.scss
  31. 28 20
      src/client/styles/scss/_on-edit.scss
  32. 0 51
      src/client/styles/scss/_override-bootstrap.scss
  33. 1 14
      src/client/styles/scss/_page.scss
  34. 0 6
      src/client/styles/scss/_sidebar.scss
  35. 5 5
      src/client/styles/scss/_staff_credit.scss
  36. 5 3
      src/client/styles/scss/_subnav.scss
  37. 1 0
      src/client/styles/scss/_variables.scss
  38. 0 14
      src/client/styles/scss/theme/_apply-colors-dark.scss
  39. 7 0
      src/client/styles/scss/theme/_apply-colors.scss
  40. 99 6
      src/client/styles/scss/theme/future.scss
  41. 189 6
      src/client/styles/scss/theme/mono-blue.scss
  42. 174 8
      src/client/styles/scss/theme/nature.scss
  43. 8 3
      src/client/styles/scss/theme/spring.scss
  44. 167 6
      src/client/styles/scss/theme/wood.scss
  45. 10 6
      src/lib/components/PagePathHierarchicalLink.jsx
  46. 2 0
      src/lib/models/devided-page-path.js
  47. 6 0
      src/lib/models/linked-page-path.js
  48. 38 0
      src/migrations/20200512005851-remove-behavior-type.js
  49. 0 3
      src/server/models/config.js
  50. 0 1
      src/server/routes/apiv3/customize-setting.js
  51. 17 95
      src/server/routes/page.js
  52. 0 2
      src/server/views/layout-growi/page.html
  53. 0 1
      src/server/views/layout-growi/page_list.html
  54. 0 2
      src/server/views/layout-growi/user_page.html
  55. 0 6
      src/server/views/layout-growi/widget/header.html
  56. 0 2
      src/server/views/layout-kibela/page.html
  57. 0 1
      src/server/views/layout-kibela/page_list.html
  58. 0 2
      src/server/views/layout-kibela/user_page.html
  59. 0 5
      src/server/views/layout-kibela/widget/header.html
  60. 2 2
      src/server/views/modal/create_page.html
  61. 0 81
      src/server/views/modal/what_is_portal.html
  62. 0 4
      src/server/views/widget/create_portal.html
  63. 2 0
      src/server/views/widget/not_found_tabs.html
  64. 0 3
      src/server/views/widget/page_content.html
  65. 1 4
      src/server/views/widget/page_tabs.html
  66. 32 31
      src/server/views/widget/page_tabs_kibela.html
  67. 15 0
      yarn.lock

+ 1 - 0
babel.config.js

@@ -26,6 +26,7 @@ module.exports = function(api) {
         },
         },
       },
       },
     ],
     ],
+    '@babel/plugin-proposal-optional-chaining',
     [
     [
       '@babel/plugin-proposal-class-properties', { loose: true },
       '@babel/plugin-proposal-class-properties', { loose: true },
     ],
     ],

+ 4 - 4
config/webpack.common.js

@@ -34,13 +34,13 @@ module.exports = (options) => {
       'styles/style-presentation':    './src/client/styles/scss/style-presentation.scss',
       'styles/style-presentation':    './src/client/styles/scss/style-presentation.scss',
       // themes
       // themes
       'styles/theme-default':         './src/client/styles/scss/theme/default.scss',
       'styles/theme-default':         './src/client/styles/scss/theme/default.scss',
-      // 'styles/theme-nature':          './src/client/styles/scss/theme/nature.scss',
-      // 'styles/theme-mono-blue':       './src/client/styles/scss/theme/mono-blue.scss',
-      // 'styles/theme-future':          './src/client/styles/scss/theme/future.scss',
+      'styles/theme-nature':          './src/client/styles/scss/theme/nature.scss',
+      'styles/theme-mono-blue':       './src/client/styles/scss/theme/mono-blue.scss',
+      'styles/theme-future':          './src/client/styles/scss/theme/future.scss',
       // 'styles/theme-blue-night':      './src/client/styles/scss/theme/blue-night.scss',
       // 'styles/theme-blue-night':      './src/client/styles/scss/theme/blue-night.scss',
       'styles/theme-kibela':          './src/client/styles/scss/theme/kibela.scss',
       'styles/theme-kibela':          './src/client/styles/scss/theme/kibela.scss',
       'styles/theme-halloween':       './src/client/styles/scss/theme/halloween.scss',
       'styles/theme-halloween':       './src/client/styles/scss/theme/halloween.scss',
-      // 'styles/theme-wood':          './src/client/styles/scss/theme/wood.scss',
+      'styles/theme-wood':          './src/client/styles/scss/theme/wood.scss',
       // 'styles/theme-christmas':          './src/client/styles/scss/theme/christmas.scss',
       // 'styles/theme-christmas':          './src/client/styles/scss/theme/christmas.scss',
       'styles/theme-island':      './src/client/styles/scss/theme/island.scss',
       'styles/theme-island':      './src/client/styles/scss/theme/island.scss',
       'styles/theme-antarctic':      './src/client/styles/scss/theme/antarctic.scss',
       'styles/theme-antarctic':      './src/client/styles/scss/theme/antarctic.scss',

+ 1 - 0
package.json

@@ -158,6 +158,7 @@
     "@atlaskit/navigation-next": "^8.0.2",
     "@atlaskit/navigation-next": "^8.0.2",
     "@babel/core": "^7.4.5",
     "@babel/core": "^7.4.5",
     "@babel/plugin-proposal-class-properties": "^7.8.3",
     "@babel/plugin-proposal-class-properties": "^7.8.3",
+    "@babel/plugin-proposal-optional-chaining": "^7.9.0",
     "@babel/polyfill": "^7.4.4",
     "@babel/polyfill": "^7.4.4",
     "@babel/preset-env": "^7.4.5",
     "@babel/preset-env": "^7.4.5",
     "@babel/preset-react": "^7.0.0",
     "@babel/preset-react": "^7.0.0",

+ 2 - 4
src/client/js/app.jsx

@@ -8,6 +8,7 @@ import loggerFactory from '@alias/logger';
 import SearchPage from './components/SearchPage';
 import SearchPage from './components/SearchPage';
 import TagsList from './components/TagsList';
 import TagsList from './components/TagsList';
 import PageEditor from './components/PageEditor';
 import PageEditor from './components/PageEditor';
+import PagePathNavForEditor from './components/PageEditor/PagePathNavForEditor';
 // eslint-disable-next-line import/no-duplicates
 // eslint-disable-next-line import/no-duplicates
 import OptionsSelector from './components/PageEditor/OptionsSelector';
 import OptionsSelector from './components/PageEditor/OptionsSelector';
 // eslint-disable-next-line import/no-duplicates
 // eslint-disable-next-line import/no-duplicates
@@ -21,8 +22,6 @@ import PageTimeline from './components/PageTimeline';
 import CommentEditorLazyRenderer from './components/PageComment/CommentEditorLazyRenderer';
 import CommentEditorLazyRenderer from './components/PageComment/CommentEditorLazyRenderer';
 import PageAttachment from './components/PageAttachment';
 import PageAttachment from './components/PageAttachment';
 import PageStatusAlert from './components/PageStatusAlert';
 import PageStatusAlert from './components/PageStatusAlert';
-import RevisionPath from './components/Page/RevisionPath';
-import TagLabels from './components/Page/TagLabels';
 import PagePathAutoComplete from './components/PagePathAutoComplete';
 import PagePathAutoComplete from './components/PagePathAutoComplete';
 import RecentCreated from './components/RecentCreated/RecentCreated';
 import RecentCreated from './components/RecentCreated/RecentCreated';
 import MyDraftList from './components/MyDraftList/MyDraftList';
 import MyDraftList from './components/MyDraftList/MyDraftList';
@@ -71,6 +70,7 @@ Object.assign(componentMappings, {
   'create-page-name-input': <PagePathAutoComplete crowi={appContainer} initializedPath={pageContainer.state.path} addTrailingSlash />,
   'create-page-name-input': <PagePathAutoComplete crowi={appContainer} initializedPath={pageContainer.state.path} addTrailingSlash />,
 
 
   'page-editor': <PageEditor />,
   'page-editor': <PageEditor />,
+  'page-editor-path-nav': <PagePathNavForEditor />,
   'page-editor-options-selector': <OptionsSelector crowi={appContainer} />,
   'page-editor-options-selector': <OptionsSelector crowi={appContainer} />,
   'page-status-alert': <PageStatusAlert />,
   'page-status-alert': <PageStatusAlert />,
   'save-page-controls': <SavePageControls />,
   'save-page-controls': <SavePageControls />,
@@ -101,8 +101,6 @@ if (pageContainer.state.path != null) {
   Object.assign(componentMappings, {
   Object.assign(componentMappings, {
     // eslint-disable-next-line quote-props
     // eslint-disable-next-line quote-props
     'page': <Page />,
     'page': <Page />,
-    'revision-path': <RevisionPath behaviorType={appContainer.config.behaviorType} pageId={pageContainer.state.pageId} pagePath={pageContainer.state.path} />,
-    'tag-label': <TagLabels />,
     'grw-subnav': <GrowiSubNavigation />,
     'grw-subnav': <GrowiSubNavigation />,
     'grw-subnav-for-user-page': <GrowiSubNavigationForUserPage />,
     'grw-subnav-for-user-page': <GrowiSubNavigationForUserPage />,
   });
   });

+ 5 - 5
src/client/js/components/Admin/Customize/CustomizeFunctionSetting.jsx

@@ -15,7 +15,7 @@ import AdminCustomizeContainer from '../../../services/AdminCustomizeContainer';
 import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
 import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
 import CustomizeFunctionOption from './CustomizeFunctionOption';
 import CustomizeFunctionOption from './CustomizeFunctionOption';
 
 
-class CustomizeBehaviorSetting extends React.Component {
+class CustomizeFunctionSetting extends React.Component {
 
 
   constructor(props) {
   constructor(props) {
     super(props);
     super(props);
@@ -173,14 +173,14 @@ class CustomizeBehaviorSetting extends React.Component {
 
 
 }
 }
 
 
-const CustomizeBehaviorSettingWrapper = (props) => {
-  return createSubscribedElement(CustomizeBehaviorSetting, props, [AppContainer, AdminCustomizeContainer]);
+const CustomizeFunctionSettingWrapper = (props) => {
+  return createSubscribedElement(CustomizeFunctionSetting, props, [AppContainer, AdminCustomizeContainer]);
 };
 };
 
 
-CustomizeBehaviorSetting.propTypes = {
+CustomizeFunctionSetting.propTypes = {
   t: PropTypes.func.isRequired, // i18next
   t: PropTypes.func.isRequired, // i18next
   appContainer: PropTypes.instanceOf(AppContainer).isRequired,
   appContainer: PropTypes.instanceOf(AppContainer).isRequired,
   adminCustomizeContainer: PropTypes.instanceOf(AdminCustomizeContainer).isRequired,
   adminCustomizeContainer: PropTypes.instanceOf(AdminCustomizeContainer).isRequired,
 };
 };
 
 
-export default withTranslation()(CustomizeBehaviorSettingWrapper);
+export default withTranslation()(CustomizeFunctionSettingWrapper);

+ 1 - 1
src/client/js/components/Drawio.jsx

@@ -55,7 +55,7 @@ class Drawio extends React.Component {
       <div className="editable-with-drawio position-relative">
       <div className="editable-with-drawio position-relative">
         { !this.isPreview
         { !this.isPreview
           && (
           && (
-          <button type="button" className="drawio-iframe-trigger position-absolute btn" onClick={this.onEdit}>
+          <button type="button" className="drawio-iframe-trigger position-absolute btn btn-outline-secondary" onClick={this.onEdit}>
             <i className="icon-note mr-1"></i>{this.props.t('Edit')}
             <i className="icon-note mr-1"></i>{this.props.t('Edit')}
           </button>
           </button>
           )
           )

+ 51 - 30
src/client/js/components/Navbar/GrowiSubNavigation.jsx

@@ -12,7 +12,7 @@ import PagePathHierarchicalLink from '@commons/components/PagePathHierarchicalLi
 import { createSubscribedElement } from '../UnstatedUtils';
 import { createSubscribedElement } from '../UnstatedUtils';
 import AppContainer from '../../services/AppContainer';
 import AppContainer from '../../services/AppContainer';
 
 
-import RevisionPath from '../Page/RevisionPath';
+import RevisionPathControls from '../Page/RevisionPathControls';
 import PageContainer from '../../services/PageContainer';
 import PageContainer from '../../services/PageContainer';
 import TagLabels from '../Page/TagLabels';
 import TagLabels from '../Page/TagLabels';
 import LikeButton from '../LikeButton';
 import LikeButton from '../LikeButton';
@@ -21,6 +21,42 @@ import BookmarkButton from '../BookmarkButton';
 import PageCreator from './PageCreator';
 import PageCreator from './PageCreator';
 import RevisionAuthor from './RevisionAuthor';
 import RevisionAuthor from './RevisionAuthor';
 
 
+// eslint-disable-next-line react/prop-types
+const PagePathNav = ({ pageId, pagePath, isPageForbidden }) => {
+
+  const dPagePath = new DevidedPagePath(pagePath, false, true);
+
+  let formerLink;
+  let latterLink;
+
+  // when the path is root or first level
+  if (dPagePath.isRoot || dPagePath.isFormerRoot) {
+    const linkedPagePath = new LinkedPagePath(pagePath);
+    latterLink = <PagePathHierarchicalLink linkedPagePath={linkedPagePath} />;
+  }
+  // when the path is second level or deeper
+  else {
+    const linkedPagePathFormer = new LinkedPagePath(dPagePath.former);
+    const linkedPagePathLatter = new LinkedPagePath(dPagePath.latter);
+    formerLink = <PagePathHierarchicalLink linkedPagePath={linkedPagePathFormer} />;
+    latterLink = <PagePathHierarchicalLink linkedPagePath={linkedPagePathLatter} basePath={dPagePath.former} />;
+  }
+
+  return (
+    <div className="grw-page-path-nav">
+      {formerLink}
+      <span className="d-flex align-items-center flex-wrap">
+        <h1 className="m-0">{latterLink}</h1>
+        <RevisionPathControls
+          pageId={pageId}
+          pagePath={pagePath}
+          isPageForbidden={isPageForbidden}
+        />
+      </span>
+    </div>
+  );
+};
+
 const GrowiSubNavigation = (props) => {
 const GrowiSubNavigation = (props) => {
   const isPageForbidden = document.querySelector('#grw-subnav').getAttribute('data-is-forbidden-page') === 'true';
   const isPageForbidden = document.querySelector('#grw-subnav').getAttribute('data-is-forbidden-page') === 'true';
   const { appContainer, pageContainer } = props;
   const { appContainer, pageContainer } = props;
@@ -31,27 +67,11 @@ const GrowiSubNavigation = (props) => {
   const isPageNotFound = pageId == null;
   const isPageNotFound = pageId == null;
   const isPageInTrash = isTrashPage(path);
   const isPageInTrash = isTrashPage(path);
 
 
-  const dPagePath = new DevidedPagePath(pageContainer.state.path, false, true);
-  const linkedPagePathFormer = new LinkedPagePath(dPagePath.former);
-  const renderFormerLink = () => (
-    <>
-      { !dPagePath.isRoot && <PagePathHierarchicalLink linkedPagePath={linkedPagePathFormer} /> }
-    </>
-  );
-
   // Display only the RevisionPath
   // Display only the RevisionPath
-  if (isPageNotFound || isPageForbidden || isPageInTrash) {
+  if (isPageNotFound || isPageForbidden) {
     return (
     return (
       <div className="px-3 py-3 grw-subnavbar">
       <div className="px-3 py-3 grw-subnavbar">
-        { renderFormerLink() }
-        <h1 className="m-0">
-          <RevisionPath
-            pageId={pageId}
-            pagePath={pageContainer.state.path}
-            isPageForbidden={isPageForbidden}
-            isPageInTrash={isPageInTrash}
-          />
-        </h1>
+        <PagePathNav pageId={pageId} pagePath={path} isPageForbidden={isPageForbidden} />
       </div>
       </div>
     );
     );
   }
   }
@@ -73,23 +93,24 @@ const GrowiSubNavigation = (props) => {
 
 
       {/* Page Path */}
       {/* Page Path */}
       <div>
       <div>
-        { renderFormerLink() }
-        <h1 className="m-0">
-          <RevisionPath pageId={pageId} pagePath={pageContainer.state.path} />
-        </h1>
+        <PagePathNav pageId={pageId} pagePath={path} isPageForbidden={isPageForbidden} />
         { !isPageNotFound && !isPageForbidden && (
         { !isPageNotFound && !isPageForbidden && (
           <TagLabels />
           <TagLabels />
         ) }
         ) }
       </div>
       </div>
 
 
       <div className="d-flex align-items-center">
       <div className="d-flex align-items-center">
-        {/* Header Button */}
-        <div className="mr-2">
-          <LikeButton pageId={pageId} isLiked={pageContainer.state.isLiked} />
-        </div>
-        <div>
-          <BookmarkButton pageId={pageId} crowi={appContainer} />
-        </div>
+        { !isPageInTrash && (
+          /* Header Button */
+          <div className="mr-2">
+            <LikeButton pageId={pageId} isLiked={pageContainer.state.isLiked} />
+          </div>
+        ) }
+        { !isPageInTrash && (
+          <div>
+            <BookmarkButton pageId={pageId} crowi={appContainer} />
+          </div>
+        ) }
 
 
         {/* Page Authors */}
         {/* Page Authors */}
         <ul className="authors text-nowrap d-none d-lg-block d-edit-none">
         <ul className="authors text-nowrap d-none d-lg-block d-edit-none">

+ 27 - 5
src/client/js/components/Navbar/GrowiSubNavigationForUserPage.jsx

@@ -3,17 +3,41 @@ import PropTypes from 'prop-types';
 
 
 import { withTranslation } from 'react-i18next';
 import { withTranslation } from 'react-i18next';
 
 
+import LinkedPagePath from '@commons/models/linked-page-path';
+import PagePathHierarchicalLink from '@commons/components/PagePathHierarchicalLink';
+
 import { createSubscribedElement } from '../UnstatedUtils';
 import { createSubscribedElement } from '../UnstatedUtils';
 import AppContainer from '../../services/AppContainer';
 import AppContainer from '../../services/AppContainer';
-import RevisionPath from '../Page/RevisionPath';
 import PageContainer from '../../services/PageContainer';
 import PageContainer from '../../services/PageContainer';
+
+import RevisionPathControls from '../Page/RevisionPathControls';
 import BookmarkButton from '../BookmarkButton';
 import BookmarkButton from '../BookmarkButton';
 import UserPicture from '../User/UserPicture';
 import UserPicture from '../User/UserPicture';
 
 
+// eslint-disable-next-line react/prop-types
+const PagePathNav = ({ pageId, pagePath }) => {
+  const linkedPagePath = new LinkedPagePath(pagePath);
+  const latterLink = <PagePathHierarchicalLink linkedPagePath={linkedPagePath} />;
+
+  return (
+    <div className="grw-page-path-nav">
+      <span className="d-flex align-items-center flex-wrap">
+        <h4 className="grw-user-page-path">{latterLink}</h4>
+        <RevisionPathControls
+          pageId={pageId}
+          pagePath={pagePath}
+        />
+      </span>
+    </div>
+  );
+};
+
 const GrowiSubNavigationForUserPage = (props) => {
 const GrowiSubNavigationForUserPage = (props) => {
   const pageUser = JSON.parse(document.querySelector('#grw-subnav-for-user-page').getAttribute('data-page-user'));
   const pageUser = JSON.parse(document.querySelector('#grw-subnav-for-user-page').getAttribute('data-page-user'));
   const { appContainer, pageContainer } = props;
   const { appContainer, pageContainer } = props;
-  const { pageId, isHeaderSticky, isSubnavCompact } = pageContainer.state;
+  const {
+    pageId, path, isHeaderSticky, isSubnavCompact,
+  } = pageContainer.state;
 
 
   const additionalClassNames = ['grw-subnavbar', 'grw-subnavbar-user-page'];
   const additionalClassNames = ['grw-subnavbar', 'grw-subnavbar-user-page'];
   const layoutType = appContainer.getConfig().layoutType;
   const layoutType = appContainer.getConfig().layoutType;
@@ -32,9 +56,7 @@ const GrowiSubNavigationForUserPage = (props) => {
 
 
   return (
   return (
     <div className={`px-3 ${additionalClassNames.join(' ')}`}>
     <div className={`px-3 ${additionalClassNames.join(' ')}`}>
-      <h4 className="grw-user-page-path">
-        <RevisionPath behaviorType={appContainer.config.behaviorType} pageId={pageId} pagePath={pageContainer.state.path} />
-      </h4>
+      <PagePathNav pageId={pageId} pagePath={path} />
 
 
       <div className="d-flex align-items-center justify-content-between">
       <div className="d-flex align-items-center justify-content-between">
 
 

+ 0 - 55
src/client/js/components/Page/RevisionPath.jsx

@@ -1,55 +0,0 @@
-import React from 'react';
-import PropTypes from 'prop-types';
-
-import { withTranslation } from 'react-i18next';
-
-import DevidedPagePath from '@commons/models/devided-page-path';
-import LinkedPagePath from '@commons/models/linked-page-path';
-import PagePathHierarchicalLink from '@commons/components/PagePathHierarchicalLink';
-
-import CopyDropdown from './CopyDropdown';
-
-const RevisionPath = (props) => {
-  // define styles
-  const buttonStyle = {
-    marginLeft: '0.5em',
-    padding: '0 2px',
-  };
-
-  const {
-    pageId, isPageInTrash, isPageForbidden,
-  } = props;
-
-  const dPagePath = new DevidedPagePath(props.pagePath, false, true);
-  const linkedPagePathLatter = new LinkedPagePath(dPagePath.latter);
-
-  return (
-    <>
-      <span className="d-flex align-items-center flex-wrap">
-        <PagePathHierarchicalLink linkedPagePath={linkedPagePathLatter} basePath={dPagePath.isRoot ? undefined : dPagePath.former} />
-        <CopyDropdown pagePath={props.pagePath} pageId={pageId} buttonStyle={buttonStyle} />
-        { !isPageInTrash && !isPageForbidden && (
-          <a href="#edit" className="d-block d-edit-none text-muted btn btn-secondary bg-transparent btn-edit border-0" style={buttonStyle}>
-            <i className="icon-note" />
-          </a>
-        ) }
-      </span>
-    </>
-  );
-};
-
-RevisionPath.propTypes = {
-  t: PropTypes.func.isRequired, // i18next
-
-  pagePath: PropTypes.string.isRequired,
-  pageId: PropTypes.string,
-  isPageForbidden: PropTypes.bool,
-  isPageInTrash: PropTypes.bool,
-};
-
-RevisionPath.defaultProps = {
-  isPageForbidden: false,
-  isPageInTrash: false,
-};
-
-export default withTranslation()(RevisionPath);

+ 47 - 0
src/client/js/components/Page/RevisionPathControls.jsx

@@ -0,0 +1,47 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+
+import { withTranslation } from 'react-i18next';
+
+import { isTrashPage } from '@commons/util/path-utils';
+
+import CopyDropdown from './CopyDropdown';
+
+const RevisionPathControls = (props) => {
+  // define styles
+  const buttonStyle = {
+    marginLeft: '0.5em',
+    padding: '0 2px',
+  };
+
+  const {
+    pagePath, pageId, isPageForbidden,
+  } = props;
+
+  const isPageInTrash = isTrashPage(pagePath);
+
+  return (
+    <>
+      <CopyDropdown pagePath={pagePath} pageId={pageId} buttonStyle={buttonStyle} />
+      { !isPageInTrash && !isPageForbidden && (
+        <a href="#edit" className="d-edit-none text-muted btn btn-secondary bg-transparent btn-edit border-0" style={buttonStyle}>
+          <i className="icon-note" />
+        </a>
+      ) }
+    </>
+  );
+};
+
+RevisionPathControls.propTypes = {
+  t: PropTypes.func.isRequired, // i18next
+
+  pagePath: PropTypes.string.isRequired,
+  pageId: PropTypes.string,
+  isPageForbidden: PropTypes.bool,
+};
+
+RevisionPathControls.defaultProps = {
+  isPageForbidden: false,
+};
+
+export default withTranslation()(RevisionPathControls);

+ 1 - 1
src/client/js/components/PageEditor/HandsontableModal.jsx

@@ -437,7 +437,7 @@ export default class HandsontableModal extends React.PureComponent {
           Edit Table
           Edit Table
         </ModalHeader>
         </ModalHeader>
         <ModalBody className="p-0 d-flex flex-column">
         <ModalBody className="p-0 d-flex flex-column">
-          <div className="px-4 py-3 modal-navbar bg-light">
+          <div className="px-4 py-3 border-bottom bg-light">
             <button
             <button
               type="button"
               type="button"
               className="mr-4 data-import-button btn btn-secondary"
               className="mr-4 data-import-button btn btn-secondary"

+ 50 - 0
src/client/js/components/PageEditor/PagePathNavForEditor.jsx

@@ -0,0 +1,50 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+
+import { withTranslation } from 'react-i18next';
+
+import LinkedPagePath from '@commons/models/linked-page-path';
+import PagePathHierarchicalLink from '@commons/components/PagePathHierarchicalLink';
+
+import { createSubscribedElement } from '../UnstatedUtils';
+import AppContainer from '../../services/AppContainer';
+import PageContainer from '../../services/PageContainer';
+
+import RevisionPathControls from '../Page/RevisionPathControls';
+import TagLabels from '../Page/TagLabels';
+
+const PagePathNavForEditor = (props) => {
+  const { pageId, path } = props.pageContainer.state;
+
+  const linkedPagePath = new LinkedPagePath(path);
+  const pagePathHierarchicalLink = <PagePathHierarchicalLink linkedPagePath={linkedPagePath} />;
+
+  return (
+    <div className="grw-page-path-nav-for-edit mt-1">
+      <span className="d-flex align-items-center flex-wrap">
+        <h3 className="mb-0 grw-page-path-link">{pagePathHierarchicalLink}</h3>
+        <RevisionPathControls
+          pageId={pageId}
+          pagePath={path}
+        />
+      </span>
+      <TagLabels />
+    </div>
+  );
+};
+
+/**
+ * Wrapper component for using unstated
+ */
+const PagePathNavForEditorWrapper = (props) => {
+  return createSubscribedElement(PagePathNavForEditor, props, [AppContainer, PageContainer]);
+};
+
+
+PagePathNavForEditor.propTypes = {
+  t: PropTypes.func.isRequired, //  i18next
+  appContainer: PropTypes.instanceOf(AppContainer).isRequired,
+  pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
+};
+
+export default withTranslation()(PagePathNavForEditorWrapper);

+ 1 - 1
src/client/js/components/PageEditorByHackmd.jsx

@@ -314,7 +314,7 @@ class PageEditorByHackmd extends React.Component {
 
 
       content = (
       content = (
         <div>
         <div>
-          <p className="text-center hackmd-status-label"><i className="fa fa-file-text"></i> HackMD is READY!</p>
+          <p className="text-muted text-center hackmd-status-label"><i className="fa fa-file-text"></i> HackMD is READY!</p>
           <div className="text-center hackmd-start-button-container mb-3">
           <div className="text-center hackmd-start-button-container mb-3">
             <button
             <button
               className="btn btn-info btn-lg waves-effect waves-light"
               className="btn btn-info btn-lg waves-effect waves-light"

+ 0 - 23
src/client/js/legacy/crowi.js

@@ -2,8 +2,6 @@
 
 
 import { pathUtils } from 'growi-commons';
 import { pathUtils } from 'growi-commons';
 
 
-const entities = require('entities');
-const escapeStringRegexp = require('escape-string-regexp');
 require('jquery.cookie');
 require('jquery.cookie');
 
 
 require('./thirdparty-js/waves');
 require('./thirdparty-js/waves');
@@ -459,27 +457,6 @@ $(() => {
     window.location.hash = '#';
     window.location.hash = '#';
   });
   });
 
 
-  /*
-   * wrap short path with <strong></strong>
-   */
-  $('#view-list .page-list-ul-flat .page-list-link').each(function() {
-    const $link = $(this);
-    /* eslint-disable-next-line no-unused-vars */
-    const text = $link.text();
-    let path = decodeURIComponent($link.data('path'));
-    const shortPath = decodeURIComponent($link.data('short-path')); // convert to string
-
-    if (path == null || shortPath == null) {
-      // continue
-      return;
-    }
-
-    path = entities.encodeHTML(path);
-    const pattern = `${escapeStringRegexp(entities.encodeHTML(shortPath))}(/)?$`;
-
-    $link.html(path.replace(new RegExp(pattern), `<strong>${shortPath}$1</strong>`));
-  });
-
   if (pageId) {
   if (pageId) {
     // for Crowi Template LangProcessor
     // for Crowi Template LangProcessor
     $('.template-create-button', $('#revision-body')).on('click', function() {
     $('.template-create-button', $('#revision-body')).on('click', function() {

+ 0 - 172
src/client/styles/agile-admin/inverse/colors/_apply-colors-dark.scss

@@ -1,172 +0,0 @@
-/*
- * Button
- */
-.btn-default {
-  &:hover,
-  &:focus,
-  &.active,
-  &.active:hover,
-  &.active:focus {
-    color: white;
-    background-color: lighten($bodycolor, 5%);
-  }
-}
-
-/*
-  * Form
-  */
-input.form-control,
-textarea.form-control {
-  color: lighten($bodytext, 30%);
-  background-color: darken($bodycolor, 5%);
-  border: 1px solid darken($border, 30%);
-}
-.form-control[disabled],
-.form-control[readonly] {
-  color: lighten($bodytext, 10%);
-  background-color: lighten($bodycolor, 5%);
-}
-.input-group .input-group-addon {
-  color: $dark;
-  background-color: rgba($topbar, 0.4);
-  border: 1px solid darken($border, 30%);
-  border-right: none;
-}
-
-/*
- * Dropdown
- */
-.dropdown-menu {
-  background-color: $bodycolor;
-  > li > a {
-    color: $bodytext;
-  }
-
-  .divider {
-    background-color: $border;
-  }
-}
-
-.modal {
-  .modal-header {
-    .close {
-      color: white;
-    }
-  }
-}
-
-/*
- * Panel
- */
-.panel {
-  &,
-  &.panel-white,
-  &.panel-default {
-    .panel-heading,
-    .panel-body {
-      color: $light;
-    }
-  }
-}
-
-/*
- * Table
- */
-.table > thead > tr > th,
-.table > tbody > tr > th,
-.table > tfoot > tr > th,
-.table > thead > tr > td,
-.table > tbody > tr > td,
-.table > tfoot > tr > td,
-.table > thead > tr > th,
-.table-bordered {
-  border-top: 1px solid $border;
-}
-
-.table-bordered > thead > tr > th,
-.table-bordered > tbody > tr > th,
-.table-bordered > tfoot > tr > th,
-.table-bordered > thead > tr > td,
-.table-bordered > tbody > tr > td,
-.table-bordered > tfoot > tr > td {
-  border: 1px solid $border;
-}
-.table > thead > tr > th {
-  border-bottom: 1px solid $border;
-}
-
-.table-bordered {
-  border: 1px solid $border;
-}
-
-/*
- * GROWI page list
- */
-.page-list {
-  .page-list-ul {
-    > li {
-      > a strong {
-        color: lighten($bodytext, 25%);
-      }
-      > span.page-list-meta {
-        color: $bodytext;
-      }
-    }
-  }
-}
-
-/*
- * GROWI search page
- */
-.search-page {
-  .input-group-btn {
-    .btn-default {
-      border: 1px solid darken($border, 30%); // fit to input.form-control
-    }
-  }
-}
-
-/*
- * GROWI on-edit
- */
-.page-editor-footer {
-  #slack-mark-black {
-    display: none;
-  }
-}
-
-legend {
-  border-color: lighten($border, 10%);
-}
-.wiki {
-  h1 {
-    border-color: lighten($border, 10%);
-  }
-  h2 {
-    border-color: $border;
-  }
-}
-.editor-container .navbar-editor svg {
-  fill: $bodytext;
-}
-
-/*
- * GROWI admin page #themeOptions
- */
-.admin-page {
-  #themeOptions {
-    .theme-option-container.active a {
-      background-color: darken($themecolor, 15%);
-      border-color: darken($themecolor, 15%);
-    }
-  }
-}
-
-/*
- * GROWI comment form
- */
-.comment-form {
-  #slack-mark-black {
-    display: none;
-  }
-}

+ 0 - 231
src/client/styles/agile-admin/inverse/colors/antarctic.scss

@@ -1,231 +0,0 @@
-@import '../variables';
-
-$bgcolor-theme: #000080;
-$themelight: #f0f8ff;
-$subthemecolor: black;
-$accentcolor: #ffd700;
-$sidebar-text: $themelight;
-$bgcolor-navbar: $bgcolor-theme;
-$bgcolor-global: $themelight;
-$bgcolor-global: $themelight;
-$color-header: $subthemecolor;
-$color-global: $subthemecolor;
-$linktext: lighten(blue, 5%);
-$primary: $bgcolor-theme;
-$active-nav-tabs-bgcolor: $bgcolor-theme;
-$fillcolor-logo-mark: $themelight;
-$color-link-wiki: lighten($bgcolor-theme, 5%);
-$color-link-wiki-hover: lighten($color-link-wiki, 15%);
-$color-inline-code: #c7254e;
-$bgcolor-inline-code: #f9f2f4;
-$border: $subthemecolor;
-$border-original: $subthemecolor;
-$navbar-border: $bgcolor-theme;
-$background-color: rgba(
-  $color: $themelight,
-  $alpha: 0.8,
-);
-
-@import 'apply-colors';
-@import 'apply-colors-light';
-
-// change color of highlighted header in wiki (default: orange)
-.code-line,
-ul > .text-muted {
-  color: $subthemecolor;
-}
-
-.wiki {
-  h1 {
-    border-color: $subthemecolor;
-  }
-
-  .code-line.revision-head.highlighted {
-    color: $themelight;
-    background-color: lighten($bgcolor-theme, 50%);
-
-    .icon-note,
-    .icon-link {
-      color: $themelight;
-    }
-  }
-}
-
-// add background-image
-#wrapper > #page-wrapper,
-.page-editor-preview-container {
-  background-image: url('/images/themes/antarctic/bg.svg');
-  background-attachment: fixed;
-  background-position: center center;
-  background-size: cover;
-}
-
-.sidebar {
-  background: $bgcolor-theme;
-}
-
-table,
-.hljs,
-.help-block {
-  background-color: $background-color;
-}
-
-.grw-subnav,
-.nav-navbar {
-  background-color: $themelight;
-}
-
-.edit-button {
-  color: $themelight;
-}
-
-.editor-container .btn-open-dropzone {
-  border-top: none;
-}
-
-.help-block {
-  padding: 5px;
-}
-
-/*
- * Accentcolor (yellow)
- */
-
-.modal {
-  .modal-header {
-    border-bottom: 4px solid $accentcolor;
-  }
-}
-
-#wrapper > .navbar > .navbar-header {
-  border-bottom: 4px solid $accentcolor;
-}
-
-/*
- * Comments
- */
-
-.page-comment {
-  .page-comment-main {
-    box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.2);
-
-    .page-comment-creator > a {
-      border-bottom: 1px double $subthemecolor;
-    }
-  }
-}
-
-.growi .main {
-  .page-comments-row {
-    border-top-color: transparent;
-  }
-
-  .page-comment .page-comment-main,
-  .page-comment-form .comment-form-main {
-    background-color: $background-color;
-
-    &::before {
-      border-right-color: $background-color;
-    }
-
-    .nav.nav-tabs {
-      > li.active > a {
-        background: $bgcolor-theme;
-        border-bottom: solid 1px $bgcolor-theme;
-        border-bottom-color: $bgcolor-theme;
-      }
-    }
-  }
-}
-
-/*
- * Tabs
- */
-
-.nav.nav-tabs > li.active > a {
-  color: $themelight;
-}
-
-.text-info,
-body:not(.on-edit) .nav.nav-tabs {
-  > li > a {
-    color: $subthemecolor;
-  }
-
-  > li.active > a {
-    color: $themelight;
-    background: linear-gradient(
-      rgba($active-nav-tabs-bgcolor, 0) 50%,
-      rgba($active-nav-tabs-bgcolor, 0) 90%,
-      $active-nav-tabs-bgcolor 100%
-    ); // overwrite only the bottom pixel
-    background-color: $bgcolor-theme;
-  }
-}
-
-/*
- * Panel
- */
-
-.panel {
-  width: 80%;
-  margin: 0px auto;
-
-  &.panel-white,
-  &.panel-default {
-    border: 1px solid $subthemecolor;
-    border-color: $border-original;
-
-    .panel-heading {
-      color: $subthemecolor;
-      background-color: $background-color;
-    }
-  }
-}
-
-/*
- *  Right space for readable
- */
-
-.growi {
-  .revision-toc {
-    max-width: 360px;
-    background-color: $background-color;
-    border-radius: 5px;
-
-    .revision-toc-content {
-      padding: 10px;
-
-      ul {
-        padding-left: 5px;
-      }
-    }
-  }
-}
-
-/*
- *  Login page
- */
-
-.login-page > #wrapper > #page-wrapper {
-  background-image: url('/images/themes/antarctic/topimage.svg');
-  background-attachment: fixed;
-  background-position: center center;
-  background-size: cover;
-
-  .link-switch {
-    color: dimgray;
-
-    &:hover {
-      color: #000080;
-    }
-  }
-}
-
-/*
- *  for Hightlight-js
- */
-
-.hljs-ln {
-  background-color: transparent;
-}

+ 0 - 51
src/client/styles/agile-admin/inverse/colors/blue-night.scss

@@ -1,51 +0,0 @@
-@import '../variables';
-
-$basecolor: #061f2f;
-$bgcolor-theme: #0090c8;
-
-$linkcolor: #97d1f0;
-
-$bgcolor-navbar: #27343b;
-$bgcolor-global: #061f2f;
-$bgcolor-global: #061f2f;
-$color-header: #fff;
-$color-global: #d3d4d4;
-$linktext: $linkcolor;
-$linktext-hover: rgba($linktext, 0.8);
-$sidebar-text: #d3d4d4;
-$dark-themecolor: #4f5467;
-
-$primary: $bgcolor-theme;
-
-$fillcolor-logo-mark: lighten(desaturate($bgcolor-navbar, 10%), 15%);
-$color-link-wiki: $linkcolor;
-$color-link-wiki-hover: rgba($linktext, 0.8);
-
-$dark: darken($color-global, 5%);
-$border: #fff;
-$navbar-border: lighten($basecolor, 25%);
-$active-navbar-border: darken($navbar-border, 3%);
-$btn-default-bgcolor: darken($basecolor, 10%);
-$color-inline-code: #c1f1f0;
-$bgcolor-inline-code: #0a121b;
-
-@import 'apply-colors';
-@import 'apply-colors-dark';
-
-.wiki {
-  .highlighted {
-    background-color: lighten($bgcolor-theme, 20%);
-  }
-}
-
-.panel {
-  &,
-  &.panel-white,
-  &.panel-default {
-    border-color: $color-global;
-    .panel-heading {
-      color: $basecolor;
-      background-color: 1px solid $color-global;
-    }
-  }
-}

+ 0 - 130
src/client/styles/agile-admin/inverse/colors/christmas.scss

@@ -1,130 +0,0 @@
-@import '../variables';
-
-$bgcolor-theme: #b3000c;
-$themelight: white;
-$subthemecolor: #017e20;
-$bgcolor-navbar: $bgcolor-theme;
-$bgcolor-global: $themelight;
-$bgcolor-global: $themelight;
-$color-header: $subthemecolor;
-$color-global: black;
-$linktext: lighten(#0d5901, 5%);
-$linktext-hover: lighten($linktext, 12%);
-$sidebar-text: #ffffff;
-$primary: $bgcolor-theme;
-$fillcolor-logo-mark: lighten(desaturate($bgcolor-navbar, 50%), 50%);
-$color-link-wiki: lighten($bgcolor-theme, 5%);
-$color-link-wiki-hover: lighten($color-link-wiki, 15%);
-$color-inline-code: darken($subthemecolor, 5%);
-$bgcolor-inline-code: lighten($subthemecolor, 70%);
-$border-original: $border;
-$border: $subthemecolor;
-$navbar-border: $bgcolor-theme;
-$active-nav-tabs-bgcolor: white;
-
-@import 'apply-colors';
-@import 'apply-colors-light';
-
-// change color of highlighted header in wiki (default: orange)
-.wiki {
-  .code-line.revision-head.highlighted {
-    color: $themelight;
-    background-color: lighten($bgcolor-theme, 20%);
-
-    .icon-note,
-    .icon-link {
-      color: $themelight;
-    }
-  }
-}
-
-.sidebar {
-  background: $bgcolor-theme;
-}
-
-.rbt-menu {
-  background: $themelight;
-}
-
-#wrapper > #page-wrapper,
-.page-editor-preview-container {
-  background-image: url('/images/themes/christmas/christmas.jpg');
-  background-attachment: fixed;
-  background-size: cover;
-}
-
-.grw-subnav {
-  background-color: #ffffff;
-}
-
-#wrapper > .navbar > .navbar-header {
-  background-image: url('/images/themes/christmas/christmas-navbar.jpg');
-  border-bottom: 4px solid $subthemecolor;
-}
-
-/*
- * Tabs
- */
-body:not(.on-edit) .nav.nav-tabs {
-  > li.active > a {
-    background: linear-gradient(
-      rgba($active-nav-tabs-bgcolor, 0) 0%,
-      rgba($active-nav-tabs-bgcolor, 0) 90%,
-      $active-nav-tabs-bgcolor 100%
-    ); // overwrite only the bottom pixel
-  }
-}
-
-// login page
-.nologin {
-  .input-group {
-    .input-group-addon {
-      background-color: rgba(lighten(black, 10%), 0.6);
-    }
-    .form-control {
-      background-color: rgba(lighten(black, 10%), 0.6);
-    }
-  }
-
-  &.login-page {
-    .login-header,
-    .login-dialog {
-      background-color: rgba(#ccc, 0.5);
-    }
-    .link-switch {
-      color: #bd3425;
-    }
-  }
-}
-
-/*
- * Modal
- */
-.modal-dialog .modal-header.bg-primary {
-  background-image: url('/images/themes/christmas/christmas-navbar.jpg');
-  border-bottom: 2px solid $subthemecolor;
-}
-
-/*
- * Panel
- */
-.panel {
-  &.panel-white,
-  &.panel-default {
-    border-color: $border-original;
-    .panel-heading {
-      color: $dark;
-      background-color: $border-original;
-      border-bottom: 1px solid $border-original;
-    }
-  }
-}
-
-.panel.panel-primary {
-  border-color: #bd3425;
-  .panel-heading {
-    color: white;
-    background-color: $bgcolor-theme;
-    background-image: url('/images/themes/christmas/christmas-navbar.jpg');
-  }
-}

+ 0 - 37
src/client/styles/agile-admin/inverse/colors/future.scss

@@ -1,37 +0,0 @@
-@import '../variables';
-
-$basecolor: #16282d;
-$bgcolor-theme: rgba(11, 79, 104, 0.616);
-
-$bgcolor-navbar: #011414;
-$bgcolor-global: #fff;
-$bgcolor-global: $basecolor;
-$color-header: #d9a364;
-$color-global: lighten($basecolor, 35%);
-$linktext: lighten($basecolor, 45%);
-$linktext-hover: lighten($linktext, 80%);
-$sidebar-text: rgb(65, 133, 124);
-$dark-themecolor: #4f5467;
-
-$primary: $bgcolor-theme;
-$info: lighten($bgcolor-theme, 20%);
-
-$fillcolor-logo-mark: rgb(170, 245, 237);
-$color-link-wiki: saturate($color-global, 20%);
-$color-link-wiki-hover: darken($color-link-wiki, 5%);
-
-$dark: darken($color-global, 5%);
-$border: lighten($basecolor, 15%);
-$navbar-border: lighten($border, 10%);
-$active-navbar-border: darken($border, 3%);
-$btn-default-bgcolor: darken($basecolor, 10%);
-$bgcolor-inline-code: darken($bgcolor-global, 5%);
-
-@import 'apply-colors';
-@import 'apply-colors-dark';
-
-body:not(.on-edit) {
-  .grw-subnav {
-    border-bottom: 1px solid rgb(131, 228, 215);
-  }
-}

+ 0 - 87
src/client/styles/agile-admin/inverse/colors/halloween.scss

@@ -1,87 +0,0 @@
-@import '../variables';
-
-$basecolor: #0a010a;
-$bgcolor-theme: #aa4a04;
-$subthemecolor: #e9af2b;
-$linkcolor: #aa4a04;
-$bgcolor-navbar: $bgcolor-theme;
-$bgcolor-global: #061f2f;
-$subthemecolor: #e9af2b;
-$bgcolor-global: #0f0101;
-$color-header: #e9af2b;
-$color-global: #e9af2b;
-$linktext: $linkcolor;
-$linktext-hover: rgba($linktext, 0.8);
-$sidebar-text: $bgcolor-theme;
-$dark-themecolor: #4f5467;
-$primary: $bgcolor-theme;
-$fillcolor-logo-mark: lighten($subthemecolor, 20%);
-$color-link-wiki: $linkcolor;
-$color-link-wiki-hover: rgba($linktext, 0.8);
-$dark: darken($color-global, 5%);
-$border: $bgcolor-theme;
-$navbar-border: lighten($basecolor, 25%);
-$active-navbar-border: darken($navbar-border, 3%);
-$active-nav-tabs-bgcolor: #231313;
-$btn-default-bgcolor: darken($basecolor, 10%);
-$color-inline-code: #a94f04;
-$bgcolor-inline-code: #0a121b;
-
-@import 'apply-colors';
-@import 'apply-colors-dark';
-
-.wiki {
-  .highlighted {
-    background-color: lighten($bgcolor-theme, 20%);
-  }
-}
-
-.panel {
-  &,
-  &.panel-white,
-  &.panel-default {
-    background-color: lighten($basecolor, 5%);
-    border-color: $color-global;
-
-    .panel-heading {
-      color: $basecolor;
-      background-color: 1px solid $color-global;
-    }
-  }
-}
-
-.rbt-menu {
-  background: lighten($basecolor, 7%);
-}
-
-.nav-pills > li > a:hover {
-  color: $white;
-  background: #d3671a;
-}
-
-#wrapper > .navbar > .navbar-header {
-  background-image: url('/images/themes/halloween/halloween-navbar.jpg');
-}
-
-#wrapper > #page-wrapper,
-.page-editor-preview-container {
-  background-image: url('/images/themes/halloween/halloween.jpg');
-  background-attachment: fixed;
-}
-
-.grw-subnav {
-  background-color: rgba(0, 0, 0, 0.3);
-}
-
-/*
- * Tabs
- */
-body:not(.on-edit) .nav.nav-tabs {
-  > li.active > a {
-    background: linear-gradient(
-      rgba($active-nav-tabs-bgcolor, 0) 0%,
-      rgba($active-nav-tabs-bgcolor, 0) 90%,
-      $active-nav-tabs-bgcolor 100%
-    ); // overwrite only the bottom pixel
-  }
-}

+ 0 - 132
src/client/styles/agile-admin/inverse/colors/island.scss

@@ -1,132 +0,0 @@
-@import '../variables';
-
-$bgcolor-theme: #0c2a44;
-$themelight: rgba(183, 226, 219, 1);
-
-$subthemecolor: rgba($linktext, 0.8);
-$linkcolor: #3c6d72;
-$bgcolor-theme: #97cbc3;
-$bgcolor-navbar: #0c2a44;
-$bgcolor-global: $themelight;
-$bgcolor-global: lighten($themelight, 10%);
-$color-header: #3c6d72;
-$color-global: #3c6d72;
-$linktext: $linkcolor;
-$linktext-hover: rgba($linktext, 0.8);
-$sidebar-text: $bgcolor-theme;
-$primary: $bgcolor-theme;
-$fillcolor-logo-mark: lighten($themelight, 10%);
-$color-link-wiki: $linkcolor;
-$color-link-wiki-hover: rgba($linktext, 0.8);
-$dark: darken($color-global, 5%);
-$border: #76b1a8;
-$navbar-border: #76b1a8;
-$active-navbar-border: darken($navbar-border, 13%);
-$active-nav-tabs-bgcolor: #dbf0ed;
-$btn-default-bgcolor: darken($bgcolor-theme, 10%);
-$color-inline-code: #8f5313;
-$bgcolor-inline-code: darken($themelight, 3%);
-
-@import 'apply-colors';
-@import 'apply-colors-light';
-
-.wiki {
-  .highlighted {
-    background-color: lighten($bgcolor-theme, 20%);
-  }
-}
-
-.panel {
-  &,
-  &.panel-white,
-  &.panel-default {
-    color: $bgcolor-theme;
-    background-color: lighten($bgcolor-theme, 30%);
-    border-color: white;
-
-    .panel-heading {
-      color: $bgcolor-theme;
-      background-color: white;
-    }
-
-    ul {
-      li {
-        a {
-          color: darken($bgcolor-theme, 15%);
-        }
-      }
-    }
-  }
-}
-
-/* GROWI page list */
-.page-list {
-  .page-list-ul {
-    > li {
-      > a strong {
-        color: $linkcolor;
-      }
-    }
-  }
-}
-
-.rbt-menu {
-  background: lighten($themelight, 5%);
-}
-
-#wrapper > #page-wrapper,
-.page-editor-preview-container {
-  background-image: url('/images/themes/island/island.png');
-  background-attachment: fixed;
-}
-
-/*
- * Tabs
- */
-body:not(.on-edit) .nav.nav-tabs {
-  > li.active > a {
-    background: linear-gradient(
-      rgba($active-nav-tabs-bgcolor, 0) 0%,
-      rgba($active-nav-tabs-bgcolor, 0) 90%,
-      $active-nav-tabs-bgcolor 100%
-    ); // overwrite only the bottom pixel
-  }
-}
-
-/* Table */
-.table > thead > tr > th,
-.table > tbody > tr > th,
-.table > tfoot > tr > th,
-.table > thead > tr > td,
-.table > tbody > tr > td,
-.table > tfoot > tr > td,
-.table > thead > tr > th,
-.table-bordered {
-  border-top: 1px solid $border;
-}
-
-.table-bordered > thead > tr > th,
-.table-bordered > tbody > tr > th,
-.table-bordered > tfoot > tr > th,
-.table-bordered > thead > tr > td,
-.table-bordered > tbody > tr > td,
-.table-bordered > tfoot > tr > td {
-  border: 1px solid $border;
-}
-
-.table > thead > tr > th {
-  border-bottom: 1px solid $border;
-}
-
-.table-bordered {
-  border: 1px solid $border;
-}
-
-// login page
-.nologin {
-  &.login-page {
-    > #wrapper > #page-wrapper {
-      background-image: unset;
-    }
-  }
-}

+ 0 - 43
src/client/styles/agile-admin/inverse/colors/kibela.scss

@@ -1,43 +0,0 @@
-@import '../variables';
-
-$radius: 3px;
-
-$bgcolor-theme: rgb(18, 86, 163);
-$themelight: #f4f5f6;
-$subthemecolor: rgb(90, 149, 216);
-
-$bgcolor-navbar: $bgcolor-theme;
-$bgcolor-global: $themelight;
-$bgcolor-global: $themelight;
-
-$color-header: $bgcolor-theme;
-$color-global: #3c4a60;
-$linktext: rgb(74, 109, 204);
-$linktext-hover: lighten($linktext, 12%);
-$sidebar-text: $bgcolor-theme;
-
-$primary: $bgcolor-theme;
-$info: lighten($bgcolor-theme, 20%);
-
-$fillcolor-logo-mark: lighten($bgcolor-theme, 20%);
-$color-link-wiki: lighten($bgcolor-theme, 20%);
-$color-link-wiki-hover: lighten($color-link-wiki, 20%);
-$color-inline-code: $subthemecolor;
-$bgcolor-inline-code: lighten($subthemecolor, 70%);
-$border: rgba(181, 203, 247, 0.61);
-
-@import 'apply-colors';
-@import 'apply-colors-light';
-
-// change color of highlighted header in wiki (default: orange)
-.wiki {
-  .code-line.revision-head.highlighted {
-    color: $themelight;
-    background-color: lighten($bgcolor-theme, 20%);
-
-    .icon-note,
-    .icon-link {
-      color: $themelight;
-    }
-  }
-}

+ 0 - 40
src/client/styles/agile-admin/inverse/colors/mono-blue.scss

@@ -1,40 +0,0 @@
-@import '../variables';
-
-$bgcolor-theme: #00587a;
-$themelight: #f7fbfd;
-$subthemecolor: #186718;
-
-$bgcolor-navbar: $bgcolor-theme;
-$bgcolor-global: $themelight;
-$bgcolor-global: $themelight;
-
-$color-header: $bgcolor-theme;
-$color-global: $bgcolor-theme;
-$linktext: lighten($bgcolor-theme, 5%);
-$linktext-hover: lighten($linktext, 12%);
-$sidebar-text: $bgcolor-theme;
-
-$primary: $bgcolor-theme;
-$info: lighten($bgcolor-theme, 20%);
-
-$fillcolor-logo-mark: lighten(desaturate($bgcolor-navbar, 30%), 20%);
-$color-link-wiki: lighten($bgcolor-theme, 20%);
-$color-link-wiki-hover: lighten($color-link-wiki, 20%);
-$color-inline-code: $subthemecolor;
-$bgcolor-inline-code: lighten($subthemecolor, 70%);
-
-@import 'apply-colors';
-@import 'apply-colors-light';
-
-// change color of highlighted header in wiki (default: orange)
-.wiki {
-  .code-line.revision-head.highlighted {
-    color: $themelight;
-    background-color: lighten($bgcolor-theme, 20%);
-
-    .icon-note,
-    .icon-link {
-      color: $themelight;
-    }
-  }
-}

+ 0 - 22
src/client/styles/agile-admin/inverse/colors/nature.scss

@@ -1,22 +0,0 @@
-@import '../variables';
-
-$bgcolor-theme: #460039;
-
-$bgcolor-navbar: #118050;
-$bgcolor-global: #fff;
-$bgcolor-global: #fefffd;
-
-$color-header: #46694e;
-$color-global: #333333;
-$linktext: lighten($bgcolor-theme, 5%);
-$linktext-hover: lighten($linktext, 12%);
-$sidebar-text: #5c7253;
-
-$primary: $bgcolor-theme;
-
-$fillcolor-logo-mark: lighten(desaturate($bgcolor-navbar, 30%), 20%);
-$color-link-wiki: lighten($bgcolor-theme, 20%);
-$color-link-wiki-hover: lighten($color-link-wiki, 20%);
-
-@import 'apply-colors';
-@import 'apply-colors-light';

+ 0 - 206
src/client/styles/agile-admin/inverse/colors/spring.scss

@@ -1,206 +0,0 @@
-@import '../variables';
-$radius: 5px;
-
-$themecolor: #ffb8c6;
-$buttoncolor: rgba(255, 184, 197, 0.5);
-$subthemecolor: #67a856;
-$themelight: #fff0f5;
-$topbar: $themecolor;
-$sidebar: #fff;
-$bodycolor: $sidebar;
-$headingtext: $subthemecolor;
-$bodytext: #333333;
-$linktext: $subthemecolor;
-$linktext-hover: lighten($linktext, 20%);
-$sidebar-text: #38495a;
-$accentcolor: #e08dbc;
-$accentlight: rgba(224, 141, 188, 0.2);
-$accentdark: rgba(224, 141, 188, 0.5);
-$background-color: rgba(171, 224, 174, 0.4);
-$third-main-color: antiquewhite;
-$textcolor: dimgray;
-$primary: #e87b98;
-$logo-mark-fill: lighten(desaturate($topbar, 10%), 15%);
-$wikilinktext: $subthemecolor;
-$wikilinktext-hover: gba(171, 224, 174, 0.9);
-
-@import 'apply-colors';
-@import 'apply-colors-light';
-
-// add background-image
-.main-container > #wrapper > #page-wrapper,
-.page-editor-preview-container {
-  background-color: rgba(255, 255, 255, 0.8);
-  background-image: url('/images/themes/spring/spring02.svg');
-  background-attachment: fixed;
-  background-position: bottom;
-  background-size: cover;
-}
-
-.sidebar {
-  background: $themelight;
-}
-
-/*
- * user's page
- */
-
-.growi .main .page-comments-row {
-  border-top-color: $third-main-color;
-}
-
-.modal {
-  .modal-header {
-    border-bottom: 4px solid $accentcolor;
-  }
-}
-
-#wrapper > .navbar > .navbar-header {
-  border-bottom: 4px solid $accentcolor;
-}
-
-/*
- * Comments
- */
-
-.page-comment {
-  .page-comment-main {
-    box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.2);
-
-    .page-comment-creator > a {
-      border-bottom: 1px double $subthemecolor;
-    }
-  }
-}
-
-div .page-comment-main {
-  border-radius: 10px;
-}
-
-// add comment
-div .comment-form-main {
-  border-radius: 10px;
-}
-
-/*
- * Tabs
- */
-
-.nav.nav-tabs > li.active > a {
-  color: $subthemecolor;
-}
-
-.text-info,
-body:not(.on-edit) .nav.nav-tabs {
-  > li > a {
-    color: $subthemecolor;
-  }
-
-  > li.active > a {
-    color: $subthemecolor;
-    background: linear-gradient(
-      rgba($active-nav-tabs-bgcolor, 0) 50%,
-      rgba($active-nav-tabs-bgcolor, 0) 90%,
-      $active-nav-tabs-bgcolor 100%
-    ); // overwrite only the bottom pixel
-    background-color: $themelight;
-  }
-}
-
-/*
- * button
- */
-
-.btn-link {
-  color: $subthemecolor;
-}
-
-.label-default {
-  background-color: $primary;
-}
-
-div .btn-inverse {
-  background-color: $themecolor;
-  border: $themecolor;
-}
-
-div .btn-default {
-  background-color: $accentlight;
-  border-color: $accentdark;
-}
-
-.admin-page .btn-group.btn-toggle .btn.active[data-active-class='primary'] {
-  color: $sidebar;
-  background-color: $accentcolor;
-  border-color: $accentdark;
-}
-
-/*
- * GROWI admin page #themeOptions
- */
-.admin-page {
-  #themeOptions {
-    .theme-option-container.active a {
-      border-color: $accentcolor;
-    }
-  }
-}
-
-button .btn-outline {
-  background-color: $themelight;
-}
-
-input .btn-secondary {
-  background: $themecolor;
-}
-
-/*
- *  Login page
- */
-
-.login-page > #wrapper > #page-wrapper {
-  background: $themelight;
-  background-image: url('/images/themes/spring/spring.svg');
-  background-attachment: fixed;
-  background-position: bottom;
-  background-size: cover;
-
-  .link-switch {
-    color: $themecolor;
-
-    &:hover {
-      color: $subthemecolor;
-    }
-  }
-}
-
-/*
- *  letter
- */
-
-.help-block {
-  padding: 5px;
-  color: $textcolor;
-  background-color: $accentlight;
-  border-radius: 3px;
-}
-
-.panel-primary a {
-  color: $subthemecolor;
-}
-
-/*
- *  panel
- */
-
-.panel-timeline > .panel-heading {
-  background-color: $third-main-color;
-}
-
-.panel-default > .panel-heading {
-  background-color: $third-main-color;
-}
-
-.panel .panel-body {
-  border-radius: 10px;
-}

+ 0 - 90
src/client/styles/agile-admin/inverse/colors/wood.scss

@@ -1,90 +0,0 @@
-@import '../variables';
-
-$bgcolor-theme: #aaa45f;
-$themelight: #f5f3ee;
-$subthemecolor: #dddebf;
-$bgcolor-navbar: $bgcolor-theme;
-$bgcolor-global: $themelight;
-$bgcolor-global: $themelight;
-$color-header: #577254;
-$color-global: #7c7a70;
-$linktext: lighten(#6d8969, 5%);
-$linktext-hover: lighten($linktext, 12%);
-$sidebar-text: #859083;
-$primary: $bgcolor-theme;
-$info: lighten($bgcolor-theme, 10%);
-$fillcolor-logo-mark: lighten(desaturate($bgcolor-navbar, 50%), 50%);
-$color-link-wiki: lighten($bgcolor-theme, 5%);
-$color-link-wiki-hover: lighten($color-link-wiki, 15%);
-$color-inline-code: darken($bgcolor-theme, 20%);
-$bgcolor-inline-code: lighten($subthemecolor, 70%);
-$active-nav-tabs-bgcolor: #fffffc;
-
-@import 'apply-colors';
-@import 'apply-colors-light';
-
-// change color of highlighted header in wiki (default: orange)
-.wiki {
-  .code-line.revision-head.highlighted {
-    color: $themelight;
-    background-color: lighten($bgcolor-theme, 20%);
-
-    .icon-note,
-    .icon-link {
-      color: $themelight;
-    }
-  }
-}
-
-.rbt-menu {
-  background: $themelight;
-}
-
-#wrapper > #page-wrapper,
-.page-editor-preview-container {
-  background-image: url('/images/themes/wood/wood.jpg');
-  background-attachment: fixed;
-}
-
-.grw-subnav {
-  background-color: rgba(226, 221, 192, 0.205);
-}
-
-#wrapper > .navbar > .navbar-header {
-  background-image: url('/images/themes/wood/wood-navbar.jpg');
-}
-
-/*
- * Tabs
- */
-body:not(.on-edit) .nav.nav-tabs {
-  > li.active > a {
-    background: linear-gradient(
-      rgba($active-nav-tabs-bgcolor, 0) 0%,
-      rgba($active-nav-tabs-bgcolor, 0) 90%,
-      $active-nav-tabs-bgcolor 100%
-    ); // overwrite only the bottom pixel
-  }
-}
-
-// login page
-.nologin {
-  .input-group {
-    .input-group-addon {
-      background-color: rgba(lighten(black, 10%), 0.6);
-    }
-    .form-control {
-      background-color: rgba(lighten(black, 10%), 0.6);
-    }
-  }
-
-  &.login-page {
-    .login-header,
-    .login-dialog {
-      background-color: rgba(#ccc, 0.5);
-    }
-    .link-switch {
-      color: $color-global;
-    }
-  }
-}

+ 10 - 10
src/client/styles/agile-admin/inverse/variables.scss

@@ -4,7 +4,7 @@
 
 
 // $basefont1:'Rubik', sans-serif;
 // $basefont1:'Rubik', sans-serif;
 // $basefont2:'Rubik', sans-serif;
 // $basefont2:'Rubik', sans-serif;
-$basefont1: Lato, -apple-system, BlinkMacSystemFont, 'Hiragino Kaku Gothic ProN', Meiryo, sans-serif !default;
+// $basefont1: Lato, -apple-system, BlinkMacSystemFont, 'Hiragino Kaku Gothic ProN', Meiryo, sans-serif !default;
 // $basefont2: Lato, -apple-system, BlinkMacSystemFont, 'Hiragino Kaku Gothic ProN', Meiryo, sans-serif !default;
 // $basefont2: Lato, -apple-system, BlinkMacSystemFont, 'Hiragino Kaku Gothic ProN', Meiryo, sans-serif !default;
 
 
 /* GROWI Color */
 /* GROWI Color */
@@ -17,11 +17,11 @@ $basefont1: Lato, -apple-system, BlinkMacSystemFont, 'Hiragino Kaku Gothic ProN'
 // $warning: #ffa32b !default;
 // $warning: #ffa32b !default;
 // $primary: $growi-blue !default;
 // $primary: $growi-blue !default;
 // $info: #009fbb !default;
 // $info: #009fbb !default;
-$muted: #98a6ad !default;
+// $muted: #98a6ad !default;
 // $dark: #3e4d6c !default;
 // $dark: #3e4d6c !default;
-$inverse: #3e4d6c !default;
+// $inverse: #3e4d6c !default;
 // $light: #e4e7ea !default;
 // $light: #e4e7ea !default;
-$extralight: #f7fafc !default;
+// $extralight: #f7fafc !default;
 
 
 /*Normal Color*/
 /*Normal Color*/
 // $white: #ffffff !default;
 // $white: #ffffff !default;
@@ -29,16 +29,16 @@ $extralight: #f7fafc !default;
 // $purple: #7b00ce !default;
 // $purple: #7b00ce !default;
 // $blue: #0d00c5 !default;
 // $blue: #0d00c5 !default;
 // $yellow: #cccf0e !default;
 // $yellow: #cccf0e !default;
-$border: #f0f0f0 !default;
+// $border: #f0f0f0 !default;
 // $megna: #00b5c2 !default;
 // $megna: #00b5c2 !default;
 
 
 /*Theme Colors*/
 /*Theme Colors*/
 // $topbar: #3c4451 !default;
 // $topbar: #3c4451 !default;
 // $sidebar: #4f5467 !default;
 // $sidebar: #4f5467 !default;
 // $bodycolor: #fff !default;
 // $bodycolor: #fff !default;
-$headingtext: #2b2b2b !default;
-$bodytext: #686868 !default;
-$linktext: $inverse !default;
+// $headingtext: #2b2b2b !default;
+// $bodytext: #686868 !default;
+// $linktext: $inverse !default;
 // $linktext-hover: lighten($inverse, 20%) !default;
 // $linktext-hover: lighten($inverse, 20%) !default;
 // $sidebar-text: #54667a !default;
 // $sidebar-text: #54667a !default;
 // $themecolor: #ff6849 !default;
 // $themecolor: #ff6849 !default;
@@ -50,12 +50,12 @@ $linktext: $inverse !default;
 // $dark-text: #848a96 !default;
 // $dark-text: #848a96 !default;
 // $navbar-border: #ccc !default;
 // $navbar-border: #ccc !default;
 // $active-navbar-border: lighten($navbar-border, 10%) !default;
 // $active-navbar-border: lighten($navbar-border, 10%) !default;
-$btn-default-bgcolor: darken(#fff, 10%) !default;
+// $btn-default-bgcolor: darken(#fff, 10%) !default;
 // $color-inline-code: #c7254e !default;
 // $color-inline-code: #c7254e !default;
 // $bgcolor-inline-code: #f9f2f4 !default;
 // $bgcolor-inline-code: #f9f2f4 !default;
 
 
 /*Border radius*/
 /*Border radius*/
-$radius: 0 !default;
+// $radius: 0 !default;
 
 
 /*Preloader*/
 /*Preloader*/
 /*
 /*

+ 0 - 12
src/client/styles/scss/_handsontable.scss

@@ -23,18 +23,6 @@
 .modal.in .modal-dialog.handsontable-modal {
 .modal.in .modal-dialog.handsontable-modal {
   transform: none;
   transform: none;
 
 
-  .modal-navbar {
-    border-bottom: $border 1px solid;
-  }
-
-  .data-import-form {
-    color: $headingtext;
-
-    .btn + .btn {
-      margin-left: 5px;
-    }
-  }
-
   .data-import-button {
   .data-import-button {
     position: relative;
     position: relative;
     padding-right: 35px;
     padding-right: 35px;

+ 0 - 5
src/client/styles/scss/_layout_kibela.scss

@@ -113,11 +113,6 @@ body.kibela {
     }
     }
   }
   }
 
 
-  /* button */
-  .btn {
-    // border-radius: $radius;
-  }
-
   /* edit */
   /* edit */
   .CodeMirror {
   .CodeMirror {
     border-radius: 0.35em;
     border-radius: 0.35em;

+ 3 - 2
src/client/styles/scss/_login.scss

@@ -1,10 +1,11 @@
 .nologin {
 .nologin {
   $gray-800-for-login: darken(white, 30%);
   $gray-800-for-login: darken(white, 30%);
+  $color-gradient: #3e4d6c;
 
 
   // background color
   // background color
-  background: linear-gradient(45deg, darken($inverse, 30%) 0%, hsla(340, 100%, 55%, 0) 70%),
+  background: linear-gradient(45deg, darken($color-gradient, 30%) 0%, hsla(340, 100%, 55%, 0) 70%),
     linear-gradient(135deg, $growi-green 10%, hsla(225, 95%, 50%, 0) 70%), linear-gradient(225deg, $growi-blue 10%, hsla(140, 90%, 50%, 0) 80%),
     linear-gradient(135deg, $growi-green 10%, hsla(225, 95%, 50%, 0) 70%), linear-gradient(225deg, $growi-blue 10%, hsla(140, 90%, 50%, 0) 80%),
-    linear-gradient(315deg, darken($inverse, 25%) 100%, hsla(35, 95%, 55%, 0) 70%);
+    linear-gradient(315deg, darken($color-gradient, 25%) 100%, hsla(35, 95%, 55%, 0) 70%);
 
 
   #page-wrapper {
   #page-wrapper {
     background: none;
     background: none;

+ 28 - 20
src/client/styles/scss/_on-edit.scss

@@ -24,6 +24,11 @@ body.on-edit {
     }
     }
   }
   }
 
 
+  // show
+  .d-edit-block {
+    display: block !important;
+  }
+
   // hide unnecessary elements
   // hide unnecessary elements
   header,
   header,
   footer,
   footer,
@@ -63,11 +68,6 @@ body.on-edit {
     }
     }
   }
   }
 
 
-  // show revision path
-  .grw-revision-path-for-edit {
-    display: block !important;
-  }
-
   /*****************
   /*****************
    * Expand Editor
    * Expand Editor
    *****************/
    *****************/
@@ -93,26 +93,23 @@ body.on-edit {
       padding: 0; //    for crowi layout
       padding: 0; //    for crowi layout
       pointer-events: initial; // enable pointer-events
       pointer-events: initial; // enable pointer-events
     }
     }
+  }
 
 
-    h1#revision-path {
-      @include variable-font-size(20px);
+  .grw-page-path-nav-for-edit {
+    .grw-page-path-link {
+      font-size: 20px;
       line-height: 1em;
       line-height: 1em;
-
-      // nowrap even if the path is too long
-      .d-flex {
-        flex-wrap: nowrap;
-      }
-
-      .path-segment {
-        white-space: nowrap;
-      }
     }
     }
-
-    .tag-labels.new-page {
-      display: block;
+    .separator {
+      margin-right: 0.1em;
+      margin-left: 0.1em;
     }
     }
   }
   }
 
 
+  .tag-labels {
+    line-height: 1em;
+  }
+
   .page-editor-footer {
   .page-editor-footer {
     width: 100%;
     width: 100%;
     min-height: 40px;
     min-height: 40px;
@@ -136,6 +133,18 @@ body.on-edit {
     }
     }
   }
   }
 
 
+  /*********************
+   * Navigation styles
+   */
+  .nav:hover {
+    .btn-copy,
+    .btn-edit,
+    .btn-edit-tags {
+      // change button opacity
+      opacity: unset;
+    }
+  }
+
   &.builtin-editor {
   &.builtin-editor {
     /*****************
     /*****************
     * Editor styles
     * Editor styles
@@ -239,7 +248,6 @@ body.on-edit {
 
 
     .hackmd-status-label {
     .hackmd-status-label {
       font-size: 3em;
       font-size: 3em;
-      color: $muted;
     }
     }
 
 
     .hackmd-resume-button-container,
     .hackmd-resume-button-container,

+ 0 - 51
src/client/styles/scss/_override-bootstrap.scss

@@ -97,57 +97,6 @@
     }
     }
   }
   }
 
 
-  // agile-admin style
-  .dropdown-menu {
-    padding-bottom: 8px;
-    margin-top: 0px;
-    border: 1px solid $border;
-    border-radius: $radius;
-    box-shadow: 0 3px 12px rgba(0, 0, 0, 0.05) !important;
-  }
-
-  .dropdown-menu > li > a {
-    width: 100%;
-    padding: 9px 20px;
-  }
-
-  .dropdown-menu > li > a:focus,
-  .dropdown-menu > li > a:hover {
-    background: $extralight;
-  }
-
-  // btn-light (substitute for btn-default of bootstrap3)  (agile-admin style)
-  .btn-light,
-  .btn-light.disabled {
-    color: $bodytext;
-    $this-color: $btn-default-bgcolor;
-    background: $this-color;
-    border: 1px solid $this-color;
-
-    &:hover,
-    &:focus,
-    &.focus {
-      color: $bodytext;
-      background: $this-color;
-      border: 1px solid $this-color;
-      opacity: 0.8;
-    }
-
-    &:active &.active {
-      box-shadow: none;
-    }
-  }
-
-  .btn-light.btn-outline {
-    background-color: transparent;
-
-    &:hover,
-    &:focus,
-    &.focus {
-      background: $btn-default-bgcolor;
-    }
-  }
-
   //Modals
   //Modals
   .modal-content {
   .modal-content {
     box-shadow: 0 0.3rem 1rem rgba(0, 0, 0, 0.1);
     box-shadow: 0 0.3rem 1rem rgba(0, 0, 0, 0.1);

+ 1 - 14
src/client/styles/scss/_page.scss

@@ -24,10 +24,6 @@
       }
       }
     }
     }
   }
   }
-
-  .tag-labels.new-page {
-    display: none;
-  }
 }
 }
 
 
 .main .content-main .revision-history {
 .main .content-main .revision-history {
@@ -35,7 +31,7 @@
     .revision-history-outer {
     .revision-history-outer {
       // add border-top except of first element
       // add border-top except of first element
       &:not(:first-of-type) {
       &:not(:first-of-type) {
-        border-top: 1px solid $border;
+        @extend .border-top;
       }
       }
 
 
       .revision-history-main {
       .revision-history-main {
@@ -136,15 +132,6 @@
     z-index: 14;
     z-index: 14;
     font-size: 12px;
     font-size: 12px;
     line-height: 1;
     line-height: 1;
-    color: $linktext;
-    background-color: transparent;
-    border: 1px solid $linktext;
-    opacity: 1;
-
-    &:hover {
-      color: $white;
-      background-color: $linktext;
-    }
   }
   }
 }
 }
 
 

+ 0 - 6
src/client/styles/scss/_sidebar.scss

@@ -11,12 +11,6 @@
     // Adjust to be on top of the growi subnavigation
     // Adjust to be on top of the growi subnavigation
     z-index: $zindex-sticky + 5;
     z-index: $zindex-sticky + 5;
   }
   }
-  div[class$='-Outer'] {
-    div[class$='-Shadow'] {
-      background: unset;
-      border-right: 1px solid $border;
-    }
-  }
 
 
   .grw-global-item-container {
   .grw-global-item-container {
     i {
     i {

+ 5 - 5
src/client/styles/scss/_staff_credit.scss

@@ -2,8 +2,11 @@
 .staff-credit {
 .staff-credit {
   // attached !important for updating from .modal-dialog class style
   // attached !important for updating from .modal-dialog class style
   width: 80vw !important;
   width: 80vw !important;
-  height: 80vh !important;
   max-width: initial !important;
   max-width: initial !important;
+  height: 80vh !important;
+
+  font-family: 'Press Start 2P', $font-family-for-staff-credit;
+  color: white;
   // see https://css-tricks.com/old-timey-terminal-styling/
   // see https://css-tricks.com/old-timey-terminal-styling/
   @mixin old-timey-terminal-styling() {
   @mixin old-timey-terminal-styling() {
     text-shadow: 0 0 10px #c8c8c8;
     text-shadow: 0 0 10px #c8c8c8;
@@ -11,16 +14,13 @@
     background-image: radial-gradient(rgba(50, 100, 100, 0.75), black 120%);
     background-image: radial-gradient(rgba(50, 100, 100, 0.75), black 120%);
   }
   }
 
 
-  font-family: 'Press Start 2P', $basefont1;
-  color: white;
-
   h1,
   h1,
   h2,
   h2,
   h3,
   h3,
   h4,
   h4,
   h5,
   h5,
   h6 {
   h6 {
-    font-family: 'Press Start 2P', $basefont1;
+    font-family: 'Press Start 2P', $font-family-for-staff-credit;
     color: white;
     color: white;
   }
   }
 
 

+ 5 - 3
src/client/styles/scss/_subnav.scss

@@ -77,9 +77,11 @@ header.grw-header {
     line-height: 1.1em;
     line-height: 1.1em;
   }
   }
 
 
-  .separator {
-    margin-right: 0.2em;
-    margin-left: 0.2em;
+  .grw-page-path-nav {
+    .separator {
+      margin-right: 0.2em;
+      margin-left: 0.2em;
+    }
   }
   }
 
 
   ul.authors {
   ul.authors {

+ 1 - 0
src/client/styles/scss/_variables.scss

@@ -2,6 +2,7 @@
 $growi-green: #74bc46;
 $growi-green: #74bc46;
 $growi-blue: #175fa5;
 $growi-blue: #175fa5;
 
 
+$font-family-for-staff-credit: Lato, -apple-system, BlinkMacSystemFont, 'Hiragino Kaku Gothic ProN', Meiryo, sans-serif !default;
 $font-family-monospace-not-strictly: Monaco, Menlo, Consolas, 'Courier New', MeiryoKe_Gothic, monospace;
 $font-family-monospace-not-strictly: Monaco, Menlo, Consolas, 'Courier New', MeiryoKe_Gothic, monospace;
 
 
 //== Layout
 //== Layout

+ 0 - 14
src/client/styles/scss/theme/_apply-colors-dark.scss

@@ -1,17 +1,3 @@
-/*
- * Button
- */
-.btn-light {
-  &:hover,
-  &:focus,
-  &.active,
-  &.active:hover,
-  &.active:focus {
-    color: $light;
-    background-color: lighten($bgcolor-global, 5%);
-  }
-}
-
 /*
 /*
   * Form
   * Form
   */
   */

+ 7 - 0
src/client/styles/scss/theme/_apply-colors.scss

@@ -7,6 +7,7 @@ $body-bg: $bgcolor-global;
 $body-color: $color-global;
 $body-color: $color-global;
 $link-color: $color-link;
 $link-color: $color-link;
 $link-hover-color: $color-link-hover;
 $link-hover-color: $color-link-hover;
+$input-focus-color: $color-global;
 
 
 @import '~bootstrap/scss/functions';
 @import '~bootstrap/scss/functions';
 @import '~bootstrap/scss/variables';
 @import '~bootstrap/scss/variables';
@@ -127,6 +128,12 @@ $link-hover-color: $color-link-hover;
       background-color: $bgcolor-sidebar-context;
       background-color: $bgcolor-sidebar-context;
     }
     }
   }
   }
+  div[class$='-Outer'] {
+    div[class$='-Shadow'] {
+      background: unset;
+      border-right: 1px solid $gray-300;
+    }
+  }
 }
 }
 
 
 /*
 /*

+ 99 - 6
src/client/styles/scss/theme/future.scss

@@ -1,8 +1,101 @@
-// import colors
-@import '../../agile-admin/inverse/colors/future';
+@import '../variables';
+@import '../override-bootstrap-variables';
 
 
-// apply agile-admin theme
-@import '../../agile-admin/inverse/style';
+$themecolor: #16282d;
+$themelight: rgba(11, 79, 104, 0.616);
+$accentcolor: #66eddf;
 
 
-// override
-@import 'override-agileadmin';
+$primary: $themelight;
+$dark: darken($themecolor, 5%);
+
+html[light],
+html[dark] {
+  // Background colors
+  $bgcolor-global: $themecolor;
+  $bgcolor-navbar: #011414;
+  $bgcolor-inline-code: darken($themecolor, 5%);
+  $bgcolor-card: darken($themecolor, 5%);
+
+  // Font colors
+  $color-global: lighten($themecolor, 35%);
+  $color-reversal: #eeeeee;
+  $color-header: #d9a364;
+  $color-link: lighten($primary, 20%);
+  $color-link-hover: lighten($color-link, 20%);
+  $color-link-wiki: darken($themecolor, 5%);
+  $color-link-wiki-hover: darken($color-link-wiki, 5%);
+  $color-link-nabvar: $color-reversal;
+  $color-inline-code: #c7254e;
+  $color-search: #050a0b;
+
+  // List Group colors
+  $color-list: $color-global;
+  $bgcolor-list: transparent;
+  $color-list-active: $color-reversal;
+  $bgcolor-list-active: $primary;
+  $color-list-hover: $color-reversal;
+
+  // Logo colors
+  $bgcolor-logo: darken($themecolor, 10%);
+  $fillcolor-logo-mark: lighten($accentcolor, 15%);
+
+  // Icon colors
+  $color-editor-icons: $color-global;
+
+  // Border colors
+  $border-color-theme: #407483;
+
+  // Dropdown colors
+  $bgcolor-dropdown-link-active: $primary;
+  $color-dropdown-link-active: $color-reversal;
+  $color-dropdown-link-hover: $color-global;
+
+  // alert
+  $color-alert: $color-reversal;
+
+  // badge
+  $color-badge: $color-reversal;
+
+  // Sidebar
+  $bgcolor-sidebar: $bgcolor-navbar;
+  $color-sidebar-context: $color-reversal;
+  $bgcolor-sidebar-context: lighten($bgcolor-navbar, 10%);
+
+  @import 'apply-colors';
+  @import 'apply-colors-dark';
+
+  // headers
+  @for $i from 1 through 6 {
+    h#{$i} {
+      color: $color-header;
+    }
+  }
+
+  // Navs {
+  .nav-tabs {
+    border-bottom: $border-color-theme 1px solid;
+    .nav-link {
+      &:hover {
+        border-color: darken($border-color-theme, 10%);
+        border-bottom: none;
+      }
+      &.active {
+        color: $color-link;
+        background-color: transparent;
+        border-color: $border-color-theme;
+      }
+    }
+  }
+
+  // Search Top
+  .search-top {
+    .input-group-prepend .dropdown-toggle {
+      color: #5193a5;
+      background-color: $color-search;
+      border-color: $color-search;
+      &:hover {
+        background-color: darken($color-search, 10%);
+      }
+    }
+  }
+}

+ 189 - 6
src/client/styles/scss/theme/mono-blue.scss

@@ -1,8 +1,191 @@
-// import colors
-@import '../../agile-admin/inverse/colors/mono-blue';
+@import '../variables';
+@import '../override-bootstrap-variables';
 
 
-// apply agile-admin theme
-@import '../../agile-admin/inverse/style';
 
 
-// override
-@import 'override-agileadmin';
+
+html[light] {
+  // Theme colors
+  $themecolor: #00587a;
+  $themelight: #f7fbfd;
+  $accentcolor: #16617d;
+  $subthemecolor: #186718;
+
+  $primary: $themecolor;
+
+  // Background colors
+  $bgcolor-global: $themelight;
+  $bgcolor-navbar: $themecolor;
+  $bgcolor-inline-code: lighten($subthemecolor, 70%);
+  $bgcolor-card: darken($themelight, 5%);
+
+  // Font colors
+  $color-global: $themecolor;
+  $color-reversal: #eee;
+  $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: $subthemecolor;
+  $color-search: #c0d6df;
+
+
+  // List Group colors
+  $color-list: $color-global;
+  $bgcolor-list: transparent;
+  $color-list-active: $color-reversal;
+  $bgcolor-list-active: $primary;
+  $color-list-hover: $color-reversal;
+
+  // Logo colors
+  $bgcolor-logo: $themecolor;
+  $fillcolor-logo-mark: lighten(desaturate($bgcolor-navbar, 30%), 20%);
+
+  // Icon colors
+  $color-editor-icons: $color-global;
+
+  // Border colors
+  $border-color-theme: #ccc;
+
+  // Dropdown colors
+  $bgcolor-dropdown-link-active: $primary;
+  $color-dropdown-link-active: $color-reversal;
+
+  // alert
+  $color-alert: $color-reversal;
+
+  // badge
+  $color-badge: $color-reversal;
+
+  // Sidebar
+  $bgcolor-sidebar: $bgcolor-navbar;
+  $color-sidebar-context: $color-reversal;
+  $bgcolor-sidebar-context: lighten($bgcolor-sidebar, 10%);
+
+
+  @import 'apply-colors';
+  @import '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;
+      }
+    }
+  }
+
+  // Search Top
+  .search-top {
+    .input-group-prepend .dropdown-toggle {
+      color: $themecolor;
+      background-color: $color-search;
+      &:hover {
+        background-color: darken($color-search, 10%);
+      }
+    }
+  }
+}
+
+html[dark] {
+  // Theme colors
+  $themecolor: #0090c8;
+  $themedark: #061f2f;
+  $accentcolor: #16617d;
+  $subthemecolor: #c1f1f0;
+
+  $primary: $themecolor;
+  $dark: #031018;
+
+  // Background colors
+  $bgcolor-global: $themedark;
+  $bgcolor-navbar: #27343b;
+  $bgcolor-inline-code: #0a121b;
+  $bgcolor-card: darken($themedark, 5%);
+
+  // Font colors
+  $color-global: #d3d4d4;
+  $color-reversal: #eee;
+  $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-search: #000102;
+
+
+  // List Group colors
+  $color-list: $color-global;
+  $bgcolor-list: transparent;
+  $color-list-active: $color-reversal;
+  $bgcolor-list-active: $primary;
+  $color-list-hover: $color-reversal;
+
+  // Logo colors
+  $bgcolor-logo: #13191c;
+  $fillcolor-logo-mark: lighten(desaturate($bgcolor-navbar, 10%), 15%);
+  // $fillcolor-logo-mark: #4e5a60;
+
+  // Icon colors
+  $color-editor-icons: $color-global;
+
+  // Border colors
+  $border-color-theme: #146aa0;
+
+  // Dropdown colors
+  $bgcolor-dropdown-link-active: $primary;
+  $color-dropdown-link-active: $color-reversal;
+
+  // alert
+  $color-alert: $color-reversal;
+
+  // badge
+  $color-badge: $color-reversal;
+
+  // Sidebar
+  $bgcolor-sidebar: $bgcolor-navbar;
+  $color-sidebar-context: $color-reversal;
+  $bgcolor-sidebar-context: lighten($bgcolor-sidebar, 10%);
+
+
+  @import 'apply-colors';
+  @import '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;
+      }
+    }
+  }
+
+  // Search Top
+  .search-top {
+    .input-group-prepend .dropdown-toggle {
+      background-color: $color-search;
+      border-color: $color-search;
+      &:hover {
+        background-color: darken($color-search, 10%);
+      }
+    }
+  }
+
+  // Table
+  .table {
+    color: white;
+  }
+}

+ 174 - 8
src/client/styles/scss/theme/nature.scss

@@ -1,8 +1,174 @@
-// import colors
-@import '../../agile-admin/inverse/colors/nature';
-
-// apply agile-admin theme
-@import '../../agile-admin/inverse/style';
-
-// override
-@import 'override-agileadmin';
+@import '../variables';
+@import '../override-bootstrap-variables';
+
+// == Define Bootstrap theme colors
+//
+
+// colors for overriding bootstrap $theme-colors
+// $secondary: #;
+// $info: #;
+// $success: #;
+// $warning: #;
+// $danger: #;
+// $light: #;
+// $dark: #;
+
+.growi:not(.login-page) {
+  // add background-image
+  #page-wrapper,
+  .page-editor-preview-container {
+    background-attachment: fixed;
+    background-position: center center;
+    background-size: cover;
+  }
+}
+
+.growi.login-page {
+  #page-wrapper {
+    background-attachment: fixed;
+    background-position: center center;
+    background-size: cover;
+  }
+}
+
+$themecolor: #118050;
+$themelight: #fefffd;
+
+//== Light Mode
+//
+html[light],
+html[dark] {
+  $bgcolor-theme: #460039;
+
+  $bgcolor-navbar: #118050;
+  $bgcolor-global: #fefffd;
+
+  $color-header: #46694e;
+  $color-global: #333333;
+  $linktext: lighten($bgcolor-theme, 5%);
+  $linktext-hover: lighten($linktext, 12%);
+  $sidebar-text: #5c7253;
+
+  $primary: $bgcolor-theme;
+
+  $fillcolor-logo-mark: lighten(desaturate($bgcolor-navbar, 30%), 20%);
+  $color-link-wiki: lighten($bgcolor-theme, 20%);
+  $color-link-wiki-hover: lighten($color-link-wiki, 20%);
+
+  // Background colors
+  $bgcolor-global: $themelight;
+  $bgcolor-navbar: $themecolor;
+  $bgcolor-inline-code: #f9f2f4;
+  $bgcolor-card: #f5f5f5;
+
+  // Font colors
+  $color-global: $bgcolor-theme;
+  $color-reversal: #eeeeee;
+  $color-link: lighten($color-global, 20%);
+  $color-link-hover: lighten($color-link, 20%);
+  $color-link-wiki: lighten($primary, 20%);
+  $color-link-wiki-hover: lighten($color-link-wiki, 20%);
+  $color-link-nabvar: $color-reversal;
+  $color-inline-code: #c7254e;
+
+  // List Group colors
+  $color-list: $color-global;
+  $bgcolor-list: $bgcolor-global;
+  $color-list-active: $color-reversal;
+  $bgcolor-list-active: $primary;
+  $color-list-hover: $color-reversal;
+
+  // Logo colors
+  $bgcolor-logo: $bgcolor-navbar;
+  $fillcolor-logo-mark: lighten(desaturate($bgcolor-inline-code, 10%), 15%);
+
+  // Icon colors
+  $color-editor-icons: $color-global;
+
+  // Border colors
+  $border-color-theme: #ccc;
+
+  // Dropdown colors
+  $bgcolor-dropdown-link-active: $growi-blue;
+  $color-dropdown-link-active: $color-reversal;
+  $color-dropdown-link-hover: $color-global;
+
+  // alert
+  $color-alert: $color-reversal;
+
+  // badge
+  $color-badge: $color-reversal;
+
+  // Sidebar
+  $bgcolor-sidebar: $bgcolor-navbar;
+  $color-sidebar-context: $color-reversal;
+  $bgcolor-sidebar-context: lighten($bgcolor-navbar, 10%);
+
+  @import 'apply-colors';
+  @import 'apply-colors-light';
+
+  .table {
+    background-color: $themelight;
+  }
+}
+
+//== Dark Mode
+//
+// html[dark] {
+//   $primary: #d65a31;
+
+//   $basecolor: #222831;
+
+//   // Background colors
+//   $bgcolor-global: $basecolor;
+//   $bgcolor-navbar: #151515;
+//   $bgcolor-inline-code: darken($basecolor, 5%);
+//   $bgcolor-card: darken($basecolor, 5%);
+
+//   // Font colors
+//   $color-global: #eeeeee;
+//   $color-reversal: #333333;
+//   // $color-header: desaturate($primary, 20%);
+//   $color-link: $primary;
+//   $color-link-hover: lighten($color-link, 10%);
+//   $color-link-wiki: lighten($basecolor, 50%);
+//   $color-link-wiki-hover: darken($color-link-wiki, 5%);
+//   $color-link-nabvar: $color-global;
+//   $color-inline-code: #c7254e;
+
+//   // List Group colors
+//   $color-list: $color-global;
+//   $bgcolor-list: $bgcolor-global;
+//   $color-list-active: $color-reversal;
+//   $bgcolor-list-active: $primary;
+//   $color-list-hover: $color-reversal;
+
+//   // Logo colors
+//   $bgcolor-logo: $bgcolor-navbar;
+//   $fillcolor-logo-mark: #444;
+
+//   // Icon colors
+//   $color-editor-icons: darken($accentcolor, 15%);
+
+//   // Border colors
+//   $border-color-theme: black; // former: `$navbar-border: #ccc;`
+
+//   // Dropdown colors
+//   $bgcolor-dropdown-link-active: $primary;
+//   $color-dropdown-link-active: $color-global;
+//   $color-dropdown-link-hover: $color-reversal;
+
+//   // alert
+//   $color-alert: $color-global;
+
+//   // badge
+//   $color-badge: $color-global;
+
+//   // Sidebar
+//   $bgcolor-sidebar: $bgcolor-navbar;
+//   $color-sidebar-context: $color-global;
+//   $bgcolor-sidebar-context: lighten($bgcolor-navbar, 5%);
+
+//   @import 'apply-colors';
+//   @import 'apply-colors-dark';
+// }

+ 8 - 3
src/client/styles/scss/theme/spring.scss

@@ -35,6 +35,8 @@
 
 
 $themecolor: #ffb8c6;
 $themecolor: #ffb8c6;
 $themelight: #fff0f5;
 $themelight: #fff0f5;
+$subthemecolor: #67a856;
+$third-main-color: antiquewhite;
 $accentcolor: #e08dbc;
 $accentcolor: #e08dbc;
 
 
 .grw-navbar {
 .grw-navbar {
@@ -48,7 +50,7 @@ html[dark] {
   $primary: $themecolor;
   $primary: $themecolor;
 
 
   // Background colors
   // Background colors
-  $bgcolor-global: $themelight;
+  $bgcolor-global: white;
   $bgcolor-navbar: $themecolor;
   $bgcolor-navbar: $themecolor;
   $bgcolor-inline-code: #f9f2f4;
   $bgcolor-inline-code: #f9f2f4;
   $bgcolor-card: #f5f5f5;
   $bgcolor-card: #f5f5f5;
@@ -59,7 +61,7 @@ html[dark] {
   // $color-header: #2b2b2b;
   // $color-header: #2b2b2b;
   $color-link: lighten($color-global, 20%);
   $color-link: lighten($color-global, 20%);
   $color-link-hover: lighten($color-link, 20%);
   $color-link-hover: lighten($color-link, 20%);
-  $color-link-wiki: lighten($primary, 20%);
+  $color-link-wiki: $subthemecolor;
   $color-link-wiki-hover: lighten($color-link-wiki, 20%);
   $color-link-wiki-hover: lighten($color-link-wiki, 20%);
   $color-link-nabvar: $color-reversal;
   $color-link-nabvar: $color-reversal;
   $color-inline-code: #c7254e;
   $color-inline-code: #c7254e;
@@ -101,7 +103,10 @@ html[dark] {
   @import 'apply-colors-light';
   @import 'apply-colors-light';
 
 
   .table {
   .table {
-    background-color: $themelight;
+    background-color: $bgcolor-global;
+  }
+  .card-timeline > .card-header {
+    background-color: $third-main-color;
   }
   }
 }
 }
 
 

+ 167 - 6
src/client/styles/scss/theme/wood.scss

@@ -1,8 +1,169 @@
-// import colors
-@import '../../agile-admin/inverse/colors/wood';
+@import '../variables';
+@import '../override-bootstrap-variables';
 
 
-// apply agile-admin theme
-@import '../../agile-admin/inverse/style';
+// == Define Bootstrap theme colors
+//
+// colors for overriding bootstrap $theme-colors
+// $secondary: #;
+// $success: #;
+// $warning: #;
+// $danger: #;
+// $light: #;
+// $dark: #;
 
 
-// override
-@import 'override-agileadmin';
+.growi:not(.login-page) {
+
+  // add background-image
+  #page-wrapper,
+  .page-editor-preview-container {
+    background-image: url('/images/themes/wood/wood.jpg');
+    background-attachment: fixed;
+    background-position: center center;
+    background-size: cover;
+  }
+}
+
+.growi.login-page {
+  #page-wrapper {
+    background-image: url('/images/themes/wood/wood.jpg');
+    background-attachment: fixed;
+    background-position: center center;
+    background-size: cover;
+  }
+}
+
+$themecolor: #aaa45f;
+$themelight: #f5f3ee;
+$accentcolor: #577254;
+
+//== Light Mode
+//
+html[light],
+html[dark] {
+  $primary: $themecolor;
+
+  // Background colors
+  $bgcolor-global: $themelight;
+  $bgcolor-navbar: $themecolor;
+  $bgcolor-inline-code: darken($themecolor, 20%);
+  $bgcolor-card: #f5f5f5;
+
+  // Font colors
+  $color-global: black;
+  $color-reversal: #fffffc;
+  // $color-header: #2b2b2b;
+  $color-link: lighten($color-global, 20%);
+  $color-link-hover: lighten($color-link, 20%);
+  $color-link-wiki: lighten($themecolor, 5%);
+  $color-link-wiki-hover: lighten($color-link-wiki, 15%);
+  $color-link-nabvar: $color-reversal;
+  $color-inline-code: lighten($accentcolor, 70%);
+
+  // List Group colors
+  $color-list: $color-global;
+  $bgcolor-list: $bgcolor-global;
+  $color-list-active: $color-reversal;
+  $bgcolor-list-active: $primary;
+  $color-list-hover: $color-reversal;
+
+  // Logo colors
+  $bgcolor-logo: darken($themecolor, 10%);
+  $fillcolor-logo-mark: lighten(desaturate($themecolor, 50%), 50%); // Icon colors
+  $color-editor-icons: $color-global;
+
+  // Border colors
+  $border-color-theme: #ccc; // former: `$navbar-border: #ccc;`
+
+  // Dropdown colors
+  $bgcolor-dropdown-link-active: $growi-blue;
+  $color-dropdown-link-active: $color-reversal;
+  $color-dropdown-link-hover: $color-global;
+
+  // alert
+  $color-alert: $color-reversal;
+
+  // badge
+  $color-badge: $color-reversal;
+
+  // Sidebar
+  $bgcolor-sidebar: $bgcolor-navbar;
+  $color-sidebar-context: $color-reversal;
+  $bgcolor-sidebar-context: lighten($bgcolor-navbar, 10%);
+
+  // portal
+  $info: lighten($themecolor, 10%);
+
+  @import 'apply-colors';
+  @import 'apply-colors-light';
+
+  .table {
+    background-color: $themelight;
+  }
+
+  .grw-navbar {
+    background-image: url('/images/themes/wood/wood-navbar.jpg');
+    border-bottom: $accentcolor 4px solid;
+
+  }
+}
+
+//== Dark Mode
+//
+// html[dark] {
+//   $primary: #d65a31;
+
+//   $basecolor: #222831;
+
+//   // Background colors
+//   $bgcolor-global: $basecolor;
+//   $bgcolor-navbar: #151515;
+//   $bgcolor-inline-code: darken($basecolor, 5%);
+//   $bgcolor-card: darken($basecolor, 5%);
+
+//   // Font colors
+//   $color-global: #eeeeee;
+//   $color-reversal: #333333;
+//   // $color-header: desaturate($primary, 20%);
+//   $color-link: $primary;
+//   $color-link-hover: lighten($color-link, 10%);
+//   $color-link-wiki: lighten($basecolor, 50%);
+//   $color-link-wiki-hover: darken($color-link-wiki, 5%);
+//   $color-link-nabvar: $color-global;
+//   $color-inline-code: #c7254e;
+
+//   // List Group colors
+//   $color-list: $color-global;
+//   $bgcolor-list: $bgcolor-global;
+//   $color-list-active: $color-reversal;
+//   $bgcolor-list-active: $primary;
+//   $color-list-hover: $color-reversal;
+
+//   // Logo colors
+//   $bgcolor-logo: $bgcolor-navbar;
+//   $fillcolor-logo-mark: #444;
+
+//   // Icon colors
+//   $color-editor-icons: darken($accentcolor, 15%);
+
+//   // Border colors
+//   $border-color-theme: black; // former: `$navbar-border: #ccc;`
+
+//   // Dropdown colors
+//   $bgcolor-dropdown-link-active: $primary;
+//   $color-dropdown-link-active: $color-global;
+//   $color-dropdown-link-hover: $color-reversal;
+
+//   // alert
+//   $color-alert: $color-global;
+
+//   // badge
+//   $color-badge: $color-global;
+
+//   // Sidebar
+//   $bgcolor-sidebar: $bgcolor-navbar;
+//   $color-sidebar-context: $color-global;
+//   $bgcolor-sidebar-context: lighten($bgcolor-navbar, 5%);
+
+//   @import 'apply-colors';
+//   @import 'apply-colors-dark';
+// }

+ 10 - 6
src/lib/components/PagePathHierarchicalLink.jsx

@@ -7,7 +7,7 @@ import LinkedPagePath from '../models/linked-page-path';
 
 
 
 
 const PagePathHierarchicalLink = (props) => {
 const PagePathHierarchicalLink = (props) => {
-  const { linkedPagePath, basePath } = props;
+  const { linkedPagePath, basePath, isInTrash } = props;
 
 
   // render root element
   // render root element
   if (linkedPagePath.isRoot) {
   if (linkedPagePath.isRoot) {
@@ -15,7 +15,7 @@ const PagePathHierarchicalLink = (props) => {
       return null;
       return null;
     }
     }
 
 
-    return props.isPageInTrash
+    return isInTrash
       ? (
       ? (
         <>
         <>
           <span className="path-segment">
           <span className="path-segment">
@@ -37,15 +37,20 @@ const PagePathHierarchicalLink = (props) => {
   }
   }
 
 
   const isParentExists = linkedPagePath.parent != null;
   const isParentExists = linkedPagePath.parent != null;
-  const isParentRoot = isParentExists && linkedPagePath.parent.isRoot;
+  const isParentRoot = linkedPagePath.parent?.isRoot;
   const isSeparatorRequired = isParentExists && !isParentRoot;
   const isSeparatorRequired = isParentExists && !isParentRoot;
+  const isParentInTrash = isInTrash || linkedPagePath.isInTrash;
 
 
   const href = encodeURI(urljoin(basePath || '/', linkedPagePath.href));
   const href = encodeURI(urljoin(basePath || '/', linkedPagePath.href));
 
 
   return (
   return (
     <>
     <>
       { isParentExists && (
       { isParentExists && (
-        <PagePathHierarchicalLink linkedPagePath={linkedPagePath.parent} basePath={basePath} />
+        <PagePathHierarchicalLink
+          linkedPagePath={linkedPagePath.parent}
+          basePath={basePath}
+          isInTrash={isParentInTrash}
+        />
       ) }
       ) }
       { isSeparatorRequired && (
       { isSeparatorRequired && (
         <span className="separator">/</span>
         <span className="separator">/</span>
@@ -59,8 +64,7 @@ const PagePathHierarchicalLink = (props) => {
 PagePathHierarchicalLink.propTypes = {
 PagePathHierarchicalLink.propTypes = {
   linkedPagePath: PropTypes.instanceOf(LinkedPagePath).isRequired,
   linkedPagePath: PropTypes.instanceOf(LinkedPagePath).isRequired,
   basePath: PropTypes.string,
   basePath: PropTypes.string,
-
-  isPageInTrash: PropTypes.bool, // TODO: omit
+  isInTrash: PropTypes.bool,
 };
 };
 
 
 export default PagePathHierarchicalLink;
 export default PagePathHierarchicalLink;

+ 2 - 0
src/lib/models/devided-page-path.js

@@ -10,6 +10,7 @@ export default class DevidedPagePath {
   constructor(path, skipNormalize = false, evalDatePath = false) {
   constructor(path, skipNormalize = false, evalDatePath = false) {
 
 
     this.isRoot = false;
     this.isRoot = false;
+    this.isFormerRoot = false;
     this.former = null;
     this.former = null;
     this.latter = null;
     this.latter = null;
 
 
@@ -35,6 +36,7 @@ export default class DevidedPagePath {
 
 
     const matchDefault = pagePath.match(PATTERN_DEFAULT);
     const matchDefault = pagePath.match(PATTERN_DEFAULT);
     if (matchDefault != null) {
     if (matchDefault != null) {
+      this.isFormerRoot = matchDefault[1] === '/';
       this.former = matchDefault[2];
       this.former = matchDefault[2];
       this.latter = matchDefault[3];
       this.latter = matchDefault[3];
     }
     }

+ 6 - 0
src/lib/models/linked-page-path.js

@@ -1,4 +1,5 @@
 import { pathUtils } from 'growi-commons';
 import { pathUtils } from 'growi-commons';
+import { isTrashPage } from '@commons/util/path-utils';
 
 
 import DevidedPagePath from './devided-page-path';
 import DevidedPagePath from './devided-page-path';
 
 
@@ -11,6 +12,7 @@ export default class LinkedPagePath {
 
 
     const pagePath = new DevidedPagePath(path, skipNormalize);
     const pagePath = new DevidedPagePath(path, skipNormalize);
 
 
+    this.path = path;
     this.pathName = pagePath.latter;
     this.pathName = pagePath.latter;
     this.isRoot = pagePath.isRoot;
     this.isRoot = pagePath.isRoot;
     this.parent = pagePath.isRoot
     this.parent = pagePath.isRoot
@@ -27,4 +29,8 @@ export default class LinkedPagePath {
     return pathUtils.normalizePath(`${this.parent.href}/${this.pathName}`);
     return pathUtils.normalizePath(`${this.parent.href}/${this.pathName}`);
   }
   }
 
 
+  get isInTrash() {
+    return isTrashPage(this.path);
+  }
+
 }
 }

+ 38 - 0
src/migrations/20200512005851-remove-behavior-type.js

@@ -0,0 +1,38 @@
+require('module-alias/register');
+const logger = require('@alias/logger')('growi:migrate:remove-behavior-type');
+
+const mongoose = require('mongoose');
+const config = require('@root/config/migrate');
+
+const { getModelSafely } = require('@commons/util/mongoose-utils');
+
+module.exports = {
+  async up(db, client) {
+    logger.info('Apply migration');
+    mongoose.connect(config.mongoUri, config.mongodb.options);
+
+    const Config = getModelSafely('Config') || require('@server/models/config')();
+
+    await Config.findOneAndDelete({ key: 'customize:behavior' }); // remove behavior
+
+    logger.info('Migration has successfully applied');
+  },
+
+  async down(db, client) {
+    // do not rollback
+    logger.info('Rollback migration');
+    mongoose.connect(config.mongoUri, config.mongodb.options);
+
+    const Config = getModelSafely('Config') || require('@server/models/config')();
+
+    const insertConfig = new Config({
+      ns: 'crowi',
+      key: 'customize:behavior',
+      value: JSON.stringify('growi'),
+    });
+
+    await insertConfig.save();
+
+    logger.info('Migration has been successfully rollbacked');
+  },
+};

+ 0 - 3
src/server/models/config.js

@@ -22,7 +22,6 @@ module.exports = function(crowi) {
     // overwrite
     // overwrite
     config['app:installed'] = true;
     config['app:installed'] = true;
     config['app:fileUpload'] = true;
     config['app:fileUpload'] = true;
-    config['customize:behavior'] = 'growi';
     config['customize:layout'] = 'growi';
     config['customize:layout'] = 'growi';
     config['customize:isSavedStatesOfTabChanges'] = false;
     config['customize:isSavedStatesOfTabChanges'] = false;
 
 
@@ -108,7 +107,6 @@ module.exports = function(crowi) {
       'customize:highlightJsStyle' : 'github',
       'customize:highlightJsStyle' : 'github',
       'customize:highlightJsStyleBorder' : false,
       'customize:highlightJsStyleBorder' : false,
       'customize:theme' : 'default',
       'customize:theme' : 'default',
-      'customize:behavior' : 'crowi',
       'customize:layout' : 'crowi',
       'customize:layout' : 'crowi',
       'customize:isEnabledTimeline' : true,
       'customize:isEnabledTimeline' : true,
       'customize:isSavedStatesOfTabChanges' : true,
       'customize:isSavedStatesOfTabChanges' : true,
@@ -190,7 +188,6 @@ module.exports = function(crowi) {
         file: crowi.fileUploadService.getFileUploadEnabled(),
         file: crowi.fileUploadService.getFileUploadEnabled(),
       },
       },
       registrationWhiteList: crowi.configManager.getConfig('crowi', 'security:registrationWhiteList'),
       registrationWhiteList: crowi.configManager.getConfig('crowi', 'security:registrationWhiteList'),
-      behaviorType: crowi.configManager.getConfig('crowi', 'customize:behavior'),
       layoutType: crowi.configManager.getConfig('crowi', 'customize:layout'),
       layoutType: crowi.configManager.getConfig('crowi', 'customize:layout'),
       themeType: crowi.configManager.getConfig('crowi', 'customize:theme'),
       themeType: crowi.configManager.getConfig('crowi', 'customize:theme'),
       isEnabledLinebreaks: crowi.configManager.getConfig('markdown', 'markdown:isEnabledLinebreaks'),
       isEnabledLinebreaks: crowi.configManager.getConfig('markdown', 'markdown:isEnabledLinebreaks'),

+ 0 - 1
src/server/routes/apiv3/customize-setting.js

@@ -152,7 +152,6 @@ module.exports = (crowi) => {
     const customizeParams = {
     const customizeParams = {
       layoutType: await crowi.configManager.getConfig('crowi', 'customize:layout'),
       layoutType: await crowi.configManager.getConfig('crowi', 'customize:layout'),
       themeType: await crowi.configManager.getConfig('crowi', 'customize:theme'),
       themeType: await crowi.configManager.getConfig('crowi', 'customize:theme'),
-      behaviorType: await crowi.configManager.getConfig('crowi', 'customize:behavior'),
       isEnabledTimeline: await crowi.configManager.getConfig('crowi', 'customize:isEnabledTimeline'),
       isEnabledTimeline: await crowi.configManager.getConfig('crowi', 'customize:isEnabledTimeline'),
       isSavedStatesOfTabChanges: await crowi.configManager.getConfig('crowi', 'customize:isSavedStatesOfTabChanges'),
       isSavedStatesOfTabChanges: await crowi.configManager.getConfig('crowi', 'customize:isSavedStatesOfTabChanges'),
       isEnabledAttachTitleHeader: await crowi.configManager.getConfig('crowi', 'customize:isEnabledAttachTitleHeader'),
       isEnabledAttachTitleHeader: await crowi.configManager.getConfig('crowi', 'customize:isEnabledAttachTitleHeader'),

+ 17 - 95
src/server/routes/page.js

@@ -146,16 +146,12 @@ module.exports = function(crowi, app) {
   const ApiResponse = require('../util/apiResponse');
   const ApiResponse = require('../util/apiResponse');
   const getToday = require('../util/getToday');
   const getToday = require('../util/getToday');
 
 
-  const { configManager, slackNotificationService } = crowi;
+  const { slackNotificationService } = crowi;
   const interceptorManager = crowi.getInterceptorManager();
   const interceptorManager = crowi.getInterceptorManager();
   const globalNotificationService = crowi.getGlobalNotificationService();
   const globalNotificationService = crowi.getGlobalNotificationService();
 
 
   const actions = {};
   const actions = {};
 
 
-  const PORTAL_STATUS_NOT_EXISTS = 0;
-  const PORTAL_STATUS_EXISTS = 1;
-  const PORTAL_STATUS_FORBIDDEN = 2;
-
   // register page events
   // register page events
 
 
   const pageEvent = crowi.event('page');
   const pageEvent = crowi.event('page');
@@ -342,27 +338,17 @@ module.exports = function(crowi, app) {
     const portalPath = pathUtils.addTrailingSlash(getPathFromRequest(req));
     const portalPath = pathUtils.addTrailingSlash(getPathFromRequest(req));
     const revisionId = req.query.revision;
     const revisionId = req.query.revision;
 
 
-    // check whether this page has portal page
-    const portalPageStatus = await getPortalPageState(portalPath, req.user);
-
-    let view = 'customlayout-selector/page_list';
+    const view = 'customlayout-selector/page_list';
     const renderVars = { path: portalPath };
     const renderVars = { path: portalPath };
 
 
-    if (portalPageStatus === PORTAL_STATUS_FORBIDDEN) {
-      // inject to req
-      req.isForbidden = true;
-      view = 'customlayout-selector/forbidden';
-    }
-    else if (portalPageStatus === PORTAL_STATUS_EXISTS) {
-      let portalPage = await Page.findByPathAndViewer(portalPath, req.user);
-      portalPage.initLatestRevisionField(revisionId);
+    let portalPage = await Page.findByPathAndViewer(portalPath, req.user);
+    portalPage.initLatestRevisionField(revisionId);
 
 
-      // populate
-      portalPage = await portalPage.populateDataToShowRevision();
+    // populate
+    portalPage = await portalPage.populateDataToShowRevision();
 
 
-      addRendarVarsForPage(renderVars, portalPage);
-      await addRenderVarsForSlack(renderVars, portalPage);
-    }
+    addRendarVarsForPage(renderVars, portalPage);
+    await addRenderVarsForSlack(renderVars, portalPage);
 
 
     const limit = 50;
     const limit = 50;
     const offset = parseInt(req.query.offset) || 0;
     const offset = parseInt(req.query.offset) || 0;
@@ -427,25 +413,6 @@ module.exports = function(crowi, app) {
     return channels;
     return channels;
   };
   };
 
 
-  /**
-   *
-   * @param {string} path
-   * @param {User} user
-   * @returns {number} PORTAL_STATUS_NOT_EXISTS(0) or PORTAL_STATUS_EXISTS(1) or PORTAL_STATUS_FORBIDDEN(2)
-   */
-  async function getPortalPageState(path, user) {
-    const portalPath = Page.addSlashOfEnd(path);
-    const page = await Page.findByPathAndViewer(portalPath, user);
-
-    if (page == null) {
-      // check the page is forbidden or just does not exist.
-      const isForbidden = await Page.count({ path: portalPath }) > 0;
-      return isForbidden ? PORTAL_STATUS_FORBIDDEN : PORTAL_STATUS_NOT_EXISTS;
-    }
-    return PORTAL_STATUS_EXISTS;
-  }
-
-
   actions.showTopPage = function(req, res) {
   actions.showTopPage = function(req, res) {
     return showPageListForCrowiBehavior(req, res);
     return showPageListForCrowiBehavior(req, res);
   };
   };
@@ -455,16 +422,9 @@ module.exports = function(crowi, app) {
    */
    */
   /* eslint-disable no-else-return */
   /* eslint-disable no-else-return */
   actions.showPageWithEndOfSlash = function(req, res, next) {
   actions.showPageWithEndOfSlash = function(req, res, next) {
-    const behaviorType = configManager.getConfig('crowi', 'customize:behavior');
-
-    if (behaviorType === 'crowi') {
-      return showPageListForCrowiBehavior(req, res, next);
-    }
-    else {
-      const path = getPathFromRequest(req); // end of slash should be omitted
-      // redirect and showPage action will be triggered
-      return res.redirect(path);
-    }
+    const path = getPathFromRequest(req); // end of slash should be omitted
+    // redirect and showPage action will be triggered
+    return res.redirect(path);
   };
   };
   /* eslint-enable no-else-return */
   /* eslint-enable no-else-return */
 
 
@@ -478,20 +438,6 @@ module.exports = function(crowi, app) {
     if (req.query.presentation) {
     if (req.query.presentation) {
       return showPageForPresentation(req, res, next);
       return showPageForPresentation(req, res, next);
     }
     }
-
-    const behaviorType = configManager.getConfig('crowi', 'customize:behavior');
-
-    // check whether this page has portal page
-    if (behaviorType === 'crowi') {
-      const portalPagePath = pathUtils.addTrailingSlash(getPathFromRequest(req));
-      const hasPortalPage = await Page.count({ path: portalPagePath }) > 0;
-
-      if (hasPortalPage) {
-        logger.debug('The portal page is found', portalPagePath);
-        return res.redirect(encodeURI(`${portalPagePath}?redirectFrom=${pathUtils.encodePagePath(req.path)}`));
-      }
-    }
-
     // delegate to showPageForGrowiBehavior
     // delegate to showPageForGrowiBehavior
     return showPageForGrowiBehavior(req, res, next);
     return showPageForGrowiBehavior(req, res, next);
   };
   };
@@ -501,16 +447,8 @@ module.exports = function(crowi, app) {
    */
    */
   /* eslint-disable no-else-return */
   /* eslint-disable no-else-return */
   actions.trashPageListShowWrapper = function(req, res) {
   actions.trashPageListShowWrapper = function(req, res) {
-    const behaviorType = configManager.getConfig('crowi', 'customize:behavior');
-
-    if (behaviorType === 'crowi') {
-      // Crowi behavior for '/trash/*'
-      return actions.deletedPageListShow(req, res);
-    }
-    else {
-      // redirect to '/trash'
-      return res.redirect('/trash');
-    }
+    // redirect to '/trash'
+    return res.redirect('/trash');
   };
   };
   /* eslint-enable no-else-return */
   /* eslint-enable no-else-return */
 
 
@@ -519,16 +457,8 @@ module.exports = function(crowi, app) {
    */
    */
   /* eslint-disable no-else-return */
   /* eslint-disable no-else-return */
   actions.trashPageShowWrapper = function(req, res) {
   actions.trashPageShowWrapper = function(req, res) {
-    const behaviorType = configManager.getConfig('crowi', 'customize:behavior');
-
-    if (behaviorType === 'crowi') {
-      // redirect to '/trash/'
-      return res.redirect('/trash/');
-    }
-    else {
-      // Crowi behavior for '/trash/*'
-      return actions.deletedPageListShow(req, res);
-    }
+    // Crowi behavior for '/trash/*'
+    return actions.deletedPageListShow(req, res);
   };
   };
   /* eslint-enable no-else-return */
   /* eslint-enable no-else-return */
 
 
@@ -537,16 +467,8 @@ module.exports = function(crowi, app) {
    */
    */
   /* eslint-disable no-else-return */
   /* eslint-disable no-else-return */
   actions.deletedPageListShowWrapper = function(req, res) {
   actions.deletedPageListShowWrapper = function(req, res) {
-    const behaviorType = configManager.getConfig('crowi', 'customize:behavior');
-
-    if (behaviorType === 'crowi') {
-      // Crowi behavior for '/trash/*'
-      return actions.deletedPageListShow(req, res);
-    }
-    else {
-      const path = `/trash${getPathFromRequest(req)}`;
-      return res.redirect(path);
-    }
+    const path = `/trash${getPathFromRequest(req)}`;
+    return res.redirect(path);
   };
   };
   /* eslint-enable no-else-return */
   /* eslint-enable no-else-return */
 
 

+ 0 - 2
src/server/views/layout-growi/page.html

@@ -34,13 +34,11 @@
 
 
   </div>
   </div>
 
 
-  {% if 'growi' === getConfig('crowi', 'customize:behavior') || 'crowi-plus' === getConfig('crowi', 'customize:behavior') %}
   <div class="row page-list d-edit-none d-print-none mt-5">
   <div class="row page-list d-edit-none d-print-none mt-5">
     <div class="col-md-10">
     <div class="col-md-10">
       {% include '../widget/page_list_and_timeline.html' %}
       {% include '../widget/page_list_and_timeline.html' %}
     </div>
     </div>
   </div>
   </div>
-  {% endif %}
 {% endblock %}
 {% endblock %}
 
 
 
 

+ 0 - 1
src/server/views/layout-growi/page_list.html

@@ -55,7 +55,6 @@
   </div>
   </div>
   <div id="crowi-modals">
   <div id="crowi-modals">
     {% include '../widget/page_modals.html' %}
     {% include '../widget/page_modals.html' %}
-    {% include '../modal/what_is_portal.html' %}
     {% include '../modal/unportalize.html' %}
     {% include '../modal/unportalize.html' %}
   </div>
   </div>
 {% endblock %}
 {% endblock %}

+ 0 - 2
src/server/views/layout-growi/user_page.html

@@ -60,13 +60,11 @@
 
 
   </div>
   </div>
 
 
-  {% if 'growi' === getConfig('crowi', 'customize:behavior') || 'crowi-plus' === getConfig('crowi', 'customize:behavior') %}
   <div class="row page-list d-edit-none d-print-none mt-5">
   <div class="row page-list d-edit-none d-print-none mt-5">
     <div class="col-md-10">
     <div class="col-md-10">
       {% include '../widget/page_list_and_timeline.html' %}
       {% include '../widget/page_list_and_timeline.html' %}
     </div>
     </div>
   </div>
   </div>
-  {% endif %}
 
 
 {% endblock %}
 {% endblock %}
 
 

+ 0 - 6
src/server/views/layout-growi/widget/header.html

@@ -1,7 +1 @@
 <div id="grw-subnav" class="grw-subnav d-edit-none" data-is-forbidden-page="{{ forbidden }}"></div>
 <div id="grw-subnav" class="grw-subnav d-edit-none" data-is-forbidden-page="{{ forbidden }}"></div>
-
-{% if not page and not forbidden and ('/' === path or 'crowi' === getConfig('crowi', 'customize:behavior')) and not isUserPageList(path) and !isTrashPage() %}
-  {% if '/' === path.slice(-1) %}
-    {% include '../../widget/create_portal.html' %}
-  {% endif %}
-{% endif %}

+ 0 - 2
src/server/views/layout-kibela/page.html

@@ -32,13 +32,11 @@
 
 
 </div>
 </div>
 
 
-  {% if 'growi' === getConfig('crowi', 'customize:behavior') || 'crowi-plus' === getConfig('crowi', 'customize:behavior') %}
   <div class="row page-list grw-pt-10px my-5 round-corner d-edit-none">
   <div class="row page-list grw-pt-10px my-5 round-corner d-edit-none">
     <div class="col-md-10">
     <div class="col-md-10">
       {% include '../widget/page_list_and_timeline.html' %}
       {% include '../widget/page_list_and_timeline.html' %}
     </div>
     </div>
   </div>
   </div>
-  {% endif %}
 {% endblock %}
 {% endblock %}
 
 
 
 

+ 0 - 1
src/server/views/layout-kibela/page_list.html

@@ -53,7 +53,6 @@
 </div>
 </div>
 <div id="crowi-modals">
 <div id="crowi-modals">
   {% include '../widget/page_modals.html' %}
   {% include '../widget/page_modals.html' %}
-    {% include '../modal/what_is_portal.html' %}
   {% include '../modal/unportalize.html' %}
   {% include '../modal/unportalize.html' %}
 </div>
 </div>
 {% endblock %}
 {% endblock %}

+ 0 - 2
src/server/views/layout-kibela/user_page.html

@@ -51,13 +51,11 @@
 
 
   </div>
   </div>
 
 
-  {% if 'growi' === getConfig('crowi', 'customize:behavior') || 'crowi-plus' === getConfig('crowi', 'customize:behavior') %}
   <div class="row page-list mt-5 d-edit-none">
   <div class="row page-list mt-5 d-edit-none">
     <div class="col-12">
     <div class="col-12">
       {% include '../widget/page_list_and_timeline_kibela.html' %}
       {% include '../widget/page_list_and_timeline_kibela.html' %}
     </div>
     </div>
   </div>
   </div>
-  {% endif %}
 
 
 {% endblock %}
 {% endblock %}
 
 

+ 0 - 5
src/server/views/layout-kibela/widget/header.html

@@ -1,7 +1,2 @@
 <div id="grw-subnav" class="grw-subnav" data-is-forbidden-page="{{ forbidden }}"></div>
 <div id="grw-subnav" class="grw-subnav" data-is-forbidden-page="{{ forbidden }}"></div>
 
 
-{% if not page and ('/' === path or 'crowi' === getConfig('crowi', 'customize:behavior')) and not isUserPageList(path) and !isTrashPage() %}
-  {% if '/' === path.slice(-1) %}
-    {% include '../../widget/create_portal.html' %}
-  {% endif %}
-{% endif %}

+ 2 - 2
src/server/views/modal/create_page.html

@@ -62,10 +62,10 @@
                   </a>
                   </a>
                   <div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
                   <div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
                     <button class="dropdown-item" type="button" data-template-type="children">
                     <button class="dropdown-item" type="button" data-template-type="children">
-                      {{ t('template.children.label') }} (_template) <small class="text-muted">- {{ t('template.children.desc') }}</small>
+                      {{ t('template.children.label') }} (_template)<br class="d-block d-md-none" /><small class="text-muted text-wrap">- {{ t('template.children.desc') }}</small>
                     </button>
                     </button>
                     <button class="dropdown-item" type="button" data-template-type="decentants">
                     <button class="dropdown-item" type="button" data-template-type="decentants">
-                      {{ t('template.decendants.label') }} (__template) <small class="text-muted">- {{ t('template.decendants.desc') }}</small>
+                      {{ t('template.decendants.label') }} (__template) <br class="d-block d-md-none" /><small class="text-muted">- {{ t('template.decendants.desc') }}</small>
                     </button>
                     </button>
                   </div>
                   </div>
                 </div>
                 </div>

+ 0 - 81
src/server/views/modal/what_is_portal.html

@@ -1,81 +0,0 @@
-<div class="modal" id="help-portal">
-  <div class="modal-dialog">
-    <div class="modal-content">
-
-      <div class="modal-header">
-        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
-        <div class="modal-title">What is Portal?</div>
-      </div>
-
-      <div class="modal-body">
-        <h4>Portal とは</h4>
-        <br>
-        <ul>
-          <li>すべての、スラッシュ <code>/</code> で終わるページは、その階層の一覧ページとなります。</li>
-          <li>Portal 機能を使うと、その一覧ページに対して、任意の編集コンテンツを配置することができるようになります (つまり、一般的なページと同様に、編集したコンテンツを作成でき、その内容は常にページ一覧の上部に表示されるようになります)</li>
-        </ul>
-        <br>
-
-        <hr>
-
-        <h4>想定される使われ方</h4>
-        <br>
-        <p>
-        例えば、以下のようなページの階層があったとします。
-        </p>
-        <ul>
-          <li><code>/projects</code>
-            <ul>
-              <li><code>/projects/homepage-renewal</code>
-                <ul>
-                  <li><code>/projects/homepage-renewal/...</code></li>
-                </ul>
-              </li>
-              <li><code>/projects/...</code></li>
-            </ul>
-          </li>
-        </ul>
-
-        <p>
-        こういったケースでは、<code>/projects/homepage-renewal</code> には homepage-renewal プロジェクトについてのイントロや各ページへのリンク、関係者の紹介など、homepage-renewal に関する情報を掲載しておきたいと思うはずです。
-        </p>
-        <p>
-        Poral機能を使うと、こうしたときに、<code>/projects/homepage-renewal/</code> この <strong>"一覧ページ" を、ページ化することができ、そこに、通常のページと同じように Markdown で編集したコンテンツを配置することができるようになります</strong>。
-        </p>
-
-        <p>
-        まさにそのプロジェクトのポータルページを用意したい場合などに活用してください。
-        </p>
-
-        </div>
-
-      </div>
-
-    </div><!-- /.modal-content -->
-  </div><!-- /.modal-dialog -->
-</div><!-- /.modal -->
-
-<div class="modal fade portal-warning-modal" id="portal-warning-modal">
-  <div class="modal-dialog">
-    <div class="modal-content">
-
-      <div class="modal-header">
-        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
-        <div class="modal-title">ポータルに関するヒント</div>
-      </div>
-      <div class="modal-body">
-
-        <strong>Warning!</strong><br>
-
-        <p>既に <strong><a href="{{ path|removeTrailingSlash }}">{{ path|removeTrailingSlash }}</a></strong> のページが存在します。</p>
-
-        <p>
-          <a href="{{ path|removeTrailingSlash }}">{{ path|removeTrailingSlash }}</a> をポータル化するには、
-          <a href="{{ path|removeTrailingSlash }}">{{ path|removeTrailingSlash }}</a> に移動し、「ページを移動」させてください。<br>
-          <a href="{{ path|removeTrailingSlash }}">{{ path|removeTrailingSlash }}</a> とは別に、このページ(<code>{{ path }}</code>)にポータルを作成する場合、このまま編集を続けて作成してください。
-        </p>
-
-      </div>
-    </div>
-  </div>
-</div>

+ 0 - 4
src/server/views/widget/create_portal.html

@@ -1,4 +0,0 @@
-<div class="portal-form-button d-edit-none">
-  <a class="btn btn-primary" id="create-portal-button" href="#edit" data-toggle="tab" {% if not user %}disabled{% endif %}>Create Portal</a>
-  <p class="form-text text-muted"><a href="#" data-target="#help-portal" data-toggle="modal"><i class="icon-question"></i> What is Portal?</a></p>
-</div>

+ 2 - 0
src/server/views/widget/not_found_tabs.html

@@ -14,5 +14,7 @@
       <i class="icon-note"></i> {{ t('Create') }}
       <i class="icon-note"></i> {{ t('Create') }}
     </a>
     </a>
   </li>
   </li>
+
+  <div id="page-editor-path-nav" class="d-none d-edit-block ml-2"></div>
   {% endif %}
   {% endif %}
 </ul>
 </ul>

+ 0 - 3
src/server/views/widget/page_content.html

@@ -45,9 +45,6 @@
         </div>
         </div>
         <div id="page" class="mt-4"></div>
         <div id="page" class="mt-4"></div>
       </div>
       </div>
-    {% elseif 'crowi' === getConfig('crowi', 'customize:behavior') %}
-      <div class="tab-pane active" id="cancel-creating-portal">
-      </div>
     {% endif %}
     {% endif %}
 
 
     {% if !isTrashPage() %}
     {% if !isTrashPage() %}

+ 1 - 4
src/server/views/widget/page_tabs.html

@@ -37,10 +37,7 @@
     </li>
     </li>
     {% endif %}
     {% endif %}
 
 
-    <div class="grw-revision-path-for-edit d-none ml-2">
-      <h4 id="revision-path" class="mb-0"></h4>
-      <div id="tag-label"></div>
-    </div>
+    <div id="page-editor-path-nav" class="d-none d-edit-block ml-2"></div>
   {% endif %}
   {% endif %}
 
 
   {#
   {#

+ 32 - 31
src/server/views/widget/page_tabs_kibela.html

@@ -11,30 +11,33 @@
   </li>
   </li>
 
 
   {% if !isTrashPage() %}
   {% if !isTrashPage() %}
-  <li class="nav-item nav-tab-edit">
-    <a
-      {% if user %} href="#edit" data-toggle="tab" class="nav-link edit-button" {% endif %}
-      {% if not user %}
-        class="nav-link edit-button edit-button-disabled"
-        data-toggle="tooltip" data-placement="top" data-container="body" title="{{ t('Not available for guest') }}"
-      {% endif %}
-    >
-      <i class="icon-note"></i> {{ t('Edit') }}
-    </a>
-  </li>
-  {% if isHackmdSetup() %}
-  <li class="nav-item nav-tab-hackmd">
-    <a
-      {% if user %} href="#hackmd" data-toggle="tab" class="nav-link edit-button" {% endif %}
-      {% if not user %}
-        class="nav-link edit-button edit-button-disabled"
-        data-toggle="tooltip" data-placement="top" data-container="body" title="{{ t('Not available for guest') }}"
-      {% endif %}
-    >
-      <i class="fa fa-file-text-o"></i> {{ t('HackMD') }}
-    </a>
-  </li>
-  {% endif %}
+    <li class="nav-item nav-tab-edit">
+      <a
+        {% if user %} href="#edit" data-toggle="tab" class="nav-link edit-button" {% endif %}
+        {% if not user %}
+          class="nav-link edit-button edit-button-disabled"
+          data-toggle="tooltip" data-placement="top" data-container="body" title="{{ t('Not available for guest') }}"
+        {% endif %}
+      >
+        <i class="icon-note"></i> {{ t('Edit') }}
+      </a>
+    </li>
+    {% if isHackmdSetup() %}
+    <li class="nav-item nav-tab-hackmd">
+      <a
+        {% if user %} href="#hackmd" data-toggle="tab" class="nav-link edit-button" {% endif %}
+        {% if not user %}
+          class="nav-link edit-button edit-button-disabled"
+          data-toggle="tooltip" data-placement="top" data-container="body" title="{{ t('Not available for guest') }}"
+        {% endif %}
+      >
+        <i class="fa fa-file-text-o"></i> {{ t('HackMD') }}
+      </a>
+    </li>
+    {% endif %}
+
+    <div id="page-editor-path-nav" class="d-none d-edit-block ml-2"></div>
+
   {% endif %}
   {% endif %}
 
 
   {#
   {#
@@ -69,15 +72,13 @@
       >
       >
         <i class="icon-options-vertical"></i>
         <i class="icon-options-vertical"></i>
       </a>
       </a>
-      <ul class="dropdown-menu dropdown-menu-right">
-        <li class="dropdown-item">
-          <a href="#" data-target="#create-template" data-toggle="modal"><i class="icon-fw icon-magic-wand"></i> {{ t('template.option_label.create/edit') }}</a>
-        </li>
+      <div class="dropdown-menu dropdown-menu-right">
+        <a class="dropdown-item" href="#" data-target="#create-template" data-toggle="modal"><i class="icon-fw icon-magic-wand"></i> {{ t('template.option_label.create/edit') }}</a>
         {% if ('/' !== path) %}
         {% if ('/' !== path) %}
-        <li class="dropdown-divider"></li>
-        <li class="dropdown-item"><a href="#" data-target="#unportalize" data-toggle="modal"><i class="fa fa-share"></i> {{ t('Unportalize') }}</a></li>
+        <div class="dropdown-divider"></div>
+        <a class="dropdown-item" href="#" data-target="#unportalize" data-toggle="modal"><i class="fa fa-share"></i> {{ t('Unportalize') }}</a></li>
         {% endif %}
         {% endif %}
-      </ul>
+      </div>
     </li>
     </li>
     {% else %}
     {% else %}
     <li class="nav-item dropdown">
     <li class="nav-item dropdown">

+ 15 - 0
yarn.lock

@@ -688,6 +688,14 @@
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
     "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
 
 
+"@babel/plugin-proposal-optional-chaining@^7.9.0":
+  version "7.9.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58"
+  integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.0"
+
 "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
 "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
   version "7.4.4"
   version "7.4.4"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78"
@@ -739,6 +747,13 @@
   dependencies:
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/helper-plugin-utils" "^7.0.0"
 
 
+"@babel/plugin-syntax-optional-chaining@^7.8.0":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+  integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
 "@babel/plugin-transform-arrow-functions@^7.2.0":
 "@babel/plugin-transform-arrow-functions@^7.2.0":
   version "7.2.0"
   version "7.2.0"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550"