@tony01/astroneum 0.4.1-beta.2 → 0.4.1-beta.24
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.
- package/CHANGELOG.md +280 -237
- package/LICENSE +21 -21
- package/README.md +250 -198
- package/dist/{Indicator-BBI3L_lx.d.ts → Indicator-BQQcVGGT.d.ts} +51 -227
- package/dist/astroneum.css +1 -1
- package/dist/chunk-47YGQEL5.js +399 -0
- package/dist/chunk-67XM5LOK.js +2 -0
- package/dist/{chunk-2YYGUSVX.js → chunk-DFJMDDL5.js} +1 -1
- package/dist/chunk-EFAS6F4C.js +59 -0
- package/dist/chunk-EHZN52CY.js +2 -0
- package/dist/chunk-HKLWNPMP.js +35 -0
- package/dist/chunk-ONPPQW65.js +2 -0
- package/dist/chunk-SCTHEM27.js +3 -0
- package/dist/chunk-UQXYMB6X.js +2 -0
- package/dist/chunk-WSIR5T2M.js +3 -0
- package/dist/entries/alerts.d.ts +36 -10
- package/dist/entries/alerts.js +1 -1
- package/dist/entries/datafeeds/crypto.d.ts +5 -1
- package/dist/entries/datafeeds/crypto.js +1 -1
- package/dist/entries/datafeeds/polygon.d.ts +3 -1
- package/dist/entries/datafeeds/polygon.js +1 -1
- package/dist/entries/headless.d.ts +78 -0
- package/dist/entries/headless.js +2 -0
- package/dist/entries/multichart.d.ts +12 -1
- package/dist/entries/multichart.js +1 -1
- package/dist/entries/replay.d.ts +3 -1
- package/dist/entries/script.d.ts +2 -68
- package/dist/entries/script.js +1 -1
- package/dist/entries/watchlist.d.ts +32 -2
- package/dist/entries/watchlist.js +1 -1
- package/dist/entries/workspace.d.ts +61 -0
- package/dist/entries/workspace.js +2 -0
- package/dist/index-BiXdqLA4.d.ts +45 -0
- package/dist/index-_JgHTy8X.d.ts +19 -0
- package/dist/index.d.ts +188 -27
- package/dist/index.js +1 -1
- package/dist/script-BU9StbN-.d.ts +120 -0
- package/dist/types-W6SIYQ9m.d.ts +232 -0
- package/dist/types-yETgeYsE.d.ts +28 -0
- package/dist/zh-CN-NDTUDZGZ.js +3 -0
- package/docs/MIRROR-PLAN-SYMBOL-SEARCH-WATCHLIST.md +255 -0
- package/docs/STRUCTURE.md +51 -37
- package/docs/TODO-DESIGN.md +111 -37
- package/docs/TODO.md +26 -16
- package/docs/WORKSTREAMS.md +55 -0
- package/docs/api.md +655 -528
- package/docs/datafeed-guide.md +329 -311
- package/docs/design-astroneum.md +204 -65
- package/docs/plugin-development.md +569 -565
- package/docs/tv-functions-skill.md +88 -64
- package/package.json +158 -147
- package/dist/chunk-4YOLQ5DC.js +0 -2
- package/dist/chunk-I4YQBP2M.js +0 -3
- package/dist/chunk-OOMZRONH.js +0 -35
- package/dist/chunk-PV2GAINM.js +0 -2
- package/dist/chunk-YW3STIPY.js +0 -653
- package/dist/zh-CN-Y2C6RSOI.js +0 -3
package/docs/STRUCTURE.md
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
> Living reference for the Astroneum project deployed at **https://72.62.73.180/astroneum/**.
|
|
4
4
|
> Documents *what lives where*. For design rationale see `docs/design-astroneum.md`.
|
|
5
|
-
> Last updated: **2026-
|
|
5
|
+
> Last updated: **2026-08-29**. Keep this file in sync on every structural change (see §11).
|
|
6
6
|
|
|
7
7
|
## 1. Overview
|
|
8
8
|
|
|
9
9
|
| | |
|
|
10
10
|
|---|---|
|
|
11
11
|
| Name | `astroneum` |
|
|
12
|
-
| Version | `0.4.1-beta.
|
|
12
|
+
| Version | `0.4.1-beta.24` |
|
|
13
13
|
| Description | Professional financial charting library, ready out of the box |
|
|
14
14
|
| License | MIT (author `kowito`, repo `github.com/kowito/astroneum`) |
|
|
15
15
|
| Stack | TypeScript · React 18/19 peer · ESM-only · Canvas + WebGL/WebGPU · tsup · pnpm |
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
├── src/ # library source (see §3)
|
|
26
26
|
├── dist/ # compiled output: ESM js + astroneum.css + .d.ts + locale chunks (gitignored, build artifact)
|
|
27
27
|
├── demo/ # Next.js showcase app "astroneum-demo-next" (see §5)
|
|
28
|
-
├── docs/ # developer docs (see §9)
|
|
28
|
+
├── docs/ # developer docs (see §9; WORKSTREAMS owns delivery claims)
|
|
29
29
|
├── .opencode/ # AI OS config (fork-only, never PR to upstream)
|
|
30
30
|
│ ├── opencode.json # references (11 docs), permissions, skills path
|
|
31
31
|
│ ├── agents/ # 6 subagents: builder, demo-builder, deployer, doc-syncer, parity-checker, auditor
|
|
@@ -56,11 +56,11 @@ Root files: `index.ts` (public barrel), `types.ts`, `utils.ts`, `constants.ts`,
|
|
|
56
56
|
`AstroneumChart.tsx` (main React component), `index.ts`, `hooks.ts`, plus feature modules:
|
|
57
57
|
`AlertManager`, `BarReplay`, `ChartTemplateManager`, `CompareOverlay`, `DOMPane`, `DrawingSnapper`, `DrawingTemplates`, `EventBus`, `MultiChartLayout`, `MultiPeriodLayout`, `MultiTimeframe`, `NonTimeBars`, `PatternRecognition`, `PerformanceMode`, `PointAndFigure`, `PortfolioTracker`, `PositionVisualizer`, `PriceScaleTransform`, `SessionVisualizer`, `UndoManager`, `VolumeProfilePlugin`, `WatchlistManager`, `ZigzagPattern`.
|
|
58
58
|
|
|
59
|
-
### 3.2 `component/` — primitive UI (
|
|
60
|
-
Each is a `index.tsx` + `index.scss` pair: `button`, `checkbox`, `empty`, `input`, `list`, `loading`, `modal`, `select`, `switch`. Root `index.tsx` + `index.scss` barrel.
|
|
59
|
+
### 3.2 `component/` — primitive UI (10 atoms)
|
|
60
|
+
Each is a `index.tsx` + `index.scss` pair: `button`, `checkbox`, `dropdown`, `empty`, `input`, `list`, `loading`, `modal`, `select`, `switch`. Root `index.tsx` + `index.scss` barrel.
|
|
61
61
|
|
|
62
62
|
### 3.3 `engine/` — rendering core
|
|
63
|
-
Root: `Chart.ts`, `Event.ts`, `Options.ts`, `Store.ts`, `index.ts`.
|
|
63
|
+
Root: `Chart.ts`, `ChartRegistry.ts`, `Event.ts`, `Options.ts`, `Store.ts`, `index.ts`.
|
|
64
64
|
- `common/` (~45 modules) — renderers & primitives: `Canvas`, `WebGLCanvas`, `SharedIndicatorGLCanvas`, `CandleWebGLRenderer`, `CandleWebGPURenderer`, `CandleWorkerRenderer`, `IndicatorLineWebGLRenderer`, `IndicatorPluginWebGLRenderer`, `IndicatorRectWebGLRenderer`, `TextWebGLRenderer`, `GlyphAtlas`, `candleShaders.ts`; data/coord: `Data`, `DataLoader`, `SymbolInfo`, `Period`, `VisibleRange`, `BarSpace`, `Bounding`, `Coordinate`, `Point`; interaction: `Crosshair`, `EventHandler`, `Eventful`, `Action`, `Animation`, `TickAnimator`, `TaskScheduler`, `Updater`; buffers: `RingBuffer`, `SabRingBuffer`; styling/types: `Styles`, `Nullable`, `DeepPartial`, `DeepRequired`, `PickPartial`, `PickRequired`, `ExcludePickPartial`; `utils/`.
|
|
65
65
|
- `component/` — engine-level components: `Axis`, `XAxis`, `YAxis`, `Figure`, `Indicator`, `Overlay`.
|
|
66
66
|
- `pane/` — `Pane`, `CandlePane`, `IndicatorPane`, `DrawPane`, `SeparatorPane`, `XAxisPane`, `types.ts`.
|
|
@@ -69,65 +69,69 @@ Root: `Chart.ts`, `Event.ts`, `Options.ts`, `Store.ts`, `index.ts`.
|
|
|
69
69
|
- `workers/` — `IndicatorWorkerPool`, `TypedArrayIndicators`, `WasmIndicators`.
|
|
70
70
|
- `extension/` — extension registries: `figure`, `i18n`, `indicator`, `overlay`, `styles`, `x-axis`, `y-axis`.
|
|
71
71
|
|
|
72
|
-
### 3.4 `widget/`
|
|
73
|
-
Each `index.tsx` + `index.scss` (some with `data.ts`/`types.ts`/`icons/`): `alert-modal`, `drawing-bar` (+`icons
|
|
72
|
+
### 3.4 `widget/` - UI modals & bars (11)
|
|
73
|
+
Each `index.tsx` + `index.scss` (some with `data.ts`/`types.ts`/`icons/`): `alert-modal`, `drawing-bar` (+`icons/`; sole left rail after dead demo `term-rail` removal; cursor submenu, measure, zoom, keep-drawing toggle, hide-all, forecasting group with 12 tools in 3 sections), `indicator-modal`, `indicator-setting-modal` (+`data.ts`,`types.ts`), `period-bar`, `screenshot-modal`, `script-editor-modal`, `setting-modal` (+`data.ts`), `symbol-search-modal`, `timezone-modal` (+`data.ts`), `watchlist`. `WatchlistManager` now ships `moveSymbol`/`setSort`/`setColumns`/`setColor`/`updateQuotes`/`addSymbolFromInfo`; `Datafeed.getQuotes?` supplies optional live snapshots. Root `index.tsx` + `index.scss`.
|
|
74
74
|
|
|
75
75
|
### 3.5 `datafeed/` — data transport
|
|
76
|
-
`DefaultDatafeed.ts`, `StandardCryptoDatafeed.ts` (Binance/Bitget/OKX USDT), `WebSocketDatafeed.ts`, `WebTransportDatafeed.ts`, `OPFSCache.ts` (off-thread cache), `codec/BarsCodec.ts`, `index.ts`.
|
|
76
|
+
`DefaultDatafeed.ts`, `StandardCryptoDatafeed.ts` (Binance/Bitget/OKX USDT history, streams, and batched quote snapshots), `WebSocketDatafeed.ts`, `WebTransportDatafeed.ts`, `OPFSCache.ts` (off-thread cache), `codec/BarsCodec.ts`, `index.ts`.
|
|
77
77
|
|
|
78
78
|
### 3.6 `entries/` — subpath entry bundles
|
|
79
|
-
`replay.ts`, `multichart.ts`, `watchlist.ts`, `portfolio.ts`, `alerts.ts`, `script.ts`, `datafeeds/polygon.ts`, `datafeeds/crypto.ts`. (Mirror the `exports` map in §4.)
|
|
79
|
+
`headless.ts`, `replay.ts`, `multichart.ts`, `watchlist.ts`, `workspace.ts`, `portfolio.ts`, `alerts.ts`, `script.ts`, `datafeeds/polygon.ts`, `datafeeds/crypto.ts`. (Mirror the `exports` map in §4.)
|
|
80
80
|
|
|
81
|
-
### 3.7 `extension/` — drawing tools (
|
|
82
|
-
`abcd`, `xabcd`, `arrow`, `circle`, `rect`, `triangle`, `parallelogram`, `pitchfork`, `measure`, `waves`, `gannBox`, `gannFan`, `fibonacciCircle`, `fibonacciExtension`, `fibonacciSegment`, `fibonacciSpeedResistanceFan`, `fibonacciSpiral`; `utils.ts`, `index.ts`.
|
|
81
|
+
### 3.7 `extension/` — drawing tools (32 + utils + index)
|
|
82
|
+
`abcd`, `xabcd`, `arrow`, `circle`, `rect`, `triangle`, `parallelogram`, `pitchfork`, `measure`, `waves`, `gannBox`, `gannFan`, `fibonacciCircle`, `fibonacciExtension`, `fibonacciSegment`, `fibonacciSpeedResistanceFan`, `fibonacciSpiral`, `longPosition`, `shortPosition`, `positionForecast`, `barsPattern`, `ghostFeed`, `sector`, `anchoredVwap`, `fixedRangeVolumeProfile`, `anchoredVolumeProfile`, `priceRange`, `dateRange`, `dateAndPriceRange`; `utils.ts`, `index.ts`.
|
|
83
83
|
|
|
84
|
-
### 3.8 `scripting/` — `ScriptEngine.ts` (Pine-like
|
|
84
|
+
### 3.8 `scripting/` — `ScriptEngine.ts` (Pine-like indicator runtime plus bounded `strategySignals()` compilation).
|
|
85
85
|
|
|
86
|
-
### 3.9 `
|
|
86
|
+
### 3.9 `strategy/` — deterministic backtest core
|
|
87
|
+
`BacktestEngine.ts` runs bar-close fills, commission, slippage, trade accounting, equity, and drawdown without browser/network state. `types.ts` owns the report contract shared by demo UI and future worker execution.
|
|
87
88
|
|
|
88
|
-
### 3.10 `
|
|
89
|
+
### 3.10 `store/` — state: `chartStore.ts`, `indicatorStore.ts`, `uiStore.ts`, `index.ts`.
|
|
90
|
+
|
|
91
|
+
### 3.11 `i18n/` - 18 locale JSON files + `format.ts` + `index.ts`
|
|
89
92
|
`ar-SA, de-DE, en-US, es-ES, fr-FR, hi-IN, id-ID, it-IT, ja-JP, ko-KR, nl-NL, pl-PL, pt-BR, ru-RU, th-TH, tr-TR, vi-VN, zh-CN`.
|
|
90
93
|
|
|
91
|
-
### 3.
|
|
92
|
-
- `plugin/index.ts` — plugin API surface.
|
|
94
|
+
### 3.12 Misc
|
|
95
|
+
- `plugin/index.ts` — plugin API surface; `plugin/types.ts` keeps study-plugin contracts independent of React declarations.
|
|
93
96
|
- `jsx/` — `jsx-runtime.ts`, `jsx-dev-runtime.ts` (custom JSX runtime; tsconfig `jsxImportSource: @/jsx`).
|
|
94
97
|
- `styles/` — `base.scss`, `index.scss` (built to `dist/astroneum.css`).
|
|
95
98
|
- `assets/` — `logo.svg`, `iconfonts/{fonts, style.css}`.
|
|
96
|
-
- `__tests__/` — `adjustFromTo`, `datafeed-contract`, `
|
|
99
|
+
- `__tests__/` — `adjustFromTo`, `datafeed-contract`, `headless-bars`, `headless-lifecycle`, `headless-package`, `persistence`, `plugin`, `script-engine`, `ssr-smoke`, `strategy`, `utils`, `watchlist` (`.test.ts`), + `perf/`.
|
|
97
100
|
|
|
98
101
|
## 4. Public API surface (`package.json` `exports`)
|
|
99
102
|
|
|
100
103
|
| Subpath | Dist target |
|
|
101
104
|
|---|---|
|
|
102
|
-
|
|
|
103
|
-
|
|
|
104
|
-
|
|
|
105
|
-
|
|
|
106
|
-
|
|
|
107
|
-
|
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
|
|
|
111
|
-
|
|
|
112
|
-
|
|
|
113
|
-
|
|
114
|
-
|
|
105
|
+
| `@tony01/astroneum` (`.`) | `dist/index.js` |
|
|
106
|
+
| `@tony01/astroneum/headless` | `dist/entries/headless.js` |
|
|
107
|
+
| `@tony01/astroneum/replay` | `dist/entries/replay.js` |
|
|
108
|
+
| `@tony01/astroneum/multichart` | `dist/entries/multichart.js` |
|
|
109
|
+
| `@tony01/astroneum/watchlist` | `dist/entries/watchlist.js` |
|
|
110
|
+
| `@tony01/astroneum/portfolio` | `dist/entries/portfolio.js` |
|
|
111
|
+
| `@tony01/astroneum/alerts` | `dist/entries/alerts.js` |
|
|
112
|
+
| `@tony01/astroneum/script` | `dist/entries/script.js` |
|
|
113
|
+
| `@tony01/astroneum/datafeeds/polygon` | `dist/entries/datafeeds/polygon.js` |
|
|
114
|
+
| `@tony01/astroneum/datafeeds/crypto` | `dist/entries/datafeeds/crypto.js` |
|
|
115
|
+
| `@tony01/astroneum/style.css` | `dist/astroneum.css` |
|
|
116
|
+
| `@tony01/astroneum/package.json` | `./package.json` |
|
|
117
|
+
|
|
118
|
+
tsup entries (single source of truth for the above): `src/index.ts` + the 10 `src/entries/**` files. All entries ship with `.d.ts`. esbuild strips `'use client'`; `tsup.onSuccess` re-injects it into every emitted `.js` so Next.js App Router treats each entry as a Client Module. The headless entry is SSR-import safe, has no React/native-UI/datafeed dependency, requires no stylesheet, installs optional indicator/drawing built-ins only through an explicit call, and exposes React-independent typed study plus bounded viewport-recovery contracts.
|
|
115
119
|
|
|
116
120
|
`peerDependencies`: `react` / `react-dom` `^18 || ^19`. `engines.node`: `>=18`.
|
|
117
121
|
|
|
118
122
|
## 5. Demo app (`demo/` — `astroneum-demo-next`)
|
|
119
123
|
|
|
120
|
-
Next.js 15 + React 19 showcase. Private workspace package, depends on
|
|
124
|
+
Next.js 15 + React 19 showcase. Private workspace package, depends on `@tony01/astroneum: workspace:*`.
|
|
121
125
|
|
|
122
|
-
- `package.json` — scripts: `dev`, `build`, `start` (= `next start -p 3002
|
|
123
|
-
- `next.config.ts` — `transpilePackages: ['astroneum']`, `basePath: NEXT_PUBLIC_BASE_PATH` (=`/astroneum` in prod), `trailingSlash: true`, `outputFileTracingRoot: ../`.
|
|
126
|
+
- `package.json` — scripts: `dev`, `build`, `start` (= `next start -p 3002`). Deps: `next ^15.3.1`, `react ^19.2`, `@tony01/astroneum workspace:*`.
|
|
127
|
+
- `next.config.ts` — `transpilePackages: ['@tony01/astroneum']`, `basePath: NEXT_PUBLIC_BASE_PATH` (=`/astroneum` in prod), `trailingSlash: true`, `outputFileTracingRoot: ../`.
|
|
124
128
|
- `src/app/` routes (App Router):
|
|
125
129
|
- `layout.tsx`, `page.tsx`, `globals.css`
|
|
126
130
|
- `_components/alerts/` — `AlertDialog`, `ErrorBoundary`, `NotificationsDialog`, `Popover` + `alert-dialog.css`
|
|
127
131
|
- `alerts/page.tsx`
|
|
128
132
|
- `api/alerts/email/route.ts`, `api/alerts/webhook/route.ts`
|
|
129
|
-
- `components/` — `ChartDemo`, `ChartTerminal`, `ChartTypeDropdown`, `CommandPalette`, `DateRangeNavigator`, `ErrorBoundary`, `MultiChartView`, `PatternDialog`, `ReplayToolbar`, `SaveLoadMenu`, `TerminalShell` + `enhancements.css`, `terminal.css`
|
|
130
|
-
- `components/panels/` — `PineEditorPanel`, `WatchlistPanel` + `panels.css`
|
|
133
|
+
- `components/` — `ChartDemo`, `ChartTerminal`, `ChartTypeDropdown`, `CommandPalette`, `DateRangeNavigator`, `ErrorBoundary`, `MultiChartView`, `PatternDialog`, `ReplayToolbar`, `SaveLoadMenu`, `TerminalShell` + `enhancements.css`, `terminal.css`; `SidebarContent` renders panel body first and the persistent 52px rail last so it stays on the outer-right edge
|
|
134
|
+
- `components/panels/` — `PineEditorPanel`, `WatchlistPanel` (Watchlist/Details/News; live quotes, list tabs, sorting/settings/context actions), `DetailsPanel`, `AlertsPanel` + `panels.css`
|
|
131
135
|
- `support/` — `layout.tsx`, `support.css`, `_components/{ArticleBody, Breadcrumb}`, `_lib/{articles/, articles-data.json, data.ts}`, `categories/alerts/page.tsx`, `folders/[folder]/page.tsx`, `solutions/[slug]/page.tsx`
|
|
132
136
|
- `mockDatafeed.ts`, `types/css-imports.d.ts`
|
|
133
137
|
- Other: `.env`, `.gitignore`, `.impeccable/`, `.next/` (build out), `DESIGN.md`, `PRODUCT.md`, `README.md`, `next-env.d.ts`, `tsconfig.json`, `package.json.bak.`.
|
|
@@ -138,7 +142,7 @@ Next.js 15 + React 19 showcase. Private workspace package, depends on `astroneum
|
|
|
138
142
|
- **package.json scripts**: `clean`, `build:js` (tsup), `build:css` (sass → esbuild bundle/minify, inlines eot/ttf/woff/svg), `build` (clean + js + css), `typecheck` (`tsc --noEmit`), `test` (`tsx --test src/__tests__/*.test.ts`), `test:watch`, `lint` (`eslint src`), `size` (`size-limit`), `verify` (lint+typecheck+build+test), `prepublishOnly` (verify).
|
|
139
143
|
- **tsup.config.ts** — `format: ['esm']`, `dts: true`, `splitting: true`, `treeshake: true`, `target: 'esnext'`, `outDir: dist`, `external: ['react','react-dom','react-dom/client','react/jsx-runtime']`; esbuild `jsx: 'automatic'`, alias `@ → ./src`, loaders `.less → empty`, `.svg → text`; `onSuccess` walks `dist/` and prepends `'use client';` to every `.js`.
|
|
140
144
|
- **tsconfig.json** — `target/module: ESNext`, `moduleResolution: Bundler`, `jsx: preserve`, `jsxImportSource: @/jsx`, `paths: @/* → ./src/*`, `include: src`, `exclude: src/__tests__`, `noEmit: true` (typecheck only).
|
|
141
|
-
- **.size-limit.json** —
|
|
145
|
+
- **.size-limit.json** — 10 budgets (ignore react/react-dom): root `200 KB`; `headless` `80 KB` with all exports imported; `replay`/`multichart`/`script` `15 KB`; `watchlist`/`portfolio`/`alerts` `10 KB`; `datafeeds/polygon`/`datafeeds/crypto` `30 KB`.
|
|
142
146
|
- **eslint.config.js** — flat config.
|
|
143
147
|
- **Smoke scripts**: `check_dist.mjs` (imports `dist`, asserts `AstroneumChart`, `createStandardCryptoDatafeed`, `STANDARD_CRYPTO_SYMBOLS`); `check_datafeed.mjs` (searchSymbols + bounded history fetch).
|
|
144
148
|
|
|
@@ -201,6 +205,7 @@ ssh 72.62.73.180 "pm2 restart astroneum-demo"
|
|
|
201
205
|
| `plugin-development.md` | Plugin authoring guide | API signatures → `api.md` |
|
|
202
206
|
| `TODO.md` | Actionable function-gap backlog | Status authority → `tv-functions-skill.md` · Design → `TODO-DESIGN.md` |
|
|
203
207
|
| `TODO-DESIGN.md` | Design/layout gap backlog | Function gaps → `TODO.md` · Status authority → `tv-functions-skill.md` |
|
|
208
|
+
| `WORKSTREAMS.md` | Ownership, sequencing, dependencies, and handoffs | Feature status or detailed gap tables |
|
|
204
209
|
| `INDICATOR_COMPARISON.md` | Indicator parity table (50/50) | Other features → `tv-functions-skill.md` §3 |
|
|
205
210
|
| `demo/DESIGN.md` | Demo app design system | Library UX spec → `design-astroneum.md` |
|
|
206
211
|
| `demo/PRODUCT.md` | Product framing | Design system → `demo/DESIGN.md` |
|
|
@@ -227,5 +232,14 @@ This file is the source of truth for *where things live* in the deployed Astrone
|
|
|
227
232
|
|
|
228
233
|
## 12. Change log
|
|
229
234
|
|
|
235
|
+
- **2026-08-29** — Added the supported `@tony01/astroneum/headless` package entry, explicit optional built-in registration, validated host-owned bar replacement/update APIs, idempotent multi-instance lifecycle registry, SSR/package isolation tests, Chromium lifecycle smoke, and a dedicated size budget. Engine-level keyboard shortcuts moved out of the rendering core; the React host hook remains their owner.
|
|
236
|
+
- **2026-08-29** — Hardened the headless consumer boundary with React-independent typed study plugins, 16-output study/overlay browser coverage, bounded viewport capture/restore, loader and animation teardown guards, and GPU-inclusive screenshot compositing with browser pixel coverage.
|
|
237
|
+
- **2026-07-13** — Watchlist implementation and right-rail placement sync. Documented shipped `WatchlistManager` configuration/live-quote APIs, `Datafeed.getQuotes?`, Binance/Bitget/OKX snapshots, `watchlist.test.ts`, the 3-sub-tab watchlist panel, and the persistent 52px strip on the viewport's outer-right edge.
|
|
238
|
+
- **2026-07-12** — Watchlist parity spec. `WatchlistPanel` documented as 3-sub-tab container (Watchlist/Details/News) — Details+News folded from sidebar rail tabs into the panel. `watchlist` widget entry updated with spec'd `WatchlistManager` extensions (`moveSymbol`/`setSort`/`setColumns`/`setColor`/`updateQuotes`/`addSymbolFromInfo`) and `Datafeed.getQuotes?` optional polling method. `components/panels/` description updated. No structural change yet — spec only.
|
|
239
|
+
- **2026-07-11 (b)** — Synced DrawingBar Batch A and shell rail cleanup docs. `DrawingBar` is now the sole left rail; dead demo `term-rail`/`RailContent` removed. Added cursor submenu, measure, zoom, keep-drawing toggle, Ctrl+Alt+H hide-all, icon sizing fixes, and new draw i18n keys.
|
|
240
|
+
- **2026-07-12 (b)** ??? Forecasting group + popup clipping fix. 12 new drawing overlays in `src/extension/`. New `forecasting` group in `drawing-bar` with 3 section headers. 13 new SVG icons, 15 new i18n keys. Fixed popup clipping: `demo/terminal.css` overflow moved to `@media(max-height:620px)`. Extension count 20 to 32.
|
|
241
|
+
- **2026-07-12** — Dock/rail geometry pass. `TerminalShell` uses explicit chart/dock CSS Grid rows; the real library `DrawingBar` extends through the dock height while the dock is inset 52px to its right. The rail scrolls internally when its tools exceed a short viewport. Dock maximize is a fixed overlay and leaves chart/rail geometry unchanged.
|
|
242
|
+
- **2026-07-11** — Added TV-mirror workstream ledger, deterministic `src/strategy/` backtest core, bounded strategy script contract, terminal curtain/split-view layer, and sample Strategy Tester report.
|
|
243
|
+
- **2026-07-12** — Wired `PineEditorPanel` bounded strategy compilation through `ChartTerminal` and `AstroneumHandle.getDataList()` to `StrategyTesterPanel`. `DockContent` now owns persistent report tabs, report actions, overflow, resize, and maximize behavior.
|
|
230
244
|
- **2026-07-07** — Initial map generated from live `/opt/astroneum` snapshot: src/ (12 subdirs), demo/ Next.js app, build/tooling, nginx+PM2 topology, docs/meta. Noted: no `.git` on server; 3 overlapping nginx server blocks in `sites-enabled/`.
|
|
231
245
|
- **2026-07-07 (b)** — `src/widget/alert-modal` rewritten: now ships full Notifications UX (Webhook URL with SSRF guard + status writeback, in-app, toast, email, plain-text email, sound title/duration, notification schedule, message template, expiration, trigger frequency) using library `Modal`/`Input`/`Checkbox` primitives + `--astroneum-*` tokens. New i18n keys in `en-US.json` + `zh-CN.json` (other 16 locales fall back to en-US). Engine (`AlertManager`) + server relay (`demo/src/app/api/alerts/{webhook,email}/route.ts`) were already capable — this change exposes them in the chart-mounted widget. Also fixed `.alert-section-label` No-Eyebrow Rule violation (was `text-transform: uppercase`). design-astroneum.md section 12 updated.
|
package/docs/TODO-DESIGN.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Astroneum — Design TODO: Mirror TradingView Layout
|
|
2
2
|
|
|
3
3
|
> **Master index** of every TV UI surface → Astroneum design mirror. One row per layout element.
|
|
4
|
-
> **Last updated:** 2026-07-
|
|
4
|
+
> **Last updated:** 2026-07-12
|
|
5
5
|
> Pair with: `docs/TODO.md` (function gaps) · `docs/STRUCTURE.md` (where things live) · `docs/tv-functions-skill.md` (function catalog) · `docs/design-astroneum.md` (UX spec) · `INDICATOR_COMPARISON.md` (indicators)
|
|
6
6
|
> **Update on every UI/layout/design change** (see §Maintenance).
|
|
7
7
|
>
|
|
@@ -32,13 +32,13 @@
|
|
|
32
32
|
| # | TV region | TV container | Astroneum design | Inside function |
|
|
33
33
|
|---|---|---|---|---|
|
|
34
34
|
| 0.1 | Top toolbar (44px) | `#header-toolbar` | 🔧 `TerminalShell` topbar + `PeriodBar` — covers ~8/23 elements | |
|
|
35
|
-
| 0.2 | Left drawing rail (
|
|
35
|
+
| 0.2 | Left drawing rail (52px) | `#drawing-toolbar` | ✅ Library-owned `DrawingBar` is the sole left rail; it remains pinned through dock height and scrolls on short viewports | `DrawingBar` |
|
|
36
36
|
| 0.3 | Chart pane (center) | `layout__area--center` | ✅ `TerminalShell` chart slot + `<AstroneumChart>` | Canvas/WebGL render |
|
|
37
|
-
| 0.4 | Right rail toggle bar + panels (
|
|
38
|
-
| 0.5 | Bottom dock (tab bar, 220px, 240ms slide, persisted) | `#footer-chart-panel` | ✅
|
|
37
|
+
| 0.4 | Right rail toggle bar + panels (320px default, resizable 280–540px, 240ms slide) | `#right-toolbar` | 🔧 `TerminalShell` + `SidebarContent`: panel body opens left of the persistent outer-right 52px strip; 5 rail tabs; active-tab repeat collapses only the body; Watchlist contains Details/News sub-tabs; width now resizable via a drag handle (2026-07-13). **"Persisted" was previously claimed but is false** — `TerminalShell` does not read/write `localStorage` for sidebar/dock state; this remains an open gap, not yet corrected | `WatchlistPanel`, `AlertsPanel`, `TerminalShell` |
|
|
38
|
+
| 0.5 | Bottom dock (tab bar, 220px, 240ms slide, persisted) | `#footer-chart-panel` | ✅ Explicit CSS Grid dock row + `DockContent` persistent tab panels, resize handle, fixed-overlay maximize, collapse, report overflow/menu controls; dock begins right of the 52px rail | `PineEditorPanel`, `StrategyTesterPanel`, `TradingPanel` |
|
|
39
39
|
| 0.6 | Footer (date range navigator, 28px) | `withdateranges` | ✅ `DateRangeNavigator` — 7 presets (1D/1W/1M/3M/1Y/5Y/ALL) + live visible-range readout via `ChartPlugin` engine bridge | `DateRangeNavigator` |
|
|
40
40
|
|
|
41
|
-
> **Shell behavior (§4):** Sidebar
|
|
41
|
+
> **Shell behavior (§4):** Sidebar collapse uses grid columns; `term-workspace-main` uses explicit CSS Grid chart/dock rows (240ms, `--term-dur`) so the chart ends exactly at the dock boundary. The 52px library `DrawingBar` extends through the dock height; the dock is inset to its right. Dock maximize is a fixed overlay and does not reflow the chart or rail. Sidebar/dock open state, sizes, and maximize state persist per-user in `localStorage` key `astroneum-demo-workspace-shell`, separate from chart state. Below lg (1024px) the layout is chart-dominant: left rail hidden, sidebar + dock forced collapsed, topbar slimmed to brand + badges (symbol/timeframe live in the chart's `PeriodBar`). FAB overlay for the right rail is 🟦 v1.1.
|
|
42
42
|
|
|
43
43
|
## 1. Top toolbar — `#header-toolbar` → `design-astroneum.md` §5
|
|
44
44
|
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
| 1.2 | Switch data type (icon button) | `#header-toolbar-switch-data-type` | ❌ | |
|
|
49
49
|
| 1.3 | Compare symbols button | `#header-toolbar-compare` | 🟦 | |
|
|
50
50
|
| 1.4 | Timeframe radiogroup (1h/4h/D/W) | `#header-toolbar-intervals` | ✅ `PeriodBar` periods | `PeriodBar` |
|
|
51
|
-
| 1.5 | Chart interval dropdown (`,`) | `menuBtn-U9b0TAs4` |
|
|
51
|
+
| 1.5 | Chart interval dropdown (`,`) | `menuBtn-U9b0TAs4` | ✅ Primary periods in topbar + overflow dropdown (3m, 30m, 2H); `,` hotkey cycles all intervals | `ChartTerminal` |
|
|
52
52
|
| 1.6 | Chart style menu (Candles) | `#header-toolbar-chart-styles` | ✅ `ChartTypeDropdown` | `ChartTypeDropdown` |
|
|
53
53
|
| 1.7 | Indicators dialog button (`/`) | `data-name="open-indicators-dialog"` | ✅ `IndicatorModal` — `/` hotkey wired in `AstroneumChart.tsx` | `IndicatorModal` |
|
|
54
54
|
| 1.8 | Favorite indicators menu | `data-name="show-favorite-indicators"` | 🟦 v1.1 — needs an indicator-favorites model + menu | |
|
|
@@ -58,9 +58,9 @@
|
|
|
58
58
|
| 1.12 | Undo button | `#header-toolbar-undo-redo` | ✅ `UndoManager` + brand-bar button (disabled when empty) + `Ctrl+Z` wired in `ChartTerminal` | `UndoManager` |
|
|
59
59
|
| 1.13 | Redo button | `#header-toolbar-undo-redo` | ✅ `UndoManager` + brand-bar button + `Ctrl+Y` / `Ctrl+Shift+Z` wired in `ChartTerminal` | `UndoManager` |
|
|
60
60
|
| 1.14 | Fill-spacer (push right groups) | `fill-dlFDN0Zd` | ✅ CSS flex auto | |
|
|
61
|
-
| 1.15 | Layout setup (grid picker) | `#header-toolbar-layouts` | ✅ `LayoutPicker` in demo topbar — 1/2/4/8/16 grid | `LayoutPicker` |
|
|
62
|
-
| 1.16 | Save/Load button ("Unnamed" + state) | `#header-toolbar-save-load` | ✅ `SaveLoadMenu` —
|
|
63
|
-
| 1.17 | Manage layouts menu | `data-name="save-load-menu"` | ✅
|
|
61
|
+
| 1.15 | Layout setup (grid picker) | `#header-toolbar-layouts` | ✅ `LayoutPicker` in demo topbar — 1/2/4/8/16 grid, persisted with chart type and sync settings | `LayoutPicker` |
|
|
62
|
+
| 1.16 | Save/Load button ("Unnamed" + state) | `#header-toolbar-save-load` | ✅ `SaveLoadMenu` — named layouts with autosave and active-layout recovery via `ChartTemplateManager` | `SaveLoadMenu` |
|
|
63
|
+
| 1.17 | Manage layouts menu | `data-name="save-load-menu"` | ✅ `SaveLoadMenu` layout manager: save-as, load, rename, duplicate, timestamped rows, and confirmed delete | `SaveLoadMenu` |
|
|
64
64
|
| 1.18 | Quick search button (Ctrl+K) | `#header-toolbar-quick-search` | ✅ `CommandPalette` — symbol search + actions, Ctrl+K wired in demo | `CommandPalette` |
|
|
65
65
|
| 1.19 | Settings button | `#header-toolbar-properties` | ✅ `SettingModal` | `SettingModal` |
|
|
66
66
|
| 1.20 | Fullscreen button (Shift+F) | `#header-toolbar-fullscreen` | ✅ `PeriodBar` fullscreen — Shift+F hotkey wired in `AstroneumChart.tsx` | `PeriodBar` fullscreen |
|
|
@@ -72,34 +72,33 @@
|
|
|
72
72
|
|
|
73
73
|
| # | TV element | TV data-name | Astroneum design | Inside function |
|
|
74
74
|
|---|---|---|---|---|
|
|
75
|
-
| 2.1 | Cursors group (Cross default + submenu) | `linetool-group-cursors` |
|
|
75
|
+
| 2.1 | Cursors group (Cross default + submenu) | `linetool-group-cursors` | ✅ `DrawingBar` cursor group — Cross/Dot/Arrow/Eraser submenu + `onCursorChange` sets CSS cursor | `DrawingBar` |
|
|
76
76
|
| 2.2 | Trendline + Trend tools submenu | `linetool-group-trend-line` | 🔧 `singleLine` group | |
|
|
77
|
-
| 2.3 | Fib retracement + Gann/Fib submenu | `linetool-group-gann-and-fibonacci` |
|
|
77
|
+
| 2.3 | Fib retracement + Gann/Fib submenu | `linetool-group-gann-and-fibonacci` | ✅ `fibonacci` group — 11 tools: `fibonacciLine` (Retracement), `fibonacciSegment`, `fibonacciCircle`, `fibonacciSpiral`, `fibonacciSpeedResistanceFan`, `fibonacciExtension`, `fibonacciChannel`, `fibonacciWedge`, `fibonacciTimeZones`, `fibonacciArcs`, `fibonacciFan`, plus `gannBox`, `gannFan`, `pitchfork` | `DrawingBar` |
|
|
78
78
|
| 2.4 | XABCD pattern + Patterns submenu | `linetool-group-patterns` | 🔧 `wave` group — missing Cypher, Crab, Bat, Butterfly, Three Drives, Elliott Impulse | |
|
|
79
|
-
| 2.5 | Long position + Forecasting submenu | `linetool-group-prediction-and-measurement` |
|
|
80
|
-
| 2.6 | Brush + Geometric shapes submenu | `linetool-group-geometric-shapes` | 🔧 `polygon` group
|
|
81
|
-
| 2.7 | Text + Annotation submenu | `linetool-group-annotation` |
|
|
79
|
+
| 2.5 | Long position + Forecasting submenu | `linetool-group-prediction-and-measurement` | ✅ `DrawingBar` forecasting group - 12 tools in 3 sections (Forecasting, Volume-based, Measurers) with section headers. Overlays in `src/extension/`: `longPosition`, `shortPosition`, `positionForecast`, `barsPattern`, `ghostFeed`, `sector`, `anchoredVwap`, `fixedRangeVolumeProfile`, `anchoredVolumeProfile`, `priceRange`, `dateRange`, `dateAndPriceRange` | `DrawingBar` forecasting group |
|
|
80
|
+
| 2.6 | Brush + Geometric shapes submenu | `linetool-group-geometric-shapes` | 🔧 `polygon` group (circle, rect, triangle, parallelogram) ??? popup now visible after clipping fix. Missing: Brush, Ellipse, Polygon, Polyline | |
|
|
81
|
+
| 2.7 | Text + Annotation submenu | `linetool-group-annotation` | ✅ `DrawingBar` annotation group with `simpleAnnotation` text tool | `DrawingBar` |
|
|
82
82
|
| 2.8 | Icon + Icons submenu (font icons) | `linetool-group-font-icons` | ❌ | |
|
|
83
|
-
| 2.9 | Measure button (Shift+Click) | `data-name="measure"` |
|
|
84
|
-
| 2.10 | Zoom in button | `data-name="zoom"` |
|
|
83
|
+
| 2.9 | Measure button (Shift+Click) | `data-name="measure"` | ✅ `DrawingBar` measure button + Shift+Click on chart canvas | `measure` |
|
|
84
|
+
| 2.10 | Zoom in button | `data-name="zoom"` | ✅ `DrawingBar` zoom button — `zoomAtCoordinate(1.2, center)` | `DrawingBar` |
|
|
85
85
|
| 2.11 | Magnet mode button (Ctrl) | `data-name="magnet-button"` | ✅ `DrawingBar` magnet + `DrawingSnapper` | `DrawingSnapper` |
|
|
86
|
-
| 2.12 | Keep drawing (sticky) button | `data-name="drawginmode"` |
|
|
86
|
+
| 2.12 | Keep drawing (sticky) button | `data-name="drawginmode"` | 🔧 `DrawingBar` keepDrawing toggle exists; re-trigger on drawing-end deferred until engine event support | `DrawingBar` |
|
|
87
87
|
| 2.13 | Lock all drawings button | `data-name="lockAllDrawings"` | ✅ `DrawingBar` lock + `lockAllDrawings()` | `lockAllDrawings()` |
|
|
88
|
-
| 2.14 | Hide all drawings button (Ctrl+Alt+H) | `data-name="hide-all"` |
|
|
88
|
+
| 2.14 | Hide all drawings button (Ctrl+Alt+H) | `data-name="hide-all"` | ✅ `DrawingBar` visible toggle + `Ctrl+Alt+H` in `hooks.ts` | `DrawingBar` |
|
|
89
89
|
| 2.15 | Remove objects button | `data-name="removeAllDrawingTools"` | ✅ `DrawingBar` remove | |
|
|
90
90
|
| 2.16 | Favorite drawings toolbar toggle | `#drawing-toolbar-favorite-drawings` | ❌ | |
|
|
91
91
|
|
|
92
92
|
## 3. Right rail — `#right-toolbar` toggle bar + panels → `tv-functions-skill.md` §3.17
|
|
93
93
|
|
|
94
|
-
TV's right rail is a **vertical toggle bar** (`#right-toolbar`, 11 buttons) that switches which panel shows. Astroneum
|
|
94
|
+
TV's right rail is a **vertical toggle bar** (`#right-toolbar`, 11 buttons) that switches which panel shows. Astroneum mirrors this with a 52px sidebar strip and collapses only its panel body on desktop.
|
|
95
95
|
|
|
96
96
|
### 3a. Right toolbar toggle bar
|
|
97
97
|
|
|
98
98
|
| # | TV element | data-name | Astroneum design | Inside function |
|
|
99
99
|
|---|---|---|---|---|
|
|
100
|
-
| 3.1 | Vertical toggle bar container | `#right-toolbar` |
|
|
101
|
-
| 3.
|
|
102
|
-
| 3.2 | Watchlist/details/news toggle (active) | `base` | ✅ `WatchlistPanel` — toggle button in `term-sidebar-strip` | `WatchlistPanel` |
|
|
100
|
+
| 3.1 | Vertical toggle bar container | `#right-toolbar` | ✅ `term-sidebar-strip` is the persistent 52px outer-right rail with 5 icon+label tabs; the panel body opens immediately to its left | `SidebarContent`, `TerminalShell` |
|
|
101
|
+
| 3.2 | Watchlist/details/news toggle (active) | `base` | ✅ Watchlist toggle lives in the persistent outer rail; Watchlist / Details / News are sub-tabs inside the adjacent panel | `WatchlistPanel` |
|
|
103
102
|
| 3.3 | Alerts toggle | `alerts` | ✅ `AlertsPanel` — toggle button in `term-sidebar-strip` | `AlertsPanel` |
|
|
104
103
|
| 3.4 | Object tree + data window toggle | `object_tree` | ❌ | |
|
|
105
104
|
| 3.5 | Chats toggle | `union_chats` | ⟫ | |
|
|
@@ -115,13 +114,29 @@ TV's right rail is a **vertical toggle bar** (`#right-toolbar`, 11 buttons) that
|
|
|
115
114
|
|
|
116
115
|
### 3b. Watchlist panel content (when 3.2 active)
|
|
117
116
|
|
|
117
|
+
The watchlist panel is a 3-sub-tab container (Watchlist / Details / News). The Watchlist sub-tab contains the symbol lists; Details and News are sub-tabs inside the same panel (B1 restructure).
|
|
118
|
+
|
|
118
119
|
| # | TV element | Astroneum design | Inside function |
|
|
119
120
|
|---|---|---|---|
|
|
120
|
-
| 3.15 |
|
|
121
|
-
| 3.16 | Add/remove symbol | ✅ | `WatchlistManager` |
|
|
122
|
-
| 3.17 | Reorder (drag rows) |
|
|
123
|
-
| 3.18 | Details panel (OHLC + P&L + desc) | 🔧
|
|
124
|
-
| 3.19 | Highlight selected row | ✅ | |
|
|
121
|
+
| 3.15 | List selector (switch/create/rename/delete/duplicate/export/color) | ✅ Rebuilt 2026-07-13 to match TV's actual anatomy — a single list-selector button (name + chevron) opens one dropdown menu with all list actions, replacing the previous simultaneous-tabs header (`tv-mirror-reference/watchlist.md` §3 documents TV showing exactly one active list at a time, not tabs) | `WatchlistManager` |
|
|
122
|
+
| 3.16 | Add/remove symbol | ✅ `SymbolSearchModal` validates additions; row context menu removes symbols | `WatchlistManager`, `SymbolSearchModal` |
|
|
123
|
+
| 3.17 | Reorder (drag rows) | 🔧 Same-list row drag shipped via `reorderSymbols`. Cross-list drag-and-drop was removed with the tabs header (TV itself does not expose this either since only one list renders at a time); moving a symbol to another list is done through the row context menu's "Move to" action instead — no capability lost, only the affordance changed | `WatchlistManager.reorderSymbols/moveSymbol` |
|
|
124
|
+
| 3.18 | Details panel (OHLC + P&L + desc) | 🔧 Details sub-tab ships live OHLC and symbol metadata; fundamentals and P&L await data sources (🟦 v1.1) | `DetailsPanel` |
|
|
125
|
+
| 3.19 | Highlight selected row | ✅ Indigo tint + 1px inset signal; numeric columns use tabular figures | `WatchlistPanel` |
|
|
126
|
+
| 3.20 | Last price column | ✅ Right-aligned live last price with precision metadata and `—` fallback | `WatchlistPanel` |
|
|
127
|
+
| 3.21 | Column header + sort | ✅ Sticky accessible headers toggle persisted ascending/descending sort | `WatchlistManager.setSort` |
|
|
128
|
+
| 3.22 | Row context menu (right-click) | 🔧 Copy, Add alert, Move, and Remove ship with keyboard invocation; inferred Hide/Lock actions remain | `WatchlistPanel` |
|
|
129
|
+
| 3.23 | Header toolbar actions | ✅ Rebuilt 2026-07-13 to TV's 4-control anatomy: list selector, Add symbol, Advanced view, Settings — matches `tv-mirror-reference/watchlist.md` §3 control inventory exactly; list actions (Rename/Duplicate/Export JSON/color/Delete) live inside the list-selector dropdown | `WatchlistPanel` |
|
|
130
|
+
| 3.24 | Empty-state CTA | ✅ Factual empty state and primary Add symbol action open validated search | `WatchlistPanel` |
|
|
131
|
+
| 3.25 | Cross-list drag | ✅ Symbol rows move to another list through visible tab drop targets | `WatchlistManager.moveSymbol` |
|
|
132
|
+
| 3.26 | Per-list color dot | ✅ Six-color list identity palette persists through `setColor` | `WatchlistManager.setColor` |
|
|
133
|
+
| 3.27 | Advanced/Simple view toggle | ✅ Simple and Advanced column presets persist per list | `WatchlistPanel` |
|
|
134
|
+
| 3.28 | Column chooser popover (gear) | ✅ Name/Last/Chg/Chg%/Vol/Open checkboxes, reset, outside click, and Escape ship | `WatchlistManager.setColumns` |
|
|
135
|
+
| 3.29 | Live quote polling | ✅ Visible active list polls every 2s; polling pauses with the sidebar or sub-tab hidden | `Datafeed.getQuotes?`, `WatchlistManager.updateQuotes` |
|
|
136
|
+
| 3.30 | No-matches + quote-error + retry | ✅ Search owns no-match state; quote failure shows `—`, a status banner, and Retry | `WatchlistPanel` |
|
|
137
|
+
| 3.31 | Details sub-tab (OHLC + desc) | ✅ Details is folded into the watchlist panel; fundamentals/P&L remain 🟦 v1.1 | `DetailsPanel` |
|
|
138
|
+
| 3.32 | News sub-tab | ✅ News is folded into the panel with an honest provider-dependent empty state | `WatchlistPanel` |
|
|
139
|
+
| 3.33 | Section group headers | ✅ `WatchSymbol.group?` field renders non-interactive divider rows (e.g. "US STOCK") that collapse/expand via a chevron (component-level UI state, not persisted); TV's own section collapse state was `not captured` so persistence semantics remain unverified | `WatchlistManager`, `WatchlistPanel` |
|
|
125
140
|
|
|
126
141
|
## 4. Bottom dock — `#footer-chart-panel` tab bar → `tv-functions-skill.md` §3.13/3.15/3.20
|
|
127
142
|
|
|
@@ -129,15 +144,15 @@ TV's bottom dock is a **tab bar** with strategy report tabs + open/maximize togg
|
|
|
129
144
|
|
|
130
145
|
| # | TV element | data-name / qa-id | Astroneum design | Inside function |
|
|
131
146
|
|---|---|---|---|---|
|
|
132
|
-
| 4.1 | Tab bar container | `#footer-chart-panel` | ✅ `TerminalShell` dock
|
|
133
|
-
| 4.2 | Strategy report tab (icon + title + context menu) | `data-qa-id="backtesting"` | ✅ `StrategyTesterPanel`
|
|
134
|
-
| 4.3 | Tab context menu (rename/close/duplicate) | `data-qa-id="tab-menu-trigger"` |
|
|
135
|
-
| 4.4 | "More tabs" button (3 dots) | `menuButtonWrap-jogw41q5` |
|
|
147
|
+
| 4.1 | Tab bar container | `#footer-chart-panel` | ✅ `TerminalShell` `term-workspace-main` is a **CSS Grid** (`grid-template-rows: minmax(0,1fr) var(--term-dock-h)`), not flexbox — a `flex-basis: calc(100% - var(--term-dock-h))` attempt on `.term-chart` proved unreliable (percentage flex-basis against a nested flex container's indefinite height silently miscomputed, letting the dock render as a translucent overlay bleeding over the live chart candles). Playwright-measured after the grid fix: chart's bottom edge (`y+height`) exactly equals the dock's top edge (`y`), 0px gap, and `elementFromPoint` inside the dock's tab bar resolves to the dock button, never the chart. `DockContent`'s dock is inset by the library's own drawing-rail width via `margin-left` keyed off the library's existing `data-drawing-bar-visible` attribute — no extra spacer element, and the dock never sits under the rail or the right sidebar. The rail's ~14 icons can still need more height than a short viewport provides — `.astroneum-drawing-bar` scrolls (`overflow-y:auto`, app-level override) and its icon gap/padding were tightened at the source (`src/widget/drawing-bar/index.scss`: `$gap` 4px→2px, `padding-bottom` added, redundant first-item margin removed) | `DockContent` |
|
|
148
|
+
| 4.2 | Strategy report tab (icon + title + context menu) | `data-qa-id="backtesting"` | ✅ `StrategyTesterPanel` receives the compiled strategy's runtime `BacktestResult`; Summary/Performance/Trades/Equity/Properties are live | `StrategyTesterPanel` |
|
|
149
|
+
| 4.3 | Tab context menu (rename/close/duplicate) | `data-qa-id="tab-menu-trigger"` | ✅ Report tabs support Rename / Duplicate / Close; Pine and Trading remain permanent | `DockContent` |
|
|
150
|
+
| 4.4 | "More tabs" button (3 dots) | `menuButtonWrap-jogw41q5` | ✅ `DockContent` lists every dock tab from an accessible More menu | `DockContent` |
|
|
136
151
|
| 4.5 | Open panel toggle (chevron) | `toggle-visibility-button` | ✅ `DockContent` collapse toggle (`term-icon-btn`) | `DockContent` |
|
|
137
|
-
| 4.6 | Maximize panel toggle | `toggle-maximize-button` |
|
|
152
|
+
| 4.6 | Maximize panel toggle | `toggle-maximize-button` | ✅ `DockContent` maximizes/restores the dock as a `position:fixed` overlay. Because chart/dock are now explicit CSS Grid rows (not flexbox), the dock's row keeps reserving its own space in `.term-workspace-main`'s track structure even while the dock is taken out of flow — Playwright-measured to confirm the chart and the library's own left drawing rail are byte-identical before/during/after maximize, including while dock popups (More tabs, report tab menu) are open | `TerminalShell` |
|
|
138
153
|
| 4.7 | Pine Editor tab | (when Pine open) | ✅ `PineEditorPanel` — tab in `term-dock-tabs` | `PineEditorPanel` |
|
|
139
154
|
| 4.8 | Trading Panel tab | (when broker connected) | ✅ `TradingPanel` stub — tab present, content is empty state | `TradingPanel` |
|
|
140
|
-
| 4.9 | Resize handle (dock height) | ❌ | |
|
|
155
|
+
| 4.9 | Resize handle (dock height) | ❌ | ✅ Pointer resize handle, bounded 120–480px | `DockContent` |
|
|
141
156
|
|
|
142
157
|
## 5. Chart pane overlays → `design-astroneum.md` §11
|
|
143
158
|
|
|
@@ -167,10 +182,10 @@ TV's bottom dock is a **tab bar** with strategy report tabs + open/maximize togg
|
|
|
167
182
|
|---|---|---|---|
|
|
168
183
|
| 7.1 | Indicators dialog | ✅ `IndicatorModal` | `IndicatorModal` |
|
|
169
184
|
| 7.2 | Indicator settings (Inputs/Style/Visibility) | 🔧 `IndicatorSettingModal` partial | |
|
|
170
|
-
| 7.3 | Alert dialog | ✅ `AlertModal` | `AlertModal` |
|
|
185
|
+
| 7.3 | Alert dialog | ✅ canonical `AlertModal` used by chart chrome and terminal alert panel | `AlertModal` |
|
|
171
186
|
| 7.4 | Chart settings / properties | ✅ `SettingModal` | `SettingModal` |
|
|
172
187
|
| 7.5 | Screenshot | ✅ `ScreenshotModal` | `ScreenshotModal` |
|
|
173
|
-
| 7.6 | Symbol search |
|
|
188
|
+
| 7.6 | Symbol search | 🔧 `SymbolSearchModal` — rewritten 2026-07-13: 840px, 11 asset tabs, 4-cell rows, 200ms debounce, request-id race fix, token-driven styling (was hardcoded hex), initial focus on the search input (was the close button). **No automated visual regression yet** — verified by CDP-observed style values and manual build check only, not a screenshot diff gate | `SymbolSearchModal` |
|
|
174
189
|
| 7.7 | Timezone | ✅ `TimezoneModal` | `TimezoneModal` |
|
|
175
190
|
| 7.8 | Script editor (Pine) | ✅ `ScriptEditorModal` | `ScriptEditorModal` |
|
|
176
191
|
| 7.9 | Layout templates manager | ❌ | |
|
|
@@ -207,10 +222,10 @@ TV's bottom dock is a **tab bar** with strategy report tabs + open/maximize togg
|
|
|
207
222
|
| 10.1 | Hashed class names (`button-HdKhcTye`) | ✅ `--astroneum-*` tokens (intentional) | |
|
|
208
223
|
| 10.2 | TV dark palette | ✅ `design-astroneum.md` §2 | |
|
|
209
224
|
| 10.3 | Typography (Trebuchet MS + Inter) | ✅ `design-astroneum.md` §3 | |
|
|
210
|
-
| 10.4 | Motion (
|
|
225
|
+
| 10.4 | Motion (state-only) | design-astroneum.md section 7 | Menus, dialogs, curtains, and split views use bounded 100-240ms state motion; chart data is immediate. |
|
|
211
226
|
| 10.5 | Light theme | ⟫ | |
|
|
212
227
|
| 10.6 | High-contrast theme | ✅ | `theme="high-contrast"` |
|
|
213
|
-
| 10.7 |
|
|
228
|
+
| 10.7 | 18 locale JSON files | 🔧 16 fall back to en-US for new keys | |
|
|
214
229
|
|
|
215
230
|
---
|
|
216
231
|
|
|
@@ -252,6 +267,18 @@ On invocation ("refresh design todo"), re-scan live tree (`src/widget/`, `src/ex
|
|
|
252
267
|
---
|
|
253
268
|
|
|
254
269
|
## Changelog
|
|
270
|
+
- **2026-07-13 (c)** — Symbol Search + Watchlist real UX/UI mirror (supersedes the CSS-only reskin done immediately before this entry in the same day). Root-caused via a three-agent audit: prior passes changed colors/spacing without fixing the underlying component contracts, so visual work kept regressing. This pass fixes primitives and structure first: `Modal` gains `initialFocus`/`className` (search input now receives focus, not the close button); `Input` forwards native attrs (`role`, `aria-label`, `autoFocus`, `onKeyDown`, ref) instead of only `value`/`onChange`; removed a hardcoded TradingView-blue (`#2962ff`) focus glow, now `--astroneum-primary-color`. `SymbolSearchModal`: fixed a debounce race (shared boolean to monotonic request id), replaced a global `document.querySelector` with a scoped callback ref, added real i18n copy for loading/empty/no-results (was `...` and a blank div), moved the search icon to a prefix (matches captured DOM) with a clear-button suffix, marked the unbuilt "More" tab `aria-disabled` instead of a fake-clickable button, and restyled with `--astroneum-*` tokens (previously hardcoded hex broke the high-contrast theme). Watchlist header rebuilt to TV's actual anatomy — one list selector (name + chevron + dropdown) plus Add symbol / Advanced view / Settings — replacing the prior simultaneous 5-tab-plus-4-icon header that had no TV equivalent; list actions (rename/duplicate/export/color/delete) folded into the selector's dropdown. Cross-list tab drag removed (TV doesn't have it either, since only one list renders at a time); "Move to list" via the row context menu remains the supported path. Added collapsible group headers (`WatchSymbol.group?`, chevron toggle, component-level state, not persisted). Rewrote `panels.css`'s watchlist section from hardcoded hex to `--term-*` tokens (was silently broken under the high-contrast theme). Widened the default sidebar 260 to 320px and wired a previously-declared-but-unused resize handle (`--term-sidebar-min/max` tokens existed with no drag handle behind them) so Advanced view remains reachable. **Known gap, stated honestly per the audit's core finding**: no automated visual-regression gate exists yet; this pass is verified by `pnpm verify` (lint/typecheck/build/38 tests, local and server), a demo production build, and CDP-observed computed-style comparison against live TradingView — not a screenshot-diff CI gate. That gate is not built in this pass. Committed to git on both local and server (local `c14a88c`, server `4bfe8fd`, identical tree diff) instead of editing an already-dirty server tree directly, per the audit's single-source-of-truth finding — a full reset was not performed because the server carries other legitimate in-progress work outside this task's scope.
|
|
271
|
+
- **2026-07-13** — Symbol Search + Watchlist mirror plan. CDP inspection (port 9223, chart `8Wh6yRIo`) captured live DOM for both surfaces. Symbol Search: 840px dialog, 11 asset-class tabs, 4-cell result rows (ticker/description/exchange/actions), footer "Search using ISIN and CUSIP codes". Watchlist: row DOM inside `[data-name="symbol-list-wrap"]`, section group headers ("US STOCK" plain-text dividers), details buttons. Updated §7.6 (✅→🔧, rewrite planned), added §3.33 (section group headers ⏳), updated §11.10 (??→🔧). Plan written to `docs/MIRROR-PLAN-SYMBOL-SEARCH-WATCHLIST.md`. Reference docs updated: `tv-mirror-reference/structure.md` §4.1, `tv-mirror-reference/watchlist.md` §2.4/§3/§8, `tv-mirror-reference/README.md` evidence table.
|
|
272
|
+
- **2026-07-13** — Right-rail placement fix. Reordered `SidebarContent` so the panel body opens to the left of the persistent 52px strip and the strip remains pinned to the viewport's outer-right edge, matching the reference workspace. Moved the separator to the strip's left edge and kept the collapsed rail interactive while making the hidden body inert.
|
|
273
|
+
- **2026-07-13** — §3b watchlist implementation. Replaced collapsible groups with one-active-list tabs and overflow; added dense sticky quote columns, per-list sorting/settings/colors, Simple/Advanced presets, validated search, empty/error/retry states, context actions, cross-list symbol drag, and keyboard row selection. Folded Details and News into panel sub-tabs and reduced the rail to five items. Live snapshots poll Binance/Bitget/OKX every 2s while visible. Remaining: list-tab drag reorder, inferred Hide/Lock actions, fundamentals/P&L, and news-provider integration.
|
|
274
|
+
- **2026-07-12** — Watchlist reference enhancement. Added `tv-mirror-reference/watchlist.md` as the dedicated behavioral reference for the Watchlist right panel: anatomy (rail toggle → list selector → header toolbar → sortable column header → symbol rows → section groups → Details sub-view), control inventory (`watchlist.list_selector`, `watchlist.add_symbol`, `watchlist.advanced_view`, `watchlist.settings`, `watchlist.section_toggle`, `watchlist.column_header`, `watchlist.row`, `watchlist.row_context_menu`, `watchlist.details_metrics`, `watchlist.details_more_seasonals`, `watchlist.details_more_technicals`), sortable-column and quote-state model, selector contract, responsive behavior, WCAG AA recommendations, and a `not captured` gaps list. Grounded in `button-scan.json` (header controls `observed`; row DOM, row context menu, list-menu contents, settings/column-chooser contents, Advanced-view presets, section groups, Details metrics grid, and News sub-view `not captured`). Cross-linked from `tv-mirror-reference/README.md`, `structure.md` 2.4, `tradingview-buttons.md` 6, `interactions.md` 6.1, `audit-results.md`; and from `docs/tv-functions-skill.md` 3.17, `docs/TODO-DESIGN.md` evidence line, `docs/design-astroneum.md` 13, `docs/WORKSTREAMS.md`. Pure documentation change to the read-only evidence corpus — no library/demo code, no `pnpm verify` or deploy.
|
|
275
|
+
- **2026-07-12** — §3b watchlist full TV parity spec. Researched against `tv-mirror-reference/structure.md` (`sidebar.watchlist` nested controls: Add symbol, advanced view, settings, sorting), `interactions.md` (empty-state + sort/column/no-matches contracts), and `design-astroneum.md §5 Watchlist Row`. Three-tier plan: Tier 1 (A1-A8 pure UI: list tabs, last price column, column header + sort, row context menu, header toolbar actions, empty-state CTA, cross-list drag, per-list color dots); Tier 2 (B1 fold Details+News into watchlist panel as sub-tabs — sidebar strip 7→5 tabs; B2 Advanced/Simple view toggle; B3 column chooser popover); Tier 3 (C1 `Datafeed.getQuotes?` optional method + 2s quote polling paused when sidebar collapsed; C2 `SymbolSearchModal` replaces text input — validates against `searchSymbols`; C3 no-matches + quote-error + retry states; C4 fundamentals/P&L deferred 🟦 v1.1). `WatchlistManager` gains `moveSymbol` / `setSort` / `setColumns` / `setColor` / `updateQuotes` / `addSymbolFromInfo`. `Datafeed` interface gains optional `getQuotes?(tickers: string[]): Promise<QuoteSnapshot[]>`. Updated §0.4 (7→5 tabs), §3.1 (7→5 tabs), §3.2 (3-sub-tab container), §3.15-3.19 (⏳), added §3.20-3.32 (new rows), §11.9 (quote polling spec'd), §11.17 (row context menu spec'd). All new rows marked ⏳ (spec'd, not yet built). Pair with `design-astroneum.md §4/§5` updates + `TODO.md` function gap rows.
|
|
276
|
+
- **2026-07-12** — Rail/dock geometry fix. Replaced nested-flex percentage sizing with explicit `term-workspace-main` CSS Grid rows, eliminating dock translucency/chart bleed. Extended the real `DrawingBar` through the dock height while keeping the dock 52px to its right; the rail scrolls internally when necessary. Dock maximize is now a fixed overlay with grid space retained, so the chart and rail do not reflow. Verified with Playwright geometry checks and screenshot.
|
|
277
|
+
- **2026-07-12** — §4 bottom dock completion. Added persistent tab panels, keyboard tab navigation, report-tab Rename/Duplicate/Close and More menus, dock resize (120–480px), maximize/restore, and a compiled strategy -> `getDataList()` -> `BacktestResult` handoff. Strategy reports now use runtime data and show expected payoff, Sharpe, and Sortino; trade markers and broker execution remain separate workstreams.
|
|
278
|
+
- **2026-07-12** — §3 right rail pass. Calendar, News, and Ideas now stay in the sidebar as honest empty states instead of opening the generic curtain. Watchlists now support rename and drag reordering for lists and symbols through the existing persisted `WatchlistManager` APIs. Added `DetailsPanel`, supplied with the active symbol and latest OHLC candle from `ChartTerminal`; fundamentals and position P&L remain datafeed-dependent. Selected rows now use the 2px accent edge. Corrected the duplicate 3.1 row and updated 3.15–3.18.
|
|
279
|
+
- **2026-07-11 (b)** — Removed dead `term-rail` from `TerminalShell`. The 60px left rail (`RailContent()` in `ChartTerminal.tsx`) was a Phase 1 placeholder with 7 non-functional buttons (cursor/watchlist/alerts/data/strategy/pine/trading) that only set local state — no panel opened, no cursor changed. All entries duplicated existing functional surfaces (sidebar tabs + dock tabs). Semantically wrong position too: TV panel toggles belong on the right rail, not left. Removed: `RailContent()` function, `rail` prop from `TerminalShell`, all `.term-rail*` CSS rules, `--term-rail-w` token from `globals.css`, grid-template-areas/columns updated from 3-col to 2-col. Cleaned 4 unused Icon components (Cursor/Data/Strategy/Pine). **0.2 promoted to ✅** — `DrawingBar` is now the sole left rail. Demo rebuilt + restarted, verified (HTTP 200, no `term-rail*` in SSR HTML, PM2 clean).
|
|
280
|
+
- **2026-07-12** ??? §2.5 forecasting group + popup clipping fix. Built 12 new drawing overlays in `src/extension/`. New `forecasting` group in `DrawingBar` with 3 section headers (Forecasting, Volume-based, Measurers) using `isHeader` on `SelectDataSourceItem`. 13 new SVG icons. 15 new i18n keys. Fixed popup clipping: `demo/terminal.css` `.astroneum-drawing-bar` overflow moved to `@media(max-height:620px)`. `pnpm verify` passes (35/35 tests). Deployed + verified (HTTP 200, SSR HTML has `draw.forecasting`, no PM2 errors).
|
|
281
|
+
- **2026-07-11** — §2 left drawing toolbar Batch A: bug fixes + Tier 1 quick wins. **Bug fixes:** (1) SCSS `.icon-overlay` class mismatch — replaced inline `style={{32x32}}` with `className="icon-overlay"` on all DrawingBar spans (hover/`.selected` visual states now functional). (2) Missing `groupId: DRAWING_GROUP_ID` on submenu item `onDrawingItemClick` calls — submenu-launched overlays now properly group-tagged. (3) `Escape` key in `hooks.ts` was nuking ALL drawings (`removeOverlay({groupId})`) — now only cancels the in-progress drawing via `currentStep > 0` check + `removeOverlay({id})`. (4) Magnet snap wiring confirmed: engine `OverlayView.ts:346-380` already snaps to OHLC when `mode` is `weak_magnet`/`strong_magnet`; `snapToOhlc`/`snapAngle` in `DrawingSnapper.ts` are utility exports (engine handles runtime snapping natively). **New features:** **2.1** Cursors group — Cross/Dot/Arrow/Eraser submenu, `onCursorChange` sets CSS cursor. **2.9** Measure button — orphaned `measure.ts` extension wired to DrawingBar + Shift+Click on chart canvas. **2.10** Zoom in button — `zoomAtCoordinate(1.2, center)`. **2.12** Keep drawing toggle — UI toggle (re-trigger on drawing-end deferred, no engine event). **2.14** Ctrl+Alt+H — toggles `overrideOverlay({groupId, visible})`. New i18n keys + 7 new SVG icons. Icon sizing fixed: `.icon-overlay` 52x38 hit area, inner SVGs 28px. Library + demo rebuilt, deployed, verified (HTTP 200, SSR HTML has `draw.cursor`/`draw.measure`/`draw.zoom`/`draw.keep_drawing`, PM2 error log empty). Remaining: 2.3/2.4/2.6 stay partial (Batch B), 2.5/2.7/2.8/2.16 stay missing (Tier 3).
|
|
255
282
|
- **2026-07-10** - §1.1 Symbol Search parity pass. PeriodBar symbol trigger now uses title(symbol_search), data-semantic-id(header.symbol_search), and apply-common-tooltip; responsive compact behavior added in period-bar/index.scss (hide symbol text at max-width:600px). Updated §1.1 + §9.5.
|
|
256
283
|
|
|
257
284
|
- **2026-07-08 (d)** — §1 top toolbar: undo/redo + save/load batch (demo-side, no library/`tsup`). **1.12/1.13 ⚠️→✅** — `UndoManager` wired: brand-bar undo/redo buttons (disabled when stack empty) + `Ctrl+Z` / `Ctrl+Y` / `Ctrl+Shift+Z` in `ChartTerminal`'s hotkey `useEffect` (input-field guard so Pine editor/save-prompt aren't hijacked). `record()` via a 600ms poll — `drawing-end` is not emitted (the `EventBus` is defined but never instantiated, and `ActionType` has no overlay action), so mutations are captured by polling `record()` which no-ops when overlays are unchanged (`serializeState` excludes candle data, so cheap); baseline seeded on mount. **1.16/1.17 🔧/❌→✅ + 1.9 🔧→✅** — folded into one `SaveLoadMenu.tsx` (new) backed by `ChartTemplateManager`: "Unnamed" label + Save-as / Load / Clear-drawings / Delete dropdown. **1.5** stays 🔧 — deferred to a library `PeriodBar` pass (overflow dropdown + `,` hotkey). **1.8** ❌→🟦 v1.1 (favorites model). **1.22** ❌→⟫ (mobile). New `terminal.css` `.term-menu*` + `:disabled` rules. Library `hooks.ts` left untouched (Ctrl+Z comment stays — undo is demo-owned, consistent with `/`/`Alt+A`/`Shift+F`). Built (6.2s, types valid) + restarted + verified (HTTP 200, undo button SSR-rendered disabled, PM2 error log empty).
|
|
@@ -259,3 +286,50 @@ On invocation ("refresh design todo"), re-scan live tree (`src/widget/`, `src/ex
|
|
|
259
286
|
- **2026-07-08 (b)** — §1 top toolbar audit + build. Three hotkeys wired at library level in `AstroneumChart.tsx` (modal-toggle `useEffect`): 1.7 `/` (indicators), 1.10 `Alt+A` (alerts), 1.20 `Shift+F` (fullscreen) — promoted 🔧→✅. Built **1.18 Quick Search (Ctrl+K)** — `CommandPalette.tsx` in demo: symbol search + timeframe switch + action toggles, `Ctrl+K` listener in `ChartTerminal`. Found 1.15 LayoutPicker stale (already built) — promoted 🟦→✅. Also patched `AstroneumHandle` `useImperativeHandle` (local clone was behind server — missing `createIndicator`/`removeIndicator`/`createOverlay`/`removeOverlay`/`getDataList`/`setData`/`resize`). Library + demo rebuilt, deployed, verified (HTTP 200). Remaining §1 gaps: 1.5 (`,` interval dropdown), 1.16 (save/load UI), 1.12/1.13 (undo/redo buttons), 1.2/1.8/1.17/1.22 (missing).
|
|
260
287
|
- **2026-07-08** — §0 shell regions audit + build. Found server demo ahead of doc: right-rail toggle bar (`SidebarContent` `term-sidebar-strip`, 7 tabs) and bottom-dock tab bar (`DockContent` `term-dock-tabs`, 3 tabs + collapse) already shipped — promoted 0.4, 0.5, 3.1, 3.2, 3.3, 4.1, 4.2, 4.5, 4.7, 4.8 from 🔧/❌ to ✅. Built the one genuinely-missing shell piece: **§0.6 footer date-range navigator** (`DateRangeNavigator.tsx`). 7 presets (1D/1W/1M/3M/1Y/5Y/ALL) anchor to realtime then `zoomAtDataIndex`; live visible-range readout subscribes to engine `onVisibleRangeChange`/`onZoom` actions. Engine bridge via a `ChartPlugin` (`onInit` captures the full `Chart` — `AstroneumHandle` doesn't expose scroll/zoom). Footer token bumped 22px→28px. Deployed + verified (HTTP 200, `term-daterange-*` classes in SSR HTML, no PM2 errors).
|
|
261
288
|
- **2026-07-07** — Initial draft. Design/layout focus — "Inside function" column blank where Astroneum has no function wired. Sourced from three TV HTML snapshots (top toolbar, left drawing toolbar, right toolbar + bottom dock), `docs/STRUCTURE.md`, `docs/tv-functions-skill.md`, `docs/design-astroneum.md`, `INDICATOR_COMPARISON.md`, `docs/TODO.md`, `src/chart/hooks.ts` (hotkey audit), and live source (`src/widget/`, `src/extension/`, `demo/src/app/components/`). 10 sections + shell + maintenance policy. ~110 rows. Hotkey audit confirmed: only chart-nav hotkeys wired; all modal/dialog hotkeys missing. Cross-linked to TODO.md.
|
|
289
|
+
|
|
290
|
+
## 11. Reference Interaction Parity -> `design-astroneum.md` sections 13-14
|
|
291
|
+
|
|
292
|
+
This section tracks the reference behavior that cuts across shell regions.
|
|
293
|
+
Status records the Astroneum surface, not a claim of brand or visual parity.
|
|
294
|
+
Reference evidence comes from `tv-mirror-reference/structure.md`,
|
|
295
|
+
`interactions.md`, `tradingview-buttons.md`, and `watchlist.md` (Watchlist
|
|
296
|
+
right-panel deep-dive).
|
|
297
|
+
|
|
298
|
+
| # | Reference contract | Astroneum design | Inside function |
|
|
299
|
+
|---|---|---|---|
|
|
300
|
+
| 11.1 | One logical control across responsive presentations; hidden copies inert | ? Required for every responsive terminal control; audit wide/compact markup before shipping new toolbar work | |
|
|
301
|
+
| 11.2 | Layer order: canvas -> panels/split -> menus -> dialog -> toast/tooltip | 🔧 Shared ordered layer manager now owns workspace dialogs and Watchlist menus; tooltip/toast integration remains | `component/layer` |
|
|
302
|
+
| 11.3 | Only one transient menu/flyout per layer; dialog closes peer menus | 🔧 Symbol Search, AlertModal, and Watchlist list/settings/context menus register with the shared manager; peer-menu closing remains to be standardized | `useLayer` |
|
|
303
|
+
| 11.4 | Escape closes frontmost layer and restores focus | 🔧 Registered layers close topmost-first and restore the trigger; remaining overlay families need migration | `useLayer` |
|
|
304
|
+
| 11.5 | Anchored menus/flyouts flip, clamp, and support keyboard selection | ?? Individual modals exist; menu geometry and roving focus are incomplete | |
|
|
305
|
+
| 11.6 | Dialog focus trap, initial field focus, internal short-viewport scroll | ?? Modal inventory exists; verify each dialog before promotion | |
|
|
306
|
+
| 11.7 | Docked panel switch preserves prior state; repeated active rail target collapses body | ? Sidebar persistence/collapse implemented; per-panel scroll/filter restoration remains data-dependent | `TerminalShell` |
|
|
307
|
+
| 11.8 | Curtain can move into an in-app split view; never OS pop-out | ?? v1.1 product-surface contract; current app curtain remains chart-adjacent only | |
|
|
308
|
+
| 11.9 | Loading/success/error/retry state for delayed operations | 🔧 Watchlist quote polling ships loading/success/error/Retry states (§3.29-3.30); audit remaining delayed surfaces individually | `WatchlistPanel` |
|
|
309
|
+
| 11.10 | Symbol search: query persistence, asset scope, empty/network/entitlement recovery | 🔧 `SymbolSearchModal` rewritten 2026-07-13 with 840px/11 tabs/4-cell rows/debounce matching CDP-observed TV geometry; entitlement/delayed-data markers and virtualization remain unbuilt | `SymbolSearchModal` |
|
|
310
|
+
| 11.11 | Interval/chart-type single-select menus preserve time anchor and explain unavailable options | ?? Period/chart-type controls exist; keyboard and unavailable-state parity incomplete | `PeriodBar`, `ChartTypeDropdown` |
|
|
311
|
+
| 11.12 | Indicator result/error/limit states and legend actions | ?? Add/remove exists; dialog and legend state contract incomplete | `IndicatorModal` |
|
|
312
|
+
| 11.13 | Alert editing/invalid/submitting/success/retry lifecycle | ?? `AlertModal` exists; validate lifecycle before promotion | `AlertModal` |
|
|
313
|
+
| 11.14 | Drawing completion/cancel/keep/lock/hide/remove semantics | ?? Core controls wired; keep-drawing re-trigger and destructive confirmation remain incomplete | `DrawingBar` |
|
|
314
|
+
| 11.15 | Replay date-select/paused/playing/endpoint/realtime lifecycle | ?? Replay toolbar exists; full lifecycle/error recovery needs audit | `BarReplay` |
|
|
315
|
+
| 11.16 | Go to, range, timezone preserve chart state and validate availability | ?? Range navigator exists; Go to and timezone state contracts need audit | `DateRangeNavigator` |
|
|
316
|
+
| 11.17 | Context menu uses click context and has keyboard alternatives | 🔧 Watchlist row menu ships pointer and Shift+F10/ContextMenu access for Copy/Alert/Move/Remove; chart menu and inferred Hide/Lock remain | `WatchlistPanel` |
|
|
317
|
+
| 11.18 | Icon labels, ARIA state, focus, color-independent state, live outcomes | ?? Core components partially expose ARIA; full WCAG 2.2 AA verification pending | |
|
|
318
|
+
| 11.19 | 38px dense desktop targets / 44px touch targets, 200% zoom usable | ? Required responsive/accessibility audit | |
|
|
319
|
+
|
|
320
|
+
### Reference maintenance additions
|
|
321
|
+
|
|
322
|
+
- When adding a responsive variant, verify hidden variants are inert and record
|
|
323
|
+
its semantic ID in the relevant table.
|
|
324
|
+
- When adding any transient UI, update 11.2-11.6 and document its Escape,
|
|
325
|
+
outside-click, focus-return, viewport-edge, loading, and error behavior.
|
|
326
|
+
- When adding an async workflow, update its state row with success/retry and
|
|
327
|
+
`aria-live` behavior. Do not promote a surface based on happy-path visuals.
|
|
328
|
+
- Treat `tv-mirror-reference` as interaction evidence only. Preserve Astroneum
|
|
329
|
+
names, Cosmic Indigo product tone, and accessibility improvements.
|
|
330
|
+
|
|
331
|
+
### Change record
|
|
332
|
+
- **2026-07-12** - Added reference interaction parity section from the live
|
|
333
|
+
chart workspace evidence. Recorded overlay layering, responsive logical
|
|
334
|
+
controls, focus/dismissal, workflow states, accessibility, and explicit
|
|
335
|
+
implementation gaps without marking unbuilt behavior complete.
|