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
|
@@ -142,6 +142,38 @@ const HK_PETALS = Array.from({ length: 5 }, (_, index) => (
|
|
|
142
142
|
|
|
143
143
|
const MY_STRIPES = [1, 3, 5].map((index) => `M0,${(index * FLAG_HEIGHT) / 7}h${FLAG_WIDTH}v${FLAG_HEIGHT / 7}h-${FLAG_WIDTH}z`).join("");
|
|
144
144
|
|
|
145
|
+
/** A serrated white hoist of `teeth` points, from `base` to `tip` across, as Bahrain's. */
|
|
146
|
+
function serration(teeth: number, base: number, tip: number): string {
|
|
147
|
+
const step = FLAG_HEIGHT / teeth;
|
|
148
|
+
return `M0,0H${base}${Array.from({ length: teeth }, (_, index) => `L${tip},${(index * step + step / 2).toFixed(2)}L${base},${((index + 1) * step).toFixed(2)}`).join("")}H0Z`;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Quarters of a field, top left, top right, bottom left, bottom right. */
|
|
152
|
+
function Quarters({ fills }: { fills: readonly [string, string, string, string] }) {
|
|
153
|
+
const w = FLAG_WIDTH / 2;
|
|
154
|
+
const h = FLAG_HEIGHT / 2;
|
|
155
|
+
return (
|
|
156
|
+
<>
|
|
157
|
+
{fills.map((fill, index) => (
|
|
158
|
+
<rect key={index} x={(index % 2) * w} y={Math.floor(index / 2) * h} width={w + 0.02} height={h + 0.02} fill={fill} />
|
|
159
|
+
))}
|
|
160
|
+
</>
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const GR_STRIPES = [1, 3, 5, 7].map((index) => `M0,${(index * FLAG_HEIGHT) / 9}h${FLAG_WIDTH}v${FLAG_HEIGHT / 9}h-${FLAG_WIDTH}z`).join("");
|
|
165
|
+
const VE_STARS = Array.from({ length: 8 }, (_, index) => {
|
|
166
|
+
const angle = Math.PI * (0.18 + (index * 0.64) / 7);
|
|
167
|
+
return star(15 - 5.2 * Math.cos(angle), 12.4 - 5.2 * Math.sin(angle), 0.9);
|
|
168
|
+
}).join("");
|
|
169
|
+
const HN_STARS = [[15, 10], [10.6, 8.2], [10.6, 11.8], [19.4, 8.2], [19.4, 11.8]].map(([cx, cy]) => star(cx!, cy!, 1.25)).join("");
|
|
170
|
+
/** Morocco's seal: a pentagram drawn as five interlaced lines, one point up. */
|
|
171
|
+
const MA_PENTAGRAM = `M${[0, 2, 4, 1, 3].map((index) => {
|
|
172
|
+
const angle = (Math.PI * 2 * index) / 5 - Math.PI / 2;
|
|
173
|
+
return `${(15 + 4.4 * Math.cos(angle)).toFixed(2)},${(10.3 + 4.4 * Math.sin(angle)).toFixed(2)}`;
|
|
174
|
+
}).join("L")}Z`;
|
|
175
|
+
const UZ_STARS = [[9.6, 1.6], [11.6, 1.6], [13.6, 1.6], [11.6, 3.4], [13.6, 3.4], [13.6, 5.2]].map(([cx, cy]) => star(cx!, cy!, 0.62)).join("");
|
|
176
|
+
|
|
145
177
|
/**
|
|
146
178
|
* Hand-drawn at the size they are shown, the way a table shows them: a little
|
|
147
179
|
* simpler than the real thing (7 stripes, a ring of dots) so each stays
|
|
@@ -446,4 +478,152 @@ export const FLAG_ART: Record<string, ReactNode> = {
|
|
|
446
478
|
<path d={sunRays(15, 10, 2.6, 3.9, 16)} stroke="#f6b40e" strokeWidth=".7" />
|
|
447
479
|
</>
|
|
448
480
|
),
|
|
481
|
+
|
|
482
|
+
// The euro area's members, for the calendars and boards that name them.
|
|
483
|
+
DE: <Bands colors={[BLACK, "#dd0000", "#ffce00"]} />,
|
|
484
|
+
FR: <Bands colors={["#002395", WHITE, "#ed2939"]} vertical />,
|
|
485
|
+
IT: <Bands colors={["#009246", WHITE, "#ce2b37"]} vertical />,
|
|
486
|
+
ES: <Bands colors={["#aa151b", "#f1bf00", "#aa151b"]} weights={[1, 2, 1]} />,
|
|
487
|
+
NL: <Bands colors={["#ae1c28", WHITE, "#21468b"]} />,
|
|
488
|
+
BE: <Bands colors={[BLACK, "#fdda24", "#ef3340"]} vertical />,
|
|
489
|
+
AT: <Bands colors={["#c8102e", WHITE, "#c8102e"]} />,
|
|
490
|
+
IE: <Bands colors={["#169b62", WHITE, "#ff883e"]} vertical />,
|
|
491
|
+
PT: (
|
|
492
|
+
<>
|
|
493
|
+
<Bands colors={["#006600", "#ff0000"]} weights={[2, 3]} vertical />
|
|
494
|
+
<circle cx="12" cy="10" r="3.6" fill="none" stroke={GOLD} strokeWidth="1.3" />
|
|
495
|
+
<path d="M10.6,8.2h2.8v2.6c0,1-.6,1.6-1.4,1.9c-.8-.3-1.4-.9-1.4-1.9z" fill={WHITE} stroke="#ff0000" strokeWidth=".5" />
|
|
496
|
+
</>
|
|
497
|
+
),
|
|
498
|
+
FI: (
|
|
499
|
+
<>
|
|
500
|
+
<Field fill={WHITE} />
|
|
501
|
+
<NordicCross x={8.4} thickness={5} fill="#002f6c" />
|
|
502
|
+
</>
|
|
503
|
+
),
|
|
504
|
+
GR: (
|
|
505
|
+
<>
|
|
506
|
+
<Field fill={WHITE} />
|
|
507
|
+
<path d={GR_STRIPES} fill="#0d5eaf" />
|
|
508
|
+
<rect width="11.1" height="11.1" fill="#0d5eaf" />
|
|
509
|
+
<path d="M4.44,0h2.22v11.1h-2.22zM0,4.44h11.1v2.22h-11.1z" fill={WHITE} />
|
|
510
|
+
</>
|
|
511
|
+
),
|
|
512
|
+
LU: <Bands colors={["#ed2939", WHITE, "#00a1de"]} />,
|
|
513
|
+
EE: <Bands colors={["#0072ce", BLACK, WHITE]} />,
|
|
514
|
+
LV: <Bands colors={["#9e3039", WHITE, "#9e3039"]} weights={[2, 1, 2]} />,
|
|
515
|
+
LT: <Bands colors={["#fdb913", "#006a44", "#c1272d"]} />,
|
|
516
|
+
|
|
517
|
+
// The rest of Europe that boards and calendars show.
|
|
518
|
+
IS: (
|
|
519
|
+
<>
|
|
520
|
+
<Field fill="#02529c" />
|
|
521
|
+
<NordicCross x={8} thickness={4.6} fill={WHITE} />
|
|
522
|
+
<NordicCross x={9.1} thickness={2.4} fill="#dc1e35" />
|
|
523
|
+
</>
|
|
524
|
+
),
|
|
525
|
+
BG: <Bands colors={[WHITE, "#00966e", "#d62612"]} />,
|
|
526
|
+
RU: <Bands colors={[WHITE, "#0039a6", "#d52b1e"]} />,
|
|
527
|
+
|
|
528
|
+
// Sovereign credit, oil and crop producers.
|
|
529
|
+
BH: (
|
|
530
|
+
<>
|
|
531
|
+
<Field fill="#ce1126" />
|
|
532
|
+
<path d={serration(5, 7.5, 11)} fill={WHITE} />
|
|
533
|
+
</>
|
|
534
|
+
),
|
|
535
|
+
KW: (
|
|
536
|
+
<>
|
|
537
|
+
<Bands colors={["#007a3d", WHITE, "#ce1126"]} />
|
|
538
|
+
<path d="M0,0L7.5,6.67V13.33L0,20Z" fill={BLACK} />
|
|
539
|
+
</>
|
|
540
|
+
),
|
|
541
|
+
IR: (
|
|
542
|
+
<>
|
|
543
|
+
<Bands colors={["#239f40", WHITE, "#da0000"]} />
|
|
544
|
+
<path d="M15,7.9V12.1M13.3,8.4C12.4,9.6 12.6,11.3 14,12M16.7,8.4C17.6,9.6 17.4,11.3 16,12" fill="none" stroke="#da0000" strokeWidth=".7" />
|
|
545
|
+
</>
|
|
546
|
+
),
|
|
547
|
+
IQ: (
|
|
548
|
+
<>
|
|
549
|
+
<Bands colors={["#ce1126", WHITE, BLACK]} />
|
|
550
|
+
<path d="M11.2,8.6v2.6h1.8M14.1,8.6v2.6M15.6,11.2h1.4v-2.6M18.4,8.6v2.6" fill="none" stroke="#007a3d" strokeWidth=".75" />
|
|
551
|
+
</>
|
|
552
|
+
),
|
|
553
|
+
CI: <Bands colors={["#f77f00", WHITE, "#009e60"]} vertical />,
|
|
554
|
+
DO: (
|
|
555
|
+
<>
|
|
556
|
+
<Quarters fills={["#002d62", "#ce1126", "#ce1126", "#002d62"]} />
|
|
557
|
+
<path d="M15,0V20M0,10H30" stroke={WHITE} strokeWidth="3.6" />
|
|
558
|
+
</>
|
|
559
|
+
),
|
|
560
|
+
PA: (
|
|
561
|
+
<>
|
|
562
|
+
<Quarters fills={[WHITE, "#da121a", "#072357", WHITE]} />
|
|
563
|
+
<path d={star(7.5, 5, 2.3)} fill="#072357" />
|
|
564
|
+
<path d={star(22.5, 15, 2.3)} fill="#da121a" />
|
|
565
|
+
</>
|
|
566
|
+
),
|
|
567
|
+
VE: (
|
|
568
|
+
<>
|
|
569
|
+
<Bands colors={["#ffcc00", "#00247d", "#cf142b"]} />
|
|
570
|
+
<path d={VE_STARS} fill={WHITE} />
|
|
571
|
+
</>
|
|
572
|
+
),
|
|
573
|
+
BO: <Bands colors={["#d52b1e", "#f9e300", "#007934"]} />,
|
|
574
|
+
PY: (
|
|
575
|
+
<>
|
|
576
|
+
<Bands colors={["#d52b1e", WHITE, "#0038a8"]} />
|
|
577
|
+
<circle cx="15" cy="10" r="2.3" fill={WHITE} stroke="#0038a8" strokeWidth=".6" />
|
|
578
|
+
<path d={star(15, 10, 1.2)} fill="#f6b40e" />
|
|
579
|
+
</>
|
|
580
|
+
),
|
|
581
|
+
HN: (
|
|
582
|
+
<>
|
|
583
|
+
<Bands colors={["#0073cf", WHITE, "#0073cf"]} />
|
|
584
|
+
<path d={HN_STARS} fill="#0073cf" />
|
|
585
|
+
</>
|
|
586
|
+
),
|
|
587
|
+
BJ: (
|
|
588
|
+
<>
|
|
589
|
+
<Bands colors={["#fcd116", "#e8112d"]} />
|
|
590
|
+
<rect width="12" height={FLAG_HEIGHT} fill="#008751" />
|
|
591
|
+
</>
|
|
592
|
+
),
|
|
593
|
+
ET: (
|
|
594
|
+
<>
|
|
595
|
+
<Bands colors={["#078930", "#fcdd09", "#da121a"]} />
|
|
596
|
+
<circle cx="15" cy="10" r="4.6" fill="#0f47af" />
|
|
597
|
+
<path d={star(15, 10, 3.4, 5, 1.3)} fill="none" stroke="#fcdd09" strokeWidth=".7" />
|
|
598
|
+
</>
|
|
599
|
+
),
|
|
600
|
+
UG: (
|
|
601
|
+
<>
|
|
602
|
+
<Bands colors={[BLACK, "#fcdc04", "#d90000", BLACK, "#fcdc04", "#d90000"]} />
|
|
603
|
+
<circle cx="15" cy="10" r="3.8" fill={WHITE} />
|
|
604
|
+
<path d="M14.2,8.2c.9-.8 2.1-.4 2.2.7l-.6.6v2.8h-.8v-2.4c-.6.1-1.2-.2-1.4-.7z" fill={BLACK} />
|
|
605
|
+
</>
|
|
606
|
+
),
|
|
607
|
+
UZ: (
|
|
608
|
+
<>
|
|
609
|
+
<Bands colors={["#0099b5", "#ce1126", WHITE, "#ce1126", "#1eb53a"]} weights={[6.4, 0.4, 6.4, 0.4, 6.4]} />
|
|
610
|
+
<Crescent cx={5} cy={3.3} r={2.3} bite={2} shift={0.9} fill={WHITE} back="#0099b5" />
|
|
611
|
+
<path d={UZ_STARS} fill={WHITE} />
|
|
612
|
+
</>
|
|
613
|
+
),
|
|
614
|
+
TN: (
|
|
615
|
+
<>
|
|
616
|
+
<Field fill="#e70013" />
|
|
617
|
+
<circle cx="15" cy="10" r="5" fill={WHITE} />
|
|
618
|
+
<Crescent cx={14.4} cy={10} r={3.75} bite={3} shift={0.95} fill="#e70013" back={WHITE} />
|
|
619
|
+
<path d={star(16, 10, 1.9, 5, undefined, 90)} fill="#e70013" />
|
|
620
|
+
</>
|
|
621
|
+
),
|
|
622
|
+
MA: (
|
|
623
|
+
<>
|
|
624
|
+
<Field fill="#c1272d" />
|
|
625
|
+
<path d={MA_PENTAGRAM} fill="none" stroke="#006233" strokeWidth=".75" strokeLinejoin="round" />
|
|
626
|
+
</>
|
|
627
|
+
),
|
|
628
|
+
CR: <Bands colors={["#002b7f", WHITE, "#ce1126", WHITE, "#002b7f"]} weights={[1, 1, 2, 1, 1]} />,
|
|
449
629
|
};
|
|
@@ -1,20 +1,38 @@
|
|
|
1
|
+
import { createElement, type CSSProperties } from "react";
|
|
1
2
|
import { useUiCapabilities } from "../../ui";
|
|
3
|
+
import type { DataTableCell } from "./data-table";
|
|
2
4
|
import { FLAG_ART, FLAG_HEIGHT, FLAG_WIDTH } from "./country-flag-art";
|
|
3
5
|
|
|
4
6
|
export interface CountryFlagProps {
|
|
5
7
|
/** ISO 3166 region, or `EU` for the euro area. Anything not drawn renders nothing. */
|
|
6
|
-
region: string;
|
|
8
|
+
region: string | null | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Keep the flag's room, blank, for a region with no art: a column of
|
|
11
|
+
* countries keeps its text in line whether or not each row has a flag.
|
|
12
|
+
*/
|
|
13
|
+
reserve?: boolean;
|
|
7
14
|
}
|
|
8
15
|
|
|
16
|
+
const FLAG_STYLE = {
|
|
17
|
+
display: "block",
|
|
18
|
+
flex: "none",
|
|
19
|
+
width: "calc(var(--cell-w, 8px) * 2.25)",
|
|
20
|
+
height: "calc(var(--cell-w, 8px) * 1.5)",
|
|
21
|
+
} as const;
|
|
22
|
+
|
|
9
23
|
/**
|
|
10
24
|
* A small flag, 2.25 grid cells wide, for the desktop and the web. Decoration
|
|
11
25
|
* only: it is hidden from assistive technology, so the label beside it stays
|
|
12
26
|
* the name. The terminal draws nothing.
|
|
13
27
|
*/
|
|
14
|
-
export function CountryFlag({ region }: CountryFlagProps) {
|
|
28
|
+
export function CountryFlag({ region, reserve = false }: CountryFlagProps) {
|
|
15
29
|
const desktop = useUiCapabilities().nativePaneChrome === true;
|
|
16
|
-
|
|
17
|
-
|
|
30
|
+
return desktop ? flagArt(region, reserve, FLAG_STYLE) : null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function flagArt(region: string | null | undefined, reserve: boolean, style: CSSProperties) {
|
|
34
|
+
const art = region ? FLAG_ART[region] : undefined;
|
|
35
|
+
if (!art) return reserve ? <svg aria-hidden="true" focusable="false" data-gloom-role="country-flag-room" style={style} /> : null;
|
|
18
36
|
return (
|
|
19
37
|
<svg
|
|
20
38
|
viewBox={`0 0 ${FLAG_WIDTH} ${FLAG_HEIGHT}`}
|
|
@@ -22,14 +40,7 @@ export function CountryFlag({ region }: CountryFlagProps) {
|
|
|
22
40
|
focusable="false"
|
|
23
41
|
data-gloom-role="country-flag"
|
|
24
42
|
data-region={region}
|
|
25
|
-
style={{
|
|
26
|
-
display: "block",
|
|
27
|
-
flex: "none",
|
|
28
|
-
width: "calc(var(--cell-w, 8px) * 2.25)",
|
|
29
|
-
height: "calc(var(--cell-w, 8px) * 1.5)",
|
|
30
|
-
borderRadius: 2,
|
|
31
|
-
overflow: "hidden",
|
|
32
|
-
}}
|
|
43
|
+
style={{ ...style, borderRadius: 2, overflow: "hidden" }}
|
|
33
44
|
>
|
|
34
45
|
{art}
|
|
35
46
|
<rect
|
|
@@ -39,3 +50,98 @@ export function CountryFlag({ region }: CountryFlagProps) {
|
|
|
39
50
|
</svg>
|
|
40
51
|
);
|
|
41
52
|
}
|
|
53
|
+
|
|
54
|
+
/** A table cell's flag sits this far from its text; a flag before any other label keeps the same gap. */
|
|
55
|
+
const LEAD_STYLE = { ...FLAG_STYLE, marginRight: "var(--gloom-space-xs)" } as const;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* The flag of the country `value` names, before a label outside a table: a
|
|
59
|
+
* field's value, a bar's label, a heading. It keeps the gap a table cell's
|
|
60
|
+
* flag has. `reserve` keeps the room, blank, for a value with no flag, so a
|
|
61
|
+
* list's labels stay in line. The terminal draws nothing.
|
|
62
|
+
*/
|
|
63
|
+
export function CountryFlagLead({ value, reserve = false }: { value: string | null | undefined; reserve?: boolean }) {
|
|
64
|
+
const desktop = useUiCapabilities().nativePaneChrome === true;
|
|
65
|
+
return desktop ? flagArt(flagRegion(value), reserve, LEAD_STYLE) : null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The cells a flag and the gap after it take at the start of a table cell. A
|
|
70
|
+
* column sized for its text widens by this on the desktop, where the flag is
|
|
71
|
+
* drawn, so the text keeps its room.
|
|
72
|
+
*/
|
|
73
|
+
export const COUNTRY_FLAG_CELLS = 3;
|
|
74
|
+
|
|
75
|
+
/** A column of countries, widened on the desktop by the flag that leads each. */
|
|
76
|
+
export function withFlagRoom<C extends { width: number }>(column: C, desktop: boolean): C {
|
|
77
|
+
return desktop ? { ...column, width: column.width + COUNTRY_FLAG_CELLS } : column;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** The euro area, as sources write it. */
|
|
81
|
+
const EURO_AREA = new Set(["EU", "EA", "EMU", "EZ", "EUR", "EUROZONE", "EURO AREA", "EURO ZONE", "EUROPEAN UNION"]);
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* What sources call a country when it is not its English name: alpha-3
|
|
85
|
+
* codes, short and old names. Only regions with a flag are listed.
|
|
86
|
+
*/
|
|
87
|
+
const REGION_ALIASES: Readonly<Record<string, string>> = {
|
|
88
|
+
UK: "GB", GBR: "GB", "GREAT BRITAIN": "GB", BRITAIN: "GB", ENGLAND: "GB",
|
|
89
|
+
USA: "US", "U.S.": "US", "UNITED STATES OF AMERICA": "US",
|
|
90
|
+
JPN: "JP", CHE: "CH", CAN: "CA", AUS: "AU", NZL: "NZ", SWE: "SE", NOR: "NO", DNK: "DK", HKG: "HK", SGP: "SG",
|
|
91
|
+
CHN: "CN", "MAINLAND CHINA": "CN", "CHINA (MAINLAND)": "CN", "PEOPLE'S REPUBLIC OF CHINA": "CN",
|
|
92
|
+
KOR: "KR", KOREA: "KR", "REPUBLIC OF KOREA": "KR", "KOREA, SOUTH": "KR", "KOREA, REPUBLIC OF": "KR",
|
|
93
|
+
TWN: "TW", "TAIWAN, CHINA": "TW", IND: "IN", IDN: "ID", MYS: "MY", PHL: "PH", THA: "TH", VNM: "VN", "VIET NAM": "VN", PAK: "PK",
|
|
94
|
+
POL: "PL", CZE: "CZ", "CZECH REPUBLIC": "CZ", HUN: "HU", ROU: "RO", UKR: "UA", TUR: "TR", TURKEY: "TR", "TÜRKIYE": "TR", TURKIYE: "TR",
|
|
95
|
+
KAZ: "KZ", ISR: "IL", SAU: "SA", ARE: "AE", UAE: "AE", QAT: "QA", EGY: "EG", ZAF: "ZA", NGA: "NG", KEN: "KE",
|
|
96
|
+
MEX: "MX", BRA: "BR", COL: "CO", CHL: "CL", PER: "PE", ARG: "AR",
|
|
97
|
+
DEU: "DE", FRA: "FR", ITA: "IT", ESP: "ES", NLD: "NL", HOLLAND: "NL", "THE NETHERLANDS": "NL", BEL: "BE", AUT: "AT", IRL: "IE",
|
|
98
|
+
PRT: "PT", FIN: "FI", GRC: "GR", LUX: "LU", ISL: "IS", EST: "EE", LVA: "LV", LTU: "LT", BGR: "BG",
|
|
99
|
+
RUS: "RU", "RUSSIAN FEDERATION": "RU", BHR: "BH", CIV: "CI", "IVORY COAST": "CI", "COTE D'IVOIRE": "CI", "CÔTE D'IVOIRE": "CI",
|
|
100
|
+
"HONG KONG": "HK", "HONG KONG SAR": "HK", DOM: "DO", PAN: "PA", KWT: "KW", IRN: "IR", IRAN: "IR", "IRAN, ISLAMIC REPUBLIC OF": "IR", IRQ: "IQ", VEN: "VE", VENEZUELA: "VE",
|
|
101
|
+
BEN: "BJ", BOL: "BO", BOLIVIA: "BO", ETH: "ET", HND: "HN", PRY: "PY", UGA: "UG", UZB: "UZ",
|
|
102
|
+
TUN: "TN", MAR: "MA", CRI: "CR",
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
let regionCodes: Map<string, string> | null = null;
|
|
106
|
+
|
|
107
|
+
/** English names of every region with a flag, from the runtime's region names. */
|
|
108
|
+
function namedRegions(): Map<string, string> {
|
|
109
|
+
if (regionCodes) return regionCodes;
|
|
110
|
+
regionCodes = new Map();
|
|
111
|
+
try {
|
|
112
|
+
const names = new Intl.DisplayNames(["en"], { type: "region", fallback: "none" });
|
|
113
|
+
for (const code of Object.keys(FLAG_ART)) {
|
|
114
|
+
const name = names.of(code);
|
|
115
|
+
if (name) regionCodes.set(name.toUpperCase().replaceAll("’", "'"), code);
|
|
116
|
+
}
|
|
117
|
+
} catch {
|
|
118
|
+
// Intentional ignore: without region names, codes and the aliases above still resolve.
|
|
119
|
+
}
|
|
120
|
+
return regionCodes;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* The region whose flag stands for `value`, as a pane shows it: an ISO 3166
|
|
125
|
+
* alpha-2 or alpha-3 code (`GB`, `GBR`, `UK`), the euro area (`EU`, `EA`,
|
|
126
|
+
* "Euro area"), or the country's English name ("United Kingdom", "Korea").
|
|
127
|
+
* Null for anything with no flag: a region, a city, several countries.
|
|
128
|
+
*/
|
|
129
|
+
export function flagRegion(value: string | null | undefined): string | null {
|
|
130
|
+
const key = value?.trim().toUpperCase();
|
|
131
|
+
if (!key) return null;
|
|
132
|
+
if (EURO_AREA.has(key)) return "EU";
|
|
133
|
+
const code = REGION_ALIASES[key] ?? (/^[A-Z]{2}$/.test(key) ? key : namedRegions().get(key.replaceAll("’", "'")) ?? null);
|
|
134
|
+
return code && FLAG_ART[code] ? code : null;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* A table cell led by the flag of the country `value` names, through the
|
|
139
|
+
* cell's `leading`, on the desktop and the web. The terminal's cell comes
|
|
140
|
+
* back as it was, so its output does not change. A value with no flag keeps
|
|
141
|
+
* the flag's room, blank, so a column's text stays in line; widen the column
|
|
142
|
+
* by `COUNTRY_FLAG_CELLS` on the desktop.
|
|
143
|
+
*/
|
|
144
|
+
export function withCountryFlag(cell: DataTableCell, value: string | null | undefined, desktop: boolean): DataTableCell {
|
|
145
|
+
if (!desktop) return cell;
|
|
146
|
+
return { ...cell, leading: createElement(CountryFlag, { region: flagRegion(value), reserve: true }) };
|
|
147
|
+
}
|
|
@@ -5,6 +5,7 @@ import { useThemeColors } from "../../../../theme/theme-context";
|
|
|
5
5
|
import { usePaneInstance } from "../../../../state/app/context";
|
|
6
6
|
import { useViewport } from "../../../../react/input";
|
|
7
7
|
import { measurePerf } from "../../../../utils/perf-marks";
|
|
8
|
+
import { displayWidth } from "../../../../utils/format";
|
|
8
9
|
import { useDoubleClickActivation } from "../../../use-double-click-activation";
|
|
9
10
|
import { useScrollBoxScrollActivity } from "../../../table-view-shared";
|
|
10
11
|
import { EmptyState } from "../../status";
|
|
@@ -31,6 +32,7 @@ import {
|
|
|
31
32
|
cutColumnText,
|
|
32
33
|
resolveDataTableColumnClips,
|
|
33
34
|
resolveDataTableVisibleWindow,
|
|
35
|
+
resolveMoreColumnsHint,
|
|
34
36
|
reuseDataTableColumnClips,
|
|
35
37
|
type DataTableColumnClip,
|
|
36
38
|
} from "./model";
|
|
@@ -378,6 +380,27 @@ export function OpenTuiDataTable<T, C extends DataTableColumn = DataTableColumn>
|
|
|
378
380
|
() => tableColumnStarts(displayColumns, columnGap),
|
|
379
381
|
[columnGap, displayColumns],
|
|
380
382
|
);
|
|
383
|
+
// Columns out of view past the right edge: the header row ends in "more →" there, a press on it scrolls to
|
|
384
|
+
// them, and the rows leave its cells blank, so a narrow pane says it has more than it shows. The header's
|
|
385
|
+
// scroll box is as wide as the body's viewport (measuredViewportWidth), so the header row has a blank cell
|
|
386
|
+
// past it, over the body's vertical scrollbar; the hint is laid over the row, not inside the scroll box,
|
|
387
|
+
// and takes that cell first.
|
|
388
|
+
const besideHeader = Math.max(0, Math.min(1, (scrollRef.current?.width ?? 0) - measuredViewportWidth));
|
|
389
|
+
const moreColumns = horizontalScrollbarVisible ? resolveMoreColumnsHint({
|
|
390
|
+
columns: displayColumns.map((column) => ({
|
|
391
|
+
width: column.width,
|
|
392
|
+
align: column.align,
|
|
393
|
+
label: sortColumnId === column.id ? `${column.label}${column.label ? " " : ""}▲` : column.label,
|
|
394
|
+
})),
|
|
395
|
+
columnGap,
|
|
396
|
+
columnStarts,
|
|
397
|
+
frozenFirstColumn: freezeFirstColumn,
|
|
398
|
+
besideHeader,
|
|
399
|
+
horizontalPadding,
|
|
400
|
+
scrollLeft,
|
|
401
|
+
viewportWidth: measuredViewportWidth,
|
|
402
|
+
}) : null;
|
|
403
|
+
const moreColumnsReserve = moreColumns?.reserve ?? 0;
|
|
381
404
|
// A scroll step that cuts the columns as the last one did keeps the same
|
|
382
405
|
// array, so the memoized rows skip the render.
|
|
383
406
|
const columnClipsRef = useRef<readonly (DataTableColumnClip | null)[] | null>(null);
|
|
@@ -387,12 +410,13 @@ export function OpenTuiDataTable<T, C extends DataTableColumn = DataTableColumn>
|
|
|
387
410
|
columnStarts,
|
|
388
411
|
frozenFirstColumn: freezeFirstColumn,
|
|
389
412
|
horizontalPadding,
|
|
413
|
+
rightReserve: moreColumnsReserve,
|
|
390
414
|
scrollLeft,
|
|
391
415
|
// A table that cannot scroll sideways fits its own columns; one it cut could never be scrolled to.
|
|
392
416
|
viewportWidth: showHorizontalScrollbar ? measuredViewportWidth : 0,
|
|
393
417
|
widths: displayColumns.map((column) => column.width),
|
|
394
418
|
})),
|
|
395
|
-
[columnGap, columnStarts, displayColumns, freezeFirstColumn, horizontalPadding, measuredViewportWidth, scrollLeft, showHorizontalScrollbar],
|
|
419
|
+
[columnGap, columnStarts, displayColumns, freezeFirstColumn, horizontalPadding, measuredViewportWidth, moreColumnsReserve, scrollLeft, showHorizontalScrollbar],
|
|
396
420
|
);
|
|
397
421
|
const reportVisibleRange = useVisibleRangeEmitter({
|
|
398
422
|
itemCount: items.length,
|
|
@@ -454,6 +478,17 @@ export function OpenTuiDataTable<T, C extends DataTableColumn = DataTableColumn>
|
|
|
454
478
|
scrollRef: headerScrollRef,
|
|
455
479
|
onHorizontalScroll: syncBodyScroll,
|
|
456
480
|
});
|
|
481
|
+
// "more →" steps right as Shift+Right does: half the viewport.
|
|
482
|
+
const scrollToMoreColumns = useCallback(() => {
|
|
483
|
+
const body = scrollRef.current;
|
|
484
|
+
const viewportWidth = body?.viewport?.width ?? 0;
|
|
485
|
+
if (!body || viewportWidth <= 0) return;
|
|
486
|
+
const maxLeft = Math.max(0, (body.scrollWidth ?? 0) - viewportWidth);
|
|
487
|
+
body.scrollLeft = Math.min(maxLeft, (body.scrollLeft ?? 0) + Math.max(1, Math.floor(viewportWidth / 2)));
|
|
488
|
+
syncHeaderScroll();
|
|
489
|
+
setScrollLeft(body.scrollLeft ?? 0);
|
|
490
|
+
nativeRenderer.requestRender();
|
|
491
|
+
}, [nativeRenderer, scrollRef, syncHeaderScroll]);
|
|
457
492
|
const handleBodySizeChange = useCallback(() => {
|
|
458
493
|
measureContentWidth();
|
|
459
494
|
setScrollVersion((current) => current + 1);
|
|
@@ -616,7 +651,9 @@ export function OpenTuiDataTable<T, C extends DataTableColumn = DataTableColumn>
|
|
|
616
651
|
const hasNextLabel = columnIndex < displayColumns.length - 1
|
|
617
652
|
&& tableColumnLeadGap(displayColumns, columnIndex + 1, columnGap) === 0;
|
|
618
653
|
const label = column.label + indicator;
|
|
619
|
-
|
|
654
|
+
// A figure the right edge cuts is blank in every row (cutColumnText), so its label is too.
|
|
655
|
+
const figuresCut = clip !== null && column.align === "right" && clip.inset + clip.width < column.width;
|
|
656
|
+
const labelText = figuresCut ? " ".repeat(inset + Math.max(0, clip.width)) : " ".repeat(inset) + (clip
|
|
620
657
|
// Cut on the right, the label's last cell is the edge.
|
|
621
658
|
? cutColumnText(label, column.align, column.width, clip, (text, width, cutRight) => (
|
|
622
659
|
fitTableHeaderText(text, width, column.align, hasNextLabel && !cutRight)
|
|
@@ -650,6 +687,28 @@ export function OpenTuiDataTable<T, C extends DataTableColumn = DataTableColumn>
|
|
|
650
687
|
})}
|
|
651
688
|
</Box>
|
|
652
689
|
</ScrollBox>
|
|
690
|
+
{moreColumns ? (
|
|
691
|
+
<Box
|
|
692
|
+
position="absolute"
|
|
693
|
+
top={0}
|
|
694
|
+
left={moreColumns.left}
|
|
695
|
+
width={displayWidth(moreColumns.text)}
|
|
696
|
+
height={1}
|
|
697
|
+
zIndex={2}
|
|
698
|
+
backgroundColor={colors.panel}
|
|
699
|
+
hoverBackgroundColor={hoverBg(colors)}
|
|
700
|
+
cursor="pointer"
|
|
701
|
+
onMouseDown={(event: any) => {
|
|
702
|
+
event.preventDefault?.();
|
|
703
|
+
event.stopPropagation?.();
|
|
704
|
+
focusPane();
|
|
705
|
+
onTableMouseDown?.(event);
|
|
706
|
+
scrollToMoreColumns();
|
|
707
|
+
}}
|
|
708
|
+
>
|
|
709
|
+
<Text fg={colors.textDim}>{moreColumns.text}</Text>
|
|
710
|
+
</Box>
|
|
711
|
+
) : null}
|
|
653
712
|
|
|
654
713
|
<ScrollBox
|
|
655
714
|
id={bodyScrollId}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { displayWidth } from "../../../../utils/format";
|
|
2
|
+
import { tableColumnLeadGap } from "../../table-layout";
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Where the viewport cuts a column: `inset` cells hidden on its left (past the
|
|
@@ -61,10 +62,113 @@ export function reuseDataTableColumnClips(
|
|
|
61
62
|
return previous.length === next.length && next.every((clip, index) => sameClip(clip, previous[index] ?? null)) ? previous : next;
|
|
62
63
|
}
|
|
63
64
|
|
|
65
|
+
/**
|
|
66
|
+
* What a table's header says at its right edge while columns are out of view
|
|
67
|
+
* past it, longest first: the longest that fits beside the last column shown
|
|
68
|
+
* whole is drawn. With that column against the edge, the arrow takes the
|
|
69
|
+
* blank its label ends in. The hint never hides a column: with no blank to
|
|
70
|
+
* take, the horizontal scrollbar is the only sign.
|
|
71
|
+
*/
|
|
72
|
+
const MORE_COLUMNS_LABELS = ["more →", "more", "→"] as const;
|
|
73
|
+
|
|
74
|
+
export interface MoreColumnsHint {
|
|
75
|
+
/** The cells the hint draws: its label, after a blank unless it takes the last column's own. */
|
|
76
|
+
text: string;
|
|
77
|
+
/** Where `text` starts, from the viewport's left edge. */
|
|
78
|
+
left: number;
|
|
79
|
+
/** Cells at the body's right edge the rows leave blank under the hint (`resolveDataTableColumnClips`). */
|
|
80
|
+
reserve: number;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
interface HintColumn {
|
|
84
|
+
width: number;
|
|
85
|
+
align?: string;
|
|
86
|
+
/** The header label as drawn, with its sort mark. */
|
|
87
|
+
label: string;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Whether a column is out of view past the body's right edge at this scroll.
|
|
92
|
+
* A column the edge cuts counts when it shows nothing to read: figures cut on
|
|
93
|
+
* the right are blank (`cutColumnText`), and text shows less than its label.
|
|
94
|
+
* Text cut after its label ends in an ellipsis instead.
|
|
95
|
+
*/
|
|
96
|
+
function hasColumnsPastRightEdge(columns: readonly HintColumn[], starts: readonly number[], right: number): boolean {
|
|
97
|
+
return columns.some((column, index) => {
|
|
98
|
+
const start = starts[index] ?? 0;
|
|
99
|
+
if (start + column.width <= right) return false;
|
|
100
|
+
const shown = right - start;
|
|
101
|
+
return shown <= 0 || (column.align ?? "left") !== "left" || shown < displayWidth(column.label);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* The "more →" hint at the header's right edge while columns are out of view
|
|
107
|
+
* past it, or null. The header's scroll box is as wide as the viewport, and
|
|
108
|
+
* `besideHeader` blank cells follow it on the header row (the cell over the
|
|
109
|
+
* body's vertical scrollbar); the hint, laid over the row, can reach them.
|
|
110
|
+
* The hint sits after a blank: a gap, cells past the last column shown whole,
|
|
111
|
+
* or that column's own trailing blank (a label shorter than its column keeps
|
|
112
|
+
* one, `fitTableHeaderText`), and only cut columns give it room. Never in a
|
|
113
|
+
* viewport too narrow to show a column beside it, or before it is measured.
|
|
114
|
+
*/
|
|
115
|
+
export function resolveMoreColumnsHint({
|
|
116
|
+
columns,
|
|
117
|
+
columnGap,
|
|
118
|
+
columnStarts,
|
|
119
|
+
besideHeader = 0,
|
|
120
|
+
frozenFirstColumn = false,
|
|
121
|
+
horizontalPadding,
|
|
122
|
+
scrollLeft,
|
|
123
|
+
viewportWidth,
|
|
124
|
+
}: {
|
|
125
|
+
columns: readonly HintColumn[];
|
|
126
|
+
columnGap: number;
|
|
127
|
+
/** Where each column's content starts, from the first column (tableColumnStarts). */
|
|
128
|
+
columnStarts: readonly number[];
|
|
129
|
+
/** Blank cells right of the header's scroll box on the header row. */
|
|
130
|
+
besideHeader?: number;
|
|
131
|
+
frozenFirstColumn?: boolean;
|
|
132
|
+
horizontalPadding: number;
|
|
133
|
+
scrollLeft: number;
|
|
134
|
+
viewportWidth: number;
|
|
135
|
+
}): MoreColumnsHint | null {
|
|
136
|
+
const longest = displayWidth(MORE_COLUMNS_LABELS[0]) + 1;
|
|
137
|
+
if (columns.length === 0 || viewportWidth < longest * 2) return null;
|
|
138
|
+
const right = scrollLeft + viewportWidth;
|
|
139
|
+
const starts = columns.map((_, index) => horizontalPadding + (columnStarts[index] ?? 0));
|
|
140
|
+
if (!hasColumnsPastRightEdge(columns, starts, right)) return null;
|
|
141
|
+
// The last column drawn whole (a frozen first column rides along with the scroll), and whether its label
|
|
142
|
+
// ends in a blank of its own.
|
|
143
|
+
let lastEnd = scrollLeft;
|
|
144
|
+
let lastPadded = false;
|
|
145
|
+
columns.forEach((column, index) => {
|
|
146
|
+
const start = (starts[index] ?? 0) + (frozenFirstColumn && index === 0 ? scrollLeft : 0);
|
|
147
|
+
const end = start + column.width;
|
|
148
|
+
if (end > right || end <= lastEnd) return;
|
|
149
|
+
lastEnd = end;
|
|
150
|
+
const next = columns[index + 1];
|
|
151
|
+
lastPadded = !!next && tableColumnLeadGap(columns, index + 1, columnGap) === 0 && displayWidth(column.label) < column.width;
|
|
152
|
+
});
|
|
153
|
+
const headerRight = right + Math.max(0, besideHeader);
|
|
154
|
+
const place = (label: string) => {
|
|
155
|
+
const labelStart = headerRight - displayWidth(label);
|
|
156
|
+
// The rows stop where the blank before the label starts, unless that blank is the last column's own.
|
|
157
|
+
const rowsEnd = labelStart === lastEnd && lastPadded ? lastEnd : labelStart - 1;
|
|
158
|
+
return { text: ` ${label}`, left: labelStart - 1 - scrollLeft, reserve: Math.max(0, right - rowsEnd), fits: rowsEnd >= lastEnd };
|
|
159
|
+
};
|
|
160
|
+
const fitted = MORE_COLUMNS_LABELS.map(place).find((candidate) => candidate.fits);
|
|
161
|
+
if (fitted) return { text: fitted.text, left: fitted.left, reserve: fitted.reserve };
|
|
162
|
+
// The last column ends at the header's edge: the arrow takes its label's trailing blank, the rows keep it.
|
|
163
|
+
if (lastPadded && headerRight === lastEnd) return { text: MORE_COLUMNS_LABELS[2], left: lastEnd - 1 - scrollLeft, reserve: 0 };
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
|
|
64
167
|
/**
|
|
65
168
|
* Each column's clip at the current scroll, null for a column shown whole.
|
|
66
169
|
* A frozen first column stays, and what slides under it counts as cut on the
|
|
67
|
-
* left.
|
|
170
|
+
* left. `rightReserve` cells at the right edge show no column (under the
|
|
171
|
+
* "more →" hint, `resolveMoreColumnsHint`). Null for the whole table when every column is whole or nothing is
|
|
68
172
|
* measured yet.
|
|
69
173
|
*/
|
|
70
174
|
export function resolveDataTableColumnClips({
|
|
@@ -72,6 +176,7 @@ export function resolveDataTableColumnClips({
|
|
|
72
176
|
columnStarts,
|
|
73
177
|
frozenFirstColumn,
|
|
74
178
|
horizontalPadding,
|
|
179
|
+
rightReserve = 0,
|
|
75
180
|
scrollLeft,
|
|
76
181
|
viewportWidth,
|
|
77
182
|
widths,
|
|
@@ -81,13 +186,15 @@ export function resolveDataTableColumnClips({
|
|
|
81
186
|
columnStarts: readonly number[];
|
|
82
187
|
frozenFirstColumn: boolean;
|
|
83
188
|
horizontalPadding: number;
|
|
189
|
+
/** Cells at the viewport's right edge that show no column. */
|
|
190
|
+
rightReserve?: number;
|
|
84
191
|
scrollLeft: number;
|
|
85
192
|
viewportWidth: number;
|
|
86
193
|
/** Each column's drawn width. */
|
|
87
194
|
widths: readonly number[];
|
|
88
195
|
}): (DataTableColumnClip | null)[] | null {
|
|
89
196
|
if (viewportWidth <= 0 || widths.length === 0) return null;
|
|
90
|
-
const right = scrollLeft + viewportWidth;
|
|
197
|
+
const right = scrollLeft + viewportWidth - Math.max(0, rightReserve);
|
|
91
198
|
const left = frozenFirstColumn ? scrollLeft + horizontalPadding + (widths[0] ?? 0) + columnGap : scrollLeft;
|
|
92
199
|
let cut = false;
|
|
93
200
|
const clips = widths.map((width, index): DataTableColumnClip | null => {
|
|
@@ -178,7 +178,7 @@ export interface DataTableProps<
|
|
|
178
178
|
*/
|
|
179
179
|
exportCsv?: () => string;
|
|
180
180
|
/**
|
|
181
|
-
* A rendered-view report (`
|
|
181
|
+
* A rendered-view report (`gloom fn`) reads every row, not only those
|
|
182
182
|
* the viewport shows. For a bounded table a reader needs whole, such as an
|
|
183
183
|
* option chain's strike window; leave it off for long or paged lists.
|
|
184
184
|
*/
|
|
@@ -5,6 +5,7 @@ import { blendForContrast, higherContrast } from "../../theme/color-utils";
|
|
|
5
5
|
import { useThemeColors } from "../../theme/theme-context";
|
|
6
6
|
import { Box, Text, TextAttributes, useUiCapabilities } from "../../ui";
|
|
7
7
|
import { truncateToDisplayWidth } from "../../utils/format";
|
|
8
|
+
import { CountryFlagLead } from "./country-flag";
|
|
8
9
|
import { usePaneLinkMenuEntry } from "./external-link";
|
|
9
10
|
import { titleCase } from "./header-case";
|
|
10
11
|
import { statToneColor, type StatTone } from "./stat-grid";
|
|
@@ -69,6 +70,8 @@ export interface KeyValueRowProps {
|
|
|
69
70
|
* `PaneLinkMenu` the pane menu lists it as `link.label`, so the keyboard reaches what a click opens.
|
|
70
71
|
*/
|
|
71
72
|
link?: { label: string; onOpen: () => void };
|
|
73
|
+
/** The country the value names (a code or a name): the desktop and the web lead the value with its flag. */
|
|
74
|
+
country?: string | null;
|
|
72
75
|
}
|
|
73
76
|
|
|
74
77
|
/**
|
|
@@ -120,7 +123,7 @@ export function KeyValueRow(props: KeyValueRowProps) {
|
|
|
120
123
|
* width in characters, the value and detail taking the rest of the row and
|
|
121
124
|
* clipped in CSS where they run out of it.
|
|
122
125
|
*/
|
|
123
|
-
function NativeKeyValueRow({ label, value, detail, tone, color, width, labelWidth, emphasis = true, align = "left", link }: KeyValueRowProps) {
|
|
126
|
+
function NativeKeyValueRow({ label, value, detail, tone, color, width, labelWidth, emphasis = true, align = "left", link, country }: KeyValueRowProps) {
|
|
124
127
|
const colors = useThemeColors();
|
|
125
128
|
usePaneLinkMenuEntry(link ? `key-value:${label}:${value}` : null, link?.label ?? "", () => link?.onOpen());
|
|
126
129
|
const target = link ? {
|
|
@@ -136,6 +139,7 @@ function NativeKeyValueRow({ label, value, detail, tone, color, width, labelWidt
|
|
|
136
139
|
<Box width={width === undefined ? undefined : "100%"} flexDirection="row" overflow="hidden" data-gloom-ui="key-value-row" {...target}>
|
|
137
140
|
{/* At least the label width, in characters; a longer label keeps every character and moves its value along. */}
|
|
138
141
|
<Text fg={colors.textDim} style={{ ...NATIVE_CLIP_STYLE, flex: "0 0 auto", minWidth: `${labelChars}ch`, paddingRight: "1ch", boxSizing: "border-box" }}>{t(label)}</Text>
|
|
142
|
+
{country ? <CountryFlagLead value={country} /> : null}
|
|
139
143
|
<Text
|
|
140
144
|
fg={color ?? statToneColor(tone, colors) ?? colors.text}
|
|
141
145
|
attributes={emphasis ? TextAttributes.BOLD : undefined}
|
|
@@ -36,8 +36,10 @@ export { FieldGrid, GridFieldView, fieldGridColumns, fieldGridRows } from "./fie
|
|
|
36
36
|
export type { FieldGridProps, GridField } from "./field-grid";
|
|
37
37
|
export { StatGrid, statGridColumns, statGridRows } from "./stat-grid";
|
|
38
38
|
export { ColumnGrid, ColumnGridPair } from "./column-grid";
|
|
39
|
-
export type { ColumnGridCell, ColumnGridColumn, ColumnGridPairProps, ColumnGridProps } from "./column-grid";
|
|
39
|
+
export type { ColumnGridCell, ColumnGridColumn, ColumnGridLink, ColumnGridPairProps, ColumnGridProps } from "./column-grid";
|
|
40
40
|
export type { StatGridProps, StatItem } from "./stat-grid";
|
|
41
|
+
export { COUNTRY_FLAG_CELLS, CountryFlag, CountryFlagLead, withCountryFlag, withFlagRoom } from "./country-flag";
|
|
42
|
+
export type { CountryFlagProps } from "./country-flag";
|
|
41
43
|
export { RatioBar } from "./ratio-bar";
|
|
42
44
|
export type { RatioBarProps } from "./ratio-bar";
|
|
43
45
|
export { RangeTrack } from "./range-track";
|