diff --git a/Extensions/combined/_locales/az/messages.json b/Extensions/combined/_locales/az/messages.json index 827666e..d5126e3 100644 --- a/Extensions/combined/_locales/az/messages.json +++ b/Extensions/combined/_locales/az/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "İcmadan soruş" + }, + "changelog_brand_logo_alt": { + "message": "Return YouTube Dislike loqosu" } } diff --git a/Extensions/combined/_locales/cs/messages.json b/Extensions/combined/_locales/cs/messages.json index 7eb18e7..984a58b 100644 --- a/Extensions/combined/_locales/cs/messages.json +++ b/Extensions/combined/_locales/cs/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Zeptejte se komunity" + }, + "changelog_brand_logo_alt": { + "message": "Logo Return YouTube Dislike" } } diff --git a/Extensions/combined/_locales/de/messages.json b/Extensions/combined/_locales/de/messages.json index 53c1f20..d425225 100644 --- a/Extensions/combined/_locales/de/messages.json +++ b/Extensions/combined/_locales/de/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Frag die Community" + }, + "changelog_brand_logo_alt": { + "message": "Return YouTube Dislike-Logo" } } diff --git a/Extensions/combined/_locales/el/messages.json b/Extensions/combined/_locales/el/messages.json index dff1bf0..71ef3d8 100644 --- a/Extensions/combined/_locales/el/messages.json +++ b/Extensions/combined/_locales/el/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Ρωτήστε την κοινότητα" + }, + "changelog_brand_logo_alt": { + "message": "Λογότυπο Return YouTube Dislike" } } diff --git a/Extensions/combined/_locales/en/messages.json b/Extensions/combined/_locales/en/messages.json index 7403e13..116f20d 100644 --- a/Extensions/combined/_locales/en/messages.json +++ b/Extensions/combined/_locales/en/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Ask the community" + }, + "changelog_brand_logo_alt": { + "message": "Return YouTube Dislike logo" } -} \ No newline at end of file +} diff --git a/Extensions/combined/_locales/es/messages.json b/Extensions/combined/_locales/es/messages.json index 5de9356..4569361 100644 --- a/Extensions/combined/_locales/es/messages.json +++ b/Extensions/combined/_locales/es/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Pregunta a la comunidad" + }, + "changelog_brand_logo_alt": { + "message": "Logotipo de Return YouTube Dislike" } } diff --git a/Extensions/combined/_locales/fr/messages.json b/Extensions/combined/_locales/fr/messages.json index f1e4230..49f23d7 100644 --- a/Extensions/combined/_locales/fr/messages.json +++ b/Extensions/combined/_locales/fr/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Demander à la communauté" + }, + "changelog_brand_logo_alt": { + "message": "Logo de Return YouTube Dislike" } } diff --git a/Extensions/combined/_locales/hu/messages.json b/Extensions/combined/_locales/hu/messages.json index 0f15ac5..c9757c7 100644 --- a/Extensions/combined/_locales/hu/messages.json +++ b/Extensions/combined/_locales/hu/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Kérdezd meg a közösséget" + }, + "changelog_brand_logo_alt": { + "message": "Return YouTube Dislike logója" } } diff --git a/Extensions/combined/_locales/id/messages.json b/Extensions/combined/_locales/id/messages.json index 684a23c..408bf6d 100644 --- a/Extensions/combined/_locales/id/messages.json +++ b/Extensions/combined/_locales/id/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Tanyakan pada komunitas" + }, + "changelog_brand_logo_alt": { + "message": "Logo Return YouTube Dislike" } } diff --git a/Extensions/combined/_locales/it/messages.json b/Extensions/combined/_locales/it/messages.json index 01a4b93..4a5f716 100644 --- a/Extensions/combined/_locales/it/messages.json +++ b/Extensions/combined/_locales/it/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Chiedi alla community" + }, + "changelog_brand_logo_alt": { + "message": "Logo Return YouTube Dislike" } } diff --git a/Extensions/combined/_locales/ja/messages.json b/Extensions/combined/_locales/ja/messages.json index 97db7ca..dc6b02b 100644 --- a/Extensions/combined/_locales/ja/messages.json +++ b/Extensions/combined/_locales/ja/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "コミュニティに質問する" + }, + "changelog_brand_logo_alt": { + "message": "Return YouTube Dislike のロゴ" } } diff --git a/Extensions/combined/_locales/ko/messages.json b/Extensions/combined/_locales/ko/messages.json index ba96da2..af0965e 100644 --- a/Extensions/combined/_locales/ko/messages.json +++ b/Extensions/combined/_locales/ko/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "커뮤니티에 물어보세요" + }, + "changelog_brand_logo_alt": { + "message": "Return YouTube Dislike 로고" } } diff --git a/Extensions/combined/_locales/nl/messages.json b/Extensions/combined/_locales/nl/messages.json index a0a0c30..3ef78a2 100644 --- a/Extensions/combined/_locales/nl/messages.json +++ b/Extensions/combined/_locales/nl/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Vraag het aan de gemeenschap" + }, + "changelog_brand_logo_alt": { + "message": "Return YouTube Dislike-logo" } } diff --git a/Extensions/combined/_locales/pl/messages.json b/Extensions/combined/_locales/pl/messages.json index 91bfac9..1d4d2e4 100644 --- a/Extensions/combined/_locales/pl/messages.json +++ b/Extensions/combined/_locales/pl/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Zapytaj społeczność" + }, + "changelog_brand_logo_alt": { + "message": "Logo Return YouTube Dislike" } } diff --git a/Extensions/combined/_locales/pt_BR/messages.json b/Extensions/combined/_locales/pt_BR/messages.json index 0a70091..fe2debf 100644 --- a/Extensions/combined/_locales/pt_BR/messages.json +++ b/Extensions/combined/_locales/pt_BR/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Pergunte à comunidade" + }, + "changelog_brand_logo_alt": { + "message": "Logo do Return YouTube Dislike" } } diff --git a/Extensions/combined/_locales/ru/messages.json b/Extensions/combined/_locales/ru/messages.json index d6c0b90..96a6837 100644 --- a/Extensions/combined/_locales/ru/messages.json +++ b/Extensions/combined/_locales/ru/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Спросить сообщество" + }, + "changelog_brand_logo_alt": { + "message": "Логотип Return YouTube Dislike" } } diff --git a/Extensions/combined/_locales/sv_SE/messages.json b/Extensions/combined/_locales/sv_SE/messages.json index 8830a28..824952c 100644 --- a/Extensions/combined/_locales/sv_SE/messages.json +++ b/Extensions/combined/_locales/sv_SE/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Fråga samhället" + }, + "changelog_brand_logo_alt": { + "message": "Return YouTube Dislike-logotyp" } } diff --git a/Extensions/combined/_locales/tr/messages.json b/Extensions/combined/_locales/tr/messages.json index a1cc81a..dbd0153 100644 --- a/Extensions/combined/_locales/tr/messages.json +++ b/Extensions/combined/_locales/tr/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Topluluğa sorun" + }, + "changelog_brand_logo_alt": { + "message": "Return YouTube Dislike logosu" } } diff --git a/Extensions/combined/_locales/uk/messages.json b/Extensions/combined/_locales/uk/messages.json index af9360f..e592879 100644 --- a/Extensions/combined/_locales/uk/messages.json +++ b/Extensions/combined/_locales/uk/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Запитайте у спільноти" + }, + "changelog_brand_logo_alt": { + "message": "Логотип Return YouTube Dislike" } } diff --git a/Extensions/combined/_locales/vi/messages.json b/Extensions/combined/_locales/vi/messages.json index 961091b..e60abd9 100644 --- a/Extensions/combined/_locales/vi/messages.json +++ b/Extensions/combined/_locales/vi/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "Hỏi cộng đồng" + }, + "changelog_brand_logo_alt": { + "message": "Logo Return YouTube Dislike" } } diff --git a/Extensions/combined/_locales/zh_CN/messages.json b/Extensions/combined/_locales/zh_CN/messages.json index 269b6a8..9c9ff48 100644 --- a/Extensions/combined/_locales/zh_CN/messages.json +++ b/Extensions/combined/_locales/zh_CN/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "询问社区" + }, + "changelog_brand_logo_alt": { + "message": "Return YouTube Dislike 标志" } } diff --git a/Extensions/combined/_locales/zh_TW/messages.json b/Extensions/combined/_locales/zh_TW/messages.json index 9f2efdb..5f0f816 100644 --- a/Extensions/combined/_locales/zh_TW/messages.json +++ b/Extensions/combined/_locales/zh_TW/messages.json @@ -535,5 +535,8 @@ }, "changelog_support_contact": { "message": "詢問社區" + }, + "changelog_brand_logo_alt": { + "message": "Return YouTube Dislike 標誌" } } diff --git a/Extensions/combined/changelog/4/changelog.css b/Extensions/combined/changelog/4/changelog.css index d063852..5b22bc6 100644 --- a/Extensions/combined/changelog/4/changelog.css +++ b/Extensions/combined/changelog/4/changelog.css @@ -59,6 +59,49 @@ body { gap: 1.25rem; } +.ryd-changelog__brand { + display: flex; + align-items: center; + gap: 0.85rem; + background: rgba(15, 23, 42, 0.6); + border-radius: 999px; + padding: 0.35rem 0.85rem 0.35rem 0.35rem; + align-self: flex-start; + border: 1px solid rgba(255, 66, 77, 0.2); + box-shadow: 0 12px 30px rgba(255, 66, 77, 0.22); +} + +.ryd-changelog__brand-logo { + display: block; + width: 56px; + height: 56px; + border-radius: 50%; + background: radial-gradient(circle at 35% 35%, rgba(255, 255, 255, 0.4), transparent 55%); + padding: 0.35rem; + box-sizing: border-box; + filter: drop-shadow(0 6px 12px rgba(0, 0, 0, 0.35)); +} + +.ryd-changelog__brand-text { + display: flex; + flex-direction: column; + gap: 0.1rem; +} + +.ryd-changelog__brand-name { + font-size: 1.05rem; + font-weight: 700; + letter-spacing: 0.01em; +} + +.ryd-changelog__brand-label { + font-size: 0.85rem; + color: var(--ryd-text-secondary); + letter-spacing: 0.08em; + text-transform: uppercase; + font-weight: 600; +} + .ryd-changelog__badge { display: inline-flex; align-self: flex-start; @@ -188,6 +231,27 @@ body { .ryd-feature-grid { gap: clamp(1.5rem, 6vw, 2rem); } + + .ryd-changelog__brand { + gap: 0.65rem; + padding: 0.3rem 0.75rem 0.3rem 0.3rem; + } + + .ryd-changelog__brand-logo { + width: 48px; + height: 48px; + } +} + +@media (max-width: 480px) { + .ryd-changelog__brand-name { + font-size: 0.95rem; + } + + .ryd-changelog__brand-label { + font-size: 0.75rem; + letter-spacing: 0.06em; + } } .ryd-feature-card { diff --git a/Extensions/combined/changelog/4/changelog_4.0.html b/Extensions/combined/changelog/4/changelog_4.0.html index 5d0c79c..ecb9a9e 100644 --- a/Extensions/combined/changelog/4/changelog_4.0.html +++ b/Extensions/combined/changelog/4/changelog_4.0.html @@ -15,6 +15,19 @@
+
+ +
+ __MSG_extensionName__ + __MSG_changelog_title__ +
+
__MSG_changelog_badge__

__MSG_changelog_heading__

__MSG_changelog_subheading__

diff --git a/Extensions/combined/ryd.background.js b/Extensions/combined/ryd.background.js index 275df2f..d205977 100644 --- a/Extensions/combined/ryd.background.js +++ b/Extensions/combined/ryd.background.js @@ -5,6 +5,7 @@ const voteDisabledIconName = config.voteDisabledIconName; const defaultIconName = config.defaultIconName; let api; const CHANGELOG_STORAGE_KEY = "lastShownChangelogVersion"; +const PENDING_CHANGELOG_STORAGE_KEY = "pendingChangelogVersion"; /** stores extension's global config */ let extConfig = { ...config.defaultExtConfig }; @@ -251,9 +252,76 @@ function openChangelogTab(version) { } } +function scheduleChangelogVersion(version) { + const storage = api?.storage?.local; + if (!storage || typeof storage.set !== "function") { + return false; + } + try { + const valueToStore = version || true; + storage.set({ [PENDING_CHANGELOG_STORAGE_KEY]: valueToStore }, () => { + if (api.runtime.lastError) { + console.debug("Failed to persist pending changelog version:", api.runtime.lastError.message); + } + }); + return true; + } catch (error) { + console.debug("Storage set failed for pending changelog version", error); + return false; + } +} + +function clearPendingChangelogVersion() { + const storage = api?.storage?.local; + if (!storage || typeof storage.remove !== "function") { + return; + } + try { + storage.remove(PENDING_CHANGELOG_STORAGE_KEY, () => { + if (api.runtime.lastError) { + console.debug("Failed to clear pending changelog version:", api.runtime.lastError.message); + } + }); + } catch (error) { + console.debug("Storage remove failed for pending changelog version", error); + } +} + +function showPendingChangelogIfNeeded() { + const storage = api?.storage?.local; + if (!storage || typeof storage.get !== "function") { + return; + } + + try { + storage.get([PENDING_CHANGELOG_STORAGE_KEY, CHANGELOG_STORAGE_KEY], (result) => { + if (api.runtime.lastError) { + console.debug("Changelog storage read failed:", api.runtime.lastError.message); + return; + } + + const pendingValue = result?.[PENDING_CHANGELOG_STORAGE_KEY]; + if (pendingValue === undefined || pendingValue === null || pendingValue === "") { + return; + } + + const lastShownValue = result?.[CHANGELOG_STORAGE_KEY]; + if (lastShownValue !== undefined && lastShownValue !== null && lastShownValue !== "") { + clearPendingChangelogVersion(); + return; + } + + openChangelogTab(typeof pendingValue === "string" ? pendingValue : null); + }); + } catch (error) { + console.debug("Storage get failed for pending changelog version", error); + } +} + function persistChangelogVersion(version) { const storage = api?.storage?.local; if (!storage || typeof storage.set !== "function") { + clearPendingChangelogVersion(); return; } try { @@ -261,7 +329,9 @@ function persistChangelogVersion(version) { storage.set({ [CHANGELOG_STORAGE_KEY]: valueToStore }, () => { if (api.runtime.lastError) { console.debug("Failed to persist changelog version:", api.runtime.lastError.message); + return; } + clearPendingChangelogVersion(); }); } catch (error) { console.debug("Storage set failed for changelog version", error); @@ -285,6 +355,7 @@ function maybeShowChangelog(details) { const manifest = api.runtime.getManifest(); const currentVersion = manifest?.version; const storage = api?.storage?.local; + const isInstall = reason === "install"; const showChangelog = () => { openChangelogTab(currentVersion || null); @@ -296,19 +367,41 @@ function maybeShowChangelog(details) { } try { - storage.get(CHANGELOG_STORAGE_KEY, (result) => { + storage.get([CHANGELOG_STORAGE_KEY, PENDING_CHANGELOG_STORAGE_KEY], (result) => { if (api.runtime.lastError) { console.debug("Changelog storage read failed:", api.runtime.lastError.message); showChangelog(); return; } + const hasStoredValue = (value) => value !== undefined && value !== null && value !== ""; const lastShownValue = result?.[CHANGELOG_STORAGE_KEY]; - if (lastShownValue !== undefined && lastShownValue !== null && lastShownValue !== "") { + const pendingValue = result?.[PENDING_CHANGELOG_STORAGE_KEY]; + + if (isInstall) { + if (hasStoredValue(pendingValue)) { + clearPendingChangelogVersion(); + } + if (!hasStoredValue(lastShownValue)) { + showChangelog(); + } return; } - showChangelog(); + if (hasStoredValue(lastShownValue)) { + return; + } + + if (hasStoredValue(pendingValue)) { + if (currentVersion && pendingValue !== currentVersion) { + scheduleChangelogVersion(currentVersion); + } + return; + } + + if (!scheduleChangelogVersion(currentVersion || null)) { + showChangelog(); + } }); } catch (error) { console.debug("Storage get failed for changelog version", error); @@ -320,6 +413,12 @@ api.runtime.onInstalled.addListener((details) => { maybeShowChangelog(details); }); +if (api?.runtime?.onStartup && typeof api.runtime.onStartup.addListener === "function") { + api.runtime.onStartup.addListener(() => { + showPendingChangelogIfNeeded(); + }); +} + // api.storage.sync.get(['lastShowChangelogVersion'], (details) => { // if (extConfig.showUpdatePopup === true && // details.lastShowChangelogVersion !== chrome.runtime.getManifest().version