gloomberb 0.16.1 → 0.16.3
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 +69 -0
- package/src/cli/command-options.ts +74 -0
- package/src/cli/commands/command-utils.ts +37 -0
- package/src/cli/commands/crypto-hints.ts +75 -0
- package/src/cli/commands/market.ts +560 -136
- package/src/cli/commands/overview.ts +136 -48
- package/src/cli/commands/ticker.ts +220 -67
- package/src/cli/desktop-pane-shot.ts +37 -4
- package/src/cli/freshness.ts +61 -0
- package/src/cli/help.ts +27 -6
- package/src/cli/helpers.ts +4 -8
- package/src/cli/history-rows.ts +187 -15
- package/src/cli/index.ts +23 -8
- package/src/cli/listing-arg.ts +321 -0
- package/src/cli/options.ts +5 -1
- package/src/cli/pane-functions/access-gate.ts +42 -0
- package/src/cli/pane-functions/capabilities.ts +5 -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 +87 -16
- package/src/cli/pane-functions/freshness.ts +400 -0
- package/src/cli/pane-functions/function-help.ts +31 -22
- package/src/cli/pane-functions/headless.ts +201 -41
- package/src/cli/pane-functions/index.ts +24 -6
- package/src/cli/pane-functions/options.ts +3 -0
- package/src/cli/pane-functions/report.ts +12 -1
- package/src/cli/pane-functions/resolver.ts +63 -9
- package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
- package/src/cli/pane-functions/screenshot.ts +11 -3
- package/src/cli/registry.ts +6 -3
- package/src/cli/report-tables.ts +460 -0
- package/src/cli/result.ts +53 -29
- 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/export.ts +6 -51
- package/src/components/data-table/view.tsx +32 -11
- 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/active-drag.ts +67 -35
- package/src/components/layout/shell/cursor-occlusion.ts +6 -5
- package/src/components/layout/shell/drag/index.ts +12 -7
- package/src/components/layout/shell/drag/live.ts +122 -0
- package/src/components/layout/shell/drag/overlays.tsx +179 -35
- package/src/components/layout/shell/drag/runtime.ts +62 -50
- package/src/components/layout/shell/drag/slide.ts +10 -0
- package/src/components/layout/shell/index.tsx +37 -51
- package/src/components/layout/shell/menu.ts +2 -1
- package/src/components/layout/shell/native/pointer-runtime.ts +13 -13
- package/src/components/layout/shell/native/surfaces.ts +30 -14
- package/src/components/layout/shell/pane/actions.ts +2 -1
- package/src/components/layout/shell/pane/layers.tsx +419 -168
- package/src/components/layout/shell/terminal-pointer-runtime.ts +18 -18
- package/src/components/layout/shell/window-mode/overlays.tsx +12 -4
- 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/data/json-persistence.ts +17 -3
- package/src/data/json-storage.ts +2 -0
- package/src/data/memory-resource-store.ts +46 -0
- 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 +123 -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/freshness.ts +5 -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/pane-model.ts +10 -6
- 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 +2 -2
- 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/detail.tsx +1 -1
- 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 +2 -2
- 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/client.ts +3 -6
- package/src/plugins/builtin/holders/format.ts +31 -1
- package/src/plugins/builtin/holders/headless.ts +161 -6
- package/src/plugins/builtin/holders/index.tsx +10 -3
- package/src/plugins/builtin/holders/pane.tsx +42 -16
- package/src/plugins/builtin/holders/report-header.ts +136 -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/kelly-sizer/pane.tsx +12 -6
- package/src/plugins/builtin/kelly-sizer/portfolio.ts +25 -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 +23 -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 +249 -48
- package/src/plugins/builtin/portfolio-list/account-metrics.ts +16 -1
- package/src/plugins/builtin/portfolio-list/allocation.ts +248 -0
- package/src/plugins/builtin/portfolio-list/cached-account.ts +42 -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 +232 -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 +100 -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 +53 -16
- package/src/plugins/builtin/portfolio-list/settings.ts +33 -2
- package/src/plugins/builtin/portfolio-list/summary/index.tsx +46 -5
- package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +11 -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 +18 -6
- 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/reverse-dcf/model.ts +2 -1
- 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/members-menu.tsx +260 -0
- 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/short-volume/pane.tsx +1 -1
- package/src/plugins/builtin/social-mentions/headless.ts +1 -0
- package/src/plugins/builtin/social-mentions/pane.tsx +1 -1
- 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/themes/pane.tsx +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/financials/aggregation.ts +4 -0
- package/src/plugins/builtin/ticker-detail/financials/model.ts +25 -2
- package/src/plugins/builtin/ticker-detail/headless.ts +27 -5
- package/src/plugins/builtin/ticker-detail/index.tsx +1 -0
- package/src/plugins/builtin/ticker-detail/overview/model.ts +17 -5
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +27 -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 +159 -0
- package/src/plugins/builtin/world-venue-map/basemap.ts +232 -0
- package/src/plugins/builtin/world-venue-map/client.ts +45 -0
- package/src/plugins/builtin/world-venue-map/country-labels.ts +78 -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 +448 -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 +69 -6
- package/src/plugins/builtin/world-venue-map/layered-pane.tsx +565 -0
- package/src/plugins/builtin/world-venue-map/layers.ts +406 -0
- package/src/plugins/builtin/world-venue-map/map-symbols.ts +220 -0
- package/src/plugins/builtin/world-venue-map/map.tsx +557 -85
- package/src/plugins/builtin/world-venue-map/model.ts +23 -4
- package/src/plugins/builtin/world-venue-map/natural-earth/index.chunk.ts +202 -0
- package/src/plugins/builtin/world-venue-map/natural-earth/labels.chunk.ts +244 -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 +35 -44
- 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/browser/app-services.ts +3 -1
- package/src/renderers/dom/build-assets.ts +81 -3
- package/src/renderers/dom/data-table/dom.ts +31 -0
- package/src/renderers/dom/data-table/index.tsx +5 -0
- 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/box.tsx +113 -17
- package/src/renderers/dom/host/drag-shield.ts +24 -0
- package/src/renderers/dom/host/input.tsx +14 -3
- package/src/renderers/dom/host/live-frame.ts +54 -0
- package/src/renderers/dom/host/mouse.ts +8 -1
- package/src/renderers/dom/host/scroll-box.tsx +6 -5
- package/src/renderers/dom/host/tabs.tsx +3 -2
- package/src/renderers/dom/styles.css +16 -9
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +7 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +2 -0
- package/src/renderers/electrobun/bun/desktop/initialization.ts +13 -0
- package/src/renderers/electrobun/shared/protocol.ts +10 -1
- package/src/renderers/electrobun/view/backend-rpc.ts +10 -4
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +4 -0
- package/src/renderers/electrobun/view/host/native.ts +0 -10
- package/src/renderers/electrobun/view/host/window-move.ts +28 -0
- package/src/renderers/electrobun/view/remote/persistence.ts +15 -2
- package/src/renderers/electrobun/view/rpc-timeout.ts +14 -3
- package/src/renderers/electrobun/view/ui-host.tsx +2 -5
- package/src/renderers/opentui/host.tsx +5 -0
- package/src/renderers/opentui/ui-host.tsx +7 -1
- package/src/sources/gloomberb-cloud/index.ts +25 -4
- package/src/sources/gloomberb-cloud/normalizers.ts +43 -23
- package/src/sources/provider-router/batches.ts +3 -3
- package/src/sources/provider-router/cached-routes.ts +4 -1
- package/src/sources/provider-router/financial-routes.ts +2 -2
- package/src/sources/provider-router/financials.ts +76 -12
- package/src/sources/provider-router/history.ts +15 -10
- package/src/sources/provider-router/primary.ts +2 -2
- 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/state/pane-scroll-registry.tsx +67 -35
- 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/test-support/margin-account.ts +108 -0
- package/src/theme/heat-colors.ts +266 -84
- package/src/time-series/resolution.ts +15 -0
- 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 +35 -3
- 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 +26 -0
- package/src/ui/index.tsx +8 -3
- package/src/ui/scroll-box-axis.ts +26 -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 +19 -0
- package/src/utils/depositary-receipt.ts +70 -0
- package/src/utils/display-number.ts +63 -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/fundamentals.ts +17 -1
- package/src/utils/price-earnings.ts +70 -3
- package/src/utils/price-history-integrity.ts +19 -6
- 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
package/src/theme/heat-colors.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { colors } from "./colors";
|
|
2
|
-
import { blendHex, contrastRatio, relativeLuminance } from "./color-utils";
|
|
1
|
+
import { colors, type ThemeColors } from "./colors";
|
|
2
|
+
import { blendHex, contrastRatio, higherContrast, relativeLuminance } from "./color-utils";
|
|
3
3
|
|
|
4
4
|
const HEATMAP_BASE_BLEND = 0.35;
|
|
5
5
|
const HEATMAP_TEXT_MIN_CONTRAST = 4.5;
|
|
@@ -100,46 +100,66 @@ export function resolveHeatCellColors(
|
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
/**
|
|
103
|
-
* Heat map tiles
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
* block; the ends stay the same.
|
|
103
|
+
* Heat map tiles take their colours from the selected theme. Losses run from
|
|
104
|
+
* a muted middle to the theme's negative colour and gains to its positive, so
|
|
105
|
+
* the strongest tiles are the app's own down and up colours. The middle is
|
|
106
|
+
* the theme's neutral tone, lifted off a dark page or set into a light one
|
|
107
|
+
* just far enough to read as a tile. Colour builds in OKLab, hue ahead of
|
|
108
|
+
* lightness so a small move already leans to its side, and is full at 3%.
|
|
109
|
+
* Each tile takes whichever of the theme's light or dark text reads better
|
|
110
|
+
* on it, or white or black where neither reaches 4.5:1.
|
|
112
111
|
*/
|
|
113
112
|
const HEATMAP_TILE_FULL_SCALE_PERCENT = 3;
|
|
114
|
-
/** How fast colour builds from flat: below 1 a small move already leans to its
|
|
113
|
+
/** How fast colour builds from flat: below 1 a small move already leans to its side. */
|
|
115
114
|
const HEATMAP_TILE_EASING = 0.8;
|
|
115
|
+
/** Hue arrives ahead of lightness, so a mid-size move is a clear colour, not a grey. */
|
|
116
|
+
const HEATMAP_TILE_HUE_LEAD = 0.4;
|
|
116
117
|
const HEATMAP_TILE_TEXT_MIN_CONTRAST = 4.5;
|
|
117
|
-
|
|
118
|
-
const
|
|
119
|
-
/**
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
118
|
+
/** How far the flat middle stands off the page, as contrast against the background. */
|
|
119
|
+
const HEATMAP_FLAT_CONTRAST = { dark: 2.1, light: 1.4 } as const;
|
|
120
|
+
/** A missing move sits between the page and the flat middle: there, but saying nothing. */
|
|
121
|
+
const HEATMAP_MISSING_CONTRAST = { dark: 1.35, light: 1.16 } as const;
|
|
122
|
+
/** The middle keeps a hint of the theme's neutral tint, never a colour of its own. */
|
|
123
|
+
const HEATMAP_FLAT_MAX_CHROMA = 0.025;
|
|
124
|
+
const HEATMAP_MISSING_MAX_CHROMA = 0.008;
|
|
125
|
+
/** Light text tokens with more colour than this (a phosphor green, amber) are left off the tiles. */
|
|
126
|
+
const HEATMAP_INK_MAX_CHROMA = 0.06;
|
|
127
|
+
/** Luminance a token needs to count as the theme's light text, and may not exceed to count as its dark text. */
|
|
128
|
+
const HEATMAP_INK_LUMINANCE = { light: 0.6, dark: 0.05 } as const;
|
|
129
|
+
/** Below this an end has no hue to carry the scale. */
|
|
130
|
+
const HEATMAP_END_MIN_CHROMA = 0.05;
|
|
131
|
+
/** The full-strength end must stand this far from the flat middle... */
|
|
132
|
+
const HEATMAP_END_MIN_FROM_FLAT = 0.12;
|
|
133
|
+
/** ...and the two ends this far from each other. */
|
|
134
|
+
const HEATMAP_ENDS_MIN_APART = 0.15;
|
|
135
|
+
/**
|
|
136
|
+
* Only for a palette whose own up and down colours cannot carry the scale: an
|
|
137
|
+
* end too close to the page keeps its hue at this lightness, and an end with
|
|
138
|
+
* no hue, or two ends too alike, take the usual red and green.
|
|
139
|
+
*/
|
|
140
|
+
const HEATMAP_FALLBACK = {
|
|
141
|
+
lightness: { dark: 0.7, light: 0.52 },
|
|
142
|
+
chroma: 0.15,
|
|
143
|
+
lossHue: 25,
|
|
144
|
+
gainHue: 150,
|
|
129
145
|
} as const;
|
|
130
|
-
|
|
131
|
-
const
|
|
132
|
-
const
|
|
133
|
-
const HEATMAP_TEXT_DARK = "#0a0d1f";
|
|
134
|
-
/** Where neither white nor the navy reaches 4.5:1, black always does. */
|
|
135
|
-
const HEATMAP_TEXT_BLACK = "#000000";
|
|
146
|
+
/** How far a selected tile is pulled away from the page, further for a tile already near the end of the range. */
|
|
147
|
+
const HEATMAP_SELECTED_LIFT = { start: 0.45, step: 0.05, max: 0.8 } as const;
|
|
148
|
+
const HEATMAP_SELECTED_MIN_DISTANCE = 0.1;
|
|
136
149
|
const HEATMAP_STEPS = 64;
|
|
150
|
+
const HEATMAP_SCALE_CACHE_LIMIT = 32;
|
|
137
151
|
|
|
138
152
|
export interface HeatmapTileColors {
|
|
139
153
|
background: string;
|
|
140
154
|
foreground: string;
|
|
141
155
|
}
|
|
142
156
|
|
|
157
|
+
/** A selected tile's outline on the desktop and the web: a ring, then a hairline of the page. */
|
|
158
|
+
export interface HeatmapSelectionRing {
|
|
159
|
+
outer: string;
|
|
160
|
+
inner: string;
|
|
161
|
+
}
|
|
162
|
+
|
|
143
163
|
type Oklab = readonly [number, number, number];
|
|
144
164
|
|
|
145
165
|
function srgbToLinear(channel: number): number {
|
|
@@ -168,89 +188,253 @@ export function hexToOklab(hex: string): Oklab {
|
|
|
168
188
|
];
|
|
169
189
|
}
|
|
170
190
|
|
|
171
|
-
function
|
|
191
|
+
function oklabToLinear([lightness, a, b]: Oklab): [number, number, number] {
|
|
172
192
|
const l = (lightness + 0.3963377774 * a + 0.2158037573 * b) ** 3;
|
|
173
193
|
const m = (lightness - 0.1055613458 * a - 0.0638541728 * b) ** 3;
|
|
174
194
|
const s = (lightness - 0.0894841775 * a - 1.291485548 * b) ** 3;
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
195
|
+
return [
|
|
196
|
+
4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
|
|
197
|
+
-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
|
|
198
|
+
-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,
|
|
199
|
+
];
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function inGamut(color: Oklab): boolean {
|
|
203
|
+
return oklabToLinear(color).every((channel) => channel >= -0.0005 && channel <= 1.0005);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** Into sRGB by giving up chroma, never lightness or hue, so a clipped colour cannot drift toward another. */
|
|
207
|
+
function toGamut(color: Oklab): Oklab {
|
|
208
|
+
if (inGamut(color)) return color;
|
|
209
|
+
const [lightness, a, b] = color;
|
|
210
|
+
let low = 0;
|
|
211
|
+
let high = 1;
|
|
212
|
+
for (let index = 0; index < 20; index += 1) {
|
|
213
|
+
const mid = (low + high) / 2;
|
|
214
|
+
if (inGamut([lightness, a * mid, b * mid])) low = mid;
|
|
215
|
+
else high = mid;
|
|
216
|
+
}
|
|
217
|
+
return [lightness, a * low, b * low];
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function oklabToHex(color: Oklab): string {
|
|
221
|
+
return `#${oklabToLinear(toGamut(color)).map((channel) => linearToSrgb(channel).toString(16).padStart(2, "0")).join("")}`;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function chromaOf(color: Oklab): number {
|
|
225
|
+
return Math.hypot(color[1], color[2]);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function oklabDistance(left: Oklab, right: Oklab): number {
|
|
229
|
+
return Math.hypot(left[0] - right[0], left[1] - right[1], left[2] - right[2]);
|
|
179
230
|
}
|
|
180
231
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
232
|
+
/** The colour's hue at most `maxChroma` strong. */
|
|
233
|
+
function tint(color: Oklab, maxChroma: number): [number, number] {
|
|
234
|
+
const chroma = chromaOf(color);
|
|
235
|
+
const scale = chroma > maxChroma ? maxChroma / chroma : 1;
|
|
236
|
+
return [color[1] * scale, color[2] * scale];
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* The lightness at which a tile of this tint stands `contrast` off the page:
|
|
241
|
+
* above a dark page, below a light one.
|
|
242
|
+
*/
|
|
243
|
+
function standOffPage(page: string, [a, b]: readonly [number, number], contrast: number, dark: boolean): Oklab {
|
|
244
|
+
const pageLightness = hexToOklab(page)[0];
|
|
245
|
+
let low = dark ? pageLightness : 0;
|
|
246
|
+
let high = dark ? 1 : pageLightness;
|
|
247
|
+
for (let index = 0; index < 24; index += 1) {
|
|
248
|
+
const mid = (low + high) / 2;
|
|
249
|
+
const reaches = contrastRatio(oklabToHex([mid, a, b]), page) >= contrast;
|
|
250
|
+
if (dark === reaches) high = mid;
|
|
251
|
+
else low = mid;
|
|
252
|
+
}
|
|
253
|
+
return toGamut([dark ? high : low, a, b]);
|
|
184
254
|
}
|
|
185
255
|
|
|
186
|
-
|
|
256
|
+
interface HeatmapInks {
|
|
257
|
+
light: string;
|
|
258
|
+
dark: string;
|
|
259
|
+
}
|
|
187
260
|
|
|
188
|
-
/**
|
|
189
|
-
|
|
190
|
-
|
|
261
|
+
/**
|
|
262
|
+
* The theme's own text for tiles: its lightest near-neutral tone and its
|
|
263
|
+
* darkest, with white and black where the theme has none.
|
|
264
|
+
*/
|
|
265
|
+
function heatmapInks(palette: ThemeColors): HeatmapInks {
|
|
266
|
+
const tokens = [palette.textBright, palette.text, palette.selectedText, palette.headerText, palette.bg, palette.panel];
|
|
267
|
+
const lights = tokens.filter((token) => relativeLuminance(token) >= HEATMAP_INK_LUMINANCE.light && chromaOf(hexToOklab(token)) <= HEATMAP_INK_MAX_CHROMA);
|
|
268
|
+
const darks = tokens.filter((token) => relativeLuminance(token) <= HEATMAP_INK_LUMINANCE.dark);
|
|
191
269
|
return {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
h: from.h + turn * ratio,
|
|
270
|
+
light: lights.reduce((best, token) => (relativeLuminance(token) > relativeLuminance(best) ? token : best), lights[0] ?? "#ffffff"),
|
|
271
|
+
dark: darks.reduce((best, token) => (relativeLuminance(token) < relativeLuminance(best) ? token : best), darks[0] ?? "#000000"),
|
|
195
272
|
};
|
|
196
273
|
}
|
|
197
274
|
|
|
198
|
-
function heatmapTextColor(background: string): string {
|
|
199
|
-
const best =
|
|
275
|
+
function heatmapTextColor(background: string, inks: HeatmapInks): string {
|
|
276
|
+
const best = higherContrast(inks.light, inks.dark, background);
|
|
200
277
|
if (contrastRatio(best, background) >= HEATMAP_TILE_TEXT_MIN_CONTRAST) return best;
|
|
201
|
-
return
|
|
278
|
+
return higherContrast("#ffffff", "#000000", background);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
interface HeatmapEnd {
|
|
282
|
+
color: Oklab;
|
|
283
|
+
/** The theme's own token when it carries the scale as is. */
|
|
284
|
+
hex: string;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function fallbackEnd(hue: number, dark: boolean): HeatmapEnd {
|
|
288
|
+
const radians = hue * Math.PI / 180;
|
|
289
|
+
const color = toGamut([
|
|
290
|
+
dark ? HEATMAP_FALLBACK.lightness.dark : HEATMAP_FALLBACK.lightness.light,
|
|
291
|
+
HEATMAP_FALLBACK.chroma * Math.cos(radians),
|
|
292
|
+
HEATMAP_FALLBACK.chroma * Math.sin(radians),
|
|
293
|
+
]);
|
|
294
|
+
return { color, hex: oklabToHex(color) };
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* The theme's up or down colour as the end of the scale. One that sits too
|
|
299
|
+
* close to the page keeps its hue at a lightness that stands clear; one with
|
|
300
|
+
* no hue to speak of gives way to the fallback.
|
|
301
|
+
*/
|
|
302
|
+
function heatmapEnd(token: string, fallbackHue: number, flat: Oklab, page: Oklab, dark: boolean): HeatmapEnd {
|
|
303
|
+
const color = hexToOklab(token);
|
|
304
|
+
const chroma = chromaOf(color);
|
|
305
|
+
if (chroma < HEATMAP_END_MIN_CHROMA) return fallbackEnd(fallbackHue, dark);
|
|
306
|
+
if (oklabDistance(color, flat) >= HEATMAP_END_MIN_FROM_FLAT && oklabDistance(color, page) >= oklabDistance(flat, page)) {
|
|
307
|
+
return { color, hex: token };
|
|
308
|
+
}
|
|
309
|
+
const scale = Math.max(chroma, HEATMAP_FALLBACK.chroma) / chroma;
|
|
310
|
+
const lifted = toGamut([
|
|
311
|
+
dark ? HEATMAP_FALLBACK.lightness.dark : HEATMAP_FALLBACK.lightness.light,
|
|
312
|
+
color[1] * scale,
|
|
313
|
+
color[2] * scale,
|
|
314
|
+
]);
|
|
315
|
+
return { color: lifted, hex: oklabToHex(lifted) };
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
interface HeatmapScale {
|
|
319
|
+
/** 2 * HEATMAP_STEPS + 1 tiles from full loss to full gain. */
|
|
320
|
+
tiles: HeatmapTileColors[];
|
|
321
|
+
selected: HeatmapTileColors[];
|
|
322
|
+
missing: HeatmapTileColors;
|
|
323
|
+
missingSelected: HeatmapTileColors;
|
|
324
|
+
ring: HeatmapSelectionRing;
|
|
202
325
|
}
|
|
203
326
|
|
|
204
|
-
|
|
327
|
+
function buildHeatmapScale(palette: ThemeColors): HeatmapScale {
|
|
328
|
+
// Dark is defined as the theme defines it: text lighter than the page.
|
|
329
|
+
const dark = relativeLuminance(palette.text) > relativeLuminance(palette.bg);
|
|
330
|
+
const inks = heatmapInks(palette);
|
|
331
|
+
const page = hexToOklab(palette.bg);
|
|
332
|
+
// Halfway between the page's tint and the neutral's, so a warm page gets a warm grey and a black one the neutral's.
|
|
333
|
+
const neutral = hexToOklab(palette.neutral);
|
|
334
|
+
const grey: Oklab = [neutral[0], (page[1] + neutral[1]) / 2, (page[2] + neutral[2]) / 2];
|
|
335
|
+
const flat = standOffPage(palette.bg, tint(grey, HEATMAP_FLAT_MAX_CHROMA), dark ? HEATMAP_FLAT_CONTRAST.dark : HEATMAP_FLAT_CONTRAST.light, dark);
|
|
336
|
+
let loss = heatmapEnd(palette.negative, HEATMAP_FALLBACK.lossHue, flat, page, dark);
|
|
337
|
+
let gain = heatmapEnd(palette.positive, HEATMAP_FALLBACK.gainHue, flat, page, dark);
|
|
338
|
+
if (oklabDistance(loss.color, gain.color) < HEATMAP_ENDS_MIN_APART) {
|
|
339
|
+
loss = fallbackEnd(HEATMAP_FALLBACK.lossHue, dark);
|
|
340
|
+
gain = fallbackEnd(HEATMAP_FALLBACK.gainHue, dark);
|
|
341
|
+
}
|
|
205
342
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
343
|
+
const lift = dark ? inks.light : inks.dark;
|
|
344
|
+
const tile = (background: string): HeatmapTileColors => ({ background, foreground: heatmapTextColor(background, inks) });
|
|
345
|
+
const selectedTile = (background: string) => {
|
|
346
|
+
let ratio: number = HEATMAP_SELECTED_LIFT.start;
|
|
347
|
+
while (ratio < HEATMAP_SELECTED_LIFT.max && oklabDistance(hexToOklab(blendHex(background, lift, ratio)), hexToOklab(background)) < HEATMAP_SELECTED_MIN_DISTANCE) {
|
|
348
|
+
ratio += HEATMAP_SELECTED_LIFT.step;
|
|
349
|
+
}
|
|
350
|
+
return tile(blendHex(background, lift, Math.min(ratio, HEATMAP_SELECTED_LIFT.max)));
|
|
351
|
+
};
|
|
352
|
+
const tiles: HeatmapTileColors[] = [];
|
|
214
353
|
for (let step = -HEATMAP_STEPS; step <= HEATMAP_STEPS; step += 1) {
|
|
354
|
+
const end = step < 0 ? loss : gain;
|
|
355
|
+
if (Math.abs(step) === HEATMAP_STEPS) {
|
|
356
|
+
tiles.push(tile(end.hex));
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
215
359
|
const strength = (Math.abs(step) / HEATMAP_STEPS) ** HEATMAP_TILE_EASING;
|
|
216
|
-
const
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
360
|
+
const hue = strength ** HEATMAP_TILE_HUE_LEAD;
|
|
361
|
+
tiles.push(tile(oklabToHex([
|
|
362
|
+
flat[0] + (end.color[0] - flat[0]) * strength,
|
|
363
|
+
flat[1] + (end.color[1] - flat[1]) * hue,
|
|
364
|
+
flat[2] + (end.color[2] - flat[2]) * hue,
|
|
365
|
+
])));
|
|
221
366
|
}
|
|
222
|
-
|
|
223
|
-
|
|
367
|
+
const missing = tile(oklabToHex(standOffPage(
|
|
368
|
+
palette.bg,
|
|
369
|
+
tint(grey, HEATMAP_MISSING_MAX_CHROMA),
|
|
370
|
+
dark ? HEATMAP_MISSING_CONTRAST.dark : HEATMAP_MISSING_CONTRAST.light,
|
|
371
|
+
dark,
|
|
372
|
+
)));
|
|
373
|
+
return {
|
|
374
|
+
tiles,
|
|
375
|
+
selected: tiles.map(({ background }) => selectedTile(background)),
|
|
376
|
+
missing,
|
|
377
|
+
missingSelected: selectedTile(missing.background),
|
|
378
|
+
ring: { outer: lift, inner: palette.bg },
|
|
379
|
+
};
|
|
224
380
|
}
|
|
225
381
|
|
|
226
|
-
|
|
227
|
-
return relativeLuminance(colors.bg) > 0.4;
|
|
228
|
-
}
|
|
382
|
+
const heatmapScaleCache = new Map<string, HeatmapScale>();
|
|
229
383
|
|
|
230
384
|
/**
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
*
|
|
385
|
+
* Built once per palette and keyed by its colours, never by its name or a
|
|
386
|
+
* light or dark flag, so a theme switch or an edited palette recolours the
|
|
387
|
+
* map at once.
|
|
234
388
|
*/
|
|
235
|
-
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
389
|
+
function heatmapScale(palette: ThemeColors): HeatmapScale {
|
|
390
|
+
const key = `${palette.bg}|${palette.panel}|${palette.text}|${palette.textBright}|${palette.selectedText}|${palette.headerText}|${palette.neutral}|${palette.positive}|${palette.negative}`;
|
|
391
|
+
let scale = heatmapScaleCache.get(key);
|
|
392
|
+
if (!scale) {
|
|
393
|
+
scale = buildHeatmapScale(palette);
|
|
394
|
+
if (heatmapScaleCache.size >= HEATMAP_SCALE_CACHE_LIMIT) heatmapScaleCache.clear();
|
|
395
|
+
heatmapScaleCache.set(key, scale);
|
|
240
396
|
}
|
|
397
|
+
return scale;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
function heatmapStep(changePercent: number): number {
|
|
241
401
|
const ratio = Math.max(-1, Math.min(1, changePercent / HEATMAP_TILE_FULL_SCALE_PERCENT));
|
|
242
|
-
return
|
|
402
|
+
return Math.round(ratio * HEATMAP_STEPS) + HEATMAP_STEPS;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
function hasMove(changePercent: number | null | undefined): changePercent is number {
|
|
406
|
+
return changePercent != null && Number.isFinite(changePercent);
|
|
243
407
|
}
|
|
244
408
|
|
|
245
|
-
|
|
409
|
+
/**
|
|
410
|
+
* The tile colours for a day's move in percent. Full strength at +/-3%; a
|
|
411
|
+
* missing move is the theme's grey, never the flat colour, so it cannot pass
|
|
412
|
+
* for an unchanged price.
|
|
413
|
+
*/
|
|
414
|
+
export function resolveHeatmapTileColors(
|
|
415
|
+
changePercent: number | null | undefined,
|
|
416
|
+
palette: ThemeColors = colors,
|
|
417
|
+
): HeatmapTileColors {
|
|
418
|
+
const scale = heatmapScale(palette);
|
|
419
|
+
return hasMove(changePercent) ? scale.tiles[heatmapStep(changePercent)]! : scale.missing;
|
|
420
|
+
}
|
|
246
421
|
|
|
247
422
|
/**
|
|
248
423
|
* The selected tile on a cell grid, which cannot draw an outline: the same
|
|
249
|
-
* hue
|
|
424
|
+
* hue pulled away from the page, lighter on a dark theme and deeper on a
|
|
425
|
+
* light one, so the selection still says which way it moved.
|
|
250
426
|
*/
|
|
251
|
-
export function resolveHeatmapSelectedTileColors(
|
|
252
|
-
|
|
253
|
-
|
|
427
|
+
export function resolveHeatmapSelectedTileColors(
|
|
428
|
+
changePercent: number | null | undefined,
|
|
429
|
+
palette: ThemeColors = colors,
|
|
430
|
+
): HeatmapTileColors {
|
|
431
|
+
const scale = heatmapScale(palette);
|
|
432
|
+
return hasMove(changePercent) ? scale.selected[heatmapStep(changePercent)]! : scale.missingSelected;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/** The selected tile's outline where one can be drawn: the theme's text tone against the page, then a hairline of the page. */
|
|
436
|
+
export function resolveHeatmapSelectionRing(palette: ThemeColors = colors): HeatmapSelectionRing {
|
|
437
|
+
return heatmapScale(palette).ring;
|
|
254
438
|
}
|
|
255
439
|
|
|
256
440
|
const oklabCache = new Map<string, Oklab>();
|
|
@@ -267,7 +451,5 @@ export function heatmapColorDistance(left: string, right: string): number {
|
|
|
267
451
|
}
|
|
268
452
|
return value;
|
|
269
453
|
};
|
|
270
|
-
|
|
271
|
-
const [l2, a2, b2] = read(right);
|
|
272
|
-
return Math.hypot(l1 - l2, a1 - a2, b1 - b2);
|
|
454
|
+
return oklabDistance(read(left), read(right));
|
|
273
455
|
}
|
|
@@ -37,6 +37,21 @@ const RANGE_PRESET_RESOLUTION: Record<TimeRange, ManualChartResolution> = {
|
|
|
37
37
|
"ALL": "1mo",
|
|
38
38
|
};
|
|
39
39
|
|
|
40
|
+
/**
|
|
41
|
+
* The bar size a price history for a range is served in, unlike the chart
|
|
42
|
+
* presets above: what `gloomberb history` and the historical prices pane get.
|
|
43
|
+
*/
|
|
44
|
+
export const RANGE_HISTORY_RESOLUTION: Readonly<Record<TimeRange, ManualChartResolution>> = {
|
|
45
|
+
"1D": "5m",
|
|
46
|
+
"1W": "1h",
|
|
47
|
+
"1M": "1d",
|
|
48
|
+
"3M": "1d",
|
|
49
|
+
"6M": "1d",
|
|
50
|
+
"1Y": "1d",
|
|
51
|
+
"5Y": "1wk",
|
|
52
|
+
"ALL": "1mo",
|
|
53
|
+
};
|
|
54
|
+
|
|
40
55
|
const RANGE_PRELOAD_BUFFER: Record<TimeRange, TimeRange> = {
|
|
41
56
|
"1D": "1W",
|
|
42
57
|
"1W": "1M",
|
|
@@ -1647,7 +1647,7 @@ async function resolveChartSpecPass(
|
|
|
1647
1647
|
|| (request.bounds.end !== null && now() - (request.bounds.end + 1) < 60 * 60_000);
|
|
1648
1648
|
const staleCurrent = (value: LoadedPriceHistory) => currentWindow() && !!value.session
|
|
1649
1649
|
&& isPriceHistoryStaleForCurrentWindow(value.points, now(), {
|
|
1650
|
-
exchange: source.instrument.exchange, session: value.session,
|
|
1650
|
+
symbol: source.instrument.symbol, exchange: source.instrument.exchange, session: value.session,
|
|
1651
1651
|
...(value.resolution ? { intervalMs: CHART_RESOLUTION_STEP_MS[value.resolution] } : {}),
|
|
1652
1652
|
});
|
|
1653
1653
|
if (staleCurrent(loaded)) {
|
|
@@ -105,7 +105,7 @@ function freshSeedPoints(
|
|
|
105
105
|
// Broker contract/session interpretation remains unproven, as at acquisition.
|
|
106
106
|
const session = instrument.instrument ? undefined : result.session;
|
|
107
107
|
if (currentWindow && isIntradayResolution(resolution) && isPriceHistoryStaleForCurrentWindow(points, now, {
|
|
108
|
-
exchange: target.exchange, intervalMs: CHART_RESOLUTION_STEP_MS[resolution], session,
|
|
108
|
+
symbol: target.symbol, exchange: target.exchange, intervalMs: CHART_RESOLUTION_STEP_MS[resolution], session,
|
|
109
109
|
})) return null;
|
|
110
110
|
return points.length ? points : null;
|
|
111
111
|
}
|
|
@@ -80,6 +80,12 @@ export type ContextMenuContext =
|
|
|
80
80
|
layoutIndex: number;
|
|
81
81
|
layoutName: string;
|
|
82
82
|
active: boolean;
|
|
83
|
+
}
|
|
84
|
+
| {
|
|
85
|
+
/** A person's name or @mention in the chat. */
|
|
86
|
+
kind: "chat-user";
|
|
87
|
+
userId: string;
|
|
88
|
+
username: string | null;
|
|
83
89
|
};
|
|
84
90
|
|
|
85
91
|
export function hasRunnableContextMenuItem(items: readonly ContextMenuItem[]): boolean {
|
|
@@ -116,6 +116,8 @@ export interface MarketDataRequestContext {
|
|
|
116
116
|
historyRequestKey?: string;
|
|
117
117
|
/** Intraday history should include pre-market and after-hours bars where the source has them. */
|
|
118
118
|
historySession?: "extended";
|
|
119
|
+
/** The listing's company, from its own quote: an SEC lookup for a non-US listing checks the registrant against it. */
|
|
120
|
+
listingName?: string;
|
|
119
121
|
}
|
|
120
122
|
|
|
121
123
|
export interface CachedFinancialsTarget {
|
package/src/types/financials.ts
CHANGED
|
@@ -38,7 +38,21 @@ export interface QuoteMetadata {
|
|
|
38
38
|
fieldSources?: Partial<Record<"currency" | "instrumentType", QuoteMetadataSource>>;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
/**
|
|
42
|
+
* What a record's share counts count: depositary receipts or the ordinary
|
|
43
|
+
* shares behind them. Gloom Cloud states it only when it established it.
|
|
44
|
+
*/
|
|
45
|
+
export type ShareBasis = "depositary_receipt" | "ordinary";
|
|
46
|
+
|
|
47
|
+
/** How a depositary receipt relates to the ordinary shares, as Gloom Cloud states it. */
|
|
48
|
+
interface DepositaryReceiptFacts {
|
|
49
|
+
/** Whether the listing is a depositary receipt; absent when unknown. */
|
|
50
|
+
isDepositaryReceipt?: boolean;
|
|
51
|
+
/** Ordinary shares per receipt, on a receipt's own records. */
|
|
52
|
+
adrRatio?: number;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface Quote extends DepositaryReceiptFacts {
|
|
42
56
|
/** Applies to this price observation; a stored position cannot supply it. */
|
|
43
57
|
priceBasis?: PriceBasis;
|
|
44
58
|
/** Daily fund net asset value; independent of the units used to format its price. */
|
|
@@ -58,6 +72,9 @@ export interface Quote {
|
|
|
58
72
|
regularClose?: number;
|
|
59
73
|
/** Exchange-local date of regularClose; separate from the daily previous-close reference. */
|
|
60
74
|
regularCloseSessionDate?: string;
|
|
75
|
+
/** Move of that completed regular session from the one before it, in this quote's currency; set and cleared together with regularClose. */
|
|
76
|
+
regularChange?: number;
|
|
77
|
+
regularChangePercent?: number;
|
|
61
78
|
/** Provider's exchange-local session date for the daily quote reference. */
|
|
62
79
|
changeSessionDate?: string;
|
|
63
80
|
high52w?: number;
|
|
@@ -106,7 +123,11 @@ export interface QuoteContribution extends Quote {
|
|
|
106
123
|
|
|
107
124
|
export type QuoteContributionMap = Record<string, QuoteContribution>;
|
|
108
125
|
|
|
109
|
-
export interface Fundamentals {
|
|
126
|
+
export interface Fundamentals extends DepositaryReceiptFacts {
|
|
127
|
+
/** Every share count here is on this basis, the basis of the listing's price and market cap; absent when unproven. */
|
|
128
|
+
shareBasis?: ShareBasis;
|
|
129
|
+
/** On a receipt, the ordinary shares behind `sharesOutstanding`. */
|
|
130
|
+
underlyingOrdinaryShares?: number;
|
|
110
131
|
source?: "gloom";
|
|
111
132
|
fetchedAt?: string;
|
|
112
133
|
stale?: boolean;
|
|
@@ -177,6 +198,8 @@ export interface HolderRecord {
|
|
|
177
198
|
percentHeld?: number;
|
|
178
199
|
changeShares?: number;
|
|
179
200
|
changePercent?: number;
|
|
201
|
+
/** Set when the position's filing ties it to the receipts or to the ordinary shares. */
|
|
202
|
+
shareBasis?: ShareBasis;
|
|
180
203
|
}
|
|
181
204
|
|
|
182
205
|
interface HolderSummary {
|
|
@@ -186,11 +209,18 @@ interface HolderSummary {
|
|
|
186
209
|
institutionsCount?: number;
|
|
187
210
|
}
|
|
188
211
|
|
|
189
|
-
export interface HolderData {
|
|
212
|
+
export interface HolderData extends DepositaryReceiptFacts {
|
|
190
213
|
providerId?: string;
|
|
191
214
|
symbol: string;
|
|
192
215
|
name?: string;
|
|
216
|
+
/** The listing's price currency. */
|
|
193
217
|
currency?: string;
|
|
218
|
+
/** The currency of `value`, which can differ from the listing's (USD on a London line priced from 13F filings). */
|
|
219
|
+
valueCurrency?: string;
|
|
220
|
+
/** Reported shares times the latest price, or times the price at the report date. */
|
|
221
|
+
valueBasis?: "latest_price" | "period_end_price";
|
|
222
|
+
/** Set when every row is on one basis. */
|
|
223
|
+
shareBasis?: ShareBasis;
|
|
194
224
|
exchange?: string;
|
|
195
225
|
asOf?: string;
|
|
196
226
|
summary?: HolderSummary;
|
|
@@ -427,6 +457,8 @@ export interface ReportedEarningsCohort {
|
|
|
427
457
|
export interface EarningsResultProvenance { version: 1; reported: ReportedEarningsCohort }
|
|
428
458
|
|
|
429
459
|
export interface FinancialStatement {
|
|
460
|
+
/** The basis of this row's share counts and per-share earnings; absent when unproven. */
|
|
461
|
+
shareBasis?: ShareBasis;
|
|
430
462
|
/** @deprecated No longer populated. */
|
|
431
463
|
earningsResult?: EarningsResultProvenance;
|
|
432
464
|
/** EPS lines unavailable for this period, for example because they disagree with the row's own income and shares. */
|