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

Merge branch 'dev/4.0.x' into support/apply-bootstrap4

itizawa 5 лет назад
Родитель
Сommit
edf8dc53d2
35 измененных файлов с 341 добавлено и 665 удалено
  1. 13 4
      CHANGES.md
  2. 1 1
      package.json
  3. 1 1
      resource/cdn-manifests.js
  4. 112 111
      resource/locales/en-US/sandbox.md
  5. 2 0
      resource/locales/en-US/translation.json
  6. 2 0
      resource/locales/ja/translation.json
  7. 2 2
      src/client/js/components/Admin/Common/AdminNavigation.jsx
  8. 1 1
      src/client/js/components/Admin/Security/GitHubSecuritySetting.jsx
  9. 1 1
      src/client/js/components/Admin/Security/GoogleSecuritySetting.jsx
  10. 2 2
      src/client/js/components/Admin/Security/OidcSecuritySetting.jsx
  11. 1 1
      src/client/js/components/Admin/Security/SamlSecuritySetting.jsx
  12. 1 1
      src/client/js/components/Admin/Security/TwitterSecuritySetting.jsx
  13. 2 2
      src/client/js/components/Admin/UserManagement.jsx
  14. 2 2
      src/client/js/components/Admin/Users/UserTable.jsx
  15. 13 2
      src/client/js/components/FormattedDistanceDate.jsx
  16. 5 6
      src/client/js/components/Sidebar.jsx
  17. 10 6
      src/client/js/components/Sidebar/CustomSidebar.jsx
  18. 7 6
      src/client/js/components/Sidebar/RecentChanges.jsx
  19. 37 22
      src/client/js/components/Sidebar/SidebarNav.jsx
  20. 0 19
      src/client/styles/scss/_layout.scss
  21. 10 0
      src/client/styles/scss/_navbar.scss
  22. 4 0
      src/client/styles/scss/_search.scss
  23. 71 14
      src/client/styles/scss/_sidebar.scss
  24. 1 1
      src/client/styles/scss/_variables.scss
  25. 1 423
      src/client/styles/scss/theme/_reboot-bootstrap-colors.scss
  26. 2 0
      src/client/styles/scss/theme/_reboot-bootstrap-theme-colors.scss
  27. 2 2
      src/server/views/admin/app.html
  28. 2 2
      src/server/views/admin/global-notification-detail.html
  29. 1 1
      src/server/views/admin/markdown.html
  30. 2 2
      src/server/views/admin/notification.html
  31. 2 2
      src/server/views/admin/search.html
  32. 3 3
      src/server/views/layout/layout.html
  33. 5 5
      src/server/views/modal/empty_trash.html
  34. 16 16
      src/server/views/widget/page_list.html
  35. 4 4
      yarn.lock

+ 13 - 4
CHANGES.md

@@ -18,11 +18,11 @@
 * Support: Upgrade libs
 * Support: Upgrade libs
     * bootstrap
     * bootstrap
 
 
-## v3.8.1-RC
+## v3.8.2-RC
 
 
-* Fix: Unset overflow-y style for Edit Tags Modal
+*
 
 
-## v3.8.0
+## v3.8.1
 
 
 ### BREAKING CHANGES
 ### BREAKING CHANGES
 
 
@@ -33,11 +33,20 @@ Upgrading Guide: <https://docs.growi.org/en/admin-guide/upgrading/38x.html>
 ### Updates
 ### Updates
 
 
 * Improvement: Change the health check method for Elasticsearch
 * Improvement: Change the health check method for Elasticsearch
+* Fix: Unset overflow-y style for Edit Tags Modal
+* Fix: Duplicate page source is overwrited
+    * Introduced by 3.7.6
 
 
-## v3.7.6
+## v3.8.0  (Missing number)
+
+## v3.7.7
 
 
 * Feature: Empty trash pages
 * Feature: Empty trash pages
 * Improvement: Behavior of Reconnect to Elasticsearch button
 * Improvement: Behavior of Reconnect to Elasticsearch button
+* Fix: Duplicate page source is overwrited
+    * Introduced by 3.7.6
+
+## v3.7.6  (Missing number)
 
 
 ## v3.7.5
 ## v3.7.5
 
 

+ 1 - 1
package.json

@@ -168,7 +168,7 @@
     "babel-loader": "^8.0.6",
     "babel-loader": "^8.0.6",
     "babel-plugin-lodash": "^3.3.4",
     "babel-plugin-lodash": "^3.3.4",
     "babel-plugin-transform-imports": "^2.0.0",
     "babel-plugin-transform-imports": "^2.0.0",
-    "bootstrap": "^4.4.1",
+    "bootstrap": "^4.5.0",
     "browser-bunyan": "^1.3.0",
     "browser-bunyan": "^1.3.0",
     "browser-sync": "^2.26.3",
     "browser-sync": "^2.26.3",
     "bunyan-debug": "^2.0.0",
     "bunyan-debug": "^2.0.0",

+ 1 - 1
resource/cdn-manifests.js

