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

Merge branch 'dev/4.0.x' into imprv/profile-image-cache

yusuketk 5 лет назад
Родитель
Сommit
f1aaba9d0c
29 измененных файлов с 246 добавлено и 229 удалено
  1. 5 5
      resource/locales/en-US/sandbox.md
  2. 5 5
      resource/locales/ja/sandbox.md
  3. 2 2
      src/client/js/components/Admin/MarkdownSetting/XssForm.jsx
  4. 1 1
      src/client/js/components/Admin/Notification/ManageGlobalNotification.jsx
  5. 1 1
      src/client/js/components/Admin/Security/SecurityManagement.jsx
  6. 3 2
      src/client/js/components/Admin/UserManagement.jsx
  7. 1 1
      src/client/js/components/Me/PasswordSettings.jsx
  8. 30 32
      src/client/js/components/Me/PersonalSettings.jsx
  9. 1 1
      src/client/js/components/PageDeleteModal.jsx
  10. 9 7
      src/client/js/components/PageHistory/Revision.jsx
  11. 13 8
      src/client/js/components/Sidebar/SidebarNav.jsx
  12. 0 2
      src/client/styles/scss/_editor-attachment.scss
  13. 0 21
      src/client/styles/scss/_layout.scss
  14. 6 21
      src/client/styles/scss/_override-bootstrap-variables.scss
  15. 0 2
      src/client/styles/scss/_override-bootstrap.scss
  16. 2 4
      src/client/styles/scss/_search.scss
  17. 22 32
      src/client/styles/scss/theme/_apply-colors-dark.scss
  18. 14 0
      src/client/styles/scss/theme/_apply-colors-light.scss
  19. 0 1
      src/client/styles/scss/theme/_apply-colors.scss
  20. 36 0
      src/client/styles/scss/theme/_reboot-bootstrap-tables.scss
  21. 7 0
      src/client/styles/scss/theme/antarctic.scss
  22. 15 1
      src/client/styles/scss/theme/default.scss
  23. 32 45
      src/client/styles/scss/theme/future.scss
  24. 32 30
      src/client/styles/scss/theme/halloween.scss
  25. 1 1
      src/server/routes/installer.js
  26. 2 0
      src/server/views/invited.html
  27. 1 1
      src/server/views/layout-growi/user_page.html
  28. 1 1
      src/server/views/layout-kibela/user_page.html
  29. 4 2
      src/server/views/login.html

+ 5 - 5
resource/locales/en-US/sandbox.md

@@ -252,12 +252,12 @@ This is the most flexible linker.
 Both the page description and link address can be displayed on the page.
 Both the page description and link address can be displayed on the page.
 
 
 ```
 ```
-[[./Bootstrap3]]
-Example of Bootstrap3 is[[here>./Bootstrap3]]
+[[./Bootstrap4]]
+Example of Bootstrap4 is[[here>./Bootstrap4]]
 ```
 ```
 
 
 [[../user]]
 [[../user]]
-Example of Bootstrap3 is[[here>./Bootstrap3]]
+Example of Bootstrap4 is[[here>./Bootstrap4]]
 
 
 # :pencil: Lists
 # :pencil: Lists
 
 
