feat: export complete Discourse themes ecosystem (16 themes, SCSS, JS components and color schemes)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
@import "desktop-horizon-fixes";
|
||||
@import "desktop-full-width";
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
+6
@@ -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;
|
||||
}
|
||||
);
|
||||
});
|
||||
+10
@@ -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;
|
||||
});
|
||||
});
|
||||
+6
@@ -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~}}
|
||||
{{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>
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
import Component from "@glimmer/component";
|
||||
import { tracked } from "@glimmer/tracking";
|
||||
import { inject as controller } from "@ember/controller";
|
||||
import { action } from "@ember/object";
|
||||
import didInsert from "@ember/render-modifiers/modifiers/did-insert";
|
||||
import didUpdate from "@ember/render-modifiers/modifiers/did-update";
|
||||
import willDestroy from "@ember/render-modifiers/modifiers/will-destroy";
|
||||
import { service } from "@ember/service";
|
||||
import CreateTopicButton from "discourse/components/create-topic-button";
|
||||
import bodyClass from "discourse/helpers/body-class";
|
||||
import { applyValueTransformer } from "discourse/lib/transformer";
|
||||
import { gt } from "discourse/truth-helpers";
|
||||
|
||||
export default class SidebarNewTopicButton extends Component {
|
||||
@service composer;
|
||||
@service currentUser;
|
||||
@service siteSettings;
|
||||
@service site;
|
||||
@service router;
|
||||
@service header;
|
||||
@service appEvents;
|
||||
@service sidebarState;
|
||||
@controller application;
|
||||
|
||||
@tracked category;
|
||||
@tracked tag;
|
||||
|
||||
// Keyed on the panel that owns the sidebar rather than on the path: every takeover displaces
|
||||
// the forum navigation this button is part of, and most have no distinguishing URL prefix.
|
||||
// `isForcingSidebar` is not equivalent, since a panel can take over without setting it.
|
||||
get shouldRender() {
|
||||
return (
|
||||
this.currentUser &&
|
||||
this.sidebarState.showMainPanel &&
|
||||
this.application.sidebarEnabled
|
||||
);
|
||||
}
|
||||
|
||||
get canCreateTopic() {
|
||||
return this.currentUser?.can_create_topic;
|
||||
}
|
||||
|
||||
get draftCount() {
|
||||
return this.currentUser?.get("draft_count");
|
||||
}
|
||||
|
||||
get createTopicLabel() {
|
||||
const defaultKey = "topic.create";
|
||||
let value = defaultKey;
|
||||
|
||||
if (
|
||||
this.site.shared_drafts_category_id &&
|
||||
this.category?.id === this.site.shared_drafts_category_id
|
||||
) {
|
||||
value = "topic.create_shared_draft";
|
||||
}
|
||||
|
||||
return applyValueTransformer("create-topic-label", value, {
|
||||
site: this.site,
|
||||
defaultKey,
|
||||
category: this.category,
|
||||
currentUser: this.currentUser,
|
||||
});
|
||||
}
|
||||
|
||||
get createTopicIcon() {
|
||||
const defaultIcon = "far-pen-to-square";
|
||||
|
||||
return applyValueTransformer("create-topic-icon", defaultIcon, {
|
||||
site: this.site,
|
||||
defaultIcon,
|
||||
category: this.category,
|
||||
currentUser: this.currentUser,
|
||||
});
|
||||
}
|
||||
|
||||
get createTopicTargetCategory() {
|
||||
let subcategory;
|
||||
|
||||
if (
|
||||
!this.category?.canCreateTopic &&
|
||||
this.siteSettings.default_subcategory_on_read_only_category
|
||||
) {
|
||||
subcategory = this.category?.subcategoryWithCreateTopicPermission;
|
||||
}
|
||||
|
||||
return subcategory ?? this.category;
|
||||
}
|
||||
|
||||
@action
|
||||
createNewTopic() {
|
||||
this.composer.openNewTopic({
|
||||
category: this.createTopicTargetCategory,
|
||||
tags: this.tag?.name,
|
||||
});
|
||||
}
|
||||
|
||||
@action
|
||||
getCategoryAndTag() {
|
||||
this.category = this.router.currentRoute.attributes?.category || null;
|
||||
this.tag = this.router.currentRoute.attributes?.tag || null;
|
||||
}
|
||||
|
||||
@action
|
||||
watchForComposer() {
|
||||
// this covers opening drafts from the hamburger menu
|
||||
this.appEvents.on("composer:will-open", this, this.closeHamburger);
|
||||
}
|
||||
|
||||
@action
|
||||
stopWatchingForComposer() {
|
||||
this.appEvents.off("composer:will-open", this, this.closeHamburger);
|
||||
}
|
||||
|
||||
@action
|
||||
closeHamburger() {
|
||||
this.header.hamburgerVisible = false;
|
||||
}
|
||||
|
||||
<template>
|
||||
{{#if this.shouldRender}}
|
||||
{{bodyClass "horizon-new-topic-button-enabled"}}
|
||||
<CreateTopicButton
|
||||
{{didInsert this.getCategoryAndTag}}
|
||||
{{didUpdate this.getCategoryAndTag this.router.currentRoute}}
|
||||
{{didInsert this.watchForComposer}}
|
||||
{{willDestroy this.stopWatchingForComposer}}
|
||||
@canCreateTopic={{this.canCreateTopic}}
|
||||
@action={{this.createNewTopic}}
|
||||
@label={{this.createTopicLabel}}
|
||||
@icon={{this.createTopicIcon}}
|
||||
@btnClass="sidebar-new-topic-button"
|
||||
@btnTypeClass="btn-primary"
|
||||
@showDrafts={{gt this.draftCount 0}}
|
||||
class="sidebar-new-topic-button__wrapper"
|
||||
/>
|
||||
{{/if}}
|
||||
</template>
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
import Component from "@glimmer/component";
|
||||
import { action } from "@ember/object";
|
||||
import { trustHTML } from "@ember/template";
|
||||
import DButton from "discourse/ui-kit/d-button";
|
||||
import dConcatClass from "discourse/ui-kit/helpers/d-concat-class";
|
||||
|
||||
export default class UserColorPaletteMenuItem extends Component {
|
||||
get siteStyle() {
|
||||
return `--icon-color: ${this.args.colorPalette.accent}`;
|
||||
}
|
||||
|
||||
get activeClass() {
|
||||
if (this.args.selectedColorPaletteId === this.args.colorPalette.id) {
|
||||
return "active";
|
||||
}
|
||||
}
|
||||
|
||||
@action
|
||||
paletteSelected() {
|
||||
this.args.paletteSelected(this.args.colorPalette);
|
||||
}
|
||||
|
||||
<template>
|
||||
<div
|
||||
class="user-color-palette-menu__item"
|
||||
data-color-palette={{@colorPalette.name}}
|
||||
>
|
||||
<DButton
|
||||
class={{dConcatClass
|
||||
"btn-flat user-color-palette-menu__item-choice"
|
||||
this.activeClass
|
||||
}}
|
||||
style={{trustHTML this.siteStyle}}
|
||||
@icon="circle"
|
||||
@translatedLabel={{@colorPalette.name}}
|
||||
@action={{this.paletteSelected}}
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
}
|
||||
@@ -0,0 +1,212 @@
|
||||
import Component from "@glimmer/component";
|
||||
import { tracked } from "@glimmer/tracking";
|
||||
import { action } from "@ember/object";
|
||||
import { service } from "@ember/service";
|
||||
import { isEmpty } from "@ember/utils";
|
||||
import { Promise } from "rsvp";
|
||||
import DMenu from "discourse/float-kit/components/d-menu";
|
||||
import { reload } from "discourse/helpers/page-reloader";
|
||||
import { ajax } from "discourse/lib/ajax";
|
||||
import {
|
||||
listColorSchemes,
|
||||
updateColorSchemeCookie,
|
||||
} from "discourse/lib/color-scheme-picker";
|
||||
import cookie from "discourse/lib/cookie";
|
||||
import dConcatClass from "discourse/ui-kit/helpers/d-concat-class";
|
||||
import dIcon from "discourse/ui-kit/helpers/d-icon";
|
||||
import UserColorPaletteMenuItem from "./user-color-palette-menu-item";
|
||||
|
||||
const HORIZON_PALETTES = [
|
||||
"Horizon",
|
||||
"Marigold",
|
||||
"Violet",
|
||||
"Lily",
|
||||
"Clover",
|
||||
"Royal",
|
||||
];
|
||||
|
||||
export default class UserColorPaletteSelector extends Component {
|
||||
@service currentUser;
|
||||
@service site;
|
||||
@service session;
|
||||
|
||||
@tracked anonColorPaletteId = this.#loadAnonColorPalette();
|
||||
@tracked userColorPaletteId = this.session.userColorSchemeId;
|
||||
@tracked cssLoaded = true;
|
||||
|
||||
get userColorPalettes() {
|
||||
const availablePalettes = listColorSchemes(this.site)
|
||||
?.map((userPalette) => {
|
||||
const hex = userPalette.colors.find(
|
||||
(color) => color.name === "tertiary"
|
||||
)?.hex;
|
||||
return {
|
||||
...userPalette,
|
||||
accent: hex && `#${hex}`,
|
||||
};
|
||||
})
|
||||
.filter((userPalette) => {
|
||||
return HORIZON_PALETTES.some((palette) => {
|
||||
return (
|
||||
userPalette.name.toLowerCase().includes(palette.toLowerCase()) &&
|
||||
userPalette.accent
|
||||
);
|
||||
});
|
||||
})
|
||||
.sort();
|
||||
|
||||
// Match the light scheme with the corresponding dark id based in the name
|
||||
return (
|
||||
availablePalettes
|
||||
?.map((palette) => {
|
||||
if (palette.is_dark) {
|
||||
return palette;
|
||||
}
|
||||
|
||||
const normalizedLightName = palette.name.toLowerCase();
|
||||
|
||||
const correspondingDarkModeId = availablePalettes.find(
|
||||
(item) =>
|
||||
item.is_dark &&
|
||||
normalizedLightName ===
|
||||
item.name.toLowerCase().replace(/\s+dark$/, "")
|
||||
)?.id;
|
||||
|
||||
return {
|
||||
...palette,
|
||||
correspondingDarkModeId,
|
||||
};
|
||||
})
|
||||
// Only want to show palettes that have corresponding light/dark modes
|
||||
.filter((palette) => !palette.is_dark)
|
||||
);
|
||||
}
|
||||
|
||||
get selectedColorPaletteId() {
|
||||
if (this.currentUser) {
|
||||
return this.userColorPaletteId;
|
||||
}
|
||||
|
||||
return this.anonColorPaletteId;
|
||||
}
|
||||
|
||||
@action
|
||||
onRegisterMenu(api) {
|
||||
this.dMenu = api;
|
||||
}
|
||||
|
||||
@action
|
||||
paletteSelected(selectedPalette) {
|
||||
if (selectedPalette.id === this.selectedColorPaletteId) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.#updatePreference(selectedPalette);
|
||||
this.#changeSiteColorPalette(selectedPalette);
|
||||
this.dMenu.close();
|
||||
}
|
||||
|
||||
#updatePreference(selectedPalette) {
|
||||
updateColorSchemeCookie(selectedPalette.id);
|
||||
updateColorSchemeCookie(selectedPalette.correspondingDarkModeId, {
|
||||
dark: true,
|
||||
});
|
||||
|
||||
if (!this.currentUser) {
|
||||
this.anonColorPaletteId = selectedPalette.id;
|
||||
} else {
|
||||
this.userColorPaletteId = selectedPalette.id;
|
||||
}
|
||||
}
|
||||
|
||||
#loadAnonColorPalette() {
|
||||
const storedAnonPaletteId = cookie("color_scheme_id");
|
||||
if (storedAnonPaletteId) {
|
||||
return parseInt(storedAnonPaletteId, 10);
|
||||
}
|
||||
}
|
||||
|
||||
async #changeSiteColorPalette(colorPalette) {
|
||||
this.cssLoaded = false;
|
||||
|
||||
const lightPaletteId = colorPalette.id;
|
||||
const darkPaletteId = colorPalette.correspondingDarkModeId;
|
||||
const darkTag = document.querySelector("link.dark-scheme");
|
||||
|
||||
// TODO(osama) once we have built-in light/dark modes for each palette, we
|
||||
// can stop making the 2nd ajax call for the dark palette and replace it
|
||||
// with a include_dark_scheme param on the ajax call for the light
|
||||
// palette which will include the href for the dark palette in the response
|
||||
if (!darkTag) {
|
||||
reload();
|
||||
return;
|
||||
}
|
||||
|
||||
const lightPaletteInfo = await ajax(
|
||||
`/color-scheme-stylesheet/${lightPaletteId}/${colorPalette.theme_id}.json`
|
||||
);
|
||||
const darkPaletteInfo = await ajax(
|
||||
`/color-scheme-stylesheet/${darkPaletteId}/${colorPalette.theme_id}.json`
|
||||
);
|
||||
|
||||
Promise.all([
|
||||
this.#preloadAndSwapCSS(lightPaletteInfo.new_href, "light-scheme"),
|
||||
this.#preloadAndSwapCSS(darkPaletteInfo.new_href, "dark-scheme"),
|
||||
]).then(() => {
|
||||
this.cssLoaded = true;
|
||||
});
|
||||
}
|
||||
|
||||
#preloadAndSwapCSS(newHref, existingLinkClass) {
|
||||
return new Promise((resolve) => {
|
||||
const existingLink = document.querySelector(
|
||||
`link[rel='stylesheet'].${existingLinkClass}`
|
||||
);
|
||||
const newTag = document.createElement("link");
|
||||
|
||||
newTag.rel = "preload";
|
||||
newTag.href = newHref;
|
||||
newTag.as = "style";
|
||||
newTag.onload = () => {
|
||||
existingLink.href = newHref;
|
||||
newTag.remove();
|
||||
resolve();
|
||||
};
|
||||
|
||||
document.head.appendChild(newTag);
|
||||
});
|
||||
}
|
||||
|
||||
<template>
|
||||
{{#unless (isEmpty this.userColorPalettes)}}
|
||||
<DMenu
|
||||
@identifier="user-color-palette-selector"
|
||||
@placementStrategy="fixed"
|
||||
@onRegisterApi={{this.onRegisterMenu}}
|
||||
class={{dConcatClass
|
||||
"btn-flat user-color-palette-selector sidebar-footer-actions-button"
|
||||
(if this.cssLoaded "user-color-palette-css-loaded")
|
||||
}}
|
||||
data-selected-color-palette-id={{this.selectedColorPaletteId}}
|
||||
@inline={{true}}
|
||||
>
|
||||
<:trigger>
|
||||
{{dIcon "paintbrush"}}
|
||||
</:trigger>
|
||||
<:content>
|
||||
<div class="user-color-palette-menu">
|
||||
<div class="user-color-palette-menu__content">
|
||||
{{#each this.userColorPalettes as |colorPalette|}}
|
||||
<UserColorPaletteMenuItem
|
||||
@selectedColorPaletteId={{this.selectedColorPaletteId}}
|
||||
@colorPalette={{colorPalette}}
|
||||
@paletteSelected={{this.paletteSelected}}
|
||||
/>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
</:content>
|
||||
</DMenu>
|
||||
{{/unless}}
|
||||
</template>
|
||||
}
|
||||
@@ -0,0 +1,228 @@
|
||||
import { settings } from "virtual:theme";
|
||||
import HeaderTopicCell from "discourse/components/topic-list/header/topic-cell";
|
||||
import { withPluginApi } from "discourse/lib/plugin-api";
|
||||
import HighContextTopicCard from "../components/card/high-context-topic-card";
|
||||
import TopicActivityColumn from "../components/card/topic-activity-column";
|
||||
import TopicCategoryColumn from "../components/card/topic-category-column";
|
||||
import TopicCreatorColumn from "../components/card/topic-creator-column";
|
||||
import TopicRepliesColumn from "../components/card/topic-replies-column";
|
||||
import TopicStatusColumn from "../components/card/topic-status-column";
|
||||
|
||||
const TOPIC_CARD_CONTEXTS = [
|
||||
"discovery",
|
||||
"suggested",
|
||||
"related",
|
||||
"group-activity",
|
||||
"user-activity",
|
||||
];
|
||||
|
||||
const SIMPLE_CARD_CONTEXTS = ["suggested", "related"];
|
||||
|
||||
const isTopicCardContext = ({ listContext, category }) =>
|
||||
TOPIC_CARD_CONTEXTS.includes(listContext) && !category?.doc_index_topic_id;
|
||||
|
||||
const isSimpleCardContext = ({ listContext }) =>
|
||||
SIMPLE_CARD_CONTEXTS.includes(listContext);
|
||||
|
||||
const TopicActivity = <template>
|
||||
<td class="topic-activity-data">
|
||||
<TopicActivityColumn @topic={{@topic}} />
|
||||
</td>
|
||||
</template>;
|
||||
|
||||
const TopicStatus = <template>
|
||||
<td class="topic-status-data">
|
||||
<TopicStatusColumn @topic={{@topic}} />
|
||||
</td>
|
||||
</template>;
|
||||
|
||||
const TopicCategory = <template>
|
||||
<td class="topic-category-data">
|
||||
<TopicCategoryColumn @topic={{@topic}} />
|
||||
</td>
|
||||
</template>;
|
||||
|
||||
const TopicReplies = <template>
|
||||
<td class="topic-likes-replies-data">
|
||||
<TopicRepliesColumn @topic={{@topic}} />
|
||||
</td>
|
||||
</template>;
|
||||
|
||||
const TopicCreator = <template>
|
||||
<td class="topic-creator-data">
|
||||
<TopicCreatorColumn @topic={{@topic}} />
|
||||
</td>
|
||||
</template>;
|
||||
|
||||
const HighContextCard = <template>
|
||||
<HighContextTopicCard
|
||||
@topic={{@topic}}
|
||||
@hideCategory={{@hideCategory}}
|
||||
@bulkSelectEnabled={{@bulkSelectEnabled}}
|
||||
@isSelected={{@isSelected}}
|
||||
@onBulkSelectToggle={{@onBulkSelectToggle}}
|
||||
/>
|
||||
</template>;
|
||||
|
||||
export default {
|
||||
name: "topic-list-customizations",
|
||||
|
||||
initialize() {
|
||||
const isHighContext = settings.topic_card_high_context;
|
||||
|
||||
function applySimpleLayout(columns) {
|
||||
columns.add("topic-status", {
|
||||
item: TopicStatus,
|
||||
after: "topic-author",
|
||||
});
|
||||
columns.add("topic-category", {
|
||||
item: TopicCategory,
|
||||
after: "topic-status",
|
||||
});
|
||||
columns.add("topic-likes-replies", {
|
||||
item: TopicReplies,
|
||||
after: "topic-author-avatar",
|
||||
});
|
||||
columns.add("topic-creator", {
|
||||
item: TopicCreator,
|
||||
after: "topic-author-avatar",
|
||||
});
|
||||
|
||||
columns.delete("views");
|
||||
columns.delete("replies");
|
||||
|
||||
columns.add("topic-activity", {
|
||||
item: TopicActivity,
|
||||
after: "title",
|
||||
});
|
||||
columns.delete("posters");
|
||||
columns.delete("activity");
|
||||
}
|
||||
|
||||
function applyHighContextLayout(columns) {
|
||||
columns.delete("topic");
|
||||
columns.delete("posters");
|
||||
columns.delete("replies");
|
||||
columns.delete("views");
|
||||
columns.delete("activity");
|
||||
columns.add("high-context-card", {
|
||||
header: HeaderTopicCell,
|
||||
item: HighContextCard,
|
||||
});
|
||||
}
|
||||
|
||||
withPluginApi((api) => {
|
||||
api.registerValueTransformer(
|
||||
"topic-list-class",
|
||||
({ value: classes, context }) => {
|
||||
if (isTopicCardContext(context)) {
|
||||
classes.push("--d-topic-cards");
|
||||
}
|
||||
return classes;
|
||||
}
|
||||
);
|
||||
|
||||
api.registerValueTransformer(
|
||||
"topic-list-columns",
|
||||
({ value: columns, context }) => {
|
||||
if (!isTopicCardContext(context)) {
|
||||
return columns;
|
||||
}
|
||||
|
||||
isHighContext && !isSimpleCardContext(context)
|
||||
? applyHighContextLayout(columns)
|
||||
: applySimpleLayout(columns);
|
||||
|
||||
return columns;
|
||||
}
|
||||
);
|
||||
|
||||
api.registerValueTransformer(
|
||||
"topic-list-item-class",
|
||||
({ value: classes, context }) => {
|
||||
if (!isTopicCardContext(context)) {
|
||||
return classes;
|
||||
}
|
||||
|
||||
if (isHighContext && !isSimpleCardContext(context)) {
|
||||
classes.push("--high-context");
|
||||
}
|
||||
|
||||
if (context.topic.replyCount) {
|
||||
classes.push("--has-replies");
|
||||
}
|
||||
|
||||
if (
|
||||
context.topic.is_hot ||
|
||||
context.topic.pinned ||
|
||||
context.topic.pinned_globally
|
||||
) {
|
||||
classes.push("--has-status-card");
|
||||
}
|
||||
|
||||
return classes;
|
||||
}
|
||||
);
|
||||
|
||||
// Disable mobile layout for topic card contexts
|
||||
api.registerValueTransformer(
|
||||
"topic-list-item-mobile-layout",
|
||||
({ value, context }) => {
|
||||
if (isTopicCardContext(context)) {
|
||||
return false;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
);
|
||||
|
||||
api.registerBehaviorTransformer(
|
||||
"topic-list-item-click",
|
||||
({ context, next }) => {
|
||||
const { event, topic, listContext } = context;
|
||||
|
||||
if (
|
||||
!isTopicCardContext({
|
||||
listContext,
|
||||
category: topic?.category,
|
||||
})
|
||||
) {
|
||||
return next();
|
||||
}
|
||||
|
||||
if (
|
||||
(event.target.closest("a, button, input") &&
|
||||
!event.target.closest(".topic-excerpt")) ||
|
||||
event.target.closest(".topic-excerpt-more")
|
||||
) {
|
||||
return next();
|
||||
}
|
||||
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
const topicLink = event.target
|
||||
.closest("tr")
|
||||
.querySelector("a.raw-topic-link");
|
||||
|
||||
if (event.button === 1) {
|
||||
// click events with button=1 can't naturally trigger browser navigation
|
||||
window.open(topicLink.href, "_blank", "noopener,noreferrer");
|
||||
return;
|
||||
}
|
||||
|
||||
topicLink.dispatchEvent(
|
||||
new MouseEvent("click", {
|
||||
ctrlKey: event.ctrlKey,
|
||||
metaKey: event.metaKey,
|
||||
shiftKey: event.shiftKey,
|
||||
button: event.button,
|
||||
which: event.which,
|
||||
bubbles: true,
|
||||
cancelable: true,
|
||||
})
|
||||
);
|
||||
}
|
||||
);
|
||||
});
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,14 @@
|
||||
const UPDATED_AFTER_LAST_POST_THRESHOLD_DAYS = 1;
|
||||
|
||||
export function topicWasUpdatedAfterLastPost(topic) {
|
||||
const bumpedAt = moment(topic.bumped_at);
|
||||
const lastPostedAt = moment(topic.last_posted_at);
|
||||
const bumpedLastPostedDaysDiff = moment
|
||||
.duration(bumpedAt.diff(lastPostedAt))
|
||||
.asDays();
|
||||
|
||||
return (
|
||||
bumpedAt.isAfter(lastPostedAt) &&
|
||||
bumpedLastPostedDaysDiff > UPDATED_AFTER_LAST_POST_THRESHOLD_DAYS
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
export function getTopicStatusBadge(topic) {
|
||||
if (topic.is_hot) {
|
||||
return {
|
||||
icon: "fire",
|
||||
text: "topic_statuses.hot.title",
|
||||
className: "--hot",
|
||||
};
|
||||
}
|
||||
|
||||
if (topic.pinned || topic.pinned_globally) {
|
||||
return {
|
||||
icon: "thumbtack",
|
||||
text: "topic_statuses.pinned.title",
|
||||
className: "--pinned",
|
||||
};
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
topic_card_high_context:
|
||||
type: bool
|
||||
default: true
|
||||
@@ -0,0 +1,75 @@
|
||||
import { render } from "@ember/test-helpers";
|
||||
import { module, test } from "qunit";
|
||||
import Topic from "discourse/models/topic";
|
||||
import { setupRenderingTest } from "discourse/tests/helpers/component-test";
|
||||
import HighContextTopicCard from "../../discourse/components/card/high-context-topic-card";
|
||||
|
||||
function topicFor(attrs = {}) {
|
||||
return Topic.create({
|
||||
id: 1,
|
||||
title: "How do cards work?",
|
||||
fancy_title: "How do cards work?",
|
||||
created_at: "2024-06-01T08:00:00Z",
|
||||
bumped_at: "2024-06-01T18:00:00Z",
|
||||
last_posted_at: "2024-06-01T12:00:00Z",
|
||||
last_poster_username: "alice",
|
||||
posts_count: 3,
|
||||
like_count: 0,
|
||||
tags: [],
|
||||
posters: [
|
||||
{
|
||||
extras: "latest single",
|
||||
user: {
|
||||
id: 1,
|
||||
username: "alice",
|
||||
name: "Alice",
|
||||
avatar_template: "/letter_avatar_proxy/v4/letter/a/{size}.png",
|
||||
},
|
||||
},
|
||||
],
|
||||
...attrs,
|
||||
});
|
||||
}
|
||||
|
||||
module(
|
||||
"Horizon | Integration | Component | Card | HighContextTopicCard",
|
||||
function (hooks) {
|
||||
setupRenderingTest(hooks);
|
||||
|
||||
test("shows the last reply line with the actual reply time when a reply is recent", async function (assert) {
|
||||
const lastPostedAt = "2024-06-01T12:00:00Z";
|
||||
const topic = topicFor({
|
||||
bumped_at: "2024-06-01T18:00:00Z",
|
||||
last_posted_at: lastPostedAt,
|
||||
});
|
||||
|
||||
await render(
|
||||
<template>
|
||||
<HighContextTopicCard @topic={{topic}} @hideCategory={{true}} />
|
||||
</template>
|
||||
);
|
||||
|
||||
assert.dom(".hc-topic-card__last-reply").exists();
|
||||
assert.dom(".hc-topic-card__last-reply-name").hasText("alice");
|
||||
assert
|
||||
.dom(".hc-topic-card__time .relative-date")
|
||||
.hasAttribute("data-time", String(new Date(lastPostedAt).getTime()));
|
||||
});
|
||||
|
||||
test("hides the last reply line when the topic was bumped more than a day after the last post", async function (assert) {
|
||||
const topic = topicFor({
|
||||
bumped_at: "2024-06-10T12:00:00Z",
|
||||
last_posted_at: "2024-06-01T12:00:00Z",
|
||||
});
|
||||
|
||||
await render(
|
||||
<template>
|
||||
<HighContextTopicCard @topic={{topic}} @hideCategory={{true}} />
|
||||
</template>
|
||||
);
|
||||
|
||||
assert.dom(".hc-topic-card__last-reply").doesNotExist();
|
||||
assert.dom(".hc-topic-card__context").doesNotExist();
|
||||
});
|
||||
}
|
||||
);
|
||||
@@ -0,0 +1,189 @@
|
||||
import { click, currentURL, visit } from "@ember/test-helpers";
|
||||
import { test } from "qunit";
|
||||
import { acceptance } from "discourse/tests/helpers/qunit-helpers";
|
||||
|
||||
function topicAttrs(id, slug, title) {
|
||||
return {
|
||||
id,
|
||||
slug,
|
||||
title,
|
||||
fancy_title: title,
|
||||
posts_count: 4,
|
||||
reply_count: 3,
|
||||
highest_post_number: 4,
|
||||
last_read_post_number: 4,
|
||||
last_poster_username: "alice",
|
||||
bumped_at: "2024-06-01T12:00:00.000Z",
|
||||
last_posted_at: "2024-06-01T12:00:00.000Z",
|
||||
created_at: "2024-06-01T10:00:00.000Z",
|
||||
category_id: 1,
|
||||
visible: true,
|
||||
closed: false,
|
||||
archived: false,
|
||||
pinned: false,
|
||||
pinned_globally: false,
|
||||
deleted_at: null,
|
||||
archetype: "regular",
|
||||
details: { can_create_post: true, notification_level: 1 },
|
||||
is_nested_view: true,
|
||||
};
|
||||
}
|
||||
|
||||
function postAttrs(topic, postNumber, id, cooked, replyToPostNumber = null) {
|
||||
return {
|
||||
id,
|
||||
topic_id: topic.id,
|
||||
topic_slug: topic.slug,
|
||||
post_number: postNumber,
|
||||
reply_to_post_number: replyToPostNumber,
|
||||
username: "alice",
|
||||
name: "Alice",
|
||||
avatar_template: "/letter_avatar_proxy/v4/letter/a/{size}.png",
|
||||
cooked: `<p>${cooked}</p>`,
|
||||
created_at: "2024-06-01T10:00:00.000Z",
|
||||
updated_at: "2024-06-01T10:00:00.000Z",
|
||||
post_type: 1,
|
||||
can_edit: true,
|
||||
can_delete: false,
|
||||
actions_summary: [],
|
||||
reply_count: 0,
|
||||
reads: 1,
|
||||
read: true,
|
||||
yours: false,
|
||||
};
|
||||
}
|
||||
|
||||
function nestedResponse({ id, slug, title, marker, suggestedTopic }) {
|
||||
const topic = topicAttrs(id, slug, title);
|
||||
const opPost = postAttrs(topic, 1, id * 10 + 1, `${marker} op`);
|
||||
const firstReply = postAttrs(
|
||||
topic,
|
||||
2,
|
||||
id * 10 + 2,
|
||||
`${marker} first branch`,
|
||||
1
|
||||
);
|
||||
const childOne = postAttrs(topic, 3, id * 10 + 3, `${marker} child one`, 2);
|
||||
const childTwo = postAttrs(topic, 4, id * 10 + 4, `${marker} child two`, 2);
|
||||
|
||||
return {
|
||||
topic,
|
||||
op_post: opPost,
|
||||
roots: [
|
||||
{
|
||||
...firstReply,
|
||||
reply_count: 2,
|
||||
direct_reply_count: 2,
|
||||
total_descendant_count: 2,
|
||||
children: [childOne, childTwo],
|
||||
},
|
||||
],
|
||||
page: 0,
|
||||
has_more_roots: false,
|
||||
sort: "old",
|
||||
pinned_post_ids: [],
|
||||
message_bus_last_id: id,
|
||||
suggested_topics: suggestedTopic ? [suggestedTopic] : [],
|
||||
};
|
||||
}
|
||||
|
||||
function topicViewResponse(id, slug, title) {
|
||||
const topic = topicAttrs(id, slug, title);
|
||||
const opPost = postAttrs(topic, 1, id * 10 + 1, `${title} op`);
|
||||
|
||||
return {
|
||||
...topic,
|
||||
post_stream: {
|
||||
posts: [opPost],
|
||||
stream: [opPost.id],
|
||||
},
|
||||
timeline_lookup: [[1, 0]],
|
||||
};
|
||||
}
|
||||
|
||||
acceptance("Horizon | Nested suggested topic navigation", function (needs) {
|
||||
needs.user();
|
||||
needs.settings({
|
||||
nested_replies_enabled: true,
|
||||
nested_replies_default_sort: "old",
|
||||
});
|
||||
|
||||
needs.pretender((server, helper) => {
|
||||
const firstTopicSuggestion = topicAttrs(
|
||||
102,
|
||||
"second-nested-topic",
|
||||
"Second nested topic"
|
||||
);
|
||||
const secondTopicSuggestion = topicAttrs(
|
||||
101,
|
||||
"first-nested-topic",
|
||||
"First nested topic"
|
||||
);
|
||||
|
||||
server.get("/t/101.json", () =>
|
||||
helper.response(
|
||||
topicViewResponse(101, "first-nested-topic", "First nested topic")
|
||||
)
|
||||
);
|
||||
|
||||
server.get("/t/102.json", () =>
|
||||
helper.response(
|
||||
topicViewResponse(102, "second-nested-topic", "Second nested topic")
|
||||
)
|
||||
);
|
||||
|
||||
server.get("/n/first-nested-topic/101.json", () =>
|
||||
helper.response(
|
||||
nestedResponse({
|
||||
id: 101,
|
||||
slug: "first-nested-topic",
|
||||
title: "First nested topic",
|
||||
marker: "FIRST_TOPIC_UNIQUE",
|
||||
suggestedTopic: firstTopicSuggestion,
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
server.get("/n/second-nested-topic/102.json", () =>
|
||||
helper.response(
|
||||
nestedResponse({
|
||||
id: 102,
|
||||
slug: "second-nested-topic",
|
||||
title: "Second nested topic",
|
||||
marker: "SECOND_TOPIC_UNIQUE",
|
||||
suggestedTopic: secondTopicSuggestion,
|
||||
})
|
||||
)
|
||||
);
|
||||
});
|
||||
|
||||
test("row-clicking a suggested nested topic replaces the old root branch", async function (assert) {
|
||||
await visit("/t/first-nested-topic/101");
|
||||
|
||||
assert
|
||||
.dom(".nested-view__roots")
|
||||
.includesText("FIRST_TOPIC_UNIQUE first branch");
|
||||
assert
|
||||
.dom(".nested-view__roots")
|
||||
.includesText("FIRST_TOPIC_UNIQUE child one");
|
||||
assert
|
||||
.dom("#suggested-topics .topic-list-item")
|
||||
.exists("renders suggested topics with Horizon's card row behavior");
|
||||
|
||||
await click("#suggested-topics .topic-list-item");
|
||||
|
||||
assert.strictEqual(currentURL(), "/t/second-nested-topic/102?sort=old");
|
||||
assert
|
||||
.dom(".nested-view__roots")
|
||||
.includesText("SECOND_TOPIC_UNIQUE first branch");
|
||||
assert
|
||||
.dom(".nested-view__roots")
|
||||
.includesText("SECOND_TOPIC_UNIQUE child one");
|
||||
assert
|
||||
.dom(".nested-view__roots")
|
||||
.doesNotIncludeText("FIRST_TOPIC_UNIQUE first branch");
|
||||
assert
|
||||
.dom(".nested-view__roots")
|
||||
.doesNotIncludeText("FIRST_TOPIC_UNIQUE child one");
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,46 @@
|
||||
import { render } from "@ember/test-helpers";
|
||||
import { module, test } from "qunit";
|
||||
import sinon from "sinon";
|
||||
import { ADMIN_PANEL, MAIN_PANEL } from "discourse/lib/sidebar/panels";
|
||||
import { setupRenderingTest } from "discourse/tests/helpers/component-test";
|
||||
import SidebarNewTopicButton from "../../discourse/components/sidebar-new-topic-button";
|
||||
|
||||
module(
|
||||
"Horizon | Integration | Component | SidebarNewTopicButton",
|
||||
function (hooks) {
|
||||
// stubRouter supplies the currentRoute the button reads to pre-fill a category or tag.
|
||||
setupRenderingTest(hooks, { stubRouter: true });
|
||||
|
||||
hooks.beforeEach(function () {
|
||||
// Both of these gate rendering on their own, so without them the negative assertion below
|
||||
// would pass no matter what the panel is. `sidebarEnabled` is a getter and has to be
|
||||
// stubbed rather than set.
|
||||
sinon
|
||||
.stub(this.owner.lookup("controller:application"), "sidebarEnabled")
|
||||
.get(() => true);
|
||||
this.currentUser.set("can_create_topic", true);
|
||||
|
||||
// A plain forum path. The panel, not the path, is what should decide this, so the
|
||||
// assertions below have to hold on a URL that looks like ordinary browsing.
|
||||
this.owner.lookup("service:router").currentURL = "/latest";
|
||||
});
|
||||
|
||||
test("renders while the forum panel owns the sidebar", async function (assert) {
|
||||
this.owner.lookup("service:sidebar-state").setPanel(MAIN_PANEL);
|
||||
|
||||
await render(<template><SidebarNewTopicButton /></template>);
|
||||
|
||||
assert.dom(".sidebar-new-topic-button__wrapper").exists();
|
||||
});
|
||||
|
||||
// Rendering happens without a URL, so nothing here can be hidden by matching a path. Admin
|
||||
// stands in for every takeover, which all claim the sidebar the same way.
|
||||
test("is hidden while another panel owns the sidebar", async function (assert) {
|
||||
this.owner.lookup("service:sidebar-state").setPanel(ADMIN_PANEL);
|
||||
|
||||
await render(<template><SidebarNewTopicButton /></template>);
|
||||
|
||||
assert.dom(".sidebar-new-topic-button__wrapper").doesNotExist();
|
||||
});
|
||||
}
|
||||
);
|
||||
@@ -0,0 +1,66 @@
|
||||
import { render } from "@ember/test-helpers";
|
||||
import { module, test } from "qunit";
|
||||
import Topic from "discourse/models/topic";
|
||||
import { setupRenderingTest } from "discourse/tests/helpers/component-test";
|
||||
import TopicActivityColumn from "../../discourse/components/card/topic-activity-column";
|
||||
|
||||
module(
|
||||
"Horizon | Integration | Component | Card | TopicActivityColumn",
|
||||
function (hooks) {
|
||||
setupRenderingTest(hooks);
|
||||
|
||||
test("formats the bumpedAt date", async function (assert) {
|
||||
const topic = Topic.create({
|
||||
id: 1,
|
||||
bumped_at: "2024-06-01T12:00:00Z",
|
||||
});
|
||||
await render(
|
||||
<template><TopicActivityColumn @topic={{topic}} /></template>
|
||||
);
|
||||
assert.dom(".topic-activity__time").hasText("Jun 2024");
|
||||
});
|
||||
|
||||
test("has the correct user details and class when there is only one post", async function (assert) {
|
||||
const topic = Topic.create({
|
||||
id: 1,
|
||||
bumped_at: "2024-06-01T12:00:00Z",
|
||||
posts_count: 1,
|
||||
last_poster_username: "bob",
|
||||
});
|
||||
await render(
|
||||
<template><TopicActivityColumn @topic={{topic}} /></template>
|
||||
);
|
||||
assert.dom(".topic-activity.--created").exists();
|
||||
assert.dom(".topic-activity__username").hasText("bob");
|
||||
});
|
||||
|
||||
test("has the correct user details and class when there are multiple posts", async function (assert) {
|
||||
const topic = Topic.create({
|
||||
id: 1,
|
||||
bumped_at: "2024-06-01T12:00:00Z",
|
||||
posts_count: 3,
|
||||
last_poster_username: "alice",
|
||||
});
|
||||
await render(
|
||||
<template><TopicActivityColumn @topic={{topic}} /></template>
|
||||
);
|
||||
assert.dom(".topic-activity.--replied").exists();
|
||||
assert.dom(".topic-activity__username").hasText("alice");
|
||||
});
|
||||
|
||||
test("shows no user and the updated class when the topic was bumped long after the last post", async function (assert) {
|
||||
const topic = Topic.create({
|
||||
id: 1,
|
||||
bumped_at: "2024-06-10T12:00:00Z",
|
||||
last_posted_at: "2024-06-01T12:00:00Z",
|
||||
posts_count: 3,
|
||||
last_poster_username: "alice",
|
||||
});
|
||||
await render(
|
||||
<template><TopicActivityColumn @topic={{topic}} /></template>
|
||||
);
|
||||
assert.dom(".topic-activity.--updated").exists();
|
||||
assert.dom(".topic-activity__username").doesNotExist();
|
||||
});
|
||||
}
|
||||
);
|
||||
@@ -0,0 +1,66 @@
|
||||
// eslint-disable-next-line ember/no-classic-components
|
||||
import Component from "@ember/component";
|
||||
import { action } from "@ember/object";
|
||||
import { click, render } from "@ember/test-helpers";
|
||||
import { hbs } from "ember-cli-htmlbars";
|
||||
import { module, test } from "qunit";
|
||||
import { withSilencedDeprecationsAsync } from "discourse/lib/deprecated";
|
||||
import { setupRenderingTest } from "discourse/tests/helpers/component-test";
|
||||
|
||||
class FooString extends Component {
|
||||
layout = hbs`<button {{on "click" (action "bar" 123)}}>test</button>`;
|
||||
|
||||
@action
|
||||
bar(value) {
|
||||
this.callback(value);
|
||||
}
|
||||
}
|
||||
|
||||
class FooReference extends Component {
|
||||
layout = hbs`<button {{on "click" (action this.bar)}}>test</button>`;
|
||||
|
||||
@action
|
||||
bar() {
|
||||
this.callback();
|
||||
}
|
||||
}
|
||||
|
||||
// This is a core test but has to be in a theme since the transform
|
||||
// (that injects `this` into actions' params) is applied only to
|
||||
// themes and plugins
|
||||
module("Integration | Helper | action", function (hooks) {
|
||||
setupRenderingTest(hooks);
|
||||
|
||||
test("string argument", async function (assert) {
|
||||
this.registry.register("component:foo", FooString);
|
||||
this.callback = (value) => {
|
||||
assert.step("called");
|
||||
assert.strictEqual(value, 123);
|
||||
};
|
||||
|
||||
await withSilencedDeprecationsAsync(
|
||||
"discourse.template-action",
|
||||
async () => {
|
||||
await render(hbs`<Foo @callback={{this.callback}} />`);
|
||||
}
|
||||
);
|
||||
|
||||
await click("button");
|
||||
assert.verifySteps(["called"]);
|
||||
});
|
||||
|
||||
test("reference argument", async function (assert) {
|
||||
this.registry.register("component:foo", FooReference);
|
||||
this.callback = () => assert.step("called");
|
||||
|
||||
await withSilencedDeprecationsAsync(
|
||||
"discourse.template-action",
|
||||
async () => {
|
||||
await render(hbs`<Foo @callback={{this.callback}} />`);
|
||||
}
|
||||
);
|
||||
|
||||
await click("button");
|
||||
assert.verifySteps(["called"]);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,7 @@
|
||||
export default function migrate(settings) {
|
||||
if (settings.get("topic_card_context") === "high_context") {
|
||||
settings.set("topic_card_high_context", true);
|
||||
}
|
||||
settings.delete("topic_card_context");
|
||||
return settings;
|
||||
}
|
||||
@@ -0,0 +1,881 @@
|
||||
{
|
||||
"id": -2,
|
||||
"name": "Horizon",
|
||||
"user_selectable": false,
|
||||
"color_scheme": null,
|
||||
"fields_count": 109,
|
||||
"files": [
|
||||
{
|
||||
"field_id": 566,
|
||||
"target_id": 0,
|
||||
"target_name": "common",
|
||||
"name": "color_definitions",
|
||||
"filename": "common_color_definitions.txt",
|
||||
"bytes": 4215
|
||||
},
|
||||
{
|
||||
"field_id": 564,
|
||||
"target_id": 0,
|
||||
"target_name": "common",
|
||||
"name": "screenshot_dark",
|
||||
"filename": "common_screenshot_dark.txt",
|
||||
"bytes": 0
|
||||
},
|
||||
{
|
||||
"field_id": 563,
|
||||
"target_id": 0,
|
||||
"target_name": "common",
|
||||
"name": "screenshot_light",
|
||||
"filename": "common_screenshot_light.txt",
|
||||
"bytes": 0
|
||||
},
|
||||
{
|
||||
"field_id": 567,
|
||||
"target_id": 0,
|
||||
"target_name": "common",
|
||||
"name": "scss",
|
||||
"filename": "common_scss.scss",
|
||||
"bytes": 595
|
||||
},
|
||||
{
|
||||
"field_id": 569,
|
||||
"target_id": 1,
|
||||
"target_name": "desktop",
|
||||
"name": "scss",
|
||||
"filename": "desktop_scss.scss",
|
||||
"bytes": 63
|
||||
},
|
||||
{
|
||||
"field_id": 700,
|
||||
"target_id": 3,
|
||||
"target_name": "settings",
|
||||
"name": "yaml",
|
||||
"filename": "settings_yaml.yml",
|
||||
"bytes": 54
|
||||
},
|
||||
{
|
||||
"field_id": 588,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "ar",
|
||||
"filename": "translations_ar.txt",
|
||||
"bytes": 1190
|
||||
},
|
||||
{
|
||||
"field_id": 589,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "be",
|
||||
"filename": "translations_be.txt",
|
||||
"bytes": 218
|
||||
},
|
||||
{
|
||||
"field_id": 590,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "bg",
|
||||
"filename": "translations_bg.txt",
|
||||
"bytes": 362
|
||||
},
|
||||
{
|
||||
"field_id": 591,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "bs_BA",
|
||||
"filename": "translations_bs_BA.txt",
|
||||
"bytes": 447
|
||||
},
|
||||
{
|
||||
"field_id": 592,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "ca",
|
||||
"filename": "translations_ca.txt",
|
||||
"bytes": 461
|
||||
},
|
||||
{
|
||||
"field_id": 593,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "cs",
|
||||
"filename": "translations_cs.txt",
|
||||
"bytes": 840
|
||||
},
|
||||
{
|
||||
"field_id": 594,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "da",
|
||||
"filename": "translations_da.txt",
|
||||
"bytes": 452
|
||||
},
|
||||
{
|
||||
"field_id": 595,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "de",
|
||||
"filename": "translations_de.yml",
|
||||
"bytes": 964
|
||||
},
|
||||
{
|
||||
"field_id": 596,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "el",
|
||||
"filename": "translations_el.txt",
|
||||
"bytes": 752
|
||||
},
|
||||
{
|
||||
"field_id": 597,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "en",
|
||||
"filename": "translations_en.yml",
|
||||
"bytes": 650
|
||||
},
|
||||
{
|
||||
"field_id": 598,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "en_GB",
|
||||
"filename": "translations_en_GB.txt",
|
||||
"bytes": 200
|
||||
},
|
||||
{
|
||||
"field_id": 599,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "es",
|
||||
"filename": "translations_es.txt",
|
||||
"bytes": 675
|
||||
},
|
||||
{
|
||||
"field_id": 600,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "et",
|
||||
"filename": "translations_et.txt",
|
||||
"bytes": 315
|
||||
},
|
||||
{
|
||||
"field_id": 601,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "fa_IR",
|
||||
"filename": "translations_fa_IR.txt",
|
||||
"bytes": 444
|
||||
},
|
||||
{
|
||||
"field_id": 602,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "fi",
|
||||
"filename": "translations_fi.txt",
|
||||
"bytes": 634
|
||||
},
|
||||
{
|
||||
"field_id": 603,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "fr",
|
||||
"filename": "translations_fr.txt",
|
||||
"bytes": 971
|
||||
},
|
||||
{
|
||||
"field_id": 604,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "gl",
|
||||
"filename": "translations_gl.txt",
|
||||
"bytes": 398
|
||||
},
|
||||
{
|
||||
"field_id": 605,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "he",
|
||||
"filename": "translations_he.txt",
|
||||
"bytes": 710
|
||||
},
|
||||
{
|
||||
"field_id": 606,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "hr",
|
||||
"filename": "translations_hr.txt",
|
||||
"bytes": 532
|
||||
},
|
||||
{
|
||||
"field_id": 607,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "hu",
|
||||
"filename": "translations_hu.txt",
|
||||
"bytes": 658
|
||||
},
|
||||
{
|
||||
"field_id": 608,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "hy",
|
||||
"filename": "translations_hy.txt",
|
||||
"bytes": 318
|
||||
},
|
||||
{
|
||||
"field_id": 609,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "id",
|
||||
"filename": "translations_id.txt",
|
||||
"bytes": 325
|
||||
},
|
||||
{
|
||||
"field_id": 610,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "it",
|
||||
"filename": "translations_it.txt",
|
||||
"bytes": 621
|
||||
},
|
||||
{
|
||||
"field_id": 611,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "ja",
|
||||
"filename": "translations_ja.txt",
|
||||
"bytes": 514
|
||||
},
|
||||
{
|
||||
"field_id": 612,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "ko",
|
||||
"filename": "translations_ko.txt",
|
||||
"bytes": 347
|
||||
},
|
||||
{
|
||||
"field_id": 613,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "lt",
|
||||
"filename": "translations_lt.txt",
|
||||
"bytes": 508
|
||||
},
|
||||
{
|
||||
"field_id": 614,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "lv",
|
||||
"filename": "translations_lv.txt",
|
||||
"bytes": 324
|
||||
},
|
||||
{
|
||||
"field_id": 615,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "nb_NO",
|
||||
"filename": "translations_nb_NO.txt",
|
||||
"bytes": 304
|
||||
},
|
||||
{
|
||||
"field_id": 616,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "nl",
|
||||
"filename": "translations_nl.txt",
|
||||
"bytes": 662
|
||||
},
|
||||
{
|
||||
"field_id": 617,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "pl_PL",
|
||||
"filename": "translations_pl_PL.txt",
|
||||
"bytes": 1087
|
||||
},
|
||||
{
|
||||
"field_id": 618,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "pt",
|
||||
"filename": "translations_pt.txt",
|
||||
"bytes": 455
|
||||
},
|
||||
{
|
||||
"field_id": 619,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "pt_BR",
|
||||
"filename": "translations_pt_BR.txt",
|
||||
"bytes": 672
|
||||
},
|
||||
{
|
||||
"field_id": 620,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "ro",
|
||||
"filename": "translations_ro.txt",
|
||||
"bytes": 609
|
||||
},
|
||||
{
|
||||
"field_id": 621,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "ru",
|
||||
"filename": "translations_ru.txt",
|
||||
"bytes": 1032
|
||||
},
|
||||
{
|
||||
"field_id": 622,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "sk",
|
||||
"filename": "translations_sk.txt",
|
||||
"bytes": 771
|
||||
},
|
||||
{
|
||||
"field_id": 623,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "sl",
|
||||
"filename": "translations_sl.txt",
|
||||
"bytes": 497
|
||||
},
|
||||
{
|
||||
"field_id": 624,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "sq",
|
||||
"filename": "translations_sq.txt",
|
||||
"bytes": 294
|
||||
},
|
||||
{
|
||||
"field_id": 625,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "sr",
|
||||
"filename": "translations_sr.txt",
|
||||
"bytes": 318
|
||||
},
|
||||
{
|
||||
"field_id": 626,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "sv",
|
||||
"filename": "translations_sv.txt",
|
||||
"bytes": 482
|
||||
},
|
||||
{
|
||||
"field_id": 627,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "sw",
|
||||
"filename": "translations_sw.txt",
|
||||
"bytes": 312
|
||||
},
|
||||
{
|
||||
"field_id": 628,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "te",
|
||||
"filename": "translations_te.txt",
|
||||
"bytes": 381
|
||||
},
|
||||
{
|
||||
"field_id": 629,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "th",
|
||||
"filename": "translations_th.txt",
|
||||
"bytes": 282
|
||||
},
|
||||
{
|
||||
"field_id": 630,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "tr_TR",
|
||||
"filename": "translations_tr_TR.txt",
|
||||
"bytes": 655
|
||||
},
|
||||
{
|
||||
"field_id": 631,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "ug",
|
||||
"filename": "translations_ug.txt",
|
||||
"bytes": 568
|
||||
},
|
||||
{
|
||||
"field_id": 632,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "uk",
|
||||
"filename": "translations_uk.txt",
|
||||
"bytes": 1070
|
||||
},
|
||||
{
|
||||
"field_id": 633,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "ur",
|
||||
"filename": "translations_ur.txt",
|
||||
"bytes": 582
|
||||
},
|
||||
{
|
||||
"field_id": 634,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "vi",
|
||||
"filename": "translations_vi.txt",
|
||||
"bytes": 608
|
||||
},
|
||||
{
|
||||
"field_id": 635,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "zh_CN",
|
||||
"filename": "translations_zh_CN.txt",
|
||||
"bytes": 604
|
||||
},
|
||||
{
|
||||
"field_id": 636,
|
||||
"target_id": 4,
|
||||
"target_name": "translations",
|
||||
"name": "zh_TW",
|
||||
"filename": "translations_zh_TW.txt",
|
||||
"bytes": 348
|
||||
},
|
||||
{
|
||||
"field_id": 638,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "buttons",
|
||||
"filename": "extra_scss_buttons.txt",
|
||||
"bytes": 2538
|
||||
},
|
||||
{
|
||||
"field_id": 639,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "categories-view",
|
||||
"filename": "extra_scss_categories-view.txt",
|
||||
"bytes": 7235
|
||||
},
|
||||
{
|
||||
"field_id": 640,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "chat",
|
||||
"filename": "extra_scss_chat.txt",
|
||||
"bytes": 2352
|
||||
},
|
||||
{
|
||||
"field_id": 641,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "color-choice",
|
||||
"filename": "extra_scss_color-choice.txt",
|
||||
"bytes": 633
|
||||
},
|
||||
{
|
||||
"field_id": 694,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "compatibility",
|
||||
"filename": "extra_scss_compatibility.txt",
|
||||
"bytes": 1612
|
||||
},
|
||||
{
|
||||
"field_id": 644,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "composer",
|
||||
"filename": "extra_scss_composer.txt",
|
||||
"bytes": 2155
|
||||
},
|
||||
{
|
||||
"field_id": 643,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "composer-peek-mode",
|
||||
"filename": "extra_scss_composer-peek-mode.txt",
|
||||
"bytes": 1600
|
||||
},
|
||||
{
|
||||
"field_id": 645,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "desktop-full-width",
|
||||
"filename": "extra_scss_desktop-full-width.txt",
|
||||
"bytes": 5378
|
||||
},
|
||||
{
|
||||
"field_id": 646,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "desktop-horizon-fixes",
|
||||
"filename": "extra_scss_desktop-horizon-fixes.txt",
|
||||
"bytes": 1388
|
||||
},
|
||||
{
|
||||
"field_id": 758,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "discourse-events",
|
||||
"filename": "extra_scss_discourse-events.txt",
|
||||
"bytes": 93
|
||||
},
|
||||
{
|
||||
"field_id": 697,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "experimental-screen",
|
||||
"filename": "extra_scss_experimental-screen.txt",
|
||||
"bytes": 3979
|
||||
},
|
||||
{
|
||||
"field_id": 647,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "header",
|
||||
"filename": "extra_scss_header.html",
|
||||
"bytes": 1843
|
||||
},
|
||||
{
|
||||
"field_id": 648,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "hiddenstuff",
|
||||
"filename": "extra_scss_hiddenstuff.txt",
|
||||
"bytes": 352
|
||||
},
|
||||
{
|
||||
"field_id": 699,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "high-context-cards",
|
||||
"filename": "extra_scss_high-context-cards.txt",
|
||||
"bytes": 6945
|
||||
},
|
||||
{
|
||||
"field_id": 649,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "login",
|
||||
"filename": "extra_scss_login.txt",
|
||||
"bytes": 278
|
||||
},
|
||||
{
|
||||
"field_id": 650,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "main",
|
||||
"filename": "extra_scss_main.txt",
|
||||
"bytes": 2999
|
||||
},
|
||||
{
|
||||
"field_id": 651,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "misc",
|
||||
"filename": "extra_scss_misc.txt",
|
||||
"bytes": 3140
|
||||
},
|
||||
{
|
||||
"field_id": 652,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "mobile-stuff",
|
||||
"filename": "extra_scss_mobile-stuff.txt",
|
||||
"bytes": 4905
|
||||
},
|
||||
{
|
||||
"field_id": 653,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "nav-pills",
|
||||
"filename": "extra_scss_nav-pills.txt",
|
||||
"bytes": 1440
|
||||
},
|
||||
{
|
||||
"field_id": 655,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "sidebar",
|
||||
"filename": "extra_scss_sidebar.txt",
|
||||
"bytes": 2175
|
||||
},
|
||||
{
|
||||
"field_id": 654,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "sidebar-new-topic-button",
|
||||
"filename": "extra_scss_sidebar-new-topic-button.txt",
|
||||
"bytes": 2552
|
||||
},
|
||||
{
|
||||
"field_id": 657,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "topic",
|
||||
"filename": "extra_scss_topic.txt",
|
||||
"bytes": 2673
|
||||
},
|
||||
{
|
||||
"field_id": 656,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "topic-cards",
|
||||
"filename": "extra_scss_topic-cards.txt",
|
||||
"bytes": 13815
|
||||
},
|
||||
{
|
||||
"field_id": 703,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "topic-voting",
|
||||
"filename": "extra_scss_topic-voting.txt",
|
||||
"bytes": 691
|
||||
},
|
||||
{
|
||||
"field_id": 658,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "variables",
|
||||
"filename": "extra_scss_variables.txt",
|
||||
"bytes": 126
|
||||
},
|
||||
{
|
||||
"field_id": 659,
|
||||
"target_id": 5,
|
||||
"target_name": "extra_scss",
|
||||
"name": "welcome-banner",
|
||||
"filename": "extra_scss_welcome-banner.txt",
|
||||
"bytes": 2666
|
||||
},
|
||||
{
|
||||
"field_id": 570,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/api-initializers/composer-peek-toggle-connector.js",
|
||||
"filename": "javascript_discourse_api-initializers_composer-peek-toggle-connector.js",
|
||||
"bytes": 249
|
||||
},
|
||||
{
|
||||
"field_id": 571,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/api-initializers/full-width-logo-behavior.js",
|
||||
"filename": "javascript_discourse_api-initializers_full-width-logo-behavior.js",
|
||||
"bytes": 433
|
||||
},
|
||||
{
|
||||
"field_id": 572,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/api-initializers/hamburger-click-outside-transformer.js",
|
||||
"filename": "javascript_discourse_api-initializers_hamburger-click-outside-transformer.js",
|
||||
"bytes": 268
|
||||
},
|
||||
{
|
||||
"field_id": 573,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/api-initializers/horizon.gjs",
|
||||
"filename": "javascript_discourse_api-initializers_horizon.gjs",
|
||||
"bytes": 388
|
||||
},
|
||||
{
|
||||
"field_id": 574,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/api-initializers/reposition-bulk-select.js",
|
||||
"filename": "javascript_discourse_api-initializers_reposition-bulk-select.js",
|
||||
"bytes": 191
|
||||
},
|
||||
{
|
||||
"field_id": 575,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/api-initializers/sidebar-new-topic-button-connector.js",
|
||||
"filename": "javascript_discourse_api-initializers_sidebar-new-topic-button-connector.js",
|
||||
"bytes": 246
|
||||
},
|
||||
{
|
||||
"field_id": 698,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/components/card/high-context-topic-card.gjs",
|
||||
"filename": "javascript_discourse_components_card_high-context-topic-card.gjs",
|
||||
"bytes": 10326
|
||||
},
|
||||
{
|
||||
"field_id": 576,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/components/card/topic-activity-column.gjs",
|
||||
"filename": "javascript_discourse_components_card_topic-activity-column.gjs",
|
||||
"bytes": 1261
|
||||
},
|
||||
{
|
||||
"field_id": 577,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/components/card/topic-category-column.gjs",
|
||||
"filename": "javascript_discourse_components_card_topic-category-column.gjs",
|
||||
"bytes": 206
|
||||
},
|
||||
{
|
||||
"field_id": 578,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/components/card/topic-creator-column.gjs",
|
||||
"filename": "javascript_discourse_components_card_topic-creator-column.gjs",
|
||||
"bytes": 422
|
||||
},
|
||||
{
|
||||
"field_id": 579,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/components/card/topic-likes-column.gjs",
|
||||
"filename": "javascript_discourse_components_card_topic-likes-column.gjs",
|
||||
"bytes": 423
|
||||
},
|
||||
{
|
||||
"field_id": 580,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/components/card/topic-replies-column.gjs",
|
||||
"filename": "javascript_discourse_components_card_topic-replies-column.gjs",
|
||||
"bytes": 495
|
||||
},
|
||||
{
|
||||
"field_id": 581,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/components/card/topic-status-column.gjs",
|
||||
"filename": "javascript_discourse_components_card_topic-status-column.gjs",
|
||||
"bytes": 576
|
||||
},
|
||||
{
|
||||
"field_id": 582,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/components/composer-peek-mode-toggle.gjs",
|
||||
"filename": "javascript_discourse_components_composer-peek-mode-toggle.gjs",
|
||||
"bytes": 1133
|
||||
},
|
||||
{
|
||||
"field_id": 583,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/components/experimental-screen.gjs",
|
||||
"filename": "javascript_discourse_components_experimental-screen.gjs",
|
||||
"bytes": 1789
|
||||
},
|
||||
{
|
||||
"field_id": 584,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/components/sidebar-new-topic-button.gjs",
|
||||
"filename": "javascript_discourse_components_sidebar-new-topic-button.gjs",
|
||||
"bytes": 4012
|
||||
},
|
||||
{
|
||||
"field_id": 585,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/components/user-color-palette-menu-item.gjs",
|
||||
"filename": "javascript_discourse_components_user-color-palette-menu-item.gjs",
|
||||
"bytes": 1072
|
||||
},
|
||||
{
|
||||
"field_id": 586,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/components/user-color-palette-selector.gjs",
|
||||
"filename": "javascript_discourse_components_user-color-palette-selector.gjs",
|
||||
"bytes": 6203
|
||||
},
|
||||
{
|
||||
"field_id": 587,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/initializers/topic-list-columns.gjs",
|
||||
"filename": "javascript_discourse_initializers_topic-list-columns.gjs",
|
||||
"bytes": 6184
|
||||
},
|
||||
{
|
||||
"field_id": 753,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/lib/topic-activity.js",
|
||||
"filename": "javascript_discourse_lib_topic-activity.js",
|
||||
"bytes": 429
|
||||
},
|
||||
{
|
||||
"field_id": 702,
|
||||
"target_id": 6,
|
||||
"target_name": "javascript",
|
||||
"name": "discourse/lib/topic-status-badge.js",
|
||||
"filename": "javascript_discourse_lib_topic-status-badge.js",
|
||||
"bytes": 364
|
||||
},
|
||||
{
|
||||
"field_id": 754,
|
||||
"target_id": 7,
|
||||
"target_name": "target_7",
|
||||
"name": "acceptance/high-context-topic-card-test.gjs",
|
||||
"filename": "target_7_acceptance_high-context-topic-card-test.gjs",
|
||||
"bytes": 2297
|
||||
},
|
||||
{
|
||||
"field_id": 755,
|
||||
"target_id": 7,
|
||||
"target_name": "target_7",
|
||||
"name": "acceptance/nested-suggested-navigation-test.gjs",
|
||||
"filename": "target_7_acceptance_nested-suggested-navigation-test.gjs",
|
||||
"bytes": 5037
|
||||
},
|
||||
{
|
||||
"field_id": 757,
|
||||
"target_id": 7,
|
||||
"target_name": "target_7",
|
||||
"name": "acceptance/sidebar-new-topic-button-test.gjs",
|
||||
"filename": "target_7_acceptance_sidebar-new-topic-button-test.gjs",
|
||||
"bytes": 2051
|
||||
},
|
||||
{
|
||||
"field_id": 695,
|
||||
"target_id": 7,
|
||||
"target_name": "target_7",
|
||||
"name": "acceptance/topic-activity-column-test.gjs",
|
||||
"filename": "target_7_acceptance_topic-activity-column-test.gjs",
|
||||
"bytes": 2329
|
||||
},
|
||||
{
|
||||
"field_id": 696,
|
||||
"target_id": 7,
|
||||
"target_name": "target_7",
|
||||
"name": "integration/helpers/action-test.js",
|
||||
"filename": "target_7_integration_helpers_action-test.js",
|
||||
"bytes": 1870
|
||||
},
|
||||
{
|
||||
"field_id": 701,
|
||||
"target_id": 8,
|
||||
"target_name": "target_8",
|
||||
"name": "0001-convert-topic-card-context-to-boolean",
|
||||
"filename": "target_8_0001-convert-topic-card-context-to-boolean.txt",
|
||||
"bytes": 224
|
||||
},
|
||||
{
|
||||
"field_id": 565,
|
||||
"target_id": 9,
|
||||
"target_name": "about",
|
||||
"name": "about",
|
||||
"filename": "about_about.yml",
|
||||
"bytes": 3927
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
# 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:
|
||||
solved: "تم الحل"
|
||||
unsolved: "لم يُحل بعد"
|
||||
posted: "تم النشر"
|
||||
by_username: "من قِبل @%{username}"
|
||||
replied: "تم الرد"
|
||||
vote_count:
|
||||
zero: "%{count} من الأصوات"
|
||||
one: "صوت واحد %{count}"
|
||||
two: "صوتان %{count}"
|
||||
few: "%{count} أصوات"
|
||||
many: "%{count} صوتًا"
|
||||
other: "%{count} صوت"
|
||||
like_count:
|
||||
zero: "%{count} من الإعجابات"
|
||||
one: "إعجاب واحد (%{count})"
|
||||
two: "إعجابان (%{count})"
|
||||
few: "%{count} إعجابات"
|
||||
many: "%{count} إعجابًا"
|
||||
other: "%{count} إعجاب"
|
||||
reply_count:
|
||||
zero: "%{count} من الردود"
|
||||
one: "رد واحد (%{count})"
|
||||
two: "ردَّان (%{count})"
|
||||
few: "%{count} ردود"
|
||||
many: "%{count} ردًا"
|
||||
other: "%{count} رد"
|
||||
theme_metadata:
|
||||
description: "سمة سهلة وجذابة تسهم في تحسين تجربة التشغيل الافتراضية لمواقع Discourse."
|
||||
settings:
|
||||
topic_card_high_context:
|
||||
description: "عند تفعيله، يعرض السياق الإضافي على بطاقات الموضوعات، بما في ذلك الوسوم والمقتطفات وحالة الحل والمستخدمين المعيَّنين وأعداد الأصوات"
|
||||
@@ -0,0 +1,8 @@
|
||||
# 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:
|
||||
posted: "адправіў"
|
||||
@@ -0,0 +1,14 @@
|
||||
# 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:
|
||||
posted: "публикувано"
|
||||
vote_count:
|
||||
one: "%{count} глас"
|
||||
other: "%{count} гласа"
|
||||
reply_count:
|
||||
one: "%{count} отговор"
|
||||
other: "%{count} отговора"
|
||||
@@ -0,0 +1,17 @@
|
||||
# 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:
|
||||
solved: "Riješeno"
|
||||
posted: "zadnja objava"
|
||||
vote_count:
|
||||
one: "%{count} glas"
|
||||
few: "%{count} glasova"
|
||||
other: "%{count} glasova"
|
||||
reply_count:
|
||||
one: "%{count} odgovor"
|
||||
few: "%{count} odgovora"
|
||||
other: "%{count} odgovora"
|
||||
@@ -0,0 +1,18 @@
|
||||
# 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:
|
||||
solved: "Solucionat"
|
||||
posted: "publicat"
|
||||
vote_count:
|
||||
one: " %{count} vot"
|
||||
other: "%{count} vots"
|
||||
like_count:
|
||||
one: "%{count} 'm'agrada'"
|
||||
other: "%{count} 'm'agrada'"
|
||||
reply_count:
|
||||
one: "%{count} resposta"
|
||||
other: "%{count} respostes"
|
||||
@@ -0,0 +1,29 @@
|
||||
# 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:
|
||||
solved: "Vyřešeno"
|
||||
unsolved: "Nevyřešeno"
|
||||
posted: "poslední příspěvek"
|
||||
by_username: "@%{username}"
|
||||
replied: "odpověděl/a"
|
||||
vote_count:
|
||||
one: "%{count} hlas"
|
||||
few: "%{count} hlasy"
|
||||
many: "%{count} hlasy"
|
||||
other: "%{count} hlasy"
|
||||
like_count:
|
||||
one: "%{count} líbí se"
|
||||
few: "%{count} líbí se"
|
||||
many: "%{count} líbí se"
|
||||
other: "%{count} líbí se"
|
||||
reply_count:
|
||||
one: "%{count} odpověď"
|
||||
few: "%{count} odpovědí"
|
||||
many: "%{count} odpovědí"
|
||||
other: "%{count} odpovědí"
|
||||
theme_metadata:
|
||||
description: "Jednoduché a krásné téma, které vylepšuje zážitek z prostředí Discourse ihned po instalaci."
|
||||
@@ -0,0 +1,18 @@
|
||||
# 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:
|
||||
solved: "Løst"
|
||||
posted: "sidste indlæg"
|
||||
vote_count:
|
||||
one: "%{count} stemme"
|
||||
other: "%{count} stemmer"
|
||||
like_count:
|
||||
one: "%{count} Synes om"
|
||||
other: "%{count} Synes om"
|
||||
reply_count:
|
||||
one: "%{count} svar"
|
||||
other: "%{count} svar"
|
||||
@@ -0,0 +1,26 @@
|
||||
# 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:
|
||||
solved: "Gelöst"
|
||||
unsolved: "Ungelöst"
|
||||
posted: "hat geschrieben"
|
||||
by_username: "von @%{username}"
|
||||
replied: "antwortete"
|
||||
vote_count:
|
||||
one: "%{count} Stimme"
|
||||
other: "%{count} Stimmen"
|
||||
like_count:
|
||||
one: "%{count} „Gefällt mir“"
|
||||
other: "%{count} „Gefällt mir“"
|
||||
reply_count:
|
||||
one: "%{count} Antwort"
|
||||
other: "%{count} Antworten"
|
||||
theme_metadata:
|
||||
description: "Ein einfaches, schönes Theme, das die standardmäßige Benutzererfahrung für Discourse-Seiten verbessert."
|
||||
settings:
|
||||
topic_card_high_context:
|
||||
description: "Wenn diese Option aktiviert ist, werden zusätzliche Kontextinformationen in den Themenkarten angezeigt; darunter Schlagwörter, Auszüge, Lösungsstatus, zugeordnete Benutzer und die Anzahl der Stimmen."
|
||||
@@ -0,0 +1,23 @@
|
||||
# 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:
|
||||
solved: "Λυμένο"
|
||||
unsolved: "Άλυτο"
|
||||
posted: "ανάρτησε"
|
||||
vote_count:
|
||||
one: "%{count} ψήφος"
|
||||
other: "%{count} ψήφοι"
|
||||
like_count:
|
||||
one: "%{count} «μου αρέσει»"
|
||||
other: "%{count} «μου αρέσει»"
|
||||
reply_count:
|
||||
one: "%{count} απάντηση"
|
||||
other: "%{count} απαντήσεις"
|
||||
theme_metadata:
|
||||
settings:
|
||||
topic_card_high_context:
|
||||
description: "Όταν είναι ενεργοποιημένη, εμφανίζει πρόσθετο περιεχόμενο στις κάρτες θεμάτων, συμπεριλαμβανομένων ετικετών, αποσπασμάτων, κατάστασης επίλυσης, χρηστών με ανάθεση και αριθμού ψήφων."
|
||||
@@ -0,0 +1,20 @@
|
||||
en:
|
||||
solved: "Solved"
|
||||
unsolved: "Unsolved"
|
||||
posted: "posted"
|
||||
by_username: "by @%{username}"
|
||||
replied: "replied"
|
||||
vote_count:
|
||||
one: "%{count} vote"
|
||||
other: "%{count} votes"
|
||||
like_count:
|
||||
one: "%{count} like"
|
||||
other: "%{count} likes"
|
||||
reply_count:
|
||||
one: "%{count} reply"
|
||||
other: "%{count} replies"
|
||||
theme_metadata:
|
||||
description: "A simple, beautiful theme that improves the out of the box experience for Discourse sites."
|
||||
settings:
|
||||
topic_card_high_context:
|
||||
description: "When enabled, displays additional context on topic cards including tags, excerpts, solved status, assigned users, and vote counts"
|
||||
@@ -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:
|
||||
@@ -0,0 +1,23 @@
|
||||
# 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:
|
||||
solved: "Solucionado"
|
||||
unsolved: "Sin solucionar"
|
||||
posted: "publicó"
|
||||
by_username: "por @%{username}"
|
||||
replied: "respondió"
|
||||
vote_count:
|
||||
one: "%{count} voto"
|
||||
other: "%{count} votos"
|
||||
like_count:
|
||||
one: "%{count} me gusta"
|
||||
other: "%{count} me gusta"
|
||||
reply_count:
|
||||
one: "%{count} respuesta"
|
||||
other: "%{count} respuestas"
|
||||
theme_metadata:
|
||||
description: "Un tema sencillo y bonito que mejora la experiencia inigualable de los sitios de Discourse."
|
||||
@@ -0,0 +1,12 @@
|
||||
# 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:
|
||||
solved: "Lahendatud"
|
||||
posted: "postitatud"
|
||||
reply_count:
|
||||
one: "%{count} vastus"
|
||||
other: "%{count} vastust"
|
||||
@@ -0,0 +1,18 @@
|
||||
# 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:
|
||||
solved: "حل شده"
|
||||
posted: "ارسال شده"
|
||||
vote_count:
|
||||
one: "%{count} رای"
|
||||
other: "%{count} رای"
|
||||
like_count:
|
||||
one: "%{count} پسندیده"
|
||||
other: "%{count} پسندیده"
|
||||
reply_count:
|
||||
one: "%{count} پاسخ"
|
||||
other: "%{count} پاسخ"
|
||||
@@ -0,0 +1,21 @@
|
||||
# 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:
|
||||
solved: "Ratkaistu"
|
||||
posted: "lähetti viestin"
|
||||
by_username: "käyttäjältä @%{username}"
|
||||
vote_count:
|
||||
one: "%{count} ääni"
|
||||
other: "%{count} ääntä"
|
||||
like_count:
|
||||
one: "%{count} tykkäys"
|
||||
other: "%{count} tykkäystä"
|
||||
reply_count:
|
||||
one: "%{count} vastaus"
|
||||
other: "%{count} vastausta"
|
||||
theme_metadata:
|
||||
description: "Yksinkertainen ja upea teema, joka parantaa Discourse-sivustojen alustavaa käyttökokemusta."
|
||||
@@ -0,0 +1,26 @@
|
||||
# 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:
|
||||
solved: "Résolu"
|
||||
unsolved: "Non résolu"
|
||||
posted: "publié"
|
||||
by_username: "par @%{username}"
|
||||
replied: "a répondu"
|
||||
vote_count:
|
||||
one: "%{count} vote"
|
||||
other: "%{count} votes"
|
||||
like_count:
|
||||
one: "%{count} « J'aime »"
|
||||
other: "%{count} « J'aime »"
|
||||
reply_count:
|
||||
one: "%{count} réponse"
|
||||
other: "%{count} réponses"
|
||||
theme_metadata:
|
||||
description: "Un thème simple et élégant qui améliore l'expérience prête à l'emploi pour les sites Discourse."
|
||||
settings:
|
||||
topic_card_high_context:
|
||||
description: "Lorsque ce paramètre est activé, des informations contextuelles supplémentaires sont affichées sur les cartes de sujet, notamment les étiquettes, les extraits, le statut de résolution, les utilisateurs assignés et le nombre de votes."
|
||||
@@ -0,0 +1,15 @@
|
||||
# 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:
|
||||
posted: "publicado"
|
||||
by_username: "de %{username}"
|
||||
like_count:
|
||||
one: "%{count} gústame"
|
||||
other: "%{count} gústame"
|
||||
reply_count:
|
||||
one: "%{count} resposta"
|
||||
other: "%{count} repostas"
|
||||
@@ -0,0 +1,27 @@
|
||||
# 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:
|
||||
solved: "נפתר"
|
||||
posted: "פורסם"
|
||||
by_username: "מאת @%{username}"
|
||||
vote_count:
|
||||
one: "הצבעה"
|
||||
two: "שתי הצבעות"
|
||||
many: "%{count} הצבעות"
|
||||
other: "%{count} הצבעות"
|
||||
like_count:
|
||||
one: "לייק %{count}"
|
||||
two: "%{count} לייקים"
|
||||
many: "%{count} לייקים"
|
||||
other: "%{count} לייקים"
|
||||
reply_count:
|
||||
one: "תגובה"
|
||||
two: "שתי תגובות"
|
||||
many: "%{count} תגובות"
|
||||
other: "%{count} תגובות"
|
||||
theme_metadata:
|
||||
description: "ערכת נושא פשוטה ויפה שמשפרת את חוויית השימוש באתרי Discourse."
|
||||
@@ -0,0 +1,21 @@
|
||||
# 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:
|
||||
solved: "Riješeno"
|
||||
posted: "objavljeno"
|
||||
vote_count:
|
||||
one: "%{count} glas"
|
||||
few: "%{count} glasa"
|
||||
other: "%{count} glasa"
|
||||
like_count:
|
||||
one: "%{count} lajk"
|
||||
few: "%{count} lajka"
|
||||
other: "%{count} lajkova"
|
||||
reply_count:
|
||||
one: "%{count} odgovor"
|
||||
few: "%{count} odgovora"
|
||||
other: "%{count} odgovora"
|
||||
@@ -0,0 +1,23 @@
|
||||
# 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:
|
||||
solved: "Megoldva"
|
||||
unsolved: "Megoldatlan"
|
||||
posted: "közzétett"
|
||||
by_username: "szerző: @%{username}"
|
||||
replied: "válaszolt"
|
||||
vote_count:
|
||||
one: "%{count} szavazat"
|
||||
other: "%{count} szavazat"
|
||||
like_count:
|
||||
one: "%{count} kedvelés"
|
||||
other: "%{count} kedvelés"
|
||||
reply_count:
|
||||
one: "%{count} válasz"
|
||||
other: "%{count} válasz"
|
||||
theme_metadata:
|
||||
description: "Egy egyszerű, gyönyörű téma, amely javítja a Discourse webhelyek élményét."
|
||||
@@ -0,0 +1,12 @@
|
||||
# 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:
|
||||
solved: "Լուծված է"
|
||||
posted: "հրապարակված"
|
||||
reply_count:
|
||||
one: "%{count} պատասխան"
|
||||
other: "%{count} պատասխան"
|
||||
@@ -0,0 +1,13 @@
|
||||
# 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:
|
||||
vote_count:
|
||||
other: "%{count} suara"
|
||||
like_count:
|
||||
other: "%{count} suka"
|
||||
reply_count:
|
||||
other: "%{count} balasan"
|
||||
@@ -0,0 +1,21 @@
|
||||
# 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:
|
||||
solved: "Risolti"
|
||||
posted: "pubblicato"
|
||||
by_username: "da @%{username}"
|
||||
vote_count:
|
||||
one: "%{count} voto"
|
||||
other: "%{count} voti"
|
||||
like_count:
|
||||
one: "%{count} \"Mi piace\""
|
||||
other: "%{count} \"Mi piace\""
|
||||
reply_count:
|
||||
one: "%{count} risposta"
|
||||
other: "%{count} risposte"
|
||||
theme_metadata:
|
||||
description: "Un tema semplice e accattivante che migliora l'esperienza immediata dei siti Discourse."
|
||||
@@ -0,0 +1,20 @@
|
||||
# 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:
|
||||
solved: "解決済み"
|
||||
unsolved: "未解決"
|
||||
posted: "投稿しました"
|
||||
by_username: "作成者: @%{username}"
|
||||
replied: "返信済み"
|
||||
vote_count:
|
||||
other: "%{count} 票"
|
||||
like_count:
|
||||
other: "「いいね!」 %{count}"
|
||||
reply_count:
|
||||
other: "返信: %{count} 件"
|
||||
theme_metadata:
|
||||
description: "Discourse サイトのすぐに使用できるエクスペリエンスを向上させる、シンプルで美しいテーマ"
|
||||
@@ -0,0 +1,15 @@
|
||||
# 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:
|
||||
solved: "해결됨"
|
||||
posted: "게시"
|
||||
vote_count:
|
||||
other: "%{count} 투표"
|
||||
like_count:
|
||||
other: "좋아요 %{count}"
|
||||
reply_count:
|
||||
other: "%{count} 댓글"
|
||||
@@ -0,0 +1,19 @@
|
||||
# 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:
|
||||
solved: "Išspresta"
|
||||
posted: "paskelbta"
|
||||
like_count:
|
||||
one: "%{count} patinka"
|
||||
few: "%{count} patinka"
|
||||
many: "%{count} patinka"
|
||||
other: "%{count} patinka"
|
||||
reply_count:
|
||||
one: "%{count} atsakymas"
|
||||
few: "%{count} atsakymai"
|
||||
many: "%{count} atsakymai"
|
||||
other: "%{count} atsakymai"
|
||||
@@ -0,0 +1,12 @@
|
||||
# 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:
|
||||
posted: "ierakstīts"
|
||||
reply_count:
|
||||
zero: "%{count} atbildes"
|
||||
one: "%{count} atbilde"
|
||||
other: "%{count} atbildes"
|
||||
@@ -0,0 +1,12 @@
|
||||
# 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:
|
||||
solved: "Løst"
|
||||
posted: "skrevet"
|
||||
reply_count:
|
||||
one: "%{count} svar"
|
||||
other: "%{count} svar"
|
||||
@@ -0,0 +1,23 @@
|
||||
# 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:
|
||||
solved: "Opgelost"
|
||||
unsolved: "Onopgelost"
|
||||
posted: "geplaatst"
|
||||
by_username: "van @%{username}"
|
||||
replied: "beantwoord"
|
||||
vote_count:
|
||||
one: "%{count} stem"
|
||||
other: "%{count} stemmen"
|
||||
like_count:
|
||||
one: "%{count} like"
|
||||
other: "%{count} likes"
|
||||
reply_count:
|
||||
one: "%{count} antwoord"
|
||||
other: "%{count} antwoorden"
|
||||
theme_metadata:
|
||||
description: "Een eenvoudig, mooi thema dat de out-of-the-box ervaring voor Discourse-sites verbetert."
|
||||
@@ -0,0 +1,32 @@
|
||||
# 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:
|
||||
solved: "Rozwiązany"
|
||||
unsolved: "Nierozwiązano"
|
||||
posted: "wysłano"
|
||||
by_username: "przez @%{username}"
|
||||
replied: "odpowiedziano"
|
||||
vote_count:
|
||||
one: "%{count} głos"
|
||||
few: "%{count} głosy"
|
||||
many: "%{count} głosy"
|
||||
other: "%{count} głosy"
|
||||
like_count:
|
||||
one: "%{count} polubienie"
|
||||
few: "%{count} polubienia"
|
||||
many: "%{count} polubień"
|
||||
other: "%{count} polubień"
|
||||
reply_count:
|
||||
one: "%{count} odpowiedź"
|
||||
few: "%{count} odpowiedzi"
|
||||
many: "%{count} odpowiedzi"
|
||||
other: "%{count} odpowiedzi"
|
||||
theme_metadata:
|
||||
description: "Prosty, piękny motyw, który od razu po zainstalowaniu poprawia komfort korzystania ze stron Discourse."
|
||||
settings:
|
||||
topic_card_high_context:
|
||||
description: "Po włączeniu wyświetla dodatkowy kontekst na kartach tematów, w tym tagi, fragmenty, status rozwiązania, przypisanych użytkowników i liczbę głosów"
|
||||
@@ -0,0 +1,18 @@
|
||||
# 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:
|
||||
solved: "Resolvido"
|
||||
posted: "publicou"
|
||||
vote_count:
|
||||
one: "%{count} voto"
|
||||
other: "%{count} votos"
|
||||
like_count:
|
||||
one: "%{count} curtiu"
|
||||
other: "%{count} curtiram"
|
||||
reply_count:
|
||||
one: "%{count} resposta"
|
||||
other: "%{count} respostas"
|
||||
@@ -0,0 +1,23 @@
|
||||
# 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:
|
||||
solved: "Resolvido"
|
||||
unsolved: "Não resolvido"
|
||||
posted: "postou"
|
||||
by_username: "por @%{username}"
|
||||
replied: "respondeu"
|
||||
vote_count:
|
||||
one: "%{count} voto"
|
||||
other: "%{count} votos"
|
||||
like_count:
|
||||
one: "%{count} curtida"
|
||||
other: "%{count} curtidas"
|
||||
reply_count:
|
||||
one: "%{count} resposta"
|
||||
other: "%{count} respostas"
|
||||
theme_metadata:
|
||||
description: "Um tema simples e elegante que melhora a experiência pronta para uso dos sites do Discourse."
|
||||
@@ -0,0 +1,20 @@
|
||||
# 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:
|
||||
solved: "Rezolvat"
|
||||
posted: "postat"
|
||||
by_username: "de @%{username}"
|
||||
vote_count:
|
||||
one: "%{count} vot"
|
||||
few: "%{count} voturi"
|
||||
other: "%{count} voturi"
|
||||
reply_count:
|
||||
one: "%{count} răspuns"
|
||||
few: "%{count} răspunsuri"
|
||||
other: "%{count} de răspunsuri"
|
||||
theme_metadata:
|
||||
description: "O temă simplă și frumoasă care îmbunătățește experiența de utilizare pentru site-urile Discourse."
|
||||
@@ -0,0 +1,32 @@
|
||||
# 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:
|
||||
solved: "Решённые"
|
||||
unsolved: "Нерешенные"
|
||||
posted: "отправлено"
|
||||
by_username: "от @%{username}"
|
||||
replied: "ответил"
|
||||
vote_count:
|
||||
one: "%{count} голос"
|
||||
few: "%{count} голоса"
|
||||
many: "%{count} голосов"
|
||||
other: "%{count} голосов"
|
||||
like_count:
|
||||
one: "%{count} лайк"
|
||||
few: "%{count} лайка"
|
||||
many: "%{count} лайков"
|
||||
other: "%{count} лайков"
|
||||
reply_count:
|
||||
one: "%{count} ответ"
|
||||
few: "%{count} ответа"
|
||||
many: "%{count} ответов"
|
||||
other: "%{count} ответа"
|
||||
theme_metadata:
|
||||
description: "Простая и красивая тема, которая улучшает работу сайтов с Discourse сразу после установки."
|
||||
settings:
|
||||
topic_card_high_context:
|
||||
description: "Показывать на карточках тем дополнительную информацию: теги, выдержки из сообщений, статус решения, назначенных пользователей и число голосов"
|
||||
@@ -0,0 +1,27 @@
|
||||
# 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:
|
||||
solved: "Vyriešené"
|
||||
posted: "zverejnené"
|
||||
by_username: "od @%{username}"
|
||||
vote_count:
|
||||
one: "%{count} hlas"
|
||||
few: "%{count} hlasy"
|
||||
many: "%{count} hlasy"
|
||||
other: "%{count} hlasy"
|
||||
like_count:
|
||||
one: "%{count} lajk"
|
||||
few: "%{count} lajkov"
|
||||
many: "%{count} lajky"
|
||||
other: "%{count} lajky"
|
||||
reply_count:
|
||||
one: "%{count} odpoveď"
|
||||
few: "%{count} odpovede"
|
||||
many: "%{count} odpovedí"
|
||||
other: "%{count} odpovedí"
|
||||
theme_metadata:
|
||||
description: "Jednoduchá a krásna téma, ktorá zlepšuje používateľské prostredie stránok Discourse."
|
||||
@@ -0,0 +1,19 @@
|
||||
# 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:
|
||||
solved: "Rešeno"
|
||||
posted: "objavljeno"
|
||||
like_count:
|
||||
one: "%{count} všeček"
|
||||
two: "%{count} všečka"
|
||||
few: "%{count} všečke"
|
||||
other: "%{count} všečkov"
|
||||
reply_count:
|
||||
one: "%{count} odgovor"
|
||||
two: "%{count} odgovora"
|
||||
few: "%{count} odgovori"
|
||||
other: "%{count} odgovorov"
|
||||
@@ -0,0 +1,11 @@
|
||||
# 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:
|
||||
posted: "postuar"
|
||||
reply_count:
|
||||
one: "%{count} përgjigje"
|
||||
other: "%{count} përgjigje"
|
||||
@@ -0,0 +1,12 @@
|
||||
# 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:
|
||||
posted: "pisao"
|
||||
reply_count:
|
||||
one: "%{count} odgovor"
|
||||
few: "%{count} odgovora"
|
||||
other: "%{count} odgovora"
|
||||
@@ -0,0 +1,19 @@
|
||||
# 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:
|
||||
solved: "Löst"
|
||||
posted: "publicerade"
|
||||
by_username: "av @%{username}"
|
||||
vote_count:
|
||||
one: "%{count} röst"
|
||||
other: "%{count} röster"
|
||||
like_count:
|
||||
one: "%{count} gillning"
|
||||
other: "%{count} gillningar"
|
||||
reply_count:
|
||||
one: "%{count} svar"
|
||||
other: "%{count} svar"
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user