From a2d77752c032e91e0679aa1eec36c1535e2b7af6 Mon Sep 17 00:00:00 2001 From: dgtlmoon Date: Sun, 14 Jun 2026 13:29:39 +0200 Subject: [PATCH] WIP --- .../blueprint/add_watch_ui/__init__.py | 65 +++- .../add_watch_ui/static/add-watch.js | 87 +++++ .../add_watch_ui/templates/add-watch-ui.html | 110 ++++-- .../blueprint/browser_steps/__init__.py | 67 ++-- .../settings/templates/settings.html | 4 + changedetectionio/blueprint/ui/views.py | 5 + .../watchlist/templates/watch-overview.html | 12 +- changedetectionio/flask_app.py | 10 +- changedetectionio/forms.py | 3 + changedetectionio/languages.py | 89 ++++- changedetectionio/model/App.py | 3 +- .../processors/restock_diff/__init__.py | 28 +- .../restock_diff/plugins/llm_restock.py | 2 +- .../processors/restock_diff/processor.py | 24 +- changedetectionio/realtime/socket_server.py | 9 +- .../static/js/visual-selector.js | 312 ++++++++++++------ .../static/styles/scss/parts/_add-watch.scss | 179 ++++++++++ .../static/styles/scss/styles.scss | 26 +- changedetectionio/static/styles/styles.css | 2 +- changedetectionio/store/updates.py | 16 +- .../tests/restock/test_restock.py | 78 +++++ .../translations/cs/LC_MESSAGES/messages.mo | Bin 50299 -> 51214 bytes .../translations/cs/LC_MESSAGES/messages.po | 227 +++++++++++-- .../translations/de/LC_MESSAGES/messages.mo | Bin 50333 -> 51221 bytes .../translations/de/LC_MESSAGES/messages.po | 227 +++++++++++-- .../en_GB/LC_MESSAGES/messages.po | 219 ++++++++++-- .../en_US/LC_MESSAGES/messages.po | 219 ++++++++++-- .../translations/es/LC_MESSAGES/messages.po | 227 +++++++++++-- .../translations/fr/LC_MESSAGES/messages.mo | Bin 37191 -> 38153 bytes .../translations/fr/LC_MESSAGES/messages.po | 227 +++++++++++-- .../translations/it/LC_MESSAGES/messages.mo | Bin 21939 -> 22845 bytes .../translations/it/LC_MESSAGES/messages.po | 227 +++++++++++-- .../translations/ja/LC_MESSAGES/messages.po | 227 +++++++++++-- .../translations/ko/LC_MESSAGES/messages.mo | Bin 102182 -> 103123 bytes .../translations/ko/LC_MESSAGES/messages.po | 229 +++++++++++-- changedetectionio/translations/messages.pot | 221 +++++++++++-- .../pt_BR/LC_MESSAGES/messages.po | 227 +++++++++++-- .../translations/tr/LC_MESSAGES/messages.po | 227 +++++++++++-- .../translations/uk/LC_MESSAGES/messages.po | 227 +++++++++++-- .../translations/zh/LC_MESSAGES/messages.mo | Bin 57849 -> 58746 bytes .../translations/zh/LC_MESSAGES/messages.po | 233 +++++++++++-- .../zh_Hant_TW/LC_MESSAGES/messages.mo | Bin 43977 -> 44874 bytes .../zh_Hant_TW/LC_MESSAGES/messages.po | 233 +++++++++++-- 43 files changed, 3882 insertions(+), 646 deletions(-) create mode 100644 changedetectionio/blueprint/add_watch_ui/static/add-watch.js create mode 100644 changedetectionio/static/styles/scss/parts/_add-watch.scss diff --git a/changedetectionio/blueprint/add_watch_ui/__init__.py b/changedetectionio/blueprint/add_watch_ui/__init__.py index 21f9847c..23bdd347 100644 --- a/changedetectionio/blueprint/add_watch_ui/__init__.py +++ b/changedetectionio/blueprint/add_watch_ui/__init__.py @@ -1,4 +1,5 @@ -from flask import Blueprint, render_template +from flask import Blueprint, render_template, request, jsonify, make_response +from loguru import logger from changedetectionio import forms from changedetectionio.auth_decorator import login_optionally_required @@ -6,7 +7,7 @@ from changedetectionio.store import ChangeDetectionStore def construct_blueprint(datastore: ChangeDetectionStore): - add_watch_ui_blueprint = Blueprint('add_watch_ui', __name__, template_folder="templates") + add_watch_ui_blueprint = Blueprint('add_watch_ui', __name__, template_folder="templates", static_folder="static") @add_watch_ui_blueprint.route("/", methods=['GET']) @login_optionally_required @@ -24,4 +25,64 @@ def construct_blueprint(datastore: ChangeDetectionStore): llm_intent_watch_placeholder=LLM_INTENT_WATCH_PLACEHOLDER, ) + @add_watch_ui_blueprint.route("/snapshot", methods=['GET']) + @login_optionally_required + def add_watch_ui_snapshot(): + """One-shot live fetch of an arbitrary URL for the Add Watch visual selector. + + Reuses the same browser machinery as Browser Steps (browsersteps_live_ui + + the dedicated async loop) but without needing a persisted watch - we just + connect, "Goto site", grab the screenshot + xpath element data, then tear + the browser down again. Element selection then happens client-side on the + returned data, exactly like the watch Edit page's visual selector. + """ + import base64 + from changedetectionio.blueprint.browser_steps import ( + run_async_in_browser_loop, + _close_session_resources, + acquire_browser_for_fetcher, + ) + from changedetectionio.browser_steps.browser_steps import browsersteps_live_ui + + url = (request.args.get('url') or '').strip() + if not url or not url.lower().startswith(('http://', 'https://')): + return make_response('Please enter a valid http(s):// URL', 400) + + # Use whatever fetcher the application is configured to use by default + # (e.g. CloakBrowser, Playwright/sockpuppet) so the preview matches real checks. + fetcher_name = datastore.data['settings']['application'].get('fetch_backend', 'html_requests') + logger.debug(f"Add-watch snapshot: fetching '{url}' using system default fetcher '{fetcher_name}'") + + async def _fetch_snapshot(): + keepalive_ms = 30 * 1000 + browser, playwright_context = await acquire_browser_for_fetcher( + fetcher_name, proxy=None, keepalive_ms=keepalive_ms + ) + + stepper = browsersteps_live_ui(playwright_browser=browser, proxy=None, start_url=url) + session = {'browserstepper': stepper, 'browser': browser, 'playwright_context': playwright_context} + try: + await stepper.connect(proxy=None) + await stepper.call_action(action_name="Goto site", selector=None, optional_value=None) + return await stepper.get_current_state() + finally: + await _close_session_resources(session, label=' for add-watch snapshot') + + try: + (screenshot, xpath_data) = run_async_in_browser_loop(_fetch_snapshot()) + except Exception as e: + logger.error(f"Add-watch snapshot fetch failed for {url}: {e}") + if 'ECONNREFUSED' in str(e): + return make_response('Unable to start the Playwright Browser session, is sockpuppetbrowser running? ' + 'The live preview needs a fetcher that supports Javascript and screenshots.', 502) + return make_response(str(e).splitlines()[0] if str(e) else 'Could not fetch the page', 502) + + if not screenshot: + return make_response('Could not capture a screenshot for that URL', 502) + + return jsonify({ + "screenshot": f"data:image/jpeg;base64,{base64.b64encode(screenshot).decode('ascii')}", + "xpath_data": xpath_data, + }) + return add_watch_ui_blueprint diff --git a/changedetectionio/blueprint/add_watch_ui/static/add-watch.js b/changedetectionio/blueprint/add_watch_ui/static/add-watch.js new file mode 100644 index 00000000..8c7c35f4 --- /dev/null +++ b/changedetectionio/blueprint/add_watch_ui/static/add-watch.js @@ -0,0 +1,87 @@ +// Add Watch UI glue: fetch a live snapshot for the entered URL and drive the +// shared visual selector (window.initVisualSelector from visual-selector.js). + +$(document).ready(() => { + const $url = $('#url'); + const $go = $('#add-watch-go'); + const $emptyState = $('#add-watch-empty-state'); + const $spinner = $('#add-watch-spinner'); + const $error = $('#add-watch-error'); + const $wrapper = $('#selector-wrapper'); + const $xpathRow = $('#selector-current-xpath'); + const $byElement = $('#by-element-toggle'); + const $clear = $('#clear-selector'); + const $includeFilters = $('#include_filters'); + + const vs = window.initVisualSelector({ + $canvas: $('#selector-canvas'), + $includeFilters: $includeFilters, + $background: $('#selector-background'), + $xpathDisplay: $('#selector-current-xpath span'), + $fetchingNotice: $('#add-watch-spinner .fetching-update-notice'), + $wrapper: $wrapper, + $clearButton: $clear, + enableSelection: false, // off until the user opts into "Select by element" + processorIsImage: false, + // The snapshot comes from the live browser-steps capture, so scale X by the page + // CSS width (browser_width) like browser-steps.js - handles device-scale-factor != 1. + scaleByBrowserWidth: true, + }); + + function showState(which) { + // which: 'empty' | 'loading' | 'error' | 'ready' + $emptyState.toggle(which === 'empty'); + $spinner.toggle(which === 'loading'); + $error.toggle(which === 'error'); + const ready = which === 'ready'; + $wrapper.toggle(ready); + $xpathRow.toggle(ready && $byElement.is(':checked')); + $clear.toggle(ready && $byElement.is(':checked')); + } + + function fetchSnapshot() { + const url = ($url.val() || '').trim(); + if (!url) { + $url.focus(); + return; + } + + showState('loading'); + + $.ajax({ + url: add_watch_snapshot_url, + data: {url: url}, + dataType: 'json', + }).done((data) => { + showState('ready'); + vs.load({screenshotSrc: data.screenshot, xpathData: data.xpath_data}); + }).fail((xhr) => { + const msg = (xhr && xhr.responseText) ? xhr.responseText : 'Could not fetch a preview for that URL.'; + $error.text(msg); + showState('error'); + }); + } + + $go.on('click', fetchSnapshot); + + // Enter in the URL box should fetch a preview, not submit the whole form + $url.on('keydown', (e) => { + if (e.key === 'Enter') { + e.preventDefault(); + fetchSnapshot(); + } + }); + + // "Select by element" toggles live hover/click element selection + $byElement.on('change', function () { + const on = $(this).is(':checked'); + vs.setSelectionEnabled(on); + $xpathRow.toggle(on && $wrapper.is(':visible')); + $clear.toggle(on && $wrapper.is(':visible')); + if (!on) { + $includeFilters.val(''); + } + }); + + showState('empty'); +}); diff --git a/changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html b/changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html index 4aef12d2..eb9233ec 100644 --- a/changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +++ b/changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -2,42 +2,94 @@ {%- block content -%} {%- from '_helpers.html' import render_simple_field, render_field, render_nolabel_field -%} -
+
- + + + +
{{ _('Add a new web page change detection watch') }} -
- {{ render_nolabel_field(form.url, placeholder="https://...", required=true) }} - {{ render_nolabel_field(form.watch_submit_button, title=_("Watch this URL!") ) }} - {{ render_nolabel_field(form.edit_and_watch_submit_button, title=_("Edit first then Watch") ) }} + + +
+ {{ render_nolabel_field(form.url, placeholder="https://...", required=true, class="pure-input-1") }} +
- {% if llm_configured %} -
- -
- {% endif %} -
- {{ render_field(form.tags, value='', placeholder=_("Watch group / tag"), class="transparent-field") }} -
-
- {{ render_simple_field(form.processor) }} + +
+ + +
+
+ + {{ _('Enter a URL to get started!') }} + {{ _('Enter a URL in the input box above to get started.') }} +
+ + + + + + + + +
+ + +
+
+ {{ render_simple_field(form.processor) }} +
+ +
+ + {{ _('Hover & click the preview to watch just one part of the page.') }} + +
+ + {% if llm_configured %} +
+ + +
+ {% endif %} + +
+ {{ render_field(form.tags, value='', placeholder=_("Watch group / tag"), class="transparent-field") }} +
+ +
+ {{ render_nolabel_field(form.watch_submit_button, title=_("Watch this URL!")) }} + {{ render_nolabel_field(form.edit_and_watch_submit_button, title=_("Edit first then Watch")) }} +
+
+
-
-
-

{{ _('Live activity') }}

-

{{ _('Recent additions and live check status will appear here.') }}

-
- {{ _('Waiting for activity…') }} -
-
-
+ + + + {%- endblock -%} diff --git a/changedetectionio/blueprint/browser_steps/__init__.py b/changedetectionio/blueprint/browser_steps/__init__.py index 8666b345..58be9a95 100644 --- a/changedetectionio/blueprint/browser_steps/__init__.py +++ b/changedetectionio/blueprint/browser_steps/__init__.py @@ -131,6 +131,47 @@ async def _close_session_resources(session_data, label=''): logger.warning(f"Error stopping playwright context{label}: {e}") +async def acquire_browser_for_fetcher(fetcher_name, proxy=None, keepalive_ms=None): + """Acquire a Playwright browser for the given fetcher backend. + + Mirrors normal fetching: fetchers that launch their own browser (e.g. CloakBrowser) + provide get_browsersteps_browser(); otherwise we connect over CDP to the configured + Playwright/sockpuppetbrowser driver. Returns (browser, playwright_context). + """ + from changedetectionio import content_fetchers + from playwright.async_api import async_playwright + + logger.debug(f"acquire_browser_for_fetcher: requested fetcher='{fetcher_name}', proxy={'yes' if proxy else 'no'}, keepalive_ms={keepalive_ms}") + + browser = None + playwright_context = None + + # If the fetcher has its own browser launch (runs locally rather than via CDP), use it. + fetcher_class = getattr(content_fetchers, fetcher_name, None) if fetcher_name else None + if fetcher_class and hasattr(fetcher_class, 'get_browsersteps_browser'): + logger.debug(f"acquire_browser_for_fetcher: fetcher '{fetcher_name}' provides its own browser, launching locally") + result = await fetcher_class.get_browsersteps_browser(proxy=proxy, keepalive_ms=keepalive_ms) + if result is not None: + browser, playwright_context = result + logger.info(f"acquire_browser_for_fetcher: using fetcher-specific browser for '{fetcher_name}'") + else: + logger.debug(f"acquire_browser_for_fetcher: '{fetcher_name}' returned no browser, falling back to CDP") + else: + logger.debug(f"acquire_browser_for_fetcher: fetcher '{fetcher_name}' has no get_browsersteps_browser(), using CDP") + + # Default: connect to the remote Playwright/sockpuppetbrowser via CDP + if browser is None: + base_url = os.getenv('PLAYWRIGHT_DRIVER_URL', '').strip('"') + logger.debug(f"acquire_browser_for_fetcher: connecting over CDP to '{base_url}' for fetcher '{fetcher_name}'") + playwright_context = await async_playwright().start() + a = "?" if '?' not in base_url else '&' + connect_url = base_url + a + f"timeout={keepalive_ms}" + browser = await playwright_context.chromium.connect_over_cdp(connect_url, timeout=keepalive_ms) + logger.info(f"acquire_browser_for_fetcher: connected over CDP for fetcher '{fetcher_name}'") + + return browser, playwright_context + + def cleanup_expired_sessions(): """Remove expired browsersteps sessions and cleanup their resources""" global browsersteps_sessions, browsersteps_watch_to_session @@ -222,36 +263,14 @@ def construct_blueprint(datastore: ChangeDetectionStore): proxy['password'] = parsed.password logger.debug(f"Browser Steps: UUID {watch_uuid} selected proxy {proxy_url}") - # Resolve the fetcher class for this watch so we can ask it to launch its own browser + # Resolve the fetcher backend for this watch so we can ask it to launch its own browser # if it supports that (e.g. CloakBrowser, which runs locally rather than via CDP) watch = datastore.data['watching'][watch_uuid] - from changedetectionio import content_fetchers fetcher_name = watch.get_fetch_backend or 'system' if fetcher_name == 'system': fetcher_name = datastore.data['settings']['application'].get('fetch_backend', 'html_requests') - fetcher_class = getattr(content_fetchers, fetcher_name, None) - browser = None - playwright_context = None - - # If the fetcher has its own browser launch for the live steps UI, use it. - # get_browsersteps_browser(proxy, keepalive_ms) returns (browser, playwright_context_or_None) - # or None to fall back to the default CDP path. - if fetcher_class and hasattr(fetcher_class, 'get_browsersteps_browser'): - result = await fetcher_class.get_browsersteps_browser(proxy=proxy, keepalive_ms=keepalive_ms) - if result is not None: - browser, playwright_context = result - logger.debug(f"Browser Steps: using fetcher-specific browser for '{fetcher_name}'") - - # Default: connect to the remote Playwright/sockpuppetbrowser via CDP - if browser is None: - playwright_instance = async_playwright() - playwright_context = await playwright_instance.start() - base_url = os.getenv('PLAYWRIGHT_DRIVER_URL', '').strip('"') - a = "?" if '?' not in base_url else '&' - base_url += a + f"timeout={keepalive_ms}" - browser = await playwright_context.chromium.connect_over_cdp(base_url, timeout=keepalive_ms) - logger.debug(f"Browser Steps: using CDP connection to {base_url}") + browser, playwright_context = await acquire_browser_for_fetcher(fetcher_name, proxy=proxy, keepalive_ms=keepalive_ms) browsersteps_start_session['browser'] = browser browsersteps_start_session['playwright_context'] = playwright_context diff --git a/changedetectionio/blueprint/settings/templates/settings.html b/changedetectionio/blueprint/settings/templates/settings.html index e6f5747c..9ae1da9f 100644 --- a/changedetectionio/blueprint/settings/templates/settings.html +++ b/changedetectionio/blueprint/settings/templates/settings.html @@ -288,6 +288,10 @@ nav {{ render_field(form.application.form.pager_size) }} {{ _('Number of items per page in the watch overview list, 0 to disable.') }}
+
+ {{ render_field(form.application.form.ui.form.timeago_format) }} + {{ _('How "Last Checked" and "Last Changed" times are shown in the watch overview list.') }} +
diff --git a/changedetectionio/blueprint/ui/views.py b/changedetectionio/blueprint/ui/views.py index 903087b5..0535d74b 100644 --- a/changedetectionio/blueprint/ui/views.py +++ b/changedetectionio/blueprint/ui/views.py @@ -30,6 +30,11 @@ def construct_blueprint(datastore: ChangeDetectionStore, update_q, queuedWatchMe extras = {'paused': add_paused, 'processor': processor} if llm_intent: extras['llm_intent'] = llm_intent + + # Filters picked with the Add Watch visual selector ("by element" mode) + include_filters = [l.strip() for l in request.form.get('include_filters', '').split('\n') if l.strip()] + if include_filters: + extras['include_filters'] = include_filters new_uuid = datastore.add_watch(url=url, tag=request.form.get('tags','').strip(), extras=extras) if new_uuid: diff --git a/changedetectionio/blueprint/watchlist/templates/watch-overview.html b/changedetectionio/blueprint/watchlist/templates/watch-overview.html index 6a725dd1..c28e5c3d 100644 --- a/changedetectionio/blueprint/watchlist/templates/watch-overview.html +++ b/changedetectionio/blueprint/watchlist/templates/watch-overview.html @@ -220,7 +220,7 @@ window.watchOverviewI18n = { #
- +
@@ -350,6 +350,16 @@ window.watchOverviewI18n = { {{ price }} {{ cur }} {%- endif -%} + {%- set price_change_pct = restock.get_price_change_percent() -%} + {%- if price_change_pct is not none -%} + {%- set prev_price = restock.get_prev_price() -%} + {%- set prev_disp = (prev_price|format_number_locale ~ ' ' ~ cur) if prev_price is number else prev_price -%} + {%- if price_change_pct < 0 -%} + ▼ {{ '%g'|format(price_change_pct) }}% + {%- else -%} + ▲ +{{ '%g'|format(price_change_pct) }}% + {%- endif -%} + {%- endif -%} {%- endif -%} {%- elif not watch.has_restock_info -%} {{ _('No information') }} diff --git a/changedetectionio/flask_app.py b/changedetectionio/flask_app.py index f8155f85..7e9c506e 100644 --- a/changedetectionio/flask_app.py +++ b/changedetectionio/flask_app.py @@ -268,24 +268,26 @@ def _jinja2_filter_datetime(watch_obj, format="%Y-%m-%d %H:%M:%S"): if watch_obj['last_checked'] == 0: return gettext('Not yet') - locale = get_timeago_locale(str(get_locale())) + short = datastore.data['settings']['application'].get('ui', {}).get('timeago_format') == 'short' + locale = get_timeago_locale(str(get_locale()), short=short) try: return timeago.format(int(watch_obj['last_checked']), time.time(), locale) except: # Fallback to English if locale not supported by timeago - return timeago.format(int(watch_obj['last_checked']), time.time(), 'en') + return timeago.format(int(watch_obj['last_checked']), time.time(), 'en_short' if short else 'en') @app.template_filter('format_timestamp_timeago') def _jinja2_filter_datetimestamp(timestamp, format="%Y-%m-%d %H:%M:%S"): if not timestamp: return gettext('Not yet') - locale = get_timeago_locale(str(get_locale())) + short = datastore.data['settings']['application'].get('ui', {}).get('timeago_format') == 'short' + locale = get_timeago_locale(str(get_locale()), short=short) try: return timeago.format(int(timestamp), time.time(), locale) except: # Fallback to English if locale not supported by timeago - return timeago.format(int(timestamp), time.time(), 'en') + return timeago.format(int(timestamp), time.time(), 'en_short' if short else 'en') @app.template_filter('pagination_slice') diff --git a/changedetectionio/forms.py b/changedetectionio/forms.py index 7f1fbc47..d2804d39 100644 --- a/changedetectionio/forms.py +++ b/changedetectionio/forms.py @@ -1074,6 +1074,9 @@ class globalSettingsApplicationUIForm(Form): socket_io_enabled = BooleanField(_l('Realtime UI Updates Enabled'), default=True, validators=[validators.Optional()]) favicons_enabled = BooleanField(_l('Favicons Enabled'), default=True, validators=[validators.Optional()]) use_page_title_in_list = BooleanField(_l('Use page in watch overview list')) #BooleanField=True + timeago_format = SelectField(_l('Relative time format'), + choices=[('long', _l('Long (1 minute ago)')), ('short', _l('Short (1m ago)'))], + default='long', validators=[validators.Optional()]) # datastore.data['settings']['application'].. class globalSettingsApplicationForm(commonSettingsForm): diff --git a/changedetectionio/languages.py b/changedetectionio/languages.py index aa4428df..935d5d6a 100644 --- a/changedetectionio/languages.py +++ b/changedetectionio/languages.py @@ -6,7 +6,7 @@ import os from pathlib import Path -def get_timeago_locale(flask_locale): +def get_timeago_locale(flask_locale, short=False): """ Convert Flask-Babel locale codes to timeago library locale codes. @@ -23,10 +23,19 @@ def get_timeago_locale(flask_locale): Args: flask_locale (str): Flask-Babel locale code (e.g., 'cs', 'zh', 'pt') + short (bool): Return a compact "1m ago" style locale instead of "1 minute ago". + timeago only ships 'en_short'; the other short locales are registered + by register_short_timeago_locales() below. Unsupported languages fall + back to 'en_short' so short mode is always honoured. Returns: - str: timeago library locale code (e.g., 'en', 'zh_CN', 'pt_PT') + str: timeago library locale code (e.g., 'en', 'zh_CN', 'pt_PT', 'de_short') """ + if short: + # Short forms are translated through the normal gettext (.po/.mo) workflow rather than + # timeago's bundled per-language tables; build + register the table for this locale. + return register_short_timeago_locale(flask_locale) + locale_map = { 'zh': 'zh_CN', # Chinese Simplified # timeago library just hasn't been updated to use the more modern locale naming convention, before BCP 47 / RFC 5646. @@ -45,6 +54,82 @@ def get_timeago_locale(flask_locale): } return locale_map.get(flask_locale, flask_locale) + +# --- Short ("1m ago") timeago locales ------------------------------------------------- +# +# timeago only ships 'en_short' and resolves a locale by name via +# __import__('timeago.locales.<name>'), which checks sys.modules first. So we register a table +# at runtime per locale. Rather than hard-code a table per language, the short strings are +# routed through the normal gettext (.po/.mo) workflow: the rows below are wrapped in +# lazy_gettext (_l) so `python setup.py extract_messages` picks them up, and they resolve to +# the active locale when rendered. Translators maintain the short forms in messages.po just +# like every other string. +# +# 14 rows of (past, future) following timeago's index order: +# now, Ns, 1m, Nm, 1h, Nh, 1d, Nd, 1w, Nw, 1mo, Nmo, 1yr, Nyr ('%s' = the number) +# The English source strings double as the gettext msgids. + +def _build_short_timeago_rows(): + from flask_babel import lazy_gettext as _l + return [ + (_l('just now'), _l('right now')), + (_l('%ss ago'), _l('in %ss')), + (_l('1m ago'), _l('in 1m')), + (_l('%sm ago'), _l('in %sm')), + (_l('1h ago'), _l('in 1h')), + (_l('%sh ago'), _l('in %sh')), + (_l('1d ago'), _l('in 1d')), + (_l('%sd ago'), _l('in %sd')), + (_l('1w ago'), _l('in 1w')), + (_l('%sw ago'), _l('in %sw')), + (_l('1mo ago'), _l('in 1mo')), + (_l('%smo ago'), _l('in %smo')), + (_l('1yr ago'), _l('in 1yr')), + (_l('%syr ago'), _l('in %syr')), + ] + + +_short_timeago_rows = None +_registered_short_locales = set() + + +def register_short_timeago_locale(flask_locale): + """ + Build the short timeago table for `flask_locale` from the gettext catalog and register it + under a synthetic name so timeago.format(..., <name>) can use it. Returns the locale name + to hand to timeago (falls back to the bundled 'en_short' if anything goes wrong). + + The table is resolved with flask_babel.force_locale so it is correct regardless of which + locale is active, and cached per language so the gettext lookups happen only once each. + """ + name = 'cd_short_' + str(flask_locale).replace('-', '_') + if name in _registered_short_locales: + return name + + try: + import sys + import types + import timeago.locales as timeago_locales + from flask_babel import force_locale + + global _short_timeago_rows + if _short_timeago_rows is None: + _short_timeago_rows = _build_short_timeago_rows() + + with force_locale(str(flask_locale)): + table = [[str(past), str(future)] for past, future in _short_timeago_rows] + + mod_name = 'timeago.locales.' + name + mod = types.ModuleType(mod_name) + mod.LOCALE = table + sys.modules[mod_name] = mod + setattr(timeago_locales, name, mod) + _registered_short_locales.add(name) + return name + except Exception: + # Outside an app context, or any unexpected failure -> bundled English short locale. + return 'en_short' + # Language metadata: flag icon CSS class and native name # Using flag-icons library: https://flagicons.lipis.dev/ LANGUAGE_DATA = { diff --git a/changedetectionio/model/App.py b/changedetectionio/model/App.py index c40f182c..76c297a0 100644 --- a/changedetectionio/model/App.py +++ b/changedetectionio/model/App.py @@ -78,7 +78,8 @@ class model(dict): 'use_page_title_in_list': True, 'open_diff_in_new_tab': True, 'socket_io_enabled': True, - 'favicons_enabled': True + 'favicons_enabled': True, + 'timeago_format': 'long', # 'long' = "1 minute ago", 'short' = "1m ago" }, } } diff --git a/changedetectionio/processors/restock_diff/__init__.py b/changedetectionio/processors/restock_diff/__init__.py index 9b659ec9..99e3571a 100644 --- a/changedetectionio/processors/restock_diff/__init__.py +++ b/changedetectionio/processors/restock_diff/__init__.py @@ -45,7 +45,8 @@ class Restock(dict): 'in_stock': None, 'price': None, 'currency': None, - 'original_price': None + 'original_price': None, + 'prev_price': None # price at the previous check, for the watch-list up/down arrow (display only) } # Initialize the dictionary with default values @@ -66,6 +67,31 @@ class Restock(dict): super().__setitem__(key, value) + def get_prev_price(self): + """Price at the previous check. Falls back to original_price for watches + saved before prev_price existed. Returns a float or None.""" + prev = self.get('prev_price') + if prev is None: + prev = self.get('original_price') + return prev + + def get_price_change_percent(self): + """Signed % change of the current price vs the previous price, rounded to one + decimal place (e.g. -18.0, 5.3). Returns None when it can't be computed - + no/zero previous price, non-numeric values, or no change.""" + try: + price = float(self.get('price')) + prev = self.get_prev_price() + prev = float(prev) if prev is not None else None + except (TypeError, ValueError): + return None + + if prev is None or prev == 0: + return None + + pct = round((price - prev) / prev * 100.0, 1) + return pct if pct != 0 else None + def get_price_from_history_str(history_str): m = _price_re.search(history_str) if not m: diff --git a/changedetectionio/processors/restock_diff/plugins/llm_restock.py b/changedetectionio/processors/restock_diff/plugins/llm_restock.py index be328edb..ba6e0ba4 100644 --- a/changedetectionio/processors/restock_diff/plugins/llm_restock.py +++ b/changedetectionio/processors/restock_diff/plugins/llm_restock.py @@ -86,7 +86,7 @@ SYSTEM_PROMPT = ( 'No markdown, no backticks, no explanation — pure JSON only.' ) -_MAX_CONTENT_CHARS = 8_000 +_MAX_CONTENT_CHARS = 20_000 def _extract_jsonld(html_content: str) -> str: diff --git a/changedetectionio/processors/restock_diff/processor.py b/changedetectionio/processors/restock_diff/processor.py index ecf6b132..763456e8 100644 --- a/changedetectionio/processors/restock_diff/processor.py +++ b/changedetectionio/processors/restock_diff/processor.py @@ -564,10 +564,14 @@ class perform_site_check(difference_detection_processor): # Main detection method fetched_md5 = None - # store original price if not set - if itemprop_availability and itemprop_availability.get('price') and not itemprop_availability.get('original_price'): - itemprop_availability['original_price'] = itemprop_availability.get('price') - update_obj['restock']["original_price"] = itemprop_availability.get('price') + # Original price = the price at the FIRST check. Set it once and then preserve it across + # every later check (display only) so the watch list can show "first seen" alongside the + # current price. (Previously this was re-set to the current price on every check.) + old_original_price = (watch.get('restock') or {}).get('original_price') + if old_original_price is not None: + update_obj['restock']['original_price'] = old_original_price + elif update_obj['restock'].get('price') is not None: + update_obj['restock']['original_price'] = update_obj['restock'].get('price') if not self.fetcher.instock_data and not itemprop_availability.get('availability') and not itemprop_availability.get('price'): raise ProcessorException( @@ -594,6 +598,18 @@ class perform_site_check(difference_detection_processor): logger.warning(f"Setting instock to FALSE, scraper found '{self.fetcher.instock_data}' in the body but metadata reported not-in-stock") update_obj['restock']["in_stock"] = False + # Remember the price from *before the last actual price change* so the watch list can + # show a persistent up/down arrow. Only bump prev_price when the price really changed - + # otherwise an unchanged check would overwrite it and we'd lose the comparison point. + # Display only - not part of the snapshot/md5, so it never affects change detection. + old_restock = watch.get('restock') or {} + old_price = old_restock.get('price') + new_price = update_obj['restock'].get('price') + if new_price is not None and old_price is not None and new_price != old_price: + update_obj['restock']['prev_price'] = old_price # price moved: remember what we moved from + else: + update_obj['restock']['prev_price'] = old_restock.get('prev_price') # unchanged: keep the existing reference + # What we store in the snapshot price = update_obj.get('restock').get('price') if update_obj.get('restock').get('price') else "" snapshot_content = f"In Stock: {update_obj.get('restock').get('in_stock')} - Price: {price}" diff --git a/changedetectionio/realtime/socket_server.py b/changedetectionio/realtime/socket_server.py index e47f21eb..0e5989fb 100644 --- a/changedetectionio/realtime/socket_server.py +++ b/changedetectionio/realtime/socket_server.py @@ -1,6 +1,5 @@ -import timeago from flask_socketio import SocketIO -from flask_babel import gettext, get_locale +from flask_babel import gettext import time import os @@ -8,7 +7,6 @@ from loguru import logger from blinker import signal from changedetectionio import strtobool -from changedetectionio.languages import get_timeago_locale class SignalHandler: @@ -144,7 +142,7 @@ def handle_watch_update(socketio, **kwargs): # Emit the watch update to all connected clients from changedetectionio.flask_app import update_q - from changedetectionio.flask_app import _jinja2_filter_datetime + from changedetectionio.flask_app import _jinja2_filter_datetime, _jinja2_filter_datetimestamp from changedetectionio import worker_pool # Get list of watches that are currently running @@ -165,7 +163,8 @@ def handle_watch_update(socketio, **kwargs): 'has_error': True if error_texts else False, 'has_favicon': True if watch.get_favicon_filename() else False, 'history_n': watch.history_n, - 'last_changed_text': timeago.format(int(watch.last_changed), time.time(), get_timeago_locale(str(get_locale()))) if watch.history_n >= 2 and int(watch.last_changed) > 0 else gettext('Not yet'), + # Uses the same filter as the server-rendered list so the long/short (timeago_format) setting is honoured. + 'last_changed_text': _jinja2_filter_datetimestamp(int(watch.last_changed)) if watch.history_n >= 2 and int(watch.last_changed) > 0 else gettext('Not yet'), 'last_checked': watch.get('last_checked'), 'last_checked_text': _jinja2_filter_datetime(watch), 'notification_muted': True if watch.get('notification_muted') else False, diff --git a/changedetectionio/static/js/visual-selector.js b/changedetectionio/static/js/visual-selector.js index efb456e9..62b8bb0a 100644 --- a/changedetectionio/static/js/visual-selector.js +++ b/changedetectionio/static/js/visual-selector.js @@ -1,10 +1,34 @@ // Copyright (C) 2021 Leigh Morresi (dgtlmoon@gmail.com) // All rights reserved. // yes - this is really a hack, if you are a front-ender and want to help, please get in touch! +// +// Refactored into a reusable factory: window.initVisualSelector(opts) +// - edit.html drives it from stored screenshot + xpath-data URLs (auto-init at bottom of file) +// - the Add Watch UI drives it from inline snapshot data fetched on demand +// Both share the same hover/highlight/select core. -let runInClearMode = false; +window.initVisualSelector = function (opts) { + // ---- DOM references (passed in, no globals) ---- + const $selectorCanvasElem = opts.$canvas; + const $includeFiltersElem = opts.$includeFilters; + const $selectorBackgroundElem = opts.$background; + const $selectorCurrentXpathElem = opts.$xpathDisplay; // the inner <span> + const $fetchingUpdateNoticeElem = opts.$fetchingNotice || $(); + const $selectorWrapperElem = opts.$wrapper; + const $clearSelectorElem = opts.$clearButton || $(); -$(document).ready(() => { + // edit.html supplies an AJAX url for the element data; the add-watch UI supplies data inline + const xpathDataUrl = opts.xpathDataUrl; + const isImageProcessor = !!opts.processorIsImage; + // Stored watch screenshots are DPR-1, so X scales by the screenshot's natural width. + // The live browser-steps capture (used by Add Watch) may render at device-scale-factor != 1, + // so its X must scale by the page's CSS width (browser_width) instead - exactly like + // browser-steps.js does. Y always scales by the screenshot's natural height. + const scaleByBrowserWidth = !!opts.scaleByBrowserWidth; + + // ---- state ---- + let runInClearMode = false; + let selectionEnabled = opts.enableSelection !== false; let currentSelections = []; let currentSelection = null; let appendToList = false; @@ -22,16 +46,6 @@ $(document).ready(() => { let drawnBox = null; let resizeHandle = null; const HANDLE_SIZE = 8; - const isImageProcessor = $('input[value="image_ssim_diff"]').is(':checked'); - - - // Global jQuery selectors with "Elem" appended - const $selectorCanvasElem = $('#selector-canvas'); - const $includeFiltersElem = $("#include_filters"); - const $selectorBackgroundElem = $("img#selector-background"); - const $selectorCurrentXpathElem = $("#selector-current-xpath span"); - const $fetchingUpdateNoticeElem = $('.fetching-update-notice'); - const $selectorWrapperElem = $("#selector-wrapper"); // Color constants const FILL_STYLE_HIGHLIGHT = 'rgba(205,0,0,0.35)'; @@ -40,14 +54,10 @@ $(document).ready(() => { const FILL_STYLE_REDLINE = 'rgba(255,0,0, 0.1)'; const STROKE_STYLE_REDLINE = 'rgba(225,0,0,0.9)'; - $('#visualselector-tab').click(() => { - $selectorBackgroundElem.off('load'); - currentSelections = []; - bootstrapVisualSelector(); - }); - function clearReset() { - ctx.clearRect(0, 0, c.width, c.height); + if (ctx) { + ctx.clearRect(0, 0, c.width, c.height); + } if ($includeFiltersElem.val().length) { alert("Existing filters under the 'Filters & Triggers' tab were cleared."); @@ -87,23 +97,18 @@ $(document).ready(() => { } }); - $('#clear-selector').on('click', () => { + $clearSelectorElem.on('click', () => { clearReset(); }); - // So if they start switching between visualSelector and manual filters, stop it from rendering old filters - $('li.tab a').on('click', () => { - runInClearMode = true; - }); - if (!window.location.hash || window.location.hash !== '#visualselector') { - $selectorBackgroundElem.attr('src', ''); - return; - } + // ---- public: (re)load a screenshot + element data into the selector ---- + // source = { screenshotSrc: <url|dataURI>, xpathData: <object|undefined> } + function load(source) { + currentSelections = []; + runInClearMode = false; - bootstrapVisualSelector(); - - function bootstrapVisualSelector() { $selectorBackgroundElem + .off("load error") .on("error", () => { $fetchingUpdateNoticeElem.html("<strong>Ooops!</strong> The VisualSelector tool needs at least one fetched page, please unpause the watch and/or wait for the watch to complete fetching and then reload this page.") .css('color', '#bb0000'); @@ -111,16 +116,24 @@ $(document).ready(() => { }) .on('load', () => { console.log("Loaded background..."); - c = document.getElementById("selector-canvas"); + c = $selectorCanvasElem[0]; xctx = c.getContext("2d"); ctx = c.getContext("2d"); - fetchData(); + if (source.xpathData) { + // Inline data (add-watch snapshot) - no extra round trip needed + applyElementData(source.xpathData); + } else { + fetchData(); + } $selectorCanvasElem.off("mousemove mousedown"); - }) - .attr("src", screenshot_url); + }); - let s = `${$selectorBackgroundElem.attr('src')}?${new Date().getTime()}`; - $selectorBackgroundElem.attr('src', s); + // data: URIs must be used verbatim; real URLs get a cache-buster + let src = source.screenshotSrc; + if (src && src.indexOf('data:') !== 0) { + src = `${src}?${new Date().getTime()}`; + } + $selectorBackgroundElem.attr("src", src); } function alertIfFilterNotFound() { @@ -139,28 +152,32 @@ $(document).ready(() => { $fetchingUpdateNoticeElem.html("Fetching element data.."); $.ajax({ - url: watch_visual_selector_data_url, + url: xpathDataUrl, context: document.body }).done((data) => { - $fetchingUpdateNoticeElem.html("Rendering.."); - selectorData = data; - - sortScrapedElementsBySize(); - console.log(`Reported browser width from backend: ${data['browser_width']}`); - - // Little sanity check for the user, alert them if something missing - alertIfFilterNotFound(); - - setScale(); - reflowSelector(); - - // Initialize draw mode after everything is set up - initializeDrawMode(); - - $fetchingUpdateNoticeElem.fadeOut(); + applyElementData(data); }); } + function applyElementData(data) { + $fetchingUpdateNoticeElem.html("Rendering.."); + selectorData = data; + + sortScrapedElementsBySize(); + console.log(`Reported browser width from backend: ${data['browser_width']}`); + + // Little sanity check for the user, alert them if something missing + alertIfFilterNotFound(); + + setScale(); + reflowSelector(); + + // Initialize draw mode after everything is set up + initializeDrawMode(); + + $fetchingUpdateNoticeElem.fadeOut(); + } + function updateFiltersText() { // Assuming currentSelections is already defined and contains the selections let uniqueSelections = new Set(currentSelections.map(sel => (sel[0] === '/' ? `xpath:${sel.xpath}` : sel.xpath))); @@ -184,8 +201,16 @@ $(document).ready(() => { $selectorWrapperElem.attr('width', selectorImageRect.width); $('#visual-selector-heading').css('max-width', selectorImageRect.width + "px") - xScale = selectorImageRect.width / selectorImage.naturalWidth; - yScale = selectorImageRect.height / selectorImage.naturalHeight; + if (scaleByBrowserWidth && selectorData && selectorData['browser_width']) { + // xpath box coords are CSS pixels (getBoundingClientRect) and the scraper reports + // browser_width = window.innerWidth (also CSS px). The screenshot is displayed with a + // preserved aspect ratio, so a single uniform factor (displayed width / page CSS width) + // maps both axes in sync, regardless of the capture's device-pixel-ratio. + xScale = yScale = selectorImageRect.width / selectorData['browser_width']; + } else { + xScale = selectorImageRect.width / selectorImage.naturalWidth; + yScale = selectorImageRect.height / selectorImage.naturalHeight; + } ctx.strokeStyle = STROKE_STYLE_HIGHLIGHT; ctx.fillStyle = FILL_STYLE_REDLINE; @@ -194,8 +219,57 @@ $(document).ready(() => { $("#selector-current-xpath").css('max-width', selectorImageRect.width); } + function bindElementHandlers() { + // Store handler references for later use + elementHandlers.handleMouseMove = handleMouseMove.debounce(5); + elementHandlers.handleMouseDown = handleMouseDown.debounce(5); + elementHandlers.handleMouseLeave = highlightCurrentSelected.debounce(5); + + $selectorCanvasElem.bind('mousemove', elementHandlers.handleMouseMove); + $selectorCanvasElem.bind('mousedown', elementHandlers.handleMouseDown); + $selectorCanvasElem.bind('mouseleave', elementHandlers.handleMouseLeave); + } + + function handleMouseMove(e) { + if (!e.offsetX && !e.offsetY) { + const targetOffset = $(e.target).offset(); + e.offsetX = e.pageX - targetOffset.left; + e.offsetY = e.pageY - targetOffset.top; + } + + ctx.fillStyle = FILL_STYLE_HIGHLIGHT; + + selectorData['size_pos'].forEach(sel => { + if (e.offsetY > sel.top * yScale && e.offsetY < sel.top * yScale + sel.height * yScale && + e.offsetX > sel.left * yScale && e.offsetX < sel.left * yScale + sel.width * yScale) { + setCurrentSelectedText(sel.xpath); + drawHighlight(sel); + currentSelections.push(sel); + currentSelection = sel; + highlightCurrentSelected(); + currentSelections.pop(); + } + }) + } + + function setCurrentSelectedText(s) { + $selectorCurrentXpathElem[0].innerHTML = s; + } + + function drawHighlight(sel) { + ctx.strokeRect(sel.left * xScale, sel.top * yScale, sel.width * xScale, sel.height * yScale); + ctx.fillRect(sel.left * xScale, sel.top * yScale, sel.width * xScale, sel.height * yScale); + } + + function handleMouseDown() { + // If we are in 'appendToList' mode, grow the list, if not, just 1 + currentSelections = appendToList ? [...currentSelections, currentSelection] : [currentSelection]; + highlightCurrentSelected(); + updateFiltersText(); + } + function reflowSelector() { - $(window).resize(() => { + $(window).off('resize.visualselector').on('resize.visualselector', () => { setScale(); highlightCurrentSelected(); }); @@ -217,57 +291,13 @@ $(document).ready(() => { highlightCurrentSelected(); updateFiltersText(); - // Store handler references for later use - elementHandlers.handleMouseMove = handleMouseMove.debounce(5); - elementHandlers.handleMouseDown = handleMouseDown.debounce(5); - elementHandlers.handleMouseLeave = highlightCurrentSelected.debounce(5); - - $selectorCanvasElem.bind('mousemove', elementHandlers.handleMouseMove); - $selectorCanvasElem.bind('mousedown', elementHandlers.handleMouseDown); - $selectorCanvasElem.bind('mouseleave', elementHandlers.handleMouseLeave); - - function handleMouseMove(e) { - if (!e.offsetX && !e.offsetY) { - const targetOffset = $(e.target).offset(); - e.offsetX = e.pageX - targetOffset.left; - e.offsetY = e.pageY - targetOffset.top; - } - - ctx.fillStyle = FILL_STYLE_HIGHLIGHT; - - selectorData['size_pos'].forEach(sel => { - if (e.offsetY > sel.top * yScale && e.offsetY < sel.top * yScale + sel.height * yScale && - e.offsetX > sel.left * yScale && e.offsetX < sel.left * yScale + sel.width * yScale) { - setCurrentSelectedText(sel.xpath); - drawHighlight(sel); - currentSelections.push(sel); - currentSelection = sel; - highlightCurrentSelected(); - currentSelections.pop(); - } - }) + if (selectionEnabled) { + bindElementHandlers(); } - - - function setCurrentSelectedText(s) { - $selectorCurrentXpathElem[0].innerHTML = s; - } - - function drawHighlight(sel) { - ctx.strokeRect(sel.left * xScale, sel.top * yScale, sel.width * xScale, sel.height * yScale); - ctx.fillRect(sel.left * xScale, sel.top * yScale, sel.width * xScale, sel.height * yScale); - } - - function handleMouseDown() { - // If we are in 'appendToList' mode, grow the list, if not, just 1 - currentSelections = appendToList ? [...currentSelections, currentSelection] : [currentSelection]; - highlightCurrentSelected(); - updateFiltersText(); - } - } function highlightCurrentSelected() { + if (!xctx) return; xctx.fillStyle = FILL_STYLE_GREYED_OUT; xctx.strokeStyle = STROKE_STYLE_REDLINE; xctx.lineWidth = 3; @@ -279,6 +309,29 @@ $(document).ready(() => { }); } + // Toggle hover/click element selection on the fly (Add Watch "by element" mode) + function setSelectionEnabled(enabled) { + selectionEnabled = enabled; + if (!c) return; // not loaded yet, will respect the flag in reflowSelector + + if (enabled) { + if (!drawMode) { + bindElementHandlers(); + if ($selectorCurrentXpathElem.length) { + $selectorCurrentXpathElem[0].innerHTML = 'Hover over elements to select'; + } + } + } else { + $selectorCanvasElem.unbind('mousemove mousedown mouseleave'); + currentSelections = []; + $includeFiltersElem.val(''); + highlightCurrentSelected(); + if ($selectorCurrentXpathElem.length) { + $selectorCurrentXpathElem[0].innerHTML = ''; + } + } + } + // ============= BOX DRAWING MODE (for image_ssim_diff processor) ============= function initializeDrawMode() { @@ -646,4 +699,53 @@ $(document).ready(() => { drawStartX = x; drawStartY = y; } -}); \ No newline at end of file + + // ---- public API ---- + return { + load: load, + clear: clearReset, + setSelectionEnabled: setSelectionEnabled, + markClearMode: function () { runInClearMode = true; } + }; +}; + + +// --------------------------------------------------------------------------- +// Auto-init for the watch Edit page (edit.html), preserving previous behaviour. +// Detected by the presence of the `screenshot_url` global that edit.html sets. +// --------------------------------------------------------------------------- +$(document).ready(() => { + if (typeof screenshot_url === 'undefined') { + return; // Not the edit page - the Add Watch UI inits the selector itself + } + + const isImageProcessor = $('input[value="image_ssim_diff"]').is(':checked'); + + const vs = window.initVisualSelector({ + $canvas: $('#selector-canvas'), + $includeFilters: $("#include_filters"), + $background: $("img#selector-background"), + $xpathDisplay: $("#selector-current-xpath span"), + $fetchingNotice: $('.fetching-update-notice'), + $wrapper: $("#selector-wrapper"), + $clearButton: $('#clear-selector'), + xpathDataUrl: watch_visual_selector_data_url, + enableSelection: true, + processorIsImage: isImageProcessor, + }); + + $('#visualselector-tab').click(() => { + vs.load({screenshotSrc: screenshot_url}); + }); + + // So if they start switching between visualSelector and manual filters, stop it from rendering old filters + $('li.tab a').on('click', () => { + vs.markClearMode(); + }); + + if (window.location.hash === '#visualselector') { + vs.load({screenshotSrc: screenshot_url}); + } else { + $("img#selector-background").attr('src', ''); + } +}); diff --git a/changedetectionio/static/styles/scss/parts/_add-watch.scss b/changedetectionio/static/styles/scss/parts/_add-watch.scss new file mode 100644 index 00000000..a41ffeb9 --- /dev/null +++ b/changedetectionio/static/styles/scss/parts/_add-watch.scss @@ -0,0 +1,179 @@ +/* Add Watch UI - 3-pane workspace (top: URL+Go, left: live visual selector, right: options) */ + +#add-watch-ui { + + /* TOP : URL input + Go */ + #add-watch-url-row { + display: flex; + gap: 0.5rem; + align-items: stretch; + margin-bottom: 1rem; + + // render_nolabel_field wraps the input in a <span> + > span { + flex: 1 1 auto; + min-width: 0; + + input { + width: 100%; + } + } + + #add-watch-go { + flex: 0 0 auto; + white-space: nowrap; + } + } + + /* PANES */ + #add-watch-panes { + display: flex; + gap: 1rem; + align-items: stretch; + + @media (max-width: 900px) { + flex-direction: column; + } + } + + /* LEFT : live visual-selector preview */ + #add-watch-selector-pane { + flex: 1 1 62%; + min-width: 0; + min-height: 380px; + position: relative; + overflow: auto; // the pane scrolls for tall snapshots, NOT the wrapper - keeps img+canvas aligned + border: 1px solid var(--color-background-tab); + border-radius: 6px; + background: rgba(0, 0, 0, 0.15); + padding: 0.75rem; + + // Transient states fill and centre over the whole pane (only one is visible at a time) + #add-watch-empty-state, + #add-watch-spinner, + #add-watch-error { + position: absolute; + inset: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 0.6rem; + text-align: center; + padding: 2rem 1rem; + } + + #add-watch-empty-state { + opacity: 0.8; + + svg { + opacity: 0.55; + } + + strong { + font-size: 1.05rem; + } + + span { + font-size: 0.85rem; + opacity: 0.8; + max-width: 32ch; + } + } + + #add-watch-spinner { + gap: 1.2rem; + + .spinner { + font-size: 5px; // scales the em-based spinner up a little + } + + .fetching-update-notice { + font-size: 0.85rem; + opacity: 0.85; + } + } + + #add-watch-error { + color: #ffb4b4; + font-size: 0.9rem; + word-break: break-word; + } + + // Pin the highlight canvas exactly over the screenshot. The shared selector CSS + // (parts/_visualselector.scss) positions the img absolutely + canvas in-flow inside + // an overflow-y:scroll wrapper, whose scrollbar gutter offsets the two in this + // narrower pane. Here the img drives the layout (in normal flow) and the canvas is + // overlaid on top, so they stay pixel-aligned regardless of scrollbars. + #selector-wrapper { + position: relative; + display: block; + width: 100%; + max-height: none; + overflow: visible; + text-align: left; + + > img { + position: relative; + display: block; + max-width: 100%; + height: auto; + z-index: 4; + } + + > canvas { + position: absolute; + top: 0; + left: 0; + max-width: none; + z-index: 5; + } + } + } + + /* RIGHT : options */ + #add-watch-options-pane { + flex: 0 0 34%; + min-width: 0; + display: flex; + flex-direction: column; + gap: 1.1rem; + + @media (max-width: 900px) { + flex: 1 1 auto; + } + + .add-watch-option-group { + label { + display: inline-block; + } + } + + #by-element-toggle-group { + .pure-form-message-inline { + display: block; + margin-top: 0.25rem; + font-size: 0.8rem; + opacity: 0.8; + } + + #clear-selector { + margin-top: 0.5rem; + } + } + + #quick-watch-llm-intent { + label { + display: block; + margin-bottom: 0.35rem; + } + } + + #add-watch-submit-row { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + margin-top: auto; // push the create buttons to the bottom of the pane + } + } +} diff --git a/changedetectionio/static/styles/scss/styles.scss b/changedetectionio/static/styles/scss/styles.scss index 567ff11d..5e6d0ea8 100644 --- a/changedetectionio/static/styles/scss/styles.scss +++ b/changedetectionio/static/styles/scss/styles.scss @@ -20,6 +20,7 @@ @use "parts/conditions_table"; @use "parts/socket"; @use "parts/visualselector"; +@use "parts/add-watch"; @use "parts/widgets"; @use "parts/diff_image"; @use "parts/modal"; @@ -210,12 +211,7 @@ body.spinner-active { } section.content { - @media only screen and (max-width: $desktop-wide-breakpoint) { - padding-top: 80px; - } - @media only screen and (min-width: $desktop-wide-breakpoint) { - padding-top: 100px; - } + padding-top: 80px; padding-bottom: 1em; flex-direction: column; @@ -1058,6 +1054,24 @@ ul { @extend .inline-tag; } +/* Price up/down indicator next to the restock price, e.g. "▼ -18%" */ +.price-change { + white-space: nowrap; + font-weight: 700; + font-size: 90%; + margin-left: 4px; + vertical-align: middle; + + /* Price dropped = good for a shopper = green; price rose = red */ + &.down { + color: var(--color-background-button-green); + } + + &.up { + color: var(--color-background-button-error); + } +} + #chrome-extension-link { img { height: 21px; diff --git a/changedetectionio/static/styles/styles.css b/changedetectionio/static/styles/styles.css index 42bb6e01..96117854 100644 --- a/changedetectionio/static/styles/styles.css +++ b/changedetectionio/static/styles/styles.css @@ -1 +1 @@ -ul#top-right-menu{list-style:none;margin:0;padding:0;display:grid;gap:.8rem;grid-auto-flow:column;grid-auto-columns:max-content;align-items:center}ul#top-right-menu .toggle-button{padding:0}.current-diff-url{flex:1 1 auto;min-width:0;overflow:hidden;white-space:nowrap;text-align:left;margin:0 .8rem;-webkit-mask-image:linear-gradient(to right, #000 calc(100% - 2.5em), transparent);mask-image:linear-gradient(to right, #000 calc(100% - 2.5em), transparent)}.current-diff-url span{overflow:visible;white-space:nowrap}:root{--body-main-text-size: 0.9rem;--color-white: #fff;--color-grey-50: #111;--color-grey-100: #262626;--color-grey-200: #333;--color-grey-300: #444;--color-grey-325: #555;--color-grey-350: #565d64;--color-grey-400: #666;--color-grey-500: #777;--color-grey-600: #999;--color-grey-700: #cbcbcb;--color-grey-750: #ddd;--color-grey-800: #e0e0e0;--color-grey-850: #eee;--color-grey-900: #f2f2f2;--color-black: #000;--color-dark-red: #a00;--color-light-red: #dd0000;--color-background-page: var(--color-grey-100);--color-background-gradient-first: #5ad8f7;--color-background-gradient-second: #2f50af;--color-background-gradient-third: #9150bf;--color-background: var(--color-white);--color-text: var(--color-grey-200);--color-link: #1b98f8;--color-menu-accent: #ed5900;--color-background-code: var(--color-grey-850);--color-error: var(--color-dark-red);--color-error-input: #ffebeb;--color-error-list: var(--color-light-red);--color-table-background: var(--color-background);--color-table-stripe: var(--color-grey-900);--color-text-tab: var(--color-white);--color-background-tab: rgba(255, 255, 255, 0.2);--color-background-tab-hover: rgba(255, 255, 255, 0.5);--color-text-tab-active: #222;--color-api-key: #0078e7;--color-background-button-primary: #0078e7;--color-background-button-green: #42dd53;--color-background-button-red: #dd4242;--color-background-button-success: rgb(28, 184, 65);--color-background-button-error: rgb(202, 60, 60);--color-text-button-error: var(--color-white);--color-background-button-warning: rgb(202, 60, 60);--color-text-button-warning: var(--color-white);--color-background-button-secondary: rgb(66, 184, 221);--color-background-button-cancel: rgb(200, 200, 200);--color-text-button: var(--color-white);--color-background-button-tag: rgb(99, 99, 99);--color-background-snapshot-age: #dfdfdf;--color-error-text-snapshot-age: var(--color-white);--color-error-background-snapshot-age: #ff0000;--color-background-button-tag-active: #9c9c9c;--color-text-messages: var(--color-white);--color-background-messages-message: rgba(255, 255, 255, .2);--color-background-messages-error: rgba(255, 1, 1, .5);--color-background-messages-notice: rgba(255, 255, 255, .5);--color-border-notification: #ccc;--color-background-checkbox-operations: rgba(0, 0, 0, 0.05);--color-warning: #ff3300;--color-border-warning: var(--color-warning);--color-text-legend: var(--color-white);--color-link-new-version: #e07171;--color-last-checked: #bbb;--color-text-footer: #444;--color-border-watch-table-cell: #eee;--color-text-watch-tag-list: rgba(231, 0, 105, 0.4);--color-background-new-watch-form: rgba(0, 0, 0, 0.05);--color-background-new-watch-input: var(--color-white);--color-background-new-watch-input-transparent: rgba(255, 255, 255, 0.1);--color-text-new-watch-input: var(--color-text);--color-border-input: var(--color-grey-500);--color-shadow-input: var(--color-grey-400);--color-background-input: var(--color-white);--color-text-input: var(--color-text);--color-text-input-description: var(--color-grey-500);--color-text-input-placeholder: var(--color-grey-600);--color-background-table-thead: var(--color-grey-800);--color-border-table-cell: var(--color-grey-700);--color-text-menu-heading: var(--color-grey-350);--color-text-menu-link: var(--color-grey-500);--color-background-menu-link-hover: var(--color-grey-850);--color-text-menu-link-hover: var(--color-grey-300);--color-shadow-jump: var(--color-grey-500);--color-icon-github: var(--color-black);--color-icon-github-hover: var(--color-grey-300);--color-watch-table-error: var(--color-dark-red);--color-watch-table-row-text: var(--color-grey-100);--highlight-trigger-text-bg-color: #1b98f8;--highlight-ignored-text-bg-color: var(--color-grey-700);--highlight-blocked-text-bg-color: rgb(202, 60, 60);--color-sidebar-bg: rgba(255, 255, 255, 0.97);--color-sidebar-text: var(--color-text);--color-sidebar-shadow: 6px 0 28px rgba(0, 0, 0, 0.18);--color-sidebar-item-hover-bg: rgba(0, 0, 0, 0.06);--color-sidebar-item-active-bg: rgba(0, 0, 0, 0.10)}html[data-darkmode=true]{--color-link: #59bdfb;--color-text: var(--color-white);--color-background-gradient-first: #3f90a5;--color-background-gradient-second: #1e316c;--color-background-gradient-third: #4d2c64;--color-background-new-watch-input: var(--color-grey-100);--color-background-new-watch-input-transparent: var(--color-grey-100);--color-text-new-watch-input: var(--color-text);--color-background-table-thead: var(--color-grey-200);--color-table-background: var(--color-grey-300);--color-table-stripe: var(--color-grey-325);--color-background: var(--color-grey-300);--color-text-menu-heading: var(--color-grey-850);--color-text-menu-link: var(--color-grey-800);--color-border-table-cell: var(--color-grey-400);--color-text-tab-active: var(--color-text);--color-border-input: var(--color-grey-400);--color-shadow-input: var(--color-grey-50);--color-background-input: var(--color-grey-350);--color-text-input-description: var(--color-grey-600);--color-text-input-placeholder: var(--color-grey-600);--color-text-watch-tag-list: rgba(250, 62, 146, 0.4);--color-background-code: var(--color-grey-200);--color-background-tab: rgba(0, 0, 0, 0.2);--color-background-tab-hover: rgba(0, 0, 0, 0.5);--color-background-snapshot-age: var(--color-grey-200);--color-shadow-jump: var(--color-grey-200);--color-icon-github: var(--color-white);--color-icon-github-hover: var(--color-grey-700);--color-watch-table-error: var(--color-light-red);--color-watch-table-row-text: var(--color-grey-800);--color-sidebar-bg: rgba(8, 10, 14, 0.97);--color-sidebar-text: var(--color-white);--color-sidebar-shadow: 6px 0 28px rgba(0, 0, 0, 0.45);--color-sidebar-item-hover-bg: rgba(255, 255, 255, 0.06);--color-sidebar-item-active-bg: rgba(255, 255, 255, 0.10)}html[data-darkmode=true] .icon-spread{filter:hue-rotate(-10deg) brightness(1.5)}html[data-darkmode=true] .watch-table .title-col a[target=_blank]::after,html[data-darkmode=true] .watch-table .current-diff-url::after{filter:invert(0.5) hue-rotate(10deg) brightness(2)}html[data-darkmode=true] .watch-table .status-browsersteps{filter:invert(0.5) hue-rotate(10deg) brightness(1.5)}html[data-darkmode=true] .watch-table .watch-controls .state-off img{opacity:.3}html[data-darkmode=true] .watch-table .watch-controls .state-on img{opacity:1}html[data-darkmode=true] .watch-table .unviewed{color:#fff}html[data-darkmode=true] .watch-table .unviewed.error{color:var(--color-watch-table-error)}.arrow{border:solid #1b98f8;border-width:0 2px 2px 0;display:inline-block;padding:3px}.arrow.right{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}.arrow.left{transform:rotate(135deg);-webkit-transform:rotate(135deg)}.arrow.up,.arrow.asc{transform:rotate(-135deg);-webkit-transform:rotate(-135deg)}.arrow.down,.arrow.desc{transform:rotate(45deg);-webkit-transform:rotate(45deg)}#browser_steps th{display:none}#browser_steps li{list-style:decimal;padding:5px}#browser_steps li.browser-step-with-error{background-color:#ffd6d6;border-radius:4px}#browser_steps li:not(:first-child):hover{opacity:1}#browser_steps li .control{padding-left:5px;padding-right:5px}#browser_steps li .control a{font-size:70%}#browser_steps li.empty{padding:0px;opacity:.35}#browser_steps li.empty .control{display:none}#browser_steps li:hover{background:#eee}#browser_steps li>label{display:none}@media only screen and (min-width: 760px){#browser-steps .flex-wrapper{display:flex;flex-flow:row;height:70vh;font-size:80%}#browser-steps .flex-wrapper #browser-steps-ui{flex-grow:1;flex-shrink:1;flex-basis:0;background-color:#eee;border-radius:5px}#browser-steps-fieldlist{flex-grow:0;flex-shrink:0;flex-basis:auto;max-width:400px;padding-left:1rem;overflow-y:scroll}#browsersteps-selector-wrapper{height:100% !important}}#browsersteps-selector-wrapper{width:100%;overflow-y:scroll;position:relative;height:80vh}#browsersteps-selector-wrapper>img{position:absolute;max-width:100%}#browsersteps-selector-wrapper>canvas{position:relative;max-width:100%}#browsersteps-selector-wrapper>canvas:hover{cursor:pointer}#browsersteps-selector-wrapper .loader{position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);z-index:100;max-width:350px;text-align:center}#browsersteps-selector-wrapper .spinner,#browsersteps-selector-wrapper .spinner:after{width:80px;height:80px;font-size:3px}#browsersteps-selector-wrapper #browsersteps-click-start{color:var(--color-grey-400)}#browsersteps-selector-wrapper #browsersteps-click-start:hover{cursor:pointer}ul#requests-extra_proxies{list-style:none}ul#requests-extra_proxies li>label{display:none}ul#requests-extra_proxies table tr{display:table-row}ul#requests-extra_proxies table tr input[type=text]{width:100%}@media only screen and (min-width: 1024px){ul#requests-extra_proxies table tr{display:inline}}#request label[for=proxy]{display:inline-block}body.proxy-check-active #request .proxy-check-details{font-size:80%;color:#555;display:block;padding-left:2em;max-width:500px}body.proxy-check-active #request .proxy-timing{font-size:80%;padding-left:1rem;color:var(--color-link)}#recommended-proxy{display:grid;gap:2rem;padding-bottom:1em}@media(min-width: 991px){#recommended-proxy{grid-template-columns:repeat(2, 1fr)}}#recommended-proxy>div{border:1px #aaa solid;border-radius:4px;padding:1em}#extra-proxies-setting{border:1px solid var(--color-grey-800);border-radius:4px;margin:1em;padding:1em}ul#requests-extra_browsers{list-style:none}ul#requests-extra_browsers li>label{display:none}ul#requests-extra_browsers table tr{display:table-row}ul#requests-extra_browsers table tr input[type=text]{width:100%}@media only screen and (min-width: 1280px){ul#requests-extra_browsers table tr{display:inline}ul#requests-extra_browsers table tr input[type=text]{width:100%}}#extra-browsers-setting{border:1px solid var(--color-grey-800);border-radius:4px;margin:1em;padding:1em}.pagination-page-info{text-transform:capitalize}.pagination.menu>*{display:inline-block}.pagination.menu li{display:inline-block}.pagination.menu a{padding:.65rem;margin:3px;border:none;background:#444;border-radius:2px;color:var(--color-text-button)}.pagination.menu a.disabled{display:none}.pagination.menu a.active{font-weight:bold;background:#888}.pagination.menu a:hover{background:#999}.spinner,.spinner:after{border-radius:50%;width:10px;height:10px}.spinner{margin:0px auto;font-size:3px;vertical-align:middle;display:inline-block;text-indent:-9999em;border-top:1.1em solid rgba(38,104,237,.2);border-right:1.1em solid rgba(38,104,237,.2);border-bottom:1.1em solid rgba(38,104,237,.2);border-left:1.1em solid #2668ed;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);-webkit-animation:load8 1.1s infinite linear;animation:load8 1.1s infinite linear}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.toggle-light-mode .icon-dark{display:none}html[data-darkmode=true] .toggle-light-mode .icon-light{display:none}html[data-darkmode=true] .toggle-light-mode .icon-dark{display:block}.pure-menu-link{padding:.5rem 1em;line-height:1.2rem}#menu-mute img,#menu-pause img{height:1.2rem}a.github-link{color:var(--color-text-menu-heading);margin:0;padding:0;height:1.8rem;display:block}a.github-link svg{fill:currentColor;height:100%}a.github-link:hover{color:var(--color-icon-github-hover)}.pure-menu-item{height:initial}.pure-menu-item svg{height:1.2rem}.pure-menu-item *{vertical-align:middle}.pure-menu-item .bi-heart:hover{cursor:pointer}.pure-menu-item.active .pure-menu-link{background-color:var(--color-background-menu-link-hover);color:var(--color-text-menu-heading)}.pure-menu-item .action-icon{stroke:var(--color-text-menu-heading)}.top-menu-list .action-label{color:var(--color-text-menu-heading)}@media only screen and (max-width: 768px){.top-menu-list .action-label{display:none}}#inline-menu-extras-group{list-style:none;margin:0;padding:0;display:grid;gap:.8rem;grid-auto-flow:column;grid-auto-columns:max-content;align-items:center}#overlay{opacity:.95;position:fixed;width:350px;max-width:100%;height:100%;top:0;right:-350px;background-color:var(--color-table-stripe);z-index:2;transform:translateX(0);transition:transform .5s ease}#overlay.visible{transform:translateX(-100%)}#overlay .content{font-size:.875rem;padding:1rem;margin-top:5rem;max-width:400px;color:var(--color-watch-table-row-text)}#heartpath{height:1.6rem;width:1.6rem;transition:all ease .3s !important}#heartpath:hover{fill:red !important;transition:all ease .3s !important}.minitabs-wrapper{width:100%}.minitabs-wrapper>div[id]{padding:20px;border:1px solid #ccc;border-top:none}.minitabs-wrapper .minitabs-content{width:100%;display:flex}.minitabs-wrapper .minitabs-content>div{flex:1 1 auto;min-width:0;overflow:scroll}.minitabs-wrapper .minitabs{display:flex;border-bottom:1px solid #ccc}.minitabs-wrapper .minitab{flex:1;text-align:center;padding:12px 0;text-decoration:none;color:#333;background-color:#f1f1f1;border:1px solid #ccc;border-bottom:none;cursor:pointer;transition:background-color .3s}.minitabs-wrapper .minitab:hover{background-color:#ddd}.minitabs-wrapper .minitab.active{background-color:#fff;font-weight:bold}@media(min-width: 800px){body.preview-text-enabled #filters-and-triggers>div{display:flex;gap:20px;position:relative}}body.preview-text-enabled #edit-text-filter,body.preview-text-enabled #text-preview{flex:1;align-self:flex-start}body.preview-text-enabled #edit-text-filter #pro-tips{display:none}body.preview-text-enabled #text-preview{position:sticky;top:20px;padding-top:1rem;padding-bottom:1rem;display:block !important}body.preview-text-enabled #activate-text-preview{background-color:var(--color-grey-500)}body.preview-text-enabled .monospace-preview{background:var(--color-background-input);border:1px solid var(--color-grey-600);padding:1rem;color:var(--color-text-input);font-family:"Courier New",Courier,monospace;font-size:70%;word-break:break-word;white-space:pre-wrap}#activate-text-preview{right:0;position:absolute;z-index:3;box-shadow:1px 1px 4px var(--color-shadow-jump)}#stats_row{display:flex;align-items:center;width:100%;color:#fff;font-size:.85rem}#stats_row>*{padding-bottom:.5rem}#stats_row .left{text-align:left}#stats_row .right{opacity:.5;transition:opacity .6s ease;margin-left:auto;text-align:right}body.has-queue #stats_row .right{opacity:1}.watch-table{width:100%;font-size:var(--body-main-text-size)}.watch-table .checkbox-uuid{text-align:center}.watch-table .checkbox-uuid>*{vertical-align:middle}.watch-table td,.watch-table th{vertical-align:middle}.watch-table tr{color:var(--color-watch-table-row-text)}.watch-table tr.unviewed{font-weight:bold}.watch-table tr td.inline.title-col{width:100%}.watch-table tr td.inline.title-col .grid-wrapper{display:grid;grid-template-columns:auto minmax(0, 1fr) auto;grid-auto-columns:auto;align-items:center;gap:.8rem}.watch-table tr td.inline.title-col .grid-wrapper>.favicon{grid-column:1}.watch-table tr td.inline.title-col .grid-wrapper>.watch-text-info{grid-column:2}.watch-table tr td.inline.title-col .grid-wrapper>.status-icons{grid-column:3}.watch-table tr td.inline.title-col .grid-wrapper>.restock-info-wrap{grid-column:4}@media only screen and (max-width: 1200px){.watch-table tr td.inline.title-col .grid-wrapper>.restock-info-wrap{grid-column:1/-1;justify-self:center}}.watch-table tr .watch-text-info{line-height:1.5}.watch-table tr.checking-now td:first-child{position:relative}.watch-table tr.checking-now td:first-child::before{content:"";position:absolute;top:0;bottom:0;left:0;width:3px;background-color:#293eff}.watch-table tr.checking-now td.last-checked .spinner-wrapper{display:inline-block !important}.watch-table tr.checking-now td.last-checked .innertext{display:none !important}.watch-table tr.queued a.recheck{display:none !important}.watch-table tr.queued a.already-in-queue-button{display:inline-block !important}.watch-table tr.paused a.pause-toggle.state-on{display:inline !important}.watch-table tr.paused a.pause-toggle.state-off{display:none !important}.watch-table tr.notification_muted a.mute-toggle.state-on{display:inline !important}.watch-table tr.notification_muted a.mute-toggle.state-off{display:none !important}.watch-table tr.has-error .error-text{display:block !important;color:var(--color-watch-table-error)}.watch-table tr.single-history a.preview-link{display:inline-block !important}.watch-table tr.multiple-history a.history-link{display:inline-block !important}.watch-table tr.has-favicon.unviewed img.favicon{opacity:1 !important}.watch-table td.buttons{font-size:12px;white-space:nowrap}.watch-table td.title-col{word-break:break-all;white-space:normal}.watch-table td.last-changed,.watch-table td.last-checked{text-align:center}.watch-table td a.external::after{content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAQElEQVR42qXKwQkAIAxDUUdxtO6/RBQkQZvSi8I/pL4BoGw/XPkh4XigPmsUgh0626AjRsgxHTkUThsG2T/sIlzdTsp52kSS1wAAAABJRU5ErkJggg==);margin:0 3px 0 5px}.watch-table td.watch-controls>div{display:flex;justify-content:space-between;align-items:center}.watch-table th#h-lastchanged,.watch-table th#h-lastchecked{text-align:center}.watch-table th a{font-weight:normal}.watch-table th a.active{font-weight:bolder}.watch-table th a.inactive .arrow{display:none}.watch-table th#mute-pause{white-space:nowrap}.watch-table th#mute-pause>div{display:flex;justify-content:space-between;align-items:center}.watch-table.favicon-not-enabled tr .favicon{display:none}.watch-table .status-icons{white-space:nowrap;display:flex;align-items:center;gap:4px}.watch-table .status-icons>*{vertical-align:middle}.watch-table .title-wrapper{display:flex;align-items:center;gap:10px}.watch-table .title-col-inner{display:inline-block;vertical-align:middle}.watch-table img.favicon{vertical-align:middle;max-width:36px;max-height:36px;height:36px}.watch-table img.favicon:hover{outline:2px solid color-mix(in srgb, var(--color-watch-table-row-text) 50%, transparent);outline-offset:1px;border-radius:4px}#watch-table-wrapper{display:inline-block;width:100%}#watch-table-wrapper #list-related-buttons{text-align:right;padding-top:1rem;margin-block-start:0;margin-block-end:0;padding-inline-start:0;margin:0}#watch-table-wrapper #list-related-buttons li{display:inline-block}#watch-table-wrapper #list-related-buttons a{border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-left-radius:0;border-bottom-right-radius:0}#watch-table-wrapper.has-error #list-related-buttons #post-list-with-errors{display:inline-block !important}#watch-table-wrapper.has-unread-changes #list-related-buttons #post-list-unread,#watch-table-wrapper.has-unread-changes #list-related-buttons #post-list-mark-views,#watch-table-wrapper.has-unread-changes #list-related-buttons #post-list-unread{display:inline-block !important}#watch-table-wrapper #tag-lister #tag-all{opacity:1}#watch-table-wrapper #tag-lister.active-tag .button-tag{opacity:.35}#watch-table-wrapper #tag-lister.active-tag .button-tag.active,#watch-table-wrapper #tag-lister.active-tag .button-tag:hover{opacity:1}.content .group-overview-table{width:100%}.content .group-overview-table .pure-button{margin-top:.3rem;margin-bottom:.3rem}.content .group-overview-table .watch-controls,.content .group-overview-table .watch-count{text-align:center}.content .group-overview-table td{padding:5px !important;color:var(--color-watch-table-row-text)}@media(max-width: 767px){.watch-table thead{display:block}.watch-table thead tr th{display:inline-block}.watch-table thead tr th .hide-on-mobile{display:none}.watch-table thead .empty-cell{display:none}.watch-table .last-checked::before{color:var(--color-text);content:attr(data-label) " "}.watch-table .last-changed::before{color:var(--color-text);content:attr(data-label) " "}.watch-table td.inline{display:inline-block}.watch-table .pure-table td,.watch-table .pure-table th{border:none}.watch-table td{border:none;border-bottom:1px solid var(--color-border-watch-table-cell);vertical-align:middle}.watch-table td:before{top:6px;left:6px;width:45%;padding-right:10px;white-space:nowrap}.watch-table.pure-table-striped tr{background-color:var(--color-table-background)}.watch-table.pure-table-striped tr:nth-child(2n-1){background-color:var(--color-table-stripe)}.watch-table.pure-table-striped tr:nth-child(2n-1) td{background-color:inherit}}@media(max-width: 767px){.watch-table tbody tr{padding-bottom:10px;padding-top:10px;display:grid;grid-template-columns:40px 1fr 100px;grid-template-rows:auto auto auto auto;gap:.5rem}.watch-table tbody tr .counter-i{display:none}.watch-table tbody tr>td{border-bottom:none}.watch-table tbody tr>td[colspan]{grid-column:1/-1}.watch-table tbody tr>td.title-col{grid-column:1/-1;grid-row:1}.watch-table tbody tr>td.title-col .watch-title{font-size:.92rem}.watch-table tbody tr>td.title-col .link-spread{display:none}.watch-table tbody tr>td.last-checked{grid-column:1/-1;grid-row:2}.watch-table tbody tr>td.last-changed{grid-column:1/-1;grid-row:3}.watch-table tbody tr>td.checkbox-uuid{grid-column:1;grid-row:4}.watch-table tbody tr>td.buttons{grid-column:2;grid-row:4;display:flex;align-items:center;justify-content:flex-start}.watch-table tbody tr>td.watch-controls{grid-column:3;grid-row:4;display:grid;place-items:center}.watch-table tbody tr>td.watch-controls a img{padding:10px}.pure-table td{padding:0 !important}}@media(min-width: 768px){.watch-table thead tr th .hide-on-desktop{display:none}}@media(min-width: 1600px){.watch-table td.last-checked .innertext,.watch-table td.last-changed .innertext{white-space:nowrap}}#llm-intent-section textarea{white-space:normal;overflow-wrap:break-word;overflow-x:hidden;overflow-y:auto;resize:vertical;font-family:inherit}ul#conditions_match_logic{list-style:none}ul#conditions_match_logic input,ul#conditions_match_logic label,ul#conditions_match_logic li{display:inline-block}ul#conditions_match_logic li{padding-right:1em}.fieldlist_formfields{width:100%;background-color:var(--color-background, #fff);border-radius:4px;border:1px solid var(--color-border-table-cell, #cbcbcb)}.fieldlist_formfields .fieldlist-header{display:flex;background-color:var(--color-background-table-thead, #e0e0e0);font-weight:bold;border-bottom:1px solid var(--color-border-table-cell, #cbcbcb)}.fieldlist_formfields .fieldlist-header-cell{flex:1;padding:.5em 1em;text-align:left}.fieldlist_formfields .fieldlist-header-cell:last-child{flex:0 0 120px}.fieldlist_formfields .fieldlist-body{display:flex;flex-direction:column}.fieldlist_formfields .fieldlist-row{display:flex;border-bottom:1px solid var(--color-border-table-cell, #cbcbcb)}.fieldlist_formfields .fieldlist-row:last-child{border-bottom:none}.fieldlist_formfields .fieldlist-row:nth-child(2n-1){background-color:var(--color-table-stripe, #f2f2f2)}.fieldlist_formfields .fieldlist-row.error-row{background-color:var(--color-error-input, #ffdddd)}.fieldlist_formfields .fieldlist-cell{flex:1;padding:.5em 1em;display:flex;flex-direction:column;justify-content:center}.fieldlist_formfields .fieldlist-cell input,.fieldlist_formfields .fieldlist-cell select{width:100%}.fieldlist_formfields .fieldlist-cell.fieldlist-actions{flex:0 0 120px;display:flex;flex-direction:row;align-items:center;gap:4px}.fieldlist_formfields ul.errors{margin-top:.5em;margin-bottom:0;padding:.5em;background-color:var(--color-error-background-snapshot-age, #ffdddd);border-radius:4px;list-style-position:inside}@media only screen and (max-width: 760px){.fieldlist_formfields .fieldlist-header,.fieldlist_formfields .fieldlist-row{flex-direction:column}.fieldlist_formfields .fieldlist-header-cell{display:none}.fieldlist_formfields .fieldlist-row{padding:.5em 0;border-bottom:2px solid var(--color-border-table-cell, #cbcbcb)}.fieldlist_formfields .fieldlist-cell{padding:.25em .5em}.fieldlist_formfields .fieldlist-cell.fieldlist-actions{flex:1;justify-content:flex-start;padding-top:.5em}.fieldlist_formfields .fieldlist-cell:not(:last-child){margin-bottom:.5em}.fieldlist_formfields .fieldlist-cell::before{content:attr(data-label);font-weight:bold;margin-bottom:.25em}}.fieldlist_formfields .addRuleRow,.fieldlist_formfields .removeRuleRow,.fieldlist_formfields .verifyRuleRow{cursor:pointer;border:none;padding:4px 8px;border-radius:3px;font-weight:bold;background-color:#aaa;color:var(--color-foreground-text, #fff)}.fieldlist_formfields .addRuleRow:hover,.fieldlist_formfields .removeRuleRow:hover,.fieldlist_formfields .verifyRuleRow:hover{background-color:#999}body.checking-now #checking-now-fixed-tab{display:block !important}#checking-now-fixed-tab{background:#ccc;border-radius:5px;bottom:0;color:var(--color-text);display:none;font-size:.8rem;left:0;padding:5px;position:fixed}#selector-wrapper{height:100%;text-align:center;max-height:70vh;overflow-y:scroll;position:relative}#selector-wrapper>img{position:absolute;z-index:4;max-width:100%}#selector-wrapper>canvas{position:relative;z-index:5;max-width:100%}#selector-wrapper>canvas:hover{cursor:pointer}#selector-current-xpath{font-size:80%}.ternary-radio-group{display:flex;gap:0;border:1px solid var(--color-grey-750);border-radius:4px;overflow:hidden;width:fit-content;background:var(--color-background)}.ternary-radio-group .ternary-radio-option{position:relative;cursor:pointer;margin:0;display:flex;align-items:center}.ternary-radio-group .ternary-radio-option input[type=radio]{position:absolute;opacity:0;width:0;height:0}.ternary-radio-group .ternary-radio-option .ternary-radio-label{padding:8px 16px;background:var(--color-grey-900);border:none;border-right:1px solid var(--color-grey-750);font-size:13px;font-weight:500;color:var(--color-text);transition:all .2s ease;cursor:pointer;display:block;text-align:center}.ternary-radio-group .ternary-radio-option:last-child .ternary-radio-label{border-right:none}.ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label{background:var(--color-link);color:var(--color-text-button);font-weight:600}.ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label.ternary-default{background:var(--color-grey-600);color:var(--color-text-button)}.ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label:hover{background:#1a7bc4}.ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label:hover.ternary-default{background:var(--color-grey-500)}.ternary-radio-group .ternary-radio-option:hover .ternary-radio-label{background:var(--color-grey-800)}@media(max-width: 480px){.ternary-radio-group{width:100%}.ternary-radio-group .ternary-radio-label{flex:1;min-width:auto}}input[type=radio].pure-radio:checked+label,input[type=radio].pure-radio:checked{background:var(--color-link);color:var(--color-text-button)}html[data-darkmode=true] .ternary-radio-group .ternary-radio-option .ternary-radio-label{background:var(--color-grey-350)}html[data-darkmode=true] .ternary-radio-group .ternary-radio-option:hover .ternary-radio-label{background:var(--color-grey-400)}html[data-darkmode=true] .ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label{background:var(--color-link);color:var(--color-text-button)}html[data-darkmode=true] .ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label.ternary-default{background:var(--color-grey-600)}html[data-darkmode=true] .ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label:hover{background:#1a7bc4}html[data-darkmode=true] .ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label:hover.ternary-default{background:var(--color-grey-500)}body.processor-image_ssim_diff #edit-text-filter .text-filtering{display:none}body.processor-image_ssim_diff #conditions-tab{display:none}.modal-dialog{border:none;border-radius:10px;padding:0;background:var(--color-background);color:var(--color-text);box-shadow:0 5px 20px rgba(0,0,0,.3);max-width:500px;width:90%}.modal-dialog::backdrop{background:rgba(0,0,0,.6);backdrop-filter:blur(3px);animation:fadeIn .2s ease-out}.modal-dialog[open]{animation:slideIn .25s ease-out}.modal-dialog .modal-header{padding:1.5rem;border-bottom:1px solid var(--color-border-table-cell);display:flex;align-items:center;gap:1rem}.modal-dialog .modal-header .modal-icon{font-size:2rem;line-height:1;flex-shrink:0}.modal-dialog .modal-header .modal-icon.warning{color:var(--color-warning)}.modal-dialog .modal-header .modal-icon.danger{color:var(--color-background-button-error)}.modal-dialog .modal-header .modal-icon.info{color:var(--color-background-button-primary)}.modal-dialog .modal-header .modal-title{font-size:1.3rem;font-weight:bold;margin:0;color:var(--color-text)}.modal-dialog .modal-body{padding:1.5rem;line-height:1.6}.modal-dialog .modal-body p{margin:0 0 1rem 0}.modal-dialog .modal-body p:last-child{margin-bottom:0}.modal-dialog .modal-body strong{color:var(--color-text);font-weight:600}.modal-dialog .modal-footer{padding:1rem 1.5rem;border-top:1px solid var(--color-border-table-cell);display:flex;gap:.75rem;justify-content:flex-end;background:var(--color-grey-900)}.modal-dialog .modal-footer button{padding:.6rem 1.5rem;border:none;border-radius:4px;cursor:pointer;font-weight:500;transition:all .2s ease;font-size:.95rem}.modal-dialog .modal-footer button:hover{transform:translateY(-1px);box-shadow:0 2px 8px rgba(0,0,0,.15)}.modal-dialog .modal-footer button:active{transform:translateY(0)}.modal-dialog .modal-footer button.modal-btn-cancel{background:var(--color-background-button-cancel);color:var(--color-grey-200)}.modal-dialog .modal-footer button.modal-btn-cancel:hover{background:var(--color-grey-700)}.modal-dialog .modal-footer button.modal-btn-confirm{background:var(--color-background-button-primary);color:var(--color-white)}.modal-dialog .modal-footer button.modal-btn-confirm:hover{opacity:.9}.modal-dialog .modal-footer button.modal-btn-danger{background:var(--color-background-button-error);color:var(--color-white)}.modal-dialog .modal-footer button.modal-btn-danger:hover{background:var(--color-dark-red)}.modal-dialog .modal-footer button.modal-btn-warning{background:var(--color-background-button-warning);color:var(--color-white)}.modal-dialog .modal-footer button.modal-btn-warning:hover{opacity:.9}html[data-darkmode=true] .modal-dialog{box-shadow:0 5px 30px rgba(0,0,0,.7)}html[data-darkmode=true] .modal-dialog .modal-footer{background:var(--color-grey-200)}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes slideIn{from{opacity:0;transform:translateY(-20px) scale(0.95)}to{opacity:1;transform:translateY(0) scale(1)}}@media only screen and (max-width: 760px){.modal-dialog{width:95%;max-width:none}.modal-dialog .modal-header{padding:1rem}.modal-dialog .modal-header .modal-title{font-size:1.1rem}.modal-dialog .modal-body{padding:1rem;font-size:.95rem}.modal-dialog .modal-footer{padding:.75rem 1rem;flex-wrap:wrap}.modal-dialog .modal-footer button{flex:1;min-width:120px}}#language-selector-flag{display:inline-block;width:1.2em;height:1.2em;vertical-align:middle;border-radius:50%;overflow:hidden;opacity:.6}#language-selector-flag:hover{opacity:1}.language-list{display:flex;flex-direction:column;gap:.5rem;padding:.5rem 0}.language-option{display:flex;align-items:center;gap:1rem;padding:.25rem;border-radius:4px;transition:background-color .2s ease;text-decoration:none;color:var(--color-text);border:1px solid rgba(0,0,0,0)}.language-option:hover{background-color:var(--color-background-menu-link-hover);border-color:var(--color-border-table-cell)}.language-option.active{background-color:var(--color-link);color:var(--color-text-button);font-weight:600}.language-option .flag{font-size:1.5rem;flex-shrink:0}.language-option .language-name{flex-grow:1;font-size:1rem}#language-modal .language-list .lang-option{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;margin-right:.5em;border-radius:50%;overflow:hidden}.action-sidebar{display:flex;flex-direction:column;align-items:center;width:190px;z-index:60;pointer-events:none}@media only screen and (max-width: 980px){.action-sidebar{display:none}}.action-sidebar-inner{pointer-events:auto;width:64px;overflow:hidden;transition:width .08s ease-out}body.actionsidebar-minimal .action-sidebar-inner:hover,body.actionsidebar-minimal .action-sidebar-inner:focus-within{width:190px;transition:width .22s cubic-bezier(0.2, 0.7, 0.2, 1)}body.actionside-bar-on .action-sidebar-inner{width:190px;transition:none}.action-sidebar-list{list-style:none;padding-right:0;padding-left:.4rem;margin:0;display:flex;flex-direction:column;gap:0}.action-sidebar-li{list-style:none;margin:0;position:relative;color:var(--color-white)}.action-sidebar-li>:first-child{padding-left:.4rem}.action-sidebar-li button{padding:0;margin:0}.action-sidebar-li a{color:var(--color-white)}.action-sidebar-li--spark .queue-spark{display:block;width:100%;height:15px;border-radius:3px;background:hsla(0,0%,100%,.05);box-shadow:inset 0 0 0 1px hsla(0,0%,100%,.06)}.action-sidebar-divider{height:1px;background:hsla(0,0%,100%,.18);margin:6px 16px;list-style:none}.action-sidebar .action-sidebar-item{position:relative;display:flex;align-items:center;width:100%;height:42px;font-size:var(--body-main-text-size);border-radius:8px;color:var(--color-white);text-decoration:none;white-space:nowrap;background:rgba(0,0,0,0);border:0;text-align:left;cursor:pointer;transition:background-color .12s ease,color .12s ease}.action-sidebar .action-sidebar-item:hover{background-color:var(--color-sidebar-item-hover-bg)}.action-sidebar .action-sidebar-item:hover .action-icon{stroke-width:2.3}.action-sidebar .action-sidebar-item:focus-visible{outline:2px solid var(--color-link);outline-offset:2px}.action-sidebar .action-sidebar-item.active .action-icon{stroke-width:2.4;filter:drop-shadow(0 0 0.4px currentColor)}.action-sidebar .action-sidebar-item.active .action-label{font-weight:700}.action-sidebar .action-sidebar-item.is-disabled{opacity:.45;cursor:not-allowed;pointer-events:none}.action-sidebar .action-sidebar-item.action-sidebar-item--accent .action-icon{stroke:#fff;stroke-width:2.6}.action-sidebar .action-sidebar-item .action-label{flex:0 0 auto;margin-left:14px;font-family:inherit;font-weight:400;letter-spacing:0;text-transform:none;color:inherit;opacity:0;transform:translateX(-4px);transition:opacity .05s ease-out,transform .05s ease-out}.action-sidebar .action-sidebar-item .action-badge{margin-left:10px;font-size:.6rem;line-height:1;padding:3px 7px;border-radius:999px;background:hsla(0,0%,100%,.14);color:hsla(0,0%,100%,.85);text-transform:uppercase;letter-spacing:.06em;font-weight:700;pointer-events:none;opacity:0;transition:opacity .05s ease-out}body.actionsidebar-minimal .action-sidebar-inner:hover .action-sidebar-item .action-label,body.actionsidebar-minimal .action-sidebar-inner:focus-within .action-sidebar-item .action-label{opacity:1;transform:translateX(0);transition:opacity .18s ease .05s,transform .18s cubic-bezier(0.2, 0.7, 0.2, 1) .05s}body.actionsidebar-minimal .action-sidebar-inner:hover .action-sidebar-item .action-badge,body.actionsidebar-minimal .action-sidebar-inner:focus-within .action-sidebar-item .action-badge{opacity:1;transition:opacity .18s ease .05s}body.actionside-bar-on .action-sidebar .action-sidebar-item .action-label{opacity:1;transform:translateX(0);transition:none}body.actionside-bar-on .action-sidebar .action-sidebar-item .action-badge{opacity:1;transition:none}.action-icon{flex:0 0 auto;width:24px;height:24px;stroke:currentColor;stroke-width:1.9;fill:none;stroke-linecap:round;stroke-linejoin:round}.action-badge{flex:0 0 auto;font-size:.62rem;text-transform:uppercase;letter-spacing:.08em;padding:2px 6px;border-radius:999px;background:hsla(0,0%,100%,.15);color:hsla(0,0%,100%,.85);font-weight:700}.mobile-menu-section{padding:.5rem .75rem;border-bottom:1px solid var(--color-border-table-cell)}.mobile-menu-section .action-sidebar-list{gap:1px}.mobile-menu-section .action-sidebar-item{position:relative;display:flex;align-items:center;justify-content:flex-start;gap:.85rem;width:100%;height:auto;padding:.75rem .75rem;border-radius:8px;color:var(--color-text)}.mobile-menu-section .action-sidebar-item:hover{background-color:var(--color-background-menu-link-hover);color:var(--color-text)}.mobile-menu-section .action-sidebar-item.active{background-color:var(--color-background-menu-link-hover);color:var(--color-text)}.mobile-menu-section .action-sidebar-item .action-label{position:static;transform:none;background:rgba(0,0,0,0);box-shadow:none;color:inherit;opacity:1;pointer-events:auto;padding:0;font-weight:500}.mobile-menu-section .action-sidebar-item .action-label::before{display:none}.mobile-menu-section .action-sidebar-item .action-badge{position:static;margin-left:auto;font-size:.62rem;background:rgba(0,0,0,.08);color:var(--color-text)}.mobile-menu-section .action-sidebar-item.action-sidebar-item--accent{background:var(--color-background-menu-link-hover);box-shadow:inset 0 0 0 1px var(--color-border-table-cell);color:var(--color-text)}.mobile-menu-section .action-sidebar-item.action-sidebar-item--accent .action-label{color:inherit}.mobile-menu-section .action-sidebar-item--button{background:rgba(0,0,0,0);border:none;cursor:pointer;text-align:left;font:inherit}#add-watch-live-info{width:100%;margin-top:1rem}#add-watch-live-info .add-watch-live-placeholder{border:1px dashed hsla(0,0%,100%,.25);background:hsla(0,0%,100%,.04);border-radius:10px;padding:1.25rem;color:var(--color-white)}#add-watch-live-info .add-watch-live-placeholder h3{margin:0 0 .4rem 0;font-size:1rem;letter-spacing:.02em}#add-watch-live-info .add-watch-live-placeholder .muted{opacity:.7;margin:0 0 .75rem 0;font-size:.85rem}#add-watch-live-info .add-watch-live-placeholder .add-watch-live-stream{font-size:.85rem;opacity:.6;padding:.6rem 0}.mobile-menu-drawer .action-sidebar-list{padding:0}.mobile-menu-drawer .mobile-menu-section .action-sidebar-item{padding-left:0}#queue-page{width:100%;color:var(--color-white)}#queue-page h2,#queue-page h3{color:var(--color-white)}#queue-page .queue-panel{background:var(--color-background-new-watch-form);padding:1em;border-radius:10px;margin-bottom:1em;width:100%;box-sizing:border-box;color:var(--color-white)}#queue-page .queue-stats{display:grid;grid-template-columns:repeat(auto-fit, minmax(160px, 1fr));gap:.75rem}#queue-page .queue-stat .label{font-size:.7rem;text-transform:uppercase;letter-spacing:.06em;opacity:.7}#queue-page .queue-stat .value{font-size:1.6rem;font-weight:700;color:var(--color-white)}#queue-page .queue-stat.queue-stat--action{display:flex;align-items:center;justify-content:flex-start}#queue-page .queue-stat.queue-stat--action .pure-button{white-space:nowrap}#queue-page table.pure-table{width:100%;background:rgba(0,0,0,0);color:var(--color-white);font-size:80%}#queue-page table.pure-table thead th{background:rgba(0,0,0,0);color:var(--color-white);border-bottom:1px solid hsla(0,0%,100%,.18);font-weight:700;white-space:nowrap}#queue-page table.pure-table td{color:var(--color-white);border-color:hsla(0,0%,100%,.08);white-space:nowrap}#queue-page table.pure-table td.title-col,#queue-page table.pure-table td.watch-cell{white-space:normal;word-break:break-all}#queue-page table.pure-table td.time-cell{font-variant-numeric:tabular-nums;color:hsla(0,0%,100%,.75);font-size:.95em}#queue-page table.pure-table code,#queue-page table.pure-table small,#queue-page table.pure-table em,#queue-page table.pure-table strong{color:var(--color-white)}#queue-page table.pure-table code{background:rgba(0,0,0,.18)}#queue-page table.pure-table small{opacity:.7}#queue-page table.pure-table-striped tr:nth-child(2n-1) td{background:hsla(0,0%,100%,.04)}#queue-page tr.is-completed td{opacity:.45;transition:opacity .4s ease}#queue-page tbody[data-section=workers]{border-bottom:1px solid hsla(0,0%,100%,.18)}#queue-page tr.worker-slot td{border-color:hsla(0,0%,100%,.05)}#queue-page tr.worker-idle td{background:hsla(0,0%,100%,.02)}#queue-page .inline-tag,#queue-page .processor-badge,#queue-page .watch-tag-list,#queue-page .tracking-ldjson-price-data,#queue-page .restock-label{background:hsla(0,0%,100%,.14);color:var(--color-white)}#queue-page .inline-tag--running{background:rgba(28,184,65,.45)}#queue-page .inline-tag--idle{background:hsla(0,0%,100%,.08);color:hsla(0,0%,100%,.6)}#queue-page .inline-tag--done{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.7)}#queue-page a.queue-cancel{display:inline-block;margin-left:8px;font-size:.75rem;color:hsla(0,0%,100%,.65);text-decoration:underline;text-decoration-style:dotted;text-underline-offset:2px}#queue-page a.queue-cancel:hover{color:var(--color-white);text-decoration-style:solid}#queue-page a.queue-cancel.is-busy{pointer-events:none;opacity:.5}#queue-page tr.is-new td{animation:queue-row-in .45s ease}@keyframes queue-row-in{from{background-color:rgba(28,184,65,.18)}to{background-color:rgba(0,0,0,0)}}#queue-page .queue-waiting{display:none;align-items:center;gap:.5rem;margin-top:1rem;padding:.5rem 0;color:hsla(0,0%,100%,.7);font-size:.85rem}#queue-page .queue-waiting[data-show=true]{display:flex}#queue-page .queue-waiting .spinner{margin:0;flex:0 0 auto;border-top-color:hsla(0,0%,100%,.18);border-right-color:hsla(0,0%,100%,.18);border-bottom-color:hsla(0,0%,100%,.18);border-left-color:var(--color-white)}.hamburger-menu{display:none;background:rgba(0,0,0,0);border:none;cursor:pointer;padding:.5rem;z-index:10001;position:relative}@media only screen and (max-width: 980px){.hamburger-menu{display:flex;flex-direction:column;justify-content:center;align-items:center}}.hamburger-icon{width:24px;height:20px;position:relative;display:flex;flex-direction:column;justify-content:space-between}.hamburger-icon span{display:block;height:3px;width:100%;background:var(--color-text);border-radius:2px;transition:all .3s cubic-bezier(0.68, -0.55, 0.265, 1.55);transform-origin:center}.hamburger-menu.active .hamburger-icon span:nth-child(1){transform:translateY(8.5px) rotate(45deg)}.hamburger-menu.active .hamburger-icon span:nth-child(2){opacity:0;transform:translateX(-10px)}.hamburger-menu.active .hamburger-icon span:nth-child(3){transform:translateY(-8.5px) rotate(-45deg)}.mobile-menu-overlay{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);z-index:9999;opacity:0;transition:opacity .3s ease}.mobile-menu-overlay.active{display:block;opacity:1}.mobile-menu-drawer{position:fixed;top:0;right:-280px;width:280px;height:100%;background:var(--color-background);opacity:1;box-shadow:-2px 0 8px rgba(0,0,0,.15);z-index:10000;transition:right .3s cubic-bezier(0.68, -0.55, 0.265, 1.55);overflow-y:auto;padding-top:60px}.mobile-menu-drawer.active{right:0}.mobile-menu-drawer .mobile-menu-items{list-style:none;padding:1rem 0;margin:0}.mobile-menu-drawer .mobile-menu-items li{border-bottom:1px solid var(--color-border-table-cell)}.mobile-menu-drawer .mobile-menu-items li>*{display:block;padding:1rem 1.5rem;color:var(--color-text);text-decoration:none;font-weight:500;transition:background .2s ease}.mobile-menu-drawer .mobile-menu-items li>*:hover{background:var(--color-background-menu-link-hover)}.mobile-menu-drawer .mobile-menu-items li#menu-pause,.mobile-menu-drawer .mobile-menu-items li#menu-mute{display:none}.logo-cdio{font-weight:bold;font-size:1.1rem}.logo-cdio .logo-cd{color:var(--color-grey-500)}.logo-cdio .logo-io{color:var(--color-text)}.menu-always-visible{display:flex;align-items:center;gap:.5rem;margin-left:auto}@media only screen and (max-width: 980px){#top-right-menu .menu-collapsible{display:none !important}.pure-menu-horizontal{overflow-x:visible !important}#nav-menu{overflow-x:visible !important}}@media only screen and (min-width: 1025px){.hamburger-menu,.mobile-menu-drawer,.mobile-menu-overlay{display:none !important}}html[data-darkmode=true] .mobile-menu-drawer{box-shadow:-2px 0 8px rgba(0,0,0,.4)}#search-modal .modal-body{padding:2rem 1.5rem}#search-modal .modal-body .pure-control-group{padding-bottom:0}#search-modal .modal-body .pure-control-group label{display:block;margin-bottom:.5rem;font-size:.9rem;font-weight:600;color:var(--color-text)}#search-modal .modal-body .pure-control-group #search-modal-input{width:100%;max-width:100%;box-sizing:border-box;padding:.6rem .8rem;font-size:1rem;border:1px solid var(--color-border-input);border-radius:4px;background-color:var(--color-background-input);color:var(--color-text-input);box-shadow:inset 0 1px 3px var(--color-shadow-input);transition:border-color .2s ease,box-shadow .2s ease}#search-modal .modal-body .pure-control-group #search-modal-input:focus{outline:none;border-color:var(--color-link);box-shadow:0 0 0 3px rgba(27,152,248,.1)}#search-modal .modal-body .pure-control-group #search-modal-input::placeholder{color:var(--color-text-input-placeholder);opacity:.7}html[data-darkmode=true] #search-modal #search-modal-input:focus{box-shadow:0 0 0 3px rgba(89,189,251,.15)}#llm-diff-summary-area{margin:.6rem 0 .4rem;padding:.65rem .9rem;background:linear-gradient(135deg, rgba(120, 80, 200, 0.18), rgba(80, 160, 220, 0.14));border-left:3px solid rgba(140,90,220,.8);border-radius:0 4px 4px 0;min-width:0;max-width:100%;box-sizing:border-box;overflow:hidden}#llm-diff-summary-area .llm-diff-summary-label{display:block;font-size:.7rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;opacity:.55;margin-bottom:.25rem}#llm-diff-summary-area .llm-diff-summary-text{margin:0;font-size:.9rem;line-height:1.5;white-space:pre-wrap;overflow-wrap:break-word;word-break:break-word}.llm-diff-summary-prompt{margin:.4em 0 0;font-size:.78rem;font-style:italic;overflow:hidden;max-height:3.8em;animation:llm-prompt-reveal .7s ease-out both}.llm-diff-summary-prompt .llm-diff-summary-prompt-text{display:block;opacity:.55;mask-image:linear-gradient(to bottom, rgba(0, 0, 0, 0.85) 30%, rgba(0, 0, 0, 0) 100%);-webkit-mask-image:linear-gradient(to bottom, rgba(0, 0, 0, 0.85) 30%, rgba(0, 0, 0, 0) 100%);white-space:pre-wrap;overflow-wrap:break-word;line-height:1.45}@keyframes llm-prompt-reveal{from{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:translateY(0)}}.llm-diff-summary-loading{opacity:.5;font-style:italic;animation:llm-pulse 1.4s ease-in-out infinite;font-weight:bold}@keyframes llm-pulse{0%,100%{opacity:.5}50%{opacity:.2}}.llm-budget-exceeded,.llm-error{color:#c0392b;font-weight:600;font-style:normal;opacity:1}.toggle-ai-mode{opacity:.4;transition:opacity .2s ease,filter .2s ease;display:inline-flex;align-items:center;color:var(--color-text-menu-link)}.toggle-ai-mode svg{height:1.2rem;width:1.2rem}.toggle-ai-mode .ai-mode-label{font-size:.75rem;font-weight:600;letter-spacing:.04em;line-height:1}html[data-ai-mode=true] .toggle-ai-mode{opacity:1;filter:drop-shadow(0 0 4px rgba(160, 100, 255, 0.7))}.btn-label-summary{display:none}html[data-ai-mode=true] body.llm-configured .btn-label-history{display:none}html[data-ai-mode=true] body.llm-configured .btn-label-summary{display:inline}.ai-inline-summary-row td{white-space:normal !important;word-break:break-word;padding:.5rem 1rem .6rem 1.4rem !important;background:linear-gradient(135deg, #f0ebff, #eaf0ff) !important;border-top:1px solid #c4b5fd !important;border-left:3px solid #8b5cf6 !important;color:#1a0640 !important;font-size:.85rem;line-height:1.5}html[data-darkmode=true] .ai-inline-summary-row td{background:linear-gradient(135deg, #1c0d35, #0d1535) !important;border-top:1px solid #3b1f6e !important;border-left-color:#8b5cf6 !important;color:#e9d5ff !important}.ai-inline-summary-row .ai-inline-summary-content{display:flex;gap:.5rem;align-items:flex-start}.ai-inline-summary-row .ai-inline-summary-content .ai-inline-spinner{flex-shrink:0;animation:llm-pulse 1.4s ease-in-out infinite}.ai-inline-summary-row .ai-inline-summary-content .ai-inline-body{display:flex;flex-direction:column;min-width:0}.ai-inline-summary-row .ai-inline-summary-content .ai-inline-text{font-style:italic;opacity:.75;white-space:pre-wrap}.ai-inline-summary-row .ai-inline-summary-content.loaded .ai-inline-spinner{animation:none}.ai-inline-summary-row .ai-inline-summary-content.loaded .ai-inline-text{font-style:normal;opacity:1}.ai-inline-summary-row .ai-inline-history-link{display:inline-block;margin-top:.4rem;font-size:.78rem;font-weight:700;opacity:.7;white-space:nowrap}.ai-inline-summary-row .ai-inline-history-link:hover{opacity:1}.ai-inline-summary-row .ai-inline-error{color:#c0392b}.ai-inline-summary-row .ai-inline-prompt{display:block;margin-top:.3em;font-size:.75rem;font-style:italic;overflow:hidden;max-height:3.6em;animation:llm-prompt-reveal .6s ease-out both;mask-image:linear-gradient(to bottom, rgba(0, 0, 0, 0.7) 30%, rgba(0, 0, 0, 0) 100%);-webkit-mask-image:linear-gradient(to bottom, rgba(0, 0, 0, 0.7) 30%, rgba(0, 0, 0, 0) 100%);opacity:.55;line-height:1.4;white-space:pre-wrap;overflow-wrap:break-word}.action-sidebar-item{position:relative}.action-sidebar-item .notification-bubble{position:absolute;top:8px;left:8px;min-width:18px;height:18px;background:#f44;color:#fff;font-size:10px;font-weight:700;line-height:18px;text-align:center;border-radius:9px;padding:0 2px;box-shadow:0 2px 4px rgba(0,0,0,.3);pointer-events:none;transition:all .2s ease;display:none}.action-sidebar-item .notification-bubble.red-bubble{background:#f44}.action-sidebar-item .notification-bubble.blue-bubble{background:#4a9eff;color:#fff}.action-sidebar-item .notification-bubble.visible{display:block}.action-sidebar-item .notification-bubble.pulse{animation:bubblePulse .4s ease-out}.action-sidebar-item .notification-bubble.large-number{font-size:8px;min-width:20px;height:20px;line-height:20px;border-radius:10px}@keyframes bubblePulse{0%{transform:scale(1)}50%{transform:scale(1.3)}100%{transform:scale(1)}}html[data-darkmode=true] .notification-bubble{box-shadow:0 2px 6px rgba(0,0,0,.6)}.toast-container{position:fixed;display:flex;flex-direction:column;gap:.75rem;pointer-events:none;z-index:10000}.toast-container.toast-top-right{top:20px;right:20px}.toast-container.toast-top-center{top:100px;left:50%;transform:translateX(-50%)}.toast-container.toast-top-left{top:20px;left:20px}.toast-container.toast-bottom-right{bottom:20px;right:20px}.toast-container.toast-bottom-center{bottom:20px;left:50%;transform:translateX(-50%)}.toast-container.toast-bottom-left{bottom:20px;left:20px}.toast{position:relative;display:flex;align-items:center;gap:.75rem;min-width:300px;max-width:500px;padding:1rem 1.25rem;background:var(--color-background);border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,.15),0 0 0 1px rgba(0,0,0,.05);pointer-events:auto;overflow:hidden;opacity:0;transform:translateY(-50px);transition:all .3s cubic-bezier(0.68, -0.55, 0.265, 1.55);font-family:inherit}.toast.toast-show{opacity:1;transform:translateY(0)}.toast.toast-hide{opacity:0;transform:translateY(-50px) scale(0.95)}.toast.toast-success{border-left:4px solid #10b981}.toast.toast-success .toast-icon{color:#10b981}.toast.toast-error{border-left:4px solid #ef4444}.toast.toast-error .toast-icon{color:#ef4444}.toast.toast-warning{border-left:4px solid #f59e0b}.toast.toast-warning .toast-icon{color:#f59e0b}.toast.toast-info{border-left:4px solid #3b82f6}.toast.toast-info .toast-icon{color:#3b82f6}.toast.toast-default{border-left:4px solid var(--color-grey-500)}.toast-icon{flex-shrink:0;width:24px;height:24px}.toast-icon svg{width:100%;height:100%}.toast-message{flex:1;font-size:.875rem;line-height:1.5;color:var(--color-text);word-break:break-word;font-family:inherit}.toast-close{flex-shrink:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,0);border:none;border-radius:4px;color:var(--color-grey-500);font-size:1.5rem;line-height:1;cursor:pointer;transition:all .2s ease;padding:0;margin-left:.25rem}.toast-close:hover{background:var(--color-grey-800);color:var(--color-text)}.toast-close:active{transform:scale(0.95)}.toast-progress{position:absolute;bottom:0;left:0;right:0;height:3px;background:currentColor;opacity:.3;transform-origin:left;transition:transform linear}html[data-darkmode=true] .toast{background:var(--color-grey-300);box-shadow:0 4px 12px rgba(0,0,0,.4),0 0 0 1px hsla(0,0%,100%,.05)}html[data-darkmode=true] .toast-close:hover{background:var(--color-grey-400)}@media only screen and (max-width: 768px){.toast-container{left:50% !important;right:auto !important;top:80px !important;transform:translateX(-50%) !important;align-items:center}.toast-container.toast-bottom-right,.toast-container.toast-bottom-center,.toast-container.toast-bottom-left{top:auto !important;bottom:80px !important}.toast{min-width:auto;max-width:none;width:80vw;transform:translateY(-100px)}.toast.toast-show{transform:translateY(0)}.toast.toast-hide{transform:translateY(-100px) scale(0.95)}}@media(prefers-reduced-motion: reduce){.toast{transition:opacity .2s ease;transform:none !important}.toast.toast-show{opacity:1}.toast.toast-hide{opacity:0}}.login-form{min-height:52vh;display:flex;align-items:center;justify-content:center;padding:2rem 1rem}.login-form .inner{background:var(--color-background);border-radius:16px;box-shadow:0 10px 40px rgba(0,0,0,.08),0 2px 8px rgba(0,0,0,.04);padding:3rem 2.5rem;width:100%;max-width:420px;position:relative;overflow:hidden;transition:transform .3s ease,box-shadow .3s ease}.login-form .inner:hover{box-shadow:0 15px 50px rgba(0,0,0,.12),0 5px 15px rgba(0,0,0,.06)}.login-form form{margin:0}.login-form fieldset{border:none;padding:0;margin:0}.login-form .pure-control-group{margin-bottom:1.75rem}.login-form .pure-control-group:last-of-type{margin-bottom:0;margin-top:2rem}.login-form label{display:block;margin-bottom:.5rem;font-weight:600;font-size:.9rem;color:var(--color-text);letter-spacing:.01em}.login-form input[type=password]{width:100%;padding:.875rem 1rem;border:2px solid var(--color-grey-800);border-radius:8px;font-size:1rem;background:var(--color-background-input);color:var(--color-text-input);transition:all .2s ease;box-sizing:border-box}.login-form input[type=password]:focus{outline:none;border-color:var(--color-link);box-shadow:0 0 0 3px rgba(27,152,248,.1);transform:translateY(-1px)}.login-form input[type=password]::placeholder{color:var(--color-text-input-placeholder)}.login-form button[type=submit]{width:100%;padding:.875rem 1.5rem;font-size:1rem;font-weight:600;border-radius:8px;border:none;background:var(--color-background-button-primary);color:var(--color-text-button);cursor:pointer;transition:all .2s ease;box-shadow:0 2px 8px rgba(27,152,248,.2)}.login-form button[type=submit]:hover{box-shadow:0 4px 12px rgba(27,152,248,.3);background:#06c}.login-form button[type=submit]:active{transform:translateY(0);box-shadow:0 2px 4px rgba(27,152,248,.2)}.content-main>ul.messages{position:fixed;top:120px;left:50%;transform:translateX(-50%);list-style:none;padding:0;margin:0;z-index:1000;min-width:300px;max-width:500px}.content-main>ul.messages li{padding:1rem 1.25rem;border-radius:8px;font-size:.95rem;line-height:1.5;font-weight:500;box-shadow:0 4px 12px rgba(0,0,0,.15);animation:slideDown .3s ease-out;border:2px solid rgba(0,0,0,0)}.content-main>ul.messages li.error{background:#fee;border:2px solid #ef4444;color:#991b1b;font-weight:600}.content-main>ul.messages li.success{background:#f0fdf4;border:2px solid #10b981;color:#166534}.content-main>ul.messages li.info,.content-main>ul.messages li.message{background:#eff6ff;border:2px solid #3b82f6;color:#1e40af}@keyframes slideDown{from{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}html[data-darkmode=true] .login-form .inner{box-shadow:0 10px 40px rgba(0,0,0,.4),0 2px 8px rgba(0,0,0,.2)}html[data-darkmode=true] .login-form .inner:hover{box-shadow:0 15px 50px rgba(0,0,0,.5),0 5px 15px rgba(0,0,0,.3)}html[data-darkmode=true] .login-form input[type=password]{border-color:var(--color-grey-400)}html[data-darkmode=true] .login-form input[type=password]:focus{border-color:var(--color-link)}html[data-darkmode=true] .content-main>ul.messages li{box-shadow:0 4px 12px rgba(0,0,0,.4)}html[data-darkmode=true] .content-main>ul.messages li.error{background:#4a1d1d;border-color:#ef4444;color:#fca5a5}html[data-darkmode=true] .content-main>ul.messages li.success{background:#1a3a2a;border-color:#10b981;color:#86efac}html[data-darkmode=true] .content-main>ul.messages li.info,html[data-darkmode=true] .content-main>ul.messages li.message{background:#1e3a5f;border-color:#3b82f6;color:#93c5fd}@media only screen and (max-width: 768px){.login-form{min-height:auto;padding:1rem .5rem;padding-top:5rem}.login-form .inner{padding:2rem 1.5rem;border-radius:12px}.content-main>ul.messages{top:70px;left:10px;right:10px;transform:none;min-width:auto}}body.wrapped-tabs .tabs ul{grid-template-columns:repeat(auto-fill, minmax(var(--tab-width, 180px), 1fr));grid-auto-flow:row;grid-auto-columns:unset;gap:0;column-gap:5px}body.wrapped-tabs .tabs ul li{border-radius:0}.tabs ul{margin:0px;padding:0px;display:grid;grid-auto-flow:column;grid-auto-columns:max-content;gap:5px;list-style:none}.tabs ul li{white-space:nowrap;color:var(--color-text-tab);border-top-left-radius:5px;border-top-right-radius:5px;background-color:var(--color-background-tab)}.tabs ul li:not(.active):hover{background-color:var(--color-background-tab-hover)}.tabs ul li.active,.tabs ul li :target{background-color:var(--color-background)}.tabs ul li.active a,.tabs ul li :target a{color:var(--color-text-tab-active);font-weight:bold}.tabs ul li a{display:block;padding:.7em;color:var(--color-text-tab)}.stab-shell{display:flex;align-items:stretch;background:var(--color-background);border:1px solid rgba(0,0,0,.08);border-radius:8px;overflow:hidden;box-shadow:0 2px 8px rgba(0,0,0,.05);margin-bottom:1.5rem}.stab-nav{display:flex;flex-direction:column;width:11rem;flex-shrink:0;padding:.75rem 0;gap:1px;background:linear-gradient(180deg, rgba(0, 0, 0, 0.03) 0%, rgba(0, 0, 0, 0.05) 100%);border-right:1px solid rgba(0,0,0,.07)}.stab-btn{position:relative;display:flex;align-items:center;gap:.5rem;padding:.65rem .9rem .65rem 1rem;width:100%;background:none;border:none;border-left:3px solid rgba(0,0,0,0);border-radius:0;cursor:pointer;font:inherit;color:var(--color-text);text-align:left;opacity:.65;transition:background .12s ease,opacity .12s ease,border-color .12s ease,color .12s ease}.stab-btn:hover{background:rgba(0,0,0,.04);opacity:.85}.stab-btn.active{border-left-color:var(--color-menu-accent);background:rgba(237,89,0,.07);color:var(--color-menu-accent);font-weight:700;opacity:1}.stab-btn .stab-icon{font-size:.95rem;width:1.1rem;text-align:center;flex-shrink:0;opacity:.8}.stab-body{flex:1;min-width:0;padding:1.4rem 1.6rem;overflow-x:hidden}.stab-pane{visibility:hidden;height:0;overflow:hidden}.stab-pane.active{visibility:visible;height:auto;overflow:visible;animation:stab-enter .16s ease both}@keyframes stab-enter{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}.stab-overview-hero{margin-bottom:1.5rem}.stab-overview-hero h3{margin:0 0 .3rem;font-size:1.05rem}.stab-overview-hero .stab-overview-glyph{color:var(--color-menu-accent);margin-right:.2rem}.stab-overview-hero p{margin:0;font-size:.88rem;color:var(--color-text-input-description);max-width:44rem;line-height:1.55}.stab-overview-features{display:flex;flex-direction:column;gap:.7rem;margin-bottom:1.6rem}.stab-overview-feature{display:flex;gap:.85rem;align-items:flex-start;padding:.75rem 1rem;border-radius:6px;background:rgba(0,0,0,.022);border:1px solid rgba(0,0,0,.05);transition:background .12s ease}.stab-overview-feature:hover{background:rgba(0,0,0,.035)}.stab-overview-feature .stab-overview-icon{font-size:1.1rem;width:1.6rem;flex-shrink:0;text-align:center;padding-top:.05rem;opacity:.7}.stab-overview-feature .stab-overview-text>strong{display:block;margin-bottom:.2rem}.stab-overview-feature .stab-overview-text p{color:var(--color-text-input-description)}.stab-overview-disclaimer{display:flex;gap:.75rem;align-items:flex-start;margin:0 0 1.1rem;padding:.85rem 1rem;border-radius:6px;border:1px solid rgba(211,136,0,.35);background:rgba(255,180,0,.07)}.stab-overview-disclaimer .stab-disclaimer-icon{font-size:1.15rem;flex-shrink:0;padding-top:.05rem;color:#c07800}.stab-overview-disclaimer .stab-disclaimer-body{font-size:.85rem;line-height:1.55}.stab-overview-disclaimer .stab-disclaimer-body>strong{display:block;margin-bottom:.35rem;color:#8a5500;font-size:.87rem}.stab-overview-disclaimer .stab-disclaimer-body p{margin:0 0 .45rem;color:var(--color-text-input-description)}.stab-overview-disclaimer .stab-disclaimer-body ul{margin:0 0 .6rem;padding-left:1.25rem;color:var(--color-text-input-description)}.stab-overview-disclaimer .stab-disclaimer-body ul li{margin-bottom:.2rem}.stab-overview-disclaimer .stab-disclaimer-check{display:flex;gap:.5rem;align-items:flex-start;cursor:pointer;font-size:.82rem;color:var(--color-text-input-description);font-weight:600}.stab-overview-disclaimer .stab-disclaimer-check input[type=checkbox]{flex-shrink:0;margin-top:.18rem;cursor:pointer}.stab-overview-cta{margin-top:.4rem;display:flex;align-items:center;gap:.8rem;flex-wrap:wrap}.stab-configured-badge{display:inline-flex;align-items:center;gap:.4rem;padding:.35rem .75rem;background:rgba(39,174,96,.09);border:1px solid rgba(39,174,96,.28);border-radius:4px;color:#2a7a4e;font-size:.82rem;font-weight:600}.stab-section-title{font-size:.72rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;opacity:.45;margin:1.4rem 0 .6rem}.stab-section-title:first-child{margin-top:0}@media(max-width: 600px){.stab-shell{flex-direction:column;min-height:unset}.stab-nav{width:100%;border-right:none;border-bottom:1px solid rgba(0,0,0,.07);padding:.4rem 0}.stab-body{padding-left:1rem}}.llm-usage-grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(12rem, 1fr));gap:.9rem;margin-bottom:1.4rem}.llm-stat-card{padding:1rem 1.1rem .85rem;border-radius:7px;background:rgba(0,0,0,.025);border:1px solid rgba(0,0,0,.07)}.llm-stat-card .llm-stat-label{font-size:.7rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;opacity:.4;margin-bottom:.4rem}.llm-stat-card .llm-stat-value{font-size:1.65rem;font-weight:700;letter-spacing:-0.02em;line-height:1;margin-bottom:.25rem}.llm-stat-card .llm-stat-sub{font-size:.79rem;opacity:.5}.llm-stat-card .llm-stat-budget-text{font-size:.77rem;opacity:.55;margin-top:.3rem}.llm-stat-bar-wrap{height:4px;border-radius:2px;background:rgba(0,0,0,.1);overflow:hidden;margin-top:.65rem}.llm-stat-bar-fill{height:100%;border-radius:2px;transition:width .5s ease}.llm-stat-bar-fill.bar-ok{background:#27ae60}.llm-stat-bar-fill.bar-warn{background:#e67e22}.llm-stat-bar-fill.bar-over{background:#c0392b}.llm-usage-settings{border-top:1px solid rgba(0,0,0,.07);padding-top:.9rem;display:flex;flex-direction:column;gap:.65rem}.llm-usage-row{display:flex;align-items:baseline;gap:.9rem;flex-wrap:wrap}.llm-usage-row .llm-usage-row-label{font-size:.82rem;font-weight:600;opacity:.6;min-width:12rem;flex-shrink:0}.llm-usage-row .llm-usage-row-value{display:flex;align-items:baseline;gap:.5rem;flex-wrap:wrap;font-size:.88rem}.llm-field-hint{font-size:.8rem;opacity:.55}.llm-env-badge{font-size:.79rem;opacity:.6}.llm-budget-alert{color:#c0392b;font-weight:600;font-size:.88rem;margin:0 0 1rem}.llm-no-usage{opacity:.5;font-style:italic;font-size:.88rem;margin-bottom:1rem}html[data-darkmode=true] .stab-shell{border-color:hsla(0,0%,100%,.07);box-shadow:0 2px 8px rgba(0,0,0,.25)}html[data-darkmode=true] .stab-nav{background:linear-gradient(180deg, rgba(255, 255, 255, 0.025) 0%, rgba(255, 255, 255, 0.04) 100%);border-right-color:hsla(0,0%,100%,.07)}html[data-darkmode=true] .stab-btn:hover{background:hsla(0,0%,100%,.05)}html[data-darkmode=true] .stab-btn.active{background:rgba(237,89,0,.12)}html[data-darkmode=true] .stab-overview-feature{background:hsla(0,0%,100%,.025);border-color:hsla(0,0%,100%,.05)}html[data-darkmode=true] .stab-overview-feature:hover{background:hsla(0,0%,100%,.04)}html[data-darkmode=true] .stab-configured-badge{background:rgba(39,174,96,.1);border-color:rgba(39,174,96,.22);color:#5db880}html[data-darkmode=true] .stab-overview-disclaimer{border-color:rgba(255,190,50,.22);background:rgba(255,180,0,.05)}html[data-darkmode=true] .stab-overview-disclaimer .stab-disclaimer-icon{color:#c9963a}html[data-darkmode=true] .stab-overview-disclaimer .stab-disclaimer-body>strong{color:#c9a050}html[data-darkmode=true] .llm-stat-card{background:hsla(0,0%,100%,.03);border-color:hsla(0,0%,100%,.07)}html[data-darkmode=true] .llm-stat-bar-wrap{background:hsla(0,0%,100%,.1)}html[data-darkmode=true] .llm-usage-settings{border-top-color:hsla(0,0%,100%,.07)}body,.pure-table,.pure-table thead,.pure-table td,.pure-table th,.pure-form input,.pure-form textarea,.pure-form select,.edit-form .inner,.pure-menu-horizontal,footer,.sticky-tab,#diff-jump,.button-tag,#new-watch-form,#new-watch-form input:not(.pure-button),code,.messages li,#checkbox-operations,.inline-warning,a,.watch-controls img{transition:color .4s ease,background-color .4s ease,background .4s ease,border-color .4s ease,box-shadow .4s ease}body{color:var(--color-text);background:var(--color-background-page);font-family:Helvetica Neue,Helvetica,Lucida Grande,Arial,Ubuntu,Cantarell,Fira Sans,sans-serif}.content-wrapper{display:flex;gap:1rem;width:100%;max-width:100%;position:relative;align-items:flex-start}@media only screen and (max-width: 980px){.content-wrapper{flex-direction:column}}.content-main{flex:1 1 auto;width:100%;min-width:0;display:flex;flex-direction:column;align-items:center}@media only screen and (min-width: 980px){.content-main{flex-direction:column;padding-right:1rem}}.visually-hidden{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}.status-icon{display:inline-block;height:1rem;vertical-align:middle}.pure-table-even{background:var(--color-background)}a{text-decoration:none;color:var(--color-link)}#search-result-info{color:#fff}button.toggle-button{vertical-align:middle;background:rgba(0,0,0,0);border:none;cursor:pointer;color:var(--color-text-menu-heading)}button.toggle-button:hover{color:var(--color-icon-github-hover)}button.toggle-button svg{fill:currentColor}button.toggle-button .icon-light{display:block}.pure-menu-horizontal{background:var(--color-background);padding-top:5px;padding-bottom:5px;display:flex;justify-content:space-between;align-items:center}#pure-menu-horizontal-spinner{height:3px;background:linear-gradient(-75deg, #ff6000, #ff8f00, #ffdd00, #ed0000);background-size:400% 400%;width:100%;animation:gradient 200s ease infinite}body.spinner-active #pure-menu-horizontal-spinner{animation:gradient 1s ease infinite}@keyframes gradient{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}.pure-menu-heading{color:var(--color-text-menu-heading);padding-left:.8rem}.pure-menu-link{color:var(--color-text-menu-link)}.pure-menu-link:hover{background-color:var(--color-background-menu-link-hover);color:var(--color-text-menu-link-hover)}.tab-pane-inner{scroll-margin-top:200px}section.content{padding-bottom:1em;flex-direction:column;display:flex;align-items:center;justify-content:center}@media only screen and (max-width: 980px){section.content{padding-top:80px}}@media only screen and (min-width: 980px){section.content{padding-top:100px}}code{background:var(--color-background-code);color:var(--color-text)}.inline-tag,.restock-label,.tracking-ldjson-price-data,.watch-tag-list,.processor-badge{white-space:nowrap;border-radius:5px;padding:2px 5px;margin-right:4px}.processor-badge{font-weight:900;text-decoration:none}.processor-badge:hover{text-decoration:none;opacity:.8;cursor:pointer}.processor-badge.active{outline:2px solid var(--color-link);outline-offset:1px}.watch-tag-list{color:var(--color-white);background:var(--color-text-watch-tag-list);text-decoration:none}.watch-tag-list:hover{text-decoration:none;opacity:.8;cursor:pointer}.watch-tag-list:visited{color:var(--color-white)}body:after{content:"";background:linear-gradient(130deg, var(--color-background-gradient-first), var(--color-background-gradient-second) 41.07%, var(--color-background-gradient-third) 84.05%)}body:after,body:before{display:block;position:fixed;top:0;left:0;width:100%;height:100vh;z-index:-1}body::after{opacity:.91}body::before{content:""}.button-small{font-size:85%}.button-xsmall{font-size:70%}.fetch-error{padding-top:1em;font-size:80%;max-width:400px;display:block}.pure-button-primary,a.pure-button-primary,.pure-button-selected,a.pure-button-selected{background-color:var(--color-background-button-primary)}.button-secondary{color:var(--color-text-button);border-radius:4px;text-shadow:0 1px 1px rgba(0,0,0,.2)}.button-success{background:var(--color-background-button-success)}.button-tag{background:var(--color-background-button-tag);color:var(--color-text-button);font-size:75%;border-radius:6px;margin-right:4px;margin-bottom:1px}.button-tag.active{background:var(--color-background-button-tag-active);font-weight:bold}.button-error{background:var(--color-background-button-error);color:var(--color-text-button-error)}.button-warning{background:var(--color-background-button-warning);color:var(--color-text-button-warning)}.button-secondary{background:var(--color-background-button-secondary)}.button-cancel{background:var(--color-background-button-cancel)}.messages li{list-style:none;padding:1em;border-radius:10px;color:var(--color-text-messages);font-weight:bold}.messages li.message{background:var(--color-background-messages-message)}.messages li.error{background:var(--color-background-messages-error)}.messages li.notice{background:var(--color-background-messages-notice)}.messages.with-share-link>*:hover{cursor:pointer}.notifications-wrapper{padding-top:.5rem}.notifications-wrapper #notification-test-log{margin-top:1rem;padding:1rem;white-space:pre-wrap;word-break:break-word;overflow-wrap:break-word;max-width:100%;box-sizing:border-box;max-height:12rem;overflow-y:scroll;border:1px solid var(--color-border-notification);border-radius:5px}label:hover{cursor:pointer}.grey-form-border{border:1px solid var(--color-border-notification);padding:.5rem;border-radius:5px}#notification-error-log{border:1px solid var(--color-border-notification);padding:1rem;border-radius:5px;overflow-wrap:break-word}#token-table.pure-table td,#token-table.pure-table th{font-size:80%}.pure-form input[type=text].transparent-field{background-color:var(--color-background-new-watch-input-transparent) !important;color:var(--color-white) !important;border:1px solid hsla(0,0%,100%,.2) !important;box-shadow:none !important;-webkit-box-shadow:none !important}.pure-form input[type=text].transparent-field::placeholder{opacity:.5;color:hsla(0,0%,100%,.7);font-weight:lighter}#new-watch-form{background:var(--color-background-new-watch-form);padding:1em;border-radius:10px;margin-bottom:1em;max-width:100%}#new-watch-form #url::placeholder{font-weight:bold}#new-watch-form input{display:inline-block;margin-bottom:5px}#new-watch-form input:not(.pure-button){background-color:var(--color-background-new-watch-input);color:var(--color-text-new-watch-input)}#new-watch-form .label{display:none}#new-watch-form legend{color:var(--color-text-legend);font-weight:bold}@media only screen and (min-width: 760px){#new-watch-form #watch-add-wrapper-zone{display:flex;gap:.3rem;flex-direction:row;min-width:70vw}}#new-watch-form #watch-add-wrapper-zone>span{flex-grow:0}#new-watch-form #watch-add-wrapper-zone>span input{width:100%;padding-right:1em}#new-watch-form #watch-add-wrapper-zone>span:first-child{flex-grow:1}@media only screen and (max-width: 760px){#new-watch-form #watch-add-wrapper-zone #url{width:100%}}#new-watch-form #watch-group-tag{font-size:.9rem;padding:.3rem;display:flex;align-items:center;gap:.5rem;color:var(--color-white)}#new-watch-form #watch-group-tag label,#new-watch-form #watch-group-tag input{margin:0}#new-watch-form #watch-group-tag input{flex:1}#diff-col{padding-left:40px}#diff-jump{position:fixed;left:0px;top:120px;background:var(--color-background);padding:10px;border-top-right-radius:5px;border-bottom-right-radius:5px;box-shadow:1px 1px 4px var(--color-shadow-jump)}#diff-jump a{color:var(--color-link);cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;-o-user-select:none}footer{padding:10px;background:var(--color-background);color:var(--color-text-footer);text-align:center}#feed-icon{vertical-align:middle}#new-version-text a{color:var(--color-link-new-version)}.watch-controls{color:#f8321b}.watch-controls .state-on img{opacity:.8}.watch-controls img{opacity:.2}.watch-controls img:hover{transition:opacity .3s;opacity:.8}.monospaced-textarea textarea{width:100%;font-family:monospace;white-space:pre;overflow-wrap:normal;overflow-x:auto}.pure-form fieldset{padding-top:0px}.pure-form fieldset ul{padding-bottom:0px;margin-bottom:0px}.pure-form .pure-control-group,.pure-form .pure-group,.pure-form .pure-controls{padding-bottom:1em}.pure-form .pure-control-group div,.pure-form .pure-group div,.pure-form .pure-controls div{margin:0px}.pure-form .pure-control-group .checkbox>*,.pure-form .pure-group .checkbox>*,.pure-form .pure-controls .checkbox>*{display:inline;vertical-align:middle}.pure-form .pure-control-group .checkbox>label,.pure-form .pure-group .checkbox>label,.pure-form .pure-controls .checkbox>label{padding-left:5px}.pure-form .pure-control-group legend,.pure-form .pure-group legend,.pure-form .pure-controls legend{color:var(--color-text-legend)}.pure-form .error input{background-color:var(--color-error-input)}.pure-form ul.errors{padding:.5em .6em;border:1px solid var(--color-error-list);border-radius:4px;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box}.pure-form ul.errors li{margin-left:1em;color:var(--color-error-list)}.pure-form label{font-weight:bold}.pure-form textarea{width:100%}.pure-form .inline-radio ul{margin:0px;list-style:none}.pure-form .inline-radio ul li{display:flex;align-items:center;gap:1em}@media only screen and (max-width: 760px),(min-device-width: 768px)and (max-device-width: 980px){.edit-form{padding:.5em;margin:0}#nav-menu{overflow-x:scroll}}@media only screen and (max-width: 760px),(min-device-width: 768px)and (max-device-width: 980px){input[type=text]{width:100%}}.pure-table{border-color:var(--color-border-table-cell)}.pure-table thead{background-color:var(--color-background-table-thead);color:var(--color-text);border-bottom:1px solid var(--color-background-table-thead)}.pure-table td,.pure-table th{border-left-color:var(--color-border-table-cell)}.pure-table-striped tr:nth-child(2n-1) td{background-color:var(--color-table-stripe)}.pure-form input[type=color],.pure-form input[type=date],.pure-form input[type=datetime-local],.pure-form input[type=datetime],.pure-form input[type=email],.pure-form input[type=month],.pure-form input[type=number],.pure-form input[type=password],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=text],.pure-form input[type=time],.pure-form input[type=url],.pure-form input[type=week],.pure-form select,.pure-form textarea{border:var(--color-border-input);box-shadow:inset 0 1px 3px var(--color-shadow-input);background-color:var(--color-background-input);color:var(--color-text-input)}.pure-form input[type=color]:active,.pure-form input[type=date]:active,.pure-form input[type=datetime-local]:active,.pure-form input[type=datetime]:active,.pure-form input[type=email]:active,.pure-form input[type=month]:active,.pure-form input[type=number]:active,.pure-form input[type=password]:active,.pure-form input[type=search]:active,.pure-form input[type=tel]:active,.pure-form input[type=text]:active,.pure-form input[type=time]:active,.pure-form input[type=url]:active,.pure-form input[type=week]:active,.pure-form select:active,.pure-form textarea:active{background-color:var(--color-background-input)}input::placeholder,textarea::placeholder{color:var(--color-text-input-placeholder)}.m-d{min-width:100%}@media only screen and (min-width: 761px){.m-d{min-width:80%}}.pure-form-stacked>div:first-child{display:block}.tab-pane-inner{padding:0px}.tab-pane-inner:not(:target){display:none}.tab-pane-inner:target{display:block}.beta-logo{height:50px;right:-3px;top:-3px;position:absolute}#selector-header{padding-bottom:1em}.edit-form{max-width:95%}.edit-form .box-wrap{position:relative}.edit-form .inner{background:var(--color-background);padding:20px}.edit-form #actions{display:block;background:var(--color-background)}.edit-form #actions .pure-control-group{display:flex;gap:.625em;flex-wrap:wrap}.edit-form .pure-form-message-inline{padding-left:0;color:var(--color-text-input-description)}.edit-form .pure-form-message-inline code{font-size:.875em}.border-fieldset{border:1px solid #ccc;padding:1rem;border-radius:5px;margin-bottom:1rem}.border-fieldset h3{margin-top:0}.border-fieldset fieldset:last-of-type{padding-bottom:0}.border-fieldset fieldset:last-of-type .pure-control-group{padding-bottom:0}ul{padding-left:1em;padding-top:0px;margin-top:4px}.time-check-widget tr{display:inline}.time-check-widget tr input[type=number]{width:5em}@media only screen and (max-width: 760px){.time-check-widget tbody{display:grid;grid-template-columns:auto 1fr auto 1fr;gap:.625em .3125em;align-items:center}.time-check-widget tr{display:contents}.time-check-widget tr th{text-align:right;padding-right:5px}.time-check-widget tr input[type=number]{width:100%;max-width:5em}}#webdriver_delay{width:5em}#api-key:hover{cursor:pointer}#api-key-copy{color:var(--color-api-key)}.button-green{background-color:var(--color-background-button-green)}.button-red{background-color:var(--color-background-button-red)}.noselect{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#checkbox-operations{background:var(--color-background-checkbox-operations);padding:1em;border-radius:10px;margin-bottom:1em;display:none}#checkbox-operations button{margin-bottom:3px;margin-top:3px;display:inline-flex;align-items:center}.inline-warning{border:1px solid var(--color-border-warning);padding:.5rem;border-radius:5px;color:var(--color-warning)}.inline-warning>span{display:inline-block;vertical-align:middle}.inline-warning img.inline-warning-icon{display:inline;height:26px;vertical-align:middle}.tracking-ldjson-price-data{background-color:var(--color-background-button-green);color:#000;opacity:.6}.ldjson-price-track-offer{font-weight:bold;font-style:italic}.ldjson-price-track-offer a.pure-button{border-radius:3px;padding:3px;background-color:var(--color-background-button-green)}.price-follow-tag-icon{display:inline-block;height:.8rem;vertical-align:middle}#quick-watch-processor-type ul#processor{color:#fff;padding-left:0px}#quick-watch-processor-type ul#processor li{list-style:none;font-size:.9rem;display:grid;grid-template-columns:auto 1fr;align-items:center;gap:.5rem;margin-bottom:.5rem}#quick-watch-processor-type label,#quick-watch-processor-type input{padding:0;margin:0}.restock-label.in-stock{background-color:var(--color-background-button-green);color:#fff}.restock-label.not-in-stock{background-color:var(--color-background-button-cancel);color:#777}.restock-label.error{background-color:var(--color-background-button-error);color:#fff;opacity:.7}.restock-label.price{border:1px solid var(--color-background-button-cancel)}.restock-label svg{vertical-align:middle}#chrome-extension-link{padding:9px;border:1px solid var(--color-grey-800);border-radius:10px;vertical-align:middle}#chrome-extension-link img{height:21px;padding:2px;vertical-align:middle}#realtime-conn-error{position:fixed;bottom:0;left:0;background:var(--color-warning);padding:10px;font-size:.8rem;color:#fff;opacity:.8}#bottom-horizontal-offscreen{position:fixed;bottom:0;left:0;right:0;width:100%;min-height:50px;max-height:50vh;background:hsla(0,0%,100%,.7215686275);border-top:1px solid var(--color-border-table-cell);padding:10px;box-shadow:0 -2px 10px rgba(0,0,0,.2);z-index:100;overflow-y:auto;transition:opacity .3s ease-in-out;scroll-margin-bottom:10px;display:flex;justify-content:center;align-items:center}ul#highlightSnippetActions{list-style:none}ul#highlightSnippetActions li{display:inline-block}@media only screen and (max-width: 768px){.box{padding:.25rem !important}}.box{color:var(--color-white);border-width:1px;border-style:dashed;border-color:hsla(0,0%,100%,.25);border-image:initial;background:hsla(0,0%,100%,.04);border-radius:10px;padding:1.25rem}header{color:var(--color-white)}#heart-us svg{width:24px;height:24px;display:inline-block;vertical-align:middle;cursor:pointer} +ul#top-right-menu{list-style:none;margin:0;padding:0;display:grid;gap:.8rem;grid-auto-flow:column;grid-auto-columns:max-content;align-items:center}ul#top-right-menu .toggle-button{padding:0}.current-diff-url{flex:1 1 auto;min-width:0;overflow:hidden;white-space:nowrap;text-align:left;margin:0 .8rem;-webkit-mask-image:linear-gradient(to right, #000 calc(100% - 2.5em), transparent);mask-image:linear-gradient(to right, #000 calc(100% - 2.5em), transparent)}.current-diff-url span{overflow:visible;white-space:nowrap}:root{--body-main-text-size: 0.9rem;--color-white: #fff;--color-grey-50: #111;--color-grey-100: #262626;--color-grey-200: #333;--color-grey-300: #444;--color-grey-325: #555;--color-grey-350: #565d64;--color-grey-400: #666;--color-grey-500: #777;--color-grey-600: #999;--color-grey-700: #cbcbcb;--color-grey-750: #ddd;--color-grey-800: #e0e0e0;--color-grey-850: #eee;--color-grey-900: #f2f2f2;--color-black: #000;--color-dark-red: #a00;--color-light-red: #dd0000;--color-background-page: var(--color-grey-100);--color-background-gradient-first: #5ad8f7;--color-background-gradient-second: #2f50af;--color-background-gradient-third: #9150bf;--color-background: var(--color-white);--color-text: var(--color-grey-200);--color-link: #1b98f8;--color-menu-accent: #ed5900;--color-background-code: var(--color-grey-850);--color-error: var(--color-dark-red);--color-error-input: #ffebeb;--color-error-list: var(--color-light-red);--color-table-background: var(--color-background);--color-table-stripe: var(--color-grey-900);--color-text-tab: var(--color-white);--color-background-tab: rgba(255, 255, 255, 0.2);--color-background-tab-hover: rgba(255, 255, 255, 0.5);--color-text-tab-active: #222;--color-api-key: #0078e7;--color-background-button-primary: #0078e7;--color-background-button-green: #42dd53;--color-background-button-red: #dd4242;--color-background-button-success: rgb(28, 184, 65);--color-background-button-error: rgb(202, 60, 60);--color-text-button-error: var(--color-white);--color-background-button-warning: rgb(202, 60, 60);--color-text-button-warning: var(--color-white);--color-background-button-secondary: rgb(66, 184, 221);--color-background-button-cancel: rgb(200, 200, 200);--color-text-button: var(--color-white);--color-background-button-tag: rgb(99, 99, 99);--color-background-snapshot-age: #dfdfdf;--color-error-text-snapshot-age: var(--color-white);--color-error-background-snapshot-age: #ff0000;--color-background-button-tag-active: #9c9c9c;--color-text-messages: var(--color-white);--color-background-messages-message: rgba(255, 255, 255, .2);--color-background-messages-error: rgba(255, 1, 1, .5);--color-background-messages-notice: rgba(255, 255, 255, .5);--color-border-notification: #ccc;--color-background-checkbox-operations: rgba(0, 0, 0, 0.05);--color-warning: #ff3300;--color-border-warning: var(--color-warning);--color-text-legend: var(--color-white);--color-link-new-version: #e07171;--color-last-checked: #bbb;--color-text-footer: #444;--color-border-watch-table-cell: #eee;--color-text-watch-tag-list: rgba(231, 0, 105, 0.4);--color-background-new-watch-form: rgba(0, 0, 0, 0.05);--color-background-new-watch-input: var(--color-white);--color-background-new-watch-input-transparent: rgba(255, 255, 255, 0.1);--color-text-new-watch-input: var(--color-text);--color-border-input: var(--color-grey-500);--color-shadow-input: var(--color-grey-400);--color-background-input: var(--color-white);--color-text-input: var(--color-text);--color-text-input-description: var(--color-grey-500);--color-text-input-placeholder: var(--color-grey-600);--color-background-table-thead: var(--color-grey-800);--color-border-table-cell: var(--color-grey-700);--color-text-menu-heading: var(--color-grey-350);--color-text-menu-link: var(--color-grey-500);--color-background-menu-link-hover: var(--color-grey-850);--color-text-menu-link-hover: var(--color-grey-300);--color-shadow-jump: var(--color-grey-500);--color-icon-github: var(--color-black);--color-icon-github-hover: var(--color-grey-300);--color-watch-table-error: var(--color-dark-red);--color-watch-table-row-text: var(--color-grey-100);--highlight-trigger-text-bg-color: #1b98f8;--highlight-ignored-text-bg-color: var(--color-grey-700);--highlight-blocked-text-bg-color: rgb(202, 60, 60);--color-sidebar-bg: rgba(255, 255, 255, 0.97);--color-sidebar-text: var(--color-text);--color-sidebar-shadow: 6px 0 28px rgba(0, 0, 0, 0.18);--color-sidebar-item-hover-bg: rgba(0, 0, 0, 0.06);--color-sidebar-item-active-bg: rgba(0, 0, 0, 0.10)}html[data-darkmode=true]{--color-link: #59bdfb;--color-text: var(--color-white);--color-background-gradient-first: #3f90a5;--color-background-gradient-second: #1e316c;--color-background-gradient-third: #4d2c64;--color-background-new-watch-input: var(--color-grey-100);--color-background-new-watch-input-transparent: var(--color-grey-100);--color-text-new-watch-input: var(--color-text);--color-background-table-thead: var(--color-grey-200);--color-table-background: var(--color-grey-300);--color-table-stripe: var(--color-grey-325);--color-background: var(--color-grey-300);--color-text-menu-heading: var(--color-grey-850);--color-text-menu-link: var(--color-grey-800);--color-border-table-cell: var(--color-grey-400);--color-text-tab-active: var(--color-text);--color-border-input: var(--color-grey-400);--color-shadow-input: var(--color-grey-50);--color-background-input: var(--color-grey-350);--color-text-input-description: var(--color-grey-600);--color-text-input-placeholder: var(--color-grey-600);--color-text-watch-tag-list: rgba(250, 62, 146, 0.4);--color-background-code: var(--color-grey-200);--color-background-tab: rgba(0, 0, 0, 0.2);--color-background-tab-hover: rgba(0, 0, 0, 0.5);--color-background-snapshot-age: var(--color-grey-200);--color-shadow-jump: var(--color-grey-200);--color-icon-github: var(--color-white);--color-icon-github-hover: var(--color-grey-700);--color-watch-table-error: var(--color-light-red);--color-watch-table-row-text: var(--color-grey-800);--color-sidebar-bg: rgba(8, 10, 14, 0.97);--color-sidebar-text: var(--color-white);--color-sidebar-shadow: 6px 0 28px rgba(0, 0, 0, 0.45);--color-sidebar-item-hover-bg: rgba(255, 255, 255, 0.06);--color-sidebar-item-active-bg: rgba(255, 255, 255, 0.10)}html[data-darkmode=true] .icon-spread{filter:hue-rotate(-10deg) brightness(1.5)}html[data-darkmode=true] .watch-table .title-col a[target=_blank]::after,html[data-darkmode=true] .watch-table .current-diff-url::after{filter:invert(0.5) hue-rotate(10deg) brightness(2)}html[data-darkmode=true] .watch-table .status-browsersteps{filter:invert(0.5) hue-rotate(10deg) brightness(1.5)}html[data-darkmode=true] .watch-table .watch-controls .state-off img{opacity:.3}html[data-darkmode=true] .watch-table .watch-controls .state-on img{opacity:1}html[data-darkmode=true] .watch-table .unviewed{color:#fff}html[data-darkmode=true] .watch-table .unviewed.error{color:var(--color-watch-table-error)}.arrow{border:solid #1b98f8;border-width:0 2px 2px 0;display:inline-block;padding:3px}.arrow.right{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}.arrow.left{transform:rotate(135deg);-webkit-transform:rotate(135deg)}.arrow.up,.arrow.asc{transform:rotate(-135deg);-webkit-transform:rotate(-135deg)}.arrow.down,.arrow.desc{transform:rotate(45deg);-webkit-transform:rotate(45deg)}#browser_steps th{display:none}#browser_steps li{list-style:decimal;padding:5px}#browser_steps li.browser-step-with-error{background-color:#ffd6d6;border-radius:4px}#browser_steps li:not(:first-child):hover{opacity:1}#browser_steps li .control{padding-left:5px;padding-right:5px}#browser_steps li .control a{font-size:70%}#browser_steps li.empty{padding:0px;opacity:.35}#browser_steps li.empty .control{display:none}#browser_steps li:hover{background:#eee}#browser_steps li>label{display:none}@media only screen and (min-width: 760px){#browser-steps .flex-wrapper{display:flex;flex-flow:row;height:70vh;font-size:80%}#browser-steps .flex-wrapper #browser-steps-ui{flex-grow:1;flex-shrink:1;flex-basis:0;background-color:#eee;border-radius:5px}#browser-steps-fieldlist{flex-grow:0;flex-shrink:0;flex-basis:auto;max-width:400px;padding-left:1rem;overflow-y:scroll}#browsersteps-selector-wrapper{height:100% !important}}#browsersteps-selector-wrapper{width:100%;overflow-y:scroll;position:relative;height:80vh}#browsersteps-selector-wrapper>img{position:absolute;max-width:100%}#browsersteps-selector-wrapper>canvas{position:relative;max-width:100%}#browsersteps-selector-wrapper>canvas:hover{cursor:pointer}#browsersteps-selector-wrapper .loader{position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);z-index:100;max-width:350px;text-align:center}#browsersteps-selector-wrapper .spinner,#browsersteps-selector-wrapper .spinner:after{width:80px;height:80px;font-size:3px}#browsersteps-selector-wrapper #browsersteps-click-start{color:var(--color-grey-400)}#browsersteps-selector-wrapper #browsersteps-click-start:hover{cursor:pointer}ul#requests-extra_proxies{list-style:none}ul#requests-extra_proxies li>label{display:none}ul#requests-extra_proxies table tr{display:table-row}ul#requests-extra_proxies table tr input[type=text]{width:100%}@media only screen and (min-width: 1024px){ul#requests-extra_proxies table tr{display:inline}}#request label[for=proxy]{display:inline-block}body.proxy-check-active #request .proxy-check-details{font-size:80%;color:#555;display:block;padding-left:2em;max-width:500px}body.proxy-check-active #request .proxy-timing{font-size:80%;padding-left:1rem;color:var(--color-link)}#recommended-proxy{display:grid;gap:2rem;padding-bottom:1em}@media(min-width: 991px){#recommended-proxy{grid-template-columns:repeat(2, 1fr)}}#recommended-proxy>div{border:1px #aaa solid;border-radius:4px;padding:1em}#extra-proxies-setting{border:1px solid var(--color-grey-800);border-radius:4px;margin:1em;padding:1em}ul#requests-extra_browsers{list-style:none}ul#requests-extra_browsers li>label{display:none}ul#requests-extra_browsers table tr{display:table-row}ul#requests-extra_browsers table tr input[type=text]{width:100%}@media only screen and (min-width: 1280px){ul#requests-extra_browsers table tr{display:inline}ul#requests-extra_browsers table tr input[type=text]{width:100%}}#extra-browsers-setting{border:1px solid var(--color-grey-800);border-radius:4px;margin:1em;padding:1em}.pagination-page-info{text-transform:capitalize}.pagination.menu>*{display:inline-block}.pagination.menu li{display:inline-block}.pagination.menu a{padding:.65rem;margin:3px;border:none;background:#444;border-radius:2px;color:var(--color-text-button)}.pagination.menu a.disabled{display:none}.pagination.menu a.active{font-weight:bold;background:#888}.pagination.menu a:hover{background:#999}.spinner,.spinner:after{border-radius:50%;width:10px;height:10px}.spinner{margin:0px auto;font-size:3px;vertical-align:middle;display:inline-block;text-indent:-9999em;border-top:1.1em solid rgba(38,104,237,.2);border-right:1.1em solid rgba(38,104,237,.2);border-bottom:1.1em solid rgba(38,104,237,.2);border-left:1.1em solid #2668ed;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);-webkit-animation:load8 1.1s infinite linear;animation:load8 1.1s infinite linear}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.toggle-light-mode .icon-dark{display:none}html[data-darkmode=true] .toggle-light-mode .icon-light{display:none}html[data-darkmode=true] .toggle-light-mode .icon-dark{display:block}.pure-menu-link{padding:.5rem 1em;line-height:1.2rem}#menu-mute img,#menu-pause img{height:1.2rem}a.github-link{color:var(--color-text-menu-heading);margin:0;padding:0;height:1.8rem;display:block}a.github-link svg{fill:currentColor;height:100%}a.github-link:hover{color:var(--color-icon-github-hover)}.pure-menu-item{height:initial}.pure-menu-item svg{height:1.2rem}.pure-menu-item *{vertical-align:middle}.pure-menu-item .bi-heart:hover{cursor:pointer}.pure-menu-item.active .pure-menu-link{background-color:var(--color-background-menu-link-hover);color:var(--color-text-menu-heading)}.pure-menu-item .action-icon{stroke:var(--color-text-menu-heading)}.top-menu-list .action-label{color:var(--color-text-menu-heading)}@media only screen and (max-width: 768px){.top-menu-list .action-label{display:none}}#inline-menu-extras-group{list-style:none;margin:0;padding:0;display:grid;gap:.8rem;grid-auto-flow:column;grid-auto-columns:max-content;align-items:center}#overlay{opacity:.95;position:fixed;width:350px;max-width:100%;height:100%;top:0;right:-350px;background-color:var(--color-table-stripe);z-index:2;transform:translateX(0);transition:transform .5s ease}#overlay.visible{transform:translateX(-100%)}#overlay .content{font-size:.875rem;padding:1rem;margin-top:5rem;max-width:400px;color:var(--color-watch-table-row-text)}#heartpath{height:1.6rem;width:1.6rem;transition:all ease .3s !important}#heartpath:hover{fill:red !important;transition:all ease .3s !important}.minitabs-wrapper{width:100%}.minitabs-wrapper>div[id]{padding:20px;border:1px solid #ccc;border-top:none}.minitabs-wrapper .minitabs-content{width:100%;display:flex}.minitabs-wrapper .minitabs-content>div{flex:1 1 auto;min-width:0;overflow:scroll}.minitabs-wrapper .minitabs{display:flex;border-bottom:1px solid #ccc}.minitabs-wrapper .minitab{flex:1;text-align:center;padding:12px 0;text-decoration:none;color:#333;background-color:#f1f1f1;border:1px solid #ccc;border-bottom:none;cursor:pointer;transition:background-color .3s}.minitabs-wrapper .minitab:hover{background-color:#ddd}.minitabs-wrapper .minitab.active{background-color:#fff;font-weight:bold}@media(min-width: 800px){body.preview-text-enabled #filters-and-triggers>div{display:flex;gap:20px;position:relative}}body.preview-text-enabled #edit-text-filter,body.preview-text-enabled #text-preview{flex:1;align-self:flex-start}body.preview-text-enabled #edit-text-filter #pro-tips{display:none}body.preview-text-enabled #text-preview{position:sticky;top:20px;padding-top:1rem;padding-bottom:1rem;display:block !important}body.preview-text-enabled #activate-text-preview{background-color:var(--color-grey-500)}body.preview-text-enabled .monospace-preview{background:var(--color-background-input);border:1px solid var(--color-grey-600);padding:1rem;color:var(--color-text-input);font-family:"Courier New",Courier,monospace;font-size:70%;word-break:break-word;white-space:pre-wrap}#activate-text-preview{right:0;position:absolute;z-index:3;box-shadow:1px 1px 4px var(--color-shadow-jump)}#stats_row{display:flex;align-items:center;width:100%;color:#fff;font-size:.85rem}#stats_row>*{padding-bottom:.5rem}#stats_row .left{text-align:left}#stats_row .right{opacity:.5;transition:opacity .6s ease;margin-left:auto;text-align:right}body.has-queue #stats_row .right{opacity:1}.watch-table{width:100%;font-size:var(--body-main-text-size)}.watch-table .checkbox-uuid{text-align:center}.watch-table .checkbox-uuid>*{vertical-align:middle}.watch-table td,.watch-table th{vertical-align:middle}.watch-table tr{color:var(--color-watch-table-row-text)}.watch-table tr.unviewed{font-weight:bold}.watch-table tr td.inline.title-col{width:100%}.watch-table tr td.inline.title-col .grid-wrapper{display:grid;grid-template-columns:auto minmax(0, 1fr) auto;grid-auto-columns:auto;align-items:center;gap:.8rem}.watch-table tr td.inline.title-col .grid-wrapper>.favicon{grid-column:1}.watch-table tr td.inline.title-col .grid-wrapper>.watch-text-info{grid-column:2}.watch-table tr td.inline.title-col .grid-wrapper>.status-icons{grid-column:3}.watch-table tr td.inline.title-col .grid-wrapper>.restock-info-wrap{grid-column:4}@media only screen and (max-width: 1200px){.watch-table tr td.inline.title-col .grid-wrapper>.restock-info-wrap{grid-column:1/-1;justify-self:center}}.watch-table tr .watch-text-info{line-height:1.5}.watch-table tr.checking-now td:first-child{position:relative}.watch-table tr.checking-now td:first-child::before{content:"";position:absolute;top:0;bottom:0;left:0;width:3px;background-color:#293eff}.watch-table tr.checking-now td.last-checked .spinner-wrapper{display:inline-block !important}.watch-table tr.checking-now td.last-checked .innertext{display:none !important}.watch-table tr.queued a.recheck{display:none !important}.watch-table tr.queued a.already-in-queue-button{display:inline-block !important}.watch-table tr.paused a.pause-toggle.state-on{display:inline !important}.watch-table tr.paused a.pause-toggle.state-off{display:none !important}.watch-table tr.notification_muted a.mute-toggle.state-on{display:inline !important}.watch-table tr.notification_muted a.mute-toggle.state-off{display:none !important}.watch-table tr.has-error .error-text{display:block !important;color:var(--color-watch-table-error)}.watch-table tr.single-history a.preview-link{display:inline-block !important}.watch-table tr.multiple-history a.history-link{display:inline-block !important}.watch-table tr.has-favicon.unviewed img.favicon{opacity:1 !important}.watch-table td.buttons{font-size:12px;white-space:nowrap}.watch-table td.title-col{word-break:break-all;white-space:normal}.watch-table td.last-changed,.watch-table td.last-checked{text-align:center}.watch-table td a.external::after{content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAQElEQVR42qXKwQkAIAxDUUdxtO6/RBQkQZvSi8I/pL4BoGw/XPkh4XigPmsUgh0626AjRsgxHTkUThsG2T/sIlzdTsp52kSS1wAAAABJRU5ErkJggg==);margin:0 3px 0 5px}.watch-table td.watch-controls>div{display:flex;justify-content:space-between;align-items:center}.watch-table th#h-lastchanged,.watch-table th#h-lastchecked{text-align:center}.watch-table th a{font-weight:normal}.watch-table th a.active{font-weight:bolder}.watch-table th a.inactive .arrow{display:none}.watch-table th#mute-pause{white-space:nowrap}.watch-table th#mute-pause>div{display:flex;justify-content:space-between;align-items:center}.watch-table.favicon-not-enabled tr .favicon{display:none}.watch-table .status-icons{white-space:nowrap;display:flex;align-items:center;gap:4px}.watch-table .status-icons>*{vertical-align:middle}.watch-table .title-wrapper{display:flex;align-items:center;gap:10px}.watch-table .title-col-inner{display:inline-block;vertical-align:middle}.watch-table img.favicon{vertical-align:middle;max-width:36px;max-height:36px;height:36px}.watch-table img.favicon:hover{outline:2px solid color-mix(in srgb, var(--color-watch-table-row-text) 50%, transparent);outline-offset:1px;border-radius:4px}#watch-table-wrapper{display:inline-block;width:100%}#watch-table-wrapper #list-related-buttons{text-align:right;padding-top:1rem;margin-block-start:0;margin-block-end:0;padding-inline-start:0;margin:0}#watch-table-wrapper #list-related-buttons li{display:inline-block}#watch-table-wrapper #list-related-buttons a{border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-left-radius:0;border-bottom-right-radius:0}#watch-table-wrapper.has-error #list-related-buttons #post-list-with-errors{display:inline-block !important}#watch-table-wrapper.has-unread-changes #list-related-buttons #post-list-unread,#watch-table-wrapper.has-unread-changes #list-related-buttons #post-list-mark-views,#watch-table-wrapper.has-unread-changes #list-related-buttons #post-list-unread{display:inline-block !important}#watch-table-wrapper #tag-lister #tag-all{opacity:1}#watch-table-wrapper #tag-lister.active-tag .button-tag{opacity:.35}#watch-table-wrapper #tag-lister.active-tag .button-tag.active,#watch-table-wrapper #tag-lister.active-tag .button-tag:hover{opacity:1}.content .group-overview-table{width:100%}.content .group-overview-table .pure-button{margin-top:.3rem;margin-bottom:.3rem}.content .group-overview-table .watch-controls,.content .group-overview-table .watch-count{text-align:center}.content .group-overview-table td{padding:5px !important;color:var(--color-watch-table-row-text)}@media(max-width: 767px){.watch-table thead{display:block}.watch-table thead tr th{display:inline-block}.watch-table thead tr th .hide-on-mobile{display:none}.watch-table thead .empty-cell{display:none}.watch-table .last-checked::before{color:var(--color-text);content:attr(data-label) " "}.watch-table .last-changed::before{color:var(--color-text);content:attr(data-label) " "}.watch-table td.inline{display:inline-block}.watch-table .pure-table td,.watch-table .pure-table th{border:none}.watch-table td{border:none;border-bottom:1px solid var(--color-border-watch-table-cell);vertical-align:middle}.watch-table td:before{top:6px;left:6px;width:45%;padding-right:10px;white-space:nowrap}.watch-table.pure-table-striped tr{background-color:var(--color-table-background)}.watch-table.pure-table-striped tr:nth-child(2n-1){background-color:var(--color-table-stripe)}.watch-table.pure-table-striped tr:nth-child(2n-1) td{background-color:inherit}}@media(max-width: 767px){.watch-table tbody tr{padding-bottom:10px;padding-top:10px;display:grid;grid-template-columns:40px 1fr 100px;grid-template-rows:auto auto auto auto;gap:.5rem}.watch-table tbody tr .counter-i{display:none}.watch-table tbody tr>td{border-bottom:none}.watch-table tbody tr>td[colspan]{grid-column:1/-1}.watch-table tbody tr>td.title-col{grid-column:1/-1;grid-row:1}.watch-table tbody tr>td.title-col .watch-title{font-size:.92rem}.watch-table tbody tr>td.title-col .link-spread{display:none}.watch-table tbody tr>td.last-checked{grid-column:1/-1;grid-row:2}.watch-table tbody tr>td.last-changed{grid-column:1/-1;grid-row:3}.watch-table tbody tr>td.checkbox-uuid{grid-column:1;grid-row:4}.watch-table tbody tr>td.buttons{grid-column:2;grid-row:4;display:flex;align-items:center;justify-content:flex-start}.watch-table tbody tr>td.watch-controls{grid-column:3;grid-row:4;display:grid;place-items:center}.watch-table tbody tr>td.watch-controls a img{padding:10px}.pure-table td{padding:0 !important}}@media(min-width: 768px){.watch-table thead tr th .hide-on-desktop{display:none}}@media(min-width: 1600px){.watch-table td.last-checked .innertext,.watch-table td.last-changed .innertext{white-space:nowrap}}#llm-intent-section textarea{white-space:normal;overflow-wrap:break-word;overflow-x:hidden;overflow-y:auto;resize:vertical;font-family:inherit}ul#conditions_match_logic{list-style:none}ul#conditions_match_logic input,ul#conditions_match_logic label,ul#conditions_match_logic li{display:inline-block}ul#conditions_match_logic li{padding-right:1em}.fieldlist_formfields{width:100%;background-color:var(--color-background, #fff);border-radius:4px;border:1px solid var(--color-border-table-cell, #cbcbcb)}.fieldlist_formfields .fieldlist-header{display:flex;background-color:var(--color-background-table-thead, #e0e0e0);font-weight:bold;border-bottom:1px solid var(--color-border-table-cell, #cbcbcb)}.fieldlist_formfields .fieldlist-header-cell{flex:1;padding:.5em 1em;text-align:left}.fieldlist_formfields .fieldlist-header-cell:last-child{flex:0 0 120px}.fieldlist_formfields .fieldlist-body{display:flex;flex-direction:column}.fieldlist_formfields .fieldlist-row{display:flex;border-bottom:1px solid var(--color-border-table-cell, #cbcbcb)}.fieldlist_formfields .fieldlist-row:last-child{border-bottom:none}.fieldlist_formfields .fieldlist-row:nth-child(2n-1){background-color:var(--color-table-stripe, #f2f2f2)}.fieldlist_formfields .fieldlist-row.error-row{background-color:var(--color-error-input, #ffdddd)}.fieldlist_formfields .fieldlist-cell{flex:1;padding:.5em 1em;display:flex;flex-direction:column;justify-content:center}.fieldlist_formfields .fieldlist-cell input,.fieldlist_formfields .fieldlist-cell select{width:100%}.fieldlist_formfields .fieldlist-cell.fieldlist-actions{flex:0 0 120px;display:flex;flex-direction:row;align-items:center;gap:4px}.fieldlist_formfields ul.errors{margin-top:.5em;margin-bottom:0;padding:.5em;background-color:var(--color-error-background-snapshot-age, #ffdddd);border-radius:4px;list-style-position:inside}@media only screen and (max-width: 760px){.fieldlist_formfields .fieldlist-header,.fieldlist_formfields .fieldlist-row{flex-direction:column}.fieldlist_formfields .fieldlist-header-cell{display:none}.fieldlist_formfields .fieldlist-row{padding:.5em 0;border-bottom:2px solid var(--color-border-table-cell, #cbcbcb)}.fieldlist_formfields .fieldlist-cell{padding:.25em .5em}.fieldlist_formfields .fieldlist-cell.fieldlist-actions{flex:1;justify-content:flex-start;padding-top:.5em}.fieldlist_formfields .fieldlist-cell:not(:last-child){margin-bottom:.5em}.fieldlist_formfields .fieldlist-cell::before{content:attr(data-label);font-weight:bold;margin-bottom:.25em}}.fieldlist_formfields .addRuleRow,.fieldlist_formfields .removeRuleRow,.fieldlist_formfields .verifyRuleRow{cursor:pointer;border:none;padding:4px 8px;border-radius:3px;font-weight:bold;background-color:#aaa;color:var(--color-foreground-text, #fff)}.fieldlist_formfields .addRuleRow:hover,.fieldlist_formfields .removeRuleRow:hover,.fieldlist_formfields .verifyRuleRow:hover{background-color:#999}body.checking-now #checking-now-fixed-tab{display:block !important}#checking-now-fixed-tab{background:#ccc;border-radius:5px;bottom:0;color:var(--color-text);display:none;font-size:.8rem;left:0;padding:5px;position:fixed}#selector-wrapper{height:100%;text-align:center;max-height:70vh;overflow-y:scroll;position:relative}#selector-wrapper>img{position:absolute;z-index:4;max-width:100%}#selector-wrapper>canvas{position:relative;z-index:5;max-width:100%}#selector-wrapper>canvas:hover{cursor:pointer}#selector-current-xpath{font-size:80%}#add-watch-ui #add-watch-url-row{display:flex;gap:.5rem;align-items:stretch;margin-bottom:1rem}#add-watch-ui #add-watch-url-row>span{flex:1 1 auto;min-width:0}#add-watch-ui #add-watch-url-row>span input{width:100%}#add-watch-ui #add-watch-url-row #add-watch-go{flex:0 0 auto;white-space:nowrap}#add-watch-ui #add-watch-panes{display:flex;gap:1rem;align-items:stretch}@media(max-width: 900px){#add-watch-ui #add-watch-panes{flex-direction:column}}#add-watch-ui #add-watch-selector-pane{flex:1 1 62%;min-width:0;min-height:380px;position:relative;overflow:auto;border:1px solid var(--color-background-tab);border-radius:6px;background:rgba(0,0,0,.15);padding:.75rem}#add-watch-ui #add-watch-selector-pane #add-watch-empty-state,#add-watch-ui #add-watch-selector-pane #add-watch-spinner,#add-watch-ui #add-watch-selector-pane #add-watch-error{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.6rem;text-align:center;padding:2rem 1rem}#add-watch-ui #add-watch-selector-pane #add-watch-empty-state{opacity:.8}#add-watch-ui #add-watch-selector-pane #add-watch-empty-state svg{opacity:.55}#add-watch-ui #add-watch-selector-pane #add-watch-empty-state strong{font-size:1.05rem}#add-watch-ui #add-watch-selector-pane #add-watch-empty-state span{font-size:.85rem;opacity:.8;max-width:32ch}#add-watch-ui #add-watch-selector-pane #add-watch-spinner{gap:1.2rem}#add-watch-ui #add-watch-selector-pane #add-watch-spinner .spinner{font-size:5px}#add-watch-ui #add-watch-selector-pane #add-watch-spinner .fetching-update-notice{font-size:.85rem;opacity:.85}#add-watch-ui #add-watch-selector-pane #add-watch-error{color:#ffb4b4;font-size:.9rem;word-break:break-word}#add-watch-ui #add-watch-selector-pane #selector-wrapper{position:relative;display:block;width:100%;max-height:none;overflow:visible;text-align:left}#add-watch-ui #add-watch-selector-pane #selector-wrapper>img{position:relative;display:block;max-width:100%;height:auto;z-index:4}#add-watch-ui #add-watch-selector-pane #selector-wrapper>canvas{position:absolute;top:0;left:0;max-width:none;z-index:5}#add-watch-ui #add-watch-options-pane{flex:0 0 34%;min-width:0;display:flex;flex-direction:column;gap:1.1rem}@media(max-width: 900px){#add-watch-ui #add-watch-options-pane{flex:1 1 auto}}#add-watch-ui #add-watch-options-pane .add-watch-option-group label{display:inline-block}#add-watch-ui #add-watch-options-pane #by-element-toggle-group .pure-form-message-inline{display:block;margin-top:.25rem;font-size:.8rem;opacity:.8}#add-watch-ui #add-watch-options-pane #by-element-toggle-group #clear-selector{margin-top:.5rem}#add-watch-ui #add-watch-options-pane #quick-watch-llm-intent label{display:block;margin-bottom:.35rem}#add-watch-ui #add-watch-options-pane #add-watch-submit-row{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:auto}.ternary-radio-group{display:flex;gap:0;border:1px solid var(--color-grey-750);border-radius:4px;overflow:hidden;width:fit-content;background:var(--color-background)}.ternary-radio-group .ternary-radio-option{position:relative;cursor:pointer;margin:0;display:flex;align-items:center}.ternary-radio-group .ternary-radio-option input[type=radio]{position:absolute;opacity:0;width:0;height:0}.ternary-radio-group .ternary-radio-option .ternary-radio-label{padding:8px 16px;background:var(--color-grey-900);border:none;border-right:1px solid var(--color-grey-750);font-size:13px;font-weight:500;color:var(--color-text);transition:all .2s ease;cursor:pointer;display:block;text-align:center}.ternary-radio-group .ternary-radio-option:last-child .ternary-radio-label{border-right:none}.ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label{background:var(--color-link);color:var(--color-text-button);font-weight:600}.ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label.ternary-default{background:var(--color-grey-600);color:var(--color-text-button)}.ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label:hover{background:#1a7bc4}.ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label:hover.ternary-default{background:var(--color-grey-500)}.ternary-radio-group .ternary-radio-option:hover .ternary-radio-label{background:var(--color-grey-800)}@media(max-width: 480px){.ternary-radio-group{width:100%}.ternary-radio-group .ternary-radio-label{flex:1;min-width:auto}}input[type=radio].pure-radio:checked+label,input[type=radio].pure-radio:checked{background:var(--color-link);color:var(--color-text-button)}html[data-darkmode=true] .ternary-radio-group .ternary-radio-option .ternary-radio-label{background:var(--color-grey-350)}html[data-darkmode=true] .ternary-radio-group .ternary-radio-option:hover .ternary-radio-label{background:var(--color-grey-400)}html[data-darkmode=true] .ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label{background:var(--color-link);color:var(--color-text-button)}html[data-darkmode=true] .ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label.ternary-default{background:var(--color-grey-600)}html[data-darkmode=true] .ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label:hover{background:#1a7bc4}html[data-darkmode=true] .ternary-radio-group .ternary-radio-option input:checked+.ternary-radio-label:hover.ternary-default{background:var(--color-grey-500)}body.processor-image_ssim_diff #edit-text-filter .text-filtering{display:none}body.processor-image_ssim_diff #conditions-tab{display:none}.modal-dialog{border:none;border-radius:10px;padding:0;background:var(--color-background);color:var(--color-text);box-shadow:0 5px 20px rgba(0,0,0,.3);max-width:500px;width:90%}.modal-dialog::backdrop{background:rgba(0,0,0,.6);backdrop-filter:blur(3px);animation:fadeIn .2s ease-out}.modal-dialog[open]{animation:slideIn .25s ease-out}.modal-dialog .modal-header{padding:1.5rem;border-bottom:1px solid var(--color-border-table-cell);display:flex;align-items:center;gap:1rem}.modal-dialog .modal-header .modal-icon{font-size:2rem;line-height:1;flex-shrink:0}.modal-dialog .modal-header .modal-icon.warning{color:var(--color-warning)}.modal-dialog .modal-header .modal-icon.danger{color:var(--color-background-button-error)}.modal-dialog .modal-header .modal-icon.info{color:var(--color-background-button-primary)}.modal-dialog .modal-header .modal-title{font-size:1.3rem;font-weight:bold;margin:0;color:var(--color-text)}.modal-dialog .modal-body{padding:1.5rem;line-height:1.6}.modal-dialog .modal-body p{margin:0 0 1rem 0}.modal-dialog .modal-body p:last-child{margin-bottom:0}.modal-dialog .modal-body strong{color:var(--color-text);font-weight:600}.modal-dialog .modal-footer{padding:1rem 1.5rem;border-top:1px solid var(--color-border-table-cell);display:flex;gap:.75rem;justify-content:flex-end;background:var(--color-grey-900)}.modal-dialog .modal-footer button{padding:.6rem 1.5rem;border:none;border-radius:4px;cursor:pointer;font-weight:500;transition:all .2s ease;font-size:.95rem}.modal-dialog .modal-footer button:hover{transform:translateY(-1px);box-shadow:0 2px 8px rgba(0,0,0,.15)}.modal-dialog .modal-footer button:active{transform:translateY(0)}.modal-dialog .modal-footer button.modal-btn-cancel{background:var(--color-background-button-cancel);color:var(--color-grey-200)}.modal-dialog .modal-footer button.modal-btn-cancel:hover{background:var(--color-grey-700)}.modal-dialog .modal-footer button.modal-btn-confirm{background:var(--color-background-button-primary);color:var(--color-white)}.modal-dialog .modal-footer button.modal-btn-confirm:hover{opacity:.9}.modal-dialog .modal-footer button.modal-btn-danger{background:var(--color-background-button-error);color:var(--color-white)}.modal-dialog .modal-footer button.modal-btn-danger:hover{background:var(--color-dark-red)}.modal-dialog .modal-footer button.modal-btn-warning{background:var(--color-background-button-warning);color:var(--color-white)}.modal-dialog .modal-footer button.modal-btn-warning:hover{opacity:.9}html[data-darkmode=true] .modal-dialog{box-shadow:0 5px 30px rgba(0,0,0,.7)}html[data-darkmode=true] .modal-dialog .modal-footer{background:var(--color-grey-200)}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes slideIn{from{opacity:0;transform:translateY(-20px) scale(0.95)}to{opacity:1;transform:translateY(0) scale(1)}}@media only screen and (max-width: 760px){.modal-dialog{width:95%;max-width:none}.modal-dialog .modal-header{padding:1rem}.modal-dialog .modal-header .modal-title{font-size:1.1rem}.modal-dialog .modal-body{padding:1rem;font-size:.95rem}.modal-dialog .modal-footer{padding:.75rem 1rem;flex-wrap:wrap}.modal-dialog .modal-footer button{flex:1;min-width:120px}}#language-selector-flag{display:inline-block;width:1.2em;height:1.2em;vertical-align:middle;border-radius:50%;overflow:hidden;opacity:.6}#language-selector-flag:hover{opacity:1}.language-list{display:flex;flex-direction:column;gap:.5rem;padding:.5rem 0}.language-option{display:flex;align-items:center;gap:1rem;padding:.25rem;border-radius:4px;transition:background-color .2s ease;text-decoration:none;color:var(--color-text);border:1px solid rgba(0,0,0,0)}.language-option:hover{background-color:var(--color-background-menu-link-hover);border-color:var(--color-border-table-cell)}.language-option.active{background-color:var(--color-link);color:var(--color-text-button);font-weight:600}.language-option .flag{font-size:1.5rem;flex-shrink:0}.language-option .language-name{flex-grow:1;font-size:1rem}#language-modal .language-list .lang-option{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;margin-right:.5em;border-radius:50%;overflow:hidden}.action-sidebar{display:flex;flex-direction:column;align-items:center;width:190px;z-index:60;pointer-events:none}@media only screen and (max-width: 980px){.action-sidebar{display:none}}.action-sidebar-inner{pointer-events:auto;width:64px;overflow:hidden;transition:width .08s ease-out}body.actionsidebar-minimal .action-sidebar-inner:hover,body.actionsidebar-minimal .action-sidebar-inner:focus-within{width:190px;transition:width .22s cubic-bezier(0.2, 0.7, 0.2, 1)}body.actionside-bar-on .action-sidebar-inner{width:190px;transition:none}.action-sidebar-list{list-style:none;padding-right:0;padding-left:.4rem;margin:0;display:flex;flex-direction:column;gap:0}.action-sidebar-li{list-style:none;margin:0;position:relative;color:var(--color-white)}.action-sidebar-li>:first-child{padding-left:.4rem}.action-sidebar-li button{padding:0;margin:0}.action-sidebar-li a{color:var(--color-white)}.action-sidebar-li--spark .queue-spark{display:block;width:100%;height:15px;border-radius:3px;background:hsla(0,0%,100%,.05);box-shadow:inset 0 0 0 1px hsla(0,0%,100%,.06)}.action-sidebar-divider{height:1px;background:hsla(0,0%,100%,.18);margin:6px 16px;list-style:none}.action-sidebar .action-sidebar-item{position:relative;display:flex;align-items:center;width:100%;height:42px;font-size:var(--body-main-text-size);border-radius:8px;color:var(--color-white);text-decoration:none;white-space:nowrap;background:rgba(0,0,0,0);border:0;text-align:left;cursor:pointer;transition:background-color .12s ease,color .12s ease}.action-sidebar .action-sidebar-item:hover{background-color:var(--color-sidebar-item-hover-bg)}.action-sidebar .action-sidebar-item:hover .action-icon{stroke-width:2.3}.action-sidebar .action-sidebar-item:focus-visible{outline:2px solid var(--color-link);outline-offset:2px}.action-sidebar .action-sidebar-item.active .action-icon{stroke-width:2.4;filter:drop-shadow(0 0 0.4px currentColor)}.action-sidebar .action-sidebar-item.active .action-label{font-weight:700}.action-sidebar .action-sidebar-item.is-disabled{opacity:.45;cursor:not-allowed;pointer-events:none}.action-sidebar .action-sidebar-item.action-sidebar-item--accent .action-icon{stroke:#fff;stroke-width:2.6}.action-sidebar .action-sidebar-item .action-label{flex:0 0 auto;margin-left:14px;font-family:inherit;font-weight:400;letter-spacing:0;text-transform:none;color:inherit;opacity:0;transform:translateX(-4px);transition:opacity .05s ease-out,transform .05s ease-out}.action-sidebar .action-sidebar-item .action-badge{margin-left:10px;font-size:.6rem;line-height:1;padding:3px 7px;border-radius:999px;background:hsla(0,0%,100%,.14);color:hsla(0,0%,100%,.85);text-transform:uppercase;letter-spacing:.06em;font-weight:700;pointer-events:none;opacity:0;transition:opacity .05s ease-out}body.actionsidebar-minimal .action-sidebar-inner:hover .action-sidebar-item .action-label,body.actionsidebar-minimal .action-sidebar-inner:focus-within .action-sidebar-item .action-label{opacity:1;transform:translateX(0);transition:opacity .18s ease .05s,transform .18s cubic-bezier(0.2, 0.7, 0.2, 1) .05s}body.actionsidebar-minimal .action-sidebar-inner:hover .action-sidebar-item .action-badge,body.actionsidebar-minimal .action-sidebar-inner:focus-within .action-sidebar-item .action-badge{opacity:1;transition:opacity .18s ease .05s}body.actionside-bar-on .action-sidebar .action-sidebar-item .action-label{opacity:1;transform:translateX(0);transition:none}body.actionside-bar-on .action-sidebar .action-sidebar-item .action-badge{opacity:1;transition:none}.action-icon{flex:0 0 auto;width:24px;height:24px;stroke:currentColor;stroke-width:1.9;fill:none;stroke-linecap:round;stroke-linejoin:round}.action-badge{flex:0 0 auto;font-size:.62rem;text-transform:uppercase;letter-spacing:.08em;padding:2px 6px;border-radius:999px;background:hsla(0,0%,100%,.15);color:hsla(0,0%,100%,.85);font-weight:700}.mobile-menu-section{padding:.5rem .75rem;border-bottom:1px solid var(--color-border-table-cell)}.mobile-menu-section .action-sidebar-list{gap:1px}.mobile-menu-section .action-sidebar-item{position:relative;display:flex;align-items:center;justify-content:flex-start;gap:.85rem;width:100%;height:auto;padding:.75rem .75rem;border-radius:8px;color:var(--color-text)}.mobile-menu-section .action-sidebar-item:hover{background-color:var(--color-background-menu-link-hover);color:var(--color-text)}.mobile-menu-section .action-sidebar-item.active{background-color:var(--color-background-menu-link-hover);color:var(--color-text)}.mobile-menu-section .action-sidebar-item .action-label{position:static;transform:none;background:rgba(0,0,0,0);box-shadow:none;color:inherit;opacity:1;pointer-events:auto;padding:0;font-weight:500}.mobile-menu-section .action-sidebar-item .action-label::before{display:none}.mobile-menu-section .action-sidebar-item .action-badge{position:static;margin-left:auto;font-size:.62rem;background:rgba(0,0,0,.08);color:var(--color-text)}.mobile-menu-section .action-sidebar-item.action-sidebar-item--accent{background:var(--color-background-menu-link-hover);box-shadow:inset 0 0 0 1px var(--color-border-table-cell);color:var(--color-text)}.mobile-menu-section .action-sidebar-item.action-sidebar-item--accent .action-label{color:inherit}.mobile-menu-section .action-sidebar-item--button{background:rgba(0,0,0,0);border:none;cursor:pointer;text-align:left;font:inherit}#add-watch-live-info{width:100%;margin-top:1rem}#add-watch-live-info .add-watch-live-placeholder{border:1px dashed hsla(0,0%,100%,.25);background:hsla(0,0%,100%,.04);border-radius:10px;padding:1.25rem;color:var(--color-white)}#add-watch-live-info .add-watch-live-placeholder h3{margin:0 0 .4rem 0;font-size:1rem;letter-spacing:.02em}#add-watch-live-info .add-watch-live-placeholder .muted{opacity:.7;margin:0 0 .75rem 0;font-size:.85rem}#add-watch-live-info .add-watch-live-placeholder .add-watch-live-stream{font-size:.85rem;opacity:.6;padding:.6rem 0}.mobile-menu-drawer .action-sidebar-list{padding:0}.mobile-menu-drawer .mobile-menu-section .action-sidebar-item{padding-left:0}#queue-page{width:100%;color:var(--color-white)}#queue-page h2,#queue-page h3{color:var(--color-white)}#queue-page .queue-panel{background:var(--color-background-new-watch-form);padding:1em;border-radius:10px;margin-bottom:1em;width:100%;box-sizing:border-box;color:var(--color-white)}#queue-page .queue-stats{display:grid;grid-template-columns:repeat(auto-fit, minmax(160px, 1fr));gap:.75rem}#queue-page .queue-stat .label{font-size:.7rem;text-transform:uppercase;letter-spacing:.06em;opacity:.7}#queue-page .queue-stat .value{font-size:1.6rem;font-weight:700;color:var(--color-white)}#queue-page .queue-stat.queue-stat--action{display:flex;align-items:center;justify-content:flex-start}#queue-page .queue-stat.queue-stat--action .pure-button{white-space:nowrap}#queue-page table.pure-table{width:100%;background:rgba(0,0,0,0);color:var(--color-white);font-size:80%}#queue-page table.pure-table thead th{background:rgba(0,0,0,0);color:var(--color-white);border-bottom:1px solid hsla(0,0%,100%,.18);font-weight:700;white-space:nowrap}#queue-page table.pure-table td{color:var(--color-white);border-color:hsla(0,0%,100%,.08);white-space:nowrap}#queue-page table.pure-table td.title-col,#queue-page table.pure-table td.watch-cell{white-space:normal;word-break:break-all}#queue-page table.pure-table td.time-cell{font-variant-numeric:tabular-nums;color:hsla(0,0%,100%,.75);font-size:.95em}#queue-page table.pure-table code,#queue-page table.pure-table small,#queue-page table.pure-table em,#queue-page table.pure-table strong{color:var(--color-white)}#queue-page table.pure-table code{background:rgba(0,0,0,.18)}#queue-page table.pure-table small{opacity:.7}#queue-page table.pure-table-striped tr:nth-child(2n-1) td{background:hsla(0,0%,100%,.04)}#queue-page tr.is-completed td{opacity:.45;transition:opacity .4s ease}#queue-page tbody[data-section=workers]{border-bottom:1px solid hsla(0,0%,100%,.18)}#queue-page tr.worker-slot td{border-color:hsla(0,0%,100%,.05)}#queue-page tr.worker-idle td{background:hsla(0,0%,100%,.02)}#queue-page .inline-tag,#queue-page .processor-badge,#queue-page .watch-tag-list,#queue-page .tracking-ldjson-price-data,#queue-page .restock-label{background:hsla(0,0%,100%,.14);color:var(--color-white)}#queue-page .inline-tag--running{background:rgba(28,184,65,.45)}#queue-page .inline-tag--idle{background:hsla(0,0%,100%,.08);color:hsla(0,0%,100%,.6)}#queue-page .inline-tag--done{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.7)}#queue-page a.queue-cancel{display:inline-block;margin-left:8px;font-size:.75rem;color:hsla(0,0%,100%,.65);text-decoration:underline;text-decoration-style:dotted;text-underline-offset:2px}#queue-page a.queue-cancel:hover{color:var(--color-white);text-decoration-style:solid}#queue-page a.queue-cancel.is-busy{pointer-events:none;opacity:.5}#queue-page tr.is-new td{animation:queue-row-in .45s ease}@keyframes queue-row-in{from{background-color:rgba(28,184,65,.18)}to{background-color:rgba(0,0,0,0)}}#queue-page .queue-waiting{display:none;align-items:center;gap:.5rem;margin-top:1rem;padding:.5rem 0;color:hsla(0,0%,100%,.7);font-size:.85rem}#queue-page .queue-waiting[data-show=true]{display:flex}#queue-page .queue-waiting .spinner{margin:0;flex:0 0 auto;border-top-color:hsla(0,0%,100%,.18);border-right-color:hsla(0,0%,100%,.18);border-bottom-color:hsla(0,0%,100%,.18);border-left-color:var(--color-white)}.hamburger-menu{display:none;background:rgba(0,0,0,0);border:none;cursor:pointer;padding:.5rem;z-index:10001;position:relative}@media only screen and (max-width: 980px){.hamburger-menu{display:flex;flex-direction:column;justify-content:center;align-items:center}}.hamburger-icon{width:24px;height:20px;position:relative;display:flex;flex-direction:column;justify-content:space-between}.hamburger-icon span{display:block;height:3px;width:100%;background:var(--color-text);border-radius:2px;transition:all .3s cubic-bezier(0.68, -0.55, 0.265, 1.55);transform-origin:center}.hamburger-menu.active .hamburger-icon span:nth-child(1){transform:translateY(8.5px) rotate(45deg)}.hamburger-menu.active .hamburger-icon span:nth-child(2){opacity:0;transform:translateX(-10px)}.hamburger-menu.active .hamburger-icon span:nth-child(3){transform:translateY(-8.5px) rotate(-45deg)}.mobile-menu-overlay{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);z-index:9999;opacity:0;transition:opacity .3s ease}.mobile-menu-overlay.active{display:block;opacity:1}.mobile-menu-drawer{position:fixed;top:0;right:-280px;width:280px;height:100%;background:var(--color-background);opacity:1;box-shadow:-2px 0 8px rgba(0,0,0,.15);z-index:10000;transition:right .3s cubic-bezier(0.68, -0.55, 0.265, 1.55);overflow-y:auto;padding-top:60px}.mobile-menu-drawer.active{right:0}.mobile-menu-drawer .mobile-menu-items{list-style:none;padding:1rem 0;margin:0}.mobile-menu-drawer .mobile-menu-items li{border-bottom:1px solid var(--color-border-table-cell)}.mobile-menu-drawer .mobile-menu-items li>*{display:block;padding:1rem 1.5rem;color:var(--color-text);text-decoration:none;font-weight:500;transition:background .2s ease}.mobile-menu-drawer .mobile-menu-items li>*:hover{background:var(--color-background-menu-link-hover)}.mobile-menu-drawer .mobile-menu-items li#menu-pause,.mobile-menu-drawer .mobile-menu-items li#menu-mute{display:none}.logo-cdio{font-weight:bold;font-size:1.1rem}.logo-cdio .logo-cd{color:var(--color-grey-500)}.logo-cdio .logo-io{color:var(--color-text)}.menu-always-visible{display:flex;align-items:center;gap:.5rem;margin-left:auto}@media only screen and (max-width: 980px){#top-right-menu .menu-collapsible{display:none !important}.pure-menu-horizontal{overflow-x:visible !important}#nav-menu{overflow-x:visible !important}}@media only screen and (min-width: 1025px){.hamburger-menu,.mobile-menu-drawer,.mobile-menu-overlay{display:none !important}}html[data-darkmode=true] .mobile-menu-drawer{box-shadow:-2px 0 8px rgba(0,0,0,.4)}#search-modal .modal-body{padding:2rem 1.5rem}#search-modal .modal-body .pure-control-group{padding-bottom:0}#search-modal .modal-body .pure-control-group label{display:block;margin-bottom:.5rem;font-size:.9rem;font-weight:600;color:var(--color-text)}#search-modal .modal-body .pure-control-group #search-modal-input{width:100%;max-width:100%;box-sizing:border-box;padding:.6rem .8rem;font-size:1rem;border:1px solid var(--color-border-input);border-radius:4px;background-color:var(--color-background-input);color:var(--color-text-input);box-shadow:inset 0 1px 3px var(--color-shadow-input);transition:border-color .2s ease,box-shadow .2s ease}#search-modal .modal-body .pure-control-group #search-modal-input:focus{outline:none;border-color:var(--color-link);box-shadow:0 0 0 3px rgba(27,152,248,.1)}#search-modal .modal-body .pure-control-group #search-modal-input::placeholder{color:var(--color-text-input-placeholder);opacity:.7}html[data-darkmode=true] #search-modal #search-modal-input:focus{box-shadow:0 0 0 3px rgba(89,189,251,.15)}#llm-diff-summary-area{margin:.6rem 0 .4rem;padding:.65rem .9rem;background:linear-gradient(135deg, rgba(120, 80, 200, 0.18), rgba(80, 160, 220, 0.14));border-left:3px solid rgba(140,90,220,.8);border-radius:0 4px 4px 0;min-width:0;max-width:100%;box-sizing:border-box;overflow:hidden}#llm-diff-summary-area .llm-diff-summary-label{display:block;font-size:.7rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;opacity:.55;margin-bottom:.25rem}#llm-diff-summary-area .llm-diff-summary-text{margin:0;font-size:.9rem;line-height:1.5;white-space:pre-wrap;overflow-wrap:break-word;word-break:break-word}.llm-diff-summary-prompt{margin:.4em 0 0;font-size:.78rem;font-style:italic;overflow:hidden;max-height:3.8em;animation:llm-prompt-reveal .7s ease-out both}.llm-diff-summary-prompt .llm-diff-summary-prompt-text{display:block;opacity:.55;mask-image:linear-gradient(to bottom, rgba(0, 0, 0, 0.85) 30%, rgba(0, 0, 0, 0) 100%);-webkit-mask-image:linear-gradient(to bottom, rgba(0, 0, 0, 0.85) 30%, rgba(0, 0, 0, 0) 100%);white-space:pre-wrap;overflow-wrap:break-word;line-height:1.45}@keyframes llm-prompt-reveal{from{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:translateY(0)}}.llm-diff-summary-loading{opacity:.5;font-style:italic;animation:llm-pulse 1.4s ease-in-out infinite;font-weight:bold}@keyframes llm-pulse{0%,100%{opacity:.5}50%{opacity:.2}}.llm-budget-exceeded,.llm-error{color:#c0392b;font-weight:600;font-style:normal;opacity:1}.toggle-ai-mode{opacity:.4;transition:opacity .2s ease,filter .2s ease;display:inline-flex;align-items:center;color:var(--color-text-menu-link)}.toggle-ai-mode svg{height:1.2rem;width:1.2rem}.toggle-ai-mode .ai-mode-label{font-size:.75rem;font-weight:600;letter-spacing:.04em;line-height:1}html[data-ai-mode=true] .toggle-ai-mode{opacity:1;filter:drop-shadow(0 0 4px rgba(160, 100, 255, 0.7))}.btn-label-summary{display:none}html[data-ai-mode=true] body.llm-configured .btn-label-history{display:none}html[data-ai-mode=true] body.llm-configured .btn-label-summary{display:inline}.ai-inline-summary-row td{white-space:normal !important;word-break:break-word;padding:.5rem 1rem .6rem 1.4rem !important;background:linear-gradient(135deg, #f0ebff, #eaf0ff) !important;border-top:1px solid #c4b5fd !important;border-left:3px solid #8b5cf6 !important;color:#1a0640 !important;font-size:.85rem;line-height:1.5}html[data-darkmode=true] .ai-inline-summary-row td{background:linear-gradient(135deg, #1c0d35, #0d1535) !important;border-top:1px solid #3b1f6e !important;border-left-color:#8b5cf6 !important;color:#e9d5ff !important}.ai-inline-summary-row .ai-inline-summary-content{display:flex;gap:.5rem;align-items:flex-start}.ai-inline-summary-row .ai-inline-summary-content .ai-inline-spinner{flex-shrink:0;animation:llm-pulse 1.4s ease-in-out infinite}.ai-inline-summary-row .ai-inline-summary-content .ai-inline-body{display:flex;flex-direction:column;min-width:0}.ai-inline-summary-row .ai-inline-summary-content .ai-inline-text{font-style:italic;opacity:.75;white-space:pre-wrap}.ai-inline-summary-row .ai-inline-summary-content.loaded .ai-inline-spinner{animation:none}.ai-inline-summary-row .ai-inline-summary-content.loaded .ai-inline-text{font-style:normal;opacity:1}.ai-inline-summary-row .ai-inline-history-link{display:inline-block;margin-top:.4rem;font-size:.78rem;font-weight:700;opacity:.7;white-space:nowrap}.ai-inline-summary-row .ai-inline-history-link:hover{opacity:1}.ai-inline-summary-row .ai-inline-error{color:#c0392b}.ai-inline-summary-row .ai-inline-prompt{display:block;margin-top:.3em;font-size:.75rem;font-style:italic;overflow:hidden;max-height:3.6em;animation:llm-prompt-reveal .6s ease-out both;mask-image:linear-gradient(to bottom, rgba(0, 0, 0, 0.7) 30%, rgba(0, 0, 0, 0) 100%);-webkit-mask-image:linear-gradient(to bottom, rgba(0, 0, 0, 0.7) 30%, rgba(0, 0, 0, 0) 100%);opacity:.55;line-height:1.4;white-space:pre-wrap;overflow-wrap:break-word}.action-sidebar-item{position:relative}.action-sidebar-item .notification-bubble{position:absolute;top:8px;left:8px;min-width:18px;height:18px;background:#f44;color:#fff;font-size:10px;font-weight:700;line-height:18px;text-align:center;border-radius:9px;padding:0 2px;box-shadow:0 2px 4px rgba(0,0,0,.3);pointer-events:none;transition:all .2s ease;display:none}.action-sidebar-item .notification-bubble.red-bubble{background:#f44}.action-sidebar-item .notification-bubble.blue-bubble{background:#4a9eff;color:#fff}.action-sidebar-item .notification-bubble.visible{display:block}.action-sidebar-item .notification-bubble.pulse{animation:bubblePulse .4s ease-out}.action-sidebar-item .notification-bubble.large-number{font-size:8px;min-width:20px;height:20px;line-height:20px;border-radius:10px}@keyframes bubblePulse{0%{transform:scale(1)}50%{transform:scale(1.3)}100%{transform:scale(1)}}html[data-darkmode=true] .notification-bubble{box-shadow:0 2px 6px rgba(0,0,0,.6)}.toast-container{position:fixed;display:flex;flex-direction:column;gap:.75rem;pointer-events:none;z-index:10000}.toast-container.toast-top-right{top:20px;right:20px}.toast-container.toast-top-center{top:100px;left:50%;transform:translateX(-50%)}.toast-container.toast-top-left{top:20px;left:20px}.toast-container.toast-bottom-right{bottom:20px;right:20px}.toast-container.toast-bottom-center{bottom:20px;left:50%;transform:translateX(-50%)}.toast-container.toast-bottom-left{bottom:20px;left:20px}.toast{position:relative;display:flex;align-items:center;gap:.75rem;min-width:300px;max-width:500px;padding:1rem 1.25rem;background:var(--color-background);border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,.15),0 0 0 1px rgba(0,0,0,.05);pointer-events:auto;overflow:hidden;opacity:0;transform:translateY(-50px);transition:all .3s cubic-bezier(0.68, -0.55, 0.265, 1.55);font-family:inherit}.toast.toast-show{opacity:1;transform:translateY(0)}.toast.toast-hide{opacity:0;transform:translateY(-50px) scale(0.95)}.toast.toast-success{border-left:4px solid #10b981}.toast.toast-success .toast-icon{color:#10b981}.toast.toast-error{border-left:4px solid #ef4444}.toast.toast-error .toast-icon{color:#ef4444}.toast.toast-warning{border-left:4px solid #f59e0b}.toast.toast-warning .toast-icon{color:#f59e0b}.toast.toast-info{border-left:4px solid #3b82f6}.toast.toast-info .toast-icon{color:#3b82f6}.toast.toast-default{border-left:4px solid var(--color-grey-500)}.toast-icon{flex-shrink:0;width:24px;height:24px}.toast-icon svg{width:100%;height:100%}.toast-message{flex:1;font-size:.875rem;line-height:1.5;color:var(--color-text);word-break:break-word;font-family:inherit}.toast-close{flex-shrink:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,0);border:none;border-radius:4px;color:var(--color-grey-500);font-size:1.5rem;line-height:1;cursor:pointer;transition:all .2s ease;padding:0;margin-left:.25rem}.toast-close:hover{background:var(--color-grey-800);color:var(--color-text)}.toast-close:active{transform:scale(0.95)}.toast-progress{position:absolute;bottom:0;left:0;right:0;height:3px;background:currentColor;opacity:.3;transform-origin:left;transition:transform linear}html[data-darkmode=true] .toast{background:var(--color-grey-300);box-shadow:0 4px 12px rgba(0,0,0,.4),0 0 0 1px hsla(0,0%,100%,.05)}html[data-darkmode=true] .toast-close:hover{background:var(--color-grey-400)}@media only screen and (max-width: 768px){.toast-container{left:50% !important;right:auto !important;top:80px !important;transform:translateX(-50%) !important;align-items:center}.toast-container.toast-bottom-right,.toast-container.toast-bottom-center,.toast-container.toast-bottom-left{top:auto !important;bottom:80px !important}.toast{min-width:auto;max-width:none;width:80vw;transform:translateY(-100px)}.toast.toast-show{transform:translateY(0)}.toast.toast-hide{transform:translateY(-100px) scale(0.95)}}@media(prefers-reduced-motion: reduce){.toast{transition:opacity .2s ease;transform:none !important}.toast.toast-show{opacity:1}.toast.toast-hide{opacity:0}}.login-form{min-height:52vh;display:flex;align-items:center;justify-content:center;padding:2rem 1rem}.login-form .inner{background:var(--color-background);border-radius:16px;box-shadow:0 10px 40px rgba(0,0,0,.08),0 2px 8px rgba(0,0,0,.04);padding:3rem 2.5rem;width:100%;max-width:420px;position:relative;overflow:hidden;transition:transform .3s ease,box-shadow .3s ease}.login-form .inner:hover{box-shadow:0 15px 50px rgba(0,0,0,.12),0 5px 15px rgba(0,0,0,.06)}.login-form form{margin:0}.login-form fieldset{border:none;padding:0;margin:0}.login-form .pure-control-group{margin-bottom:1.75rem}.login-form .pure-control-group:last-of-type{margin-bottom:0;margin-top:2rem}.login-form label{display:block;margin-bottom:.5rem;font-weight:600;font-size:.9rem;color:var(--color-text);letter-spacing:.01em}.login-form input[type=password]{width:100%;padding:.875rem 1rem;border:2px solid var(--color-grey-800);border-radius:8px;font-size:1rem;background:var(--color-background-input);color:var(--color-text-input);transition:all .2s ease;box-sizing:border-box}.login-form input[type=password]:focus{outline:none;border-color:var(--color-link);box-shadow:0 0 0 3px rgba(27,152,248,.1);transform:translateY(-1px)}.login-form input[type=password]::placeholder{color:var(--color-text-input-placeholder)}.login-form button[type=submit]{width:100%;padding:.875rem 1.5rem;font-size:1rem;font-weight:600;border-radius:8px;border:none;background:var(--color-background-button-primary);color:var(--color-text-button);cursor:pointer;transition:all .2s ease;box-shadow:0 2px 8px rgba(27,152,248,.2)}.login-form button[type=submit]:hover{box-shadow:0 4px 12px rgba(27,152,248,.3);background:#06c}.login-form button[type=submit]:active{transform:translateY(0);box-shadow:0 2px 4px rgba(27,152,248,.2)}.content-main>ul.messages{position:fixed;top:120px;left:50%;transform:translateX(-50%);list-style:none;padding:0;margin:0;z-index:1000;min-width:300px;max-width:500px}.content-main>ul.messages li{padding:1rem 1.25rem;border-radius:8px;font-size:.95rem;line-height:1.5;font-weight:500;box-shadow:0 4px 12px rgba(0,0,0,.15);animation:slideDown .3s ease-out;border:2px solid rgba(0,0,0,0)}.content-main>ul.messages li.error{background:#fee;border:2px solid #ef4444;color:#991b1b;font-weight:600}.content-main>ul.messages li.success{background:#f0fdf4;border:2px solid #10b981;color:#166534}.content-main>ul.messages li.info,.content-main>ul.messages li.message{background:#eff6ff;border:2px solid #3b82f6;color:#1e40af}@keyframes slideDown{from{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}html[data-darkmode=true] .login-form .inner{box-shadow:0 10px 40px rgba(0,0,0,.4),0 2px 8px rgba(0,0,0,.2)}html[data-darkmode=true] .login-form .inner:hover{box-shadow:0 15px 50px rgba(0,0,0,.5),0 5px 15px rgba(0,0,0,.3)}html[data-darkmode=true] .login-form input[type=password]{border-color:var(--color-grey-400)}html[data-darkmode=true] .login-form input[type=password]:focus{border-color:var(--color-link)}html[data-darkmode=true] .content-main>ul.messages li{box-shadow:0 4px 12px rgba(0,0,0,.4)}html[data-darkmode=true] .content-main>ul.messages li.error{background:#4a1d1d;border-color:#ef4444;color:#fca5a5}html[data-darkmode=true] .content-main>ul.messages li.success{background:#1a3a2a;border-color:#10b981;color:#86efac}html[data-darkmode=true] .content-main>ul.messages li.info,html[data-darkmode=true] .content-main>ul.messages li.message{background:#1e3a5f;border-color:#3b82f6;color:#93c5fd}@media only screen and (max-width: 768px){.login-form{min-height:auto;padding:1rem .5rem;padding-top:5rem}.login-form .inner{padding:2rem 1.5rem;border-radius:12px}.content-main>ul.messages{top:70px;left:10px;right:10px;transform:none;min-width:auto}}body.wrapped-tabs .tabs ul{grid-template-columns:repeat(auto-fill, minmax(var(--tab-width, 180px), 1fr));grid-auto-flow:row;grid-auto-columns:unset;gap:0;column-gap:5px}body.wrapped-tabs .tabs ul li{border-radius:0}.tabs ul{margin:0px;padding:0px;display:grid;grid-auto-flow:column;grid-auto-columns:max-content;gap:5px;list-style:none}.tabs ul li{white-space:nowrap;color:var(--color-text-tab);border-top-left-radius:5px;border-top-right-radius:5px;background-color:var(--color-background-tab)}.tabs ul li:not(.active):hover{background-color:var(--color-background-tab-hover)}.tabs ul li.active,.tabs ul li :target{background-color:var(--color-background)}.tabs ul li.active a,.tabs ul li :target a{color:var(--color-text-tab-active);font-weight:bold}.tabs ul li a{display:block;padding:.7em;color:var(--color-text-tab)}.stab-shell{display:flex;align-items:stretch;background:var(--color-background);border:1px solid rgba(0,0,0,.08);border-radius:8px;overflow:hidden;box-shadow:0 2px 8px rgba(0,0,0,.05);margin-bottom:1.5rem}.stab-nav{display:flex;flex-direction:column;width:11rem;flex-shrink:0;padding:.75rem 0;gap:1px;background:linear-gradient(180deg, rgba(0, 0, 0, 0.03) 0%, rgba(0, 0, 0, 0.05) 100%);border-right:1px solid rgba(0,0,0,.07)}.stab-btn{position:relative;display:flex;align-items:center;gap:.5rem;padding:.65rem .9rem .65rem 1rem;width:100%;background:none;border:none;border-left:3px solid rgba(0,0,0,0);border-radius:0;cursor:pointer;font:inherit;color:var(--color-text);text-align:left;opacity:.65;transition:background .12s ease,opacity .12s ease,border-color .12s ease,color .12s ease}.stab-btn:hover{background:rgba(0,0,0,.04);opacity:.85}.stab-btn.active{border-left-color:var(--color-menu-accent);background:rgba(237,89,0,.07);color:var(--color-menu-accent);font-weight:700;opacity:1}.stab-btn .stab-icon{font-size:.95rem;width:1.1rem;text-align:center;flex-shrink:0;opacity:.8}.stab-body{flex:1;min-width:0;padding:1.4rem 1.6rem;overflow-x:hidden}.stab-pane{visibility:hidden;height:0;overflow:hidden}.stab-pane.active{visibility:visible;height:auto;overflow:visible;animation:stab-enter .16s ease both}@keyframes stab-enter{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}.stab-overview-hero{margin-bottom:1.5rem}.stab-overview-hero h3{margin:0 0 .3rem;font-size:1.05rem}.stab-overview-hero .stab-overview-glyph{color:var(--color-menu-accent);margin-right:.2rem}.stab-overview-hero p{margin:0;font-size:.88rem;color:var(--color-text-input-description);max-width:44rem;line-height:1.55}.stab-overview-features{display:flex;flex-direction:column;gap:.7rem;margin-bottom:1.6rem}.stab-overview-feature{display:flex;gap:.85rem;align-items:flex-start;padding:.75rem 1rem;border-radius:6px;background:rgba(0,0,0,.022);border:1px solid rgba(0,0,0,.05);transition:background .12s ease}.stab-overview-feature:hover{background:rgba(0,0,0,.035)}.stab-overview-feature .stab-overview-icon{font-size:1.1rem;width:1.6rem;flex-shrink:0;text-align:center;padding-top:.05rem;opacity:.7}.stab-overview-feature .stab-overview-text>strong{display:block;margin-bottom:.2rem}.stab-overview-feature .stab-overview-text p{color:var(--color-text-input-description)}.stab-overview-disclaimer{display:flex;gap:.75rem;align-items:flex-start;margin:0 0 1.1rem;padding:.85rem 1rem;border-radius:6px;border:1px solid rgba(211,136,0,.35);background:rgba(255,180,0,.07)}.stab-overview-disclaimer .stab-disclaimer-icon{font-size:1.15rem;flex-shrink:0;padding-top:.05rem;color:#c07800}.stab-overview-disclaimer .stab-disclaimer-body{font-size:.85rem;line-height:1.55}.stab-overview-disclaimer .stab-disclaimer-body>strong{display:block;margin-bottom:.35rem;color:#8a5500;font-size:.87rem}.stab-overview-disclaimer .stab-disclaimer-body p{margin:0 0 .45rem;color:var(--color-text-input-description)}.stab-overview-disclaimer .stab-disclaimer-body ul{margin:0 0 .6rem;padding-left:1.25rem;color:var(--color-text-input-description)}.stab-overview-disclaimer .stab-disclaimer-body ul li{margin-bottom:.2rem}.stab-overview-disclaimer .stab-disclaimer-check{display:flex;gap:.5rem;align-items:flex-start;cursor:pointer;font-size:.82rem;color:var(--color-text-input-description);font-weight:600}.stab-overview-disclaimer .stab-disclaimer-check input[type=checkbox]{flex-shrink:0;margin-top:.18rem;cursor:pointer}.stab-overview-cta{margin-top:.4rem;display:flex;align-items:center;gap:.8rem;flex-wrap:wrap}.stab-configured-badge{display:inline-flex;align-items:center;gap:.4rem;padding:.35rem .75rem;background:rgba(39,174,96,.09);border:1px solid rgba(39,174,96,.28);border-radius:4px;color:#2a7a4e;font-size:.82rem;font-weight:600}.stab-section-title{font-size:.72rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;opacity:.45;margin:1.4rem 0 .6rem}.stab-section-title:first-child{margin-top:0}@media(max-width: 600px){.stab-shell{flex-direction:column;min-height:unset}.stab-nav{width:100%;border-right:none;border-bottom:1px solid rgba(0,0,0,.07);padding:.4rem 0}.stab-body{padding-left:1rem}}.llm-usage-grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(12rem, 1fr));gap:.9rem;margin-bottom:1.4rem}.llm-stat-card{padding:1rem 1.1rem .85rem;border-radius:7px;background:rgba(0,0,0,.025);border:1px solid rgba(0,0,0,.07)}.llm-stat-card .llm-stat-label{font-size:.7rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;opacity:.4;margin-bottom:.4rem}.llm-stat-card .llm-stat-value{font-size:1.65rem;font-weight:700;letter-spacing:-0.02em;line-height:1;margin-bottom:.25rem}.llm-stat-card .llm-stat-sub{font-size:.79rem;opacity:.5}.llm-stat-card .llm-stat-budget-text{font-size:.77rem;opacity:.55;margin-top:.3rem}.llm-stat-bar-wrap{height:4px;border-radius:2px;background:rgba(0,0,0,.1);overflow:hidden;margin-top:.65rem}.llm-stat-bar-fill{height:100%;border-radius:2px;transition:width .5s ease}.llm-stat-bar-fill.bar-ok{background:#27ae60}.llm-stat-bar-fill.bar-warn{background:#e67e22}.llm-stat-bar-fill.bar-over{background:#c0392b}.llm-usage-settings{border-top:1px solid rgba(0,0,0,.07);padding-top:.9rem;display:flex;flex-direction:column;gap:.65rem}.llm-usage-row{display:flex;align-items:baseline;gap:.9rem;flex-wrap:wrap}.llm-usage-row .llm-usage-row-label{font-size:.82rem;font-weight:600;opacity:.6;min-width:12rem;flex-shrink:0}.llm-usage-row .llm-usage-row-value{display:flex;align-items:baseline;gap:.5rem;flex-wrap:wrap;font-size:.88rem}.llm-field-hint{font-size:.8rem;opacity:.55}.llm-env-badge{font-size:.79rem;opacity:.6}.llm-budget-alert{color:#c0392b;font-weight:600;font-size:.88rem;margin:0 0 1rem}.llm-no-usage{opacity:.5;font-style:italic;font-size:.88rem;margin-bottom:1rem}html[data-darkmode=true] .stab-shell{border-color:hsla(0,0%,100%,.07);box-shadow:0 2px 8px rgba(0,0,0,.25)}html[data-darkmode=true] .stab-nav{background:linear-gradient(180deg, rgba(255, 255, 255, 0.025) 0%, rgba(255, 255, 255, 0.04) 100%);border-right-color:hsla(0,0%,100%,.07)}html[data-darkmode=true] .stab-btn:hover{background:hsla(0,0%,100%,.05)}html[data-darkmode=true] .stab-btn.active{background:rgba(237,89,0,.12)}html[data-darkmode=true] .stab-overview-feature{background:hsla(0,0%,100%,.025);border-color:hsla(0,0%,100%,.05)}html[data-darkmode=true] .stab-overview-feature:hover{background:hsla(0,0%,100%,.04)}html[data-darkmode=true] .stab-configured-badge{background:rgba(39,174,96,.1);border-color:rgba(39,174,96,.22);color:#5db880}html[data-darkmode=true] .stab-overview-disclaimer{border-color:rgba(255,190,50,.22);background:rgba(255,180,0,.05)}html[data-darkmode=true] .stab-overview-disclaimer .stab-disclaimer-icon{color:#c9963a}html[data-darkmode=true] .stab-overview-disclaimer .stab-disclaimer-body>strong{color:#c9a050}html[data-darkmode=true] .llm-stat-card{background:hsla(0,0%,100%,.03);border-color:hsla(0,0%,100%,.07)}html[data-darkmode=true] .llm-stat-bar-wrap{background:hsla(0,0%,100%,.1)}html[data-darkmode=true] .llm-usage-settings{border-top-color:hsla(0,0%,100%,.07)}body,.pure-table,.pure-table thead,.pure-table td,.pure-table th,.pure-form input,.pure-form textarea,.pure-form select,.edit-form .inner,.pure-menu-horizontal,footer,.sticky-tab,#diff-jump,.button-tag,#new-watch-form,#new-watch-form input:not(.pure-button),code,.messages li,#checkbox-operations,.inline-warning,a,.watch-controls img{transition:color .4s ease,background-color .4s ease,background .4s ease,border-color .4s ease,box-shadow .4s ease}body{color:var(--color-text);background:var(--color-background-page);font-family:Helvetica Neue,Helvetica,Lucida Grande,Arial,Ubuntu,Cantarell,Fira Sans,sans-serif}.content-wrapper{display:flex;gap:1rem;width:100%;max-width:100%;position:relative;align-items:flex-start}@media only screen and (max-width: 980px){.content-wrapper{flex-direction:column}}.content-main{flex:1 1 auto;width:100%;min-width:0;display:flex;flex-direction:column;align-items:center}@media only screen and (min-width: 980px){.content-main{flex-direction:column;padding-right:1rem}}.visually-hidden{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}.status-icon{display:inline-block;height:1rem;vertical-align:middle}.pure-table-even{background:var(--color-background)}a{text-decoration:none;color:var(--color-link)}#search-result-info{color:#fff}button.toggle-button{vertical-align:middle;background:rgba(0,0,0,0);border:none;cursor:pointer;color:var(--color-text-menu-heading)}button.toggle-button:hover{color:var(--color-icon-github-hover)}button.toggle-button svg{fill:currentColor}button.toggle-button .icon-light{display:block}.pure-menu-horizontal{background:var(--color-background);padding-top:5px;padding-bottom:5px;display:flex;justify-content:space-between;align-items:center}#pure-menu-horizontal-spinner{height:3px;background:linear-gradient(-75deg, #ff6000, #ff8f00, #ffdd00, #ed0000);background-size:400% 400%;width:100%;animation:gradient 200s ease infinite}body.spinner-active #pure-menu-horizontal-spinner{animation:gradient 1s ease infinite}@keyframes gradient{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}.pure-menu-heading{color:var(--color-text-menu-heading);padding-left:.8rem}.pure-menu-link{color:var(--color-text-menu-link)}.pure-menu-link:hover{background-color:var(--color-background-menu-link-hover);color:var(--color-text-menu-link-hover)}.tab-pane-inner{scroll-margin-top:200px}section.content{padding-top:80px;padding-bottom:1em;flex-direction:column;display:flex;align-items:center;justify-content:center}code{background:var(--color-background-code);color:var(--color-text)}.inline-tag,.restock-label,.tracking-ldjson-price-data,.watch-tag-list,.processor-badge{white-space:nowrap;border-radius:5px;padding:2px 5px;margin-right:4px}.processor-badge{font-weight:900;text-decoration:none}.processor-badge:hover{text-decoration:none;opacity:.8;cursor:pointer}.processor-badge.active{outline:2px solid var(--color-link);outline-offset:1px}.watch-tag-list{color:var(--color-white);background:var(--color-text-watch-tag-list);text-decoration:none}.watch-tag-list:hover{text-decoration:none;opacity:.8;cursor:pointer}.watch-tag-list:visited{color:var(--color-white)}body:after{content:"";background:linear-gradient(130deg, var(--color-background-gradient-first), var(--color-background-gradient-second) 41.07%, var(--color-background-gradient-third) 84.05%)}body:after,body:before{display:block;position:fixed;top:0;left:0;width:100%;height:100vh;z-index:-1}body::after{opacity:.91}body::before{content:""}.button-small{font-size:85%}.button-xsmall{font-size:70%}.fetch-error{padding-top:1em;font-size:80%;max-width:400px;display:block}.pure-button-primary,a.pure-button-primary,.pure-button-selected,a.pure-button-selected{background-color:var(--color-background-button-primary)}.button-secondary{color:var(--color-text-button);border-radius:4px;text-shadow:0 1px 1px rgba(0,0,0,.2)}.button-success{background:var(--color-background-button-success)}.button-tag{background:var(--color-background-button-tag);color:var(--color-text-button);font-size:75%;border-radius:6px;margin-right:4px;margin-bottom:1px}.button-tag.active{background:var(--color-background-button-tag-active);font-weight:bold}.button-error{background:var(--color-background-button-error);color:var(--color-text-button-error)}.button-warning{background:var(--color-background-button-warning);color:var(--color-text-button-warning)}.button-secondary{background:var(--color-background-button-secondary)}.button-cancel{background:var(--color-background-button-cancel)}.messages li{list-style:none;padding:1em;border-radius:10px;color:var(--color-text-messages);font-weight:bold}.messages li.message{background:var(--color-background-messages-message)}.messages li.error{background:var(--color-background-messages-error)}.messages li.notice{background:var(--color-background-messages-notice)}.messages.with-share-link>*:hover{cursor:pointer}.notifications-wrapper{padding-top:.5rem}.notifications-wrapper #notification-test-log{margin-top:1rem;padding:1rem;white-space:pre-wrap;word-break:break-word;overflow-wrap:break-word;max-width:100%;box-sizing:border-box;max-height:12rem;overflow-y:scroll;border:1px solid var(--color-border-notification);border-radius:5px}label:hover{cursor:pointer}.grey-form-border{border:1px solid var(--color-border-notification);padding:.5rem;border-radius:5px}#notification-error-log{border:1px solid var(--color-border-notification);padding:1rem;border-radius:5px;overflow-wrap:break-word}#token-table.pure-table td,#token-table.pure-table th{font-size:80%}.pure-form input[type=text].transparent-field{background-color:var(--color-background-new-watch-input-transparent) !important;color:var(--color-white) !important;border:1px solid hsla(0,0%,100%,.2) !important;box-shadow:none !important;-webkit-box-shadow:none !important}.pure-form input[type=text].transparent-field::placeholder{opacity:.5;color:hsla(0,0%,100%,.7);font-weight:lighter}#new-watch-form{background:var(--color-background-new-watch-form);padding:1em;border-radius:10px;margin-bottom:1em;max-width:100%}#new-watch-form #url::placeholder{font-weight:bold}#new-watch-form input{display:inline-block;margin-bottom:5px}#new-watch-form input:not(.pure-button){background-color:var(--color-background-new-watch-input);color:var(--color-text-new-watch-input)}#new-watch-form .label{display:none}#new-watch-form legend{color:var(--color-text-legend);font-weight:bold}@media only screen and (min-width: 760px){#new-watch-form #watch-add-wrapper-zone{display:flex;gap:.3rem;flex-direction:row;min-width:70vw}}#new-watch-form #watch-add-wrapper-zone>span{flex-grow:0}#new-watch-form #watch-add-wrapper-zone>span input{width:100%;padding-right:1em}#new-watch-form #watch-add-wrapper-zone>span:first-child{flex-grow:1}@media only screen and (max-width: 760px){#new-watch-form #watch-add-wrapper-zone #url{width:100%}}#new-watch-form #watch-group-tag{font-size:.9rem;padding:.3rem;display:flex;align-items:center;gap:.5rem;color:var(--color-white)}#new-watch-form #watch-group-tag label,#new-watch-form #watch-group-tag input{margin:0}#new-watch-form #watch-group-tag input{flex:1}#diff-col{padding-left:40px}#diff-jump{position:fixed;left:0px;top:120px;background:var(--color-background);padding:10px;border-top-right-radius:5px;border-bottom-right-radius:5px;box-shadow:1px 1px 4px var(--color-shadow-jump)}#diff-jump a{color:var(--color-link);cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;-o-user-select:none}footer{padding:10px;background:var(--color-background);color:var(--color-text-footer);text-align:center}#feed-icon{vertical-align:middle}#new-version-text a{color:var(--color-link-new-version)}.watch-controls{color:#f8321b}.watch-controls .state-on img{opacity:.8}.watch-controls img{opacity:.2}.watch-controls img:hover{transition:opacity .3s;opacity:.8}.monospaced-textarea textarea{width:100%;font-family:monospace;white-space:pre;overflow-wrap:normal;overflow-x:auto}.pure-form fieldset{padding-top:0px}.pure-form fieldset ul{padding-bottom:0px;margin-bottom:0px}.pure-form .pure-control-group,.pure-form .pure-group,.pure-form .pure-controls{padding-bottom:1em}.pure-form .pure-control-group div,.pure-form .pure-group div,.pure-form .pure-controls div{margin:0px}.pure-form .pure-control-group .checkbox>*,.pure-form .pure-group .checkbox>*,.pure-form .pure-controls .checkbox>*{display:inline;vertical-align:middle}.pure-form .pure-control-group .checkbox>label,.pure-form .pure-group .checkbox>label,.pure-form .pure-controls .checkbox>label{padding-left:5px}.pure-form .pure-control-group legend,.pure-form .pure-group legend,.pure-form .pure-controls legend{color:var(--color-text-legend)}.pure-form .error input{background-color:var(--color-error-input)}.pure-form ul.errors{padding:.5em .6em;border:1px solid var(--color-error-list);border-radius:4px;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box}.pure-form ul.errors li{margin-left:1em;color:var(--color-error-list)}.pure-form label{font-weight:bold}.pure-form textarea{width:100%}.pure-form .inline-radio ul{margin:0px;list-style:none}.pure-form .inline-radio ul li{display:flex;align-items:center;gap:1em}@media only screen and (max-width: 760px),(min-device-width: 768px)and (max-device-width: 980px){.edit-form{padding:.5em;margin:0}#nav-menu{overflow-x:scroll}}@media only screen and (max-width: 760px),(min-device-width: 768px)and (max-device-width: 980px){input[type=text]{width:100%}}.pure-table{border-color:var(--color-border-table-cell)}.pure-table thead{background-color:var(--color-background-table-thead);color:var(--color-text);border-bottom:1px solid var(--color-background-table-thead)}.pure-table td,.pure-table th{border-left-color:var(--color-border-table-cell)}.pure-table-striped tr:nth-child(2n-1) td{background-color:var(--color-table-stripe)}.pure-form input[type=color],.pure-form input[type=date],.pure-form input[type=datetime-local],.pure-form input[type=datetime],.pure-form input[type=email],.pure-form input[type=month],.pure-form input[type=number],.pure-form input[type=password],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=text],.pure-form input[type=time],.pure-form input[type=url],.pure-form input[type=week],.pure-form select,.pure-form textarea{border:var(--color-border-input);box-shadow:inset 0 1px 3px var(--color-shadow-input);background-color:var(--color-background-input);color:var(--color-text-input)}.pure-form input[type=color]:active,.pure-form input[type=date]:active,.pure-form input[type=datetime-local]:active,.pure-form input[type=datetime]:active,.pure-form input[type=email]:active,.pure-form input[type=month]:active,.pure-form input[type=number]:active,.pure-form input[type=password]:active,.pure-form input[type=search]:active,.pure-form input[type=tel]:active,.pure-form input[type=text]:active,.pure-form input[type=time]:active,.pure-form input[type=url]:active,.pure-form input[type=week]:active,.pure-form select:active,.pure-form textarea:active{background-color:var(--color-background-input)}input::placeholder,textarea::placeholder{color:var(--color-text-input-placeholder)}.m-d{min-width:100%}@media only screen and (min-width: 761px){.m-d{min-width:80%}}.pure-form-stacked>div:first-child{display:block}.tab-pane-inner{padding:0px}.tab-pane-inner:not(:target){display:none}.tab-pane-inner:target{display:block}.beta-logo{height:50px;right:-3px;top:-3px;position:absolute}#selector-header{padding-bottom:1em}.edit-form{max-width:95%}.edit-form .box-wrap{position:relative}.edit-form .inner{background:var(--color-background);padding:20px}.edit-form #actions{display:block;background:var(--color-background)}.edit-form #actions .pure-control-group{display:flex;gap:.625em;flex-wrap:wrap}.edit-form .pure-form-message-inline{padding-left:0;color:var(--color-text-input-description)}.edit-form .pure-form-message-inline code{font-size:.875em}.border-fieldset{border:1px solid #ccc;padding:1rem;border-radius:5px;margin-bottom:1rem}.border-fieldset h3{margin-top:0}.border-fieldset fieldset:last-of-type{padding-bottom:0}.border-fieldset fieldset:last-of-type .pure-control-group{padding-bottom:0}ul{padding-left:1em;padding-top:0px;margin-top:4px}.time-check-widget tr{display:inline}.time-check-widget tr input[type=number]{width:5em}@media only screen and (max-width: 760px){.time-check-widget tbody{display:grid;grid-template-columns:auto 1fr auto 1fr;gap:.625em .3125em;align-items:center}.time-check-widget tr{display:contents}.time-check-widget tr th{text-align:right;padding-right:5px}.time-check-widget tr input[type=number]{width:100%;max-width:5em}}#webdriver_delay{width:5em}#api-key:hover{cursor:pointer}#api-key-copy{color:var(--color-api-key)}.button-green{background-color:var(--color-background-button-green)}.button-red{background-color:var(--color-background-button-red)}.noselect{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#checkbox-operations{background:var(--color-background-checkbox-operations);padding:1em;border-radius:10px;margin-bottom:1em;display:none}#checkbox-operations button{margin-bottom:3px;margin-top:3px;display:inline-flex;align-items:center}.inline-warning{border:1px solid var(--color-border-warning);padding:.5rem;border-radius:5px;color:var(--color-warning)}.inline-warning>span{display:inline-block;vertical-align:middle}.inline-warning img.inline-warning-icon{display:inline;height:26px;vertical-align:middle}.tracking-ldjson-price-data{background-color:var(--color-background-button-green);color:#000;opacity:.6}.ldjson-price-track-offer{font-weight:bold;font-style:italic}.ldjson-price-track-offer a.pure-button{border-radius:3px;padding:3px;background-color:var(--color-background-button-green)}.price-follow-tag-icon{display:inline-block;height:.8rem;vertical-align:middle}#quick-watch-processor-type ul#processor{color:#fff;padding-left:0px}#quick-watch-processor-type ul#processor li{list-style:none;font-size:.9rem;display:grid;grid-template-columns:auto 1fr;align-items:center;gap:.5rem;margin-bottom:.5rem}#quick-watch-processor-type label,#quick-watch-processor-type input{padding:0;margin:0}.restock-label.in-stock{background-color:var(--color-background-button-green);color:#fff}.restock-label.not-in-stock{background-color:var(--color-background-button-cancel);color:#777}.restock-label.error{background-color:var(--color-background-button-error);color:#fff;opacity:.7}.restock-label.price{border:1px solid var(--color-background-button-cancel)}.restock-label svg{vertical-align:middle}.price-change{white-space:nowrap;font-weight:700;font-size:90%;margin-left:4px;vertical-align:middle}.price-change.down{color:var(--color-background-button-green)}.price-change.up{color:var(--color-background-button-error)}#chrome-extension-link{padding:9px;border:1px solid var(--color-grey-800);border-radius:10px;vertical-align:middle}#chrome-extension-link img{height:21px;padding:2px;vertical-align:middle}#realtime-conn-error{position:fixed;bottom:0;left:0;background:var(--color-warning);padding:10px;font-size:.8rem;color:#fff;opacity:.8}#bottom-horizontal-offscreen{position:fixed;bottom:0;left:0;right:0;width:100%;min-height:50px;max-height:50vh;background:hsla(0,0%,100%,.7215686275);border-top:1px solid var(--color-border-table-cell);padding:10px;box-shadow:0 -2px 10px rgba(0,0,0,.2);z-index:100;overflow-y:auto;transition:opacity .3s ease-in-out;scroll-margin-bottom:10px;display:flex;justify-content:center;align-items:center}ul#highlightSnippetActions{list-style:none}ul#highlightSnippetActions li{display:inline-block}@media only screen and (max-width: 768px){.box{padding:.25rem !important}}.box{color:var(--color-white);border-width:1px;border-style:dashed;border-color:hsla(0,0%,100%,.25);border-image:initial;background:hsla(0,0%,100%,.04);border-radius:10px;padding:1.25rem}header{color:var(--color-white)}#heart-us svg{width:24px;height:24px;display:inline-block;vertical-align:middle;cursor:pointer} diff --git a/changedetectionio/store/updates.py b/changedetectionio/store/updates.py index f81c4967..30d7f983 100644 --- a/changedetectionio/store/updates.py +++ b/changedetectionio/store/updates.py @@ -25,7 +25,7 @@ except ImportError: HAS_ORJSON = False from ..html_tools import TRANSLATE_WHITESPACE_TABLE -from ..processors.restock_diff import Restock +from ..processors.restock_diff import Restock, get_price_from_history_str from ..blueprint.rss import RSS_CONTENT_FORMAT_DEFAULT from ..model import USE_SYSTEM_DEFAULT_NOTIFICATION_FORMAT_FOR_WATCH @@ -825,3 +825,17 @@ class DatastoreUpdatesMixin: self.data['settings']['application']['llm'] = llm logger.info("update_32: cleaned up obsolete max_tokens_per_check / renamed max_tokens_cumulative") + def update_39(self): + for uuid, watch in self.data['watching'].items(): + if watch.get('processor') != 'restock_diff': + continue + versions = list(watch.history.keys()) + if versions and len(versions) >= 2: + snapshot = watch.get_history_snapshot(timestamp=versions[-2]) + if snapshot: + prev_price = get_price_from_history_str(history_str=snapshot) + logger.debug(f"UUID {watch['uuid']} setting prev_price to '{prev_price}'") + watch['restock']['prev_price'] = prev_price + watch.commit() + + diff --git a/changedetectionio/tests/restock/test_restock.py b/changedetectionio/tests/restock/test_restock.py index c62deb70..9bfcd852 100644 --- a/changedetectionio/tests/restock/test_restock.py +++ b/changedetectionio/tests/restock/test_restock.py @@ -49,6 +49,84 @@ def set_back_in_stock_response(datastore_path): f.write(test_return_data) return None +def set_price_response(datastore_path, price): + # JSON-LD product offer so the price + availability are extracted deterministically + # without needing a real browser (extruct parses the raw HTML). + test_return_data = """<html> + <head> + <script type="application/ld+json"> + {"@context": "https://schema.org/", "@type": "Product", "name": "Test Product", + "offers": {"@type": "Offer", "priceCurrency": "USD", "price": "%s", + "availability": "https://schema.org/InStock"}} + </script> + </head> + <body> + <div id="sametext">Available!</div> + </body> + </html> + """ % price + + with open(os.path.join(datastore_path, "endpoint-content.txt"), "w") as f: + f.write(test_return_data) + return None + + +def test_restock_price_change_direction(client, live_server, measure_memory_usage, datastore_path): + """The watch list shows a green ▼/-% on a price drop and a red ▲/+% on a price rise, + and prev_price only moves when the price actually changes (it persists otherwise).""" + + def get_restock(client): + datastore = client.application.config.get('DATASTORE') + uuid = next(iter(datastore.data['watching'])) + return datastore.data['watching'][uuid]['restock'] + + set_price_response(datastore_path=datastore_path, price="100.00") + + # JSON-LD restock data is parsed by extruct over the in-process html_requests fetcher, + # so we can hit the live server on localhost directly (no Docker browser container needed). + test_url = url_for('test_endpoint', _external=True) + client.post( + url_for("ui.ui_views.form_quick_watch_add"), + data={"url": test_url, "tags": '', 'processor': 'restock_diff', 'fetch_backend': 'html_requests'}, + follow_redirects=True + ) + wait_for_all_checks(client) + + # First check: there is no previous price yet, so no up/down indicator should render + res = client.get(url_for("watchlist.index")) + assert b'processor-restock_diff' in res.data + assert b'price-change' not in res.data, "No price arrow should show on the very first check" + assert get_restock(client).get('prev_price') is None, "prev_price should be unset on the first check" + + # Price drops 100.00 -> 82.00 => -18%, expect a green down arrow + set_price_response(datastore_path=datastore_path, price="82.00") + client.get(url_for("ui.form_watch_checknow"), follow_redirects=True) + wait_for_all_checks(client) + res = client.get(url_for("watchlist.index")) + assert b'price-change down' in res.data, "Price drop should show a down arrow" + assert '▼'.encode('utf-8') in res.data + assert b'-18%' in res.data, "Price drop percentage should be shown" + assert float(get_restock(client).get('prev_price')) == 100.0, "prev_price should capture the price we moved from" + + # Price rises 82.00 -> 90.00 => +9.8%, expect an up arrow + set_price_response(datastore_path=datastore_path, price="90.00") + client.get(url_for("ui.form_watch_checknow"), follow_redirects=True) + wait_for_all_checks(client) + res = client.get(url_for("watchlist.index")) + assert b'price-change up' in res.data, "Price rise should show an up arrow" + assert '▲'.encode('utf-8') in res.data + assert b'+9.8%' in res.data, "Price rise percentage should be shown" + assert float(get_restock(client).get('prev_price')) == 82.0, "prev_price should update to the new previous price on a change" + + # Re-check with NO price change - prev_price must NOT be clobbered, so the arrow persists. + client.get(url_for("ui.form_watch_checknow"), follow_redirects=True) + wait_for_all_checks(client) + res = client.get(url_for("watchlist.index")) + assert b'price-change up' in res.data, "Arrow should persist across an unchanged check" + assert b'+9.8%' in res.data, "Percentage should persist across an unchanged check" + assert float(get_restock(client).get('prev_price')) == 82.0, "prev_price must stay put when the price is unchanged" + + # Add a site in paused mode, add an invalid filter, we should still have visual selector data ready def test_restock_detection(client, live_server, measure_memory_usage, datastore_path): diff --git a/changedetectionio/translations/cs/LC_MESSAGES/messages.mo b/changedetectionio/translations/cs/LC_MESSAGES/messages.mo index 19d32f1aaa20983859b00f9e7fa710eb1f09b6f7..feb83250222e0fddfee6b30f56ba233a16279f3b 100644 GIT binary patch delta 10940 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 delta 10016 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 UJnxdw|NqYAv&RpuIaliPzwsk%d;kCd diff --git a/changedetectionio/translations/cs/LC_MESSAGES/messages.po b/changedetectionio/translations/cs/LC_MESSAGES/messages.po index 0c658357..29aacb1c 100644 --- a/changedetectionio/translations/cs/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/cs/LC_MESSAGES/messages.po @@ -23,16 +23,46 @@ msgid "Add a new web page change detection watch" msgstr "Přidejte nové sledování zjišťování změn webové stránky" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" -msgstr "Monitorovat tuto URL!" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" +msgstr "Přejít" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" -msgstr "Nejdříve upravit, poté sledovat" +msgid "Enter a URL to get started!" +msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "V současné době:" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "Vyberte podle prvku" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "Jasný výběr" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -40,17 +70,13 @@ msgstr "" msgid "Watch group / tag" msgstr "Sledovat skupinu / Značka" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" -msgstr "" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" +msgstr "Monitorovat tuto URL!" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" -msgstr "" +msgid "Edit first then Watch" +msgstr "Nejdříve upravit, poté sledovat" #: changedetectionio/blueprint/backups/__init__.py msgid "A backup is already running, check back in a few minutes" @@ -765,6 +791,10 @@ msgstr "" msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "" +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "Tip" @@ -2051,26 +2081,14 @@ msgstr "pro výběr více položek." msgid "Selection Mode:" msgstr "Režim výběru:" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "Vyberte podle prvku" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "Kreslit oblast" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "Jasný výběr" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "Okamžik, načítání snímku obrazovky a informací o prvku." -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "V současné době:" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "" @@ -2155,10 +2173,6 @@ msgstr "Duplikovat a upravit" msgid "Select timestamp" msgstr "Vybrat časové razítko" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "Přejít" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "Aktuální chybový snímek obrazovky z posledního požadavku" @@ -2452,6 +2466,11 @@ msgstr "Není skladem" msgid "Price" msgstr "Cena" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "Žádné informace" @@ -3186,6 +3205,18 @@ msgstr "Povolit favikony" msgid "Use page <title> in watch overview list" msgstr "Použijte stránku <title> v přehledu sledování" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "Kontrola zabezpečení přístupového tokenu API povolena" @@ -3346,6 +3377,132 @@ msgstr "RegEx k extrahování" msgid "Extract as CSV" msgstr "Extrahujte data" +#: changedetectionio/languages.py +msgid "just now" +msgstr "právě teď" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "za chvíli" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "před %ss" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "za %ss" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "před 1m" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "za 1m" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "před %sm" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "za %sm" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "před 1h" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "za 1h" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "před %sh" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "za %sh" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "před 1d" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "za 1d" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "před %sd" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "za %sd" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "před 1týd" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "za 1týd" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "před %stýd" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "za %stýd" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "před 1měs" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "za 1měs" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "před %směs" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "za %směs" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "před 1r" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "za 1r" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "před %sr" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "za %sr" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "" @@ -3974,6 +4131,10 @@ msgstr "" msgid "AI" msgstr "AI" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4318,6 +4479,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr "Je dostupná nová verze" diff --git a/changedetectionio/translations/de/LC_MESSAGES/messages.mo b/changedetectionio/translations/de/LC_MESSAGES/messages.mo index a91d18defdb6b573e47aa327e26a199c363cf552..c8aeb99ae367e6ea7a5a2fee1c17ebeb213125c2 100644 GIT binary patch delta 10026 zcmZA63w+LX|Httkn;mSJVVlKV4BKqtGC7XTnb}a5^J#3&Fk>6b@ya10#BC1ULU+`1 z3@hZ2+zun$lvQ^{sqXGhq#{YG`}MxQUyuLe@%QNA`Tcya-|u_)d_TY6u4dyBpEWCe zJfDX8u5tL2TG?^x;iOPS|M%xeW5)?3Jc|BUZoO#z5CiD{%*NkXf3*E~F@?`7HF2Cy z*cChAQ|NLWk8_wt4LYu%A6~cKvfe{YT&bz~JP;L!;8cvjTwIEi@HRe=nK6#j4u8km z*gDqS*9RkrAH{mi?@XY<HO^v;#@A32T*eUm1eKZV7>9xUr2!MIy)lq@Bv!#348lAd zjx#U?-$x$|Yi1S@iIL3jB+|&ie%J%|V@<q|WY4J{Z*EA$7Q|`zFwVy5xB~}cqXfrk zg)>n*+=V0XH2Pt5bI0+;X4ny1phr8MNTUuGqRwUsDibG>MLXYMForTKYjPT3YfMFb z?m>ON4O4JGM&Ym65W`qC$#dFaHOxfT<m9&?|6w#<prbmLp?3aHtdA9_BlsD$1D}?r zR;pSfQ5$H6LD&j4PG{Snj#}8`NLe^zQR6Pb5G-v;{%g=UNQXRQ{Wof*-=GG(W3A$5 zH^jA31IMH8YlpS4H&U<82pi8wUAGpsfGrq+?_erk_Ry$GBZ`BoiE-E!JK{q)7yIMi zF$2FtEi5_FaUQ{R)KM(JP&|l~gLBTtzoN#k%0=2p9aIf8MisRuj)n&8iOHCOI^z;l z%8%L4Pg^TcJN^Q-lb<mhe@7ibEmoz4H^3O|h&t<WsMN2-K-`Tyo*w5Q4Xx-W>m5|e ze#bf((8g4A6l$Wjn1%hZHolH}?9O5cUPSHq8fqcmql(eLt>g5;rZ^a<pue8~Gc>g0 zOX!^#m8t-ir#Kvys>Y~+x}YW+V?UpY%EVk7FGd|jiM13p{vp(Yzrt+1hxPRQk7;jG zJqJ|-3sF_Q7PXK~SQ&TW2Hb-hD2->e7G|PSIt}yCgB|e(7GfO1c-)9C^h+}Dkr?zo z|AT30qS2^SPPTCo&LUobI@`Zc3k>2#UKi`5cGecdaV&C)GZS^)0d(V8^kx=SQvscM z{bG&I<i9zMOgfap=dd2GN2Tx$RBfC=o<QdUvU%rEY=rHo*akQpwSifffJ;&L9Y8JY z2<nAafy&ffjK#_+9+T?$6w{H2qxoP2YQ;yaXHlvC0QDSyhsspVE~ePRQE?;G1hJ?M zwL(2z9Z^qBAB@7GsEj`8p`jZWVk9oLzKlEo&fBQ7zk^EoZ>ZX+#Y;k|d<ZpRBUFYG z@F5&&`)8mQz5sRqI#g!%qB88+PeThhYd^SXt-#9ke}p>AD@egQKVU12>1I+s47Jl- z?2QGe>klLK=UhM+26Q(Q#^E61BxJ!JXEhD2>?EovK1H2z%O2(kCSXJ2V${x`$13;_ zEW=XNgu{C}PA|+uZ|$JoA7?NEKSibfR}8~2E)Li8-<*b0)B|-^Lop6>FdkQ-is&fv zpYuL{DKquiZc}uj;$EnQr(zRah^=uuy6`j9QRywDBdUrWncrzjLvO6H7=U@Gr(n8u zHEPFuY`h<}!^_Ca&G|2;VEt56WTQ|!oQ(eXG_q-DIkvzG)I7d@$-f4!MnhF!3j?tb zRsC~pycA=JOHkJzwf!ehJHCLbZvQk>l;NmUN8w}G33Y@kQAN5BmANm|$iF_Qnr?QK zfJ${TYJkD0BARYL--}A!N!0Ux4OKfgZGT`tv*RWhM1ONsCfZ|j9DpG>7gfy9^&|h) zX`G=$6Ml%=$sMa-fAgvhL!~kvt6?H);x4FE4o6Ltg}QDQ2IB(M_$yHh-;B!OVXT42 zJv21XyQmw!M;*mo)Jlg8FcajWFL43t-CvBV?q%2#U&3s>jDFajM@dzmf;!TnsD+Kg z8aNSaqGuM35E{!-E8T>;U>CaaD7x?_YNsI_sEVmBYR6-64HjcftTxbOvH@zLol*S* zQR8Q0Ei6Kg$m2XiLp4x>O3{AQoA5mw-@r!1ff?r8Z~{gXKZ?438Y&a3P_<Kv4e%K9 zDseu;B5eFP=Z?>#G7~XK8{+)kG;}5%uokAEQka2ZI2<3r0`$RGQ5oBbO6^f>iRGx; zxQjX}zrkk5LAZuE62ov0CSW<XV1DN|4eg}y5VOM+tV5iQ@8K+DOsC&a^A+l4)Z=&p zkK=XZk#=?uBhC05(&eNNH{SzFQBTpAs3VLTVV;f{^n}upNJBg8iCTFoDkJ?-3ws<@ z6H`$;m}gy&y6!d9)AI)Ej4QAoeu+)6)ksr(Lr@tWgPNykB>7h=XV6g<m!ej<2K6*- zLM>ni>V|Sm!t<yj3LIqy4nbuk0+X=|>hpQ1BY6gE<67Il1NAiQ8%6%>(l|ticjc&R z{StM<FBpMUN1GQ^G`1&hgX*7xF}MV^v%Q#$r?4xw7-PO{7N9cy4r=_X7>74KG*sPn zGtCd1By3GQ9(BP+Y=-5i)c=e+>%g(*DagQj#7|-ru0hJlc^z4U6Fklw(Ij*e7oak` z6}1r0UK*O{1nP`$psM{38z*L&9d^S&`X{1}Xd3G5=VCH0M7?rP+Wt$Z%zl7A_#=kn zZB$JJXWQq$6%D1XGiu<+P&W+6DmWUo(roO7#kdTQq0Tn#36q&&sCX*s>^;^+*5#-( zFR}3pUOoIjnf+ipss{F96+CV&w_ZR$`Y+q~V;f&XE&OX#27W}1b03wlpd3@Ybx;e4 zL>*}(3}SvKorZ20ivBnrb>kEp&qNJ8A9Z#sP!n!IU)+ifa2x7HbQTlv9_k2U#+w@H zf-d4w7=s@4{`@bc(Ugu|=#LfH2d`i^Y?^Dn^G!e%(MHt37g1IHt&Q)a9_O$L=E!2u zMcf_}aTw~TS6E+~!1J#G_S2#2K8w>UInFiIK!YdQj9?(~6zfduLi_m&4B+#%Hr|Xq ziAzx%_yJR}Ri1fI6rzg#g*@`_M`I@)8lcR2#Ci&qk$<7C`v6ztRa}l!C-ZwF{0sNt z;(Rl4hbbmA^H4`yf=c-o)MI)M^&a`oLqm^S<Edr=!%!(2hY47W{ctPlO?V6S)3HW@ znV=a46L&(ruu}0jj>ZgZSZHcwI>r*u!bZ3iE6`I;;|Urs6qx~irkM-FFpmCYR4Q|^ zEAGLycnf)you$*w50{(hB5qd97f$Sp%G|rwkFXE%=QfUi(py6wCy|C$nvNauCG3r# zVhF~}Fuyo#hXaVG+qfKS5?7gN-gw~{Pn?er;|6r&JE*h1kF7CymU$6%!4UoYAL?!J zdqC?f>oQc)ZA1-FYCT~4%TZ_hE-IzhP&MQ;+q{T^u|07lw!{n!#ivo@t(SWKU!|d) z9<-iC?d)Ugb*xMLC+fzCIp+FUR57(j?RW_4J+K(-U@11oqo{>_kGXgo^*$Ljm-E*| z6KIUV*%*yik^h`Ztd2Tzo<c3~7Pdp*r_9beVQq&ZMHSaF)B@i?W$qN#!;7dF)pgW@ zenMrg!94OmjK;(BOtmjTt#m(X!eglS!X=ErudymR^Uc6PsOpbJE#MJUCPty2p5>?s z5242U2FK!WsBuOtU`J}?EHD<JCYpm<`C5#|GF*rsVmOW<P<0ofGB_JG&I)XT&tn`O z!=d;s@_;zqcr>)ZL)ZpScxY&VdsqvD7n#_Fs^(Uxos2>i&$Cz!H=!1=6P3!>QTLxf zUH2jO!S65%TQBBEHV#B>=q&1f&kY(rG=4#y*>9);eV#Et1w-)+aRj>Xb5wCvUSh6` zK$7CbU>fegGQ5kbp`A<3yFdO}^ULkgsEJ=j7VL3$*^c9;!#Rt8<ASTGVw$qd)WB1y zvs{Ng@sy2&m)ln^s#fM<UtEtm^Z%e9{(|H1J|^Ip71}W8znn%S9qUj>u@8OmB)ah| zCgbne7&|^^`p2NI{~NZ&tr&n;upxeh-O+!g$!r?x1vChC-Lu$+`JECP>+l?Ez;Ub0 z%BP`<aS?XH&8VGRMGf#Dtb#Xee9L+tRRdK>qwbGD6`LFNxQ@pVoP!<}!wMSBa35-? zSFtkIUu~WO7wXJ9p%%~s12GNth8u+OxDr(xM^G7k4^@0OPzwz%F*Ov5iW5u7zf#?v z4(+HjD(;1P%+jzoW?>K9g|+Y&Y6t#n*ab$Q`q!ea-;O%tTc{1X)|&r2?v6T|?N}er zuO<JJX?#b=036CW)X)W}0S=*_>#tD@{25=z-?0wvS<f#o@ic~E?DJ-a$=HZ^3@Wn= zP!sRA{g*JD_?Cx8D2<@Mn{Oylm_|Gr>*7uvgs0JaBpb}{a9pT(0CvEEn1m~==dcZN zzzgPGpNv{SUo5~p3`Wm28rs<n)P#3XMH8~ooKYMqRV}b4reiveMlEa?Dr3Hz%r~6c zsPU5U3G9J=a3`vU?x4>8PbB%A|7Nq2g{YLSLKRmj#^GMn4WHQl&oPDgd(^}UFPedq zP>)-8oQ6v<5&uHfMB+b8=4NA4;+<GiOSnwKMaNgDv+{e%9Dy4f63<25@FJ?n%265m z1nc8%48qVY=FFo|XWIpJ1Vd39TZtX<6;vj_z=q84+@_%#2-|9m!-t5IP^lb(s`gB5 zj0LDvu0t(kvyBg;&h%}pju+5{SFjrXfweK{WiyToJ({2gjk(wlwZjXj2|h<1#kbfP zZ=nW=c*WE}b1WvFg?{=Rm9cv^u2*U{5RLWdPe5g+4~Ai8Df!pRo}@!A!me0?I*Jc% zf8|#xIN}ggW~SgST!u<*hi#@-2B3?0ChEEks2VwdT6j4sGgmMUzu!jwT{P-!H(#CF zpyENOH(D{q;uh<9j3)jCwWGQ_%tURlDe+_Y7|uXt^gKR;eRrDsDzGZ?T?|4W58G%! zqXzn83)ITnVmBO!KDZ9G@(rk3*p8j?FsgR$p)Xe3Z88~($BA7SiC>_u{{uB{(racx zo~LNEq+=_pn%~FBN}MI?MNxgP`KdJzn-TBF)A%`N;;Z}2uh*)Uk#=GaYNC7C8{6}` z)Q;z4O<a!EaWk@DkF%Rb6*|hSZ(<|jV^|r#K&ARCYvni0^$oBI{Y_8<_r*~-5<B7% z48Xgn3|HE3GT9JSd`&P&&wmn)KstJ(R`wVw6Pc*gd$0>GKvnN4)OA-;uiop}3u6wL zV$4U~|Fm@rYW(A<$MYP<<G<1S@Bh9B%?%AuHP8u_fgZMhJoYDEget}lun+!aKkxG< zpAqNaVEh3WV9!J5$L~8BPW&yl#Y%_GIPFpY{_KpUk&GpngcbM*);wZT)eEN)k3tPl zfvWc4qsBy>NIVR6-Dy;HC%t9<;juSH67NN2?mVhCK6#7$KSZPPG1HNPVZ=+Y1-^(n z!%L_EKSDqJ3J2nK+n@5b$y^$$CNfa9GZR&`bFdA*iaLVNur^+Q+hYc-#IvHa4nR#9 zjP<Y%>TFx#GMtIpf&V|v;}eEja0k@F9!1?h#F}ZHU_UQJ9q~*X&-c*KfJ;zM!Fqea zChIHK-KYunqpmxO%E$@SjxM6!16QyP-b7tr<%D@(1f!0wK5D+lu?BjwXs9}iP&dp) z?cizDz$>sCZb03z4fUdV6ZPJB3zgcNn21eJnx6r~&_z5Obp#tx*PlUO{0*Dy`TvuK zCQdkIzJeuUU*d(R0WV=P`kpqAO?OnyOu_oN3>)HhRFR#>F8DQOV_doUV)7j7`U4n+ z@1sk<OTA6QiFOUnEE+dHyU=M;nB~gM$;a{5ya(pnMxnLXI-@|1)xDw{u8xU57w<L$ zxXt};bGtjw-0e0uxy?OgKSfVW@i3*6JK4pIhCEBYvCvR#m{A~On#3067EQ{ID~wU- z_733o-tYF_&V1evymv91Ghtd`k!x~(u`?-m@<i7Yxdnwq4?B7J1=+6EGqUmn3vzSD zdp|GxI_suy=jr(ctS7@U4lK&Dt@PZ<4_f&TT7|Y}aK3G%t{yX?+3LS?ue8+dZZnGe z!65DjW4P1p5N>;?JGJcN2~TE_j|{U{-QrD*ZZQpR@iuHyxYHY^ivOP!?<n4R`OrJ9 sS2KhrRha7JWEW&+WxKM+W>0p~NY3i9$9DMTOv=t3H@+<R?Nz@218O+T+W-In delta 9111 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 diff --git a/changedetectionio/translations/de/LC_MESSAGES/messages.po b/changedetectionio/translations/de/LC_MESSAGES/messages.po index 204dee2b..b4be8aa3 100644 --- a/changedetectionio/translations/de/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/de/LC_MESSAGES/messages.po @@ -23,16 +23,46 @@ msgid "Add a new web page change detection watch" msgstr "Fügen Sie eine neue Überwachung zur Erkennung von Webseitenänderungen hinzu" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" -msgstr "Diese URL überwachen!" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" +msgstr "Gehen" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" -msgstr "Bearbeiten > Überwachen" +msgid "Enter a URL to get started!" +msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "Momentan:" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "Nach Element auswählen" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "Auswahl löschen" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -40,17 +70,13 @@ msgstr "" msgid "Watch group / tag" msgstr "Gruppe / Label" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" -msgstr "" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" +msgstr "Diese URL überwachen!" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" -msgstr "" +msgid "Edit first then Watch" +msgstr "Bearbeiten > Überwachen" #: changedetectionio/blueprint/backups/__init__.py msgid "A backup is already running, check back in a few minutes" @@ -781,6 +807,10 @@ msgstr "" msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "" +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "Tipp" @@ -2096,26 +2126,14 @@ msgstr "um mehrere Elemente auszuwählen." msgid "Selection Mode:" msgstr "Auswahlmodus:" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "Nach Element auswählen" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "Bereich zeichnen" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "Auswahl löschen" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "Einen Moment, Screenshot und Elementinformationen abrufen." -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "Momentan:" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "" @@ -2202,10 +2220,6 @@ msgstr "Klonen und bearbeiten" msgid "Select timestamp" msgstr "Zeitstempel auswählen" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "Gehen" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "Aktueller fehlerhafter Screenshot aus der letzten Anfrage" @@ -2503,6 +2517,11 @@ msgstr "Nicht auf Lager" msgid "Price" msgstr "Preis" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "Keine Informationen" @@ -3238,6 +3257,18 @@ msgstr "Favicons Aktiviert" msgid "Use page <title> in watch overview list" msgstr "Verwenden Sie die Seite <title> in der Übersichtsliste der Beobachtungen" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "Sicherheitsüberprüfung des API-Zugriffstokens aktiviert" @@ -3398,6 +3429,132 @@ msgstr "RegEx zum Extrahieren" msgid "Extract as CSV" msgstr "Als CSV exportieren" +#: changedetectionio/languages.py +msgid "just now" +msgstr "gerade eben" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "gleich" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "vor %ss" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "in %ss" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "vor 1Min" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "in 1Min" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "vor %sMin" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "in %sMin" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "vor 1Std" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "in 1Std" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "vor %sStd" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "in %sStd" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "vor 1T" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "in 1T" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "vor %sT" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "in %sT" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "vor 1Wo" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "in 1Wo" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "vor %sWo" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "in %sWo" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "vor 1Mon" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "in 1Mon" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "vor %sMon" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "in %sMon" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "vor 1J" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "in 1J" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "vor %sJ" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "in %sJ" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "" @@ -4030,6 +4187,10 @@ msgstr "Suchbegriff eingeben..." msgid "AI" msgstr "" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4374,6 +4535,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr "" diff --git a/changedetectionio/translations/en_GB/LC_MESSAGES/messages.po b/changedetectionio/translations/en_GB/LC_MESSAGES/messages.po index 371b39cd..690f9a28 100644 --- a/changedetectionio/translations/en_GB/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/en_GB/LC_MESSAGES/messages.po @@ -23,16 +23,46 @@ msgid "Add a new web page change detection watch" msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" +msgid "Enter a URL to get started!" msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -40,16 +70,12 @@ msgstr "" msgid "Watch group / tag" msgstr "" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" +msgid "Edit first then Watch" msgstr "" #: changedetectionio/blueprint/backups/__init__.py @@ -763,6 +789,10 @@ msgstr "" msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "" +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "" @@ -2047,26 +2077,14 @@ msgstr "" msgid "Selection Mode:" msgstr "" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "" @@ -2151,10 +2169,6 @@ msgstr "" msgid "Select timestamp" msgstr "" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "" @@ -2448,6 +2462,11 @@ msgstr "" msgid "Price" msgstr "" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "" @@ -3180,6 +3199,18 @@ msgstr "" msgid "Use page <title> in watch overview list" msgstr "" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "" @@ -3340,6 +3371,132 @@ msgstr "" msgid "Extract as CSV" msgstr "" +#: changedetectionio/languages.py +msgid "just now" +msgstr "" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "" @@ -3968,6 +4125,10 @@ msgstr "" msgid "AI" msgstr "" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4312,6 +4473,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr "" diff --git a/changedetectionio/translations/en_US/LC_MESSAGES/messages.po b/changedetectionio/translations/en_US/LC_MESSAGES/messages.po index edb518e7..f2f98bff 100644 --- a/changedetectionio/translations/en_US/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/en_US/LC_MESSAGES/messages.po @@ -23,16 +23,46 @@ msgid "Add a new web page change detection watch" msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" +msgid "Enter a URL to get started!" msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -40,16 +70,12 @@ msgstr "" msgid "Watch group / tag" msgstr "" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" +msgid "Edit first then Watch" msgstr "" #: changedetectionio/blueprint/backups/__init__.py @@ -763,6 +789,10 @@ msgstr "" msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "" +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "" @@ -2047,26 +2077,14 @@ msgstr "" msgid "Selection Mode:" msgstr "" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "" @@ -2151,10 +2169,6 @@ msgstr "" msgid "Select timestamp" msgstr "" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "" @@ -2448,6 +2462,11 @@ msgstr "" msgid "Price" msgstr "" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "" @@ -3180,6 +3199,18 @@ msgstr "" msgid "Use page <title> in watch overview list" msgstr "" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "" @@ -3340,6 +3371,132 @@ msgstr "" msgid "Extract as CSV" msgstr "" +#: changedetectionio/languages.py +msgid "just now" +msgstr "" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "" @@ -3968,6 +4125,10 @@ msgstr "" msgid "AI" msgstr "" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4312,6 +4473,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr "" diff --git a/changedetectionio/translations/es/LC_MESSAGES/messages.po b/changedetectionio/translations/es/LC_MESSAGES/messages.po index d7f7d9af..4c12174f 100644 --- a/changedetectionio/translations/es/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/es/LC_MESSAGES/messages.po @@ -19,16 +19,46 @@ msgid "Add a new web page change detection watch" msgstr "Agregar un nuevo monitor de detección de cambios en páginas web" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" -msgstr "¡Monitoriza esta URL!" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" +msgstr "Ir" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" -msgstr "Editar primero y luego monitorizar" +msgid "Enter a URL to get started!" +msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "Actualmente:" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "Seleccionar por elemento" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "Borrar selección" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -36,17 +66,13 @@ msgstr "" msgid "Watch group / tag" msgstr "Ver grupo/etiqueta" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" -msgstr "" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" +msgstr "¡Monitoriza esta URL!" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" -msgstr "" +msgid "Edit first then Watch" +msgstr "Editar primero y luego monitorizar" #: changedetectionio/blueprint/backups/__init__.py msgid "A backup is already running, check back in a few minutes" @@ -799,6 +825,10 @@ msgstr "Habilitar o deshabilitar favicons junto a la lista de monitores" msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "Número de elementos por página en la lista general de monitores, 0 para desactivar." +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "Consejo" @@ -2110,26 +2140,14 @@ msgstr "para seleccionar varios elementos." msgid "Selection Mode:" msgstr "Modo de selección:" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "Seleccionar por elemento" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "Área de dibujo" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "Borrar selección" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "Un momento, obteniendo captura de pantalla e información del elemento." -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "Actualmente:" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "" @@ -2216,10 +2234,6 @@ msgstr "Clonar y editar" msgid "Select timestamp" msgstr "Seleccionar marca de tiempo" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "Ir" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "Captura de pantalla con error actual de la solicitud más reciente" @@ -2519,6 +2533,11 @@ msgstr "No en stock" msgid "Price" msgstr "Precio" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "Sin información" @@ -3253,6 +3272,18 @@ msgstr "Favicones habilitados" msgid "Use page <title> in watch overview list" msgstr "Usar <title> de la página en la lista general de monitores" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "Comprobación de seguridad del token de acceso API habilitada" @@ -3413,6 +3444,132 @@ msgstr "RegEx para extraer" msgid "Extract as CSV" msgstr "Extraer como CSV" +#: changedetectionio/languages.py +msgid "just now" +msgstr "" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "No se encontraron coincidencias al escanear todo el historial de visualización para esa expresión regular." @@ -4045,6 +4202,10 @@ msgstr "Introduzca el término de búsqueda..." msgid "AI" msgstr "" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4398,6 +4559,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr "" diff --git a/changedetectionio/translations/fr/LC_MESSAGES/messages.mo b/changedetectionio/translations/fr/LC_MESSAGES/messages.mo index 0203b54763bb023672bc5ce3c5890872901771b0..52903d338a042fd10ac57e8b00aca059bf034adc 100644 GIT binary patch delta 8678 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 O{eD&AuE5o~0sjL}^_g%0 delta 7696 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 Ddj`PB diff --git a/changedetectionio/translations/fr/LC_MESSAGES/messages.po b/changedetectionio/translations/fr/LC_MESSAGES/messages.po index 7c78b159..84e45e90 100644 --- a/changedetectionio/translations/fr/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/fr/LC_MESSAGES/messages.po @@ -23,16 +23,46 @@ msgid "Add a new web page change detection watch" msgstr "Ajouter une nouvelle surveillance de détection de changement de page Web" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" -msgstr "Surveillez cette URL !" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" +msgstr "Aller" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" -msgstr "Modifier > Surveiller" +msgid "Enter a URL to get started!" +msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "Actuellement:" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "Sélectionner par élément" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "Effacer la sélection" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -40,17 +70,13 @@ msgstr "" msgid "Watch group / tag" msgstr "Groupe / Étiquette" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" -msgstr "" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" +msgstr "Surveillez cette URL !" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" -msgstr "" +msgid "Edit first then Watch" +msgstr "Modifier > Surveiller" #: changedetectionio/blueprint/backups/__init__.py msgid "A backup is already running, check back in a few minutes" @@ -769,6 +795,10 @@ msgstr "" msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "" +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "Astuce" @@ -2058,26 +2088,14 @@ msgstr "pour sélectionner plusieurs éléments." msgid "Selection Mode:" msgstr "Mode de sélection :" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "Sélectionner par élément" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "Zone de dessin" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "Effacer la sélection" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "Un instant, récupération de la capture d'écran et des informations sur les éléments." -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "Actuellement:" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "" @@ -2162,10 +2180,6 @@ msgstr "Cloner et modifier" msgid "Select timestamp" msgstr "Sélectionnez l'horodatage" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "Aller" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "Capture d'écran erronée actuelle de la demande la plus récente" @@ -2459,6 +2473,11 @@ msgstr "Pas en stock" msgid "Price" msgstr "Prix" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "Aucune information" @@ -3193,6 +3212,18 @@ msgstr "Favicons Activés" msgid "Use page <title> in watch overview list" msgstr "Utiliser la page <title> dans la liste de présentation des moniteurs" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "Contrôle de sécurité du jeton d'accès à l'API activé" @@ -3353,6 +3384,132 @@ msgstr "RegEx à extraire" msgid "Extract as CSV" msgstr "Extraire des données" +#: changedetectionio/languages.py +msgid "just now" +msgstr "à l'instant" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "bientôt" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "il y a %ss" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "dans %ss" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "il y a 1min" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "dans 1min" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "il y a %smin" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "dans %smin" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "il y a 1h" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "dans 1h" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "il y a %sh" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "dans %sh" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "il y a 1j" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "dans 1j" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "il y a %sj" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "dans %sj" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "il y a 1sem" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "dans 1sem" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "il y a %ssem" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "dans %ssem" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "il y a 1mois" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "dans 1mois" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "il y a %smois" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "dans %smois" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "il y a 1an" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "dans 1an" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "il y a %sans" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "dans %sans" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "" @@ -3983,6 +4140,10 @@ msgstr "" msgid "AI" msgstr "" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4327,6 +4488,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr "" diff --git a/changedetectionio/translations/it/LC_MESSAGES/messages.mo b/changedetectionio/translations/it/LC_MESSAGES/messages.mo index 6cfac14ae8a2881d276cba345c997292f4d925d4..9c45d920b5a11362cccea67cf6b174e8c9aea419 100644 GIT binary patch delta 6143 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 delta 5233 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 diff --git a/changedetectionio/translations/it/LC_MESSAGES/messages.po b/changedetectionio/translations/it/LC_MESSAGES/messages.po index 7c21ade9..09d6bf04 100644 --- a/changedetectionio/translations/it/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/it/LC_MESSAGES/messages.po @@ -23,16 +23,46 @@ msgid "Add a new web page change detection watch" msgstr "Aggiungi un nuovo monitoraggio modifiche pagina web" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" -msgstr "Monitora questo URL!" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" +msgstr "Vai" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" -msgstr "Modifica > Monitora" +msgid "Enter a URL to get started!" +msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -40,17 +70,13 @@ msgstr "" msgid "Watch group / tag" msgstr "Gruppo / Etichetta" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" -msgstr "" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" +msgstr "Monitora questo URL!" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" -msgstr "" +msgid "Edit first then Watch" +msgstr "Modifica > Monitora" #: changedetectionio/blueprint/backups/__init__.py msgid "A backup is already running, check back in a few minutes" @@ -765,6 +791,10 @@ msgstr "" msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "" +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "" @@ -2049,26 +2079,14 @@ msgstr "" msgid "Selection Mode:" msgstr "" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "" @@ -2153,10 +2171,6 @@ msgstr "Clona e Modifica" msgid "Select timestamp" msgstr "" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "Vai" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "" @@ -2450,6 +2464,11 @@ msgstr "Non disponibile" msgid "Price" msgstr "Prezzo" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "Nessuna informazione" @@ -3182,6 +3201,18 @@ msgstr "Favicon attive" msgid "Use page <title> in watch overview list" msgstr "Usa <title> pagina nell'elenco osservati" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "Controllo sicurezza token API attivo" @@ -3342,6 +3373,132 @@ msgstr "RegEx da estrarre" msgid "Extract as CSV" msgstr "Estrai come CSV" +#: changedetectionio/languages.py +msgid "just now" +msgstr "proprio ora" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "tra poco" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "%ss fa" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "tra %ss" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "1min fa" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "tra 1min" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "%smin fa" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "tra %smin" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "1h fa" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "tra 1h" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "%sh fa" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "tra %sh" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "1g fa" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "tra 1g" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "%sg fa" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "tra %sg" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "1sett fa" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "tra 1sett" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "%ssett fa" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "tra %ssett" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "1mese fa" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "tra 1mese" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "%smesi fa" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "tra %smesi" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "1anno fa" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "tra 1anno" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "%sanni fa" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "tra %sanni" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "" @@ -3970,6 +4127,10 @@ msgstr "" msgid "AI" msgstr "" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4314,6 +4475,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr "" diff --git a/changedetectionio/translations/ja/LC_MESSAGES/messages.po b/changedetectionio/translations/ja/LC_MESSAGES/messages.po index f89a77f8..95942d4f 100644 --- a/changedetectionio/translations/ja/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/ja/LC_MESSAGES/messages.po @@ -24,16 +24,46 @@ msgid "Add a new web page change detection watch" msgstr "新しいウェブページ変更検知ウォッチを追加" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" -msgstr "このURLをウォッチする!" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" +msgstr "移動" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" -msgstr "編集してからウォッチ" +msgid "Enter a URL to get started!" +msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "現在:" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "要素で選択" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "選択をクリア" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -41,17 +71,13 @@ msgstr "" msgid "Watch group / tag" msgstr "ウォッチグループ / タグ" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" -msgstr "" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" +msgstr "このURLをウォッチする!" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" -msgstr "" +msgid "Edit first then Watch" +msgstr "編集してからウォッチ" #: changedetectionio/blueprint/backups/__init__.py msgid "A backup is already running, check back in a few minutes" @@ -770,6 +796,10 @@ msgstr "ウォッチリスト横のファビコンを有効または無効にす msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "ウォッチ一覧ページの1ページあたりの表示件数(0で無効化)。" +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "ヒント" @@ -2066,26 +2096,14 @@ msgstr "を使用します。" msgid "Selection Mode:" msgstr "選択モード:" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "要素で選択" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "エリアを描画" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "選択をクリア" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "少々お待ちください。スクリーンショットと要素情報を取得しています..." -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "現在:" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "申し訳ありませんが、この機能はJavascriptとスクリーンショットをサポートするフェッチャー(playwrightなど)でのみ動作します。" @@ -2170,10 +2188,6 @@ msgstr "複製して編集" msgid "Select timestamp" msgstr "タイムスタンプを選択" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "移動" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "最新のリクエストからの現在のエラースクリーンショット" @@ -2467,6 +2481,11 @@ msgstr "在庫なし" msgid "Price" msgstr "価格" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "情報なし" @@ -3199,6 +3218,18 @@ msgstr "ファビコンを有効化" msgid "Use page <title> in watch overview list" msgstr "ウォッチ一覧リストでページの <title> を使用" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "APIアクセストークンのセキュリティチェックを有効化" @@ -3359,6 +3390,132 @@ msgstr "抽出する正規表現" msgid "Extract as CSV" msgstr "CSVとして抽出" +#: changedetectionio/languages.py +msgid "just now" +msgstr "" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "その正規表現についてウォッチ履歴全体をスキャンしましたが、一致するものが見つかりませんでした。" @@ -4001,6 +4158,10 @@ msgstr "検索語を入力..." msgid "AI" msgstr "" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4355,6 +4516,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr "新しいバージョンが利用可能です" diff --git a/changedetectionio/translations/ko/LC_MESSAGES/messages.mo b/changedetectionio/translations/ko/LC_MESSAGES/messages.mo index f75236fd9062be450778b800c17cf15d6da552a8..8eb5bf6c97daf675ed00706bbeefc5710952d1ae 100644 GIT binary patch delta 16785 zcmYk@cYKc5|Htv`4iXtwtQZ+2kw}ch-qM&cgV-a~3^7A&mlmZ)&7!DXN-3pAi)yW! ztx~f}^{cH}-L<N}*ZV%l<JbQ2eV)&`uItRtx$ZlO?}nAW=il*luLtLR)8W56IUJ`X z_6b+?|Nm{N=QxcCw_-#51N&ml`i|p|tFQ!aLO(oeJ!8FqxvBrw#y?trHubLa7lkBl z_!sM95<xATgc0}=X5dw1j84Os9H%rk#W);<<#90v;1SG+Ut%7-fg0!o^u@oe&%L^i zlPlSbJP36|Asd&#{KS#i39I06oP!$BznF;`4IJk!yojT47|T=xf5bu<-pFx^V->84 zt+6n^j(+s-tfJt98&ONO8N+cWs)6&k4{u`+kK?RoKZ+9PXle#n0t*nAv)02v;#BO6 z-LL}gMs3v(SOh&Oj^paV5DFSm94ZHruoQMjEvbt^I1{zUOE3giq3+*{F?a!I;y)OP zGnzS09o&L??haPMUr{R?)!cEt4ODIJIAy75i<<ES>wNSl-hkb3JLbYXEzArHVprmD zq)lf$CgCwuuK2Yy0}VvwRFsX=QCl*mCF@_6!a^$Y;tA}Jmyy+Wl3JOieGTJ?mm+!N z9L6Zj)!K9rXKjELsqcmra5iS+KJ18<Qq2m?#8~13E(I;+kEo>i7dc^0jW#SVjz-PA zXj`*nBT-2@4Rhjb%!~7}Hm*iBd=2wqu6AbW3!}C;)LI!Mh}{$lTAG2j;vLkIA4Bco zS=842fp2428t(|)k3m?fy;+$GScSMV>i#!S*Y{!)9>p;9?O<{%8X2hTG@+1(3&XG+ zPQoJi9%^QX@G^ddO4iM+V`1Enp?D7S<1eV(@N_aO<cC^;yw)&O5>~(ztcKm`-<eE- zd~vR$k|~}u6NuAM16YW9a4l*^o3RY;K@H$K2IDi-!18r51BylspqjNYY62Z>JOK01 zzcYq{I(p6eCTa!NV^Q3PA$T4&u=}WiJVNgtGwOoGg)th-+PF39zTT(-4@0fc63mTn zqpM@HfkFWOikiVQtbxH~o(9+)v+xvZ2KBp}m1={$1f8u|4Szx9PD~H;qDe$`)DpEt z9k4a_N1dWQJ!rlkg~wEoPfpKtvv<3&BJqAyZrn$$$P=uJ1$vrfYl2$(2^f!au{iES z)n7zS><+4(KTs>})5~mmfnKgTMm?y|9{0v#I0z$f8kWQjs0I#Wef$dJu)xcXlYn(l z$8s?0zLC~fQCl<*wGyjQTe=BJ7w0pVLK6xldXop(8@0#Rums-57|h9;D~IJUCw4{+ zpa*JcU$^lx)BulSb<EY*OsFn~5_d$kI|{W`?tBV~6qcj*{0!zqU-l&g1F;@P;Q;K7 z8}KypN^r9JoBKaUCEICK4qZV#{}46f+&rv)B5)YC#gR&{!xXgFH8RYLWdIf;K7+aN zd-TQIsF^-Q?Wr@+%p?$_31ct}TVe`kVn^JKewcR<`GrL=4o9QE(tE9~*n*nDB~+5! zLe1cJTOX8ZlB^gGrM?krV7pK`vL7{oE2x1!!XWe?Z1%ngYC_?t<c!83`gdyBibfbt z+{wmcP$Qj%T9Mtj6i=Z}L!Tk$IE}|Ps>ezg%IIoiDzcl-Y~+ABzhO4EVf{7W<LGJz zKTy!QzK>d}=k^BQ;ijQT)QY5|4-P@?>2O?*uVVp>9$^Mr9X0b7s1@vtdO?jqe|*h4 zZv^YlWSnJGXvDdB%jiYZkpCeqoV^%<rO1?un2Z|W2rPr+Py<_oTH5V4-i?gOIf~=4 z`Y3a%cA^G)5OvJI8pZl+iSJRN85LoD>R<)bjf1c&PQ*mKf|^<2XtVbr*oHV9%j0m& zjjJ#c-^I3g8ly0Lj2Uo4%tzeLrJ%j&jlnn>b^I1$5nPI^a2w{w)?>{%?uiM+ldz_) zV`;pD%AuffrlWFLj<`0e-2qq>2V-Y+r%}*IZ=m)j2kTV@^I$9{V>%8(E&VB5f8N$V zL#;@+3C0X8NSuvLa3*St&RK7w`uPP5>-;~VppoaFXa-W*+7Vx+emu6v=hzI>Ch;=? zu0rKNXSPs#KN;2GYe>V+7Z`xItPe4i_zCL%kjWYdK^O(?SuEzkMAY8YN1f-^7>Gkq z501m)IN7=!`w{O(-5>gjIR$mFA#oe5ii@!oo<^Ob63otf{=+B~qaq%)#EnoLwM5ON z9qO27U?&`gh42JwMXsZkwCog<6P2+9aUWFuWYm_-wDl`d{e6tClHzL$%JwU$B)o?j zz;o2~oKsCQ`lI3q^ucIUL$O#IlTq#T#Tqyom9*Qj5`Kotg+EX$o?{y8-;_eoH1lA4 ztVP@(BXBKhK!>pdUPNVm`Pa<e_CO6F19c3iU}e03HPL^%Ny-MOl}*J`*vZD@rnCP! zsd$x&RGf~v@G|bi>o^1#%rIY2Jg=K?JRMLSy@i_b8Ek?#Py>#cX|}Ewh7hNsaw7wE ztY@H(;VPGc_GS+%`A%V3yn@X!$1L-q(;5d7k4HWDBkI2An2fQr%>V|Wwq_@4V7svl z9=G)mu@~`gsAP20=9m}6I@FS##rhcVhDo+&*o=4`Zp5E)3of2(K6V?-Gw+KGjG%rc zmdAtWj}K6L{WmI^o%tp?i(qY?|4I~e!w`(Z(HMX$Z2d;m3T?-dcm(U<O&f<TFk4m| zHPe?c2nV2!@hH@D(@^cM#bDfu)pY(prI19$->3&_EHq2g6uS~HLG9V^=!XG|%x^@3 zu_AG2)C68f<<0_3$EBzhc!U~|&zmOBhq1)P(EIa$G6glz4Anq8)PtQ-Thbdfu(#0{ zx1y5iLu`xZQCVGPu{j-0Q7bVPRlgd8@enF^E}))&fUaH?K}*a4Vo}F05%oYO>bi@0 zaXIR^ZMOACumSORsFjIYYTlIPun2JtR4%l}{5TN{;2Ws+S1)D#U!t&+3hmLK7>>bj znVD8XjkG4FU?<GNwO9j-EHeXZjk>P~YNaMx=U^e?w^0M!fqC#_?1#sfvH!&=R9tSd zJOwr4MOXn3q4w%mEQ`fgm~-C{wPj;aGkpcs!BW&-uSTudR_lH&L3|3e#Xq42`oN{2 z0sMn%py=D?=lyV00~4?|&O#07bJVN$FI0oYR+<j0qLMBd7vNgdl2=`22HF_)qHB#> zku+3}xEU05EaqWhT#gC&0rti3F&dk$Hd`_TLx@MAlJpJq&KxzP)u`*+QG0y?HIQ#m z6S|MO?<pqg{0FWvFOIsXCGCNYu|H~Q-$xSMIf`nq>sqrygE5TwBx*)?Q16fDSQ;bO znKx%+)N>=OQ&9t1j0JW6-=UxpeuRN|5=-Gl)Dl0!;#g?Ci7TQyXpZV|2u9*U)ct!< zD|sG^;vH1`o_EYwu3)T4oQa|I@2sG}QaB%DINryG7_`CrBa+hwClMb*Ep4NXcBL>E zaews1!Pb%1@mP@hSFsT;MnAlUy8jlsTH<>Yv?o6Anh^(MRpL0zfjv<(=!4qxQK+18 zF#%^{Zrq1DUPn;vokQLCJ?6v*sAT^QwFN<&Sbx0;N^CM6R6t#*k8#)vGjJ>_2mXh# ziZ`1#-&)*8{3mK6@4RPD%YH0N{0Qq{=`H4ZI+i2O#*Vmd3+t~2pV|viTg?q^P&1o^ z@wg4OXWw9T41C{o)Bx3yi@LrEo8T2xE|g+)QCJt16EEXA9D^OOxx3wTuol(O7Z{3< zPy;LS0biT2J_ev?hxvF8!e+!RumLW?cK8i;#)>=5%wNaa#K*7}`g~}%sxAf+yNxLX zQ)r9Y>%OSH%0MO85Y$XYVm_RQO4ikw7tdL5qPE}{tKTm3d>CrxQ5b}^P)XbbIlivb zlR`f#TvUTUVk`U;qp{&`vmyi0k9Y<a#CfQJuE+ei3AI8WV{SZ(1@H@0$KRnQ@&NUm z{~oOn`=6IWNh+G7j>P~}2SZUEPC*T97RKN*)Ycrr`gjlZT>M^>{gqJHlduqGpsr6s zwKolQ3g%#5`gb-`&`5XVXgrR(G3g`IKvNt++#NgOS=64!er%Sq4{8f1VojWf74W3J z{unjz;C*IdwJ?LY6}rh3_EJ#8Pf-oE+iwQc5B1_0gG$a%P&siMb>GjZH=*Z%N#ZE1 zLY#`ae;UT&HY|cyQAztN>Wx|F6V|^Zg`S_7clkurKvtlZ?hi~y|AVIE4Ak|Zs3iOx zwYQH^E9m>F={N*a96k+ENjn>>;tCs|Lk;}<PhHbMF3y;DiBKc1h5pzVl}tlXGarNV za1w69e24gi!;er&Jms*-iMzO#IPM4^V0Z?jaKce@?ABle@m80DR^SWlj`y%IrW`XJ zreiVUzNq8r;tHICnHcf8naLc~DcFuh@iUCZE2wk+FY@kk0*{*<_y{#I_Y4K?#YHTK zPf#7jFs)>a#{e9HTFSB50bfTA>^m%vPf({M_M{njb<}fpQCrg#OJf(zi4&22T<29= z@fz0Q!Ypip$1x7`pEB8B8&iqj$JzKVw#3<|&Bygs%tQPPHIRTaX28X;5^-5n5_ZFI z%)*>H{|hPPqGBoL!IkKXTdX^+AEO`jpV|0?^{lPGgzESPs=c4Be^{TO+I7A#*Zt6! z{+&D&La-2OPs(E;R?`ibjOsWA!>|pigJJf1Hs&Rsi2gVmwZw~2&n-u-<T_Mte1VPe zNA!OFm;cgq*bpPQkcxS6II4lks3e_%>fjyJz_!`zyHNxF1cUG-YR@mBCUggz;cut` z)IDpCcl)!fzeYNc3hl{IOu)HV4nIXD*#p!7{Jt_BN1^sI9wRW>+8bktr=nJ93#$Dc zHr|6}h!0>Ry!939uQyiQIWyCA)C2ud4P;^pj=%=EA1k4A-n@V+qxX1XFx9S&7hrzk zEm!~#U<7`NmGKuWh*9p>rceXbKnv8&(yiIJ(Zh!Y>eyAiXtN%bJ6BO1b-83#Xb@_P zW}voWfsI$$c$1BHTis7>;Uu=@fv>SO##}akA{mVu@ey2yk5D<W;)+?h^;nVk3TkEi zubREBgPM68%!9pAD?1#O6WK`4xQ=TpW|<0Sk&RbdH(7UJ4<6iy<FWWR{8ADZ<2dxW z#@i1k;!v#ct(m||)Tz0L#WCQzsgK4mt>Fj?dgIMUAAA!v!lhUi*P!<56duDHxSlQ9 zaKj{R^P6T123aRyDEG}lZRva17eB%J81=o$nLbi`IEjL8Txu`8hic#`DqH`DTEc+; znPVA(+JYF2!ipGzX{b{(7&qZEjK_wz?C%Xx$Mys!<5~2c|AIf5rHMoBVIx$7W3VXB zM<v-N9DpCAk}UE^GqCd5p13x)!1>q)ucI#}{A51Vs$)0emZ%rf=AT&qDikhIp}h>a zZ5qtRzQj{eFOItyg;npEPqi-Ch<GwKz++ef1MZs7f-+c}xG5&!RGfvoFdbjIXOec! zJ=R}0enmwD=DBY^$17Oh#M9J2!wGoefmxBpKbx8Lu=Yi5Q6~1nai}jG*HEV*_@RAq zVFYnJYDHVP6rw3~$5fnxdhl!1(gplt_OJk|zAmzDP8Mcir(aD&r?DRKx7Y?t{${pv z2x?$!Fa@_^8GLMYBYro3yKREX@=2)VSb*C53mAY8Fu#ZMk6LQ~KTXa=V@cv9%#Yns z10P}?g&M#F>rC_~UW(Io{?}5-rXubylcj4gllTeh!Tx`n7s@EqgEO%JF2V}90kwq} zQ1=&jWCjwBI`0Ws5Syc}r`!6$m|y3AhPS})a;=-K`%n#>#xVQ|wN<{4O$X(ybx{qs zLfzjDtK(=ag4<97K88x#%cvC!d%|ao&VMuoB~3i)!W=Ayi?BJqkBjgLvSiNOr)B^} zpRqc`v6zkXP}%MGk6EeySe$q`s@>VBEn0|KxE|ep6hfYxUmCfn27>=J4~#(N!dTP{ z_hTVEi8b&BR>Ba+W0n}>iPJFxXJIgIK|ef*Me%b~dp8`9>z&a9DsoUU%H#3w@mSQ2 zQ&8uAImY0ps2SYG4)_?A1F1gdJ{L99^%#loVOjjr`WUq(kvTlx7hJ6zuE)EC?WoXF z??WxIUry7|TvWC%M!jfuU}OBtUay<W<Nfq&h)S}NsN**SHL$DL7X5ua-dB1zEKNKP z%j4TF1<mLbw!mwsj>`I(0SrbZ-$-nT3-L9)jNf5;ZjaLwll;y7Yp^i!yQt?rK_%_C zsEOnVFar+9iNtPe3ND2+sFAk}^mza5whF_EO9z>TldUPJnWmx!-UqAUDAY0Bf=%!? zj=+RG9&hrlLv2lsydLkrlB<t#I{&*U_;KMoETace4d=^ek|Y8(lM1N%mZ+uefttY_ zRKtP1ooLVr#ssX38t4$~s~AMQ7<K<TEUu|<rl4#*idwq!s0Qw!vb}f#kM{?Yil{gf zcjGIl<5eTr<Nbw2JM2Nc7Iiv21<gQf;TYl!9FE`PY)mUeds_ON6!d2M3-zjX3fmc> zIt)hbeGF=#nfCfP)T{Ru+=DAo1L{!3B-?PzK|B|=atl$}zaG`jK6LX@I6+|=UO^>c zdQp$}Z#`RZ6meRJ$NNS*iLHr!ikShn#U$d+s0NqW`gc)FzYR6>!?+mh6gLAokGlU> zan8Ta`EOKcPXkJr8P`O;cv_)uoR4*I6>24}p*kp4((Gwf)EhJz6LCH2xr<m2Z((DM z3^mUWL|xw&%K2AA2dL2T_zIOo4^T-G5@uc`;dqj`0cyZ`!%atJupDtG)XGdl9k&ap zm3)e!*fheNihihe-$&K&aw%j|IFHpasg%iqF{qhLK_%lZoQywW5cV%^UbQ1}0P$+n zjQk^wMX?ldH1@<Mw*Fn~Zqz{BBNUVzr%)rmhOy`qWsYM!zD3*?^(MQII`8$PJr3Vd zoNO$Q{mPhRTZAtYFU2T)idx}_7-JRGE4e9>^sY04f<`jIIt4Y8nW!yUit6A))M@zM zUjG}l6}e)~eWCaUaZQZC;~0W>Py_cV>+yb<Y>yp@SEG;4|04?O@F}VT|2Q*~Fx0?G zqmETs)G=*{db71c-TxW(#EbTN^?37+e+hNH532pK7=hEV48DtzI{#l%P{Y5Yw&EXa z-g0KI!%+h%hf12tHg1D@t`q9?yo{A_KI%i}2v)?OP+L*7ym`gfK@I2)bX8bEAqzL7 zvOlbX$NQ_56igysf-!g*2clEaypji@o}Y>O++T`%!yQ2#(`pGG?>|@=kGk(`R4#mv zHSw<m&c7}sB$^r4!`{S=P@f5#@B{n+7h&&89`84uN2om=TG<?{L#TEFs+d=C2rBN6 z1#pygIx45$Lgmh`Dy}J<p+XP*fLiL`Q7@n;*a7QSH6vbxO0q9dInlkES(!1IM!Xu6 z@K01b)vB9UZe7$CrJ?Glpx(GMT?*qV<gZ~moQ++Gzr>~(SJUInz%0~<%QHNLU2A!q z;}}-kEd5VdpSWNhGoW^;EFX{R@H{G4uA*}27Dk}!Q`bBgiMp{j>cuk<wL~jWFPsli zx$zn5g>)ZNFtnaIp8Zkxy@|?|wWz&5X}yj*4Zoq1+^@d3eb))0pqVD%Bpi!c+DF(4 z3nqEIKi_9!W#XSu9hG>=<NcdZENZ5ope9fx*%*pS>L|>MOHo_A5%v5oETr>)$W~m! zd|bGNTB<)#4?M?K7}UTdQ&$Wi9*kP@F*pVHViMMA=<)suW+KKCU&1ozG%_m?gJHT4 zz30Cx1>NAHmSzJsz&$p8iptuc#^!n~MiSSwcE^{9UqKE0Fshw1s4q0vQCs>4YD>yA zF$1ZE-hcn!nnEfUdZ8ZNf%>9w7`3EVQ61hyC1I|n=JUJ{YT!>%D^)th%q#&Fw?=i? z9W{{Qr~yv5*XO5j{<EoAMMWtr(#)Lm8mJe<8PpQ{H8&p`O;B&N;h2DHPz|0#CD%37 z-u{Z-t+NKTFmZ9zPgb$0=aO5v=D`+JXo-8FW;_vfKBuA@3TWx^{(3$HwG!D_6_=r& zJBzySK2F3ZxEsf`GRa)Awdt@Ks{J(7>FVlIQ1)k`M!p}lWGApSevA4FRX)|c(>I_R zIDtx{v#4Zzh&k{HdS{M0u0d@~d(}}}+8lNLWz?x~hf&Z{yQsbV2(>idVKcmoI*wJ_ zdYq3j6}8lX?L5vBj6e-!FRFt}SPy^3%2+<le0A%E>UbrppDoBlUFSRneLDSwYAC3^ zIfn75J+6&f@=Pp^^K85m)zBpj$LBT<>tL3)5o(~_QE$8vsN|l9!*C7O)cFtYXx>;Y zuniYRqLT3#>O<x>&c@oEJkDG^j_SBmXEP%geTnCwKC~8DS6J7h2C@Zv;%BJ)OLt+V z>E9_!K{Kq3N{WuCB_E1aa3<=3gQ$j%VFZ4ITGD6O2LrmAcqnS6CZcA%+WG-%YY$<0 zJdLhyctRlp1G|}IDQ8W>TGXfEa-56rVSIP<X?6*F68rY>I1jKtYUSFed%VBt7>)W~ zZ~&X&9n@(_>}gI<%buM7K~zkkLVNTO)j*zJCMPPQUZH6=o@nE>SeE)zsG0nU`tln2 zviUlmf|H4}QCsyl>bQpWHa{_?;UnVVy<PLUJ+O~y@E~f$cWhj^ul=@*SE$cM9k<ke z=Gb<%uE!SCKfrXX)!*a&CG;|Ui8x?@`9{<NHQ@QEtvKjX&^MG5m<PYX9C!zF;sey) z|AyN8$EX41%`hKI#ZX%~z&aLnie_3jp`JgE`ZoL}s-N4at#JRMprr{OXueuCMZJIy zVqZLuYOv-Yvl5+9BcF>(*0)d{e1Ljxuf2X6HPDN;{w8Xoe_{msWqK#-I<XYmQBe+c zVKQn)Yfv5RKy`2uHS(`epJq3(5f&J1KD;`juD^?MxEpnxZ=%|%Jj7gYj{2#&Gq%wA z&!$kBio>Wk*x$Go^A0ty$PZ96{uE!qlbC@mhM7IxjoO;0sE+avH$Te7Vr}A{sN=W- z_2G38b-W+qVx9kh5#|fS8q|_MMK#zf%bbdA97wzf)zH7F94S50bXW$Xi0h%gWcEh= z9Iya&dXC!qpHUr$jxs;i*Faa_)!wI|CA)}a(UWa%h)2EA*4TIx>O(4gw8#4o70RKG z?|LkQ`Nx>0t&YjWX{ZmcC8&YqAM5e{{=X(F`4*4m{OiMK2Nl}$`<Q_Lpc<?&&MbX< zR1T!0X5J4M;z0ZepW{K?JKlUj88gAWIWOUM>VqbFoUic!Y9I?Hnf~@o;{0n#Pg9|! zc!<L>h<a^-uB+pPsFhlV8o(hufX8qpPMvHzjC{r1-wCyH>8P#fZ|j%gJ>oT}_UE{- zng`aRX1oct6=zW$J;e_AFNR}>DJF}vQC~Esq8jp<YTkfFQKz6TDruXeCeR+6VK*#= z8*RONf`U3aYyBFPgqN`?)|+OMYC0-ecVic<_L}+LFdw@SpF$nW*y$c87k0s7*b{ZC z#-YB@%tsCQCUQFX|Nm0Z2rJDn)<nHXl29{9LnU1g8xOMaC>y_Ooo!u=1-O4T=EfZu zi2H2(xsA_yW2SV?UibmabK}pb0hN5+e3(R{Rw&h)hI(IgLftppx)3$9WvDIKX6p~2 zzG@x86g+S1Luc|?p(Tx?ps&YMF#wmL_WB*vsW^)2=pshox2OR<xBAR7u`ep=0#Gv# zMlF2_R8m*M9=INr^f_j;rRt~*1ub=B)P+>kUS*+1d>A#5Jaf$P2}2F232NZ2P^YI4 zHo#X<r{ySWpbxCSTK~jo>L1VH{HIa~f5ZI3VHm36Pf!mYwVuF{#Ak3ACeJn5yc63I zKS#Ys+RiguHX9R&KSI57@1l-j@%bJn30q<szA-=6JorB<>QE87z}(mcwa0T%$@JNR zop<Y$@YIaX>J!nc|4=77Yk+m|3y0c5mUXms><ASWHmX-@XLP;Gp7=!5LZWFP(LA3x z*gT$So=P+i?R-{$&McQcos1z7bZHoD8EVWjj5drNA!DLrM`n!7>{~V~Mq#42fkf}~ ziQdQQ&wIi96umhEheu?M8a8a`h>;OPhK`KL7?L%zS7v74KF&bDQCX@Ry>siSVIKbx z8T|*Cu;iJme$At^?!Uc1;{NKXtjPUYEADQeYJ+>bUzF}{UvYo=q8ImkIO9cW-HYe$ zP4nKmu<3=Uoy9J=KD85Hw3+yyCKF$@nE0Ot6Ytwr5^W<pmt0!6l@(J950?LDR3=ax zreqtj_b@73qCI;nqf+TVOL>3Ey!%sEINssu(u?7F%P*Q{c*VUFHh0+eyyK&0N%Lu* fioW-@Z@Rm8#-6d$Jl8xq?(W>UCvCdtoZtTe9%VyX delta 15842 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 Te80s@t`n~JOT6s*vef?p22m@M diff --git a/changedetectionio/translations/ko/LC_MESSAGES/messages.po b/changedetectionio/translations/ko/LC_MESSAGES/messages.po index f77aec87..fe277237 100644 --- a/changedetectionio/translations/ko/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/ko/LC_MESSAGES/messages.po @@ -23,34 +23,60 @@ msgid "Add a new web page change detection watch" msgstr "새 웹페이지 변경 감지 모니터링 추가" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" -msgstr "이 URL 모니터링 추가" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" +msgstr "이동" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" -msgstr "편집 후 모니터링 추가" +msgid "Enter a URL to get started!" +msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" -msgstr "AI - 다음 경우 알림" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "현재:" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "요소별로 선택" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "선택 취소" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." +msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html #: changedetectionio/blueprint/tags/templates/groups-overview.html msgid "Watch group / tag" msgstr "모니터링 그룹 / 태그" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" -msgstr "" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" +msgstr "이 URL 모니터링 추가" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" -msgstr "" +msgid "Edit first then Watch" +msgstr "편집 후 모니터링 추가" #: changedetectionio/blueprint/backups/__init__.py msgid "A backup is already running, check back in a few minutes" @@ -765,6 +791,10 @@ msgstr "모니터링 목록 옆 파비콘 표시 여부" msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "모니터링 목록 페이지당 항목 수입니다. 0이면 비활성화됩니다." +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "팁" @@ -2057,26 +2087,14 @@ msgstr "사용하세요." msgid "Selection Mode:" msgstr "선택 모드:" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "요소별로 선택" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "그리기 영역" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "선택 취소" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "잠시만 기다려 주세요. 스크린샷과 요소 정보를 가져오는 중입니다." -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "현재:" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "죄송합니다. 이 기능은 JavaScript와 스크린샷을 지원하는 가져오기 방식(예: Playwright 등)에서만 작동합니다." @@ -2161,10 +2179,6 @@ msgstr "복제 및 편집" msgid "Select timestamp" msgstr "타임스탬프 선택" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "이동" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "가장 최근 요청의 현재 오류 스크린샷" @@ -2458,6 +2472,11 @@ msgstr "재고 없음" msgid "Price" msgstr "가격" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "정보 없음" @@ -3190,6 +3209,18 @@ msgstr "파비콘 활성화" msgid "Use page <title> in watch overview list" msgstr "모니터링 목록에 페이지 <title> 사용" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "API 액세스 토큰 보안 확인 활성화" @@ -3350,6 +3381,132 @@ msgstr "추출할 정규식" msgid "Extract as CSV" msgstr "CSV로 추출" +#: changedetectionio/languages.py +msgid "just now" +msgstr "방금" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "곧" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "%s초 전" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "%s초 후" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "1분 전" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "1분 후" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "%s분 전" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "%s분 후" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "1시간 전" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "1시간 후" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "%s시간 전" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "%s시간 후" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "1일 전" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "1일 후" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "%s일 전" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "%s일 후" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "1주 전" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "1주 후" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "%s주 전" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "%s주 후" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "1개월 전" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "1개월 후" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "%s개월 전" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "%s개월 후" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "1년 전" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "1년 후" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "%s년 전" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "%s년 후" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "해당 정규식으로 모든 모니터링 기록을 검사했지만 일치하는 항목을 찾지 못했습니다." @@ -3978,6 +4135,10 @@ msgstr "검색어를 입력하세요..." msgid "AI" msgstr "AI" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "AI - 다음 경우 알림" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4332,6 +4493,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr "새 버전이 있습니다" diff --git a/changedetectionio/translations/messages.pot b/changedetectionio/translations/messages.pot index 8fd25a47..a7b4e35a 100644 --- a/changedetectionio/translations/messages.pot +++ b/changedetectionio/translations/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: changedetection.io 0.55.7\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-06-03 13:26+0200\n" +"POT-Creation-Date: 2026-06-14 13:29+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -22,16 +22,46 @@ msgid "Add a new web page change detection watch" msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" +msgid "Enter a URL to get started!" msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -39,16 +69,12 @@ msgstr "" msgid "Watch group / tag" msgstr "" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" +msgid "Edit first then Watch" msgstr "" #: changedetectionio/blueprint/backups/__init__.py @@ -762,6 +788,10 @@ msgstr "" msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "" +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "" @@ -2046,26 +2076,14 @@ msgstr "" msgid "Selection Mode:" msgstr "" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "" @@ -2150,10 +2168,6 @@ msgstr "" msgid "Select timestamp" msgstr "" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "" @@ -2447,6 +2461,11 @@ msgstr "" msgid "Price" msgstr "" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "" @@ -3179,6 +3198,18 @@ msgstr "" msgid "Use page <title> in watch overview list" msgstr "" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "" @@ -3339,6 +3370,132 @@ msgstr "" msgid "Extract as CSV" msgstr "" +#: changedetectionio/languages.py +msgid "just now" +msgstr "" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "" @@ -3967,6 +4124,10 @@ msgstr "" msgid "AI" msgstr "" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4311,6 +4472,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr "" diff --git a/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.po b/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.po index 48b1d228..2a3121b1 100644 --- a/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/pt_BR/LC_MESSAGES/messages.po @@ -24,16 +24,46 @@ msgid "Add a new web page change detection watch" msgstr "Adicionar um novo monitoramento de detecção de mudança de página" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" -msgstr "Monitorar esta URL!" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" +msgstr "Ir" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" -msgstr "Editar primeiro, depois Monitorar" +msgid "Enter a URL to get started!" +msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "Atualmente:" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "Selecionar por elemento" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "Limpar seleção" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -41,17 +71,13 @@ msgstr "" msgid "Watch group / tag" msgstr "Grupo / Tag de monitoramento" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" -msgstr "" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" +msgstr "Monitorar esta URL!" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" -msgstr "" +msgid "Edit first then Watch" +msgstr "Editar primeiro, depois Monitorar" #: changedetectionio/blueprint/backups/__init__.py msgid "A backup is already running, check back in a few minutes" @@ -786,6 +812,10 @@ msgstr "Ativar ou Desativar Favicons ao lado da lista de monitoramento" msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "Número de itens por página na lista de visão geral, 0 para desativar." +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "Dica" @@ -2095,26 +2125,14 @@ msgstr "para selecionar múltiplos itens." msgid "Selection Mode:" msgstr "Modo de Seleção:" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "Selecionar por elemento" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "Desenhar área" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "Limpar seleção" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "Um momento, buscando screenshot e informações dos elementos..." -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "Atualmente:" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "Desculpe, esta funcionalidade só funciona com fetchers que suportam Javascript e screenshots (como playwright, etc)." @@ -2199,10 +2217,6 @@ msgstr "Clonar e Editar" msgid "Select timestamp" msgstr "Selecionar data/hora" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "Ir" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "Screenshot de erro atual da solicitação mais recente" @@ -2498,6 +2512,11 @@ msgstr "Sem estoque" msgid "Price" msgstr "Preço" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "Sem informações" @@ -3230,6 +3249,18 @@ msgstr "Favicons Ativados" msgid "Use page <title> in watch overview list" msgstr "Usar <title> da página na lista de visão geral" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "Verificação de segurança do token de acesso à API ativada" @@ -3390,6 +3421,132 @@ msgstr "RegEx para extrair" msgid "Extract as CSV" msgstr "Extrair como CSV" +#: changedetectionio/languages.py +msgid "just now" +msgstr "" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "Nenhuma correspondência encontrada ao escanear todo o histórico de monitoramento para esse RegEx." @@ -4020,6 +4177,10 @@ msgstr "Digite o termo de busca..." msgid "AI" msgstr "" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4370,6 +4531,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr "" diff --git a/changedetectionio/translations/tr/LC_MESSAGES/messages.po b/changedetectionio/translations/tr/LC_MESSAGES/messages.po index da3ba75a..4bfb7f60 100644 --- a/changedetectionio/translations/tr/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/tr/LC_MESSAGES/messages.po @@ -24,16 +24,46 @@ msgid "Add a new web page change detection watch" msgstr "Yeni bir web sayfası değişiklik tespiti izleyicisi ekle" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" -msgstr "Bu URL'yi izle!" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" +msgstr "Git" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" -msgstr "Önce Düzenle sonra İzle" +msgid "Enter a URL to get started!" +msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "Şu anda:" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "Öğeye göre seç" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "Seçimi temizle" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -41,17 +71,13 @@ msgstr "" msgid "Watch group / tag" msgstr "İzleyici grubu / etiketi" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" -msgstr "" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" +msgstr "Bu URL'yi izle!" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" -msgstr "" +msgid "Edit first then Watch" +msgstr "Önce Düzenle sonra İzle" #: changedetectionio/blueprint/backups/__init__.py msgid "A backup is already running, check back in a few minutes" @@ -796,6 +822,10 @@ msgstr "İzleme listesinin yanındaki Favicon'ları Etkinleştir veya Devre Dı msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "İzleyici genel bakış listesinde sayfa başına öğe sayısı, devre dışı bırakmak için 0." +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "İpucu" @@ -2098,26 +2128,14 @@ msgstr "birden çok öğe seçmek için." msgid "Selection Mode:" msgstr "Seçim Modu:" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "Öğeye göre seç" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "Çizim alanı" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "Seçimi temizle" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "Bir saniye, ekran görüntüsü ve öğe bilgileri getiriliyor.." -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "Şu anda:" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "" @@ -2204,10 +2222,6 @@ msgstr "Klonla ve Düzenle" msgid "Select timestamp" msgstr "Zaman damgası seç" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "Git" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "En son istekten gelen mevcut hatalı ekran görüntüsü" @@ -2501,6 +2515,11 @@ msgstr "Stokta yok" msgid "Price" msgstr "Fiyat" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "Bilgi yok" @@ -3233,6 +3252,18 @@ msgstr "Favicon'lar Etkin" msgid "Use page <title> in watch overview list" msgstr "İzleyici genel bakış listesinde sayfa <title>'ını kullan" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "API erişim belirteci güvenlik kontrolü etkin" @@ -3393,6 +3424,132 @@ msgstr "Çıkarılacak RegEx" msgid "Extract as CSV" msgstr "CSV olarak çıkar" +#: changedetectionio/languages.py +msgid "just now" +msgstr "" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "Tüm izleme geçmişi o RegEx için taranırken hiçbir eşleşme bulunamadı." @@ -4025,6 +4182,10 @@ msgstr "Arama terimini girin..." msgid "AI" msgstr "" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4373,6 +4534,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr "" diff --git a/changedetectionio/translations/uk/LC_MESSAGES/messages.po b/changedetectionio/translations/uk/LC_MESSAGES/messages.po index a25cc4e9..1b70e446 100644 --- a/changedetectionio/translations/uk/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/uk/LC_MESSAGES/messages.po @@ -22,16 +22,46 @@ msgid "Add a new web page change detection watch" msgstr "Додати нове завдання відстеження змін веб-сторінки" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" -msgstr "Відстежувати цей URL!" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" +msgstr "Перейти" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" -msgstr "Спочатку редагувати, потім Відстежувати" +msgid "Enter a URL to get started!" +msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "В даний час:" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "Вибір за елементом" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "Очистити вибір" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -39,17 +69,13 @@ msgstr "" msgid "Watch group / tag" msgstr "Група / Тег відстеження" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" -msgstr "" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" +msgstr "Відстежувати цей URL!" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" -msgstr "" +msgid "Edit first then Watch" +msgstr "Спочатку редагувати, потім Відстежувати" #: changedetectionio/blueprint/backups/__init__.py msgid "A backup is already running, check back in a few minutes" @@ -776,6 +802,10 @@ msgstr "Увімкнути або вимкнути значки (фавікон msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "Кількість елементів на сторінці у списку завдань, 0 для вимкнення." +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "Порада" @@ -2079,26 +2109,14 @@ msgstr "для вибору кількох елементів." msgid "Selection Mode:" msgstr "Режим вибору:" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "Вибір за елементом" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "Малювання області" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "Очистити вибір" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "Хвилинку, отримання скріншота та інформації про елементи..." -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "В даний час:" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "Вибачте, ця функція працює лише із завантажувачами, що підтримують Javascript і скріншоти (наприклад, playwright)." @@ -2183,10 +2201,6 @@ msgstr "Клонувати та Редагувати" msgid "Select timestamp" msgstr "Виберіть мітку часу" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "Перейти" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "Поточний скріншот з помилкою з останнього запиту" @@ -2480,6 +2494,11 @@ msgstr "Немає в наявності" msgid "Price" msgstr "Ціна" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "Немає інформації" @@ -3212,6 +3231,18 @@ msgstr "Фавіконки увімкнено" msgid "Use page <title> in watch overview list" msgstr "Використовувати <title> сторінки у списку огляду завдань" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "Перевірку безпеки токена доступу API увімкнено" @@ -3372,6 +3403,132 @@ msgstr "RegEx для вилучення" msgid "Extract as CSV" msgstr "Вилучити як CSV" +#: changedetectionio/languages.py +msgid "just now" +msgstr "" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "Збігів не знайдено під час сканування всієї історії цього завдання за даним RegEx." @@ -4002,6 +4159,10 @@ msgstr "Введіть пошуковий запит..." msgid "AI" msgstr "" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4350,6 +4511,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr "" diff --git a/changedetectionio/translations/zh/LC_MESSAGES/messages.mo b/changedetectionio/translations/zh/LC_MESSAGES/messages.mo index 281ca1767c9e41088083e233ccf5bc34b81902f7..84cab79d70a09c1ead5eb39d57a665a8ae9a8abb 100644 GIT binary patch delta 11886 zcmYM(2Yk=h{>SmJMiL=}EFvL6mKgC9BKC}#S`jPuPK_W4HGcM}Q7iVW)fTmtQmUG( ztx`e<tx!bU>))H!ZOd)7?(3a%{{R1d+{fd2KIi*A>vPWe{&L;_T=e+kQxA8(fAJiL z|D1ctal+6ySkeFg=XnjsX-oJQ`e2)yj^mA;tv#&+umtrZY@BJ$w)Jjo!Slt~6hFa6 zj^lQ`YdKB?6|FD>hoT2w!K!#2{qR@x!s4}!rL6v_35D3Wij8BjEcJD;H@3tHxCu3m zZ@lA-VSHx_g^g4^z$Bbm$8iGjB$mX>r~$sj3Yd?|)KiSXK$qiG!zS1S2ch2Iie+&R z>iv^g9dDre|4TBy<6qaLHU|3<yU-I?U@2US>9_-1;B!=lnkE#b&}oU9*bJ<QIanVL z<4Amj$=JD`<CMd-7>Rq)t%jE=$cIQ0oWGDPIko6z3iiWZcmo;RsgY>jAAm{3+1LyZ zqZUwz+NzWWY!{|tW9*H}%vub>Ee*)O3P-8nFgPEhQt3gjN>vPQ#cntZ3(*&QG<2Le z9E{A>S%!N50_yo=Y=O_PGB%|1D%cxi@l`C1yBd*y4x)2}ieSvgGWZ)RRmGWhB@9OG zWj)l&lF<)Sto=|c8-x9E5~g4trein<Lt8l=)&C;Y`|I2kG~;a;jr&mp=Aj1s88uL` zrp9upiB++20%|3#Q5|=)4ni#`6V?AhR6lDl0C!;&y5F@GcTg|>f||(RsQVnn#&*Qo zsM|0NHG%oq3fEyM-oh^U8}`8D=4N7>kYnS#iQ1}s^v8e}oFm=;XbP(6jv8P%Y9-@Q zhsTX!I3Kmrok$<fA=DWt#5!29rP-QJsQ0>C2ccFz4z-|JSRNN)Dc%3=6tsf<7=xFv zCKjRw2xFNVupM$fokds)&!Z3CK^K0HoKGjDwV8N#BpFUG9EIyJ6<^rrscpzO<2$`6 z=oSpe3OF4#!?mc658!yr$4S_Q%RCG}!a%Iv)_gCTq0USjR3_6<3mb%$aRzq4&DaYI z(5+M0v>h*DGHS(pt=Ca!;yG$deA=710%j6Np|&OmHNa8S1g@jn-NzDGXya$7t@dOV zvO)*)uK{aNp_TMRo!Zf;!!#GWVIB_0$c~OP0AIr?_#<ipgF2bLpNZv&=c6~SLrr`e zzJv#HGag2bmy$yMbsYw$n7y2gV~O3^7=OYntp2ju!>t%W?A6(PDPvFr^}=Wzh-Gjg zdSZ@^H{*2Tx3LsPvpP+*uA4##g*K>63_$Ju66ESTJ5ev@V><qfE==iaQalU2h?inF zT#dExAu9F$R4PNEsFWvRaqNW3w7V;XIuu4CUrT2LR>eFF$KS9F26Z>LA`;a>H`GLX zVl^CxKDZj|;TDX=>!=L<VdIy$0t1O_pfBS)OHIMqfB`(%gG%LTR0{85NqmI5cE8wq zzaD15Ak<33u{6e_A10y>Wm{CrhokzNfE6*jNcMj<g%MO7M183O)A*^xj;KSk5w%5I zP%Al!O8Gg|igQsJ{2W8k>1pc2Fn}-`)xHrbb3M=>`=BS|J7esFi5N_rZQ~WF39P|# zxDNG!c@yj6cc`ri<T5J*)v!I*M7=*5`5ki>VFZ4N8u$Uy)cGCVn)%DU%?xKD+wE*X zorQlQd*np+F+ZO!R0dK}sZ7UXI2gxaP+#+#Fdq|$FQF##C$_`VoM25L4TEr0I{RON z!YnGZSL-ntPhxqzf=XclYH$C8)zQ0O(T|7Y!dHm<qu&1*Tj4#_fYth&430*fsc|;W z!J5Py`jh{L6mqGE!WUQ%qxi~1U|-aAnvUA*w=fisVPpIpbvR3Lq_qXXs0oK-7$#s7 z>}uoXsLZ{Mn$Tgleee}3HNRpadJi&x!8AjiW;ZG`ucNkLFSf;ZFdlzHO(1Hp8K5@O zl~WHj@wKR}+-Bqb7)$IvK|wRhw+|koGV(9fz_CNjX-~q+#Lclg4!|mS1a*dPpjK3T zsHv}kTF}d=tr>)BKNTC{dh^`v<WW#c3s9%I*f4V#%cAPzur;<tt^76AeO`^q$Trj# zoxrmA0E;q-Es4E{o2}@8;lv}b11`iY{r+F0kVHkB5oQ82Q8QhJ%D{f>84M)8jGD+j z)S>(VL-2R(h-F8btw={ra2V?S>8LH3hg#@L3}t+0I|WZXgBtJxs>AD86(6HAQD&6s zAP%*+4RAHCN3A?A!wlRQixam&O}GO_;{epPTY%cK&FE(F&Sw<7ur7B=*Rdh`V0ZM! zeyE8JL*3^|r~wzER<hnc--|BdlNf<NU<vdYZ4RqHDkFU`2gi>l|LV|dj7fO~)QlTo zB&MLAPe2Vc4|Tm(qt3uy)FC{I%Fs=$h(Fu7)L4_j7*u~9u^MKg-d{78{3|7gsL(0R z#c;fXZSXIggssN$k-~RT8A{AFE9-*Vy56V^4zLcljzLX0%f^dP8CZdSxW`SQK7|wL zfsawCEktdB{_xXYmBiB67`3+@P#Nirao8W(MQ1T8wNFq3EuLULRNJvS@i(XslIKM8 z+}(;oO)C0eFI<SRm~ZR7v&{2)Scm$-SOZsMJf6b__%CdX(WFZQ4M9C$hVAeyD&@r| zo2`hzAkLqYOd*d4>DUu%Pcgsq3s4i;g%|KM?1(F}&7aY?un%#qsb=6ss1M6U)S>$u zbw<3WneRaWD#OvJ4920S?teT5&8$B9VK)rM!Pcp$J$@baUC2SMx^o=01);B+zZc># zig+4U!tJQr^F9V(E^6RgSQhiKB;z}U6g1;MP^aBvy1C~;sEJiYHEf33yVe+nvr&g` zD{7$KsEi%J=J<tu9yG(8oiNn%I1I#8bgP3=6x2Z`hF~^oWvfsV+JS0t6gd{oCDd7I zG}GLM)#y*W9~<I1tc}m?^BAs93~>uoCPtwS>x^0CzZHc?RH(!1q(dFeK@GeXb(r>| zzJ%9MhwtB555s4h=RHujU>0iY-a?&~4^a2L)Etwsc&tpEf*NnM2GYtdQZW#}M(uUd zT=OMshQ7q(Q4^Ypn$YX0vvL~i<0m$Lfm*5GJTsvN=tDdNwZ&sl{ZB@nq3Lc4%_-bR zoz|-J&8M?A>cuXoElEQU%*67Tg*t3YQSFYPQu{t?pzEk>eH+!zdx5!KrBMA2K`qEV zib8P;uVNEbU^_gE%dq%D^NC%B`T!k6osA1v7q6jG?y<-`uZUj6vDSENB6?Hb)W*q1 zx07NYq@p@bM^AjkI^H@3)$t4)&$ICo)QVT4GO-cW&mL6jkE0fN4!!Xr>a1MG^1A=O zQ)o*?nZ>4qG*kzJQ4Pjp7*0iXm}Bd=qXyiEIwQxh1b%=ze4n5O4qRe>Q$kQ*(1xh3 zc?Cll-&s#V102B!yoxbch{{Cy*UayCCDf^JgPPbh?0|EyHC{$-iQiIlcw3>)&Lq^W zT4Cdzs1MK?bn6g&Mj-<8F#%to4pRaLK(<45kdE5xak#P=e@LLtOz;YG8&Xjj7-}73 zoot<DU1VLkg8Zw&Mk?Cl8<>obu@$;rH!GinLy0$|&cF+dMX#0S6vv}7($d<&+RfU> zI@p?le!M?nCHZehVGb4P_z9+B)GG7uc+-$7=PRs(qgI>07dB!^;zQ_z?_ov!2>tOc zM&lFI2Pb5W`LjL=wSY|Y#VKwI6)4QJZb6-e6R3{zP%jo>AAEx9AZ4u?I29WZ_eW(e z2lf0L)Tj79s{gPYGm-kJ`X1O7-76?0P`Ha)Nx(XD_$r|$kc{e}H>%+TjKuwzf!DAz zHd=4mEkV711l8}Sn23L4cdWm`OmMN$?YvGwFRZf<uAm0Ki52jBY=HVVdZjW6t6(qW zXTzC>dj1TRsXCj?C%P%tCmxB~imj*xeuPc&D*EgG`))P^hNA|ki#i<LFdheE0Ios} zum?54qZp34_IUv+_5VS==WH>SM%7nD9r7yJ5MRM$-T&Pb)Zm|}fu5ool-g?Q{ZT0o z$53p8dT$U0;Uv_j`88X=0X4w`*7K<M@~l7D`oGbwfy-?(169Tl;u;u*$*7J-qcSoJ z<8TG)!*m+;;W>|*u*Y`OPf2V`TpqQB15oc}qqgJ>YTRG8lYgz~Zz^QP9p*tIDsGKh z*+A6ZjYUl)8$EClYJjDv4tHa7Jc7#DFIX9acbW;-N40N)T3E_Xw<!#yLLE#*rOJ(3 zQI3tbU=`w{)|*(1_;=JqBi}H8gtkD%Gf@3)zy#cb`lR1N^;>M0IRho!6m)%BVJBRL zdf^Ugh7VB_dTQg+yUp)^1Zo0FI0#3e`niPtFnEv2OctuYWvB_QvF^YKV)sD`VHB=n zOMHy!SZl9oxCB#)S7IbS#A@iX&vaM|wMC6=+#W{|r(t<KYrTnD(Ep$&@&dgW-|>CZ zR0N<_8evVuDB=`U!-=TWE<hckotTVYp)yzLE&j0qGjI&Pi|Q}(ZL^R@=t11l#>wcX z`=4Sf`r&k57>XM3F6x>+K^+>e{pSDK2uA%DjK&PyV(YyQn9QW3w#JRD&^d@YgvZer zZ`k^K=*RfZ_Y`{JQ}o3y2aWwu4Kq*!F1GP$R0h6Ay<g@XbC^OgjyMffKN~fH<*2P) zi^}Mi=!4I(=>PxoI%FDzqZ-sitvCU-=dH0RjzUdnFUDXlYM`I6I{txbA9>guz8a|Z zZBXxJU@e@2vAFxN_MgHPDm3%k*a<z4m<HXf15jHs8r5(XYA^TM=lih=@hQ{<ZlhNC zo%ONxH`JMUftpCrQS$Fcq4iPIFcmdWU+Y-xMm!sJkMmHe_c~_&VX+CS!{(@g)2#ha z3mb~cz<AUIb8P*)s4wkDZVHts<fA%xZeQ>?ZsM}m^61a=%BYpOP#I`!>ziX8;_j#) zmwBiOypQVlQ*46QQ4=n6!u;yGBPr-mq@%9a98AKk7>r-q`k$}|vCl~}zyQ=lHlW(Q zfg0!>dSfom#VgnuyS{7wq}z^~;C*C*ZYS)N8L&EP#zU|iW};R+2g~DH8y~QqN4=ki z8u%_M)sHY5OP%JY8|z{auEltK8@2bh(M$Kg#Czs<+z-`JJnE1oVoe-~>UbF{#Ya$w z^*(A(OP{grP`4uy127FW!3_I+3Ti<!u>!8dB;EhFY{h-l1pdTOeCe#2d1cfgt%sUe z8*GVVQ5_yaz5gMqeLl9p0@O8)e&1|WXVmlFI0y$~(eM8U6iQKX1+}NQP%C?YYT$X! z{I%<gO^C~5S?qy&e>f^Lnb;n8pbLLQr8@My`Je9{url!&RQsjp$-nk?3l$phI40ni zsMMAGz^t&mHO|@;mBOy5fiqC=Z$f2cAL{vg7=brX1OJMF7;wR~i@o4BFZQ8A4JV?0 zR2E<_yo^<_+J|O<WK_r9Z9LjK6}9IJP#M{1>vy3J-(hTp|3GEb=c0MPteb)=B2g=- zVNF6cOt#O{QD<O?t)Gb1h!>+KegM_}JZb@-;c)c-$V_M|YMi;&C8&1pl@yekU8oK| zL>-#XQ5krOYS<;$>|syT3a6n5&O^0Zgqq-5>uy_r+{PEMF3+!{7FPTpMg6#)iWIbm zk*FD^VFr#uy_kpL_=A03;*z=Fp{Vy;p$1MvZOw4hgl1s`F2#y?07LMSjlaVn-T&uB z1v>lK3>b^LPR&pQ^u=Hti<;<s)GauHgYXFs!PHMoyOXF1<e?Yd#S-|)T4;TS{*3Pw z`_#M`h?;3A>I;~N4Y9p_J{L<9FF~z%J?ggXv+*~m0Ux6#@C3Dx7np{jmuZ6&P>0p$ zGxk4`LL~}Su?NOuHtL0a7=vdp6(68(LxU^kH=_^gxf^TXJ{#Y#@t>%S#auQ2aM2sp zemO?sp{wM-6NQ^p=sOVcxp|O;nm~U%iW5*jK9SeV9#2CZ+ST|q9zku%YuC*+yM&r> z$vpE9kpr*}@p4p#&Y>UX=8=D23SZa<_tA&=M;reebqN1Jo%XUf%)|n%v8WE4pi<o$ z8{j}xzw1$3xEpmi^RXH}MYRic-!ubMMO7rBX4V|lK^H8E{je;K#L_qwBXFU8z7OjX zAGP%bsP<l87z0olh(Kkk8)`iF3JO6Ka!`A@AN}zL>V-$BjQoV!v!@t@VPBd|)I~jS zizBfs>NcE0^%MG)u{LS~Em7l4#7d0sY@$$84Nx5y;CTEK6L1V0+zNM~I(&f2(C?@- z;C0JnCJHMMC!)5Z3+k|q#t>X?>-V9~+{L1p{r9_V{ufXU)Qj!0ISxTh=nWizr%)>` z|BZQG1@(L|YC_o<hl@}XJ&M&a7qxYTsFge4nu*7vm+pT%6|ghvkfmV{?1M_#JE(#0 zVg&w(dcWiy^S5I;RJ(Xo1`<%2NkO$6jhf(ORJ#SJ%q&B<8oone5FSNO49GW!CIr<W z8nv=o*b#f<Slorxu-skqg{zOj#LZCOgEUlz=3vonKz#{!TMyo4|5b6)R-CtfY`t#1 zjau0Q^v37b;`dDKYYnu9StC&ksENu%0%{^ntsU>VP3n44p%>CI42PpqHWypsYSi<a zsJ+ccb^Hrzh0jpW%Y0}0tAKhQhN`cIdaoAt#n$%uHa7*WY!52M=d3@X8U)@qr#TL* z5VyrzI0`**oplpN6K_MUFc<q^9;RZ=2j<?-#-_yYV_oe2Ck37Q+7HcdKzmd?+PVO1 z6K_WsUd3>93XBn`_gmPwZ^4>IaXlJFWetlMJTlXX${J-I`@d$|LY6h#I&Go~Yp%vs zIrdImzhX69rU#elz-8LI#+v3X)5>KU9rLOAy!TkfbTY<8Fr;CuCDWK?$Tm!yC}W~x zCuK|;GrW3Mj6zpY2d<*_uA=6QSM;E$6{9(?OwO7VF)lNEP1yy1`Ap0hIjSf+=DRT0 zvsqMD!S1&TmMmx0kJg_wg@VNkZOxX&rttl~)%MY<H*MkcaSF$-E!|Np-etRR*&bZB z1J@(d-c?{)xe839%;ojExXr-)bGjM0sGxSHhK5B24Qw9Kg(=Vng~GFo@6X=yf2p`X zd+Wnf2Mf<Gaf&9x3q_NWw$q}?6vah7`SHN?RIqpx|6OzD+i!gyo|^se?52YG=Z~$s IGqm`B0ewSoivR!s delta 10985 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 diff --git a/changedetectionio/translations/zh/LC_MESSAGES/messages.po b/changedetectionio/translations/zh/LC_MESSAGES/messages.po index ad375dc8..68588d7a 100644 --- a/changedetectionio/translations/zh/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/zh/LC_MESSAGES/messages.po @@ -23,16 +23,46 @@ msgid "Add a new web page change detection watch" msgstr "新增网页变更监控" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" -msgstr "监控此 URL!" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" +msgstr "前往" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" -msgstr "先编辑,再监控" +msgid "Enter a URL to get started!" +msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "当前:" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "按元素选择" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "清除选择" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -40,17 +70,13 @@ msgstr "" msgid "Watch group / tag" msgstr "分组 / 标签" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" -msgstr "" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" +msgstr "监控此 URL!" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" -msgstr "" +msgid "Edit first then Watch" +msgstr "先编辑,再监控" #: changedetectionio/blueprint/backups/__init__.py msgid "A backup is already running, check back in a few minutes" @@ -271,7 +297,8 @@ msgstr "未通过验证的 URL 会保留在文本框中。" msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON file." msgstr "复制并粘贴 Distill.io 监控的“导出”文件(JSON)。" -# TN: CJK scripts degrade when italicized; emphasis is rendered with <strong> instead. +# TN: CJK scripts degrade when italicized; emphasis is rendered with <strong> +# instead. #. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303 #: changedetectionio/blueprint/imports/templates/import.html msgid "" @@ -767,6 +794,10 @@ msgstr "在监控列表中启用或禁用站点图标" msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "监控概览列表每页数量,0 为禁用。" +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "提示" @@ -2052,26 +2083,14 @@ msgstr "以选择多个项。" msgid "Selection Mode:" msgstr "选择模式:" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "按元素选择" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "框选区域" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "清除选择" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "稍等,正在获取截图和元素信息.." -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "当前:" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "抱歉,此功能仅适用于支持 JavaScript 和截图的抓取器(如 Playwright 等)。" @@ -2156,10 +2175,6 @@ msgstr "克隆并编辑" msgid "Select timestamp" msgstr "选择时间戳" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "前往" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "最近请求的错误截图" @@ -2453,6 +2468,11 @@ msgstr "无库存" msgid "Price" msgstr "价格" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "暂无信息" @@ -3185,6 +3205,18 @@ msgstr "启用站点图标" msgid "Use page <title> in watch overview list" msgstr "在监控概览列表中使用页面 <title>" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "已启用 API 访问令牌安全检查" @@ -3345,6 +3377,132 @@ msgstr "用于提取的正则表达式" msgid "Extract as CSV" msgstr "提取为 CSV" +#: changedetectionio/languages.py +msgid "just now" +msgstr "刚刚" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "一会儿" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "%s秒前" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "%s秒后" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "1分前" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "1分后" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "%s分前" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "%s分后" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "1时前" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "1时后" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "%s时前" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "%s时后" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "1天前" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "1天后" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "%s天前" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "%s天后" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "1周前" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "1周后" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "%s周前" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "%s周后" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "1月前" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "1月后" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "%s月前" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "%s月后" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "1年前" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "1年后" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "%s年前" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "%s年后" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "扫描全部监控历史未找到匹配该正则的内容。" @@ -3702,7 +3860,8 @@ msgstr "更多信息" msgid "Use <a target=\"newwindow\" href=\"%(url)s\">AppRise Notification URLs</a> for notification to just about any service!" msgstr "使用 <a target=\"newwindow\" href=\"%(url)s\">AppRise通知URL</a>,向几乎任何服务发送通知!" -# TN: CJK scripts degrade when italicized; emphasis is rendered with <strong> instead. +# TN: CJK scripts degrade when italicized; emphasis is rendered with <strong> +# instead. #. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303 #: changedetectionio/templates/_common_fields.html msgid "<i>Please read the notification services wiki here for important configuration notes</i>" @@ -3974,6 +4133,10 @@ msgstr "输入搜索关键词..." msgid "AI" msgstr "" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4318,6 +4481,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr "" diff --git a/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.mo b/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.mo index 4b7e7b3f70587bed18422bd026066d87b12401ab..dd030d429927490c3a64ac7a97713acaa3be5c78 100644 GIT binary patch delta 9985 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 YU{k-yFZazoS2_Ref)zV=Y)T0KFWYax^Z)<= delta 9051 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 diff --git a/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.po b/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.po index 758fefe9..31e62112 100644 --- a/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.po +++ b/changedetectionio/translations/zh_Hant_TW/LC_MESSAGES/messages.po @@ -23,16 +23,46 @@ msgid "Add a new web page change detection watch" msgstr "新增網頁變更檢測任務" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Watch this URL!" -msgstr "監測此 URL!" +#: changedetectionio/blueprint/ui/templates/preview.html +msgid "Go" +msgstr "前往" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Edit first then Watch" -msgstr "先編輯後監測" +msgid "Enter a URL to get started!" +msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -#: changedetectionio/templates/edit/include_llm_intent.html -msgid "AI — Notify when…" +msgid "Enter a URL in the input box above to get started." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Fetching screenshot and element information…" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Currently:" +msgstr "目前:" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Select by element" +msgstr "按元素選擇" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Hover & click the preview to watch just one part of the page." +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/blueprint/ui/templates/edit.html +msgid "Clear selection" +msgstr "清除選擇" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "What matters — when to notify me" +msgstr "" + +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "" +"e.g. Notify me when products go in/out of stock, lead times change by more than a week, or new product variants " +"appear. Skip review additions." msgstr "" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html @@ -40,17 +70,13 @@ msgstr "" msgid "Watch group / tag" msgstr "群組 / 標籤" -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html changedetectionio/templates/sidebar-nav.html -msgid "Live activity" -msgstr "" +#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html +msgid "Watch this URL!" +msgstr "監測此 URL!" #: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Recent additions and live check status will appear here." -msgstr "" - -#: changedetectionio/blueprint/add_watch_ui/templates/add-watch-ui.html -msgid "Waiting for activity…" -msgstr "" +msgid "Edit first then Watch" +msgstr "先編輯後監測" #: changedetectionio/blueprint/backups/__init__.py msgid "A backup is already running, check back in a few minutes" @@ -271,7 +297,8 @@ msgstr "未通過驗證的 URL 將保留在文字區塊中。" msgid "Copy and Paste your Distill.io watch 'export' file, this should be a JSON file." msgstr "複製並貼上您的 Distill.io 監測任務「匯出」檔案,這應該是一個 JSON 檔案。" -# TN: CJK scripts degrade when italicized; emphasis is rendered with <strong> instead. +# TN: CJK scripts degrade when italicized; emphasis is rendered with <strong> +# instead. #. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303 #: changedetectionio/blueprint/imports/templates/import.html msgid "" @@ -766,6 +793,10 @@ msgstr "" msgid "Number of items per page in the watch overview list, 0 to disable." msgstr "" +#: changedetectionio/blueprint/settings/templates/settings.html +msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list." +msgstr "" + #: changedetectionio/blueprint/settings/templates/settings.html msgid "Tip" msgstr "提示" @@ -2003,7 +2034,8 @@ msgid "" "lines against all history for this watch." msgstr "適用於內容僅會移動的網站,且您想知道何時新增了「新」內容,此功能會將新行與此監測任務的所有歷史記錄進行比較。" -# TN: CJK scripts degrade when italicized; UI label reference is wrapped in 「」 instead. +# TN: CJK scripts degrade when italicized; UI label reference is wrapped in 「」 +# instead. #. CJK fonts lack native italics; allow substitution with conventional local styling. dennis-ignore: W303 #: changedetectionio/blueprint/ui/templates/edit.html msgid "Helps reduce changes detected caused by sites shuffling lines around, combine with <i>check unique lines</i> below." @@ -2051,26 +2083,14 @@ msgstr "選擇多個項目。" msgid "Selection Mode:" msgstr "選擇模式:" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Select by element" -msgstr "按元素選擇" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Draw area" msgstr "繪製區域" -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Clear selection" -msgstr "清除選擇" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "One moment, fetching screenshot and element information.." msgstr "請稍候,正在抓取截圖和元素資訊.." -#: changedetectionio/blueprint/ui/templates/edit.html -msgid "Currently:" -msgstr "目前:" - #: changedetectionio/blueprint/ui/templates/edit.html msgid "Sorry, this functionality only works with fetchers that support Javascript and screenshots (such as playwright etc)." msgstr "抱歉,此功能僅適用於支援 Javascript 和截圖的抓取器(如 playwright 等)。" @@ -2155,10 +2175,6 @@ msgstr "複製並編輯" msgid "Select timestamp" msgstr "選擇時間戳記" -#: changedetectionio/blueprint/ui/templates/preview.html -msgid "Go" -msgstr "前往" - #: changedetectionio/blueprint/ui/templates/preview.html msgid "Current erroring screenshot from most recent request" msgstr "最近請求的目前錯誤截圖" @@ -2452,6 +2468,11 @@ msgstr "無庫存" msgid "Price" msgstr "價格" +#: changedetectionio/blueprint/watchlist/templates/watch-overview.html +#, python-format +msgid "Price change since previous price (%(prev)s)" +msgstr "" + #: changedetectionio/blueprint/watchlist/templates/watch-overview.html msgid "No information" msgstr "無資訊" @@ -3184,6 +3205,18 @@ msgstr "啟用網站圖示 (Favicons)" msgid "Use page <title> in watch overview list" msgstr "在監測概覽列表中使用頁面 <title>" +#: changedetectionio/forms.py +msgid "Relative time format" +msgstr "" + +#: changedetectionio/forms.py +msgid "Long (1 minute ago)" +msgstr "" + +#: changedetectionio/forms.py +msgid "Short (1m ago)" +msgstr "" + #: changedetectionio/forms.py msgid "API access token security check enabled" msgstr "已啟用 API 存取權杖安全檢查" @@ -3344,6 +3377,132 @@ msgstr "要提取的 RegEx" msgid "Extract as CSV" msgstr "提取為 CSV" +#: changedetectionio/languages.py +msgid "just now" +msgstr "剛剛" + +#: changedetectionio/languages.py +msgid "right now" +msgstr "一會兒" + +#: changedetectionio/languages.py +#, python-format +msgid "%ss ago" +msgstr "%s秒前" + +#: changedetectionio/languages.py +#, python-format +msgid "in %ss" +msgstr "%s秒後" + +#: changedetectionio/languages.py +msgid "1m ago" +msgstr "1分前" + +#: changedetectionio/languages.py +msgid "in 1m" +msgstr "1分後" + +#: changedetectionio/languages.py +#, python-format +msgid "%sm ago" +msgstr "%s分前" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sm" +msgstr "%s分後" + +#: changedetectionio/languages.py +msgid "1h ago" +msgstr "1時前" + +#: changedetectionio/languages.py +msgid "in 1h" +msgstr "1時後" + +#: changedetectionio/languages.py +#, python-format +msgid "%sh ago" +msgstr "%s時前" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sh" +msgstr "%s時後" + +#: changedetectionio/languages.py +msgid "1d ago" +msgstr "1天前" + +#: changedetectionio/languages.py +msgid "in 1d" +msgstr "1天後" + +#: changedetectionio/languages.py +#, python-format +msgid "%sd ago" +msgstr "%s天前" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sd" +msgstr "%s天後" + +#: changedetectionio/languages.py +msgid "1w ago" +msgstr "1週前" + +#: changedetectionio/languages.py +msgid "in 1w" +msgstr "1週後" + +#: changedetectionio/languages.py +#, python-format +msgid "%sw ago" +msgstr "%s週前" + +#: changedetectionio/languages.py +#, python-format +msgid "in %sw" +msgstr "%s週後" + +#: changedetectionio/languages.py +msgid "1mo ago" +msgstr "1月前" + +#: changedetectionio/languages.py +msgid "in 1mo" +msgstr "1月後" + +#: changedetectionio/languages.py +#, python-format +msgid "%smo ago" +msgstr "%s月前" + +#: changedetectionio/languages.py +#, python-format +msgid "in %smo" +msgstr "%s月後" + +#: changedetectionio/languages.py +msgid "1yr ago" +msgstr "1年前" + +#: changedetectionio/languages.py +msgid "in 1yr" +msgstr "1年後" + +#: changedetectionio/languages.py +#, python-format +msgid "%syr ago" +msgstr "%s年前" + +#: changedetectionio/languages.py +#, python-format +msgid "in %syr" +msgstr "%s年後" + #: changedetectionio/processors/extract.py msgid "No matches found while scanning all of the watch history for that RegEx." msgstr "掃描此 RegEx 的所有監測歷史記錄時找不到相符項目。" @@ -3972,6 +4131,10 @@ msgstr "輸入搜尋關鍵字 ..." msgid "AI" msgstr "" +#: changedetectionio/templates/edit/include_llm_intent.html +msgid "AI — Notify when…" +msgstr "" + #: changedetectionio/templates/edit/include_llm_intent.html msgid "" "Describe what you care about. The AI evaluates every detected change against this and only notifies you when it " @@ -4316,6 +4479,10 @@ msgstr "" msgid "In queue" msgstr "" +#: changedetectionio/templates/sidebar-nav.html +msgid "Live activity" +msgstr "" + #: changedetectionio/templates/sidebar-nav.html msgid "A new version is available" msgstr ""