alpha-visualizer 1.3.3__tar.gz → 1.3.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- alpha_visualizer-1.3.3/.hypothesis/constants/1f1a8b196c458c69 → alpha_visualizer-1.3.4/.hypothesis/constants/3039d4d1f0d58a79 +1 -1
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/CHANGELOG.md +9 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/PKG-INFO +1 -1
- alpha_visualizer-1.3.4/docs/screenshots/en/live.png +0 -0
- alpha_visualizer-1.3.4/docs/screenshots/ja/live.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/openapi.json +1 -1
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/live/LivePositionView.tsx +24 -3
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/live/__tests__/LivePositionView.test.tsx +38 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/pyproject.toml +2 -2
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/__init__.py +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/BrowsePage-CM1i-BAv.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/BrowsePage-BEPv8i_r.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/BrowsePage-CM1i-BAv.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/BrowsePage-BEPv8i_r.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/ChartDataTable-D6be-k1Q.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/ChartDataTable-dR4i0xte.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/ChartDataTable-D6be-k1Q.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/ChartDataTable-dR4i0xte.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/ComparePage-DCdfRCfS.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/ComparePage-BXYzurL5.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/ComparePage-DCdfRCfS.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/ComparePage-BXYzurL5.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/DetailPage-BA2jPIHc.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/DetailPage-CYYypa9D.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/DetailPage-BA2jPIHc.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/DetailPage-CYYypa9D.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/EquityDrawdownPaneTV-CSgoeOWR.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/EquityDrawdownPaneTV-CKE4ZeC_.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/EquityDrawdownPaneTV-CSgoeOWR.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/EquityDrawdownPaneTV-CKE4ZeC_.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/IdeasPage-c9cmyWJb.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/IdeasPage-Bs7yfwo7.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/IdeasPage-c9cmyWJb.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/IdeasPage-Bs7yfwo7.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/LivePage-CzLaSe4e.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/LivePage-DUYLKDB7.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/LivePage-CzLaSe4e.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/LivePage-DUYLKDB7.js.map +1 -1
- alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/LiveTab-DXzJxU14.js +2 -0
- alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/LiveTab-DXzJxU14.js.map +1 -0
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/MaintenancePage-CO8i808b.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/MaintenancePage-DPViJS0Q.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/MaintenancePage-CO8i808b.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/MaintenancePage-DPViJS0Q.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/MetricsSummaryBarV2-BL-PgK2E.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/MetricsSummaryBarV2-8oDntE_g.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/MetricsSummaryBarV2-BL-PgK2E.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/MetricsSummaryBarV2-8oDntE_g.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/ReportPage-AMqKD9V6.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/ReportPage-BTyui937.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/ReportPage-AMqKD9V6.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/ReportPage-BTyui937.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/ReturnDistributionChart-CyKY_Azy.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/ReturnDistributionChart-CN6C-pWs.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/ReturnDistributionChart-CyKY_Azy.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/ReturnDistributionChart-CN6C-pWs.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/RunLogDetails-DIlAFKml.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/RunLogDetails-C4662i4B.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/RunLogDetails-DIlAFKml.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/RunLogDetails-C4662i4B.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/RunsPage-DclzyP8s.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/RunsPage--P5KB6Aw.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/RunsPage-DclzyP8s.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/RunsPage--P5KB6Aw.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/SettingsToggles-muTLsk0m.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/SettingsToggles-DPZul5Ek.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/SettingsToggles-muTLsk0m.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/SettingsToggles-DPZul5Ek.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/ShareCardButton-CQSnMWr6.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/ShareCardButton-Bt6mrRao.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/ShareCardButton-CQSnMWr6.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/ShareCardButton-Bt6mrRao.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/errorMessage-Z3_jM1rG.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/errorMessage-DlX-ZPy3.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/errorMessage-Z3_jM1rG.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/errorMessage-DlX-ZPy3.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/index-YzyZ6NbN.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/index-DsjiJ9NK.js +3 -3
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/index-YzyZ6NbN.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/index-DsjiJ9NK.js.map +1 -1
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/useBacktestData-DN1j_gK5.js → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/useBacktestData-B31tpHTO.js +2 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/useBacktestData-DN1j_gK5.js.map → alpha_visualizer-1.3.4/src/alpha_visualizer/static/assets/useBacktestData-B31tpHTO.js.map +1 -1
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/index.html +1 -1
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/uv.lock +1 -1
- alpha_visualizer-1.3.3/docs/screenshots/en/live.png +0 -0
- alpha_visualizer-1.3.3/docs/screenshots/ja/live.png +0 -0
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/LiveTab-CNBrM1Eo.js +0 -2
- alpha_visualizer-1.3.3/src/alpha_visualizer/static/assets/LiveTab-CNBrM1Eo.js.map +0 -1
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.agents/skills/source-command-audit-licenses/SKILL.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.agents/skills/source-command-pre-release/SKILL.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.claude/commands/audit-licenses.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.claude/commands/pre-release.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.codex/hooks.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.github/ISSUE_TEMPLATE/bug_report_ja.yml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.github/ISSUE_TEMPLATE/feature_request_ja.yml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.github/codeql/README.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.github/codeql/codeql-config.yml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.github/dependabot.yml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.github/workflows/ci.yml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.github/workflows/codeql.yml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.github/workflows/lighthouse.yml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.github/workflows/release.yml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.gitignore +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/.gitignore +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/0bf3463e8f4751b8 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/0caad6595136948b +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/184fa6728d185660 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/296b8092179c9f55 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/312a7aaf12a1fd47 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/316886ef98081ce9 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/331e194303817b32 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/36df1978b70731f9 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/43f703bafb1e4b04 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/4577b97f57a8a832 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/4726660442f99a00 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/4a1c4d1532cab28e +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/4b255f25d1067b71 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/4fd44198986300fe +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/508b282112ab038e +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/5320b01940d4c4ce +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/59c16b30deb5c037 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/5c80be020ed7a646 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/5c9eb073058f11a0 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/5fca39058ed3753e +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/64f671cc8bd3c7e4 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/6abf3e9a1356666c +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/707dd0d075295200 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/757b1f8305546439 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/7cea79ac6c0799bb +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/7f90c9d611001617 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/8d9ea99caee79fd4 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/906238816b505c1e +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/98d0c8b0e6532609 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/99c8a89c4a9a7859 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/9c2871fc1ddbab71 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/a636a4647020033d +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/ab4df659c6b192db +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/acddbf8018c5d884 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/af039261f357a5c1 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/b5541576e1e9aea7 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/b6221357177fc116 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/b9ff5bcd3a53e3a7 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/bfd4c6ca4462fe73 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/c4312fe8499bc1f7 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/c5349cb90ddc7968 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/d34317036474de6e +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/da39a3ee5e6b4b0d +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/dbe657c7851479a7 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/e41b0128c49db70e +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/e44a457d795e56c2 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/e52ef865e1fc122f +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/ea2d606acbfff989 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/eed5e66c16ae84b8 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/f7c4a04c97c0daf8 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/fa443af6269a6e02 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/fa54b8596401d232 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/.hypothesis/constants/ff4517cbfe51fea1 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/AGENTS.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/CLAUDE.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/CODE_OF_CONDUCT.en.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/CODE_OF_CONDUCT.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/CONTRIBUTING.en.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/CONTRIBUTING.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/LICENSE +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/NOTICE +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/README.en.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/README.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/SECURITY.en.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/SECURITY.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/THIRDPARTY_LICENSES.txt +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/cliff.toml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/adr/0001-pages-vs-screens.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/adr/0002-charts-visx-vs-components.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/adr/0003-openapi-typescript-codegen.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/adr/0004-condition-node-discriminated-union.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/lighthouse-ci.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/en/backtest-tv.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/en/browse.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/en/compare-heatmap.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/en/compare.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/en/detail.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/en/ideas.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/en/optimize.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/en/strategy-signal-tv.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/en/strategy.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/ja/backtest-tv.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/ja/browse.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/ja/compare-heatmap.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/ja/compare.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/ja/detail.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/ja/ideas.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/ja/optimize.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/ja/strategy-signal-tv.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/screenshots/ja/strategy.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/superpowers/plans/2026-07-25-live-equity-rich.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/superpowers/plans/2026-07-26-browse-recipe-rollup.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/superpowers/plans/2026-07-27-browse-symbol-coverage.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/superpowers/plans/2026-07-27-maintenance-orphan-runs.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/superpowers/specs/2026-07-25-live-equity-rich-design.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/superpowers/specs/2026-07-26-browse-recipe-rollup-design.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/superpowers/specs/2026-07-27-browse-symbol-coverage-design.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/docs/superpowers/specs/2026-07-27-maintenance-orphan-runs-design.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/.gitignore +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/.npmrc +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/.size-limit.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/.storybook/main.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/.storybook/preview.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/CLAUDE.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/README.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/THIRDPARTY_FONTS.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/README.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/data/historical/SPY_1d.parquet +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/data/ideas/ideas.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/data/results/backtest_results.db +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/data/strategies/dual_symbol_qqq.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/data/strategies/dual_symbol_spy.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/data/strategies/ema_trend_v1.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/data/strategies/ema_trend_v2.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/data/strategies/ema_trend_v3.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/data/strategies/idle_recipe_v1.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/data/strategies/idle_recipe_v2.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/data/strategies/momo_breakout.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/data/strategies/no_symbol_v1.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/data/strategies/rsi_reversal.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/data/strategies/sma_cross.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/fixtures/forge/forge.yaml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/helpers/locators.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/samples/sample-fixture.spec.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/screenshots/capture.spec.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/screenshots/equity-tv.spec.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/screenshots/strategy-signal-tv.spec.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/specs/browse.spec.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/specs/compare.spec.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/specs/detail.spec.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/specs/i18n.spec.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/specs/maintenance.spec.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/specs/share.spec.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/visual/README.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/visual/__snapshots__/linux/equity-drawdown-tv.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/visual/__snapshots__/linux/strategy-signal-tv.png +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/e2e/visual/tv-charts.spec.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/eslint.config.js +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/index.html +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/package.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/playwright.config.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/playwright.samples.config.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/playwright.screenshots.config.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/playwright.visual.config.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/pnpm-lock.yaml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/pnpm-workspace.yaml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/public/favicon.svg +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/public/icons.svg +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/api/__tests__/client.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/api/client.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/api/types.gen.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/api/types.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/CompareEquityTV.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/CompareEquityTV.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/EquityDrawdownPaneTV.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/EquityDrawdownPaneTV.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/RollingMetricsChartTV.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/RollingMetricsChartTV.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/StrategySignalChartTV.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/StrategySignalChartTV.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/WFOEquityTV.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/WFOEquityTV.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/__tests__/CompareEquityTV.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/__tests__/EquityDrawdownPaneTV.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/__tests__/RollingMetricsChartTV.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/__tests__/StrategySignalChartTV.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/__tests__/WFOEquityTV.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/__tests__/data.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/__tests__/regimeBands.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/__tests__/theme.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/__tests__/trades.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/data.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/regimeBands.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/theme.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/tv/trades.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/visx/AnnualReturnsBarV.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/visx/CorrelationHeatmapV.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/visx/MAEMFEScatterV.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/visx/MonthlyHeatmapV.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/visx/OptimizeHeatmapV.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/visx/OptimizeScatterV.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/visx/Sparkline.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/charts/visx/Sparkline.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/AppFooter.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/AppNav.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/CommandPalette.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/ConfirmActionButton.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/DetailToolbar.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/MetricsSummaryBarV2.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/MetricsSummaryBarV2.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/RootLayout.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/RouteErrorScreen.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/RunLogDetails.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/SettingsToggles.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/ShareCardButton.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/StrategyHero.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/__tests__/AppFooter.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/__tests__/AppNav.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/__tests__/CommandPalette.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/__tests__/CorrelationHeatmap.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/__tests__/MetricsSummaryBarV2.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/__tests__/RootLayout.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/__tests__/RouteErrorScreen.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/__tests__/SettingsToggles.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/__tests__/ShareCardButton.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/__tests__/ShareCardXButton.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/__tests__/responsive-styles.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/CollapsibleSection.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/CompareFloatingBar.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/CreateStrategyEntry.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/FilterBar.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/GroupByToggle.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/Heroline.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/RecipeRow.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/RunCompareView.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/RunHistoryTab.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/SavedViews.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/StrategyRow.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/StrategySlidePanel.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/StrategyTable.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/StrategyTableFooter.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/SymbolCoverageTable.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/__tests__/CollapsibleSection.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/__tests__/CreateStrategyEntry.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/__tests__/FilterBar.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/__tests__/RecipeRow.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/__tests__/RunCompareView.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/__tests__/RunHistoryTab.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/__tests__/StrategyRow.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/__tests__/StrategySlidePanel.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/__tests__/StrategyTable.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/__tests__/StrategyTableFooter.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/browser/__tests__/SymbolCoverageTable.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/AnnualReturnsBar.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/AnnualSummaryTable.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/CorrelationHeatmap.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/DrawdownDetailChart.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/HoldingPeriodChart.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/MAEMFEScatter.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/MonteCarloChart.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/OptimizeHeatmap.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/OptimizeScatter.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/ReturnDistributionChart.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/VaRChart.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/WFOTimeline.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/WeekdayPerformanceChart.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/__tests__/AnnualSummaryTable.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/__tests__/HoldingPeriodChart.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/charts/__tests__/MonteCarloChart.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/jobs/JobRunnerCard.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/live/LiveKpiRow.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/live/LivePositionsTable.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/live/LiveTab.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/live/SummaryCard.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/live/__tests__/LiveKpiRow.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/live/__tests__/LivePositionsTable.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/live/__tests__/LiveTab.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/live/__tests__/format.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/live/format.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/CarryAdjustedCard.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/CompareTable.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/ISOOSMetrics.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/MetricInfoTip.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/MetricsGrid.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/PortfolioComposer.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/RegimeBreakdownCards.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/SignalQualityBadge.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/SubperiodMetrics.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/__tests__/CompareTable.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/__tests__/MetricInfoTip.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/__tests__/MetricsGrid.hidden.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/__tests__/MetricsGrid.sentinel.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/__tests__/MetricsGrid.tooltip.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/__tests__/SignalQualityBadge.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/__tests__/SubperiodMetrics.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/__tests__/evaluateGood.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/metrics/evaluate.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/trades/TradeTable.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/trades/__tests__/TradeTable.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/tuning/DuplicateStrategyCard.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/tuning/TuningPanel.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/tuning/__tests__/DuplicateStrategyCard.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/tuning/__tests__/TuningPanel.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/constants/__tests__/metricDefinitions.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/constants/helpLinks.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/constants/metricDefinitions.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/constants/runSource.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/contexts/DashboardContext.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/contexts/dashboardConstants.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/__tests__/definedTokens.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/__tests__/noHardcodedColors.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/__tests__/tokens.contrast.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/a11y.css +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/Button.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/Card.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/ChartDataTable.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/Chip.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/ConfirmDialog.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/Divider.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/ErrorBanner.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/KeyValue.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/Loading.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/OverflowMenu.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/Pill.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/Pill.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/SectionHeader.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/SortHeaderCell.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/Stat.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/Stat.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/TabBar.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/Toolbar.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/__tests__/ChartDataTable.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/__tests__/ConfirmDialog.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/__tests__/ErrorBanner.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/__tests__/Loading.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/__tests__/OverflowMenu.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/__tests__/Pill.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/__tests__/SortHeaderCell.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/__tests__/TabBar.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/index.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/primitives/srOnly.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/tokens.css +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/design/useChartTheme.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useDocumentTitle.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useEquityViewport.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useFetchByKey.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useJobRunner.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useLiveAvailability.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useOrphanRuns.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useRunBacktest.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useScrollRestoration.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useSparklineCache.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useStarredStrategies.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useStrategyHistorical.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useStrategyList.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useSyncedTimeRange.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useTheme.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useViewerSettings.lang.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/__tests__/useViewerSettings.shared.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useBacktestData.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useDebounce.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useDocumentTitle.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useEquityViewport.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useFetchByKey.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useIdeasList.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useJobRunner.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useLiveAvailability.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useLiveList.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useOrphanRuns.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useRecentStrategies.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useScrollRestoration.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useSparklineCache.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useStarredStrategies.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useStrategyHistorical.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useStrategyList.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useSyncedTimeRange.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/hooks/useTheme.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/i18n/__tests__/strings.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/i18n/strings.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/annualSummary.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/benchmark.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/bestSharpe.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/correlation.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/distribution.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/drawdown.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/errorMessage.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/format.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/holdingPeriod.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/liveEquity.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/metricLabel.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/monteCarlo.properties.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/monteCarlo.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/optimizeHeatmap.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/paramImportance.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/portfolio.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/recipes.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/rolling.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/searchParams.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/searchStrategies.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/sentinel.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/shareCard.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/shareCardMulti.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/shareTweet.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/subperiod.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/symbolStats.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/walkForward.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/__tests__/weekday.test.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/annualSummary.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/assetClass.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/benchmark.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/bestSharpe.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/correlation.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/csv.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/distribution.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/drawdown.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/errorMessage.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/exportPng.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/format.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/holdingPeriod.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/liveEquity.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/metricLabel.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/monteCarlo.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/optimizeHeatmap.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/paramImportance.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/portfolio.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/recipes.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/rolling.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/searchParams.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/searchStrategies.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/sentinel.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/shareCard.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/shareTweet.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/subperiod.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/symbolStats.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/walkForward.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/lib/weekday.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/main.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/mock/btData.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/pages/BrowsePage.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/pages/ComparePage.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/pages/DetailPage.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/pages/IdeasPage.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/pages/LivePage.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/pages/MaintenancePage.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/pages/ReportPage.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/pages/RunsPage.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/pages/__tests__/BrowsePage.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/pages/__tests__/ComparePage.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/pages/__tests__/DetailPage.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/pages/__tests__/MaintenancePage.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/pages/__tests__/ReportPage.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/pages/__tests__/RunsPage.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/router.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/BacktestScreen.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/BacktestScreen.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/BrowseScreen.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/CompareScreen.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/CompareScreen.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/ISOOSScreen.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/IdeasScreen.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/IdeasScreen.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/LiveScreen.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/LiveScreen.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/MaintenanceScreen.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/OptimizeScreen.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/OptimizeScreen.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/StrategyScreen.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/WFOScreen.stories.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/WFOScreen.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/__tests__/BacktestScreen.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/__tests__/CompareScreen.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/__tests__/ISOOSScreen.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/__tests__/LiveScreen.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/__tests__/MaintenanceScreen.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/__tests__/OptimizeScreen.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/__tests__/WFOScreen.test.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/screens/strategy/SignalChartCard.tsx +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/test-setup.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/tsconfig.app.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/tsconfig.e2e.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/tsconfig.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/tsconfig.node.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/vite.config.ts +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/lighthouserc.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/release.sh +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/README.en.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/README.md +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/__init__.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/_generators/__init__.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/_generators/compatibility_matrix.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/_generators/ideas_defs.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/_generators/pseudo_backtest.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/_generators/pseudo_grid.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/_generators/pseudo_wfo.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/_generators/strategy_defs.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/_generators/synthetic_ohlcv.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/_generators/writers.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/build_samples.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/sample-forge/data/ideas/ideas.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/sample-forge/data/results/backtest_results.db +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/sample-forge/data/strategies/bbands_breakout_v1.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/sample-forge/data/strategies/donchian_turtle_v1.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/sample-forge/data/strategies/ema_adx_macd_v1.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/sample-forge/data/strategies/macd_crossover_v1.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/sample-forge/data/strategies/range_reversion_v1.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/sample-forge/data/strategies/rsi_reversion_v1.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/sample-forge/data/strategies/sma_crossover_v1.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/sample-forge/data/strategies/supertrend_adx_v1.json +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/samples/sample-forge/forge.yaml +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/scripts/compare_sqlite_dump.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/scripts/generate_openapi.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/scripts/generate_thirdparty_js.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/scripts/verify_build_artifacts.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/app.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/cli.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/db.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/dependencies.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/errors.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/forge_config.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/log_sanitize.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/repositories/__init__.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/repositories/backtest_results.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/repositories/ideas.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/repositories/live.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/repositories/optimization.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/repositories/strategies.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/routers/__init__.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/routers/historical.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/routers/ideas.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/routers/jobs.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/routers/live.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/routers/maintenance.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/routers/optimize.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/routers/results.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/routers/run.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/routers/strategies.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/routers/wfo.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/schemas/__init__.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/schemas/health.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/schemas/historical.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/schemas/ideas.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/schemas/live.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/schemas/maintenance.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/schemas/optimize.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/schemas/results.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/schemas/strategies.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/schemas/wfo.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/services/__init__.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/services/backtest.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/services/forge_cli.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/services/historical.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/services/jobs.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/services/live.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/services/tuning.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/services/walk_forward.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/SortHeaderCell-CetYtnjX.js +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/SortHeaderCell-CetYtnjX.js.map +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/fonts-DJsrEZjK.css +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/format-D0fEne3x.js +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/format-D0fEne3x.js.map +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/index-ngPg-0Y0.css +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/inter-tight-latin-400-normal-BLrFJfvD.woff +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/inter-tight-latin-400-normal-iW8qmuJY.woff2 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/inter-tight-latin-500-normal-BFXNXuvF.woff2 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/inter-tight-latin-500-normal-pobXraBK.woff +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/inter-tight-latin-600-normal-BgSTtRxb.woff2 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/inter-tight-latin-600-normal-D7bG6gX1.woff +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/react-CuMkScR3.js +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/react-CuMkScR3.js.map +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/react-router-CU9OAEs1.js +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/react-router-CU9OAEs1.js.map +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/rolldown-runtime-C0phanGV.js +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/source-serif-4-latin-600-normal-DMD1h6_f.woff +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/source-serif-4-latin-600-normal-DouSKlru.woff2 +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/tv-D3Zm-VpQ.js +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/tv-D3Zm-VpQ.js.map +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/useDocumentTitle-DPighAM_.js +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/useDocumentTitle-DPighAM_.js.map +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/visx-HscrFEDZ.js +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/assets/visx-HscrFEDZ.js.map +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/favicon.svg +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/src/alpha_visualizer/static/icons.svg +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/__init__.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/conftest.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/factories.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/fixtures/build_e2e_fixture.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/repositories/__init__.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/repositories/test_backtest_results_repo.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/repositories/test_ideas_reader.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/repositories/test_live_repo.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/repositories/test_optimization_repo.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/repositories/test_strategies_repo.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/__init__.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_db_mode_write_paths.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_forge_yaml_integration.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_historical.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_ideas.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_jobs.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_live.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_maintenance.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_optimize.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_results.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_run.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_sparkline.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_strategies.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_strategies_source.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_strategy_duplicate.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_strategy_save.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/routers/test_wfo.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/samples/__init__.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/samples/test_pseudo_backtest.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/samples/test_pseudo_grid.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/samples/test_pseudo_wfo.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/samples/test_sample_forge.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/samples/test_strategy_defs.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/samples/test_synthetic_ohlcv.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/samples/test_writers.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/schemas/__init__.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/schemas/test_schemas.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/services/__init__.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/services/test_backtest.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/services/test_backtest_properties.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/services/test_forge_cli.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/services/test_forge_failure_translation.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/services/test_historical.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/services/test_jobs.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/services/test_live.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/services/test_tuning.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/services/test_wfo.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/test_app.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/test_cli.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/test_compare_sqlite_dump.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/test_db.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/test_dependencies.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/test_errors.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/test_forge_config.py +0 -0
- {alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/tests/test_log_sanitize.py +0 -0
|
@@ -11,6 +11,15 @@ alpha-visualizer の全バージョン変更履歴です。
|
|
|
11
11
|
_(EN) Entries below are generated from Conventional Commits (Japanese). Group names: 新機能 = Features, バグ修正 = Bug fixes, リファクタリング = Refactoring, パフォーマンス改善 = Performance, ドキュメント = Docs, テスト = Tests, その他 = Chore. Breaking commits are tagged 破壊的変更._
|
|
12
12
|
|
|
13
13
|
|
|
14
|
+
## [1.3.3] - 2026-08-01
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### 新機能
|
|
18
|
+
|
|
19
|
+
- エクイティチャートに系列凡例を追加する (#463)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
14
23
|
## [1.3.2] - 2026-08-01
|
|
15
24
|
|
|
16
25
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: alpha-visualizer
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.4
|
|
4
4
|
Summary: Web visualization tool for AlphaForge backtest results
|
|
5
5
|
Project-URL: Homepage, https://github.com/alforge-labs/alpha-visualizer
|
|
6
6
|
Project-URL: Repository, https://github.com/alforge-labs/alpha-visualizer
|
|
Binary file
|
|
Binary file
|
{alpha_visualizer-1.3.3 → alpha_visualizer-1.3.4}/frontend/src/components/live/LivePositionView.tsx
RENAMED
|
@@ -78,10 +78,25 @@ function admitComparisonSeries(
|
|
|
78
78
|
return series
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
+
/**
|
|
82
|
+
* `ChartTheme.series`(accent / steel / moss / umber / mauve)における mauve の位置。
|
|
83
|
+
*
|
|
84
|
+
* 指数の色をパレット任せにすると、ラベルのソート順で 2 色目の steel が当たる。
|
|
85
|
+
* ライブ equity は success(緑 #4A723A)/ danger(赤)で描かれ、steel(#5B7A8C) は
|
|
86
|
+
* 緑と ΔE 44.6 しか離れていない(他の系列ペアは 67〜75)。明度も L* 49.5 vs 43.9 と
|
|
87
|
+
* 近いため、細い線では主系列と見分けられない。緑からも赤からも離れた mauve
|
|
88
|
+
* (ΔE 67.7)を固定で割り当てる。
|
|
89
|
+
*/
|
|
90
|
+
const MAUVE_SERIES_INDEX = 4
|
|
91
|
+
|
|
81
92
|
/** 許容済み系列(`admitComparisonSeries` 通過後)を overlay 形式に変換する。 */
|
|
82
|
-
function toOverlay(
|
|
93
|
+
function toOverlay(
|
|
94
|
+
label: string,
|
|
95
|
+
series: [string, number][] | null,
|
|
96
|
+
style?: Pick<EquityOverlay, 'color' | 'dashed'>,
|
|
97
|
+
): EquityOverlay | null {
|
|
83
98
|
if (!series) return null
|
|
84
|
-
return { label, values: series.map(([, v]) => v) }
|
|
99
|
+
return { label, values: series.map(([, v]) => v), ...style }
|
|
85
100
|
}
|
|
86
101
|
|
|
87
102
|
/**
|
|
@@ -115,7 +130,13 @@ export function LivePositionView({ summary, warnings, lang }: Props): ReactEleme
|
|
|
115
130
|
const acceptedBacktest = admitComparisonSeries(backtestLabel, summary.backtest_equity, values.length)
|
|
116
131
|
|
|
117
132
|
const overlays: EquityOverlay[] = [
|
|
118
|
-
|
|
133
|
+
// 指数だけは色と線種を明示する(理由は MAUVE_SERIES_INDEX のコメント)。
|
|
134
|
+
// 破線は色以外の手がかりでの区別も兼ねる(バックテスト画面の Buy & Hold と同じ扱い)
|
|
135
|
+
toOverlay(benchmarkLabel, acceptedBenchmark, {
|
|
136
|
+
color: theme.series[MAUVE_SERIES_INDEX],
|
|
137
|
+
dashed: true,
|
|
138
|
+
}),
|
|
139
|
+
// バックテストは既定パレット(accent 橙)のまま。equity の緑・赤とは十分離れている
|
|
119
140
|
toOverlay(backtestLabel, acceptedBacktest),
|
|
120
141
|
].filter((o): o is EquityOverlay => o != null)
|
|
121
142
|
|
|
@@ -182,6 +182,44 @@ describe('<LivePositionView /> assembly (Task 13)', () => {
|
|
|
182
182
|
expect(overlays[0]?.values).toEqual([1_000_000, 1_020_000])
|
|
183
183
|
})
|
|
184
184
|
|
|
185
|
+
it('指数は主系列と混同しない色・線種を明示指定する', () => {
|
|
186
|
+
// WHY: ライブ equity は success(緑 #4A723A)/ danger(赤)で描かれる。
|
|
187
|
+
// overlay の色をパレット任せにすると、ラベルのソート順で 2 色目の
|
|
188
|
+
// steel(#5B7A8C) が指数に当たる。steel は緑と ΔE 44.6 しか離れておらず
|
|
189
|
+
// (他の系列ペアは 67〜75)、明度も L* 49.5 vs 43.9 と近いため、細い線では
|
|
190
|
+
// 見分けられない。緑からも赤からも離れた mauve を固定で割り当て、さらに
|
|
191
|
+
// 破線にして色以外の手がかりでも区別できるようにする。
|
|
192
|
+
const summary = {
|
|
193
|
+
strategy_id: 'pf_1',
|
|
194
|
+
kind: 'position' as const,
|
|
195
|
+
metrics: {},
|
|
196
|
+
equity: [
|
|
197
|
+
['2026-06-04T00:00:00', 1_000_000],
|
|
198
|
+
['2026-06-05T00:00:00', 995_000],
|
|
199
|
+
] as [string, number][],
|
|
200
|
+
benchmark_equity: [
|
|
201
|
+
['2026-06-04T00:00:00', 1_000_000],
|
|
202
|
+
['2026-06-05T00:00:00', 1_020_000],
|
|
203
|
+
] as [string, number][],
|
|
204
|
+
backtest_equity: [
|
|
205
|
+
['2026-06-04T00:00:00', 1_000_000],
|
|
206
|
+
['2026-06-05T00:00:00', 1_010_000],
|
|
207
|
+
] as [string, number][],
|
|
208
|
+
} as unknown as LiveSummary
|
|
209
|
+
|
|
210
|
+
render(<LivePositionView summary={summary} warnings={[]} lang="ja" />)
|
|
211
|
+
const overlays = equityPaneProps.current?.overlays ?? []
|
|
212
|
+
const index = overlays.find((o) => o.label === '指数(Buy & Hold)')
|
|
213
|
+
const backtest = overlays.find((o) => o.label === 'バックテスト')
|
|
214
|
+
|
|
215
|
+
// mauve(ChartTheme.series の 5 色目)。steel が当たらないことが要点
|
|
216
|
+
expect(index?.color).toBe('#7B5380')
|
|
217
|
+
expect(index?.dashed).toBe(true)
|
|
218
|
+
// バックテストは既定パレット(accent 橙)のまま。緑とは十分離れている
|
|
219
|
+
expect(backtest?.color).toBeUndefined()
|
|
220
|
+
expect(backtest?.dashed).toBeFalsy()
|
|
221
|
+
})
|
|
222
|
+
|
|
185
223
|
it('overlay で除外された系列は KPI の超過リターンにも使われない(Finding 1: チャートと KPI の判定を統一)', () => {
|
|
186
224
|
// WHY: buildOverlay がチャート描画を弾く系列を、KPI 行(超過リターン)が
|
|
187
225
|
// 生の summary.benchmark_equity / backtest_equity をそのまま受け取って
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "alpha-visualizer"
|
|
3
|
-
version = "1.3.
|
|
3
|
+
version = "1.3.4"
|
|
4
4
|
description = "Web visualization tool for AlphaForge backtest results"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -93,7 +93,7 @@ dev = [
|
|
|
93
93
|
]
|
|
94
94
|
|
|
95
95
|
[tool.bumpversion]
|
|
96
|
-
current_version = "1.3.
|
|
96
|
+
current_version = "1.3.4"
|
|
97
97
|
commit = true
|
|
98
98
|
message = "chore: バージョン {new_version} にバンプ"
|
|
99
99
|
tag = true
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-C0phanGV.js";import{C as t,d as n,h as r,v as i,y as a}from"./visx-HscrFEDZ.js";import{t as o}from"./react-CuMkScR3.js";import{a as s,l as c,n as l,u}from"./react-router-CU9OAEs1.js";import{S as d,a as f,c as p,d as m,l as h,n as g,o as _,r as v,s as y,t as b,u as x,v as S,x as C,y as w}from"./index-YzyZ6NbN.js";import{t as T}from"./SortHeaderCell-CetYtnjX.js";import{i as E,o as D,t as O}from"./format-D0fEne3x.js";import{t as ee}from"./RunLogDetails-DIlAFKml.js";import{i as te,o as ne}from"./useBacktestData-DN1j_gK5.js";import{t as re}from"./SettingsToggles-muTLsk0m.js";import{t as ie}from"./useDocumentTitle-DPighAM_.js";import{r as ae}from"./errorMessage-Z3_jM1rG.js";var k=e(t(),1),A=o();function j({label:e,defaultOpen:t=!1,children:n,testId:r}){let[i,a]=(0,k.useState)(t),o=(0,k.useId)();return(0,A.jsxs)(`div`,{"data-testid":r,children:[(0,A.jsxs)(`button`,{type:`button`,"aria-expanded":i,"aria-controls":i?o:void 0,onClick:()=>a(e=>!e),style:{display:`flex`,alignItems:`center`,gap:`var(--space-2)`,width:`100%`,padding:`var(--space-3) var(--layout-gutter)`,background:`var(--bg)`,border:`none`,borderBottom:`1px solid var(--border)`,color:`var(--text2)`,fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:600,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`,cursor:`pointer`,textAlign:`left`},children:[(0,A.jsx)(`span`,{"aria-hidden":!0,style:{display:`inline-block`,width:14,fontFamily:`var(--mono)`,transform:i?`rotate(0deg)`:`rotate(-90deg)`,transition:`transform var(--motion-fast)`},children:`▾`}),e]}),i&&(0,A.jsx)(`div`,{id:o,children:n})]})}var M={width:64,padding:`6px 8px`,background:`var(--surface-2)`,border:`1px solid var(--border)`,borderRadius:`var(--radius-sm)`,color:`var(--text)`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,letterSpacing:`var(--tracking-mono)`},oe={width:240,maxWidth:`100%`,padding:`8px 12px`,background:`var(--surface-2)`,border:`1px solid var(--border)`,borderRadius:`var(--radius-md)`,color:`var(--text)`,fontFamily:`var(--sans)`,fontSize:`var(--fs-body)`},N={whiteSpace:`nowrap`,fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`};function P({active:e,onClick:t,children:n}){return(0,A.jsx)(`button`,{type:`button`,"aria-pressed":e,onClick:t,style:{padding:`4px 12px`,background:e?`var(--accent-bg)`:`transparent`,border:`1px solid ${e?`var(--accent-glow)`:`var(--border)`}`,borderRadius:`var(--radius-pill)`,color:e?`var(--accent)`:`var(--text2)`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,fontWeight:600,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`,cursor:`pointer`,transition:`background var(--motion-fast), color var(--motion-fast), border-color var(--motion-fast)`},children:n})}function se({symbols:e,timeframes:t,lang:n}){let r=C(n),[i,a]=s(),o=(e,t)=>{a(n=>{let r=new URLSearchParams(n);return t?r.set(e,t):r.delete(e),r},{replace:!0})},c=(e,t)=>{a(n=>{let r=new URLSearchParams(n),i=r.get(e)?.split(`,`).filter(Boolean)??[],a=i.includes(t)?i.filter(e=>e!==t):[...i,t];return a.length?r.set(e,a.join(`,`)):r.delete(e),r},{replace:!0})},l=()=>{a(new URLSearchParams,{replace:!0})},u=i.get(`q`)??``,d=i.get(`symbol`)?.split(`,`).filter(Boolean)??[],f=i.get(`tf`)?.split(`,`).filter(Boolean)??[],p=i.get(`sharpe_min`)??``,m=i.get(`dd_max`)??``,h=i.get(`include_unrun`)===`1`,g=u||d.length>0||f.length>0||p||m||h;return(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(_,{children:[(0,A.jsx)(`input`,{style:oe,"aria-label":r(`戦略名・銘柄を検索`,`Search strategy or symbol`),placeholder:r(`戦略名・銘柄を検索…`,`Search strategy or symbol…`),value:u,onChange:e=>o(`q`,e.target.value)}),t.length>0&&(0,A.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`var(--space-2)`,flexShrink:0},children:[(0,A.jsx)(`span`,{style:N,children:r(`時間軸`,`TF`)}),(0,A.jsx)(`div`,{style:{display:`flex`,gap:6,flexWrap:`wrap`},children:t.map(e=>(0,A.jsx)(P,{active:f.includes(e),onClick:()=>c(`tf`,e),children:e},e))})]}),(0,A.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6,flexShrink:0},children:[(0,A.jsx)(`span`,{style:N,children:`Sharpe ≥`}),(0,A.jsx)(`input`,{style:M,type:`number`,step:`0.1`,min:`0`,"aria-label":r(`Sharpe 下限`,`Sharpe ≥`),value:p,placeholder:`1.0`,onChange:e=>o(`sharpe_min`,e.target.value)})]}),(0,A.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6,flexShrink:0},children:[(0,A.jsx)(`span`,{style:N,children:r(`DD ≤ %`,`DD ≤ %`)}),(0,A.jsx)(`input`,{style:M,type:`number`,step:`1`,min:`0`,max:`100`,"aria-label":r(`DD 上限 (%)`,`DD ≤ %`),value:m,placeholder:`30`,onChange:e=>o(`dd_max`,e.target.value)})]}),(0,A.jsxs)(`label`,{style:{display:`inline-flex`,alignItems:`center`,gap:6,fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,color:`var(--text2)`,cursor:`pointer`},children:[(0,A.jsx)(`input`,{type:`checkbox`,checked:h,onChange:e=>o(`include_unrun`,e.target.checked?`1`:``),style:{accentColor:`var(--accent)`,cursor:`pointer`}}),r(`未実行を含める`,`Include unrun`)]}),g&&(0,A.jsx)(`button`,{type:`button`,onClick:l,style:{marginLeft:`auto`,background:`transparent`,border:`none`,color:`var(--accent)`,fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:600,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`,cursor:`pointer`,padding:`4px 8px`},children:r(`フィルタを解除`,`Clear filters`)})]}),e.length>0&&(0,A.jsx)(j,{label:r(`銘柄で絞る(${e.length})`,`Filter by symbol (${e.length})`),defaultOpen:d.length>0,testId:`symbol-filter-collapsible`,children:(0,A.jsx)(`div`,{style:{display:`flex`,gap:6,flexWrap:`wrap`,padding:`var(--space-2) 0`},children:e.map(e=>(0,A.jsx)(P,{active:d.includes(e),onClick:()=>c(`symbol`,e),children:e},e))})})]})}function F(e,t,n){let r=new URLSearchParams(e);return n==null||n===``?r.delete(t):r.set(t,n),r}var I=`alphaforge.starred_recipes.v1`;function ce(){if(typeof window>`u`)return new Set;try{let e=window.localStorage.getItem(I);if(!e)return new Set;let t=JSON.parse(e);return Array.isArray(t)?new Set(t.filter(e=>typeof e==`string`&&e.length>0)):new Set}catch{return new Set}}function le(e){try{window.localStorage.setItem(I,JSON.stringify([...e]))}catch{}}function ue(){let[e,t]=(0,k.useState)(ce);return{starredKeys:e,toggleStar:(0,k.useCallback)(e=>{t(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),le(n),n})},[])}}function L(e){return e.symbol||e.target_symbols[0]||null}function R(e){return e.last_run_at!=null&&e.last_run_at!==``}function z(e){return e.last_run_at??``}function de(e){let t=null;for(let n of e){if(n.latest_sharpe==null)continue;if(t==null){t=n;continue}let e=t.latest_sharpe;(n.latest_sharpe>e||n.latest_sharpe===e&&z(n)>z(t))&&(t=n)}if(t!=null)return t;let n=null;for(let t of e)R(t)&&(n==null||z(t)>z(n))&&(n=t);return n}function fe(e,t,n){return`${e}\u0000${t??``}\u0000${n??``}`}function pe(e,t){let n=e.latest_sharpe,r=t.latest_sharpe;return n==null&&r==null?z(t).localeCompare(z(e)):n==null?1:r==null?-1:n===r?z(t).localeCompare(z(e)):r-n}function me(e){let t=new Map;for(let n of e){let e=L(n),r=n.timeframe??null,i=fe(n.name,e,r),a=t.get(i);a?a.items.push(n):t.set(i,{name:n.name,symbol:e,timeframe:r,items:[n]})}let n=[];for(let[e,r]of t){let t=[...r.items].sort(pe);n.push({key:e,name:r.name,symbol:r.symbol,timeframe:r.timeframe,variants:t,best:de(t),variantCount:t.length,runCount:t.filter(R).length})}return n}var he=[`name`,`latest_sharpe`,`latest_return_pct`,`latest_max_drawdown_pct`,`latest_profit_factor`,`latest_win_rate_pct`,`last_run_at`],ge=[`none`,`symbol`,`tf`,`tier`];function _e(e){return e===`1`}function ve(e){return he.includes(e??``)?e:`latest_sharpe`}function ye(e){return e===`asc`||e===`desc`?e:`desc`}function be(e){return ge.includes(e??``)?e:`none`}function xe(e){return e&&e.length>0?e:null}function B(e){return e?e.split(`,`).map(e=>e.trim()).filter(Boolean).slice(0,6):[]}function V(e){return e??-1/0}var Se={strong:0,moderate:1,weak:2,no_data:3},Ce={strong:`Strong (Sharpe ≥ 1.5)`,moderate:`Moderate (1.0 ≤ Sharpe < 1.5)`,weak:`Weak (Sharpe < 1.0)`,no_data:`No data`};function we(e){return e==null?`no_data`:e>=1.5?`strong`:e>=1?`moderate`:`weak`}function H(e){let t=null,n=null;for(let r of e){let e=r.best?.latest_sharpe;e!=null&&(t=t==null?e:Math.max(t,e));let i=r.best?.latest_max_drawdown_pct;i!=null&&(n=n==null?i:Math.min(n,i))}return{count:e.length,bestSharpe:t,worstDrawdownPct:n}}function Te(e,t){if(t===`none`)return e.length===0?[]:[{key:`all`,label:`all`,rank:0,items:e,aggregate:H(e)}];if(t===`tier`){let t={strong:[],moderate:[],weak:[],no_data:[]};for(let n of e)t[we(n.best?.latest_sharpe)].push(n);let n=[];for(let e of Object.keys(t)){let r=t[e];r.length!==0&&n.push({key:`tier:${e}`,label:Ce[e],rank:Se[e],items:r,aggregate:H(r)})}return n.sort((e,t)=>e.rank-t.rank)}let n=e=>t===`symbol`?e.symbol??``:e.timeframe??``,r=new Map;for(let t of e){let e=n(t),i=r.get(e);i?i.push(t):r.set(e,[t])}let i=[];for(let[e,n]of r.entries()){let r=!e;i.push({key:`${t}:${e||`_unassigned`}`,label:r?`Unassigned`:e,rank:r?1/0:0,items:n,aggregate:H(n)})}return i.sort((e,t)=>e.rank===t.rank?e.aggregate.count===t.aggregate.count?e.label.localeCompare(t.label):t.aggregate.count-e.aggregate.count:e.rank-t.rank)}function Ee(){let[e,t]=(0,k.useState)([]),[n,r]=(0,k.useState)(!0),[i,a]=(0,k.useState)(null),[o,s]=(0,k.useState)(0),c=(0,k.useCallback)(()=>{r(!0),a(null),s(e=>e+1)},[]);return(0,k.useEffect)(()=>{let e=!1;return w.listStrategies().then(n=>{e||(t(n),r(!1))}).catch(t=>{e||(a(t instanceof Error?t.message:String(t)),r(!1))}),()=>{e=!0}},[o]),{all:e,loading:n,error:i,symbols:(0,k.useMemo)(()=>[...new Set(e.map(L).filter(e=>!!e))].sort(),[e]),timeframes:(0,k.useMemo)(()=>[...new Set(e.map(e=>e.timeframe).filter(Boolean))].sort(),[e]),reload:c}}function De(e,t,n,r,i,a){return(0,k.useMemo)(()=>{let o=t.toLowerCase();return e.filter(e=>{let s=L(e)??``;return!(t&&!e.name.toLowerCase().includes(o)&&!s.toLowerCase().includes(o)||n.length>0&&!n.includes(s)||r.length>0&&!r.includes(e.timeframe??``)||!isNaN(i)&&V(e.latest_sharpe)<i||!isNaN(a)&&Math.abs(V(e.latest_max_drawdown_pct))>a)})},[e,t,n,r,i,a])}function Oe(e,t,n){return(0,k.useMemo)(()=>[...e].sort((e,r)=>{let i,a;return t===`name`?(i=e.name,a=r.name):t===`last_run_at`?(i=e.best?.last_run_at??``,a=r.best?.last_run_at??``):(i=V(e.best?.[t]),a=V(r.best?.[t])),i<a?n===`asc`?-1:1:i>a?n===`asc`?1:-1:0}),[e,t,n])}function ke(e,t){return(0,k.useMemo)(()=>Te(e,t),[e,t])}function Ae(e,t){return{selectedId:xe(e.get(`selected`)),setSelectedId:e=>{t(t=>F(t,`selected`,e),{replace:!0})}}}function je(e,t){let n=(0,k.useMemo)(()=>B(e.get(`compare`)),[e]),r=e=>e.length===0?null:e.join(`,`);return{compareIds:n,toggleCompareId:e=>{e&&t(t=>{let n=B(t.get(`compare`)),i;return i=n.includes(e)?n.filter(t=>t!==e):n.length<6?[...n,e]:n,F(t,`compare`,r(i))},{replace:!0})},removeCompareId:e=>{t(t=>F(t,`compare`,r(B(t.get(`compare`)).filter(t=>t!==e))),{replace:!0})},clearCompareIds:()=>{t(e=>F(e,`compare`,null),{replace:!0})}}}function Me(){let[e,t]=s(),{all:n,loading:r,error:i,symbols:a,timeframes:o,reload:c}=Ee(),l=ve(e.get(`sort`)),u=ye(e.get(`dir`)),d=be(e.get(`group`)),f=_e(e.get(`include_unrun`)),p=De(n,e.get(`q`)??``,(0,k.useMemo)(()=>(e.get(`symbol`)??``).split(`,`).filter(Boolean),[e]),(0,k.useMemo)(()=>(e.get(`tf`)??``).split(`,`).filter(Boolean),[e]),parseFloat(e.get(`sharpe_min`)??``),parseFloat(e.get(`dd_max`)??``)),m=(0,k.useMemo)(()=>me(p),[p]),h=(0,k.useMemo)(()=>m.filter(e=>e.runCount===0).length,[m]),g=(0,k.useMemo)(()=>f?m:m.filter(e=>e.runCount>0),[m,f]),{starredKeys:_,toggleStar:v}=ue(),y=e.get(`starred`)===`1`,b=Oe((0,k.useMemo)(()=>y?g.filter(e=>_.has(e.key)):g,[g,y,_]),l,u),x=ke(b,d),S=(0,k.useMemo)(()=>me(n),[n]),C=e=>{t(t=>{let n=new URLSearchParams(t);return n.get(`sort`)===e?n.set(`dir`,n.get(`dir`)===`asc`?`desc`:`asc`):(n.set(`sort`,e),n.set(`dir`,`desc`)),n},{replace:!0})},w=e=>{t(t=>F(t,`group`,e===`none`?null:e),{replace:!0})},{selectedId:T,setSelectedId:E}=Ae(e,t),D=je(e,t);return{all:n,allRecipes:S,recipes:b,recipeTotal:S.length,hiddenUnrunRecipeCount:f?0:h,includeUnrun:f,groups:x,loading:r,error:i,reload:c,sortKey:l,sortDir:u,setSort:C,groupBy:d,setGroupBy:w,symbols:a,timeframes:o,selectedId:T,setSelectedId:E,starredKeys:_,toggleStar:v,...D}}function U(){let[e,t]=(0,k.useState)({}),n=(0,k.useRef)(new Set),r=(0,k.useCallback)(e=>{n.current.has(e)||(n.current.add(e),t(t=>({...t,[e]:`loading`})),(async()=>{try{let{values:n}=await w.getSparkline(e);t(t=>({...t,[e]:n.length>0?n:`empty`}))}catch(n){let r=n instanceof S&&n.status===404;t(t=>({...t,[e]:r?`empty`:`error`}))}})())},[]);return(0,k.useMemo)(()=>({entries:e,prefetch:r}),[e,r])}i();function W({values:e,width:t,height:i,color:o,strokeWidth:s=1.25}){let c=(0,k.useMemo)(()=>e.map((e,t)=>({x:t,y:e})),[e]),l=(0,k.useMemo)(()=>n({domain:[0,Math.max(1,c.length-1)],range:[1,t-1]}),[c.length,t]),u=(0,k.useMemo)(()=>{if(c.length===0)return n({domain:[0,1],range:[i-1,1]});let e=c.map(e=>e.y),t=Math.min(...e),r=Math.max(...e),a=(r-t||1)*.04;return n({domain:[t-a,r+a],range:[i-1,1]})},[c,i]),d=(0,k.useMemo)(()=>{if(o)return o;if(e.length<2)return`var(--text3)`;let t=e[0];return e[e.length-1]>=t?`var(--success)`:`var(--danger)`},[o,e]);return c.length<2?null:(0,A.jsx)(`svg`,{width:t,height:i,"aria-hidden":!0,style:{display:`block`},children:(0,A.jsx)(r,{data:c,x:e=>l(e.x),y:e=>u(e.y),stroke:d,strokeWidth:s,strokeLinecap:`round`,curve:a,fill:`none`})})}function G(e){return e==null?`var(--text3)`:e>=1.5?`var(--success)`:e>=1?`var(--warn)`:`var(--danger)`}var K={fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-md)`,padding:`8px 12px`,textAlign:`right`,borderBottom:`1px solid var(--border)`,letterSpacing:`var(--tracking-mono)`},q={...K,color:`var(--text3)`,fontSize:`var(--fs-mono-sm)`,whiteSpace:`nowrap`};function Ne({s:e,selected:t,inCompare:n,maxCompareReached:r,onSelect:i,onToggleCompare:a,onHover:o,sparkValues:s,lang:c,indent:u=!1}){let d=C(c),[f,p]=(0,k.useState)(!1),m=L(e),h=()=>{p(!0),o(e.strategy_id)},g=()=>{p(!1),o(null)},_=t?`var(--accent-bg)`:f?`var(--surface-2)`:`transparent`,v=Array.isArray(s)&&s.length>=2?(0,A.jsx)(W,{values:s,width:120,height:20}):s===`loading`?(0,A.jsx)(`div`,{style:{width:120,height:20,display:`flex`,alignItems:`center`,justifyContent:`flex-end`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`},children:`···`}):s===`error`?(0,A.jsx)(`span`,{title:d(`推移の取得に失敗しました`,`Failed to load the trend`),style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--warn)`},children:d(`取得失敗`,`error`)}):null;return(0,A.jsxs)(`tr`,{onMouseEnter:h,onMouseLeave:g,onClick:()=>i(e.strategy_id),title:d(`クリックでプレビュー`,`Click to preview`),style:{background:_,borderLeft:t?`2px solid var(--accent)`:`2px solid transparent`,transition:`background var(--motion-fast)`,cursor:`pointer`},children:[(0,A.jsx)(`td`,{style:{...K,textAlign:`center`,padding:`6px 4px`,width:36},onClick:e=>e.stopPropagation(),children:(0,A.jsx)(`input`,{type:`checkbox`,checked:n,disabled:r,"aria-label":d(`${e.name}(${e.strategy_id})を比較に追加`,`Add ${e.name} (${e.strategy_id}) to compare`),onChange:()=>a(e.strategy_id),style:{cursor:r?`not-allowed`:`pointer`,accentColor:`var(--accent)`}})}),(0,A.jsx)(`td`,{style:{...K,textAlign:`left`,paddingLeft:u?40:12,width:`100%`,maxWidth:0},children:(0,A.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,minWidth:0,flexWrap:`wrap`},children:[(0,A.jsx)(l,{to:`/detail/${e.strategy_id}`,title:e.name,onClick:e=>e.stopPropagation(),style:{flex:`0 1 auto`,minWidth:0,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`,fontFamily:`var(--serif)`,fontSize:`1.0625rem`,fontWeight:600,color:`var(--text)`,letterSpacing:`-0.005em`,lineHeight:1.2,textDecoration:`none`,transition:`color var(--motion-fast)`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--accent)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text)`},children:e.name}),(0,A.jsx)(`span`,{title:e.strategy_id,style:{flexShrink:0,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`,letterSpacing:`var(--tracking-mono)`},children:e.strategy_id}),m?(0,A.jsx)(x,{children:m}):(0,A.jsx)(`span`,{style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`},children:d(`未割当`,`unassigned`)}),e.timeframe?(0,A.jsx)(x,{children:e.timeframe}):null]})}),(0,A.jsxs)(`td`,{style:{...K,color:G(e.latest_sharpe),fontWeight:700,fontSize:`1rem`},children:[E(e.latest_sharpe,{decimals:2}),e.latest_source===`strategy-file`&&(0,A.jsx)(`span`,{"data-testid":`latest-source-badge`,role:`img`,"aria-label":d(`最新ランはチューニング試行(保存していないパラメータ)です`,`Latest run is a tuning trial with unsaved parameters`),title:d(`最新ランはチューニング試行(保存していないパラメータ)です`,`Latest run is a tuning trial with unsaved parameters`),style:{marginLeft:4,color:`var(--warn)`,fontSize:10},children:`⚠`})]}),(0,A.jsx)(`td`,{style:{...K,color:e.latest_return_pct==null?`var(--text3)`:e.latest_return_pct>=0?`var(--success)`:`var(--danger)`},children:E(e.latest_return_pct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-sm-down`,style:{...K,color:e.latest_max_drawdown_pct==null?`var(--text3)`:`var(--danger)`},children:E(e.latest_max_drawdown_pct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:`var(--text2)`},children:E(e.latest_profit_factor,{decimals:2})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:`var(--text2)`},children:E(e.latest_win_rate_pct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:q,children:O(e.last_run_at)}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,padding:`6px 12px`,width:132,textAlign:`right`},children:(0,A.jsx)(`div`,{style:{display:`inline-flex`,justifyContent:`flex-end`,minHeight:20},children:v})})]})}function Pe({recipe:e,expanded:t,onToggleExpand:n,selectedId:r,onSelect:i,compareIds:a,onToggleCompare:o,onHover:s,sparkValues:c,starred:u,onToggleStar:d,lang:f}){let p=C(f),[m,h]=(0,k.useState)(!1),g=e.best,_=g??e.variants[0],v=e.variantCount>1,y=g!=null&&r===g.strategy_id,b=g!=null&&a.includes(g.strategy_id),S=a.length>=6&&!b,w=()=>{h(!0),g&&s(g.strategy_id)},T=()=>{h(!1),s(null)},D=Array.isArray(c)&&c.length>=2?(0,A.jsx)(W,{values:c,width:120,height:20}):c===`loading`?(0,A.jsx)(`div`,{style:{width:120,height:20,display:`flex`,alignItems:`center`,justifyContent:`flex-end`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`},children:`···`}):c===`error`?(0,A.jsx)(`span`,{title:p(`推移の取得に失敗しました`,`Failed to load the trend`),style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--warn)`},children:p(`取得失敗`,`error`)}):null;return(0,A.jsxs)(`tr`,{onMouseEnter:w,onMouseLeave:T,onClick:()=>{g&&i(g.strategy_id)},title:p(`クリックでプレビュー`,`Click to preview`),style:{background:y?`var(--accent-bg)`:m?`var(--surface-2)`:`transparent`,borderLeft:y?`2px solid var(--accent)`:`2px solid transparent`,transition:`background var(--motion-fast)`,cursor:g?`pointer`:`default`},children:[(0,A.jsx)(`td`,{style:{...K,textAlign:`center`,padding:`6px 4px`,width:36},onClick:e=>e.stopPropagation(),children:(0,A.jsx)(`input`,{type:`checkbox`,checked:b,disabled:g==null||S,"aria-label":p(`${e.name}(${g?.strategy_id??e.key})の最良試行を比較に追加`,`Add the best trial of ${e.name} (${g?.strategy_id??e.key}) to compare`),onChange:()=>{g&&o(g.strategy_id)},style:{cursor:g==null||S?`not-allowed`:`pointer`,accentColor:`var(--accent)`}})}),(0,A.jsx)(`td`,{style:{...K,textAlign:`left`,width:`100%`,maxWidth:0},children:(0,A.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,minWidth:0,flexWrap:`wrap`},children:[v?(0,A.jsx)(`button`,{type:`button`,"aria-expanded":t,"aria-label":t?p(`${e.name} の試行を畳む`,`Collapse trials of ${e.name}`):p(`${e.name} の試行を展開`,`Expand trials of ${e.name}`),onClick:t=>{t.stopPropagation(),n(e.key)},style:{flexShrink:0,width:20,background:`transparent`,border:`none`,color:`var(--text2)`,fontFamily:`var(--mono)`,cursor:`pointer`,padding:0,transform:t?`rotate(0deg)`:`rotate(-90deg)`,transition:`transform var(--motion-fast)`},children:`▾`}):(0,A.jsx)(`span`,{"aria-hidden":!0,style:{flexShrink:0,width:20}}),(0,A.jsx)(`button`,{type:`button`,"aria-pressed":u,"aria-label":u?p(`${e.name}(${e.key})のスターを外す`,`Unstar ${e.name} (${e.key})`):p(`${e.name}(${e.key})にスターを付ける`,`Star ${e.name} (${e.key})`),onClick:t=>{t.stopPropagation(),d(e.key)},style:{flexShrink:0,background:`transparent`,border:`none`,cursor:`pointer`,padding:0,fontSize:14,lineHeight:1,color:u?`var(--warn)`:`var(--text3)`},children:u?`★`:`☆`}),(0,A.jsx)(l,{to:`/detail/${_.strategy_id}`,title:e.name,onClick:e=>e.stopPropagation(),style:{flex:`0 1 auto`,minWidth:0,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`,fontFamily:`var(--serif)`,fontSize:`1.0625rem`,fontWeight:600,color:`var(--text)`,letterSpacing:`-0.005em`,lineHeight:1.2,textDecoration:`none`,transition:`color var(--motion-fast)`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--accent)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text)`},children:e.name}),e.symbol?(0,A.jsx)(x,{children:e.symbol}):(0,A.jsx)(`span`,{style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`},children:p(`未割当`,`unassigned`)}),e.timeframe?(0,A.jsx)(x,{children:e.timeframe}):null,v&&(0,A.jsx)(`span`,{title:p(`試行 = 同じ戦略ベースのパラメータ違いのバリエーション`,`Trial = a parameter variation of the same base strategy`),style:{flexShrink:0,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`,letterSpacing:`var(--tracking-mono)`},children:p(`${e.variantCount} 試行中 ${e.runCount} 件実行`,`${e.runCount} of ${e.variantCount} trials run`)})]})}),(0,A.jsxs)(`td`,{style:{...K,color:G(g?.latest_sharpe),fontWeight:700,fontSize:`1rem`},children:[E(g?.latest_sharpe,{decimals:2}),g?.latest_source===`strategy-file`&&(0,A.jsx)(`span`,{"data-testid":`latest-source-badge`,role:`img`,"aria-label":p(`最新ランはチューニング試行(保存していないパラメータ)です`,`Latest run is a tuning trial with unsaved parameters`),title:p(`最新ランはチューニング試行(保存していないパラメータ)です`,`Latest run is a tuning trial with unsaved parameters`),style:{marginLeft:4,color:`var(--warn)`,fontSize:10},children:`⚠`})]}),(0,A.jsx)(`td`,{style:{...K,color:g?.latest_return_pct==null?`var(--text3)`:g.latest_return_pct>=0?`var(--success)`:`var(--danger)`},children:E(g?.latest_return_pct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-sm-down`,style:{...K,color:g?.latest_max_drawdown_pct==null?`var(--text3)`:`var(--danger)`},children:E(g?.latest_max_drawdown_pct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:`var(--text2)`},children:E(g?.latest_profit_factor,{decimals:2})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:`var(--text2)`},children:E(g?.latest_win_rate_pct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:q,children:O(g?.last_run_at)}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,padding:`6px 12px`,width:132,textAlign:`right`},children:(0,A.jsx)(`div`,{style:{display:`inline-flex`,justifyContent:`flex-end`,minHeight:20},children:D})})]})}function Fe({visibleRecipeCount:e,recipeTotal:t,hiddenUnrunRecipeCount:n,strategyTotal:r,lang:i}){let a=C(i),o=n>0?a(`(未実行のみ ${n} レシピを非表示)`,` (${n} unrun-only recipes hidden)`):``;return(0,A.jsx)(`div`,{"data-testid":`strategy-table-footer`,style:{padding:`12px 24px`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`,letterSpacing:`var(--tracking-mono)`,borderTop:`1px solid var(--border)`},children:a(`${e} レシピ表示 / 全 ${t} レシピ${o} · ${r} 戦略`,`${e} of ${t} recipes${o} · ${r} strategies`)})}var Ie=220,Le=9,J={fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`,padding:`14px 12px`,textAlign:`right`,cursor:`pointer`,background:`var(--surface)`,borderBottom:`1px solid var(--border)`,userSelect:`none`,whiteSpace:`nowrap`,position:`sticky`,top:0,zIndex:2};function Y({col:e,label:t,align:n=`right`,width:r,sortKey:i,sortDir:a,onSort:o,className:s}){let c=i===e;return(0,A.jsx)(T,{label:t,active:c,direction:a,onSort:()=>o(e),align:n,width:r,className:s,baseStyle:{...J,color:c?`var(--text2)`:`var(--text3)`}})}function Re({group:e,collapsed:t,onToggle:n,lang:r}){let i=C(r),{aggregate:a}=e;return(0,A.jsxs)(`tr`,{onClick:()=>n(e.key),style:{background:`var(--surface-2)`,cursor:`pointer`,borderTop:`1px solid var(--border)`},children:[(0,A.jsx)(`td`,{colSpan:2,style:{...K,textAlign:`left`,borderBottom:`1px solid var(--border)`},children:(0,A.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,gap:`var(--space-2)`},children:[(0,A.jsx)(`span`,{"aria-hidden":!0,style:{display:`inline-block`,width:14,fontFamily:`var(--mono)`,color:`var(--text2)`,transition:`transform var(--motion-fast)`,transform:t?`rotate(-90deg)`:`rotate(0deg)`},children:`▾`}),(0,A.jsx)(`span`,{style:{fontFamily:`var(--serif)`,fontSize:`1.0625rem`,fontWeight:600,color:`var(--text)`,letterSpacing:`-0.005em`},children:e.label}),(0,A.jsx)(`span`,{style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`},children:i(`${a.count}件`,`${a.count} strategies`)})]})}),(0,A.jsx)(`td`,{style:{...K,color:G(a.bestSharpe),fontWeight:700,borderBottom:`1px solid var(--border)`},title:i(`グループ内の最高 Sharpe`,`Best Sharpe in group`),children:E(a.bestSharpe,{decimals:2})}),(0,A.jsx)(`td`,{style:{...K,color:`var(--text3)`,borderBottom:`1px solid var(--border)`},children:`—`}),(0,A.jsx)(`td`,{className:`u-col-hide-sm-down`,style:{...K,color:a.worstDrawdownPct==null?`var(--text3)`:`var(--danger)`,borderBottom:`1px solid var(--border)`},title:i(`グループ内の最悪 DD`,`Worst drawdown in group`),children:E(a.worstDrawdownPct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:`var(--text3)`,borderBottom:`1px solid var(--border)`},children:`—`}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:`var(--text3)`,borderBottom:`1px solid var(--border)`},children:`—`}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:`var(--text3)`,borderBottom:`1px solid var(--border)`},children:`—`}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,borderBottom:`1px solid var(--border)`}})]})}function ze({recipes:e,strategyTotal:t,sortKey:n,sortDir:r,onSort:i,selectedId:a,onSelect:o,compareIds:s,onToggleCompare:c,starredKeys:l,onToggleStar:u,lang:d,groups:f,recipeTotal:p,hiddenUnrunRecipeCount:m}){let h=C(d),g=U(),[_,v]=(0,k.useState)(null),[y,b]=(0,k.useState)(()=>new Set),[x,S]=(0,k.useState)(()=>new Set);(0,k.useEffect)(()=>{if(!_)return;let e=window.setTimeout(()=>{g.prefetch(_)},Ie);return()=>window.clearTimeout(e)},[_,g]);let w=(0,k.useMemo)(()=>!f||f.length<=1?null:f,[f]),E=e=>{b(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},D=e=>{S(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},O=e=>{let t=x.has(e.key),n=(0,A.jsx)(Pe,{recipe:e,expanded:t,onToggleExpand:D,selectedId:a,onSelect:o,compareIds:s,onToggleCompare:c,onHover:v,sparkValues:e.best?g.entries[e.best.strategy_id]:void 0,starred:l.has(e.key),onToggleStar:u,lang:d},e.key);return t?[n,...e.variants.map(e=>{let t=s.includes(e.strategy_id);return(0,A.jsx)(Ne,{s:e,selected:a===e.strategy_id,inCompare:t,maxCompareReached:s.length>=6&&!t,onSelect:o,onToggleCompare:c,onHover:v,sparkValues:g.entries[e.strategy_id],lang:d,indent:!0},e.strategy_id)})]:[n]};return(0,A.jsxs)(`div`,{className:`u-scroll-x`,"data-testid":`strategy-table-scroll`,style:{flex:1,minWidth:0,background:`var(--bg)`},children:[(0,A.jsxs)(`table`,{style:{width:`100%`,borderCollapse:`collapse`,minWidth:1080},children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{scope:`col`,style:{...J,width:36,padding:`14px 4px`},children:(0,A.jsx)(`span`,{style:{position:`absolute`,width:1,height:1,padding:0,margin:-1,overflow:`hidden`,clip:`rect(0 0 0 0)`,whiteSpace:`nowrap`,border:0},children:h(`選択`,`Select`)})}),(0,A.jsx)(T,{label:h(`戦略`,`Strategy`),active:n===`name`,direction:r,onSort:()=>i(`name`),align:`left`,baseStyle:{...J,width:`100%`,color:n===`name`?`var(--text2)`:`var(--text3)`}}),(0,A.jsx)(Y,{col:`latest_sharpe`,label:`Sharpe`,sortKey:n,sortDir:r,onSort:i}),(0,A.jsx)(Y,{col:`latest_return_pct`,label:h(`リターン`,`Return`),sortKey:n,sortDir:r,onSort:i}),(0,A.jsx)(Y,{col:`latest_max_drawdown_pct`,label:`Max DD`,className:`u-col-hide-sm-down`,sortKey:n,sortDir:r,onSort:i}),(0,A.jsx)(Y,{col:`latest_profit_factor`,label:`Profit F.`,className:`u-col-hide-md-down`,sortKey:n,sortDir:r,onSort:i}),(0,A.jsx)(Y,{col:`latest_win_rate_pct`,label:`Win %`,className:`u-col-hide-md-down`,sortKey:n,sortDir:r,onSort:i}),(0,A.jsx)(Y,{col:`last_run_at`,label:h(`最終実行`,`Last run`),className:`u-col-hide-md-down`,sortKey:n,sortDir:r,onSort:i}),(0,A.jsx)(`th`,{scope:`col`,className:`u-col-hide-md-down`,style:{...J,width:132,textAlign:`right`},children:h(`推移`,`Trend`)})]})}),(0,A.jsxs)(`tbody`,{children:[w?w.flatMap(e=>{let t=y.has(e.key),n=(0,A.jsx)(Re,{group:e,collapsed:t,onToggle:E,lang:d},`__header__${e.key}`);return t?[n]:[n,...e.items.flatMap(O)]}):e.flatMap(O),e.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:Le,style:{...K,textAlign:`center`,padding:`48px 24px`,color:`var(--text3)`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,letterSpacing:`var(--tracking-mono)`},children:t>0?(0,A.jsxs)(A.Fragment,{children:[h(`該当する戦略はありません`,`No strategies match the current filters`),m>0&&(0,A.jsx)(`div`,{style:{marginTop:8},children:h(`「未実行を含める」にチェックすると表示できます`,`Check "Include unrun" to show them`)})]}):(0,A.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:10,lineHeight:1.8},children:[(0,A.jsx)(`div`,{style:{color:`var(--text2)`},children:h(`まだ戦略がありません`,`No strategies yet`)}),(0,A.jsxs)(`div`,{children:[h(`サンプルデータで試す: `,`Try with bundled samples: `),(0,A.jsx)(`code`,{style:{background:`var(--surface)`,border:`1px solid var(--border)`,borderRadius:4,padding:`2px 6px`},children:`alpha-vis serve --use-bundled-samples`})]}),(0,A.jsx)(`div`,{children:(0,A.jsxs)(`a`,{href:`https://alforgelabs.com/?utm_source=alpha-visualizer&utm_medium=empty_state`,target:`_blank`,rel:`noopener noreferrer`,"aria-label":h(`AlphaForge で最初のバックテストを作る(別タブで開く)`,`Create your first backtest with AlphaForge (opens in new tab)`),style:{color:`var(--accent)`,textDecoration:`none`},children:[h(`AlphaForge で最初のバックテストを作る`,`Create your first backtest with AlphaForge`),(0,A.jsx)(`span`,{"aria-hidden":`true`,children:` ↗`})]})})]})})})]})]}),(0,A.jsx)(Fe,{visibleRecipeCount:e.length,recipeTotal:p,hiddenUnrunRecipeCount:m,strategyTotal:t,lang:d})]})}function Be({strategies:e,lang:t}){let n=C(t),r=u(),[i,a]=(0,k.useState)(!1),[o,s]=(0,k.useState)(``);return i?(0,A.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,flexWrap:`wrap`},children:[(0,A.jsx)(`label`,{htmlFor:`create-strategy-source`,style:{fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`,whiteSpace:`nowrap`},children:n(`複製元`,`Source`)}),(0,A.jsxs)(`select`,{id:`create-strategy-source`,"aria-label":n(`複製元の戦略`,`Source strategy to duplicate`),value:o,onChange:e=>s(e.target.value),style:{maxWidth:280,padding:`6px 8px`,background:`var(--surface-2)`,border:`1px solid var(--border)`,borderRadius:`var(--radius-sm)`,color:`var(--text)`,fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`},children:[(0,A.jsx)(`option`,{value:``,children:n(`複製元を選択…`,`Choose a source…`)}),e.map(e=>(0,A.jsxs)(`option`,{value:e.strategy_id,children:[e.name,`(`,e.strategy_id,`)`]},e.strategy_id))]}),(0,A.jsx)(h,{variant:`primary`,size:`sm`,disabled:!o,onClick:()=>r(`/detail/${encodeURIComponent(o)}?tab=strategy`),children:n(`作成へ進む`,`Continue`)}),(0,A.jsx)(h,{variant:`ghost`,size:`sm`,onClick:()=>a(!1),children:n(`やめる`,`Cancel`)})]}):(0,A.jsx)(h,{variant:`ghost`,size:`sm`,onClick:()=>a(!0),children:n(`+ 新規戦略(既存から複製)`,`+ New strategy (duplicate existing)`)})}var X={fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`};function Ve({strategy:e,onClose:t,lang:n}){let r=C(n),[i,a]=(0,k.useState)(0),[o,s]=(0,k.useState)(!1),c=ne(e.strategy_id,i),u=c.status===`ready`?c.data.slice(0,5):[],{run:d,running:m,error:_,logTail:y}=te(),b=U(),S=b.entries[e.strategy_id];(0,k.useEffect)(()=>{b.prefetch(e.strategy_id)},[e.strategy_id,b]);let w=()=>{if(e.symbol){if(e.last_run_at!==null){s(!0);return}T()}},T=async()=>{s(!1),e.symbol&&await d(e.strategy_id,e.symbol)&&a(e=>e+1)};return(0,A.jsxs)(`aside`,{className:`u-drawer-md-down`,"data-open":`true`,"data-testid":`strategy-slide-panel`,style:{width:`var(--slidepanel-width)`,flexShrink:0,alignSelf:`flex-start`,position:`sticky`,top:0,maxHeight:`100vh`,background:`var(--surface)`,borderLeft:`1px solid var(--border)`,display:`flex`,flexDirection:`column`,overflowY:`auto`},children:[(0,A.jsxs)(`header`,{style:{padding:`var(--space-5) var(--space-5) var(--space-4)`,display:`flex`,alignItems:`flex-start`,gap:`var(--space-3)`},children:[(0,A.jsxs)(`div`,{style:{flex:1,minWidth:0},children:[(0,A.jsx)(`h2`,{style:{margin:0,fontFamily:`var(--serif)`,fontSize:`1.375rem`,fontWeight:700,color:`var(--text)`,letterSpacing:`-0.01em`,lineHeight:1.15},children:e.name}),(0,A.jsxs)(`div`,{style:{display:`flex`,gap:6,marginTop:8,flexWrap:`wrap`},children:[e.symbol?(0,A.jsx)(x,{children:e.symbol}):null,e.timeframe?(0,A.jsx)(x,{children:e.timeframe}):null]})]}),(0,A.jsx)(`button`,{type:`button`,onClick:t,"aria-label":r(`閉じる`,`Close`),style:{background:`transparent`,border:`none`,cursor:`pointer`,color:`var(--text3)`,fontSize:18,lineHeight:1,padding:4},children:`✕`})]}),(0,A.jsxs)(`div`,{style:{padding:`0 var(--space-5) var(--space-4)`,display:`flex`,alignItems:`center`,gap:`var(--space-2)`,flexWrap:`wrap`},children:[(0,A.jsxs)(l,{to:`/detail/${e.strategy_id}`,style:{display:`inline-flex`,alignItems:`center`,gap:6,padding:`6px 12px`,background:`var(--accent)`,color:`var(--surface)`,border:`1px solid var(--accent-strong, var(--accent))`,borderRadius:`var(--radius-sm)`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,fontWeight:600,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`,textDecoration:`none`,transition:`background var(--motion-fast)`},children:[r(`フル詳細を開く`,`Open full detail`),` →`]}),(0,A.jsx)(h,{variant:`subtle`,size:`sm`,onClick:w,disabled:m||!e.symbol,children:m?r(`実行中…`,`Running…`):r(`バックテスト再実行`,`Re-run backtest`)}),_&&(0,A.jsx)(`p`,{style:{marginTop:12,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--danger)`,padding:`8px 12px`,background:`color-mix(in srgb, var(--danger) 10%, transparent)`,border:`1px solid color-mix(in srgb, var(--danger) 24%, transparent)`,borderRadius:`var(--radius-sm)`,letterSpacing:`var(--tracking-mono)`},children:_}),y&&(0,A.jsx)(`div`,{style:{width:`100%`,marginTop:8},children:(0,A.jsx)(ee,{log:y,lang:n})})]}),(0,A.jsx)(f,{}),(0,A.jsxs)(`section`,{style:{padding:`var(--space-4) var(--space-5)`},children:[(0,A.jsx)(`div`,{style:X,children:r(`エクイティ推移`,`Equity curve`)}),(0,A.jsx)(`div`,{style:{marginTop:`var(--space-3)`,background:`var(--surface-2)`,border:`1px solid var(--border)`,borderRadius:`var(--radius-sm)`,padding:`var(--space-3)`,minHeight:132,display:`flex`,alignItems:`center`,justifyContent:`center`},children:Array.isArray(S)&&S.length>=2?(0,A.jsx)(W,{values:S,width:300,height:108,strokeWidth:1.5}):S===`loading`?(0,A.jsxs)(`span`,{role:`status`,"aria-live":`polite`,"aria-busy":`true`,children:[(0,A.jsx)(g,{width:300,height:108}),(0,A.jsx)(`span`,{style:v,children:r(`読み込み中…`,`Loading…`)})]}):S===`error`?(0,A.jsx)(`span`,{style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--warn)`,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`},children:r(`取得に失敗しました`,`Failed to load`)}):(0,A.jsx)(`span`,{style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`},children:r(`データなし`,`No data`)})})]}),(0,A.jsx)(f,{}),(0,A.jsxs)(`section`,{style:{padding:`var(--space-4) var(--space-5)`},children:[(0,A.jsx)(`div`,{style:X,children:r(`実行履歴`,`Run history`)}),(0,A.jsxs)(`div`,{style:{marginTop:`var(--space-3)`},children:[u.map((e,t)=>(0,A.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`baseline`,padding:`10px 0`,borderTop:t===0?`none`:`1px solid var(--border)`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-md)`,letterSpacing:`var(--tracking-mono)`},children:[(0,A.jsx)(`span`,{style:{color:`var(--text3)`},children:e.run_at.slice(0,10)}),(0,A.jsx)(`span`,{style:{color:e.sharpe_ratio!==null&&e.sharpe_ratio>=1?`var(--success)`:e.sharpe_ratio===null?`var(--text3)`:`var(--warn)`,fontWeight:600},children:e.sharpe_ratio===null?`—`:`Sharpe ${e.sharpe_ratio.toFixed(2)}`}),(0,A.jsx)(`span`,{style:{color:`var(--text2)`,minWidth:60,textAlign:`right`},children:e.total_return_pct===null?`—`:`${e.total_return_pct.toFixed(1)}%`})]},e.run_id)),u.length===0&&c.status===`ready`&&(0,A.jsx)(`p`,{style:{margin:0,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`,letterSpacing:`var(--tracking-mono)`,padding:`8px 0`},children:r(`履歴はありません`,`No runs yet`)})]})]}),(0,A.jsx)(p,{open:o,title:r(`バックテスト再実行`,`Re-run backtest`),message:r(`新しい実行結果が追加され、表示は最新の結果に切り替わります(過去の結果は実行履歴に残ります)。実行しますか?`,`A new run will be added and the view will switch to the latest result (past results remain in the run history). Continue?`),confirmLabel:m?r(`実行中…`,`Running…`):r(`実行`,`Run`),cancelLabel:r(`やめる`,`Cancel`),onConfirm:T,onCancel:()=>s(!1)})]})}function He({compareIds:e,strategies:t,onRemove:n,lang:r}){let i=C(r),a=u();if(e.length===0)return null;let o=e=>t.find(t=>t.strategy_id===e)?.name??e;return(0,A.jsxs)(`div`,{style:{position:`fixed`,bottom:0,left:0,right:0,zIndex:200,background:`var(--surface)`,borderTop:`1px solid var(--accent-glow)`,boxShadow:`0 -8px 24px color-mix(in srgb, var(--accent) 12%, transparent)`,padding:`14px 24px`,display:`flex`,alignItems:`center`,gap:`var(--space-4)`},children:[(0,A.jsx)(`span`,{style:{fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:600,color:`var(--accent)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`,whiteSpace:`nowrap`},children:i(`${e.length}件選択中`,`${e.length} selected`)}),(0,A.jsx)(`div`,{style:{display:`flex`,gap:8,flexWrap:`wrap`,flex:1,minWidth:0},children:e.map(e=>(0,A.jsxs)(`span`,{style:{display:`inline-flex`,alignItems:`center`,gap:8,padding:`6px 10px 6px 14px`,background:`var(--accent-bg)`,border:`1px solid var(--accent-glow)`,borderRadius:`var(--radius-pill)`,fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text)`,maxWidth:240},children:[(0,A.jsx)(`span`,{style:{whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:o(e)}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>n(e),"aria-label":i(`外す`,`Remove`),style:{background:`transparent`,border:`none`,cursor:`pointer`,color:`var(--text3)`,fontSize:14,padding:0,lineHeight:1},children:`✕`})]},e))}),(0,A.jsx)(h,{variant:`primary`,size:`md`,onClick:()=>{a(`/compare?ids=${e.join(`,`)}`)},children:i(`比較する →`,`Compare →`)})]})}var Ue={fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`};function We({groupBy:e,onChange:t,lang:n}){let r=C(n),i=[[`none`,r(`なし`,`None`)],[`symbol`,r(`銘柄`,`Symbol`)],[`tf`,r(`時間軸`,`Timeframe`)],[`tier`,r(`Sharpe階級`,`Sharpe Tier`)]];return(0,A.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,gap:`var(--space-2)`},children:[(0,A.jsx)(`span`,{style:Ue,children:r(`グループ`,`Group by`)}),(0,A.jsx)(`div`,{role:`radiogroup`,"aria-label":r(`グルーピング`,`Group by`),style:{display:`inline-flex`,background:`var(--surface-2)`,border:`1px solid var(--border)`,borderRadius:`var(--radius-pill)`,padding:2,gap:2},children:i.map(([n,i])=>{let a=n===e;return(0,A.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":a,"aria-label":`${r(`グループ`,`Group by`)}: ${i}`,onClick:()=>t(n),style:{padding:`4px 12px`,borderRadius:`var(--radius-pill)`,border:`none`,background:a?`var(--accent)`:`transparent`,color:a?`var(--surface)`:`var(--text2)`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,fontWeight:600,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`,cursor:`pointer`,transition:`background var(--motion-fast), color var(--motion-fast)`},children:i},n)})})]})}var Z=7,Ge=1440*60*1e3;function Ke(e){let t=new Set,n=null,r=0,i=Date.now()-Z*Ge;for(let a of e){let e=L(a);if(e&&t.add(e),a.latest_sharpe!=null&&(n=n==null?a.latest_sharpe:Math.max(n,a.latest_sharpe)),a.last_run_at){let e=Date.parse(a.last_run_at);!Number.isNaN(e)&&e>=i&&(r+=1)}}return{totalStrategies:e.length,uniqueSymbols:t.size,topSharpe:n,recentRunsCount:r}}function qe(e){return e==null?`neutral`:e>=1.5?`positive`:e>=1?`warning`:`negative`}function Je({items:e,lang:t}){let n=C(t),r=(0,k.useMemo)(()=>Ke(e),[e]);return(0,A.jsxs)(`div`,{role:`group`,"aria-label":n(`全体メトリクス`,`Overview metrics`),style:{display:`flex`,flexWrap:`wrap`,gap:`var(--space-5)`,marginTop:`var(--space-3)`,paddingTop:`var(--space-3)`,borderTop:`1px solid var(--border)`},children:[(0,A.jsx)(m,{size:`md`,label:n(`戦略数`,`Strategies`),value:r.totalStrategies>0?String(r.totalStrategies):`—`,sub:n(`登録済み`,`registered`)}),(0,A.jsx)(m,{size:`md`,label:n(`銘柄数`,`Symbols`),value:r.uniqueSymbols>0?String(r.uniqueSymbols):`—`,sub:n(`割当済`,`with assignments`)}),(0,A.jsx)(m,{size:`md`,tone:qe(r.topSharpe),label:n(`最高 Sharpe`,`Top Sharpe`),value:D(r.topSharpe),sub:n(`最新バックテスト`,`latest backtests`)}),(0,A.jsx)(m,{size:`md`,tone:r.recentRunsCount>0?`accent`:`neutral`,label:n(`直近実行`,`Recent runs`),value:r.recentRunsCount>0?String(r.recentRunsCount):`—`,sub:n(`${Z}日以内`,`last ${Z} days`)})]})}var Ye=[{key:`all`,params:{}},{key:`starred`,params:{starred:`1`}},{key:`high_sharpe`,params:{sharpe_min:`1.5`,sort:`latest_sharpe`,dir:`desc`}},{key:`recent`,params:{sort:`last_run_at`,dir:`desc`}},{key:`risky`,params:{sort:`latest_max_drawdown_pct`,dir:`asc`}}],Q=[`q`,`symbol`,`tf`,`sharpe_min`,`dd_max`,`include_unrun`,`sort`,`dir`,`selected`,`compare`,`starred`];function Xe(e,t){let n=C(t);switch(e){case`all`:return n(`すべて`,`All`);case`starred`:return n(`スター`,`Starred`);case`high_sharpe`:return n(`高 Sharpe`,`High Sharpe`);case`recent`:return n(`最近実行`,`Recent`);case`risky`:return n(`要注意`,`Risky`)}}function Ze(e,t){let n=C(t);switch(e){case`all`:return n(`フィルタなし`,`No filter`);case`starred`:return n(`スターを付けた戦略のみ`,`Only starred strategies`);case`high_sharpe`:return n(`Sharpe 1.5 以上を Sharpe 降順で`,`Sharpe ≥ 1.5, sorted by Sharpe`);case`recent`:return n(`最終実行が新しい順`,`Sorted by last run desc`);case`risky`:return n(`Max DD が深い順`,`Sorted by deepest drawdown`)}}function Qe(e,t){if(e.key===`all`)return Q.every(e=>!t.get(e));for(let[n,r]of Object.entries(e.params))if(t.get(n)!==r)return!1;for(let n of Q)if(!(n in e.params)&&t.get(n))return!1;return!0}function $e({lang:e}){let t=C(e),[n,r]=s(),i=e=>{r(t=>{let n=new URLSearchParams(t);for(let e of Q)n.delete(e);for(let[t,r]of Object.entries(e.params))n.set(t,r);return n},{replace:!0})};return(0,A.jsxs)(`div`,{role:`radiogroup`,"aria-label":t(`保存ビュー`,`Saved views`),style:{display:`flex`,alignItems:`center`,gap:`var(--space-3)`,padding:`var(--space-3) var(--space-7)`,background:`var(--bg)`,borderBottom:`1px solid var(--border)`,flexWrap:`wrap`},children:[(0,A.jsx)(`span`,{style:{fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`},children:(0,A.jsx)(`span`,{title:t(`レンズ = ワンクリックで適用できる絞り込みプリセット`,`Lens = a one-click filter preset`),children:t(`レンズ`,`Lenses`)})}),Ye.map(t=>{let r=Qe(t,n),a=Xe(t.key,e),o=Ze(t.key,e);return(0,A.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":r,"aria-label":`${a}: ${o}`,title:o,onClick:()=>i(t),style:{padding:`6px 14px`,borderRadius:`var(--radius-pill)`,border:`1px solid ${r?`var(--accent-glow, var(--accent))`:`var(--border)`}`,background:r?`var(--accent-bg)`:`var(--surface-2)`,color:r?`var(--accent)`:`var(--text2)`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,fontWeight:600,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`,cursor:`pointer`,transition:`background var(--motion-fast), color var(--motion-fast), border-color var(--motion-fast)`},children:a},t.key)})]})}var et=[`index`,`etf`,`stock`,`fx`,`commodity`,`other`],tt={index:{ja:`指数`,en:`Indices`},etf:{ja:`ETF`,en:`ETFs`},stock:{ja:`個別銘柄`,en:`Stocks`},fx:{ja:`FX`,en:`Forex`},commodity:{ja:`コモディティ`,en:`Commodities`},other:{ja:`その他`,en:`Other`}},nt=new Set(`SPY.QQQ.TQQQ.SQQQ.VOO.VTI.IVV.VEA.VWO.EFA.EEM.IWM.DIA.GLD.SLV.TLT.IEF.HYG.LQD.XLF.XLE.XLK.XLI.XLP.XLY.XLV.XLU.XBI.SOXL.SOXX.ARKK.SH.UVXY.AGG.BND`.split(`.`)),rt=new Set([`NAS100`,`SPX500`,`US30`,`US500`,`UK100`,`GER40`,`GER30`,`JPN225`,`HK50`,`AUS200`,`FRA40`,`EU50`]),it=new Set([`XAU`,`XAG`,`XPT`,`XPD`,`XBT`]),at=/^[A-Z]{6}(=X|_X)$/i;function ot(e){if(!e)return`other`;let t=e.trim();if(!t)return`other`;let n=t.toUpperCase();return t.startsWith(`^`)||rt.has(n)?`index`:at.test(t)?`fx`:t.endsWith(`=F`)||it.has(n)?`commodity`:nt.has(n)?`etf`:/^[A-Z][A-Z0-9.-]*$/i.test(t)?`stock`:`other`}var st=`unrunRecipeCount`,ct=`desc`,lt=[{key:`unrunRecipeCount`,dir:`desc`},{key:`recipeCount`,dir:`desc`},{key:`bestSharpe`,dir:`desc`},{key:`symbol`,dir:`asc`}];function $(e,t){switch(t){case`symbol`:return e.symbol??``;case`assetClass`:return et.indexOf(e.assetClass);case`lastRunAt`:return e.lastRunAt??``;case`bestSharpe`:return e.bestSharpe??-1/0;case`avgReturnPct`:return e.avgReturnPct??-1/0;case`recipeCount`:return e.recipeCount;case`runRecipeCount`:return e.runRecipeCount;case`unrunRecipeCount`:return e.unrunRecipeCount}}function ut(e,t,n,r){let i=$(e,n),a=$(t,n),o;return o=typeof i==`string`&&typeof a==`string`?i.localeCompare(a):typeof i==`number`&&typeof a==`number`?i<a?-1:+(i>a):0,r===`asc`?o:-o}function dt(e,t,n){return[...e].sort((e,r)=>{if(e.symbol===null&&r.symbol!==null)return 1;if(r.symbol===null&&e.symbol!==null)return-1;let i=ut(e,r,t,n);if(i!==0)return i;for(let n of lt){if(n.key===t)continue;let i=ut(e,r,n.key,n.dir);if(i!==0)return i}return 0})}function ft(e,t){let n=null,r=0,i=0,a=null,o=0;for(let e of t){e.runCount>0&&(o+=1);let t=e.best;t!=null&&(t.latest_sharpe!=null&&(n=n==null?t.latest_sharpe:Math.max(n,t.latest_sharpe)),t.latest_return_pct!=null&&(r+=t.latest_return_pct,i+=1));for(let t of e.variants){let e=t.last_run_at;e&&(a==null||e>a)&&(a=e)}}return{symbol:e,assetClass:e==null?`other`:ot(e),recipeCount:t.length,runRecipeCount:o,unrunRecipeCount:t.length-o,bestSharpe:n,avgReturnPct:i>0?r/i:null,lastRunAt:a}}function pt(e){let t=new Map,n=[];for(let r of e){let e=r.symbol;if(e==null){n.push(r);continue}let i=t.get(e);i?i.push(r):t.set(e,[r])}let r=[];for(let[e,n]of t.entries())r.push(ft(e,n));return n.length>0&&r.push(ft(null,n)),r}var mt={fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`,padding:`10px 12px`,background:`var(--surface)`,borderBottom:`1px solid var(--border)`,userSelect:`none`,whiteSpace:`nowrap`},ht=[{key:`symbol`,ja:`銘柄`,en:`Symbol`,align:`left`},{key:`assetClass`,ja:`区分`,en:`Class`,align:`left`,hideMdDown:!0},{key:`recipeCount`,ja:`レシピ`,en:`Recipes`,align:`right`},{key:`runRecipeCount`,ja:`実行済`,en:`Run`,align:`right`},{key:`unrunRecipeCount`,ja:`未実行`,en:`Unrun`,align:`right`},{key:`bestSharpe`,ja:`最高 Sharpe`,en:`Best Sharpe`,align:`right`},{key:`avgReturnPct`,ja:`平均 Return`,en:`Avg return`,align:`right`,hideMdDown:!0},{key:`lastRunAt`,ja:`最終実行`,en:`Last run`,align:`right`,hideMdDown:!0}];function gt(e){return e==null?`var(--text3)`:e>=0?`var(--success)`:`var(--danger)`}function _t({stat:e,selected:t,dimmed:n,onToggle:r,lang:i}){let a=C(i),o=e.symbol,s=o??a(`未割当`,`Unassigned`),[c,l]=(0,k.useState)(!1),u=()=>{o!=null&&r(o)};return(0,A.jsxs)(`tr`,{onClick:u,onMouseEnter:()=>l(!0),onMouseLeave:()=>l(!1),style:{background:t?`var(--accent-bg)`:c&&o!=null?`var(--surface-2)`:`transparent`,borderLeft:t?`2px solid var(--accent)`:`2px solid transparent`,opacity:n?.55:1,cursor:o==null?`default`:`pointer`,transition:`background var(--motion-fast)`},children:[(0,A.jsx)(`td`,{style:{...K,textAlign:`left`},children:(0,A.jsx)(`button`,{type:`button`,"aria-pressed":t,disabled:o==null,onClick:e=>{e.stopPropagation(),u()},style:{background:`transparent`,border:`none`,padding:0,margin:0,fontFamily:`var(--serif)`,fontSize:`1.0625rem`,fontWeight:600,color:o==null?`var(--text3)`:`var(--text)`,letterSpacing:`-0.005em`,cursor:o==null?`default`:`pointer`},children:s})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,textAlign:`left`,color:`var(--text3)`},children:o==null?`—`:tt[e.assetClass][i]}),(0,A.jsx)(`td`,{style:{...K,color:`var(--text2)`},children:e.recipeCount}),(0,A.jsx)(`td`,{style:{...K,color:`var(--text2)`},children:e.runRecipeCount}),(0,A.jsx)(`td`,{style:{...K,color:e.unrunRecipeCount>0?`var(--warn)`:`var(--text3)`,fontWeight:700},children:e.unrunRecipeCount}),(0,A.jsx)(`td`,{style:{...K,color:G(e.bestSharpe),fontWeight:700},children:E(e.bestSharpe,{decimals:2})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:gt(e.avgReturnPct)},children:E(e.avgReturnPct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:q,children:O(e.lastRunAt)})]})}function vt({recipes:e,lang:t}){let n=C(t),[r,i]=s(),[a,o]=(0,k.useState)(st),[c,l]=(0,k.useState)(ct),u=(0,k.useMemo)(()=>pt(e),[e]),d=(0,k.useMemo)(()=>dt(u,a,c),[u,a,c]),f=(0,k.useMemo)(()=>(r.get(`symbol`)??``).split(`,`).filter(Boolean),[r]),p=e=>{i(t=>{let n=new URLSearchParams(t),r=n.get(`symbol`)?.split(`,`).filter(Boolean)??[],i=r.includes(e)?r.filter(t=>t!==e):[...r,e];return i.length?n.set(`symbol`,i.join(`,`)):n.delete(`symbol`),n},{replace:!0})},m=e=>{if(e===a){l(e=>e===`desc`?`asc`:`desc`);return}o(e),l(`desc`)};return d.length===0?null:(0,A.jsxs)(`section`,{"aria-label":n(`銘柄カバレッジ`,`Symbol coverage`),style:{padding:`var(--space-4) var(--space-7)`,background:`var(--bg)`,borderBottom:`1px solid var(--border)`,display:`flex`,flexDirection:`column`,gap:`var(--space-3)`},children:[(0,A.jsxs)(`div`,{style:{display:`flex`,alignItems:`baseline`,justifyContent:`space-between`,gap:`var(--space-3)`},children:[(0,A.jsx)(`h2`,{style:{margin:0,fontFamily:`var(--serif)`,fontSize:`1.25rem`,fontWeight:600,color:`var(--text)`,letterSpacing:`-0.005em`},children:n(`銘柄カバレッジ`,`Symbol coverage`)}),(0,A.jsx)(`span`,{style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`},children:n(`${d.length} 銘柄 · ${e.length} レシピ`,`${d.length} symbols · ${e.length} recipes`)})]}),(0,A.jsx)(`div`,{className:`u-scroll-x`,"data-testid":`symbol-coverage-scroll`,children:(0,A.jsxs)(`table`,{style:{width:`100%`,borderCollapse:`collapse`},children:[(0,A.jsx)(`thead`,{children:(0,A.jsx)(`tr`,{children:ht.map(e=>(0,A.jsx)(T,{label:n(e.ja,e.en),active:a===e.key,direction:c,onSort:()=>m(e.key),align:e.align,className:e.hideMdDown?`u-col-hide-md-down`:void 0,baseStyle:{...mt,color:a===e.key?`var(--text2)`:`var(--text3)`}},e.key))})}),(0,A.jsx)(`tbody`,{children:d.map(e=>{let n=e.symbol!=null&&f.includes(e.symbol);return(0,A.jsx)(_t,{stat:e,selected:n,dimmed:f.length>0&&!n,onToggle:p,lang:t},e.symbol??`__unassigned__`)})})]})})]})}function yt({list:e,lang:t,theme:n,selectedStrategy:r,onUpdateLang:i,onUpdateTheme:a,onSelect:o,onCloseSlidePanel:s}){let c=C(t),u=pt(e.allRecipes),d=u.reduce((e,t)=>e+t.unrunRecipeCount,0),f=u.filter(e=>e.symbol!==null).length,p=u.some(e=>e.symbol===null)?c(`銘柄カバレッジ(${f} 銘柄 + 未割当 · 未実行 ${d} レシピ)`,`Symbol coverage (${f} symbols + unassigned · ${d} unrun recipes)`):c(`銘柄カバレッジ(${f} 銘柄 · 未実行 ${d} レシピ)`,`Symbol coverage (${f} symbols · ${d} unrun recipes)`);return(0,A.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,minHeight:`100vh`,background:`var(--bg)`},children:[(0,A.jsxs)(`header`,{className:`u-toolbar-wrap`,style:{padding:`var(--space-4) var(--layout-gutter)`,background:`var(--bg)`,borderBottom:`1px solid var(--border)`,display:`flex`,alignItems:`flex-start`,justifyContent:`space-between`,gap:`var(--space-4)`},children:[(0,A.jsxs)(`div`,{style:{flex:1,minWidth:0},children:[(0,A.jsx)(`div`,{style:{fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`},children:c(`戦略ブラウザ`,`Strategy browser`)}),(0,A.jsx)(`h1`,{style:{margin:`4px 0 0 0`,fontFamily:`var(--serif)`,fontSize:`var(--browse-fs-h1)`,fontWeight:700,color:`var(--text)`,letterSpacing:`-0.01em`,lineHeight:1.1},children:c(`登録済みの戦略を一覧する`,`Browse the strategy library`)}),!e.loading&&(0,A.jsx)(Je,{items:e.all,lang:t}),(0,A.jsxs)(`div`,{style:{display:`flex`,gap:`var(--space-4)`,alignItems:`center`,flexWrap:`wrap`},children:[(0,A.jsx)(`div`,{style:{marginTop:`var(--space-3)`},children:(0,A.jsx)(Be,{strategies:e.all,lang:t})}),[`/ideas`,`/live`].map(e=>(0,A.jsx)(l,{to:e,style:{display:`inline-flex`,alignItems:`center`,marginTop:`var(--space-3)`,fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,textDecoration:`none`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`},children:e===`/ideas`?c(`Ideas →`,`Ideas →`):c(`Live →`,`Live →`)},e))]})]}),(0,A.jsx)(re,{lang:t,onSetLang:i,theme:n,onSetTheme:a})]}),(0,A.jsx)($e,{lang:t}),(0,A.jsx)(se,{symbols:e.symbols,timeframes:e.timeframes,lang:t}),(0,A.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`var(--space-4)`,padding:`var(--space-3) var(--layout-gutter)`,background:`var(--bg)`,borderBottom:`1px solid var(--border)`},children:(0,A.jsx)(We,{groupBy:e.groupBy,onChange:e.setGroupBy,lang:t})}),!e.loading&&e.all.length>0&&(0,A.jsx)(j,{label:p,testId:`symbol-coverage-collapsible`,children:(0,A.jsx)(vt,{recipes:e.allRecipes,lang:t})}),(0,A.jsxs)(`div`,{style:{display:`flex`,flex:1},children:[e.loading?(0,A.jsx)(b,{label:c(`読み込み中…`,`Loading…`)}):(0,A.jsx)(ze,{recipes:e.recipes,groups:e.groups,strategyTotal:e.all.length,recipeTotal:e.recipeTotal,hiddenUnrunRecipeCount:e.hiddenUnrunRecipeCount,sortKey:e.sortKey,sortDir:e.sortDir,onSort:e.setSort,selectedId:e.selectedId,onSelect:o,compareIds:e.compareIds,onToggleCompare:e.toggleCompareId,starredKeys:e.starredKeys,onToggleStar:e.toggleStar,lang:t}),r&&(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`div`,{className:`u-drawer-md-down-backdrop u-hide-md-up`,"data-testid":`slide-panel-backdrop`,onClick:s,"aria-hidden":`true`}),(0,A.jsx)(Ve,{strategy:r,onClose:s,lang:t})]})]}),(0,A.jsx)(He,{compareIds:e.compareIds,strategies:e.all,onRemove:e.removeCompareId,lang:t})]})}var bt=`alphaforge.scroll:`;function xt(e){let t=`${bt}${c().pathname}`,n=(0,k.useRef)(!1);(0,k.useEffect)(()=>{if(!e||n.current)return;let r=sessionStorage.getItem(t);if(r!==null){let e=Number.parseInt(r,10);Number.isNaN(e)||requestAnimationFrame(()=>{window.scrollTo(0,e)})}n.current=!0},[e,t]),(0,k.useEffect)(()=>{let e=()=>{sessionStorage.setItem(t,String(window.scrollY))};return window.addEventListener(`scroll`,e,{passive:!0}),()=>{window.removeEventListener(`scroll`,e)}},[t])}function St(){let{settings:e,update:t}=d(),{lang:n,theme:r}=e;ie(n===`ja`?`戦略ブラウザ`:`Strategy Browser`);let i=Me();xt(!i.loading);let a=i.all.find(e=>e.strategy_id===i.selectedId)??null;if((0,k.useEffect)(()=>{if(!i.selectedId)return;let e=e=>{e.key===`Escape`&&i.setSelectedId(null)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[i]),i.error){let e=C(n);return(0,A.jsx)(`div`,{style:{padding:`var(--space-7)`,background:`var(--bg)`,minHeight:`100vh`},children:(0,A.jsx)(y,{message:ae(i.error,n),title:i.error,retryLabel:e(`再試行`,`Retry`),onRetry:i.reload})})}return(0,A.jsx)(yt,{list:i,lang:n,theme:r,selectedStrategy:a,onUpdateLang:e=>t(`lang`,e),onUpdateTheme:e=>{t(`theme`,e),t(`variation`,e===`dark`?`lab`:`atelier`)},onSelect:e=>i.setSelectedId(i.selectedId===e?null:e),onCloseSlidePanel:()=>i.setSelectedId(null)})}export{St as BrowsePage};
|
|
2
|
-
//# sourceMappingURL=BrowsePage-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-C0phanGV.js";import{C as t,d as n,h as r,v as i,y as a}from"./visx-HscrFEDZ.js";import{t as o}from"./react-CuMkScR3.js";import{a as s,l as c,n as l,u}from"./react-router-CU9OAEs1.js";import{S as d,a as f,c as p,d as m,l as h,n as g,o as _,r as v,s as y,t as b,u as x,v as S,x as C,y as w}from"./index-DsjiJ9NK.js";import{t as T}from"./SortHeaderCell-CetYtnjX.js";import{i as E,o as D,t as O}from"./format-D0fEne3x.js";import{t as ee}from"./RunLogDetails-C4662i4B.js";import{i as te,o as ne}from"./useBacktestData-B31tpHTO.js";import{t as re}from"./SettingsToggles-DPZul5Ek.js";import{t as ie}from"./useDocumentTitle-DPighAM_.js";import{r as ae}from"./errorMessage-DlX-ZPy3.js";var k=e(t(),1),A=o();function j({label:e,defaultOpen:t=!1,children:n,testId:r}){let[i,a]=(0,k.useState)(t),o=(0,k.useId)();return(0,A.jsxs)(`div`,{"data-testid":r,children:[(0,A.jsxs)(`button`,{type:`button`,"aria-expanded":i,"aria-controls":i?o:void 0,onClick:()=>a(e=>!e),style:{display:`flex`,alignItems:`center`,gap:`var(--space-2)`,width:`100%`,padding:`var(--space-3) var(--layout-gutter)`,background:`var(--bg)`,border:`none`,borderBottom:`1px solid var(--border)`,color:`var(--text2)`,fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:600,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`,cursor:`pointer`,textAlign:`left`},children:[(0,A.jsx)(`span`,{"aria-hidden":!0,style:{display:`inline-block`,width:14,fontFamily:`var(--mono)`,transform:i?`rotate(0deg)`:`rotate(-90deg)`,transition:`transform var(--motion-fast)`},children:`▾`}),e]}),i&&(0,A.jsx)(`div`,{id:o,children:n})]})}var M={width:64,padding:`6px 8px`,background:`var(--surface-2)`,border:`1px solid var(--border)`,borderRadius:`var(--radius-sm)`,color:`var(--text)`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,letterSpacing:`var(--tracking-mono)`},oe={width:240,maxWidth:`100%`,padding:`8px 12px`,background:`var(--surface-2)`,border:`1px solid var(--border)`,borderRadius:`var(--radius-md)`,color:`var(--text)`,fontFamily:`var(--sans)`,fontSize:`var(--fs-body)`},N={whiteSpace:`nowrap`,fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`};function P({active:e,onClick:t,children:n}){return(0,A.jsx)(`button`,{type:`button`,"aria-pressed":e,onClick:t,style:{padding:`4px 12px`,background:e?`var(--accent-bg)`:`transparent`,border:`1px solid ${e?`var(--accent-glow)`:`var(--border)`}`,borderRadius:`var(--radius-pill)`,color:e?`var(--accent)`:`var(--text2)`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,fontWeight:600,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`,cursor:`pointer`,transition:`background var(--motion-fast), color var(--motion-fast), border-color var(--motion-fast)`},children:n})}function se({symbols:e,timeframes:t,lang:n}){let r=C(n),[i,a]=s(),o=(e,t)=>{a(n=>{let r=new URLSearchParams(n);return t?r.set(e,t):r.delete(e),r},{replace:!0})},c=(e,t)=>{a(n=>{let r=new URLSearchParams(n),i=r.get(e)?.split(`,`).filter(Boolean)??[],a=i.includes(t)?i.filter(e=>e!==t):[...i,t];return a.length?r.set(e,a.join(`,`)):r.delete(e),r},{replace:!0})},l=()=>{a(new URLSearchParams,{replace:!0})},u=i.get(`q`)??``,d=i.get(`symbol`)?.split(`,`).filter(Boolean)??[],f=i.get(`tf`)?.split(`,`).filter(Boolean)??[],p=i.get(`sharpe_min`)??``,m=i.get(`dd_max`)??``,h=i.get(`include_unrun`)===`1`,g=u||d.length>0||f.length>0||p||m||h;return(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(_,{children:[(0,A.jsx)(`input`,{style:oe,"aria-label":r(`戦略名・銘柄を検索`,`Search strategy or symbol`),placeholder:r(`戦略名・銘柄を検索…`,`Search strategy or symbol…`),value:u,onChange:e=>o(`q`,e.target.value)}),t.length>0&&(0,A.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`var(--space-2)`,flexShrink:0},children:[(0,A.jsx)(`span`,{style:N,children:r(`時間軸`,`TF`)}),(0,A.jsx)(`div`,{style:{display:`flex`,gap:6,flexWrap:`wrap`},children:t.map(e=>(0,A.jsx)(P,{active:f.includes(e),onClick:()=>c(`tf`,e),children:e},e))})]}),(0,A.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6,flexShrink:0},children:[(0,A.jsx)(`span`,{style:N,children:`Sharpe ≥`}),(0,A.jsx)(`input`,{style:M,type:`number`,step:`0.1`,min:`0`,"aria-label":r(`Sharpe 下限`,`Sharpe ≥`),value:p,placeholder:`1.0`,onChange:e=>o(`sharpe_min`,e.target.value)})]}),(0,A.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6,flexShrink:0},children:[(0,A.jsx)(`span`,{style:N,children:r(`DD ≤ %`,`DD ≤ %`)}),(0,A.jsx)(`input`,{style:M,type:`number`,step:`1`,min:`0`,max:`100`,"aria-label":r(`DD 上限 (%)`,`DD ≤ %`),value:m,placeholder:`30`,onChange:e=>o(`dd_max`,e.target.value)})]}),(0,A.jsxs)(`label`,{style:{display:`inline-flex`,alignItems:`center`,gap:6,fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,color:`var(--text2)`,cursor:`pointer`},children:[(0,A.jsx)(`input`,{type:`checkbox`,checked:h,onChange:e=>o(`include_unrun`,e.target.checked?`1`:``),style:{accentColor:`var(--accent)`,cursor:`pointer`}}),r(`未実行を含める`,`Include unrun`)]}),g&&(0,A.jsx)(`button`,{type:`button`,onClick:l,style:{marginLeft:`auto`,background:`transparent`,border:`none`,color:`var(--accent)`,fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:600,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`,cursor:`pointer`,padding:`4px 8px`},children:r(`フィルタを解除`,`Clear filters`)})]}),e.length>0&&(0,A.jsx)(j,{label:r(`銘柄で絞る(${e.length})`,`Filter by symbol (${e.length})`),defaultOpen:d.length>0,testId:`symbol-filter-collapsible`,children:(0,A.jsx)(`div`,{style:{display:`flex`,gap:6,flexWrap:`wrap`,padding:`var(--space-2) 0`},children:e.map(e=>(0,A.jsx)(P,{active:d.includes(e),onClick:()=>c(`symbol`,e),children:e},e))})})]})}function F(e,t,n){let r=new URLSearchParams(e);return n==null||n===``?r.delete(t):r.set(t,n),r}var I=`alphaforge.starred_recipes.v1`;function ce(){if(typeof window>`u`)return new Set;try{let e=window.localStorage.getItem(I);if(!e)return new Set;let t=JSON.parse(e);return Array.isArray(t)?new Set(t.filter(e=>typeof e==`string`&&e.length>0)):new Set}catch{return new Set}}function le(e){try{window.localStorage.setItem(I,JSON.stringify([...e]))}catch{}}function ue(){let[e,t]=(0,k.useState)(ce);return{starredKeys:e,toggleStar:(0,k.useCallback)(e=>{t(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),le(n),n})},[])}}function L(e){return e.symbol||e.target_symbols[0]||null}function R(e){return e.last_run_at!=null&&e.last_run_at!==``}function z(e){return e.last_run_at??``}function de(e){let t=null;for(let n of e){if(n.latest_sharpe==null)continue;if(t==null){t=n;continue}let e=t.latest_sharpe;(n.latest_sharpe>e||n.latest_sharpe===e&&z(n)>z(t))&&(t=n)}if(t!=null)return t;let n=null;for(let t of e)R(t)&&(n==null||z(t)>z(n))&&(n=t);return n}function fe(e,t,n){return`${e}\u0000${t??``}\u0000${n??``}`}function pe(e,t){let n=e.latest_sharpe,r=t.latest_sharpe;return n==null&&r==null?z(t).localeCompare(z(e)):n==null?1:r==null?-1:n===r?z(t).localeCompare(z(e)):r-n}function me(e){let t=new Map;for(let n of e){let e=L(n),r=n.timeframe??null,i=fe(n.name,e,r),a=t.get(i);a?a.items.push(n):t.set(i,{name:n.name,symbol:e,timeframe:r,items:[n]})}let n=[];for(let[e,r]of t){let t=[...r.items].sort(pe);n.push({key:e,name:r.name,symbol:r.symbol,timeframe:r.timeframe,variants:t,best:de(t),variantCount:t.length,runCount:t.filter(R).length})}return n}var he=[`name`,`latest_sharpe`,`latest_return_pct`,`latest_max_drawdown_pct`,`latest_profit_factor`,`latest_win_rate_pct`,`last_run_at`],ge=[`none`,`symbol`,`tf`,`tier`];function _e(e){return e===`1`}function ve(e){return he.includes(e??``)?e:`latest_sharpe`}function ye(e){return e===`asc`||e===`desc`?e:`desc`}function be(e){return ge.includes(e??``)?e:`none`}function xe(e){return e&&e.length>0?e:null}function B(e){return e?e.split(`,`).map(e=>e.trim()).filter(Boolean).slice(0,6):[]}function V(e){return e??-1/0}var Se={strong:0,moderate:1,weak:2,no_data:3},Ce={strong:`Strong (Sharpe ≥ 1.5)`,moderate:`Moderate (1.0 ≤ Sharpe < 1.5)`,weak:`Weak (Sharpe < 1.0)`,no_data:`No data`};function we(e){return e==null?`no_data`:e>=1.5?`strong`:e>=1?`moderate`:`weak`}function H(e){let t=null,n=null;for(let r of e){let e=r.best?.latest_sharpe;e!=null&&(t=t==null?e:Math.max(t,e));let i=r.best?.latest_max_drawdown_pct;i!=null&&(n=n==null?i:Math.min(n,i))}return{count:e.length,bestSharpe:t,worstDrawdownPct:n}}function Te(e,t){if(t===`none`)return e.length===0?[]:[{key:`all`,label:`all`,rank:0,items:e,aggregate:H(e)}];if(t===`tier`){let t={strong:[],moderate:[],weak:[],no_data:[]};for(let n of e)t[we(n.best?.latest_sharpe)].push(n);let n=[];for(let e of Object.keys(t)){let r=t[e];r.length!==0&&n.push({key:`tier:${e}`,label:Ce[e],rank:Se[e],items:r,aggregate:H(r)})}return n.sort((e,t)=>e.rank-t.rank)}let n=e=>t===`symbol`?e.symbol??``:e.timeframe??``,r=new Map;for(let t of e){let e=n(t),i=r.get(e);i?i.push(t):r.set(e,[t])}let i=[];for(let[e,n]of r.entries()){let r=!e;i.push({key:`${t}:${e||`_unassigned`}`,label:r?`Unassigned`:e,rank:r?1/0:0,items:n,aggregate:H(n)})}return i.sort((e,t)=>e.rank===t.rank?e.aggregate.count===t.aggregate.count?e.label.localeCompare(t.label):t.aggregate.count-e.aggregate.count:e.rank-t.rank)}function Ee(){let[e,t]=(0,k.useState)([]),[n,r]=(0,k.useState)(!0),[i,a]=(0,k.useState)(null),[o,s]=(0,k.useState)(0),c=(0,k.useCallback)(()=>{r(!0),a(null),s(e=>e+1)},[]);return(0,k.useEffect)(()=>{let e=!1;return w.listStrategies().then(n=>{e||(t(n),r(!1))}).catch(t=>{e||(a(t instanceof Error?t.message:String(t)),r(!1))}),()=>{e=!0}},[o]),{all:e,loading:n,error:i,symbols:(0,k.useMemo)(()=>[...new Set(e.map(L).filter(e=>!!e))].sort(),[e]),timeframes:(0,k.useMemo)(()=>[...new Set(e.map(e=>e.timeframe).filter(Boolean))].sort(),[e]),reload:c}}function De(e,t,n,r,i,a){return(0,k.useMemo)(()=>{let o=t.toLowerCase();return e.filter(e=>{let s=L(e)??``;return!(t&&!e.name.toLowerCase().includes(o)&&!s.toLowerCase().includes(o)||n.length>0&&!n.includes(s)||r.length>0&&!r.includes(e.timeframe??``)||!isNaN(i)&&V(e.latest_sharpe)<i||!isNaN(a)&&Math.abs(V(e.latest_max_drawdown_pct))>a)})},[e,t,n,r,i,a])}function Oe(e,t,n){return(0,k.useMemo)(()=>[...e].sort((e,r)=>{let i,a;return t===`name`?(i=e.name,a=r.name):t===`last_run_at`?(i=e.best?.last_run_at??``,a=r.best?.last_run_at??``):(i=V(e.best?.[t]),a=V(r.best?.[t])),i<a?n===`asc`?-1:1:i>a?n===`asc`?1:-1:0}),[e,t,n])}function ke(e,t){return(0,k.useMemo)(()=>Te(e,t),[e,t])}function Ae(e,t){return{selectedId:xe(e.get(`selected`)),setSelectedId:e=>{t(t=>F(t,`selected`,e),{replace:!0})}}}function je(e,t){let n=(0,k.useMemo)(()=>B(e.get(`compare`)),[e]),r=e=>e.length===0?null:e.join(`,`);return{compareIds:n,toggleCompareId:e=>{e&&t(t=>{let n=B(t.get(`compare`)),i;return i=n.includes(e)?n.filter(t=>t!==e):n.length<6?[...n,e]:n,F(t,`compare`,r(i))},{replace:!0})},removeCompareId:e=>{t(t=>F(t,`compare`,r(B(t.get(`compare`)).filter(t=>t!==e))),{replace:!0})},clearCompareIds:()=>{t(e=>F(e,`compare`,null),{replace:!0})}}}function Me(){let[e,t]=s(),{all:n,loading:r,error:i,symbols:a,timeframes:o,reload:c}=Ee(),l=ve(e.get(`sort`)),u=ye(e.get(`dir`)),d=be(e.get(`group`)),f=_e(e.get(`include_unrun`)),p=De(n,e.get(`q`)??``,(0,k.useMemo)(()=>(e.get(`symbol`)??``).split(`,`).filter(Boolean),[e]),(0,k.useMemo)(()=>(e.get(`tf`)??``).split(`,`).filter(Boolean),[e]),parseFloat(e.get(`sharpe_min`)??``),parseFloat(e.get(`dd_max`)??``)),m=(0,k.useMemo)(()=>me(p),[p]),h=(0,k.useMemo)(()=>m.filter(e=>e.runCount===0).length,[m]),g=(0,k.useMemo)(()=>f?m:m.filter(e=>e.runCount>0),[m,f]),{starredKeys:_,toggleStar:v}=ue(),y=e.get(`starred`)===`1`,b=Oe((0,k.useMemo)(()=>y?g.filter(e=>_.has(e.key)):g,[g,y,_]),l,u),x=ke(b,d),S=(0,k.useMemo)(()=>me(n),[n]),C=e=>{t(t=>{let n=new URLSearchParams(t);return n.get(`sort`)===e?n.set(`dir`,n.get(`dir`)===`asc`?`desc`:`asc`):(n.set(`sort`,e),n.set(`dir`,`desc`)),n},{replace:!0})},w=e=>{t(t=>F(t,`group`,e===`none`?null:e),{replace:!0})},{selectedId:T,setSelectedId:E}=Ae(e,t),D=je(e,t);return{all:n,allRecipes:S,recipes:b,recipeTotal:S.length,hiddenUnrunRecipeCount:f?0:h,includeUnrun:f,groups:x,loading:r,error:i,reload:c,sortKey:l,sortDir:u,setSort:C,groupBy:d,setGroupBy:w,symbols:a,timeframes:o,selectedId:T,setSelectedId:E,starredKeys:_,toggleStar:v,...D}}function U(){let[e,t]=(0,k.useState)({}),n=(0,k.useRef)(new Set),r=(0,k.useCallback)(e=>{n.current.has(e)||(n.current.add(e),t(t=>({...t,[e]:`loading`})),(async()=>{try{let{values:n}=await w.getSparkline(e);t(t=>({...t,[e]:n.length>0?n:`empty`}))}catch(n){let r=n instanceof S&&n.status===404;t(t=>({...t,[e]:r?`empty`:`error`}))}})())},[]);return(0,k.useMemo)(()=>({entries:e,prefetch:r}),[e,r])}i();function W({values:e,width:t,height:i,color:o,strokeWidth:s=1.25}){let c=(0,k.useMemo)(()=>e.map((e,t)=>({x:t,y:e})),[e]),l=(0,k.useMemo)(()=>n({domain:[0,Math.max(1,c.length-1)],range:[1,t-1]}),[c.length,t]),u=(0,k.useMemo)(()=>{if(c.length===0)return n({domain:[0,1],range:[i-1,1]});let e=c.map(e=>e.y),t=Math.min(...e),r=Math.max(...e),a=(r-t||1)*.04;return n({domain:[t-a,r+a],range:[i-1,1]})},[c,i]),d=(0,k.useMemo)(()=>{if(o)return o;if(e.length<2)return`var(--text3)`;let t=e[0];return e[e.length-1]>=t?`var(--success)`:`var(--danger)`},[o,e]);return c.length<2?null:(0,A.jsx)(`svg`,{width:t,height:i,"aria-hidden":!0,style:{display:`block`},children:(0,A.jsx)(r,{data:c,x:e=>l(e.x),y:e=>u(e.y),stroke:d,strokeWidth:s,strokeLinecap:`round`,curve:a,fill:`none`})})}function G(e){return e==null?`var(--text3)`:e>=1.5?`var(--success)`:e>=1?`var(--warn)`:`var(--danger)`}var K={fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-md)`,padding:`8px 12px`,textAlign:`right`,borderBottom:`1px solid var(--border)`,letterSpacing:`var(--tracking-mono)`},q={...K,color:`var(--text3)`,fontSize:`var(--fs-mono-sm)`,whiteSpace:`nowrap`};function Ne({s:e,selected:t,inCompare:n,maxCompareReached:r,onSelect:i,onToggleCompare:a,onHover:o,sparkValues:s,lang:c,indent:u=!1}){let d=C(c),[f,p]=(0,k.useState)(!1),m=L(e),h=()=>{p(!0),o(e.strategy_id)},g=()=>{p(!1),o(null)},_=t?`var(--accent-bg)`:f?`var(--surface-2)`:`transparent`,v=Array.isArray(s)&&s.length>=2?(0,A.jsx)(W,{values:s,width:120,height:20}):s===`loading`?(0,A.jsx)(`div`,{style:{width:120,height:20,display:`flex`,alignItems:`center`,justifyContent:`flex-end`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`},children:`···`}):s===`error`?(0,A.jsx)(`span`,{title:d(`推移の取得に失敗しました`,`Failed to load the trend`),style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--warn)`},children:d(`取得失敗`,`error`)}):null;return(0,A.jsxs)(`tr`,{onMouseEnter:h,onMouseLeave:g,onClick:()=>i(e.strategy_id),title:d(`クリックでプレビュー`,`Click to preview`),style:{background:_,borderLeft:t?`2px solid var(--accent)`:`2px solid transparent`,transition:`background var(--motion-fast)`,cursor:`pointer`},children:[(0,A.jsx)(`td`,{style:{...K,textAlign:`center`,padding:`6px 4px`,width:36},onClick:e=>e.stopPropagation(),children:(0,A.jsx)(`input`,{type:`checkbox`,checked:n,disabled:r,"aria-label":d(`${e.name}(${e.strategy_id})を比較に追加`,`Add ${e.name} (${e.strategy_id}) to compare`),onChange:()=>a(e.strategy_id),style:{cursor:r?`not-allowed`:`pointer`,accentColor:`var(--accent)`}})}),(0,A.jsx)(`td`,{style:{...K,textAlign:`left`,paddingLeft:u?40:12,width:`100%`,maxWidth:0},children:(0,A.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,minWidth:0,flexWrap:`wrap`},children:[(0,A.jsx)(l,{to:`/detail/${e.strategy_id}`,title:e.name,onClick:e=>e.stopPropagation(),style:{flex:`0 1 auto`,minWidth:0,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`,fontFamily:`var(--serif)`,fontSize:`1.0625rem`,fontWeight:600,color:`var(--text)`,letterSpacing:`-0.005em`,lineHeight:1.2,textDecoration:`none`,transition:`color var(--motion-fast)`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--accent)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text)`},children:e.name}),(0,A.jsx)(`span`,{title:e.strategy_id,style:{flexShrink:0,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`,letterSpacing:`var(--tracking-mono)`},children:e.strategy_id}),m?(0,A.jsx)(x,{children:m}):(0,A.jsx)(`span`,{style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`},children:d(`未割当`,`unassigned`)}),e.timeframe?(0,A.jsx)(x,{children:e.timeframe}):null]})}),(0,A.jsxs)(`td`,{style:{...K,color:G(e.latest_sharpe),fontWeight:700,fontSize:`1rem`},children:[E(e.latest_sharpe,{decimals:2}),e.latest_source===`strategy-file`&&(0,A.jsx)(`span`,{"data-testid":`latest-source-badge`,role:`img`,"aria-label":d(`最新ランはチューニング試行(保存していないパラメータ)です`,`Latest run is a tuning trial with unsaved parameters`),title:d(`最新ランはチューニング試行(保存していないパラメータ)です`,`Latest run is a tuning trial with unsaved parameters`),style:{marginLeft:4,color:`var(--warn)`,fontSize:10},children:`⚠`})]}),(0,A.jsx)(`td`,{style:{...K,color:e.latest_return_pct==null?`var(--text3)`:e.latest_return_pct>=0?`var(--success)`:`var(--danger)`},children:E(e.latest_return_pct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-sm-down`,style:{...K,color:e.latest_max_drawdown_pct==null?`var(--text3)`:`var(--danger)`},children:E(e.latest_max_drawdown_pct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:`var(--text2)`},children:E(e.latest_profit_factor,{decimals:2})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:`var(--text2)`},children:E(e.latest_win_rate_pct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:q,children:O(e.last_run_at)}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,padding:`6px 12px`,width:132,textAlign:`right`},children:(0,A.jsx)(`div`,{style:{display:`inline-flex`,justifyContent:`flex-end`,minHeight:20},children:v})})]})}function Pe({recipe:e,expanded:t,onToggleExpand:n,selectedId:r,onSelect:i,compareIds:a,onToggleCompare:o,onHover:s,sparkValues:c,starred:u,onToggleStar:d,lang:f}){let p=C(f),[m,h]=(0,k.useState)(!1),g=e.best,_=g??e.variants[0],v=e.variantCount>1,y=g!=null&&r===g.strategy_id,b=g!=null&&a.includes(g.strategy_id),S=a.length>=6&&!b,w=()=>{h(!0),g&&s(g.strategy_id)},T=()=>{h(!1),s(null)},D=Array.isArray(c)&&c.length>=2?(0,A.jsx)(W,{values:c,width:120,height:20}):c===`loading`?(0,A.jsx)(`div`,{style:{width:120,height:20,display:`flex`,alignItems:`center`,justifyContent:`flex-end`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`},children:`···`}):c===`error`?(0,A.jsx)(`span`,{title:p(`推移の取得に失敗しました`,`Failed to load the trend`),style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--warn)`},children:p(`取得失敗`,`error`)}):null;return(0,A.jsxs)(`tr`,{onMouseEnter:w,onMouseLeave:T,onClick:()=>{g&&i(g.strategy_id)},title:p(`クリックでプレビュー`,`Click to preview`),style:{background:y?`var(--accent-bg)`:m?`var(--surface-2)`:`transparent`,borderLeft:y?`2px solid var(--accent)`:`2px solid transparent`,transition:`background var(--motion-fast)`,cursor:g?`pointer`:`default`},children:[(0,A.jsx)(`td`,{style:{...K,textAlign:`center`,padding:`6px 4px`,width:36},onClick:e=>e.stopPropagation(),children:(0,A.jsx)(`input`,{type:`checkbox`,checked:b,disabled:g==null||S,"aria-label":p(`${e.name}(${g?.strategy_id??e.key})の最良試行を比較に追加`,`Add the best trial of ${e.name} (${g?.strategy_id??e.key}) to compare`),onChange:()=>{g&&o(g.strategy_id)},style:{cursor:g==null||S?`not-allowed`:`pointer`,accentColor:`var(--accent)`}})}),(0,A.jsx)(`td`,{style:{...K,textAlign:`left`,width:`100%`,maxWidth:0},children:(0,A.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,minWidth:0,flexWrap:`wrap`},children:[v?(0,A.jsx)(`button`,{type:`button`,"aria-expanded":t,"aria-label":t?p(`${e.name} の試行を畳む`,`Collapse trials of ${e.name}`):p(`${e.name} の試行を展開`,`Expand trials of ${e.name}`),onClick:t=>{t.stopPropagation(),n(e.key)},style:{flexShrink:0,width:20,background:`transparent`,border:`none`,color:`var(--text2)`,fontFamily:`var(--mono)`,cursor:`pointer`,padding:0,transform:t?`rotate(0deg)`:`rotate(-90deg)`,transition:`transform var(--motion-fast)`},children:`▾`}):(0,A.jsx)(`span`,{"aria-hidden":!0,style:{flexShrink:0,width:20}}),(0,A.jsx)(`button`,{type:`button`,"aria-pressed":u,"aria-label":u?p(`${e.name}(${e.key})のスターを外す`,`Unstar ${e.name} (${e.key})`):p(`${e.name}(${e.key})にスターを付ける`,`Star ${e.name} (${e.key})`),onClick:t=>{t.stopPropagation(),d(e.key)},style:{flexShrink:0,background:`transparent`,border:`none`,cursor:`pointer`,padding:0,fontSize:14,lineHeight:1,color:u?`var(--warn)`:`var(--text3)`},children:u?`★`:`☆`}),(0,A.jsx)(l,{to:`/detail/${_.strategy_id}`,title:e.name,onClick:e=>e.stopPropagation(),style:{flex:`0 1 auto`,minWidth:0,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`,fontFamily:`var(--serif)`,fontSize:`1.0625rem`,fontWeight:600,color:`var(--text)`,letterSpacing:`-0.005em`,lineHeight:1.2,textDecoration:`none`,transition:`color var(--motion-fast)`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--accent)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text)`},children:e.name}),e.symbol?(0,A.jsx)(x,{children:e.symbol}):(0,A.jsx)(`span`,{style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`},children:p(`未割当`,`unassigned`)}),e.timeframe?(0,A.jsx)(x,{children:e.timeframe}):null,v&&(0,A.jsx)(`span`,{title:p(`試行 = 同じ戦略ベースのパラメータ違いのバリエーション`,`Trial = a parameter variation of the same base strategy`),style:{flexShrink:0,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`,letterSpacing:`var(--tracking-mono)`},children:p(`${e.variantCount} 試行中 ${e.runCount} 件実行`,`${e.runCount} of ${e.variantCount} trials run`)})]})}),(0,A.jsxs)(`td`,{style:{...K,color:G(g?.latest_sharpe),fontWeight:700,fontSize:`1rem`},children:[E(g?.latest_sharpe,{decimals:2}),g?.latest_source===`strategy-file`&&(0,A.jsx)(`span`,{"data-testid":`latest-source-badge`,role:`img`,"aria-label":p(`最新ランはチューニング試行(保存していないパラメータ)です`,`Latest run is a tuning trial with unsaved parameters`),title:p(`最新ランはチューニング試行(保存していないパラメータ)です`,`Latest run is a tuning trial with unsaved parameters`),style:{marginLeft:4,color:`var(--warn)`,fontSize:10},children:`⚠`})]}),(0,A.jsx)(`td`,{style:{...K,color:g?.latest_return_pct==null?`var(--text3)`:g.latest_return_pct>=0?`var(--success)`:`var(--danger)`},children:E(g?.latest_return_pct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-sm-down`,style:{...K,color:g?.latest_max_drawdown_pct==null?`var(--text3)`:`var(--danger)`},children:E(g?.latest_max_drawdown_pct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:`var(--text2)`},children:E(g?.latest_profit_factor,{decimals:2})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:`var(--text2)`},children:E(g?.latest_win_rate_pct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:q,children:O(g?.last_run_at)}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,padding:`6px 12px`,width:132,textAlign:`right`},children:(0,A.jsx)(`div`,{style:{display:`inline-flex`,justifyContent:`flex-end`,minHeight:20},children:D})})]})}function Fe({visibleRecipeCount:e,recipeTotal:t,hiddenUnrunRecipeCount:n,strategyTotal:r,lang:i}){let a=C(i),o=n>0?a(`(未実行のみ ${n} レシピを非表示)`,` (${n} unrun-only recipes hidden)`):``;return(0,A.jsx)(`div`,{"data-testid":`strategy-table-footer`,style:{padding:`12px 24px`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`,letterSpacing:`var(--tracking-mono)`,borderTop:`1px solid var(--border)`},children:a(`${e} レシピ表示 / 全 ${t} レシピ${o} · ${r} 戦略`,`${e} of ${t} recipes${o} · ${r} strategies`)})}var Ie=220,Le=9,J={fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`,padding:`14px 12px`,textAlign:`right`,cursor:`pointer`,background:`var(--surface)`,borderBottom:`1px solid var(--border)`,userSelect:`none`,whiteSpace:`nowrap`,position:`sticky`,top:0,zIndex:2};function Y({col:e,label:t,align:n=`right`,width:r,sortKey:i,sortDir:a,onSort:o,className:s}){let c=i===e;return(0,A.jsx)(T,{label:t,active:c,direction:a,onSort:()=>o(e),align:n,width:r,className:s,baseStyle:{...J,color:c?`var(--text2)`:`var(--text3)`}})}function Re({group:e,collapsed:t,onToggle:n,lang:r}){let i=C(r),{aggregate:a}=e;return(0,A.jsxs)(`tr`,{onClick:()=>n(e.key),style:{background:`var(--surface-2)`,cursor:`pointer`,borderTop:`1px solid var(--border)`},children:[(0,A.jsx)(`td`,{colSpan:2,style:{...K,textAlign:`left`,borderBottom:`1px solid var(--border)`},children:(0,A.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,gap:`var(--space-2)`},children:[(0,A.jsx)(`span`,{"aria-hidden":!0,style:{display:`inline-block`,width:14,fontFamily:`var(--mono)`,color:`var(--text2)`,transition:`transform var(--motion-fast)`,transform:t?`rotate(-90deg)`:`rotate(0deg)`},children:`▾`}),(0,A.jsx)(`span`,{style:{fontFamily:`var(--serif)`,fontSize:`1.0625rem`,fontWeight:600,color:`var(--text)`,letterSpacing:`-0.005em`},children:e.label}),(0,A.jsx)(`span`,{style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`},children:i(`${a.count}件`,`${a.count} strategies`)})]})}),(0,A.jsx)(`td`,{style:{...K,color:G(a.bestSharpe),fontWeight:700,borderBottom:`1px solid var(--border)`},title:i(`グループ内の最高 Sharpe`,`Best Sharpe in group`),children:E(a.bestSharpe,{decimals:2})}),(0,A.jsx)(`td`,{style:{...K,color:`var(--text3)`,borderBottom:`1px solid var(--border)`},children:`—`}),(0,A.jsx)(`td`,{className:`u-col-hide-sm-down`,style:{...K,color:a.worstDrawdownPct==null?`var(--text3)`:`var(--danger)`,borderBottom:`1px solid var(--border)`},title:i(`グループ内の最悪 DD`,`Worst drawdown in group`),children:E(a.worstDrawdownPct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:`var(--text3)`,borderBottom:`1px solid var(--border)`},children:`—`}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:`var(--text3)`,borderBottom:`1px solid var(--border)`},children:`—`}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:`var(--text3)`,borderBottom:`1px solid var(--border)`},children:`—`}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,borderBottom:`1px solid var(--border)`}})]})}function ze({recipes:e,strategyTotal:t,sortKey:n,sortDir:r,onSort:i,selectedId:a,onSelect:o,compareIds:s,onToggleCompare:c,starredKeys:l,onToggleStar:u,lang:d,groups:f,recipeTotal:p,hiddenUnrunRecipeCount:m}){let h=C(d),g=U(),[_,v]=(0,k.useState)(null),[y,b]=(0,k.useState)(()=>new Set),[x,S]=(0,k.useState)(()=>new Set);(0,k.useEffect)(()=>{if(!_)return;let e=window.setTimeout(()=>{g.prefetch(_)},Ie);return()=>window.clearTimeout(e)},[_,g]);let w=(0,k.useMemo)(()=>!f||f.length<=1?null:f,[f]),E=e=>{b(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},D=e=>{S(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},O=e=>{let t=x.has(e.key),n=(0,A.jsx)(Pe,{recipe:e,expanded:t,onToggleExpand:D,selectedId:a,onSelect:o,compareIds:s,onToggleCompare:c,onHover:v,sparkValues:e.best?g.entries[e.best.strategy_id]:void 0,starred:l.has(e.key),onToggleStar:u,lang:d},e.key);return t?[n,...e.variants.map(e=>{let t=s.includes(e.strategy_id);return(0,A.jsx)(Ne,{s:e,selected:a===e.strategy_id,inCompare:t,maxCompareReached:s.length>=6&&!t,onSelect:o,onToggleCompare:c,onHover:v,sparkValues:g.entries[e.strategy_id],lang:d,indent:!0},e.strategy_id)})]:[n]};return(0,A.jsxs)(`div`,{className:`u-scroll-x`,"data-testid":`strategy-table-scroll`,style:{flex:1,minWidth:0,background:`var(--bg)`},children:[(0,A.jsxs)(`table`,{style:{width:`100%`,borderCollapse:`collapse`,minWidth:1080},children:[(0,A.jsx)(`thead`,{children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{scope:`col`,style:{...J,width:36,padding:`14px 4px`},children:(0,A.jsx)(`span`,{style:{position:`absolute`,width:1,height:1,padding:0,margin:-1,overflow:`hidden`,clip:`rect(0 0 0 0)`,whiteSpace:`nowrap`,border:0},children:h(`選択`,`Select`)})}),(0,A.jsx)(T,{label:h(`戦略`,`Strategy`),active:n===`name`,direction:r,onSort:()=>i(`name`),align:`left`,baseStyle:{...J,width:`100%`,color:n===`name`?`var(--text2)`:`var(--text3)`}}),(0,A.jsx)(Y,{col:`latest_sharpe`,label:`Sharpe`,sortKey:n,sortDir:r,onSort:i}),(0,A.jsx)(Y,{col:`latest_return_pct`,label:h(`リターン`,`Return`),sortKey:n,sortDir:r,onSort:i}),(0,A.jsx)(Y,{col:`latest_max_drawdown_pct`,label:`Max DD`,className:`u-col-hide-sm-down`,sortKey:n,sortDir:r,onSort:i}),(0,A.jsx)(Y,{col:`latest_profit_factor`,label:`Profit F.`,className:`u-col-hide-md-down`,sortKey:n,sortDir:r,onSort:i}),(0,A.jsx)(Y,{col:`latest_win_rate_pct`,label:`Win %`,className:`u-col-hide-md-down`,sortKey:n,sortDir:r,onSort:i}),(0,A.jsx)(Y,{col:`last_run_at`,label:h(`最終実行`,`Last run`),className:`u-col-hide-md-down`,sortKey:n,sortDir:r,onSort:i}),(0,A.jsx)(`th`,{scope:`col`,className:`u-col-hide-md-down`,style:{...J,width:132,textAlign:`right`},children:h(`推移`,`Trend`)})]})}),(0,A.jsxs)(`tbody`,{children:[w?w.flatMap(e=>{let t=y.has(e.key),n=(0,A.jsx)(Re,{group:e,collapsed:t,onToggle:E,lang:d},`__header__${e.key}`);return t?[n]:[n,...e.items.flatMap(O)]}):e.flatMap(O),e.length===0&&(0,A.jsx)(`tr`,{children:(0,A.jsx)(`td`,{colSpan:Le,style:{...K,textAlign:`center`,padding:`48px 24px`,color:`var(--text3)`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,letterSpacing:`var(--tracking-mono)`},children:t>0?(0,A.jsxs)(A.Fragment,{children:[h(`該当する戦略はありません`,`No strategies match the current filters`),m>0&&(0,A.jsx)(`div`,{style:{marginTop:8},children:h(`「未実行を含める」にチェックすると表示できます`,`Check "Include unrun" to show them`)})]}):(0,A.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:10,lineHeight:1.8},children:[(0,A.jsx)(`div`,{style:{color:`var(--text2)`},children:h(`まだ戦略がありません`,`No strategies yet`)}),(0,A.jsxs)(`div`,{children:[h(`サンプルデータで試す: `,`Try with bundled samples: `),(0,A.jsx)(`code`,{style:{background:`var(--surface)`,border:`1px solid var(--border)`,borderRadius:4,padding:`2px 6px`},children:`alpha-vis serve --use-bundled-samples`})]}),(0,A.jsx)(`div`,{children:(0,A.jsxs)(`a`,{href:`https://alforgelabs.com/?utm_source=alpha-visualizer&utm_medium=empty_state`,target:`_blank`,rel:`noopener noreferrer`,"aria-label":h(`AlphaForge で最初のバックテストを作る(別タブで開く)`,`Create your first backtest with AlphaForge (opens in new tab)`),style:{color:`var(--accent)`,textDecoration:`none`},children:[h(`AlphaForge で最初のバックテストを作る`,`Create your first backtest with AlphaForge`),(0,A.jsx)(`span`,{"aria-hidden":`true`,children:` ↗`})]})})]})})})]})]}),(0,A.jsx)(Fe,{visibleRecipeCount:e.length,recipeTotal:p,hiddenUnrunRecipeCount:m,strategyTotal:t,lang:d})]})}function Be({strategies:e,lang:t}){let n=C(t),r=u(),[i,a]=(0,k.useState)(!1),[o,s]=(0,k.useState)(``);return i?(0,A.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,flexWrap:`wrap`},children:[(0,A.jsx)(`label`,{htmlFor:`create-strategy-source`,style:{fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`,whiteSpace:`nowrap`},children:n(`複製元`,`Source`)}),(0,A.jsxs)(`select`,{id:`create-strategy-source`,"aria-label":n(`複製元の戦略`,`Source strategy to duplicate`),value:o,onChange:e=>s(e.target.value),style:{maxWidth:280,padding:`6px 8px`,background:`var(--surface-2)`,border:`1px solid var(--border)`,borderRadius:`var(--radius-sm)`,color:`var(--text)`,fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`},children:[(0,A.jsx)(`option`,{value:``,children:n(`複製元を選択…`,`Choose a source…`)}),e.map(e=>(0,A.jsxs)(`option`,{value:e.strategy_id,children:[e.name,`(`,e.strategy_id,`)`]},e.strategy_id))]}),(0,A.jsx)(h,{variant:`primary`,size:`sm`,disabled:!o,onClick:()=>r(`/detail/${encodeURIComponent(o)}?tab=strategy`),children:n(`作成へ進む`,`Continue`)}),(0,A.jsx)(h,{variant:`ghost`,size:`sm`,onClick:()=>a(!1),children:n(`やめる`,`Cancel`)})]}):(0,A.jsx)(h,{variant:`ghost`,size:`sm`,onClick:()=>a(!0),children:n(`+ 新規戦略(既存から複製)`,`+ New strategy (duplicate existing)`)})}var X={fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`};function Ve({strategy:e,onClose:t,lang:n}){let r=C(n),[i,a]=(0,k.useState)(0),[o,s]=(0,k.useState)(!1),c=ne(e.strategy_id,i),u=c.status===`ready`?c.data.slice(0,5):[],{run:d,running:m,error:_,logTail:y}=te(),b=U(),S=b.entries[e.strategy_id];(0,k.useEffect)(()=>{b.prefetch(e.strategy_id)},[e.strategy_id,b]);let w=()=>{if(e.symbol){if(e.last_run_at!==null){s(!0);return}T()}},T=async()=>{s(!1),e.symbol&&await d(e.strategy_id,e.symbol)&&a(e=>e+1)};return(0,A.jsxs)(`aside`,{className:`u-drawer-md-down`,"data-open":`true`,"data-testid":`strategy-slide-panel`,style:{width:`var(--slidepanel-width)`,flexShrink:0,alignSelf:`flex-start`,position:`sticky`,top:0,maxHeight:`100vh`,background:`var(--surface)`,borderLeft:`1px solid var(--border)`,display:`flex`,flexDirection:`column`,overflowY:`auto`},children:[(0,A.jsxs)(`header`,{style:{padding:`var(--space-5) var(--space-5) var(--space-4)`,display:`flex`,alignItems:`flex-start`,gap:`var(--space-3)`},children:[(0,A.jsxs)(`div`,{style:{flex:1,minWidth:0},children:[(0,A.jsx)(`h2`,{style:{margin:0,fontFamily:`var(--serif)`,fontSize:`1.375rem`,fontWeight:700,color:`var(--text)`,letterSpacing:`-0.01em`,lineHeight:1.15},children:e.name}),(0,A.jsxs)(`div`,{style:{display:`flex`,gap:6,marginTop:8,flexWrap:`wrap`},children:[e.symbol?(0,A.jsx)(x,{children:e.symbol}):null,e.timeframe?(0,A.jsx)(x,{children:e.timeframe}):null]})]}),(0,A.jsx)(`button`,{type:`button`,onClick:t,"aria-label":r(`閉じる`,`Close`),style:{background:`transparent`,border:`none`,cursor:`pointer`,color:`var(--text3)`,fontSize:18,lineHeight:1,padding:4},children:`✕`})]}),(0,A.jsxs)(`div`,{style:{padding:`0 var(--space-5) var(--space-4)`,display:`flex`,alignItems:`center`,gap:`var(--space-2)`,flexWrap:`wrap`},children:[(0,A.jsxs)(l,{to:`/detail/${e.strategy_id}`,style:{display:`inline-flex`,alignItems:`center`,gap:6,padding:`6px 12px`,background:`var(--accent)`,color:`var(--surface)`,border:`1px solid var(--accent-strong, var(--accent))`,borderRadius:`var(--radius-sm)`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,fontWeight:600,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`,textDecoration:`none`,transition:`background var(--motion-fast)`},children:[r(`フル詳細を開く`,`Open full detail`),` →`]}),(0,A.jsx)(h,{variant:`subtle`,size:`sm`,onClick:w,disabled:m||!e.symbol,children:m?r(`実行中…`,`Running…`):r(`バックテスト再実行`,`Re-run backtest`)}),_&&(0,A.jsx)(`p`,{style:{marginTop:12,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--danger)`,padding:`8px 12px`,background:`color-mix(in srgb, var(--danger) 10%, transparent)`,border:`1px solid color-mix(in srgb, var(--danger) 24%, transparent)`,borderRadius:`var(--radius-sm)`,letterSpacing:`var(--tracking-mono)`},children:_}),y&&(0,A.jsx)(`div`,{style:{width:`100%`,marginTop:8},children:(0,A.jsx)(ee,{log:y,lang:n})})]}),(0,A.jsx)(f,{}),(0,A.jsxs)(`section`,{style:{padding:`var(--space-4) var(--space-5)`},children:[(0,A.jsx)(`div`,{style:X,children:r(`エクイティ推移`,`Equity curve`)}),(0,A.jsx)(`div`,{style:{marginTop:`var(--space-3)`,background:`var(--surface-2)`,border:`1px solid var(--border)`,borderRadius:`var(--radius-sm)`,padding:`var(--space-3)`,minHeight:132,display:`flex`,alignItems:`center`,justifyContent:`center`},children:Array.isArray(S)&&S.length>=2?(0,A.jsx)(W,{values:S,width:300,height:108,strokeWidth:1.5}):S===`loading`?(0,A.jsxs)(`span`,{role:`status`,"aria-live":`polite`,"aria-busy":`true`,children:[(0,A.jsx)(g,{width:300,height:108}),(0,A.jsx)(`span`,{style:v,children:r(`読み込み中…`,`Loading…`)})]}):S===`error`?(0,A.jsx)(`span`,{style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--warn)`,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`},children:r(`取得に失敗しました`,`Failed to load`)}):(0,A.jsx)(`span`,{style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`},children:r(`データなし`,`No data`)})})]}),(0,A.jsx)(f,{}),(0,A.jsxs)(`section`,{style:{padding:`var(--space-4) var(--space-5)`},children:[(0,A.jsx)(`div`,{style:X,children:r(`実行履歴`,`Run history`)}),(0,A.jsxs)(`div`,{style:{marginTop:`var(--space-3)`},children:[u.map((e,t)=>(0,A.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`baseline`,padding:`10px 0`,borderTop:t===0?`none`:`1px solid var(--border)`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-md)`,letterSpacing:`var(--tracking-mono)`},children:[(0,A.jsx)(`span`,{style:{color:`var(--text3)`},children:e.run_at.slice(0,10)}),(0,A.jsx)(`span`,{style:{color:e.sharpe_ratio!==null&&e.sharpe_ratio>=1?`var(--success)`:e.sharpe_ratio===null?`var(--text3)`:`var(--warn)`,fontWeight:600},children:e.sharpe_ratio===null?`—`:`Sharpe ${e.sharpe_ratio.toFixed(2)}`}),(0,A.jsx)(`span`,{style:{color:`var(--text2)`,minWidth:60,textAlign:`right`},children:e.total_return_pct===null?`—`:`${e.total_return_pct.toFixed(1)}%`})]},e.run_id)),u.length===0&&c.status===`ready`&&(0,A.jsx)(`p`,{style:{margin:0,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`,letterSpacing:`var(--tracking-mono)`,padding:`8px 0`},children:r(`履歴はありません`,`No runs yet`)})]})]}),(0,A.jsx)(p,{open:o,title:r(`バックテスト再実行`,`Re-run backtest`),message:r(`新しい実行結果が追加され、表示は最新の結果に切り替わります(過去の結果は実行履歴に残ります)。実行しますか?`,`A new run will be added and the view will switch to the latest result (past results remain in the run history). Continue?`),confirmLabel:m?r(`実行中…`,`Running…`):r(`実行`,`Run`),cancelLabel:r(`やめる`,`Cancel`),onConfirm:T,onCancel:()=>s(!1)})]})}function He({compareIds:e,strategies:t,onRemove:n,lang:r}){let i=C(r),a=u();if(e.length===0)return null;let o=e=>t.find(t=>t.strategy_id===e)?.name??e;return(0,A.jsxs)(`div`,{style:{position:`fixed`,bottom:0,left:0,right:0,zIndex:200,background:`var(--surface)`,borderTop:`1px solid var(--accent-glow)`,boxShadow:`0 -8px 24px color-mix(in srgb, var(--accent) 12%, transparent)`,padding:`14px 24px`,display:`flex`,alignItems:`center`,gap:`var(--space-4)`},children:[(0,A.jsx)(`span`,{style:{fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:600,color:`var(--accent)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`,whiteSpace:`nowrap`},children:i(`${e.length}件選択中`,`${e.length} selected`)}),(0,A.jsx)(`div`,{style:{display:`flex`,gap:8,flexWrap:`wrap`,flex:1,minWidth:0},children:e.map(e=>(0,A.jsxs)(`span`,{style:{display:`inline-flex`,alignItems:`center`,gap:8,padding:`6px 10px 6px 14px`,background:`var(--accent-bg)`,border:`1px solid var(--accent-glow)`,borderRadius:`var(--radius-pill)`,fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text)`,maxWidth:240},children:[(0,A.jsx)(`span`,{style:{whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:o(e)}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>n(e),"aria-label":i(`外す`,`Remove`),style:{background:`transparent`,border:`none`,cursor:`pointer`,color:`var(--text3)`,fontSize:14,padding:0,lineHeight:1},children:`✕`})]},e))}),(0,A.jsx)(h,{variant:`primary`,size:`md`,onClick:()=>{a(`/compare?ids=${e.join(`,`)}`)},children:i(`比較する →`,`Compare →`)})]})}var Ue={fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`};function We({groupBy:e,onChange:t,lang:n}){let r=C(n),i=[[`none`,r(`なし`,`None`)],[`symbol`,r(`銘柄`,`Symbol`)],[`tf`,r(`時間軸`,`Timeframe`)],[`tier`,r(`Sharpe階級`,`Sharpe Tier`)]];return(0,A.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,gap:`var(--space-2)`},children:[(0,A.jsx)(`span`,{style:Ue,children:r(`グループ`,`Group by`)}),(0,A.jsx)(`div`,{role:`radiogroup`,"aria-label":r(`グルーピング`,`Group by`),style:{display:`inline-flex`,background:`var(--surface-2)`,border:`1px solid var(--border)`,borderRadius:`var(--radius-pill)`,padding:2,gap:2},children:i.map(([n,i])=>{let a=n===e;return(0,A.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":a,"aria-label":`${r(`グループ`,`Group by`)}: ${i}`,onClick:()=>t(n),style:{padding:`4px 12px`,borderRadius:`var(--radius-pill)`,border:`none`,background:a?`var(--accent)`:`transparent`,color:a?`var(--surface)`:`var(--text2)`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,fontWeight:600,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`,cursor:`pointer`,transition:`background var(--motion-fast), color var(--motion-fast)`},children:i},n)})})]})}var Z=7,Ge=1440*60*1e3;function Ke(e){let t=new Set,n=null,r=0,i=Date.now()-Z*Ge;for(let a of e){let e=L(a);if(e&&t.add(e),a.latest_sharpe!=null&&(n=n==null?a.latest_sharpe:Math.max(n,a.latest_sharpe)),a.last_run_at){let e=Date.parse(a.last_run_at);!Number.isNaN(e)&&e>=i&&(r+=1)}}return{totalStrategies:e.length,uniqueSymbols:t.size,topSharpe:n,recentRunsCount:r}}function qe(e){return e==null?`neutral`:e>=1.5?`positive`:e>=1?`warning`:`negative`}function Je({items:e,lang:t}){let n=C(t),r=(0,k.useMemo)(()=>Ke(e),[e]);return(0,A.jsxs)(`div`,{role:`group`,"aria-label":n(`全体メトリクス`,`Overview metrics`),style:{display:`flex`,flexWrap:`wrap`,gap:`var(--space-5)`,marginTop:`var(--space-3)`,paddingTop:`var(--space-3)`,borderTop:`1px solid var(--border)`},children:[(0,A.jsx)(m,{size:`md`,label:n(`戦略数`,`Strategies`),value:r.totalStrategies>0?String(r.totalStrategies):`—`,sub:n(`登録済み`,`registered`)}),(0,A.jsx)(m,{size:`md`,label:n(`銘柄数`,`Symbols`),value:r.uniqueSymbols>0?String(r.uniqueSymbols):`—`,sub:n(`割当済`,`with assignments`)}),(0,A.jsx)(m,{size:`md`,tone:qe(r.topSharpe),label:n(`最高 Sharpe`,`Top Sharpe`),value:D(r.topSharpe),sub:n(`最新バックテスト`,`latest backtests`)}),(0,A.jsx)(m,{size:`md`,tone:r.recentRunsCount>0?`accent`:`neutral`,label:n(`直近実行`,`Recent runs`),value:r.recentRunsCount>0?String(r.recentRunsCount):`—`,sub:n(`${Z}日以内`,`last ${Z} days`)})]})}var Ye=[{key:`all`,params:{}},{key:`starred`,params:{starred:`1`}},{key:`high_sharpe`,params:{sharpe_min:`1.5`,sort:`latest_sharpe`,dir:`desc`}},{key:`recent`,params:{sort:`last_run_at`,dir:`desc`}},{key:`risky`,params:{sort:`latest_max_drawdown_pct`,dir:`asc`}}],Q=[`q`,`symbol`,`tf`,`sharpe_min`,`dd_max`,`include_unrun`,`sort`,`dir`,`selected`,`compare`,`starred`];function Xe(e,t){let n=C(t);switch(e){case`all`:return n(`すべて`,`All`);case`starred`:return n(`スター`,`Starred`);case`high_sharpe`:return n(`高 Sharpe`,`High Sharpe`);case`recent`:return n(`最近実行`,`Recent`);case`risky`:return n(`要注意`,`Risky`)}}function Ze(e,t){let n=C(t);switch(e){case`all`:return n(`フィルタなし`,`No filter`);case`starred`:return n(`スターを付けた戦略のみ`,`Only starred strategies`);case`high_sharpe`:return n(`Sharpe 1.5 以上を Sharpe 降順で`,`Sharpe ≥ 1.5, sorted by Sharpe`);case`recent`:return n(`最終実行が新しい順`,`Sorted by last run desc`);case`risky`:return n(`Max DD が深い順`,`Sorted by deepest drawdown`)}}function Qe(e,t){if(e.key===`all`)return Q.every(e=>!t.get(e));for(let[n,r]of Object.entries(e.params))if(t.get(n)!==r)return!1;for(let n of Q)if(!(n in e.params)&&t.get(n))return!1;return!0}function $e({lang:e}){let t=C(e),[n,r]=s(),i=e=>{r(t=>{let n=new URLSearchParams(t);for(let e of Q)n.delete(e);for(let[t,r]of Object.entries(e.params))n.set(t,r);return n},{replace:!0})};return(0,A.jsxs)(`div`,{role:`radiogroup`,"aria-label":t(`保存ビュー`,`Saved views`),style:{display:`flex`,alignItems:`center`,gap:`var(--space-3)`,padding:`var(--space-3) var(--space-7)`,background:`var(--bg)`,borderBottom:`1px solid var(--border)`,flexWrap:`wrap`},children:[(0,A.jsx)(`span`,{style:{fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`},children:(0,A.jsx)(`span`,{title:t(`レンズ = ワンクリックで適用できる絞り込みプリセット`,`Lens = a one-click filter preset`),children:t(`レンズ`,`Lenses`)})}),Ye.map(t=>{let r=Qe(t,n),a=Xe(t.key,e),o=Ze(t.key,e);return(0,A.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":r,"aria-label":`${a}: ${o}`,title:o,onClick:()=>i(t),style:{padding:`6px 14px`,borderRadius:`var(--radius-pill)`,border:`1px solid ${r?`var(--accent-glow, var(--accent))`:`var(--border)`}`,background:r?`var(--accent-bg)`:`var(--surface-2)`,color:r?`var(--accent)`:`var(--text2)`,fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,fontWeight:600,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`,cursor:`pointer`,transition:`background var(--motion-fast), color var(--motion-fast), border-color var(--motion-fast)`},children:a},t.key)})]})}var et=[`index`,`etf`,`stock`,`fx`,`commodity`,`other`],tt={index:{ja:`指数`,en:`Indices`},etf:{ja:`ETF`,en:`ETFs`},stock:{ja:`個別銘柄`,en:`Stocks`},fx:{ja:`FX`,en:`Forex`},commodity:{ja:`コモディティ`,en:`Commodities`},other:{ja:`その他`,en:`Other`}},nt=new Set(`SPY.QQQ.TQQQ.SQQQ.VOO.VTI.IVV.VEA.VWO.EFA.EEM.IWM.DIA.GLD.SLV.TLT.IEF.HYG.LQD.XLF.XLE.XLK.XLI.XLP.XLY.XLV.XLU.XBI.SOXL.SOXX.ARKK.SH.UVXY.AGG.BND`.split(`.`)),rt=new Set([`NAS100`,`SPX500`,`US30`,`US500`,`UK100`,`GER40`,`GER30`,`JPN225`,`HK50`,`AUS200`,`FRA40`,`EU50`]),it=new Set([`XAU`,`XAG`,`XPT`,`XPD`,`XBT`]),at=/^[A-Z]{6}(=X|_X)$/i;function ot(e){if(!e)return`other`;let t=e.trim();if(!t)return`other`;let n=t.toUpperCase();return t.startsWith(`^`)||rt.has(n)?`index`:at.test(t)?`fx`:t.endsWith(`=F`)||it.has(n)?`commodity`:nt.has(n)?`etf`:/^[A-Z][A-Z0-9.-]*$/i.test(t)?`stock`:`other`}var st=`unrunRecipeCount`,ct=`desc`,lt=[{key:`unrunRecipeCount`,dir:`desc`},{key:`recipeCount`,dir:`desc`},{key:`bestSharpe`,dir:`desc`},{key:`symbol`,dir:`asc`}];function $(e,t){switch(t){case`symbol`:return e.symbol??``;case`assetClass`:return et.indexOf(e.assetClass);case`lastRunAt`:return e.lastRunAt??``;case`bestSharpe`:return e.bestSharpe??-1/0;case`avgReturnPct`:return e.avgReturnPct??-1/0;case`recipeCount`:return e.recipeCount;case`runRecipeCount`:return e.runRecipeCount;case`unrunRecipeCount`:return e.unrunRecipeCount}}function ut(e,t,n,r){let i=$(e,n),a=$(t,n),o;return o=typeof i==`string`&&typeof a==`string`?i.localeCompare(a):typeof i==`number`&&typeof a==`number`?i<a?-1:+(i>a):0,r===`asc`?o:-o}function dt(e,t,n){return[...e].sort((e,r)=>{if(e.symbol===null&&r.symbol!==null)return 1;if(r.symbol===null&&e.symbol!==null)return-1;let i=ut(e,r,t,n);if(i!==0)return i;for(let n of lt){if(n.key===t)continue;let i=ut(e,r,n.key,n.dir);if(i!==0)return i}return 0})}function ft(e,t){let n=null,r=0,i=0,a=null,o=0;for(let e of t){e.runCount>0&&(o+=1);let t=e.best;t!=null&&(t.latest_sharpe!=null&&(n=n==null?t.latest_sharpe:Math.max(n,t.latest_sharpe)),t.latest_return_pct!=null&&(r+=t.latest_return_pct,i+=1));for(let t of e.variants){let e=t.last_run_at;e&&(a==null||e>a)&&(a=e)}}return{symbol:e,assetClass:e==null?`other`:ot(e),recipeCount:t.length,runRecipeCount:o,unrunRecipeCount:t.length-o,bestSharpe:n,avgReturnPct:i>0?r/i:null,lastRunAt:a}}function pt(e){let t=new Map,n=[];for(let r of e){let e=r.symbol;if(e==null){n.push(r);continue}let i=t.get(e);i?i.push(r):t.set(e,[r])}let r=[];for(let[e,n]of t.entries())r.push(ft(e,n));return n.length>0&&r.push(ft(null,n)),r}var mt={fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`,padding:`10px 12px`,background:`var(--surface)`,borderBottom:`1px solid var(--border)`,userSelect:`none`,whiteSpace:`nowrap`},ht=[{key:`symbol`,ja:`銘柄`,en:`Symbol`,align:`left`},{key:`assetClass`,ja:`区分`,en:`Class`,align:`left`,hideMdDown:!0},{key:`recipeCount`,ja:`レシピ`,en:`Recipes`,align:`right`},{key:`runRecipeCount`,ja:`実行済`,en:`Run`,align:`right`},{key:`unrunRecipeCount`,ja:`未実行`,en:`Unrun`,align:`right`},{key:`bestSharpe`,ja:`最高 Sharpe`,en:`Best Sharpe`,align:`right`},{key:`avgReturnPct`,ja:`平均 Return`,en:`Avg return`,align:`right`,hideMdDown:!0},{key:`lastRunAt`,ja:`最終実行`,en:`Last run`,align:`right`,hideMdDown:!0}];function gt(e){return e==null?`var(--text3)`:e>=0?`var(--success)`:`var(--danger)`}function _t({stat:e,selected:t,dimmed:n,onToggle:r,lang:i}){let a=C(i),o=e.symbol,s=o??a(`未割当`,`Unassigned`),[c,l]=(0,k.useState)(!1),u=()=>{o!=null&&r(o)};return(0,A.jsxs)(`tr`,{onClick:u,onMouseEnter:()=>l(!0),onMouseLeave:()=>l(!1),style:{background:t?`var(--accent-bg)`:c&&o!=null?`var(--surface-2)`:`transparent`,borderLeft:t?`2px solid var(--accent)`:`2px solid transparent`,opacity:n?.55:1,cursor:o==null?`default`:`pointer`,transition:`background var(--motion-fast)`},children:[(0,A.jsx)(`td`,{style:{...K,textAlign:`left`},children:(0,A.jsx)(`button`,{type:`button`,"aria-pressed":t,disabled:o==null,onClick:e=>{e.stopPropagation(),u()},style:{background:`transparent`,border:`none`,padding:0,margin:0,fontFamily:`var(--serif)`,fontSize:`1.0625rem`,fontWeight:600,color:o==null?`var(--text3)`:`var(--text)`,letterSpacing:`-0.005em`,cursor:o==null?`default`:`pointer`},children:s})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,textAlign:`left`,color:`var(--text3)`},children:o==null?`—`:tt[e.assetClass][i]}),(0,A.jsx)(`td`,{style:{...K,color:`var(--text2)`},children:e.recipeCount}),(0,A.jsx)(`td`,{style:{...K,color:`var(--text2)`},children:e.runRecipeCount}),(0,A.jsx)(`td`,{style:{...K,color:e.unrunRecipeCount>0?`var(--warn)`:`var(--text3)`,fontWeight:700},children:e.unrunRecipeCount}),(0,A.jsx)(`td`,{style:{...K,color:G(e.bestSharpe),fontWeight:700},children:E(e.bestSharpe,{decimals:2})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:{...K,color:gt(e.avgReturnPct)},children:E(e.avgReturnPct,{suffix:`%`,decimals:1})}),(0,A.jsx)(`td`,{className:`u-col-hide-md-down`,style:q,children:O(e.lastRunAt)})]})}function vt({recipes:e,lang:t}){let n=C(t),[r,i]=s(),[a,o]=(0,k.useState)(st),[c,l]=(0,k.useState)(ct),u=(0,k.useMemo)(()=>pt(e),[e]),d=(0,k.useMemo)(()=>dt(u,a,c),[u,a,c]),f=(0,k.useMemo)(()=>(r.get(`symbol`)??``).split(`,`).filter(Boolean),[r]),p=e=>{i(t=>{let n=new URLSearchParams(t),r=n.get(`symbol`)?.split(`,`).filter(Boolean)??[],i=r.includes(e)?r.filter(t=>t!==e):[...r,e];return i.length?n.set(`symbol`,i.join(`,`)):n.delete(`symbol`),n},{replace:!0})},m=e=>{if(e===a){l(e=>e===`desc`?`asc`:`desc`);return}o(e),l(`desc`)};return d.length===0?null:(0,A.jsxs)(`section`,{"aria-label":n(`銘柄カバレッジ`,`Symbol coverage`),style:{padding:`var(--space-4) var(--space-7)`,background:`var(--bg)`,borderBottom:`1px solid var(--border)`,display:`flex`,flexDirection:`column`,gap:`var(--space-3)`},children:[(0,A.jsxs)(`div`,{style:{display:`flex`,alignItems:`baseline`,justifyContent:`space-between`,gap:`var(--space-3)`},children:[(0,A.jsx)(`h2`,{style:{margin:0,fontFamily:`var(--serif)`,fontSize:`1.25rem`,fontWeight:600,color:`var(--text)`,letterSpacing:`-0.005em`},children:n(`銘柄カバレッジ`,`Symbol coverage`)}),(0,A.jsx)(`span`,{style:{fontFamily:`var(--mono)`,fontSize:`var(--fs-mono-sm)`,color:`var(--text3)`,letterSpacing:`var(--tracking-mono)`,textTransform:`uppercase`},children:n(`${d.length} 銘柄 · ${e.length} レシピ`,`${d.length} symbols · ${e.length} recipes`)})]}),(0,A.jsx)(`div`,{className:`u-scroll-x`,"data-testid":`symbol-coverage-scroll`,children:(0,A.jsxs)(`table`,{style:{width:`100%`,borderCollapse:`collapse`},children:[(0,A.jsx)(`thead`,{children:(0,A.jsx)(`tr`,{children:ht.map(e=>(0,A.jsx)(T,{label:n(e.ja,e.en),active:a===e.key,direction:c,onSort:()=>m(e.key),align:e.align,className:e.hideMdDown?`u-col-hide-md-down`:void 0,baseStyle:{...mt,color:a===e.key?`var(--text2)`:`var(--text3)`}},e.key))})}),(0,A.jsx)(`tbody`,{children:d.map(e=>{let n=e.symbol!=null&&f.includes(e.symbol);return(0,A.jsx)(_t,{stat:e,selected:n,dimmed:f.length>0&&!n,onToggle:p,lang:t},e.symbol??`__unassigned__`)})})]})})]})}function yt({list:e,lang:t,theme:n,selectedStrategy:r,onUpdateLang:i,onUpdateTheme:a,onSelect:o,onCloseSlidePanel:s}){let c=C(t),u=pt(e.allRecipes),d=u.reduce((e,t)=>e+t.unrunRecipeCount,0),f=u.filter(e=>e.symbol!==null).length,p=u.some(e=>e.symbol===null)?c(`銘柄カバレッジ(${f} 銘柄 + 未割当 · 未実行 ${d} レシピ)`,`Symbol coverage (${f} symbols + unassigned · ${d} unrun recipes)`):c(`銘柄カバレッジ(${f} 銘柄 · 未実行 ${d} レシピ)`,`Symbol coverage (${f} symbols · ${d} unrun recipes)`);return(0,A.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,minHeight:`100vh`,background:`var(--bg)`},children:[(0,A.jsxs)(`header`,{className:`u-toolbar-wrap`,style:{padding:`var(--space-4) var(--layout-gutter)`,background:`var(--bg)`,borderBottom:`1px solid var(--border)`,display:`flex`,alignItems:`flex-start`,justifyContent:`space-between`,gap:`var(--space-4)`},children:[(0,A.jsxs)(`div`,{style:{flex:1,minWidth:0},children:[(0,A.jsx)(`div`,{style:{fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`},children:c(`戦略ブラウザ`,`Strategy browser`)}),(0,A.jsx)(`h1`,{style:{margin:`4px 0 0 0`,fontFamily:`var(--serif)`,fontSize:`var(--browse-fs-h1)`,fontWeight:700,color:`var(--text)`,letterSpacing:`-0.01em`,lineHeight:1.1},children:c(`登録済みの戦略を一覧する`,`Browse the strategy library`)}),!e.loading&&(0,A.jsx)(Je,{items:e.all,lang:t}),(0,A.jsxs)(`div`,{style:{display:`flex`,gap:`var(--space-4)`,alignItems:`center`,flexWrap:`wrap`},children:[(0,A.jsx)(`div`,{style:{marginTop:`var(--space-3)`},children:(0,A.jsx)(Be,{strategies:e.all,lang:t})}),[`/ideas`,`/live`].map(e=>(0,A.jsx)(l,{to:e,style:{display:`inline-flex`,alignItems:`center`,marginTop:`var(--space-3)`,fontFamily:`var(--sans)`,fontSize:`var(--fs-caption)`,fontWeight:500,color:`var(--text3)`,textDecoration:`none`,letterSpacing:`var(--tracking-caption)`,textTransform:`uppercase`},children:e===`/ideas`?c(`Ideas →`,`Ideas →`):c(`Live →`,`Live →`)},e))]})]}),(0,A.jsx)(re,{lang:t,onSetLang:i,theme:n,onSetTheme:a})]}),(0,A.jsx)($e,{lang:t}),(0,A.jsx)(se,{symbols:e.symbols,timeframes:e.timeframes,lang:t}),(0,A.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`var(--space-4)`,padding:`var(--space-3) var(--layout-gutter)`,background:`var(--bg)`,borderBottom:`1px solid var(--border)`},children:(0,A.jsx)(We,{groupBy:e.groupBy,onChange:e.setGroupBy,lang:t})}),!e.loading&&e.all.length>0&&(0,A.jsx)(j,{label:p,testId:`symbol-coverage-collapsible`,children:(0,A.jsx)(vt,{recipes:e.allRecipes,lang:t})}),(0,A.jsxs)(`div`,{style:{display:`flex`,flex:1},children:[e.loading?(0,A.jsx)(b,{label:c(`読み込み中…`,`Loading…`)}):(0,A.jsx)(ze,{recipes:e.recipes,groups:e.groups,strategyTotal:e.all.length,recipeTotal:e.recipeTotal,hiddenUnrunRecipeCount:e.hiddenUnrunRecipeCount,sortKey:e.sortKey,sortDir:e.sortDir,onSort:e.setSort,selectedId:e.selectedId,onSelect:o,compareIds:e.compareIds,onToggleCompare:e.toggleCompareId,starredKeys:e.starredKeys,onToggleStar:e.toggleStar,lang:t}),r&&(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`div`,{className:`u-drawer-md-down-backdrop u-hide-md-up`,"data-testid":`slide-panel-backdrop`,onClick:s,"aria-hidden":`true`}),(0,A.jsx)(Ve,{strategy:r,onClose:s,lang:t})]})]}),(0,A.jsx)(He,{compareIds:e.compareIds,strategies:e.all,onRemove:e.removeCompareId,lang:t})]})}var bt=`alphaforge.scroll:`;function xt(e){let t=`${bt}${c().pathname}`,n=(0,k.useRef)(!1);(0,k.useEffect)(()=>{if(!e||n.current)return;let r=sessionStorage.getItem(t);if(r!==null){let e=Number.parseInt(r,10);Number.isNaN(e)||requestAnimationFrame(()=>{window.scrollTo(0,e)})}n.current=!0},[e,t]),(0,k.useEffect)(()=>{let e=()=>{sessionStorage.setItem(t,String(window.scrollY))};return window.addEventListener(`scroll`,e,{passive:!0}),()=>{window.removeEventListener(`scroll`,e)}},[t])}function St(){let{settings:e,update:t}=d(),{lang:n,theme:r}=e;ie(n===`ja`?`戦略ブラウザ`:`Strategy Browser`);let i=Me();xt(!i.loading);let a=i.all.find(e=>e.strategy_id===i.selectedId)??null;if((0,k.useEffect)(()=>{if(!i.selectedId)return;let e=e=>{e.key===`Escape`&&i.setSelectedId(null)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[i]),i.error){let e=C(n);return(0,A.jsx)(`div`,{style:{padding:`var(--space-7)`,background:`var(--bg)`,minHeight:`100vh`},children:(0,A.jsx)(y,{message:ae(i.error,n),title:i.error,retryLabel:e(`再試行`,`Retry`),onRetry:i.reload})})}return(0,A.jsx)(yt,{list:i,lang:n,theme:r,selectedStrategy:a,onUpdateLang:e=>t(`lang`,e),onUpdateTheme:e=>{t(`theme`,e),t(`variation`,e===`dark`?`lab`:`atelier`)},onSelect:e=>i.setSelectedId(i.selectedId===e?null:e),onCloseSlidePanel:()=>i.setSelectedId(null)})}export{St as BrowsePage};
|
|
2
|
+
//# sourceMappingURL=BrowsePage-BEPv8i_r.js.map
|