Compare commits

...

37 Commits

Author SHA1 Message Date
Jordan Vidrine efebb531c0 Merge branch 'main' into second-batch 2025-03-28 13:16:27 -05:00
Jordan Vidrine a54dbdc59b UX: More logic for title columns (#87) 2025-03-28 13:13:28 -05:00
chapoi 0715bdc33a FIX: remove overflow prop (#91) 2025-03-28 13:12:42 -05:00
chapoi 34dfba0677 UX: fix minimised draft bg colour for composer (#89)
Followup fix for #84
2025-03-28 13:12:42 -05:00
chapoi 701b69e0df Composer styling on desktop (#84) 2025-03-28 13:11:53 -05:00
chapoi 0fbe345c0c FIX: remove overflow prop (#91) 2025-03-28 13:11:21 -05:00
chapoi 7d48d0f936 UX: fix minimised draft bg colour for composer (#89)
Followup fix for #84
2025-03-28 13:11:21 -05:00
Jordan Vidrine 8b6c056720 excerpt fixes 2025-03-28 13:11:21 -05:00
Jordan Vidrine 94c31086f9 title full width on mobile 2025-03-28 13:11:21 -05:00
Jordan Vidrine 1459099b8d more 2025-03-28 13:11:21 -05:00
Martin Brennan 2983bac4a0 FIX: Messed up CSS grid on messages list (#88)
This needs a better follow-up, but the messages topic list
is currently busted. Removing the overridden topic-list-item
grid for messages helps.
2025-03-28 13:11:21 -05:00
chapoi cb72e6e091 Composer styling on desktop (#84) 2025-03-28 13:11:21 -05:00
Jordan Vidrine 49f708db2c PM fixes, mobile fixes 2025-03-28 13:11:21 -05:00
Jordan Vidrine 6364aa74e6 more logic for title columns 2025-03-28 13:11:21 -05:00
Jordan Vidrine 2046f525d4 UX: More logic for title columns (#87) 2025-03-28 10:49:28 -05:00
chapoi 9945f1d899 FIX: remove overflow prop (#91) 2025-03-28 08:27:36 -05:00
chapoi f70524a44b UX: fix minimised draft bg colour for composer (#89)
Followup fix for #84
2025-03-28 14:17:45 +01:00
Martin Brennan 0a416d317e FIX: Messed up CSS grid on messages list (#88)
This needs a better follow-up, but the messages topic list
is currently busted. Removing the overridden topic-list-item
grid for messages helps.
2025-03-28 12:39:49 +10:00
chapoi 910bc855c1 Composer styling on desktop (#84) 2025-03-27 16:41:20 -05:00
chapoi e20b83b79d Misc mobile fixes (#83) 2025-03-27 16:35:08 -05:00
Jordan Vidrine e7de006a23 UX: Topic list layout changes (#85) 2025-03-27 16:31:46 -05:00
Jordan Vidrine eff8628223 DEV: Fix spec (#86) 2025-03-27 16:31:28 -05:00
Jordan Vidrine a84682c0d0 FIX: Bulk select fix (#81)
This PR fixes bulk select on the new topic cards.
2025-03-27 10:03:40 +10:00
Jordan Vidrine adb1e4dcf2 UX: Change title fonts, etc (#80) 2025-03-26 14:08:42 -05:00
Jordan Vidrine d300cf9d0f UX: New topic card layout (#79) 2025-03-26 10:47:52 -05:00
Kris 6766b94232 UX: add tags-index container (#78) 2025-03-25 16:18:17 -04:00
Jordan Vidrine af82802548 UX: Topic list card fixes for assignments & bookmarks (#76) 2025-03-25 15:11:49 -05:00
Kris 943dd4e2d2 UX: change category nav background on mobile (#77) 2025-03-25 15:54:03 -04:00
Jordan Vidrine 1a372b7edc fix z index for input menu (#75) 2025-03-25 10:08:16 -05:00
Kris f786eae910 UX: set border radius on PMs (#74) 2025-03-24 15:22:25 -04:00
Jordan Vidrine dabd9a159a DEV: Use new is_hot_topic serializer (#73) 2025-03-24 12:05:10 -05:00
Jordan Vidrine 969e2b7969 begin migration of colors (#72) 2025-03-21 09:44:09 -05:00
chapoi ade14d7f54 Welcome banner: slight zindex increase (#70) 2025-03-21 11:55:29 +01:00
chapoi 30cb6bbf59 UX: Z-index welcome banner (#68)
* UX: increase z-index of welcome banner

* UX: lower z-index of sticky list-controls
2025-03-20 19:13:52 +01:00
Jordan Vidrine bee6e4e3c5 init (#69) 2025-03-20 09:43:40 -05:00
Kris 7f6b0df5bf UX: move and restyle bulk select on desktop (#65) 2025-03-20 08:42:11 -04:00
Martin Brennan 274e5f7a1f UX: Add theme settings and value transformers (#67)
This commit adds the above for these core site
settings:

* search_experience
* enable_welcome_banner

Since for horizon we want better control of
the default experience of these settings OOTB.

See also https://github.com/discourse/discourse/pull/31917
2025-03-20 15:38:46 +10:00
21 changed files with 721 additions and 388 deletions
+56 -15
View File
@@ -9,7 +9,8 @@
"maximum_discourse_version": null, "maximum_discourse_version": null,
"assets": {}, "assets": {},
"modifiers": { "modifiers": {
"svg_icons": ["fire"] "svg_icons": ["fire"],
"serialize_topic_is_hot": true
}, },
"components": [ "components": [
"https://github.com/discourse/discourse-sidebar-new-topic-button.git", "https://github.com/discourse/discourse-sidebar-new-topic-button.git",
@@ -19,22 +20,62 @@
"Horizon": { "Horizon": {
"primary": "1A1A1A", "primary": "1A1A1A",
"secondary": "ffffff", "secondary": "ffffff",
"header_background": "f5f8ff", "tertiary": "595bca"
"tertiary": "595bca",
"tertiary-low": "d8d9f3",
"tertiary-50": "f5f8ff",
"selected": "d8d9f3",
"hover": "ebebf9"
}, },
"Horizon Dark": { "Horizon Dark": {
"primary": "F1EFF9", "primary": "ffffff",
"secondary": "1e1a36", "secondary": "1A1A1A",
"header_background": "00091d", "tertiary": "595bca"
"header_primary": "F5F8FF", },
"tertiary": "6465ab", "Royal": {
"tertiary-50": "131124", "primary": "1A1A1A",
"selected": "1e1a36", "secondary": "ffffff",
"hover": "131124" "tertiary": "4169e1"
},
"Royal Dark": {
"primary": "ffffff",
"secondary": "1A1A1A",
"tertiary": "4169e1"
},
"Clover": {
"primary": "1A1A1A",
"secondary": "ffffff",
"tertiary": "45a06e"
},
"Clover Dark": {
"primary": "ffffff",
"secondary": "1A1A1A",
"tertiary": "45a06e"
},
"Lily": {
"primary": "1A1A1A",
"secondary": "ffffff",
"tertiary": "cc338c"
},
"Lily Dark": {
"primary": "ffffff",
"secondary": "1A1A1A",
"tertiary": "cc338c"
},
"Violet": {
"primary": "1A1A1A",
"secondary": "ffffff",
"tertiary": "9b15de"
},
"Violet Dark": {
"primary": "ffffff",
"secondary": "1A1A1A",
"tertiary": "9b15de"
},
"Marigold": {
"primary": "1A1A1A",
"secondary": "ffffff",
"tertiary": "d3881f"
},
"Marigold Dark": {
"primary": "ffffff",
"secondary": "1A1A1A",
"tertiary": "d3881f"
} }
} }
} }
+63
View File
@@ -0,0 +1,63 @@
.bulk-select-enabled {
.topic-list-header .topic-list-data.default {
position: sticky;
top: 10em;
}
.topic-author-avatar-data {
display: none;
}
.bulk-select.topic-list-data {
grid-area: bulk-select;
margin-left: -0.5em;
@media screen and (max-width: 576px) {
margin-top: 0;
label {
padding-block: 0.345em;
}
}
input {
transform: scale(1.5);
}
}
}
.topic-list-header {
tr {
border: none;
}
.topic-list-data {
padding: 0;
&:not(.default) {
display: none;
}
&.default {
position: absolute;
right: 0;
.bulk-select,
span:not(.bulk-select-topics, .d-button-label) {
display: none;
}
}
}
.bulk-select-topics {
position: absolute;
right: -1em;
@media screen and (max-width: 1048px) {
right: 0;
}
background: var(--secondary);
border-radius: 0 0 0 var(--d-border-radius);
padding: 1em;
button {
white-space: nowrap;
}
}
}
@@ -1,8 +1,18 @@
import { apiInitializer } from "discourse/lib/api"; import { apiInitializer } from "discourse/lib/api";
import CustomColorHtmlClass from "../components/custom-color-html-class"; import CustomColorHtmlClass from "../components/custom-color-html-class";
import CustomUserPalette from "../components/custom-user-palette";
import ExperimentalScreen from "../components/experimental-screen"; import ExperimentalScreen from "../components/experimental-screen";
export default apiInitializer("1.8.0", (api) => { export default apiInitializer("1.8.0", (api) => {
api.renderInOutlet("above-main-container", ExperimentalScreen); api.renderInOutlet("above-main-container", ExperimentalScreen);
api.renderInOutlet("above-main-container", CustomColorHtmlClass); api.renderInOutlet("above-main-container", CustomColorHtmlClass);
api.renderInOutlet("sidebar-footer-actions", CustomUserPalette);
api.registerValueTransformer("site-setting-enable-welcome-banner", () => {
return settings.enable_welcome_banner;
});
api.registerValueTransformer("site-setting-search-experience", () => {
return settings.search_experience;
});
}); });
@@ -0,0 +1,7 @@
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer("0.8.0", (api) => {
api.registerValueTransformer("bulk-select-in-nav-controls", () => {
return true;
});
});
@@ -1,6 +0,0 @@
import { apiInitializer } from "discourse/lib/api";
import CustomUserPalette from "../components/custom-user-palette";
export default apiInitializer("1.8.0", (api) => {
api.renderInOutlet("sidebar-footer-actions", CustomUserPalette);
});
@@ -0,0 +1,50 @@
import Component from "@glimmer/component";
import avatar from "discourse/helpers/avatar";
import formatDate from "discourse/helpers/format-date";
import { i18n } from "discourse-i18n";
import gt from "truth-helpers/helpers/gt";
export default class TopicActivityColumn extends Component {
get activityText() {
// this should handle any case where a topic was no bumped due to a reply/post
if (
moment(this.args.topic.bumped_at).isAfter(this.args.topic.last_posted_at)
) {
return "user_updated";
}
if (this.args.topic.posts_count > 1) {
return "user_replied";
} else if (this.args.topic.posts_count === 1) {
return "user_posted";
}
}
<template>
<span class="topic-activity">
<div class="topic-activity__user">
{{#if (gt @topic.replyCount 1)}}
{{avatar @topic.lastPosterUser imageSize="small"}}
<span
class="topic-activity__username"
>@{{@topic.last_poster_username}}</span>
{{else}}
{{avatar @topic.creator imageSize="small"}}
<span
class="topic-activity__username"
>@{{@topic.creator.username}}</span>
{{/if}}
</div>
<div class="topic-activity__reason">
{{i18n (themePrefix this.activityText)}}
</div>
<div class="topic-activity__time">
{{formatDate
@topic.bumpedAt
leaveAgo="true"
format="medium-with-ago-and-on"
}}
</div>
</span>
</template>
}
@@ -2,8 +2,8 @@ import icon from "discourse/helpers/d-icon";
import gt from "truth-helpers/helpers/gt"; import gt from "truth-helpers/helpers/gt";
const TopicRepliesColumn = <template> const TopicRepliesColumn = <template>
{{#if (gt @topic.posts_count 1)}} {{#if (gt @topic.replyCount 1)}}
<span class="topic-replies">{{icon "reply"}}{{@topic.posts_count}}</span> <span class="topic-replies">{{icon "reply"}}{{@topic.replyCount}}</span>
{{/if}} {{/if}}
</template>; </template>;
@@ -1,115 +1,36 @@
import Component from "@glimmer/component"; import Component from "@glimmer/component";
import { on } from "@ember/modifier";
import { action } from "@ember/object";
import { service } from "@ember/service"; import { service } from "@ember/service";
import { and } from "truth-helpers";
import icon from "discourse/helpers/d-icon"; import icon from "discourse/helpers/d-icon";
import { i18n } from "discourse-i18n"; import { i18n } from "discourse-i18n";
export default class TopicStatusColumn extends Component { export default class TopicStatusColumn extends Component {
@service currentUser;
@service siteSettings; @service siteSettings;
get canAct() { get badge() {
return this.currentUser && !this.args.disableActions; if (this.args.topic.is_hot) {
} return {
icon: "fire",
get statusClass() { text: "topic_hot",
let classes = ["topic-status-card"]; className: "--hot",
if (this.args.topic.bookmarked) { };
classes.push("--bookmark");
} else if (this.args.topic.closed && this.args.topic.archived) {
classes.push("--locked --archived");
} else if (this.args.topic.closed) {
classes.push("--locked");
} else if (this.args.topic.archived) {
classes.push("--archived");
} else if (this.args.topic.is_warning) {
classes.push("--warning");
} else if (
this.args.showPrivateMessageIcon &&
this.args.topic.isPrivateMessage
) {
classes.push("--private-message");
} else if (this.args.topic.pinned) {
classes.push("--pinned");
} else if (this.args.topic.unpinned) {
classes.push("--unpinned");
} }
return classes.join(" ");
}
get heatMap() { if (this.args.topic.pinned) {
return this.args.topic.views > this.siteSettings.topic_views_heat_medium; return {
} icon: "thumbtack",
text: "topic_pinned",
className: "--pinned",
};
}
@action return null;
togglePinned(event) {
event.preventDefault();
this.args.topic.togglePinnedForUser();
} }
<template> <template>
{{#if @topic.bookmarked}} {{#if this.badge}}
<span class={{this.statusClass}}>{{icon "bookmark"}}{{i18n <span class="topic-status-card {{this.badge.className}}">{{icon
(themePrefix "topic_bookmarked") this.badge.icon
}}</span> }}{{i18n (themePrefix this.badge.text)}}</span>
{{/if}}
{{#if (and @topic.closed @topic.archived)~}}
<span class={{this.statusClass}}>{{i18n
(themePrefix "topic_closed_and_archived")
}}</span>
{{else if @topic.closed}}
<span class={{this.statusClass}}>{{i18n
(themePrefix "topic_closed")
}}</span>
{{else if @topic.archived}}
<span class={{this.statusClass}}>{{i18n
(themePrefix "topic_archived")
}}</span>
{{/if}}
{{#if @topic.is_warning}}
<span class={{this.statusClass}}>{{i18n
(themePrefix "topic_warning")
}}</span>
{{else if (and @showPrivateMessageIcon @topic.isPrivateMessage)}}
<span class={{this.statusClass}}>{{i18n
(themePrefix "topic_personal_message")
}}</span>
{{/if}}
{{#if @topic.pinned}}
{{#if this.canAct}}
<button
type="button"
{{on "click" this.togglePinned}}
class={{this.statusClass}}
>{{icon "thumbtack"}}{{i18n (themePrefix "topic_pinned")}}</button>
{{else}}
<span class={{this.statusClass}}>{{icon "thumbtack"}}{{i18n
(themePrefix "topic_pinned")
}}</span>
{{/if}}
{{else if @topic.unpinned}}
{{#if this.canAct}}
<button
type="button"
{{on "click" this.togglePinned}}
class={{this.statusClass}}
>{{icon "thumbtack" class="unpinned"}}{{i18n
(themePrefix "topic_unpinned")
}}</button>
{{else}}
<span class={{this.statusClass}}>{{icon
"thumbtack"
class="unpinned"
}}{{i18n (themePrefix "topic_unpinned")}}</span>
{{/if}}
{{/if}}
{{#if this.heatMap}}
<span class="topic-status-card --hot">{{icon "fire"}}{{i18n
(themePrefix "topic_hot")
}}</span>
{{/if}} {{/if}}
</template> </template>
} }
@@ -1,30 +1,28 @@
import { withPluginApi } from "discourse/lib/plugin-api"; import { withPluginApi } from "discourse/lib/plugin-api";
import TopicAuthorAvatarColumn from "../components/card/topic-author-avatar-column"; import TopicActivityColumn from "../components/card/topic-activity-column";
import TopicAuthorColumn from "../components/card/topic-author-column";
import TopicCategoryColumn from "../components/card/topic-category-column"; import TopicCategoryColumn from "../components/card/topic-category-column";
import TopicLikesColumn from "../components/card/topic-likes-column"; import TopicLikesColumn from "../components/card/topic-likes-column";
import TopicRepliesColumn from "../components/card/topic-replies-column"; import TopicRepliesColumn from "../components/card/topic-replies-column";
import TopicStatusColumn from "../components/card/topic-status-column"; import TopicStatusColumn from "../components/card/topic-status-column";
const TopicAuthor = <template> const TopicActivity = <template>
<td class="topic-author-data"> <td class="topic-activity-data">
<TopicAuthorColumn @topic={{@topic}} /> <TopicActivityColumn @topic={{@topic}} />
</td> </td>
</template>; </template>;
const TopicAuthorAvatar = <template> const TopicStatus = <template>
<td class="topic-author-avatar-data"> <td class="topic-status-data">
<TopicAuthorAvatarColumn @topic={{@topic}} />
</td>
</template>;
const TopicCategoryStatus = <template>
<td class="topic-category-status-data">
<TopicCategoryColumn @topic={{@topic}} />
<TopicStatusColumn @topic={{@topic}} /> <TopicStatusColumn @topic={{@topic}} />
</td> </td>
</template>; </template>;
const TopicCategory = <template>
<td class="topic-category-data">
<TopicCategoryColumn @topic={{@topic}} />
</td>
</template>;
const TopicLikesReplies = <template> const TopicLikesReplies = <template>
<td class="topic-likes-replies-data"> <td class="topic-likes-replies-data">
<TopicLikesColumn @topic={{@topic}} /> <TopicLikesColumn @topic={{@topic}} />
@@ -40,17 +38,17 @@ export default {
api.registerValueTransformer( api.registerValueTransformer(
"topic-list-columns", "topic-list-columns",
({ value: columns }) => { ({ value: columns }) => {
columns.add("topic-author", { columns.add("topic-activity", {
item: TopicAuthor, item: TopicActivity,
after: "activity", after: "title",
}); });
columns.add("topic-category-status", { columns.add("topic-status", {
item: TopicCategoryStatus, item: TopicStatus,
after: "topic-author", after: "topic-author",
}); });
columns.add("topic-author-avatar", { columns.add("topic-category", {
item: TopicAuthorAvatar, item: TopicCategory,
after: "topic-category-status", after: "topic-status",
}); });
columns.add("topic-likes-replies", { columns.add("topic-likes-replies", {
item: TopicLikesReplies, item: TopicLikesReplies,
@@ -59,6 +57,7 @@ export default {
columns.delete("posters"); columns.delete("posters");
columns.delete("views"); columns.delete("views");
columns.delete("replies"); columns.delete("replies");
columns.delete("activity");
return columns; return columns;
} }
); );
@@ -66,8 +65,12 @@ export default {
api.registerValueTransformer( api.registerValueTransformer(
"topic-list-item-class", "topic-list-item-class",
({ value: classes, context }) => { ({ value: classes, context }) => {
if (context.topic.pinned || context.topic.pinned_globally) { if (
classes.push("--pinned"); context.topic.is_hot ||
context.topic.pinned ||
context.topic.pinned_globally
) {
classes.push("--has-status-card");
} }
return classes; return classes;
} }
+4 -7
View File
@@ -1,12 +1,9 @@
en: en:
theme_metadata: theme_metadata:
description: "A simple, beautiful theme that improves the out of the box experience for Discourse sites." description: "A simple, beautiful theme that improves the out of the box experience for Discourse sites."
topic_bookmarked: "Bookmarked"
topic_closed_archived: "Closed and archived"
topic_closed: "Closed"
topic_archived: "Archived"
topic_warning: "Warning"
topic_personal_message: "Personal message"
topic_pinned: "Pinned" topic_pinned: "Pinned"
topic_unpinned: "Unpinned"
topic_hot: "Hot" topic_hot: "Hot"
user_replied: "replied"
user_posted: "posted"
user_updated: "updated"
+4
View File
@@ -51,3 +51,7 @@ body.has-full-page-chat {
color: var(--primary); color: var(--primary);
} }
} }
.chat-drawer-active.chat-drawer-expanded .chat-composer-dropdown__menu-content {
z-index: z("composer", "content") + 1;
}
+49
View File
@@ -9,6 +9,55 @@
} }
} }
} }
#reply-control.hide-preview:not(.draft) {
@include breakpoint("mobile-extra-large", $rule: min-width) {
background: var(--d-content-background);
border-top-right-radius: var(--d-border-radius);
border-top-left-radius: var(--d-border-radius);
.grippie {
background: var(--tertiary-low);
}
.title-and-category {
padding: 0 var(--spacing-inline-m);
width: calc(100% - var(--spacing-inline-m) * 2);
}
.d-editor-button-bar {
padding: 3px var(--spacing-inline-m);
border: none;
}
.d-editor-input {
padding: var(--spacing-inline-m);
}
&:has(.in-focus) .grippie {
background: var(--tertiary);
}
.reply-area {
padding-inline: 0;
}
.reply-to,
.submit-panel {
padding-inline: var(--spacing-inline-sm);
}
.d-editor-textarea-wrapper {
border: 0;
border-bottom: 1px solid var(--primary-low);
border-radius: 0;
&.in-focus {
outline: 0;
}
}
}
}
.d-editor-button-bar { .d-editor-button-bar {
.btn:hover, .btn:hover,
.toolbar-popup-menu-options.is-expanded { .toolbar-popup-menu-options.is-expanded {
+9 -1
View File
@@ -4,10 +4,17 @@
html:not(:has(.has-full-page-chat)) { html:not(:has(.has-full-page-chat)) {
background-color: var(--background-color); background-color: var(--background-color);
@include breakpoint("mobile-extra-large") {
background-color: var(--d-content-background);
}
} }
body { body {
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
@include breakpoint("mobile-extra-large") {
background-color: var(--d-content-background);
}
} }
#main-outlet-wrapper { #main-outlet-wrapper {
gap: var(--main-grid-gap); gap: var(--main-grid-gap);
@@ -73,7 +80,8 @@ body:not(.has-full-page-chat) {
.body-page, .body-page,
.container.badges, .container.badges,
.topic-above-footer-buttons-outlet .presence-users, .topic-above-footer-buttons-outlet .presence-users,
.global-notice { .global-notice,
.container.tags-index {
@include breakpoint(medium, $rule: min-width) { @include breakpoint(medium, $rule: min-width) {
max-width: 1000px; max-width: 1000px;
margin-inline: auto; margin-inline: auto;
-4
View File
@@ -40,10 +40,6 @@
border-radius: 0; border-radius: 0;
} }
.d-editor-button-bar {
padding: 3px;
}
.open .grippie { .open .grippie {
background-color: var(--accent-color); background-color: var(--accent-color);
} }
+9 -15
View File
@@ -2,7 +2,7 @@
@include breakpoint(medium) { @include breakpoint(medium) {
html, html,
.d-header { .d-header {
background-color: var(--secondary); background-color: var(--d-content-background);
} }
} }
#main-outlet-wrapper { #main-outlet-wrapper {
@@ -36,6 +36,7 @@
row-gap: var(--spacing-block-xs); row-gap: var(--spacing-block-xs);
flex-basis: 100%; flex-basis: 100%;
.select-kit-header { .select-kit-header {
background: var(--d-content-background);
padding-block: var(--spacing-block-s); padding-block: var(--spacing-block-s);
padding-inline: 0; padding-inline: 0;
border: 0; border: 0;
@@ -84,24 +85,11 @@
padding-top: 0; padding-top: 0;
} }
} }
.topic-list-item {
@include breakpoint(mobile-extra-large) {
box-shadow: none;
border-radius: 0;
//to be moved to topic card segment for general use
// .navigation-category & {
// .badge-category__wrapper {
// display: none;
// }
// }
}
}
} }
#topic-title { #topic-title {
@include breakpoint(mobile-extra-large) { @include breakpoint(mobile-extra-large) {
padding-inline: var(--spacing-inline-m) !important; padding-inline: var(--spacing-inline-s) !important;
.title-wrapper { .title-wrapper {
gap: var(--spacing-block-s); gap: var(--spacing-block-s);
@@ -131,6 +119,12 @@
oklch(from var(--category-badge-color) 100% calc(c * 0.9) h) oklch(from var(--category-badge-color) 100% calc(c * 0.9) h)
); );
} }
.discourse-tags {
gap: var(--spacing-inline-xs);
&__tag-separator {
display: none;
}
}
.discourse-tag { .discourse-tag {
font-size: var(--font-down-2-rem); font-size: var(--font-down-2-rem);
padding: var(--spacing-inline-xs) var(--spacing-inline-s); padding: var(--spacing-inline-xs) var(--spacing-inline-s);
+1 -1
View File
@@ -2,7 +2,7 @@
position: sticky; position: sticky;
top: var(--header-offset); top: var(--header-offset);
background: var(--d-content-background); background: var(--d-content-background);
z-index: 100; z-index: z("base");
padding: 1.5rem 0 1rem 0; padding: 1.5rem 0 1rem 0;
max-width: unset; max-width: unset;
+4
View File
@@ -1,3 +1,7 @@
.welcome-banner {
z-index: calc(z("base") + 1);
}
.custom-search-banner-wrap { .custom-search-banner-wrap {
display: grid; display: grid;
grid-template-rows: 0.33fr 0.33fr 0.33fr; grid-template-rows: 0.33fr 0.33fr 0.33fr;
+344 -182
View File
@@ -1,16 +1,3 @@
// 390x844 mobile/portrait (Figma iPhone 13 & 14)
// 744x1133 tablet/portrait (Figma iPad mini 8.3)
// 1280x832 desktop small (Figma MacBook Air)
:root {
--hot-color: oklch(63.79% 0.1823 34.77);
}
$extra-small: 435px;
$small: 576px;
$medium: 980px;
$extra-large: 1280px;
.topic-list .topic-list-item-separator { .topic-list .topic-list-item-separator {
display: none; display: none;
} }
@@ -29,136 +16,82 @@ $extra-large: 1280px;
gap: 1em; gap: 1em;
@include breakpoint(medium) { @include breakpoint(medium) {
gap: 0.5em; gap: 0.5em;
padding: 0 0.5em;
} }
} @include breakpoint(mobile-extra-large) {
gap: 0;
.bulk-select-enabled .topic-list-item {
grid-template-areas:
"bulk-select avatar author status status . activity"
". topic-title topic-title topic-title likes-replies likes-replies category";
.bulk-select {
grid-area: bulk-select;
padding: 0; padding: 0;
margin: 0;
align-self: center;
justify-self: center;
label {
margin: 0;
}
}
@media screen and (max-width: $medium) {
grid-template-columns: 44px min-content min-content auto min-content min-content min-content;
grid-template-rows: 22px minmax(22px, auto);
grid-template-areas:
"bulk-select avatar author status status . activity"
". topic-title topic-title topic-title . . likes-replies"
". topic-title topic-title topic-title . . category";
}
@media screen and (max-width: $small) {
grid-template-columns: 25px auto repeat(6, 1fr);
grid-template-rows: auto auto auto;
grid-template-areas:
"bulk-select category-status category-status . . . . activity"
"topic-title topic-title topic-title topic-title topic-title topic-title topic-title topic-title"
"avatar author . . . . . likes-replies";
} }
} }
body.user-messages-page .topic-list-item { .topic-list-body .topic-list-item {
.topic-category-status-data {
display: none;
}
grid-template-areas:
"avatar author status status . . activity"
". topic-title topic-title topic-title likes-replies likes-replies likes-replies";
&.excerpt-expanded {
grid-template-columns: 44px repeat(6, 1fr) auto;
grid-template-rows: 22px auto auto 30px;
grid-template-areas:
"avatar author status status . . . activity"
"avatar topic-title topic-title topic-title topic-title . . ."
". excerpt excerpt excerpt excerpt excerpt . ."
". excerpt excerpt excerpt excerpt excerpt likes-replies likes-replies";
@media screen and (max-width: $extra-large) {
grid-template-areas:
"avatar author status status . . . activity"
"avatar topic-title topic-title topic-title topic-title . . ."
". excerpt excerpt excerpt excerpt excerpt . likes-replies"
". excerpt excerpt excerpt excerpt excerpt . likes-replies";
}
}
@media screen and (max-width: $small) {
grid-template-columns: 25px auto repeat(6, 1fr);
grid-template-rows: auto auto;
grid-template-areas:
"topic-title topic-title topic-title topic-title topic-title topic-title topic-title activity"
"avatar author . . . . . likes-replies";
.topic-excerpt {
display: none;
}
}
}
.topic-list-item {
text-overflow: ellipsis; text-overflow: ellipsis;
padding: 0.75em 1rem; padding: 0.75em 1rem;
border: 1px solid var(--primary-300); border: 1px solid var(--primary-300);
display: grid; display: grid;
grid-template-columns: 44px min-content min-content auto min-content min-content min-content; grid-template-columns: 20px min-content min-content auto min-content;
grid-template-rows: 22px minmax(22px, auto); grid-template-rows: auto minmax(20px, auto);
grid-template-areas: grid-template-areas:
"avatar author status status . . activity" ". . . . status"
". topic-title topic-title topic-title likes-replies likes-replies category"; "activity . . likes-replies category";
grid-column-gap: 12px; grid-column-gap: 12px;
grid-row-gap: 8px; grid-row-gap: 8px;
border-radius: var(--d-border-radius); border-radius: var(--d-border-radius);
&.excerpt-expanded { td.main-link .link-top-line {
grid-template-columns: 44px repeat(6, 1fr) auto; grid-row: 1/2;
grid-template-rows: 22px auto auto 30px; grid-column: 1/-1;
font-weight: 500;
}
&.--has-status-card td.main-link .link-top-line {
grid-column: 1/-2;
}
@include breakpoint(extra-large) {
grid-template-areas: grid-template-areas:
"avatar author status status . . . activity" ". . . . status"
"avatar topic-title topic-title topic-title topic-title . . ." "activity . . likes-replies category";
". excerpt excerpt excerpt excerpt excerpt . ." }
". excerpt excerpt excerpt excerpt excerpt likes-replies category"; @include breakpoint(mobile-extra-large) {
@media screen and (max-width: $extra-large) { td.main-link .link-top-line,
grid-template-areas: &.--has-status-card td.main-link .link-top-line {
"avatar author status status . . . activity" grid-row: 2/3;
"avatar topic-title topic-title topic-title topic-title . . ." grid-column: 1/-1;
". excerpt excerpt excerpt excerpt excerpt . likes-replies"
". excerpt excerpt excerpt excerpt excerpt . category";
} }
@media screen and (max-width: $small) {
grid-template-columns: 25px auto repeat(6, 1fr); grid-template-columns: 20px repeat(5, 1fr);
grid-template-rows: auto auto auto;
grid-template-areas:
"category category category category category status"
". . . . . ."
"activity . . . . likes-replies";
border: none;
border-bottom: 1px solid var(--primary-200);
box-shadow: none;
border-radius: 0;
}
&.excerpt-expanded {
grid-template-columns: 20px min-content min-content auto min-content;
grid-template-rows: auto auto auto;
grid-template-areas:
". . . . status"
"activity . . . ."
"excerpt excerpt excerpt likes-replies category";
@include breakpoint(extra-large) {
grid-template-areas:
". . . . status"
"activity . . . ."
"excerpt excerpt excerpt likes-replies category";
}
@include breakpoint(mobile-extra-large) {
grid-template-rows: auto auto auto; grid-template-rows: auto auto auto;
grid-template-areas: grid-template-areas:
"category-status category-status category-status . . . . activity" "category category category category status"
"topic-title topic-title topic-title topic-title topic-title topic-title topic-title topic-title" ". . . . ."
"avatar author . . . . . likes-replies"; "activity . . . likes-replies";
.topic-excerpt { .topic-excerpt {
display: none; display: none;
} }
} }
} }
@media screen and (max-width: $medium) {
grid-template-columns: 44px min-content min-content auto min-content min-content min-content;
grid-template-rows: 22px minmax(22px, auto);
grid-template-areas:
"avatar author status status . . activity"
". topic-title topic-title topic-title . . likes-replies"
". topic-title topic-title topic-title . . category";
}
@media screen and (max-width: $small) {
grid-template-columns: 25px auto repeat(6, 1fr);
grid-template-rows: auto auto auto;
grid-template-areas:
"category-status category-status category-status . . . . activity"
"topic-title topic-title topic-title topic-title topic-title topic-title topic-title topic-title"
"avatar author . . . . . likes-replies";
}
@include breakpoint(medium) {
border: none;
border-bottom: 1px solid var(--primary-200);
}
// display contents // display contents
td.main-link, td.main-link,
@@ -173,32 +106,54 @@ body.user-messages-page .topic-list-item {
padding: 0; padding: 0;
} }
// avatar & author // topic activity, avatar, text
.topic-author-avatar-data { .topic-activity-data {
grid-area: avatar; grid-area: activity;
margin: 0;
} }
.topic-author-avatar img.avatar { .topic-activity {
width: 44px;
height: 44px;
border-radius: var(--d-border-radius);
@media screen and (max-width: $small) {
width: 25px;
height: 25px;
}
}
td.topic-author-data {
grid-area: author;
display: flex; display: flex;
gap: 0.5em; gap: 0.25em;
font-size: var(--font-down-1);
height: 100%;
align-items: center; align-items: center;
} }
.topic-author-data .topic-author {
color: var(--primary-500); .topic-activity__user {
display: flex;
gap: 0.25em;
}
.topic-activity__user .avatar {
width: 20px;
height: 20px;
border-radius: 4px;
}
.topic-activity__username {
@include breakpoint(mobile-extra-large) {
display: none;
}
} }
// status // status
.topic-status-data {
grid-area: status;
}
.topic-status-data {
grid-area: status;
position: relative;
}
.topic-status-card { .topic-status-card {
@include breakpoint("large", min-width) {
position: absolute;
right: 0px;
top: -20px;
background-color: var(--d-content-background);
height: 20px;
font-size: var(--font-down-3);
}
height: min-content;
margin-left: auto;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
gap: 4px; gap: 4px;
@@ -209,40 +164,22 @@ body.user-messages-page .topic-list-item {
border-radius: var(--d-border-radius); border-radius: var(--d-border-radius);
border: 1px solid var(--status-color); border: 1px solid var(--status-color);
color: var(--status-color); color: var(--status-color);
height: min-content;
grid-area: status;
width: min-content; width: min-content;
@media screen and (max-width: $small) {
height: calc(100% - 2px);
}
svg { svg {
font-size: var(--font-down-1); font-size: var(--font-down-1);
color: var(--status-color); color: var(--status-color);
} }
} }
.topic-status-card.--bookmark { .topic-status-card.--pinned {
display: none;
}
.topic-status-card.--pinned,
.topic-status-card.--unpinned {
--status-color: var(--primary-500); --status-color: var(--primary-500);
cursor: pointer;
background-color: transparent;
line-height: unset;
} }
.topic-status-card.--hot { .topic-status-card.--hot {
--status-color: var(--hot-color); --status-color: #e45735;
}
// title
td.main-link .link-top-line {
font-size: var(--font-0);
grid-area: topic-title;
font-weight: 500;
} }
.link-top-line .event-date { .link-top-line .event-date {
margin-left: 0.5em;
font-size: var(--font-down-3); font-size: var(--font-down-3);
} }
@@ -250,11 +187,16 @@ body.user-messages-page .topic-list-item {
display: none; display: none;
} }
.topic-list-data {
padding: 0;
}
td.main-link .link-top-line a.raw-topic-link { td.main-link .link-top-line a.raw-topic-link {
padding: 0; padding: 0;
} }
.topic-post-badges .badge-notification.unread-posts { .topic-post-badges .badge-notification.unread-posts,
.topic-post-badges .badge-notification.new-topic {
background-color: var(--tertiary); background-color: var(--tertiary);
color: var(--tertiary); color: var(--tertiary);
overflow: hidden; overflow: hidden;
@@ -267,7 +209,8 @@ body.user-messages-page .topic-list-item {
// excerpt // excerpt
.topic-excerpt { .topic-excerpt {
grid-area: excerpt; grid-row: 3 / -1;
grid-column: 1 / -2;
margin: 0; margin: 0;
font-size: var(--font-down-2); font-size: var(--font-down-2);
} }
@@ -289,29 +232,27 @@ body.user-messages-page .topic-list-item {
td.topic-category-status-data { td.topic-category-status-data {
display: contents; display: contents;
@media screen and (max-width: $small) { }
grid-area: category-status; td.topic-category-data {
display: flex; grid-area: category;
gap: 0.5em; display: flex;
align-items: center; justify-content: flex-end;
@include breakpoint(mobile-extra-large) {
justify-content: flex-start;
} }
} }
td.topic-category-status-data .badge-category__wrapper { td.topic-category-data .badge-category__wrapper,
grid-area: category; td.main-link .link-bottom-line .badge-category__wrapper {
}
td.topic-category-status-data .badge-category__wrapper {
overflow: unset;
border-radius: var(--d-border-radius); border-radius: var(--d-border-radius);
padding: 6px; padding: 3px 6px;
align-self: flex-end;
background-color: light-dark( background-color: light-dark(
oklch(from var(--category-badge-color) 97% calc(c * 0.3) h), oklch(from var(--category-badge-color) 97% calc(c * 0.3) h),
oklch(from var(--category-badge-color) 45% calc(c * 0.5) h) oklch(from var(--category-badge-color) 45% calc(c * 0.5) h)
); );
@media screen and (max-width: $small) { @include breakpoint(tablet) {
padding: 2px 6px; padding: 2px 6px;
font-size: var(--font-down-2);
} }
.badge-category__name { .badge-category__name {
@@ -339,8 +280,7 @@ body.user-messages-page .topic-list-item {
gap: 0.5em; gap: 0.5em;
justify-content: flex-end; justify-content: flex-end;
height: min-content; height: min-content;
align-self: flex-end; align-self: center;
padding-bottom: 4px;
} }
.topic-likes-replies-data .topic-likes, .topic-likes-replies-data .topic-likes,
.topic-likes-replies-data .topic-replies { .topic-likes-replies-data .topic-replies {
@@ -355,10 +295,6 @@ body.user-messages-page .topic-list-item {
} }
} }
.topic-list-header {
display: none;
}
.topic-list-item { .topic-list-item {
background: var(--d-content-background); background: var(--d-content-background);
box-shadow: 0px 0px 12px 1px var(--topic-card-shadow); box-shadow: 0px 0px 12px 1px var(--topic-card-shadow);
@@ -373,3 +309,229 @@ body.user-messages-page .topic-list-item {
0px 0px 12px 1px var(--topic-card-shadow); 0px 0px 12px 1px var(--topic-card-shadow);
} }
} }
// Bookmarks
.topic-list-item.bookmark-list-item {
.link-bottom-line {
font-size: unset;
}
grid-template-columns: 20px min-content min-content auto min-content min-content 36px;
grid-template-areas:
". . . . . . dropdown"
"avatar update metadata metadata metadata category dropdown";
@include breakpoint(mobile-extra-large) {
grid-template-columns: 20px min-content min-content auto min-content min-content min-content 36px;
grid-template-areas:
". . . . . . . dropdown"
"avatar update metadata metadata metadata metadata category dropdown";
}
&.has-metadata {
grid-template-areas:
". . . . . . dropdown"
"avatar update metadata metadata metadata category dropdown";
@include breakpoint(mobile-extra-large) {
grid-template-areas:
". . . . . . . dropdown"
"avatar update metadata metadata metadata metadata category dropdown";
}
}
&.excerpt-expanded {
grid-template-areas:
". . . . . . . dropdown"
"avatar update metadata metadata metadata metadata metadata dropdown"
"excerpt excerpt excerpt excerpt excerpt . . dropdown"
"excerpt excerpt excerpt excerpt excerpt category category dropdown";
@include breakpoint(mobile-extra-large) {
grid-template-columns: 20px min-content min-content auto min-content min-content min-content 36px;
.post-excerpt {
display: none;
}
}
&.has-metadata {
grid-template-areas:
". . . . . . . dropdown"
"avatar update metadata metadata metadata metadata metadata dropdown"
"excerpt excerpt excerpt excerpt excerpt . . dropdown"
"excerpt excerpt excerpt excerpt excerpt category category dropdown";
}
}
td.author-avatar {
grid-area: avatar;
}
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;
}
.bookmark-status-with-link {
grid-column: 1/-2;
grid-row: 1/2;
}
}
.post-excerpt {
grid-area: excerpt;
margin: 0;
}
.topic-list-data:last-of-type {
display: contents;
.bookmark-actions-dropdown {
grid-area: dropdown;
align-self: center;
}
}
.post-metadata.topic-list-data.updated-at {
grid-area: update;
margin-left: auto;
}
td.activity .post-activity {
display: none;
}
}
// Assigned List
.topic-list-item.assigned-list-item {
td.main-link .link-top-line {
grid-column: 1/-3;
}
grid-template-columns: 20px min-content min-content auto min-content min-content 36px;
grid-template-areas:
". . . . . status dropdown"
"activity . . . likes-replies category dropdown";
@include breakpoint(mobile-extra-large) {
td.main-link .link-top-line {
grid-column: 1/-2 !important;
}
grid-template-columns: 20px min-content min-content auto min-content min-content min-content 36px;
grid-template-areas:
"category category . . . . status dropdown"
". . . . . . . dropdown"
"activity . . . . . likes-replies dropdown";
}
.assign-topic-buttons {
display: contents;
.assign-actions-dropdown {
grid-area: dropdown;
align-self: center;
}
}
td.topic-category-status-data {
display: contents;
}
.topic-status-card {
position: relative;
top: unset;
right: unset;
}
}
// User Messages
body.user-messages-page .topic-list-item {
td.topic-category-data,
td.topic-likes-replies-data,
td.topic-status-data {
display: none;
}
td.main-link .link-top-line {
grid-row: 1 / 2;
grid-column: 1 / -1;
}
grid-template-areas:
". . . . . . ."
"activity . . . . likes-replies likes-replies";
&.excerpt-expanded {
grid-template-columns: 20px repeat(6, 1fr) auto;
grid-template-rows: 20px auto auto 30px;
grid-template-areas:
". . . . . . . ."
"activity . . . . . . ."
"excerpt excerpt excerpt excerpt excerpt excerpt . ."
"excerpt excerpt excerpt excerpt excerpt excerpt likes-replies likes-replies";
@include breakpoint(extra-large) {
grid-template-areas:
". . . . . . . ."
"activity . . . . . . ."
"excerpt excerpt excerpt excerpt excerpt excerpt . likes-replies"
"excerpt excerpt excerpt excerpt excerpt excerpt . likes-replies";
}
}
@include breakpoint(mobile-extra-large) {
grid-template-columns: 25px auto repeat(6, 1fr);
grid-template-rows: auto auto;
grid-template-areas:
". . . . . . . ."
"activity . . . . . . .";
.topic-excerpt {
display: none;
}
}
}
// Bulk select
.bulk-select-enabled .topic-list-body .topic-list-item {
td.topic-likes-replies-data {
display: none;
}
td.main-link .link-top-line,
&.--has-status-card td.main-link .link-top-line {
grid-column: 2/-1;
font-weight: 500;
}
.topic-excerpt {
grid-area: excerpt;
margin: 0;
}
&.excerpt-expanded {
grid-template-areas:
"bulk-select . . . status" "bulk-select activity . . ."
"bulk-select excerpt excerpt excerpt category";
@include breakpoint(mobile-extra-large) {
grid-template-areas:
"bulk-select category . . . status"
"bulk-select . . . . ."
"bulk-select activity activity . . .";
}
}
grid-template-areas:
"bulk-select . . . status"
"bulk-select activity activity . category";
.bulk-select {
grid-area: bulk-select;
padding: 0;
margin: 0;
align-self: center;
justify-self: center;
label {
margin: 0;
}
}
@include breakpoint(large) {
grid-template-areas:
"bulk-select . . . status"
"bulk-select activity activity . category";
}
@include breakpoint(mobile-extra-large) {
td.main-link .link-top-line,
&.--has-status-card td.main-link .link-top-line {
grid-column: 2/-1;
grid-row: 2;
font-weight: 500;
}
grid-template-areas:
"bulk-select category . . . status"
"bulk-select . . . . ."
"bulk-select activity activity . . .";
}
}
+47 -27
View File
@@ -18,36 +18,52 @@
min-width: unset; // why we have this? min-width: unset; // why we have this?
.timeline-scrollarea { .timeline-scrollarea {
border-left: 1px solid var(--accent-color); border-left: 1px solid var(--accent-color);
}
.timeline-scroller { .timeline-scroller {
padding: 0.25em; @include breakpoint("medium", $rule: min-width) {
border: 1px solid var(--accent-color); padding: 0.25em;
border-radius: 0.75em; border: 1px solid var(--accent-color);
padding-left: 0.5em; border-radius: 0.75em;
margin-left: calc(-0.5em - 2.5px); padding-left: 0.5em;
background: var(--d-content-background); margin-left: calc(-0.5em - 2.5px);
height: 40px !important; // height is coming from element style have no other choice background: var(--d-content-background);
} height: 40px !important; // height is coming from element style have no other choice
.timelime-scroller-content { }
display: flex;
flex-direction: column; .timeline-scroller-content {
gap: 0.25em; // display: flex;
} // flex-direction: column;
.timeline-replies, // gap: 0.25em;
.timeline-ago { }
line-height: 1; .timeline-replies,
} .timeline-ago {
.timeline-ago { line-height: 1;
// font-size: var(--font-down-1); }
} }
.timeline-handle { .timeline-handle {
background-color: var(--accent-color); background-color: var(--accent-color);
width: 3px; @include breakpoint("medium", $rule: min-width) {
border-radius: 2px; width: 3px;
height: calc(100% - 6px); border-radius: 2px;
height: calc(100% - 6px);
}
}
} }
} }
//should probably get rid of this extra specificity class in core?
.timeline-container.timeline-fullscreen {
@include breakpoint("medium", $rule: max-width) {
.topic-timeline .timeline-scrollarea-wrapper {
}
.topic-timeline
.timeline-scrollarea
.timeline-scroller
.timeline-scroller-content {
padding-right: 0.5em;
}
}
}
.container.posts, .container.posts,
#topic-footer-buttons { #topic-footer-buttons {
padding: 0 24px; padding: 0 24px;
@@ -101,3 +117,7 @@
nav.post-controls .actions button { nav.post-controls .actions button {
font-size: var(--font-0); font-size: var(--font-0);
} }
.archetype-private_message {
--pm-border-radius: var(--d-border-radius);
}
+11
View File
@@ -0,0 +1,11 @@
enable_welcome_banner:
default: true
description: "Overrides the core `enable welcome banner` site setting"
search_experience:
type: enum
default: search_field
choices:
- search_field
- search_icon
description: "Overrides the core `search experience` site setting"
+4 -5
View File
@@ -25,11 +25,10 @@ describe "Horizon theme | High level", type: :system do
topic_item = find(topic_list.topic_list_item_class(topic_1)) topic_item = find(topic_list.topic_list_item_class(topic_1))
expect(topic_item.all("td").map { |el| el["class"] }).to eq( expect(topic_item.all("td").map { |el| el["class"] }).to eq(
[ [
"main-link clearfix topic-list-data", "main-link topic-list-data",
"activity num topic-list-data age", "topic-activity-data",
"topic-author-data", "topic-status-data",
"topic-category-status-data", "topic-category-data",
"topic-author-avatar-data",
"topic-likes-replies-data", "topic-likes-replies-data",
], ],
) )