-
Notifications
You must be signed in to change notification settings - Fork 4
github-inactive-dev-warning.user.js - Styling & Close Button #34
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,7 +5,7 @@ | |
// @description display big banner if project's last commit over 6 months ago and giant banner if over 1 year ago | ||
// @copyright 2019-2025, Zach Hardesty (https://zachhardesty.com/) | ||
// @license GPL-3.0-only; http://www.gnu.org/licenses/gpl-3.0.txt | ||
// @version 1.3.2 | ||
// @version 1.4.0 | ||
|
||
// @homepageURL https://github.com/zachhardesty7/tamper-monkey-scripts-collection/raw/master/github-inactive-dev-warning.user.js | ||
// @homepage https://github.com/zachhardesty7/tamper-monkey-scripts-collection/raw/master/github-inactive-dev-warning.user.js | ||
|
@@ -26,68 +26,184 @@ onElementReady( | |
"[data-testid='latest-commit-details'] relative-time", | ||
{ findOnce: false }, | ||
(el) => { | ||
if (document.querySelector("#zh-banner-warning")) { | ||
return | ||
} | ||
if (document.querySelector("#zh-inactive-dev-warning")) return; | ||
|
||
const date = new Date(el.getAttribute("datetime") || "") | ||
const daysSinceLastCommit = (Date.now() - date.getTime()) / 1000 / 60 / 60 / 24 | ||
const date = new Date(el.getAttribute("datetime") || ""); | ||
const daysSinceLastCommit = (Date.now() - date.getTime()) / 1000 / 60 / 60 / 24; | ||
if (daysSinceLastCommit > 365) { | ||
renderWarning() | ||
renderWarning(); | ||
} else if (daysSinceLastCommit > 182.5) { | ||
renderCaution() | ||
} else { | ||
/* noop */ | ||
renderCaution(); | ||
} | ||
}, | ||
) | ||
} | ||
); | ||
|
||
/** @param {HTMLElement} el - target */ | ||
function displayMessage(el) { | ||
document | ||
.querySelector("#js-repo-pjax-container") | ||
?.insertAdjacentElement("beforebegin", el) | ||
const container = document.querySelector("#js-repo-pjax-container"); | ||
if (container) { | ||
const existingBanner = document.querySelector("#zh-inactive-dev-warning"); | ||
if (existingBanner) existingBanner.remove(); | ||
container.insertAdjacentElement("beforebegin", el); | ||
} | ||
} | ||
|
||
function getThemeSettings() { | ||
const colorMode = document.documentElement.getAttribute('data-color-mode'); | ||
const darkTheme = document.documentElement.getAttribute('data-dark-theme'); | ||
const isLight = colorMode === 'light' || | ||
(colorMode === 'auto' && !window.matchMedia('(prefers-color-scheme: dark)').matches); | ||
|
||
if (isLight) { | ||
return { | ||
bg: '#fef7c5', | ||
text: '#1e2227', | ||
border: '#edd789', | ||
close: '#58626d', | ||
closeHover: '#1e2227', | ||
warningColor: '#996606' // Light theme warning color | ||
}; | ||
} else if (darkTheme === 'dark') { | ||
return { | ||
bg: '#262014', | ||
text: '#f0f0f0', | ||
border: '#614612', | ||
close: '#9097a0', | ||
closeHover: '#d0d6df', | ||
warningColor: '#d19826' // Dark theme warning color | ||
}; | ||
} else { // soft_dark or default | ||
return { | ||
bg: '#36342c', | ||
text: '#f0f0f0', | ||
border: '#665122', | ||
close: '#9097a0', | ||
closeHover: '#d0d6df', | ||
warningColor: '#c58f29' // Soft dark theme warning color | ||
Comment on lines
+58
to
+81
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. question: can we pull these hex codes from the some CSS variables GitHub sets? Would be nice to not have to hardcode them into this file (eg if GH updates their theme colors, our script would just pull in the new values correctly) |
||
}; | ||
} | ||
} | ||
|
||
function createCloseButton(theme) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. issue: after a few seconds (3-10 randomly?), the notification appears again I like the idea of being able to close the warning, but if we don't store that the user closed the notification, it's not particularly useful. The simplest solution is to just remove the close button and prevent the user from being able to remove the notification. I think I prefer that option for simplicity. Otherwise, we have to remember every repo/page the user has closed the notification on, which seems annoying to implement to me. Of course it's possible, but storing a bunch of values in local storage probably isn't worth it. I'd say say let's just remove the close button. |
||
const closeBtn = document.createElement("button"); | ||
closeBtn.setAttribute("style", ` | ||
background: transparent; | ||
border: transparent; | ||
color: ${theme.close}; | ||
width: 24px; | ||
height: 24px; | ||
border-radius: 3px; | ||
display: flex; | ||
align-items: center; | ||
justify-content: center; | ||
margin-left: auto; | ||
cursor: pointer; | ||
padding: 0; | ||
transition: color 0.1s ease-in-out; | ||
font-size: 18px; | ||
flex-shrink: 0; | ||
`); | ||
closeBtn.innerHTML = "×"; | ||
closeBtn.addEventListener("click", (e) => { | ||
e.stopPropagation(); | ||
document.querySelector("#zh-inactive-dev-warning")?.remove(); | ||
}); | ||
closeBtn.addEventListener("mouseenter", () => { | ||
closeBtn.style.color = theme.closeHover; | ||
}); | ||
closeBtn.addEventListener("mouseleave", () => { | ||
closeBtn.style.color = theme.close; | ||
}); | ||
return closeBtn; | ||
} | ||
|
||
function createWarningIcon(theme) { | ||
const icon = document.createElement("div"); | ||
icon.innerHTML = ` | ||
<svg width="16" height="16" viewBox="0 0 16 16" fill="${theme.warningColor}" style="vertical-align: middle;"> | ||
<path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> | ||
</svg> | ||
`; | ||
return icon; | ||
} | ||
|
||
function renderWarning() { | ||
const banner = document.createElement("div") | ||
banner.id = "zh-banner-warning" | ||
banner.setAttribute( | ||
"style", | ||
` | ||
background-color: red; | ||
height: 100px; | ||
const theme = getThemeSettings(); | ||
const banner = document.createElement("div"); | ||
banner.id = "zh-inactive-dev-warning"; | ||
banner.setAttribute("style", ` | ||
background-color: ${theme.bg}; | ||
color: ${theme.text}; | ||
height: 50px; | ||
margin-bottom: 20px; | ||
display: flex; | ||
justify-content: center; | ||
align-items: center; | ||
color: white; | ||
font-size: 36px; | ||
`, | ||
) | ||
font-size: 18px; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. question: can we reference some CSS variable from their code for this? It would be really nice to not hardcode this to the specific |
||
border-top: 1px solid ${theme.border}; | ||
border-bottom: 1px solid ${theme.border}; | ||
padding: 0 16px; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. question: can we reference some CSS variable from their code for this? It would be really nice to not hardcode this to the specific |
||
position: relative; | ||
`); | ||
|
||
const message = document.createElement("div"); | ||
message.style.flex = "1"; | ||
message.style.textAlign = "center"; | ||
message.style.display = "flex"; | ||
message.style.alignItems = "center"; | ||
message.style.justifyContent = "center"; | ||
message.style.gap = "8px"; | ||
|
||
message.appendChild(createWarningIcon(theme)); | ||
|
||
const text = document.createElement("span"); | ||
text.textContent = "repo hasn't been updated in 1+ year(s)"; | ||
message.appendChild(text); | ||
|
||
message.appendChild(createWarningIcon(theme)); | ||
|
||
banner.textContent = "WARNING: repo hasn't received an update in 1+ year(s)" | ||
banner.appendChild(message); | ||
banner.appendChild(createCloseButton(theme)); | ||
|
||
displayMessage(banner) | ||
displayMessage(banner); | ||
} | ||
|
||
function renderCaution() { | ||
const banner = document.createElement("div") | ||
banner.id = "zh-banner-warning" | ||
banner.setAttribute( | ||
"style", | ||
` | ||
background-color: yellow; | ||
const theme = getThemeSettings(); | ||
const banner = document.createElement("div"); | ||
banner.id = "zh-inactive-dev-warning"; | ||
banner.setAttribute("style", ` | ||
background-color: ${theme.bg}; | ||
color: ${theme.text}; | ||
height: 50px; | ||
margin-bottom: 20px; | ||
display: flex; | ||
justify-content: center; | ||
align-items: center; | ||
font-size: 24px; | ||
`, | ||
) | ||
font-size: 18px; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. question: can we reference some CSS variable from their code for this? It would be really nice to not hardcode this to the specific |
||
border-top: 1px solid ${theme.border}; | ||
border-bottom: 1px solid ${theme.border}; | ||
padding: 0 16px; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. question: can we reference some CSS variable from their code for this? It would be really nice to not hardcode this to the specific |
||
position: relative; | ||
`); | ||
|
||
banner.textContent = "Caution: repo hasn't received an update in 6+ months" | ||
const message = document.createElement("div"); | ||
message.style.flex = "1"; | ||
message.style.textAlign = "center"; | ||
message.style.display = "flex"; | ||
message.style.alignItems = "center"; | ||
message.style.justifyContent = "center"; | ||
message.style.gap = "8px"; | ||
|
||
displayMessage(banner) | ||
} | ||
message.appendChild(createWarningIcon(theme)); | ||
|
||
const text = document.createElement("span"); | ||
text.textContent = "repo hasn't been updated in 6+ months"; | ||
message.appendChild(text); | ||
|
||
message.appendChild(createWarningIcon(theme)); | ||
|
||
banner.appendChild(message); | ||
banner.appendChild(createCloseButton(theme)); | ||
|
||
displayMessage(banner); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
question: does this work for all combinations of light/dark system prefs and github themes?
I didn't test all of the themes and/or system light/dark modes (prefers-...), but it looks great on my system's dark mode. How are the light themes (system or GH)? What about other GH themes than plain dark?