diff --git a/.github/workflows/mediawiki.yml b/.github/workflows/mediawiki.yml
index 802dc662..08aa0d8f 100644
--- a/.github/workflows/mediawiki.yml
+++ b/.github/workflows/mediawiki.yml
@@ -40,7 +40,7 @@ jobs:
# Check for changed files
- name: Check for PHP changes
id: changed-php
- uses: tj-actions/changed-files@v34
+ uses: tj-actions/changed-files@v35
with:
since_last_remote_commit: "true"
files: |
@@ -48,7 +48,7 @@ jobs:
- name: Check for script changes
id: changed-script
- uses: tj-actions/changed-files@v34
+ uses: tj-actions/changed-files@v35
with:
since_last_remote_commit: "true"
files: |
@@ -56,7 +56,7 @@ jobs:
- name: Check for stylesheet changes
id: changed-stylesheet
- uses: tj-actions/changed-files@v34
+ uses: tj-actions/changed-files@v35
with:
since_last_remote_commit: "true"
files: |
@@ -67,7 +67,7 @@ jobs:
- name: Check for i18n changes
id: changed-i18n
- uses: tj-actions/changed-files@v34
+ uses: tj-actions/changed-files@v35
with:
since_last_remote_commit: "true"
files: |
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b19625bc..81671460 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,31 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+## [2.3.0](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/compare/v2.2.0...v2.3.0) (2022-12-14)
+
+
+### Features
+
+* **AdvancedSearch:** ✨ update AdvancedSearch styles ([88fca93](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/88fca93c469f7e2918b3b68a6a0381f4a3e5e800))
+* **core:** ✨ align inconsistent search styles ([653ba19](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/653ba1913051ef11306de4fd8bda4cc56f44d37b))
+* **core:** ✨ deprecate background-color-framed and input ([37cdf91](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/37cdf912571cd8b3b4c19cc45a09b123d0b83476))
+* **core:** ✨ do not hardcode min-width for page tools menu ([0187478](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/0187478d1aa69bfa2f699fb4790cadc8491c98fd))
+* **core:** ✨ do not set fieldset font size ([224c190](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/224c190a475e5079e5e0e8332442643c5e2b571f))
+* **core:** ✨ dynamic dark theme color based on primary hue ([3414d59](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/3414d5964375de829c129c39d680ef3c9e6b743b))
+* **core:** ✨ tweak notification styles ([529fe22](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/529fe221de103bf68302f06cf5a3e941f2206e04))
+* **MediaSearch:** ✨ add grade A support for MediaSearch ([9b9916d](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/9b9916d61bea955f3208e2f1fdb728b63918c66b))
+* **search:** ✨ add MediaSearch to typeahead ([203b0b4](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/203b0b42c3a388684a51f231d993788632b92ae8))
+
+
+### Bug Fixes
+
+* **AdvancedSearch:** 🐛 1px layout shift in preloader ([3517453](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/351745374155fe292dd487f0e6f3ea6dd3782765))
+* **core:** 🐛 do not make search create and exist link into a card ([80a35ea](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/80a35ea571f8d7ef864b332add827368bc9b0440))
+* **core:** 🐛 do not use CSS containment for body content ([7a59e9c](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/7a59e9c2d720d99a4fe0aa31b2ff83b1c56922b9))
+* **core:** 🐛 incorrect z-index in changelist title ([c4bd384](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/c4bd3842358920752d8f0abf5a768846b1b2f03f))
+* **search:** 🐛 do not collapse whitespace in label text node ([c2da5c5](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/c2da5c5ade34d0895932a0d120908f02fadb0a28))
+* **search:** 🐛 incorrect full text search URL ([074df52](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/074df5272c2cc7739967ded992b48e5bf45da806))
+
## [2.2.0](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/compare/v2.1.0...v2.2.0) (2022-12-08)
### Features
diff --git a/README.md b/README.md
index 82e4772e..8e0fa349 100644
--- a/README.md
+++ b/README.md
@@ -39,7 +39,7 @@ OOUI | A | 0.44.3 | 2022-11-30
Name | Grade | Version | Last updated
:--- | :--- | :--- | :---
-[AdvancedSearch](https://www.mediawiki.org/wiki/Extension:AdvancedSearch) | B | REL1_35 `fae6250` | 2021-08-26
+[AdvancedSearch](https://www.mediawiki.org/wiki/Extension:AdvancedSearch) | B | REL1_39 `3a0eed7` | 2022-12-12
[AJAXPoll](https://www.mediawiki.org/wiki/Extension:AJAXPoll) | A | REL1_39 `8429d8d` | 2022-10-25
[ApprovedRevs](https://www.mediawiki.org/wiki/Extension:Approved_Revs) | B | N/A | N/A
[Babel](https://www.mediawiki.org/wiki/Extension:Babel) | B | MLEB 2021.07 | 2021-07-29
@@ -49,6 +49,7 @@ Name | Grade | Version | Last updated
[CentralNotice](https://www.mediawiki.org/wiki/Extension:CentralNotice) | B | REL1_35 `4aa2a8f` | 2022-06-16
[Cite](https://www.mediawiki.org/wiki/Extension:Cite) | A | N/A | N/A
[CleanChanges](https://www.mediawiki.org/wiki/Extension:CleanChanges) | B | MLEB 2021.07 | 2021-07-29
+[CodeEditor](https://www.mediawiki.org/wiki/Extension:CodeEditor) | A | REL1_39 `67c012c` | 2022-12-15
[CodeMirror](https://www.mediawiki.org/wiki/Extension:CodeMirror) | A | REL1_35 `a326407` | 2021-08-25
[CookieWarning](https://www.mediawiki.org/wiki/Extension:CookieWarning) | A | REL1_35 `3c2ae6a` | 2022-04-29
[DiscussionTools](https://www.mediawiki.org/wiki/Extension:DiscussionTools) | A | REL1_35 `7aa0a9b` | 2022-05-06
diff --git a/i18n/bn.json b/i18n/bn.json
index 7c0f2fbe..5af8fc2b 100644
--- a/i18n/bn.json
+++ b/i18n/bn.json
@@ -11,7 +11,7 @@
"citizen-action-addsection": "আলোচনা যোগ করুন",
"citizen-jumptotop": "উপরে চলুন",
"citizen-search-fulltext": "এটি থাকা পাতাগুলিতে অনুসন্ধান করুন:",
- "citizen-search-fulltext-empty": "অনুসন্ধান শুরু করতে কিছু লিখুন",
+ "citizen-search-empty-desc": "অনুসন্ধান শুরু করতে কিছু লিখুন",
"citizen-tagline-ns-mediawiki": "মিডিয়াউইকি ইন্টারফেস পাতা",
"citizen-tagline-ns-template": "টেমপ্লেট পাতা",
"citizen-tagline-ns-help": "সাহায্য পাতা",
diff --git a/i18n/ckb.json b/i18n/ckb.json
index 463d2f56..9e6cefd5 100644
--- a/i18n/ckb.json
+++ b/i18n/ckb.json
@@ -14,7 +14,7 @@
"citizen-action-addsection": "بابەت دابنێ",
"citizen-jumptotop": "گەڕانەوە بۆ سەرەوە",
"citizen-search-fulltext": "گەڕان لە ناوەڕۆکی لاپەڕەکان",
- "citizen-search-fulltext-empty": "بنوسە بۆ گەڕان",
+ "citizen-search-empty-desc": "بنوسە بۆ گەڕان",
"citizen-tagline-ns-talk": "لاپەڕەی گفتوگۆی {{SUBJECTPAGENAME}}",
"citizen-tagline-ns-project": "زانیاری لەبارەی {{SITENAME}}",
"citizen-tagline-ns-file": "پەڕگە لەسەر {{SITENAME}}",
diff --git a/i18n/de.json b/i18n/de.json
index 644e5537..28215f8d 100644
--- a/i18n/de.json
+++ b/i18n/de.json
@@ -26,7 +26,7 @@
"citizen-action-addsection": "Thema hinzufügen",
"citizen-jumptotop": "Zurück nach oben",
"citizen-search-fulltext": "Suche nach Seiten mit",
- "citizen-search-fulltext-empty": "Tippe, um zu suchen zu beginnen",
+ "citizen-search-empty-desc": "Tippe, um zu suchen zu beginnen",
"citizen-tagline-ns-talk": "Diskussionsseite von {{SUBJECTPAGENAME}}",
"citizen-tagline-ns-project": "Informationen über {{SITENAME}}",
"citizen-tagline-ns-file": "Datei auf {{SITENAME}}",
diff --git a/i18n/en.json b/i18n/en.json
index a24a35a6..1ba5f85c 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -21,7 +21,8 @@
"citizen-action-addsection": "Add topic",
"citizen-jumptotop": "Back to top",
"citizen-search-fulltext": "Search for pages containing $1",
- "citizen-search-fulltext-empty": "Type to start searching",
+ "citizen-search-mediasearch": "Search for media related to $1",
+ "citizen-search-empty-desc": "Type to start searching",
"citizen-search-noresults-title": "Uh oh! No results for $1",
"citizen-search-noresults-desc": "Maybe try the options below?",
"citizen-tagline-ns-talk": "Discussion page of {{SUBJECTPAGENAME}}",
diff --git a/i18n/fr.json b/i18n/fr.json
index 7463a205..f88bacc4 100644
--- a/i18n/fr.json
+++ b/i18n/fr.json
@@ -23,7 +23,8 @@
"citizen-action-addsection": "Ajouter un sujet",
"citizen-jumptotop": "Retour au début",
"citizen-search-fulltext": "Rechercher les pages contenant $1",
- "citizen-search-fulltext-empty": "Taper pour commencer la recherche",
+ "citizen-search-mediasearch": "Rechercher des médias relatifs à $1",
+ "citizen-search-empty-desc": "Taper pour commencer la recherche",
"citizen-search-noresults-title": "Oh oh ! Aucun résultat pour $1",
"citizen-search-noresults-desc": "Essayer peut-être les options ci-dessous ?",
"citizen-tagline-ns-talk": "Page de discussion de {{SUBJECTPAGENAME}}",
diff --git a/i18n/kk-cyrl.json b/i18n/kk-cyrl.json
index 15dc1116..24e89c4e 100644
--- a/i18n/kk-cyrl.json
+++ b/i18n/kk-cyrl.json
@@ -21,7 +21,7 @@
"citizen-action-addsection": "Тақырып қосу",
"citizen-jumptotop": "Жоғары қайту",
"citizen-search-fulltext": "Осы сөз(дер) бар беттерді іздеу",
- "citizen-search-fulltext-empty": "Іздей бастау үшін теріңіз",
+ "citizen-search-empty-desc": "Іздей бастау үшін теріңіз",
"citizen-tagline-ns-talk": "{{SUBJECTPAGENAME}} дегеннің талқылау беті",
"citizen-tagline-ns-project": "{{SITENAME}} туралы мәлімет",
"citizen-tagline-ns-file": "{{SITENAME}} жобасындағы файл",
diff --git a/i18n/mk.json b/i18n/mk.json
index 8c4d726d..f5a34b47 100644
--- a/i18n/mk.json
+++ b/i18n/mk.json
@@ -20,7 +20,8 @@
"citizen-action-addsection": "Додај тема",
"citizen-jumptotop": "Најгоре",
"citizen-search-fulltext": "Пребарај страници што содржат $1",
- "citizen-search-fulltext-empty": "Внесете текст за да почнете да пребарувате",
+ "citizen-search-mediasearch": "Пребарајте податотеки поврзани со $1",
+ "citizen-search-empty-desc": "Внесете текст за да почнете да пребарувате",
"citizen-search-noresults-title": "За жал, не најдов ништо за $1",
"citizen-search-noresults-desc": "Да ги пробаме можностите подолу?",
"citizen-tagline-ns-talk": "Разговорна страница на {{SUBJECTPAGENAME}}",
diff --git a/i18n/nl.json b/i18n/nl.json
index 61ac69a0..6a125ae8 100644
--- a/i18n/nl.json
+++ b/i18n/nl.json
@@ -13,7 +13,7 @@
"citizen-page-info-lastmod": "Laatste wijziging",
"citizen-action-addsection": "Onderwerp toevoegen",
"citizen-jumptotop": "Terug naar boven",
- "citizen-search-fulltext-empty": "Type om te beginnen met zoeken",
+ "citizen-search-empty-desc": "Type om te beginnen met zoeken",
"citizen-tagline-ns-talk": "Overlegpagina van {{SUBJECTPAGENAME}}",
"citizen-tagline-ns-project": "Informatie over {{SITENAME}}",
"citizen-tagline-ns-file": "Bestand op {{SITENAME}}",
diff --git a/i18n/pl.json b/i18n/pl.json
index 52ea90da..2022ce75 100644
--- a/i18n/pl.json
+++ b/i18n/pl.json
@@ -20,7 +20,7 @@
"citizen-action-addsection": "Dodaj temat",
"citizen-jumptotop": "Powrót do góry",
"citizen-search-fulltext": "Szukaj stron zawierających tekst $1",
- "citizen-search-fulltext-empty": "Zacznij pisać, aby wyszukiwać",
+ "citizen-search-empty-desc": "Zacznij pisać, aby wyszukiwać",
"citizen-search-noresults-title": "O nie! Nie ma wyników dla $1",
"citizen-search-noresults-desc": "Może wypróbuj poniższe opcje?",
"citizen-tagline-ns-talk": "Strona dyskusji o „{{SUBJECTPAGENAME}}”",
diff --git a/i18n/pt-br.json b/i18n/pt-br.json
index 2f2a643a..f4209782 100644
--- a/i18n/pt-br.json
+++ b/i18n/pt-br.json
@@ -24,7 +24,7 @@
"citizen-action-addsection": "Adicionar tópico",
"citizen-jumptotop": "Voltar ao topo",
"citizen-search-fulltext": "Pesquisar por páginas que contenham",
- "citizen-search-fulltext-empty": "Tipo para começar a pesquisar",
+ "citizen-search-empty-desc": "Tipo para começar a pesquisar",
"citizen-search-noresults-title": "Uh oh! Nenhum resultado para $1",
"citizen-search-noresults-desc": "Talvez tente as opções abaixo?",
"citizen-tagline-ns-talk": "Página de discussão de {{SUBJECTPAGENAME}}",
diff --git a/i18n/pt.json b/i18n/pt.json
index ae035c6e..4b400dc0 100644
--- a/i18n/pt.json
+++ b/i18n/pt.json
@@ -20,7 +20,8 @@
"citizen-action-addsection": "Adicionar tópico",
"citizen-jumptotop": "Voltar ao topo",
"citizen-search-fulltext": "Procurar páginas que contenham $1",
- "citizen-search-fulltext-empty": "Escrever para começar a procurar",
+ "citizen-search-mediasearch": "Procurar conteúdo multimédia relacionado com $1",
+ "citizen-search-empty-desc": "Escrever para começar a procurar",
"citizen-search-noresults-title": "Não há resultados para $1",
"citizen-search-noresults-desc": "Talvez queira tentar as opções abaixo?",
"citizen-tagline-ns-talk": "Página de discussão de {{SUBJECTPAGENAME}}",
diff --git a/i18n/qqq.json b/i18n/qqq.json
index 38b43997..781702c7 100644
--- a/i18n/qqq.json
+++ b/i18n/qqq.json
@@ -3,11 +3,12 @@
"authors": [
"Abijeet Patro",
"Alistair3149",
+ "Amire80",
"[https://www.mediawiki.org/wiki/User:Alistair3149 Alistair3149]",
"[https://www.mediawiki.org/wiki/User:Octfx Octfx]"
]
},
- "skinname-citizen": "{{name}}",
+ "skinname-citizen": "{{name}}\n\n\"Citizen\" refers to the name of the video game [[:w:en:Star Citizen|Star Citizen]].",
"citizen-skin-desc": "{{desc|what=skin|name=Citizen|url=https://github.com/StarCitizenTools/mediawiki-skins-Citizen}}",
"citizen-prefs-talkpage": "Link to the Citizen talk page which is shown before the preview link in skin preferences. See T307113 for more information.",
"citizen.css": "{{optional}}",
@@ -23,7 +24,8 @@
"citizen-action-addsection": "Used in the Citizen skin. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}\n{{Identical|Add topic}}. Same as vector-action-addsection in Vector skin.",
"citizen-jumptotop": "Label for link to jump to top of page",
"citizen-search-fulltext": "Fulltext search suggestion",
- "citizen-search-fulltext-empty": "Helper text in the search suggestion when there are no search query",
+ "citizen-search-mediasearch": "MediaSearch suggestion",
+ "citizen-search-empty-desc": "Helper text in the search suggestion when there are no search query",
"citizen-search-noresults-title": "Title in the search suggestion when there are no search results",
"citizen-search-noresults-desc": "Description in the search suggestion when there are no search results",
"citizen-tagline-ns-talk": "Tagline for pages in talk namespace",
diff --git a/i18n/roa-tara.json b/i18n/roa-tara.json
index d41644ff..76a325c4 100644
--- a/i18n/roa-tara.json
+++ b/i18n/roa-tara.json
@@ -14,7 +14,7 @@
"citizen-action-addsection": "Aggiunge 'n'argomende",
"citizen-jumptotop": "Tuèrne sus",
"citizen-search-fulltext": "Cirche le pàggene ca tènene",
- "citizen-search-fulltext-empty": "Scrive pe accumenzà 'a recerche",
+ "citizen-search-empty-desc": "Scrive pe accumenzà 'a recerche",
"citizen-tagline-ns-talk": "Pàgene de le 'ngazzaminde de {{SUBJECTPAGENAME}}",
"citizen-tagline-ns-project": "'Mbormaizune sus a {{SITENAME}}",
"citizen-tagline-ns-file": "Fail sus a {{SITENAME}}",
diff --git a/i18n/ru.json b/i18n/ru.json
index 862272d3..23d13b7b 100644
--- a/i18n/ru.json
+++ b/i18n/ru.json
@@ -21,7 +21,7 @@
"citizen-action-addsection": "Добавить тему",
"citizen-jumptotop": "Вернуться наверх",
"citizen-search-fulltext": "Поиск страниц, содержащих",
- "citizen-search-fulltext-empty": "Введите текст",
+ "citizen-search-empty-desc": "Введите текст",
"citizen-tagline-ns-talk": "Обсуждение страницы {{SUBJECTPAGENAME}}",
"citizen-tagline-ns-project": "Информация о {{SITENAME}}",
"citizen-tagline-ns-file": "Файл на {{SITENAME}}",
diff --git a/i18n/sl.json b/i18n/sl.json
index bed252e7..a23e466f 100644
--- a/i18n/sl.json
+++ b/i18n/sl.json
@@ -20,7 +20,8 @@
"citizen-action-addsection": "Dodaj temo",
"citizen-jumptotop": "Nazaj na vrh",
"citizen-search-fulltext": "Poiščite strani, ki vsebujejo $1",
- "citizen-search-fulltext-empty": "Vnesite za začetek iskanja",
+ "citizen-search-mediasearch": "Iskanje predstavnosti, povezanih z $1",
+ "citizen-search-empty-desc": "Vnesite za začetek iskanja",
"citizen-search-noresults-title": "Ojoj! Ni zadetkov za $1",
"citizen-search-noresults-desc": "Morda poskusite s spodnjimi možnostmi?",
"citizen-tagline-ns-talk": "Pogovorna stran {{SUBJECTPAGENAME}}",
diff --git a/i18n/tr.json b/i18n/tr.json
index 43e8b0c9..fc8ed9f4 100644
--- a/i18n/tr.json
+++ b/i18n/tr.json
@@ -23,7 +23,7 @@
"citizen-action-addsection": "Konu ekle",
"citizen-jumptotop": "Başa dön",
"citizen-search-fulltext": "İçeren sayfaları ara",
- "citizen-search-fulltext-empty": "Aramaya başlamak için yazın",
+ "citizen-search-empty-desc": "Aramaya başlamak için yazın",
"citizen-tagline-ns-talk": "{{SUBJECTPAGENAME}} tartışma sayfası",
"citizen-tagline-ns-project": "{{SITENAME}} hakkında bilgi",
"citizen-tagline-ns-file": "{{SITENAME}} sitesindeki dosya",
diff --git a/i18n/uk.json b/i18n/uk.json
index 42294981..cc32dcd6 100644
--- a/i18n/uk.json
+++ b/i18n/uk.json
@@ -16,7 +16,7 @@
"citizen-action-addsection": "Додати тему",
"citizen-jumptotop": "Повернутись угору",
"citizen-search-fulltext": "Пошук сторінок, що містять",
- "citizen-search-fulltext-empty": "Введіть, щоб почати пошук",
+ "citizen-search-empty-desc": "Введіть, щоб почати пошук",
"citizen-tagline-ns-talk": "Сторінка обговорення {{SUBJECTPAGENAME}}",
"citizen-tagline-ns-project": "Інформація про {{SITENAME}}",
"citizen-tagline-ns-file": "Файл на {{SITENAME}}",
diff --git a/i18n/yue.json b/i18n/yue.json
index 90688dca..ee7b57e7 100644
--- a/i18n/yue.json
+++ b/i18n/yue.json
@@ -21,7 +21,7 @@
"citizen-action-addsection": "加主題",
"citizen-jumptotop": "返到上面",
"citizen-search-fulltext": "喺每頁入面喥搵$1",
- "citizen-search-fulltext-empty": "打字開始搵",
+ "citizen-search-empty-desc": "打字開始搵",
"citizen-tagline-ns-talk": "{{SUBJECTPAGENAME}}嘅討論頁",
"citizen-tagline-ns-project": "關於{{SITENAME}}嘅資料",
"citizen-tagline-ns-file": "喺{{SITENAME}}嘅檔案",
diff --git a/i18n/zh-hans.json b/i18n/zh-hans.json
index 34ddbd97..ef8e1a9a 100644
--- a/i18n/zh-hans.json
+++ b/i18n/zh-hans.json
@@ -28,7 +28,7 @@
"citizen-action-addsection": "添加话题",
"citizen-jumptotop": "回到顶部",
"citizen-search-fulltext": "搜索包含“$1”的页面",
- "citizen-search-fulltext-empty": "键入以开始搜索",
+ "citizen-search-empty-desc": "键入以开始搜索",
"citizen-search-noresults-title": "抱歉!没有找到“$1”的搜索结果",
"citizen-search-noresults-desc": "也许可以试试下面的选项?",
"citizen-tagline-ns-talk": "{{SUBJECTPAGENAME}}的讨论页",
diff --git a/i18n/zh-hant.json b/i18n/zh-hant.json
index 53aed7cb..0b7380f8 100644
--- a/i18n/zh-hant.json
+++ b/i18n/zh-hant.json
@@ -26,7 +26,7 @@
"citizen-action-addsection": "新增話題",
"citizen-jumptotop": "返回頂端",
"citizen-search-fulltext": "搜尋包含「$1」的頁面:",
- "citizen-search-fulltext-empty": "輸入以開始搜尋",
+ "citizen-search-empty-desc": "輸入以開始搜尋",
"citizen-search-noresults-title": "呃哦! $1沒有結果",
"citizen-search-noresults-desc": "也許試試下面的選項?",
"citizen-tagline-ns-talk": "{{SUBJECTPAGENAME}}的討論頁",
diff --git a/i18n/zh-hk.json b/i18n/zh-hk.json
index b74c2987..99dfc505 100644
--- a/i18n/zh-hk.json
+++ b/i18n/zh-hk.json
@@ -5,7 +5,8 @@
"Diskdance",
"LuciferianThomas",
"Tranve",
- "Winston Sung"
+ "Winston Sung",
+ "捍粵者"
]
},
"skinname-citizen": "公民(Citizen)",
@@ -21,7 +22,7 @@
"citizen-action-addsection": "新增話題",
"citizen-jumptotop": "返回頂端",
"citizen-search-fulltext": "搜尋包含",
- "citizen-search-fulltext-empty": "輸入開始搜尋",
+ "citizen-search-empty-desc": "輸入開始搜尋",
"citizen-tagline-ns-talk": "{{SUBJECTPAGENAME}}的討論頁面",
"citizen-tagline-ns-project": "關於{{SITENAME}}的資訊",
"citizen-tagline-ns-file": "{{SITENAME}}上的檔案",
diff --git a/includes/Hooks/ResourceLoaderHooks.php b/includes/Hooks/ResourceLoaderHooks.php
index 54d55521..e362669a 100644
--- a/includes/Hooks/ResourceLoaderHooks.php
+++ b/includes/Hooks/ResourceLoaderHooks.php
@@ -26,6 +26,7 @@ declare( strict_types=1 );
namespace MediaWiki\Skins\Citizen\Hooks;
use Config;
+use ExtensionRegistry;
use MediaWiki\ResourceLoader as RL;
/**
@@ -64,6 +65,7 @@ class ResourceLoaderHooks {
'wgCitizenMaxSearchResults' => $config->get( 'CitizenMaxSearchResults' ),
'wgScriptPath' => $config->get( 'ScriptPath' ),
'wgSearchSuggestCacheExpiry' => $config->get( 'SearchSuggestCacheExpiry' ),
+ 'isMediaSearchExtensionEnabled' => ExtensionRegistry::getInstance()->isLoaded( 'MediaSearch' ),
];
}
}
diff --git a/package-lock.json b/package-lock.json
index 39b796d5..f4976a8d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,11 +1,11 @@
{
"name": "mediawiki-skins-Citizen",
- "version": "2.2.0",
+ "version": "2.3.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
- "version": "2.2.0",
+ "version": "2.3.0",
"devDependencies": {
"@commitlint/cli": "^17.3.0",
"@commitlint/config-conventional": "^17.3.0",
diff --git a/package.json b/package.json
index 08da5114..60c6c84d 100644
--- a/package.json
+++ b/package.json
@@ -30,5 +30,5 @@
"stylelint-config-wikimedia": "0.13.1",
"svgo": "3.0.2"
},
- "version": "2.2.0"
+ "version": "2.3.0"
}
diff --git a/resources/skins.citizen.search/skins.citizen.search.less b/resources/skins.citizen.search/skins.citizen.search.less
index 73024cdf..0c27ebe7 100644
--- a/resources/skins.citizen.search/skins.citizen.search.less
+++ b/resources/skins.citizen.search/skins.citizen.search.less
@@ -9,46 +9,20 @@
box-sizing: border-box;
padding: 0.75rem 0 0 0;
margin: -0.75rem 0 0 0; // Reset
styles
+ overscroll-behavior: contain;
//border-radius: 0 0 var( --border-radius--medium ) var( --border-radius--medium );
.citizen-card;
.citizen-card-hide( 50% 0, Y, false );
// Well this won't be loaded before .citizen-animation-ready anyways
.citizen-card-transition();
- &__placeholder {
- .citizen-typeahead {
- &__content {
- flex-direction: column;
- padding: var( --space-xl ) 0;
- text-align: center;
- }
-
- &__thumbnail {
- margin-bottom: var( --space-sm );
- }
- }
- }
-
&__item {
- &--active {
- background-color: var( --background-color-primary--hover );
- }
-
.citizen-typeahead {
&__thumbnail {
margin-right: var( --space-sm );
- background-color: #eaecf0;
- background-position: center;
- background-size: cover;
&.citizen-ui-icon {
- width: 70px;
- height: 60px;
- background-color: var( --color-surface-3 );
-
- &:before {
- background-size: 20px;
- }
+ width: 100%; // reset width
}
}
@@ -56,13 +30,71 @@
white-space: nowrap;
}
}
- }
- &__placeholder,
- &__item {
+ &--active {
+ background-color: var( --background-color-primary--hover );
+ }
+
&--hidden {
display: none;
}
+
+ &--placeholder {
+ .citizen-typeahead {
+ &__content {
+ flex-direction: column;
+ padding: var( --space-xl ) 0;
+ text-align: center;
+ }
+
+ &__thumbnail {
+ margin-bottom: var( --space-sm );
+ }
+ }
+ }
+
+ &--page {
+ .citizen-typeahead {
+ &__thumbnail {
+ background-color: #eaecf0;
+ background-position: center;
+ background-size: cover;
+
+ &.citizen-ui-icon {
+ height: 60px;
+ background-color: var( --color-surface-3 );
+
+ &:before {
+ background-size: 20px;
+ }
+ }
+ }
+ }
+ }
+
+ &--tool {
+ .citizen-typeahead {
+ &__content {
+ padding: var( --space-sm ) 0;
+ border-top: 1px solid var( --border-color-base );
+ }
+
+ &__thumbnail {
+ height: var( --size-icon );
+ background-color: transparent;
+ }
+
+ &__description {
+ color: var( --color-base );
+ }
+ }
+
+ + .citizen-typeahead__item--tool {
+ .citizen-typeahead__content {
+ border-top: 0;
+ }
+ }
+ }
}
&__content {
@@ -107,6 +139,11 @@
font-weight: var( --font-weight-medium );
}
+ &__query {
+ color: var( --color-base--emphasized );
+ font-weight: var( --font-weight-semibold );
+ }
+
&__label {
display: flex;
margin-left: var( --space-xs );
@@ -155,26 +192,6 @@
}
}
-#citizen-typeahead-fulltext {
- .citizen-typeahead {
- &__content {
- padding: var( --space-md ) 0;
- border-top: 1px solid var( --border-color-base );
- }
-
- &__thumbnail {
- height: var( --size-icon );
- background-color: transparent;
- }
-
- &__description {
- strong {
- color: var( --color-base--emphasized );
- }
- }
- }
-}
-
// HACK: This is as close as we can to detect whether there is a keyboard in CSS
@media ( hover: hover ) and ( pointer: fine ) {
.citizen-typeahead {
diff --git a/resources/skins.citizen.search/templates/typeahead.mustache b/resources/skins.citizen.search/templates/typeahead.mustache
index dfb6c2d5..10d8968d 100644
--- a/resources/skins.citizen.search/templates/typeahead.mustache
+++ b/resources/skins.citizen.search/templates/typeahead.mustache
@@ -5,12 +5,12 @@
{{! Empty state }}
- -
+
-
{{msg-searchsuggest-search}}
-
{{msg-citizen-search-fulltext-empty}}
+
{{msg-citizen-search-empty-desc}}
diff --git a/resources/skins.citizen.search/typeahead.js b/resources/skins.citizen.search/typeahead.js
index b48cd5a8..d9ad4993 100644
--- a/resources/skins.citizen.search/typeahead.js
+++ b/resources/skins.citizen.search/typeahead.js
@@ -1,14 +1,21 @@
/* eslint-disable es-x/no-symbol-prototype-description */
const
- config = require( './config.json' ),
PREFIX = 'citizen-typeahead',
- SEARCH_LOADING_CLASS = 'citizen-loading';
+ SEARCH_LOADING_CLASS = 'citizen-loading',
+ ITEM_CLASS = `${PREFIX}__item`,
+ ACTIVE_CLASS = `${ITEM_CLASS}--active`,
+ HIDDEN_CLASS = `${ITEM_CLASS}--hidden`;
+
+/**
+ * Config object from getCitizenSearchResourceLoaderConfig()
+ */
+const config = require( './config.json' );
const activeIndex = {
index: -1,
max: config.wgCitizenMaxSearchResults + 1,
setMax: function ( x ) {
- this.max = x + 1;
+ this.max = x;
},
increment: function ( i ) {
this.index += i;
@@ -31,15 +38,28 @@ const activeIndex = {
}
};
-let typeahead, searchInput;
+let /** @type {HTMLElement | undefined} */ typeahead;
+let /** @type {HTMLElement | undefined} */ searchInput;
-/*
+/**
+ * @typedef {Object} MenuItemData
+ * @property {string} id
+ * @property {string} type
+ * @property {string} link
+ * @property {string} icon
+ * @property {string} thumbnail
+ * @property {string} title
+ * @property {string} label
+ * @property {string} description
+ */
+
+/**
+ * Sets an 'ACTIVE_CLASS' on the element
+ *
* @param {HTMLElement} element
- * @return {void}
*/
function toggleActive( element ) {
- const ACTIVE_CLASS = PREFIX + '__item--active';
- const typeaheadItems = typeahead.querySelectorAll( '.' + PREFIX + '__item' );
+ const typeaheadItems = typeahead.querySelectorAll( `.${ITEM_CLASS}` );
for ( let i = 0; i < typeaheadItems.length; i++ ) {
if ( element !== typeaheadItems[ i ] ) {
@@ -54,7 +74,6 @@ function toggleActive( element ) {
}
}
}
- /* eslint-enable mediawiki/class-doc */
}
/**
@@ -69,7 +88,7 @@ function keyboardEvents( event ) {
}
// Is children slower?
- const typeaheadItems = typeahead.querySelectorAll( '.' + PREFIX + '__item' );
+ const typeaheadItems = typeahead.querySelectorAll( `.${ITEM_CLASS}` );
if ( event.key === 'ArrowDown' || event.key === 'ArrowUp' ) {
if ( event.key === 'ArrowDown' ) {
@@ -83,7 +102,7 @@ function keyboardEvents( event ) {
}
if ( typeaheadItems[ activeIndex.index ] ) {
- const link = typeaheadItems[ activeIndex.index ].querySelector( '.' + PREFIX + '__content' );
+ const link = typeaheadItems[ activeIndex.index ].querySelector( `.${PREFIX}__content` );
if ( event.key === 'Enter' && link instanceof HTMLAnchorElement ) {
event.preventDefault();
link.click();
@@ -91,23 +110,10 @@ function keyboardEvents( event ) {
}
}
-/*
- * Attach mouse eventlistener to all typeahead items
- *
- * @return {void}
- */
-function attachMouseListener() {
- const items = typeahead.querySelectorAll( '.' + PREFIX + '__item' );
- items.forEach( ( item ) => {
- bindMouseHoverEvent( item );
- } );
-}
-
-/*
+/**
* Bind mouseenter and mouseleave event to reproduce mouse hover event
*
* @param {HTMLElement} element
- * @return {void}
*/
function bindMouseHoverEvent( element ) {
element.addEventListener( 'mouseenter', ( event ) => {
@@ -120,33 +126,24 @@ function bindMouseHoverEvent( element ) {
/**
* Remove all existing suggestions from typeahead
- *
- * @return {void}
*/
function clearSuggestions() {
- const typeaheadItems = typeahead.children,
- nonSuggestionCount = 3;
+ const typeaheadItems = typeahead.children;
- if ( typeaheadItems.length > nonSuggestionCount ) {
- // Splice would be cleaner but it is slower (?)
- const fragment = new DocumentFragment(),
- nonSuggestionItems = [ ...typeaheadItems ].slice(
- typeaheadItems.length - nonSuggestionCount, typeaheadItems.length
- );
+ if ( typeaheadItems.length > 0 ) {
+ // Do all the work in document fragment then replace the whole list
+ // It is more performant this way
+ const
+ fragment = new DocumentFragment(),
+ template = document.getElementById( `${PREFIX}-template` );
- nonSuggestionItems.forEach( ( item ) => {
- fragment.append( item );
- } );
-
- // TODO: Just use replaceChildren when browser support is >90%
- if ( typeof typeahead.replaceChildren !== 'undefined' ) {
- typeahead.replaceChildren( fragment );
- } else {
- while ( typeahead.hasChildNodes() ) {
- typeahead.removeChild( typeahead.lastChild );
+ [ ...typeaheadItems ].forEach( ( item ) => {
+ if ( !item.classList.contains( `${ITEM_CLASS}--page` ) ) {
+ fragment.append( item );
}
- typeahead.appendChild( fragment );
- }
+ } );
+ fragment.append( template );
+ typeahead.replaceChildren( fragment );
}
// Remove loading animation
@@ -161,23 +158,36 @@ function clearSuggestions() {
* @param {string} searchQuery
* @param {string} htmlSafeSearchQuery
* @param {HTMLElement} placeholder
- * @return {void}
*/
function getSuggestions( searchQuery, htmlSafeSearchQuery, placeholder ) {
const renderSuggestions = ( results ) => {
if ( results.length > 0 ) {
const
fragment = document.createDocumentFragment(),
- suggestionLinkPrefix = config.wgScriptPath + '/index.php?title=Special:Search&search=';
-
+ suggestionLinkPrefix = `${config.wgScriptPath}/index.php?title=Special:Search&search=`;
+ /**
+ * Return the redirect title with search query highlight
+ *
+ * @param {string} text
+ * @return {string}
+ */
const highlightTitle = ( text ) => {
const regex = new RegExp( mw.util.escapeRegExp( htmlSafeSearchQuery ), 'i' );
- return text.replace( regex, '$&' );
+ return text.replace( regex, `$&` );
};
-
+ /**
+ * Return the HTML of the redirect label
+ *
+ * @param {string} title
+ * @param {string} matchedTitle
+ * @return {string}
+ */
const getRedirectLabel = ( title, matchedTitle ) => {
- // Check if the redirect is useful
- // See T303013
+ /**
+ * Check if the redirect is useful (T303013)
+ *
+ * @return {boolean}
+ */
const isRedirectUseful = () => {
// Change to lowercase then remove space and dashes
const cleanup = ( text ) => {
@@ -187,21 +197,20 @@ function getSuggestions( searchQuery, htmlSafeSearchQuery, placeholder ) {
cleanTitle = cleanup( title ),
cleanMatchedTitle = cleanup( matchedTitle );
- // eslint-disable-next-line max-len, es-x/no-array-prototype-includes
- return !( cleanTitle.includes( cleanMatchedTitle ) || cleanMatchedTitle.includes( cleanTitle ) );
+ return !(
+ cleanTitle.includes( cleanMatchedTitle ) ||
+ cleanMatchedTitle.includes( cleanTitle )
+ );
};
let html = '';
-
// Result is a redirect
// Show the redirect title and highlight it
if ( matchedTitle && isRedirectUseful() ) {
- html = '' +
- /* Article redirect icon */
- '' +
- /* Since we are matching that redirect title, it should be highlighted */
- highlightTitle( matchedTitle ) +
- '
';
+ html = `
+
+ ${highlightTitle( matchedTitle )}
+
`;
}
return html;
@@ -210,7 +219,8 @@ function getSuggestions( searchQuery, htmlSafeSearchQuery, placeholder ) {
// Create suggestion items
results.forEach( ( result, index ) => {
const data = {
- id: PREFIX + '-suggestion-' + index,
+ id: `${PREFIX}-suggestion-${index}`,
+ type: 'page',
link: suggestionLinkPrefix + encodeURIComponent( result.key ),
title: highlightTitle( result.title ),
// Just to be safe, not sure if the default API is HTML escaped
@@ -228,7 +238,7 @@ function getSuggestions( searchQuery, htmlSafeSearchQuery, placeholder ) {
fragment.append( getMenuItem( data ) );
} );
// Hide placeholder
- placeholder.classList.add( PREFIX + '__placeholder--hidden' );
+ placeholder.classList.add( HIDDEN_CLASS );
typeahead.prepend( fragment );
} else {
// Update placeholder with no result content
@@ -236,11 +246,12 @@ function getSuggestions( searchQuery, htmlSafeSearchQuery, placeholder ) {
placeholder,
{
icon: 'articleNotFound',
- class: PREFIX + '__placeholder ' + PREFIX + '__placeholder--noResult',
+ type: 'placeholder',
title: mw.message( 'citizen-search-noresults-title', htmlSafeSearchQuery ).text(),
description: mw.message( 'citizen-search-noresults-desc' ).text()
}
);
+ placeholder.classList.remove( HIDDEN_CLASS );
}
};
@@ -267,16 +278,14 @@ function getSuggestions( searchQuery, htmlSafeSearchQuery, placeholder ) {
clearSuggestions();
if ( results !== null ) {
renderSuggestions( results );
- attachMouseListener();
}
- activeIndex.setMax( results.length );
} ).catch( ( error ) => {
searchInput.removeEventListener( 'input', abortFetch );
searchInput.parentNode.classList.remove( SEARCH_LOADING_CLASS );
// User can trigger the abort when the fetch event is pending
// There is no need for an error
if ( error.name !== 'AbortError' ) {
- const message = 'Uh oh, a wild error appears! ' + error;
+ const message = `Uh oh, a wild error appears! ${error}`;
throw new Error( message );
}
} );
@@ -286,41 +295,41 @@ function getSuggestions( searchQuery, htmlSafeSearchQuery, placeholder ) {
* Update menu item element
*
* @param {HTMLElement} item
- * @param {Object} data
- * @return {void}
+ * @param {MenuItemData} data
*/
function updateMenuItem( item, data ) {
if ( data.id ) {
item.setAttribute( 'id', data.id );
}
- if ( data.class ) {
- // So that it can overwrite the original class
- // We use that in placeholder
- item.setAttribute( 'class', data.class );
+ if ( data.type ) {
+ item.classList.add( `${ITEM_CLASS}--${data.type}` );
}
if ( data.link ) {
- const link = item.querySelector( '.' + PREFIX + '__content' );
+ const link = item.querySelector( `.${PREFIX}__content` );
link.setAttribute( 'href', data.link );
}
if ( data.icon || data.thumbnail ) {
- const thumbnail = item.querySelector( '.' + PREFIX + '__thumbnail' );
+ const thumbnail = item.querySelector( `.${PREFIX}__thumbnail` );
if ( data.thumbnail ) {
- thumbnail.style.backgroundImage = 'url(' + data.thumbnail + ')';
+ thumbnail.style.backgroundImage = `url('${data.thumbnail}')`;
} else {
- // FIXME: There is probably a cleaner way
- thumbnail.setAttribute( 'class', PREFIX + '__thumbnail citizen-ui-icon mw-ui-icon-wikimedia-' + data.icon );
+ thumbnail.classList.add(
+ `${PREFIX}__thumbnail`,
+ 'citizen-ui-icon',
+ `mw-ui-icon-wikimedia-${data.icon}`
+ );
}
}
if ( data.title ) {
- const title = item.querySelector( '.' + PREFIX + '__title' );
+ const title = item.querySelector( `.${PREFIX}__title` );
title.innerHTML = data.title;
}
if ( data.label ) {
- const label = item.querySelector( '.' + PREFIX + '__label' );
+ const label = item.querySelector( `.${PREFIX}__label` );
label.innerHTML = data.label;
}
if ( data.description ) {
- const description = item.querySelector( '.' + PREFIX + '__description' );
+ const description = item.querySelector( `.${PREFIX}__description` );
description.innerHTML = data.description;
}
}
@@ -328,11 +337,11 @@ function updateMenuItem( item, data ) {
/**
* Generate menu item HTML using the existing template
*
- * @param {Object} data
+ * @param {MenuItemData} data
* @return {HTMLElement|void}
*/
function getMenuItem( data ) {
- const template = document.getElementById( PREFIX + '-template' );
+ const template = document.getElementById( `${PREFIX}-template` );
// Shouldn't happen but just to be safe
if ( !( template instanceof HTMLTemplateElement ) ) {
@@ -341,8 +350,9 @@ function getMenuItem( data ) {
const
fragment = template.content.cloneNode( true ),
- item = fragment.querySelector( '.' + PREFIX + '__item' );
+ item = fragment.querySelector( `.${ITEM_CLASS}` );
updateMenuItem( item, data );
+ bindMouseHoverEvent( item );
return fragment;
}
@@ -350,47 +360,74 @@ function getMenuItem( data ) {
* Update the typeahead element
*
* @param {Object} messages
- * @return {void}
*/
function updateTypeahead( messages ) {
const
searchQuery = searchInput.value,
htmlSafeSearchQuery = mw.html.escape( searchQuery ),
hasQuery = searchQuery.length > 0,
- placeholder = typeahead.querySelector( '.' + PREFIX + '__placeholder' );
+ placeholder = typeahead.querySelector( `.${ITEM_CLASS}--placeholder` );
- const updateFullTextSearchItem = () => {
+ /**
+ * Update a tool item or create it if it does not exist
+ *
+ * @param {Object} data
+ */
+ const updateToolItem = ( data ) => {
const
- FULLTEXT_ID = PREFIX + '-fulltext',
- HIDDEN_CLASS = PREFIX + '__item--hidden';
+ itemId = `${PREFIX}-${data.id}`,
+ query = `${htmlSafeSearchQuery}`,
+ itemLink = data.link + htmlSafeSearchQuery,
+ /* eslint-disable-next-line mediawiki/msg-doc */
+ itemDesc = mw.message( data.msg, query );
- const
- fulltextEl = document.getElementById( FULLTEXT_ID ),
- highlightedQuery = '' + htmlSafeSearchQuery + '',
- fulltextText = mw.message( 'citizen-search-fulltext', highlightedQuery );
-
- const item = getMenuItem( {
- icon: 'articleSearch',
- id: FULLTEXT_ID,
- link: config.wgScriptPath + '/index.php?title=Special:Search&fulltext=1&search=' + htmlSafeSearchQuery,
- description: fulltextText
- } );
+ let item = document.getElementById( itemId );
// Update existing element instead of creating a new one
- if ( fulltextEl ) {
- updateMenuItem( fulltextEl, { description: fulltextText } );
+ if ( item ) {
+ // FIXME: Probably more efficient to just replace the query than the whole messaage?
+ updateMenuItem(
+ item,
+ {
+ link: itemLink,
+ description: itemDesc
+ }
+ );
// FIXME: There is probably a more efficient way
if ( hasQuery ) {
- fulltextEl.classList.remove( HIDDEN_CLASS );
+ item.classList.remove( HIDDEN_CLASS );
} else {
- fulltextEl.classList.add( HIDDEN_CLASS );
+ item.classList.add( HIDDEN_CLASS );
}
} else {
+ item = getMenuItem( {
+ icon: data.icon,
+ id: itemId,
+ type: 'tool',
+ link: itemLink,
+ description: itemDesc
+ } );
typeahead.append( item );
}
};
- updateFullTextSearchItem();
+ // Fulltext search
+ updateToolItem( {
+ id: 'fulltext',
+ link: `${config.wgScriptPath}/index.php?title=Special:Search&fulltext=1&search=`,
+ icon: 'articleSearch',
+ msg: 'citizen-search-fulltext'
+ } );
+
+ // MediaSearch
+ if ( config.isMediaSearchExtensionEnabled ) {
+ updateToolItem( {
+ id: 'mediasearch',
+ link: `${config.wgScriptPath}/index.php?title=Special:MediaSearch&type=image&search=`,
+ icon: 'imageGallery',
+ msg: 'citizen-search-mediasearch'
+ } );
+ }
if ( hasQuery ) {
getSuggestions( searchQuery, htmlSafeSearchQuery, placeholder );
@@ -401,34 +438,35 @@ function updateTypeahead( messages ) {
placeholder,
{
icon: 'articlesSearch',
- class: PREFIX + '__placeholder ' + PREFIX + '__placeholder--noQuery',
- title: messages.searchsuggestSearch,
- description: messages.fulltextEmpty
+ title: messages.emptyTitle,
+ description: messages.emptyDesc
}
);
+ placeholder.classList.remove( HIDDEN_CLASS );
}
+ // -1 as there is a template element
+ activeIndex.setMax( typeahead.children.length - 1 );
}
/**
* @param {HTMLElement} searchForm
* @param {HTMLInputElement} input
- * @return {void}
*/
function initTypeahead( searchForm, input ) {
const EXPANDED_CLASS = 'citizen-typeahead--expanded';
const
messages = {
- fulltextEmpty: mw.message( 'citizen-search-fulltext-empty' ).text(),
- searchsuggestSearch: mw.message( 'searchsuggest-search' ).text()
+ emptyTitle: mw.message( 'searchsuggest-search' ).text(),
+ emptyDesc: mw.message( 'citizen-search-empty-desc' ).text()
},
template = mw.template.get(
'skins.citizen.search',
'resources/skins.citizen.search/templates/typeahead.mustache'
),
data = {
- 'msg-citizen-search-fulltext-empty': messages.fulltextEmpty,
- 'msg-searchsuggest-search': messages.searchsuggestSearch
+ 'msg-searchsuggest-search': messages.emptyTitle,
+ 'msg-citizen-search-empty-desc': messages.emptyDesc
};
const onBlur = ( event ) => {
@@ -463,9 +501,6 @@ function initTypeahead( searchForm, input ) {
searchInput.setAttribute( 'aria-autocomplete', 'list' );
searchInput.setAttribute( 'aria-controls', 'searchform-suggestions' );
- // Attach mouse listener to inital typeahead items
- attachMouseListener();
-
// Since searchInput is focused before the event listener is set up
onFocus();
searchInput.addEventListener( 'focus', onFocus );
diff --git a/resources/skins.citizen.styles/StickyHeader.less b/resources/skins.citizen.styles/StickyHeader.less
index 36944602..f9ab1882 100644
--- a/resources/skins.citizen.styles/StickyHeader.less
+++ b/resources/skins.citizen.styles/StickyHeader.less
@@ -45,10 +45,13 @@
.page-heading {
position: relative;
+ min-width: 0;
}
.firstHeading {
+ overflow: hidden;
font-size: var( --font-size-h3 );
+ text-overflow: ellipsis;
}
.citizen-jumptotop {
diff --git a/resources/skins.citizen.styles/common/cssvariables.less b/resources/skins.citizen.styles/common/cssvariables.less
index f964f3f6..a31043be 100644
--- a/resources/skins.citizen.styles/common/cssvariables.less
+++ b/resources/skins.citizen.styles/common/cssvariables.less
@@ -12,10 +12,6 @@
--background-color-overlay: @background-color-overlay;
--background-color-overlay--lighter: @background-color-overlay--lighter;
- --background-color-framed: @background-color-framed;
- --background-color-framed--hover: @background-color-framed--hover;
- --background-color-framed--active: @background-color-framed--active;
- --background-color-input: @background-color-input;
--background-color-icon: @background-color-icon;
--background-color-icon--hover: @background-color-icon--hover;
--background-color-icon--active: @background-color-icon--active;
diff --git a/resources/skins.citizen.styles/common/scrollbar.less b/resources/skins.citizen.styles/common/scrollbar.less
index 09a8f6b2..1be591b4 100644
--- a/resources/skins.citizen.styles/common/scrollbar.less
+++ b/resources/skins.citizen.styles/common/scrollbar.less
@@ -15,7 +15,7 @@
transition: @transition-background;
&:hover {
- background: var( --background-color-framed );
+ background: var( --background-color-quiet--hover );
}
}
diff --git a/resources/skins.citizen.styles/skinning/content.tables.less b/resources/skins.citizen.styles/skinning/content.tables.less
index 35988851..1951ee84 100644
--- a/resources/skins.citizen.styles/skinning/content.tables.less
+++ b/resources/skins.citizen.styles/skinning/content.tables.less
@@ -55,9 +55,3 @@
padding: var( --space-xs ) var( --space-sm );
}
}
-
-@media ( max-width: @width-breakpoint-desktop-wide ) {
- table.wikiatble {
- white-space: nowrap;
- }
-}
diff --git a/resources/skins.citizen.styles/skinning/elements.less b/resources/skins.citizen.styles/skinning/elements.less
index f5f299d9..6adbb14b 100644
--- a/resources/skins.citizen.styles/skinning/elements.less
+++ b/resources/skins.citizen.styles/skinning/elements.less
@@ -191,7 +191,6 @@ fieldset {
padding: var( --space-xs ) var( --space-md );
border: 1px solid var( --border-color-base );
margin: var( --space-md ) 0;
- font-size: 0.875rem;
}
legend {
diff --git a/resources/skins.citizen.styles/skinning/interface-subtitle.less b/resources/skins.citizen.styles/skinning/interface-subtitle.less
index 7dbe4a76..23e03234 100644
--- a/resources/skins.citizen.styles/skinning/interface-subtitle.less
+++ b/resources/skins.citizen.styles/skinning/interface-subtitle.less
@@ -20,6 +20,16 @@
line-height: var( --line-height-xs );
}
+#contentSub,
+#contentSub2 {
+ margin-bottom: var( --space-md );
+}
+
+// Reduced spacing if both sub1 and 2 exists
+#contentSub + #contentSub2 {
+ margin-top: ~'calc( var( --space-xs ) * -1 )';
+}
+
span.subpages {
display: block;
}
diff --git a/resources/variables.less b/resources/variables.less
index 9c5fedca..a103ee2a 100644
--- a/resources/variables.less
+++ b/resources/variables.less
@@ -101,20 +101,6 @@
@color-syntax-violet: #945eb8;
@color-syntax-grey: #90a4ae;
-/* Dark theme */
-@diff-hoverstate-dark: 4;
-
-@color-primary__l-dark: 60%;
-
-@color-surface-0-dark: ~'hsl( 210, 27%, 10% )';
-@color-surface-1-dark: ~'hsl( 212, 15%, 17% )';
-@color-surface-2-dark: ~'hsl( 208, 14%, 18% )';
-@color-surface-3-dark: ~'hsl( 210, 11%, 21% )';
-@color-surface-4-dark: ~'hsl( 210, 10%, 24% )';
-
-@color-surface-2-dark--hover: ~'hsl( 208, 14%, 'unit( 18 + @diff-hoverstate-dark, % )~' )';
-@color-surface-2-dark--active: ~'hsl( 208, 14%, 'unit( 18 - @diff-hoverstate-dark, % )~' )';
-
/*
* Syntax highlight colors
* Based on Material Theme Palenight
@@ -140,7 +126,7 @@
* referring to them as applied further below.
*/
-@color-base0: #000; // = HSB 0°, 0%, 0%
+// @color-base0: #000; // = HSB 0°, 0%, 0%
@color-base10: #202122; // = HSB 210°, 6%, 13%
@color-base20: #54595d; // = HSB 207°, 10%, 36%; WCAG 2.0 level AAA 7.09:1 contrast ratio on `#fff`
@color-base30: #72777d; // = HSB 210°, 9%, 49%; WCAG 2.0 level AA at 4.52:1 contrast ratio on `#fff`
@@ -174,12 +160,6 @@
@background-color-overlay: rgba( 255, 255, 255, 0.95 ); //base100 95% opacity
@background-color-overlay--lighter: rgba( 255, 255, 255, 0.6 );
-@background-color-framed: @color-base90;
-@background-color-framed--hover: @color-base100;
-@background-color-framed--active: @color-base70;
-
-@background-color-input: rgba( 255, 255, 255, 0.5 );
-
@background-color-icon: rgba( 0, 0, 0, 0.6 );
@background-color-icon--hover: rgba( 0, 0, 0, 0.8 );
@background-color-icon--active: rgba( 0, 0, 0, 1 );
@@ -233,7 +213,9 @@
@size-icon: 1.25rem;
// Not in the header section it is also used outside of header
@header-size: 3.5rem;
-@width-layout: @width-breakpoint-desktop - 2 * @padding-page;
+// 67.5rem at 16px font size
+// We use px because it would be frustrating if max-width changes with font size
+@width-layout: 1080px;
// TODO: Revise this number, fixed value isn't great but we need it for b
@width-toc: 240px;
diff --git a/skin.json b/skin.json
index 77d594fd..93f188fc 100644
--- a/skin.json
+++ b/skin.json
@@ -1,6 +1,6 @@
{
"name": "Citizen",
- "version": "2.2.0",
+ "version": "2.3.0",
"author": [
"[https://www.mediawiki.org/wiki/User:Alistair3149 Alistair3149]",
"[https://www.mediawiki.org/wiki/User:Octfx Octfx]",
@@ -138,7 +138,8 @@
],
"messages": [
"citizen-search-fulltext",
- "citizen-search-fulltext-empty",
+ "citizen-search-mediasearch",
+ "citizen-search-empty-desc",
"citizen-search-noresults-title",
"citizen-search-noresults-desc",
"search-redirect",
@@ -182,6 +183,7 @@
"edit",
"editLock",
"ellipsis",
+ "help",
"history",
"home",
"image",
@@ -235,6 +237,8 @@
"+ext.centralNotice.display": "skinStyles/extensions/CentralNotice/ext.centralNotice.display.less",
"+ext.cite.styles": "skinStyles/extensions/Cite/ext.cite.styles.less",
"+ext.cleanchanges.uls": "skinStyles/extensions/CleanChanges/ext.cleanchanges.uls.less",
+ "+ext.codeEditor.ace": "skinStyles/extensions/CodeEditor/ext.codeEditor.ace.less",
+ "+jquery.codeEditor": "skinStyles/extensions/CodeEditor/jquery.codeEditor.less",
"+ext.CodeMirror.lib": "skinStyles/extensions/CodeMirror/ext.CodeMirror.lib.less",
"+ext.CodeMirror.mode.mediawiki": "skinStyles/extensions/CodeMirror/ext.CodeMirror.mode.mediawiki.less",
"+ext.CodeMirror.visualEditor.init": "skinStyles/extensions/CodeMirror/ext.CodeMirror.visualEditor.init.less",
diff --git a/skinStyles/extensions/AdvancedSearch/ext.advancedSearch.initialstyles.less b/skinStyles/extensions/AdvancedSearch/ext.advancedSearch.initialstyles.less
index 7af98fc4..fad9485e 100644
--- a/skinStyles/extensions/AdvancedSearch/ext.advancedSearch.initialstyles.less
+++ b/skinStyles/extensions/AdvancedSearch/ext.advancedSearch.initialstyles.less
@@ -3,13 +3,21 @@
*
* SkinStyles for Extension:AdvancedSearch
* Module: ext.advancedSearch.initialstyles
- * Version: REL1_35 fae6250
+ * Version: REL1_39 3a0eed7
*
- * Date: 2021-08-26
+ * Date: 2022-12-12
*/
.client-js {
+ .mw-search-form-wrapper {
+ min-height: 121.56px; // This is quite hacky
+ }
+
.mw-search-spinner {
+ top: 5em;
+ // Very hacky since it might be wrong because of font size
+ left: 23em;
+
&:before,
&:after,
& .mw-search-spinner-bounce {
diff --git a/skinStyles/extensions/AdvancedSearch/ext.advancedSearch.styles.less b/skinStyles/extensions/AdvancedSearch/ext.advancedSearch.styles.less
index a7b93e6d..3f430d99 100644
--- a/skinStyles/extensions/AdvancedSearch/ext.advancedSearch.styles.less
+++ b/skinStyles/extensions/AdvancedSearch/ext.advancedSearch.styles.less
@@ -3,54 +3,123 @@
*
* SkinStyles for Extension:AdvancedSearch
* Module: ext.advancedSearch.styles
- * Version: REL1_35 fae6250
+ * Version: REL1_39 3a0eed7
*
- * Date: 2021-08-26
+ * Date: 2022-12-12
*/
+.mw-advancedSearch-container {
+ border-bottom: 1px solid var( --border-color-base );
+ margin-top: var( --space-xs );
+}
+
+// Align with Citizen label styles
+.mw-advancedSearch-searchPreview-label,
+.advancedsearch-namespacesPreview-label {
+ margin-right: var( --space-xs );
+ color: var( --color-base--subtle );
+ font-size: 0.875rem;
+ font-weight: var( --font-weight-normal );
+ letter-spacing: 0.05em;
+}
+
.mw-advancedSearch-fieldContainer {
- border-color: var( --border-color-base );
- background: transparent;
+ max-width: none;
+ border: 0;
+ border-radius: var( --border-radius--small );
+ margin-top: 0;
+ background: var( --color-surface-2 );
fieldset {
- border-color: var( --border-color-base );
+ border-top-color: var( --border-color-base );
+ margin-top: var( --space-md );
}
.oo-ui-labelElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label {
- background: var( --color-surface-0 ); // the parent containers are transparent
+ background: var( --color-surface-2 );
color: var( --color-base--subtle );
+ font-size: 0.875rem;
+ font-weight: var( --font-weight-normal );
+ letter-spacing: 0.05em;
}
}
+.mw-advancedSearch-expandablePane-options,
+.mw-advancedSearch-expandablePane-namespaces {
+ max-width: none;
+ padding-top: 0; // padding handled through container
+}
+
.mw-advancedSearch-expandablePane-button {
&.oo-ui-widget-enabled.oo-ui-buttonWidget {
- &.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
- background-color: var( --color-surface-2 );
+ > .oo-ui-buttonElement-button {
+ padding-left: 0;
+ border-color: transparent;
+ background-color: transparent;
+
+ &:hover {
+ background-color: var( --background-color-quiet--hover );
+ color: inherit;
+ }
+
+ // Added active state
+ &:active {
+ background-color: var( --background-color-quiet--active );
+ }
+
+ // HACK: Flip indicator when expanded
+ .oo-ui-indicator-down {
+ transition: opacity 100ms, transform 250ms ease;
+ }
+
+ &[ aria-expanded='true' ] {
+ .oo-ui-indicator-down {
+ transform: rotate3d( 1, 0, 0, 180deg );
+ }
+ }
}
- > .oo-ui-buttonElement-button {
- &:hover {
- background-color: var( --color-surface-2--hover );
- color: var( --color-base );
- }
+ &.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+ background-color: transparent;
}
}
}
+.mw-advancedSearch-namespace-selection-header {
+ > .mw-advancedSearch-namespace-search-in-label {
+ font-weight: var( --font-weight-semibold );
+ }
+}
+
.mw-advancedSearch-namespace-selection {
- border-color: var( --border-color-base );
+ max-width: none;
+ border: 0;
+ border-radius: var( --border-radius--small );
+ margin-top: 0;
background: var( --color-surface-2 );
}
.mw-advancedSearch-namespace-border {
- border-color: var( --border-color-base );
+ border-top: 1px solid var( --border-color-base );
+ border-bottom: 0;
+}
+
+.mw-advancedSearch-namespaceFilter.oo-ui-tagMultiselectWidget {
+ max-width: none;
+}
+
+.mw-advancedSearch-namespaceFilter .oo-ui-tagMultiselectWidget-handle {
+ border-radius: 0 0 var( --border-radius--small ) var( --border-radius--small );
+}
+
+.mw-advancedSearch-namespaceFilter .oo-ui-tagMultiselectWidget-input .oo-ui-inputWidget-input {
+ background-color: var( --color-surface-0 );
}
-// that's how nested the background-color property of a tagWidget is
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-tagItemWidget.oo-ui-widget-enabled {
&.selected {
border-color: var( --color-primary );
- background-color: var( --color-surface-3 );
+ background-color: var( --background-color-primary--hover );
}
}
diff --git a/skinStyles/extensions/CodeEditor/ext.codeEditor.ace.less b/skinStyles/extensions/CodeEditor/ext.codeEditor.ace.less
new file mode 100644
index 00000000..08545f36
--- /dev/null
+++ b/skinStyles/extensions/CodeEditor/ext.codeEditor.ace.less
@@ -0,0 +1,52 @@
+/*
+ * Citizen
+ *
+ * SkinStyles for Extension:CodeEditor
+ * Module: ext.codeEditor.ace
+ * Version: REL1_39 67c012c
+ *
+ * Date: 2022-12-15
+*/
+
+@import '../../../resources/variables.less';
+
+// FIXME: Implemement same syntax higlight color as CodeMirror and SyntaxHighlight
+.ace {
+ &-tm {
+ background-color: transparent;
+ color: var( --color-base--emphasized );
+
+ .ace {
+ &_gutter {
+ background-color: transparent;
+ color: var( --color-base--subtle );
+
+ &-active-line {
+ background-color: var( --background-color-quiet--hover );
+ }
+ }
+
+ &_marker-layer {
+ .ace {
+ &_active-line {
+ background-color: var( --background-color-quiet--hover );
+ }
+ }
+ }
+
+ &_print-margin {
+ background: var( --border-color-base );
+ }
+
+ &_cursor {
+ color: var( --color-base--emphasized );
+ }
+ }
+ }
+
+ &_gutter {
+ &-cell {
+ color: var( --color-base--subtle );
+ }
+ }
+}
diff --git a/skinStyles/extensions/CodeEditor/jquery.codeEditor.less b/skinStyles/extensions/CodeEditor/jquery.codeEditor.less
new file mode 100644
index 00000000..8785daee
--- /dev/null
+++ b/skinStyles/extensions/CodeEditor/jquery.codeEditor.less
@@ -0,0 +1,56 @@
+/*
+ * Citizen
+ *
+ * SkinStyles for Extension:CodeEditor
+ * Module: jquery.codeEditor
+ * Version: REL1_39 67c012c
+ *
+ * Date: 2022-12-15
+*/
+
+.wikiEditor-ui .ace_editor {
+ font-family: var( --font-family-monospace );
+}
+
+.codeEditor-status {
+ position: relative;
+ width: auto; // so it won't overflow
+ padding-top: 8px; // Make space for resize indicator
+ padding-right: var( --space-xs );
+ padding-left: var( --space-xs );
+ border-top-color: var( --border-color-base );
+ background-color: var( --color-surface-2 );
+ color: var( --color-base--subtle );
+ line-height: var( --line-height-sm );
+
+ // HACK: Add resize indicator
+ &:after {
+ position: absolute;
+ top: 1px; // counter border top
+ right: 0;
+ left: 0;
+ width: 52px;
+ height: 4px;
+ border-radius: var( --border-radius--pill );
+ margin: 2px auto;
+ background: var( --color-base--subtle );
+ content: '';
+ }
+
+ &-worker,
+ &-line,
+ &-message {
+ padding: 0 var( --space-xs );
+ }
+
+ &-message {
+ border-color: var( --border-color-base );
+ color: var( --color-base--emphasized );
+ }
+}
+
+// So that it connects with CodeEditor's status bar
+.skin-citizen .mw-editform .editOptions {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
diff --git a/skinStyles/extensions/UploadWizard/ext.uploadWizard.less b/skinStyles/extensions/UploadWizard/ext.uploadWizard.less
index 5b511609..34323056 100644
--- a/skinStyles/extensions/UploadWizard/ext.uploadWizard.less
+++ b/skinStyles/extensions/UploadWizard/ext.uploadWizard.less
@@ -30,11 +30,11 @@
}
.mwe-upwiz-file.odd .mwe-upwiz-visible-file {
- background: var( --background-color-framed );
+ background: var( --color-surface-2 );
}
#mwe-upwiz-deeds-thumbnails {
- background-color: var( --background-color-framed );
+ background-color: var( --color-surface-2 );
}
.mwe-upwiz-thumbnail-link canvas,
@@ -44,7 +44,7 @@
.mwe-upwiz-singleLanguageInputWidget {
border-color: var( --border-color-base );
- background-color: var( --background-color-framed );
+ background-color: var( --color-surface-2 );
}
.mwe-upwiz-copyMetadataWidget {
@@ -64,7 +64,7 @@
}
.arrowSteps li {
- background-color: var( --background-color-framed );
+ background-color: var( --color-surface-2 );
color: var( --color-base--subtle );
}
@@ -74,7 +74,7 @@
}
.arrowSteps li.arrow:after {
- border-left-color: var( --background-color-framed );
+ border-left-color: var( --color-surface-2 );
}
.arrowSteps li.arrow:before {
diff --git a/skinStyles/extensions/WSSearchFront/ext.WSSearchFront.module.less b/skinStyles/extensions/WSSearchFront/ext.WSSearchFront.module.less
index 8f240baa..f16c58c2 100644
--- a/skinStyles/extensions/WSSearchFront/ext.WSSearchFront.module.less
+++ b/skinStyles/extensions/WSSearchFront/ext.WSSearchFront.module.less
@@ -9,14 +9,14 @@
*/
:root {
- --tint-1: var( --background-color-framed );
- --border-1: 1px solid var( --background-color-framed--active );
+ --tint-1: var( --color-surface-2 );
+ --border-1: 1px solid var( --color-surface-2--active );
}
.wssearch--filter-options-search,
.wssearch--search-input {
border: 1px solid var( --border-color-base );
- background-color: var( --background-color-framed );
+ background-color: var( --color-surface-2 );
color: var( --color-base );
&:hover {
@@ -41,7 +41,7 @@
&:focus {
border-color: var( --color-base );
- box-shadow: inset 0 0 0 1px var( --base-color ), inset 0 0 0 2px var( --background-color-framed );
+ box-shadow: inset 0 0 0 1px var( --base-color ), inset 0 0 0 2px var( --color-surface-2 );
}
&:active {
@@ -52,12 +52,12 @@
}
.wssearch--selected-filter {
- background-color: var( --background-color-framed );
+ background-color: var( --color-surface-2 );
transition: background-color 0.1s, color 0.1s, border-color 0.1s, box-shadow 0.1s;
&:hover {
border-color: var( --base-color-lighter );
- background-color: var( --background-color-framed--hover );
+ background-color: var( --color-surface-2--hover );
}
&:after {
@@ -80,7 +80,7 @@
&:focus {
border-color: var( --color-base );
background-color: var( --color-base );
- box-shadow: inset 0 0 0 1px var( --base-color ), inset 0 0 0 2px var( --background-color-framed );
+ box-shadow: inset 0 0 0 1px var( --base-color ), inset 0 0 0 2px var( --color-surface-2 );
}
}
@@ -119,7 +119,7 @@
&:active,
&:focus {
border-color: var( --color-base );
- box-shadow: inset 0 0 0 1px var( --base-color ), inset 0 0 0 2px var( --background-color-framed );
+ box-shadow: inset 0 0 0 1px var( --base-color ), inset 0 0 0 2px var( --color-surface-2 );
}
}
@@ -146,13 +146,13 @@
.wssearch--order__option,
.wssearch--size__option {
- background-color: var( --background-color-framed );
+ background-color: var( --color-surface-2 );
color: var( --color-base--emphasized );
}
.wssearch-hit-prop-loading-bg {
- background: linear-gradient( 135deg, var( --background-color-framed ) 25%, transparent 0, transparent 50%, var( --background-color-framed ) 0, var( --background-color-framed ) 75%, transparent 0, transparent );
- background-color: var( --background-color-framed--active );
+ background: linear-gradient( 135deg, var( --color-surface-2 ) 25%, transparent 0, transparent 50%, var( --color-surface-2 ) 0, var( --color-surface-2 ) 75%, transparent 0, transparent );
+ background-color: var( --color-surface-2--active );
}
.wssearch--hit-pill {
@@ -222,7 +222,7 @@
}
.wssearch--checkbox {
- background-color: var( --background-color-framed );
+ background-color: var( --color-surface-2 );
color: var( --color-base--emphasized );
&:hover {
@@ -235,11 +235,11 @@
}
&.wssearch--checkbox-selected:hover {
- background-color: var( --background-color-framed );
+ background-color: var( --color-surface-2 );
}
&:not( :last-child ) {
- border-bottom: 1px solid var( --background-color-framed--active );
+ border-bottom: 1px solid var( --color-surface-2--active );
}
&-count {
@@ -276,7 +276,7 @@
&:active,
&:focus {
border-color: var( --color-base );
- box-shadow: inset 0 0 0 1px var( --base-color ), inset 0 0 0 2px var( --background-color-framed );
+ box-shadow: inset 0 0 0 1px var( --base-color ), inset 0 0 0 2px var( --color-surface-2 );
}
}
@@ -290,7 +290,7 @@
}
&__header > * {
- background-color: var( --background-color-framed--active );
+ background-color: var( --color-surface-2--active );
}
}
diff --git a/skinStyles/mediawiki/special/mediawiki.special.search.styles.less b/skinStyles/mediawiki/special/mediawiki.special.search.styles.less
index ba7cd76b..fc70d671 100644
--- a/skinStyles/mediawiki/special/mediawiki.special.search.styles.less
+++ b/skinStyles/mediawiki/special/mediawiki.special.search.styles.less
@@ -102,7 +102,7 @@
.results-info {
color: var( --color-base--subtle );
- font-size: 0.8125rem;
+ font-size: 0.875rem;
white-space: nowrap;
}
@@ -133,10 +133,12 @@
.mw-search-createlink,
.mw-search-exists {
- padding: var( --space-sm ) var( --space-md );
- border-radius: var( --border-radius--small );
+ // These can generate a empty card when there are no text content
+ // FIXME: re-enable when this is addressed in core
+ // padding: var( --space-sm ) var( --space-md );
+ // background: var( --color-surface-2 );
+ // border-radius: var( --border-radius--small );
margin-top: 0 !important;
- background: var( --color-surface-2 );
color: var( --color-base--emphasized );
}
@@ -172,6 +174,11 @@
.searchmatch {
color: var( --color-base--emphasized );
font-weight: var( --font-weight-semibold );
+
+ a & {
+ // If searchmatch is part of the link (usually title), use link color
+ color: inherit;
+ }
}
.searchresults {