gloomberb 0.16.0 → 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 +44 -11
- package/src/api-client/errors.ts +12 -0
- package/src/api-client/geo.ts +363 -0
- package/src/api-client/index.ts +5 -0
- package/src/api-client/market-discovery.ts +10 -0
- package/src/api-client/members.ts +26 -0
- package/src/api-client/paths.ts +30 -1
- package/src/api-client/perps.ts +41 -0
- package/src/api-client/request.ts +5 -2
- package/src/api-client/types.ts +9 -1
- package/src/app/global-shortcuts.ts +14 -6
- package/src/app/keybindings/actions.ts +1 -1
- package/src/app/runtime/update.ts +38 -2
- package/src/app.tsx +10 -6
- 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 +36 -22
- 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/commands/collection.ts +5 -1
- 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/root/command-items.ts +9 -2
- package/src/components/command-bar/routes/root/plugin-install.ts +2 -2
- package/src/components/command-bar/routes/root/provider-search.ts +19 -5
- package/src/components/command-bar/routes/root/runtime.ts +14 -5
- package/src/components/command-bar/routes/ticker-search/actions.ts +5 -0
- package/src/components/command-bar/routes/ticker-search/results.ts +31 -5
- package/src/components/command-bar/routes/ticker-search/route.ts +2 -2
- package/src/components/command-bar/routing/actions.ts +2 -0
- package/src/components/command-bar/selection-runtime.ts +38 -0
- package/src/components/command-bar/surface/index.tsx +7 -2
- 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/index.ts +2 -2
- package/src/components/layout/detached-pane-shell.tsx +6 -3
- package/src/components/layout/floating-pane.tsx +6 -0
- package/src/components/layout/header.tsx +24 -7
- package/src/components/layout/missing-pane.tsx +2 -2
- 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 +61 -28
- package/src/components/layout/pane/index.tsx +6 -0
- package/src/components/layout/pane/title.ts +31 -7
- package/src/components/layout/shell/drag/index.ts +6 -5
- package/src/components/layout/shell/drag/runtime.ts +3 -0
- package/src/components/layout/shell/index.tsx +6 -0
- 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 +29 -10
- package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -3
- package/src/components/layout/shell/ticker-link-menu.ts +23 -9
- package/src/components/metric-treemap/heat-surface.tsx +745 -0
- package/src/components/metric-treemap/heat-tiles.ts +228 -0
- package/src/components/metric-treemap/index.tsx +2 -0
- package/src/components/metric-treemap/layout.ts +8 -0
- package/src/components/metric-treemap/scene.ts +432 -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/pane-settings-dialog/field-dialogs.tsx +1 -0
- package/src/components/ticker/list-table-view.tsx +13 -1
- package/src/components/toggle-list.tsx +38 -12
- package/src/components/ui/country-flag-art.tsx +449 -0
- package/src/components/ui/country-flag.tsx +41 -0
- package/src/components/ui/data-table/types.ts +13 -0
- package/src/components/ui/fields.tsx +8 -0
- package/src/components/ui/icon.tsx +2 -0
- package/src/components/ui/index.ts +4 -0
- package/src/components/ui/multi-select/dialog.tsx +108 -22
- package/src/components/ui/range-track.tsx +53 -0
- package/src/components/ui/status.tsx +8 -2
- package/src/components/ui/tabs.tsx +11 -4
- package/src/components/ui/text-prompt-dialog.tsx +4 -2
- package/src/core/state/app/types.ts +10 -1
- package/src/data/config/store/normalize.ts +17 -1
- package/src/i18n/es.ts +24 -4
- package/src/i18n/ja.ts +24 -4
- package/src/i18n/ko.ts +24 -4
- package/src/i18n/zh-cn.ts +24 -4
- package/src/i18n/zh-tw.ts +24 -4
- package/src/layout/ticker-navigation.ts +28 -2
- 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 +8 -0
- package/src/market-data/quotes/freshness.ts +36 -0
- package/src/market-data/quotes/resolution.ts +24 -8
- package/src/market-data/quotes/screener-live-quotes.ts +49 -4
- package/src/market-data/quotes/time.ts +16 -0
- 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 +330 -79
- package/src/plugins/builtin/analytics/risk-fx.ts +102 -0
- package/src/plugins/builtin/analytics/risk-headless.ts +61 -49
- package/src/plugins/builtin/analytics/risk-math.ts +33 -13
- package/src/plugins/builtin/analytics/risk-model.ts +282 -64
- package/src/plugins/builtin/analytics/risk-pane.tsx +62 -30
- package/src/plugins/builtin/analytics/risk-test-data.ts +206 -0
- 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/cells.tsx +15 -12
- package/src/plugins/builtin/buildout/detail/company.tsx +3 -3
- package/src/plugins/builtin/buildout/detail/index.tsx +0 -1
- package/src/plugins/builtin/buildout/detail/intel.tsx +6 -6
- package/src/plugins/builtin/buildout/detail/site.tsx +4 -7
- package/src/plugins/builtin/buildout/detail/ui.tsx +0 -19
- package/src/plugins/builtin/buildout/index.tsx +1 -0
- package/src/plugins/builtin/catalysts/headless.ts +3 -1
- package/src/plugins/builtin/catalysts/index.tsx +2 -2
- package/src/plugins/builtin/catalysts/pane.tsx +3 -1
- package/src/plugins/builtin/cds/headless.ts +2 -0
- package/src/plugins/builtin/cds/index.tsx +1 -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/debt-maturities/wall-bar.tsx +14 -41
- package/src/plugins/builtin/dividend-yield/client.ts +4 -2
- 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/client.ts +2 -2
- package/src/plugins/builtin/earnings/headless.ts +5 -0
- package/src/plugins/builtin/earnings-calls/headless.ts +1 -0
- package/src/plugins/builtin/earnings-calls/index.tsx +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/fx-matrix/direction.ts +81 -0
- package/src/plugins/builtin/fx-matrix/index.tsx +71 -33
- package/src/plugins/builtin/fx-matrix/live-legs.ts +17 -0
- package/src/plugins/builtin/fx-matrix/pairs.ts +68 -14
- package/src/plugins/builtin/fx-matrix/settings.ts +62 -0
- 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/jobs/index.tsx +1 -0
- package/src/plugins/builtin/jobs/share-bars.tsx +5 -28
- 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 +30 -2
- package/src/plugins/builtin/market-heatmap/headless.ts +135 -0
- package/src/plugins/builtin/market-heatmap/index.tsx +245 -81
- package/src/plugins/builtin/market-heatmap/live.ts +88 -0
- package/src/plugins/builtin/market-heatmap/model.ts +146 -0
- package/src/plugins/builtin/market-heatmap/portfolio.ts +50 -11
- package/src/plugins/builtin/market-movers/client.ts +3 -2
- package/src/plugins/builtin/market-movers/headless.ts +10 -1
- package/src/plugins/builtin/market-movers/screener.ts +18 -5
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/members/client.ts +53 -0
- package/src/plugins/builtin/members/headless.ts +35 -0
- package/src/plugins/builtin/members/index.tsx +20 -0
- package/src/plugins/builtin/members/model.ts +68 -0
- package/src/plugins/builtin/members/pane.tsx +175 -0
- package/src/plugins/builtin/mna/distress/headless.ts +1 -0
- package/src/plugins/builtin/mna/headless.ts +1 -0
- package/src/plugins/builtin/mna/index.tsx +2 -1
- package/src/plugins/builtin/mna/pane.tsx +5 -2
- 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/index.tsx +2 -1
- 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 +74 -2
- package/src/plugins/builtin/pe-band/headless.ts +26 -8
- package/src/plugins/builtin/pe-band/model.ts +102 -22
- package/src/plugins/builtin/pe-band/pane.tsx +34 -16
- package/src/plugins/builtin/pe-band/report-dates.ts +78 -0
- package/src/plugins/builtin/perps/client.ts +66 -5
- package/src/plugins/builtin/perps/equity-identity.ts +16 -0
- package/src/plugins/builtin/perps/equity-row.tsx +6 -4
- 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/plugin-marketplace/activation.ts +19 -0
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +2 -2
- package/src/plugins/builtin/plugin-marketplace/store.ts +2 -0
- 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/quick-add/index.tsx +43 -2
- package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +48 -5
- 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/scanner/hilo-bars.tsx +12 -70
- package/src/plugins/builtin/scanner/hilo-model.ts +0 -18
- 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/move-bar.tsx +10 -32
- 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/social-mentions/index.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/thirteenf/headless.ts +110 -25
- package/src/plugins/builtin/thirteenf/index.tsx +2 -1
- 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/components.tsx +5 -60
- package/src/plugins/builtin/ticker-detail/overview/model.ts +9 -2
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +1 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +26 -26
- package/src/plugins/builtin/ticker-detail/pane.tsx +1 -1
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +7 -1
- package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +20 -4
- package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +2 -2
- package/src/plugins/builtin/time-sales/headless.ts +5 -1
- package/src/plugins/builtin/treasury-auctions/headless.ts +1 -0
- package/src/plugins/builtin/vol-surface/index.tsx +1 -1
- 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/catalog-browser.ts +2 -0
- package/src/plugins/catalog-manifest.ts +1 -0
- package/src/plugins/catalog-ui.ts +3 -1
- package/src/plugins/catalog.ts +1 -1
- package/src/plugins/host-link.ts +33 -1
- package/src/plugins/installer.ts +48 -12
- package/src/plugins/loader.ts +30 -3
- package/src/plugins/manager-node.ts +15 -5
- package/src/plugins/registry/index.ts +1 -1
- package/src/plugins/registry/pane-settings.ts +26 -7
- package/src/public/__snapshots__/public-api.test.ts.snap +2 -0
- package/src/renderers/dom/build-assets.ts +81 -3
- package/src/renderers/dom/data-table/row.tsx +52 -16
- package/src/renderers/dom/desktop/controls.tsx +7 -3
- package/src/renderers/dom/desktop/icons.tsx +1 -0
- 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 +69 -26
- package/src/renderers/dom/host/input.tsx +14 -3
- package/src/renderers/dom/host/tabs.tsx +37 -1
- package/src/renderers/dom/styles.css +41 -7
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +11 -6
- package/src/renderers/electrobun/bun/desktop/backend.ts +1 -0
- package/src/renderers/electrobun/bun/desktop/update.ts +181 -87
- package/src/renderers/electrobun/bun/index.ts +73 -6
- package/src/renderers/electrobun/bun/window/remembered-frame.ts +122 -0
- package/src/renderers/electrobun/shared/protocol.ts +3 -0
- package/src/renderers/electrobun/view/backend-rpc.ts +10 -4
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +3 -1
- package/src/renderers/electrobun/view/main.tsx +7 -1
- package/src/renderers/electrobun/view/renderer-window-error.ts +18 -0
- package/src/renderers/electrobun/view/rpc-timeout.ts +14 -3
- package/src/renderers/electrobun/view/update-host.ts +45 -21
- package/src/renderers/opentui/host.tsx +5 -0
- package/src/sources/gloomberb-cloud/index.ts +25 -4
- package/src/sources/gloomberb-cloud/normalizers.ts +36 -5
- package/src/sources/provider-router/cached-routes.ts +4 -1
- package/src/sources/provider-router/financials.ts +11 -8
- 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/benign-window-error.ts +7 -0
- package/src/telemetry/crash-reports-dom.ts +2 -0
- package/src/telemetry/crash-reports.ts +4 -1
- package/src/test-support/cli-context.ts +10 -2
- package/src/test-support/daily-nav.ts +25 -0
- package/src/theme/heat-colors.ts +357 -2
- package/src/tickers/instrument-kind.ts +34 -7
- package/src/tickers/search/asset-classes.ts +24 -9
- package/src/tickers/search/index.ts +44 -11
- package/src/tickers/search/ranking.ts +23 -3
- 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 +5 -0
- package/src/types/headless.ts +79 -2
- package/src/types/plugin.ts +38 -6
- package/src/types/ticker.ts +15 -0
- package/src/ui/context-menu.tsx +1 -0
- package/src/ui/host.tsx +16 -0
- package/src/updater/index.ts +38 -13
- 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
|
@@ -2,12 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
4
4
|
import { createPortal } from "react-dom";
|
|
5
|
-
import type { HostPopoverProps } from "../../../ui";
|
|
5
|
+
import type { BoxRenderable, HostPopoverProps } from "../../../ui";
|
|
6
6
|
import { blendHex } from "../../../theme/colors";
|
|
7
|
+
import { WEB_CELL_HEIGHT, WEB_CELL_WIDTH } from "../../../theme/font-scale";
|
|
7
8
|
import { useThemeColors } from "../../../theme/theme-context";
|
|
8
9
|
|
|
9
10
|
const VIEWPORT_MARGIN = 10;
|
|
11
|
+
/** How far a popover kept inside its pane stays off the pane's edge. */
|
|
12
|
+
const PANE_MARGIN = 4;
|
|
10
13
|
const POPOVER_GAP = 6;
|
|
14
|
+
const PANE_SELECTOR = '[data-gloom-role="pane-window"], [data-gloom-role="detached-pane-window"]';
|
|
11
15
|
/** `.gloom-popover` in styles.css: above dialogs and toasts. */
|
|
12
16
|
const POPOVER_Z_INDEX = 10_001;
|
|
13
17
|
|
|
@@ -21,6 +25,51 @@ function cssSize(value: number | string | undefined): number | string | undefine
|
|
|
21
25
|
return typeof value === "number" ? `${value}px` : value;
|
|
22
26
|
}
|
|
23
27
|
|
|
28
|
+
interface Edges {
|
|
29
|
+
left: number;
|
|
30
|
+
top: number;
|
|
31
|
+
right: number;
|
|
32
|
+
bottom: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Where an anchor element is now, in viewport pixels. Null once it is gone
|
|
37
|
+
* from the page (a removed message), so the popover falls back to its trigger.
|
|
38
|
+
*/
|
|
39
|
+
function anchorEdges(anchor: BoxRenderable): Edges | null {
|
|
40
|
+
const rect = anchor.getBoundingClientRect?.();
|
|
41
|
+
if (rect) {
|
|
42
|
+
if (rect.width === 0 && rect.height === 0) return null;
|
|
43
|
+
return { left: rect.x, top: rect.y, right: rect.x + rect.width, bottom: rect.y + rect.height };
|
|
44
|
+
}
|
|
45
|
+
const bounds = anchor.absoluteBounds;
|
|
46
|
+
if (!bounds) return null;
|
|
47
|
+
return {
|
|
48
|
+
left: bounds.x * WEB_CELL_WIDTH,
|
|
49
|
+
top: bounds.y * WEB_CELL_HEIGHT,
|
|
50
|
+
right: (bounds.x + bounds.width) * WEB_CELL_WIDTH,
|
|
51
|
+
bottom: (bounds.y + bounds.height) * WEB_CELL_HEIGHT,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** The area a popover must stay in: the window, and for `pane` the pane that holds its trigger too. */
|
|
56
|
+
function placementEdges(wrapper: Element | null, boundary: HostPopoverProps["boundary"]): Edges {
|
|
57
|
+
const viewport = {
|
|
58
|
+
left: VIEWPORT_MARGIN,
|
|
59
|
+
top: VIEWPORT_MARGIN,
|
|
60
|
+
right: window.innerWidth - VIEWPORT_MARGIN,
|
|
61
|
+
bottom: window.innerHeight - VIEWPORT_MARGIN,
|
|
62
|
+
};
|
|
63
|
+
const pane = boundary === "pane" ? wrapper?.closest(PANE_SELECTOR)?.getBoundingClientRect() : null;
|
|
64
|
+
if (!pane) return viewport;
|
|
65
|
+
return {
|
|
66
|
+
left: Math.max(viewport.left, pane.left + PANE_MARGIN),
|
|
67
|
+
top: Math.max(viewport.top, pane.top + PANE_MARGIN),
|
|
68
|
+
right: Math.min(viewport.right, pane.right - PANE_MARGIN),
|
|
69
|
+
bottom: Math.min(viewport.bottom, pane.bottom - PANE_MARGIN),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
24
73
|
/**
|
|
25
74
|
* The popover is portalled to <body>, so its z-index only competes in the root
|
|
26
75
|
* stacking context. A trigger inside a surface stacked above the popover layer
|
|
@@ -45,6 +94,10 @@ export function WebPopover({
|
|
|
45
94
|
trigger,
|
|
46
95
|
children,
|
|
47
96
|
anchorPoint,
|
|
97
|
+
anchor,
|
|
98
|
+
boundary = "viewport",
|
|
99
|
+
onPointerEnter,
|
|
100
|
+
onPointerLeave,
|
|
48
101
|
placement = "bottom-start",
|
|
49
102
|
minWidth = 280,
|
|
50
103
|
maxWidth = "min(420px, calc(100vw - 20px))",
|
|
@@ -59,18 +112,19 @@ export function WebPopover({
|
|
|
59
112
|
const [zIndex, setZIndex] = useState<number | undefined>(undefined);
|
|
60
113
|
|
|
61
114
|
const updatePosition = useCallback(() => {
|
|
62
|
-
const
|
|
115
|
+
const wrapper = anchorRef.current;
|
|
63
116
|
const popover = popoverRef.current;
|
|
64
|
-
if (!
|
|
117
|
+
if (!wrapper || !popover) return;
|
|
65
118
|
|
|
66
119
|
const popoverRect = popover.getBoundingClientRect();
|
|
67
|
-
const triggerRect =
|
|
120
|
+
const triggerRect = wrapper.getBoundingClientRect();
|
|
121
|
+
const elementEdges = anchor ? anchorEdges(anchor) : null;
|
|
68
122
|
// Keyboard-driven popovers can intentionally omit a visible trigger. In
|
|
69
123
|
// that case the anchor wrapper still inherits a line-height, so its DOM
|
|
70
124
|
// rect is not truly empty even though there is nothing useful to anchor to.
|
|
71
125
|
// Center these unanchored menus; explicit pointer/footer coordinates still
|
|
72
126
|
// take precedence below.
|
|
73
|
-
if (!anchorPoint && (trigger == null || (triggerRect.width === 0 && triggerRect.height === 0))) {
|
|
127
|
+
if (!elementEdges && !anchorPoint && (trigger == null || (triggerRect.width === 0 && triggerRect.height === 0))) {
|
|
74
128
|
setPosition({
|
|
75
129
|
left: Math.max(
|
|
76
130
|
VIEWPORT_MARGIN,
|
|
@@ -90,28 +144,26 @@ export function WebPopover({
|
|
|
90
144
|
});
|
|
91
145
|
return;
|
|
92
146
|
}
|
|
93
|
-
const anchorRect = anchorPoint
|
|
147
|
+
const anchorRect = elementEdges ?? (anchorPoint
|
|
94
148
|
? {
|
|
95
149
|
left: anchorPoint.x,
|
|
96
150
|
right: anchorPoint.x,
|
|
97
151
|
top: anchorPoint.y,
|
|
98
152
|
bottom: anchorPoint.y,
|
|
99
153
|
}
|
|
100
|
-
: triggerRect;
|
|
154
|
+
: triggerRect);
|
|
155
|
+
const edges = placementEdges(wrapper, boundary);
|
|
101
156
|
const preferredLeft = placement === "bottom-end"
|
|
102
157
|
? anchorRect.right - popoverRect.width
|
|
103
158
|
: anchorRect.left;
|
|
104
|
-
const left = Math.max(
|
|
105
|
-
VIEWPORT_MARGIN,
|
|
106
|
-
Math.min(preferredLeft, window.innerWidth - popoverRect.width - VIEWPORT_MARGIN),
|
|
107
|
-
);
|
|
159
|
+
const left = Math.max(edges.left, Math.min(preferredLeft, edges.right - popoverRect.width));
|
|
108
160
|
const below = anchorRect.bottom + POPOVER_GAP;
|
|
109
161
|
const above = anchorRect.top - popoverRect.height - POPOVER_GAP;
|
|
110
|
-
const top = below + popoverRect.height <=
|
|
162
|
+
const top = below + popoverRect.height <= edges.bottom
|
|
111
163
|
? below
|
|
112
|
-
: Math.max(
|
|
164
|
+
: Math.max(edges.top, above);
|
|
113
165
|
setPosition({ left, top, visible: true });
|
|
114
|
-
}, [anchorPoint, placement, trigger]);
|
|
166
|
+
}, [anchor, anchorPoint, boundary, placement, trigger]);
|
|
115
167
|
|
|
116
168
|
useLayoutEffect(() => {
|
|
117
169
|
if (!open) {
|
|
@@ -123,10 +175,15 @@ export function WebPopover({
|
|
|
123
175
|
const frame = window.requestAnimationFrame(updatePosition);
|
|
124
176
|
window.addEventListener("resize", updatePosition);
|
|
125
177
|
document.addEventListener("scroll", updatePosition, true);
|
|
178
|
+
// New content (a hover card swapped to another name) can change the size
|
|
179
|
+
// the placement was worked out for.
|
|
180
|
+
const resizeObserver = typeof ResizeObserver === "function" ? new ResizeObserver(updatePosition) : null;
|
|
181
|
+
if (popoverRef.current) resizeObserver?.observe(popoverRef.current);
|
|
126
182
|
return () => {
|
|
127
183
|
window.cancelAnimationFrame(frame);
|
|
128
184
|
window.removeEventListener("resize", updatePosition);
|
|
129
185
|
document.removeEventListener("scroll", updatePosition, true);
|
|
186
|
+
resizeObserver?.disconnect();
|
|
130
187
|
};
|
|
131
188
|
}, [open, updatePosition]);
|
|
132
189
|
|
|
@@ -181,6 +238,8 @@ export function WebPopover({
|
|
|
181
238
|
tabIndex={-1}
|
|
182
239
|
onMouseDown={(event) => event.stopPropagation()}
|
|
183
240
|
onClick={(event) => event.stopPropagation()}
|
|
241
|
+
onMouseEnter={onPointerEnter}
|
|
242
|
+
onMouseLeave={onPointerLeave}
|
|
184
243
|
style={{
|
|
185
244
|
left: position.left,
|
|
186
245
|
top: position.top,
|
|
@@ -88,11 +88,45 @@ export const WebBox = forwardRef<HTMLDivElement, Record<string, unknown> & { chi
|
|
|
88
88
|
});
|
|
89
89
|
};
|
|
90
90
|
|
|
91
|
+
const lastPointRef = useRef({ x: 0, y: 0 });
|
|
92
|
+
const dragSessionRef = useRef<{
|
|
93
|
+
move: (event: globalThis.MouseEvent) => void;
|
|
94
|
+
up: (event: globalThis.MouseEvent) => void;
|
|
95
|
+
cancel: () => void;
|
|
96
|
+
} | null>(null);
|
|
97
|
+
const endDocumentDragRef = useRef<(event: globalThis.MouseEvent | null, notify: boolean) => void>(() => {});
|
|
98
|
+
endDocumentDragRef.current = (event, notify) => {
|
|
99
|
+
const session = dragSessionRef.current;
|
|
100
|
+
const wasDragging = draggingRef.current;
|
|
101
|
+
if (!session && !wasDragging) return;
|
|
102
|
+
draggingRef.current = false;
|
|
103
|
+
dragSessionRef.current = null;
|
|
104
|
+
document.body.classList.remove("gloom-dragging");
|
|
105
|
+
if (session) {
|
|
106
|
+
document.removeEventListener("mousemove", session.move);
|
|
107
|
+
document.removeEventListener("mouseup", session.up);
|
|
108
|
+
document.removeEventListener("pointerup", session.up);
|
|
109
|
+
document.removeEventListener("pointercancel", session.cancel);
|
|
110
|
+
window.removeEventListener("blur", session.cancel);
|
|
111
|
+
}
|
|
112
|
+
if (!notify || !wasDragging) return;
|
|
113
|
+
const point = event ?? new MouseEvent("mouseup", {
|
|
114
|
+
clientX: lastPointRef.current.x,
|
|
115
|
+
clientY: lastPointRef.current.y,
|
|
116
|
+
button: 0,
|
|
117
|
+
bubbles: true,
|
|
118
|
+
});
|
|
119
|
+
flushPendingFrameNow();
|
|
120
|
+
callMouseHandler(propsRef.current.onMouse, point, "up");
|
|
121
|
+
callMouseHandler(propsRef.current.onMouseUp, point, "up");
|
|
122
|
+
callMouseHandler(propsRef.current.onMouseDragEnd, point, "drag-end");
|
|
123
|
+
};
|
|
124
|
+
|
|
91
125
|
useEffect(() => () => {
|
|
92
126
|
cancelPendingFrame();
|
|
93
127
|
pendingMoveRef.current = null;
|
|
94
128
|
pendingDragRef.current = null;
|
|
95
|
-
|
|
129
|
+
endDocumentDragRef.current(null, true);
|
|
96
130
|
}, []);
|
|
97
131
|
|
|
98
132
|
const handlesWheel = typeof props.onMouseScroll === "function";
|
|
@@ -106,40 +140,49 @@ export const WebBox = forwardRef<HTMLDivElement, Record<string, unknown> & { chi
|
|
|
106
140
|
return () => element.removeEventListener("wheel", handleWheel);
|
|
107
141
|
}, [handlesWheel]);
|
|
108
142
|
|
|
109
|
-
const stopDocumentDrag = () => {
|
|
110
|
-
if (!draggingRef.current) return;
|
|
111
|
-
draggingRef.current = false;
|
|
112
|
-
document.body.classList.remove("gloom-dragging");
|
|
113
|
-
document.removeEventListener("mousemove", handleDocumentMove);
|
|
114
|
-
document.removeEventListener("mouseup", handleDocumentUp);
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
const handleDocumentMove = (event: globalThis.MouseEvent) => {
|
|
118
|
-
if (!draggingRef.current) return;
|
|
119
|
-
scheduleFrameMouseHandler(event, "drag");
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
const handleDocumentUp = (event: globalThis.MouseEvent) => {
|
|
123
|
-
if (!draggingRef.current) return;
|
|
124
|
-
flushPendingFrameNow();
|
|
125
|
-
callMouseHandler(propsRef.current.onMouse, event, "up");
|
|
126
|
-
callMouseHandler(propsRef.current.onMouseUp, event, "up");
|
|
127
|
-
callMouseHandler(propsRef.current.onMouseDragEnd, event, "drag-end");
|
|
128
|
-
stopDocumentDrag();
|
|
129
|
-
};
|
|
130
|
-
|
|
131
143
|
const handleMouseDown = (event: MouseEvent) => {
|
|
132
144
|
const hasSyntheticDrag = typeof propsRef.current.onMouse === "function";
|
|
133
145
|
const hasDirectDrag = typeof propsRef.current.onMouseDrag === "function" || typeof propsRef.current.onMouseDragEnd === "function";
|
|
134
146
|
pendingMoveRef.current = null;
|
|
147
|
+
// A press that never saw mouseup (the window move took the pointer) is still tracked.
|
|
148
|
+
// Finish it before the new press, so its drag-end cannot clear the drag this press starts.
|
|
149
|
+
endDocumentDragRef.current(null, true);
|
|
135
150
|
callMouseHandler(propsRef.current.onMouseDown, event, "down");
|
|
136
151
|
if (event.button !== 0 || (event.isPropagationStopped() && !hasDirectDrag)) return;
|
|
137
152
|
if (!hasSyntheticDrag && !hasDirectDrag) return;
|
|
138
153
|
callMouseHandler(propsRef.current.onMouse, event, "down");
|
|
139
154
|
draggingRef.current = true;
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
155
|
+
lastPointRef.current = { x: event.clientX, y: event.clientY };
|
|
156
|
+
const originX = event.clientX;
|
|
157
|
+
const originY = event.clientY;
|
|
158
|
+
const move = (moveEvent: globalThis.MouseEvent) => {
|
|
159
|
+
if (!draggingRef.current) return;
|
|
160
|
+
lastPointRef.current = { x: moveEvent.clientX, y: moveEvent.clientY };
|
|
161
|
+
// The button is up and mouseup never arrived. End the drag instead of following the cursor.
|
|
162
|
+
if (moveEvent.buttons === 0) {
|
|
163
|
+
endDocumentDragRef.current(moveEvent, true);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const dx = moveEvent.clientX - originX;
|
|
167
|
+
const dy = moveEvent.clientY - originY;
|
|
168
|
+
if (!document.body.classList.contains("gloom-dragging")) {
|
|
169
|
+
if (dx * dx + dy * dy < 9) return;
|
|
170
|
+
document.body.classList.add("gloom-dragging");
|
|
171
|
+
}
|
|
172
|
+
scheduleFrameMouseHandler(moveEvent, "drag");
|
|
173
|
+
};
|
|
174
|
+
const up = (upEvent: globalThis.MouseEvent) => {
|
|
175
|
+
endDocumentDragRef.current(upEvent, true);
|
|
176
|
+
};
|
|
177
|
+
const cancel = () => {
|
|
178
|
+
endDocumentDragRef.current(null, true);
|
|
179
|
+
};
|
|
180
|
+
dragSessionRef.current = { move, up, cancel };
|
|
181
|
+
document.addEventListener("mousemove", move);
|
|
182
|
+
document.addEventListener("mouseup", up);
|
|
183
|
+
document.addEventListener("pointerup", up);
|
|
184
|
+
document.addEventListener("pointercancel", cancel);
|
|
185
|
+
window.addEventListener("blur", cancel);
|
|
143
186
|
};
|
|
144
187
|
|
|
145
188
|
const handleMouseDownCapture = (event: MouseEvent) => {
|
|
@@ -27,9 +27,21 @@ function textInputStyle(props: Record<string, unknown>, multiline: boolean): CSS
|
|
|
27
27
|
const backgroundColor = focused && typeof props.focusedBackgroundColor === "string"
|
|
28
28
|
? props.focusedBackgroundColor
|
|
29
29
|
: props.backgroundColor;
|
|
30
|
+
const base = commonStyle(props);
|
|
31
|
+
const overrides = props.style as CSSProperties | undefined;
|
|
30
32
|
|
|
31
33
|
return {
|
|
32
|
-
...
|
|
34
|
+
...base,
|
|
35
|
+
// Flush unless the caller insets the text. Longhands, never the `padding`
|
|
36
|
+
// shorthand: React writes style keys in order, and a shorthand here landed
|
|
37
|
+
// after a caller's `paddingLeft` and wiped it, so every bordered field's
|
|
38
|
+
// text sat on its border.
|
|
39
|
+
...(overrides?.padding === undefined ? {
|
|
40
|
+
paddingTop: base.paddingTop ?? 0,
|
|
41
|
+
paddingRight: base.paddingRight ?? 0,
|
|
42
|
+
paddingBottom: base.paddingBottom ?? 0,
|
|
43
|
+
paddingLeft: base.paddingLeft ?? 0,
|
|
44
|
+
} : {}),
|
|
33
45
|
display: "block",
|
|
34
46
|
resize: "none",
|
|
35
47
|
border: "none",
|
|
@@ -40,10 +52,9 @@ function textInputStyle(props: Record<string, unknown>, multiline: boolean): CSS
|
|
|
40
52
|
overflow: multiline ? "auto" : "hidden",
|
|
41
53
|
width: cellWidth(props.width) ?? "100%",
|
|
42
54
|
height: cellHeight(props.height) ?? (multiline ? "100%" : "var(--cell-h)"),
|
|
43
|
-
padding: 0,
|
|
44
55
|
margin: 0,
|
|
45
56
|
caretColor: typeof props.cursorColor === "string" ? props.cursorColor : "auto",
|
|
46
|
-
...
|
|
57
|
+
...overrides,
|
|
47
58
|
};
|
|
48
59
|
}
|
|
49
60
|
|
|
@@ -27,6 +27,7 @@ export function WebTabs({
|
|
|
27
27
|
addLabel = "+",
|
|
28
28
|
onAdd,
|
|
29
29
|
onReorder,
|
|
30
|
+
onDrag,
|
|
30
31
|
focused = false,
|
|
31
32
|
palette,
|
|
32
33
|
}: HostTabsProps) {
|
|
@@ -138,6 +139,41 @@ export function WebTabs({
|
|
|
138
139
|
dragCleanupRef.current = cleanup;
|
|
139
140
|
};
|
|
140
141
|
|
|
142
|
+
// A click selects the tab. A drag moves the window, and the listeners come off
|
|
143
|
+
// before that starts so a native move that swallows mouseup cannot leave them on.
|
|
144
|
+
const startPressDrag = (event: ReactMouseEvent<HTMLButtonElement>) => {
|
|
145
|
+
if (event.button !== 0 || !onDrag) return;
|
|
146
|
+
dragCleanupRef.current?.();
|
|
147
|
+
const startX = event.clientX;
|
|
148
|
+
const startY = event.clientY;
|
|
149
|
+
let moved = false;
|
|
150
|
+
const cleanup = () => {
|
|
151
|
+
document.removeEventListener("mousemove", handleMove);
|
|
152
|
+
document.removeEventListener("mouseup", handleUp);
|
|
153
|
+
window.removeEventListener("blur", handleUp);
|
|
154
|
+
dragCleanupRef.current = null;
|
|
155
|
+
};
|
|
156
|
+
const handleMove = (moveEvent: MouseEvent) => {
|
|
157
|
+
if (moveEvent.buttons === 0) {
|
|
158
|
+
cleanup();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (moved) return;
|
|
162
|
+
if (Math.abs(moveEvent.clientX - startX) < 4 && Math.abs(moveEvent.clientY - startY) < 4) return;
|
|
163
|
+
moved = true;
|
|
164
|
+
suppressClickRef.current = true;
|
|
165
|
+
cleanup();
|
|
166
|
+
onDrag();
|
|
167
|
+
};
|
|
168
|
+
const handleUp = () => {
|
|
169
|
+
cleanup();
|
|
170
|
+
};
|
|
171
|
+
document.addEventListener("mousemove", handleMove);
|
|
172
|
+
document.addEventListener("mouseup", handleUp);
|
|
173
|
+
window.addEventListener("blur", handleUp);
|
|
174
|
+
dragCleanupRef.current = cleanup;
|
|
175
|
+
};
|
|
176
|
+
|
|
141
177
|
const resolveTabBackground = (active: boolean, hovered: boolean) => {
|
|
142
178
|
if (header) return active ? "var(--pane-tab-active-bg)" : hovered ? "var(--pane-tab-hover-bg)" : "transparent";
|
|
143
179
|
if (active && variant === "pill") {
|
|
@@ -264,7 +300,7 @@ export function WebTabs({
|
|
|
264
300
|
style={tabStyle}
|
|
265
301
|
onMouseEnter={() => setHoveredValue(tab.value)}
|
|
266
302
|
onMouseLeave={() => setHoveredValue((current) => (current === tab.value ? null : current))}
|
|
267
|
-
onMouseDown={reorderable ? (event) => startReorder(tab.value, event) : undefined}
|
|
303
|
+
onMouseDown={reorderable ? (event) => startReorder(tab.value, event) : onDrag ? startPressDrag : undefined}
|
|
268
304
|
onClick={(event) => {
|
|
269
305
|
if (suppressClickRef.current) {
|
|
270
306
|
suppressClickRef.current = false;
|
|
@@ -136,26 +136,33 @@ button, [data-gloom-interactive="true"] { cursor: pointer; }
|
|
|
136
136
|
[data-gloom-role="pane-header"] {
|
|
137
137
|
align-items: center;
|
|
138
138
|
padding-inline: 7px;
|
|
139
|
-
cursor:
|
|
139
|
+
cursor: default;
|
|
140
140
|
-webkit-user-select: none;
|
|
141
141
|
user-select: none;
|
|
142
142
|
}
|
|
143
|
-
[data-gloom-role="pane-header"]
|
|
144
|
-
cursor:
|
|
143
|
+
[data-gloom-role="pane-header"][data-drag-surface="pane"] {
|
|
144
|
+
cursor: grab;
|
|
145
|
+
}
|
|
146
|
+
[data-gloom-role="pane-header-tabs"] {
|
|
147
|
+
cursor: default;
|
|
148
|
+
}
|
|
149
|
+
[data-gloom-role="pane-header"] [data-gloom-role="tab-button"],
|
|
150
|
+
[data-gloom-role="pane-header"] button,
|
|
151
|
+
[data-gloom-role="pane-header"] [data-gloom-interactive="true"] {
|
|
152
|
+
cursor: pointer;
|
|
145
153
|
}
|
|
146
154
|
[data-gloom-role="pane-header"][data-window-mode-selected="true"] {
|
|
147
155
|
background: color-mix(in srgb, var(--gloom-border-focused) 24%, var(--gloom-panel)) !important;
|
|
148
156
|
}
|
|
149
157
|
[data-gloom-role="pane-action"],
|
|
150
|
-
[data-gloom-role="pane-close"]
|
|
158
|
+
[data-gloom-role="pane-close"],
|
|
159
|
+
[data-gloom-role="pane-restore"] {
|
|
151
160
|
cursor: pointer;
|
|
152
161
|
}
|
|
162
|
+
body.gloom-dragging,
|
|
153
163
|
body.gloom-dragging [data-gloom-role="pane-header"] {
|
|
154
164
|
cursor: grabbing;
|
|
155
165
|
}
|
|
156
|
-
body.gloom-dragging {
|
|
157
|
-
cursor: grabbing;
|
|
158
|
-
}
|
|
159
166
|
[data-gloom-role="pane-title"] {
|
|
160
167
|
overflow: hidden;
|
|
161
168
|
text-overflow: ellipsis;
|
|
@@ -273,6 +280,33 @@ body.gloom-dragging {
|
|
|
273
280
|
0 0 0 4px color-mix(in srgb, var(--gloom-border-focused) 28%, transparent);
|
|
274
281
|
pointer-events: none;
|
|
275
282
|
}
|
|
283
|
+
/* Heat map tiles animate only transforms and opacity, which the compositor
|
|
284
|
+
runs on its own: a tile sliding from its old place after a relayout, the
|
|
285
|
+
previous colour fading out over the new one, and a light flash on a tile
|
|
286
|
+
whose move just jumped. */
|
|
287
|
+
@keyframes gloom-heat-glide-a {
|
|
288
|
+
from { transform: translate(var(--heat-glide-x, 0), var(--heat-glide-y, 0)); }
|
|
289
|
+
to { transform: none; }
|
|
290
|
+
}
|
|
291
|
+
@keyframes gloom-heat-glide-b {
|
|
292
|
+
from { transform: translate(var(--heat-glide-x, 0), var(--heat-glide-y, 0)); }
|
|
293
|
+
to { transform: none; }
|
|
294
|
+
}
|
|
295
|
+
@keyframes gloom-heat-fade {
|
|
296
|
+
from { opacity: 1; }
|
|
297
|
+
to { opacity: 0; }
|
|
298
|
+
}
|
|
299
|
+
@keyframes gloom-heat-pulse {
|
|
300
|
+
0%, 100% { opacity: 0; }
|
|
301
|
+
30% { opacity: 0.16; }
|
|
302
|
+
}
|
|
303
|
+
@media (prefers-reduced-motion: reduce) {
|
|
304
|
+
[data-gloom-role="heat-tile"],
|
|
305
|
+
[data-gloom-role="heat-tile"] * {
|
|
306
|
+
transition: none !important;
|
|
307
|
+
animation: none !important;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
276
310
|
[data-gloom-role="chart-surface"] {
|
|
277
311
|
cursor: crosshair;
|
|
278
312
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import Electrobun from "electrobun/bun";
|
|
1
2
|
import {
|
|
2
3
|
exportConfig,
|
|
3
4
|
importConfig,
|
|
@@ -12,10 +13,9 @@ import type {
|
|
|
12
13
|
import { encodeRpcValue } from "../../shared/rpc-codec";
|
|
13
14
|
import { paneIdFromDetachedRpcKey } from "../window/focus";
|
|
14
15
|
import type { DesktopBackend, DesktopRpc } from "./backend";
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
} from "./update";
|
|
16
|
+
import { createElectrobunDesktopUpdater } from "./update";
|
|
17
|
+
|
|
18
|
+
const desktopUpdater = createElectrobunDesktopUpdater(Electrobun.Updater);
|
|
19
19
|
|
|
20
20
|
function sendUpdateProgress(rpc: DesktopRpc, progress: UpdateProgress): void {
|
|
21
21
|
try {
|
|
@@ -41,17 +41,22 @@ export async function handleDesktopBackendRequest(
|
|
|
41
41
|
): Promise<DesktopBackendRequestResponse<DesktopCoreRequest["method"]>> {
|
|
42
42
|
switch (request.method) {
|
|
43
43
|
case "update.check":
|
|
44
|
-
return
|
|
44
|
+
return desktopUpdater.check(
|
|
45
45
|
typeof request.payload.currentVersion === "string" ? request.payload.currentVersion : "",
|
|
46
46
|
);
|
|
47
47
|
case "update.start": {
|
|
48
48
|
const { release, currentVersion } = request.payload;
|
|
49
|
-
void
|
|
49
|
+
void desktopUpdater.download(
|
|
50
50
|
typeof currentVersion === "string" ? currentVersion : release.version,
|
|
51
51
|
(progress) => sendUpdateProgress(rpc, progress),
|
|
52
52
|
);
|
|
53
53
|
return null;
|
|
54
54
|
}
|
|
55
|
+
case "update.apply":
|
|
56
|
+
// Only the main window offers Restart; a popped-out window never relaunches the app.
|
|
57
|
+
if (paneIdFromDetachedRpcKey(backend.rpcs.getRpcWindowKey(rpc))) return null;
|
|
58
|
+
void desktopUpdater.apply((progress) => sendUpdateProgress(rpc, progress));
|
|
59
|
+
return null;
|
|
55
60
|
case "ticker.loadAll":
|
|
56
61
|
return backend.requireServices().tickerRepository.loadAllTickers();
|
|
57
62
|
case "ticker.load":
|