feat: export complete Discourse themes ecosystem (16 themes, SCSS, JS components and color schemes)

This commit is contained in:
eldov
2026-08-30 18:07:57 +02:00
parent 0d76aaa622
commit 3a411c2643
258 changed files with 16878 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
{
"name": "Foundation",
"authors": "Discourse",
"theme_version": "1.0.0",
"minimum_discourse_version": null,
"maximum_discourse_version": null,
"assets": {},
"modifiers": {},
"color_schemes": {},
"screenshots": [
"screenshots/light.png",
"screenshots/dark.png"
]
}
+445
View File
@@ -0,0 +1,445 @@
{
"id": -1,
"name": "Foundation",
"user_selectable": false,
"color_scheme": {
"id": 3,
"name": "WCAG Dark",
"theme_id": null,
"colors": {
"primary-medium": "999999",
"primary-low-mid": "888888",
"secondary": "0c0c0c",
"tertiary": "759AFF",
"quaternary": "759AFF",
"header_background": "000000",
"header_primary": "ffffff",
"highlight": "3369FF",
"selected": "0d2569",
"hover": "002382",
"danger": "FF697A",
"success": "70B880",
"love": "9D256B",
"primary": "b2c0cd"
}
},
"fields_count": 52,
"files": [
{
"field_id": 512,
"target_id": 0,
"target_name": "common",
"name": "screenshot_dark",
"filename": "common_screenshot_dark.txt",
"bytes": 0
},
{
"field_id": 511,
"target_id": 0,
"target_name": "common",
"name": "screenshot_light",
"filename": "common_screenshot_light.txt",
"bytes": 0
},
{
"field_id": 514,
"target_id": 4,
"target_name": "translations",
"name": "ar",
"filename": "translations_ar.txt",
"bytes": 333
},
{
"field_id": 515,
"target_id": 4,
"target_name": "translations",
"name": "be",
"filename": "translations_be.txt",
"bytes": 197
},
{
"field_id": 516,
"target_id": 4,
"target_name": "translations",
"name": "bg",
"filename": "translations_bg.txt",
"bytes": 197
},
{
"field_id": 517,
"target_id": 4,
"target_name": "translations",
"name": "bs_BA",
"filename": "translations_bs_BA.txt",
"bytes": 200
},
{
"field_id": 518,
"target_id": 4,
"target_name": "translations",
"name": "ca",
"filename": "translations_ca.txt",
"bytes": 197
},
{
"field_id": 519,
"target_id": 4,
"target_name": "translations",
"name": "cs",
"filename": "translations_cs.txt",
"bytes": 331
},
{
"field_id": 520,
"target_id": 4,
"target_name": "translations",
"name": "da",
"filename": "translations_da.txt",
"bytes": 197
},
{
"field_id": 521,
"target_id": 4,
"target_name": "translations",
"name": "de",
"filename": "translations_de.yml",
"bytes": 354
},
{
"field_id": 522,
"target_id": 4,
"target_name": "translations",
"name": "el",
"filename": "translations_el.txt",
"bytes": 197
},
{
"field_id": 523,
"target_id": 4,
"target_name": "translations",
"name": "en",
"filename": "translations_en.yml",
"bytes": 143
},
{
"field_id": 524,
"target_id": 4,
"target_name": "translations",
"name": "en_GB",
"filename": "translations_en_GB.txt",
"bytes": 200
},
{
"field_id": 525,
"target_id": 4,
"target_name": "translations",
"name": "es",
"filename": "translations_es.txt",
"bytes": 342
},
{
"field_id": 526,
"target_id": 4,
"target_name": "translations",
"name": "et",
"filename": "translations_et.txt",
"bytes": 197
},
{
"field_id": 527,
"target_id": 4,
"target_name": "translations",
"name": "fa_IR",
"filename": "translations_fa_IR.txt",
"bytes": 200
},
{
"field_id": 528,
"target_id": 4,
"target_name": "translations",
"name": "fi",
"filename": "translations_fi.txt",
"bytes": 326
},
{
"field_id": 529,
"target_id": 4,
"target_name": "translations",
"name": "fr",
"filename": "translations_fr.txt",
"bytes": 366
},
{
"field_id": 530,
"target_id": 4,
"target_name": "translations",
"name": "gl",
"filename": "translations_gl.txt",
"bytes": 197
},
{
"field_id": 531,
"target_id": 4,
"target_name": "translations",
"name": "he",
"filename": "translations_he.txt",
"bytes": 306
},
{
"field_id": 532,
"target_id": 4,
"target_name": "translations",
"name": "hr",
"filename": "translations_hr.txt",
"bytes": 197
},
{
"field_id": 533,
"target_id": 4,
"target_name": "translations",
"name": "hu",
"filename": "translations_hu.txt",
"bytes": 337
},
{
"field_id": 534,
"target_id": 4,
"target_name": "translations",
"name": "hy",
"filename": "translations_hy.txt",
"bytes": 197
},
{
"field_id": 535,
"target_id": 4,
"target_name": "translations",
"name": "id",
"filename": "translations_id.txt",
"bytes": 197
},
{
"field_id": 536,
"target_id": 4,
"target_name": "translations",
"name": "it",
"filename": "translations_it.txt",
"bytes": 351
},
{
"field_id": 537,
"target_id": 4,
"target_name": "translations",
"name": "ja",
"filename": "translations_ja.txt",
"bytes": 287
},
{
"field_id": 538,
"target_id": 4,
"target_name": "translations",
"name": "ko",
"filename": "translations_ko.txt",
"bytes": 197
},
{
"field_id": 539,
"target_id": 4,
"target_name": "translations",
"name": "lt",
"filename": "translations_lt.txt",
"bytes": 197
},
{
"field_id": 540,
"target_id": 4,
"target_name": "translations",
"name": "lv",
"filename": "translations_lv.txt",
"bytes": 197
},
{
"field_id": 541,
"target_id": 4,
"target_name": "translations",
"name": "nb_NO",
"filename": "translations_nb_NO.txt",
"bytes": 200
},
{
"field_id": 542,
"target_id": 4,
"target_name": "translations",
"name": "nl",
"filename": "translations_nl.txt",
"bytes": 352
},
{
"field_id": 543,
"target_id": 4,
"target_name": "translations",
"name": "pl_PL",
"filename": "translations_pl_PL.txt",
"bytes": 351
},
{
"field_id": 544,
"target_id": 4,
"target_name": "translations",
"name": "pt",
"filename": "translations_pt.txt",
"bytes": 197
},
{
"field_id": 545,
"target_id": 4,
"target_name": "translations",
"name": "pt_BR",
"filename": "translations_pt_BR.txt",
"bytes": 360
},
{
"field_id": 546,
"target_id": 4,
"target_name": "translations",
"name": "ro",
"filename": "translations_ro.txt",
"bytes": 352
},
{
"field_id": 547,
"target_id": 4,
"target_name": "translations",
"name": "ru",
"filename": "translations_ru.txt",
"bytes": 319
},
{
"field_id": 548,
"target_id": 4,
"target_name": "translations",
"name": "sk",
"filename": "translations_sk.txt",
"bytes": 329
},
{
"field_id": 549,
"target_id": 4,
"target_name": "translations",
"name": "sl",
"filename": "translations_sl.txt",
"bytes": 197
},
{
"field_id": 550,
"target_id": 4,
"target_name": "translations",
"name": "sq",
"filename": "translations_sq.txt",
"bytes": 197
},
{
"field_id": 551,
"target_id": 4,
"target_name": "translations",
"name": "sr",
"filename": "translations_sr.txt",
"bytes": 197
},
{
"field_id": 552,
"target_id": 4,
"target_name": "translations",
"name": "sv",
"filename": "translations_sv.txt",
"bytes": 197
},
{
"field_id": 553,
"target_id": 4,
"target_name": "translations",
"name": "sw",
"filename": "translations_sw.txt",
"bytes": 197
},
{
"field_id": 554,
"target_id": 4,
"target_name": "translations",
"name": "te",
"filename": "translations_te.txt",
"bytes": 197
},
{
"field_id": 555,
"target_id": 4,
"target_name": "translations",
"name": "th",
"filename": "translations_th.txt",
"bytes": 197
},
{
"field_id": 556,
"target_id": 4,
"target_name": "translations",
"name": "tr_TR",
"filename": "translations_tr_TR.txt",
"bytes": 324
},
{
"field_id": 557,
"target_id": 4,
"target_name": "translations",
"name": "ug",
"filename": "translations_ug.txt",
"bytes": 337
},
{
"field_id": 558,
"target_id": 4,
"target_name": "translations",
"name": "uk",
"filename": "translations_uk.txt",
"bytes": 335
},
{
"field_id": 559,
"target_id": 4,
"target_name": "translations",
"name": "ur",
"filename": "translations_ur.txt",
"bytes": 313
},
{
"field_id": 560,
"target_id": 4,
"target_name": "translations",
"name": "vi",
"filename": "translations_vi.txt",
"bytes": 326
},
{
"field_id": 561,
"target_id": 4,
"target_name": "translations",
"name": "zh_CN",
"filename": "translations_zh_CN.txt",
"bytes": 273
},
{
"field_id": 562,
"target_id": 4,
"target_name": "translations",
"name": "zh_TW",
"filename": "translations_zh_TW.txt",
"bytes": 200
},
{
"field_id": 513,
"target_id": 9,
"target_name": "about",
"name": "about",
"filename": "about_about.yml",
"bytes": 293
}
]
}
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
ar:
theme_metadata:
description: "السمة التقليدية لمنصة Discourse، الملائمة بشكل جيد للتخصيص بما يتوافق مع متطلبات مجتمعك المحدَّدة."
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
be:
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
bg:
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
bs_BA:
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
ca:
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
cs:
theme_metadata:
description: "Klasický motiv Discourse, který se dobře hodí k přizpůsobení specifickým potřebám vaší komunity."
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
da:
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
de:
theme_metadata:
description: "Das klassische Discourse-Theme, das sich gut für die Anpassung an die spezifischen Bedürfnisse deiner Community eignet."
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
el:
+3
View File
@@ -0,0 +1,3 @@
en:
theme_metadata:
description: "The classic Discourse theme that is well-suited to customization for your community’s specific needs."
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
en_GB:
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
es:
theme_metadata:
description: "El tema clásico de Discourse que se adapta bien a la personalización según las necesidades de tu comunidad."
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
et:
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
fa_IR:
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
fi:
theme_metadata:
description: "Klassinen Discourse-teema, joka sopii hyvin mukauttamiseen yhteisösi erityisiin tarpeisiin."
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
fr:
theme_metadata:
description: "Le thème classique de Discourse, parfaitement adapté à la personnalisation en fonction des besoins spécifiques de votre communauté."
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
gl:
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
he:
theme_metadata:
description: "ערכת הנושא הקלאסית של Discourse שמותאמת לצרכים המסוימים של הקהילה שלכם."
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
hr:
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
hu:
theme_metadata:
description: "A klasszikus diskurzus téma, amely jól illeszkedik a közösség sajátos igényeihez való testreszabáshoz."
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
hy:
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
id:
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
it:
theme_metadata:
description: "Il tema classico di Discourse, ideale per la personalizzazione in base alle esigenze specifiche della tua community."
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
ja:
theme_metadata:
description: "コミュニティーの特定のニーズに合わせてカスタマイズするのに適した Discourse のクラシックテーマ"
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
ko:
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
lt:
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
lv:
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
nb_NO:
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
nl:
theme_metadata:
description: "Het klassieke Discourse-thema dat zich uitstekend leent voor aanpassing aan de specifieke behoeften van je community."
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
pl_PL:
theme_metadata:
description: "Klasyczny motyw Discourse, który doskonale nadaje się do dostosowania do konkretnych potrzeb Twojej społeczności."
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
pt:
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
pt_BR:
theme_metadata:
description: "O tema clássico do Discourse é adequado para a personalização de acordo com as necessidades específicas de sua comunidade."
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
ro:
theme_metadata:
description: "Tema clasică Discourse care este potrivită pentru personalizare în funcție de nevoile specifice ale comunității tale."
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
ru:
theme_metadata:
description: "Классическая тема Discourse, которую легко адаптировать под нужды вашего сообщества."
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
sk:
theme_metadata:
description: "Klasická téma Discourse, ktorá je vhodná na prispôsobenie špecifickým potrebám vašej komunity."
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
sl:
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
sq:
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
sr:
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
sv:
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
sw:
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
te:
+7
View File
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
th:
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
tr_TR:
theme_metadata:
description: "Topluluğunuzun özel ihtiyaçlarına göre özelleştirilmeye uygun klasik Discourse teması."
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
ug:
theme_metadata:
description: "ئەنئەنىۋى Discourse ئۆرنىكى جامائەتنىڭ مۇئەييەن ئېھتىياجىغا ئاساسەن خاسلاشتۇرۇشقا ئىنتايىن ماس كېلىدۇ."
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
uk:
theme_metadata:
description: "Класична тема Discourse, яка добре підходить для налаштування під конкретні потреби вашої спільноти."
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
ur:
theme_metadata:
description: "کلاسک ڈسکورس تھیم جو آپ کی کمیونٹی کی مخصوص ضروریات کے لیے حسب ضرورت موزوں ہے۔"
+9
View File
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
vi:
theme_metadata:
description: "Giao diện Discourse cổ điển, phù hợp để tùy chỉnh cho các nhu cầu cụ thể của cộng đồng bạn."
@@ -0,0 +1,9 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
zh_CN:
theme_metadata:
description: "经典的 Discourse 主题,非常适合根据社区的特定需求进行定制。"
@@ -0,0 +1,7 @@
# WARNING: Never edit this file.
# It will be overwritten when translations are pulled from Crowdin.
#
# To work with us on translations, join this project:
# https://translate.discourse.org/
zh_TW:
+151
View File
@@ -0,0 +1,151 @@
{
"name": "Horizon",
"authors": "Design Team",
"theme_version": "1.0.0",
"modifiers": {
"svg_icons": [
"fire",
"far-square-check",
"far-square",
"thumbtack",
"reply",
"heart",
"user-plus"
],
"serialize_topic_is_hot": true,
"serialize_topic_excerpts": {
"type": "setting",
"value": "topic_card_high_context"
}
},
"color_schemes": {
"Horizon": {
"primary": "1A1A1A",
"secondary": "ffffff",
"tertiary": "595bca",
"tertiary-med-or-tertiary": "595bca",
"selected": "d7dfff",
"header_background": "ffffff",
"header_primary": "1A1A1A",
"hover": "E1E8FF"
},
"Horizon Dark": {
"primary": "ffffff",
"secondary": "1A1A1A",
"tertiary": "6568e6",
"tertiary-med-or-tertiary": "6568e6",
"selected": "3b3e56",
"header_background": "1A1A1A",
"header_primary": "ffffff",
"hover": "333548"
},
"Royal": {
"primary": "1A1A1A",
"secondary": "ffffff",
"tertiary": "1F7BC1",
"tertiary-med-or-tertiary": "1F7BC1",
"selected": "c7e3ff",
"header_background": "ffffff",
"header_primary": "1A1A1A",
"hover": "D6EBFF"
},
"Royal Dark": {
"primary": "ffffff",
"secondary": "1A1A1A",
"tertiary": "1F7BC1",
"tertiary-med-or-tertiary": "1F7BC1",
"selected": "3a455f",
"header_background": "1A1A1A",
"header_primary": "ffffff",
"hover": "323B4E"
},
"Clover": {
"primary": "1A1A1A",
"secondary": "ffffff",
"tertiary": "39845B",
"tertiary-med-or-tertiary": "39845B",
"selected": "c6f1d5",
"header_background": "ffffff",
"header_primary": "1A1A1A",
"hover": "D5F5E0"
},
"Clover Dark": {
"primary": "ffffff",
"secondary": "1A1A1A",
"tertiary": "39845B",
"tertiary-med-or-tertiary": "39845B",
"selected": "47594e",
"header_background": "1A1A1A",
"header_primary": "ffffff",
"hover": "3C4A40"
},
"Lily": {
"primary": "1A1A1A",
"secondary": "ffffff",
"tertiary": "cc338c",
"tertiary-med-or-tertiary": "cc338c",
"selected": "ffc8ee",
"header_background": "ffffff",
"header_primary": "1A1A1A",
"hover": "FFD7F3"
},
"Lily Dark": {
"primary": "ffffff",
"secondary": "1A1A1A",
"tertiary": "cc338c",
"tertiary-med-or-tertiary": "cc338c",
"selected": "5f3e4e",
"header_background": "1A1A1A",
"header_primary": "ffffff",
"hover": "4E3640"
},
"Violet": {
"primary": "1A1A1A",
"secondary": "ffffff",
"tertiary": "9b15de",
"tertiary-med-or-tertiary": "9b15de",
"selected": "feccff",
"header_background": "ffffff",
"header_primary": "1A1A1A",
"hover": "FFD9FF"
},
"Violet Dark": {
"primary": "ffffff",
"secondary": "1A1A1A",
"tertiary": "9b15de",
"tertiary-med-or-tertiary": "9b15de",
"selected": "4c385c",
"header_background": "1A1A1A",
"header_primary": "ffffff",
"hover": "40314C"
},
"Marigold": {
"primary": "1A1A1A",
"secondary": "ffffff",
"tertiary": "d3881f",
"tertiary-med-or-tertiary": "d3881f",
"selected": "ffdcb2",
"header_background": "ffffff",
"header_primary": "1A1A1A",
"hover": "FFE6C6"
},
"Marigold Dark": {
"primary": "ffffff",
"secondary": "1A1A1A",
"tertiary": "d3881f",
"tertiary-med-or-tertiary": "d3881f",
"selected": "6c5b49",
"header_background": "1A1A1A",
"header_primary": "ffffff",
"hover": "584B3E"
}
},
"screenshots": [
"screenshots/light.png",
"screenshots/dark.png"
],
"theme_site_settings": {
"enable_welcome_banner": true,
"search_experience": "search_field"
}
}
@@ -0,0 +1,108 @@
html {
--accent-color: #{$tertiary} !important;
--accent-text-color: #fff;
// Background Colors
--background-color: light-dark(
oklch(from #{$tertiary} 96% calc(c * 0.125) h),
oklch(from #{$tertiary} 10% 0.025 h)
) !important;
--d-content-background: light-dark(
oklch(from #{$secondary} calc(2 * l) c h),
oklch(from #{$secondary} l c h)
) !important;
// HeaderColors
--header_primary-low-mid: light-dark(
oklch(from #{$tertiary} 73.5% calc(c * 0.5) h),
oklch(from #{$tertiary} l calc(c * 0.25) h)
) !important;
--header_primary-medium: light-dark(
oklch(from #{$tertiary} 54% calc(c * 0.5) h),
oklch(from #{$tertiary} calc(l * 1.35) calc(c * 0.25) h)
) !important;
// Sidebar Colors
--d-sidebar-border-color: light-dark(
oklch(from #{$tertiary} 88% calc(c * 0.25) h),
oklch(from #{$tertiary} calc(l * 0.7) calc(c * 0.25) h)
) !important;
--d-sidebar-link-color: light-dark(
oklch(from #{$tertiary} calc(l * 0.8) calc(c * 0.25) h),
oklch(from #{$tertiary} calc(l * 1.5) calc(c * 0.25) h)
) !important;
--d-sidebar-active-color: #{$primary} !important;
--d-sidebar-suffix-color: light-dark(
oklch(from #{$tertiary} l calc(c * 0.9) h),
oklch(from #{$tertiary} l calc(c * 0.9) h)
) !important;
// Other Colors
--d-selected: light-dark(
oklch(from #{$tertiary} 92% calc(c * 0.5) h),
oklch(from #{$tertiary} calc(l * 0.7) calc(c * 0.25) h)
) !important;
--d-nav-color--active: light-dark(
oklch(from #{$tertiary} l c h),
oklch(from #{$tertiary} calc(l * 1.2) c h)
) !important;
--d-nav-color--hover: light-dark(
oklch(from #{$tertiary} l c h),
oklch(from #{$tertiary} calc(l * 1.2) c h)
) !important;
--link-color: light-dark(
oklch(from #{$tertiary} l c h),
oklch(from #{$tertiary} calc(l * 0.95) c h)
) !important;
--link-color-hover: light-dark(
oklch(from #{$tertiary} l c h),
oklch(from #{$tertiary} calc(l * 1.5) calc(c * 2.25) h)
) !important;
--tertiary-hover: #{$tertiary} !important;
// Search Colors
--search-color: light-dark(
oklch(from #{$tertiary} l c h),
oklch(from #{$tertiary} calc(l * 1.5) calc(c * 0.25) h)
) !important;
// Button Colors
--button-box-shadow: light-dark(
oklch(from #{$tertiary} calc(l * 1.5) calc(c * 0.35) h),
oklch(from #{$tertiary} calc(l * 0.75) calc(c * 0.5) h)
) !important;
--d-sidebar-highlight-hover-icon: var(--d-sidebar-link-color) !important;
--d-sidebar-highlight-hover-background: var(--d-selected) !important;
--d-sidebar-link-icon-color: var(--d-sidebar-link-color) !important;
--d-sidebar-header-color: var(--d-sidebar-link-color) !important;
--d-sidebar-header-icon-color: var(--d-sidebar-link-color) !important;
--d-sidebar-active-suffix-color: var(--d-sidebar-suffix-color) !important;
--d-sidebar-background: var(--background-color) !important;
--d-sidebar-footer-fade: var(--background-color) !important;
--d-sidebar-prefix-background: var(--d-selected) !important;
--d-sidebar-active-prefix-background: light-dark(
oklch(from var(--d-selected) calc(l * 0.85) c h),
oklch(from var(--d-selected) calc(l * 0.7) c h)
) !important;
--d-sidebar-highlight-prefix-background: light-dark(
oklch(from var(--d-selected) calc(l * 0.85) c h),
oklch(from var(--d-selected) calc(l * 0.7) c h)
) !important;
--d-sidebar-highlight-suffix-color: var(
--d-sidebar-active-suffix-color
) !important;
--d-sidebar-highlight-color: var(--primary) !important;
--d-sidebar-highlight-background: var(--d-selected) !important;
--d-sidebar-section-link-icon-size: 1em !important;
--d-hover: oklch(from var(--d-selected) l c h / 0.75) !important;
--d-input-bg-color: var(--d-content-background) !important;
--discourse_id-text: var(--accent-text-color) !important;
--discourse_id-text-hover: var(--accent-text-color) !important;
--discourse_id-icon: var(--accent-text-color) !important;
--discourse_id-icon-hover: var(--accent-text-color) !important;
--discourse_id-border: var(--discourse_id-background) !important;
}
:where(.uc-modernize-foundation-theme) {
--d-sidebar-active-background: var(--d-selected) !important;
}
+28
View File
@@ -0,0 +1,28 @@
@import "buttons";
@import "chat";
@import "categories-view";
@import "color-choice";
@import "compatibility";
@import "composer";
@import "composer-peek-mode";
@import "experimental-screen";
@import "discourse-events";
@import "header";
@import "hiddenstuff";
@import "login";
@import "main";
@import "misc";
@import "mobile-stuff";
@import "nav-pills";
@import "welcome-banner";
@import "sidebar";
@import "sidebar-new-topic-button";
@import "topic";
@import "topic-cards";
@import "topic-voting";
@import "high-context-cards";
@import "variables";
:root {
--d-nav-pill-border-radius: 0;
}
+2
View File
@@ -0,0 +1,2 @@
@import "desktop-horizon-fixes";
@import "desktop-full-width";
+122
View File
@@ -0,0 +1,122 @@
@use "lib/viewport";
:root {
--d-button-border-radius: 6.25rem;
}
.discourse-no-touch .topic-body .actions .fade-out {
transition: none;
}
.sidebar-new-topic-button__wrapper {
&:has(.fk-d-tooltip__trigger) {
#create-topic.btn {
border-radius: var(--d-button-border-radius) 0 0
var(--d-button-border-radius);
}
}
}
.discourse-no-touch .btn-default.sidebar-new-topic-button,
.discourse-no-touch .btn-default,
.discourse-no-touch .select-kit .select-kit-header.btn-default {
background: var(--primary-100);
.d-icon {
color: var(--accent-color);
}
&:focus-visible,
&:hover {
background: var(--primary-100);
color: var(--primary);
box-shadow: 0 0 0 4px var(--button-box-shadow);
.d-icon {
color: var(--accent-color);
}
}
&:active:not(:hover, :focus) {
color: var(--primary);
background: var(--tertiary-300);
background-image: none;
.d-icon {
color: var(--tertiary-high);
}
}
}
.btn-primary,
.discourse-no-touch .btn-default.ai-new-question-button {
background-color: var(--accent-color);
color: var(--accent-text-color);
.d-icon {
color: var(--accent-text-color);
}
&:not([disabled]):focus-visible,
&:not([disabled]):hover {
.discourse-no-touch & {
background-color: var(--accent-color);
box-shadow: 0 0 0 4px var(--button-box-shadow);
color: var(--accent-text-color);
.d-icon {
color: var(--accent-text-color);
}
}
}
&:active {
background: light-dark(
oklch(from var(--accent-color) 40% c h),
oklch(from var(--accent-color) 50% c h)
);
}
&:visited {
color: var(--accent-text-color);
}
}
.btn-danger {
.discourse-no-touch & {
&:not([disabled]):focus-visible,
&:not([disabled]):hover {
background-color: var(--danger);
box-shadow: 0 0 0 4px var(--d-button-danger-bg-color--hover);
}
}
}
// DiscoToc plugin
.d-toc-main,
.timeline-footer-controls {
.btn.timeline-toggle {
border-top-right-radius: 8px;
border-top-left-radius: 8px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
bottom: var(--main-grid-gap);
}
}
.d-combo-button:hover {
border-radius: var(--d-button-border-radius);
box-shadow: 0 0 0 4px var(--button-box-shadow);
button:hover {
// remove duplicate shadow from child button
box-shadow: none;
}
}
// Solved
.btn-default.post-action-menu__solved-shared-issue:not(.has-shared-issue) {
.d-icon {
color: var(--icon-color);
}
}
@@ -0,0 +1,365 @@
@use "lib/viewport";
.list-container.--categories {
.avatar-flair {
display: none;
}
}
.categories-and-latest {
.category-list {
border-collapse: separate;
th.topics,
.category-logo {
display: none;
}
thead tr th {
font-size: var(--font-up-1-rem);
font-weight: bold;
}
tbody {
display: flex;
flex-direction: column;
gap: 1em;
padding-top: 1em;
border: 0;
}
tbody tr {
display: grid;
grid-template-areas:
"title topics"
"category category"
"subcategory subcategory";
row-gap: 1em;
border: 1px solid var(--primary-300);
border-radius: var(--d-border-radius-large);
box-shadow: 0 0 12px 1px var(--topic-card-shadow);
}
td.category {
display: contents;
border-top-left-radius: var(--d-border-radius-large);
border-bottom-left-radius: var(--d-border-radius-large);
border-width: 2px;
padding: 1em 1.5rem;
}
tbody h3 {
grid-area: title;
padding: 1em 0 0 1.5rem;
font-size: var(--font-up-1-rem);
.category-name {
display: flex;
align-self: center;
}
.badge-category {
gap: 0.25em;
align-items: center;
font-size: var(--font-up-1-rem);
.d-icon:first-of-type:not([class*="d-icon-lock"]),
&.--style-square::before,
&.--style-emoji .emoji {
width: 1.25em;
height: 1.25em;
margin-right: 0.25em;
}
&.--style-square::before {
border-radius: 6px;
}
}
[class*="d-icon-lock"] {
order: 1;
}
}
.topics {
width: auto;
padding: 1em 1.5rem 0 0;
display: flex;
align-items: center;
justify-content: end;
}
.category-description {
grid-area: category;
padding: 0 1.5rem;
margin: 0;
font-size: var(--font-down-1-rem);
}
.subcategories {
grid-area: subcategory;
gap: 0.25em 0.5em;
padding: 0 1.5rem 1em;
margin: 0;
.badge-category__wrapper {
background-color: var(--badge-category-bg);
padding: 0.25em 0.5rem;
border-radius: var(--d-border-radius);
}
.badge-category__name {
color: var(--badge-category-text);
}
.badge-category.--style-square::before {
border-radius: 3px;
}
}
}
.latest-topic-list {
.table-heading {
border: 0;
font-size: var(--font-up-1-rem);
font-weight: bold;
}
&-item {
display: grid;
grid-template-columns: min-content min-content auto min-content;
grid-template-areas:
"creator title title status"
". category activity activity";
column-gap: 0.75rem;
row-gap: 0.5rem;
background: var(--d-content-background);
box-shadow: 0 0 12px 1px var(--topic-card-shadow);
text-overflow: ellipsis;
padding: 0.75em 1rem;
border: 1px solid var(--primary-300);
border-radius: var(--d-border-radius-large);
margin-top: 1em;
}
.main-link,
.topic-stats {
display: contents;
}
.top-row {
grid-area: title;
}
.bottom-row {
grid-area: category;
.discourse-tags {
display: none;
}
}
.badge-category__wrapper {
border-radius: var(--d-border-radius);
padding: 0.25em 0.5rem;
background-color: var(--badge-category-bg);
@include viewport.until(md) {
padding: 0.25em 0.5rem;
font-size: var(--font-down-2);
}
.badge-category__name {
color: var(--badge-category-text);
}
}
.topic-list-data {
grid-area: likes-replies;
}
.num.posts-map {
display: none;
}
.topic-last-activity {
grid-area: activity;
display: flex;
align-items: center;
text-align: left;
font-size: var(--font-down-1-rem);
&::before {
content: "";
display: inline-block;
width: 0.25em;
height: 0.25em;
background-color: var(--primary-500);
border-radius: 100%;
margin-right: 0.5em;
}
}
.topic-poster {
grid-area: creator;
width: auto;
align-self: flex-start;
.avatar {
height: 24px;
width: 24px;
border-radius: var(--d-border-radius-small);
}
}
}
}
@include viewport.until(sm) {
.category-list.with-topics {
margin-inline: 1rem;
.num.posts,
.category-topics-count,
.category-logo {
display: none;
}
.category-list {
&-item {
padding-top: 0;
padding-bottom: 0;
border-top: 0 !important;
border-bottom: 0 !important;
}
}
tbody {
display: flex;
flex-direction: column;
tr:first-of-type {
order: -2;
}
tr.subcategories-list {
order: -1;
}
tr:nth-last-of-type(2) {
border-bottom: 0;
}
}
th.main-link {
padding-top: 0;
}
}
}
.category-boxes,
.category-boxes-with-topics {
.category-logo {
display: none;
}
@include viewport.from(sm) {
margin-top: 0;
}
@include viewport.until(md) {
padding-inline: 1rem;
box-sizing: border-box;
}
.category {
border: 0;
&-box-inner {
border-radius: var(--d-border-radius-large);
border: 1px solid var(--primary-300);
background: var(--d-content-background);
box-shadow: 0 0 12px 1px var(--topic-card-shadow);
&:hover {
.discourse-no-touch & {
border-color: var(--accent-color);
background: var(--d-content-background);
}
}
&.selected {
box-shadow:
0 0 0 2px var(--accent-color),
0 0 12px 1px var(--topic-card-shadow);
}
}
&-details {
display: flex;
flex-direction: column;
gap: 1rem;
height: 100%;
}
&-box-heading {
h3 {
text-align: left;
}
.badge-category {
display: flex;
flex-wrap: wrap;
align-items: flex-start;
gap: 1em;
justify-content: space-between;
width: 100%;
&__wrapper {
display: flex;
}
&.--style-square::before {
aspect-ratio: 1 / 1;
height: auto;
width: 13%;
border-radius: var(--d-border-radius);
}
&__name {
flex-basis: 100%;
font-size: var(--font-up-1-rem);
}
.d-icon:not([class*="d-icon-lock"]),
img.emoji {
aspect-ratio: 1 / 1;
height: auto;
width: 13%;
}
}
}
.description {
text-align: left;
margin: 0;
font-size: var(--font-down-1-rem);
}
.subcategories {
margin-top: auto;
.subcategory {
margin-bottom: 0;
font-size: var(--font-down-1);
}
}
}
}
// theme component: https://github.com/discourse/discourse-minimal-category-boxes
.custom-category-boxes-container {
@include viewport.until(sm) {
padding-inline: var(--space-4);
box-sizing: border-box;
}
}
+117
View File
@@ -0,0 +1,117 @@
@use "lib/viewport";
.full-page-chat.full-page-chat-sidebar-enabled {
border: none;
}
.c-navbar-container {
background-color: var(--d-content-background);
.full-page-chat & {
@include viewport.from(sm) {
padding: 0 1.5em;
}
}
.chat-drawer.is-collapsed & {
background: var(--tertiary-low);
opacity: 0.7;
}
}
body.has-full-page-chat {
background-color: var(--background-color);
#main-outlet-wrapper {
@media screen and (width < 87rem) {
// ideal width just slightly larger than our xl viewport variable
padding-inline: 0;
}
}
}
.chat-drawer-container {
.is-expanded & {
box-shadow: 0 0 0 2px var(--tertiary-medium);
}
.chat-drawer.is-expanded & {
border: none;
}
.c-navbar__title {
padding-left: 0.33em; // visual alignment for chat index, which does not have a back arrow
}
}
.chat-drawer-outlet-container {
z-index: z("composer", "content");
padding-bottom: 0;
right: var(--main-grid-gap);
&:has(.is-expanded) {
z-index: calc(z("composer", "dropdown") + 1);
}
&.above-composer {
padding-bottom: 0;
}
}
// the below are elements whose z-index needs to be adjusted due to the above change
.chat-message-actions-container {
.has-drawer-chat & {
z-index: calc(z("composer", "dropdown") + 1);
}
}
.fk-d-menu[data-identifier="usercard"],
.fk-d-menu[data-identifier="chat-message-reaction-users"] {
.has-drawer-chat & {
z-index: z("modal", "dialog");
}
}
.chat-drawer {
.peek-mode-active & {
max-width: 90vw;
}
}
.chat-drawer .channels-list-container .chat-channel-row {
margin-bottom: var(--spacing-block-xs);
font-size: var(--font-up-1);
border-bottom: none;
&:hover {
background-color: var(--d-sidebar-active-background);
}
}
.channel-title {
font-weight: bold;
text-transform: uppercase;
font-size: var(--font-down-1);
}
.chat-composer__wrapper {
background: var(--d-content-background);
}
.chat-message-actions .more-buttons .btn-icon-text {
&:hover {
background-color: var(--d-selected);
box-shadow: none;
color: var(--primary);
}
}
.chat-drawer-active.chat-drawer-expanded .chat-composer-dropdown__menu-content {
z-index: z("modal", "dialog");
}
.chat-replying-indicator-container {
@include viewport.from(sm) {
margin-left: calc(0.65em + 0.2rem);
}
}
@@ -0,0 +1,29 @@
.user-color-palette-menu {
&__item .btn-icon-text.btn-flat {
background-color: var(--d-content-background);
width: 100%;
justify-content: flex-start;
}
&__item .btn-icon-text.btn-flat:hover {
background-color: var(--d-selected);
box-shadow: none;
color: var(--primary);
}
&__item .btn-icon-text.btn-flat:hover svg {
color: var(--icon-color);
}
&__item .btn-icon-text.btn-flat svg {
color: var(--icon-color);
}
&__item-choice.active.btn-icon-text.btn-flat {
background-color: var(--d-selected);
}
}
.user-color-palette-content .fk-d-menu__inner-content {
border: none;
}
@@ -0,0 +1,73 @@
@use "lib/viewport";
.custom-homepage-columns {
.header-wrapper {
@include viewport.from(lg) {
margin-bottom: 1.25em;
}
}
.topic-list .topic-list-item {
height: auto;
&:nth-child(odd) {
background: var(--topic-list-item-background-color);
}
}
}
.b-header {
.nav-pills > li > a:hover {
.discourse-no-touch & {
color: var(--secondary);
}
}
.nav-pills > li > a:hover::after {
.discourse-no-touch & {
background: var(--secondary);
}
}
}
// theme component: https://github.com/discourse/discourse-minimal-category-boxes
.custom-category-boxes-container {
@include viewport.until(sm) {
padding-inline: var(--space-4);
box-sizing: border-box;
}
}
@include viewport.from(md) {
#main-outlet {
div[class^="category-title-header"] {
width: calc(100% - (2 * var(--space-4)));
border-radius: var(--d-border-radius-large);
max-width: calc(1000px - 3rem) !important;
}
.list-container div[class^="category-title-header"] {
width: 100%;
}
}
}
// livestream plugin: https://github.com/discourse/discourse-livestream
.livestream-topic.chat-enabled.archetype-regular {
#custom-chat-container {
margin-left: 0;
border-top-left-radius: var(--d-border-radius-large);
border-top-right-radius: var(--d-border-radius-large);
border: 0;
}
.container.posts {
grid-template-columns: auto auto;
}
}
// TC: Blog Style
body:not(.d-toc-installed).blog-post .container.posts,
body.d-toc-installed.blog-post .container.posts {
grid-template-columns: var(--blog-width) 0;
}
@@ -0,0 +1,72 @@
@use "lib/viewport";
.peek-mode-toggle {
display: none;
}
@include viewport.from(xl) {
html:not(.fullscreen-composer) {
.peek-mode-toggle svg {
transform: scaleX(-1);
}
&.composer-open {
.full-width-enabled .peek-mode-toggle {
display: flex;
}
.full-width-enabled.peek-mode-active {
#reply-control.hide-preview {
transition: none;
box-shadow: none;
border-radius: var(--d-border-radius-large);
.grippie {
display: none;
}
.reply-area {
padding-inline: 0.67em;
}
}
#reply-control:not(.fullscreen).hide-preview {
width: 100%;
right: var(--main-grid-gap);
top: var(--header-offset);
bottom: var(--main-grid-gap);
left: unset;
max-width: 36.5vw;
}
&.has-sidebar-page {
#main-outlet-wrapper {
grid-template-columns:
var(--d-sidebar-width) calc(100vw - 38vw - var(--d-sidebar-width))
1fr;
}
}
&:not(.has-sidebar-page) {
#main-outlet-wrapper {
grid-template-columns: 0 calc(100vw - 52vw) 1fr;
}
#reply-control:not(.fullscreen).hide-preview {
max-width: 46vw;
}
}
.sidebar-wrapper .sidebar-container {
height: unset;
}
&:not(.keyboard-visible) {
#reply-control:not(.fullscreen).hide-preview {
height: unset;
}
}
}
}
}
}
+109
View File
@@ -0,0 +1,109 @@
@use "lib/viewport";
#reply-control
.select-kit.dropdown-select-box.composer-actions
.select-kit-header {
border: 1px solid var(--tertiary-700);
background: var(--secondary);
&:hover {
.d-icon {
color: var(--accent-color);
}
}
}
#reply-control.hide-preview:not(.draft) {
@include viewport.from(sm) {
background: var(--d-content-background);
.user-selector,
.title-and-category {
padding: 0 var(--space-4);
width: calc(100% - var(--space-4) * 2);
}
.d-editor-button-bar {
padding: 3px var(--space-4);
border: none;
}
.d-editor-input {
padding: var(--space-4);
}
.reply-area {
padding-inline: 0;
}
.reply-to,
.submit-panel {
padding-inline: var(--space-2);
}
.d-editor-textarea-wrapper {
border: 0;
border-bottom: 1px solid var(--content-border-color);
border-radius: 0;
&.in-focus {
outline: 0;
}
}
}
}
.d-editor-button-bar {
.btn:hover,
.toolbar-popup-menu-options.is-expanded {
.discourse-no-touch & {
background: var(--tertiary-very-low);
color: var(--accent-color);
.d-icon {
color: inherit;
}
// to have parity with regular select-kit styling used elsewhere
.select-kit-row {
.d-icon {
color: var(--primary-high);
}
&:hover {
.d-icon {
color: var(--primary);
}
}
}
}
}
.toolbar-popup-menu-options.is-expanded {
border-radius: var(--d-border-radius);
}
}
.discourse-no-touch .translation-selector-dropdown {
.select-kit-header.btn-default {
background: var(--background-color);
}
}
#reply-control.composer-action-add_translation {
.d-editor-translation-preview-wrapper {
border-color: var(--d-sidebar-border-color);
}
.d-editor-translation-preview-wrapper__header {
top: 6.5rem;
padding: 0.25rem 0.75rem;
background: var(--background-color);
color: var(--accent-color);
border-radius: var(--d-border-radius-large);
}
.topic-title-translator input {
width: 47.25vw;
}
}
@@ -0,0 +1,254 @@
@use "lib/viewport";
// Full width layout. Ported from the Discourse Full Width theme component here
// https://meta.discourse.org/t/discourse-full-width-component/292496, which we
// intend to move into core over time.
//
// We are copying this here so we can continue to iterate on Horizon with full
// width without having to include the theme component as a dependency, we
// need to remove this once full width is in core.
$sidebar-width: 17em;
.wrap {
max-width: unset; // undoing core default
}
.d-header #site-logo {
// this prevents the logo from shifting header content
// when the sidebar is opened
max-height: 100%;
max-width: 100%;
object-fit: contain; // contains logo without squishing/stretching
// allows some flexibility for wide logos
body:not(.has-sidebar-page) & {
max-width: unset;
@include viewport.until(sm) {
max-width: 25vw;
}
}
}
.d-header #site-text-logo {
font-size: clamp(var(--font-0), 2.5vw, var(--font-up-1));
.has-sidebar-page & {
white-space: wrap;
line-height: var(--line-height-medium);
@include line-clamp(2);
}
}
#main-outlet-wrapper {
body.has-sidebar-page & {
.sidebar-wrapper {
width: var(--d-sidebar-width);
}
}
body.has-full-page-chat & {
gap: 0;
}
.sidebar-wrapper {
width: 100%; // safari has issues without this
}
#main-outlet {
margin: 0 auto;
max-width: var(--d-max-width);
width: 100%;
body.has-full-page-chat & {
max-width: unset;
}
}
}
.has-full-page-chat:not(.discourse-sidebar) .full-page-chat {
border: none;
}
#main-outlet > .regular {
max-width: var(--d-max-width);
margin: 0 auto;
body.has-sidebar-page & {
margin: 0 auto;
}
}
.d-header .title:not(.title--minimized) {
// allowing overflow here isn't always ideal
// but works well enough most of the time
overflow: visible;
}
.d-header {
> .wrap {
.contents {
display: grid;
grid-template-areas: "logo lspace extra-info rspace panel";
grid-template-columns:
minmax(auto, 1fr)
auto
minmax(0, calc(var(--d-max-width)))
auto
minmax(auto, 1fr);
.d-header .title {
min-width: auto;
}
.has-sidebar-page & {
// at wide widths, when 1fr > 0
// we want the panel to be the same width as the sidebar
// this way we can get more accurate centering
grid-template-columns:
calc(var(--d-sidebar-width) - 11px) // 11px is wrap padding
1fr
minmax(0, calc(var(--d-max-width)))
1fr
minmax(0, calc(var(--d-sidebar-width) - 11px));
gap: 1em;
// at narrower widths, when 1fr = 0
// we can center without matching the sidebar's width
// which allows the title to take up the remaining width
@media screen and (width <= 1400px) {
grid-template-columns:
calc(var(--d-sidebar-width) - 11px)
1fr
minmax(0, calc(var(--d-max-width)))
1fr
auto;
}
@media screen and (width <= 1000px) {
gap: 0.5em;
}
}
}
}
.header-sidebar-toggle {
grid-area: logo;
}
.before-header-panel-outlet {
grid-area: extra-info;
}
.home-logo-wrapper-outlet {
grid-area: logo;
margin-left: 3.7em; // 2.7em hamburger width + 1em for margin
margin-right: 0.725em;
display: flex;
overflow: visible;
.title {
flex: 1 1 auto;
}
}
.panel {
grid-area: panel;
}
}
.extra-info-wrapper {
grid-area: extra-info;
max-width: var(--d-max-width);
width: 100%;
box-sizing: border-box;
padding: 0;
}
.header-search--enabled .floating-search-input-wrapper {
grid-area: extra-info;
@include viewport.until(md) {
grid-area: rspace;
}
@include viewport.until(sm) {
display: none;
}
}
body.has-sidebar-page {
.wrap {
max-width: unset; // undoing core default
}
.extra-info-wrapper {
padding: 0;
}
@media screen and (width >= calc($reply-area-max-width + ($sidebar-width * 2))) {
#reply-control.show-preview {
margin-left: auto;
margin-right: auto;
}
.sidebar-container {
height: auto;
}
}
@media screen and (width <= calc($reply-area-max-width + ($sidebar-width * 2))) and (width >= calc($reply-area-max-width + calc($sidebar-width / 2))) {
#reply-control.show-preview:not(.fullscreen) {
margin-left: $sidebar-width;
width: auto;
// overruling new core composer changes
max-width: $reply-area-max-width;
transform: none;
}
.sidebar-container {
height: auto;
}
}
// overruling new core composer changes
@media screen and (min-width: $reply-area-max-width) {
#reply-control.show-preview:not(.fullscreen) {
max-width: $reply-area-max-width;
transform: none;
}
}
}
body.sidebar-animate {
#main-outlet-wrapper {
transition: none;
}
.d-header-wrap .wrap {
transition: none;
}
}
.d-header-icons {
display: flex;
}
.rtl {
.d-header .title {
margin-right: 3.7em; // 2.7em hamburger width + 1em for margin
margin-left: 0.725em;
}
}
// provides some extra space for login buttons
@media screen and (width >= 1400px) {
.anon {
.d-header .panel {
grid-column-start: -4;
}
}
}
@@ -0,0 +1,76 @@
.topic-list .topic-list-header .topic-list-data:last-of-type {
padding: 0;
}
// Fixing bulk select (only needed for desktop)
.bulk-select-enabled {
body:not(.user-messages-page) & {
.topic-list-header {
position: sticky;
top: 8em;
height: 0;
z-index: 1;
}
.topic-author-avatar-data {
display: none;
}
.bulk-select.topic-list-data {
grid-area: bulk-select;
margin-left: -0.5em;
@media screen and (width <= 576px) {
margin-top: 0;
label {
padding-block: 0.345em;
}
}
input {
transform: scale(1.5);
}
}
}
}
.topic-list-header {
body:not(.user-messages-page) & {
tr {
border: none;
}
.topic-list-data {
padding: 0;
&:not(.default) {
display: none;
}
&.default {
.bulk-select,
span:not(.bulk-select-topics, .d-button-label) {
display: none;
}
}
.bulk-select-topics {
position: absolute;
right: var(--space-2);
top: var(--space-2);
background: transparent;
border-radius: var(--d-border-radius);
display: flex;
gap: 0.5rem;
margin: var(--space-4) 0;
padding: var(--space-1);
button {
white-space: nowrap;
margin: 0;
}
}
}
}
}
@@ -0,0 +1,5 @@
.discourse-calendar-livestream-zoom-full {
.experimental-screen {
display: none;
}
}
@@ -0,0 +1,187 @@
@use "lib/viewport";
@media screen and (width >= 1300px) {
#main-outlet {
border-top-right-radius: var(--d-border-radius-large);
border-top-left-radius: var(--d-border-radius-large);
}
}
.chat-drawer-active.chat-drawer-expanded {
.experimental-screen {
&__top-left,
&__top-right,
&__bottom-left,
&__bottom-right,
&__bottom-bar {
z-index: 199;
}
}
}
.has-full-page-chat .chat-replying-indicator-container {
margin-bottom: var(--main-grid-gap);
@include viewport.until(lg) {
margin-bottom: 0;
}
}
.has-full-page-chat .chat-selection-management {
margin-bottom: var(--main-grid-gap);
@include viewport.until(lg) {
margin-bottom: 0;
}
}
.experimental-screen {
max-width: unset !important;
width: 100%;
display: block;
margin: 0;
padding: 0;
position: relative;
@include viewport.until(lg) {
display: none;
}
@media screen and (width <= 488px) {
display: none;
}
@include viewport.until(md) {
display: none;
}
li {
list-style: none;
margin: 0;
padding: 0;
}
&__top-left,
&__top-right,
&__bottom-left,
&__bottom-right {
position: fixed;
width: var(--d-border-radius-large);
height: var(--d-border-radius-large);
background-color: var(--background-color);
z-index: calc(
z("base") + 1
); // has to top list-controls, which is sticky in Horizon
mask: radial-gradient(
circle at var(--d-border-radius-large) var(--d-border-radius-large),
transparent var(--d-border-radius-large),
transparent var(--d-border-radius-large),
black var(--d-border-radius-large)
);
}
&__top-left {
top: var(--main-outlet-offset);
left: var(--left-distance);
}
&__top-right {
top: var(--main-outlet-offset);
transform: rotate(90deg);
left: calc(var(--right-distance) - var(--d-border-radius-large));
}
&__bottom-left {
transform: rotate(-90deg);
bottom: var(--main-grid-gap);
left: var(--left-distance);
@media screen and (width <= 768px) {
bottom: calc(var(--d-border-radius-large) * 2);
}
}
&__bottom-right {
transform: rotate(180deg);
bottom: var(--main-grid-gap);
left: calc(var(--right-distance) - var(--d-border-radius-large));
@media screen and (width <= 768px) {
bottom: calc(var(--d-border-radius-large) * 2);
}
}
&__bottom-bar {
position: fixed;
width: 100%;
z-index: calc(
z("base") + 1
); // has to top list-controls, which is sticky in Horizon
background-color: var(--background-color);
bottom: 0;
left: var(--left-distance);
height: var(--main-grid-gap);
@media screen and (width <= 768px) {
height: calc(var(--d-border-radius-large) * 2);
}
@container content-width (width > 1px) {
width: 100cqw;
}
}
}
.rtl .experimental-screen {
&__top-left {
right: var(--left-distance);
left: unset;
}
&__top-right {
transform: rotate(-90deg) !important;
right: calc(var(--right-distance) - var(--d-border-radius-large));
left: unset;
}
&__bottom-left {
transform: rotate(90deg);
right: var(--left-distance);
left: unset;
}
&__bottom-right {
transform: rotate(180deg);
left: unset;
right: calc(var(--right-distance) - var(--d-border-radius-large));
}
&__bottom-bar {
right: var(--left-distance);
left: unset;
}
}
@media screen and (width >= 768px) {
.with-topic-progress {
bottom: calc(
env(safe-area-inset-bottom) + var(--composer-height, 0px) +
var(--d-border-radius-large)
);
}
}
@media screen and (width <= 768px) {
.with-topic-progress {
bottom: calc(
env(safe-area-inset-bottom) + var(--composer-height, 0px) +
calc(var(--d-border-radius-large) * 2)
);
}
}
@media screen and (width <= 400px) {
.with-topic-progress {
bottom: calc(env(safe-area-inset-bottom) + var(--composer-height, 0px));
}
}
+87
View File
@@ -0,0 +1,87 @@
@use "lib/viewport";
.d-header {
box-shadow: none;
background: var(--background-color);
}
.search-menu .search-input,
.search-menu-container .search-input {
border-color: var(--header_primary-low-mid);
}
.user-menu .quick-access-panel,
.user-notifications-list {
li {
&.pending,
&.unread {
background: var(--d-hover);
.discourse-no-touch & {
&:hover,
&:focus {
background: var(--d-selected);
}
}
}
}
}
.discourse-no-touch .d-header-icons .icon:hover,
.discourse-no-touch .d-header-icons .icon:focus,
.header-sidebar-toggle button:focus:hover,
.discourse-no-touch .header-sidebar-toggle button:hover {
background-color: transparent;
}
.discourse-no-touch .d-header-icons .icon:hover > .d-icon,
.drop-down-mode .d-header-icons .active .icon > .d-icon,
.drop-down-mode
.d-header-icons
.header-color-scheme-toggle
.-expanded
> .d-icon,
.discourse-no-touch .header-sidebar-toggle button:hover .d-icon {
color: var(--header_primary-medium);
}
.discourse-no-touch .interface-color-selector-content {
border: none;
border-radius: var(--d-border-radius);
.btn {
border: none;
&:hover {
box-shadow: none;
}
}
}
.drop-down-mode .d-header-icons .active .icon,
.drop-down-mode .d-header-icons .header-color-scheme-toggle .-expanded {
border-color: transparent;
background-color: transparent;
}
.badge-notification {
color: var(--accent-text-color);
}
body.login-page,
body.signup-page,
body.invite-page,
body.password-reset-page,
body.activate-account-page {
.d-header {
background: var(--background-color);
}
}
.header-dropdown-toggle.chat-header-icon .icon .chat-channel-unread-indicator {
border-color: var(--background-color);
}
.d-header-icons .badge-notification {
border-color: var(--background-color);
}
@@ -0,0 +1,17 @@
@use "lib/viewport";
.sidebar__panel-switch-button,
.notifications-button-footer .reason .text,
.pinned-button .reason .text,
.more-topics__browse-more,
.topic-list-layout-trigger {
display: none;
}
@include viewport.from(md) {
.horizon-new-topic-button-enabled {
.list-controls .topic-create-button__combo {
display: none;
}
}
}
@@ -0,0 +1,362 @@
@use "lib/viewport";
$padding-pills-small: var(--space-half) var(--space-2);
.topic-list-body:has(.--high-context) {
--title-color--read: var(--primary-700);
--topic-title-font-weight--visited: 600;
@include viewport.from(sm) {
gap: var(--space-4);
}
}
.topic-list-item.--high-context {
display: block;
background: var(--secondary);
padding: 0;
&.closed {
opacity: 0.9;
}
&.bulk-selecting {
display: flex;
}
&.bulk-selected {
background: var(--tertiary-low);
border-color: var(--tertiary);
&:hover {
background: var(--tertiary-medium);
}
}
@include viewport.from(sm) {
border: 1px solid var(--primary-low);
border-radius: var(--d-border-radius-large);
}
@include viewport.until(sm) {
border-bottom: 1px solid var(--primary-low);
}
&.selected {
border-color: var(--accent-color);
box-shadow: 0 0 12px 1px var(--topic-card-shadow);
}
.bulk-select-enabled & {
> .bulk-select {
display: none;
}
}
}
.hc-topic-card {
display: flex;
flex-direction: column;
gap: var(--space-3);
padding: var(--space-4) var(--space-5);
width: 100%;
box-sizing: border-box;
@include viewport.until(sm) {
padding: var(--space-4) 0;
> *:not(.hc-topic-card__footer) {
padding-inline: var(--space-4);
}
}
@include viewport.from(sm) {
padding: var(--space-4);
}
&__header {
display: flex;
justify-content: space-between;
align-items: flex-start;
@include viewport.until(sm) {
align-items: center;
}
}
&__op {
display: flex;
align-items: center;
gap: var(--space-2);
color: var(--primary-medium);
font-size: var(--font-down-1-rem);
}
&__op-info {
display: flex;
flex-direction: column;
}
&__avatar {
flex-shrink: 0;
.avatar {
border-radius: var(--d-border-radius);
height: 32px;
width: 32px;
}
}
&__status {
position: relative;
display: inline-flex;
align-items: center;
gap: var(--space-1);
border-radius: var(--d-border-radius);
white-space: nowrap;
background: var(--secondary);
border: 1px solid var(--primary-low-mid);
font-weight: 700;
@include viewport.from(sm) {
padding: $padding-pills-small;
}
@include viewport.until(sm) {
padding: var(--space-1);
border-radius: calc(var(--d-border-radius) / 2);
}
&.--solved {
color: var(--success);
font-weight: 700;
border-color: var(--success);
}
&.--pinned {
font-weight: 700;
}
&.--hot {
border: 1px solid var(--danger);
color: var(--danger);
}
}
&__category .badge-category__wrapper {
padding: var(--space-half) var(--space-2) !important;
font-size: var(--font-down-1-rem);
border-radius: var(--d-border-radius-small) !important;
}
&__status-tags {
display: inline-flex;
align-items: center;
gap: var(--space-3);
@include viewport.from(sm) {
font-size: var(--font-down-2-rem);
}
@include viewport.until(sm) {
font-size: var(--font-0);
}
}
&__content {
display: flex;
flex-direction: column;
gap: var(--space-2);
}
&__bulk-select {
display: inline-flex;
align-items: center;
justify-content: center;
padding-inline: var(--space-3) 0;
cursor: pointer;
input {
margin: 0;
}
}
&__title {
font-weight: 700;
font-size: var(--font-up-1-rem);
color: var(--primary);
text-decoration: none;
line-height: 1.3;
a {
color: var(--primary);
word-break: break-word;
> * {
pointer-events: none;
}
}
.topic-status.--pinned,
.topic-status.--unpinned,
.topic-status.--solved,
.topic-status.--unsolved {
display: none;
}
}
.topic-excerpt {
overflow-wrap: anywhere;
.--high-context & {
color: var(--primary-high);
line-height: 1.25;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
font-size: var(--font-0);
width: 100%;
}
}
&__context {
display: flex;
gap: var(--space-3);
flex-wrap: wrap;
}
&__assigned {
display: inline-flex;
align-items: center;
gap: var(--space-1);
padding: $padding-pills-small;
border-radius: var(--d-border-radius-small);
background: var(--primary-very-low);
color: var(--primary-medium);
font-size: var(--font-down-2-rem);
}
&__tags {
flex-shrink: 0;
display: flex;
gap: var(--space-2);
flex-wrap: wrap;
.discourse-tags__tag-separator {
display: none;
}
.discourse-tag {
padding: var(--space-half) var(--space-2);
border-radius: var(--d-border-radius-small);
border: 1px solid var(--primary-low);
background: var(--secondary);
color: var(--primary-high);
white-space: nowrap;
font-size: var(--font-down-2-rem);
&.assigned-to,
&.list-vote-count {
display: none;
}
}
}
&__footer {
position: relative;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: var(--space-3);
@include viewport.from(sm) {
border-top: 1px solid var(--primary-low);
padding-top: var(--space-3);
}
@include viewport.until(sm) {
&::after {
content: "";
position: absolute;
inset: 0;
pointer-events: none;
background: linear-gradient(
to right,
var(--secondary) 0,
transparent 1rem,
transparent calc(100% - 1rem),
var(--secondary) 100%
);
}
}
}
&__category-tags {
display: flex;
gap: var(--space-2);
overflow: auto;
@include viewport.until(sm) {
padding-inline: var(--space-4);
}
&::-webkit-scrollbar {
display: none; // Chrome/Safari
}
}
&__category {
flex-shrink: 0;
}
&__stats {
display: flex;
align-items: center;
gap: var(--space-4);
margin-left: auto;
flex-shrink: 0;
@include viewport.until(sm) {
padding-inline: var(--space-4);
}
}
&__replies,
&__likes,
&__votes {
display: inline-flex;
align-items: center;
gap: var(--space-1);
color: var(--primary-medium);
font-size: var(--font-down-1-rem);
}
&__last-reply {
display: inline-flex;
align-items: center;
gap: var(--space-1);
padding: $padding-pills-small;
border-radius: var(--d-border-radius-small);
background: var(--primary-very-low);
font-size: var(--font-down-2-rem);
color: var(--primary-medium);
.avatar {
border-radius: 50%;
height: 1rem;
width: 1rem;
}
@include viewport.until(sm) {
.avatar {
width: 1rem;
height: 1rem;
}
}
}
&__time {
color: var(--primary-medium);
}
}
+15
View File
@@ -0,0 +1,15 @@
body.static-login {
#main-outlet-wrapper {
grid-template-areas:
"sidebar blank"
"sidebar content"
"sidebar below-content";
grid-template-rows: auto 1fr auto;
}
.login-welcome {
border-radius: 0;
border: none;
box-shadow: none;
}
}
+152
View File
@@ -0,0 +1,152 @@
@use "lib/viewport";
:root {
--main-grid-gap: 0.5em;
}
html:not(:has(.has-full-page-chat)) {
background-color: var(--background-color);
@include viewport.until(lg) {
background-color: var(--d-content-background);
}
}
body {
-webkit-font-smoothing: antialiased;
@include viewport.until(sm) {
background-color: var(--d-content-background);
}
@include viewport.from(lg) {
&.account-created-page,
&.activate-account-page {
background: var(--background-color);
}
}
}
#main-outlet-wrapper {
@include viewport.from(lg) {
gap: var(--main-grid-gap);
}
}
body.has-sidebar-page.has-full-page-chat #main-outlet-wrapper {
column-gap: var(--main-grid-gap);
background-color: var(--background-color);
@include viewport.until(lg) {
background-color: var(--secondary);
}
}
body.has-full-page-chat:not(.has-sidebar-page) {
.d-header {
background-color: var(--background-color);
}
#main-outlet-wrapper {
gap: var(--main-grid-gap);
@include viewport.until(lg) {
gap: 0;
}
}
}
body.has-sidebar-page #main-outlet-wrapper {
#main-outlet {
max-width: unset;
}
@include viewport.from(lg) {
gap: var(--main-grid-gap);
padding-right: var(--main-grid-gap);
}
}
body:not(.has-sidebar-page) #main-outlet-wrapper {
@include viewport.from(lg) {
grid-template-columns: 0 minmax(0, 1fr) 0;
}
}
body:not(.has-full-page-chat, .wizard) {
@include viewport.from(xl) {
background-color: var(--background-color);
}
#main-outlet-wrapper {
#main-outlet {
width: 100%;
max-width: unset;
padding-bottom: var(--space-6);
border-radius: var(--d-border-radius-large);
background-color: var(--d-content-background);
@include viewport.until(lg) {
border-radius: 0;
}
html.composer-open & {
padding-bottom: var(--composer-height);
}
@include viewport.from(sm) {
> *:not(
.experimental-screen,
.activate-account,
.discourse-kanban-board-viewer
) {
box-sizing: border-box;
max-width: 1000px;
margin-inline: auto;
padding-inline: var(--space-6);
}
}
}
}
}
body.has-admin-changes-banner #main-outlet-wrapper #main-outlet {
// makes space so save banner doesn't overlap content
padding-bottom: 6em;
}
@include viewport.until(sm) {
.welcome-banner {
display: none;
}
}
#list-area {
.topic-list-body {
padding-top: var(--space-4);
}
}
aside.onebox {
background-color: var(--d-content-background);
}
.d-editor-preview-wrapper {
border-radius: var(--d-border-radius);
padding: 1em;
background-color: var(--d-content-background);
}
.no-ember {
#main-outlet {
border-radius: var(--d-border-radius-large);
max-height: calc(100vh - 50px - 1em - var(--main-grid-gap));
}
}
.activate-account {
.activate-account-button,
.continue-button {
margin-inline: 0;
}
}
+139
View File
@@ -0,0 +1,139 @@
@use "lib/viewport";
.user-main .about.collapsed-info .details {
background: var(--d-content-background);
}
.user-menu .quick-access-panel .read,
.user-notifications-list .read {
background: var(--d-content-background);
}
.powered-by-discourse {
z-index: calc(
z("base") + 2
); // has to top experimental framing inset elements of Horizon
}
.boxed.white {
background-color: var(--d-content-background);
}
.admin-area .sidebar-wrapper .admin-panel {
background-color: transparent;
}
.admin-report .chart__body .report-alert.no-data,
.admin-report .chart__body .report-alert.rate-limited {
background-color: var(--d-content-background);
}
.admin-detail {
background-color: var(--d-content-background);
}
.select-kit.combo-box .select-kit-header,
.select-kit.multi-select .multi-select-header,
.d-editor-textarea-wrapper,
.fk-d-menu__inner-content,
.menu-panel {
background-color: var(--d-content-background);
}
.d-editor-textarea-wrapper.in-focus,
input[type="text"]:focus,
input[type="password"]:focus,
input[type="datetime"]:focus,
input[type="datetime-local"]:focus,
input[type="date"]:focus,
input[type="month"]:focus,
input[type="time"]:focus,
input[type="week"]:focus,
input[type="number"]:focus,
input[type="email"]:focus,
input[type="url"]:focus,
input[type="search"]:focus,
input[type="tel"]:focus,
input[type="color"]:focus,
.select-kit.multi-select.is-expanded .multi-select-header,
.select-kit.multi-select .multi-select-header:focus {
border-color: var(--accent-color);
outline: 2px solid var(--accent-color);
}
#reply-control {
background-color: var(--background-color);
}
@include viewport.until(sm) {
// pinned topic excerpts are hidden on small screens too
.fk-d-menu__trigger.topic-list-layout-trigger {
display: none;
}
}
.search-container .search-header,
.search-container .search-bar,
.search-container .search-filters,
.search-container .search-filters .search-advanced-filters {
background-color: var(--d-content-background);
}
.user-main .about .details {
padding: 1em 1em 0;
border-bottom: 0;
border-radius: var(--d-border-radius);
background-color: var(--primary-50);
}
.alert.alert-info {
background: var(--tertiary-very-low);
}
.discourse-reactions-list .reactions {
gap: 0.15em;
}
.group-details-container {
border-radius: var(--d-border-radius);
}
.period-chooser-header {
border-radius: 0;
}
.upcoming-change__badge-info {
padding-right: var(--space-2);
}
// compatibility with the top contributors sidebar theme component
// https://meta.discourse.org/t/top-contributors-sidebar/215110
.list-container
#list-area
> .contents
> .topic-list:has(.discourse-top-contributors) {
grid-template-areas: "head head" "body sidebar";
grid-template-rows: auto 1fr;
@include viewport.until(lg) {
grid-template-areas: "head head" "body body";
}
tbody {
display: flex;
}
.discourse-top-contributors {
width: auto;
box-sizing: border-box;
@include viewport.until(lg) {
display: none;
}
.top-contributors-heading {
font-size: var(--font-up-2);
padding-bottom: 0.5em;
}
}
}
@@ -0,0 +1,224 @@
@use "lib/viewport";
// temp separate file to avoid merge hell… to be distributed later
@include viewport.until(lg) {
html,
.d-header {
background-color: var(--d-content-background);
}
}
#main-outlet-wrapper {
*[class*="navigation-"] & {
@include viewport.until(sm) {
padding: 0;
}
}
}
#main-outlet {
@include viewport.until(sm) {
padding-top: var(--space-2);
}
.list-controls {
@include viewport.until(sm) {
padding-inline: var(
--space-4
) !important; // override will be fixed when the whole chat page shenanigans is resolved
padding-block: var(--space-2);
border-bottom: 1px solid var(--primary-200);
}
.navigation-container {
@include viewport.until(sm) {
gap: var(--space-2);
.category-breadcrumb.hidden,
.category-breadcrumb {
display: flex !important;
column-gap: var(--space-4);
row-gap: var(--space-1);
flex-basis: 100%;
li {
margin-right: 0;
margin-left: calc(
(var(--space-2) - 2px) * -1
); // 2px is width of the outline
}
.select-kit-header-wrapper {
gap: 0.25em;
}
.select-kit-header {
background: var(--d-content-background);
}
}
.btn-default {
border: 0;
margin-right: 0;
.d-icon {
font-size: var(--font-up-1);
}
}
.fk-d-button-tooltip {
margin-right: 0;
margin-left: var(
--space-1
); // pure visual correction for horizontal alignment
&:has(#create-topic) {
order: 1;
}
}
}
#navigation-bar,
.navigation-controls,
.category-breadcrumb {
@include viewport.until(sm) {
margin-bottom: 0;
}
}
}
}
.list-container {
@include viewport.until(sm) {
padding-inline: 0 !important;
}
.topic-list-body {
@include viewport.until(sm) {
border-top: 0;
padding-top: 0;
}
}
}
#topic-title {
@include viewport.until(sm) {
.title-wrapper {
gap: var(--space-2);
}
.topic-category {
order: -1;
}
.badge-category__wrapper {
font-size: var(--font-down-2-rem);
border-radius: var(--d-border-radius);
padding: var(--space-1) var(--space-2);
background-color: var(--badge-category-bg);
border: 1px solid var(--badge-category-bg);
}
.badge-category__name {
color: var(--badge-category-text);
}
.discourse-tags {
gap: var(--space-1);
&__tag-separator {
display: none;
}
}
.discourse-tag {
font-size: var(--font-down-2-rem);
padding: var(--space-1) var(--space-2);
gap: var(--space-1);
border-radius: var(--d-border-radius-large);
border: 1px solid var(--primary-low-mid);
background: var(--secondary);
}
}
}
body:not(.archetype-private_message) {
.container.posts {
@include viewport.until(sm) {
.main-avatar .avatar {
width: 40px;
height: 40px;
}
.topic-body {
.topic-meta-data {
.username {
font-size: var(--font-0-rem);
}
}
.contents {
padding-top: var(--space-4);
}
}
.small-action {
&-desc {
padding: var(--space-1) 0;
}
// for core eventually, better way imo
.topic-avatar {
padding-top: 0;
align-items: center;
.d-icon {
font-size: var(--font-up-1);
}
}
}
}
}
}
#topic-footer-buttons {
@include viewport.until(sm) {
padding-inline: var(--space-1) !important;
}
}
}
// should be changed in core, should not be a primary btn
// changing this into straight buttons to match the progress one, which doesn't work well with rounded corners
#topic-progress-wrapper {
.progress-back-container {
margin-right: 0;
margin-bottom: var(--space-1);
.btn-primary.progress-back {
border-radius: 0;
background: var(--secondary);
border: 1px solid var(--tertiary-low);
color: var(--accent-color);
padding: var(--space-2) var(--space-4);
.d-icon {
color: var(--accent-color);
}
}
}
.topic-admin-menu-trigger {
border-radius: 0;
background: var(--secondary);
border: 1px solid var(--tertiary-low);
}
}
.mobile-device #reply-control.show-preview .submit-panel {
background-color: var(--background-color);
}
.d-editor-preview-wrapper {
outline: 2px solid var(--background-color);
}
@@ -0,0 +1,64 @@
.list-controls {
position: sticky;
top: var(--header-offset);
background: var(--d-content-background);
z-index: z("base") + 1;
padding: 1rem 0 0 0;
max-width: unset;
border-top-left-radius: var(--d-border-radius-large);
border-top-right-radius: var(--d-border-radius-large);
.navigation-container {
gap: 1rem;
.category-breadcrumb {
order: 1;
}
}
.combo-box .combo-box-header {
// needs more specificity than just in the button file
background-color: var(--secondary);
border-radius: var(--d-border-radius);
border: 1px solid var(--primary-300);
&:hover {
border: 1px solid var(--accent-color);
}
&:focus-visible {
.discourse-no-touch & {
background: var(--secondary);
color: var(--accent-color);
box-shadow: 0 0 0 3px var(--button-box-shadow);
.d-icon {
color: var(--accent-color);
}
}
}
}
}
.select-kit.is-expanded .select-kit-body {
border-radius: var(--d-border-radius);
background-color: var(--d-content-background);
}
.nav-pills > li > a:hover,
.nav-pills > li button:hover {
.discourse-no-touch & {
background: transparent;
color: var(--d-nav-color--hover);
&::after {
content: "";
position: absolute;
left: 0;
bottom: 0;
right: 0;
height: var(--d-nav-underline-height);
background: var(--d-nav-color--hover);
}
}
}
@@ -0,0 +1,117 @@
@use "lib/viewport";
.has-ai-conversations-sidebar {
.sidebar-new-topic-button__wrapper {
display: none;
}
}
.sidebar-new-topic-button {
flex: 1 1 auto;
&__wrapper {
box-sizing: border-box;
display: flex;
margin: var(--space-2) var(--space-6) 0 var(--space-2);
position: relative;
@include viewport.from(lg) {
&:not(:hover, :focus-visible) {
&::after {
content: "";
width: 100%;
height: var(--space-4);
position: absolute;
bottom: calc(var(--space-4) * -1);
background: linear-gradient(
to top,
transparent 0,
var(--background-color) 100%
);
z-index: 1;
}
}
}
&:focus-visible,
&:hover {
.discourse-no-touch & {
background-color: var(--button-box-shadow);
box-shadow: 0 0 0 4px var(--button-box-shadow);
color: var(--accent-text-color);
.d-icon {
color: var(--accent-text-color);
}
}
}
.mobile-view & {
margin: 0 0 1rem;
}
&:has(.topic-drafts-menu-trigger) {
.sidebar-new-topic-button {
&:focus-visible,
&:hover {
.discourse-no-touch & {
box-shadow: none;
background: light-dark(
oklch(from var(--accent-color) 40% c h),
oklch(from var(--accent-color) 50% c h)
);
}
}
}
}
.fk-d-button-tooltip {
flex: 1 1 auto;
}
.topic-drafts-menu-trigger {
flex: 0 1 auto;
margin: 0;
border-radius: 0 var(--d-button-border-radius)
var(--d-button-border-radius) 0;
&:focus-visible,
&:hover {
.discourse-no-touch & {
box-shadow: none;
background: light-dark(
oklch(from var(--accent-color) 40% c h),
oklch(from var(--accent-color) 50% c h)
);
}
}
}
.fk-d-button-tooltip:has(button[disabled]) {
+ .topic-drafts-menu-trigger {
display: none;
}
.fk-d-tooltip__trigger {
background: var(--accent-color);
border-radius: 0 var(--d-button-border-radius)
var(--d-button-border-radius) 0;
padding-right: 0.65em;
.d-icon {
color: var(--secondary);
}
}
}
}
}
li.sidebar-section-link-wrapper[data-list-item-name="New Topic"] {
display: none;
}
.has-full-page-chat {
.sidebar-new-topic-button__wrapper {
display: none;
}
}
+111
View File
@@ -0,0 +1,111 @@
@use "lib/viewport";
:root {
--d-sidebar-active-background: var(--d-selected);
}
body.has-full-page-chat .sidebar-wrapper,
.sidebar-wrapper,
.sidebar-hamburger-dropdown {
@include viewport.until(lg) {
background: var(--secondary);
.sidebar-footer-wrapper {
background: var(--secondary);
.sidebar-footer-container::before {
display: none;
}
}
}
.has-full-page-chat &,
.has-full-page-chat & .sidebar-footer-wrapper {
background: transparent;
}
.sidebar-container {
border-right: none;
}
.sidebar-section-link {
transition: none;
border-radius: var(--d-border-radius);
}
.dropdown-menu__item .sidebar-section-link {
border-radius: 0;
}
}
.sidebar-hamburger-dropdown {
.sidebar-new-topic-button__wrapper {
width: 100%;
margin: 0 0 var(--space-2);
}
}
.sidebar-section-wrapper {
--d-sidebar-section-border-color: var(--d-sidebar-border-color);
@include viewport.from(xl) {
padding-block: 0.45em;
}
@include viewport.until(sm) {
.hamburger-panel .revamped & {
margin-bottom: var(--space-4);
}
}
.sidebar-section-header {
font-size: var(--font-down-2);
}
.sidebar-section-content {
margin: 0;
display: flex;
flex-direction: column;
@include viewport.from(xl) {
gap: var(--space-1);
}
}
}
.sidebar-wrapper .sidebar-sections {
--scrollbarThumbBg: var(--d-selected);
}
.sidebar-section-link-wrapper .sidebar-section-link:focus,
.sidebar-section-link-wrapper .sidebar-section-link:hover {
.d-icon {
color: var(--primary);
}
}
// put the draft menu above the slide-out hamburger on small desktop screens
@include viewport.until(md) {
html:not(.mobile-view) {
.topic-drafts-menu-content {
z-index: z("modal", "overlay");
}
}
}
.admin-area .sidebar-wrapper .admin-panel {
--d-sidebar-highlight-background: var(--d-selected);
--d-sidebar-link-icon-color: var(--d-sidebar-link-color);
}
.sidebar-theme-toggle__wrapper {
order: -1;
.d-icon-paintbrush {
display: none;
}
}
.sidebar-theme-toggle-dropdown.select-kit.combo-box .select-kit-header {
padding-left: 1em;
}
@@ -0,0 +1,654 @@
@use "lib/viewport";
:root {
--d-border-radius-small: calc(var(--d-border-radius) * 0.5);
--topic-list-item-background-color: var(--d-content-background);
--topic-list-item-background-color--visited: var(--d-content-background);
--topic-card-shadow: rgb(var(--tertiary-rgb), 0.1);
}
.badge-category__wrapper {
--badge-category-bg: light-dark(
oklch(from var(--category-badge-color) 97% calc(c * 0.3) h),
oklch(from var(--category-badge-color) 45% calc(c * 0.5) h)
);
--badge-category-text: light-dark(
oklch(from var(--category-badge-color) 20% calc(c * 1) h),
oklch(from var(--category-badge-color) 100% calc(c * 0.9) h)
);
}
.topic-list.--d-topic-cards .topic-list-header .topic-list-data {
max-width: unset;
}
.topic-list .topic-list-item-separator {
display: none;
}
.topic-list > .topic-list-body > .topic-list-item.last-visit {
border-bottom: 1px solid var(--primary-300);
&:hover {
border-color: var(--accent-color);
}
}
.topic-list,
.category-boxes .subcategories {
.badge-category__wrapper {
border-radius: var(--d-border-radius);
padding: 3px 6px;
background-color: var(--badge-category-bg);
@include viewport.until(md) {
padding: 2px 6px;
font-size: var(--font-down-2);
}
.badge-category__name {
color: var(--badge-category-text);
}
}
}
// undo all the above for the few instances that arent styled like traditional badges
.category-text-title {
.badge-category__wrapper {
border-radius: 0;
padding: 0;
background-color: transparent;
.badge-category__name {
color: var(--primary);
}
}
}
.topic-list.--d-topic-cards .topic-list-body {
border: none;
display: flex;
flex-direction: column;
gap: var(--space-4);
@include viewport.until(lg) {
gap: var(--space-2);
}
@include viewport.until(sm) {
gap: 0;
padding: 0;
}
}
.topic-list.--d-topic-cards .topic-list-body .topic-list-item {
cursor: pointer;
}
.topic-list.--d-topic-cards
.topic-list-body
.topic-list-item:not(.--high-context) {
position: relative;
text-overflow: ellipsis;
padding: var(--space-3);
border: 1px solid var(--primary-300);
display: grid;
grid-template-columns: min-content min-content min-content auto min-content;
grid-template-areas:
"creator title title title status"
". category activity activity .";
gap: var(--space-3);
border-radius: var(--d-border-radius);
&.--has-replies {
grid-template-areas:
"creator title title title status"
". category likes-replies activity .";
}
&:not(.--has-replies) {
.topic-likes-replies-data {
display: none;
}
}
@include viewport.until(sm) {
max-width: 100vw;
box-sizing: border-box;
grid-template-areas:
"creator title title title status"
". category activity activity . ";
border: none;
border-bottom: 1px solid var(--primary-200);
box-shadow: none;
border-radius: 0;
padding: var(--space-4) var(--space-3);
&.--has-replies {
grid-template-areas:
"creator title title title status"
". category likes-replies activity . ";
}
}
&.bulk-selecting {
grid-template-columns: min-content min-content min-content min-content auto min-content;
grid-template-areas:
"bulk-select creator title title title status"
"bulk-select category category activity activity .";
&.--has-replies {
grid-template-areas:
"bulk-select creator title title title status"
"bulk-select category category activity likes-replies .";
@include viewport.until(sm) {
grid-template-areas:
"bulk-select creator title title title status"
"bulk-select . category likes-replies activity . ";
}
}
@include viewport.until(sm) {
grid-template-columns: min-content min-content min-content min-content auto min-content;
grid-template-areas:
"bulk-select creator title title title status"
"bulk-select . category activity activity . ";
}
}
&:hover {
.discourse-no-touch & {
box-shadow: 1px 1px 12px 2px var(--topic-card-shadow);
background: var(--d-content-background);
}
}
&.selected {
border: 1px solid var(--accent-color);
box-shadow: 0 0 12px 1px var(--topic-card-shadow);
}
&.excerpt-expanded {
@include viewport.until(sm) {
.topic-excerpt,
.link-bottom-line {
display: none;
}
}
@include viewport.from(sm) {
grid-template-areas:
"creator title title title status"
". category activity activity . "
". excerpt excerpt excerpt excerpt";
&.has-replies {
grid-template-areas:
"creator title title title status"
". category likes-replies activity ."
". excerpt excerpt excerpt excerpt";
}
.bulk-select-enabled & {
grid-template-areas:
"bulk-select creator title title title status"
"bulk-select category category activity likes-replies likes-replies "
" bulk-select excerpt excerpt excerpt excerpt excerpt";
}
}
}
.link-top-line {
grid-area: title;
font-weight: 500;
line-height: calc(var(--space-3) * 2); // avatar sizing
@include viewport.until(sm) {
line-height: normal;
}
.title {
padding: 0;
}
}
// display contents
td.main-link,
td.posters,
td.posts,
td.views,
td.activity,
td.topic-category-status-data {
display: contents;
}
td.num.posts a {
padding: 0;
}
// display:nones
td.main-link a.topic-status,
.link-bottom-line,
.badge-notification.new-topic::before {
display: none;
}
.topic-category-data {
grid-area: category;
display: flex;
}
.badge-category__wrapper {
border-radius: var(--d-border-radius);
@include viewport.until(sm) {
border-radius: var(--d-border-radius-small);
max-width: 125px;
}
padding: 0.25em 0.5rem;
background-color: var(--badge-category-bg);
@include viewport.until(md) {
padding: 0.25em 0.5rem;
}
.badge-category {
align-items: center;
}
.badge-category__name {
font-size: var(--font-down-1);
color: var(--badge-category-text);
min-width: 0;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.d-icon {
width: var(--font-down-1);
height: var(--font-down-1);
}
}
// OP avatar
.topic-creator-data {
grid-area: creator;
.avatar {
height: calc(var(--space-3) * 2);
width: calc(var(--space-3) * 2);
border-radius: var(--d-border-radius);
@include viewport.until(sm) {
border-radius: var(--d-border-radius-small);
}
}
}
.dot-separator {
width: 0.25em;
height: 0.25em;
background-color: var(--primary-500);
border-radius: 100%;
margin-inline: 0.25em;
}
// topic activity, icon, text
.topic-activity-data {
@include ellipsis;
grid-area: activity;
}
.topic-activity {
display: flex;
font-size: var(--font-down-1);
height: 100%;
align-items: center;
gap: 0.25em;
}
.topic-activity__type {
border-radius: 0.25rem;
display: flex;
align-items: center;
justify-content: center;
}
.topic-activity__username {
@include ellipsis;
margin-left: 0.25em;
}
// timestamp
td.activity .post-activity {
grid-area: activity;
font-size: var(--font-down-1);
color: var(--primary-500);
margin-left: auto;
padding: 0;
}
// status
.topic-status-data {
display: none;
}
&.--has-status-card .topic-status-data {
display: block;
grid-area: status;
}
.topic-status-card {
height: min-content;
margin-left: auto;
display: flex;
flex-direction: row;
gap: 0.25em;
align-items: center;
padding: 0.2em 0.5rem;
font-size: var(--font-down-2);
@include viewport.from(lg) {
font-size: var(--font-down-3);
}
font-weight: 600;
border-radius: var(--d-border-radius);
border: 1px solid var(--status-color);
color: var(--status-color);
@include viewport.until(sm) {
border-radius: var(--d-border-radius-small);
padding: 0.35em;
}
&.--pinned {
--status-color: var(--primary-500);
}
&.--hot {
--status-color: var(--danger);
}
@include viewport.from(lg) {
position: absolute;
right: 1rem;
top: 0;
transform: translateY(-45%);
background-color: var(--d-content-background);
}
svg {
color: var(--status-color);
@include viewport.from(lg) {
font-size: var(--font-down-1);
}
}
&__name {
margin: 0;
@include viewport.until(sm) {
display: none;
}
}
}
.topic-list-data {
padding: 0;
}
// metadata - excerpt
.topic-excerpt {
grid-area: excerpt;
margin: 0;
padding: 0;
font-size: var(--font-down-2);
width: 100%;
.excerpt__contents {
color: var(--primary-high);
}
.emoji {
width: 1em;
height: 1em;
}
// default category position hidden
.badge-category__wrapper {
display: none;
}
}
td.main-link .discourse-tags {
display: none;
}
// metadata - likes and replies
td.posts .badge-posts {
grid-area: replies;
align-self: center;
font-weight: normal;
}
td.topic-likes-replies-data {
grid-area: likes-replies;
display: flex;
flex-direction: row;
gap: var(--space-3);
height: min-content;
align-self: center;
.topic-likes {
display: none;
}
}
.topic-likes-replies-data .topic-replies {
display: flex;
flex-direction: row;
gap: 0.5em;
align-items: center;
color: var(--primary-500);
font-size: var(--font-down-1-rem);
svg {
color: var(--primary-600);
}
.number {
white-space: nowrap;
}
}
.bulk-select {
grid-area: bulk-select;
padding: 0;
margin: 0;
align-self: center;
justify-self: center;
@include viewport.until(sm) {
align-self: flex-start;
}
label {
margin: 0;
}
&th {
display: none;
}
}
// Assigned List
&.assigned-list-item {
.topic-status-data {
display: none;
}
grid-template-areas:
"creator title title title dropdown"
". category activity activity .";
&.--has-replies {
grid-template-areas:
"creator title title title dropdown"
"category category likes-replies activity .";
}
.assign-topic-buttons {
display: contents;
.assign-actions-dropdown {
grid-area: dropdown;
justify-content: flex-end;
height: 1em;
.select-kit-header {
padding-top: 0;
margin-left: auto;
align-items: center;
background: transparent;
}
.select-kit-header-wrapper {
height: 1em;
width: 1em;
}
}
}
}
// Bookmarks
&.bookmark-list-item {
grid-template-areas:
"creator title title title dropdown"
"category category activity . . ";
@include viewport.until(sm) {
grid-template-areas:
"title title title title dropdown"
"category category activity activity . ";
.avatar {
display: none;
}
}
&.has-metadata {
grid-template-areas:
"creator title title title dropdown"
"category category activity metadata . ";
@include viewport.until(sm) {
grid-template-areas:
"metadata metadata metadata metadata dropdown"
"title title title title ."
"category category activity activity . ";
}
}
td.author-avatar {
grid-area: creator;
}
td.main-link .link-bottom-line {
display: contents;
.badge-category__wrapper {
grid-area: category;
display: flex;
align-items: center;
width: min-content;
justify-self: flex-end;
}
}
td.main-link .link-top-line {
display: contents;
.bookmark-metadata {
grid-area: metadata;
margin: 0;
display: flex;
align-items: center;
flex-wrap: wrap;
gap: var(--space-2);
white-space: nowrap;
}
.bookmark-metadata-item {
margin: 0;
vertical-align: middle;
}
.bookmark-status-with-link {
grid-area: title;
}
}
.post-excerpt {
grid-area: excerpt;
margin: 0;
}
.topic-list-data:last-of-type {
display: contents;
.bookmark-actions-dropdown {
grid-area: dropdown;
align-self: flex-start;
height: 1em;
.select-kit-header {
padding-top: 0;
margin-left: auto;
align-items: center;
background: transparent;
}
.select-kit-header-wrapper {
height: 1em;
width: 1em;
}
}
}
.post-metadata.topic-list-data.updated-at {
grid-area: activity;
display: flex;
align-items: center;
font-size: var(--font-down-1-rem);
}
td.activity .post-activity {
display: none;
}
}
}
// for both types of context cards
.topic-list.--d-topic-cards {
.event-date {
margin-left: var(--space-2);
font-size: var(--font-down-3);
white-space: nowrap;
font-weight: normal;
}
.event-date-container {
display: inline-flex;
position: relative;
top: -0.15rem;
line-height: normal;
}
}
// bulk-select overrule for j/k nav
.topic-list tr.selected td:first-of-type,
.topic-list-item.selected td:first-of-type {
box-shadow: none;
}
@@ -0,0 +1,35 @@
@use "lib/viewport";
.voting .voting-wrapper {
--d-button-border-radius: var(--d-border-radius-small);
--primary-100: var(--d-selected);
--primary-low: var(--d-selected);
&__button {
background: var(--secondary);
}
.discourse-no-touch & {
button {
&:focus-visible,
&:hover {
box-shadow: none;
}
&:not(.btn-success) {
.d-icon {
color: var(--primary-high);
}
}
}
}
}
.voting.header-title-voting .voting-wrapper {
--primary-high: var(--header_primary-high);
@include viewport.from(lg) {
--secondary: var(--background-color);
--content-border-color: var(--d-sidebar-border-color);
}
}
+135
View File
@@ -0,0 +1,135 @@
@use "lib/viewport";
:root {
--d-post-control-background--hover: var(--d-hover);
}
.post-stream {
.contents {
font-size: var(--font-up-1);
line-height: 1.25;
-webkit-font-smoothing: antialiased;
}
}
.timeline-container .topic-timeline {
.timeline-scrollarea {
border-left: 1px solid var(--accent-color);
.timeline-scroller {
@include viewport.from(lg) {
margin-left: -4.5px;
height: 40px !important; // height is coming from element style have no other choice
}
.timeline-replies,
.timeline-ago {
line-height: 1;
}
}
.timeline-handle {
background-color: var(--accent-color);
outline: 3px solid var(--d-content-background);
@include viewport.from(lg) {
width: 8px;
border-radius: 10px;
height: calc(100% - 6px);
}
}
}
}
// should probably get rid of this extra specificity class in core?
.timeline-container.timeline-fullscreen {
@include viewport.until(lg) {
.topic-timeline
.timeline-scrollarea
.timeline-scroller
.timeline-scroller-content {
padding-right: 0.5em;
}
}
}
body:not(.d-toc-installed) {
.container.posts {
grid-template-columns: auto 8em;
@media screen and (width <= 924px) {
grid-template-columns: auto;
}
}
.topic-navigation-popup {
min-width: 250px;
right: 0;
}
}
.container.posts {
.post-notice {
padding: var(--space-2);
border-radius: var(--d-border-radius);
font-size: var(--font-down-1-rem);
.d-icon {
font-size: var(--font-up-1);
width: 1em;
}
}
}
.topic-post-badges {
.badge-notification {
font-size: var(--font-down-1);
padding: 0.15em 0.35em;
border-radius: 1em;
min-width: 1.3em;
box-sizing: border-box;
color: var(--secondary);
}
}
.timeline-container .topic-timeline .timeline-scroller-content {
overflow: unset;
}
.more-topics__container
.more-topics__list
.topic-list-body
.topic-list-item:last-of-type {
border-bottom: 1px solid var(--primary-300);
}
.discourse-post-event .discourse-post-event-widget {
background: var(--d-content-background);
}
.more-topics__container .nav {
position: unset;
margin-block: unset;
margin-bottom: 1em;
}
nav.post-controls .actions button {
font-size: var(--font-0);
}
.archetype-private_message {
--pm-border-radius: var(--d-border-radius);
}
.header-title {
.event-date {
font-size: var(--font-down-3);
border: 1px solid var(--tertiary-low);
background: var(--tertiary-low);
&.past {
border-color: transparent;
background-color: transparent;
}
}
}
@@ -0,0 +1,6 @@
:root {
--d-max-width: 1000px;
--d-border-radius-large: 20px;
--d-border-radius: 8px;
--d-input-border-radius: 6px;
}
@@ -0,0 +1,132 @@
@use "lib/viewport";
.welcome-banner {
&.--location-below-site-header {
border-radius: 0;
@include viewport.until(lg) {
margin-bottom: var(--space-4);
}
}
&__wrap {
display: flex;
align-items: center;
gap: var(--space-8);
border-bottom: 1px solid var(--primary-300);
margin-block: 0;
padding-block: var(--space-4) var(--space-8);
.--with-bg-img & {
padding-block: clamp(var(--space-4), 10vh, var(--space-11));
}
@include viewport.from(xl) {
justify-content: center;
}
@include viewport.until(md) {
flex-direction: column;
gap: var(--space-4);
}
@include viewport.until(sm) {
display: block;
padding: 0.5em;
margin-top: 0;
}
.--location-below-site-header & {
border-bottom: 0;
padding: var(--space-8);
margin: 0 var(--main-grid-gap) var(--space-2);
@include viewport.until(lg) {
padding: var(--space-8) var(--space-4) var(--space-8);
}
}
.--location-above-topic-content & {
@container (width <= 800px) {
flex-direction: column;
gap: var(--space-4);
}
@include viewport.until(lg) {
padding-inline: var(--space-4);
}
}
.search-menu {
width: 100%;
align-self: center;
.--location-above-topic-content & {
@container (width >= 800px) {
width: 50cqw;
}
}
@include viewport.from(xl) {
margin-inline: unset;
}
}
}
.search-menu .search-input,
.search-menu-container .search-input {
border: 1px solid var(--input-border-color);
border-radius: var(--d-border-radius);
}
.search-menu .search-input:focus-within,
.search-menu-container .search-input:focus-within {
border: 1px solid var(--search-color);
outline: 2px solid var(--search-color);
}
.panel-body {
z-index: z("dropdown");
}
.results {
background: var(--d-content-background);
}
&__title {
text-align: left;
margin: 0;
color: var(--search-color);
.--location-above-topic-content & {
@container (width >= 800px) {
flex-grow: 1;
}
@container (width <= 800px) {
white-space: nowrap;
text-align: center;
}
}
@include viewport.from(xl) {
margin-inline: unset;
}
@include viewport.from(md) {
font-size: clamp(var(--font-up-4), 4vw, var(--font-up-6));
}
@include viewport.until(md) {
font-size: var(--font-up-4);
}
@include viewport.until(sm) {
font-size: var(--font-up-2);
}
}
&__subheader {
white-space: wrap;
}
}
@@ -0,0 +1,6 @@
import { apiInitializer } from "discourse/lib/api";
import ComposerPeekModeToggle from "../components/composer-peek-mode-toggle";
export default apiInitializer((api) => {
api.renderInOutlet("before-composer-toggles", ComposerPeekModeToggle);
});
@@ -0,0 +1,16 @@
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer((api) => {
document.body.classList.add("full-width-enabled");
// When the sidebar is visible, force the HomeLogo to be in an 'un-minimized' state.
api.registerValueTransformer?.(
"home-logo-minimized",
({ value, context }) => {
if (value && context.showSidebar) {
return false;
}
return value;
}
);
});
@@ -0,0 +1,10 @@
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer((api) => {
api.registerValueTransformer(
"hamburger-dropdown-click-outside-exceptions",
({ value }) => {
return [...value, ".topic-drafts-menu-content"];
}
);
});
@@ -0,0 +1,8 @@
import { apiInitializer } from "discourse/lib/api";
import ExperimentalScreen from "../components/experimental-screen";
import UserColorPaletteSelector from "../components/user-color-palette-selector";
export default apiInitializer((api) => {
api.renderInOutlet("above-main-container", ExperimentalScreen);
api.renderInOutlet("sidebar-footer-actions", UserColorPaletteSelector);
});
@@ -0,0 +1,7 @@
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer((api) => {
api.registerValueTransformer("bulk-select-in-nav-controls", () => {
return true;
});
});
@@ -0,0 +1,6 @@
import { apiInitializer } from "discourse/lib/api";
import SidebarNewTopicButton from "../components/sidebar-new-topic-button";
export default apiInitializer((api) => {
api.renderInOutlet("before-sidebar-sections", SidebarNewTopicButton);
});
@@ -0,0 +1,330 @@
import Component from "@glimmer/component";
import { on } from "@ember/modifier";
import { action } from "@ember/object";
import { service } from "@ember/service";
import { themePrefix } from "virtual:theme";
import PluginOutlet from "discourse/components/plugin-outlet";
import BulkSelectCheckbox from "discourse/components/topic-list/bulk-select-checkbox";
import TopicExcerpt from "discourse/components/topic-list/topic-excerpt";
import TopicLink from "discourse/components/topic-list/topic-link";
import UnreadIndicator from "discourse/components/topic-list/unread-indicator";
import TopicPostBadges from "discourse/components/topic-post-badges";
import TopicStatus from "discourse/components/topic-status";
import lazyHash from "discourse/helpers/lazy-hash";
import topicFeaturedLink from "discourse/helpers/topic-featured-link";
import { shortDateNoYear } from "discourse/lib/formatter";
import dAvatar from "discourse/ui-kit/helpers/d-avatar";
import { categoryLinkHTML } from "discourse/ui-kit/helpers/d-category-link";
import dConcatClass from "discourse/ui-kit/helpers/d-concat-class";
import dDiscourseTags from "discourse/ui-kit/helpers/d-discourse-tags";
import dFormatDate from "discourse/ui-kit/helpers/d-format-date";
import dIcon from "discourse/ui-kit/helpers/d-icon";
import dNumber from "discourse/ui-kit/helpers/d-number";
import { i18n } from "discourse-i18n";
import { topicWasUpdatedAfterLastPost } from "../../lib/topic-activity";
import { getTopicStatusBadge } from "../../lib/topic-status-badge";
export default class HighContextTopicCard extends Component {
@service capabilities;
get hasSolved() {
return (
this.args.topic.has_accepted_answer || this.args.topic.accepted_answer
);
}
get hasVotes() {
return this.args.topic.can_vote && this.args.topic.vote_count > 0;
}
get voteCountLabel() {
return i18n(themePrefix("vote_count"), {
count: this.args.topic.vote_count,
});
}
get hasAssigned() {
return this.args.topic.assigned_to_user || this.hasIndirectAssignments;
}
get assignedUser() {
return this.args.topic.assigned_to_user;
}
get hasIndirectAssignments() {
const indirect = this.args.topic.indirectly_assigned_to;
return indirect && Object.keys(indirect).length > 0;
}
get indirectAssignees() {
const indirect = this.args.topic.indirectly_assigned_to;
if (!indirect) {
return [];
}
return Object.values(indirect).map((assignment) => ({
user: assignment.assigned_to,
postNumber: assignment.post_number,
}));
}
get hasTags() {
return this.args.topic.tags?.length > 0;
}
get hasReplies() {
return this.args.topic.replyCount > 0;
}
get hasLikes() {
return this.args.topic.like_count > 0;
}
get replyCountLabel() {
return i18n(themePrefix("reply_count"), {
count: this.args.topic.replyCount,
});
}
get likeCountLabel() {
return i18n(themePrefix("like_count"), {
count: this.args.topic.like_count,
});
}
get hasExcerpt() {
return this.args.topic.excerpt || this.args.topic.hasExcerpt;
}
get statusBadge() {
return getTopicStatusBadge(this.args.topic);
}
get topicCreator() {
return this.args.topic.creator;
}
get hasLastReplyContext() {
return this.hasReplies && !topicWasUpdatedAfterLastPost(this.args.topic);
}
get hasContext() {
return this.hasLastReplyContext || this.hasAssigned;
}
get lastPoster() {
return {
user: this.args.topic.lastPosterUser,
username: this.args.topic.last_poster_username,
};
}
get topicTimestamp() {
return shortDateNoYear(new Date(this.args.topic.created_at));
}
@action
onTitleFocus(event) {
event.target.closest(".topic-list-item").classList.add("selected");
}
@action
onTitleBlur(event) {
event.target.closest(".topic-list-item").classList.remove("selected");
}
<template>
{{#if @bulkSelectEnabled}}
<BulkSelectCheckbox
@topic={{@topic}}
@isSelected={{@isSelected}}
@onToggle={{@onBulkSelectToggle}}
class="hc-topic-card__bulk-select"
/>
{{/if}}
<td class="hc-topic-card">
<div class="hc-topic-card__header">
<div class="hc-topic-card__op">
<div class="hc-topic-card__avatar">
{{dAvatar this.topicCreator imageSize="medium"}}
</div>
<div class="hc-topic-card__op-info">
<span class="hc-topic-card__op-timestamp">
{{i18n (themePrefix "posted")}}
{{this.topicTimestamp}}
</span>
<span class="hc-topic-card__op-name">
{{i18n
(themePrefix "by_username")
username=this.topicCreator.username
}}</span>
</div>
</div>
<div class="hc-topic-card__status-tags">
{{#if this.hasSolved}}
<span
class="hc-topic-card__status --solved"
aria-label={{i18n (themePrefix "solved")}}
>
{{#if this.capabilities.viewport.sm}}
{{i18n (themePrefix "solved")}}
{{/if}}
{{dIcon "square-check"}}
</span>
{{/if}}
{{#if this.statusBadge}}
<span
class={{dConcatClass
"hc-topic-card__status"
this.statusBadge.className
}}
aria-label={{i18n this.statusBadge.text}}
>
{{dIcon this.statusBadge.icon}}
{{#if this.capabilities.viewport.sm}}
<span class="hc-topic-card__status-text">{{i18n
this.statusBadge.text
}}</span>
{{/if}}
</span>
{{/if}}
</div>
</div>
<div class="hc-topic-card__content">
<div class="hc-topic-card__title" role="heading" aria-level="2">
<TopicStatus @topic={{@topic}} @context="topic-list" />
<TopicLink
{{on "focus" this.onTitleFocus}}
{{on "blur" this.onTitleBlur}}
@topic={{@topic}}
class="hc-topic-card__title raw-link raw-topic-link"
/>
{{~#if @topic.featured_link~}}
&nbsp;{{topicFeaturedLink @topic}}
{{~/if~}}
<PluginOutlet
@name="topic-list-after-title"
@outletArgs={{lazyHash topic=@topic}}
/>
<UnreadIndicator @topic={{@topic}} />
<TopicPostBadges
@unreadPosts={{@topic.unread_posts}}
@unseen={{@topic.unseen}}
@url={{@topic.lastUnreadUrl}}
/>
</div>
{{#if this.hasExcerpt}}
<TopicExcerpt @topic={{@topic}} class="hc-topic-card__excerpt" />
{{/if}}
</div>
{{#if this.hasContext}}
<div class="hc-topic-card__context">
{{#if this.hasLastReplyContext}}
<div class="hc-topic-card__last-reply">
{{dAvatar this.lastPoster.user imageSize="tiny"}}
<span
class="hc-topic-card__last-reply-name"
>{{this.lastPoster.username}}</span>
<span>{{i18n (themePrefix "replied")}}</span>
<span class="hc-topic-card__time">
{{dFormatDate @topic.last_posted_at leaveAgo="true"}}
</span>
</div>
{{/if}}
{{#if this.hasAssigned}}
{{#if this.assignedUser}}
<div class="hc-topic-card__assigned">
{{dIcon "user-plus"}}
<span class="sr-only">{{i18n
"discourse_assign.assigned_to"
}}</span>
<span
class="hc-topic-card__assigned-name"
>{{this.assignedUser.username}}</span>
</div>
{{/if}}
{{#each this.indirectAssignees as |assignment|}}
<div class="hc-topic-card__assigned">
{{dIcon "user-plus"}}
<span class="sr-only">{{i18n
"discourse_assign.assigned_to"
}}</span>
<span
class="hc-topic-card__assigned-name"
>{{assignment.user.username}}</span>
<span
class="hc-topic-card__assigned-post"
>#{{assignment.postNumber}}</span>
</div>
{{/each}}
{{/if}}
</div>
{{/if}}
<div class="hc-topic-card__footer">
<div class="hc-topic-card__category-tags">
{{#unless @hideCategory}}
<div class="hc-topic-card__category">
{{categoryLinkHTML @topic.category}}
</div>
{{/unless}}
{{#if this.hasTags}}
{{dDiscourseTags
@topic
mode="list"
className="hc-topic-card__tags"
}}
{{/if}}
</div>
<div class="hc-topic-card__stats">
{{#if this.hasVotes}}
<span
class="hc-topic-card__votes"
aria-label={{this.voteCountLabel}}
title={{this.voteCountLabel}}
>
{{dIcon "check-to-slot" skipTitle=true}}
<span class="hc-topic-card__votes-count">{{dNumber
@topic.vote_count
}}</span>
</span>
{{/if}}
{{#if this.hasReplies}}
<span
class="hc-topic-card__replies"
aria-label={{this.replyCountLabel}}
title={{this.replyCountLabel}}
>
{{dIcon "reply" skipTitle=true}}
<span class="hc-topic-card__count">{{dNumber
@topic.replyCount
}}</span>
</span>
{{/if}}
{{#if this.hasLikes}}
<span
class="hc-topic-card__likes"
aria-label={{this.likeCountLabel}}
title={{this.likeCountLabel}}
>
{{dIcon "heart" skipTitle=true}}
<span class="hc-topic-card__count">{{dNumber
@topic.like_count
}}</span>
</span>
{{/if}}
</div>
</div>
</td>
</template>
}
@@ -0,0 +1,43 @@
import Component from "@glimmer/component";
import dConcatClass from "discourse/ui-kit/helpers/d-concat-class";
import dFormatDate from "discourse/ui-kit/helpers/d-format-date";
import { topicWasUpdatedAfterLastPost } from "../../lib/topic-activity";
export default class TopicActivityColumn extends Component {
get topicUser() {
if (topicWasUpdatedAfterLastPost(this.args.topic)) {
return {
username: undefined,
class: "--updated",
};
}
if (this.args.topic.posts_count > 1) {
return {
username: this.args.topic.last_poster_username,
class: "--replied",
};
} else if (this.args.topic.posts_count === 1) {
return {
username: this.args.topic.last_poster_username,
class: "--created",
};
} else {
return;
}
}
<template>
<span class={{dConcatClass "topic-activity" this.topicUser.class}}>
{{#if this.topicUser.username}}
<span
class="topic-activity__username"
>{{this.topicUser.username}}</span>
<span class="dot-separator"></span>
{{/if}}
<div class="topic-activity__time">
{{dFormatDate @topic.bumpedAt leaveAgo="true" format="tiny"}}
</div>
</span>
</template>
}
@@ -0,0 +1,7 @@
import { categoryLinkHTML } from "discourse/ui-kit/helpers/d-category-link";
const TopicCategoryColumn = <template>
{{categoryLinkHTML @topic.category}}
</template>;
export default TopicCategoryColumn;
@@ -0,0 +1,17 @@
import Component from "@glimmer/component";
import dAvatar from "discourse/ui-kit/helpers/d-avatar";
export default class TopicCreatorColumn extends Component {
get topicCreator() {
return {
user: this.args.topic.creator,
class: "--topic-creator",
};
}
<template>
<div class={{this.topicCreator.class}}>
{{dAvatar this.topicCreator.user imageSize="small"}}
</div>
</template>
}
@@ -0,0 +1,14 @@
import { themePrefix } from "virtual:theme";
import dIcon from "discourse/ui-kit/helpers/d-icon";
import { i18n } from "discourse-i18n";
const TopicLikesColumn = <template>
{{#if @topic.like_count}}
<span
class="topic-likes"
aria-label={{i18n (themePrefix "like_count") count=@topic.like_count}}
>{{dIcon "heart"}}{{@topic.like_count}}</span>
{{/if}}
</template>;
export default TopicLikesColumn;
@@ -0,0 +1,15 @@
import { themePrefix } from "virtual:theme";
import dIcon from "discourse/ui-kit/helpers/d-icon";
import dNumber from "discourse/ui-kit/helpers/d-number";
import { i18n } from "discourse-i18n";
const TopicRepliesColumn = <template>
{{#if @topic.replyCount}}
<span
class="topic-replies"
aria-label={{i18n (themePrefix "reply_count") count=@topic.replyCount}}
>{{dIcon "reply"}}{{dNumber @topic.replyCount}}</span>
{{/if}}
</template>;
export default TopicRepliesColumn;
@@ -0,0 +1,18 @@
import Component from "@glimmer/component";
import dIcon from "discourse/ui-kit/helpers/d-icon";
import { i18n } from "discourse-i18n";
import { getTopicStatusBadge } from "../../lib/topic-status-badge";
export default class TopicStatusColumn extends Component {
get badge() {
return getTopicStatusBadge(this.args.topic);
}
<template>
{{#if this.badge}}
<span class="topic-status-card {{this.badge.className}}">{{dIcon
this.badge.icon
}}<p class="topic-status-card__name">{{i18n this.badge.text}}</p></span>
{{/if}}
</template>
}
@@ -0,0 +1,40 @@
import Component from "@glimmer/component";
import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";
import { service } from "@ember/service";
import bodyClass from "discourse/helpers/body-class";
import DButton from "discourse/ui-kit/d-button";
export default class ComposerPeekModeToggle extends Component {
@service composer;
@service keyValueStore;
@tracked
peekModeActive = this.keyValueStore.getItem("peekModeActive") === "true";
get bodyCssClass() {
return this.peekModeActive && !this.composer.isPreviewVisible
? "peek-mode-active"
: "";
}
@action
togglePeekMode() {
this.peekModeActive = !this.peekModeActive;
this.keyValueStore.setItem("peekModeActive", this.peekModeActive);
if (this.composer.showPreview) {
this.composer.togglePreview();
}
}
<template>
{{bodyClass this.bodyCssClass}}
<DButton
@action={{this.togglePeekMode}}
@preventFocus={{true}}
@icon="discourse-sidebar"
@title="composer.peek_mode_toggle"
class="btn-small no-text peek-mode-toggle btn-transparent"
/>
</template>
}
@@ -0,0 +1,68 @@
import Component from "@glimmer/component";
import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";
import didInsert from "@ember/render-modifiers/modifiers/did-insert";
import { service } from "@ember/service";
import { trustHTML } from "@ember/template";
import { bind } from "discourse/lib/decorators";
const DO_NOT_RENDER_LIST = ["login"];
export default class ExperimentalScreen extends Component {
@service router;
@tracked left = 0;
@tracked right = 0;
resizeObserver;
willDestroy() {
super.willDestroy(...arguments);
this.resizeObserver.disconnect();
}
@bind
calculateDistance(element) {
const distance = element.getBoundingClientRect();
this.left = distance.left;
this.right = distance.right;
}
get distanceStyles() {
return trustHTML(
`--left-distance: ${this.left}px; --right-distance: ${this.right}px;`
);
}
get shouldRender() {
return !DO_NOT_RENDER_LIST.includes(this.router.currentRouteName);
}
@action
onInsert(element) {
this.calculateDistance(element);
this.resizeObserver = new ResizeObserver((entries) => {
for (const entry of entries) {
this.calculateDistance(entry.target);
}
});
this.resizeObserver.observe(element);
}
<template>
{{#if this.shouldRender}}
<ul
class="experimental-screen"
{{didInsert this.onInsert}}
style={{this.distanceStyles}}
>
<li class="experimental-screen__top-left"></li>
<li class="experimental-screen__top-right"></li>
<li class="experimental-screen__bottom-left"></li>
<li class="experimental-screen__bottom-right"></li>
<li class="experimental-screen__bottom-bar"></li>
</ul>
{{/if}}
</template>
}

Some files were not shown because too many files have changed in this diff Show More