@@ -3,7 +3,7 @@ module.exports = {
     {
     {
       name: 'basis',
       name: 'basis',
       // eslint-disable-next-line max-len
       // eslint-disable-next-line max-len
-      url: 'https://cdn.jsdelivr.net/combine/npm/emojione@3.1.2,npm/jquery@3.4.0,npm/popper.js@1.15.0,npm/bootstrap@4.4.1/dist/js/bootstrap.min.js,npm/scrollpos-styler@0.7.1,npm/jquery-slimscroll@1.3.8/jquery.slimscroll.min.js',
+      url: 'https://cdn.jsdelivr.net/combine/npm/emojione@3.1.2,npm/jquery@3.4.0,npm/popper.js@1.15.0,npm/bootstrap@4.5.0/dist/js/bootstrap.min.js,npm/scrollpos-styler@0.7.1,npm/jquery-slimscroll@1.3.8/jquery.slimscroll.min.js',
       groups: ['basis'],
       groups: ['basis'],
       args: {
       args: {
         integrity: '',
         integrity: '',

+ 112 - 111
resource/locales/en-US/sandbox.md

@@ -1,7 +1,7 @@
 <div class="card">
 <div class="card">
   <div class="card-body">
   <div class="card-body">
 
 
-# 目次
+# Table of Contents
 
 
 ```
 ```
 @[toc]
 @[toc]
@@ -14,9 +14,9 @@
 
 
 # :pencil: Block Elements
 # :pencil: Block Elements
 
 
-## Headers 見出し
+## Headers
 
 
-先頭に`#`をレベルの数だけ記述します。
+Add one `#` per level at the start of the line
 
 
 ```
 ```
 # Header 1
 # Header 1
@@ -35,28 +35,29 @@
 
 
 ###### Header 6
 ###### Header 6
 
 
-## Block 段落
+## Block paragraph
 
 
-空白行を挟むことで段落となります。aaaa
+Pararaphs are created by inserting a newline character
+A paragraph can be created by pressing Enter at the end of the previous paragraph.
 
 
 ```
 ```
-段落1
-(空行)
-段落2
+paragraph1
+(Blank line)
+paragraph2
 ```
 ```
 
 
-段落1
+paragraph1
 
 
-段落2
+paragraph2
 
 
-## Br 改行
+## Br new line
 
 
-改行の前に半角スペース``を2つ記述します。
-***この挙動は、オプションで変更可能です***
+Add two spaces before break.
+***This behaviour can be modified in the options menu.***
 
 
 ```
 ```
 hoge
 hoge
-fuga(スペース2つ)
+fuga(two spaces)
 piyo
 piyo
 ```
 ```
 
 
@@ -64,31 +65,31 @@ hoge
 fuga
 fuga
 piyo
 piyo
 
 
-## Blockquotes 引用
+## Blockquotes
 
 
-先頭に`>`を記述します。ネストは`>`を多重に記述します。
+Add one `>` per level at the start of the line
 
 
 ```
 ```
-> 引用
-> 引用
->> 多重引用
+> quote
+> quote
+>> nested quotes
 ```
 ```
 
 
-> 引用
-> 引用
->> 多重引用
+> quote
+> quote
+>> nested quotes
 
 
-## Code コード
+## Code
 
 
-`` `バッククオート` `` 3つ、あるいはチルダ`~`3つで囲みます。
+Wrap code with three back quotes or tildes.
 
 
 ```
 ```
 print 'hoge'
 print 'hoge'
 ```
 ```
 
 
-### シンタックスハイライトとファイル名
+### Syntax highlight and file name
 
 
-- [highlight.js Demo](https://highlightjs.org/static/demo/) の common カテゴリ内の言語に対応しています
+- corresponding [highlight.js Demo](https://highlightjs.org/static/demo/) of common category
 
 
 
 
 ~~~
 ~~~
@@ -115,19 +116,19 @@ function MersenneTwister(seed) {
 }
 }
 ```
 ```
 
 
-### インラインコード
+### Inline code
 
 
-`` `バッククオート` `` で単語を囲むとインラインコードになります。
+Words wrapped by `` `back quotes` `` will be formatted as inline code.
 
 
 ```
 ```
-これは `インラインコード`です。
+This is `Inline Code`.
 ```
 ```
 
 
-これは `インラインコード`です。
+This is  `Inline Code`.
 
 
-## pre 整形済みテキスト
+## Pre-arranged text
 
 
-半角スペース4個もしくはタブで、コードブロックをpre表示できます
+Code blocks should be preceded by four spaces or one tab.
 
 
 ```
 ```
     class Hoge
     class Hoge
@@ -143,9 +144,9 @@ function MersenneTwister(seed) {
         end
         end
     end
     end
 
 
-## Hr 水平線
+## Horizontal Line
 
 
-アンダースコア`_` 、アスタリスク`*`を3つ以上連続して記述します。
+Write three underscores `_`, or asterisks`*`.
 
 
 ```
 ```
 ***
 ***
@@ -161,47 +162,47 @@ ___
 
 
 # :pencil: Typography
 # :pencil: Typography
 
 
-## 強調
+## Strong Text
 
 
-### em
+### Italic
 
 
-アスタリスク`*`もしくはアンダースコア`_`1個で文字列を囲みます。
+To italicize text, add One asterisk or underscores before and after a word or phrase.
 
 
 ```
 ```
-これは *イタリック* です
-これは _イタリック_ です
+This is *Italic* .
+This is _Italic_ .
 ```
 ```
 
 
-これは *イタリック* です
-これは _イタリック_ です
+This is *Italic* .
+This is _Italic_ .
 
 
-### strong
+### Bold
 
 
-アスタリスク`*`もしくはアンダースコア`_`2個で文字列を囲みます。
+To bold text, add two asterisks or underscores before and after a word or phrase.
 
 
 ```
 ```
-これは **ボールド** です
-これは __ボールド__ です
+This is **bold**.
+This is __bold__.
 ```
 ```
 
 
-これは **ボールド** です
-これは __ボールド__ です
+This is **bold**.
+This is __bold__.
 
 
-### em + strong
+### Bold + Italic
 
 
-アスタリスク`*`もしくはアンダースコア`_`3個で文字列を囲みます。
+To bold and italicize text, add three asterisks or underscores before and after a word or phrase.
 
 
 ```
 ```
-これは ***イタリック&ボールド*** です
-これは ___イタリック&ボールド___ です
+This is ***Italic & Bold***.
+This is ___Italic & Bold___.
 ```
 ```
 
 
-これは ***イタリック&ボールド*** です
-これは ___イタリック&ボールド___ です
+This is ***Italic & Bold***.
+This is ___Italic & Bold___.
 
 
 # :pencil: Images
 # :pencil: Images
 
 
-`![Alt文字列](URL)` で`<img>`タグを挿入できます。
+You can insert `<img>` tag using `![description](URL)`.
 
 
 ```markdown
 ```markdown
 ![Minion](https://octodex.github.com/images/minion.png)
 ![Minion](https://octodex.github.com/images/minion.png)
@@ -211,7 +212,7 @@ ___
 ![Minion](https://octodex.github.com/images/minion.png)
 ![Minion](https://octodex.github.com/images/minion.png)
 ![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat")
 ![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat")
 
 
-画像の大きさなどの指定をする場合はimgタグを使用します。
+The size of the image can be set by using an HTML image tag
 
 
 ```html
 ```html
 <img src="https://octodex.github.com/images/dojocat.jpg" width="200px">
 <img src="https://octodex.github.com/images/dojocat.jpg" width="200px">
@@ -222,9 +223,9 @@ ___
 
 
 # :pencil: Link
 # :pencil: Link
 
 
-## Markdown 標準
+## Markdown standard
 
 
-`[表示テキスト](URL)`でリンクに変換されます。
+You can create links using `[Display text](URL)`.
 
 
 ```
 ```
 [Google](https://www.google.co.jp/)
 [Google](https://www.google.co.jp/)
@@ -232,7 +233,7 @@ ___
 
 
 [Google](https://www.google.co.jp/)
 [Google](https://www.google.co.jp/)
 
 
-## Crowi 互換
+## Crowi compatibility
 
 
 ```
 ```
 [/Sandbox]
 [/Sandbox]
@@ -247,80 +248,80 @@ ___
 (available by [weseek/growi-plugin-pukiwiki-like-linker
 (available by [weseek/growi-plugin-pukiwiki-like-linker
 ](https://github.com/weseek/growi-plugin-pukiwiki-like-linker) )
 ](https://github.com/weseek/growi-plugin-pukiwiki-like-linker) )
 
 
-最も柔軟な Linker です。
-記述中のページを基点とした相対リンクと、表示テキストに対するリンクを同時に実現できます。
+This is the most flexible linker.
+Both the page description and link address can be displayed on the page.
 
 
 ```
 ```
 [[./Bootstrap3]]
 [[./Bootstrap3]]
-Bootstrap3のExampleは[[こちら>./Bootstrap3]]
+Example of Bootstrap3 is[[here>./Bootstrap3]]
 ```
 ```
 
 
 [[../user]]
 [[../user]]
-Bootstrap3のExampleは[[こちら>./Bootstrap3]]
+Example of Bootstrap3 is[[here>./Bootstrap3]]
 
 
 # :pencil: Lists
 # :pencil: Lists
 
 
-## Ul 箇条書きリスト
+## Ul Bulleted list
 
 
-ハイフン`-`、プラス`+`、アスタリスク`*`のいずれかを先頭に記述します。
-ネストはタブで表現します。
+To create an unordered list, add dashes (-), asterisks (*), or plus signs (+) in front of line items. 
+Items can be nested using indentation.
 
 
 ```
 ```
-- リスト1
-    - リスト1_1
-        - リスト1_1_1
-        - リスト1_1_2
-    - リスト1_2
-- リスト2
-- リスト3
+- List1
+    - List1_1
+        - List1_1_1
+        - List1_1_2
+    - List1_2
+- List2
+- List3
 ```
 ```
 
 
-- リスト1
-    - リスト1_1
-        - リスト1_1_1
-        - リスト1_1_2
-    - リスト1_2
-- リスト2
-- リスト3
+- List1
+    - List1_1
+        - List1_1_1
+        - List1_1_2
+    - List1_2
+- List2
+- List3
 
 
-## Ol 番号付きリスト
+## Ol Numbered List
 
 
-`番号.`を先頭に記述します。ネストはタブで表現します。
-番号は自動的に採番されるため、すべての行を1.と記述するのがお勧めです。
+To create an ordered list, add line items with numbers followed by periods. 
+The numbers don’t have to be in numerical order, but the list should start with the number one.
 
 
 ```
 ```
-1. 番号付きリスト1
-    1. 番号付きリスト1-1
-    1. 番号付きリスト1-2
-1. 番号付きリスト2
-1. 番号付きリスト3
+1. Number list 1
+    1. Number list 1-1
+    1. Number list 1-2
+1. Number list 2
+1. Number list 3
 ```
 ```
 
 
-1. 番号付きリスト1
-    1. 番号付きリスト1-1
-    1. 番号付きリスト1-2
-1. 番号付きリスト2
-1. 番号付きリスト3
+1. Number list 1
+    1. Number list 1-1
+    1. Number list 1-2
+1. Number list 2
+1. Number list 3
 
 
 
 
-## タスクリスト
+## Check list
 
 
 ```
 ```
-- [ ] タスク 1
-    - [x] タスク 1.1
-    - [ ] タスク 1.2
-- [x] タスク2
+- [ ] Task 1
+    - [x] Task 1.1
+    - [ ] Task 1.2
+- [x] Task2
 ```
 ```
 
 
-- [ ] タスク 1
-    - [x] タスク 1.1
-    - [ ] タスク 1.2
-- [x] タスク2
+- [ ] Task 1
+    - [x] Task 1.1
+    - [ ] Task 1.2
+- [x] Task2
 
 
 
 
 # :pencil: Table
 # :pencil: Table
 
 
-## Markdown 標準
+## Markdown Standard
 
 
 ```markdown
 ```markdown
 | Left align | Right align | Center align |
 | Left align | Right align | Center align |
@@ -353,7 +354,7 @@ aligned    | aligned     | aligned
 | left       | right       | center       |
 | left       | right       | center       |
 | aligned    | aligned     | aligned      |
 | aligned    | aligned     | aligned      |
 
 
-## TSV (crowi-plus 独自記法)
+## TSV (crowi-plus notation)
 
 
 ```
 ```
 ::: tsv
 ::: tsv
@@ -367,7 +368,7 @@ Content Cell Content Cell
 Content Cell Content Cell
 Content Cell Content Cell
 :::
 :::
 
 
-## TSV ヘッダ付き (crowi-plus 独自記法)
+## TSV with header (crowi-plus notation)
 
 
 ```
 ```
 ::: tsv-h
 ::: tsv-h
@@ -383,7 +384,7 @@ Content Cell Content Cell
 Content Cell Content Cell
 Content Cell Content Cell
 :::
 :::
 
 
-## CSV (crowi-plus 独自記法)
+## CSV (crowi-plus original notation)
 
 
 ```
 ```
 ::: csv
 ::: csv
@@ -397,7 +398,7 @@ Content Cell,Content Cell
 Content Cell,Content Cell
 Content Cell,Content Cell
 :::
 :::
 
 
-## CSV ヘッダ付き (crowi-plus 独自記法)
+## CSV with header (crowi-plus original notation)
 
 
 ```
 ```
 ::: csv-h
 ::: csv-h
@@ -416,15 +417,15 @@ Content Cell,Content Cell
 
 
 # :pencil: Footnote
 # :pencil: Footnote
 
 
-脚注への参照[^1]を書くことができます。また、インラインの脚注^[インラインで記述できる脚注です]を入れる事も出来ます。
+You can write a reference [^1] to a footnote. You can also add an inline footnote^[Inline_footnote].
 
 
-長い脚注は[^longnote]のように書くことができます。
+Long footnotes can be written as [^longnote].
 
 
-[^1]: 1つめの脚注への参照です。
+[^1]: A_reference_to_the_first_footnote.
 
 
-[^longnote]: 脚注を複数ブロックで書く例です。
+[^longnote]: An_example_of_writing_a_footnote_in_multiple_blocks.
 
 
-    後続の段落はインデントされて、前の脚注に属します。
+    Subsequent paragraphs are indented and belong to the previous footnote.
 
 
 
 
 # :pencil: Emoji
 # :pencil: Emoji

+ 2 - 0
resource/locales/en-US/translation.json

@@ -130,6 +130,8 @@
   "Deleted Pages": "Deleted Pages",
   "Deleted Pages": "Deleted Pages",
   "Sign out": "Logout",
   "Sign out": "Logout",
   "Disassociate": "Disassociate",
   "Disassociate": "Disassociate",
+  "Recent Created": "Recent Created",
+  "Recent Changes": "Recent Changes",
   "form_validation": {
   "form_validation": {
     "error_message": "Some values ​​are incorrect",
     "error_message": "Some values ​​are incorrect",
     "required": "%s is required",
     "required": "%s is required",

+ 2 - 0
resource/locales/ja/translation.json

@@ -129,6 +129,8 @@
   "Deleted Pages": "削除済みページ",
   "Deleted Pages": "削除済みページ",
   "Sign out": "ログアウト",
   "Sign out": "ログアウト",
   "Disassociate": "連携解除",
   "Disassociate": "連携解除",
+  "Recent Created": "最新の作成",
+  "Recent Changes": "最新の変更",
   "form_validation": {
   "form_validation": {
     "error_message": "いくつかの値が設定されていません",
     "error_message": "いくつかの値が設定されていません",
     "required": "%sに値を入力してください",
     "required": "%sに値を入力してください",

+ 2 - 2
src/client/js/components/Admin/Common/AdminNavigation.jsx

@@ -19,7 +19,7 @@ const AdminNavigation = (props) => {
           href="/admin"
           href="/admin"
           className={`${pageTransitionClassName} ${pathname === '/admin' && 'active'}`}
           className={`${pageTransitionClassName} ${pathname === '/admin' && 'active'}`}
         >
         >
-          <i className="icon-fw icon-home"></i> {t('Management Wiki Home')}
+          <i className="icon-fw icon-home"></i> {t('Wiki Management Home Page')}
         </a>
         </a>
         <a
         <a
           href="/admin/app"
           href="/admin/app"
@@ -100,7 +100,7 @@ const AdminNavigation = (props) => {
           aria-expanded="false"
           aria-expanded="false"
         >
         >
           <span className="float-left"><i className="icon-fw icon-home"></i>
           <span className="float-left"><i className="icon-fw icon-home"></i>
-            {pathname === '/admin' && t('Management Wiki Home')}
+            {pathname === '/admin' && t('Wiki Management Home Page')}
             {pathname === '/admin/app' && t('App Settings')}
             {pathname === '/admin/app' && t('App Settings')}
             {pathname === '/admin/security' && t('security_settings')}
             {pathname === '/admin/security' && t('security_settings')}
             {pathname === '/admin/markdown' && t('Markdown Settings')}
             {pathname === '/admin/markdown' && t('Markdown Settings')}

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

@@ -102,7 +102,7 @@ class GitHubSecurityManagement extends React.Component {
                 <i
                 <i
                   className="icon-exclamation"
                   className="icon-exclamation"
                   // eslint-disable-next-line max-len
                   // eslint-disable-next-line max-len
-                  dangerouslySetInnerHTML={{ __html: t('security_setting.alert_siteUrl_is_not_set', { link: `<a href="/admin/app">${t('App settings')}<i class="icon-login"></i></a>` }) }}
+                  dangerouslySetInnerHTML={{ __html: t('security_setting.alert_siteUrl_is_not_set', { link: `<a href="/admin/app">${t('App Settings')}<i class="icon-login"></i></a>` }) }}
                 />
                 />
               </div>
               </div>
             )}
             )}

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

@@ -102,7 +102,7 @@ class GoogleSecurityManagement extends React.Component {
                 <i
                 <i
                   className="icon-exclamation"
                   className="icon-exclamation"
                   // eslint-disable-next-line max-len
                   // eslint-disable-next-line max-len
-                  dangerouslySetInnerHTML={{ __html: t('security_setting.alert_siteUrl_is_not_set', { link: `<a href="/admin/app">${t('App settings')}<i class="icon-login"></i></a>` }) }}
+                  dangerouslySetInnerHTML={{ __html: t('security_setting.alert_siteUrl_is_not_set', { link: `<a href="/admin/app">${t('App Settings')}<i class="icon-login"></i></a>` }) }}
                 />
                 />
               </div>
               </div>
             )}
             )}

+ 2 - 2
src/client/js/components/Admin/Security/OidcSecuritySetting.jsx

@@ -97,7 +97,7 @@ class OidcSecurityManagement extends React.Component {
                 <i
                 <i
                   className="icon-exclamation"
                   className="icon-exclamation"
                   // eslint-disable-next-line max-len
                   // eslint-disable-next-line max-len
-                  dangerouslySetInnerHTML={{ __html: t('security_setting.alert_siteUrl_is_not_set', { link: `<a href="/admin/app">${t('App settings')}<i class="icon-login"></i></a>` }) }}
+                  dangerouslySetInnerHTML={{ __html: t('security_setting.alert_siteUrl_is_not_set', { link: `<a href="/admin/app">${t('App Settings')}<i class="icon-login"></i></a>` }) }}
                 />
                 />
               </div>
               </div>
             )}
             )}
@@ -253,7 +253,7 @@ class OidcSecurityManagement extends React.Component {
                     <i
                     <i
                       className="icon-exclamation"
                       className="icon-exclamation"
                       // eslint-disable-next-line max-len
                       // eslint-disable-next-line max-len
-                      dangerouslySetInnerHTML={{ __html: t('security_setting.alert_siteUrl_is_not_set', { link: `<a href="/admin/app">${t('App settings')}<i class="icon-login"></i></a>` }) }}
+                      dangerouslySetInnerHTML={{ __html: t('security_setting.alert_siteUrl_is_not_set', { link: `<a href="/admin/app">${t('App Settings')}<i class="icon-login"></i></a>` }) }}
                     />
                     />
                   </div>
                   </div>
                 )}
                 )}

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

@@ -124,7 +124,7 @@ class SamlSecurityManagement extends React.Component {
                 <i
                 <i
                   className="icon-exclamation"
                   className="icon-exclamation"
                   // eslint-disable-next-line max-len
                   // eslint-disable-next-line max-len
-                  dangerouslySetInnerHTML={{ __html: t('security_setting.alert_siteUrl_is_not_set', { link: `<a href="/admin/app">${t('App settings')}<i class="icon-login"></i></a>` }) }}
+                  dangerouslySetInnerHTML={{ __html: t('security_setting.alert_siteUrl_is_not_set', { link: `<a href="/admin/app">${t('App Settings')}<i class="icon-login"></i></a>` }) }}
                 />
                 />
               </div>
               </div>
             )}
             )}

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

@@ -102,7 +102,7 @@ class TwitterSecurityManagement extends React.Component {
                 <i
                 <i
                   className="icon-exclamation"
                   className="icon-exclamation"
                   // eslint-disable-next-line max-len
                   // eslint-disable-next-line max-len
-                  dangerouslySetInnerHTML={{ __html: t('security_setting.alert_siteUrl_is_not_set', { link: `<a href="/admin/app">${t('App settings')}<i class="icon-login"></i></a>` }) }}
+                  dangerouslySetInnerHTML={{ __html: t('security_setting.alert_siteUrl_is_not_set', { link: `<a href="/admin/app">${t('App Settings')}<i class="icon-login"></i></a>` }) }}
                 />
                 />
               </div>
               </div>
             )}
             )}

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

@@ -174,11 +174,11 @@ class UserManagement extends React.Component {
 
 
             <div className="col-md-6 my-2">
             <div className="col-md-6 my-2">
               <div className="form-inline">
               <div className="form-inline">
-                {this.renderCheckbox('all', 'All', 'primary')}
+                {this.renderCheckbox('all', 'All', 'secondary')}
                 {this.renderCheckbox('registered', 'Approval Pending', 'info')}
                 {this.renderCheckbox('registered', 'Approval Pending', 'info')}
                 {this.renderCheckbox('active', 'Active', 'success')}
                 {this.renderCheckbox('active', 'Active', 'success')}
                 {this.renderCheckbox('suspended', 'Suspended', 'warning')}
                 {this.renderCheckbox('suspended', 'Suspended', 'warning')}
-                {this.renderCheckbox('invited', 'Invited', 'info')}
+                {this.renderCheckbox('invited', 'Invited', 'pink')}
               </div>
               </div>
               <div>
               <div>
                 {
                 {

+ 2 - 2
src/client/js/components/Admin/Users/UserTable.jsx

@@ -50,7 +50,7 @@ class UserTable extends React.Component {
         text = 'Deleted';
         text = 'Deleted';
         break;
         break;
       case 5:
       case 5:
-        additionalClassName = 'badge-info';
+        additionalClassName = 'badge-pink';
         text = 'Invited';
         text = 'Invited';
         break;
         break;
     }
     }
@@ -71,7 +71,7 @@ class UserTable extends React.Component {
     const { t } = this.props;
     const { t } = this.props;
 
 
     if (isAdmin) {
     if (isAdmin) {
-      return <span className="badge badge-primary badge-pill ml-2">{t('admin:user_management.user_table.administrator')}</span>;
+      return <span className="badge badge-indigo badge-pill ml-2">{t('admin:user_management.user_table.administrator')}</span>;
     }
     }
   }
   }
 
 

+ 13 - 2
src/client/js/components/FormattedDistanceDate.jsx

@@ -1,7 +1,7 @@
 import React from 'react';
 import React from 'react';
 import PropTypes from 'prop-types';
 import PropTypes from 'prop-types';
 
 
-import { format, formatDistanceStrict } from 'date-fns';
+import { format, formatDistanceStrict, differenceInSeconds } from 'date-fns';
 import { UncontrolledTooltip } from 'reactstrap';
 import { UncontrolledTooltip } from 'reactstrap';
 
 
 const FormattedDistanceDate = (props) => {
 const FormattedDistanceDate = (props) => {
@@ -11,9 +11,15 @@ const FormattedDistanceDate = (props) => {
 
 
   const baseDate = props.baseDate || new Date();
   const baseDate = props.baseDate || new Date();
 
 
-  const elemId = `grw-fdd-${props.id}`;
   const dateFormatted = format(date, 'yyyy/MM/dd HH:mm');
   const dateFormatted = format(date, 'yyyy/MM/dd HH:mm');
 
 
+  const diff = Math.abs(differenceInSeconds(date, baseDate));
+  if (diff > props.differenceForAvoidingFormat) {
+    return <>{dateFormatted}</>;
+  }
+
+  const elemId = `grw-fdd-${props.id}`;
+
   return (
   return (
     <>
     <>
       <span id={elemId}>{formatDistanceStrict(date, baseDate)}</span>
       <span id={elemId}>{formatDistanceStrict(date, baseDate)}</span>
@@ -26,6 +32,11 @@ FormattedDistanceDate.propTypes = {
   id: PropTypes.string.isRequired,
   id: PropTypes.string.isRequired,
   date: PropTypes.oneOfType([PropTypes.string, PropTypes.instanceOf(Date)]).isRequired,
   date: PropTypes.oneOfType([PropTypes.string, PropTypes.instanceOf(Date)]).isRequired,
   baseDate: PropTypes.instanceOf(Date),
   baseDate: PropTypes.instanceOf(Date),
+  // the number(sec) from 'baseDate' to avoid format
+  differenceForAvoidingFormat: PropTypes.number,
+};
+FormattedDistanceDate.defaultProps = {
+  differenceForAvoidingFormat: 86400 * 3,
 };
 };
 
 
 export default FormattedDistanceDate;
 export default FormattedDistanceDate;

+ 5 - 6
src/client/js/components/Sidebar.jsx

@@ -14,7 +14,7 @@ import { createSubscribedElement } from './UnstatedUtils';
 import AppContainer from '../services/AppContainer';
 import AppContainer from '../services/AppContainer';
 
 
 import SidebarNav from './Sidebar/SidebarNav';
 import SidebarNav from './Sidebar/SidebarNav';
-import History from './Sidebar/History';
+import RecentChanges from './Sidebar/RecentChanges';
 import CustomSidebar from './Sidebar/CustomSidebar';
 import CustomSidebar from './Sidebar/CustomSidebar';
 
 
 
 
@@ -28,7 +28,7 @@ class Sidebar extends React.Component {
   };
   };
 
 
   state = {
   state = {
-    currentContentsId: 'custom',
+    currentContentsId: 'recent',
   };
   };
 
 
   componentWillMount() {
   componentWillMount() {
@@ -103,11 +103,11 @@ class Sidebar extends React.Component {
   );
   );
 
 
   renderSidebarContents = () => {
   renderSidebarContents = () => {
-    let contents = <CustomSidebar></CustomSidebar>;
+    let contents = <CustomSidebar />;
 
 
     switch (this.state.currentContentsId) {
     switch (this.state.currentContentsId) {
-      case 'history':
-        contents = <History></History>;
+      case 'recent':
+        contents = <RecentChanges />;
         break;
         break;
     }
     }
 
 
@@ -136,7 +136,6 @@ class Sidebar extends React.Component {
               // experimental_fullWidthFlyout
               // experimental_fullWidthFlyout
               shouldHideGlobalNavShadow
               shouldHideGlobalNavShadow
               showContextualNavigation
               showContextualNavigation
-              topOffset={50}
             >
             >
             </LayoutManager>
             </LayoutManager>
           </ThemeProvider>
           </ThemeProvider>

+ 10 - 6
src/client/js/components/Sidebar/CustomSidebar.jsx

@@ -25,23 +25,27 @@ class CustomSidebar extends React.Component {
 
 
   render() {
   render() {
     return (
     return (
-      <>
+      <div className="grw-sidebar-custom">
         <HeaderSection>
         <HeaderSection>
           { () => (
           { () => (
-            <div className="grw-sidebar-header-container">
-              {this.renderHeaderWordmark()}
+            <div className="grw-sidebar-header-container p-3 d-flex">
+              <h3>Custom Sidebar</h3>
+              <button type="button" className="btn btn-xs btn-outline-secondary ml-auto" onClick={this.reloadData}>
+                <i className="icon icon-reload"></i>
+              </button>
             </div>
             </div>
           ) }
           ) }
         </HeaderSection>
         </HeaderSection>
         <MenuSection>
         <MenuSection>
           { () => (
           { () => (
-            <div className="grw-sidebar-content-container">
-              <span>(TBD) CustomSidebar Contents</span>
+            <div className="grw-sidebar-content-container p-3">
+              (TBD) Under implementation
             </div>
             </div>
           ) }
           ) }
         </MenuSection>
         </MenuSection>
-      </>
+      </div>
     );
     );
+
   }
   }
 
 
 }
 }

+ 7 - 6
src/client/js/components/Sidebar/History.jsx → src/client/js/components/Sidebar/RecentChanges.jsx

@@ -22,7 +22,7 @@ import FormattedDistanceDate from '../FormattedDistanceDate';
 import UserPicture from '../User/UserPicture';
 import UserPicture from '../User/UserPicture';
 
 
 const logger = loggerFactory('growi:History');
 const logger = loggerFactory('growi:History');
-class History extends React.Component {
+class RecentChanges extends React.Component {
 
 
   static propTypes = {
   static propTypes = {
     t: PropTypes.func.isRequired, // i18next
     t: PropTypes.func.isRequired, // i18next
@@ -89,8 +89,9 @@ class History extends React.Component {
         <HeaderSection>
         <HeaderSection>
           { () => (
           { () => (
             <div className="grw-sidebar-header-container p-3 d-flex">
             <div className="grw-sidebar-header-container p-3 d-flex">
-              <h3>{t('History')}</h3>
-              <button type="button" className="btn xs btn-secondary ml-auto" onClick={this.reloadData}>
+              <h3>{t('Recent Changes')}</h3>
+              {/* <h3>{t('Recent Created')}</h3> */} {/* TODO: impl switching */}
+              <button type="button" className="btn btn-xs btn-outline-secondary ml-auto" onClick={this.reloadData}>
                 <i className="icon icon-reload"></i>
                 <i className="icon icon-reload"></i>
               </button>
               </button>
             </div>
             </div>
@@ -114,8 +115,8 @@ class History extends React.Component {
 /**
 /**
  * Wrapper component for using unstated
  * Wrapper component for using unstated
  */
  */
-const HistoryWrapper = (props) => {
-  return createSubscribedElement(History, props, [AppContainer]);
+const RecentChangesWrapper = (props) => {
+  return createSubscribedElement(RecentChanges, props, [AppContainer]);
 };
 };
 
 
-export default withTranslation()(HistoryWrapper);
+export default withTranslation()(RecentChangesWrapper);

+ 37 - 22
src/client/js/components/Sidebar/SidebarNav.jsx

@@ -5,7 +5,6 @@ import { withTranslation } from 'react-i18next';
 
 
 import {
 import {
   GlobalNav,
   GlobalNav,
-  GlobalItem,
 } from '@atlaskit/navigation-next';
 } from '@atlaskit/navigation-next';
 
 
 import { createSubscribedElement } from '../UnstatedUtils';
 import { createSubscribedElement } from '../UnstatedUtils';
@@ -29,34 +28,32 @@ class SidebarNav extends React.Component {
     }
     }
   }
   }
 
 
-  generatePrimaryItemObj(id, label, icon) {
+  generatePrimaryItemObj(id, label, iconClassNames) {
     const isSelected = this.props.currentContentsId === id;
     const isSelected = this.props.currentContentsId === id;
 
 
     return {
     return {
       id,
       id,
       component: ({ className }) => (
       component: ({ className }) => (
         <div className={`${className} grw-global-item-container ${isSelected ? 'active' : ''}`}>
         <div className={`${className} grw-global-item-container ${isSelected ? 'active' : ''}`}>
-          <GlobalItem
-            icon={icon}
-            label={label}
-            isSelected={isSelected}
+          <button
+            type="button"
+            className="btn btn-primary btn-lg"
             onClick={() => this.itemSelectedHandler(id)}
             onClick={() => this.itemSelectedHandler(id)}
-          />
+          >
+            <i className={iconClassNames}></i>
+          </button>
         </div>
         </div>
       ),
       ),
     };
     };
   }
   }
 
 
-  generateSecondaryItemObj(id, label, icon, href) {
+  generateSecondaryItemObj(id, label, iconClassNames, href, isBlank, isHiddenOnLargeDevice) {
     return {
     return {
       id,
       id,
       component: ({ className }) => (
       component: ({ className }) => (
-        <div className={`${className} grw-global-item-container d-block d-md-none`}>
-          <a href={href}>
-            <GlobalItem
-              icon={icon}
-              label={label}
-            />
+        <div className={`${className} grw-global-item-container ${isHiddenOnLargeDevice ? 'd-block d-md-none' : ''}`}>
+          <a href={href} className="btn btn-primary btn-lg" target={`${isBlank ? '_blank' : ''}`}>
+            <i className={iconClassNames}></i>
           </a>
           </a>
         </div>
         </div>
       ),
       ),
@@ -68,22 +65,40 @@ class SidebarNav extends React.Component {
   }
   }
 
 
   render() {
   render() {
+    const { isAdmin, currentUsername } = this.props.appContainer;
+
+    const primaryItems = [
+      this.generatePrimaryItemObj('custom', 'Custom Sidebar', 'fa fa-code'),
+      this.generatePrimaryItemObj('recent', 'Recent Changes', 'icon-clock'),
+      // this.generatePrimaryItemObj('tag', 'Tags', 'icon-tag'),
+      // this.generatePrimaryItemObj('favorite', 'Favorite', 'icon-star'),
+    ];
+
+    const secondaryItems = [
+      this.generateSecondaryItemObj('draft', 'Draft', 'icon-docs', `/user/${currentUsername}#user-draft-list`),
+      this.generateSecondaryItemObj('help', 'Help', 'icon-question', 'https://docs.growi.org', true),
+      this.generateSecondaryItemObj('trash', 'Trash', 'icon-trash', '/trash'),
+    ];
+    if (isAdmin) {
+      secondaryItems.unshift( // add to the beginning
+        this.generateSecondaryItemObj('admin', 'Admin', 'icon-settings', '/admin', false, true),
+      );
+    }
+
     return (
     return (
       <GlobalNav
       <GlobalNav
-        primaryItems={[
-          this.generatePrimaryItemObj('custom', 'Custom Sidebar', this.generateIconFactory('fa fa-code')),
-          this.generatePrimaryItemObj('history', 'History', this.generateIconFactory('icon-clock')),
-        ]}
-        secondaryItems={[
-          this.generateSecondaryItemObj('admin', 'Admin', this.generateIconFactory('icon-settings'), '/admin'),
-          this.generateSecondaryItemObj('help', 'Help', this.generateIconFactory('icon-question'), 'https://docs.growi.org'),
-        ]}
+        primaryItems={primaryItems}
+        secondaryItems={secondaryItems}
       />
       />
     );
     );
   }
   }
 
 
 }
 }
 
 
+SidebarNav.propTypes = {
+  appContainer: PropTypes.instanceOf(AppContainer).isRequired,
+};
+
 /**
 /**
  * Wrapper component for using unstated
  * Wrapper component for using unstated
  */
  */

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

@@ -1,24 +1,5 @@
 @import 'layout_variable';
 @import 'layout_variable';
 
 
-%fukidashi-for-active {
-  position: relative;
-
-  // speech balloon
-  &:after {
-    position: absolute;
-    top: 0.5em;
-    right: -1em;
-    display: block;
-    width: 0;
-    content: '';
-    border: 1em solid transparent;
-    border-left-width: 0;
-
-    // @include media-breakpoint-down(xs) {
-    // }
-  }
-}
-
 // FIXME: replace with mt-2 or mt-3
 // FIXME: replace with mt-2 or mt-3
 .grw-mt-10px {
 .grw-mt-10px {
   margin-top: 10px !important;
   margin-top: 10px !important;

+ 10 - 0
src/client/styles/scss/_navbar.scss

@@ -6,6 +6,16 @@
     font-size: 1.5em;
     font-size: 1.5em;
   }
   }
 
 
+  .grw-navbar-search {
+    left: $grw-logo-width + 19px;
+
+    @include media-breakpoint-up(lg) {
+      position: absolute;
+      left: 50%;
+      transform: translate(-50%, 0%);
+    }
+  }
+
   .nav-link,
   .nav-link,
   .nav-item.confidential {
   .nav-item.confidential {
     display: flex;
     display: flex;

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

@@ -110,6 +110,10 @@
     &.focus {
     &.focus {
       width: 300px;
       width: 300px;
     }
     }
+
+    @include media-breakpoint-up(xl) {
+      width: 300px;
+    }
   }
   }
 }
 }
 
 

+ 71 - 14
src/client/styles/scss/_sidebar.scss

@@ -1,4 +1,22 @@
 .grw-sidebar {
 .grw-sidebar {
+  $sidebar-nav-button-height: 55px;
+
+  %fukidashi-for-active {
+    position: relative;
+
+    // speech balloon
+    &:after {
+      position: absolute;
+      right: -0.1em;
+      display: block;
+      width: 0;
+      content: '';
+      border: 9px solid transparent;
+      border-left-width: 0;
+      transform: translateY(-#{$sidebar-nav-button-height / 2});
+    }
+  }
+
   .ak-navigation-resize-button {
   .ak-navigation-resize-button {
     // locate to the center of screen
     // locate to the center of screen
     top: calc(50vh - 20px);
     top: calc(50vh - 20px);
@@ -30,32 +48,71 @@
   }
   }
 
 
   // override @atlaskit/navigation-next styles
   // override @atlaskit/navigation-next styles
+  $navbar-total-height: $grw-navbar-height + $grw-navbar-border-width;
+  div[class$='-LayoutContainer'] {
+    height: calc(100vh - #{$navbar-total-height});
+    margin-top: $navbar-total-height;
+  }
   div[class$='-NavigationContainer'] {
   div[class$='-NavigationContainer'] {
+    top: $navbar-total-height;
+
     // 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;
   }
   }
-
-  .grw-global-item-container {
-    i {
-      font-size: 1.5em;
+  div[data-testid='GlobalNavigation'] {
+    > div {
+      height: calc(100vh - #{$navbar-total-height});
+      padding-top: 0;
+    }
+  }
+  div[class$='-Outer'] {
+    width: 0;
+  }
+  div[class$='-PrimaryItemsList'],
+  div[class$='-SecondaryItemsList'] {
+    > div {
+      padding: 0;
     }
     }
 
 
-    // icon opacity
-    &:not(.active) {
-      i {
-        opacity: 0.4;
+    .grw-global-item-container {
+      width: unset;
+      height: unset;
+      background-color: transparent;
+      border-radius: 0;
+
+      .btn {
+        width: $grw-sidebar-nav-width;
+        border-radius: 0;
       }
       }
-      &:hover,
-      &:focus {
+
+      // icon opacity
+      &:not(.active) {
         i {
         i {
-          opacity: 0.7;
+          opacity: 0.4;
+        }
+        &:hover,
+        &:focus {
+          i {
+            opacity: 0.7;
+          }
         }
         }
       }
       }
     }
     }
+  }
+  div[class$='-PrimaryItemsList'] {
+    .grw-global-item-container {
+      .btn-lg {
+        height: $sidebar-nav-button-height;
 
 
-    &.active {
-      button {
-        @extend %fukidashi-for-active;
+        i {
+          font-size: 1.5em;
+        }
+      }
+
+      &.active {
+        button {
+          @extend %fukidashi-for-active;
+        }
       }
       }
     }
     }
   }
   }

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

@@ -7,7 +7,7 @@ $font-family-monospace-not-strictly: Monaco, Menlo, Consolas, 'Courier New', Mei
 
 
 //== Layout
 //== Layout
 $grw-navbar-height: 52px;
 $grw-navbar-height: 52px;
-$grw-navbar-border-width: 3px;
+$grw-navbar-border-width: 3.3333px;
 
 
 $grw-sidebar-nav-width: 64px; // !!DO NOT CHANGE!! 'margin-left' for '.css-teprsg' is hardcoded
 $grw-sidebar-nav-width: 64px; // !!DO NOT CHANGE!! 'margin-left' for '.css-teprsg' is hardcoded
 $grw-sidebar-content-min-width: 240px;
 $grw-sidebar-content-min-width: 240px;

+ 1 - 423
src/client/styles/scss/theme/_reboot-bootstrap-colors.scss

@@ -1,47 +1,12 @@
 //
 //
 //
 //
 // Apply partially
 // Apply partially
-//   https://github.com/twbs/bootstrap/blob/v4.4.1/scss/_reboot.scss
+//   https://github.com/twbs/bootstrap/blob/v4.5.0/scss/_reboot.scss
 //
 //
 //
 //
 
 
 // stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix
 // stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix
 
 
-// Reboot
-//
-// Normalization of HTML elements, manually forked from Normalize.css to remove
-// styles targeting irrelevant browsers while applying new styles.
-//
-// Normalize is licensed MIT. https://github.com/necolas/normalize.css
-
-// Document
-//
-// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.
-// 2. Change the default font family in all browsers.
-// 3. Correct the line height in all browsers.
-// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.
-// 5. Change the default tap highlight to be completely transparent in iOS.
-
-// *,
-// *::before,
-// *::after {
-//   box-sizing: border-box; // 1
-// }
-
-// html {
-//   font-family: sans-serif; // 2
-//   line-height: 1.15; // 3
-//   -webkit-text-size-adjust: 100%; // 4
-//   -webkit-tap-highlight-color: rgba($black, 0); // 5
-// }
-
-// Shim for "new" HTML5 structural elements to display correctly (IE10, older browsers)
-// TODO: remove in v5
-// stylelint-disable-next-line selector-list-comma-newline-after
-// article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
-//   display: block;
-// }
-
 // Body
 // Body
 //
 //
 // 1. Remove the margin in all browsers.
 // 1. Remove the margin in all browsers.
@@ -60,128 +25,6 @@ body {
   background-color: $body-bg; // 2
   background-color: $body-bg; // 2
 }
 }
 
 
-// Future-proof rule: in browsers that support :focus-visible, suppress the focus outline
-// on elements that programmatically receive focus but wouldn't normally show a visible
-// focus outline. In general, this would mean that the outline is only applied if the
-// interaction that led to the element receiving programmatic focus was a keyboard interaction,
-// or the browser has somehow determined that the user is primarily a keyboard user and/or
-// wants focus outlines to always be presented.
-//
-// See https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible
-// and https://developer.paciellogroup.com/blog/2018/03/focus-visible-and-backwards-compatibility/
-// [tabindex="-1"]:focus:not(:focus-visible) {
-//   outline: 0 !important;
-// }
-
-// Content grouping
-//
-// 1. Add the correct box sizing in Firefox.
-// 2. Show the overflow in Edge and IE.
-
-// hr {
-//   box-sizing: content-box; // 1
-//   height: 0; // 1
-//   overflow: visible; // 2
-// }
-
-//
-// Typography
-//
-
-// Remove top margins from headings
-//
-// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top
-// margin for easier control within type scales as it avoids margin collapsing.
-// stylelint-disable-next-line selector-list-comma-newline-after
-// h1, h2, h3, h4, h5, h6 {
-//   margin-top: 0;
-//   margin-bottom: $headings-margin-bottom;
-// }
-
-// Reset margins on paragraphs
-//
-// Similarly, the top margin on `<p>`s get reset. However, we also reset the
-// bottom margin to use `rem` units instead of `em`.
-// p {
-//   margin-top: 0;
-//   margin-bottom: $paragraph-margin-bottom;
-// }
-
-// Abbreviations
-//
-// 1. Duplicate behavior to the data-* attribute for our tooltip plugin
-// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
-// 3. Add explicit cursor to indicate changed behavior.
-// 4. Remove the bottom border in Firefox 39-.
-// 5. Prevent the text-decoration to be skipped.
-
-// abbr[title],
-// abbr[data-original-title] { // 1
-//   text-decoration: underline; // 2
-//   text-decoration: underline dotted; // 2
-//   cursor: help; // 3
-//   border-bottom: 0; // 4
-//   text-decoration-skip-ink: none; // 5
-// }
-
-// address {
-//   margin-bottom: 1rem;
-//   font-style: normal;
-//   line-height: inherit;
-// }
-
-// ol,
-// ul,
-// dl {
-//   margin-top: 0;
-//   margin-bottom: 1rem;
-// }
-
-// ol ol,
-// ul ul,
-// ol ul,
-// ul ol {
-//   margin-bottom: 0;
-// }
-
-// dt {
-//   font-weight: $dt-font-weight;
-// }
-
-// dd {
-//   margin-bottom: .5rem;
-//   margin-left: 0; // Undo browser default
-// }
-
-// blockquote {
-//   margin: 0 0 1rem;
-// }
-
-// b,
-// strong {
-//   font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari
-// }
-
-// small {
-//   @include font-size(80%); // Add the correct font size in all browsers
-// }
-
-//
-// Prevent `sub` and `sup` elements from affecting the line height in
-// all browsers.
-//
-
-// sub,
-// sup {
-//   position: relative;
-//   @include font-size(75%);
-//   line-height: 0;
-//   vertical-align: baseline;
-// }
-
-// sub { bottom: -.25em; }
-// sup { top: -.5em; }
-
 //
 //
 // Links
 // Links
 //
 //
@@ -211,268 +54,3 @@ a {
 //     text-decoration: none;
 //     text-decoration: none;
 //   }
 //   }
 // }
 // }
-
-//
-// Code
-//
-
-// pre,
-// code,
-// kbd,
-// samp {
-//   font-family: $font-family-monospace;
-//   @include font-size(1em); // Correct the odd `em` font sizing in all browsers.
-// }
-
-// pre {
-//   // Remove browser default top margin
-//   margin-top: 0;
-//   // Reset browser default of `1em` to use `rem`s
-//   margin-bottom: 1rem;
-//   // Don't allow content to break outside
-//   overflow: auto;
-// }
-
-//
-// Figures
-//
-
-// figure {
-//   // Apply a consistent margin strategy (matches our type styles).
-//   margin: 0 0 1rem;
-// }
-
-//
-// Images and content
-//
-
-// img {
-//   vertical-align: middle;
-//   border-style: none; // Remove the border on images inside links in IE 10-.
-// }
-
-// svg {
-//   // Workaround for the SVG overflow bug in IE10/11 is still required.
-//   // See https://github.com/twbs/bootstrap/issues/26878
-//   overflow: hidden;
-//   vertical-align: middle;
-// }
-
-//
-// Tables
-//
-
-// table {
-//   border-collapse: collapse; // Prevent double borders
-// }
-
-// caption {
-//   padding-top: $table-cell-padding;
-//   padding-bottom: $table-cell-padding;
-//   color: $table-caption-color;
-//   text-align: left;
-//   caption-side: bottom;
-// }
-
-// th {
-//   // Matches default `<td>` alignment by inheriting from the `<body>`, or the
-//   // closest parent with a set `text-align`.
-//   text-align: inherit;
-// }
-
-//
-// Forms
-//
-
-// label {
-//   // Allow labels to use `margin` for spacing.
-//   display: inline-block;
-//   margin-bottom: $label-margin-bottom;
-// }
-
-// Remove the default `border-radius` that macOS Chrome adds.
-//
-// Details at https://github.com/twbs/bootstrap/issues/24093
-// button {
-//   // stylelint-disable-next-line property-blacklist
-//   border-radius: 0;
-// }
-
-// Work around a Firefox/IE bug where the transparent `button` background
-// results in a loss of the default `button` focus styles.
-//
-// Credit: https://github.com/suitcss/base/
-// button:focus {
-//   outline: 1px dotted;
-//   outline: 5px auto -webkit-focus-ring-color;
-// }
-
-// input,
-// button,
-// select,
-// optgroup,
-// textarea {
-//   margin: 0; // Remove the margin in Firefox and Safari
-//   font-family: inherit;
-//   @include font-size(inherit);
-//   line-height: inherit;
-// }
-
-// button,
-// input {
-//   overflow: visible; // Show the overflow in Edge
-// }
-
-// button,
-// select {
-//   text-transform: none; // Remove the inheritance of text transform in Firefox
-// }
-
-// Remove the inheritance of word-wrap in Safari.
-//
-// Details at https://github.com/twbs/bootstrap/issues/24990
-// select {
-//   word-wrap: normal;
-// }
-
-// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
-//    controls in Android 4.
-// 2. Correct the inability to style clickable types in iOS and Safari.
-// button,
-// [type="button"], // 1
-// [type="reset"],
-// [type="submit"] {
-//   -webkit-appearance: button; // 2
-// }
-
-// Opinionated: add "hand" cursor to non-disabled button elements.
-// @if $enable-pointer-cursor-for-buttons {
-//   button,
-//   [type="button"],
-//   [type="reset"],
-//   [type="submit"] {
-//     &:not(:disabled) {
-//       cursor: pointer;
-//     }
-//   }
-// }
-
-// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.
-// button::-moz-focus-inner,
-// [type="button"]::-moz-focus-inner,
-// [type="reset"]::-moz-focus-inner,
-// [type="submit"]::-moz-focus-inner {
-//   padding: 0;
-//   border-style: none;
-// }
-
-// input[type="radio"],
-// input[type="checkbox"] {
-//   box-sizing: border-box; // 1. Add the correct box sizing in IE 10-
-//   padding: 0; // 2. Remove the padding in IE 10-
-// }
-
-// input[type="date"],
-// input[type="time"],
-// input[type="datetime-local"],
-// input[type="month"] {
-//   // Remove the default appearance of temporal inputs to avoid a Mobile Safari
-//   // bug where setting a custom line-height prevents text from being vertically
-//   // centered within the input.
-//   // See https://bugs.webkit.org/show_bug.cgi?id=139848
-//   // and https://github.com/twbs/bootstrap/issues/11266
-//   -webkit-appearance: listbox;
-// }
-
-// textarea {
-//   overflow: auto; // Remove the default vertical scrollbar in IE.
-//   // Textareas should really only resize vertically so they don't break their (horizontal) containers.
-//   resize: vertical;
-// }
-
-// fieldset {
-//   // Browsers set a default `min-width: min-content;` on fieldsets,
-//   // unlike e.g. `<div>`s, which have `min-width: 0;` by default.
-//   // So we reset that to ensure fieldsets behave more like a standard block element.
-//   // See https://github.com/twbs/bootstrap/issues/12359
-//   // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements
-//   min-width: 0;
-//   // Reset the default outline behavior of fieldsets so they don't affect page layout.
-//   padding: 0;
-//   margin: 0;
-//   border: 0;
-// }
-
-// 1. Correct the text wrapping in Edge and IE.
-// 2. Correct the color inheritance from `fieldset` elements in IE.
-// legend {
-//   display: block;
-//   width: 100%;
-//   max-width: 100%; // 1
-//   padding: 0;
-//   margin-bottom: .5rem;
-//   @include font-size(1.5rem);
-//   line-height: inherit;
-//   color: inherit; // 2
-//   white-space: normal; // 1
-// }
-
-// progress {
-//   vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.
-// }
-
-// Correct the cursor style of increment and decrement buttons in Chrome.
-// [type="number"]::-webkit-inner-spin-button,
-// [type="number"]::-webkit-outer-spin-button {
-//   height: auto;
-// }
-
-// [type="search"] {
-//   // This overrides the extra rounded corners on search inputs in iOS so that our
-//   // `.form-control` class can properly style them. Note that this cannot simply
-//   // be added to `.form-control` as it's not specific enough. For details, see
-//   // https://github.com/twbs/bootstrap/issues/11586.
-//   outline-offset: -2px; // 2. Correct the outline style in Safari.
-//   -webkit-appearance: none;
-// }
-
-//
-// Remove the inner padding in Chrome and Safari on macOS.
-//
-
-// [type="search"]::-webkit-search-decoration {
-//   -webkit-appearance: none;
-// }
-
-//
-// 1. Correct the inability to style clickable types in iOS and Safari.
-// 2. Change font properties to `inherit` in Safari.
-//
-
-// ::-webkit-file-upload-button {
-//   font: inherit; // 2
-//   -webkit-appearance: button; // 1
-// }
-
-//
-// Correct element displays
-//
-
-// output {
-//   display: inline-block;
-// }
-
-// summary {
-//   display: list-item; // Add the correct display in all browsers
-//   cursor: pointer;
-// }
-
-// template {
-//   display: none; // Add the correct display in IE
-// }
-
-// Always hide an element with the `hidden` HTML attribute (from PureCSS).
-// Needed for proper display in IE 10-.
-// [hidden] {
-//   display: none !important;
-// }

+ 2 - 0
src/client/styles/scss/theme/_reboot-bootstrap-theme-colors.scss

@@ -1,3 +1,5 @@
+$theme-colors: map-merge($theme-colors, $colors);
+
 @each $color, $value in $theme-colors {
 @each $color, $value in $theme-colors {
   @include bg-variant('.bg-#{$color}', $value);
   @include bg-variant('.bg-#{$color}', $value);
 }
 }

+ 2 - 2
src/server/views/admin/app.html

@@ -1,12 +1,12 @@
 {% extends '../layout/admin.html' %}
 {% extends '../layout/admin.html' %}
 
 
-{% block html_title %}{{ customizeService.generateCustomTitle(t('App settings')) }}{% endblock %}
+{% block html_title %}{{ customizeService.generateCustomTitle(t('App Settings')) }}{% endblock %}
 
 
 {% block head_warn_alert_siteurl_undefined %} {# remove including block for './widget/alert_siteurl_undefined.html' #}
 {% block head_warn_alert_siteurl_undefined %} {# remove including block for './widget/alert_siteurl_undefined.html' #}
 {% endblock %}
 {% endblock %}
 
 
 {% block content_header %}
 {% block content_header %}
-<h1 class="title">{{ t('App settings') }}</h1>
+<h1 class="title">{{ t('App Settings') }}</h1>
 {% endblock %}
 {% endblock %}
 
 
 
 

+ 2 - 2
src/server/views/admin/global-notification-detail.html

@@ -1,9 +1,9 @@
 {% extends '../layout/admin.html' %}
 {% extends '../layout/admin.html' %}
 
 
-{% block html_title %}{{ customizeService.generateCustomTitle(t('Notification settings')) }}{% endblock %}
+{% block html_title %}{{ customizeService.generateCustomTitle(t('Notification Settings')) }}{% endblock %}
 
 
 {% block content_header %}
 {% block content_header %}
-<h1 class="title">{{ t('Notification settings') }}</h1>
+<h1 class="title">{{ t('Notification Settings') }}</h1>
 {% endblock %}
 {% endblock %}
 
 
 {% block content_main %}
 {% block content_main %}

+ 1 - 1
src/server/views/admin/markdown.html

@@ -1,6 +1,6 @@
 {% extends '../layout/admin.html' %}
 {% extends '../layout/admin.html' %}
 
 
-{% block html_title %}{{ customizeService.generateCustomTitle(t('Markdown settings')) }}{% endblock %}
+{% block html_title %}{{ customizeService.generateCustomTitle(t('Markdown Settings')) }}{% endblock %}
 
 
 {% block content_header %}
 {% block content_header %}
 <h1 class="title">{{ t('Markdown Settings') }}</h1>
 <h1 class="title">{{ t('Markdown Settings') }}</h1>

+ 2 - 2
src/server/views/admin/notification.html

@@ -1,9 +1,9 @@
 {% extends '../layout/admin.html' %}
 {% extends '../layout/admin.html' %}
 
 
-{% block html_title %}{{ customizeService.generateCustomTitle(t('Notification settings')) }}{% endblock %}
+{% block html_title %}{{ customizeService.generateCustomTitle(t('Notification Settings')) }}{% endblock %}
 
 
 {% block content_header %}
 {% block content_header %}
-<h1 class="title">{{ t('Notification settings') }}</h1>
+<h1 class="title">{{ t('Notification Settings') }}</h1>
 {% endblock %}
 {% endblock %}
 
 
 {% block content_main %}
 {% block content_main %}

+ 2 - 2
src/server/views/admin/search.html

@@ -1,9 +1,9 @@
 {% extends '../layout/admin.html' %}
 {% extends '../layout/admin.html' %}
 
 
-{% block html_title %}{{ customizeService.generateCustomTitle(t('Full Text Search management')) }}{% endblock %}
+{% block html_title %}{{ customizeService.generateCustomTitle(t('Full Text Search Management')) }}{% endblock %}
 
 
 {% block content_header %}
 {% block content_header %}
-<h1 class="title">{{ t('Full Text Search management') }}</h1>
+<h1 class="title">{{ t('Full Text Search Management') }}</h1>
 {% endblock %}
 {% endblock %}
 
 
 {% block content_main %}
 {% block content_main %}

+ 3 - 3
src/server/views/layout/layout.html

@@ -80,14 +80,14 @@
     </ul>
     </ul>
 
 
     {# Brand Logo #}
     {# Brand Logo #}
-    <div class="navbar-brand mr-md-auto">
+    <div class="navbar-brand mr-0">
       <a class="grw-logo d-block" href="/">
       <a class="grw-logo d-block" href="/">
         {% include '../widget/logo.html' %}
         {% include '../widget/logo.html' %}
       </a>
       </a>
     </div>
     </div>
 
 
-    {# Navbar Center #}
-    <ul class="navbar-nav d-none d-md-block">
+    {# Search #}
+    <ul class="navbar-nav grw-navbar-search d-none d-md-block position-absolute">
       <li>
       <li>
         {% if isSearchServiceConfigured() %}
         {% if isSearchServiceConfigured() %}
         <div class="search-top" role="search" id="search-top"></div>
         <div class="search-top" role="search" id="search-top"></div>

+ 5 - 5
src/server/views/modal/empty_trash.html

@@ -14,15 +14,15 @@
         <ul>
         <ul>
           {% for data in pages %}
           {% for data in pages %}
             {% if pagePropertyName %}
             {% if pagePropertyName %}
-              {% set page = data[pagePropertyName] %}
+              {% set deletePage = data[pagePropertyName] %}
             {% else %}
             {% else %}
-              {% set page = data %}
+              {% set deletePage = data %}
             {% endif %}
             {% endif %}
             <li>
             <li>
-              <img src="{{ page.lastUpdateUser|picture }}" class="picture img-circle">
-              <a href="{{ page.path }}"
+              <img src="{{ deletePage.lastUpdateUser|picture }}" class="picture img-circle">
+              <a href="{{ deletePage.path }}"
                 class="page-list-link"
                 class="page-list-link"
-                data-path="{{ page.path }}">{{ decodeURIComponent(page.path) }}
+                data-path="{{ deletePage.path }}">{{ decodeURIComponent(deletePage.path) }}
               </a>
               </a>
             </li>
             </li>
           {% endfor %}
           {% endfor %}

+ 16 - 16
src/server/views/widget/page_list.html

@@ -2,44 +2,44 @@
 {% for data in pages %}
 {% for data in pages %}
 
 
 {% if pagePropertyName %}
 {% if pagePropertyName %}
-  {% set page = data[pagePropertyName] %}
+  {% set listPage = data[pagePropertyName] %}
 {% else %}
 {% else %}
-  {% set page = data %}
+  {% set listPage = data %}
 {% endif %}
 {% endif %}
 
 
 <li>
 <li>
-  <img src="{{ page.lastUpdateUser|picture }}" class="picture rounded-circle">
-  <a href="{{ encodeURI(page.path) }}" class="text-break ml-1">
-    {{ page.path | preventXss }}
+  <img src="{{ listPage.lastUpdateUser|picture }}" class="picture rounded-circle">
+  <a href="{{ encodeURI(listPage.path) }}" class="text-break ml-1">
+    {{ listPage.path | preventXss }}
   </a>
   </a>
   <span class="page-list-meta">
   <span class="page-list-meta">
-    {% if page.isTopPage() %}
+    {% if listPage.isTopPage() %}
       <span class="badge badge-info">TOP</span>
       <span class="badge badge-info">TOP</span>
     {% endif  %}
     {% endif  %}
 
 
-    {% if page.isTemplate() %}
+    {% if listPage.isTemplate() %}
       <span class="badge badge-info">TMPL</span>
       <span class="badge badge-info">TMPL</span>
     {% endif  %}
     {% endif  %}
 
 
-    {% if page.commentCount > 0 %}
+    {% if listPage.commentCount > 0 %}
     <span>
     <span>
-      <i class="icon-bubble"></i>{{ page.commentCount }}
+      <i class="icon-bubble"></i>{{ listPage.commentCount }}
     </span>
     </span>
     {% endif  %}
     {% endif  %}
 
 
-    {% if page.liker.length > 0 %}
-    <span class="page-list-liker" data-count="{{ page.liker.length }}">
-      <i class="icon-like"></i>{{ page.liker.length }}
+    {% if listPage.liker.length > 0 %}
+    <span class="page-list-liker" data-count="{{ listPage.liker.length }}">
+      <i class="icon-like"></i>{{ listPage.liker.length }}
     </span>
     </span>
     {% endif  %}
     {% endif  %}
 
 
-    {% if viewConfig.seener_threshold and page.seenUsers.length >= viewConfig.seener_threshold %}
-    <span class="page-list-seer" data-count="{{ page.seenUsers.length }}">
-      <i class="fa fa-paw"></i>{{ page.seenUsers.length }}
+    {% if viewConfig.seener_threshold and listPage.seenUsers.length >= viewConfig.seener_threshold %}
+    <span class="page-list-seer" data-count="{{ listPage.seenUsers.length }}">
+      <i class="fa fa-paw"></i>{{ listPage.seenUsers.length }}
     </span>
     </span>
     {% endif  %}
     {% endif  %}
 
 
-    {% if !page.isPublic() %}
+    {% if !listPage.isPublic() %}
     <span>
     <span>
       <i class="icon icon-lock"></i>
       <i class="icon icon-lock"></i>
     </span>
     </span>

+ 4 - 4
yarn.lock

@@ -3040,10 +3040,10 @@ boom@5.x.x:
   dependencies:
   dependencies:
     hoek "4.x.x"
     hoek "4.x.x"
 
 
-bootstrap@^4.4.1:
-  version "4.4.1"
-  resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.4.1.tgz#8582960eea0c5cd2bede84d8b0baf3789c3e8b01"
-  integrity sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==
+bootstrap@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.0.tgz#97d9dbcb5a8972f8722c9962483543b907d9b9ec"
+  integrity sha512-Z93QoXvodoVslA+PWNdk23Hze4RBYIkpb5h8I2HY2Tu2h7A0LpAgLcyrhrSUyo2/Oxm2l1fRZPs1e5hnxnliXA==
 
 
 brace-expansion@^1.1.7:
 brace-expansion@^1.1.7:
   version "1.1.8"
   version "1.1.8"