From 518841e4736cf12ba2bec0c20623b0298e8651b0 Mon Sep 17 00:00:00 2001 From: awesomerobot Date: Fri, 14 Nov 2025 17:37:57 -0500 Subject: [PATCH 1/9] Adding a debug mode and updating styles for 2025 version --- .../discourse_rewind/rewinds_controller.rb | 5 +- .../discourse_rewind/action/invites.rb | 8 +- .../discourse_rewind/fetch_reports.rb | 2 +- .../discourse/components/reports/header.gjs | 55 ++++++--- .../reports/top-words/word-card.gjs | 11 +- .../discourse/components/rewind.gjs | 15 +-- .../before-panel-body/rewind-callout.gjs | 80 +++++++++++-- assets/stylesheets/common/card.scss | 3 - assets/stylesheets/common/fbff.scss | 17 ++- assets/stylesheets/common/fonts.scss | 2 + .../stylesheets/common/most-viewed-tags.scss | 30 +++++ .../common/post-received-reactions.scss | 14 ++- .../common/post-used-reactions.scss | 14 ++- assets/stylesheets/common/reading-time.scss | 5 +- assets/stylesheets/common/report.scss | 10 ++ assets/stylesheets/common/rewind-callout.scss | 106 ++++++++++++------ assets/stylesheets/common/rewind-header.scss | 34 +++++- assets/stylesheets/common/rewind.scss | 60 +++++++--- assets/stylesheets/common/top-words.scss | 60 +++++++--- assets/stylesheets/common/variables.scss | 7 +- config/locales/client.en.yml | 1 + plugin.rb | 4 +- public/images/cards/01-robot.gif | Bin 0 -> 12103 bytes public/images/cards/02-castle.gif | Bin 0 -> 5177 bytes public/images/cards/04-hand.gif | Bin 0 -> 11795 bytes public/images/cards/06-nature.gif | Bin 0 -> 8280 bytes public/images/cards/07-beach.gif | Bin 0 -> 12871 bytes 27 files changed, 393 insertions(+), 150 deletions(-) create mode 100644 public/images/cards/01-robot.gif create mode 100644 public/images/cards/02-castle.gif create mode 100644 public/images/cards/04-hand.gif create mode 100644 public/images/cards/06-nature.gif create mode 100644 public/images/cards/07-beach.gif diff --git a/app/controllers/discourse_rewind/rewinds_controller.rb b/app/controllers/discourse_rewind/rewinds_controller.rb index 5d3d7aa..fb7871e 100644 --- a/app/controllers/discourse_rewind/rewinds_controller.rb +++ b/app/controllers/discourse_rewind/rewinds_controller.rb @@ -10,10 +10,7 @@ def show DiscourseRewind::FetchReports.call(service_params) do on_model_not_found(:year) { raise Discourse::NotFound } on_model_not_found(:user) { raise Discourse::NotFound } - on_success do |reports:| - @reports = reports - render json: MultiJson.dump(reports), status: :ok - end + on_success { |reports:| render json: MultiJson.dump(reports), status: :ok } end end end diff --git a/app/services/discourse_rewind/action/invites.rb b/app/services/discourse_rewind/action/invites.rb index dc2feae..8c720e9 100644 --- a/app/services/discourse_rewind/action/invites.rb +++ b/app/services/discourse_rewind/action/invites.rb @@ -13,7 +13,7 @@ def call return if total_invites == 0 # Redeemed invites (users who actually joined) - redeemed_count = invites.where.not(redeemed_at: nil).count + redeemed_count = invites.where("redemption_count > 0").count # Get the users who were invited (via InvitedUser or redeemed invites) invited_user_ids = InvitedUser.where(invite: invites).pluck(:user_id).compact @@ -22,11 +22,7 @@ def call # Calculate impact of invitees invitee_post_count = - Post - .where(user_id: invited_user_ids) - .where(created_at: date) - .where(deleted_at: nil) - .count + Post.where(user_id: invited_user_ids).where(created_at: date).where(deleted_at: nil).count invitee_topic_count = Topic diff --git a/app/services/discourse_rewind/fetch_reports.rb b/app/services/discourse_rewind/fetch_reports.rb index c959a24..79f0049 100644 --- a/app/services/discourse_rewind/fetch_reports.rb +++ b/app/services/discourse_rewind/fetch_reports.rb @@ -81,7 +81,7 @@ def fetch_reports(date:, user:, guardian:, year:) reports = Discourse.redis.get(key) if !reports - reports = REPORTS.map { |report| report.call(date:, user:, guardian:) } + reports = REPORTS.map { |report| report.call(date:, user:, guardian:) }.compact Discourse.redis.setex(key, CACHE_DURATION, MultiJson.dump(reports)) else reports = MultiJson.load(reports, symbolize_keys: true) diff --git a/assets/javascripts/discourse/components/reports/header.gjs b/assets/javascripts/discourse/components/reports/header.gjs index 55ad458..02bfda2 100644 --- a/assets/javascripts/discourse/components/reports/header.gjs +++ b/assets/javascripts/discourse/components/reports/header.gjs @@ -1,14 +1,43 @@ -const RewindHeader = ; +import { i18n } from "discourse-i18n"; +import Component from "@glimmer/component"; -export default RewindHeader; +export default class RewindHeader extends Component { + +} diff --git a/assets/javascripts/discourse/components/reports/top-words/word-card.gjs b/assets/javascripts/discourse/components/reports/top-words/word-card.gjs index fff7965..f7d900f 100644 --- a/assets/javascripts/discourse/components/reports/top-words/word-card.gjs +++ b/assets/javascripts/discourse/components/reports/top-words/word-card.gjs @@ -81,21 +81,12 @@ export default class WordCard extends Component { "rewind-card__wrapper" (if this.longWord "-long-word") }} - style={{this.cardStyle}} {{didInsert this.registerCardContainer}} role="button" >
- {{emoji - this.mysteryData.emoji - }} - {{emoji - this.mysteryData.emoji - }} - {{emoji - this.mysteryData.emoji - }} +
{{@word}} diff --git a/assets/javascripts/discourse/components/rewind.gjs b/assets/javascripts/discourse/components/rewind.gjs index 168e8b9..7cc15e6 100644 --- a/assets/javascripts/discourse/components/rewind.gjs +++ b/assets/javascripts/discourse/components/rewind.gjs @@ -53,17 +53,6 @@ export default class Rewind extends Component { } } - @action - handleScroll({ target }) { - let children = this.rewindContainer.getElementsByClassName("parallax-bg"); - - for (let i = 0; i < children.length; i++) { - children[i].style.transform = `translateY(-${ - (target.scrollTop * (i + 1)) / 5 - }px)`; - } - } - @action registerRewindContainer(element) { this.rewindContainer = element; @@ -82,7 +71,6 @@ export default class Rewind extends Component { >
-
{{#if this.loadingRewind}}
@@ -90,14 +78,13 @@ export default class Rewind extends Component {
{{else}}
{{#each this.rewind as |report|}} diff --git a/assets/javascripts/discourse/connectors/before-panel-body/rewind-callout.gjs b/assets/javascripts/discourse/connectors/before-panel-body/rewind-callout.gjs index a0fc848..6b623cf 100644 --- a/assets/javascripts/discourse/connectors/before-panel-body/rewind-callout.gjs +++ b/assets/javascripts/discourse/connectors/before-panel-body/rewind-callout.gjs @@ -2,8 +2,8 @@ import Component from "@glimmer/component"; import { action } from "@ember/object"; import { service } from "@ember/service"; import DButton from "discourse/components/d-button"; -import icon from "discourse/helpers/d-icon"; import KeyValueStore from "discourse/lib/key-value-store"; +import { i18n } from "discourse-i18n"; export default class RewindCallout extends Component { @service router; @@ -12,7 +12,10 @@ export default class RewindCallout extends Component { store = new KeyValueStore("discourse_rewind_" + this.fetchYear); get showCallout() { - return this.currentUser?.is_rewind_active && !this.dismissed; + return ( + this.currentUser?.is_rewind_active && + (this.currentUser?.is_development_env || !this.dismissed) + ); } // We want to show the previous year's rewind in January @@ -47,16 +50,71 @@ export default class RewindCallout extends Component { @action={{this.openRewind}} class="rewind-callout btn-transparent" > - - - {{icon "arrow-right" class="rewind-callaout__arrow"}} + + + + + + + + + + + + + + {{i18n "discourse_rewind.title"}} + + {{i18n "discourse_rewind.year"}} + + +
{{/if}} diff --git a/assets/stylesheets/common/card.scss b/assets/stylesheets/common/card.scss index 4abcf2d..02ebc12 100644 --- a/assets/stylesheets/common/card.scss +++ b/assets/stylesheets/common/card.scss @@ -10,10 +10,7 @@ } .rewind-card { - background-color: var(--secondary); - border: 1px solid var(--primary-300); border-radius: var(--rewind-border-radius); - background-size: cover; display: flex; flex-direction: column; text-align: center; diff --git a/assets/stylesheets/common/fbff.scss b/assets/stylesheets/common/fbff.scss index 346f0c7..c622d12 100644 --- a/assets/stylesheets/common/fbff.scss +++ b/assets/stylesheets/common/fbff.scss @@ -9,11 +9,18 @@ --border-size: 3px; } + .rewind-report-title { + width: 100%; + text-align: center; + border: none; + margin: 0; + box-sizing: border-box; + } + .rewind-card { display: grid; - grid-template-columns: 1fr 400px 1fr; - - @include rewind-border; + grid-template-columns: 100px 1fr 100px; + border: none; @media screen and (width <= 625px) { grid-template-columns: 1fr 1fr 1fr; @@ -82,6 +89,10 @@ height: min-content; font-size: var(--font-down-1); font-family: "Pixelify Sans", sans-serif; + color: #ff00ff; + margin-top: 0.5em; + line-height: 1; + word-wrap: anywhere; @media screen and (width <= 475px) { font-size: var(--font-down-3); diff --git a/assets/stylesheets/common/fonts.scss b/assets/stylesheets/common/fonts.scss index 724c978..1217561 100644 --- a/assets/stylesheets/common/fonts.scss +++ b/assets/stylesheets/common/fonts.scss @@ -57,4 +57,6 @@ h2.rewind-report-title { text-transform: uppercase; + color: #00ff00; + z-index: 2; } diff --git a/assets/stylesheets/common/most-viewed-tags.scss b/assets/stylesheets/common/most-viewed-tags.scss index 6c9a3a1..0847995 100644 --- a/assets/stylesheets/common/most-viewed-tags.scss +++ b/assets/stylesheets/common/most-viewed-tags.scss @@ -1,4 +1,13 @@ .-most-viewed-tags { + .rewind-report-title { + box-sizing: border-box; + border: none; + width: 100%; + margin: 0; + text-align: center; + margin-bottom: 0.5em; + } + .rewind-report-container { display: flex; gap: 0.5em; @@ -9,9 +18,30 @@ @include rewind-border; width: max-content; flex-grow: 1; + position: relative; + margin-top: 1.5em; + min-width: 150px; + border-radius: 0 4px 4px 4px; + + &::before { + display: block; + content: ""; + width: 3em; + height: 1em; + border: 2px solid #00ff00; + border-bottom: none; + border-radius: 6px 6px 0 0; + position: absolute; + top: calc(-1em - 2px); + left: -2px; + background: #111; + } &:hover { background-color: var(--secondary-very-high); + &::before { + background-color: var(--secondary-very-high); + } } } } diff --git a/assets/stylesheets/common/post-received-reactions.scss b/assets/stylesheets/common/post-received-reactions.scss index a842b94..df2bdce 100644 --- a/assets/stylesheets/common/post-received-reactions.scss +++ b/assets/stylesheets/common/post-received-reactions.scss @@ -9,8 +9,14 @@ } } + .rewind-report-title { + border: none; + width: 100%; + text-align: center; + margin: 0 0 0 -1em; + } + .rewind-card { - background: var(--secondary); flex-direction: row; gap: 0.5em; height: min-content; @@ -25,12 +31,14 @@ animation-iteration-count: infinite; animation-timing-function: ease-in-out; z-index: 1; - - @include rewind-border; + color: #fff; + border: none; .emoji { width: 30px; height: 30px; + image-rendering: crisp-edges; + transform: scale(1); } } diff --git a/assets/stylesheets/common/post-used-reactions.scss b/assets/stylesheets/common/post-used-reactions.scss index 4e3b5fe..40bd8e1 100644 --- a/assets/stylesheets/common/post-used-reactions.scss +++ b/assets/stylesheets/common/post-used-reactions.scss @@ -13,8 +13,11 @@ display: grid; grid-template-columns: 25px 50px 1fr; gap: 1em; - border-bottom: 1px solid var(--primary-low); - padding: 0.5em 0; + padding: 1em 0; + + img.emoji { + vertical-align: baseline; + } } .emoji { @@ -26,19 +29,20 @@ font-weight: normal; font-display: var(--pixel-text); font-size: 16px; + color: #fff; } .rewind-reactions-bar { - background: var(--tertiary-600); + background: #fff; border: 1px solid rgb(var(--primary-rgb), 0.2); height: 25px; - border-radius: calc(var(--rewind-border-radius) * 0.75); } .rewind-total-reactions { font-size: 12px; font-weight: normal; margin-top: 1em; - margin-left: auto; + color: #00ff00; + text-align: start; } } diff --git a/assets/stylesheets/common/reading-time.scss b/assets/stylesheets/common/reading-time.scss index c1b5c0b..664968d 100644 --- a/assets/stylesheets/common/reading-time.scss +++ b/assets/stylesheets/common/reading-time.scss @@ -24,7 +24,7 @@ p.reading-time__text { } .reading-time code { - background-color: rgb(var(--primary-rgb), 0.15); + background-color: #fff; } .book img { @@ -37,6 +37,7 @@ p.reading-time__text { background-color: #01060f; border-radius: 0 5px 5px 0; box-shadow: 5px 5px 20px rgb(var(--primary-rgb), 0.05); + image-rendering: crisp-edges; @media screen and (width <= 475px) { width: 100px; @@ -103,6 +104,7 @@ p.reading-time__text { } .reading-time__text { + color: #fff; font-weight: normal; width: 50%; @@ -117,7 +119,6 @@ p.reading-time__text { flex-direction: row; justify-content: space-around; align-items: center; - background-color: var(--secondary); --book-color: var(--primary-very-high); diff --git a/assets/stylesheets/common/report.scss b/assets/stylesheets/common/report.scss index 036c03e..71b3a5c 100644 --- a/assets/stylesheets/common/report.scss +++ b/assets/stylesheets/common/report.scss @@ -25,6 +25,16 @@ } .rewind-report-title { + align-self: start; + padding: 0.25em 1em 0.25em; + margin-bottom: -2px; + background: #111; + margin-left: 0; + position: relative; font-size: var(--font-down-1); text-align: left; + border-radius: 4px 4px 0 0; + border-top: 2px solid #00ff00; + border-left: 2px solid #00ff00; + border-right: 2px solid #00ff00; } diff --git a/assets/stylesheets/common/rewind-callout.scss b/assets/stylesheets/common/rewind-callout.scss index caebe07..284b9c9 100644 --- a/assets/stylesheets/common/rewind-callout.scss +++ b/assets/stylesheets/common/rewind-callout.scss @@ -1,37 +1,79 @@ -.rewind-callout { - background: var(--primary); - padding: 12px; - display: flex; - align-items: center; - justify-content: space-between; - width: calc(100% - 12px); - border-radius: var(--d-border-radius); - height: calc(100% - 12px); +.quick-access-panel { + > ul, + .empty-state__container { + height: 100%; // flex alignment fix + } +} + +.rewind-callout__container { + height: 47px; + border-bottom: 1px solid var(--primary-low); +} + +#rewind-vhs { + display: block; + width: 100%; + height: 100%; +} + +.btn.rewind-callout { + padding: 0; margin: 0 auto; - box-shadow: 0 0 0 6px var(--primary); - transition: box-shadow; - transition-duration: 0.5s; - transition-timing-function: ease-in-out; - - &:hover, - &:focus { - background: var(--primary) !important; - box-shadow: - 0 0 0 2px rgb(var(--d-blue), 1), - 0 0 0 4px rgb(var(--d-green), 1), - 0 0 0 6px rgb(var(--d-orange), 1), - 0 0 0 8px rgb(var(--d-red), 1); - - @if color-scheme-is-light { - box-shadow: - 0 0 0 2px rgb(var(--d-blue-dark), 1), - 0 0 0 4px rgb(var(--d-green-dark), 1), - 0 0 0 6px rgb(var(--d-orange-dark), 1), - 0 0 0 8px rgb(var(--d-red-dark), 1); - } + width: 100%; + transition: transform 0.3s ease; + transform-origin: left top; + z-index: 2; + + svg { + transition: box-shadow 0.3s ease; } - .rewind-logo { - height: 30px; + &:hover { + transform: translateX(10px) translateY(10px) scale(1.05); + + svg { + box-shadow: -10px 10px 15px rgba(0, 0, 0, 0.15); + } } } + +.rewind-callout { + position: relative; + display: inline-block; + transition: transform 200ms ease; +} + +/* Top face */ +.rewind-callout::before { + content: ""; + background-image: url('data:image/svg+xml,'); + background-repeat: no-repeat; + background-position: 55% 100%; + background-size: 139px; + background-blend-mode: multiply; + position: absolute; + left: -48px; + top: -16px; + z-index: -1; + width: 100%; + height: 16px; + background-color: #d4d1bc; + transform: skew(72deg, 0deg); + transform-origin: 50% 0% 0; + transition: + transform 200ms ease, + width 200ms ease; +} + +/* Left face */ +.rewind-callout::after { + content: ""; + position: absolute; + left: -10px; + top: -4px; + z-index: -1; + width: 10px; + height: calc(100% - 3px); + background-color: #e8e5d0; + transform: skew(0deg, 41deg) scale3d(1, 1, 1); +} diff --git a/assets/stylesheets/common/rewind-header.scss b/assets/stylesheets/common/rewind-header.scss index 7e9fc1f..fcb231e 100644 --- a/assets/stylesheets/common/rewind-header.scss +++ b/assets/stylesheets/common/rewind-header.scss @@ -32,10 +32,13 @@ .rewind__header { padding: 1em 0 1em 1em; - background-color: var(--primary); - position: sticky; + background-color: #fbf8e4; + background-image: url('data:image/svg+xml,'); + background-repeat: no-repeat; + background-position: 200px; top: 0; - z-index: 1; + position: sticky; + z-index: 3; .rewind-logo { margin-bottom: 5px; @@ -46,6 +49,31 @@ text-transform: uppercase; font-size: var(--font-up-1); } + + &-logo { + display: grid; + grid-template-areas: "logo rewind" "logo year"; + width: 7em; + + svg { + grid-area: logo; + width: 2.5em; + height: 2.5em; + } + } + + &-title { + grid-area: rewind; + font-style: italic; + font-size: -0.9em; + line-height: 1; + } + + &-year { + line-height: 1; + font-weight: bold; + font-size: 1.5em; + } } .rewind-notification-active #toggle-current-user::after { diff --git a/assets/stylesheets/common/rewind.scss b/assets/stylesheets/common/rewind.scss index b617ac2..7d044e5 100644 --- a/assets/stylesheets/common/rewind.scss +++ b/assets/stylesheets/common/rewind.scss @@ -35,51 +35,79 @@ height: 100vh; max-height: 100%; max-width: 960px; - border: 1px solid var(--primary); - border-radius: var(--rewind-border-radius); + border-radius: 30px; container-type: size; position: relative; overflow: hidden; - background: var(--secondary); @media (width <= 768px) { border: none; border-radius: 0; } + + &::before, + &::after { + display: block; + pointer-events: none; + content: ""; + position: absolute; + } + + &:before { + width: 100%; + height: 2px; + z-index: 3; + background: rgba(0, 0, 0, 0.3); + opacity: 0.75; + animation: scanline 6s linear infinite; + } + + &:after { + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + background: linear-gradient( + to bottom, + transparent 50%, + rgba(0, 0, 0, 0.1) 51% + ); + background-size: 100% 4px; + animation: scanlines 1s steps(60) infinite; + } } -.background-1 { - background: absolute-image-url( - "/plugins/discourse-rewind/images/blur-bg.png" - ); - background-size: contain; - position: absolute; - transform: translateY(0); - width: 100%; - height: 1000%; - opacity: 0.45; +@keyframes scanline { + 0% { + transform: translate3d(0, 200000%, 0); + } +} - @if is-dark-color-scheme() { - opacity: 0.15; +@keyframes scanlines { + 0% { + background-position: 0 50%; } } .rewind__scroll-wrapper { overflow-y: auto; overflow-x: hidden; + background: #111; height: 100%; width: 100%; position: relative; display: flex; flex-direction: column; padding-bottom: var(--safe-area-inset-bottom); + padding-top: 2em; } .rewind__exit-fullscreen-btn { position: absolute; top: 20px; right: 20px; - z-index: 2; + z-index: 3; } .rewind__prev-btn { diff --git a/assets/stylesheets/common/top-words.scss b/assets/stylesheets/common/top-words.scss index 337ffe1..31afd40 100644 --- a/assets/stylesheets/common/top-words.scss +++ b/assets/stylesheets/common/top-words.scss @@ -3,6 +3,16 @@ background-color: transparent; width: 100%; flex-direction: column; + margin-bottom: 1em; + + .rewind-report-title { + box-sizing: border-box; + width: 100%; + text-align: center; + margin-left: 0; + border: none !important; + margin-bottom: 1em; + } } .cards-container { @@ -75,6 +85,36 @@ height: 125px; } + &:nth-child(1) { + .-front { + background-image: url("/plugins/discourse-rewind/images/cards/01-robot.gif"); + } + } + + &:nth-child(2) { + .-front { + background-image: url("/plugins/discourse-rewind/images/cards/07-beach.gif"); + } + } + + &:nth-child(3) { + .-front { + background-image: url("/plugins/discourse-rewind/images/cards/02-castle.gif"); + } + } + + &:nth-child(4) { + .-front { + background-image: url("/plugins/discourse-rewind/images/cards/06-nature.gif"); + } + } + + &:nth-child(5) { + .-front { + background-image: url("/plugins/discourse-rewind/images/cards/04-hand.gif"); + } + } + .rewind-card { box-shadow: 0 0 0 4px rgb(var(--mystery-color-light), 1); border: none; @@ -126,6 +166,7 @@ .rewind-card.-back { transform: rotateY(180deg); + background-color: #fff; } .rewind-card.-front, @@ -137,24 +178,9 @@ } .rewind-card.-front { + background-size: cover; + padding: 0.5em; - display: grid; - grid-template: - "tl . . " 1fr - ". . . " 1fr - ". cr . " 3fr - ". . . " 1fr - ". . br" 1fr - / 1fr 3fr 1fr; - background: - radial-gradient( - circle at 4px 4px, - var(--primary-100) 1px, - var(--secondary) 1px, - var(--secondary) 6px - ) - 0 0 / 6px 6px, - var(--secondary-low); } &.-long-word .rewind-card__title { diff --git a/assets/stylesheets/common/variables.scss b/assets/stylesheets/common/variables.scss index 7cf13a7..bcee706 100644 --- a/assets/stylesheets/common/variables.scss +++ b/assets/stylesheets/common/variables.scss @@ -13,11 +13,6 @@ } @mixin rewind-border() { - border: 2px solid var(--primary); + border: 2px solid #00ff00; border-radius: var(--rewind-border-radius); - box-shadow: 4px 4px 0 0 rgb(var(--primary-rgb), 0.25); - - @if is-dark-color-scheme() { - box-shadow: 0 4px 5px -2px rgb(var(--secondary-rgb), 0.5); - } } diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 44abf56..928326f 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -8,6 +8,7 @@ en: discourse_rewind: placeholder: Discourse Rewind title: Rewind + year: "2025" reports: activity_calendar: title: Activity Calendar diff --git a/plugin.rb b/plugin.rb index 1143126..7ea956b 100644 --- a/plugin.rb +++ b/plugin.rb @@ -27,6 +27,8 @@ def self.public_asset_path(name) after_initialize do add_to_serializer(:current_user, :is_rewind_active) do - Date.today.month == 1 || Date.today.month == 12 + Rails.env.development? || Date.today.month == 1 || Date.today.month == 12 end + + add_to_serializer(:current_user, :is_development_env) { Rails.env.development? } end diff --git a/public/images/cards/01-robot.gif b/public/images/cards/01-robot.gif new file mode 100644 index 0000000000000000000000000000000000000000..afff05f7969ccb1c426a3536fd4013073fad7ba2 GIT binary patch literal 12103 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 U>hpi~`M>)7Uw!^R)8`-m4_OOWMgRZ+ literal 0 HcmV?d00001 diff --git a/public/images/cards/02-castle.gif b/public/images/cards/02-castle.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ab26fa3da7e601d8486786720abf82e0a02a0ca GIT binary patch literal 5177 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 Hw)B4ifA=7j literal 0 HcmV?d00001 diff --git a/public/images/cards/06-nature.gif b/public/images/cards/06-nature.gif new file mode 100644 index 0000000000000000000000000000000000000000..fc50ace978d2440d590a7a6af6dde54878bff5af GIT binary patch literal 8280 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 literal 0 HcmV?d00001 diff --git a/public/images/cards/07-beach.gif b/public/images/cards/07-beach.gif new file mode 100644 index 0000000000000000000000000000000000000000..88c158e663bda4f83c77dfaf675997c96ccb1336 GIT binary patch literal 12871 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 Date: Fri, 14 Nov 2025 18:58:08 -0500 Subject: [PATCH 2/9] more general styling --- .../action/most_viewed_categories.rb | 3 +- .../action/most_viewed_tags.rb | 3 +- .../stylesheets/common/activity-calendar.scss | 1 + assets/stylesheets/common/best-posts.scss | 91 +++++++++-------- assets/stylesheets/common/best-topics.scss | 97 +++++++++++-------- .../common/most-viewed-categories.scss | 30 ++++++ .../stylesheets/common/most-viewed-tags.scss | 1 + 7 files changed, 138 insertions(+), 88 deletions(-) diff --git a/app/services/discourse_rewind/action/most_viewed_categories.rb b/app/services/discourse_rewind/action/most_viewed_categories.rb index 6aa6ebe..d473306 100644 --- a/app/services/discourse_rewind/action/most_viewed_categories.rb +++ b/app/services/discourse_rewind/action/most_viewed_categories.rb @@ -10,7 +10,6 @@ class MostViewedCategories < BaseReport { category_id: 2, name: "dogs" }, { category_id: 3, name: "countries" }, { category_id: 4, name: "management" }, - { category_id: 5, name: "things" }, ], identifier: "most-viewed-categories", } @@ -26,7 +25,7 @@ def call .where(categories: { id: user.guardian.allowed_category_ids }) .group("categories.id, categories.name") .order("COUNT(*) DESC") - .limit(5) + .limit(4) .pluck("categories.id, categories.name") .map { |category_id, name| { category_id: category_id, name: name } } diff --git a/app/services/discourse_rewind/action/most_viewed_tags.rb b/app/services/discourse_rewind/action/most_viewed_tags.rb index a11661e..0552961 100644 --- a/app/services/discourse_rewind/action/most_viewed_tags.rb +++ b/app/services/discourse_rewind/action/most_viewed_tags.rb @@ -10,7 +10,6 @@ class MostViewedTags < BaseReport { tag_id: 2, name: "dogs" }, { tag_id: 3, name: "countries" }, { tag_id: 4, name: "management" }, - { tag_id: 5, name: "things" }, ], identifier: "most-viewed-tags", } @@ -28,7 +27,7 @@ def call .where(tags: { id: Tag.visible(user.guardian).pluck(:id) }) .group("tags.id, tags.name") .order("COUNT(DISTINCT topic_views.topic_id) DESC") - .limit(5) + .limit(4) .pluck("tags.id, tags.name") .map { |tag_id, name| { tag_id: tag_id, name: name } } diff --git a/assets/stylesheets/common/activity-calendar.scss b/assets/stylesheets/common/activity-calendar.scss index 3f1ea0c..c2d6b3f 100644 --- a/assets/stylesheets/common/activity-calendar.scss +++ b/assets/stylesheets/common/activity-calendar.scss @@ -26,6 +26,7 @@ font-size: 10px; font-weight: normal; text-align: left; + color: #fff; } .rewind-calendar-cell { diff --git a/assets/stylesheets/common/best-posts.scss b/assets/stylesheets/common/best-posts.scss index 8f26be1..d6bb1e4 100644 --- a/assets/stylesheets/common/best-posts.scss +++ b/assets/stylesheets/common/best-posts.scss @@ -1,64 +1,71 @@ .-best-posts { .rewind-report-container { - flex-direction: column; + display: grid; + grid-template-columns: repeat(3, calc(32% - (1em / 3))); gap: 1em; } + .rewind-report-title { + margin-left: 0; + width: 100%; + text-align: center; + box-sizing: border-box; + border: none; + margin-bottom: 1em; + } + .rewind-card { - max-width: 700px; - text-align: left; - align-items: unset; + box-sizing: border-box; + padding: 0.5em; position: relative; + color: var(--primary); + display: flex; + flex-direction: column; + text-align: left; + max-width: 700px; + height: 100%; + background: linear-gradient(225deg, transparent 13px, #ffffff 13px); - @include rewind-border; + &::before { + content: ""; + display: block; + width: 0; + position: absolute; + top: -1px; + right: -1px; + border: 10px solid transparent; + border-left: 10px solid #ffffff; + border-bottom: 10px solid #ffffff; + box-shadow: + 0px 2px 4px rgba(0, 0, 0, 0.4), + -1px 1px 4px rgba(0, 0, 0, 0.4); + } &.rank-1 { - --background: #ffe46a; - --border-color: #ffd82a; + &::before { + border-left: 10px solid #ffd82a; + border-bottom: 10px solid #ffd82a; + } } &.rank-2 { - --background: #d6d6d6; - --border-color: #c4c4c4; + &::before { + border-left: 10px solid #d6d6d6; + border-bottom: 10px solid #d6d6d6; + } } &.rank-3 { - --background: #dca570; - --border-color: #cd7f32; - } - } - - .best-posts.-rank { - z-index: -1; - position: absolute; - top: 8px; - left: -20px; - width: 0; - height: 0; - display: flex; - align-items: center; - justify-content: center; - box-shadow: none; - border-right: 28px solid var(--border-color); - border-top: 28px solid transparent; - - &:nth-child(2) { - z-index: -1; - position: absolute; - top: 8px; - left: -20px; - width: 0; - height: 0; - display: flex; - align-items: center; - justify-content: center; - border-left: 28px solid var(--border-color); - border-right: 0; - transform: rotate(180deg); + &::before { + border-left: 10px solid #cd7f32; + border-bottom: 10px solid #cd7f32; + } } } .best-posts__post { + width: 100%; + @media screen and (width <= 475px) { max-height: 300px; text-overflow: ellipsis; @@ -128,6 +135,8 @@ gap: 10px; color: var(--primary-700); align-items: center; + margin-top: auto; + width: 100%; } .best-posts__likes, diff --git a/assets/stylesheets/common/best-topics.scss b/assets/stylesheets/common/best-topics.scss index d817cea..9dc23c3 100644 --- a/assets/stylesheets/common/best-topics.scss +++ b/assets/stylesheets/common/best-topics.scss @@ -1,4 +1,6 @@ .-best-topics { + padding-bottom: 0; + .rewind-report-container { flex-direction: column; gap: 1em; @@ -8,23 +10,37 @@ color: var(--primary); } + .rewind-report-title { + margin-left: 0; + width: 100%; + text-align: center; + box-sizing: border-box; + border: none; + } + .rewind-card { gap: 1em; - align-items: flex-start; max-width: 700px; background: none; - border: none; - padding: 0; + display: grid; + grid-template-columns: repeat(3, 33%); + align-items: start; } .best-topics__header { font-family: var(--jersey-heading); margin: 0; - font-size: var(--font-up-3); + font-size: var(--font-up-1); line-height: var(--font-0); + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + overflow: hidden; + text-overflow: ellipsis; } .best-topics__topic { + box-sizing: border-box; padding: 0.5em; position: relative; color: var(--primary); @@ -32,62 +48,57 @@ flex-direction: column; text-align: left; max-width: 700px; + height: 100%; + background: linear-gradient(225deg, transparent 13px, #ffffff 13px); - @include rewind-border; + &::before { + content: ""; + display: block; + width: 0; + position: absolute; + top: -1px; + right: -1px; + border: 10px solid transparent; + border-left: 10px solid #ffffff; + border-bottom: 10px solid #ffffff; + box-shadow: + 0px 2px 4px rgba(0, 0, 0, 0.4), + -1px 1px 4px rgba(0, 0, 0, 0.4); + } &.rank-1 { - --background: #ffe46a; - --border-color: #ffd82a; + &::before { + border-left: 10px solid #ffd82a; + border-bottom: 10px solid #ffd82a; + } } &.rank-2 { - --background: #d6d6d6; - --border-color: #c4c4c4; + &::before { + border-left: 10px solid #d6d6d6; + border-bottom: 10px solid #d6d6d6; + } } &.rank-3 { - --background: #dca570; - --border-color: #cd7f32; - } - background: var(--secondary); - } - - .best-topics.-rank { - z-index: -1; - position: absolute; - top: 8px; - left: -20px; - width: 0; - height: 0; - display: flex; - align-items: center; - justify-content: center; - box-shadow: none; - border-right: 28px solid var(--border-color); - border-top: 28px solid transparent; - - &:nth-child(2) { - z-index: -1; - position: absolute; - top: 8px; - left: -20px; - width: 0; - height: 0; - display: flex; - align-items: center; - justify-content: center; - border-left: 28px solid var(--border-color); - border-right: 0; - transform: rotate(180deg); + &::before { + border-left: 10px solid #cd7f32; + border-bottom: 10px solid #cd7f32; + } } } .best-topics__excerpt { font-family: var(--pixel-text); - font-size: var(--font-down-1); + font-size: var(--font-down-2); font-weight: 400; color: var(--primary-800); text-align: left; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 8; + overflow: hidden; + text-overflow: ellipsis; @media screen and (width <= 475px) { max-width: 100%; diff --git a/assets/stylesheets/common/most-viewed-categories.scss b/assets/stylesheets/common/most-viewed-categories.scss index 6014e6f..7d303f4 100644 --- a/assets/stylesheets/common/most-viewed-categories.scss +++ b/assets/stylesheets/common/most-viewed-categories.scss @@ -5,13 +5,43 @@ flex-wrap: wrap; } + .rewind-report-title { + margin-left: 0; + width: 100%; + text-align: center; + box-sizing: border-box; + border: none; + margin-bottom: 1em; + } + .rewind-card { @include rewind-border; width: max-content; flex-grow: 1; + position: relative; + min-width: 150px; + margin-top: 1.5em; + + &::before { + display: block; + content: ""; + width: 3em; + height: 1em; + border: 2px solid #00ff00; + border-bottom: none; + border-radius: 6px 6px 0 0; + position: absolute; + top: calc(-1em - 2px); + left: -2px; + background: #111; + } &:hover { background-color: var(--secondary-very-high); + + &::before { + background-color: var(--secondary-very-high); + } } } } diff --git a/assets/stylesheets/common/most-viewed-tags.scss b/assets/stylesheets/common/most-viewed-tags.scss index 0847995..4c55a3f 100644 --- a/assets/stylesheets/common/most-viewed-tags.scss +++ b/assets/stylesheets/common/most-viewed-tags.scss @@ -39,6 +39,7 @@ &:hover { background-color: var(--secondary-very-high); + &::before { background-color: var(--secondary-very-high); } From 08ea88c48a19dfddd09505ba83f3f81585c926bb Mon Sep 17 00:00:00 2001 From: awesomerobot Date: Fri, 14 Nov 2025 19:01:21 -0500 Subject: [PATCH 3/9] activity calendar colors --- assets/stylesheets/common/activity-calendar.scss | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/assets/stylesheets/common/activity-calendar.scss b/assets/stylesheets/common/activity-calendar.scss index c2d6b3f..0f0bbbe 100644 --- a/assets/stylesheets/common/activity-calendar.scss +++ b/assets/stylesheets/common/activity-calendar.scss @@ -32,8 +32,6 @@ .rewind-calendar-cell { height: 10px; width: 10px; - border-radius: calc(var(--rewind-border-radius) / 2); - border: 1px solid rgb(var(--primary-rgb), 0.2); @media screen and (width <= 475px) { height: 5px; @@ -45,15 +43,15 @@ } &.-low { - background: var(--tertiary-low); + background: var(--success); } &.-medium { - background: var(--tertiary-medium); + background: var(--success-medium); } &.-high { - background: var(--tertiary-high); + background: var(--success-low); } } } From 066666676a3c80b7c54b9460664dc57da57c5dd8 Mon Sep 17 00:00:00 2001 From: awesomerobot Date: Mon, 17 Nov 2025 14:08:35 -0500 Subject: [PATCH 4/9] additional styling and adjustments --- .../reports/most-viewed-categories.gjs | 11 +-- .../components/reports/most-viewed-tags.gjs | 16 ++-- .../discourse/components/rewind.gjs | 17 ++++- .../after-header-panel/rewind-decoration.gjs | 5 +- .../before-panel-body/rewind-callout.gjs | 49 +++++++------ assets/stylesheets/common/_index.scss | 1 + assets/stylesheets/common/best-posts.scss | 30 +++++--- assets/stylesheets/common/best-topics.scss | 23 ++++-- assets/stylesheets/common/fbff.scss | 3 +- assets/stylesheets/common/folder-styles.scss | 73 +++++++++++++++++++ assets/stylesheets/common/fonts.scss | 3 +- .../common/most-viewed-categories.scss | 24 ------ .../stylesheets/common/most-viewed-tags.scss | 32 -------- .../common/post-received-reactions.scss | 2 +- .../common/post-used-reactions.scss | 59 ++++++++++++++- assets/stylesheets/common/reading-time.scss | 8 +- assets/stylesheets/common/report.scss | 6 +- assets/stylesheets/common/rewind-callout.scss | 16 ++-- assets/stylesheets/common/rewind-header.scss | 6 +- assets/stylesheets/common/rewind.scss | 58 ++++++++++++--- assets/stylesheets/common/top-words.scss | 3 +- assets/stylesheets/common/variables.scss | 11 ++- config/locales/client.en.yml | 1 + 23 files changed, 312 insertions(+), 145 deletions(-) create mode 100644 assets/stylesheets/common/folder-styles.scss diff --git a/assets/javascripts/discourse/components/reports/most-viewed-categories.gjs b/assets/javascripts/discourse/components/reports/most-viewed-categories.gjs index 5d72a85..15c2be7 100644 --- a/assets/javascripts/discourse/components/reports/most-viewed-categories.gjs +++ b/assets/javascripts/discourse/components/reports/most-viewed-categories.gjs @@ -10,11 +10,12 @@ const MostViewedCategories =