gloomberb 0.18.2 → 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/patches/electrobun@1.18.1.patch +106 -5
- 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 +99 -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 +24 -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 +26 -7
- 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/telemetry.ts +17 -0
- package/src/api-client/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- package/src/app/global-shortcuts.ts +1 -16
- 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/runtime/update.ts +28 -8
- package/src/app/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- package/src/architecture/pane-tabs-allowlist.json +65 -0
- 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 +1189 -296
- 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 +272 -70
- 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 +20 -14
- 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 +32 -18
- package/src/cli/issuer-membership.ts +103 -0
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +315 -43
- package/src/cli/name-entries.ts +73 -22
- 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 +77 -20
- package/src/cli/pane-functions/catalog.ts +40 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +12 -8
- 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 +48 -16
- package/src/cli/pane-functions/index.ts +82 -21
- 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 +65 -14
- 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 +190 -27
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +122 -25
- 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 +226 -60
- 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 +387 -21
- package/src/components/chart/composite/drawing-store.ts +26 -6
- package/src/components/chart/composite/interactions.ts +9 -3
- 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 +316 -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 +19 -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/command-items.ts +32 -6
- 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/data-table/view.tsx +23 -3
- 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 +13 -6
- package/src/components/layout/detached-pane-shell.tsx +1 -0
- package/src/components/layout/floating-pane.tsx +1 -0
- package/src/components/layout/header.tsx +234 -60
- 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/pane/header.tsx +10 -3
- package/src/components/layout/pane/index.tsx +1 -0
- package/src/components/layout/pane/pane-tabs.tsx +9 -1
- 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/components/ui/stat-grid.tsx +28 -3
- package/src/components/ui/status.tsx +3 -1
- package/src/core/app-services.ts +4 -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 +51 -12
- package/src/i18n/ja.ts +51 -12
- package/src/i18n/ko.ts +51 -12
- package/src/i18n/zh-cn.ts +51 -12
- package/src/i18n/zh-tw.ts +51 -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 +30 -18
- 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 +108 -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 +77 -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 +107 -43
- package/src/plugins/builtin/attention/pane.tsx +22 -16
- 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 +12 -9
- package/src/plugins/builtin/backtest/export.ts +1 -1
- 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 +24 -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 +115 -26
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +122 -36
- 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 +34 -18
- 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/client.ts +2 -2
- package/src/plugins/builtin/catalysts/detail.tsx +3 -2
- package/src/plugins/builtin/catalysts/index.tsx +1 -1
- package/src/plugins/builtin/catalysts/model.ts +49 -4
- package/src/plugins/builtin/catalysts/pane.tsx +9 -11
- 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 +128 -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 +14 -8
- package/src/plugins/builtin/company-attention/app-rank.tsx +11 -10
- 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 +89 -31
- 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 +5 -4
- 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 +7 -4
- package/src/plugins/builtin/correlation/relationship/model.ts +1 -0
- package/src/plugins/builtin/correlation/settings.ts +1 -0
- 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 +7 -5
- 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/credit-documents/pane.tsx +8 -7
- 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/debt-maturities/pane.tsx +4 -3
- 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 +19 -12
- 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 +77 -5
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +34 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +148 -106
- 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 +16 -10
- 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/board.tsx +4 -1
- package/src/plugins/builtin/gpu/changes.tsx +10 -10
- package/src/plugins/builtin/gpu/equities.tsx +4 -1
- package/src/plugins/builtin/gpu/headless.ts +9 -4
- package/src/plugins/builtin/gpu/history.tsx +4 -2
- package/src/plugins/builtin/gpu/pane.tsx +5 -3
- 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 +15 -2
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +48 -8
- 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/thirteenf-match.ts +3 -1
- package/src/plugins/builtin/holders/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/base-values.ts +11 -7
- package/src/plugins/builtin/insider/client.ts +3 -0
- package/src/plugins/builtin/insider/headless.ts +20 -7
- package/src/plugins/builtin/insider/index.tsx +17 -8
- package/src/plugins/builtin/insider/issuer.ts +34 -4
- package/src/plugins/builtin/insider/signals-client.ts +3 -3
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- package/src/plugins/builtin/insider/table-model.ts +35 -13
- package/src/plugins/builtin/insider/table.tsx +5 -2
- 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/events.ts +145 -0
- package/src/plugins/builtin/iv-history/format.ts +3 -0
- package/src/plugins/builtin/iv-history/headless.ts +91 -7
- 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 +14 -8
- 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 +36 -21
- 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 +33 -11
- 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 +50 -15
- package/src/plugins/builtin/notes/export.ts +17 -6
- package/src/plugins/builtin/notes/files.ts +16 -5
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/enrichment-model.ts +10 -9
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/model-spot.ts +70 -4
- package/src/plugins/builtin/options/view.tsx +51 -23
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-calculator/pane.tsx +3 -2
- package/src/plugins/builtin/options-positioning/headless.ts +11 -3
- package/src/plugins/builtin/options-positioning/model.ts +24 -0
- package/src/plugins/builtin/options-positioning/pane.tsx +10 -12
- package/src/plugins/builtin/options-scenario/client.ts +142 -29
- 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 +49 -21
- 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 +22 -10
- 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 +145 -60
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +78 -27
- 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 +6 -3
- 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 +44 -32
- 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/client.ts +2 -1
- package/src/plugins/builtin/reverse-dcf/model.ts +10 -5
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -1
- package/src/plugins/builtin/seasonality/client.ts +2 -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 +6 -4
- 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-resource.ts +15 -2
- 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 +23 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/series-list-detail.tsx +3 -1
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
- package/src/plugins/builtin/shared/volatility/options.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/social-mentions/client.ts +2 -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 +28 -7
- package/src/plugins/builtin/vol-surface/headless.ts +43 -15
- package/src/plugins/builtin/vol-surface/model.ts +34 -12
- package/src/plugins/builtin/vol-surface/pane.tsx +33 -13
- package/src/plugins/builtin/vol-surface/stored.ts +34 -3
- package/src/plugins/builtin/vol-surface/tables.ts +14 -0
- 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/desktop/controls.tsx +1 -1
- package/src/renderers/dom/desktop/query-bar.tsx +2 -0
- 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/host/tabs.tsx +16 -5
- package/src/renderers/dom/host/top-surface.ts +127 -0
- package/src/renderers/dom/styles.css +115 -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/core-capabilities.ts +9 -1
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +56 -3
- package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
- package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
- package/src/renderers/electrobun/bun/desktop/update.ts +210 -30
- 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 +9 -7
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +9 -2
- 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 +8 -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 +39 -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/index.ts +16 -0
- 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 +21 -4
- package/src/telemetry/update-failures-node.ts +59 -0
- package/src/telemetry/update-failures.ts +307 -0
- 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 +215 -36
- package/src/tickers/company-name.ts +43 -0
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/listing-fate.ts +30 -0
- 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 +20 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +83 -6
- package/src/types/instrument.ts +3 -0
- package/src/types/issuer-listings.ts +28 -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/failure.ts +163 -0
- package/src/updater/index.ts +97 -28
- 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-pair.ts +26 -0
- 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 +71 -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
|
@@ -13,11 +13,13 @@ import {
|
|
|
13
13
|
import {
|
|
14
14
|
type CellMouseEvent,
|
|
15
15
|
type MouseLikeEvent,
|
|
16
|
+
type PinchGestureEvent,
|
|
16
17
|
callCellMouseHandler,
|
|
17
18
|
callMouseHandler,
|
|
18
19
|
cancelWebFrame,
|
|
19
20
|
cellBoundsForElement,
|
|
20
21
|
cellMouseEvent,
|
|
22
|
+
pinchWheelEvent,
|
|
21
23
|
requestWebFrame,
|
|
22
24
|
} from "./mouse";
|
|
23
25
|
import { hideDragShield, showDragShield } from "./drag-shield";
|
|
@@ -212,15 +214,54 @@ export const WebBox = forwardRef<HTMLDivElement, Record<string, unknown> & { chi
|
|
|
212
214
|
}, []);
|
|
213
215
|
|
|
214
216
|
const handlesWheel = typeof props.onMouseScroll === "function";
|
|
217
|
+
const pinchAsWheel = handlesWheel && props.pinchAsWheel === true;
|
|
215
218
|
useEffect(() => {
|
|
216
219
|
const element = elementRef.current;
|
|
217
220
|
if (!element || !handlesWheel) return;
|
|
221
|
+
// WebKit pinches with gesture events; with `pinchAsWheel` they reach the
|
|
222
|
+
// handler as the Ctrl+wheel Chromium sends for one. The wheel events a
|
|
223
|
+
// newer WebKit adds for the same pinch are dropped, so it zooms once.
|
|
224
|
+
let pinching = false;
|
|
225
|
+
let pinchScale = 1;
|
|
218
226
|
const handleWheel = (event: WheelEvent) => {
|
|
227
|
+
if (pinching && event.ctrlKey) {
|
|
228
|
+
event.preventDefault();
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
// A plain scroll means the pinch is over, whatever became of its end.
|
|
232
|
+
pinching = false;
|
|
219
233
|
callMouseHandler(propsRef.current.onMouseScroll, event, "scroll");
|
|
220
234
|
};
|
|
235
|
+
const startPinch = (event: Event) => {
|
|
236
|
+
event.preventDefault();
|
|
237
|
+
pinching = true;
|
|
238
|
+
pinchScale = (event as PinchGestureEvent).scale || 1;
|
|
239
|
+
};
|
|
240
|
+
const changePinch = (event: Event) => {
|
|
241
|
+
event.preventDefault();
|
|
242
|
+
const scale = (event as PinchGestureEvent).scale;
|
|
243
|
+
const step = pinchScale > 0 && scale > 0 ? scale / pinchScale : 1;
|
|
244
|
+
if (scale > 0) pinchScale = scale;
|
|
245
|
+
const wheel = pinchWheelEvent(event as PinchGestureEvent, step);
|
|
246
|
+
if (wheel) callCellMouseHandler(propsRef.current.onMouseScroll, wheel);
|
|
247
|
+
};
|
|
248
|
+
const endPinch = (event: Event) => {
|
|
249
|
+
event.preventDefault();
|
|
250
|
+
pinching = false;
|
|
251
|
+
};
|
|
221
252
|
element.addEventListener("wheel", handleWheel, { passive: false });
|
|
222
|
-
|
|
223
|
-
|
|
253
|
+
if (pinchAsWheel) {
|
|
254
|
+
element.addEventListener("gesturestart", startPinch);
|
|
255
|
+
element.addEventListener("gesturechange", changePinch);
|
|
256
|
+
element.addEventListener("gestureend", endPinch);
|
|
257
|
+
}
|
|
258
|
+
return () => {
|
|
259
|
+
element.removeEventListener("wheel", handleWheel);
|
|
260
|
+
element.removeEventListener("gesturestart", startPinch);
|
|
261
|
+
element.removeEventListener("gesturechange", changePinch);
|
|
262
|
+
element.removeEventListener("gestureend", endPinch);
|
|
263
|
+
};
|
|
264
|
+
}, [handlesWheel, pinchAsWheel]);
|
|
224
265
|
|
|
225
266
|
const handleMouseDown = (event: MouseEvent) => {
|
|
226
267
|
const hasSyntheticDrag = typeof propsRef.current.onMouse === "function";
|
|
@@ -285,6 +285,8 @@ export const WebChartSurface = forwardRef<BoxRenderable, Record<string, unknown>
|
|
|
285
285
|
return (
|
|
286
286
|
<WebBox
|
|
287
287
|
{...props}
|
|
288
|
+
// A pinch over a chart zooms it in WebKit as it does in Chromium.
|
|
289
|
+
pinchAsWheel
|
|
288
290
|
ref={ref as Ref<HTMLDivElement>}
|
|
289
291
|
data-gloom-role={(props["data-gloom-role"] as string | undefined) ?? "chart-surface"}
|
|
290
292
|
style={{
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** @jsxImportSource react */
|
|
2
|
+
import { useEffect, useState, type CSSProperties, type ReactNode } from "react";
|
|
3
|
+
import type { ImageSurfaceProps } from "../../../ui/host";
|
|
4
|
+
import { cleanDomProps, commonStyle } from "./style";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Images that failed to load this session, such as a company with no logo:
|
|
8
|
+
* a row scrolled back into view draws its fallback at once rather than an
|
|
9
|
+
* empty box while it asks again.
|
|
10
|
+
*/
|
|
11
|
+
const failedImages = new Set<string>();
|
|
12
|
+
const FAILED_IMAGES_KEPT = 2_000;
|
|
13
|
+
|
|
14
|
+
function rememberFailedImage(src: string): void {
|
|
15
|
+
if (failedImages.size >= FAILED_IMAGES_KEPT) failedImages.delete(failedImages.values().next().value!);
|
|
16
|
+
failedImages.add(src);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** An image filling its box; `children` stand in without a `src`, or once it fails to load. */
|
|
20
|
+
export function WebImageSurface({ children, src, alt = "", objectFit = "contain", ...props }: ImageSurfaceProps) {
|
|
21
|
+
const imageSrc = typeof src === "string" ? src.trim() : "";
|
|
22
|
+
const [failed, setFailed] = useState(() => failedImages.has(imageSrc));
|
|
23
|
+
useEffect(() => setFailed(failedImages.has(imageSrc)), [imageSrc]);
|
|
24
|
+
const baseStyle = commonStyle(props);
|
|
25
|
+
return (
|
|
26
|
+
<div
|
|
27
|
+
{...cleanDomProps(props)}
|
|
28
|
+
style={{
|
|
29
|
+
...baseStyle,
|
|
30
|
+
overflow: baseStyle.overflow ?? "hidden",
|
|
31
|
+
...(props.style as CSSProperties | undefined),
|
|
32
|
+
}}
|
|
33
|
+
>
|
|
34
|
+
{imageSrc && !failed ? (
|
|
35
|
+
<img
|
|
36
|
+
key={imageSrc}
|
|
37
|
+
src={imageSrc}
|
|
38
|
+
alt={alt}
|
|
39
|
+
draggable={false}
|
|
40
|
+
onError={() => {
|
|
41
|
+
rememberFailedImage(imageSrc);
|
|
42
|
+
setFailed(true);
|
|
43
|
+
}}
|
|
44
|
+
style={{ width: "100%", height: "100%", display: "block", objectFit }}
|
|
45
|
+
/>
|
|
46
|
+
) : children as ReactNode}
|
|
47
|
+
</div>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** @jsxImportSource react */
|
|
2
|
-
import Hls from "hls.js";
|
|
2
|
+
import type Hls from "hls.js";
|
|
3
3
|
import { forwardRef, useEffect, useImperativeHandle, useRef, useState, type CSSProperties, type ReactNode } from "react";
|
|
4
4
|
import type { MediaSurfaceHandle, MediaSurfaceProps } from "../../../ui/host";
|
|
5
5
|
import { cleanDomProps, commonStyle } from "./style";
|
|
@@ -173,24 +173,30 @@ export const WebMediaSurface = forwardRef<HTMLVideoElement, MediaSurfaceProps>(f
|
|
|
173
173
|
video.src = mediaSrc;
|
|
174
174
|
video.load();
|
|
175
175
|
startPlayback();
|
|
176
|
-
} else if (Hls.isSupported()) {
|
|
177
|
-
hls = new Hls({
|
|
178
|
-
backBufferLength: 30,
|
|
179
|
-
enableWorker: true,
|
|
180
|
-
lowLatencyMode: true,
|
|
181
|
-
// A pane is a fraction of the screen, so the top rendition would be
|
|
182
|
-
// decoded and then scaled away. Re-evaluated when the pane is resized.
|
|
183
|
-
capLevelToPlayerSize: true,
|
|
184
|
-
});
|
|
185
|
-
hls.on(Hls.Events.ERROR, (_event, data) => {
|
|
186
|
-
if (!data.fatal) return;
|
|
187
|
-
fail(data.details ? `Stream playback failed: ${data.details}` : "Stream playback failed.");
|
|
188
|
-
});
|
|
189
|
-
hls.on(Hls.Events.MANIFEST_PARSED, startPlayback);
|
|
190
|
-
hls.loadSource(mediaSrc);
|
|
191
|
-
hls.attachMedia(video);
|
|
192
176
|
} else {
|
|
193
|
-
|
|
177
|
+
// Loaded with the first stream that needs it, not with the app.
|
|
178
|
+
void import("./hls.chunk.js").then(({ default: HlsPlayer }) => {
|
|
179
|
+
if (!active) return;
|
|
180
|
+
if (!HlsPlayer.isSupported()) {
|
|
181
|
+
fail("HLS playback is unavailable in this desktop runtime.");
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
hls = new HlsPlayer({
|
|
185
|
+
backBufferLength: 30,
|
|
186
|
+
enableWorker: true,
|
|
187
|
+
lowLatencyMode: true,
|
|
188
|
+
// A pane is a fraction of the screen, so the top rendition would be
|
|
189
|
+
// decoded and then scaled away. Re-evaluated when the pane is resized.
|
|
190
|
+
capLevelToPlayerSize: true,
|
|
191
|
+
});
|
|
192
|
+
hls.on(HlsPlayer.Events.ERROR, (_event, data) => {
|
|
193
|
+
if (!data.fatal) return;
|
|
194
|
+
fail(data.details ? `Stream playback failed: ${data.details}` : "Stream playback failed.");
|
|
195
|
+
});
|
|
196
|
+
hls.on(HlsPlayer.Events.MANIFEST_PARSED, startPlayback);
|
|
197
|
+
hls.loadSource(mediaSrc);
|
|
198
|
+
hls.attachMedia(video);
|
|
199
|
+
}, () => fail("The stream player could not be loaded."));
|
|
194
200
|
}
|
|
195
201
|
|
|
196
202
|
return () => {
|
|
@@ -54,6 +54,36 @@ function resolveScroll(event: MouseLikeEvent) {
|
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
/** WebKit's trackpad pinch: the scale since the pinch began, at the pointer. */
|
|
58
|
+
export interface PinchGestureEvent extends Event {
|
|
59
|
+
scale: number;
|
|
60
|
+
clientX: number;
|
|
61
|
+
clientY: number;
|
|
62
|
+
shiftKey?: boolean;
|
|
63
|
+
altKey?: boolean;
|
|
64
|
+
ctrlKey?: boolean;
|
|
65
|
+
metaKey?: boolean;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Chromium sends a trackpad pinch as Ctrl+wheel with `deltaY = -100 ln(scale step)`. */
|
|
69
|
+
const PINCH_WHEEL_PIXELS_PER_E = 100;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* One step of a WebKit pinch (`step`, the scale since the last one) as the
|
|
73
|
+
* Ctrl+wheel event Chromium sends for it, so one handler serves both. Null
|
|
74
|
+
* for a step that zooms nothing.
|
|
75
|
+
*/
|
|
76
|
+
export function pinchWheelEvent(event: PinchGestureEvent, step: number): CellMouseEvent | null {
|
|
77
|
+
if (!(step > 0) || !Number.isFinite(step) || step === 1) return null;
|
|
78
|
+
const deltaY = -PINCH_WHEEL_PIXELS_PER_E * Math.log(step);
|
|
79
|
+
const base = cellMouseEvent(event as unknown as MouseLikeEvent, "scroll");
|
|
80
|
+
return {
|
|
81
|
+
...base,
|
|
82
|
+
modifiers: { shift: event.shiftKey === true, alt: event.altKey === true, ctrl: true },
|
|
83
|
+
scroll: { direction: deltaY > 0 ? "down" : "up", delta: Math.abs(deltaY), deltaX: 0, deltaY },
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
57
87
|
/**
|
|
58
88
|
* `ahead` is where the browser predicts the pointer will be a moment later
|
|
59
89
|
* (`getPredictedEvents`), for drawing what follows it; hit tests and releases
|
|
@@ -13,7 +13,7 @@ import { isLiveResizing } from "../../../ui/live-resize";
|
|
|
13
13
|
* A box that is not displayed has no size to report: a research tab kept
|
|
14
14
|
* mounted while another one shows sits under `display: none`, and the 0 by 0
|
|
15
15
|
* the browser reports there would have its chart redraw for one pixel and
|
|
16
|
-
* show that pixel stretched over the plot when the tab comes back
|
|
16
|
+
* show that pixel stretched over the plot when the tab comes back.
|
|
17
17
|
* It keeps the size it was last laid out at instead, so the tab comes back
|
|
18
18
|
* with the bitmap it left with.
|
|
19
19
|
*/
|
|
@@ -127,7 +127,7 @@ export function cleanDomProps(props: Record<string, unknown>): Record<string, un
|
|
|
127
127
|
"cursorColor", "selectionBg", "selectionFg", "showCursor", "keyBindings", "wrapText", "wrapMode",
|
|
128
128
|
"initialValue", "value", "onInput", "onChange", "onSubmit", "onEscape", "onCursorChange", "onMouse",
|
|
129
129
|
"scrollX", "scrollY", "focusable", "bitmap", "bitmaps", "crosshair", "vectors", "text", "font",
|
|
130
|
-
"hoverBackgroundColor", "joinPastedLines", "stickyScroll", "stickyStart", "onStickyPinChange",
|
|
130
|
+
"hoverBackgroundColor", "joinPastedLines", "stickyScroll", "stickyStart", "onStickyPinChange", "pinchAsWheel",
|
|
131
131
|
]) {
|
|
132
132
|
delete next[key];
|
|
133
133
|
}
|
|
@@ -12,6 +12,7 @@ import { WebIcon, WebIconButton } from "../desktop/icons";
|
|
|
12
12
|
import { WebMenu } from "../desktop/menu";
|
|
13
13
|
import { WebPopover } from "../desktop/popover";
|
|
14
14
|
import { useHorizontalOverflow } from "./overflow-fade";
|
|
15
|
+
import { useTopSurfaceColor } from "./top-surface";
|
|
15
16
|
import { hideDragShield, showDragShield } from "./drag-shield";
|
|
16
17
|
|
|
17
18
|
type CssVars = CSSProperties & Record<`--${string}`, string>;
|
|
@@ -44,9 +45,10 @@ export function WebTabs({
|
|
|
44
45
|
// A tab bar occupies exactly the one row every caller reserves for it. Any
|
|
45
46
|
// extra pixels here are pixels the pane's children are told they own and the
|
|
46
47
|
// pane then clips, which is how a chart's time axis ends up behind a footer.
|
|
47
|
-
// Title-bar tabs fill the header to its bottom edge,
|
|
48
|
-
//
|
|
49
|
-
// look in styles.css: text,
|
|
48
|
+
// Title-bar tabs fill the header to its bottom edge, where the active tab's
|
|
49
|
+
// box covers the header's bottom rule and opens into the pane. Every variant
|
|
50
|
+
// draws the one tab look in styles.css: text, the active tab on an accent
|
|
51
|
+
// underline, and title-bar tabs as boxes instead of underlines.
|
|
50
52
|
const listHeight = header ? "100%" : variant === "underline" || compact ? WEB_CELL_HEIGHT : "100%";
|
|
51
53
|
|
|
52
54
|
useEffect(() => () => dragCleanupRef.current?.(), []);
|
|
@@ -67,6 +69,9 @@ export function WebTabs({
|
|
|
67
69
|
useEffect(() => {
|
|
68
70
|
if (!overflowing) setOverflowMenuOpen(false);
|
|
69
71
|
}, [overflowing]);
|
|
72
|
+
// The active title-bar tab opens into the pane, so it takes the colour of
|
|
73
|
+
// whatever is directly under it.
|
|
74
|
+
useTopSurfaceColor(tabListRef, header, [activeValue, tabs]);
|
|
70
75
|
|
|
71
76
|
const selectFromOverflowMenu = (value: string) => {
|
|
72
77
|
setOverflowMenuOpen(false);
|
|
@@ -173,12 +178,14 @@ export function WebTabs({
|
|
|
173
178
|
<div
|
|
174
179
|
ref={tabListRef}
|
|
175
180
|
data-gloom-role="tab-list"
|
|
181
|
+
data-gloom-variant={header ? "header" : undefined}
|
|
176
182
|
role="tablist"
|
|
177
183
|
onWheel={overflow.onWheel}
|
|
178
184
|
style={{
|
|
179
185
|
display: "flex",
|
|
180
186
|
flexDirection: "row",
|
|
181
|
-
|
|
187
|
+
// Title-bar tabs stand on the header's bottom edge, clear of its top.
|
|
188
|
+
alignItems: header ? "flex-end" : "stretch",
|
|
182
189
|
gap: 0,
|
|
183
190
|
width: "100%",
|
|
184
191
|
height: listHeight,
|
|
@@ -217,7 +224,10 @@ export function WebTabs({
|
|
|
217
224
|
transform: `translateX(${dragTranslateX}px)${sourceDragging ? " scale(1.03)" : ""}`,
|
|
218
225
|
zIndex: dragSourceValue === tab.value ? 2 : undefined,
|
|
219
226
|
willChange: dragSourceValue ? "transform" : undefined,
|
|
220
|
-
|
|
227
|
+
// An inactive title-bar tab fades its hover fill in. The active one's
|
|
228
|
+
// box changes with the bar's rule and the body under it, which do not
|
|
229
|
+
// fade, so it does not either.
|
|
230
|
+
transition: `color 110ms ease${header && !active ? ", background-color 110ms ease" : ""}, transform ${dragSourceValue && dragSourceValue !== tab.value ? "var(--tab-reorder-duration, 160ms)" : "0ms"} cubic-bezier(0.77, 0, 0.175, 1)`,
|
|
221
231
|
cursor: disabled ? "default" : dragSourceValue ? "grabbing" : reorderable ? "grab" : "pointer",
|
|
222
232
|
...(dragTarget ? { color: "var(--gloom-text)" } : {}),
|
|
223
233
|
} satisfies CssVars;
|
|
@@ -230,6 +240,7 @@ export function WebTabs({
|
|
|
230
240
|
data-active={active ? "true" : undefined}
|
|
231
241
|
data-dense={dense || compact ? "true" : undefined}
|
|
232
242
|
data-reorderable={reorderable ? "true" : undefined}
|
|
243
|
+
data-drag-target={dragTarget ? "true" : undefined}
|
|
233
244
|
data-tab-value={tab.value}
|
|
234
245
|
type="button"
|
|
235
246
|
role="tab"
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { useLayoutEffect, type RefObject } from "react";
|
|
2
|
+
|
|
3
|
+
type Rgba = [number, number, number, number];
|
|
4
|
+
|
|
5
|
+
const THROTTLE_MS = 120;
|
|
6
|
+
/** Rows and cells follow the cursor and selection; a tab must not take their colour. */
|
|
7
|
+
const TRANSIENT_ROLES = /^data-table-(row|cell|header-cell)$/;
|
|
8
|
+
const ACTIVE_BG = "--pane-tab-active-bg";
|
|
9
|
+
|
|
10
|
+
function parseColor(value: string): Rgba | null {
|
|
11
|
+
const trimmed = value.trim();
|
|
12
|
+
if (!trimmed || trimmed === "transparent") return [0, 0, 0, 0];
|
|
13
|
+
const rgb = /^rgba?\(([^)]+)\)$/.exec(trimmed);
|
|
14
|
+
if (rgb) {
|
|
15
|
+
const parts = rgb[1]!.split(/[\s,/]+/).filter(Boolean).map(Number);
|
|
16
|
+
if (parts.length < 3 || parts.some(Number.isNaN)) return null;
|
|
17
|
+
return [parts[0]!, parts[1]!, parts[2]!, parts[3] ?? 1];
|
|
18
|
+
}
|
|
19
|
+
const srgb = /^color\(srgb\s+([^)]+)\)$/.exec(trimmed);
|
|
20
|
+
if (srgb) {
|
|
21
|
+
const parts = srgb[1]!.split(/[\s/]+/).filter(Boolean).map(Number);
|
|
22
|
+
if (parts.length < 3 || parts.some(Number.isNaN)) return null;
|
|
23
|
+
return [parts[0]! * 255, parts[1]! * 255, parts[2]! * 255, parts[3] ?? 1];
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function over(top: Rgba, base: Rgba): Rgba {
|
|
29
|
+
const alpha = top[3];
|
|
30
|
+
return [
|
|
31
|
+
top[0] * alpha + base[0] * (1 - alpha),
|
|
32
|
+
top[1] * alpha + base[1] * (1 - alpha),
|
|
33
|
+
top[2] * alpha + base[2] * (1 - alpha),
|
|
34
|
+
1,
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The colour the active title-bar tab takes so it reads as the top of the pane
|
|
40
|
+
* body: whatever surface sits directly under it (the query bar's band, a detail
|
|
41
|
+
* header, a table header, the body itself), translucent layers composited.
|
|
42
|
+
*/
|
|
43
|
+
function measureTopSurface(body: HTMLElement, x: number): string | null {
|
|
44
|
+
const bodyRect = body.getBoundingClientRect();
|
|
45
|
+
if (bodyRect.width <= 0 || bodyRect.height <= 0) return null;
|
|
46
|
+
const y = bodyRect.top + 1;
|
|
47
|
+
let top: Element = document.elementsFromPoint(x, y).find((element) => body.contains(element)) ?? body;
|
|
48
|
+
// A marked surface (query bar, detail header) is taken whole, so hovering a
|
|
49
|
+
// control inside it never tints the tab.
|
|
50
|
+
const surface = top.closest("[data-gloom-top-surface]");
|
|
51
|
+
if (surface && body.contains(surface)) top = surface;
|
|
52
|
+
|
|
53
|
+
const layers: Rgba[] = [];
|
|
54
|
+
for (let element: Element | null = top; element; element = element.parentElement) {
|
|
55
|
+
const role = element.getAttribute("data-gloom-role") ?? "";
|
|
56
|
+
const rect = element.getBoundingClientRect();
|
|
57
|
+
const startsAtTop = Math.abs(rect.top - bodyRect.top) <= 1.5;
|
|
58
|
+
const spansBody = rect.width >= bodyRect.width * 0.6;
|
|
59
|
+
if (element === body || element === surface || (startsAtTop && spansBody && !TRANSIENT_ROLES.test(role))) {
|
|
60
|
+
const color = parseColor(getComputedStyle(element).backgroundColor);
|
|
61
|
+
if (color && color[3] > 0) layers.push(color);
|
|
62
|
+
}
|
|
63
|
+
if (element === body) break;
|
|
64
|
+
}
|
|
65
|
+
// From the body outwards to the topmost surface.
|
|
66
|
+
let color: Rgba | null = null;
|
|
67
|
+
for (let index = layers.length - 1; index >= 0; index -= 1) {
|
|
68
|
+
const layer = layers[index]!;
|
|
69
|
+
color = color ? over(layer, color) : layer[3] >= 1 ? layer : null;
|
|
70
|
+
}
|
|
71
|
+
if (!color) return null;
|
|
72
|
+
return `rgb(${Math.round(color[0])}, ${Math.round(color[1])}, ${Math.round(color[2])})`;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Keeps `--pane-tab-active-bg` on a title-bar tab list equal to the surface
|
|
77
|
+
* under its active tab, so the tab opens into the pane. Without a measure the
|
|
78
|
+
* header's own value (the body colour) applies. A change to the body itself
|
|
79
|
+
* (focus and theme recolour it) is measured at once, before it paints; changes
|
|
80
|
+
* inside it (a detail opens, a query bar appears) at most every 120 ms; a
|
|
81
|
+
* resize once it stops, so dragging a pane's edge costs no measures.
|
|
82
|
+
*/
|
|
83
|
+
export function useTopSurfaceColor(listRef: RefObject<HTMLElement | null>, enabled: boolean, deps: readonly unknown[]) {
|
|
84
|
+
useLayoutEffect(() => {
|
|
85
|
+
const list = listRef.current;
|
|
86
|
+
if (!enabled || !list) return;
|
|
87
|
+
const body = list.closest("[data-gloom-role=pane-window], [data-gloom-role=detached-pane-window]")
|
|
88
|
+
?.querySelector<HTMLElement>(":scope > [data-gloom-role=pane-body]");
|
|
89
|
+
if (!body) return;
|
|
90
|
+
|
|
91
|
+
let timer: ReturnType<typeof setTimeout> | null = null;
|
|
92
|
+
const measure = () => {
|
|
93
|
+
if (timer != null) clearTimeout(timer);
|
|
94
|
+
timer = null;
|
|
95
|
+
const active = list.querySelector<HTMLElement>("[data-active=true]");
|
|
96
|
+
if (!active) return;
|
|
97
|
+
const rect = active.getBoundingClientRect();
|
|
98
|
+
const color = measureTopSurface(body, rect.left + rect.width / 2);
|
|
99
|
+
if (color === (list.style.getPropertyValue(ACTIVE_BG) || null)) return;
|
|
100
|
+
if (color) list.style.setProperty(ACTIVE_BG, color);
|
|
101
|
+
else list.style.removeProperty(ACTIVE_BG);
|
|
102
|
+
};
|
|
103
|
+
const schedule = () => {
|
|
104
|
+
if (timer == null) timer = setTimeout(measure, THROTTLE_MS);
|
|
105
|
+
};
|
|
106
|
+
const settle = () => {
|
|
107
|
+
if (timer != null) clearTimeout(timer);
|
|
108
|
+
timer = setTimeout(measure, THROTTLE_MS);
|
|
109
|
+
};
|
|
110
|
+
measure();
|
|
111
|
+
const resize = new ResizeObserver(settle);
|
|
112
|
+
resize.observe(body);
|
|
113
|
+
// Live data rewrites text constantly; only structure and inline styles
|
|
114
|
+
// (visibility, focus colours, theme) can change what sits under the tab.
|
|
115
|
+
const mutations = new MutationObserver((records) => {
|
|
116
|
+
if (records.some((record) => record.target === body)) measure();
|
|
117
|
+
else schedule();
|
|
118
|
+
});
|
|
119
|
+
mutations.observe(body, { subtree: true, childList: true, attributes: true, attributeFilter: ["style", "data-gloom-top-surface"] });
|
|
120
|
+
return () => {
|
|
121
|
+
if (timer != null) clearTimeout(timer);
|
|
122
|
+
resize.disconnect();
|
|
123
|
+
mutations.disconnect();
|
|
124
|
+
};
|
|
125
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
126
|
+
}, [enabled, ...deps]);
|
|
127
|
+
}
|
|
@@ -507,6 +507,45 @@ button, [data-gloom-interactive="true"] { cursor: pointer; }
|
|
|
507
507
|
[data-gloom-role="tab-button"][data-active="true"]::after { opacity: 1; }
|
|
508
508
|
[data-gloom-role="tab-button"]:disabled { color: var(--gloom-text-muted); cursor: default; }
|
|
509
509
|
[data-gloom-role="tab-button"]:focus-visible { outline: none; }
|
|
510
|
+
/* Title-bar tabs: the same text, sizes and colours, drawn as raised boxes
|
|
511
|
+
instead of underlines. The active tab is a box with rounded top corners,
|
|
512
|
+
open at the bottom: its top and sides in the header rule's colour (the
|
|
513
|
+
accent while the pane is focused), its fill the surface under it, laid over
|
|
514
|
+
the rule so it opens into the pane. An inactive tab takes the hover fill in
|
|
515
|
+
the same shape. The pane header sets the colours (pane/header.tsx). */
|
|
516
|
+
[data-gloom-role="tab-list"][data-gloom-variant="header"] {
|
|
517
|
+
/* Header colour left above a box, and the box's line: the header rule's width. */
|
|
518
|
+
--pane-tab-top-gap: 2px;
|
|
519
|
+
--pane-tab-rule: 1px;
|
|
520
|
+
}
|
|
521
|
+
[data-gloom-role="tab-list"][data-gloom-variant="header"] > [data-gloom-role="tab-button"] {
|
|
522
|
+
height: calc(100% - var(--pane-tab-top-gap));
|
|
523
|
+
/* The sides take their line from the padding, so a label sits where it
|
|
524
|
+
would without the box. The gap and the top line push the label down; the
|
|
525
|
+
bottom padding lifts it back onto the header's centre line, halfway
|
|
526
|
+
between its top rule (a divider or a floating border, when there is one)
|
|
527
|
+
and its bottom rule, where the title sits. */
|
|
528
|
+
padding: 0 calc(var(--gloom-space-sm) - var(--pane-tab-rule)) calc(var(--pane-tab-top-gap) + 2 * var(--pane-tab-rule) - var(--pane-tab-top-inset, 0px));
|
|
529
|
+
border: var(--pane-tab-rule) solid transparent;
|
|
530
|
+
border-bottom: 0;
|
|
531
|
+
border-radius: var(--gloom-radius-md) var(--gloom-radius-md) 0 0;
|
|
532
|
+
/* The line lies on the bar, as the rule does, so a translucent hairline is
|
|
533
|
+
the same colour on both. */
|
|
534
|
+
background-clip: padding-box;
|
|
535
|
+
}
|
|
536
|
+
[data-gloom-role="tab-list"][data-gloom-variant="header"] > [data-gloom-role="tab-button"]::after { content: none; }
|
|
537
|
+
[data-gloom-role="tab-list"][data-gloom-variant="header"] > [data-gloom-role="tab-button"][data-active="true"] {
|
|
538
|
+
background-color: var(--pane-tab-active-bg, var(--gloom-bg));
|
|
539
|
+
border-color: var(--pane-tab-border, var(--gloom-hairline));
|
|
540
|
+
}
|
|
541
|
+
[data-gloom-role="tab-list"][data-gloom-variant="header"] > [data-gloom-role="tab-button"]:not([data-active="true"]):not(:disabled):is(:hover, :focus-visible, [data-drag-target="true"]) {
|
|
542
|
+
background-color: var(--gloom-hover-fill);
|
|
543
|
+
}
|
|
544
|
+
/* A tab's close mark stays inside the box: in a 20px title bar the box is
|
|
545
|
+
shorter than the icon button, whose fill would cover the box's top line. */
|
|
546
|
+
[data-gloom-role="tab-list"][data-gloom-variant="header"] [data-gloom-role="tab-close"] {
|
|
547
|
+
max-height: 100%;
|
|
548
|
+
}
|
|
510
549
|
/* A tab's close mark and a strip's plus are the icon button: 20 by 18, the control radius, the hover fill. */
|
|
511
550
|
[data-gloom-role="tab-add"] {
|
|
512
551
|
border: 0;
|
|
@@ -597,6 +636,30 @@ button, [data-gloom-interactive="true"] { cursor: pointer; }
|
|
|
597
636
|
border-bottom: 1px solid currentColor;
|
|
598
637
|
opacity: .7;
|
|
599
638
|
}
|
|
639
|
+
/* Controls a surface shows only while the pointer is over it or the keyboard
|
|
640
|
+
is in it (a chart legend's fold, its tool bar's), so at rest it draws as it
|
|
641
|
+
always has. */
|
|
642
|
+
[data-gloom-reveal-scope]:not(:hover):not(:focus-within) [data-gloom-reveal="hover"] {
|
|
643
|
+
display: none !important;
|
|
644
|
+
}
|
|
645
|
+
/* The line between two chart panels: drawn while the pointer is on it or
|
|
646
|
+
drags it, in the accent a pane sidebar's divider takes. */
|
|
647
|
+
[data-gloom-role="composite-chart-panel-divider"] {
|
|
648
|
+
cursor: row-resize;
|
|
649
|
+
}
|
|
650
|
+
[data-gloom-role="composite-chart-panel-divider"]::before {
|
|
651
|
+
content: "";
|
|
652
|
+
position: absolute;
|
|
653
|
+
left: 0;
|
|
654
|
+
right: 0;
|
|
655
|
+
top: 50%;
|
|
656
|
+
height: 1px;
|
|
657
|
+
background: var(--gloom-accent);
|
|
658
|
+
opacity: 0;
|
|
659
|
+
}
|
|
660
|
+
[data-gloom-role="composite-chart-panel-divider"]:is(:hover, [data-active="true"])::before {
|
|
661
|
+
opacity: 1;
|
|
662
|
+
}
|
|
600
663
|
[data-gloom-role="dock-divider"] {
|
|
601
664
|
background: transparent !important;
|
|
602
665
|
}
|
|
@@ -624,6 +687,58 @@ button, [data-gloom-interactive="true"] { cursor: pointer; }
|
|
|
624
687
|
top: 50%;
|
|
625
688
|
height: 1px;
|
|
626
689
|
}
|
|
690
|
+
/* The frame a launch draws before the app is up (boot-frame.ts): the last
|
|
691
|
+
layout's chrome with empty panes, or the bare header and status bar. It
|
|
692
|
+
covers the app until the app has drawn its own layout. The page sets the
|
|
693
|
+
theme's colours before drawing it, so it needs no fallbacks. */
|
|
694
|
+
#gloom-boot-frame {
|
|
695
|
+
position: fixed;
|
|
696
|
+
inset: 0;
|
|
697
|
+
z-index: 2147483000;
|
|
698
|
+
overflow: hidden;
|
|
699
|
+
pointer-events: none;
|
|
700
|
+
background: var(--gloom-bg);
|
|
701
|
+
}
|
|
702
|
+
#gloom-boot-frame[data-gloom-boot-frame="layout"] > * { height: 100%; min-height: 100%; }
|
|
703
|
+
#gloom-boot-frame [data-gloom-role="pane-body"] { position: relative; }
|
|
704
|
+
/* Lines of text still to come, faint enough to read as the pane's shape:
|
|
705
|
+
one bar every line of text (lh), half a line thick. */
|
|
706
|
+
#gloom-boot-frame [data-gloom-role="pane-body"]::before {
|
|
707
|
+
content: "";
|
|
708
|
+
position: absolute;
|
|
709
|
+
inset: var(--gloom-space-sm) var(--gloom-inset);
|
|
710
|
+
background: repeating-linear-gradient(
|
|
711
|
+
to bottom,
|
|
712
|
+
color-mix(in srgb, var(--gloom-text-muted) 10%, transparent) 0 0.5lh,
|
|
713
|
+
transparent 0.5lh 1lh
|
|
714
|
+
);
|
|
715
|
+
-webkit-mask-image: linear-gradient(to right, var(--gloom-bg) 40%, transparent 80%), linear-gradient(to bottom, var(--gloom-bg) 30%, transparent 90%);
|
|
716
|
+
-webkit-mask-composite: source-in;
|
|
717
|
+
mask-image: linear-gradient(to right, var(--gloom-bg) 40%, transparent 80%), linear-gradient(to bottom, var(--gloom-bg) 30%, transparent 90%);
|
|
718
|
+
mask-composite: intersect;
|
|
719
|
+
}
|
|
720
|
+
/* Where the app draws its own: the app's column runs a hairline taller than
|
|
721
|
+
the window and sits scrolled by it, so its header shows one pixel short and
|
|
722
|
+
its status bar ends a pixel above the bottom. The shell sits the same, and
|
|
723
|
+
nothing moves when the app takes over. */
|
|
724
|
+
.gloom-boot-header, .gloom-boot-status {
|
|
725
|
+
position: absolute;
|
|
726
|
+
left: 0;
|
|
727
|
+
right: 0;
|
|
728
|
+
}
|
|
729
|
+
/* Every desktop and web window draws its header as the title bar. */
|
|
730
|
+
.gloom-boot-header {
|
|
731
|
+
top: -1px;
|
|
732
|
+
height: __TITLEBAR_OVERLAY_HEIGHT_PX__px;
|
|
733
|
+
background: var(--gloom-header);
|
|
734
|
+
}
|
|
735
|
+
/* One line of text tall, as the status bar is, its hairline inside it. */
|
|
736
|
+
.gloom-boot-status {
|
|
737
|
+
bottom: 1px;
|
|
738
|
+
box-shadow: inset 0 1px 0 var(--gloom-hairline);
|
|
739
|
+
background: var(--gloom-panel);
|
|
740
|
+
}
|
|
741
|
+
.gloom-boot-status::before { content: "\200b"; }
|
|
627
742
|
.gloom-loading, .gloom-fatal {
|
|
628
743
|
padding: 24px;
|
|
629
744
|
color: var(--gloom-text, #f2f2f2);
|
|
@@ -9,6 +9,7 @@ import { WebBox } from "./host/box";
|
|
|
9
9
|
import { WebText, WebSpan } from "./host/text";
|
|
10
10
|
import { WebScrollBox } from "./host/scroll-box";
|
|
11
11
|
import { WebInput } from "./host/input";
|
|
12
|
+
import { WebImageSurface } from "./host/image-surface";
|
|
12
13
|
import { WebButton, WebTextField } from "./desktop/controls";
|
|
13
14
|
import { noopRendererHost } from "../../test-support/renderer-host";
|
|
14
15
|
|
|
@@ -19,7 +20,7 @@ function createUi(capabilities: UiHost["capabilities"]): UiHost {
|
|
|
19
20
|
kind: "desktop-web",
|
|
20
21
|
capabilities: { ...BASE_CAPABILITIES, ...capabilities },
|
|
21
22
|
Box: WebBox, Text: WebText, Span: WebSpan, ScrollBox: WebScrollBox,
|
|
22
|
-
Button: WebButton, Input: WebInput, TextField: WebTextField,
|
|
23
|
+
Button: WebButton, Input: WebInput, TextField: WebTextField, ImageSurface: WebImageSurface,
|
|
23
24
|
SpinnerMark: () => null,
|
|
24
25
|
} as unknown as UiHost;
|
|
25
26
|
}
|
|
@@ -32,7 +32,7 @@ function buildApplicationMenu(keybindings: ResolvedKeybindings): ApplicationMenu
|
|
|
32
32
|
const accelerator = (actionId: string) => ({ accelerator: menuAcceleratorFor(keybindings, actionId) });
|
|
33
33
|
return [
|
|
34
34
|
{
|
|
35
|
-
label: "
|
|
35
|
+
label: "Gloom",
|
|
36
36
|
submenu: [
|
|
37
37
|
{ role: "about" },
|
|
38
38
|
{ type: "divider" },
|
|
@@ -43,7 +43,7 @@ function buildApplicationMenu(keybindings: ResolvedKeybindings): ApplicationMenu
|
|
|
43
43
|
{ role: "hideOthers" },
|
|
44
44
|
{ role: "showAll" },
|
|
45
45
|
{ type: "divider" },
|
|
46
|
-
commandItem("Quit
|
|
46
|
+
commandItem("Quit Gloom", { type: "quit" }, { accelerator: "CmdOrCtrl+Q" }),
|
|
47
47
|
],
|
|
48
48
|
},
|
|
49
49
|
{
|
|
@@ -122,7 +122,7 @@ function buildApplicationMenu(keybindings: ResolvedKeybindings): ApplicationMenu
|
|
|
122
122
|
{
|
|
123
123
|
label: "Help",
|
|
124
124
|
submenu: [
|
|
125
|
-
openCommandBar("
|
|
125
|
+
openCommandBar("Gloom Help", "HELP"),
|
|
126
126
|
commandItem("Open Issue on GitHub", { type: "open-url", url: GITHUB_ISSUE_URL }),
|
|
127
127
|
],
|
|
128
128
|
},
|
|
@@ -8,6 +8,7 @@ import type { AppServices } from "../../../core/app-services";
|
|
|
8
8
|
import { diskNotesFilesIO, isNotesFile } from "../../../plugins/builtin/notes/files";
|
|
9
9
|
import type { BrokerAdapter } from "../../../types/broker";
|
|
10
10
|
import type { AppConfig, BrokerInstanceConfig } from "../../../types/config";
|
|
11
|
+
import { errorMessage } from "../../../utils/errors";
|
|
11
12
|
|
|
12
13
|
const DESKTOP_CORE_PLUGIN_ID = "desktop-core";
|
|
13
14
|
|
|
@@ -221,7 +222,14 @@ function createNotesFilesCapability(): PluginCapability {
|
|
|
221
222
|
await io(input).delete(file(input));
|
|
222
223
|
return null;
|
|
223
224
|
}, "action"),
|
|
224
|
-
listKeys: op((input: any) =>
|
|
225
|
+
listKeys: op(async (input: any) => {
|
|
226
|
+
const skipped: Array<{ key: string; reason: string }> = [];
|
|
227
|
+
const keys = await io(input).listKeys({
|
|
228
|
+
strict: input.strict === true,
|
|
229
|
+
...(input.reportSkipped === true ? { skipped: (key: string, error: unknown) => skipped.push({ key, reason: errorMessage(error) }) } : {}),
|
|
230
|
+
});
|
|
231
|
+
return input.reportSkipped === true ? { keys, skipped } : keys;
|
|
232
|
+
}),
|
|
225
233
|
},
|
|
226
234
|
};
|
|
227
235
|
}
|