@@ -449,8 +449,8 @@ See [emojione](https://www.emojione.com/)
 
 
 # :heavy_plus_sign: More..
 # :heavy_plus_sign: More..
 
 
-- Try to attach Bootstrap3 Tags?
-    - :arrow_right: [/Sandbox/Bootstrap3]
+- Try to attach Bootstrap4 Tags?
+    - :arrow_right: [/Sandbox/Bootstrap4]
 - Try to draw Diagrams?
 - Try to draw Diagrams?
     - :arrow_right: [/Sandbox/Diagrams]
     - :arrow_right: [/Sandbox/Diagrams]
 - Try to write Math Formulas?
 - Try to write Math Formulas?

+ 5 - 5
resource/locales/ja/sandbox.md

@@ -251,12 +251,12 @@ ___
 記述中のページを基点とした相対リンクと、表示テキストに対するリンクを同時に実現できます。
 記述中のページを基点とした相対リンクと、表示テキストに対するリンクを同時に実現できます。
 
 
 ```
 ```
-[[./Bootstrap3]]
-Bootstrap3のExampleは[[こちら>./Bootstrap3]]
+[[./Bootstrap4]]
+Bootstrap4のExampleは[[こちら>./Bootstrap4]]
 ```
 ```
 
 
 [[../user]]
 [[../user]]
-Bootstrap3のExampleは[[こちら>./Bootstrap3]]
+Bootstrap4のExampleは[[こちら>./Bootstrap4]]
 
 
 # :pencil: Lists
 # :pencil: Lists
 
 
@@ -449,8 +449,8 @@ See [emojione](https://www.emojione.com/)
 
 
 # :heavy_plus_sign: 更に…
 # :heavy_plus_sign: 更に…
 
 
-- Bootstrap3 のタグを使う
-    - :arrow_right: [/Sandbox/Bootstrap3]
+- Bootstrap4 のタグを使う
+    - :arrow_right: [/Sandbox/Bootstrap4]
 - 図表を書く
 - 図表を書く
     - :arrow_right: [/Sandbox/Diagrams]
     - :arrow_right: [/Sandbox/Diagrams]
 - 数式を書く
 - 数式を書く

+ 2 - 2
src/client/js/components/Admin/MarkdownSetting/XssForm.jsx

@@ -75,7 +75,7 @@ class XssForm extends React.Component {
               />
               />
               <label className="custom-control-label w-100" htmlFor="xssOption2">
               <label className="custom-control-label w-100" htmlFor="xssOption2">
                 <p className="font-weight-bold">{t('admin:markdown_setting.xss_options.recommended_setting')}</p>
                 <p className="font-weight-bold">{t('admin:markdown_setting.xss_options.recommended_setting')}</p>
-                <div className="m-t-15">
+                <div className="mt-4">
                   <div className="d-flex justify-content-between">
                   <div className="d-flex justify-content-between">
                     {t('admin:markdown_setting.xss_options.tag_names')}
                     {t('admin:markdown_setting.xss_options.tag_names')}
                   </div>
                   </div>
@@ -88,7 +88,7 @@ class XssForm extends React.Component {
                     defaultValue={tags}
                     defaultValue={tags}
                   />
                   />
                 </div>
                 </div>
-                <div className="m-t-15">
+                <div className="mt-4">
                   <div className="d-flex justify-content-between">
                   <div className="d-flex justify-content-between">
                     {t('admin:markdown_setting.xss_options.tag_attributes')}
                     {t('admin:markdown_setting.xss_options.tag_attributes')}
                   </div>
                   </div>

+ 1 - 1
src/client/js/components/Admin/Notification/ManageGlobalNotification.jsx

@@ -111,7 +111,7 @@ class ManageGlobalNotification extends React.Component {
 
 
 
 
         <div className="row">
         <div className="row">
-          <div className="m-t-20 form-box col-md-12">
+          <div className="form-box col-md-12">
             <h2 className="border-bottom mb-5">{t('notification_setting.notification_detail')}</h2>
             <h2 className="border-bottom mb-5">{t('notification_setting.notification_detail')}</h2>
           </div>
           </div>
 
 

+ 1 - 1
src/client/js/components/Admin/Security/SecurityManagement.jsx

@@ -58,7 +58,7 @@ class SecurityManagement extends React.Component {
           </div>
           </div>
         </div>
         </div>
 
 
-        <div className="auth-mechanism-configurations m-t-10">
+        <div className="auth-mechanism-configurations">
           <h2 className="border-bottom">{t('security_setting.Authentication mechanism settings')}</h2>
           <h2 className="border-bottom">{t('security_setting.Authentication mechanism settings')}</h2>
           <Nav tabs>
           <Nav tabs>
             <NavItem>
             <NavItem>

+ 3 - 2
src/client/js/components/Admin/UserManagement.jsx

@@ -160,10 +160,11 @@ class UserManagement extends React.Component {
         <div className="border-top border-bottom">
         <div className="border-top border-bottom">
 
 
           <div className="row d-flex justify-content-start align-items-center my-2">
           <div className="row d-flex justify-content-start align-items-center my-2">
-            <div className="col-md-4 d-flex align-items-center my-2">
+            <div className="col-md-3 d-flex align-items-center my-2">
               <i className="icon-magnifier mr-1"></i>
               <i className="icon-magnifier mr-1"></i>
               <span className="search-typeahead">
               <span className="search-typeahead">
                 <input
                 <input
+                  className="w-100"
                   type="text"
                   type="text"
                   ref={(searchUserElement) => { this.searchUserElement = searchUserElement }}
                   ref={(searchUserElement) => { this.searchUserElement = searchUserElement }}
                   onChange={this.handleChangeSearchText}
                   onChange={this.handleChangeSearchText}
@@ -172,7 +173,7 @@ class UserManagement extends React.Component {
               </span>
               </span>
             </div>
             </div>
 
 
-            <div className="col-md-6 my-2">
+            <div className="offset-md-1 col-md-6 my-2">
               <div className="form-inline">
               <div className="form-inline">
                 {this.renderCheckbox('all', 'All', 'secondary')}
                 {this.renderCheckbox('all', 'All', 'secondary')}
                 {this.renderCheckbox('registered', 'Approval Pending', 'info')}
                 {this.renderCheckbox('registered', 'Approval Pending', 'info')}

+ 1 - 1
src/client/js/components/Me/PasswordSettings.jsx

@@ -67,7 +67,7 @@ class PasswordSettings extends React.Component {
 
 
     return (
     return (
       <React.Fragment>
       <React.Fragment>
-        {(!personalContainer.state.isPasswordSet) && <div className="alert alert-warning m-t-10">{ t('Password is not set') }</div>}
+        {(!personalContainer.state.isPasswordSet) && <div className="alert alert-warning">{ t('Password is not set') }</div>}
         <div className="container-fluid my-4">
         <div className="container-fluid my-4">
           {(personalContainer.state.isPasswordSet)
           {(personalContainer.state.isPasswordSet)
             ? <h2 className="border-bottom">{t('personal_settings.update_password')}</h2>
             ? <h2 className="border-bottom">{t('personal_settings.update_password')}</h2>

+ 30 - 32
src/client/js/components/Me/PersonalSettings.jsx

@@ -15,38 +15,36 @@ class PersonalSettings extends React.Component {
 
 
     return (
     return (
       <Fragment>
       <Fragment>
-        <div className="m-t-10">
-          <div className="personal-settings">
-            <ul className="nav nav-tabs" role="tablist">
-              <li className="nav-item">
-                <a className="nav-link active" href="#user-settings" data-toggle="tab" role="tab"><i className="icon-user"></i> { t('User Information') }</a>
-              </li>
-              <li className="nav-item">
-                <a className="nav-link" href="#external-accounts" data-toggle="tab" role="tab">
-                  <i className="icon-share-alt mr-1"></i>
-                  { t('admin:user_management.external_accounts') }
-                </a>
-              </li>
-              <li className="nav-item">
-                <a className="nav-link" href="#password-settings" data-toggle="tab" role="tab"><i className="icon-lock"></i> { t('Password Settings') }</a>
-              </li>
-              <li className="nav-item">
-                <a className="nav-link" href="#apiToken" data-toggle="tab" role="tab"><i className="icon-paper-plane"></i> { t('API Settings') }</a>
-              </li>
-            </ul>
-            <div className="tab-content p-t-10">
-              <div id="user-settings" className="tab-pane active" role="tabpanel">
-                <UserSettings />
-              </div>
-              <div id="external-accounts" className="tab-pane" role="tabpanel">
-                <ExternalAccountLinkedMe />
-              </div>
-              <div id="password-settings" className="tab-pane" role="tabpanel">
-                <PasswordSettings />
-              </div>
-              <div id="apiToken" className="tab-pane" role="tabpanel">
-                <ApiSettings />
-              </div>
+        <div className="personal-settings">
+          <ul className="nav nav-tabs" role="tablist">
+            <li className="nav-item">
+              <a className="nav-link active" href="#user-settings" data-toggle="tab" role="tab"><i className="icon-user"></i> { t('User Information') }</a>
+            </li>
+            <li className="nav-item">
+              <a className="nav-link" href="#external-accounts" data-toggle="tab" role="tab">
+                <i className="icon-share-alt mr-1"></i>
+                { t('admin:user_management.external_accounts') }
+              </a>
+            </li>
+            <li className="nav-item">
+              <a className="nav-link" href="#password-settings" data-toggle="tab" role="tab"><i className="icon-lock"></i> { t('Password Settings') }</a>
+            </li>
+            <li className="nav-item">
+              <a className="nav-link" href="#apiToken" data-toggle="tab" role="tab"><i className="icon-paper-plane"></i> { t('API Settings') }</a>
+            </li>
+          </ul>
+          <div className="tab-content p-t-10">
+            <div id="user-settings" className="tab-pane active" role="tabpanel">
+              <UserSettings />
+            </div>
+            <div id="external-accounts" className="tab-pane" role="tabpanel">
+              <ExternalAccountLinkedMe />
+            </div>
+            <div id="password-settings" className="tab-pane" role="tabpanel">
+              <PasswordSettings />
+            </div>
+            <div id="apiToken" className="tab-pane" role="tabpanel">
+              <ApiSettings />
             </div>
             </div>
           </div>
           </div>
         </div>
         </div>

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

@@ -125,7 +125,7 @@ const PageDeleteModal = (props) => {
       </ModalBody>
       </ModalBody>
       <ModalFooter>
       <ModalFooter>
         <ApiErrorMessage errorCode={errorCode} errorMessage={errorMessage} linkPath={path} />
         <ApiErrorMessage errorCode={errorCode} errorMessage={errorMessage} linkPath={path} />
-        <button type="button" className={`m-l-10 btn btn-${deleteIconAndKey[deleteMode].color}`} onClick={deleteButtonHandler}>
+        <button type="button" className={`btn btn-${deleteIconAndKey[deleteMode].color}`} onClick={deleteButtonHandler}>
           <i className={`icon-${deleteIconAndKey[deleteMode].icon}`} aria-hidden="true"></i>
           <i className={`icon-${deleteIconAndKey[deleteMode].icon}`} aria-hidden="true"></i>
           { t(`modal_delete.delete_${deleteIconAndKey[deleteMode].translationKey}`) }
           { t(`modal_delete.delete_${deleteIconAndKey[deleteMode].translationKey}`) }
         </button>
         </button>

+ 9 - 7
src/client/js/components/PageHistory/Revision.jsx

@@ -16,7 +16,8 @@ export default class Revision extends React.Component {
   componentDidMount() {
   componentDidMount() {
   }
   }
 
 
-  _onDiffOpenClicked() {
+  _onDiffOpenClicked(e) {
+    e.preventDefault();
     this.props.onDiffOpenClicked(this.props.revision);
     this.props.onDiffOpenClicked(this.props.revision);
   }
   }
 
 
@@ -35,7 +36,7 @@ export default class Revision extends React.Component {
         <div className="picture-container">
         <div className="picture-container">
           {pic}
           {pic}
         </div>
         </div>
-        <div className="m-l-10">
+        <div className="ml-3">
           <div className="revision-history-meta">
           <div className="revision-history-meta">
             <span className="text-muted small">
             <span className="text-muted small">
               <UserDate dateTime={revision.createdAt} /> ({ t('No diff') })
               <UserDate dateTime={revision.createdAt} /> ({ t('No diff') })
@@ -56,13 +57,13 @@ export default class Revision extends React.Component {
       pic = <UserPicture user={author} size="lg" />;
       pic = <UserPicture user={author} size="lg" />;
     }
     }
 
 
-    const iconClass = this.props.revisionDiffOpened ? 'caret caret-opened' : 'caret';
+    const iconClass = this.props.revisionDiffOpened ? 'fa fa-caret-down caret caret-opened' : 'fa fa-caret-down caret';
     return (
     return (
       <div className="revision-history-main d-flex mt-3">
       <div className="revision-history-main d-flex mt-3">
         <div className="mt-2">
         <div className="mt-2">
           {pic}
           {pic}
         </div>
         </div>
-        <div className="m-l-10">
+        <div className="ml-2">
           <div className="revision-history-author">
           <div className="revision-history-author">
             <strong><Username user={author}></Username></strong>
             <strong><Username user={author}></Username></strong>
           </div>
           </div>
@@ -77,13 +78,14 @@ export default class Revision extends React.Component {
                 }
                 }
                 { this.props.hasDiff
                 { this.props.hasDiff
                   && (
                   && (
-                  <a className="diff-view" onClick={this._onDiffOpenClicked}>
-                    <i className={iconClass}></i> { t('View diff') }
+                  // use dummy href attr (with preventDefault()), because don't apply style by a:not([href])
+                  <a className="diff-view" href="" onClick={this._onDiffOpenClicked}>
+                    <i className={iconClass}></i> {t('View diff')}
                   </a>
                   </a>
                   )
                   )
                 }
                 }
               </span>
               </span>
-              <a href={`?revision=${revision._id}`} className="m-l-10">
+              <a href={`?revision=${revision._id}`} className="ml-2">
                 <i className="icon-login"></i> { t('Go to this version') }
                 <i className="icon-login"></i> { t('Go to this version') }
               </a>
               </a>
             </p>
             </p>

+ 13 - 8
src/client/js/components/Sidebar/SidebarNav.jsx

@@ -66,6 +66,7 @@ class SidebarNav extends React.Component {
 
 
   render() {
   render() {
     const { isAdmin, currentUsername } = this.props.appContainer;
     const { isAdmin, currentUsername } = this.props.appContainer;
+    const isLoggedIn = currentUsername != null;
 
 
     const primaryItems = [
     const primaryItems = [
       this.generatePrimaryItemObj('custom', 'Custom Sidebar', 'code'),
       this.generatePrimaryItemObj('custom', 'Custom Sidebar', 'code'),
@@ -74,16 +75,20 @@ class SidebarNav extends React.Component {
       // this.generatePrimaryItemObj('favorite', 'Favorite', 'icon-star'),
       // this.generatePrimaryItemObj('favorite', 'Favorite', 'icon-star'),
     ];
     ];
 
 
-    const secondaryItems = [
-      this.generateSecondaryItemObj('draft', 'Draft', 'file_copy', `/user/${currentUsername}#user-draft-list`),
+    let secondaryItems = [
+      isAdmin && (
+        this.generateSecondaryItemObj('admin', 'Admin', 'settings', '/admin')
+      ),
+      isLoggedIn && (
+        this.generateSecondaryItemObj('draft', 'Draft', 'file_copy', `/user/${currentUsername}#user-draft-list`)
+      ),
       this.generateSecondaryItemObj('help', 'Help', 'help', 'https://docs.growi.org', true),
       this.generateSecondaryItemObj('help', 'Help', 'help', 'https://docs.growi.org', true),
-      this.generateSecondaryItemObj('trash', 'Trash', 'delete', '/trash'),
+      isLoggedIn && (
+        this.generateSecondaryItemObj('trash', 'Trash', 'delete', '/trash')
+      ),
     ];
     ];
-    if (isAdmin) {
-      secondaryItems.unshift( // add to the beginning
-        this.generateSecondaryItemObj('admin', 'Admin', 'settings', '/admin'),
-      );
-    }
+    // remove 'false' items
+    secondaryItems = secondaryItems.filter(item => item !== false);
 
 
     return (
     return (
       <GlobalNav
       <GlobalNav

+ 0 - 2
src/client/styles/scss/_editor-attachment.scss

@@ -108,8 +108,6 @@
     border: none;
     border: none;
     border-top: 1px dotted #ccc;
     border-top: 1px dotted #ccc;
     border-bottom: none;
     border-bottom: none;
-    // TODO: remove or set value for GW-2531
-    // border-radius: 0;
 
 
     &:active {
     &:active {
       box-shadow: none;
       box-shadow: none;

+ 0 - 21
src/client/styles/scss/_layout.scss

@@ -34,26 +34,6 @@
   margin-top: 1rem;
   margin-top: 1rem;
 }
 }
 
 
-.layout-control {
-  position: fixed;
-  right: 25%;
-  bottom: 25px;
-  z-index: 1;
-  display: block;
-  padding: 5px 8px;
-  font-size: 0.8em;
-  text-align: center;
-  border: solid 1px #ccc;
-  border-right: none;
-  // border-radius: 5px 0 0 5px;
-  transition: 0.3s ease;
-
-  &:hover {
-    text-decoration: none;
-    cursor: pointer;
-  }
-}
-
 .revision-toc {
 .revision-toc {
   // to get on the Attachment row
   // to get on the Attachment row
   z-index: 1;
   z-index: 1;
@@ -112,7 +92,6 @@
       margin-bottom: 20px;
       margin-bottom: 20px;
       font-size: 0.9em;
       font-size: 0.9em;
       border: solid 1px #aaa;
       border: solid 1px #aaa;
-      // border-radius: 5px;
 
 
       .revision-toc-head {
       .revision-toc-head {
         display: inline-block;
         display: inline-block;

+ 6 - 21
src/client/styles/scss/_override-bootstrap-variables.scss

@@ -34,17 +34,13 @@ $border-radius-xl:            .35rem;
 
 
 //== Forms
 //== Forms
 //
 //
-// TODO: remove or set value for GW-2531
-// $input-border-radius: 0;
-// $input-border-radius-lg: 0;
-// $input-border-radius-sm: 0;
+$input-border-radius: $border-radius-sm;
+$input-border-radius-sm: $border-radius-sm;
+$input-border-radius-lg: $border-radius;
 
 
 //== Navs
 //== Navs
-
 $nav-link-padding-y: 0.75rem;
 $nav-link-padding-y: 0.75rem;
 $nav-link-padding-x: 1rem;
 $nav-link-padding-x: 1rem;
-// TODO: remove or set value for GW-2531
-// $nav-tabs-border-radius: 0;
 
 
 //== Navbar
 //== Navbar
 $navbar-padding-y: 0;
 $navbar-padding-y: 0;
@@ -52,30 +48,20 @@ $navbar-brand-padding-y: 0;
 $navbar-nav-link-padding-x: 1rem;
 $navbar-nav-link-padding-x: 1rem;
 
 
 //== Dropdowns
 //== Dropdowns
-// TODO: remove or set value for GW-2531
-// $dropdown-border-radius: 0;
+$dropdown-border-radius: $border-radius-sm;
 
 
 //== card
 //== card
-// TODO: remove or set value for GW-2531
-// $card-border-radius: 0;
 $card-spacer-y: 7px;
 $card-spacer-y: 7px;
 $card-spacer-x: 15px;
 $card-spacer-x: 15px;
 
 
 //== Modals
 //== Modals
 $modal-content-border-width: 0;
 $modal-content-border-width: 0;
-// TODO: remove or set value for GW-2531
-// $modal-content-border-radius: 0;
 $modal-header-padding-y: 0.75rem;
 $modal-header-padding-y: 0.75rem;
 $modal-header-padding-x: 1rem;
 $modal-header-padding-x: 1rem;
 
 
-//== Alerts
-// TODO: remove or set value for GW-2531
-// $alert-border-radius: 0;
-
 //== Progress bar
 //== Progress bar
 $progress-height: 4px;
 $progress-height: 4px;
-// TODO: remove or set value for GW-2531
-// $progress-border-radius: 0;
+$progress-border-radius: $border-radius-sm;
 $progress-bg: #f0f0f0;
 $progress-bg: #f0f0f0;
 $progress-box-shadow: none;
 $progress-box-shadow: none;
 
 
@@ -83,7 +69,6 @@ $progress-box-shadow: none;
 $pre-color: dummyinvalildcolor; // disable pre color specification with invalid value
 $pre-color: dummyinvalildcolor; // disable pre color specification with invalid value
 
 
 //== Custom Checkbox
 //== Custom Checkbox
-// TODO: remove or set value for GW-2531
-// $custom-checkbox-indicator-border-radius: 0px;
+$custom-checkbox-indicator-border-radius: 0px;
 $custom-control-indicator-focus-box-shadow: none;
 $custom-control-indicator-focus-box-shadow: none;
 $custom-control-indicator-size: 1.2rem;
 $custom-control-indicator-size: 1.2rem;

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

@@ -74,8 +74,6 @@
   .card.well {
   .card.well {
     min-height: 20px;
     min-height: 20px;
     padding: $card-spacer-y $card-spacer-x;
     padding: $card-spacer-y $card-spacer-x;
-    // TODO: remove or set value for GW-2531
-    // border-radius: 3px;
   }
   }
 
 
   // Dropdowns
   // Dropdowns

+ 2 - 4
src/client/styles/scss/_search.scss

@@ -20,7 +20,7 @@
 
 
   .search-clear {
   .search-clear {
     position: absolute;
     position: absolute;
-    top: 4px;
+    top: 5px;
     right: 4px;
     right: 4px;
     z-index: 3;
     z-index: 3;
     width: 24px;
     width: 24px;
@@ -135,8 +135,7 @@
       > li {
       > li {
         > a {
         > a {
           padding: 2px 8px;
           padding: 2px 8px;
-          // TODO: remove or set value for GW-2531
-          // border-radius: 0;
+          border-radius: 0;
 
 
           &:hover {
           &:hover {
             color: inherit;
             color: inherit;
@@ -186,7 +185,6 @@
         padding: 16px;
         padding: 16px;
         font-size: 13px;
         font-size: 13px;
         border: solid 1px #ccc;
         border: solid 1px #ccc;
-        // border-radius: 3px;
       }
       }
     }
     }
   }
   }

+ 22 - 32
src/client/styles/scss/theme/_apply-colors-dark.scss

@@ -1,5 +1,19 @@
 // determine optional variables
 // determine optional variables
 $bgcolor-subnabvar: lighten($bgcolor-global, 3%) !default;
 $bgcolor-subnabvar: lighten($bgcolor-global, 3%) !default;
+$color-table: white !default;
+$bgcolor-table: #343a40 !default;
+$border-color-table: lighten($bgcolor-table, 7.5%) !default;
+$color-table-hover: rgba(white, 0.075) !default;
+$bgcolor-table-hover: lighten($bgcolor-table, 7.5%) !default;
+
+// override bootstrap variables
+$table-dark-color: $color-table;
+$table-dark-bg: $bgcolor-table;
+$table-dark-border-color: $border-color-table;
+$table-dark-hover-color: $color-table-hover;
+$table-dark-hover-bg: $bgcolor-table-hover;
+
+@import 'reboot-bootstrap-tables';
 
 
 /*
 /*
   * Form
   * Form
@@ -69,38 +83,6 @@ ul.pagination {
   }
   }
 }
 }
 
 
-.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 {
-  // FIXME: use $table-dark-*
-  // 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 {
-  // FIXME: use $table-dark-*
-  // border: 1px solid $border;
-}
-
-.table > thead > tr > th {
-  // FIXME: use $table-dark-*
-  // border-bottom: 1px solid $border;
-}
-
-.table-bordered {
-  // FIXME: use $table-dark-*
-  // border: 1px solid $border;
-}
-
 /*
 /*
  * GROWI page list
  * GROWI page list
  */
  */
@@ -124,6 +106,14 @@ ul.pagination {
   background-color: $bgcolor-subnabvar;
   background-color: $bgcolor-subnabvar;
 }
 }
 
 
+// Search drop down
+#search-typeahead-asynctypeahead {
+  background-color: $bgcolor-global;
+  .table {
+    background-color: transparent;
+  }
+}
+
 /*
 /*
  * GROWI on-edit
  * GROWI on-edit
  */
  */

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

@@ -1,5 +1,19 @@
 // determine optional variables
 // determine optional variables
 $bgcolor-subnabvar: darken($bgcolor-global, 3%) !default;
 $bgcolor-subnabvar: darken($bgcolor-global, 3%) !default;
+$color-table: $color-global !default;
+$bgcolor-table: null !default;
+$border-color-table: #dee2e6 !default;
+$color-table-hover: $color-table !default;
+$bgcolor-table-hover: rgba(black, 0.075) !default;
+
+// override bootstrap variables
+$table-color: $color-table;
+$table-bg: $bgcolor-table;
+$table-border-color: $border-color-table;
+$table-hover-color: $color-table-hover;
+$table-hover-bg: $bgcolor-table-hover;
+
+@import 'reboot-bootstrap-tables';
 
 
 /*
 /*
  * Form
  * Form

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

@@ -41,7 +41,6 @@ $nav-tabs-link-active-border-color: $bordercolor-nav-tabs-active;
 @import 'mixins/tables'; // comment out and use _reboot-bootstrap-tables instead -- 2020.05.28 Yuki Takei
 @import 'mixins/tables'; // comment out and use _reboot-bootstrap-tables instead -- 2020.05.28 Yuki Takei
 @import 'reboot-bootstrap-colors';
 @import 'reboot-bootstrap-colors';
 @import 'reboot-bootstrap-theme-colors';
 @import 'reboot-bootstrap-theme-colors';
-@import 'reboot-bootstrap-tables';
 @import 'reboot-bootstrap-nav';
 @import 'reboot-bootstrap-nav';
 @import 'reboot-toastr-colors';
 @import 'reboot-toastr-colors';
 
 

+ 36 - 0
src/client/styles/scss/theme/_reboot-bootstrap-tables.scss

@@ -5,6 +5,42 @@
 //
 //
 //
 //
 
 
+.table {
+  color: $table-color;
+  background-color: $table-bg; // Reset for nesting within parents with `background-color`.
+
+  th,
+  td {
+    border-top-color: $table-border-color;
+  }
+
+  thead th {
+    border-bottom-color: $table-border-color;
+  }
+
+  tbody + tbody {
+    border-top-color: $table-border-color;
+  }
+}
+
+.table-bordered {
+  border-color: $table-border-color;
+
+  th,
+  td {
+    border-color: $table-border-color;
+  }
+}
+
+.table-hover {
+  tbody tr {
+    @include hover() {
+      color: $table-hover-color;
+      background-color: $table-hover-bg;
+    }
+  }
+}
+
 .table-dark {
 .table-dark {
   color: $table-dark-color;
   color: $table-dark-color;
   background-color: $table-dark-bg;
   background-color: $table-dark-bg;

+ 7 - 0
src/client/styles/scss/theme/antarctic.scss

@@ -120,6 +120,13 @@ html[dark] {
   .table {
   .table {
     background-color: $themelight;
     background-color: $themelight;
   }
   }
+
+  #search-typeahead-asynctypeahead {
+    background-color: $bgcolor-global;
+    .table {
+      background-color: transparent;
+    }
+  }
 }
 }
 
 
 //== Dark Mode
 //== Dark Mode

+ 15 - 1
src/client/styles/scss/theme/default.scss

@@ -40,6 +40,14 @@ html[light] {
   // $color-list-active: $color-reversal; // optional
   // $color-list-active: $color-reversal; // optional
   // $bgcolor-list-active: $primary; // optional
   // $bgcolor-list-active: $primary; // optional
 
 
+  // Table colors
+  // $bgcolor-subnabvar: #; // optional
+  // $color-table: #; // optional
+  // $bgcolor-table: #; // optional
+  // $border-color-table: #; // optional
+  // $color-table-hover: #; // optional
+  // $bgcolor-table-hover: #; // optional
+
   // Navbar
   // Navbar
   $bgcolor-navbar: #2a2929;
   $bgcolor-navbar: #2a2929;
   $bgcolor-search-top-dropdown: #209fd8;
   $bgcolor-search-top-dropdown: #209fd8;
@@ -68,7 +76,6 @@ html[light] {
   // $bgcolor-subnabvar: #fafafa; // optional
   // $bgcolor-subnabvar: #fafafa; // optional
 
 
   // Tabs
   // Tabs
-  // $bordercolor-nav-tabs: #; // optional
   // $color-nav-tabs-link-active: #; //optional
   // $color-nav-tabs-link-active: #; //optional
   // $bordercolor-nav-tabs-hover: # # $bordercolor-nav-tabs; // optional
   // $bordercolor-nav-tabs-hover: # # $bordercolor-nav-tabs; // optional
   // $bordercolor-nav-tabs-active: # # $bgcolor-global; // optional
   // $bordercolor-nav-tabs-active: # # $bgcolor-global; // optional
@@ -126,6 +133,13 @@ html[dark] {
   $color-list-active: white; // optional
   $color-list-active: white; // optional
   // $bgcolor-list-active: $primary; // optional
   // $bgcolor-list-active: $primary; // optional
 
 
+  // Table colors
+  // $color-table: #; // optional
+  // $bgcolor-table: #; // optional
+  // $border-color-table: #; // optional
+  // $color-table-hover: #; // optional
+  // $bgcolor-table-hover: #; // optional
+
   // Navbar
   // Navbar
   $bgcolor-navbar: #2a2929;
   $bgcolor-navbar: #2a2929;
   $bgcolor-search-top-dropdown: $primary;
   $bgcolor-search-top-dropdown: $primary;

+ 32 - 45
src/client/styles/scss/theme/future.scss

@@ -1,12 +1,9 @@
 @import '../variables';
 @import '../variables';
 @import '../override-bootstrap-variables';
 @import '../override-bootstrap-variables';
 
 
+$primary: #00b5b7;
 $themecolor: #16282d;
 $themecolor: #16282d;
-$themelight: rgba(11, 79, 104, 0.616);
-$accentcolor: #66eddf;
-
-$primary: $themelight;
-$dark: darken($themecolor, 5%);
+$accentcolor: #00fff5;
 
 
 html[light],
 html[light],
 html[dark] {
 html[dark] {
@@ -16,16 +13,16 @@ html[dark] {
   $bgcolor-card: darken($themecolor, 5%);
   $bgcolor-card: darken($themecolor, 5%);
 
 
   // Font colors
   // Font colors
-  $color-global: lighten($themecolor, 35%);
-  $color-reversal: #eeeeee;
-  $color-header: #d9a364;
-  $color-link: lighten($primary, 20%);
+  $color-global: #95abba;
+  $color-reversal: $accentcolor;
+  $color-header: #95abba;
+  $color-link: $accentcolor;
   $color-link-hover: lighten($color-link, 20%);
   $color-link-hover: lighten($color-link, 20%);
-  $color-link-wiki: darken($themecolor, 5%);
+  $color-link-wiki: $accentcolor;
   $color-link-wiki-hover: darken($color-link-wiki, 5%);
   $color-link-wiki-hover: darken($color-link-wiki, 5%);
-  $color-link-nabvar: $color-reversal;
+  $color-link-nabvar: #a7a7a7;
   $color-inline-code: #c7254e; // optional
   $color-inline-code: #c7254e; // optional
-  $color-search: #050a0b;
+  $color-search: $primary;
 
 
   // List Group colors
   // List Group colors
   $color-list: $color-global;
   $color-list: $color-global;
@@ -35,18 +32,31 @@ html[dark] {
   $color-list-hover: $color-reversal;
   $color-list-hover: $color-reversal;
 
 
   // Navbar
   // Navbar
-  $bgcolor-navbar: #011414;
-  $border-color-navbar-gradient-left: #545fff;
-  $border-color-navbar-gradient-right: #00a6e5;
+  $bgcolor-navbar: #01181a;
+  $bgcolor-search-top-dropdown: #00c2c4;
+  $border-image-navbar: linear-gradient(90deg, #6cfff9 0%, #0034c1 45%, #6cfff9 100%);
 
 
   // Logo colors
   // Logo colors
   $bgcolor-logo: darken($themecolor, 10%);
   $bgcolor-logo: darken($themecolor, 10%);
-  $fillcolor-logo-mark: lighten($accentcolor, 15%);
+  $fillcolor-logo-mark: #dedede;
 
 
   // Sidebar
   // Sidebar
-  $bgcolor-sidebar: $bgcolor-navbar;
-  $color-sidebar-context: $color-reversal;
-  $bgcolor-sidebar-context: lighten($bgcolor-navbar, 10%);
+  $bgcolor-sidebar: #052e2f;
+  $bgcolor-sidebar-nav-item-active: rgba(#969494, 0.3); // optional
+  $text-shadow-sidebar-nav-item-active: 0px 0px 10px #969494; // optional
+
+  // Sidebar contents
+  $color-sidebar-context: #00c2c4;
+  $bgcolor-sidebar-context: #020b0b;
+
+  // Sidebar list group
+  $bgcolor-sidebar-list-group: #162126; // optional
+
+  // Sidebar resize button
+  $color-resize-button: #0E2329;
+  $bgcolor-resize-button: #00C2C4;
+  $color-resize-button-hover: #0E2329;
+  $bgcolor-resize-button-hover: lighten($bgcolor-resize-button, 5%);
 
 
   // Icon colors
   // Icon colors
   $color-editor-icons: $color-global;
   $color-editor-icons: $color-global;
@@ -79,31 +89,8 @@ html[dark] {
     }
     }
   }
   }
 
 
-  // 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%);
-      }
-    }
+  pre {
+    color: #95abba;
+    background-color: #1f1f22;
   }
   }
 }
 }

+ 32 - 30
src/client/styles/scss/theme/halloween.scss

@@ -23,6 +23,7 @@ $light: lighten($secondary, 10%);
   #wrapper > .navbar {
   #wrapper > .navbar {
     background-image: url(/images/themes/halloween/halloween-navbar.jpg);
     background-image: url(/images/themes/halloween/halloween-navbar.jpg);
   }
   }
+
   // add background-image
   // add background-image
   #page-wrapper,
   #page-wrapper,
   .page-editor-preview-container {
   .page-editor-preview-container {
@@ -43,33 +44,49 @@ html[dark] {
   $color-global: #e9af2b;
   $color-global: #e9af2b;
   $color-reversal: #eeeeee;
   $color-reversal: #eeeeee;
   // $color-header: #2b2b2b;
   // $color-header: #2b2b2b;
-  $color-link: lighten($primary, 20%);
+  $color-link: #aa97cb;
   $color-link-hover: lighten($color-link, 20%);
   $color-link-hover: lighten($color-link, 20%);
-  $color-link-wiki: lighten($primary, 20%);
+  $color-link-wiki: #aa97cb;
   $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: #a7a7a7;
   $color-inline-code: #c7254e; // optional
   $color-inline-code: #c7254e; // optional
 
 
   // List Group colors
   // List Group colors
-  $color-list: $color-global;
+  $color-list: #979797;
   $bgcolor-list: transparent;
   $bgcolor-list: transparent;
   $color-list-active: $color-reversal;
   $color-list-active: $color-reversal;
   $bgcolor-list-active: $primary;
   $bgcolor-list-active: $primary;
   $color-list-hover: $themecolor;
   $color-list-hover: $themecolor;
 
 
+  // Search Top
+  $color-search: $primary;
+
   // Navbar
   // Navbar
-  $bgcolor-navbar: #223344;
-  $border-color-navbar-gradient-left: #545fff;
-  $border-color-navbar-gradient-right: #00a6e5;
+  $bgcolor-navbar: #eceded;
+  $bgcolor-search-top-dropdown: $primary;
+  $border-image-navbar: linear-gradient(90deg, #e3b7ff 0%, #134774 100%);
 
 
   // Logo colors
   // Logo colors
   $bgcolor-logo: darken($themecolor, 10%);
   $bgcolor-logo: darken($themecolor, 10%);
-  $fillcolor-logo-mark: lighten($accentcolor, 15%);
+  $fillcolor-logo-mark: #dedede;
 
 
   // Sidebar
   // Sidebar
-  $bgcolor-sidebar: $bgcolor-navbar;
-  $color-sidebar-context: $color-reversal;
-  $bgcolor-sidebar-context: lighten($bgcolor-navbar, 10%);
+  $bgcolor-sidebar: #162b33;
+  $bgcolor-sidebar-nav-item-active: rgba(#969494, 0.3); // optional
+  $text-shadow-sidebar-nav-item-active: 0px 0px 10px #969494; // optional
+
+  // Sidebar contents
+  $color-sidebar-context: #aa97cb;
+  $bgcolor-sidebar-context: #1d2126;
+
+  // Sidebar list group
+  $bgcolor-sidebar-list-group: #2c2926; // optional
+
+  // Sidebar resize button
+  $color-resize-button: #effcfa;
+  $bgcolor-resize-button: $primary;
+  $color-resize-button-hover: #effcfa;
+  $bgcolor-resize-button-hover: lighten($bgcolor-resize-button, 5%);
 
 
   // Icon colors
   // Icon colors
   $color-editor-icons: $color-global;
   $color-editor-icons: $color-global;
@@ -99,25 +116,10 @@ html[dark] {
   .table {
   .table {
     color: $color-global;
     color: $color-global;
   }
   }
-  .table-bordered {
-    th,
-    td {
-      border: 1px solid $themecolor;
-    }
-  }
 
 
-  // Nav
-  .nav-tabs {
-    border-bottom: $bordercolor 1px solid;
-    .nav-link {
-      &:hover {
-        border: $bordercolor 1px solid;
-      }
-      &.active {
-        color: lighten($themecolor, 5%);
-        background-color: transparent;
-        border: $bordercolor 1px solid;
-      }
-    }
+  pre {
+    color: #edba4a;
+    background: #000000;
   }
   }
+
 }
 }

+ 1 - 1
src/server/routes/installer.js

@@ -38,7 +38,7 @@ module.exports = function(crowi, app) {
 
 
     // create /Sandbox/*
     // create /Sandbox/*
     promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox.md'), '/Sandbox', owner, lang));
     promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox.md'), '/Sandbox', owner, lang));
-    promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox-bootstrap4.md'), '/Sandbox/Bootstrap3', owner, lang));
+    promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox-bootstrap4.md'), '/Sandbox/Bootstrap4', owner, lang));
     promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox-diagrams.md'), '/Sandbox/Diagrams', owner, lang));
     promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox-diagrams.md'), '/Sandbox/Diagrams', owner, lang));
     promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox-math.md'), '/Sandbox/Math', owner, lang));
     promises.push(createPage(path.join(crowi.localeDir, lang, 'sandbox-math.md'), '/Sandbox/Math', owner, lang));
 
 

+ 2 - 0
src/server/views/invited.html

@@ -17,6 +17,8 @@
  {% endblock %}
  {% endblock %}
  {% block sidebar %}
  {% block sidebar %}
  {% endblock %}
  {% endblock %}
+ {% block head_warn_alert_siteurl_undefined %}
+ {% endblock %}
 
 
 
 
 
 

+ 1 - 1
src/server/views/layout-growi/user_page.html

@@ -27,7 +27,7 @@
         #   Because this block has content like 'Bookmarks' or 'Recent Created' whose height changes dynamically,
         #   Because this block has content like 'Bookmarks' or 'Recent Created' whose height changes dynamically,
         #   setting of 'revision-toc' (affix) is hindered.
         #   setting of 'revision-toc' (affix) is hindered.
         #}
         #}
-      <div class="m-b-30 user-page-content-container d-edit-none d-print-none">
+      <div class="mb-5 user-page-content-container d-edit-none d-print-none">
         {% include '../widget/user_page_content.html' %}
         {% include '../widget/user_page_content.html' %}
       </div>
       </div>
 
 

+ 1 - 1
src/server/views/layout-kibela/user_page.html

@@ -25,7 +25,7 @@
         #   Because this block has content like 'Bookmarks' or 'Recent Created' whose height changes dynamically,
         #   Because this block has content like 'Bookmarks' or 'Recent Created' whose height changes dynamically,
         #   setting of 'revision-toc' (affix) is hindered.
         #   setting of 'revision-toc' (affix) is hindered.
         #}
         #}
-      <div class="m-b-30 user-page-content-container d-edit-none">
+      <div class="mb-5 user-page-content-container d-edit-none">
         {% include '../widget/user_page_content.html' %}
         {% include '../widget/user_page_content.html' %}
       </div>
       </div>
 
 

+ 4 - 2
src/server/views/login.html

@@ -17,6 +17,8 @@
 {% endblock %}
 {% endblock %}
 {% block sidebar %}
 {% block sidebar %}
 {% endblock %}
 {% endblock %}
+{% block head_warn_alert_siteurl_undefined %}
+{% endblock %}
 
 
 {% block html_additional_headers %}
 {% block html_additional_headers %}
   <script src="{{ webpack_asset('js/nologin.js') }}" defer></script>
   <script src="{{ webpack_asset('js/nologin.js') }}" defer></script>
@@ -83,7 +85,7 @@
 
 
             {% if req.form.errors.length > 0 %}
             {% if req.form.errors.length > 0 %}
             <div class="alert alert-danger">
             <div class="alert alert-danger">
-              <ul>
+              <ul class="mb-0">
               {% for error in req.form.errors %}
               {% for error in req.form.errors %}
                 <li>{{ error }}</li>
                 <li>{{ error }}</li>
               {% endfor %}
               {% endfor %}
@@ -91,7 +93,7 @@
             </div>
             </div>
             {% endif %}
             {% endif %}
           </div>
           </div>
-          <div id="register-form-errors">
+          <div id="register-form-errors" class="px-3">
             {% set message = req.flash('registerWarningMessage') %}
             {% set message = req.flash('registerWarningMessage') %}
             {% if message.length %}
             {% if message.length %}
             <div class="alert alert-danger">
             <div class="alert alert-danger">