mirror of
https://github.com/dgtlmoon/changedetection.io.git
synced 2026-04-30 14:50:39 +00:00
3d14df6a11
Multi-language / Translations Support (#3696) - Complete internationalization system implemented - Support for 7 languages: Czech (cs), German (de), French (fr), Italian (it), Korean (ko), Chinese Simplified (zh), Chinese Traditional (zh_TW) - Language selector with localized flags and theming - Flash message translations - Multiple translation fixes and improvements across all languages - Language setting preserved across redirects Pluggable Content Fetchers (#3653) - New architecture for extensible content fetcher system - Allows custom fetcher implementations Image / Screenshot Comparison Processor (#3680) - New processor for visual change detection (disabled for this release) - Supporting CSS/JS infrastructure added UI Improvements Design & Layout - Auto-generated tag color schemes - Simplified login form styling - Removed hard-coded CSS, moved to SCSS variables - Tag UI cleanup and improvements - Automatic tab wrapper functionality - Menu refactoring for better organization - Cleanup of offset settings - Hide sticky tabs on narrow viewports - Improved responsive layout (#3702) User Experience - Modal alerts/confirmations on delete/clear operations (#3693, #3598, #3382) - Auto-add https:// to URLs in quickwatch form if not present - Better redirect handling on login (#3699) - 'Recheck all' now returns to correct group/tag (#3673) - Language set redirect keeps hash fragment - More friendly human-readable text throughout UI Performance & Reliability Scheduler & Processing - Soft delays instead of blocking time.sleep() calls (#3710) - More resilient handling of same UUID being processed (#3700) - Better Puppeteer timeout handling - Improved Puppeteer shutdown/cleanup (#3692) - Requests cleanup now properly async History & Rendering - Faster server-side "difference" rendering on History page (#3442) - Show ignored/triggered rows in history - API: Retry watch data if watch dict changed (more reliable) API Improvements - Watch get endpoint: retry mechanism for changed watch data - WatchHistoryDiff API endpoint includes extra format args (#3703) Testing Improvements - Replace time.sleep with wait_for_notification_endpoint_output (#3716) - Test for mode switching (#3701) - Test for #3720 added (#3725) - Extract-text difference test fixes - Improved dev workflow Bug Fixes - Notification error text output (#3672, #3669, #3280) - HTML validation fixes (#3704) - Template discovery path fixes - Notification debug log now uses system locale for dates/times - Puppeteer spelling mistake in log output - Recalculation on anchor change - Queue bubble update disabled temporarily Dependency Updates - beautifulsoup4 updated (#3724) - psutil 7.1.0 → 7.2.1 (#3723) - python-engineio ~=4.12.3 → ~=4.13.0 (#3707) - python-socketio ~=5.14.3 → ~=5.16.0 (#3706) - flask-socketio ~=5.5.1 → ~=5.6.0 (#3691) - brotli ~=1.1 → ~=1.2 (#3687) - lxml updated (#3590) - pytest ~=7.2 → ~=9.0 (#3676) - jsonschema ~=4.0 → ~=4.25 (#3618) - pluggy ~=1.5 → ~=1.6 (#3616) - cryptography 44.0.1 → 46.0.3 (security) (#3589) Documentation - README updated with viewport size setup information Development Infrastructure - Dev container only built on dev branch - Improved dev workflow tooling
247 lines
4.2 KiB
SCSS
247 lines
4.2 KiB
SCSS
#diff-form {
|
|
|
|
background: rgba(0, 0, 0, .05);
|
|
padding: 1em;
|
|
border-radius: 10px;
|
|
margin-bottom: 1em;
|
|
color: #fff;
|
|
font-size: 0.9rem;
|
|
text-align: center;
|
|
|
|
label.from-to-label {
|
|
width: 4rem;
|
|
text-decoration: none;
|
|
padding: 0.5rem;
|
|
|
|
&#change-from {
|
|
color: #b30000;
|
|
background: #fadad7
|
|
}
|
|
|
|
&#change-to {
|
|
background: #eaf2c2;
|
|
color: #406619;
|
|
}
|
|
}
|
|
|
|
#diff-style {
|
|
>span {
|
|
display: inline-block;
|
|
padding: 0.3em;
|
|
label {
|
|
font-weight: normal;
|
|
}
|
|
}
|
|
}
|
|
* {
|
|
vertical-align: middle;
|
|
}
|
|
|
|
}
|
|
|
|
body.difference-page {
|
|
section.content {
|
|
padding-top: 40px;
|
|
}
|
|
}
|
|
|
|
#diff-ui {
|
|
|
|
background: var(--color-background);
|
|
padding: 1rem;
|
|
border-radius: 5px;
|
|
|
|
@media (min-width: 767px) {
|
|
min-width: 50%;
|
|
}
|
|
|
|
// The first tab 'text' diff
|
|
#text {
|
|
font-size: 11px;
|
|
}
|
|
|
|
pre {
|
|
white-space: break-spaces;
|
|
}
|
|
|
|
|
|
h1 {
|
|
display: inline;
|
|
font-size: 100%;
|
|
}
|
|
|
|
#result {
|
|
white-space: pre-wrap;
|
|
word-break: break-word;
|
|
overflow-wrap: break-word;
|
|
}
|
|
|
|
|
|
.source {
|
|
position: absolute;
|
|
right: 1%;
|
|
top: .2em;
|
|
}
|
|
|
|
@-moz-document url-prefix() {
|
|
body {
|
|
height: 99%;
|
|
/* Hide scroll bar in Firefox */
|
|
}
|
|
}
|
|
|
|
td#diff-col div {
|
|
text-align: justify;
|
|
white-space: pre-wrap;
|
|
}
|
|
|
|
.ignored {
|
|
background-color: #ccc;
|
|
/* border: #0d91fa 1px solid; */
|
|
opacity: 0.7;
|
|
}
|
|
|
|
.triggered {
|
|
background-color: #1b98f8;
|
|
}
|
|
|
|
/* ignored and triggered? make it obvious error */
|
|
.ignored.triggered {
|
|
background-color: #ff0000;
|
|
}
|
|
|
|
.tab-pane-inner#screenshot {
|
|
text-align: center;
|
|
|
|
img {
|
|
max-width: 99%;
|
|
}
|
|
}
|
|
|
|
|
|
// resets button margin to 0px
|
|
.pure-form button.reset-margin {
|
|
margin: 0px;
|
|
}
|
|
|
|
.diff-fieldset {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 4px;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
|
|
ul#highlightSnippetActions {
|
|
list-style-type: none;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
gap: 1.5rem;
|
|
flex-wrap: wrap;
|
|
padding: 0;
|
|
margin: 0;
|
|
|
|
li {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
text-align: center;
|
|
padding: 0.5rem;
|
|
gap: 0.3rem;
|
|
|
|
button, a {
|
|
white-space: nowrap;
|
|
}
|
|
}
|
|
|
|
span {
|
|
font-size: 0.8rem;
|
|
color: var(--color-text-input-description);
|
|
}
|
|
}
|
|
|
|
#cell-diff-jump-visualiser {
|
|
display: flex;
|
|
flex-direction: row;
|
|
gap: 1px;
|
|
background: var(--color-background);
|
|
border-radius: 3px;
|
|
overflow-x: hidden;
|
|
position: sticky;
|
|
top: 0;
|
|
z-index: 10;
|
|
padding-top: 1rem;
|
|
padding-bottom: 1rem;
|
|
justify-content: center;
|
|
|
|
> div {
|
|
flex: 1;
|
|
min-width: 1px;
|
|
max-width: 10px;
|
|
height: 10px;
|
|
background: var(--color-background-button-cancel);
|
|
opacity: 0.3;
|
|
border-radius: 1px;
|
|
transition: opacity 0.2s;
|
|
position: relative;
|
|
|
|
&.deletion {
|
|
background: #b30000; // Red for deletions
|
|
opacity: 1;
|
|
}
|
|
|
|
&.insertion {
|
|
background: #406619; // Green for insertions
|
|
opacity: 1;
|
|
}
|
|
|
|
&.note {
|
|
background: #406619; // Orange for changed/notes
|
|
opacity: 1;
|
|
}
|
|
|
|
&.mixed {
|
|
background: linear-gradient(to right, #b30000 50%, #406619 50%); // Half red, half green
|
|
opacity: 1;
|
|
}
|
|
|
|
&.current-position::after {
|
|
content: '';
|
|
position: absolute;
|
|
bottom: -6px;
|
|
left: 50%;
|
|
transform: translateX(-50%);
|
|
width: 0;
|
|
height: 0;
|
|
border-left: 4px solid transparent;
|
|
border-right: 4px solid transparent;
|
|
border-bottom: 4px solid var(--color-text);
|
|
}
|
|
|
|
&:hover {
|
|
opacity: 0.8;
|
|
cursor: pointer;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#text-diff-heading-area {
|
|
.snapshot-age {
|
|
padding: 4px;
|
|
margin: 0.5rem 0;
|
|
background-color: var(--color-background-snapshot-age);
|
|
border-radius: 3px;
|
|
font-weight: bold;
|
|
margin-bottom: 4px;
|
|
|
|
&.error {
|
|
background-color: var(--color-error-background-snapshot-age);
|
|
color: var(--color-error-text-snapshot-age);
|
|
}
|
|
> * {
|
|
padding-right: 1rem;
|
|
}
|
|
}
|
|
} |