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.
Files changed (954) hide show
  1. package/README.md +8 -8
  2. package/README.zh-CN.md +11 -11
  3. package/bin/{gloomberb → gloom} +3 -1
  4. package/package.json +6 -2
  5. package/patches/electrobun@1.18.1.patch +106 -5
  6. package/src/account/checkout-handoff.tsx +225 -0
  7. package/src/account/device-signin-dialog.tsx +2 -2
  8. package/src/account/device-signin.ts +2 -2
  9. package/src/account/upgrade-dialog.tsx +1 -1
  10. package/src/api-client/askg.ts +2 -2
  11. package/src/api-client/auth.ts +2 -2
  12. package/src/api-client/central-bank-rates.ts +6 -0
  13. package/src/api-client/collections.ts +5 -1
  14. package/src/api-client/cot.ts +2 -0
  15. package/src/api-client/crypto-etf-flows.ts +37 -0
  16. package/src/api-client/crypto-markets.ts +60 -0
  17. package/src/api-client/data.ts +99 -5
  18. package/src/api-client/doe.ts +15 -0
  19. package/src/api-client/equity-screener.ts +28 -0
  20. package/src/api-client/exchange-announcements.ts +38 -0
  21. package/src/api-client/fund-facts.ts +39 -0
  22. package/src/api-client/futures-curve.ts +9 -1
  23. package/src/api-client/hiring.ts +301 -0
  24. package/src/api-client/index.ts +24 -5
  25. package/src/api-client/market-discovery.ts +14 -0
  26. package/src/api-client/members.ts +6 -0
  27. package/src/api-client/mna.ts +6 -0
  28. package/src/api-client/paths.ts +18 -1
  29. package/src/api-client/request.ts +26 -7
  30. package/src/api-client/short-side-publications.ts +37 -0
  31. package/src/api-client/socket.ts +64 -4
  32. package/src/api-client/swap-curve.ts +35 -0
  33. package/src/api-client/telemetry.ts +17 -0
  34. package/src/api-client/themes.ts +7 -1
  35. package/src/api-client/types.ts +90 -2
  36. package/src/app/global-shortcuts.ts +1 -16
  37. package/src/app/pane-runtime/plugin-bindings.ts +9 -2
  38. package/src/app/runtime/desktop-deeplink.ts +5 -5
  39. package/src/app/runtime/plugin-bindings.ts +2 -2
  40. package/src/app/runtime/startup.ts +13 -0
  41. package/src/app/runtime/update.ts +28 -8
  42. package/src/app/star-prompt/status-line.tsx +2 -2
  43. package/src/architecture/core-builtin-allowlist.json +5 -2
  44. package/src/architecture/pane-tabs-allowlist.json +65 -0
  45. package/src/architecture/ui-literals-allowlist.json +3 -3
  46. package/src/architecture/ui-tokens-allowlist.json +1 -1
  47. package/src/brokers/broker-portfolio-sync.ts +37 -0
  48. package/src/brokers/directory.ts +11 -0
  49. package/src/brokers/logos.ts +3 -1
  50. package/src/brokers/signed-in/adapter.ts +304 -26
  51. package/src/brokers/signed-in/client.ts +14 -2
  52. package/src/brokers/signed-in/connect.ts +10 -2
  53. package/src/brokers/sync-broker-instance.ts +9 -1
  54. package/src/capabilities/chart-series.ts +22 -6
  55. package/src/cli/bank-section.ts +1 -1
  56. package/src/cli/base-converter.ts +23 -14
  57. package/src/cli/central-bank-events.ts +1 -1
  58. package/src/cli/command-options.ts +59 -4
  59. package/src/cli/commands/api.ts +9 -6
  60. package/src/cli/commands/broker.ts +2 -2
  61. package/src/cli/commands/command-utils.ts +2 -2
  62. package/src/cli/commands/crypto-hints.ts +7 -20
  63. package/src/cli/commands/fred-series.ts +4 -2
  64. package/src/cli/commands/keybindings.ts +2 -2
  65. package/src/cli/commands/market.ts +1189 -296
  66. package/src/cli/commands/news-hints.ts +2 -2
  67. package/src/cli/commands/news-search.ts +59 -6
  68. package/src/cli/commands/options-leaps.ts +41 -26
  69. package/src/cli/commands/overview.ts +121 -48
  70. package/src/cli/commands/plugins.ts +9 -9
  71. package/src/cli/commands/remote.ts +13 -10
  72. package/src/cli/commands/search.ts +64 -44
  73. package/src/cli/commands/system.ts +27 -19
  74. package/src/cli/commands/themes.ts +1 -1
  75. package/src/cli/commands/ticker.ts +272 -70
  76. package/src/cli/context.ts +3 -2
  77. package/src/cli/desktop-pane-shot-view.ts +2 -2
  78. package/src/cli/desktop-pane-shot.ts +1 -1
  79. package/src/cli/earnings-calendar.ts +4 -4
  80. package/src/cli/entry.ts +18 -1
  81. package/src/cli/errors.ts +20 -2
  82. package/src/cli/exit-codes.ts +1 -1
  83. package/src/cli/export-source.ts +10 -4
  84. package/src/cli/freshness.ts +2 -8
  85. package/src/cli/fx-forward.ts +130 -0
  86. package/src/cli/fx-pair.ts +10 -9
  87. package/src/cli/glossary.ts +64 -20
  88. package/src/cli/help.ts +20 -14
  89. package/src/cli/history-export.ts +126 -0
  90. package/src/cli/history-rows.ts +196 -43
  91. package/src/cli/index-roots.ts +5 -45
  92. package/src/cli/index.ts +32 -18
  93. package/src/cli/issuer-membership.ts +103 -0
  94. package/src/cli/known-gaps.ts +118 -25
  95. package/src/cli/listing-arg.ts +315 -43
  96. package/src/cli/name-entries.ts +73 -22
  97. package/src/cli/native-smoke.ts +2 -0
  98. package/src/cli/not-a-ticker.ts +19 -9
  99. package/src/cli/opentui-libc.ts +5 -0
  100. package/src/cli/options.ts +12 -0
  101. package/src/cli/pane-functions/capabilities.ts +77 -20
  102. package/src/cli/pane-functions/catalog.ts +40 -23
  103. package/src/cli/pane-functions/discovery.ts +1 -1
  104. package/src/cli/pane-functions/dom.ts +12 -8
  105. package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
  106. package/src/cli/pane-functions/freshness.ts +174 -23
  107. package/src/cli/pane-functions/function-help.ts +66 -27
  108. package/src/cli/pane-functions/headless.ts +48 -16
  109. package/src/cli/pane-functions/index.ts +82 -21
  110. package/src/cli/pane-functions/options.ts +22 -2
  111. package/src/cli/pane-functions/report-notices.ts +12 -4
  112. package/src/cli/pane-functions/report.ts +5 -5
  113. package/src/cli/pane-functions/resolver.ts +65 -14
  114. package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
  115. package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
  116. package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
  117. package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
  118. package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
  119. package/src/cli/pane-functions/screenshot-payload.ts +453 -0
  120. package/src/cli/pane-functions/screenshot-render.ts +316 -0
  121. package/src/cli/pane-functions/screenshot-types.ts +162 -0
  122. package/src/cli/pane-functions/shot-options.ts +8 -3
  123. package/src/cli/peso-dollar-rates.ts +79 -0
  124. package/src/cli/quote-answer.ts +38 -3
  125. package/src/cli/report-tables.ts +190 -27
  126. package/src/cli/restore-plugins.ts +29 -14
  127. package/src/cli/result.ts +122 -25
  128. package/src/cli/series-search.ts +5 -5
  129. package/src/cli/statement-filings.ts +19 -0
  130. package/src/cli/suffixed-listing-rows.ts +49 -0
  131. package/src/cli/symbol-args.ts +50 -15
  132. package/src/cli/symbol-cells.ts +120 -0
  133. package/src/cli/symbol-list.ts +226 -60
  134. package/src/cli/symbol-rows.ts +131 -25
  135. package/src/cli/ticker-resolution.ts +108 -11
  136. package/src/cli/treasury-yields.ts +5 -5
  137. package/src/cli/types.ts +2 -0
  138. package/src/cli/uncovered-instrument.ts +3 -3
  139. package/src/cli/unknown-command.ts +6 -6
  140. package/src/components/chart/composite/chart-layout.ts +131 -0
  141. package/src/components/chart/composite/composite-chart.tsx +387 -21
  142. package/src/components/chart/composite/drawing-store.ts +26 -6
  143. package/src/components/chart/composite/interactions.ts +9 -3
  144. package/src/components/chart/composite/legend.tsx +75 -3
  145. package/src/components/chart/composite/levels.ts +5 -0
  146. package/src/components/chart/composite/panel-gestures.ts +41 -0
  147. package/src/components/chart/composite/panel-labels.ts +2 -1
  148. package/src/components/chart/composite/panel-surface.tsx +316 -11
  149. package/src/components/chart/composite/price-axis-labels.tsx +27 -3
  150. package/src/components/chart/composite/rasterizer.ts +44 -19
  151. package/src/components/chart/composite/scene.ts +16 -4
  152. package/src/components/chart/composite/text-renderer.ts +48 -21
  153. package/src/components/chart/composite/toolbar.tsx +52 -5
  154. package/src/components/chart/composite/types.ts +19 -0
  155. package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
  156. package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
  157. package/src/components/chart/composite/use-composite-viewport.ts +12 -3
  158. package/src/components/chart/composite/value-scale.ts +149 -0
  159. package/src/components/chart/composite/volume-profile-paint.ts +6 -3
  160. package/src/components/chart/core/pointer.ts +2 -0
  161. package/src/components/chart-table/index.ts +2 -0
  162. package/src/components/chart-table/read.tsx +74 -0
  163. package/src/components/command-bar/commands/collection-list.ts +41 -19
  164. package/src/components/command-bar/commands/collection.ts +9 -3
  165. package/src/components/command-bar/commands/direct/index.ts +1 -1
  166. package/src/components/command-bar/commands/direct/runtime.ts +3 -2
  167. package/src/components/command-bar/pane-templates/items.ts +59 -6
  168. package/src/components/command-bar/pane-templates/workflow.ts +10 -1
  169. package/src/components/command-bar/routes/root/command-items.ts +32 -6
  170. package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
  171. package/src/components/command-bar/routes/root/provider-search.ts +42 -11
  172. package/src/components/command-bar/routes/root/results.ts +18 -4
  173. package/src/components/command-bar/routes/root/runtime.ts +15 -3
  174. package/src/components/command-bar/routes/root/search-providers.ts +25 -2
  175. package/src/components/command-bar/routes/root/selection.ts +6 -1
  176. package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
  177. package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
  178. package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
  179. package/src/components/command-bar/selection-runtime.ts +50 -10
  180. package/src/components/command-bar/surface/index.tsx +24 -2
  181. package/src/components/command-bar/view-model.ts +7 -0
  182. package/src/components/command-bar/workflow/broker.ts +2 -2
  183. package/src/components/command-bar/workflow/collection-actions.ts +46 -7
  184. package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
  185. package/src/components/command-bar/workflow/fields.ts +8 -2
  186. package/src/components/command-bar/workflow/ops.ts +18 -4
  187. package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
  188. package/src/components/command-bar/workflow/submit.ts +3 -2
  189. package/src/components/command-bar/workflow/tickers.ts +5 -1
  190. package/src/components/company-logo.tsx +39 -0
  191. package/src/components/data-table/sections.ts +4 -2
  192. package/src/components/data-table/view.tsx +23 -3
  193. package/src/components/form-modal/confirm.tsx +2 -1
  194. package/src/components/form-modal/request.ts +5 -0
  195. package/src/components/form-modal/routes.ts +4 -1
  196. package/src/components/index.ts +13 -6
  197. package/src/components/layout/detached-pane-shell.tsx +1 -0
  198. package/src/components/layout/floating-pane.tsx +1 -0
  199. package/src/components/layout/header.tsx +234 -60
  200. package/src/components/layout/market-summary.ts +9 -6
  201. package/src/components/layout/pane/capture-status.ts +1 -1
  202. package/src/components/layout/pane/footer/model.ts +11 -5
  203. package/src/components/layout/pane/header.tsx +10 -3
  204. package/src/components/layout/pane/index.tsx +1 -0
  205. package/src/components/layout/pane/pane-tabs.tsx +9 -1
  206. package/src/components/layout/shell/chrome.ts +19 -6
  207. package/src/components/layout/shell/index.tsx +2 -1
  208. package/src/components/layout/shell/pane/layers.tsx +19 -1
  209. package/src/components/layout/status-bar.tsx +2 -2
  210. package/src/components/market-board/index.tsx +11 -3
  211. package/src/components/onboarding/onboarding-wizard.tsx +1 -0
  212. package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
  213. package/src/components/onboarding/wizard-broker-sync.ts +4 -1
  214. package/src/components/pane-settings-dialog/desktop.tsx +20 -7
  215. package/src/components/pane-settings-dialog/tui.tsx +17 -9
  216. package/src/components/pane-settings-dialog/value.ts +8 -1
  217. package/src/components/pane-settings-dialog.tsx +44 -13
  218. package/src/components/sign-in-code-panel.tsx +27 -19
  219. package/src/components/ui/column-grid.tsx +48 -4
  220. package/src/components/ui/country-flag-art.tsx +180 -0
  221. package/src/components/ui/country-flag.tsx +118 -12
  222. package/src/components/ui/data-table/opentui/index.tsx +61 -2
  223. package/src/components/ui/data-table/opentui/model.ts +109 -2
  224. package/src/components/ui/data-table/types.ts +1 -1
  225. package/src/components/ui/display.tsx +5 -1
  226. package/src/components/ui/index.ts +3 -1
  227. package/src/components/ui/logo-mark.tsx +11 -2
  228. package/src/components/ui/query-bar.tsx +1 -1
  229. package/src/components/ui/row-notes.ts +79 -0
  230. package/src/components/ui/stat-grid.tsx +28 -3
  231. package/src/components/ui/status.tsx +3 -1
  232. package/src/core/app-services.ts +4 -0
  233. package/src/core/state/app/layout.ts +4 -4
  234. package/src/data/cached-query.ts +8 -1
  235. package/src/data/config/chart-settings.ts +3 -3
  236. package/src/data/config/home.ts +10 -2
  237. package/src/data/config/layout.ts +4 -1
  238. package/src/data/config/store/node.ts +4 -0
  239. package/src/data/config/store/normalize.ts +13 -3
  240. package/src/data/config/store/portfolio-as-of-column.ts +2 -2
  241. package/src/data/json-storage.ts +2 -0
  242. package/src/data/saved-copies.ts +84 -0
  243. package/src/docs/snapshot.json +65 -32
  244. package/src/i18n/es.ts +51 -12
  245. package/src/i18n/ja.ts +51 -12
  246. package/src/i18n/ko.ts +51 -12
  247. package/src/i18n/zh-cn.ts +51 -12
  248. package/src/i18n/zh-tw.ts +51 -12
  249. package/src/layout/desks.ts +1 -1
  250. package/src/layout/launch-layout.ts +1 -1
  251. package/src/layout/pane-manager/floating-actions.ts +5 -3
  252. package/src/layout/pane-manager/floating.ts +43 -1
  253. package/src/layout/pane-manager/index.ts +2 -0
  254. package/src/layout/selected-ticker.ts +74 -0
  255. package/src/market-data/depositary-pair.ts +251 -0
  256. package/src/market-data/futures-board.ts +1 -1
  257. package/src/market-data/futures-contract.ts +124 -40
  258. package/src/market-data/fx-closes.ts +17 -2
  259. package/src/market-data/hooks.tsx +19 -11
  260. package/src/market-data/market/change-basis.ts +49 -7
  261. package/src/market-data/market/freshness.ts +34 -5
  262. package/src/market-data/market/period-return.ts +163 -0
  263. package/src/market-data/market/trading-sessions.ts +13 -0
  264. package/src/market-data/market/year-to-date.ts +8 -13
  265. package/src/market-data/performance.ts +20 -14
  266. package/src/market-data/perpetual-premium.ts +32 -0
  267. package/src/market-data/published-apac-sessions.ts +2 -1
  268. package/src/market-data/published-futures-sessions.ts +69 -0
  269. package/src/market-data/quotes/contributions.ts +5 -1
  270. package/src/market-data/quotes/freshness.ts +42 -0
  271. package/src/market-data/quotes/intraday-bar.ts +37 -0
  272. package/src/market-data/quotes/regular-session-valuation.ts +13 -8
  273. package/src/market-data/quotes/resolution.ts +4 -2
  274. package/src/market-data/tax-equivalent.ts +1 -1
  275. package/src/market-data/ticker-price-returns.ts +3 -1
  276. package/src/news/aggregator.ts +5 -1
  277. package/src/news/news-model.ts +4 -0
  278. package/src/news/types.ts +11 -0
  279. package/src/notifications/app-notifier.ts +1 -1
  280. package/src/plugins/auto-update.ts +2 -2
  281. package/src/plugins/builtin/account-management/index.tsx +1 -0
  282. package/src/plugins/builtin/account-management/pane.tsx +9 -8
  283. package/src/plugins/builtin/alerts/alert-engine.ts +30 -18
  284. package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
  285. package/src/plugins/builtin/alerts/cli.ts +485 -76
  286. package/src/plugins/builtin/alerts/command.ts +5 -10
  287. package/src/plugins/builtin/alerts/event-rows.ts +9 -5
  288. package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
  289. package/src/plugins/builtin/alerts/events.ts +108 -5
  290. package/src/plugins/builtin/alerts/fired-log.ts +78 -0
  291. package/src/plugins/builtin/alerts/format.ts +2 -1
  292. package/src/plugins/builtin/alerts/headless.ts +100 -39
  293. package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
  294. package/src/plugins/builtin/alerts/history-rows.ts +89 -0
  295. package/src/plugins/builtin/alerts/index.tsx +45 -18
  296. package/src/plugins/builtin/alerts/iv-level.ts +365 -0
  297. package/src/plugins/builtin/alerts/levels.ts +3 -3
  298. package/src/plugins/builtin/alerts/pane.tsx +97 -29
  299. package/src/plugins/builtin/alerts/price.ts +35 -0
  300. package/src/plugins/builtin/alerts/quotes.ts +24 -0
  301. package/src/plugins/builtin/alerts/research-builder.ts +84 -11
  302. package/src/plugins/builtin/alerts/research-rules.ts +77 -3
  303. package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
  304. package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
  305. package/src/plugins/builtin/alerts/scheduled.ts +188 -29
  306. package/src/plugins/builtin/alerts/storage.ts +13 -10
  307. package/src/plugins/builtin/alerts/targets.ts +12 -3
  308. package/src/plugins/builtin/analytics/index.tsx +8 -2
  309. package/src/plugins/builtin/analytics/metrics.ts +1 -1
  310. package/src/plugins/builtin/analytics/risk-book.ts +215 -0
  311. package/src/plugins/builtin/analytics/risk-client.ts +13 -6
  312. package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
  313. package/src/plugins/builtin/analytics/risk-math.ts +6 -3
  314. package/src/plugins/builtin/analytics/risk-model.ts +297 -104
  315. package/src/plugins/builtin/analytics/risk-options.ts +17 -2
  316. package/src/plugins/builtin/analytics/risk-pane.tsx +107 -43
  317. package/src/plugins/builtin/attention/pane.tsx +22 -16
  318. package/src/plugins/builtin/awards/headless.ts +7 -3
  319. package/src/plugins/builtin/awards/model.ts +18 -0
  320. package/src/plugins/builtin/awards/pane.tsx +12 -9
  321. package/src/plugins/builtin/backtest/export.ts +1 -1
  322. package/src/plugins/builtin/backtest/headless.ts +3 -3
  323. package/src/plugins/builtin/backtest/rules.ts +41 -5
  324. package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
  325. package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
  326. package/src/plugins/builtin/broker-manager/footer.ts +27 -11
  327. package/src/plugins/builtin/broker-manager/index.tsx +21 -12
  328. package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
  329. package/src/plugins/builtin/broker-manager/model.ts +12 -2
  330. package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
  331. package/src/plugins/builtin/broker-manager/table.ts +28 -12
  332. package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
  333. package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
  334. package/src/plugins/builtin/broker-trading/controller.ts +45 -13
  335. package/src/plugins/builtin/broker-trading/dock.tsx +24 -4
  336. package/src/plugins/builtin/broker-trading/headless.ts +2 -1
  337. package/src/plugins/builtin/broker-trading/index.tsx +7 -1
  338. package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
  339. package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
  340. package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
  341. package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
  342. package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
  343. package/src/plugins/builtin/broker-trading/pane.tsx +115 -26
  344. package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
  345. package/src/plugins/builtin/broker-trading/ticket.tsx +122 -36
  346. package/src/plugins/builtin/buildout/cells.tsx +4 -0
  347. package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
  348. package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
  349. package/src/plugins/builtin/buildout/pane/index.tsx +34 -18
  350. package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
  351. package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
  352. package/src/plugins/builtin/catalysts/client.ts +2 -2
  353. package/src/plugins/builtin/catalysts/detail.tsx +3 -2
  354. package/src/plugins/builtin/catalysts/index.tsx +1 -1
  355. package/src/plugins/builtin/catalysts/model.ts +49 -4
  356. package/src/plugins/builtin/catalysts/pane.tsx +9 -11
  357. package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
  358. package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
  359. package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
  360. package/src/plugins/builtin/changelog/index.tsx +1 -0
  361. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
  362. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
  363. package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
  364. package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
  365. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
  366. package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
  367. package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
  368. package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
  369. package/src/plugins/builtin/chart-composer/headless.ts +253 -35
  370. package/src/plugins/builtin/chart-composer/index.tsx +12 -2
  371. package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
  372. package/src/plugins/builtin/chart-composer/pane.tsx +128 -28
  373. package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
  374. package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
  375. package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
  376. package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
  377. package/src/plugins/builtin/chart-composer/settings.ts +31 -19
  378. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
  379. package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
  380. package/src/plugins/builtin/chat/attachments/model.ts +3 -1
  381. package/src/plugins/builtin/chat/content/index.tsx +1 -1
  382. package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
  383. package/src/plugins/builtin/chat/people.ts +1 -1
  384. package/src/plugins/builtin/clinical-trials/client.ts +5 -2
  385. package/src/plugins/builtin/clinical-trials/model.ts +13 -4
  386. package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
  387. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
  388. package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
  389. package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
  390. package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
  391. package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
  392. package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
  393. package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
  394. package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
  395. package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
  396. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  397. package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
  398. package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
  399. package/src/plugins/builtin/commodity-balances/pane.tsx +14 -8
  400. package/src/plugins/builtin/company-attention/app-rank.tsx +11 -10
  401. package/src/plugins/builtin/company-attention/building-model.ts +222 -0
  402. package/src/plugins/builtin/company-attention/building.tsx +172 -0
  403. package/src/plugins/builtin/company-attention/client.ts +117 -1
  404. package/src/plugins/builtin/company-attention/evidence.ts +16 -3
  405. package/src/plugins/builtin/company-attention/headless.ts +101 -5
  406. package/src/plugins/builtin/company-attention/index.tsx +6 -3
  407. package/src/plugins/builtin/company-attention/model.ts +33 -7
  408. package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
  409. package/src/plugins/builtin/company-attention/moves.tsx +159 -0
  410. package/src/plugins/builtin/company-attention/pane.tsx +89 -31
  411. package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
  412. package/src/plugins/builtin/company-attention/signals.tsx +160 -0
  413. package/src/plugins/builtin/company-kpis/headless.ts +3 -2
  414. package/src/plugins/builtin/company-kpis/model.ts +2 -2
  415. package/src/plugins/builtin/company-kpis/pane.tsx +5 -4
  416. package/src/plugins/builtin/composite-plugins.ts +2 -1
  417. package/src/plugins/builtin/congress-trades/headless.ts +1 -1
  418. package/src/plugins/builtin/connections/index.ts +1 -0
  419. package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
  420. package/src/plugins/builtin/correlation/headless.ts +7 -4
  421. package/src/plugins/builtin/correlation/relationship/model.ts +1 -0
  422. package/src/plugins/builtin/correlation/settings.ts +1 -0
  423. package/src/plugins/builtin/cot/headless.ts +28 -6
  424. package/src/plugins/builtin/cot/model.ts +12 -0
  425. package/src/plugins/builtin/cot/pane.tsx +7 -5
  426. package/src/plugins/builtin/cpi/headless.ts +5 -1
  427. package/src/plugins/builtin/cpi/pane.tsx +11 -9
  428. package/src/plugins/builtin/credit-boards/model.ts +2 -0
  429. package/src/plugins/builtin/credit-documents/headless.ts +1 -1
  430. package/src/plugins/builtin/credit-documents/pane.tsx +8 -7
  431. package/src/plugins/builtin/crypto-board/client.ts +86 -0
  432. package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
  433. package/src/plugins/builtin/crypto-board/defi.ts +239 -0
  434. package/src/plugins/builtin/crypto-board/headless.ts +117 -6
  435. package/src/plugins/builtin/crypto-board/index.tsx +8 -3
  436. package/src/plugins/builtin/crypto-board/model.ts +40 -8
  437. package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
  438. package/src/plugins/builtin/crypto-board/series.ts +19 -1
  439. package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
  440. package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
  441. package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
  442. package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
  443. package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
  444. package/src/plugins/builtin/debt-maturities/pane.tsx +4 -3
  445. package/src/plugins/builtin/debug/index.tsx +1 -0
  446. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  447. package/src/plugins/builtin/docs/index.tsx +1 -1
  448. package/src/plugins/builtin/docs/pane.tsx +2 -2
  449. package/src/plugins/builtin/docs/targets.ts +1 -1
  450. package/src/plugins/builtin/doe/client.ts +5 -1
  451. package/src/plugins/builtin/doe/headless.ts +12 -6
  452. package/src/plugins/builtin/doe/model.ts +43 -6
  453. package/src/plugins/builtin/doe/pane.tsx +19 -12
  454. package/src/plugins/builtin/earnings/board-model.ts +13 -6
  455. package/src/plugins/builtin/earnings/board-table.ts +4 -1
  456. package/src/plugins/builtin/earnings/board.tsx +253 -50
  457. package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
  458. package/src/plugins/builtin/earnings/calendar.tsx +338 -0
  459. package/src/plugins/builtin/earnings/client.ts +4 -3
  460. package/src/plugins/builtin/earnings/headless.ts +53 -15
  461. package/src/plugins/builtin/earnings/history-model.ts +53 -36
  462. package/src/plugins/builtin/earnings/index.tsx +15 -22
  463. package/src/plugins/builtin/earnings/model.ts +17 -12
  464. package/src/plugins/builtin/earnings/scope.ts +89 -0
  465. package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
  466. package/src/plugins/builtin/earnings-calls/data.ts +146 -2
  467. package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
  468. package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
  469. package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
  470. package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
  471. package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
  472. package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
  473. package/src/plugins/builtin/econ/calendar-model.ts +132 -20
  474. package/src/plugins/builtin/econ/detail-view.tsx +48 -10
  475. package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
  476. package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
  477. package/src/plugins/builtin/econ/index.tsx +112 -25
  478. package/src/plugins/builtin/econ/print-watch.ts +2 -1
  479. package/src/plugins/builtin/econ/types.ts +32 -1
  480. package/src/plugins/builtin/econ-statistics/client.ts +16 -3
  481. package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
  482. package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
  483. package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
  484. package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
  485. package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
  486. package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
  487. package/src/plugins/builtin/econ-statistics/view.ts +16 -1
  488. package/src/plugins/builtin/equity-screener/client.ts +21 -3
  489. package/src/plugins/builtin/equity-screener/headless.ts +77 -5
  490. package/src/plugins/builtin/equity-screener/live.ts +1 -1
  491. package/src/plugins/builtin/equity-screener/model.ts +34 -0
  492. package/src/plugins/builtin/equity-screener/pane.tsx +148 -106
  493. package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
  494. package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
  495. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
  496. package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
  497. package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
  498. package/src/plugins/builtin/exposure/headless.ts +51 -6
  499. package/src/plugins/builtin/exposure/index.tsx +28 -2
  500. package/src/plugins/builtin/exposure/model.ts +7 -0
  501. package/src/plugins/builtin/exposure/pane.tsx +16 -10
  502. package/src/plugins/builtin/fear-greed/index.tsx +1 -1
  503. package/src/plugins/builtin/filing-events/index.tsx +1 -1
  504. package/src/plugins/builtin/futures/model.ts +10 -9
  505. package/src/plugins/builtin/futures/returns.ts +8 -36
  506. package/src/plugins/builtin/futures/table.tsx +1 -1
  507. package/src/plugins/builtin/futures-curve/client.ts +40 -9
  508. package/src/plugins/builtin/futures-curve/headless.ts +39 -17
  509. package/src/plugins/builtin/futures-curve/model.ts +258 -69
  510. package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
  511. package/src/plugins/builtin/fx-matrix/client.ts +15 -8
  512. package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
  513. package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
  514. package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
  515. package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
  516. package/src/plugins/builtin/gpu/board.tsx +4 -1
  517. package/src/plugins/builtin/gpu/changes.tsx +10 -10
  518. package/src/plugins/builtin/gpu/equities.tsx +4 -1
  519. package/src/plugins/builtin/gpu/headless.ts +9 -4
  520. package/src/plugins/builtin/gpu/history.tsx +4 -2
  521. package/src/plugins/builtin/gpu/pane.tsx +5 -3
  522. package/src/plugins/builtin/help/index.tsx +13 -3
  523. package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
  524. package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
  525. package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
  526. package/src/plugins/builtin/holders/client.ts +15 -2
  527. package/src/plugins/builtin/holders/format.ts +28 -17
  528. package/src/plugins/builtin/holders/headless.ts +48 -8
  529. package/src/plugins/builtin/holders/index-holders.ts +264 -0
  530. package/src/plugins/builtin/holders/pane.tsx +79 -15
  531. package/src/plugins/builtin/holders/report-rows.ts +35 -7
  532. package/src/plugins/builtin/holders/table-model.ts +2 -1
  533. package/src/plugins/builtin/holders/thirteenf-match.ts +3 -1
  534. package/src/plugins/builtin/holders/treemap.tsx +2 -2
  535. package/src/plugins/builtin/insider/base-values.ts +11 -7
  536. package/src/plugins/builtin/insider/client.ts +3 -0
  537. package/src/plugins/builtin/insider/headless.ts +20 -7
  538. package/src/plugins/builtin/insider/index.tsx +17 -8
  539. package/src/plugins/builtin/insider/issuer.ts +34 -4
  540. package/src/plugins/builtin/insider/signals-client.ts +3 -3
  541. package/src/plugins/builtin/insider/signals.tsx +1 -1
  542. package/src/plugins/builtin/insider/table-model.ts +35 -13
  543. package/src/plugins/builtin/insider/table.tsx +5 -2
  544. package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
  545. package/src/plugins/builtin/iv-history/client.ts +20 -0
  546. package/src/plugins/builtin/iv-history/events.ts +145 -0
  547. package/src/plugins/builtin/iv-history/format.ts +3 -0
  548. package/src/plugins/builtin/iv-history/headless.ts +91 -7
  549. package/src/plugins/builtin/iv-history/index.tsx +1 -1
  550. package/src/plugins/builtin/iv-history/model.ts +13 -4
  551. package/src/plugins/builtin/iv-history/series.ts +3 -1
  552. package/src/plugins/builtin/jobs/lock-note.ts +1 -1
  553. package/src/plugins/builtin/jobs/model.ts +4 -15
  554. package/src/plugins/builtin/jobs/pane.tsx +7 -5
  555. package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
  556. package/src/plugins/builtin/jodi/pane.tsx +14 -8
  557. package/src/plugins/builtin/layout-manager/index.tsx +1 -0
  558. package/src/plugins/builtin/macro-day/headless.ts +20 -7
  559. package/src/plugins/builtin/macro-day/index.tsx +3 -2
  560. package/src/plugins/builtin/macro-day/model.ts +29 -8
  561. package/src/plugins/builtin/macro-day/pane.tsx +46 -10
  562. package/src/plugins/builtin/macro-day/releases.ts +55 -13
  563. package/src/plugins/builtin/market-heatmap/data.ts +9 -2
  564. package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
  565. package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
  566. package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
  567. package/src/plugins/builtin/market-heatmap/model.ts +10 -7
  568. package/src/plugins/builtin/market-movers/client.ts +36 -21
  569. package/src/plugins/builtin/market-movers/headless.ts +8 -2
  570. package/src/plugins/builtin/market-movers/index.tsx +16 -10
  571. package/src/plugins/builtin/market-movers/screener.ts +33 -11
  572. package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
  573. package/src/plugins/builtin/market-movers/session-table.ts +4 -2
  574. package/src/plugins/builtin/market-movers/table.ts +4 -1
  575. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  576. package/src/plugins/builtin/market-valuation/view.ts +5 -0
  577. package/src/plugins/builtin/members/headless.ts +6 -5
  578. package/src/plugins/builtin/members/pane.tsx +11 -4
  579. package/src/plugins/builtin/mna/client.ts +1 -0
  580. package/src/plugins/builtin/mna/detail.tsx +20 -32
  581. package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
  582. package/src/plugins/builtin/mna/distress/model.ts +3 -2
  583. package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
  584. package/src/plugins/builtin/mna/headless.ts +6 -13
  585. package/src/plugins/builtin/mna/model.ts +93 -15
  586. package/src/plugins/builtin/mna/pane.tsx +5 -4
  587. package/src/plugins/builtin/news/headless.ts +12 -6
  588. package/src/plugins/builtin/news/index.tsx +10 -1
  589. package/src/plugins/builtin/news/wire/index.tsx +3 -2
  590. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
  591. package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
  592. package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
  593. package/src/plugins/builtin/notes/cli.ts +50 -15
  594. package/src/plugins/builtin/notes/export.ts +17 -6
  595. package/src/plugins/builtin/notes/files.ts +16 -5
  596. package/src/plugins/builtin/openfda/pane.tsx +1 -1
  597. package/src/plugins/builtin/options/carry.ts +2 -2
  598. package/src/plugins/builtin/options/enrichment-model.ts +10 -9
  599. package/src/plugins/builtin/options/index.tsx +1 -1
  600. package/src/plugins/builtin/options/model-spot.ts +70 -4
  601. package/src/plugins/builtin/options/view.tsx +51 -23
  602. package/src/plugins/builtin/options-calculator/headless.ts +46 -7
  603. package/src/plugins/builtin/options-calculator/pane.tsx +3 -2
  604. package/src/plugins/builtin/options-positioning/headless.ts +11 -3
  605. package/src/plugins/builtin/options-positioning/model.ts +24 -0
  606. package/src/plugins/builtin/options-positioning/pane.tsx +10 -12
  607. package/src/plugins/builtin/options-scenario/client.ts +142 -29
  608. package/src/plugins/builtin/options-scenario/collar.ts +8 -6
  609. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
  610. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
  611. package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
  612. package/src/plugins/builtin/options-scenario/csp.ts +101 -21
  613. package/src/plugins/builtin/options-scenario/headless.ts +49 -21
  614. package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
  615. package/src/plugins/builtin/options-scenario/index.tsx +28 -3
  616. package/src/plugins/builtin/options-scenario/model.ts +13 -0
  617. package/src/plugins/builtin/options-scenario/pane.tsx +22 -10
  618. package/src/plugins/builtin/perps/equity-row.tsx +11 -3
  619. package/src/plugins/builtin/perps/freshness.ts +8 -5
  620. package/src/plugins/builtin/perps/headless.ts +3 -1
  621. package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
  622. package/src/plugins/builtin/perps/live-rows.ts +161 -0
  623. package/src/plugins/builtin/perps/markets-section.tsx +154 -0
  624. package/src/plugins/builtin/perps/pane.tsx +36 -17
  625. package/src/plugins/builtin/perps/venue-markets.ts +96 -0
  626. package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
  627. package/src/plugins/builtin/plugin-marketplace/pane.tsx +145 -60
  628. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +78 -27
  629. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
  630. package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
  631. package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
  632. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
  633. package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
  634. package/src/plugins/builtin/portfolio-list/income.ts +13 -2
  635. package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
  636. package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
  637. package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
  638. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
  639. package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
  640. package/src/plugins/builtin/power/client.ts +6 -3
  641. package/src/plugins/builtin/power/evidence.ts +22 -7
  642. package/src/plugins/builtin/power/gas.tsx +5 -1
  643. package/src/plugins/builtin/power/pane.tsx +44 -32
  644. package/src/plugins/builtin/power/prices.tsx +10 -3
  645. package/src/plugins/builtin/research/analyst-headless.ts +25 -8
  646. package/src/plugins/builtin/research/analyst-model.ts +68 -3
  647. package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
  648. package/src/plugins/builtin/research/event-model.ts +3 -1
  649. package/src/plugins/builtin/research/event-sources.ts +12 -4
  650. package/src/plugins/builtin/research/index.tsx +2 -1
  651. package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
  652. package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
  653. package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
  654. package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
  655. package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
  656. package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
  657. package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
  658. package/src/plugins/builtin/reverse-dcf/client.ts +2 -1
  659. package/src/plugins/builtin/reverse-dcf/model.ts +10 -5
  660. package/src/plugins/builtin/risk-factors/index.tsx +2 -2
  661. package/src/plugins/builtin/scanner/lock-note.ts +1 -1
  662. package/src/plugins/builtin/seasonality/client.ts +2 -1
  663. package/src/plugins/builtin/sec/forms.ts +13 -0
  664. package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
  665. package/src/plugins/builtin/sec/fund-facts.ts +68 -8
  666. package/src/plugins/builtin/sec/headless.ts +85 -8
  667. package/src/plugins/builtin/sec/index.tsx +58 -12
  668. package/src/plugins/builtin/sectors/client.ts +6 -4
  669. package/src/plugins/builtin/sectors/sector-model.ts +11 -15
  670. package/src/plugins/builtin/series-inventory.ts +2 -0
  671. package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
  672. package/src/plugins/builtin/shared/cloud-resource.ts +15 -2
  673. package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
  674. package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
  675. package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
  676. package/src/plugins/builtin/shared/earnings-report.ts +3 -3
  677. package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
  678. package/src/plugins/builtin/shared/job-posting.ts +129 -0
  679. package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
  680. package/src/plugins/builtin/shared/report-freshness.ts +3 -0
  681. package/src/plugins/builtin/shared/research-trading.tsx +23 -0
  682. package/src/plugins/builtin/shared/series-cache.ts +2 -0
  683. package/src/plugins/builtin/shared/series-list-detail.tsx +3 -1
  684. package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
  685. package/src/plugins/builtin/shared/volatility/options.ts +2 -1
  686. package/src/plugins/builtin/short-interest/client.ts +2 -0
  687. package/src/plugins/builtin/short-interest/headless.ts +41 -12
  688. package/src/plugins/builtin/short-interest/index.tsx +23 -1
  689. package/src/plugins/builtin/short-interest/model.ts +70 -19
  690. package/src/plugins/builtin/short-interest/pane.tsx +19 -2
  691. package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
  692. package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
  693. package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
  694. package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
  695. package/src/plugins/builtin/short-interest/schedule.ts +35 -2
  696. package/src/plugins/builtin/short-interest/surface.tsx +11 -4
  697. package/src/plugins/builtin/short-interest/types.ts +9 -0
  698. package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
  699. package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
  700. package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
  701. package/src/plugins/builtin/social-mentions/client.ts +2 -1
  702. package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
  703. package/src/plugins/builtin/supply-chain/model.ts +51 -3
  704. package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
  705. package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
  706. package/src/plugins/builtin/themes/headless.ts +8 -5
  707. package/src/plugins/builtin/themes/model.ts +14 -4
  708. package/src/plugins/builtin/themes/pane.tsx +24 -5
  709. package/src/plugins/builtin/thirteenf/headless.ts +5 -5
  710. package/src/plugins/builtin/thirteenf/signals.ts +3 -1
  711. package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
  712. package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
  713. package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
  714. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
  715. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
  716. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
  717. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
  718. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
  719. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
  720. package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
  721. package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
  722. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
  723. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
  724. package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
  725. package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
  726. package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
  727. package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
  728. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
  729. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
  730. package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
  731. package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
  732. package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
  733. package/src/plugins/builtin/vol-surface/client.ts +28 -7
  734. package/src/plugins/builtin/vol-surface/headless.ts +43 -15
  735. package/src/plugins/builtin/vol-surface/model.ts +34 -12
  736. package/src/plugins/builtin/vol-surface/pane.tsx +33 -13
  737. package/src/plugins/builtin/vol-surface/stored.ts +34 -3
  738. package/src/plugins/builtin/vol-surface/tables.ts +14 -0
  739. package/src/plugins/builtin/volatility/model.ts +5 -10
  740. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
  741. package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
  742. package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
  743. package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
  744. package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
  745. package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
  746. package/src/plugins/builtin/world-venue-map/index.ts +3 -26
  747. package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
  748. package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
  749. package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
  750. package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
  751. package/src/plugins/builtin/yield-curve/client.ts +25 -0
  752. package/src/plugins/builtin/yield-curve/curves.ts +7 -4
  753. package/src/plugins/builtin/yield-curve/headless.ts +38 -4
  754. package/src/plugins/builtin/yield-curve/history.ts +4 -3
  755. package/src/plugins/builtin/yield-curve/index.tsx +12 -6
  756. package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
  757. package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
  758. package/src/plugins/bundle.ts +1 -1
  759. package/src/plugins/catalog-browser.ts +2 -1
  760. package/src/plugins/compat.ts +3 -3
  761. package/src/plugins/dependencies.ts +75 -14
  762. package/src/plugins/extracted-plugins.ts +132 -34
  763. package/src/plugins/host-link.ts +149 -34
  764. package/src/plugins/installer.ts +35 -10
  765. package/src/plugins/loader.ts +206 -38
  766. package/src/plugins/manager-node.ts +2 -2
  767. package/src/plugins/marketplace/deactivation.ts +22 -0
  768. package/src/plugins/marketplace/model.ts +2 -2
  769. package/src/plugins/marketplace/packs.ts +1 -1
  770. package/src/plugins/ownership.ts +1 -1
  771. package/src/plugins/peer-retry.ts +155 -0
  772. package/src/plugins/registry/contributions.ts +3 -1
  773. package/src/plugins/registry/index.ts +4 -3
  774. package/src/plugins/registry/plugin-state.ts +3 -0
  775. package/src/plugins/seed-notice.ts +20 -0
  776. package/src/plugins/shortcut-argument.ts +39 -0
  777. package/src/portfolio/allocation.ts +1 -1
  778. package/src/portfolio/collection-name.ts +31 -0
  779. package/src/portfolio/column-values.ts +10 -8
  780. package/src/portfolio/cost-fx.ts +296 -19
  781. package/src/portfolio/manual-lots.ts +75 -0
  782. package/src/portfolio/mutations.ts +60 -22
  783. package/src/portfolio/suffixed-listings.ts +209 -0
  784. package/src/portfolio/totals-currency.ts +24 -0
  785. package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
  786. package/src/public/time-series.ts +11 -8
  787. package/src/remote/schema.ts +1 -1
  788. package/src/renderers/browser/config-host.ts +3 -0
  789. package/src/renderers/browser/main.tsx +23 -3
  790. package/src/renderers/dom/boot-frame-page.ts +187 -0
  791. package/src/renderers/dom/boot-frame.ts +237 -0
  792. package/src/renderers/dom/build-assets.ts +46 -8
  793. package/src/renderers/dom/desktop/controls.tsx +1 -1
  794. package/src/renderers/dom/desktop/query-bar.tsx +2 -0
  795. package/src/renderers/dom/dom-ui-host.tsx +4 -29
  796. package/src/renderers/dom/host/ascii-text.ts +16 -2
  797. package/src/renderers/dom/host/box.tsx +43 -2
  798. package/src/renderers/dom/host/chart-surface.tsx +2 -0
  799. package/src/renderers/dom/host/hls.chunk.ts +3 -0
  800. package/src/renderers/dom/host/image-surface.tsx +49 -0
  801. package/src/renderers/dom/host/media-surface.tsx +24 -18
  802. package/src/renderers/dom/host/mouse.ts +30 -0
  803. package/src/renderers/dom/host/size-observer.ts +1 -1
  804. package/src/renderers/dom/host/style.ts +1 -1
  805. package/src/renderers/dom/host/tabs.tsx +16 -5
  806. package/src/renderers/dom/host/top-surface.ts +127 -0
  807. package/src/renderers/dom/styles.css +115 -0
  808. package/src/renderers/dom/test-utils.tsx +2 -1
  809. package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
  810. package/src/renderers/electrobun/bun/core-capabilities.ts +9 -1
  811. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
  812. package/src/renderers/electrobun/bun/desktop/backend.ts +56 -3
  813. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
  814. package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
  815. package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
  816. package/src/renderers/electrobun/bun/desktop/update.ts +210 -30
  817. package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
  818. package/src/renderers/electrobun/bun/index.ts +11 -1
  819. package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
  820. package/src/renderers/electrobun/bun/window/create.ts +4 -1
  821. package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
  822. package/src/renderers/electrobun/shared/protocol.ts +6 -1
  823. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  824. package/src/renderers/electrobun/view/config-host.ts +3 -0
  825. package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
  826. package/src/renderers/electrobun/view/main.tsx +30 -4
  827. package/src/renderers/electrobun/view/news-source.ts +9 -7
  828. package/src/renderers/electrobun/view/remote/asset-data-client.ts +9 -2
  829. package/src/renderers/electrobun/view/ui-host.tsx +1 -1
  830. package/src/renderers/opentui/browser-open.ts +88 -0
  831. package/src/renderers/opentui/host.tsx +5 -14
  832. package/src/renderers/opentui/image/loader.ts +3 -2
  833. package/src/renderers/opentui/native-smoke.ts +10 -1
  834. package/src/renderers/opentui/pane-image/index.ts +2 -1
  835. package/src/renderers/opentui/render-lib.ts +253 -0
  836. package/src/renderers/opentui/render-timing-smoke.ts +1 -1
  837. package/src/renderers/opentui/start.tsx +8 -1
  838. package/src/renderers/share/layout-view.tsx +2 -2
  839. package/src/renderers/share/main.tsx +4 -4
  840. package/src/renderers/share/view.tsx +1 -1
  841. package/src/series/resolve.ts +22 -6
  842. package/src/series/standalone.ts +30 -2
  843. package/src/series/types.ts +8 -1
  844. package/src/shares/api.ts +4 -1
  845. package/src/shares/pane.ts +1 -1
  846. package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
  847. package/src/sources/gloomberb-cloud/index.ts +39 -16
  848. package/src/sources/gloomberb-cloud/news.ts +39 -0
  849. package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
  850. package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
  851. package/src/sources/listing-symbols.ts +37 -0
  852. package/src/sources/provider-errors.ts +16 -2
  853. package/src/sources/provider-router/financial-routes.ts +21 -3
  854. package/src/sources/provider-router/financials.ts +15 -2
  855. package/src/sources/provider-router/history.ts +30 -8
  856. package/src/sources/provider-router/index.ts +16 -0
  857. package/src/sources/provider-router/primary.ts +1 -1
  858. package/src/state/app/bootstrap.ts +23 -0
  859. package/src/state/hooks/inline-tickers.ts +30 -5
  860. package/src/sync/controller.ts +1 -1
  861. package/src/sync/core-contributors.ts +46 -14
  862. package/src/team/collections-sync.ts +2 -1
  863. package/src/team/collections.ts +178 -17
  864. package/src/telemetry/crash-reports.ts +21 -4
  865. package/src/telemetry/update-failures-node.ts +59 -0
  866. package/src/telemetry/update-failures.ts +307 -0
  867. package/src/test-support/builtin-panes.ts +1 -1
  868. package/src/theme/colors.ts +3 -30
  869. package/src/theme/ui-tokens.ts +37 -1
  870. package/src/tickers/company-name-listing.ts +215 -36
  871. package/src/tickers/company-name.ts +43 -0
  872. package/src/tickers/index-roots.ts +47 -0
  873. package/src/tickers/instrument-label.ts +5 -1
  874. package/src/tickers/listing-fate.ts +30 -0
  875. package/src/tickers/metadata.ts +10 -0
  876. package/src/tickers/perpetual-listing.ts +5 -2
  877. package/src/tickers/search/home-listing.ts +75 -0
  878. package/src/tickers/search/index.ts +76 -27
  879. package/src/tickers/search/ranking.ts +54 -4
  880. package/src/tickers/search/upsert.ts +29 -0
  881. package/src/tickers/terminal-codes.ts +416 -40
  882. package/src/time-series/bar-aggregation.ts +243 -0
  883. package/src/time-series/base-series.ts +307 -0
  884. package/src/time-series/chart-bounds.ts +349 -0
  885. package/src/time-series/chart-seed.ts +142 -0
  886. package/src/time-series/economic.ts +5 -0
  887. package/src/time-series/fundamentals.ts +18 -3
  888. package/src/time-series/history-acquisition.ts +499 -0
  889. package/src/time-series/leverage.ts +100 -0
  890. package/src/time-series/market-resolution.ts +4 -2
  891. package/src/time-series/market.ts +2 -1
  892. package/src/time-series/price-comparison.ts +175 -30
  893. package/src/time-series/range.ts +9 -1
  894. package/src/time-series/resolution.ts +174 -16
  895. package/src/time-series/resolve-context.ts +157 -0
  896. package/src/time-series/resolve.ts +126 -1577
  897. package/src/time-series/series-name.ts +38 -0
  898. package/src/time-series/series-presentation.ts +208 -0
  899. package/src/time-series/spec.ts +11 -6
  900. package/src/time-series/studies.ts +109 -12
  901. package/src/time-series/tail-reconcile.ts +121 -0
  902. package/src/time-series/types.ts +29 -2
  903. package/src/time-series/use-chart-resolution.ts +4 -5
  904. package/src/types/broker.ts +10 -0
  905. package/src/types/config.ts +14 -0
  906. package/src/types/data-provider.ts +20 -0
  907. package/src/types/exchange-rate.ts +6 -0
  908. package/src/types/financials.ts +104 -7
  909. package/src/types/headless.ts +83 -6
  910. package/src/types/instrument.ts +3 -0
  911. package/src/types/issuer-listings.ts +28 -0
  912. package/src/types/plugin.ts +65 -8
  913. package/src/types/price-history.ts +2 -0
  914. package/src/types/ticker.ts +13 -0
  915. package/src/types/trading.ts +59 -1
  916. package/src/ui/ascii-font.ts +13 -1
  917. package/src/ui/host.tsx +6 -1
  918. package/src/updater/command-names.ts +175 -0
  919. package/src/updater/failure.ts +163 -0
  920. package/src/updater/index.ts +97 -28
  921. package/src/utils/calendar-date.ts +32 -15
  922. package/src/utils/cash-runway.ts +241 -0
  923. package/src/utils/central-banks.ts +42 -0
  924. package/src/utils/cli-output.ts +259 -80
  925. package/src/utils/contract-month.ts +16 -0
  926. package/src/utils/crypto-pair.ts +61 -3
  927. package/src/utils/currency-pair.ts +26 -0
  928. package/src/utils/currency-units.ts +29 -0
  929. package/src/utils/datetime-format.ts +10 -0
  930. package/src/utils/debug-log.ts +1 -1
  931. package/src/utils/decimal-comma.ts +39 -6
  932. package/src/utils/exchange-announcements.ts +71 -0
  933. package/src/utils/exchange-rate-snapshot.ts +10 -0
  934. package/src/utils/financial-statements.ts +83 -4
  935. package/src/utils/format.ts +34 -16
  936. package/src/utils/fundamentals.ts +150 -34
  937. package/src/utils/fx-market-hours.ts +10 -1
  938. package/src/utils/latest-financial-period.ts +8 -0
  939. package/src/utils/linux-libc.ts +54 -0
  940. package/src/utils/market-capitalization.ts +111 -15
  941. package/src/utils/max-drawdown.ts +64 -0
  942. package/src/utils/network-failure.ts +83 -0
  943. package/src/utils/option-expiry.ts +139 -7
  944. package/src/utils/price-earnings.ts +11 -5
  945. package/src/utils/price-history.ts +18 -8
  946. package/src/utils/price-window.ts +131 -0
  947. package/src/utils/release-date.ts +47 -0
  948. package/src/utils/sec.ts +71 -0
  949. package/src/utils/throttled-fetch.ts +11 -4
  950. package/src/utils/trailing-eps.ts +67 -0
  951. package/src/utils/typed-text.ts +21 -0
  952. package/src/utils/utc-time.ts +24 -1
  953. package/src/version.ts +6 -0
  954. 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
- return () => element.removeEventListener("wheel", handleWheel);
223
- }, [handlesWheel]);
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,3 @@
1
+ // The HLS player, about half a megabyte, in a file of its own: only a live
2
+ // stream that the webview cannot play natively loads it (see media-surface.tsx).
3
+ export { default } from "hls.js";
@@ -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
- fail("HLS playback is unavailable in this desktop runtime.");
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 (GLO-590).
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, so the active tab's
48
- // underline lies on the header's bottom rule. Every variant draws the one tab
49
- // look in styles.css: text, and the active tab on an accent underline.
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
- alignItems: "stretch",
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
- transition: `color 110ms ease, transform ${dragSourceValue && dragSourceValue !== tab.value ? "var(--tab-reorder-duration, 160ms)" : "0ms"} cubic-bezier(0.77, 0, 0.175, 1)`,
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: "Gloomberb",
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 Gloomberb", { type: "quit" }, { accelerator: "CmdOrCtrl+Q" }),
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("Gloomberb Help", "HELP"),
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) => io(input).listKeys({ strict: input.strict === true })),
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
  }