All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
frontline-history-${year}.json), keeping each static asset well below the Cloudflare 25 MiB file size limit, and stripped duplicate decoded layer coordinates from frontline-map.json.FrontlineMap historical playback to load yearly datasets in parallel via project-level loaders, resolving territorial layers synchronously from memory on initial load and scrubbing without client spinners or deep-linked date desync.TimelineScrubber triggered infinite update loops (Maximum update depth exceeded) and UI lag by isolating visual drag updates from reactive store synchronization and throttling external store dispatches to animation frames.BASE_URL subpath handling and graphs directory duplication in favor of root routing, consolidating getHref and getPath into a single unified path resolver.InitialLoadingVeil with a smooth fade-out masking initial DOM hydration and layout assembly without skeleton layout shifts, and PageLoader scoped strictly to content areas during client-side navigation.window.scrollTo({ top: 0 }) overrides across page components and useScrollSpy, restoring native browser scroll preservation.BATCH_SIZE_SERVICES_COUNTRIES = 40) and guarding against response overflow in syncServicesStage.useSectionResize and subscribeWindowResize consolidating per-component ResizeObserver instances into a single global listener with viewport-aware deferred execution (deferUntilInView), pausing canvas and layout recalculations while sections are scrolled off-screen.SectionHeader.tsx unifying responsive 3-column title centering, anchor buttons, and automatic row transfer with centered anchor button when section titles exceed available single-row card width.BrandGroup component props down to compact and className.fontSize: 0 with off-screen positioning { x: -9999, y: -9999 }.storeRegistry and active debounce timers upon ProjectDashboard unmount.DashboardToolbars and SearchSelect dropdowns to z-40 while bounding in-card loaders to z-20.TimelineScrubber date pickers overflowed the screen on narrow viewports by grouping them into a unified wrapping flexbox, naturally stacking them with aligned widths when constrained while maintaining vertical centering of the Reset button.@graphs/shared workspace package consolidating cross-package data schemas (@graphs/shared/types/*) and mathematical utilities (@graphs/shared/math), migrating all imports from @graphs/types/*.TradeCategoryId to compact 2-letter codes across all 17 goods and services classifications (e.g. mc, ch, tx), cutting URL query parameter lengths by ~80%.types/ workspace directory.pipelines/src/country/index.ts.PipelineLogger across all ETL pipelines with standardized stage tracking and progress reporting..json.br).minYear and maxYear boundaries included multi-year IMF WEO future forecasts, bounding them to production timeline ranges.data.json and intermediate snapshot files from pipelines/src/*/ in favor of Brotli .json.br baselines.macro / detailed), and dynamic client-side trade share percentage computation in Country foreign trade charts.CHART_CONFIG architecture with fluid typography scaling, frame-budgeted canvas updates (queueChartRender), and off-screen render suppression coordinated with real-time viewport intersection tracking.CONTROL_DELAYS), functional control evaluation, onChange atomic state mutations, and namespaced URL query parameter synchronization (urlPrefix) across dashboard toolbars.--text-2xs, --text-3xs) and viewport scales (--height-chart: 60dvh) to @theme in site/src/styles/global.css, and aligned Changelog outline dates via CSS Subgrid.Checkbox, TimelineScrubber, text selection).useTranslation and useFormat in site/src/utils/provider.tsx threw unhandled runtime exceptions when rendered outside AppProvider, providing resilient default fallbacks for SSR and error boundaries.@graphs/types/country schema definitions exporting CountryProfileData, CountryToolbarMeta, CountryCategoryTuple, and trade classification constants.@graphs/types/<slug> (./*/index.ts) in types/package.json.site/public/data/metadata.json and gitignored pre-rendered OpenGraph assets in site/public/og/.@graphs/types/<slug> schemas.country ETL pipeline in pipelines/src/country/index.ts processing UN Comtrade merchandise, commercial services, and IMF WEO indicators across 192 sovereign nations with rate-limited pacer queues and incremental checksum caching.computeMacroGrowthData in pipelines/src/ukraine/index.ts precomputing annual YoY % growth dynamics across GDP, revenue, expenditures, and external debt.exportProjectMeta and exportDataset in pipelines/src/utils/dataset.ts for unified project-level dataset and toolbar metadata exports.budget-and-debt to macro, equipment-breakdown to losses-breakdown, missile-strikes to strikes-missile, and uav-strikes to strikes-uav.war-rf-ua frontline dynamics with pre-invasion territorial baseline (2022-02-23) and precomputed monthly category matrices in toolbar-meta.json.fetchWithRetry repeatedly retried on exhausted API quotas, adding HttpError with immediate termination on HTTP 401/403 and Retry-After header parsing.country dashboard slice in site/src/projects/country/ with #macro, #macro-growth, #trade-structure, #trade-categories, and #trade-partners sections across 4 locales.#macro-growth section in site/src/projects/ukraine/sections/macro-growth.ts rendering YoY growth rates and annual increments for budget and debt indicators.site/src/components/ui/ControlBar.tsx) supporting shared filtering across multiple sections with reactive store binding (site/src/utils/store.ts).SearchSelect component supporting single/multi-selection modes and TimelineScrubber component with calendar date picker.useInView and useScrollSpy into unified site/src/utils/viewport.ts module with coordinated intersection observation and programmatic scroll locking during navigation.defineSection, unifying polymorphic buildView views across charts, grids, and maps.war-rf-ua dashboard into synchronized sections linked to coordinated timeline scrubber and category filters.SectionChart.tsx to rely on container ResizeObserver with requestAnimationFrame debouncing and smooth opacity cross-fade on initial mount.generate:og preview images captured sticky dashboard toolbars, section control bars, anchor buttons, and deep-link scroll offsets.formatDate in site/src/utils/format.ts shifted calendar days due to UTC timezone offsets when parsing ISO date strings.exportChartAsPng in site/src/utils/chart-builder.ts clipped line series endLabel indicators by invoking adjustChartLayout prior to canvas export.yearLabels and debt breakdown fields (govDebt, privateDebt) to Ukraine schemas.StoredLaunch and aligned Ukraine foreign trade totals directly with balance of payments figures.#losses-map and #equipment-breakdown, dynamically filtering model cards when map filters are active.#trade-structure X-axis to render dynamic yearLabels (e.g. 2026 (8m)), supporting partial-year periods alongside annual historical data.govDebt) and private (privateDebt) debt series with top total labels to #budget-and-debt.#launch-costs, #avg-payload, and #failure-rates charts.tooltip-builder primitives.#losses-map collapsed to the selected category count instead of remaining the sum of all matching categories.overflow: hidden from SectionChart.site/src/data/metadata.json.metadata.json into site/src/data/metadata.json.SectionHeader.tsx unifying responsive 3-column title centering, anchor buttons, and action control stacks across all card layouts.exportChartAsPng rendering 2400×1120 Retina PNG charts with centered titles and solid card backgrounds via offscreen canvas.generate-og.ts) capturing 2400×1260 preview images for all dashboard sections.React.lazy() for heavy client visualizers (SectionChart, FrontlineMap, LossesMap).types/war-rf-ua/ schemas covering frontline map, territorial dynamics, equipment losses, and air attack sections with subpath exports (./*).index.ts files across @graphs/types in favor of direct subpath imports.PROJECT_SLUGS constant array in favor of dynamic project discovery.pipelines/src/war-rf-ua/parse-frontline.ts calculating consensus territorial control, disputed zones, and polygon clipping (polygon-clipping).exportProjectSections outputting compact per-section JSON files to site/public/data/<slug>/<sectionId>/data.json.war-rf-ua-losses and war-rf-ua-attacks into a single unified pipelines/src/war-rf-ua/ pipeline.parse-attacks-ua.ts to perform incremental Telegram crawling from lastPostId + 1.FrontlineMap.tsx component and #frontline-map section rendering MapLibre GL vector multi-polygons for territorial control, contested zones, and frontlines.#frontline-dynamics section visualizing monthly net territorial changes, control area, and percentage share with interactive period slider.loadSectionData) using React 19 use() and useInView on viewport approach.system, light, dark) with AppProvider context, header toggle, pre-hydration script, and light palette tokens across Tailwind CSS v4, ECharts, and vector map tiles./changelog/:version and /:lang/changelog/:version) with multi-locale static SSG pre-rendering.site/src/utils/tooltip-builder.ts and site/src/utils/map-builder.ts.war-rf-ua-losses and war-rf-ua-attacks into unified war-rf-ua dashboard.ResizeObserver lifecycle in SectionChart.tsx to pause canvas calculations when scrolled off-screen.useScrollSpy into a domain-agnostic navigation contract standardizing on [data-section].loadProjectBundle in favor of on-demand section loading.SectionChart.tsx left lingering series and ghost tooltips by setting notMerge: true in chart.setOption.AppProvider redirected direct localized deep links to the stored browser language.SectionBuilder / StaticProjectMeta contract definitions to @graphs/types.pipelines/src/<slug>/data.json) across all pipelines, establishing a deterministic two-tier data architecture without disk caches.Trade_y.xlsx in ukraine pipeline.fetchHeadMeta) to skip redundant downloads when upstream ETags or release timestamps are unchanged.war-rf-ua-attacks from full-text Telegram dump to compact pre-parsed report snapshots (data-ua.json and data-rf.json), enabling instant offline builds and incremental crawling.cache/ directories, intermediate JSON offset dumps, and temporary disk cache files across all pipelines.rate_per_unit)./:slug/:section and localized /:lang/:slug/:section) with multi-locale static SSG pre-rendering and dynamic page title synchronization.Checkbox component and RangeSliderControl ('range-slider') for dual-handle period filtering.#trade-categories diverging stacked bar chart to Ukraine dashboard tracking foreign trade across 8 commodity groups with absolute and percentage modes.adjustChartLayout) in SectionChart.tsx resolving legend wrapping, Y-axis label clearance, and toolbox alignment via runtime ECharts model inspection.sections/<section-id>.ts) across all dashboards, loaded dynamically via import.meta.glob.SectionNav, AnchorButton, and useScrollSpy to synchronize canonical section paths on scroll and provide isolated scroll tracking.AnchorButton collided with yAxis.name and data grid by dynamically constraining legend bounds and container top offset.budget-and-debt chart dropped below zero on historical intervals by clamping net borrowing to non-negative values and setting yAxis.min: 0.devicePixelRatio and re-allocating canvas backing stores./graphs) from browser URLs by distinguishing app-relative routes (getPath) from browser-level URLs (getHref).@graphs/types workspace package (types/package.json).ai-tokens, space-launches, ukraine, world, and war-rf-ua-losses.types/ into modular types/projects/ directory matching project slugs and unified ChartSectionSpec with typed buildView."version" fields from workspace package.json files, managing release versions exclusively via CHANGELOG.md.types/echarts.ts, types/projects.ts, StaticChartSpec, DynamicChartSpec).ai-tokens ETL pipeline (pipelines/src/ai-tokens/index.ts) scraping time-series data from tokensperday.com with local cache fallback and macro-region/provider aggregation.space-launches ETL pipeline (launch costs, average payload mass, failure rates).lng, lat, posts, sources) to war-rf-ua-losses pipeline.war-rf-ua-losses dataset output to pure columnar arrays (rf, ua, breakdowns) and canonical 8-category equipment classifications, reducing JSON artifact size by 42%.ukraine and world pipelines.ukraine pipeline.war-rf-ua-losses parser.root.tsx, SiteLayout.tsx, routes.ts, react-router.config.ts).@theme design tokens and @utility shortcuts in global.css.uk) and German (de) localizations across common UI dictionaries, all dashboard modules, and Unicode CLDR datasets with build-time CLDR unit extraction.ai-tokens dashboard tracking daily AI inference throughput by macro-region and model provider with absolute volume and market share toggle modes.LossesMap.tsx) in war-rf-ua-losses visualizing geolocated equipment losses with dynamic clustering and event popups.space-launches dashboard.chartOption smart visualization builder and tooltip engine (tooltipEngine) in chart-builder.ts with axis, dual, and table modes, automatic descending sorting, and semantic color indicators.SectionBreakdown component rendering side-by-side comparison grids with ratio badges and accordion breakdown items.NotFoundPage.tsx) pre-rendered at /404 and localized /:lang/404 routes.useLanguage, useTranslation, useFormat, useCatalog) and universal semantic color resolution utility (color.ts).root.tsx and project bundle loading via React 19 use(loadProjectBundle) in ProjectPage.tsx.chartSection and chartOption.meta-{lang}.ts) and on-demand chart dictionaries (dict-{lang}.ts).use(loadChangelog()), code-splitting marked.fmt.per, fmt.scale), replacing hardcoded English strings..astro pages, layouts, and components (astro.config.mjs, Layout.astro, CatalogGrid.tsx, EChart.tsx, ChartCard.tsx, ViewToggle.tsx).tailwind.config.mjs in favor of Tailwind v4 CSS @theme configuration.site/src/utils/tooltip.ts.war-rf-ua-losses map included undated points by strictly filtering out points without dates.@graphs/site and @graphs/pipelines with native bun.lock.biome.json) for linting, formatting, and import sorting.types/ mapped via @/types path alias (space-launches, ua-economic, war-rf-ua-attacks, war-rf-ua-losses, world-economic)..github/workflows/deploy.yml) to use oven-sh/setup-bun@v2, pipeline snapshot caching, and direct deployment to GitHub Pages.site/package-lock.json, tsx, vitest, ESLint, and Prettier configurations.space-launches: Launch Library 2 API client with base snapshot cache merging and orbital payload / launch cost analytics.world-economic: Ingestion of DBnomics (World Bank WDI, IMF WEO), OWID Energy, and UN Comtrade API with API key authentication and rate limiting.ua-economic: Excel processing with SheetJS (xlsx) and NBU exchange rate APIs for state budget, debt, and trade dynamics.war-rf-ua-losses: Verified equipment loss parser using fast-xml-parser and Google My Maps KML data with 8 weapon classifications.war-rf-ua-attacks: Kaggle REST API downloader for RF attack data and high-concurrency Telegram MoD bulletin parser for UA interceptions.pipelines/src/run-all.ts using Promise.allSettled and scoped consola loggers.pipelines/src/utils/http.ts with exponential backoff retries on HTTP 429 and 5xx responses.pandas, beautifulsoup4, openpyxl, kagglehub) with native TypeScript crawlers running on Bun.site/src/data/*.json and metadata.json from Git tracking, retaining only cold-start base snapshot caches in pipelines/**/cache/.pipelines/run_all.py, pipelines/**/*.py).requirements.txt and Python virtual environment files.site/src/components/graphs/ with automatic container resizing and dark theme styling presets.CatalogGrid.tsx).EChart.tsx React component wrapper with ResizeObserver, automatic theme injection (enhanceOption), and 2x PNG export toolbox.ChartCard.tsx container component with backdrop blur styling and direct URL anchor clipboard copying.ViewToggle.tsx segmented toggle control component for switching granularity and data dimensions.KpiCard.tsx React component for metric summary cards.site/src/utils/tooltip.ts.Layout.astro using IntersectionObserver with smooth scrolling to [data-anchor-section].tokens.js to strictly typed tokens.ts defining semantic color palettes and CHART_BASE_THEME.space-launches.astro, ua-economic.astro, war-rf-ua-attacks.astro, war-rf-ua-losses.astro, world-economic.astro) to render React chart components with client:load.Layout.astro to accept project metadata and render PageHeader automatically.<script> tags for ECharts initialization across all dashboard pages.index.astro.site/src/charts/formatters.ts.ChartCard.astro, EChart.astro, and KpiCard.astro.scrollend state updates.ResizeObserver..github/workflows/deploy.yml) for weekly automated pipeline execution and static deployment to GitHub Pages.site/package.json, site/astro.config.mjs, and site/tailwind.config.mjs.site/tsconfig.json and site/src/data/projects.ts.pipelines/run_all.py runner executing data pipelines sequentially with -u/--update flag support and metadata.json generation.space_launches.py ETL pipeline fetching launch records from Launch Library 2 API and computing yearly payload mass and decade costs per kg.ua_economic.py ETL pipeline downloading NBU macro spreadsheets and exchange rates API to calculate fiscal balance, debt ratios, and bilateral trade.world_economic.py ETL pipeline fetching data via DBnomics API (World Bank, IMF), UN Comtrade API, and OWID Energy to aggregate macroeconomic and industrial capacity metrics.war_rf_ua_attacks.py ETL pipeline downloading missile attacks datasets and aggregating monthly strike UAV and missile statistics.war_rf_ua-losses.py ETL pipeline downloading Google My Maps KML data and classifying verified equipment losses across 8 weapon categories.index.astro) with tag-based filtering and project metadata cards.space-launches dashboard tracking annual orbital payload capacity to LEO/SSO (1958–2026) and launch costs per kg by decade.ua-economic dashboard tracking Ukraine state budget execution, defense vs non-defense spending, domestic revenues, external debt, and foreign trade structure.world-economic dashboard comparing 8 major economies across real GDP (PPP), capital goods machinery turnover, electricity generation, manufacturing value added, and clean energy.war-rf-ua-attacks dashboard tracking monthly strike UAV and missile launches (ballistic vs cruise) with summary KPI metric cards.war-rf-ua-losses dashboard tracking visually confirmed heavy combat equipment losses across 8 weapon categories, monthly timelines, and expandable model breakdown cards.EChart.astro component integrating Apache ECharts with dark theme presets, auto-resize via ResizeObserver, and client-side formatter hydration.Layout.astro, PageHeader.astro, ChartCard.astro, KpiCard.astro, TagBadge.astro) and design tokens (tokens.js).