gloomberb 0.16.1 → 0.16.2
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/README.md +2 -1
- package/package.json +2 -1
- package/src/api-client/beneficial-owners.ts +92 -0
- package/src/api-client/data.ts +26 -8
- package/src/api-client/errors.ts +12 -0
- package/src/api-client/geo.ts +363 -0
- package/src/api-client/index.ts +2 -0
- package/src/api-client/market-discovery.ts +10 -0
- package/src/api-client/paths.ts +30 -1
- package/src/api-client/perps.ts +37 -0
- package/src/api-client/request.ts +5 -2
- package/src/api-client/types.ts +2 -0
- package/src/brokers/account-cache.ts +24 -0
- package/src/cli/commands/command-utils.ts +8 -0
- package/src/cli/commands/crypto-hints.ts +75 -0
- package/src/cli/commands/market.ts +414 -106
- package/src/cli/commands/overview.ts +77 -32
- package/src/cli/commands/ticker.ts +101 -43
- package/src/cli/desktop-pane-shot.ts +34 -4
- package/src/cli/freshness.ts +61 -0
- package/src/cli/help.ts +1 -0
- package/src/cli/helpers.ts +4 -8
- package/src/cli/index.ts +12 -2
- package/src/cli/listing-arg.ts +321 -0
- package/src/cli/pane-functions/access-gate.ts +42 -0
- package/src/cli/pane-functions/catalog.ts +28 -1
- package/src/cli/pane-functions/data.ts +3 -1
- package/src/cli/pane-functions/dom.ts +20 -2
- package/src/cli/pane-functions/freshness.ts +400 -0
- package/src/cli/pane-functions/function-help.ts +27 -20
- package/src/cli/pane-functions/headless.ts +39 -11
- package/src/cli/pane-functions/index.ts +15 -4
- package/src/cli/pane-functions/options.ts +3 -0
- package/src/cli/pane-functions/report.ts +4 -0
- package/src/cli/pane-functions/resolver.ts +35 -7
- package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
- package/src/cli/pane-functions/screenshot.ts +7 -3
- package/src/cli/result.ts +41 -27
- package/src/cli/ticker-resolution.ts +7 -5
- package/src/components/chart/composite/composite-chart.tsx +88 -2536
- package/src/components/chart/composite/drawing-store.ts +59 -0
- package/src/components/chart/composite/legend.tsx +319 -0
- package/src/components/chart/composite/panel-bitmap.ts +139 -0
- package/src/components/chart/composite/panel-gestures.ts +59 -0
- package/src/components/chart/composite/panel-labels.ts +107 -0
- package/src/components/chart/composite/panel-surface.tsx +876 -0
- package/src/components/chart/composite/tool-catalog.ts +98 -0
- package/src/components/chart/composite/toolbar.tsx +186 -0
- package/src/components/chart/composite/tools.ts +8 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +703 -0
- package/src/components/chart/composite/use-composite-viewport.ts +143 -0
- package/src/components/command-bar/list/model.ts +5 -0
- package/src/components/command-bar/list/view.tsx +16 -3
- package/src/components/command-bar/pane-templates/workflow.ts +1 -0
- package/src/components/command-bar/routes/ticker-search/actions.ts +5 -0
- package/src/components/command-bar/workflow/ops.ts +1 -1
- package/src/components/command-bar/workflow/tickers.ts +6 -0
- package/src/components/data-table/view.tsx +29 -10
- package/src/components/feedback-dialog.tsx +2 -1
- package/src/components/form-modal/field-row.tsx +2 -2
- package/src/components/layout/detached-pane-shell.tsx +6 -3
- package/src/components/layout/pane/content.tsx +23 -10
- package/src/components/layout/pane/error-boundary.tsx +103 -0
- package/src/components/layout/pane/footer/registration.tsx +68 -23
- package/src/components/layout/pane/header.tsx +11 -11
- package/src/components/layout/shell/menu.ts +2 -1
- package/src/components/layout/shell/pane/actions.ts +2 -1
- package/src/components/layout/shell/pane/layers.tsx +14 -3
- package/src/components/metric-treemap/heat-surface.tsx +43 -16
- package/src/components/metric-treemap/heat-tiles.ts +18 -0
- package/src/components/metric-treemap/layout.ts +2 -0
- package/src/components/onboarding/onboarding-keyboard.ts +311 -0
- package/src/components/onboarding/onboarding-wizard.tsx +101 -788
- package/src/components/onboarding/use-onboarding-broker-form.ts +263 -0
- package/src/components/onboarding/use-onboarding-progress.ts +298 -0
- package/src/components/onboarding/use-onboarding-upgrade.ts +83 -0
- package/src/components/ticker/list-table-view.tsx +13 -1
- package/src/components/ui/fields.tsx +8 -0
- package/src/components/ui/range-track.tsx +10 -3
- package/src/components/ui/status.tsx +8 -2
- package/src/components/ui/tabs.tsx +7 -4
- package/src/components/ui/text-prompt-dialog.tsx +4 -2
- package/src/data/config/store/normalize.ts +17 -1
- package/src/i18n/es.ts +19 -1
- package/src/i18n/ja.ts +19 -1
- package/src/i18n/ko.ts +19 -1
- package/src/i18n/zh-cn.ts +19 -1
- package/src/i18n/zh-tw.ts +19 -1
- package/src/market-data/coordinator/chart.ts +1 -1
- package/src/market-data/coordinator/quotes.ts +23 -4
- package/src/market-data/fx-closes.ts +72 -0
- package/src/market-data/market/freshness.ts +78 -6
- package/src/market-data/market/session-close-note.ts +57 -0
- package/src/market-data/market/status.ts +151 -0
- package/src/market-data/published-apac-sessions.ts +66 -0
- package/src/market-data/quotes/contributions.ts +2 -0
- package/src/market-data/quotes/resolution.ts +2 -0
- package/src/market-data/quotes/screener-live-quotes.ts +49 -4
- package/src/plugins/builtin/account-management/pane.tsx +4 -0
- package/src/plugins/builtin/alerts/cli.ts +10 -5
- package/src/plugins/builtin/alerts/index.tsx +1 -0
- package/src/plugins/builtin/analytics/metrics.ts +8 -3
- package/src/plugins/builtin/analytics/risk-client.ts +191 -66
- package/src/plugins/builtin/analytics/risk-fx.ts +102 -0
- package/src/plugins/builtin/analytics/risk-headless.ts +19 -13
- package/src/plugins/builtin/analytics/risk-model.ts +45 -17
- package/src/plugins/builtin/analytics/risk-pane.tsx +1 -0
- package/src/plugins/builtin/analytics/risk-test-data.ts +25 -1
- package/src/plugins/builtin/attention/headless.ts +6 -4
- package/src/plugins/builtin/attention/index.tsx +1 -1
- package/src/plugins/builtin/attention/pane.tsx +1 -1
- package/src/plugins/builtin/awards/headless.ts +1 -0
- package/src/plugins/builtin/awards/pane.tsx +1 -1
- package/src/plugins/builtin/backtest/headless.ts +1 -0
- package/src/plugins/builtin/bond-calculator/headless.ts +1 -0
- package/src/plugins/builtin/buildout/index.tsx +1 -0
- package/src/plugins/builtin/catalysts/headless.ts +3 -1
- package/src/plugins/builtin/cds/headless.ts +2 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +1 -0
- package/src/plugins/builtin/chart-composer/headless.ts +38 -3
- package/src/plugins/builtin/chart-composer/index.tsx +3 -1
- package/src/plugins/builtin/chart-composer/series-expression.ts +18 -2
- package/src/plugins/builtin/chat/channels.ts +19 -3
- package/src/plugins/builtin/chat/content/composer-runtime.ts +28 -13
- package/src/plugins/builtin/chat/content/footer.tsx +15 -6
- package/src/plugins/builtin/chat/content/index.tsx +120 -21
- package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +261 -113
- package/src/plugins/builtin/chat/content/transcript.tsx +20 -2
- package/src/plugins/builtin/chat/direct-messages.ts +200 -0
- package/src/plugins/builtin/chat/index.tsx +1 -0
- package/src/plugins/builtin/chat/message/desktop.tsx +3 -0
- package/src/plugins/builtin/chat/message/header.tsx +16 -6
- package/src/plugins/builtin/chat/message/inline-tokens.tsx +72 -32
- package/src/plugins/builtin/chat/message/profile-popover.tsx +96 -12
- package/src/plugins/builtin/chat/message/terminal.tsx +3 -0
- package/src/plugins/builtin/chat/message/types.ts +14 -2
- package/src/plugins/builtin/chat/profile-popover.ts +18 -13
- package/src/plugins/builtin/clinical-trials/index.tsx +1 -0
- package/src/plugins/builtin/cloud/askg/executor.ts +2 -1
- package/src/plugins/builtin/cloud/plugin.tsx +1 -0
- package/src/plugins/builtin/cloud/team/module.tsx +1 -0
- package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
- package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
- package/src/plugins/builtin/comment-letters/index.tsx +1 -0
- package/src/plugins/builtin/company-attention/headless.ts +5 -1
- package/src/plugins/builtin/company-attention/pane.tsx +1 -1
- package/src/plugins/builtin/company-kpis/headless.ts +1 -0
- package/src/plugins/builtin/congress-trades/headless.ts +1 -0
- package/src/plugins/builtin/correlation/compute.ts +59 -16
- package/src/plugins/builtin/correlation/geo.ts +34 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +4 -1
- package/src/plugins/builtin/correlation/headless.ts +42 -8
- package/src/plugins/builtin/correlation/history.ts +2 -0
- package/src/plugins/builtin/correlation/index.tsx +68 -14
- package/src/plugins/builtin/correlation/matrix/model.ts +17 -2
- package/src/plugins/builtin/correlation/matrix/selection.ts +5 -3
- package/src/plugins/builtin/correlation/relationship/model.ts +1 -1
- package/src/plugins/builtin/correlation/relationship/pane.tsx +4 -2
- package/src/plugins/builtin/correlation/relationship/view-model.ts +16 -1
- package/src/plugins/builtin/correlation/settings.ts +1 -1
- package/src/plugins/builtin/cot/headless.ts +6 -3
- package/src/plugins/builtin/cot/index.tsx +3 -3
- package/src/plugins/builtin/cot/model.ts +36 -3
- package/src/plugins/builtin/cpi/headless.ts +4 -0
- package/src/plugins/builtin/credit-boards/headless.ts +2 -0
- package/src/plugins/builtin/credit-conditions/headless.ts +1 -0
- package/src/plugins/builtin/credit-documents/gauge.tsx +5 -8
- package/src/plugins/builtin/credit-documents/headless.ts +2 -0
- package/src/plugins/builtin/crypto-board/headless.ts +3 -0
- package/src/plugins/builtin/custom-view/loader.ts +1 -1
- package/src/plugins/builtin/debt-maturities/headless.ts +4 -0
- package/src/plugins/builtin/dividend-yield/headless.ts +1 -0
- package/src/plugins/builtin/doe/headless.ts +7 -0
- package/src/plugins/builtin/doe/range-bar.tsx +7 -37
- package/src/plugins/builtin/earnings/headless.ts +5 -0
- package/src/plugins/builtin/earnings-calls/headless.ts +1 -0
- package/src/plugins/builtin/earnings-ripple/client.ts +91 -18
- package/src/plugins/builtin/earnings-ripple/headless.ts +28 -8
- package/src/plugins/builtin/earnings-ripple/index.tsx +2 -2
- package/src/plugins/builtin/earnings-ripple/model.ts +97 -7
- package/src/plugins/builtin/earnings-ripple/pane.tsx +148 -23
- package/src/plugins/builtin/econ/index.tsx +1 -0
- package/src/plugins/builtin/econ-statistics/headless.ts +2 -0
- package/src/plugins/builtin/equity-screener/headless.ts +2 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +1 -0
- package/src/plugins/builtin/executives/index.tsx +1 -0
- package/src/plugins/builtin/exposure/headless.ts +3 -1
- package/src/plugins/builtin/fear-greed/headless.ts +2 -0
- package/src/plugins/builtin/filing-events/index.tsx +1 -0
- package/src/plugins/builtin/futures-curve/client.ts +12 -3
- package/src/plugins/builtin/futures-curve/headless.ts +39 -10
- package/src/plugins/builtin/futures-curve/index.tsx +3 -3
- package/src/plugins/builtin/futures-curve/model.ts +188 -4
- package/src/plugins/builtin/futures-curve/pane.tsx +51 -9
- package/src/plugins/builtin/gpu/headless.ts +7 -3
- package/src/plugins/builtin/gpu/ladder.tsx +26 -30
- package/src/plugins/builtin/gpu/model.ts +27 -1
- package/src/plugins/builtin/holders/beneficial-client.ts +209 -0
- package/src/plugins/builtin/holders/beneficial-model.ts +279 -0
- package/src/plugins/builtin/holders/beneficial-report.ts +126 -0
- package/src/plugins/builtin/holders/beneficial-view.tsx +241 -0
- package/src/plugins/builtin/holders/headless.ts +139 -5
- package/src/plugins/builtin/holders/index.tsx +10 -3
- package/src/plugins/builtin/holders/pane.tsx +20 -3
- package/src/plugins/builtin/holders/report-header.ts +95 -0
- package/src/plugins/builtin/holders/table-model.ts +20 -5
- package/src/plugins/builtin/holders/thirteenf-match.ts +29 -1
- package/src/plugins/builtin/holders/types.ts +2 -1
- package/src/plugins/builtin/insider/headless.ts +2 -0
- package/src/plugins/builtin/ipo-calendar/headless.ts +1 -0
- package/src/plugins/builtin/iv-history/headless.ts +4 -1
- package/src/plugins/builtin/jobs/headless.ts +1 -0
- package/src/plugins/builtin/kelly-sizer/index.tsx +1 -0
- package/src/plugins/builtin/macro-day/headless.ts +2 -0
- package/src/plugins/builtin/market-halts/index.tsx +1 -0
- package/src/plugins/builtin/market-heatmap/data.ts +2 -0
- package/src/plugins/builtin/market-heatmap/headless.ts +135 -0
- package/src/plugins/builtin/market-heatmap/index.tsx +39 -46
- package/src/plugins/builtin/market-heatmap/model.ts +146 -0
- package/src/plugins/builtin/market-heatmap/portfolio.ts +23 -4
- package/src/plugins/builtin/market-movers/headless.ts +2 -0
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/members/client.ts +20 -3
- package/src/plugins/builtin/members/headless.ts +5 -3
- package/src/plugins/builtin/members/model.ts +10 -2
- package/src/plugins/builtin/members/pane.tsx +13 -6
- package/src/plugins/builtin/mna/distress/headless.ts +1 -0
- package/src/plugins/builtin/mna/headless.ts +1 -0
- package/src/plugins/builtin/money-markets/headless.ts +1 -0
- package/src/plugins/builtin/news/headless.ts +2 -0
- package/src/plugins/builtin/news/wire/index.tsx +8 -1
- package/src/plugins/builtin/notes/cli.ts +14 -6
- package/src/plugins/builtin/notes/index.tsx +1 -0
- package/src/plugins/builtin/openfda/index.tsx +1 -0
- package/src/plugins/builtin/options-calculator/headless.ts +2 -0
- package/src/plugins/builtin/options-positioning/headless.ts +3 -0
- package/src/plugins/builtin/options-scenario/headless.ts +5 -0
- package/src/plugins/builtin/pe-band/client.ts +48 -3
- package/src/plugins/builtin/pe-band/headless.ts +25 -7
- package/src/plugins/builtin/pe-band/model.ts +92 -16
- package/src/plugins/builtin/pe-band/pane.tsx +33 -16
- package/src/plugins/builtin/perps/client.ts +50 -3
- package/src/plugins/builtin/perps/headless.ts +144 -16
- package/src/plugins/builtin/perps/index.tsx +6 -6
- package/src/plugins/builtin/perps/model.ts +189 -12
- package/src/plugins/builtin/perps/pane.tsx +248 -47
- package/src/plugins/builtin/portfolio-list/allocation.ts +245 -0
- package/src/plugins/builtin/portfolio-list/cached-account.ts +33 -0
- package/src/plugins/builtin/portfolio-list/cell-version.ts +19 -1
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +328 -29
- package/src/plugins/builtin/portfolio-list/cli/render.ts +230 -39
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +67 -2
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +35 -31
- package/src/plugins/builtin/portfolio-list/column-values.ts +124 -47
- package/src/plugins/builtin/portfolio-list/headless.ts +98 -16
- package/src/plugins/builtin/portfolio-list/index.tsx +14 -3
- package/src/plugins/builtin/portfolio-list/live-valuation.ts +7 -5
- package/src/plugins/builtin/portfolio-list/mutations.ts +55 -1
- package/src/plugins/builtin/portfolio-list/pane/data.ts +6 -0
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +47 -13
- package/src/plugins/builtin/portfolio-list/settings.ts +33 -2
- package/src/plugins/builtin/portfolio-list/summary/index.tsx +24 -1
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +26 -7
- package/src/plugins/builtin/power/headless.ts +3 -1
- package/src/plugins/builtin/rate-path/headless.ts +2 -0
- package/src/plugins/builtin/realized-vol/headless.ts +2 -0
- package/src/plugins/builtin/relative-rotation/headless.ts +2 -0
- package/src/plugins/builtin/research/analyst-headless.ts +3 -0
- package/src/plugins/builtin/research/events-headless.ts +2 -0
- package/src/plugins/builtin/research/headless.ts +2 -0
- package/src/plugins/builtin/research/index.tsx +1 -0
- package/src/plugins/builtin/research/relative-valuation-headless.ts +10 -5
- package/src/plugins/builtin/research/relative-valuation-model.ts +11 -3
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +3 -3
- package/src/plugins/builtin/research-search/index.tsx +1 -0
- package/src/plugins/builtin/revenue-breakdown/headless.ts +2 -0
- package/src/plugins/builtin/reverse-dcf/headless.ts +2 -0
- package/src/plugins/builtin/risk-factors/headless.ts +2 -0
- package/src/plugins/builtin/scanner/flow-history.ts +2 -13
- package/src/plugins/builtin/scanner/headless.ts +14 -0
- package/src/plugins/builtin/seasonality/headless.ts +2 -0
- package/src/plugins/builtin/sec/command-bar-search.ts +14 -4
- package/src/plugins/builtin/sec/filing-content.ts +42 -17
- package/src/plugins/builtin/sec/forms.ts +12 -0
- package/src/plugins/builtin/sec/headless.ts +2 -0
- package/src/plugins/builtin/sectors/client.ts +1 -0
- package/src/plugins/builtin/sectors/headless.ts +9 -1
- package/src/plugins/builtin/sectors/sector-model.ts +2 -0
- package/src/plugins/builtin/shared/crypto-pair.ts +14 -0
- package/src/plugins/builtin/shared/locked-rows.tsx +1 -1
- package/src/plugins/builtin/shared/report-freshness.ts +57 -0
- package/src/plugins/builtin/shared/research-cells.tsx +4 -9
- package/src/plugins/builtin/short-interest/headless.ts +2 -0
- package/src/plugins/builtin/short-interest/watch-headless.ts +1 -0
- package/src/plugins/builtin/short-volume/headless.ts +1 -0
- package/src/plugins/builtin/social-mentions/headless.ts +1 -0
- package/src/plugins/builtin/supply-chain/headless.ts +7 -1
- package/src/plugins/builtin/supply-chain/index.tsx +10 -1
- package/src/plugins/builtin/supply-chain/model.ts +27 -2
- package/src/plugins/builtin/supply-chain/pane.tsx +71 -32
- package/src/plugins/builtin/themes/headless.ts +3 -0
- package/src/plugins/builtin/thirteenf/headless.ts +110 -25
- package/src/plugins/builtin/thirteenf/report-notes.ts +149 -0
- package/src/plugins/builtin/ticker-detail/headless.ts +7 -1
- package/src/plugins/builtin/ticker-detail/index.tsx +1 -0
- package/src/plugins/builtin/ticker-detail/overview/model.ts +9 -2
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +26 -26
- package/src/plugins/builtin/time-sales/headless.ts +5 -1
- package/src/plugins/builtin/treasury-auctions/headless.ts +1 -0
- package/src/plugins/builtin/volatility/headless.ts +6 -1
- package/src/plugins/builtin/world-indices/headless.ts +2 -0
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +157 -0
- package/src/plugins/builtin/world-venue-map/basemap.ts +214 -0
- package/src/plugins/builtin/world-venue-map/client.ts +45 -0
- package/src/plugins/builtin/world-venue-map/entity-detail.tsx +147 -0
- package/src/plugins/builtin/world-venue-map/entity-table.ts +59 -0
- package/src/plugins/builtin/world-venue-map/evidence.ts +77 -0
- package/src/plugins/builtin/world-venue-map/feed.ts +293 -0
- package/src/plugins/builtin/world-venue-map/geo-draw.tsx +248 -0
- package/src/plugins/builtin/world-venue-map/geo-series.ts +142 -0
- package/src/plugins/builtin/world-venue-map/geo-svg.tsx +447 -0
- package/src/plugins/builtin/world-venue-map/headless.ts +146 -0
- package/src/plugins/builtin/world-venue-map/ids.ts +1 -0
- package/src/plugins/builtin/world-venue-map/index.ts +67 -4
- package/src/plugins/builtin/world-venue-map/layered-pane.tsx +552 -0
- package/src/plugins/builtin/world-venue-map/layers.ts +348 -0
- package/src/plugins/builtin/world-venue-map/map-symbols.ts +220 -0
- package/src/plugins/builtin/world-venue-map/map.tsx +381 -45
- package/src/plugins/builtin/world-venue-map/model.ts +7 -4
- package/src/plugins/builtin/world-venue-map/natural-earth/index.chunk.ts +199 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n75.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n00.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n60.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s15.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s30.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s45.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/world-50m.chunk.ts +4 -0
- package/src/plugins/builtin/world-venue-map/pane.tsx +28 -43
- package/src/plugins/builtin/world-venue-map/use-geo.ts +55 -0
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +32 -0
- package/src/plugins/builtin/yield-curve/headless.ts +16 -0
- package/src/plugins/loader.ts +13 -1
- package/src/plugins/registry/pane-settings.ts +1 -0
- package/src/renderers/dom/build-assets.ts +81 -3
- package/src/renderers/dom/data-table/row.tsx +2 -0
- package/src/renderers/dom/desktop/controls.tsx +7 -3
- package/src/renderers/dom/desktop/list-view.tsx +35 -10
- package/src/renderers/dom/desktop/popover.tsx +73 -14
- package/src/renderers/dom/host/input.tsx +14 -3
- package/src/renderers/dom/styles.css +6 -7
- package/src/renderers/electrobun/view/backend-rpc.ts +10 -4
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -0
- package/src/renderers/electrobun/view/rpc-timeout.ts +14 -3
- package/src/renderers/opentui/host.tsx +5 -0
- package/src/sources/gloomberb-cloud/index.ts +25 -4
- package/src/sources/gloomberb-cloud/normalizers.ts +27 -3
- package/src/sources/provider-router/cached-routes.ts +4 -1
- package/src/sources/provider-router/financials.ts +8 -7
- package/src/sources/provider-router/history.ts +15 -10
- package/src/sources/sec-registrant.ts +75 -0
- package/src/state/app/context/index.tsx +24 -8
- package/src/state/hooks/quote-streaming.ts +41 -26
- package/src/sync/core-contributors.ts +4 -0
- package/src/telemetry/crash-reports.ts +4 -1
- package/src/test-support/cli-context.ts +10 -2
- package/src/theme/heat-colors.ts +266 -84
- package/src/time-series/resolve.ts +1 -1
- package/src/time-series/use-chart-resolution.ts +1 -1
- package/src/types/context-menu.ts +6 -0
- package/src/types/data-provider.ts +2 -0
- package/src/types/financials.ts +3 -0
- package/src/types/headless.ts +79 -2
- package/src/types/plugin.ts +20 -1
- package/src/types/ticker.ts +15 -0
- package/src/ui/host.tsx +14 -0
- package/src/updater/index.ts +9 -11
- package/src/utils/async-deadline.ts +21 -0
- package/src/utils/cli-output.ts +5 -1
- package/src/utils/crypto-pair.ts +41 -0
- package/src/utils/currency-units.ts +14 -0
- package/src/utils/depositary-receipt.ts +26 -0
- package/src/utils/exchanges.ts +72 -0
- package/src/utils/fire-and-forget.ts +24 -0
- package/src/utils/format.ts +13 -0
- package/src/utils/price-earnings.ts +70 -3
- package/src/utils/price-history.ts +58 -13
- package/src/utils/rpc-timeout-error.ts +27 -0
- package/src/utils/sec.ts +13 -1
- package/src/utils/utc-time.ts +79 -0
|
@@ -66,17 +66,17 @@ export function PaneFooterProvider({
|
|
|
66
66
|
const value = useMemo(() => ({ register, unregister }), [register, unregister]);
|
|
67
67
|
const footer = useMemo(() => combinePaneFooterRegistrations(registrations), [registrations]);
|
|
68
68
|
|
|
69
|
-
const [arrowClaims,
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
69
|
+
const [arrowClaims, setArrowClaim] = useMemberSet();
|
|
70
|
+
const [strips, setStrip] = useMemberSet();
|
|
71
|
+
const [holds, setArrowHold] = useMemberSet();
|
|
72
|
+
const arrowValue = useMemo<PaneArrowState>(() => ({
|
|
73
|
+
claimed: arrowClaims.size > 0,
|
|
74
|
+
strip: strips.size > 0,
|
|
75
|
+
held: holds.size > 0,
|
|
76
|
+
setArrowClaim,
|
|
77
|
+
setStrip,
|
|
78
|
+
setArrowHold,
|
|
79
|
+
}), [arrowClaims, holds, setArrowClaim, setArrowHold, setStrip, strips]);
|
|
80
80
|
|
|
81
81
|
return (
|
|
82
82
|
<PaneFooterContext.Provider value={value}>
|
|
@@ -87,22 +87,57 @@ export function PaneFooterProvider({
|
|
|
87
87
|
);
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
function useMemberSet(): [ReadonlySet<string>, (id: string, member: boolean) => void] {
|
|
91
|
+
const [members, setMembers] = useState<ReadonlySet<string>>(() => new Set());
|
|
92
|
+
const setMember = useCallback((id: string, member: boolean) => {
|
|
93
|
+
setMembers((current) => {
|
|
94
|
+
if (current.has(id) === member) return current;
|
|
95
|
+
const next = new Set(current);
|
|
96
|
+
if (member) next.add(id);
|
|
97
|
+
else next.delete(id);
|
|
98
|
+
return next;
|
|
99
|
+
});
|
|
100
|
+
}, []);
|
|
101
|
+
return [members, setMember];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
interface PaneArrowState {
|
|
105
|
+
/** A focused tab strip owns Left, Right, h and l. */
|
|
106
|
+
claimed: boolean;
|
|
107
|
+
/** The pane has a tab strip that walks its tabs by keyboard. */
|
|
108
|
+
strip: boolean;
|
|
109
|
+
/** Content the user moved into (a chart) holds the strip's keys until Esc. */
|
|
110
|
+
held: boolean;
|
|
111
|
+
setArrowClaim(id: string, claimed: boolean): void;
|
|
112
|
+
setStrip(id: string, present: boolean): void;
|
|
113
|
+
setArrowHold(id: string, held: boolean): void;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const PaneArrowContext = createContext<PaneArrowState | null>(null);
|
|
117
|
+
|
|
118
|
+
function usePaneArrowMember(set: ((id: string, member: boolean) => void) | undefined, member: boolean) {
|
|
119
|
+
const id = useId();
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
if (!set) return;
|
|
122
|
+
set(id, member);
|
|
123
|
+
return () => set(id, false);
|
|
124
|
+
}, [id, member, set]);
|
|
125
|
+
}
|
|
91
126
|
|
|
92
127
|
/**
|
|
93
|
-
* A
|
|
94
|
-
* a
|
|
95
|
-
* keep walking the tabs.
|
|
128
|
+
* A tab strip's keys. A focused strip owns Left, Right, h and l in its pane and
|
|
129
|
+
* claims them, so a chart in the same pane leaves them to it and the arrows
|
|
130
|
+
* keep walking the tabs. While content the user moved into holds them (a chart
|
|
131
|
+
* after Down, Enter or a click), the strip lets go until that content hands
|
|
132
|
+
* them back with Esc. Returns whether the strip has its keys now.
|
|
96
133
|
*/
|
|
97
|
-
export function
|
|
134
|
+
export function usePaneTabStripKeys(navigates: boolean, focused: boolean): { active: boolean; held: boolean } {
|
|
98
135
|
const context = useContext(PaneArrowContext);
|
|
99
|
-
const
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
return () => setArrowClaim(id, false);
|
|
105
|
-
}, [claimed, id, setArrowClaim]);
|
|
136
|
+
const held = context?.held ?? false;
|
|
137
|
+
const active = navigates && focused && !held;
|
|
138
|
+
usePaneArrowMember(context?.setStrip, navigates);
|
|
139
|
+
usePaneArrowMember(context?.setArrowClaim, active);
|
|
140
|
+
return { active, held: navigates && held };
|
|
106
141
|
}
|
|
107
142
|
|
|
108
143
|
/** Whether a tab strip in this pane owns Left and Right. */
|
|
@@ -110,6 +145,16 @@ export function usePaneArrowsClaimed(): boolean {
|
|
|
110
145
|
return useContext(PaneArrowContext)?.claimed ?? false;
|
|
111
146
|
}
|
|
112
147
|
|
|
148
|
+
/** Whether this pane has a tab strip that content can hand the keys back to. */
|
|
149
|
+
export function usePaneHasTabStrip(): boolean {
|
|
150
|
+
return useContext(PaneArrowContext)?.strip ?? false;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** While `held`, the pane's tab strips leave Left, Right, h and l to the caller. */
|
|
154
|
+
export function usePaneArrowHold(held: boolean) {
|
|
155
|
+
usePaneArrowMember(useContext(PaneArrowContext)?.setArrowHold, held);
|
|
156
|
+
}
|
|
157
|
+
|
|
113
158
|
export function PaneFooterScope({
|
|
114
159
|
active,
|
|
115
160
|
children,
|
|
@@ -152,8 +152,9 @@ export function PaneHeader({
|
|
|
152
152
|
capturePointerDrag(nativeRenderer, terminalHeaderRef.current);
|
|
153
153
|
onHeaderMouseDown?.(event);
|
|
154
154
|
}, [nativeRenderer, onHeaderMouseDown]);
|
|
155
|
-
// The
|
|
156
|
-
//
|
|
155
|
+
// The whole bar moves the pane: the grip, the title, the empty space and its
|
|
156
|
+
// padding. Tabs and buttons stop the press before it gets here. A fullscreen
|
|
157
|
+
// pane cannot move, so there the bar moves the desktop window instead.
|
|
157
158
|
const windowDrag = Boolean(titleBar) || (fullscreen && titleBarOverlay === true && nativeWindowChrome === true);
|
|
158
159
|
const beginPaneDrag = (event: { stopPropagation?: () => void }) => {
|
|
159
160
|
event.stopPropagation?.();
|
|
@@ -167,12 +168,9 @@ export function PaneHeader({
|
|
|
167
168
|
}
|
|
168
169
|
void rendererHost.startWindowDrag?.();
|
|
169
170
|
};
|
|
170
|
-
const
|
|
171
|
-
onMouseDown:
|
|
172
|
-
onMouseDrag: onHeaderMouseDrag,
|
|
173
|
-
onMouseDragEnd: onHeaderMouseDragEnd,
|
|
174
|
-
};
|
|
175
|
-
const chromeHandlers = windowDrag ? { onMouseDown: beginWindowDrag } : paneDragHandlers;
|
|
171
|
+
const barHandlers = windowDrag
|
|
172
|
+
? { onMouseDown: beginWindowDrag }
|
|
173
|
+
: { onMouseDown: beginPaneDrag, onMouseDrag: onHeaderMouseDrag, onMouseDragEnd: onHeaderMouseDragEnd };
|
|
176
174
|
|
|
177
175
|
if (nativePaneChrome) {
|
|
178
176
|
const ruleColor = visuallyFocused ? colors.borderFocused : colors.border;
|
|
@@ -187,6 +185,8 @@ export function PaneHeader({
|
|
|
187
185
|
data-floating={floating ? "true" : "false"}
|
|
188
186
|
data-focused={focused ? "true" : "false"}
|
|
189
187
|
data-window-mode-selected={windowModeSelected ? "true" : "false"}
|
|
188
|
+
data-drag-surface={windowDrag ? "window" : "pane"}
|
|
189
|
+
{...barHandlers}
|
|
190
190
|
onMouseMove={onHeaderMouseMove}
|
|
191
191
|
onContextMenu={onHeaderContextMenu}
|
|
192
192
|
style={{
|
|
@@ -207,13 +207,13 @@ export function PaneHeader({
|
|
|
207
207
|
}}
|
|
208
208
|
>
|
|
209
209
|
{!titleBar && (
|
|
210
|
-
<Box data-gloom-role="pane-grip" flexShrink={0} flexDirection="row" alignItems="center" style={{ alignSelf: "stretch", marginRight: 6 }}
|
|
210
|
+
<Box data-gloom-role="pane-grip" flexShrink={0} flexDirection="row" alignItems="center" style={{ alignSelf: "stretch", marginRight: 6 }}>
|
|
211
211
|
<Icon name="grip" size={12} color={visuallyFocused ? colors.borderFocused : colors.textMuted} />
|
|
212
212
|
</Box>
|
|
213
213
|
)}
|
|
214
214
|
{/* Full header height, so trimming the title to its capitals never lets
|
|
215
215
|
this clip cut descenders. */}
|
|
216
|
-
<Box data-gloom-role="pane-header-chrome" minWidth={0} flexShrink={tabs ? 0 : 1} overflow="hidden" flexDirection="row" alignItems="center" style={{ alignSelf: "stretch", ...(tabs ? { maxWidth: "40%" } : {}) }}
|
|
216
|
+
<Box data-gloom-role="pane-header-chrome" minWidth={0} flexShrink={tabs ? 0 : 1} overflow="hidden" flexDirection="row" alignItems="center" style={{ alignSelf: "stretch", ...(tabs ? { maxWidth: "40%" } : {}) }}>
|
|
217
217
|
<Text
|
|
218
218
|
fg={textColor}
|
|
219
219
|
selectable={false}
|
|
@@ -285,7 +285,7 @@ export function PaneHeader({
|
|
|
285
285
|
/>
|
|
286
286
|
</Box>
|
|
287
287
|
))}
|
|
288
|
-
<Box
|
|
288
|
+
<Box flexGrow={1} minWidth={0} />
|
|
289
289
|
{locked && (
|
|
290
290
|
<Box data-gloom-role="pane-lock">
|
|
291
291
|
<IconButton icon="lock" label="Locked: the close shortcut leaves this pane open" color={colors.textMuted} />
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
import { PANE_MANAGEMENT_ACCELERATORS, type PaneManagementAccelerators } from "./shortcuts";
|
|
18
18
|
import { t } from "../../../i18n";
|
|
19
19
|
import { displayWidth } from "../../../utils/format";
|
|
20
|
+
import { fireAndForget } from "../../../utils/fire-and-forget";
|
|
20
21
|
|
|
21
22
|
const MENU_MIN_WIDTH = 18;
|
|
22
23
|
const MENU_MAX_WIDTH = 44;
|
|
@@ -174,7 +175,7 @@ export function menuForPane(
|
|
|
174
175
|
label: "Pop Out",
|
|
175
176
|
accelerator: accelerators.popOut,
|
|
176
177
|
onSelect: () => {
|
|
177
|
-
|
|
178
|
+
fireAndForget(desktopWindowBridge.popOutPane?.(pane.instance.instanceId), "desktop.popOutPane");
|
|
178
179
|
},
|
|
179
180
|
});
|
|
180
181
|
}
|
|
@@ -14,6 +14,7 @@ import type { LayoutConfig } from "../../../../types/config";
|
|
|
14
14
|
import { isPaneLockedInLayout } from "../../../../pane-settings";
|
|
15
15
|
import type { RendererHost } from "../../../../ui";
|
|
16
16
|
import { capturePaneScreenshotPngBase64 } from "../../../../utils/dom-screenshot";
|
|
17
|
+
import { fireAndForget } from "../../../../utils/fire-and-forget";
|
|
17
18
|
import {
|
|
18
19
|
exportPaneTableCsv,
|
|
19
20
|
hasPaneTableExporter,
|
|
@@ -160,7 +161,7 @@ export function useShellPaneActions({
|
|
|
160
161
|
const popOutFocusedPane = useCallback(() => {
|
|
161
162
|
if (!focusedPaneId || desktopWindowBridge?.kind !== "main" || !desktopWindowBridge.popOutPane) return false;
|
|
162
163
|
if (!isPaneInLayout(visibleLayout, focusedPaneId)) return false;
|
|
163
|
-
|
|
164
|
+
fireAndForget(desktopWindowBridge.popOutPane(focusedPaneId), "desktop.popOutPane");
|
|
164
165
|
return true;
|
|
165
166
|
}, [desktopWindowBridge, focusedPaneId, visibleLayout]);
|
|
166
167
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useMemo } from "react";
|
|
1
|
+
import { useCallback, useMemo, useRef } from "react";
|
|
2
2
|
import { Box } from "../../../../ui";
|
|
3
3
|
import { resolveOccludedPaneIds } from "../pane-occlusion";
|
|
4
4
|
import type {
|
|
@@ -117,6 +117,11 @@ export function ShellPaneLayers({
|
|
|
117
117
|
// the compositor already skips covered windows, and a drag keeps everything
|
|
118
118
|
// drawn so the preview never reveals a blank spot.
|
|
119
119
|
const occludedPaneIds = nativePaneChrome || dragFloatingRect ? EMPTY_OCCLUSION : coveredPaneIds;
|
|
120
|
+
// The failure card's Close. Stable, so a focus or layout change does not
|
|
121
|
+
// re-render every memoized pane body.
|
|
122
|
+
const closePaneRef = useRef(handleFloatingClose);
|
|
123
|
+
closePaneRef.current = handleFloatingClose;
|
|
124
|
+
const closePane = useCallback((paneId: string) => closePaneRef.current(paneId), []);
|
|
120
125
|
|
|
121
126
|
return (
|
|
122
127
|
<>
|
|
@@ -131,6 +136,7 @@ export function ShellPaneLayers({
|
|
|
131
136
|
const focused = focusedPaneId === leaf.instanceId && (!overlayOpen || menuPaneId === leaf.instanceId);
|
|
132
137
|
const windowModeSelected = windowModePaneId === leaf.instanceId;
|
|
133
138
|
const showActions = focused || hoveredPaneId === leaf.instanceId || menuPaneId === leaf.instanceId;
|
|
139
|
+
const title = getPaneTitle(pane);
|
|
134
140
|
return (
|
|
135
141
|
<Box
|
|
136
142
|
key={`dock:${leaf.instanceId}`}
|
|
@@ -156,7 +162,7 @@ export function ShellPaneLayers({
|
|
|
156
162
|
return (
|
|
157
163
|
<PaneWrapper
|
|
158
164
|
paneId={leaf.instanceId}
|
|
159
|
-
title={
|
|
165
|
+
title={title}
|
|
160
166
|
focused={focused}
|
|
161
167
|
width={rect.width}
|
|
162
168
|
height={rect.height}
|
|
@@ -181,10 +187,12 @@ export function ShellPaneLayers({
|
|
|
181
187
|
component={pane.def.component}
|
|
182
188
|
paneId={pane.instance.instanceId}
|
|
183
189
|
paneType={pane.instance.paneId}
|
|
190
|
+
title={title}
|
|
184
191
|
focused={focused}
|
|
185
192
|
width={bodyFrame.width ?? 1}
|
|
186
193
|
height={bodyFrame.height ?? 1}
|
|
187
194
|
inView={!coveredPaneIds.has(leaf.instanceId)}
|
|
195
|
+
closePane={closePane}
|
|
188
196
|
/>
|
|
189
197
|
</PaneWrapper>
|
|
190
198
|
);
|
|
@@ -205,6 +213,7 @@ export function ShellPaneLayers({
|
|
|
205
213
|
const focused = focusedPaneId === pane.instance.instanceId && (!overlayOpen || menuPaneId === pane.instance.instanceId);
|
|
206
214
|
const windowModeSelected = windowModePaneId === pane.instance.instanceId;
|
|
207
215
|
const showActions = focused || hoveredPaneId === pane.instance.instanceId || menuPaneId === pane.instance.instanceId;
|
|
216
|
+
const title = getPaneTitle(pane);
|
|
208
217
|
return (
|
|
209
218
|
<PaneFooterProvider key={`float:${pane.instance.instanceId}`}>
|
|
210
219
|
{(footer) => {
|
|
@@ -221,7 +230,7 @@ export function ShellPaneLayers({
|
|
|
221
230
|
return (
|
|
222
231
|
<FloatingPaneWrapper
|
|
223
232
|
paneId={pane.instance.instanceId}
|
|
224
|
-
title={
|
|
233
|
+
title={title}
|
|
225
234
|
x={preview.x}
|
|
226
235
|
y={preview.y}
|
|
227
236
|
width={preview.width}
|
|
@@ -253,11 +262,13 @@ export function ShellPaneLayers({
|
|
|
253
262
|
component={pane.def.component}
|
|
254
263
|
paneId={pane.instance.instanceId}
|
|
255
264
|
paneType={pane.instance.paneId}
|
|
265
|
+
title={title}
|
|
256
266
|
focused={focused}
|
|
257
267
|
width={bodyFrame.width ?? 1}
|
|
258
268
|
height={bodyFrame.height ?? 1}
|
|
259
269
|
inView={!coveredPaneIds.has(pane.instance.instanceId)}
|
|
260
270
|
onClose={handleFloatingClose}
|
|
271
|
+
closePane={closePane}
|
|
261
272
|
/>
|
|
262
273
|
</FloatingPaneWrapper>
|
|
263
274
|
);
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { memo, useEffect, useMemo, useRef, useState, type CSSProperties } from "react";
|
|
2
2
|
import { Box, Text, TextAttributes, useUiCapabilities } from "../../ui";
|
|
3
|
-
import { blendHex
|
|
4
|
-
import {
|
|
3
|
+
import { blendHex } from "../../theme/colors";
|
|
4
|
+
import {
|
|
5
|
+
heatmapColorDistance,
|
|
6
|
+
resolveHeatmapSelectedTileColors,
|
|
7
|
+
resolveHeatmapSelectionRing,
|
|
8
|
+
resolveHeatmapTileColors,
|
|
9
|
+
} from "../../theme/heat-colors";
|
|
10
|
+
import { useThemeColors } from "../../theme/theme-context";
|
|
5
11
|
import { t } from "../../i18n";
|
|
6
12
|
import { clipToDisplayWidth, padTo } from "../../utils/format";
|
|
7
13
|
import type { FloatMetricTreemapTile, MetricTreemapItem } from "./layout";
|
|
@@ -17,6 +23,7 @@ import {
|
|
|
17
23
|
heatTileLabelCells,
|
|
18
24
|
heatTileLabelPx,
|
|
19
25
|
heatTileMotion,
|
|
26
|
+
heatTileValueWithSuffix,
|
|
20
27
|
} from "./heat-tiles";
|
|
21
28
|
|
|
22
29
|
type PreventableMouseEvent = { preventDefault(): void };
|
|
@@ -203,7 +210,7 @@ function useItemsById<T>(scene: MetricTreemapScene<T>, items: readonly MetricTre
|
|
|
203
210
|
const VISIBLE_FADE_DISTANCE = 0.03;
|
|
204
211
|
|
|
205
212
|
const DomHeatTile = memo(function DomHeatTile({
|
|
206
|
-
id, rect, canvasWidth, canvasHeight, gap, label, value, background, foreground,
|
|
213
|
+
id, rect, canvasWidth, canvasHeight, gap, label, value, valueSuffix, background, foreground,
|
|
207
214
|
selected, reducedMotion, glide, pulseCount, events,
|
|
208
215
|
}: {
|
|
209
216
|
id: string;
|
|
@@ -213,6 +220,7 @@ const DomHeatTile = memo(function DomHeatTile({
|
|
|
213
220
|
gap: number;
|
|
214
221
|
label: string;
|
|
215
222
|
value: string | null;
|
|
223
|
+
valueSuffix: string | null;
|
|
216
224
|
background: string;
|
|
217
225
|
foreground: string;
|
|
218
226
|
selected: boolean;
|
|
@@ -222,6 +230,7 @@ const DomHeatTile = memo(function DomHeatTile({
|
|
|
222
230
|
events: SurfaceEvents;
|
|
223
231
|
}) {
|
|
224
232
|
const text = heatTileLabelPx(rect.width - gap * 2, rect.height - gap * 2, label, value);
|
|
233
|
+
const shownValue = heatTileValueWithSuffix(value, valueSuffix, { width: rect.width - gap * 2, valuePx: text.valuePx });
|
|
225
234
|
// Where this tile sat before the last relayout, kept to slide it from there.
|
|
226
235
|
const placedRef = useRef(rect);
|
|
227
236
|
const glideRef = useRef<{ dx: number; dy: number; count: number }>({ dx: 0, dy: 0, count: 0 });
|
|
@@ -234,13 +243,19 @@ const DomHeatTile = memo(function DomHeatTile({
|
|
|
234
243
|
placedRef.current = rect;
|
|
235
244
|
}
|
|
236
245
|
const motion = heatTileMotion({ reducedMotion, glide, glideCount: glideRef.current.count, pulseCount });
|
|
246
|
+
const colors = useThemeColors();
|
|
247
|
+
const ring = resolveHeatmapSelectionRing(colors);
|
|
237
248
|
// The colour this tile showed before, kept to fade out over the new one.
|
|
238
249
|
const shownRef = useRef(background);
|
|
239
250
|
const fadeRef = useRef<{ from: string; key: number } | null>(null);
|
|
251
|
+
const paletteRef = useRef(colors);
|
|
252
|
+
// A theme switch recolours every tile at once; only a move fades.
|
|
253
|
+
const themeChanged = paletteRef.current !== colors;
|
|
254
|
+
paletteRef.current = colors;
|
|
240
255
|
if (shownRef.current !== background) {
|
|
241
256
|
// A step too small to see snaps: a fade costs a compositor layer for its whole run.
|
|
242
257
|
const visible = heatmapColorDistance(shownRef.current, background) >= VISIBLE_FADE_DISTANCE;
|
|
243
|
-
if (!motion.fadeAnimation) fadeRef.current = null;
|
|
258
|
+
if (!motion.fadeAnimation || themeChanged) fadeRef.current = null;
|
|
244
259
|
else if (visible) fadeRef.current = { from: shownRef.current, key: (fadeRef.current?.key ?? 0) + 1 };
|
|
245
260
|
shownRef.current = background;
|
|
246
261
|
}
|
|
@@ -267,9 +282,9 @@ const DomHeatTile = memo(function DomHeatTile({
|
|
|
267
282
|
justifyContent: "center",
|
|
268
283
|
gap: 0,
|
|
269
284
|
cursor: "pointer",
|
|
270
|
-
// The
|
|
271
|
-
//
|
|
272
|
-
boxShadow: selected ? `inset 0 0 0 2px ${
|
|
285
|
+
// The theme's text tone against the page, then a hairline of the page: one
|
|
286
|
+
// of the two stands out on any tile, bright or dim.
|
|
287
|
+
boxShadow: selected ? `inset 0 0 0 2px ${ring.outer}, inset 0 0 0 3px ${ring.inner}` : undefined,
|
|
273
288
|
zIndex: selected ? 1 : undefined,
|
|
274
289
|
...(motion.glideAnimation
|
|
275
290
|
? {
|
|
@@ -336,7 +351,7 @@ const DomHeatTile = memo(function DomHeatTile({
|
|
|
336
351
|
<Text style={{ ...lineStyle, fontSize: text.tickerPx, fontWeight: 700, lineHeight: 1.12 }}>{label}</Text>
|
|
337
352
|
)}
|
|
338
353
|
{text.tier === "full" && value && (
|
|
339
|
-
<Text style={{ ...lineStyle, fontSize: text.valuePx, fontWeight: 500, lineHeight: 1.12 }}>{
|
|
354
|
+
<Text style={{ ...lineStyle, fontSize: text.valuePx, fontWeight: 500, lineHeight: 1.12 }}>{shownValue}</Text>
|
|
340
355
|
)}
|
|
341
356
|
</Box>
|
|
342
357
|
);
|
|
@@ -347,6 +362,7 @@ function headerLabel(header: MetricTreemapHeader): string {
|
|
|
347
362
|
}
|
|
348
363
|
|
|
349
364
|
function DomHeader({ header, canvasWidth, canvasHeight }: { header: MetricTreemapHeader; canvasWidth: number; canvasHeight: number }) {
|
|
365
|
+
const colors = useThemeColors();
|
|
350
366
|
const sector = header.level === 0 && !header.other;
|
|
351
367
|
return (
|
|
352
368
|
<Box
|
|
@@ -402,6 +418,7 @@ function DomTooltip<T>({ state, itemsById, otherLines }: {
|
|
|
402
418
|
itemsById: ReadonlyMap<string, MetricTreemapItem<T>>;
|
|
403
419
|
otherLines: readonly string[] | null;
|
|
404
420
|
}) {
|
|
421
|
+
const colors = useThemeColors();
|
|
405
422
|
if (!state) return null;
|
|
406
423
|
const lines = state.id === OTHER_ID
|
|
407
424
|
? otherLines
|
|
@@ -457,6 +474,7 @@ function DomHeatTreemap<T>({
|
|
|
457
474
|
scene, items, width, height, selectedId, onSelect, onActivate, otherTooltip, otherSummary: summarizeOther,
|
|
458
475
|
}: HeatTreemapSurfaceProps<T>) {
|
|
459
476
|
const reducedMotion = usePrefersReducedMotion();
|
|
477
|
+
const colors = useThemeColors();
|
|
460
478
|
const itemsById = useItemsById(scene, items);
|
|
461
479
|
const chartRef = useRef<{ getBoundingClientRect?: () => { x: number; y: number; width: number; height: number } } | null>(null);
|
|
462
480
|
const [tooltip, setTooltip] = useState<TooltipState | null>(null);
|
|
@@ -543,7 +561,7 @@ function DomHeatTreemap<T>({
|
|
|
543
561
|
)}
|
|
544
562
|
{scene.tiles.map((tile) => {
|
|
545
563
|
const item = itemsById.get(tile.item.id) ?? tile.item;
|
|
546
|
-
const tileColors = resolveHeatmapTileColors(item.colorValue);
|
|
564
|
+
const tileColors = resolveHeatmapTileColors(item.colorValue, colors);
|
|
547
565
|
return (
|
|
548
566
|
<DomHeatTile
|
|
549
567
|
key={tile.item.id}
|
|
@@ -554,6 +572,7 @@ function DomHeatTreemap<T>({
|
|
|
554
572
|
gap={gap}
|
|
555
573
|
label={item.label}
|
|
556
574
|
value={item.primaryText ?? null}
|
|
575
|
+
valueSuffix={item.primaryTextSuffix ?? null}
|
|
557
576
|
background={tileColors.background}
|
|
558
577
|
foreground={tileColors.foreground}
|
|
559
578
|
selected={tile.item.id === selectedId}
|
|
@@ -586,7 +605,7 @@ function tileRect(tile: FloatMetricTreemapTile<unknown>): TreemapRect {
|
|
|
586
605
|
// Terminal: whole cells, a one-cell gutter right of and under each tile.
|
|
587
606
|
|
|
588
607
|
const TerminalHeatTile = memo(function TerminalHeatTile({
|
|
589
|
-
id, x, y, width, height, label, value, colorValue, selected, events,
|
|
608
|
+
id, x, y, width, height, label, value, valueSuffix, colorValue, selected, events,
|
|
590
609
|
}: {
|
|
591
610
|
id: string;
|
|
592
611
|
x: number;
|
|
@@ -595,17 +614,21 @@ const TerminalHeatTile = memo(function TerminalHeatTile({
|
|
|
595
614
|
height: number;
|
|
596
615
|
label: string;
|
|
597
616
|
value: string | null;
|
|
617
|
+
valueSuffix: string | null;
|
|
598
618
|
colorValue: number | null;
|
|
599
619
|
selected: boolean;
|
|
600
620
|
events: SurfaceEvents;
|
|
601
621
|
}) {
|
|
622
|
+
// Read here, not passed down: a theme switch reaches every tile even though its props are the same.
|
|
623
|
+
const colors = useThemeColors();
|
|
602
624
|
const { background, foreground } = selected
|
|
603
|
-
? resolveHeatmapSelectedTileColors(colorValue)
|
|
604
|
-
: resolveHeatmapTileColors(colorValue);
|
|
625
|
+
? resolveHeatmapSelectedTileColors(colorValue, colors)
|
|
626
|
+
: resolveHeatmapTileColors(colorValue, colors);
|
|
605
627
|
const renderWidth = Math.max(1, width - (width >= 3 ? 1 : 0));
|
|
606
628
|
const renderHeight = Math.max(1, height - (height >= 2 ? 1 : 0));
|
|
607
629
|
const tier = heatTileLabelCells(renderWidth, renderHeight, label, value);
|
|
608
|
-
const
|
|
630
|
+
const shownValue = heatTileValueWithSuffix(value, valueSuffix, { width: renderWidth });
|
|
631
|
+
const lines = tier === "full" && shownValue ? [label, shownValue] : tier === "none" ? [] : [label];
|
|
609
632
|
const top = Math.max(0, Math.floor((renderHeight - lines.length) / 2));
|
|
610
633
|
return (
|
|
611
634
|
<Box
|
|
@@ -641,6 +664,7 @@ const TerminalHeatTile = memo(function TerminalHeatTile({
|
|
|
641
664
|
function TerminalHeatTreemap<T>({
|
|
642
665
|
scene, items, width, height, selectedId, onSelect, onActivate, otherSummary: summarizeOther,
|
|
643
666
|
}: HeatTreemapSurfaceProps<T>) {
|
|
667
|
+
const colors = useThemeColors();
|
|
644
668
|
const itemsById = useItemsById(scene, items);
|
|
645
669
|
const events = useSurfaceEvents(itemsById, onSelect, onActivate);
|
|
646
670
|
const other = scene.other;
|
|
@@ -688,6 +712,7 @@ function TerminalHeatTreemap<T>({
|
|
|
688
712
|
height={tile.height}
|
|
689
713
|
label={item.label}
|
|
690
714
|
value={item.primaryText ?? null}
|
|
715
|
+
valueSuffix={item.primaryTextSuffix ?? null}
|
|
691
716
|
colorValue={item.colorValue ?? null}
|
|
692
717
|
selected={tile.item.id === selectedId}
|
|
693
718
|
events={events}
|
|
@@ -701,12 +726,14 @@ function TerminalHeatTreemap<T>({
|
|
|
701
726
|
|
|
702
727
|
/**
|
|
703
728
|
* The heat map look of the treemap: optional sector and industry blocks,
|
|
704
|
-
* calm tiles (ticker, then the move, as space allows), a continuous
|
|
705
|
-
*
|
|
706
|
-
* a short pulse on a tile whose move jumps and a glide
|
|
729
|
+
* calm tiles (ticker, then the move, as space allows), a continuous scale
|
|
730
|
+
* from the theme's down colour to its up colour, and on the desktop a hover
|
|
731
|
+
* tooltip, colour fades, a short pulse on a tile whose move jumps and a glide
|
|
732
|
+
* when sizes change.
|
|
707
733
|
*/
|
|
708
734
|
export function HeatTreemapSurface<T>(props: HeatTreemapSurfaceProps<T>) {
|
|
709
735
|
const { nativePaneChrome } = useUiCapabilities();
|
|
736
|
+
const colors = useThemeColors();
|
|
710
737
|
if (props.scene.tiles.length === 0) {
|
|
711
738
|
return (
|
|
712
739
|
<Box width={props.width} height={props.height} paddingX={1} paddingY={1}>
|
|
@@ -57,6 +57,24 @@ export function heatTileLabelPx(width: number, height: number, ticker: string, v
|
|
|
57
57
|
return NO_LABEL;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
/**
|
|
61
|
+
* The move with its qualifier (an after-hours move's AH) where that still fits
|
|
62
|
+
* at the size the move alone was given, else the move alone. The qualifier
|
|
63
|
+
* never shrinks the text or drops the move.
|
|
64
|
+
*/
|
|
65
|
+
export function heatTileValueWithSuffix(
|
|
66
|
+
value: string | null,
|
|
67
|
+
suffix: string | null | undefined,
|
|
68
|
+
room: { width: number; valuePx?: number },
|
|
69
|
+
): string | null {
|
|
70
|
+
if (!value || !suffix) return value;
|
|
71
|
+
const withSuffix = `${value} ${suffix}`;
|
|
72
|
+
const width = room.valuePx == null
|
|
73
|
+
? withSuffix.length
|
|
74
|
+
: withSuffix.length * MONO_CHAR_EM * room.valuePx + TILE_PAD_X_PX * 2;
|
|
75
|
+
return width <= room.width ? withSuffix : value;
|
|
76
|
+
}
|
|
77
|
+
|
|
60
78
|
/** The same tiers on a cell grid: whole words or nothing, never a clipped ticker. */
|
|
61
79
|
export function heatTileLabelCells(width: number, height: number, ticker: string, value: string | null): HeatTileLabelTier {
|
|
62
80
|
if (width < ticker.length || height < 1 || ticker.length === 0) return "none";
|
|
@@ -4,6 +4,8 @@ export interface MetricTreemapItem<T = unknown> {
|
|
|
4
4
|
weight: number | null | undefined;
|
|
5
5
|
colorValue?: number | null;
|
|
6
6
|
primaryText?: string | null;
|
|
7
|
+
/** A short qualifier after primaryText, such as AH for an after-hours move; the heat map shows it where the tile has room. */
|
|
8
|
+
primaryTextSuffix?: string | null;
|
|
7
9
|
secondaryText?: string | null;
|
|
8
10
|
tertiaryText?: string | null;
|
|
9
11
|
/** Optional hierarchy for the heat map layout (a sector); the flat layouts ignore it. */
|