gloomberb 0.18.3 → 0.18.4
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/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 +2 -2
- 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 +84 -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 +22 -5
- package/src/api-client/market-discovery.ts +14 -0
- package/src/api-client/members.ts +6 -0
- package/src/api-client/mna.ts +6 -0
- package/src/api-client/paths.ts +18 -1
- package/src/api-client/request.ts +21 -4
- 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 +90 -2
- package/src/app/pane-runtime/plugin-bindings.ts +9 -2
- 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 +4 -2
- package/src/cli/commands/keybindings.ts +2 -2
- package/src/cli/commands/market.ts +1117 -264
- package/src/cli/commands/news-hints.ts +2 -2
- package/src/cli/commands/news-search.ts +59 -6
- package/src/cli/commands/options-leaps.ts +41 -26
- package/src/cli/commands/overview.ts +121 -48
- package/src/cli/commands/plugins.ts +9 -9
- package/src/cli/commands/remote.ts +13 -10
- package/src/cli/commands/search.ts +64 -44
- package/src/cli/commands/system.ts +27 -19
- package/src/cli/commands/themes.ts +1 -1
- package/src/cli/commands/ticker.ts +192 -47
- 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 +20 -2
- package/src/cli/exit-codes.ts +1 -1
- package/src/cli/export-source.ts +10 -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 +64 -20
- package/src/cli/help.ts +19 -13
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +196 -43
- package/src/cli/index-roots.ts +5 -45
- package/src/cli/index.ts +24 -18
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +300 -41
- 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 +174 -23
- package/src/cli/pane-functions/function-help.ts +66 -27
- package/src/cli/pane-functions/headless.ts +24 -11
- package/src/cli/pane-functions/index.ts +18 -16
- 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 +5 -5
- package/src/cli/pane-functions/resolver.ts +47 -10
- 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 +38 -3
- package/src/cli/report-tables.ts +61 -16
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +111 -22
- 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 +373 -16
- 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 +5 -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-surface.tsx +305 -11
- package/src/components/chart/composite/price-axis-labels.tsx +27 -3
- package/src/components/chart/composite/rasterizer.ts +44 -19
- package/src/components/chart/composite/scene.ts +16 -4
- 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 +13 -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/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/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 +7 -6
- 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/model.ts +11 -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-wizard.tsx +1 -0
- package/src/components/onboarding/portfolio-step/broker-setup-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 +5 -1
- 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 +4 -4
- 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 +84 -0
- package/src/docs/snapshot.json +65 -32
- package/src/i18n/es.ts +29 -12
- package/src/i18n/ja.ts +29 -12
- package/src/i18n/ko.ts +29 -12
- package/src/i18n/zh-cn.ts +29 -12
- package/src/i18n/zh-tw.ts +29 -12
- 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/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 +49 -7
- package/src/market-data/market/freshness.ts +34 -5
- package/src/market-data/market/period-return.ts +163 -0
- 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/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 +5 -1
- 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 +4 -2
- 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/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 +29 -19
- package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
- package/src/plugins/builtin/alerts/cli.ts +485 -76
- package/src/plugins/builtin/alerts/command.ts +5 -10
- 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 +78 -0
- package/src/plugins/builtin/alerts/format.ts +2 -1
- package/src/plugins/builtin/alerts/headless.ts +100 -39
- package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
- package/src/plugins/builtin/alerts/history-rows.ts +89 -0
- package/src/plugins/builtin/alerts/index.tsx +45 -18
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +3 -3
- package/src/plugins/builtin/alerts/pane.tsx +97 -29
- 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 +13 -10
- package/src/plugins/builtin/alerts/targets.ts +12 -3
- 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 +3 -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 +21 -12
- package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
- package/src/plugins/builtin/broker-manager/model.ts +12 -2
- 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 +45 -13
- 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 +7 -1
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
- 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 +110 -23
- 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 +1 -1
- 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 +49 -4
- 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 +1 -0
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
- package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
- package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
- package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
- package/src/plugins/builtin/chart-composer/headless.ts +253 -35
- 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 +127 -28
- 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 +15 -21
- 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 +5 -6
- 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/index.tsx +1 -1
- package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
- package/src/plugins/builtin/chat/people.ts +1 -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/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 +132 -20
- package/src/plugins/builtin/econ/detail-view.tsx +48 -10
- 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 +112 -25
- package/src/plugins/builtin/econ/print-watch.ts +2 -1
- package/src/plugins/builtin/econ/types.ts +32 -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 +13 -2
- 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 +103 -0
- package/src/plugins/builtin/econ-statistics/view.ts +16 -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 +45 -10
- 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/headless.ts +51 -6
- package/src/plugins/builtin/exposure/index.tsx +28 -2
- package/src/plugins/builtin/exposure/model.ts +7 -0
- package/src/plugins/builtin/exposure/pane.tsx +6 -1
- 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/model.ts +10 -9
- package/src/plugins/builtin/futures/returns.ts +8 -36
- package/src/plugins/builtin/futures/table.tsx +1 -1
- 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 +15 -8
- package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
- package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
- package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -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/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 +4 -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 +46 -10
- 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/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/headless.ts +6 -5
- package/src/plugins/builtin/members/pane.tsx +11 -4
- 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/carry.ts +2 -2
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/view.tsx +10 -10
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- 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 +8 -5
- 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 +161 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/pane.tsx +36 -17
- 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 +49 -20
- 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 +6 -3
- 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/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/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 +76 -9
- 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/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 +2 -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/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/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -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 +8 -5
- package/src/plugins/builtin/themes/model.ts +14 -4
- package/src/plugins/builtin/themes/pane.tsx +24 -5
- 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 +8 -3
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
- package/src/plugins/builtin/vol-surface/client.ts +5 -4
- package/src/plugins/builtin/vol-surface/headless.ts +12 -3
- package/src/plugins/builtin/vol-surface/model.ts +4 -2
- package/src/plugins/builtin/volatility/model.ts +5 -10
- 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 +2 -1
- 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 +10 -8
- 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 +14 -0
- package/src/public/time-series.ts +11 -8
- package/src/remote/schema.ts +1 -1
- package/src/renderers/browser/config-host.ts +3 -0
- package/src/renderers/browser/main.tsx +23 -3
- 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/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +46 -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/external-plugins.ts +29 -7
- package/src/renderers/electrobun/bun/index.ts +11 -1
- 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/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/config-host.ts +3 -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/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 +14 -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/financial-routes.ts +21 -3
- package/src/sources/provider-router/financials.ts +15 -2
- package/src/sources/provider-router/history.ts +30 -8
- package/src/sources/provider-router/primary.ts +1 -1
- package/src/state/app/bootstrap.ts +23 -0
- package/src/state/hooks/inline-tickers.ts +30 -5
- package/src/sync/controller.ts +1 -1
- package/src/sync/core-contributors.ts +46 -14
- 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/test-support/builtin-panes.ts +1 -1
- package/src/theme/colors.ts +3 -30
- package/src/theme/ui-tokens.ts +37 -1
- package/src/tickers/company-name-listing.ts +210 -33
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/metadata.ts +10 -0
- package/src/tickers/perpetual-listing.ts +5 -2
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/index.ts +76 -27
- package/src/tickers/search/ranking.ts +54 -4
- 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 +307 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/economic.ts +5 -0
- package/src/time-series/fundamentals.ts +18 -3
- package/src/time-series/history-acquisition.ts +499 -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/range.ts +9 -1
- package/src/time-series/resolution.ts +174 -16
- package/src/time-series/resolve-context.ts +157 -0
- package/src/time-series/resolve.ts +126 -1577
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +208 -0
- package/src/time-series/spec.ts +11 -6
- package/src/time-series/studies.ts +109 -12
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/types.ts +29 -2
- package/src/time-series/use-chart-resolution.ts +4 -5
- package/src/types/broker.ts +10 -0
- package/src/types/config.ts +14 -0
- package/src/types/data-provider.ts +14 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +76 -6
- package/src/types/instrument.ts +3 -0
- package/src/types/plugin.ts +65 -8
- 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 +175 -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 +83 -4
- 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 +83 -0
- package/src/utils/option-expiry.ts +139 -7
- package/src/utils/price-earnings.ts +11 -5
- package/src/utils/price-history.ts +18 -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
|
@@ -5,6 +5,10 @@ import { t, tf } from "../../../i18n";
|
|
|
5
5
|
import { getManualPortfolioPositionPrefill, type ManualPortfolioPositionPrefill } from "../../../portfolio/manual-lots";
|
|
6
6
|
import { isManualPortfolio, positionQuantityLabel, resolveManualPositionCurrency } from "../../../portfolio/mutations";
|
|
7
7
|
import { futuresLotCurrency, isFuturesTicker } from "../../../portfolio/futures-positions";
|
|
8
|
+
import { sameCurrency } from "../../../portfolio/position-metrics";
|
|
9
|
+
import { resolvePortfolioTotalsCurrency } from "../../../portfolio/totals-currency";
|
|
10
|
+
import type { TickerPosition } from "../../../types/ticker";
|
|
11
|
+
import { DATE_FIELD_EXAMPLES } from "../../../utils/calendar-date";
|
|
8
12
|
import { US_CENTS } from "../../../utils/currency-units";
|
|
9
13
|
|
|
10
14
|
export interface SetPortfolioPositionWorkflowState {
|
|
@@ -24,12 +28,29 @@ interface ManualPortfolioPositionWorkflowOptions {
|
|
|
24
28
|
hidePortfolioFieldWhenSingleOption?: boolean;
|
|
25
29
|
}
|
|
26
30
|
|
|
31
|
+
/**
|
|
32
|
+
* What the Purchase Date and Cost FX fields start from for a holding: its
|
|
33
|
+
* date (several lots, their earliest) and the rate its cost was bought at
|
|
34
|
+
* into the portfolio's currency (several, weighted by cost). Saving them
|
|
35
|
+
* unchanged keeps what the lots have; a rate into another currency is kept
|
|
36
|
+
* without being shown.
|
|
37
|
+
*/
|
|
38
|
+
export function positionCostTermsPrefill(position: TickerPosition | null | undefined, portfolioCurrency: string): { dateAcquired: string; costFx: string } {
|
|
39
|
+
const rate = position?.costFxRate;
|
|
40
|
+
const shown = typeof rate === "number" && Number.isFinite(rate) && rate > 0 && position?.costFxCurrency?.trim().toUpperCase() === portfolioCurrency;
|
|
41
|
+
// A cross rate carries float noise (0.012625500000000001): shown to ten digits, kept exact when left as it opened.
|
|
42
|
+
return { dateAcquired: position?.dateAcquired ?? "", costFx: shown ? String(Number(rate.toPrecision(10))) : "" };
|
|
43
|
+
}
|
|
44
|
+
|
|
27
45
|
/** Several lots become one position on save: say so, and what the fields hold. */
|
|
28
46
|
function lotsReplacementHint(prefill: ManualPortfolioPositionPrefill, portfolioName: string): string | undefined {
|
|
29
47
|
if (prefill.lotCount < 2) return undefined;
|
|
30
48
|
const params = { count: prefill.lotCount, portfolio: portfolioName };
|
|
49
|
+
if (prefill.position && prefill.costFxConflict) {
|
|
50
|
+
return tf("Totals of your {count} lots in \"{portfolio}\", bought at FX rates one position cannot keep: give its Cost FX or Purchase Date. Saving replaces them with one position.", params);
|
|
51
|
+
}
|
|
31
52
|
if (prefill.position) {
|
|
32
|
-
return tf("Totals of your {count} lots in \"{portfolio}\". Saving replaces them with one position
|
|
53
|
+
return tf("Totals of your {count} lots in \"{portfolio}\". Saving replaces them with one position, dated by the earliest.", params);
|
|
33
54
|
}
|
|
34
55
|
return prefill.currencies
|
|
35
56
|
? tf("{count} lots in \"{portfolio}\" are in different currencies ({currencies}), so none is filled in. Saving replaces them with one position.", {
|
|
@@ -56,6 +77,13 @@ function buildManualPortfolioPositionWorkflow(
|
|
|
56
77
|
// A future's cost is typed as it is quoted, which for corn is cents: what a blank currency then saves.
|
|
57
78
|
const contractCurrency = options.ticker && isFuturesTicker(options.ticker)
|
|
58
79
|
&& options.quoteCurrency?.trim().toUpperCase() === US_CENTS ? US_CENTS : undefined;
|
|
80
|
+
// What a blank currency saves, and the currency the portfolio values it in: the rate's units.
|
|
81
|
+
const blankCurrency = options.ticker
|
|
82
|
+
? resolveManualPositionCurrency(undefined, options.ticker, preferredPortfolio, config.baseCurrency, contractCurrency)
|
|
83
|
+
: undefined;
|
|
84
|
+
const portfolioCurrency = resolvePortfolioTotalsCurrency(preferredPortfolio, config.baseCurrency);
|
|
85
|
+
const heldCurrency = (preferredPosition ? futuresLotCurrency(preferredPosition, contractCurrency) : undefined) ?? blankCurrency;
|
|
86
|
+
const costTerms = positionCostTermsPrefill(preferredPosition, portfolioCurrency);
|
|
59
87
|
|
|
60
88
|
const fields: CommandBarWorkflowField[] = [
|
|
61
89
|
...(showPortfolioField ? [{
|
|
@@ -98,9 +126,28 @@ function buildManualPortfolioPositionWorkflow(
|
|
|
98
126
|
type: "text",
|
|
99
127
|
// What a blank field saves: the ticker's own currency before the
|
|
100
128
|
// portfolio's. Without a ticker yet there is nothing true to show.
|
|
101
|
-
placeholder:
|
|
102
|
-
|
|
103
|
-
|
|
129
|
+
placeholder: blankCurrency,
|
|
130
|
+
required: false,
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
id: "dateAcquired",
|
|
134
|
+
label: "Purchase Date",
|
|
135
|
+
type: "text",
|
|
136
|
+
placeholder: DATE_FIELD_EXAMPLES,
|
|
137
|
+
required: false,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: "costFx",
|
|
141
|
+
label: "Cost FX",
|
|
142
|
+
type: "number",
|
|
143
|
+
// What a blank field saves, as `position set` without --cost-fx does.
|
|
144
|
+
placeholder: t("The purchase date's close, else today's rate"),
|
|
145
|
+
// The rate's units, in context: the portfolio's currency per unit of the holding's.
|
|
146
|
+
description: heldCurrency && sameCurrency(heldCurrency, portfolioCurrency)
|
|
147
|
+
? t("Only for a holding in another currency than the portfolio's.")
|
|
148
|
+
: heldCurrency
|
|
149
|
+
? tf("{portfolio} per {holding} when bought.", { portfolio: portfolioCurrency, holding: heldCurrency })
|
|
150
|
+
: tf("{portfolio} per unit of the holding's currency when bought.", { portfolio: portfolioCurrency }),
|
|
104
151
|
required: false,
|
|
105
152
|
},
|
|
106
153
|
];
|
|
@@ -116,6 +163,8 @@ function buildManualPortfolioPositionWorkflow(
|
|
|
116
163
|
: "",
|
|
117
164
|
// A corn lot saved before contract sizes, in dollars, is read in cents: saving the form unchanged keeps it so.
|
|
118
165
|
currency: (preferredPosition ? futuresLotCurrency(preferredPosition, contractCurrency) : undefined) ?? "",
|
|
166
|
+
dateAcquired: costTerms.dateAcquired,
|
|
167
|
+
costFx: costTerms.costFx,
|
|
119
168
|
};
|
|
120
169
|
|
|
121
170
|
return {
|
|
@@ -158,8 +158,9 @@ export async function submitCommandBarWorkflow(options: {
|
|
|
158
158
|
break;
|
|
159
159
|
}
|
|
160
160
|
case "add-portfolio": {
|
|
161
|
-
|
|
162
|
-
|
|
161
|
+
// A purchase date or rate typed without a size is a position to set, whose missing size is then refused.
|
|
162
|
+
const position = ["shares", "dateAcquired", "costFx"].some((id) => coerceFieldString(route.values[id]).trim());
|
|
163
|
+
if (!position) {
|
|
163
164
|
await collectionWorkflowActions.addTickerMembershipFromWorkflow(route.values);
|
|
164
165
|
} else {
|
|
165
166
|
await collectionWorkflowActions.setPortfolioPositionFromWorkflow(route.values);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { indexRootSuggestion } from "../../../tickers/index-roots";
|
|
1
2
|
import type { Dispatch } from "react";
|
|
2
3
|
import type { AppAction, AppState } from "../../../state/app/context";
|
|
3
4
|
import type { AppTickerRepositoryPort } from "../../../core/app-service-ports";
|
|
@@ -203,7 +204,10 @@ export async function resolveTickerInputOrThrow(
|
|
|
203
204
|
): Promise<ResolvedTickerInput> {
|
|
204
205
|
const resolved = await resolveTickerInput(rawInput, activeTicker, collectionId, deps, { ...options, throwUnresolved: true });
|
|
205
206
|
if (!resolved) {
|
|
206
|
-
|
|
207
|
+
const typed = rawInput ?? activeTicker ?? "";
|
|
208
|
+
// A bare index root (VIX) is quoted as ^VIX, which the message offers.
|
|
209
|
+
const suggestion = indexRootSuggestion(typed.trim());
|
|
210
|
+
throw new Error(`No ticker match found for "${typed}".${suggestion ? ` ${suggestion}` : ""}`);
|
|
207
211
|
}
|
|
208
212
|
return resolved;
|
|
209
213
|
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { createElement } from "react";
|
|
1
2
|
import { Box, ImageSurface, Text, TextAttributes, useUiCapabilities } from "../ui";
|
|
2
3
|
import { cloudLogoPath, type CloudLogoKind } from "../api-client/paths";
|
|
3
4
|
import { getCloudApiBaseUrl } from "../api-client/request";
|
|
4
5
|
import { resolveAssetDisplayKind } from "../market-data/market/format";
|
|
5
6
|
import { colors } from "../theme/colors";
|
|
7
|
+
import type { DataTableCell } from "./ui/data-table";
|
|
8
|
+
import { LogoMark, type LogoMarkProps } from "./ui/logo-mark";
|
|
6
9
|
|
|
7
10
|
export function resolveCompanyLogoSrc(input: {
|
|
8
11
|
symbol: string;
|
|
@@ -14,6 +17,42 @@ export function resolveCompanyLogoSrc(input: {
|
|
|
14
17
|
return path ? `${getCloudApiBaseUrl()}${path}` : null;
|
|
15
18
|
}
|
|
16
19
|
|
|
20
|
+
/** What a row's logo stands for: a company's listing or a coin. */
|
|
21
|
+
export interface CompanyLogoSubject {
|
|
22
|
+
symbol: string;
|
|
23
|
+
/** `CRYPTO` draws the coin's logo; any other listing but cash and contracts, the company's. */
|
|
24
|
+
assetCategory?: string;
|
|
25
|
+
/** Its initial stands in while there is no logo; the symbol's without a name. */
|
|
26
|
+
name?: string | null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* A company's or a coin's logo on a `LogoMark` tile, on the desktop and the
|
|
31
|
+
* web: the logo Gloom Cloud serves for its ticker, and its initial on the
|
|
32
|
+
* same tile when there is none, so a missing logo moves nothing.
|
|
33
|
+
*/
|
|
34
|
+
export function CompanyLogoMark({ symbol, assetCategory, name, size }: CompanyLogoSubject & Pick<LogoMarkProps, "size">) {
|
|
35
|
+
return createElement(LogoMark, {
|
|
36
|
+
src: resolveCompanyLogoSrc({ symbol, assetCategory }),
|
|
37
|
+
name: name?.trim() || symbol,
|
|
38
|
+
size,
|
|
39
|
+
plate: true,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The cell that names a company or a coin in a table, led by its logo on the
|
|
45
|
+
* desktop and the web (docs/pane-conventions.md, "Company and coin logos").
|
|
46
|
+
* The terminal gets the cell as it was, and exports read only its text.
|
|
47
|
+
*/
|
|
48
|
+
export function withCompanyLogo(cell: DataTableCell, subject: CompanyLogoSubject | null | undefined, desktop: boolean): DataTableCell {
|
|
49
|
+
if (!desktop || !subject?.symbol) return cell;
|
|
50
|
+
return {
|
|
51
|
+
...cell,
|
|
52
|
+
leading: createElement(CompanyLogoMark, { symbol: subject.symbol, assetCategory: subject.assetCategory, name: subject.name ?? cell.text }),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
17
56
|
export function CompanyLogo({
|
|
18
57
|
symbol,
|
|
19
58
|
assetCategory,
|
|
@@ -12,6 +12,8 @@ import type { DataTableSectionHeader } from "../ui/data-table";
|
|
|
12
12
|
|
|
13
13
|
export interface TableSection<T> {
|
|
14
14
|
label: string;
|
|
15
|
+
/** Tells apart two sections under one label (a month split by today); the label by default. */
|
|
16
|
+
key?: string;
|
|
15
17
|
items: T[];
|
|
16
18
|
/** Kept even with no items, to show the section exists. */
|
|
17
19
|
emptyLabel?: string;
|
|
@@ -32,9 +34,9 @@ export function buildSectionedRows<T>(
|
|
|
32
34
|
return sections.flatMap((section) => {
|
|
33
35
|
if (section.items.length === 0 && !section.emptyLabel) return [];
|
|
34
36
|
return [
|
|
35
|
-
{ kind: "section" as const, key: `section:${section.label}`, label: section.label, count: section.items.length },
|
|
37
|
+
{ kind: "section" as const, key: `section:${section.key ?? section.label}`, label: section.label, count: section.items.length },
|
|
36
38
|
...(section.items.length === 0
|
|
37
|
-
? [{ kind: "empty" as const, key: `empty:${section.label}`, label: section.emptyLabel! }]
|
|
39
|
+
? [{ kind: "empty" as const, key: `empty:${section.key ?? section.label}`, label: section.emptyLabel! }]
|
|
38
40
|
: section.items.map((item) => ({ kind: "item" as const, key: getItemKey(item), item }))),
|
|
39
41
|
];
|
|
40
42
|
});
|
|
@@ -74,7 +74,8 @@ export function ConfirmModalContent({
|
|
|
74
74
|
pendingRef.current = false;
|
|
75
75
|
if (!mountedRef.current) {
|
|
76
76
|
// Closed while it ran: the inline error has nowhere to go.
|
|
77
|
-
|
|
77
|
+
if (confirm.onFailureAfterClose) confirm.onFailureAfterClose(failure);
|
|
78
|
+
else runtime.getDeps().pluginRegistry.notify({ body: errorMessage(failure), type: "error" });
|
|
78
79
|
return;
|
|
79
80
|
}
|
|
80
81
|
setPending(false);
|
|
@@ -24,6 +24,11 @@ export interface ConfirmModalOptions {
|
|
|
24
24
|
* when the confirm was closed before the work finished.
|
|
25
25
|
*/
|
|
26
26
|
onSuccess?: () => void;
|
|
27
|
+
/**
|
|
28
|
+
* Says what `onConfirm` threw once the confirm was closed and cannot say it
|
|
29
|
+
* inline: on the row it concerns, say. A toast when missing.
|
|
30
|
+
*/
|
|
31
|
+
onFailureAfterClose?: (failure: unknown) => void;
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
/**
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
getFocusedTickerSymbol,
|
|
8
8
|
type AppState,
|
|
9
9
|
} from "../../state/app/context";
|
|
10
|
+
import { commandPromptTicker } from "../../layout/selected-ticker";
|
|
10
11
|
import type { CommandDef, PaneTemplateCreateOptions } from "../../types/plugin";
|
|
11
12
|
import type { TickerRecord } from "../../types/ticker";
|
|
12
13
|
import { buildPaneTemplateWorkflowRoute } from "../command-bar/pane-templates/workflow-route";
|
|
@@ -142,8 +143,10 @@ export function buildPaneTemplateFormRoute(
|
|
|
142
143
|
): FormRouteResult {
|
|
143
144
|
const template = pluginRegistry.paneTemplates.get(templateId);
|
|
144
145
|
if (!template) return { kind: "none" };
|
|
146
|
+
const requiresTicker = (template.shortcut?.argPlaceholder === "ticker" || template.shortcut?.argKind === "ticker")
|
|
147
|
+
&& !template.shortcut?.argOptional;
|
|
145
148
|
const route = buildPaneTemplateWorkflowRoute({
|
|
146
|
-
activeTicker: getFocusedTickerSymbol(state),
|
|
149
|
+
activeTicker: (requiresTicker ? commandPromptTicker(state)?.symbol : null) ?? getFocusedTickerSymbol(state),
|
|
147
150
|
arg,
|
|
148
151
|
template,
|
|
149
152
|
});
|
package/src/components/index.ts
CHANGED
|
@@ -12,11 +12,11 @@ export { CompositeChart, pricePointsToResolvedSeries } from "./chart/composite";
|
|
|
12
12
|
// Figures, then a chart, then a table: the header zone, its size rule at every
|
|
13
13
|
// pane size, and the selection the chart and the table share.
|
|
14
14
|
export {
|
|
15
|
-
ChartStrip, ChartTableHeader, chartTableChromeRows, chartTableLayout, formatBpAxis, formatPercentAxis,
|
|
16
|
-
spanAxisFormatter, spanDigits, useChartTableLayout, useChartTableSelection,
|
|
15
|
+
ChartRead, ChartStrip, ChartTableHeader, chartTableChromeRows, chartTableLayout, formatBpAxis, formatPercentAxis,
|
|
16
|
+
spanAxisFormatter, spanDigits, useChartReadRows, useChartTableLayout, useChartTableSelection,
|
|
17
17
|
} from "./chart-table";
|
|
18
18
|
export type {
|
|
19
|
-
ChartBandMode, ChartStripSpec, ChartTableChart, ChartTableHeaderProps, ChartTableLayout,
|
|
19
|
+
ChartBandMode, ChartReadProps, ChartStripSpec, ChartTableChart, ChartTableHeaderProps, ChartTableLayout,
|
|
20
20
|
ChartTableSelection,
|
|
21
21
|
} from "./chart-table";
|
|
22
22
|
export { scalarPoint, stackedSeries, staticSeries, type StackedLayer } from "./chart/static/series";
|
|
@@ -87,6 +87,11 @@ export { DataTableStackView } from "./data-table/stack-view";
|
|
|
87
87
|
// table re-render on selection or scroll does not redo all of it.
|
|
88
88
|
export { createRowValueCache } from "./ui/row-value-cache";
|
|
89
89
|
export type { RowValueCache } from "./ui/row-value-cache";
|
|
90
|
+
// What the last action on one row came to, kept for that row until the next
|
|
91
|
+
// action on it or until its own status moves on (docs/pane-conventions.md,
|
|
92
|
+
// "Row messages"): its status cell says it, never the footer or a toast.
|
|
93
|
+
export { useRowNotes } from "./ui/row-notes";
|
|
94
|
+
export type { RowNotes } from "./ui/row-notes";
|
|
90
95
|
export { FeedDataTableStackView } from "./feed-data-table/stack-view";
|
|
91
96
|
export type { FeedDataTableItem } from "./feed-data-table/stack-view";
|
|
92
97
|
export { activeStackIndex, sortStackItems } from "./feed-stack-controller";
|
|
@@ -128,7 +133,8 @@ export { MarkdownText } from "./markdown-text";
|
|
|
128
133
|
// this file is the public `gloomberb/components` surface: a kit component
|
|
129
134
|
// reaches plugins only once it is added here.
|
|
130
135
|
export {
|
|
131
|
-
ActionRow, Badge, BulletList, Button, ButtonActionScope, Card, Checkbox, ChoiceDialog, ColumnGrid, ColumnGridPair, ConfirmDialog, confirmDialog,
|
|
136
|
+
ActionRow, Badge, BulletList, Button, ButtonActionScope, Card, Checkbox, ChoiceDialog, ColumnGrid, ColumnGridPair, ConfirmDialog, confirmDialog,
|
|
137
|
+
COUNTRY_FLAG_CELLS, CountryFlag, CountryFlagLead, DataTable,
|
|
132
138
|
DetailScrollBody, DialogFrame, DisclosureMarker, Divider, EmptyState, ExternalLink, ExternalLinkText, FieldGrid, FieldLabel,
|
|
133
139
|
fieldFrameStyle, fieldGridColumns, FRAMED_TEXTAREA_DESKTOP_STYLE, fieldGridRows, FigureList, getMessageComposerBlockHeight, GridFieldView, Icon, ICON_GLYPHS,
|
|
134
140
|
IconButton, InlineQuickAddRow, KeyValueRow, ListView, loadingText, Menu, MenuPopover,
|
|
@@ -136,11 +142,11 @@ export {
|
|
|
136
142
|
NumberPromptDialog, openUrl, PageStackView, PaneLinkMenu, PaneStatusBody, Popover, Prose,
|
|
137
143
|
QueryBar, RangeTrack, RatioBar, READING_WIDTH, RemoteImage, Section, SectionHeading, SegmentedControl, SelectButton, ShortcutHint,
|
|
138
144
|
Spinner, StatGrid, statGridColumns, statGridRows, Tabs, TextField, TextPromptDialog, unavailableText,
|
|
139
|
-
useFieldRing, usePaneLinkMenuEntry, useQueryBarSearch,
|
|
145
|
+
useFieldRing, usePaneLinkMenuEntry, useQueryBarSearch, withCountryFlag, withFlagRoom,
|
|
140
146
|
} from "./ui";
|
|
141
147
|
export type {
|
|
142
148
|
ActionRowProps, BadgeProps, BulletListProps, ButtonProps, ButtonVariant, CardProps, CheckboxProps, ChoiceDialogChoice, ColumnGridCell,
|
|
143
|
-
ColumnGridColumn, ColumnGridPairProps, ColumnGridProps, ConfirmDialogOptions,
|
|
149
|
+
ColumnGridColumn, ColumnGridLink, ColumnGridPairProps, ColumnGridProps, ConfirmDialogOptions, CountryFlagProps,
|
|
144
150
|
DataTableCell, DataTableColumn, DataTableProps, DataTableVisibleRange, DetailScrollBodyProps, DialogFrameProps,
|
|
145
151
|
DisclosureMarkerProps, DividerProps, EmptyStateProps, FieldGridProps, FieldLabelProps, FieldRing, FieldRingOptions,
|
|
146
152
|
FigureListItem, FigureListProps, GridField,
|
|
@@ -412,7 +412,7 @@ function resolveUpdateStatusView({
|
|
|
412
412
|
if (updateAvailable.updateAction.kind === "managed") {
|
|
413
413
|
return {
|
|
414
414
|
kind: "text",
|
|
415
|
-
text: tf("v{version} available, update through the package manager that installed
|
|
415
|
+
text: tf("v{version} available, update through the package manager that installed Gloom", {
|
|
416
416
|
version: updateAvailable.version,
|
|
417
417
|
}),
|
|
418
418
|
};
|
|
@@ -780,7 +780,7 @@ function HeaderMarketSummary({ nativePaneChrome, width }: { nativePaneChrome: bo
|
|
|
780
780
|
const summary = useMarketSummary();
|
|
781
781
|
const fit = resolveMarketSummaryFit({
|
|
782
782
|
available: width,
|
|
783
|
-
baseCurrencyWidth: summary.
|
|
783
|
+
baseCurrencyWidth: displayWidth(summary.baseCurrencyLabel) + 1,
|
|
784
784
|
countdownWidth: summary.marketLabel.length - summary.marketLabelShort.length,
|
|
785
785
|
spyWidth: summary.spyText.length + 1,
|
|
786
786
|
stateWidth: summary.marketLabelShort ? summary.marketLabelShort.length + 1 : 0,
|
|
@@ -790,20 +790,20 @@ function HeaderMarketSummary({ nativePaneChrome, width }: { nativePaneChrome: bo
|
|
|
790
790
|
return (
|
|
791
791
|
<>
|
|
792
792
|
{fit.showState && marketLabel ? (
|
|
793
|
-
<Box paddingRight={1} flexShrink={0}>
|
|
793
|
+
<Box paddingRight={1} flexShrink={0} data-gloom-role="header-market">
|
|
794
794
|
<Text fg={summary.marketColor} {...(nativePaneChrome ? { attributes: TextAttributes.BOLD } : {})}>
|
|
795
795
|
{marketLabel}
|
|
796
796
|
</Text>
|
|
797
797
|
</Box>
|
|
798
798
|
) : null}
|
|
799
799
|
{fit.showSpy ? (
|
|
800
|
-
<Box paddingRight={1} flexShrink={0}>
|
|
800
|
+
<Box paddingRight={1} flexShrink={0} data-gloom-role="header-market">
|
|
801
801
|
<Text fg={summary.spyColor}>{summary.spyText}</Text>
|
|
802
802
|
</Box>
|
|
803
803
|
) : null}
|
|
804
804
|
{fit.showBaseCurrency ? (
|
|
805
805
|
<Box paddingRight={1} flexShrink={0}>
|
|
806
|
-
<Text fg={nativePaneChrome ? colors.textDim : blendHex(colors.headerText, colors.header, 0.42)}>{summary.
|
|
806
|
+
<Text fg={nativePaneChrome ? colors.textDim : blendHex(colors.headerText, colors.header, 0.42)}>{summary.baseCurrencyLabel}</Text>
|
|
807
807
|
</Box>
|
|
808
808
|
) : null}
|
|
809
809
|
</>
|
|
@@ -845,15 +845,16 @@ export function Header({
|
|
|
845
845
|
const { nativePaneChrome = false, titleBarOverlay, nativeWindowChrome = titleBarOverlay, windowControls } = useUiCapabilities();
|
|
846
846
|
const showWindowControls = nativeWindowChrome && windowControls === "windows";
|
|
847
847
|
const windowFullscreen = useWindowFullscreen();
|
|
848
|
+
const updateStatus = useUpdateStatus(!!onRestartForUpdate);
|
|
848
849
|
const prompt = resolveHeaderPromptGeometry({
|
|
849
850
|
nativePaneChrome,
|
|
850
851
|
nativeWindowChrome,
|
|
851
852
|
termWidth,
|
|
852
853
|
titleBarOverlay,
|
|
853
854
|
windowFullscreen,
|
|
855
|
+
allowMarketExpansion: !updateStatus.view,
|
|
854
856
|
});
|
|
855
857
|
const shortcutLabel = useCommandBarShortcut();
|
|
856
|
-
const updateStatus = useUpdateStatus(!!onRestartForUpdate);
|
|
857
858
|
// The terminal lays the header out by cell counts, so it works out what is left
|
|
858
859
|
// for the update status once the Help pill and the slot's padding are paid for.
|
|
859
860
|
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
|
*/
|
|
@@ -38,7 +38,7 @@ export interface PaneFooterSegment {
|
|
|
38
38
|
asOf?: boolean;
|
|
39
39
|
/**
|
|
40
40
|
* The segment only says how current the pane's quotes are (`2026-10-09 ·
|
|
41
|
-
* 15m delayed`), which a `
|
|
41
|
+
* 15m delayed`), which a `gloom shot` status line says too: a shot whose
|
|
42
42
|
* line states its data's date and delay leaves it out.
|
|
43
43
|
*/
|
|
44
44
|
quoteStatus?: boolean;
|
|
@@ -165,7 +165,12 @@ export interface CombinedPaneFooter {
|
|
|
165
165
|
|
|
166
166
|
export const EMPTY_FOOTER: CombinedPaneFooter = { info: [], hints: [], menu: [], keys: [] };
|
|
167
167
|
|
|
168
|
-
/**
|
|
168
|
+
/**
|
|
169
|
+
* Status the hints leave room for, more when it is a warning: a failure must
|
|
170
|
+
* stay readable. A status no longer than the warning's room is kept whole,
|
|
171
|
+
* with the hints that no longer fit under More, so a status word is never cut
|
|
172
|
+
* against them ("Cloud sync d [a]dd event"); a longer one gives way to the hints.
|
|
173
|
+
*/
|
|
169
174
|
const INFO_FLOOR_CHARS = 10;
|
|
170
175
|
const WARNING_FLOOR_CHARS = 24;
|
|
171
176
|
const HINT_GAP = 1;
|
|
@@ -264,9 +269,10 @@ export function layoutPaneFooterHintRow(
|
|
|
264
269
|
const width = Math.max(0, Math.floor(contentWidth));
|
|
265
270
|
const hints = footer.hints.filter((hint) => !hint.disabled);
|
|
266
271
|
const warning = footer.info.some((segment) => segment.parts.some((part) => part.tone === "warning" || part.tone === "negative"));
|
|
267
|
-
const
|
|
268
|
-
|
|
269
|
-
:
|
|
272
|
+
const infoChars = infoTextWidth(footer.info);
|
|
273
|
+
const textFloor = footer.info.length === 0 ? 0
|
|
274
|
+
: warning || infoChars <= WARNING_FLOOR_CHARS ? Math.min(WARNING_FLOOR_CHARS, infoChars)
|
|
275
|
+
: INFO_FLOOR_CHARS;
|
|
270
276
|
const infoFloor = Math.min(width, Math.max(iconReserve, textFloor));
|
|
271
277
|
const hintBudget = Math.max(0, width - infoFloor - (infoFloor > 0 && hints.length > 0 ? 1 : 0));
|
|
272
278
|
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
|
</>
|