gloomberb 0.18.3 → 0.18.5
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 +8 -8
- package/README.zh-CN.md +11 -11
- package/bin/{gloomberb → gloom} +3 -1
- package/package.json +6 -2
- package/patches/electrobun@1.18.1.patch +32 -1
- package/src/account/auth-model.ts +7 -3
- package/src/account/checkout-handoff.tsx +225 -0
- package/src/account/device-signin-dialog.tsx +2 -2
- package/src/account/device-signin.ts +2 -2
- package/src/account/upgrade-dialog.tsx +1 -1
- package/src/api-client/askg.ts +2 -2
- package/src/api-client/auth.ts +11 -6
- package/src/api-client/catalysts.ts +2 -1
- package/src/api-client/central-bank-rates.ts +6 -0
- package/src/api-client/collections.ts +5 -1
- package/src/api-client/cot.ts +2 -0
- package/src/api-client/crypto-etf-flows.ts +37 -0
- package/src/api-client/crypto-markets.ts +60 -0
- package/src/api-client/data.ts +98 -5
- package/src/api-client/doe.ts +15 -0
- package/src/api-client/equity-screener.ts +28 -0
- package/src/api-client/exchange-announcements.ts +38 -0
- package/src/api-client/fund-facts.ts +39 -0
- package/src/api-client/futures-curve.ts +9 -1
- package/src/api-client/hiring.ts +301 -0
- package/src/api-client/index.ts +182 -16
- package/src/api-client/live-scan.ts +91 -0
- package/src/api-client/market-discovery.ts +14 -0
- package/src/api-client/members.ts +18 -0
- package/src/api-client/mna.ts +6 -0
- package/src/api-client/paths.ts +18 -1
- package/src/api-client/request.ts +224 -26
- package/src/api-client/research-activity.ts +3 -10
- package/src/api-client/short-side-publications.ts +37 -0
- package/src/api-client/socket.ts +64 -4
- package/src/api-client/swap-curve.ts +35 -0
- package/src/api-client/themes.ts +7 -1
- package/src/api-client/types.ts +96 -2
- package/src/app/keybindings/index.ts +3 -0
- package/src/app/keybindings/labels.ts +18 -1
- package/src/app/keybindings/resolve.ts +14 -0
- package/src/app/pane-runtime/plugin-bindings.ts +9 -2
- package/src/app/runtime/broker-import.ts +43 -26
- package/src/app/runtime/desktop-deeplink.ts +5 -5
- package/src/app/runtime/plugin-bindings.ts +2 -2
- package/src/app/runtime/startup.ts +13 -0
- package/src/app/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- package/src/architecture/ui-literals-allowlist.json +3 -3
- package/src/architecture/ui-tokens-allowlist.json +1 -1
- package/src/brokers/broker-portfolio-sync.ts +37 -0
- package/src/brokers/directory.ts +11 -0
- package/src/brokers/logos.ts +3 -1
- package/src/brokers/signed-in/adapter.ts +304 -26
- package/src/brokers/signed-in/client.ts +14 -2
- package/src/brokers/signed-in/connect.ts +10 -2
- package/src/brokers/sync-broker-instance.ts +9 -1
- package/src/capabilities/chart-series.ts +22 -6
- package/src/cli/bank-section.ts +1 -1
- package/src/cli/base-converter.ts +23 -14
- package/src/cli/central-bank-events.ts +1 -1
- package/src/cli/command-options.ts +59 -4
- package/src/cli/commands/api.ts +9 -6
- package/src/cli/commands/broker.ts +2 -2
- package/src/cli/commands/command-utils.ts +2 -2
- package/src/cli/commands/crypto-hints.ts +7 -20
- package/src/cli/commands/fred-series.ts +9 -2
- package/src/cli/commands/keybindings.ts +25 -2
- package/src/cli/commands/market.ts +1177 -278
- package/src/cli/commands/news-hints.ts +2 -2
- package/src/cli/commands/news-search.ts +59 -6
- package/src/cli/commands/options-chain.ts +59 -3
- package/src/cli/commands/options-leaps.ts +41 -26
- package/src/cli/commands/overview.ts +222 -61
- package/src/cli/commands/plugins.ts +9 -9
- package/src/cli/commands/remote.ts +13 -10
- package/src/cli/commands/search.ts +82 -46
- package/src/cli/commands/system.ts +27 -19
- package/src/cli/commands/themes.ts +1 -1
- package/src/cli/commands/ticker.ts +194 -48
- package/src/cli/context.ts +3 -2
- package/src/cli/desktop-pane-shot-view.ts +2 -2
- package/src/cli/desktop-pane-shot.ts +1 -1
- package/src/cli/earnings-calendar.ts +4 -4
- package/src/cli/entry.ts +18 -1
- package/src/cli/errors.ts +21 -3
- package/src/cli/exit-codes.ts +1 -1
- package/src/cli/export-source.ts +38 -4
- package/src/cli/freshness.ts +2 -8
- package/src/cli/fx-forward.ts +130 -0
- package/src/cli/fx-pair.ts +10 -9
- package/src/cli/glossary.ts +113 -20
- package/src/cli/help.ts +19 -13
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +226 -50
- package/src/cli/index-roots.ts +5 -45
- package/src/cli/index.ts +24 -18
- package/src/cli/known-gaps.ts +123 -27
- package/src/cli/listing-arg.ts +316 -46
- package/src/cli/name-entries.ts +30 -18
- package/src/cli/native-smoke.ts +2 -0
- package/src/cli/not-a-ticker.ts +19 -9
- package/src/cli/opentui-libc.ts +5 -0
- package/src/cli/options.ts +12 -0
- package/src/cli/pane-functions/capabilities.ts +75 -20
- package/src/cli/pane-functions/catalog.ts +24 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +10 -7
- package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
- package/src/cli/pane-functions/freshness.ts +193 -30
- package/src/cli/pane-functions/function-help.ts +76 -30
- package/src/cli/pane-functions/headless.ts +59 -12
- package/src/cli/pane-functions/index.ts +28 -19
- package/src/cli/pane-functions/market-session.ts +15 -5
- package/src/cli/pane-functions/options.ts +22 -2
- package/src/cli/pane-functions/report-notices.ts +12 -4
- package/src/cli/pane-functions/report.ts +10 -6
- package/src/cli/pane-functions/resolver.ts +64 -11
- package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
- package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
- package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
- package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
- package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
- package/src/cli/pane-functions/screenshot-payload.ts +453 -0
- package/src/cli/pane-functions/screenshot-render.ts +316 -0
- package/src/cli/pane-functions/screenshot-types.ts +162 -0
- package/src/cli/pane-functions/shot-options.ts +8 -3
- package/src/cli/peso-dollar-rates.ts +79 -0
- package/src/cli/quote-answer.ts +45 -4
- package/src/cli/report-tables.ts +75 -19
- package/src/cli/restore-plugins.ts +42 -15
- package/src/cli/result.ts +164 -23
- package/src/cli/series-search.ts +5 -5
- package/src/cli/statement-filings.ts +19 -0
- package/src/cli/suffixed-listing-rows.ts +49 -0
- package/src/cli/symbol-args.ts +50 -15
- package/src/cli/symbol-cells.ts +120 -0
- package/src/cli/symbol-list.ts +198 -68
- package/src/cli/symbol-rows.ts +131 -25
- package/src/cli/ticker-resolution.ts +108 -11
- package/src/cli/treasury-yields.ts +5 -5
- package/src/cli/types.ts +2 -0
- package/src/cli/uncovered-instrument.ts +3 -3
- package/src/cli/unknown-command.ts +6 -6
- package/src/components/chart/composite/chart-layout.ts +131 -0
- package/src/components/chart/composite/composite-chart.tsx +395 -20
- package/src/components/chart/composite/format.ts +27 -0
- package/src/components/chart/composite/interactions.ts +7 -2
- package/src/components/chart/composite/legend.tsx +75 -3
- package/src/components/chart/composite/levels.ts +7 -0
- package/src/components/chart/composite/panel-gestures.ts +41 -0
- package/src/components/chart/composite/panel-labels.ts +2 -1
- package/src/components/chart/composite/panel-series.ts +1 -0
- package/src/components/chart/composite/panel-surface.tsx +314 -13
- package/src/components/chart/composite/price-axis-labels.tsx +27 -3
- package/src/components/chart/composite/range-statistics.ts +62 -0
- package/src/components/chart/composite/rasterizer.ts +44 -19
- package/src/components/chart/composite/scene.ts +20 -4
- package/src/components/chart/composite/series-axis-tags.tsx +16 -9
- package/src/components/chart/composite/text-renderer.ts +48 -21
- package/src/components/chart/composite/toolbar.tsx +52 -5
- package/src/components/chart/composite/types.ts +17 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
- package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
- package/src/components/chart/composite/use-composite-viewport.ts +12 -3
- package/src/components/chart/composite/value-scale.ts +149 -0
- package/src/components/chart/composite/volume-profile-paint.ts +6 -3
- package/src/components/chart/core/pointer.ts +2 -0
- package/src/components/chart-table/index.ts +2 -0
- package/src/components/chart-table/read.tsx +74 -0
- package/src/components/command-bar/commands/collection-list.ts +41 -19
- package/src/components/command-bar/commands/collection.ts +9 -3
- package/src/components/command-bar/commands/direct/index.ts +1 -1
- package/src/components/command-bar/commands/direct/runtime.ts +3 -2
- package/src/components/command-bar/pane-templates/items.ts +59 -6
- package/src/components/command-bar/pane-templates/workflow.ts +10 -1
- package/src/components/command-bar/panel/prompt-binding.ts +0 -8
- package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
- package/src/components/command-bar/routes/root/provider-search.ts +42 -11
- package/src/components/command-bar/routes/root/results.ts +18 -4
- package/src/components/command-bar/routes/root/runtime.ts +15 -3
- package/src/components/command-bar/routes/root/search-providers.ts +25 -2
- package/src/components/command-bar/routes/root/selection.ts +6 -1
- package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
- package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
- package/src/components/command-bar/selection-runtime.ts +50 -10
- package/src/components/command-bar/surface/index.tsx +24 -2
- package/src/components/command-bar/view-model.ts +7 -0
- package/src/components/command-bar/workflow/alert.ts +1 -1
- package/src/components/command-bar/workflow/broker.ts +2 -2
- package/src/components/command-bar/workflow/collection-actions.ts +46 -7
- package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
- package/src/components/command-bar/workflow/fields.ts +8 -2
- package/src/components/command-bar/workflow/ops.ts +18 -4
- package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
- package/src/components/command-bar/workflow/submit.ts +3 -2
- package/src/components/command-bar/workflow/tickers.ts +5 -1
- package/src/components/company-logo.tsx +39 -0
- package/src/components/data-table/sections.ts +4 -2
- package/src/components/form-modal/confirm.tsx +2 -1
- package/src/components/form-modal/request.ts +5 -0
- package/src/components/form-modal/routes.ts +4 -1
- package/src/components/index.ts +12 -6
- package/src/components/layout/header.tsx +33 -46
- package/src/components/layout/market-summary.ts +9 -6
- package/src/components/layout/pane/capture-status.ts +1 -1
- package/src/components/layout/pane/footer/index.tsx +1 -0
- package/src/components/layout/pane/footer/model.ts +38 -5
- package/src/components/layout/shell/chrome.ts +19 -6
- package/src/components/layout/shell/index.tsx +2 -1
- package/src/components/layout/shell/pane/layers.tsx +19 -1
- package/src/components/layout/status-bar.tsx +2 -2
- package/src/components/market-board/index.tsx +11 -3
- package/src/components/onboarding/onboarding-frame.tsx +1 -1
- package/src/components/onboarding/onboarding-wizard.tsx +1 -0
- package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
- package/src/components/onboarding/portfolio-step/positions-panel.tsx +2 -2
- package/src/components/onboarding/wizard-broker-sync.ts +4 -1
- package/src/components/pane-settings-dialog/desktop.tsx +20 -7
- package/src/components/pane-settings-dialog/tui.tsx +17 -9
- package/src/components/pane-settings-dialog/value.ts +8 -1
- package/src/components/pane-settings-dialog.tsx +44 -13
- package/src/components/sign-in-code-panel.tsx +27 -19
- package/src/components/ui/column-grid.tsx +48 -4
- package/src/components/ui/country-flag-art.tsx +180 -0
- package/src/components/ui/country-flag.tsx +118 -12
- package/src/components/ui/data-table/opentui/index.tsx +61 -2
- package/src/components/ui/data-table/opentui/model.ts +109 -2
- package/src/components/ui/data-table/types.ts +1 -1
- package/src/components/ui/display.tsx +10 -2
- package/src/components/ui/index.ts +3 -1
- package/src/components/ui/logo-mark.tsx +11 -2
- package/src/components/ui/query-bar.tsx +1 -1
- package/src/components/ui/row-notes.ts +79 -0
- package/src/core/state/app/layout.ts +6 -4
- package/src/core/state/app/state.ts +9 -0
- package/src/core/state/app/types.ts +3 -0
- package/src/data/cached-query.ts +8 -1
- package/src/data/config/chart-settings.ts +3 -3
- package/src/data/config/home.ts +10 -2
- package/src/data/config/layout.ts +4 -1
- package/src/data/config/store/node.ts +4 -0
- package/src/data/config/store/normalize.ts +13 -3
- package/src/data/config/store/portfolio-as-of-column.ts +2 -2
- package/src/data/json-storage.ts +2 -0
- package/src/data/saved-copies.ts +123 -0
- package/src/docs/snapshot.json +422 -112
- package/src/i18n/es.ts +30 -13
- package/src/i18n/ja.ts +30 -13
- package/src/i18n/ko.ts +30 -13
- package/src/i18n/zh-cn.ts +30 -13
- package/src/i18n/zh-tw.ts +30 -13
- package/src/layout/desks.ts +1 -1
- package/src/layout/launch-layout.ts +1 -1
- package/src/layout/pane-manager/floating-actions.ts +5 -3
- package/src/layout/pane-manager/floating.ts +43 -1
- package/src/layout/pane-manager/index.ts +2 -0
- package/src/layout/selected-ticker.ts +74 -0
- package/src/market-data/coordinator/financials.ts +10 -2
- package/src/market-data/coordinator/index.ts +3 -1
- package/src/market-data/coordinator/quotes.ts +4 -2
- package/src/market-data/depositary-pair.ts +251 -0
- package/src/market-data/futures-board.ts +1 -1
- package/src/market-data/futures-contract.ts +124 -40
- package/src/market-data/fx-closes.ts +17 -2
- package/src/market-data/hooks.tsx +19 -11
- package/src/market-data/market/change-basis.ts +81 -11
- package/src/market-data/market/dated-previous-close.ts +203 -0
- package/src/market-data/market/freshness.ts +34 -5
- package/src/market-data/market/futures-week.ts +68 -0
- package/src/market-data/market/period-return.ts +163 -0
- package/src/market-data/market/status.ts +16 -4
- package/src/market-data/market/trading-sessions.ts +13 -0
- package/src/market-data/market/year-to-date.ts +8 -13
- package/src/market-data/options-alternatives.ts +60 -0
- package/src/market-data/performance.ts +20 -14
- package/src/market-data/perpetual-premium.ts +32 -0
- package/src/market-data/published-apac-sessions.ts +2 -1
- package/src/market-data/published-futures-sessions.ts +69 -0
- package/src/market-data/quotes/contributions.ts +25 -3
- package/src/market-data/quotes/freshness.ts +42 -0
- package/src/market-data/quotes/intraday-bar.ts +37 -0
- package/src/market-data/quotes/regular-session-valuation.ts +13 -8
- package/src/market-data/quotes/resolution.ts +7 -2
- package/src/market-data/selectors.ts +3 -0
- package/src/market-data/tax-equivalent.ts +1 -1
- package/src/market-data/ticker-price-returns.ts +3 -1
- package/src/news/aggregator.ts +5 -1
- package/src/news/news-model.ts +4 -0
- package/src/news/types.ts +11 -0
- package/src/notifications/app-notifier.ts +1 -1
- package/src/notifications/notification-log.ts +6 -4
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/pane.tsx +9 -8
- package/src/plugins/builtin/alerts/alert-engine.ts +34 -20
- package/src/plugins/builtin/alerts/calendar-events.ts +429 -0
- package/src/plugins/builtin/alerts/cli.ts +533 -85
- package/src/plugins/builtin/alerts/command.ts +12 -10
- package/src/plugins/builtin/alerts/constants.ts +1 -1
- package/src/plugins/builtin/alerts/event-rows.ts +9 -5
- package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
- package/src/plugins/builtin/alerts/events.ts +107 -5
- package/src/plugins/builtin/alerts/fired-log.ts +119 -0
- package/src/plugins/builtin/alerts/format.ts +10 -3
- package/src/plugins/builtin/alerts/headless.ts +107 -41
- package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
- package/src/plugins/builtin/alerts/history-rows.ts +92 -0
- package/src/plugins/builtin/alerts/history.ts +2 -0
- package/src/plugins/builtin/alerts/index.tsx +107 -30
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +3 -3
- package/src/plugins/builtin/alerts/live.ts +3 -3
- package/src/plugins/builtin/alerts/metric-command.ts +61 -0
- package/src/plugins/builtin/alerts/metric-data.ts +70 -0
- package/src/plugins/builtin/alerts/metric-model.ts +175 -0
- package/src/plugins/builtin/alerts/metric-parity-fixture.json +725 -0
- package/src/plugins/builtin/alerts/pane.tsx +130 -49
- package/src/plugins/builtin/alerts/price.ts +35 -0
- package/src/plugins/builtin/alerts/quotes.ts +24 -0
- package/src/plugins/builtin/alerts/research-builder.ts +84 -11
- package/src/plugins/builtin/alerts/research-rules.ts +76 -3
- package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
- package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
- package/src/plugins/builtin/alerts/scheduled.ts +188 -29
- package/src/plugins/builtin/alerts/storage.ts +38 -12
- package/src/plugins/builtin/alerts/targets.ts +12 -3
- package/src/plugins/builtin/alerts/types.ts +3 -0
- package/src/plugins/builtin/analytics/index.tsx +8 -2
- package/src/plugins/builtin/analytics/metrics.ts +1 -1
- package/src/plugins/builtin/analytics/risk-book.ts +215 -0
- package/src/plugins/builtin/analytics/risk-client.ts +13 -6
- package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
- package/src/plugins/builtin/analytics/risk-math.ts +6 -3
- package/src/plugins/builtin/analytics/risk-model.ts +297 -104
- package/src/plugins/builtin/analytics/risk-options.ts +17 -2
- package/src/plugins/builtin/analytics/risk-pane.tsx +97 -36
- package/src/plugins/builtin/attention/pane.tsx +6 -2
- package/src/plugins/builtin/awards/headless.ts +7 -3
- package/src/plugins/builtin/awards/model.ts +18 -0
- package/src/plugins/builtin/awards/pane.tsx +6 -3
- package/src/plugins/builtin/backtest/headless.ts +13 -8
- package/src/plugins/builtin/backtest/pane.tsx +9 -4
- package/src/plugins/builtin/backtest/presets.ts +29 -3
- package/src/plugins/builtin/backtest/rules.ts +41 -5
- package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
- package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
- package/src/plugins/builtin/broker-manager/footer.ts +27 -11
- package/src/plugins/builtin/broker-manager/index.tsx +24 -14
- package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
- package/src/plugins/builtin/broker-manager/model.ts +18 -3
- package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
- package/src/plugins/builtin/broker-manager/table.ts +28 -12
- package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
- package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
- package/src/plugins/builtin/broker-trading/controller.ts +66 -24
- package/src/plugins/builtin/broker-trading/dock.tsx +22 -4
- package/src/plugins/builtin/broker-trading/headless.ts +2 -1
- package/src/plugins/builtin/broker-trading/index.tsx +19 -1
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +83 -10
- package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
- package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
- package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
- package/src/plugins/builtin/broker-trading/pane.tsx +111 -24
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
- package/src/plugins/builtin/buildout/cells.tsx +4 -0
- package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
- package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
- package/src/plugins/builtin/buildout/pane/index.tsx +25 -12
- package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
- package/src/plugins/builtin/builtin-plugin-meta.ts +2 -2
- package/src/plugins/builtin/catalysts/detail.tsx +3 -2
- package/src/plugins/builtin/catalysts/index.tsx +1 -1
- package/src/plugins/builtin/catalysts/model.ts +51 -5
- package/src/plugins/builtin/catalysts/pane.tsx +6 -8
- package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
- package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
- package/src/plugins/builtin/changelog/index.tsx +1 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +4 -1
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +3 -2
- package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +7 -10
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +7 -3
- package/src/plugins/builtin/chart-composer/editor/controller.ts +4 -0
- package/src/plugins/builtin/chart-composer/editor/model.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +9 -4
- package/src/plugins/builtin/chart-composer/formula.ts +71 -18
- package/src/plugins/builtin/chart-composer/headless-schema.ts +42 -29
- package/src/plugins/builtin/chart-composer/headless.ts +266 -37
- package/src/plugins/builtin/chart-composer/index.tsx +12 -2
- package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
- package/src/plugins/builtin/chart-composer/pane.tsx +144 -30
- package/src/plugins/builtin/chart-composer/presets.ts +50 -15
- package/src/plugins/builtin/chart-composer/quick-add.tsx +40 -25
- package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
- package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
- package/src/plugins/builtin/chart-composer/session-history.ts +31 -28
- package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
- package/src/plugins/builtin/chart-composer/settings.ts +31 -19
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +44 -31
- package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
- package/src/plugins/builtin/chat/attachments/model.ts +3 -1
- package/src/plugins/builtin/chat/content/command-suggestions.ts +92 -0
- package/src/plugins/builtin/chat/content/composer.tsx +13 -6
- package/src/plugins/builtin/chat/content/footer.tsx +6 -3
- package/src/plugins/builtin/chat/content/index.tsx +51 -22
- package/src/plugins/builtin/chat/content/open-targets.ts +14 -3
- package/src/plugins/builtin/chat/controller/session-runtime.ts +4 -2
- package/src/plugins/builtin/chat/index.tsx +23 -0
- package/src/plugins/builtin/chat/message/desktop.tsx +1 -0
- package/src/plugins/builtin/chat/message/inline-tokens.tsx +23 -0
- package/src/plugins/builtin/chat/message/pane-chip.tsx +50 -20
- package/src/plugins/builtin/chat/pane-links/commands.ts +265 -0
- package/src/plugins/builtin/chat/pane-links/model.ts +12 -3
- package/src/plugins/builtin/chat/pane-links/open.ts +9 -2
- package/src/plugins/builtin/chat/people.ts +1 -1
- package/src/plugins/builtin/chat/unread-inbox-pane.tsx +10 -1
- package/src/plugins/builtin/clinical-trials/client.ts +5 -2
- package/src/plugins/builtin/clinical-trials/model.ts +13 -4
- package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
- package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
- package/src/plugins/builtin/cloud/plugin.tsx +1 -1
- package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
- package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
- package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
- package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
- package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
- package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
- package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
- package/src/plugins/builtin/commodity-balances/pane.tsx +11 -4
- package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
- package/src/plugins/builtin/company-attention/building-model.ts +222 -0
- package/src/plugins/builtin/company-attention/building.tsx +172 -0
- package/src/plugins/builtin/company-attention/client.ts +117 -1
- package/src/plugins/builtin/company-attention/evidence.ts +16 -3
- package/src/plugins/builtin/company-attention/headless.ts +101 -5
- package/src/plugins/builtin/company-attention/index.tsx +6 -3
- package/src/plugins/builtin/company-attention/model.ts +33 -7
- package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
- package/src/plugins/builtin/company-attention/moves.tsx +159 -0
- package/src/plugins/builtin/company-attention/pane.tsx +79 -23
- package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
- package/src/plugins/builtin/company-attention/signals.tsx +160 -0
- package/src/plugins/builtin/company-kpis/headless.ts +3 -2
- package/src/plugins/builtin/company-kpis/model.ts +2 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +1 -1
- package/src/plugins/builtin/composite-plugins.ts +2 -1
- package/src/plugins/builtin/congress-trades/headless.ts +1 -1
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
- package/src/plugins/builtin/correlation/headless.ts +5 -3
- package/src/plugins/builtin/cot/headless.ts +28 -6
- package/src/plugins/builtin/cot/model.ts +12 -0
- package/src/plugins/builtin/cot/pane.tsx +3 -2
- package/src/plugins/builtin/cpi/headless.ts +5 -1
- package/src/plugins/builtin/cpi/pane.tsx +11 -9
- package/src/plugins/builtin/credit-boards/model.ts +2 -0
- package/src/plugins/builtin/credit-documents/headless.ts +1 -1
- package/src/plugins/builtin/crypto-board/client.ts +86 -0
- package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
- package/src/plugins/builtin/crypto-board/defi.ts +239 -0
- package/src/plugins/builtin/crypto-board/headless.ts +117 -6
- package/src/plugins/builtin/crypto-board/index.tsx +8 -3
- package/src/plugins/builtin/crypto-board/model.ts +40 -8
- package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
- package/src/plugins/builtin/crypto-board/series.ts +19 -1
- package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
- package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
- package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
- package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
- package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
- package/src/plugins/builtin/debug/index.tsx +1 -0
- package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
- package/src/plugins/builtin/docs/index.tsx +1 -1
- package/src/plugins/builtin/docs/pane.tsx +2 -2
- package/src/plugins/builtin/docs/targets.ts +1 -1
- package/src/plugins/builtin/doe/client.ts +5 -1
- package/src/plugins/builtin/doe/headless.ts +12 -6
- package/src/plugins/builtin/doe/model.ts +43 -6
- package/src/plugins/builtin/doe/pane.tsx +18 -11
- package/src/plugins/builtin/earnings/board-model.ts +13 -6
- package/src/plugins/builtin/earnings/board-table.ts +4 -1
- package/src/plugins/builtin/earnings/board.tsx +253 -50
- package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
- package/src/plugins/builtin/earnings/calendar.tsx +338 -0
- package/src/plugins/builtin/earnings/client.ts +4 -3
- package/src/plugins/builtin/earnings/headless.ts +53 -15
- package/src/plugins/builtin/earnings/history-model.ts +53 -36
- package/src/plugins/builtin/earnings/index.tsx +15 -22
- package/src/plugins/builtin/earnings/model.ts +17 -12
- package/src/plugins/builtin/earnings/scope.ts +89 -0
- package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
- package/src/plugins/builtin/earnings-calls/data.ts +146 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
- package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
- package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
- package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
- package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
- package/src/plugins/builtin/econ/calendar-model.ts +144 -27
- package/src/plugins/builtin/econ/detail-view.tsx +48 -10
- package/src/plugins/builtin/econ/figures.ts +72 -0
- package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
- package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
- package/src/plugins/builtin/econ/index.tsx +144 -27
- package/src/plugins/builtin/econ/print-watch.ts +2 -1
- package/src/plugins/builtin/econ/types.ts +34 -1
- package/src/plugins/builtin/econ-statistics/client.ts +16 -3
- package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
- package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
- package/src/plugins/builtin/econ-statistics/headless.ts +87 -28
- package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
- package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
- package/src/plugins/builtin/econ-statistics/stats.ts +104 -0
- package/src/plugins/builtin/econ-statistics/view.ts +19 -1
- package/src/plugins/builtin/equity-screener/client.ts +21 -3
- package/src/plugins/builtin/equity-screener/headless.ts +68 -6
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +6 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +47 -12
- package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
- package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
- package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
- package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
- package/src/plugins/builtin/exposure/charts.tsx +2 -2
- package/src/plugins/builtin/exposure/headless.ts +51 -6
- package/src/plugins/builtin/exposure/index.tsx +28 -2
- package/src/plugins/builtin/exposure/model.ts +20 -1
- package/src/plugins/builtin/exposure/pane.tsx +10 -5
- package/src/plugins/builtin/fear-greed/index.tsx +1 -1
- package/src/plugins/builtin/filing-events/index.tsx +1 -1
- package/src/plugins/builtin/futures/index.tsx +1 -0
- package/src/plugins/builtin/futures/model.ts +12 -10
- package/src/plugins/builtin/futures/returns.ts +8 -36
- package/src/plugins/builtin/futures/table.tsx +3 -3
- package/src/plugins/builtin/futures-curve/client.ts +40 -9
- package/src/plugins/builtin/futures-curve/headless.ts +39 -17
- package/src/plugins/builtin/futures-curve/model.ts +258 -69
- package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
- package/src/plugins/builtin/fx-matrix/client.ts +20 -8
- package/src/plugins/builtin/fx-matrix/headless.ts +37 -16
- package/src/plugins/builtin/fx-matrix/index.tsx +25 -13
- package/src/plugins/builtin/fx-matrix/live-legs.ts +34 -0
- package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
- package/src/plugins/builtin/gpu/headless.ts +9 -4
- package/src/plugins/builtin/help/index.tsx +13 -3
- package/src/plugins/builtin/help/keybindings-editor.tsx +18 -14
- package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
- package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
- package/src/plugins/builtin/holders/client.ts +13 -1
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +46 -7
- package/src/plugins/builtin/holders/index-holders.ts +264 -0
- package/src/plugins/builtin/holders/pane.tsx +79 -15
- package/src/plugins/builtin/holders/report-rows.ts +35 -7
- package/src/plugins/builtin/holders/table-model.ts +2 -1
- package/src/plugins/builtin/holders/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/headless.ts +1 -1
- package/src/plugins/builtin/insider/signals-client.ts +1 -1
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
- package/src/plugins/builtin/iv-history/client.ts +20 -0
- package/src/plugins/builtin/iv-history/headless.ts +7 -4
- package/src/plugins/builtin/iv-history/index.tsx +1 -1
- package/src/plugins/builtin/iv-history/model.ts +13 -4
- package/src/plugins/builtin/iv-history/series.ts +3 -1
- package/src/plugins/builtin/jobs/lock-note.ts +1 -1
- package/src/plugins/builtin/jobs/model.ts +4 -15
- package/src/plugins/builtin/jobs/pane.tsx +7 -5
- package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
- package/src/plugins/builtin/jodi/pane.tsx +10 -4
- package/src/plugins/builtin/layout-manager/index.tsx +1 -0
- package/src/plugins/builtin/macro-day/headless.ts +20 -7
- package/src/plugins/builtin/macro-day/index.tsx +3 -2
- package/src/plugins/builtin/macro-day/model.ts +29 -8
- package/src/plugins/builtin/macro-day/pane.tsx +51 -13
- package/src/plugins/builtin/macro-day/releases.ts +55 -13
- package/src/plugins/builtin/market-heatmap/data.ts +9 -2
- package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
- package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
- package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
- package/src/plugins/builtin/market-heatmap/model.ts +10 -7
- package/src/plugins/builtin/market-movers/client.ts +33 -19
- package/src/plugins/builtin/market-movers/footer.ts +2 -2
- package/src/plugins/builtin/market-movers/headless.ts +8 -2
- package/src/plugins/builtin/market-movers/index.tsx +16 -10
- package/src/plugins/builtin/market-movers/screener.ts +29 -8
- package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
- package/src/plugins/builtin/market-movers/session-table.ts +4 -2
- package/src/plugins/builtin/market-movers/table.ts +4 -1
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/market-valuation/view.ts +5 -0
- package/src/plugins/builtin/members/breadth-pane.tsx +81 -0
- package/src/plugins/builtin/members/client.ts +19 -4
- package/src/plugins/builtin/members/headless.ts +24 -10
- package/src/plugins/builtin/members/index.tsx +9 -9
- package/src/plugins/builtin/members/model.ts +23 -4
- package/src/plugins/builtin/members/pane.tsx +31 -14
- package/src/plugins/builtin/mna/client.ts +1 -0
- package/src/plugins/builtin/mna/detail.tsx +20 -32
- package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
- package/src/plugins/builtin/mna/distress/model.ts +3 -2
- package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
- package/src/plugins/builtin/mna/headless.ts +6 -13
- package/src/plugins/builtin/mna/model.ts +93 -15
- package/src/plugins/builtin/mna/pane.tsx +5 -4
- package/src/plugins/builtin/news/headless.ts +12 -6
- package/src/plugins/builtin/news/index.tsx +10 -1
- package/src/plugins/builtin/news/wire/index.tsx +3 -2
- package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
- package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
- package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
- package/src/plugins/builtin/notes/cli.ts +49 -14
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/analytics.ts +26 -2
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/model-spot.ts +5 -2
- package/src/plugins/builtin/options/strike-window.ts +2 -1
- package/src/plugins/builtin/options/table.ts +1 -7
- package/src/plugins/builtin/options/view.tsx +30 -13
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-positioning/client.ts +19 -0
- package/src/plugins/builtin/options-positioning/headless.ts +54 -14
- package/src/plugins/builtin/options-positioning/index.tsx +3 -3
- package/src/plugins/builtin/options-positioning/model.ts +47 -8
- package/src/plugins/builtin/options-positioning/pane.tsx +68 -38
- package/src/plugins/builtin/options-scenario/client.ts +123 -28
- package/src/plugins/builtin/options-scenario/collar.ts +8 -6
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
- package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
- package/src/plugins/builtin/options-scenario/csp.ts +101 -21
- package/src/plugins/builtin/options-scenario/headless.ts +36 -15
- package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
- package/src/plugins/builtin/options-scenario/index.tsx +28 -3
- package/src/plugins/builtin/options-scenario/model.ts +13 -0
- package/src/plugins/builtin/options-scenario/pane.tsx +9 -5
- package/src/plugins/builtin/perps/equity-row.tsx +11 -3
- package/src/plugins/builtin/perps/freshness.ts +14 -9
- package/src/plugins/builtin/perps/headless.ts +3 -1
- package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
- package/src/plugins/builtin/perps/live-rows.ts +168 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/pane.tsx +49 -26
- package/src/plugins/builtin/perps/venue-markets.ts +96 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +143 -59
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
- package/src/plugins/builtin/portfolio-list/cli/render.ts +54 -22
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
- package/src/plugins/builtin/portfolio-list/headless.ts +7 -4
- package/src/plugins/builtin/portfolio-list/income.ts +13 -2
- package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
- package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
- package/src/plugins/builtin/portfolio-list/summary/index.tsx +11 -8
- package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
- package/src/plugins/builtin/power/client.ts +4 -1
- package/src/plugins/builtin/power/evidence.ts +22 -7
- package/src/plugins/builtin/power/gas.tsx +5 -1
- package/src/plugins/builtin/power/pane.tsx +8 -1
- package/src/plugins/builtin/power/prices.tsx +10 -3
- package/src/plugins/builtin/rate-path/pane.tsx +2 -2
- package/src/plugins/builtin/research/analyst-headless.ts +25 -8
- package/src/plugins/builtin/research/analyst-model.ts +68 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
- package/src/plugins/builtin/research/event-model.ts +3 -1
- package/src/plugins/builtin/research/event-sources.ts +12 -4
- package/src/plugins/builtin/research/index.tsx +2 -1
- package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
- package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
- package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
- package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
- package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +80 -13
- package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
- package/src/plugins/builtin/reverse-dcf/model.ts +6 -2
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/feed.ts +2 -2
- package/src/plugins/builtin/scanner/index.ts +24 -1
- package/src/plugins/builtin/scanner/live-condition-editor.tsx +222 -0
- package/src/plugins/builtin/scanner/live-feed.ts +168 -0
- package/src/plugins/builtin/scanner/live-headless.ts +114 -0
- package/src/plugins/builtin/scanner/live-model.ts +351 -0
- package/src/plugins/builtin/scanner/live-pane.tsx +677 -0
- package/src/plugins/builtin/scanner/live-track.ts +186 -0
- package/src/plugins/builtin/scanner/lock-note.ts +1 -1
- package/src/plugins/builtin/sec/forms.ts +13 -0
- package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
- package/src/plugins/builtin/sec/fund-facts.ts +68 -8
- package/src/plugins/builtin/sec/headless.ts +85 -8
- package/src/plugins/builtin/sec/index.tsx +58 -12
- package/src/plugins/builtin/sectors/client.ts +2 -1
- package/src/plugins/builtin/sectors/sector-model.ts +11 -15
- package/src/plugins/builtin/series-inventory.ts +3 -0
- package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
- package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
- package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
- package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
- package/src/plugins/builtin/shared/earnings-report.ts +3 -3
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
- package/src/plugins/builtin/shared/job-posting.ts +129 -0
- package/src/plugins/builtin/shared/macro-releases.ts +65 -0
- package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
- package/src/plugins/builtin/shared/report-freshness.ts +3 -0
- package/src/plugins/builtin/shared/research-trading.tsx +21 -0
- package/src/plugins/builtin/shared/scanner-capture.ts +3 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
- package/src/plugins/builtin/shared/use-quote-board.ts +8 -2
- package/src/plugins/builtin/shared/volatility/pricing.ts +7 -1
- package/src/plugins/builtin/short-interest/client.ts +2 -0
- package/src/plugins/builtin/short-interest/headless.ts +41 -12
- package/src/plugins/builtin/short-interest/index.tsx +23 -1
- package/src/plugins/builtin/short-interest/model.ts +70 -19
- package/src/plugins/builtin/short-interest/pane.tsx +19 -2
- package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
- package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
- package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
- package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
- package/src/plugins/builtin/short-interest/schedule.ts +35 -2
- package/src/plugins/builtin/short-interest/surface.tsx +11 -4
- package/src/plugins/builtin/short-interest/types.ts +9 -0
- package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
- package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
- package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
- package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
- package/src/plugins/builtin/supply-chain/model.ts +51 -3
- package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
- package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
- package/src/plugins/builtin/themes/headless.ts +11 -6
- package/src/plugins/builtin/themes/model.ts +15 -5
- package/src/plugins/builtin/themes/pane.tsx +27 -8
- package/src/plugins/builtin/thirteenf/headless.ts +5 -5
- package/src/plugins/builtin/thirteenf/signals.ts +3 -1
- package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
- package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
- package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
- package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
- package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
- package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
- package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
- package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
- package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
- package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +14 -4
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
- package/src/plugins/builtin/vol-surface/charts.tsx +9 -4
- package/src/plugins/builtin/vol-surface/client.ts +7 -4
- package/src/plugins/builtin/vol-surface/headless.ts +71 -13
- package/src/plugins/builtin/vol-surface/index.tsx +2 -2
- package/src/plugins/builtin/vol-surface/model.ts +26 -9
- package/src/plugins/builtin/vol-surface/pane.tsx +44 -7
- package/src/plugins/builtin/vol-surface/tables.ts +31 -3
- package/src/plugins/builtin/volatility/dvol.ts +46 -0
- package/src/plugins/builtin/volatility/model.ts +5 -10
- package/src/plugins/builtin/volatility/pane.tsx +2 -2
- package/src/plugins/builtin/volatility/series.ts +26 -0
- package/src/plugins/builtin/world-indices/footer.ts +1 -1
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
- package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
- package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
- package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
- package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
- package/src/plugins/builtin/world-venue-map/index.ts +3 -26
- package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
- package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
- package/src/plugins/builtin/yield-curve/client.ts +25 -0
- package/src/plugins/builtin/yield-curve/curves.ts +7 -4
- package/src/plugins/builtin/yield-curve/headless.ts +38 -4
- package/src/plugins/builtin/yield-curve/history.ts +4 -3
- package/src/plugins/builtin/yield-curve/index.tsx +12 -6
- package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
- package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
- package/src/plugins/bundle.ts +1 -1
- package/src/plugins/catalog-browser.ts +15 -9
- package/src/plugins/compat.ts +3 -3
- package/src/plugins/dependencies.ts +75 -14
- package/src/plugins/extracted-plugins.ts +132 -34
- package/src/plugins/host-link.ts +149 -34
- package/src/plugins/installer.ts +35 -10
- package/src/plugins/loader.ts +206 -38
- package/src/plugins/manager-node.ts +2 -2
- package/src/plugins/marketplace/deactivation.ts +22 -0
- package/src/plugins/marketplace/model.ts +2 -2
- package/src/plugins/marketplace/packs.ts +1 -1
- package/src/plugins/ownership.ts +1 -1
- package/src/plugins/peer-retry.ts +155 -0
- package/src/plugins/registry/contributions.ts +3 -1
- package/src/plugins/registry/index.ts +4 -3
- package/src/plugins/registry/plugin-state.ts +3 -0
- package/src/plugins/seed-notice.ts +20 -0
- package/src/plugins/shortcut-argument.ts +39 -0
- package/src/portfolio/allocation.ts +1 -1
- package/src/portfolio/collection-name.ts +31 -0
- package/src/portfolio/column-values.ts +15 -13
- package/src/portfolio/cost-fx.ts +296 -19
- package/src/portfolio/manual-lots.ts +75 -0
- package/src/portfolio/mutations.ts +60 -22
- package/src/portfolio/suffixed-listings.ts +209 -0
- package/src/portfolio/totals-currency.ts +24 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +15 -0
- package/src/public/time-series.ts +11 -8
- package/src/remote/schema.ts +1 -1
- package/src/renderers/browser/app-services.ts +1 -7
- package/src/renderers/browser/config-host.ts +5 -55
- package/src/renderers/browser/main.tsx +30 -60
- package/src/renderers/dom/boot-frame-page.ts +187 -0
- package/src/renderers/dom/boot-frame.ts +237 -0
- package/src/renderers/dom/build-assets.ts +46 -8
- package/src/renderers/dom/dom-ui-host.tsx +4 -29
- package/src/renderers/dom/host/ascii-text.ts +16 -2
- package/src/renderers/dom/host/box.tsx +43 -2
- package/src/renderers/dom/host/chart-surface.tsx +2 -0
- package/src/renderers/dom/host/hls.chunk.ts +3 -0
- package/src/renderers/dom/host/image-surface.tsx +49 -0
- package/src/renderers/dom/host/media-surface.tsx +24 -18
- package/src/renderers/dom/host/mouse.ts +30 -0
- package/src/renderers/dom/host/size-observer.ts +1 -1
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/styles.css +76 -0
- package/src/renderers/dom/test-utils.tsx +2 -1
- package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
- package/src/renderers/electrobun/bun/desktop/app-name.ts +222 -0
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +56 -3
- package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
- package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
- package/src/renderers/electrobun/bun/desktop/relaunch.ts +74 -25
- package/src/renderers/electrobun/bun/desktop/state-broadcaster.ts +1 -0
- package/src/renderers/electrobun/bun/desktop/update.ts +70 -3
- package/src/renderers/electrobun/bun/desktop/workspace/index.ts +2 -0
- package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
- package/src/renderers/electrobun/bun/index.ts +36 -2
- package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
- package/src/renderers/electrobun/bun/window/create.ts +4 -1
- package/src/renderers/electrobun/shared/app-name.ts +17 -0
- package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
- package/src/renderers/electrobun/shared/protocol.ts +6 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
- package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +3 -3
- package/src/renderers/electrobun/view/config-host.ts +3 -0
- package/src/renderers/electrobun/view/desktop/window/snapshot.ts +1 -0
- package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
- package/src/renderers/electrobun/view/main.tsx +30 -4
- package/src/renderers/electrobun/view/news-source.ts +5 -5
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
- package/src/renderers/electrobun/view/ui-host.tsx +1 -1
- package/src/renderers/opentui/browser-open.ts +88 -0
- package/src/renderers/opentui/host.tsx +5 -14
- package/src/renderers/opentui/image/loader.ts +3 -2
- package/src/renderers/opentui/native-smoke.ts +10 -1
- package/src/renderers/opentui/pane-image/index.ts +2 -1
- package/src/renderers/opentui/render-lib.ts +253 -0
- package/src/renderers/opentui/render-timing-smoke.ts +1 -1
- package/src/renderers/opentui/start.tsx +1 -1
- package/src/renderers/opentui/toast-host.tsx +71 -43
- package/src/renderers/share/layout-view.tsx +2 -2
- package/src/renderers/share/main.tsx +4 -4
- package/src/renderers/share/view.tsx +1 -1
- package/src/series/resolve.ts +22 -6
- package/src/series/standalone.ts +30 -2
- package/src/series/types.ts +8 -1
- package/src/shares/api.ts +4 -1
- package/src/shares/pane.ts +1 -1
- package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
- package/src/sources/gloomberb-cloud/index.ts +32 -16
- package/src/sources/gloomberb-cloud/news.ts +39 -0
- package/src/sources/gloomberb-cloud/normalizers.ts +16 -1
- package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
- package/src/sources/listing-symbols.ts +37 -0
- package/src/sources/provider-errors.ts +16 -2
- package/src/sources/provider-router/batches.ts +10 -2
- package/src/sources/provider-router/financial-routes.ts +21 -3
- package/src/sources/provider-router/financials.ts +15 -2
- package/src/sources/provider-router/history.ts +58 -15
- package/src/sources/provider-router/index.ts +146 -10
- package/src/sources/provider-router/primary.ts +1 -1
- package/src/sources/provider-router/search.ts +13 -2
- package/src/state/app/bootstrap.ts +23 -0
- package/src/state/app/context/index.tsx +3 -0
- package/src/state/hooks/inline-tickers.ts +30 -5
- package/src/sync/auth-transition.ts +19 -9
- package/src/sync/baseline.ts +10 -4
- package/src/sync/controller.ts +67 -17
- package/src/sync/core-contributors.ts +46 -14
- package/src/sync/react.ts +4 -1
- package/src/sync/types.ts +3 -0
- package/src/team/collections-sync.ts +2 -1
- package/src/team/collections.ts +178 -17
- package/src/telemetry/crash-reports.ts +17 -4
- package/src/telemetry/usage-counts.ts +0 -18
- package/src/test-support/builtin-panes.ts +1 -1
- package/src/theme/colors.ts +11 -30
- package/src/theme/ui-tokens.ts +37 -1
- package/src/tickers/company-name-listing.ts +210 -33
- package/src/tickers/company-name.ts +59 -0
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/listing-venues.ts +23 -0
- package/src/tickers/metadata.ts +10 -0
- package/src/tickers/perpetual-listing.ts +5 -2
- package/src/tickers/search/bare-symbol.ts +36 -0
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/index.ts +111 -33
- package/src/tickers/search/ranking.ts +64 -5
- package/src/tickers/search/types.ts +5 -0
- package/src/tickers/search/upsert.ts +29 -0
- package/src/tickers/terminal-codes.ts +416 -40
- package/src/time-series/bar-aggregation.ts +243 -0
- package/src/time-series/base-series.ts +315 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/daily-valuation.ts +62 -0
- package/src/time-series/economic.ts +5 -0
- package/src/time-series/field-catalog.ts +1 -3
- package/src/time-series/forward-valuation.ts +32 -0
- package/src/time-series/fundamentals.ts +173 -10
- package/src/time-series/history-acquisition.ts +499 -0
- package/src/time-series/hooks.ts +1 -0
- package/src/time-series/leverage.ts +100 -0
- package/src/time-series/market-resolution.ts +4 -2
- package/src/time-series/market.ts +2 -1
- package/src/time-series/price-comparison.ts +175 -30
- package/src/time-series/price-units.ts +72 -2
- package/src/time-series/range.ts +9 -1
- package/src/time-series/resolution.ts +174 -16
- package/src/time-series/resolve-context.ts +161 -0
- package/src/time-series/resolve.ts +185 -1587
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +242 -0
- package/src/time-series/spec.ts +13 -7
- package/src/time-series/studies.ts +377 -82
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/transforms.ts +1 -0
- package/src/time-series/types.ts +34 -2
- package/src/time-series/use-chart-resolution.ts +4 -5
- package/src/time-series/valuation-releases.ts +39 -0
- package/src/types/broker.ts +10 -0
- package/src/types/config.ts +14 -0
- package/src/types/data-provider.ts +23 -1
- package/src/types/desktop-window.ts +2 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +145 -8
- package/src/types/headless.ts +117 -9
- package/src/types/instrument.ts +6 -0
- package/src/types/plugin.ts +66 -9
- package/src/types/price-history.ts +2 -0
- package/src/types/ticker.ts +13 -0
- package/src/types/trading.ts +59 -1
- package/src/ui/ascii-font.ts +13 -1
- package/src/ui/host.tsx +6 -1
- package/src/updater/command-names.ts +180 -0
- package/src/updater/index.ts +10 -5
- package/src/utils/calendar-date.ts +32 -15
- package/src/utils/cash-runway.ts +241 -0
- package/src/utils/central-banks.ts +42 -0
- package/src/utils/cli-output.ts +259 -80
- package/src/utils/contract-month.ts +16 -0
- package/src/utils/crypto-pair.ts +61 -3
- package/src/utils/currency-units.ts +29 -0
- package/src/utils/datetime-format.ts +10 -0
- package/src/utils/debug-log.ts +1 -1
- package/src/utils/decimal-comma.ts +39 -6
- package/src/utils/exchange-announcements.ts +71 -0
- package/src/utils/exchange-rate-snapshot.ts +10 -0
- package/src/utils/financial-statements.ts +89 -5
- package/src/utils/format.ts +34 -16
- package/src/utils/fundamentals.ts +150 -34
- package/src/utils/fx-market-hours.ts +10 -1
- package/src/utils/latest-financial-period.ts +8 -0
- package/src/utils/linux-libc.ts +54 -0
- package/src/utils/market-capitalization.ts +111 -15
- package/src/utils/max-drawdown.ts +64 -0
- package/src/utils/network-failure.ts +86 -0
- package/src/utils/option-expiry.ts +186 -7
- package/src/utils/options.ts +10 -0
- package/src/utils/plugin-proxy-hosts.json +1 -0
- package/src/utils/price-earnings.ts +11 -5
- package/src/utils/price-history.ts +23 -8
- package/src/utils/price-window.ts +131 -0
- package/src/utils/release-date.ts +47 -0
- package/src/utils/sec.ts +3 -0
- package/src/utils/throttled-fetch.ts +11 -4
- package/src/utils/trailing-eps.ts +67 -0
- package/src/utils/typed-text.ts +21 -0
- package/src/utils/utc-time.ts +24 -1
- package/src/version.ts +6 -0
- package/src/cli/pane-functions/screenshot.ts +0 -2122
- package/src/renderers/browser/first-screen.ts +0 -193
|
@@ -38,17 +38,9 @@ import { WindowControls, WINDOWS_CONTROL_GROUP_WIDTH_PX } from "./window-control
|
|
|
38
38
|
import { Button, terminalButtonColumns } from "../ui/button";
|
|
39
39
|
|
|
40
40
|
const UPDATE_NOTICE_DURATION_MS = 5_000;
|
|
41
|
-
/**
|
|
42
|
-
* The failed-update message is cut to the room it has, but not below this many
|
|
43
|
-
* columns ("Update fa..."): narrower says nothing, so the banner is left out.
|
|
44
|
-
* The retry hint gives way before the message goes under it.
|
|
45
|
-
*/
|
|
46
|
-
const UPDATE_ERROR_MIN_COLUMNS = 12;
|
|
47
41
|
/** Kept clear after the terminal update status, so its last character never touches the Help pill. */
|
|
48
42
|
const UPDATE_STATUS_GAP_COLUMNS = 1;
|
|
49
|
-
/**
|
|
50
|
-
const UPDATE_REASON_MIN_COLUMNS = 8;
|
|
51
|
-
/** A terminal line about an update narrower than this is left out rather than shown as a stub. */
|
|
43
|
+
/** A clipped terminal notice narrower than this is left out rather than shown as a stub. */
|
|
52
44
|
const UPDATE_TEXT_MIN_COLUMNS = 8;
|
|
53
45
|
/** Left padding of the update status's slot, in cells; the desktop's title-bar layout also pads its right. */
|
|
54
46
|
const UPDATE_SLOT_PADDING_COLUMNS = 2;
|
|
@@ -316,7 +308,7 @@ function HeaderCommandPrompt({
|
|
|
316
308
|
*/
|
|
317
309
|
type UpdateStatusView =
|
|
318
310
|
| { kind: "busy"; text: string; parts: StatusPart[] }
|
|
319
|
-
| { kind: "text"; text: string }
|
|
311
|
+
| { kind: "text"; text: string; compact?: string; clip?: boolean }
|
|
320
312
|
| { kind: "restart"; text: string; version: string }
|
|
321
313
|
| { kind: "failed"; message: string; parts: StatusPart[]; retry: boolean };
|
|
322
314
|
|
|
@@ -374,7 +366,7 @@ function resolveUpdateStatusView({
|
|
|
374
366
|
if (updateProgress.canRestart && canRestart) {
|
|
375
367
|
return { kind: "restart", text: t("Update ready"), version: updateAvailable?.version ?? "" };
|
|
376
368
|
}
|
|
377
|
-
return { kind: "text", text: t("Update ready, restart to apply") };
|
|
369
|
+
return { kind: "text", text: t("Update ready, restart to apply"), compact: t("Update ready") };
|
|
378
370
|
}
|
|
379
371
|
if (updateProgress.phase === "done") {
|
|
380
372
|
return { kind: "text", text: t(updateProgress.message ?? "Update ready, restart to apply") };
|
|
@@ -412,14 +404,14 @@ function resolveUpdateStatusView({
|
|
|
412
404
|
if (updateAvailable.updateAction.kind === "managed") {
|
|
413
405
|
return {
|
|
414
406
|
kind: "text",
|
|
415
|
-
text: tf("v{version} available, update through the package manager that installed
|
|
407
|
+
text: tf("v{version} available, update through the package manager that installed Gloom", {
|
|
416
408
|
version: updateAvailable.version,
|
|
417
409
|
}),
|
|
418
410
|
};
|
|
419
411
|
}
|
|
420
412
|
return { kind: "text", text: tf("v{version} available — starting download...", { version: updateAvailable.version }) };
|
|
421
413
|
}
|
|
422
|
-
if (updateNotice) return { kind: "text", text: updateNotice };
|
|
414
|
+
if (updateNotice) return { kind: "text", text: updateNotice, clip: true };
|
|
423
415
|
return null;
|
|
424
416
|
}
|
|
425
417
|
|
|
@@ -460,8 +452,8 @@ function retryHint(view: Extract<UpdateStatusView, { kind: "failed" }>, updateKe
|
|
|
460
452
|
}
|
|
461
453
|
|
|
462
454
|
/**
|
|
463
|
-
* Columns the terminal status takes when
|
|
464
|
-
* slot that much from the closed prompt's empty room before
|
|
455
|
+
* Columns the terminal status takes when everything fits: the header gives
|
|
456
|
+
* the slot that much from the closed prompt's empty room before dropping parts.
|
|
465
457
|
*/
|
|
466
458
|
function terminalUpdateStatusColumns(view: UpdateStatusView, updateKey: string): number {
|
|
467
459
|
return UPDATE_STATUS_GAP_COLUMNS + terminalUpdateStatusContentColumns(view, updateKey);
|
|
@@ -490,7 +482,7 @@ function terminalClosedPromptFloor(): number {
|
|
|
490
482
|
}
|
|
491
483
|
|
|
492
484
|
/**
|
|
493
|
-
* What the header says about an update. The terminal
|
|
485
|
+
* What the header says about an update. The terminal fits it to `columns`,
|
|
494
486
|
* the room its slot is guaranteed; the desktop and the web let the browser fit
|
|
495
487
|
* it to the room the bar leaves (NativeUpdateStatus). Either way it never runs
|
|
496
488
|
* into the Help pill or the market cluster beside it.
|
|
@@ -525,7 +517,7 @@ function TerminalUpdateStatus({ columns, onRestart, updateKey, view }: {
|
|
|
525
517
|
);
|
|
526
518
|
}
|
|
527
519
|
|
|
528
|
-
/**
|
|
520
|
+
/** Whole status parts in priority order; only transient notices may be clipped. */
|
|
529
521
|
function terminalUpdateStatusContent({ onRestart, room, updateKey, view }: {
|
|
530
522
|
onRestart?: () => void;
|
|
531
523
|
room: number;
|
|
@@ -533,9 +525,9 @@ function terminalUpdateStatusContent({ onRestart, room, updateKey, view }: {
|
|
|
533
525
|
view: UpdateStatusView;
|
|
534
526
|
}): ReactNode {
|
|
535
527
|
if (view.kind === "busy") {
|
|
536
|
-
// The
|
|
537
|
-
|
|
538
|
-
return <TerminalBusyStatus text={
|
|
528
|
+
// The percent stays when the words give way; the spinner never stands alone.
|
|
529
|
+
const text = fitStatusParts(view.parts, room - 2);
|
|
530
|
+
return text ? <TerminalBusyStatus text={text} /> : null;
|
|
539
531
|
}
|
|
540
532
|
if (view.kind === "restart") {
|
|
541
533
|
// The button stays when the words do not fit beside it.
|
|
@@ -549,9 +541,7 @@ function terminalUpdateStatusContent({ onRestart, room, updateKey, view }: {
|
|
|
549
541
|
const hintColumns = displayWidth(hint);
|
|
550
542
|
const messageColumns = displayWidth(view.message);
|
|
551
543
|
const short = t(UPDATE_FAILED_SHORT);
|
|
552
|
-
|
|
553
|
-
// The whole message with its key, then the message alone, then as much of
|
|
554
|
-
// the reason as reads, then "Update failed" with its key; never less.
|
|
544
|
+
// The reason and retry hint give way whole, leaving a compact failure signal.
|
|
555
545
|
let text: string;
|
|
556
546
|
let showHint = false;
|
|
557
547
|
if (messageColumns + hintColumns <= room) {
|
|
@@ -559,37 +549,33 @@ function terminalUpdateStatusContent({ onRestart, room, updateKey, view }: {
|
|
|
559
549
|
showHint = hintColumns > 0;
|
|
560
550
|
} else if (messageColumns <= room) {
|
|
561
551
|
text = view.message;
|
|
562
|
-
} else if (reasonRoom >= UPDATE_REASON_MIN_COLUMNS) {
|
|
563
|
-
text = truncateToDisplayWidth(view.message, room);
|
|
564
552
|
} else if (displayWidth(short) + hintColumns <= room) {
|
|
565
553
|
text = short;
|
|
566
554
|
showHint = hintColumns > 0;
|
|
567
|
-
} else if (
|
|
568
|
-
text =
|
|
555
|
+
} else if (displayWidth(short) <= room) {
|
|
556
|
+
text = short;
|
|
569
557
|
} else {
|
|
570
558
|
return null;
|
|
571
559
|
}
|
|
572
560
|
return <TerminalFailedStatus text={text} hint={showHint ? hint : ""} />;
|
|
573
561
|
}
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
562
|
+
if (view.clip) {
|
|
563
|
+
if (room < UPDATE_TEXT_MIN_COLUMNS) return null;
|
|
564
|
+
return <TerminalTextStatus text={view.text} width={room} />;
|
|
565
|
+
}
|
|
566
|
+
const text = displayWidth(view.text) <= room ? view.text : view.compact;
|
|
567
|
+
return text && displayWidth(text) <= room ? <TerminalTextStatus text={text} width={room} /> : null;
|
|
577
568
|
}
|
|
578
569
|
|
|
579
570
|
/**
|
|
580
|
-
* A status line in `width` columns: the
|
|
581
|
-
*
|
|
571
|
+
* A status line in `width` columns: the parts the desktop may clip instead
|
|
572
|
+
* drop out whole in the terminal, keeping the download's percent readable.
|
|
582
573
|
*/
|
|
583
574
|
function fitStatusParts(parts: StatusPart[], width: number): string {
|
|
584
|
-
const
|
|
585
|
-
|
|
586
|
-
const
|
|
587
|
-
|
|
588
|
-
// A cut piece keeps a space before the whole one after it: "Downloading v... 42%".
|
|
589
|
-
const cut = (part: StatusPart, index: number) => index < parts.length - 1
|
|
590
|
-
? `${truncateToDisplayWidth(part.text.trimEnd(), Math.max(0, cutRoom - 1))} `
|
|
591
|
-
: truncateToDisplayWidth(part.text, cutRoom);
|
|
592
|
-
return truncateToDisplayWidth(parts.map((part, index) => (part.cut ? cut(part, index) : part.text)).join(""), width);
|
|
575
|
+
const full = parts.map((part) => part.text).join("");
|
|
576
|
+
if (displayWidth(full) <= width) return full;
|
|
577
|
+
const compact = parts.filter((part) => !part.cut).map((part) => part.text).join("").trim();
|
|
578
|
+
return displayWidth(compact) <= width ? compact : "";
|
|
593
579
|
}
|
|
594
580
|
|
|
595
581
|
function TerminalBusyStatus({ text }: { text: string }) {
|
|
@@ -780,7 +766,7 @@ function HeaderMarketSummary({ nativePaneChrome, width }: { nativePaneChrome: bo
|
|
|
780
766
|
const summary = useMarketSummary();
|
|
781
767
|
const fit = resolveMarketSummaryFit({
|
|
782
768
|
available: width,
|
|
783
|
-
baseCurrencyWidth: summary.
|
|
769
|
+
baseCurrencyWidth: displayWidth(summary.baseCurrencyLabel) + 1,
|
|
784
770
|
countdownWidth: summary.marketLabel.length - summary.marketLabelShort.length,
|
|
785
771
|
spyWidth: summary.spyText.length + 1,
|
|
786
772
|
stateWidth: summary.marketLabelShort ? summary.marketLabelShort.length + 1 : 0,
|
|
@@ -790,20 +776,20 @@ function HeaderMarketSummary({ nativePaneChrome, width }: { nativePaneChrome: bo
|
|
|
790
776
|
return (
|
|
791
777
|
<>
|
|
792
778
|
{fit.showState && marketLabel ? (
|
|
793
|
-
<Box paddingRight={1} flexShrink={0}>
|
|
779
|
+
<Box paddingRight={1} flexShrink={0} data-gloom-role="header-market">
|
|
794
780
|
<Text fg={summary.marketColor} {...(nativePaneChrome ? { attributes: TextAttributes.BOLD } : {})}>
|
|
795
781
|
{marketLabel}
|
|
796
782
|
</Text>
|
|
797
783
|
</Box>
|
|
798
784
|
) : null}
|
|
799
785
|
{fit.showSpy ? (
|
|
800
|
-
<Box paddingRight={1} flexShrink={0}>
|
|
786
|
+
<Box paddingRight={1} flexShrink={0} data-gloom-role="header-market">
|
|
801
787
|
<Text fg={summary.spyColor}>{summary.spyText}</Text>
|
|
802
788
|
</Box>
|
|
803
789
|
) : null}
|
|
804
790
|
{fit.showBaseCurrency ? (
|
|
805
791
|
<Box paddingRight={1} flexShrink={0}>
|
|
806
|
-
<Text fg={nativePaneChrome ? colors.textDim : blendHex(colors.headerText, colors.header, 0.42)}>{summary.
|
|
792
|
+
<Text fg={nativePaneChrome ? colors.textDim : blendHex(colors.headerText, colors.header, 0.42)}>{summary.baseCurrencyLabel}</Text>
|
|
807
793
|
</Box>
|
|
808
794
|
) : null}
|
|
809
795
|
</>
|
|
@@ -845,15 +831,16 @@ export function Header({
|
|
|
845
831
|
const { nativePaneChrome = false, titleBarOverlay, nativeWindowChrome = titleBarOverlay, windowControls } = useUiCapabilities();
|
|
846
832
|
const showWindowControls = nativeWindowChrome && windowControls === "windows";
|
|
847
833
|
const windowFullscreen = useWindowFullscreen();
|
|
834
|
+
const updateStatus = useUpdateStatus(!!onRestartForUpdate);
|
|
848
835
|
const prompt = resolveHeaderPromptGeometry({
|
|
849
836
|
nativePaneChrome,
|
|
850
837
|
nativeWindowChrome,
|
|
851
838
|
termWidth,
|
|
852
839
|
titleBarOverlay,
|
|
853
840
|
windowFullscreen,
|
|
841
|
+
allowMarketExpansion: !updateStatus.view,
|
|
854
842
|
});
|
|
855
843
|
const shortcutLabel = useCommandBarShortcut();
|
|
856
|
-
const updateStatus = useUpdateStatus(!!onRestartForUpdate);
|
|
857
844
|
// The terminal lays the header out by cell counts, so it works out what is left
|
|
858
845
|
// for the update status once the Help pill and the slot's padding are paid for.
|
|
859
846
|
let updateStatusColumns = Math.max(
|
|
@@ -4,12 +4,12 @@ import { useThemeColors } from "../../theme/theme-context";
|
|
|
4
4
|
import { useAppVisible } from "../../state/app/activity";
|
|
5
5
|
import { useAppSelector } from "../../state/app/context";
|
|
6
6
|
import { getSharedMarketDataCoordinator } from "../../market-data/coordinator";
|
|
7
|
-
import { t } from "../../i18n";
|
|
7
|
+
import { t, tf } from "../../i18n";
|
|
8
8
|
import { useQuoteEntry, useResolvedEntryValue } from "../../market-data/hooks";
|
|
9
9
|
import { useQuoteStreaming } from "../../state/hooks/quote-streaming";
|
|
10
10
|
import type { QuoteSubscriptionTarget } from "../../types/data-provider";
|
|
11
11
|
import { formatPercentRaw } from "../../utils/format";
|
|
12
|
-
import {
|
|
12
|
+
import { formatMarketPriceWithCurrency, liveQuoteFormatOptions } from "../../market-data/market/format";
|
|
13
13
|
import { getSessionMoveDisplay, marketStateColor, marketStateCountdown, marketStateLabel } from "../../market-data/market/status";
|
|
14
14
|
import type { Quote } from "../../types/financials";
|
|
15
15
|
|
|
@@ -33,7 +33,8 @@ const SPY_STREAM_TARGETS: QuoteSubscriptionTarget[] = [{
|
|
|
33
33
|
}];
|
|
34
34
|
|
|
35
35
|
export interface MarketSummary {
|
|
36
|
-
|
|
36
|
+
/** The base currency under its own label (base THB), so it never reads as the unit of SPY's price beside it. */
|
|
37
|
+
baseCurrencyLabel: string;
|
|
37
38
|
marketColor: string;
|
|
38
39
|
/** Market state with its countdown, when the state has one. */
|
|
39
40
|
marketLabel: string;
|
|
@@ -83,6 +84,8 @@ export function resolveMarketSummaryFit(options: {
|
|
|
83
84
|
* it, as `ticker SPY` headlines them. While a pre-market or after-hours
|
|
84
85
|
* session is open (PRE-MKT, AFTER-HRS) the slot is that session's print and
|
|
85
86
|
* its move from the close, so the figure is the session the label names.
|
|
87
|
+
* The price carries its currency's sign ($), so the base currency label
|
|
88
|
+
* after it is never read as its unit.
|
|
86
89
|
*/
|
|
87
90
|
export function spySummary(quote: Quote | null | undefined, colors: ThemeColors): Pick<MarketSummary, "spyColor" | "spyText"> {
|
|
88
91
|
const display = getSessionMoveDisplay(quote);
|
|
@@ -91,7 +94,7 @@ export function spySummary(quote: Quote | null | undefined, colors: ThemeColors)
|
|
|
91
94
|
return {
|
|
92
95
|
spyColor: display?.change != null ? priceColor(display.change, colors) : colors.textDim,
|
|
93
96
|
spyText: display
|
|
94
|
-
? `SPY ${
|
|
97
|
+
? `SPY ${formatMarketPriceWithCurrency(display.price, quote?.currency || "USD", liveQuoteFormatOptions(quote, quote?.currency, "ETF"))} ${formatPercentRaw(display.changePercent).padStart(6)}`
|
|
95
98
|
: "SPY —",
|
|
96
99
|
};
|
|
97
100
|
}
|
|
@@ -137,11 +140,11 @@ export function useMarketSummary(): MarketSummary {
|
|
|
137
140
|
const mktCountdown = mktState ? marketStateCountdown(mktState, now) : null;
|
|
138
141
|
const marketLabelShort = mktState ? t(marketStateLabel(mktState)) : "";
|
|
139
142
|
const marketLabel = marketLabelShort && mktCountdown
|
|
140
|
-
? `${marketLabelShort} · ${mktCountdown}`
|
|
143
|
+
? `${marketLabelShort} · ${mktCountdown}${mktState === "PRE" ? ` ${t("to regular open")}` : ""}`
|
|
141
144
|
: marketLabelShort;
|
|
142
145
|
|
|
143
146
|
return {
|
|
144
|
-
baseCurrency,
|
|
147
|
+
baseCurrencyLabel: tf("base {currency}", { currency: baseCurrency }),
|
|
145
148
|
marketColor: mktState ? marketStateColor(mktState, colors) : colors.textDim,
|
|
146
149
|
marketLabel,
|
|
147
150
|
marketLabelShort,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createContext, useContext } from "react";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* True inside a `
|
|
4
|
+
* True inside a `gloom shot` whose status line dates the pane's data: the
|
|
5
5
|
* pane's own `as of` text (a query bar's `asOf`) is left out, so the date is
|
|
6
6
|
* said once. False everywhere else.
|
|
7
7
|
*/
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ContextMenuItem } from "../../../../types/context-menu";
|
|
2
2
|
import { t } from "../../../../i18n";
|
|
3
3
|
import { clipToDisplayWidth, displayWidth } from "../../../../utils/format";
|
|
4
|
+
import { formatShortDate } from "../../../../utils/datetime-format";
|
|
4
5
|
import { getShortcutHintWidth } from "../../../ui/shortcut-hint";
|
|
5
6
|
|
|
6
7
|
export interface PaneFooterRegistration {
|
|
@@ -38,10 +39,16 @@ export interface PaneFooterSegment {
|
|
|
38
39
|
asOf?: boolean;
|
|
39
40
|
/**
|
|
40
41
|
* The segment only says how current the pane's quotes are (`2026-10-09 ·
|
|
41
|
-
* 15m delayed`), which a `
|
|
42
|
+
* 15m delayed`), which a `gloom shot` status line says too: a shot whose
|
|
42
43
|
* line states its data's date and delay leaves it out.
|
|
43
44
|
*/
|
|
44
45
|
quoteStatus?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* The segment says what the rows leave out (releases a filter hides), which
|
|
48
|
+
* a picture of the rows cannot: a `gloom shot` keeps it, as it keeps a
|
|
49
|
+
* warning.
|
|
50
|
+
*/
|
|
51
|
+
capture?: boolean;
|
|
45
52
|
/**
|
|
46
53
|
* Shorter forms of `parts`, longest first. When the row is too narrow for
|
|
47
54
|
* `parts` beside the hints, it shows the first that fits, or the last, and
|
|
@@ -90,6 +97,26 @@ export function delayedFooterSegment({
|
|
|
90
97
|
};
|
|
91
98
|
}
|
|
92
99
|
|
|
100
|
+
/**
|
|
101
|
+
* The footer's one form for data shown from a copy saved earlier because
|
|
102
|
+
* refreshing it failed (offline, a hung or refused proxy): `saved copy from
|
|
103
|
+
* 14:37`, or with its day when saved on another. It says how current the
|
|
104
|
+
* pane's quotes are, so it is a quote status.
|
|
105
|
+
*/
|
|
106
|
+
export function savedCopyFooterSegment(id: string, savedAt: number, now = Date.now()): PaneFooterSegment {
|
|
107
|
+
const saved = new Date(savedAt);
|
|
108
|
+
const time = saved.toLocaleTimeString("en-US", { hour: "2-digit", minute: "2-digit", hour12: false });
|
|
109
|
+
const when = saved.toDateString() === new Date(now).toDateString() ? time : `${formatShortDate(saved, { year: false })} ${time}`;
|
|
110
|
+
const text = `${t("saved copy from")} ${when}`;
|
|
111
|
+
return {
|
|
112
|
+
id,
|
|
113
|
+
quoteStatus: true,
|
|
114
|
+
title: `${t("Couldn't refresh")}: ${text}`,
|
|
115
|
+
parts: [{ text, tone: "warning" }],
|
|
116
|
+
variants: [[{ text: t("saved copy"), tone: "warning" }]],
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
93
120
|
/** A pane whose market data is all delayed, by no one figure: the clock alone, its tooltip saying so. */
|
|
94
121
|
export const DELAYED_SEGMENT: PaneFooterSegment = delayedFooterSegment({ id: "delayed", detail: "Delayed market data" });
|
|
95
122
|
|
|
@@ -165,7 +192,12 @@ export interface CombinedPaneFooter {
|
|
|
165
192
|
|
|
166
193
|
export const EMPTY_FOOTER: CombinedPaneFooter = { info: [], hints: [], menu: [], keys: [] };
|
|
167
194
|
|
|
168
|
-
/**
|
|
195
|
+
/**
|
|
196
|
+
* Status the hints leave room for, more when it is a warning: a failure must
|
|
197
|
+
* stay readable. A status no longer than the warning's room is kept whole,
|
|
198
|
+
* with the hints that no longer fit under More, so a status word is never cut
|
|
199
|
+
* against them ("Cloud sync d [a]dd event"); a longer one gives way to the hints.
|
|
200
|
+
*/
|
|
169
201
|
const INFO_FLOOR_CHARS = 10;
|
|
170
202
|
const WARNING_FLOOR_CHARS = 24;
|
|
171
203
|
const HINT_GAP = 1;
|
|
@@ -264,9 +296,10 @@ export function layoutPaneFooterHintRow(
|
|
|
264
296
|
const width = Math.max(0, Math.floor(contentWidth));
|
|
265
297
|
const hints = footer.hints.filter((hint) => !hint.disabled);
|
|
266
298
|
const warning = footer.info.some((segment) => segment.parts.some((part) => part.tone === "warning" || part.tone === "negative"));
|
|
267
|
-
const
|
|
268
|
-
|
|
269
|
-
:
|
|
299
|
+
const infoChars = infoTextWidth(footer.info);
|
|
300
|
+
const textFloor = footer.info.length === 0 ? 0
|
|
301
|
+
: warning || infoChars <= WARNING_FLOOR_CHARS ? Math.min(WARNING_FLOOR_CHARS, infoChars)
|
|
302
|
+
: INFO_FLOOR_CHARS;
|
|
270
303
|
const infoFloor = Math.min(width, Math.max(iconReserve, textFloor));
|
|
271
304
|
const hintBudget = Math.max(0, width - infoFloor - (infoFloor > 0 && hints.length > 0 ? 1 : 0));
|
|
272
305
|
const more = moreControl(hintBudget);
|
|
@@ -15,11 +15,11 @@ const HEADER_PROMPT_COMFORT_WIDTH = 48;
|
|
|
15
15
|
const COMMAND_SURFACE_MIN_WIDTH = { native: 46, terminal: 42 };
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* Market budgets used to size the command prompt, widest first. These stay
|
|
19
|
+
* independent of label wording so a longer countdown cannot resize the prompt
|
|
20
|
+
* or the sheet attached to it:
|
|
21
21
|
*
|
|
22
|
-
* 42
|
|
22
|
+
* 42 state, SPY, currency and a short countdown
|
|
23
23
|
* 31 the state label and SPY
|
|
24
24
|
* 21 SPY alone
|
|
25
25
|
*
|
|
@@ -29,6 +29,11 @@ const COMMAND_SURFACE_MIN_WIDTH = { native: 46, terminal: 42 };
|
|
|
29
29
|
* columns to add the base currency, the one value here that barely moves.
|
|
30
30
|
*/
|
|
31
31
|
const HEADER_MARKET_TIERS = [42, 31, 21] as const;
|
|
32
|
+
/**
|
|
33
|
+
* Full pre-market label, including "to regular open", when spare room allows:
|
|
34
|
+
* "PRE-MKT · 1h 17m to regular open SPY $762.43 -0.60% base USD" with room to spare.
|
|
35
|
+
*/
|
|
36
|
+
const HEADER_MARKET_FULL_COLUMNS = 64;
|
|
32
37
|
|
|
33
38
|
/**
|
|
34
39
|
* Update status is transient, so on a narrow header it gives most of its
|
|
@@ -94,6 +99,8 @@ export function resolveHeaderPromptGeometry(options: {
|
|
|
94
99
|
platform?: string;
|
|
95
100
|
titleBarOverlay?: boolean;
|
|
96
101
|
windowFullscreen?: boolean;
|
|
102
|
+
/** An active update status keeps its spare room ahead of a longer market label. */
|
|
103
|
+
allowMarketExpansion?: boolean;
|
|
97
104
|
}): HeaderPromptGeometry {
|
|
98
105
|
const { nativePaneChrome, platform, termWidth, titleBarOverlay, windowFullscreen } = options;
|
|
99
106
|
const nativeWindowChrome = options.nativeWindowChrome ?? titleBarOverlay;
|
|
@@ -102,13 +109,19 @@ export function resolveHeaderPromptGeometry(options: {
|
|
|
102
109
|
: 0;
|
|
103
110
|
const left = leadingInset + 1;
|
|
104
111
|
const updateReserve = headerPromptUpdateColumns(termWidth);
|
|
105
|
-
const
|
|
112
|
+
const marketReserve = headerMarketColumns(termWidth, left, updateReserve);
|
|
106
113
|
const width = Math.max(
|
|
107
114
|
HEADER_PROMPT_MIN_WIDTH,
|
|
108
115
|
Math.min(
|
|
109
116
|
resolveCommandSurfaceWidth({ nativePaneChrome, termWidth }),
|
|
110
|
-
termWidth - left - updateReserve -
|
|
117
|
+
termWidth - left - updateReserve - marketReserve,
|
|
111
118
|
),
|
|
112
119
|
);
|
|
120
|
+
// Spend only space left after the prompt and update reserve have their room.
|
|
121
|
+
// The longer market label gives way before either can lose a column.
|
|
122
|
+
const marketColumns = options.allowMarketExpansion !== false
|
|
123
|
+
&& termWidth - left - width - updateReserve >= HEADER_MARKET_FULL_COLUMNS
|
|
124
|
+
? HEADER_MARKET_FULL_COLUMNS
|
|
125
|
+
: marketReserve;
|
|
113
126
|
return { left, width, marketColumns, updateColumns: Math.max(0, termWidth - left - width - marketColumns) };
|
|
114
127
|
}
|
|
@@ -847,7 +847,7 @@ export function Shell({
|
|
|
847
847
|
justifyContent="center"
|
|
848
848
|
>
|
|
849
849
|
<Box flexDirection="column" alignItems="center">
|
|
850
|
-
<AsciiText text="
|
|
850
|
+
<AsciiText text="Gloom" font="wordmark" color={colors.textMuted} />
|
|
851
851
|
<Box height={1} />
|
|
852
852
|
{/* An empty layout starts at the command bar: a click opens it, the key is beside it. */}
|
|
853
853
|
<Button
|
|
@@ -881,6 +881,7 @@ export function Shell({
|
|
|
881
881
|
dockDividerLayouts={dockDividerLayouts}
|
|
882
882
|
dockLeafLayouts={dockLeafLayouts}
|
|
883
883
|
focusedPaneId={focusedPaneId}
|
|
884
|
+
floatingOrder={activeLayout.floating}
|
|
884
885
|
getPaneTitle={getPaneTitle}
|
|
885
886
|
getPaneQuickSettings={getPaneQuickSettings}
|
|
886
887
|
handleFloatingClose={handleFloatingClose}
|
|
@@ -34,6 +34,8 @@ interface ShellPaneLayersProps {
|
|
|
34
34
|
dockDividerLayouts: DockDividerLayout[];
|
|
35
35
|
dockLeafLayouts: DockLeafLayout[];
|
|
36
36
|
focusedPaneId: string | null;
|
|
37
|
+
/** Saved insertion order, independent of which floating window is in front. */
|
|
38
|
+
floatingOrder: readonly { instanceId: string }[];
|
|
37
39
|
getPaneTitle: (pane: ResolvedPane) => string;
|
|
38
40
|
getPaneQuickSettings: (paneId: string) => PaneHeaderQuickSetting[];
|
|
39
41
|
handleFloatingClose: (paneId: string) => void;
|
|
@@ -588,6 +590,7 @@ export function ShellPaneLayers({
|
|
|
588
590
|
dockDividerLayouts,
|
|
589
591
|
dockLeafLayouts,
|
|
590
592
|
focusedPaneId,
|
|
593
|
+
floatingOrder,
|
|
591
594
|
getPaneTitle,
|
|
592
595
|
getPaneQuickSettings,
|
|
593
596
|
handleFloatingClose,
|
|
@@ -691,6 +694,21 @@ export function ShellPaneLayers({
|
|
|
691
694
|
dividerDragStart: (divider, event) => handlersRef.current.startNativeDividerDrag(divider, event),
|
|
692
695
|
}), []);
|
|
693
696
|
|
|
697
|
+
// DOM z-index already stacks the windows. Reordering their React children
|
|
698
|
+
// as focus changes detaches/reinserts the existing DOM nodes, resetting every
|
|
699
|
+
// nested scrollport to zero without a scroll event. A windowed list then
|
|
700
|
+
// paints its old tail into an empty viewport. Keep insertion order on the
|
|
701
|
+
// desktop/web, including the saved order for equal z-indices. The terminal
|
|
702
|
+
// still draws back to front.
|
|
703
|
+
const floatingLayers = useMemo(() => {
|
|
704
|
+
if (!nativePaneChrome) return visibleFloatingPanes;
|
|
705
|
+
const byId = new Map(visibleFloatingPanes.map((entry) => [entry.pane.instance.instanceId, entry]));
|
|
706
|
+
return floatingOrder.flatMap(({ instanceId }) => {
|
|
707
|
+
const entry = byId.get(instanceId);
|
|
708
|
+
return entry ? [entry] : [];
|
|
709
|
+
});
|
|
710
|
+
}, [floatingOrder, nativePaneChrome, visibleFloatingPanes]);
|
|
711
|
+
|
|
694
712
|
const layerProps = (pane: ResolvedPane, rect: LayoutBounds): PaneLayerProps => {
|
|
695
713
|
const paneId = pane.instance.instanceId;
|
|
696
714
|
const focused = focusedPaneId === paneId && (!overlayOpen || menuPaneId === paneId);
|
|
@@ -729,7 +747,7 @@ export function ShellPaneLayers({
|
|
|
729
747
|
);
|
|
730
748
|
})}
|
|
731
749
|
|
|
732
|
-
{
|
|
750
|
+
{floatingLayers.map(({ pane, rect }) => {
|
|
733
751
|
if (transientFocusActive && pane.instance.instanceId !== transientFocusPaneId) return null;
|
|
734
752
|
return (
|
|
735
753
|
<FloatingPaneLayer
|
|
@@ -466,7 +466,7 @@ function NativeStatusBar({
|
|
|
466
466
|
<Box flexGrow={1} minWidth={0} />
|
|
467
467
|
<StatusBarSummary nativePaneChrome {...props} />
|
|
468
468
|
{/* Widgets keep their width; the layout tabs give way instead. */}
|
|
469
|
-
<Box flexShrink={0} flexDirection="row" alignItems="center">
|
|
469
|
+
<Box flexShrink={0} flexDirection="row" alignItems="center" data-gloom-role="status-widgets">
|
|
470
470
|
<PluginSlot name="status:widget" />
|
|
471
471
|
</Box>
|
|
472
472
|
<StatusBarFeedback nativePaneChrome {...props} />
|
|
@@ -592,7 +592,7 @@ function StatusBarSummary({
|
|
|
592
592
|
onPress={() => { void rendererHost.openExternal(DESKTOP_DOWNLOAD_URL); }}
|
|
593
593
|
role="link"
|
|
594
594
|
setHoveredControl={setHoveredControl}
|
|
595
|
-
title={t("Get
|
|
595
|
+
title={t("Get Gloom for Mac or Windows")}
|
|
596
596
|
/>
|
|
597
597
|
)}
|
|
598
598
|
</>
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { useMemo, useState, type ReactNode } from "react";
|
|
2
2
|
import { useThemeColors } from "../../theme/theme-context";
|
|
3
3
|
import type { PricePoint } from "../../types/financials";
|
|
4
|
-
import { Box } from "../../ui";
|
|
4
|
+
import { Box, useUiCapabilities } from "../../ui";
|
|
5
5
|
import { compareSortValues, nextHeaderSort, type SortPreference } from "../../utils/sort-values";
|
|
6
6
|
import { DataTableStackView } from "../data-table/stack-view";
|
|
7
7
|
import { PriceSparkline } from "../price-sparkline/view";
|
|
8
8
|
import { PaneStatusBody, StatGrid, statGridRows, type DataTableColumn, type DataTableCell, type StatItem } from "../ui";
|
|
9
|
+
import { withCountryFlag, withFlagRoom } from "../ui/country-flag";
|
|
9
10
|
import { getTableWidth } from "../ui/table-layout";
|
|
10
11
|
|
|
11
12
|
export interface MarketBoardRow {
|
|
@@ -13,6 +14,11 @@ export interface MarketBoardRow {
|
|
|
13
14
|
label: string;
|
|
14
15
|
/** Secondary name shown beside the label, such as the instrument a jurisdiction sets. */
|
|
15
16
|
labelDetail?: string;
|
|
17
|
+
/**
|
|
18
|
+
* The country the row is (a jurisdiction, a sovereign), as a code or a
|
|
19
|
+
* name: its flag leads the label on the desktop and the web.
|
|
20
|
+
*/
|
|
21
|
+
country?: string | null;
|
|
16
22
|
value: number | null;
|
|
17
23
|
valueText: string;
|
|
18
24
|
change: number | null;
|
|
@@ -138,6 +144,8 @@ export function MarketBoardStack<T extends MarketBoardRow>({ rows, width, height
|
|
|
138
144
|
labelWidth = 18, labelHeader = "INSTRUMENT", labelDetailHeader = "DETAIL", labelDetailWidth = 22, valueLabel = "LEVEL", percentileLabel = "PCTL 1Y", asOfWidth = 10, signedChange = false, extraColumns,
|
|
139
145
|
rootBefore, emptyTitle = "No observations." }: MarketBoardStackProps<T>) {
|
|
140
146
|
const colors = useThemeColors();
|
|
147
|
+
// A board of countries leads each name with its flag where one is drawn.
|
|
148
|
+
const flagged = useUiCapabilities().nativePaneChrome === true && rows.some((row) => row.country !== undefined);
|
|
141
149
|
const [sort, setSort] = useState<SortPreference<string>>({ columnId: null, direction: "asc" });
|
|
142
150
|
const items = useMemo(() => sort.columnId ? [...rows].sort((a, b) => {
|
|
143
151
|
const key = sort.columnId as "label" | "labelDetail" | "value" | "change" | "percentile" | "asOf" | "changeAsOf";
|
|
@@ -149,7 +157,7 @@ export function MarketBoardStack<T extends MarketBoardRow>({ rows, width, height
|
|
|
149
157
|
// A stale or partial row's date carries a word, so the column has room for both and the date is never cut.
|
|
150
158
|
const wordWidth = Math.max(0, ...rows.map((row) => (row.status ? STATUS_WORDS[row.status]?.length : 0) ?? 0));
|
|
151
159
|
const { columns, shortAsOf } = fitBoardColumns([
|
|
152
|
-
{ id: "label", label: labelHeader, width: labelWidth, align: "left" },
|
|
160
|
+
withFlagRoom({ id: "label", label: labelHeader, width: labelWidth, align: "left" }, flagged),
|
|
153
161
|
...(rows.some((row) => row.labelDetail !== undefined)
|
|
154
162
|
? [{ id: "labelDetail", label: labelDetailHeader, width: labelDetailWidth, align: "left" as const }] : []),
|
|
155
163
|
{ id: "value", label: valueLabel, width: valueWidth, align: "right" },
|
|
@@ -164,7 +172,7 @@ export function MarketBoardStack<T extends MarketBoardRow>({ rows, width, height
|
|
|
164
172
|
const extra = extraColumns?.find((item) => item.column.id === column.id);
|
|
165
173
|
if (extra) return extra.renderCell(row);
|
|
166
174
|
const muted = row.status === "unavailable" ? colors.textDim : colors.text;
|
|
167
|
-
if (column.id === "label") return { text: row.label, color: muted };
|
|
175
|
+
if (column.id === "label") return withCountryFlag({ text: row.label, color: muted }, row.country, flagged);
|
|
168
176
|
if (column.id === "labelDetail") return { text: row.labelDetail ?? "", color: colors.textMuted };
|
|
169
177
|
if (column.id === "value") return { text: row.valueText, color: muted };
|
|
170
178
|
if (column.id === "change") return { text: row.changeText,
|
|
@@ -343,7 +343,7 @@ export function OnboardingHeader({
|
|
|
343
343
|
if (!desktop) {
|
|
344
344
|
return (
|
|
345
345
|
<Box height={1} flexDirection="row" justifyContent="space-between">
|
|
346
|
-
<Text fg={colors.textMuted}>{t("
|
|
346
|
+
<Text fg={colors.textMuted}>{t("GLOOM SETUP")}</Text>
|
|
347
347
|
{showDismiss ? (
|
|
348
348
|
<Button
|
|
349
349
|
label={dismissing ? "Closing..." : "Skip setup"}
|
|
@@ -161,6 +161,7 @@ function useOnboardingWizard({ pluginRegistry, importBrokerPositions, onComplete
|
|
|
161
161
|
importBrokerPositions,
|
|
162
162
|
getConfig: () => stateRef.current.config,
|
|
163
163
|
createBrokerInstance: (brokerType, label, values) => pluginRegistry.createBrokerInstance(brokerType, label, values),
|
|
164
|
+
enableBrokerInstance: (instanceId) => pluginRegistry.updateBrokerInstance(instanceId, {}, { enabled: true }),
|
|
164
165
|
onSynced: handleBrokerSynced,
|
|
165
166
|
setEditingField,
|
|
166
167
|
setPortfolioSub,
|
|
@@ -91,13 +91,13 @@ export function BrokerSetupPanel({
|
|
|
91
91
|
<Text fg={colors.textDim}>{t(" Enable \"ActiveX and Socket Clients\"")}</Text>
|
|
92
92
|
</Box>
|
|
93
93
|
<Box height={desktop ? 1 : 2} overflow="hidden">
|
|
94
|
-
<Text fg={colors.textDim}>{t("
|
|
94
|
+
<Text fg={colors.textDim}>{t(" Gloom can auto-detect local API ports (4001, 4002, 7496, 7497)")}</Text>
|
|
95
95
|
</Box>
|
|
96
96
|
<Box height={desktop ? 1 : 2} overflow="hidden">
|
|
97
97
|
<Text fg={colors.textDim}>{t(" Use Manual setup only if you need a custom host or exact socket port")}</Text>
|
|
98
98
|
</Box>
|
|
99
99
|
<Box height={1}>
|
|
100
|
-
<Text fg={colors.textDim}>{t("4. Keep it running while using
|
|
100
|
+
<Text fg={colors.textDim}>{t("4. Keep it running while using Gloom")}</Text>
|
|
101
101
|
</Box>
|
|
102
102
|
<Box height={desktop ? 2 : 1} />
|
|
103
103
|
<GuideLink url={IBKR_GATEWAY_DOWNLOAD_URL} />
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useEffect, useRef, useState, type ComponentProps, type RefObject } from "react";
|
|
2
2
|
import { Box, Text, TextAttributes, useUiCapabilities, type InputRenderable } from "../../../ui";
|
|
3
3
|
import { useThemeColors } from "../../../theme/theme-context";
|
|
4
|
-
import {
|
|
4
|
+
import { shownPriceColor } from "../../../theme/colors";
|
|
5
5
|
import { t, tf } from "../../../i18n";
|
|
6
6
|
import { formatMarketPrice } from "../../../market-data/market/format";
|
|
7
7
|
import { getRegularSessionDisplay } from "../../../market-data/market/status";
|
|
@@ -62,7 +62,7 @@ function PreviewLine({ preview, error }: Pick<OnboardingPositionsState, "preview
|
|
|
62
62
|
<Text fg={colors.text} attributes={TextAttributes.BOLD}>{preview.symbol}</Text>
|
|
63
63
|
{preview.name ? <Text fg={colors.textDim}>{` ${preview.name}`}</Text> : null}
|
|
64
64
|
{price != null ? <Text fg={colors.text}>{` ${formatMarketPrice(price, { maxWidth: 12 })}`}</Text> : null}
|
|
65
|
-
{change != null ? <Text fg={
|
|
65
|
+
{change != null ? <Text fg={shownPriceColor(change, 2, colors)}>{` ${formatPercentRaw(change)}`}</Text> : null}
|
|
66
66
|
{preview.duplicate ? <Text fg={colors.textMuted}>{t(" already added")}</Text> : null}
|
|
67
67
|
</Box>
|
|
68
68
|
);
|