gloomberb 0.18.3 → 0.18.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (886) 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/src/account/checkout-handoff.tsx +225 -0
  6. package/src/account/device-signin-dialog.tsx +2 -2
  7. package/src/account/device-signin.ts +2 -2
  8. package/src/account/upgrade-dialog.tsx +1 -1
  9. package/src/api-client/askg.ts +2 -2
  10. package/src/api-client/auth.ts +2 -2
  11. package/src/api-client/central-bank-rates.ts +6 -0
  12. package/src/api-client/collections.ts +5 -1
  13. package/src/api-client/cot.ts +2 -0
  14. package/src/api-client/crypto-etf-flows.ts +37 -0
  15. package/src/api-client/crypto-markets.ts +60 -0
  16. package/src/api-client/data.ts +84 -5
  17. package/src/api-client/doe.ts +15 -0
  18. package/src/api-client/equity-screener.ts +28 -0
  19. package/src/api-client/exchange-announcements.ts +38 -0
  20. package/src/api-client/fund-facts.ts +39 -0
  21. package/src/api-client/futures-curve.ts +9 -1
  22. package/src/api-client/hiring.ts +301 -0
  23. package/src/api-client/index.ts +22 -5
  24. package/src/api-client/market-discovery.ts +14 -0
  25. package/src/api-client/members.ts +6 -0
  26. package/src/api-client/mna.ts +6 -0
  27. package/src/api-client/paths.ts +18 -1
  28. package/src/api-client/request.ts +21 -4
  29. package/src/api-client/short-side-publications.ts +37 -0
  30. package/src/api-client/socket.ts +64 -4
  31. package/src/api-client/swap-curve.ts +35 -0
  32. package/src/api-client/themes.ts +7 -1
  33. package/src/api-client/types.ts +90 -2
  34. package/src/app/pane-runtime/plugin-bindings.ts +9 -2
  35. package/src/app/runtime/desktop-deeplink.ts +5 -5
  36. package/src/app/runtime/plugin-bindings.ts +2 -2
  37. package/src/app/runtime/startup.ts +13 -0
  38. package/src/app/star-prompt/status-line.tsx +2 -2
  39. package/src/architecture/core-builtin-allowlist.json +5 -2
  40. package/src/architecture/ui-literals-allowlist.json +3 -3
  41. package/src/architecture/ui-tokens-allowlist.json +1 -1
  42. package/src/brokers/broker-portfolio-sync.ts +37 -0
  43. package/src/brokers/directory.ts +11 -0
  44. package/src/brokers/logos.ts +3 -1
  45. package/src/brokers/signed-in/adapter.ts +304 -26
  46. package/src/brokers/signed-in/client.ts +14 -2
  47. package/src/brokers/signed-in/connect.ts +10 -2
  48. package/src/brokers/sync-broker-instance.ts +9 -1
  49. package/src/capabilities/chart-series.ts +22 -6
  50. package/src/cli/bank-section.ts +1 -1
  51. package/src/cli/base-converter.ts +23 -14
  52. package/src/cli/central-bank-events.ts +1 -1
  53. package/src/cli/command-options.ts +59 -4
  54. package/src/cli/commands/api.ts +9 -6
  55. package/src/cli/commands/broker.ts +2 -2
  56. package/src/cli/commands/command-utils.ts +2 -2
  57. package/src/cli/commands/crypto-hints.ts +7 -20
  58. package/src/cli/commands/fred-series.ts +4 -2
  59. package/src/cli/commands/keybindings.ts +2 -2
  60. package/src/cli/commands/market.ts +1117 -264
  61. package/src/cli/commands/news-hints.ts +2 -2
  62. package/src/cli/commands/news-search.ts +59 -6
  63. package/src/cli/commands/options-leaps.ts +41 -26
  64. package/src/cli/commands/overview.ts +121 -48
  65. package/src/cli/commands/plugins.ts +9 -9
  66. package/src/cli/commands/remote.ts +13 -10
  67. package/src/cli/commands/search.ts +64 -44
  68. package/src/cli/commands/system.ts +27 -19
  69. package/src/cli/commands/themes.ts +1 -1
  70. package/src/cli/commands/ticker.ts +192 -47
  71. package/src/cli/context.ts +3 -2
  72. package/src/cli/desktop-pane-shot-view.ts +2 -2
  73. package/src/cli/desktop-pane-shot.ts +1 -1
  74. package/src/cli/earnings-calendar.ts +4 -4
  75. package/src/cli/entry.ts +18 -1
  76. package/src/cli/errors.ts +20 -2
  77. package/src/cli/exit-codes.ts +1 -1
  78. package/src/cli/export-source.ts +10 -4
  79. package/src/cli/freshness.ts +2 -8
  80. package/src/cli/fx-forward.ts +130 -0
  81. package/src/cli/fx-pair.ts +10 -9
  82. package/src/cli/glossary.ts +64 -20
  83. package/src/cli/help.ts +19 -13
  84. package/src/cli/history-export.ts +126 -0
  85. package/src/cli/history-rows.ts +196 -43
  86. package/src/cli/index-roots.ts +5 -45
  87. package/src/cli/index.ts +24 -18
  88. package/src/cli/known-gaps.ts +118 -25
  89. package/src/cli/listing-arg.ts +300 -41
  90. package/src/cli/name-entries.ts +30 -18
  91. package/src/cli/native-smoke.ts +2 -0
  92. package/src/cli/not-a-ticker.ts +19 -9
  93. package/src/cli/opentui-libc.ts +5 -0
  94. package/src/cli/options.ts +12 -0
  95. package/src/cli/pane-functions/capabilities.ts +75 -20
  96. package/src/cli/pane-functions/catalog.ts +24 -23
  97. package/src/cli/pane-functions/discovery.ts +1 -1
  98. package/src/cli/pane-functions/dom.ts +10 -7
  99. package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
  100. package/src/cli/pane-functions/freshness.ts +174 -23
  101. package/src/cli/pane-functions/function-help.ts +66 -27
  102. package/src/cli/pane-functions/headless.ts +24 -11
  103. package/src/cli/pane-functions/index.ts +18 -16
  104. package/src/cli/pane-functions/options.ts +22 -2
  105. package/src/cli/pane-functions/report-notices.ts +12 -4
  106. package/src/cli/pane-functions/report.ts +5 -5
  107. package/src/cli/pane-functions/resolver.ts +47 -10
  108. package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
  109. package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
  110. package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
  111. package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
  112. package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
  113. package/src/cli/pane-functions/screenshot-payload.ts +453 -0
  114. package/src/cli/pane-functions/screenshot-render.ts +316 -0
  115. package/src/cli/pane-functions/screenshot-types.ts +162 -0
  116. package/src/cli/pane-functions/shot-options.ts +8 -3
  117. package/src/cli/peso-dollar-rates.ts +79 -0
  118. package/src/cli/quote-answer.ts +38 -3
  119. package/src/cli/report-tables.ts +61 -16
  120. package/src/cli/restore-plugins.ts +29 -14
  121. package/src/cli/result.ts +111 -22
  122. package/src/cli/series-search.ts +5 -5
  123. package/src/cli/statement-filings.ts +19 -0
  124. package/src/cli/suffixed-listing-rows.ts +49 -0
  125. package/src/cli/symbol-args.ts +50 -15
  126. package/src/cli/symbol-cells.ts +120 -0
  127. package/src/cli/symbol-list.ts +198 -68
  128. package/src/cli/symbol-rows.ts +131 -25
  129. package/src/cli/ticker-resolution.ts +108 -11
  130. package/src/cli/treasury-yields.ts +5 -5
  131. package/src/cli/types.ts +2 -0
  132. package/src/cli/uncovered-instrument.ts +3 -3
  133. package/src/cli/unknown-command.ts +6 -6
  134. package/src/components/chart/composite/chart-layout.ts +131 -0
  135. package/src/components/chart/composite/composite-chart.tsx +373 -16
  136. package/src/components/chart/composite/interactions.ts +7 -2
  137. package/src/components/chart/composite/legend.tsx +75 -3
  138. package/src/components/chart/composite/levels.ts +5 -0
  139. package/src/components/chart/composite/panel-gestures.ts +41 -0
  140. package/src/components/chart/composite/panel-labels.ts +2 -1
  141. package/src/components/chart/composite/panel-surface.tsx +305 -11
  142. package/src/components/chart/composite/price-axis-labels.tsx +27 -3
  143. package/src/components/chart/composite/rasterizer.ts +44 -19
  144. package/src/components/chart/composite/scene.ts +16 -4
  145. package/src/components/chart/composite/text-renderer.ts +48 -21
  146. package/src/components/chart/composite/toolbar.tsx +52 -5
  147. package/src/components/chart/composite/types.ts +13 -0
  148. package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
  149. package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
  150. package/src/components/chart/composite/use-composite-viewport.ts +12 -3
  151. package/src/components/chart/composite/value-scale.ts +149 -0
  152. package/src/components/chart/composite/volume-profile-paint.ts +6 -3
  153. package/src/components/chart/core/pointer.ts +2 -0
  154. package/src/components/chart-table/index.ts +2 -0
  155. package/src/components/chart-table/read.tsx +74 -0
  156. package/src/components/command-bar/commands/collection-list.ts +41 -19
  157. package/src/components/command-bar/commands/collection.ts +9 -3
  158. package/src/components/command-bar/commands/direct/index.ts +1 -1
  159. package/src/components/command-bar/commands/direct/runtime.ts +3 -2
  160. package/src/components/command-bar/pane-templates/items.ts +59 -6
  161. package/src/components/command-bar/pane-templates/workflow.ts +10 -1
  162. package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
  163. package/src/components/command-bar/routes/root/provider-search.ts +42 -11
  164. package/src/components/command-bar/routes/root/results.ts +18 -4
  165. package/src/components/command-bar/routes/root/runtime.ts +15 -3
  166. package/src/components/command-bar/routes/root/search-providers.ts +25 -2
  167. package/src/components/command-bar/routes/root/selection.ts +6 -1
  168. package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
  169. package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
  170. package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
  171. package/src/components/command-bar/selection-runtime.ts +50 -10
  172. package/src/components/command-bar/surface/index.tsx +24 -2
  173. package/src/components/command-bar/view-model.ts +7 -0
  174. package/src/components/command-bar/workflow/broker.ts +2 -2
  175. package/src/components/command-bar/workflow/collection-actions.ts +46 -7
  176. package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
  177. package/src/components/command-bar/workflow/fields.ts +8 -2
  178. package/src/components/command-bar/workflow/ops.ts +18 -4
  179. package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
  180. package/src/components/command-bar/workflow/submit.ts +3 -2
  181. package/src/components/command-bar/workflow/tickers.ts +5 -1
  182. package/src/components/company-logo.tsx +39 -0
  183. package/src/components/data-table/sections.ts +4 -2
  184. package/src/components/form-modal/confirm.tsx +2 -1
  185. package/src/components/form-modal/request.ts +5 -0
  186. package/src/components/form-modal/routes.ts +4 -1
  187. package/src/components/index.ts +12 -6
  188. package/src/components/layout/header.tsx +7 -6
  189. package/src/components/layout/market-summary.ts +9 -6
  190. package/src/components/layout/pane/capture-status.ts +1 -1
  191. package/src/components/layout/pane/footer/model.ts +11 -5
  192. package/src/components/layout/shell/chrome.ts +19 -6
  193. package/src/components/layout/shell/index.tsx +2 -1
  194. package/src/components/layout/shell/pane/layers.tsx +19 -1
  195. package/src/components/layout/status-bar.tsx +2 -2
  196. package/src/components/market-board/index.tsx +11 -3
  197. package/src/components/onboarding/onboarding-wizard.tsx +1 -0
  198. package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
  199. package/src/components/onboarding/wizard-broker-sync.ts +4 -1
  200. package/src/components/pane-settings-dialog/desktop.tsx +20 -7
  201. package/src/components/pane-settings-dialog/tui.tsx +17 -9
  202. package/src/components/pane-settings-dialog/value.ts +8 -1
  203. package/src/components/pane-settings-dialog.tsx +44 -13
  204. package/src/components/sign-in-code-panel.tsx +27 -19
  205. package/src/components/ui/column-grid.tsx +48 -4
  206. package/src/components/ui/country-flag-art.tsx +180 -0
  207. package/src/components/ui/country-flag.tsx +118 -12
  208. package/src/components/ui/data-table/opentui/index.tsx +61 -2
  209. package/src/components/ui/data-table/opentui/model.ts +109 -2
  210. package/src/components/ui/data-table/types.ts +1 -1
  211. package/src/components/ui/display.tsx +5 -1
  212. package/src/components/ui/index.ts +3 -1
  213. package/src/components/ui/logo-mark.tsx +11 -2
  214. package/src/components/ui/query-bar.tsx +1 -1
  215. package/src/components/ui/row-notes.ts +79 -0
  216. package/src/core/state/app/layout.ts +4 -4
  217. package/src/data/cached-query.ts +8 -1
  218. package/src/data/config/chart-settings.ts +3 -3
  219. package/src/data/config/home.ts +10 -2
  220. package/src/data/config/layout.ts +4 -1
  221. package/src/data/config/store/node.ts +4 -0
  222. package/src/data/config/store/normalize.ts +13 -3
  223. package/src/data/config/store/portfolio-as-of-column.ts +2 -2
  224. package/src/data/json-storage.ts +2 -0
  225. package/src/data/saved-copies.ts +84 -0
  226. package/src/docs/snapshot.json +65 -32
  227. package/src/i18n/es.ts +29 -12
  228. package/src/i18n/ja.ts +29 -12
  229. package/src/i18n/ko.ts +29 -12
  230. package/src/i18n/zh-cn.ts +29 -12
  231. package/src/i18n/zh-tw.ts +29 -12
  232. package/src/layout/desks.ts +1 -1
  233. package/src/layout/launch-layout.ts +1 -1
  234. package/src/layout/pane-manager/floating-actions.ts +5 -3
  235. package/src/layout/pane-manager/floating.ts +43 -1
  236. package/src/layout/pane-manager/index.ts +2 -0
  237. package/src/layout/selected-ticker.ts +74 -0
  238. package/src/market-data/depositary-pair.ts +251 -0
  239. package/src/market-data/futures-board.ts +1 -1
  240. package/src/market-data/futures-contract.ts +124 -40
  241. package/src/market-data/fx-closes.ts +17 -2
  242. package/src/market-data/hooks.tsx +19 -11
  243. package/src/market-data/market/change-basis.ts +49 -7
  244. package/src/market-data/market/freshness.ts +34 -5
  245. package/src/market-data/market/period-return.ts +163 -0
  246. package/src/market-data/market/trading-sessions.ts +13 -0
  247. package/src/market-data/market/year-to-date.ts +8 -13
  248. package/src/market-data/performance.ts +20 -14
  249. package/src/market-data/perpetual-premium.ts +32 -0
  250. package/src/market-data/published-apac-sessions.ts +2 -1
  251. package/src/market-data/published-futures-sessions.ts +69 -0
  252. package/src/market-data/quotes/contributions.ts +5 -1
  253. package/src/market-data/quotes/freshness.ts +42 -0
  254. package/src/market-data/quotes/intraday-bar.ts +37 -0
  255. package/src/market-data/quotes/regular-session-valuation.ts +13 -8
  256. package/src/market-data/quotes/resolution.ts +4 -2
  257. package/src/market-data/tax-equivalent.ts +1 -1
  258. package/src/market-data/ticker-price-returns.ts +3 -1
  259. package/src/news/aggregator.ts +5 -1
  260. package/src/news/news-model.ts +4 -0
  261. package/src/news/types.ts +11 -0
  262. package/src/notifications/app-notifier.ts +1 -1
  263. package/src/plugins/auto-update.ts +2 -2
  264. package/src/plugins/builtin/account-management/index.tsx +1 -0
  265. package/src/plugins/builtin/account-management/pane.tsx +9 -8
  266. package/src/plugins/builtin/alerts/alert-engine.ts +29 -19
  267. package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
  268. package/src/plugins/builtin/alerts/cli.ts +485 -76
  269. package/src/plugins/builtin/alerts/command.ts +5 -10
  270. package/src/plugins/builtin/alerts/event-rows.ts +9 -5
  271. package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
  272. package/src/plugins/builtin/alerts/events.ts +107 -5
  273. package/src/plugins/builtin/alerts/fired-log.ts +78 -0
  274. package/src/plugins/builtin/alerts/format.ts +2 -1
  275. package/src/plugins/builtin/alerts/headless.ts +100 -39
  276. package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
  277. package/src/plugins/builtin/alerts/history-rows.ts +89 -0
  278. package/src/plugins/builtin/alerts/index.tsx +45 -18
  279. package/src/plugins/builtin/alerts/iv-level.ts +365 -0
  280. package/src/plugins/builtin/alerts/levels.ts +3 -3
  281. package/src/plugins/builtin/alerts/pane.tsx +97 -29
  282. package/src/plugins/builtin/alerts/price.ts +35 -0
  283. package/src/plugins/builtin/alerts/quotes.ts +24 -0
  284. package/src/plugins/builtin/alerts/research-builder.ts +84 -11
  285. package/src/plugins/builtin/alerts/research-rules.ts +76 -3
  286. package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
  287. package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
  288. package/src/plugins/builtin/alerts/scheduled.ts +188 -29
  289. package/src/plugins/builtin/alerts/storage.ts +13 -10
  290. package/src/plugins/builtin/alerts/targets.ts +12 -3
  291. package/src/plugins/builtin/analytics/index.tsx +8 -2
  292. package/src/plugins/builtin/analytics/metrics.ts +1 -1
  293. package/src/plugins/builtin/analytics/risk-book.ts +215 -0
  294. package/src/plugins/builtin/analytics/risk-client.ts +13 -6
  295. package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
  296. package/src/plugins/builtin/analytics/risk-math.ts +6 -3
  297. package/src/plugins/builtin/analytics/risk-model.ts +297 -104
  298. package/src/plugins/builtin/analytics/risk-options.ts +17 -2
  299. package/src/plugins/builtin/analytics/risk-pane.tsx +97 -36
  300. package/src/plugins/builtin/attention/pane.tsx +6 -2
  301. package/src/plugins/builtin/awards/headless.ts +7 -3
  302. package/src/plugins/builtin/awards/model.ts +18 -0
  303. package/src/plugins/builtin/awards/pane.tsx +6 -3
  304. package/src/plugins/builtin/backtest/headless.ts +3 -3
  305. package/src/plugins/builtin/backtest/rules.ts +41 -5
  306. package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
  307. package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
  308. package/src/plugins/builtin/broker-manager/footer.ts +27 -11
  309. package/src/plugins/builtin/broker-manager/index.tsx +21 -12
  310. package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
  311. package/src/plugins/builtin/broker-manager/model.ts +12 -2
  312. package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
  313. package/src/plugins/builtin/broker-manager/table.ts +28 -12
  314. package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
  315. package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
  316. package/src/plugins/builtin/broker-trading/controller.ts +45 -13
  317. package/src/plugins/builtin/broker-trading/dock.tsx +22 -4
  318. package/src/plugins/builtin/broker-trading/headless.ts +2 -1
  319. package/src/plugins/builtin/broker-trading/index.tsx +7 -1
  320. package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
  321. package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
  322. package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
  323. package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
  324. package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
  325. package/src/plugins/builtin/broker-trading/pane.tsx +110 -23
  326. package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
  327. package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
  328. package/src/plugins/builtin/buildout/cells.tsx +4 -0
  329. package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
  330. package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
  331. package/src/plugins/builtin/buildout/pane/index.tsx +25 -12
  332. package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
  333. package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
  334. package/src/plugins/builtin/catalysts/detail.tsx +3 -2
  335. package/src/plugins/builtin/catalysts/index.tsx +1 -1
  336. package/src/plugins/builtin/catalysts/model.ts +49 -4
  337. package/src/plugins/builtin/catalysts/pane.tsx +6 -8
  338. package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
  339. package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
  340. package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
  341. package/src/plugins/builtin/changelog/index.tsx +1 -0
  342. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
  343. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
  344. package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
  345. package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
  346. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
  347. package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
  348. package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
  349. package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
  350. package/src/plugins/builtin/chart-composer/headless.ts +253 -35
  351. package/src/plugins/builtin/chart-composer/index.tsx +12 -2
  352. package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
  353. package/src/plugins/builtin/chart-composer/pane.tsx +127 -28
  354. package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
  355. package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
  356. package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
  357. package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
  358. package/src/plugins/builtin/chart-composer/settings.ts +31 -19
  359. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
  360. package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
  361. package/src/plugins/builtin/chat/attachments/model.ts +3 -1
  362. package/src/plugins/builtin/chat/content/index.tsx +1 -1
  363. package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
  364. package/src/plugins/builtin/chat/people.ts +1 -1
  365. package/src/plugins/builtin/clinical-trials/client.ts +5 -2
  366. package/src/plugins/builtin/clinical-trials/model.ts +13 -4
  367. package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
  368. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
  369. package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
  370. package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
  371. package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
  372. package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
  373. package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
  374. package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
  375. package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
  376. package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
  377. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  378. package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
  379. package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
  380. package/src/plugins/builtin/commodity-balances/pane.tsx +11 -4
  381. package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
  382. package/src/plugins/builtin/company-attention/building-model.ts +222 -0
  383. package/src/plugins/builtin/company-attention/building.tsx +172 -0
  384. package/src/plugins/builtin/company-attention/client.ts +117 -1
  385. package/src/plugins/builtin/company-attention/evidence.ts +16 -3
  386. package/src/plugins/builtin/company-attention/headless.ts +101 -5
  387. package/src/plugins/builtin/company-attention/index.tsx +6 -3
  388. package/src/plugins/builtin/company-attention/model.ts +33 -7
  389. package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
  390. package/src/plugins/builtin/company-attention/moves.tsx +159 -0
  391. package/src/plugins/builtin/company-attention/pane.tsx +79 -23
  392. package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
  393. package/src/plugins/builtin/company-attention/signals.tsx +160 -0
  394. package/src/plugins/builtin/company-kpis/headless.ts +3 -2
  395. package/src/plugins/builtin/company-kpis/model.ts +2 -2
  396. package/src/plugins/builtin/company-kpis/pane.tsx +1 -1
  397. package/src/plugins/builtin/composite-plugins.ts +2 -1
  398. package/src/plugins/builtin/congress-trades/headless.ts +1 -1
  399. package/src/plugins/builtin/connections/index.ts +1 -0
  400. package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
  401. package/src/plugins/builtin/correlation/headless.ts +5 -3
  402. package/src/plugins/builtin/cot/headless.ts +28 -6
  403. package/src/plugins/builtin/cot/model.ts +12 -0
  404. package/src/plugins/builtin/cot/pane.tsx +3 -2
  405. package/src/plugins/builtin/cpi/headless.ts +5 -1
  406. package/src/plugins/builtin/cpi/pane.tsx +11 -9
  407. package/src/plugins/builtin/credit-boards/model.ts +2 -0
  408. package/src/plugins/builtin/credit-documents/headless.ts +1 -1
  409. package/src/plugins/builtin/crypto-board/client.ts +86 -0
  410. package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
  411. package/src/plugins/builtin/crypto-board/defi.ts +239 -0
  412. package/src/plugins/builtin/crypto-board/headless.ts +117 -6
  413. package/src/plugins/builtin/crypto-board/index.tsx +8 -3
  414. package/src/plugins/builtin/crypto-board/model.ts +40 -8
  415. package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
  416. package/src/plugins/builtin/crypto-board/series.ts +19 -1
  417. package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
  418. package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
  419. package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
  420. package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
  421. package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
  422. package/src/plugins/builtin/debug/index.tsx +1 -0
  423. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  424. package/src/plugins/builtin/docs/index.tsx +1 -1
  425. package/src/plugins/builtin/docs/pane.tsx +2 -2
  426. package/src/plugins/builtin/docs/targets.ts +1 -1
  427. package/src/plugins/builtin/doe/client.ts +5 -1
  428. package/src/plugins/builtin/doe/headless.ts +12 -6
  429. package/src/plugins/builtin/doe/model.ts +43 -6
  430. package/src/plugins/builtin/doe/pane.tsx +18 -11
  431. package/src/plugins/builtin/earnings/board-model.ts +13 -6
  432. package/src/plugins/builtin/earnings/board-table.ts +4 -1
  433. package/src/plugins/builtin/earnings/board.tsx +253 -50
  434. package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
  435. package/src/plugins/builtin/earnings/calendar.tsx +338 -0
  436. package/src/plugins/builtin/earnings/client.ts +4 -3
  437. package/src/plugins/builtin/earnings/headless.ts +53 -15
  438. package/src/plugins/builtin/earnings/history-model.ts +53 -36
  439. package/src/plugins/builtin/earnings/index.tsx +15 -22
  440. package/src/plugins/builtin/earnings/model.ts +17 -12
  441. package/src/plugins/builtin/earnings/scope.ts +89 -0
  442. package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
  443. package/src/plugins/builtin/earnings-calls/data.ts +146 -2
  444. package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
  445. package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
  446. package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
  447. package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
  448. package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
  449. package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
  450. package/src/plugins/builtin/econ/calendar-model.ts +132 -20
  451. package/src/plugins/builtin/econ/detail-view.tsx +48 -10
  452. package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
  453. package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
  454. package/src/plugins/builtin/econ/index.tsx +112 -25
  455. package/src/plugins/builtin/econ/print-watch.ts +2 -1
  456. package/src/plugins/builtin/econ/types.ts +32 -1
  457. package/src/plugins/builtin/econ-statistics/client.ts +16 -3
  458. package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
  459. package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
  460. package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
  461. package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
  462. package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
  463. package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
  464. package/src/plugins/builtin/econ-statistics/view.ts +16 -1
  465. package/src/plugins/builtin/equity-screener/client.ts +21 -3
  466. package/src/plugins/builtin/equity-screener/headless.ts +68 -6
  467. package/src/plugins/builtin/equity-screener/live.ts +1 -1
  468. package/src/plugins/builtin/equity-screener/model.ts +6 -0
  469. package/src/plugins/builtin/equity-screener/pane.tsx +45 -10
  470. package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
  471. package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
  472. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
  473. package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
  474. package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
  475. package/src/plugins/builtin/exposure/headless.ts +51 -6
  476. package/src/plugins/builtin/exposure/index.tsx +28 -2
  477. package/src/plugins/builtin/exposure/model.ts +7 -0
  478. package/src/plugins/builtin/exposure/pane.tsx +6 -1
  479. package/src/plugins/builtin/fear-greed/index.tsx +1 -1
  480. package/src/plugins/builtin/filing-events/index.tsx +1 -1
  481. package/src/plugins/builtin/futures/model.ts +10 -9
  482. package/src/plugins/builtin/futures/returns.ts +8 -36
  483. package/src/plugins/builtin/futures/table.tsx +1 -1
  484. package/src/plugins/builtin/futures-curve/client.ts +40 -9
  485. package/src/plugins/builtin/futures-curve/headless.ts +39 -17
  486. package/src/plugins/builtin/futures-curve/model.ts +258 -69
  487. package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
  488. package/src/plugins/builtin/fx-matrix/client.ts +15 -8
  489. package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
  490. package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
  491. package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
  492. package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
  493. package/src/plugins/builtin/gpu/headless.ts +9 -4
  494. package/src/plugins/builtin/help/index.tsx +13 -3
  495. package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
  496. package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
  497. package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
  498. package/src/plugins/builtin/holders/client.ts +13 -1
  499. package/src/plugins/builtin/holders/format.ts +28 -17
  500. package/src/plugins/builtin/holders/headless.ts +46 -7
  501. package/src/plugins/builtin/holders/index-holders.ts +264 -0
  502. package/src/plugins/builtin/holders/pane.tsx +79 -15
  503. package/src/plugins/builtin/holders/report-rows.ts +35 -7
  504. package/src/plugins/builtin/holders/table-model.ts +2 -1
  505. package/src/plugins/builtin/holders/treemap.tsx +2 -2
  506. package/src/plugins/builtin/insider/headless.ts +1 -1
  507. package/src/plugins/builtin/insider/signals-client.ts +1 -1
  508. package/src/plugins/builtin/insider/signals.tsx +1 -1
  509. package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
  510. package/src/plugins/builtin/iv-history/client.ts +20 -0
  511. package/src/plugins/builtin/iv-history/headless.ts +4 -4
  512. package/src/plugins/builtin/iv-history/index.tsx +1 -1
  513. package/src/plugins/builtin/iv-history/model.ts +13 -4
  514. package/src/plugins/builtin/iv-history/series.ts +3 -1
  515. package/src/plugins/builtin/jobs/lock-note.ts +1 -1
  516. package/src/plugins/builtin/jobs/model.ts +4 -15
  517. package/src/plugins/builtin/jobs/pane.tsx +7 -5
  518. package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
  519. package/src/plugins/builtin/jodi/pane.tsx +10 -4
  520. package/src/plugins/builtin/layout-manager/index.tsx +1 -0
  521. package/src/plugins/builtin/macro-day/headless.ts +20 -7
  522. package/src/plugins/builtin/macro-day/index.tsx +3 -2
  523. package/src/plugins/builtin/macro-day/model.ts +29 -8
  524. package/src/plugins/builtin/macro-day/pane.tsx +46 -10
  525. package/src/plugins/builtin/macro-day/releases.ts +55 -13
  526. package/src/plugins/builtin/market-heatmap/data.ts +9 -2
  527. package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
  528. package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
  529. package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
  530. package/src/plugins/builtin/market-heatmap/model.ts +10 -7
  531. package/src/plugins/builtin/market-movers/client.ts +33 -19
  532. package/src/plugins/builtin/market-movers/headless.ts +8 -2
  533. package/src/plugins/builtin/market-movers/index.tsx +16 -10
  534. package/src/plugins/builtin/market-movers/screener.ts +29 -8
  535. package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
  536. package/src/plugins/builtin/market-movers/session-table.ts +4 -2
  537. package/src/plugins/builtin/market-movers/table.ts +4 -1
  538. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  539. package/src/plugins/builtin/market-valuation/view.ts +5 -0
  540. package/src/plugins/builtin/members/headless.ts +6 -5
  541. package/src/plugins/builtin/members/pane.tsx +11 -4
  542. package/src/plugins/builtin/mna/client.ts +1 -0
  543. package/src/plugins/builtin/mna/detail.tsx +20 -32
  544. package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
  545. package/src/plugins/builtin/mna/distress/model.ts +3 -2
  546. package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
  547. package/src/plugins/builtin/mna/headless.ts +6 -13
  548. package/src/plugins/builtin/mna/model.ts +93 -15
  549. package/src/plugins/builtin/mna/pane.tsx +5 -4
  550. package/src/plugins/builtin/news/headless.ts +12 -6
  551. package/src/plugins/builtin/news/index.tsx +10 -1
  552. package/src/plugins/builtin/news/wire/index.tsx +3 -2
  553. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
  554. package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
  555. package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
  556. package/src/plugins/builtin/notes/cli.ts +49 -14
  557. package/src/plugins/builtin/openfda/pane.tsx +1 -1
  558. package/src/plugins/builtin/options/carry.ts +2 -2
  559. package/src/plugins/builtin/options/index.tsx +1 -1
  560. package/src/plugins/builtin/options/view.tsx +10 -10
  561. package/src/plugins/builtin/options-calculator/headless.ts +46 -7
  562. package/src/plugins/builtin/options-scenario/client.ts +123 -28
  563. package/src/plugins/builtin/options-scenario/collar.ts +8 -6
  564. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
  565. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
  566. package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
  567. package/src/plugins/builtin/options-scenario/csp.ts +101 -21
  568. package/src/plugins/builtin/options-scenario/headless.ts +36 -15
  569. package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
  570. package/src/plugins/builtin/options-scenario/index.tsx +28 -3
  571. package/src/plugins/builtin/options-scenario/model.ts +13 -0
  572. package/src/plugins/builtin/options-scenario/pane.tsx +9 -5
  573. package/src/plugins/builtin/perps/equity-row.tsx +11 -3
  574. package/src/plugins/builtin/perps/freshness.ts +8 -5
  575. package/src/plugins/builtin/perps/headless.ts +3 -1
  576. package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
  577. package/src/plugins/builtin/perps/live-rows.ts +161 -0
  578. package/src/plugins/builtin/perps/markets-section.tsx +154 -0
  579. package/src/plugins/builtin/perps/pane.tsx +36 -17
  580. package/src/plugins/builtin/perps/venue-markets.ts +96 -0
  581. package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
  582. package/src/plugins/builtin/plugin-marketplace/pane.tsx +143 -59
  583. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
  584. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
  585. package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
  586. package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
  587. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
  588. package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
  589. package/src/plugins/builtin/portfolio-list/income.ts +13 -2
  590. package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
  591. package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
  592. package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
  593. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
  594. package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
  595. package/src/plugins/builtin/power/client.ts +4 -1
  596. package/src/plugins/builtin/power/evidence.ts +22 -7
  597. package/src/plugins/builtin/power/gas.tsx +5 -1
  598. package/src/plugins/builtin/power/pane.tsx +8 -1
  599. package/src/plugins/builtin/power/prices.tsx +10 -3
  600. package/src/plugins/builtin/research/analyst-headless.ts +25 -8
  601. package/src/plugins/builtin/research/analyst-model.ts +68 -3
  602. package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
  603. package/src/plugins/builtin/research/event-model.ts +3 -1
  604. package/src/plugins/builtin/research/event-sources.ts +12 -4
  605. package/src/plugins/builtin/research/index.tsx +2 -1
  606. package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
  607. package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
  608. package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
  609. package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
  610. package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
  611. package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
  612. package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
  613. package/src/plugins/builtin/reverse-dcf/model.ts +6 -2
  614. package/src/plugins/builtin/risk-factors/index.tsx +2 -2
  615. package/src/plugins/builtin/scanner/lock-note.ts +1 -1
  616. package/src/plugins/builtin/sec/forms.ts +13 -0
  617. package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
  618. package/src/plugins/builtin/sec/fund-facts.ts +68 -8
  619. package/src/plugins/builtin/sec/headless.ts +85 -8
  620. package/src/plugins/builtin/sec/index.tsx +58 -12
  621. package/src/plugins/builtin/sectors/client.ts +2 -1
  622. package/src/plugins/builtin/sectors/sector-model.ts +11 -15
  623. package/src/plugins/builtin/series-inventory.ts +2 -0
  624. package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
  625. package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
  626. package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
  627. package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
  628. package/src/plugins/builtin/shared/earnings-report.ts +3 -3
  629. package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
  630. package/src/plugins/builtin/shared/job-posting.ts +129 -0
  631. package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
  632. package/src/plugins/builtin/shared/report-freshness.ts +3 -0
  633. package/src/plugins/builtin/shared/research-trading.tsx +21 -0
  634. package/src/plugins/builtin/shared/series-cache.ts +2 -0
  635. package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
  636. package/src/plugins/builtin/short-interest/client.ts +2 -0
  637. package/src/plugins/builtin/short-interest/headless.ts +41 -12
  638. package/src/plugins/builtin/short-interest/index.tsx +23 -1
  639. package/src/plugins/builtin/short-interest/model.ts +70 -19
  640. package/src/plugins/builtin/short-interest/pane.tsx +19 -2
  641. package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
  642. package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
  643. package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
  644. package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
  645. package/src/plugins/builtin/short-interest/schedule.ts +35 -2
  646. package/src/plugins/builtin/short-interest/surface.tsx +11 -4
  647. package/src/plugins/builtin/short-interest/types.ts +9 -0
  648. package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
  649. package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
  650. package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
  651. package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
  652. package/src/plugins/builtin/supply-chain/model.ts +51 -3
  653. package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
  654. package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
  655. package/src/plugins/builtin/themes/headless.ts +8 -5
  656. package/src/plugins/builtin/themes/model.ts +14 -4
  657. package/src/plugins/builtin/themes/pane.tsx +24 -5
  658. package/src/plugins/builtin/thirteenf/headless.ts +5 -5
  659. package/src/plugins/builtin/thirteenf/signals.ts +3 -1
  660. package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
  661. package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
  662. package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
  663. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
  664. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
  665. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
  666. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
  667. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
  668. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
  669. package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
  670. package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
  671. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
  672. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
  673. package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
  674. package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
  675. package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
  676. package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
  677. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
  678. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
  679. package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
  680. package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
  681. package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
  682. package/src/plugins/builtin/vol-surface/client.ts +5 -4
  683. package/src/plugins/builtin/vol-surface/headless.ts +12 -3
  684. package/src/plugins/builtin/vol-surface/model.ts +4 -2
  685. package/src/plugins/builtin/volatility/model.ts +5 -10
  686. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
  687. package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
  688. package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
  689. package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
  690. package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
  691. package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
  692. package/src/plugins/builtin/world-venue-map/index.ts +3 -26
  693. package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
  694. package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
  695. package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
  696. package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
  697. package/src/plugins/builtin/yield-curve/client.ts +25 -0
  698. package/src/plugins/builtin/yield-curve/curves.ts +7 -4
  699. package/src/plugins/builtin/yield-curve/headless.ts +38 -4
  700. package/src/plugins/builtin/yield-curve/history.ts +4 -3
  701. package/src/plugins/builtin/yield-curve/index.tsx +12 -6
  702. package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
  703. package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
  704. package/src/plugins/bundle.ts +1 -1
  705. package/src/plugins/catalog-browser.ts +2 -1
  706. package/src/plugins/compat.ts +3 -3
  707. package/src/plugins/dependencies.ts +75 -14
  708. package/src/plugins/extracted-plugins.ts +132 -34
  709. package/src/plugins/host-link.ts +149 -34
  710. package/src/plugins/installer.ts +35 -10
  711. package/src/plugins/loader.ts +206 -38
  712. package/src/plugins/manager-node.ts +2 -2
  713. package/src/plugins/marketplace/deactivation.ts +22 -0
  714. package/src/plugins/marketplace/model.ts +2 -2
  715. package/src/plugins/marketplace/packs.ts +1 -1
  716. package/src/plugins/ownership.ts +1 -1
  717. package/src/plugins/peer-retry.ts +155 -0
  718. package/src/plugins/registry/contributions.ts +3 -1
  719. package/src/plugins/registry/index.ts +4 -3
  720. package/src/plugins/registry/plugin-state.ts +3 -0
  721. package/src/plugins/seed-notice.ts +20 -0
  722. package/src/plugins/shortcut-argument.ts +39 -0
  723. package/src/portfolio/allocation.ts +1 -1
  724. package/src/portfolio/collection-name.ts +31 -0
  725. package/src/portfolio/column-values.ts +10 -8
  726. package/src/portfolio/cost-fx.ts +296 -19
  727. package/src/portfolio/manual-lots.ts +75 -0
  728. package/src/portfolio/mutations.ts +60 -22
  729. package/src/portfolio/suffixed-listings.ts +209 -0
  730. package/src/portfolio/totals-currency.ts +24 -0
  731. package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
  732. package/src/public/time-series.ts +11 -8
  733. package/src/remote/schema.ts +1 -1
  734. package/src/renderers/browser/config-host.ts +3 -0
  735. package/src/renderers/browser/main.tsx +23 -3
  736. package/src/renderers/dom/boot-frame-page.ts +187 -0
  737. package/src/renderers/dom/boot-frame.ts +237 -0
  738. package/src/renderers/dom/build-assets.ts +46 -8
  739. package/src/renderers/dom/dom-ui-host.tsx +4 -29
  740. package/src/renderers/dom/host/ascii-text.ts +16 -2
  741. package/src/renderers/dom/host/box.tsx +43 -2
  742. package/src/renderers/dom/host/chart-surface.tsx +2 -0
  743. package/src/renderers/dom/host/hls.chunk.ts +3 -0
  744. package/src/renderers/dom/host/image-surface.tsx +49 -0
  745. package/src/renderers/dom/host/media-surface.tsx +24 -18
  746. package/src/renderers/dom/host/mouse.ts +30 -0
  747. package/src/renderers/dom/host/size-observer.ts +1 -1
  748. package/src/renderers/dom/host/style.ts +1 -1
  749. package/src/renderers/dom/styles.css +76 -0
  750. package/src/renderers/dom/test-utils.tsx +2 -1
  751. package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
  752. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
  753. package/src/renderers/electrobun/bun/desktop/backend.ts +46 -3
  754. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
  755. package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
  756. package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
  757. package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
  758. package/src/renderers/electrobun/bun/index.ts +11 -1
  759. package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
  760. package/src/renderers/electrobun/bun/window/create.ts +4 -1
  761. package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
  762. package/src/renderers/electrobun/shared/protocol.ts +6 -1
  763. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  764. package/src/renderers/electrobun/view/config-host.ts +3 -0
  765. package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
  766. package/src/renderers/electrobun/view/main.tsx +30 -4
  767. package/src/renderers/electrobun/view/news-source.ts +5 -5
  768. package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
  769. package/src/renderers/electrobun/view/ui-host.tsx +1 -1
  770. package/src/renderers/opentui/browser-open.ts +88 -0
  771. package/src/renderers/opentui/host.tsx +5 -14
  772. package/src/renderers/opentui/image/loader.ts +3 -2
  773. package/src/renderers/opentui/native-smoke.ts +10 -1
  774. package/src/renderers/opentui/pane-image/index.ts +2 -1
  775. package/src/renderers/opentui/render-lib.ts +253 -0
  776. package/src/renderers/opentui/render-timing-smoke.ts +1 -1
  777. package/src/renderers/opentui/start.tsx +1 -1
  778. package/src/renderers/share/layout-view.tsx +2 -2
  779. package/src/renderers/share/main.tsx +4 -4
  780. package/src/renderers/share/view.tsx +1 -1
  781. package/src/series/resolve.ts +22 -6
  782. package/src/series/standalone.ts +30 -2
  783. package/src/series/types.ts +8 -1
  784. package/src/shares/api.ts +4 -1
  785. package/src/shares/pane.ts +1 -1
  786. package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
  787. package/src/sources/gloomberb-cloud/index.ts +32 -16
  788. package/src/sources/gloomberb-cloud/news.ts +39 -0
  789. package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
  790. package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
  791. package/src/sources/listing-symbols.ts +37 -0
  792. package/src/sources/provider-errors.ts +16 -2
  793. package/src/sources/provider-router/financial-routes.ts +21 -3
  794. package/src/sources/provider-router/financials.ts +15 -2
  795. package/src/sources/provider-router/history.ts +30 -8
  796. package/src/sources/provider-router/primary.ts +1 -1
  797. package/src/state/app/bootstrap.ts +23 -0
  798. package/src/state/hooks/inline-tickers.ts +30 -5
  799. package/src/sync/controller.ts +1 -1
  800. package/src/sync/core-contributors.ts +46 -14
  801. package/src/team/collections-sync.ts +2 -1
  802. package/src/team/collections.ts +178 -17
  803. package/src/telemetry/crash-reports.ts +17 -4
  804. package/src/test-support/builtin-panes.ts +1 -1
  805. package/src/theme/colors.ts +3 -30
  806. package/src/theme/ui-tokens.ts +37 -1
  807. package/src/tickers/company-name-listing.ts +210 -33
  808. package/src/tickers/index-roots.ts +47 -0
  809. package/src/tickers/instrument-label.ts +5 -1
  810. package/src/tickers/metadata.ts +10 -0
  811. package/src/tickers/perpetual-listing.ts +5 -2
  812. package/src/tickers/search/home-listing.ts +75 -0
  813. package/src/tickers/search/index.ts +76 -27
  814. package/src/tickers/search/ranking.ts +54 -4
  815. package/src/tickers/search/upsert.ts +29 -0
  816. package/src/tickers/terminal-codes.ts +416 -40
  817. package/src/time-series/bar-aggregation.ts +243 -0
  818. package/src/time-series/base-series.ts +307 -0
  819. package/src/time-series/chart-bounds.ts +349 -0
  820. package/src/time-series/chart-seed.ts +142 -0
  821. package/src/time-series/economic.ts +5 -0
  822. package/src/time-series/fundamentals.ts +18 -3
  823. package/src/time-series/history-acquisition.ts +499 -0
  824. package/src/time-series/leverage.ts +100 -0
  825. package/src/time-series/market-resolution.ts +4 -2
  826. package/src/time-series/market.ts +2 -1
  827. package/src/time-series/price-comparison.ts +175 -30
  828. package/src/time-series/range.ts +9 -1
  829. package/src/time-series/resolution.ts +174 -16
  830. package/src/time-series/resolve-context.ts +157 -0
  831. package/src/time-series/resolve.ts +126 -1577
  832. package/src/time-series/series-name.ts +38 -0
  833. package/src/time-series/series-presentation.ts +208 -0
  834. package/src/time-series/spec.ts +11 -6
  835. package/src/time-series/studies.ts +109 -12
  836. package/src/time-series/tail-reconcile.ts +121 -0
  837. package/src/time-series/types.ts +29 -2
  838. package/src/time-series/use-chart-resolution.ts +4 -5
  839. package/src/types/broker.ts +10 -0
  840. package/src/types/config.ts +14 -0
  841. package/src/types/data-provider.ts +14 -0
  842. package/src/types/exchange-rate.ts +6 -0
  843. package/src/types/financials.ts +104 -7
  844. package/src/types/headless.ts +76 -6
  845. package/src/types/instrument.ts +3 -0
  846. package/src/types/plugin.ts +65 -8
  847. package/src/types/price-history.ts +2 -0
  848. package/src/types/ticker.ts +13 -0
  849. package/src/types/trading.ts +59 -1
  850. package/src/ui/ascii-font.ts +13 -1
  851. package/src/ui/host.tsx +6 -1
  852. package/src/updater/command-names.ts +175 -0
  853. package/src/updater/index.ts +10 -5
  854. package/src/utils/calendar-date.ts +32 -15
  855. package/src/utils/cash-runway.ts +241 -0
  856. package/src/utils/central-banks.ts +42 -0
  857. package/src/utils/cli-output.ts +259 -80
  858. package/src/utils/contract-month.ts +16 -0
  859. package/src/utils/crypto-pair.ts +61 -3
  860. package/src/utils/currency-units.ts +29 -0
  861. package/src/utils/datetime-format.ts +10 -0
  862. package/src/utils/debug-log.ts +1 -1
  863. package/src/utils/decimal-comma.ts +39 -6
  864. package/src/utils/exchange-announcements.ts +71 -0
  865. package/src/utils/exchange-rate-snapshot.ts +10 -0
  866. package/src/utils/financial-statements.ts +83 -4
  867. package/src/utils/format.ts +34 -16
  868. package/src/utils/fundamentals.ts +150 -34
  869. package/src/utils/fx-market-hours.ts +10 -1
  870. package/src/utils/latest-financial-period.ts +8 -0
  871. package/src/utils/linux-libc.ts +54 -0
  872. package/src/utils/market-capitalization.ts +111 -15
  873. package/src/utils/max-drawdown.ts +64 -0
  874. package/src/utils/network-failure.ts +83 -0
  875. package/src/utils/option-expiry.ts +139 -7
  876. package/src/utils/price-earnings.ts +11 -5
  877. package/src/utils/price-history.ts +18 -8
  878. package/src/utils/price-window.ts +131 -0
  879. package/src/utils/release-date.ts +47 -0
  880. package/src/utils/sec.ts +3 -0
  881. package/src/utils/throttled-fetch.ts +11 -4
  882. package/src/utils/trailing-eps.ts +67 -0
  883. package/src/utils/typed-text.ts +21 -0
  884. package/src/utils/utc-time.ts +24 -1
  885. package/src/version.ts +6 -0
  886. package/src/cli/pane-functions/screenshot.ts +0 -2122
@@ -142,6 +142,38 @@ const HK_PETALS = Array.from({ length: 5 }, (_, index) => (
142
142
 
143
143
  const MY_STRIPES = [1, 3, 5].map((index) => `M0,${(index * FLAG_HEIGHT) / 7}h${FLAG_WIDTH}v${FLAG_HEIGHT / 7}h-${FLAG_WIDTH}z`).join("");
144
144
 
145
+ /** A serrated white hoist of `teeth` points, from `base` to `tip` across, as Bahrain's. */
146
+ function serration(teeth: number, base: number, tip: number): string {
147
+ const step = FLAG_HEIGHT / teeth;
148
+ return `M0,0H${base}${Array.from({ length: teeth }, (_, index) => `L${tip},${(index * step + step / 2).toFixed(2)}L${base},${((index + 1) * step).toFixed(2)}`).join("")}H0Z`;
149
+ }
150
+
151
+ /** Quarters of a field, top left, top right, bottom left, bottom right. */
152
+ function Quarters({ fills }: { fills: readonly [string, string, string, string] }) {
153
+ const w = FLAG_WIDTH / 2;
154
+ const h = FLAG_HEIGHT / 2;
155
+ return (
156
+ <>
157
+ {fills.map((fill, index) => (
158
+ <rect key={index} x={(index % 2) * w} y={Math.floor(index / 2) * h} width={w + 0.02} height={h + 0.02} fill={fill} />
159
+ ))}
160
+ </>
161
+ );
162
+ }
163
+
164
+ const GR_STRIPES = [1, 3, 5, 7].map((index) => `M0,${(index * FLAG_HEIGHT) / 9}h${FLAG_WIDTH}v${FLAG_HEIGHT / 9}h-${FLAG_WIDTH}z`).join("");
165
+ const VE_STARS = Array.from({ length: 8 }, (_, index) => {
166
+ const angle = Math.PI * (0.18 + (index * 0.64) / 7);
167
+ return star(15 - 5.2 * Math.cos(angle), 12.4 - 5.2 * Math.sin(angle), 0.9);
168
+ }).join("");
169
+ const HN_STARS = [[15, 10], [10.6, 8.2], [10.6, 11.8], [19.4, 8.2], [19.4, 11.8]].map(([cx, cy]) => star(cx!, cy!, 1.25)).join("");
170
+ /** Morocco's seal: a pentagram drawn as five interlaced lines, one point up. */
171
+ const MA_PENTAGRAM = `M${[0, 2, 4, 1, 3].map((index) => {
172
+ const angle = (Math.PI * 2 * index) / 5 - Math.PI / 2;
173
+ return `${(15 + 4.4 * Math.cos(angle)).toFixed(2)},${(10.3 + 4.4 * Math.sin(angle)).toFixed(2)}`;
174
+ }).join("L")}Z`;
175
+ const UZ_STARS = [[9.6, 1.6], [11.6, 1.6], [13.6, 1.6], [11.6, 3.4], [13.6, 3.4], [13.6, 5.2]].map(([cx, cy]) => star(cx!, cy!, 0.62)).join("");
176
+
145
177
  /**
146
178
  * Hand-drawn at the size they are shown, the way a table shows them: a little
147
179
  * simpler than the real thing (7 stripes, a ring of dots) so each stays
@@ -446,4 +478,152 @@ export const FLAG_ART: Record<string, ReactNode> = {
446
478
  <path d={sunRays(15, 10, 2.6, 3.9, 16)} stroke="#f6b40e" strokeWidth=".7" />
447
479
  </>
448
480
  ),
481
+
482
+ // The euro area's members, for the calendars and boards that name them.
483
+ DE: <Bands colors={[BLACK, "#dd0000", "#ffce00"]} />,
484
+ FR: <Bands colors={["#002395", WHITE, "#ed2939"]} vertical />,
485
+ IT: <Bands colors={["#009246", WHITE, "#ce2b37"]} vertical />,
486
+ ES: <Bands colors={["#aa151b", "#f1bf00", "#aa151b"]} weights={[1, 2, 1]} />,
487
+ NL: <Bands colors={["#ae1c28", WHITE, "#21468b"]} />,
488
+ BE: <Bands colors={[BLACK, "#fdda24", "#ef3340"]} vertical />,
489
+ AT: <Bands colors={["#c8102e", WHITE, "#c8102e"]} />,
490
+ IE: <Bands colors={["#169b62", WHITE, "#ff883e"]} vertical />,
491
+ PT: (
492
+ <>
493
+ <Bands colors={["#006600", "#ff0000"]} weights={[2, 3]} vertical />
494
+ <circle cx="12" cy="10" r="3.6" fill="none" stroke={GOLD} strokeWidth="1.3" />
495
+ <path d="M10.6,8.2h2.8v2.6c0,1-.6,1.6-1.4,1.9c-.8-.3-1.4-.9-1.4-1.9z" fill={WHITE} stroke="#ff0000" strokeWidth=".5" />
496
+ </>
497
+ ),
498
+ FI: (
499
+ <>
500
+ <Field fill={WHITE} />
501
+ <NordicCross x={8.4} thickness={5} fill="#002f6c" />
502
+ </>
503
+ ),
504
+ GR: (
505
+ <>
506
+ <Field fill={WHITE} />
507
+ <path d={GR_STRIPES} fill="#0d5eaf" />
508
+ <rect width="11.1" height="11.1" fill="#0d5eaf" />
509
+ <path d="M4.44,0h2.22v11.1h-2.22zM0,4.44h11.1v2.22h-11.1z" fill={WHITE} />
510
+ </>
511
+ ),
512
+ LU: <Bands colors={["#ed2939", WHITE, "#00a1de"]} />,
513
+ EE: <Bands colors={["#0072ce", BLACK, WHITE]} />,
514
+ LV: <Bands colors={["#9e3039", WHITE, "#9e3039"]} weights={[2, 1, 2]} />,
515
+ LT: <Bands colors={["#fdb913", "#006a44", "#c1272d"]} />,
516
+
517
+ // The rest of Europe that boards and calendars show.
518
+ IS: (
519
+ <>
520
+ <Field fill="#02529c" />
521
+ <NordicCross x={8} thickness={4.6} fill={WHITE} />
522
+ <NordicCross x={9.1} thickness={2.4} fill="#dc1e35" />
523
+ </>
524
+ ),
525
+ BG: <Bands colors={[WHITE, "#00966e", "#d62612"]} />,
526
+ RU: <Bands colors={[WHITE, "#0039a6", "#d52b1e"]} />,
527
+
528
+ // Sovereign credit, oil and crop producers.
529
+ BH: (
530
+ <>
531
+ <Field fill="#ce1126" />
532
+ <path d={serration(5, 7.5, 11)} fill={WHITE} />
533
+ </>
534
+ ),
535
+ KW: (
536
+ <>
537
+ <Bands colors={["#007a3d", WHITE, "#ce1126"]} />
538
+ <path d="M0,0L7.5,6.67V13.33L0,20Z" fill={BLACK} />
539
+ </>
540
+ ),
541
+ IR: (
542
+ <>
543
+ <Bands colors={["#239f40", WHITE, "#da0000"]} />
544
+ <path d="M15,7.9V12.1M13.3,8.4C12.4,9.6 12.6,11.3 14,12M16.7,8.4C17.6,9.6 17.4,11.3 16,12" fill="none" stroke="#da0000" strokeWidth=".7" />
545
+ </>
546
+ ),
547
+ IQ: (
548
+ <>
549
+ <Bands colors={["#ce1126", WHITE, BLACK]} />
550
+ <path d="M11.2,8.6v2.6h1.8M14.1,8.6v2.6M15.6,11.2h1.4v-2.6M18.4,8.6v2.6" fill="none" stroke="#007a3d" strokeWidth=".75" />
551
+ </>
552
+ ),
553
+ CI: <Bands colors={["#f77f00", WHITE, "#009e60"]} vertical />,
554
+ DO: (
555
+ <>
556
+ <Quarters fills={["#002d62", "#ce1126", "#ce1126", "#002d62"]} />
557
+ <path d="M15,0V20M0,10H30" stroke={WHITE} strokeWidth="3.6" />
558
+ </>
559
+ ),
560
+ PA: (
561
+ <>
562
+ <Quarters fills={[WHITE, "#da121a", "#072357", WHITE]} />
563
+ <path d={star(7.5, 5, 2.3)} fill="#072357" />
564
+ <path d={star(22.5, 15, 2.3)} fill="#da121a" />
565
+ </>
566
+ ),
567
+ VE: (
568
+ <>
569
+ <Bands colors={["#ffcc00", "#00247d", "#cf142b"]} />
570
+ <path d={VE_STARS} fill={WHITE} />
571
+ </>
572
+ ),
573
+ BO: <Bands colors={["#d52b1e", "#f9e300", "#007934"]} />,
574
+ PY: (
575
+ <>
576
+ <Bands colors={["#d52b1e", WHITE, "#0038a8"]} />
577
+ <circle cx="15" cy="10" r="2.3" fill={WHITE} stroke="#0038a8" strokeWidth=".6" />
578
+ <path d={star(15, 10, 1.2)} fill="#f6b40e" />
579
+ </>
580
+ ),
581
+ HN: (
582
+ <>
583
+ <Bands colors={["#0073cf", WHITE, "#0073cf"]} />
584
+ <path d={HN_STARS} fill="#0073cf" />
585
+ </>
586
+ ),
587
+ BJ: (
588
+ <>
589
+ <Bands colors={["#fcd116", "#e8112d"]} />
590
+ <rect width="12" height={FLAG_HEIGHT} fill="#008751" />
591
+ </>
592
+ ),
593
+ ET: (
594
+ <>
595
+ <Bands colors={["#078930", "#fcdd09", "#da121a"]} />
596
+ <circle cx="15" cy="10" r="4.6" fill="#0f47af" />
597
+ <path d={star(15, 10, 3.4, 5, 1.3)} fill="none" stroke="#fcdd09" strokeWidth=".7" />
598
+ </>
599
+ ),
600
+ UG: (
601
+ <>
602
+ <Bands colors={[BLACK, "#fcdc04", "#d90000", BLACK, "#fcdc04", "#d90000"]} />
603
+ <circle cx="15" cy="10" r="3.8" fill={WHITE} />
604
+ <path d="M14.2,8.2c.9-.8 2.1-.4 2.2.7l-.6.6v2.8h-.8v-2.4c-.6.1-1.2-.2-1.4-.7z" fill={BLACK} />
605
+ </>
606
+ ),
607
+ UZ: (
608
+ <>
609
+ <Bands colors={["#0099b5", "#ce1126", WHITE, "#ce1126", "#1eb53a"]} weights={[6.4, 0.4, 6.4, 0.4, 6.4]} />
610
+ <Crescent cx={5} cy={3.3} r={2.3} bite={2} shift={0.9} fill={WHITE} back="#0099b5" />
611
+ <path d={UZ_STARS} fill={WHITE} />
612
+ </>
613
+ ),
614
+ TN: (
615
+ <>
616
+ <Field fill="#e70013" />
617
+ <circle cx="15" cy="10" r="5" fill={WHITE} />
618
+ <Crescent cx={14.4} cy={10} r={3.75} bite={3} shift={0.95} fill="#e70013" back={WHITE} />
619
+ <path d={star(16, 10, 1.9, 5, undefined, 90)} fill="#e70013" />
620
+ </>
621
+ ),
622
+ MA: (
623
+ <>
624
+ <Field fill="#c1272d" />
625
+ <path d={MA_PENTAGRAM} fill="none" stroke="#006233" strokeWidth=".75" strokeLinejoin="round" />
626
+ </>
627
+ ),
628
+ CR: <Bands colors={["#002b7f", WHITE, "#ce1126", WHITE, "#002b7f"]} weights={[1, 1, 2, 1, 1]} />,
449
629
  };
@@ -1,20 +1,38 @@
1
+ import { createElement, type CSSProperties } from "react";
1
2
  import { useUiCapabilities } from "../../ui";
3
+ import type { DataTableCell } from "./data-table";
2
4
  import { FLAG_ART, FLAG_HEIGHT, FLAG_WIDTH } from "./country-flag-art";
3
5
 
4
6
  export interface CountryFlagProps {
5
7
  /** ISO 3166 region, or `EU` for the euro area. Anything not drawn renders nothing. */
6
- region: string;
8
+ region: string | null | undefined;
9
+ /**
10
+ * Keep the flag's room, blank, for a region with no art: a column of
11
+ * countries keeps its text in line whether or not each row has a flag.
12
+ */
13
+ reserve?: boolean;
7
14
  }
8
15
 
16
+ const FLAG_STYLE = {
17
+ display: "block",
18
+ flex: "none",
19
+ width: "calc(var(--cell-w, 8px) * 2.25)",
20
+ height: "calc(var(--cell-w, 8px) * 1.5)",
21
+ } as const;
22
+
9
23
  /**
10
24
  * A small flag, 2.25 grid cells wide, for the desktop and the web. Decoration
11
25
  * only: it is hidden from assistive technology, so the label beside it stays
12
26
  * the name. The terminal draws nothing.
13
27
  */
14
- export function CountryFlag({ region }: CountryFlagProps) {
28
+ export function CountryFlag({ region, reserve = false }: CountryFlagProps) {
15
29
  const desktop = useUiCapabilities().nativePaneChrome === true;
16
- const art = FLAG_ART[region];
17
- if (!desktop || !art) return null;
30
+ return desktop ? flagArt(region, reserve, FLAG_STYLE) : null;
31
+ }
32
+
33
+ function flagArt(region: string | null | undefined, reserve: boolean, style: CSSProperties) {
34
+ const art = region ? FLAG_ART[region] : undefined;
35
+ if (!art) return reserve ? <svg aria-hidden="true" focusable="false" data-gloom-role="country-flag-room" style={style} /> : null;
18
36
  return (
19
37
  <svg
20
38
  viewBox={`0 0 ${FLAG_WIDTH} ${FLAG_HEIGHT}`}
@@ -22,14 +40,7 @@ export function CountryFlag({ region }: CountryFlagProps) {
22
40
  focusable="false"
23
41
  data-gloom-role="country-flag"
24
42
  data-region={region}
25
- style={{
26
- display: "block",
27
- flex: "none",
28
- width: "calc(var(--cell-w, 8px) * 2.25)",
29
- height: "calc(var(--cell-w, 8px) * 1.5)",
30
- borderRadius: 2,
31
- overflow: "hidden",
32
- }}
43
+ style={{ ...style, borderRadius: 2, overflow: "hidden" }}
33
44
  >
34
45
  {art}
35
46
  <rect
@@ -39,3 +50,98 @@ export function CountryFlag({ region }: CountryFlagProps) {
39
50
  </svg>
40
51
  );
41
52
  }
53
+
54
+ /** A table cell's flag sits this far from its text; a flag before any other label keeps the same gap. */
55
+ const LEAD_STYLE = { ...FLAG_STYLE, marginRight: "var(--gloom-space-xs)" } as const;
56
+
57
+ /**
58
+ * The flag of the country `value` names, before a label outside a table: a
59
+ * field's value, a bar's label, a heading. It keeps the gap a table cell's
60
+ * flag has. `reserve` keeps the room, blank, for a value with no flag, so a
61
+ * list's labels stay in line. The terminal draws nothing.
62
+ */
63
+ export function CountryFlagLead({ value, reserve = false }: { value: string | null | undefined; reserve?: boolean }) {
64
+ const desktop = useUiCapabilities().nativePaneChrome === true;
65
+ return desktop ? flagArt(flagRegion(value), reserve, LEAD_STYLE) : null;
66
+ }
67
+
68
+ /**
69
+ * The cells a flag and the gap after it take at the start of a table cell. A
70
+ * column sized for its text widens by this on the desktop, where the flag is
71
+ * drawn, so the text keeps its room.
72
+ */
73
+ export const COUNTRY_FLAG_CELLS = 3;
74
+
75
+ /** A column of countries, widened on the desktop by the flag that leads each. */
76
+ export function withFlagRoom<C extends { width: number }>(column: C, desktop: boolean): C {
77
+ return desktop ? { ...column, width: column.width + COUNTRY_FLAG_CELLS } : column;
78
+ }
79
+
80
+ /** The euro area, as sources write it. */
81
+ const EURO_AREA = new Set(["EU", "EA", "EMU", "EZ", "EUR", "EUROZONE", "EURO AREA", "EURO ZONE", "EUROPEAN UNION"]);
82
+
83
+ /**
84
+ * What sources call a country when it is not its English name: alpha-3
85
+ * codes, short and old names. Only regions with a flag are listed.
86
+ */
87
+ const REGION_ALIASES: Readonly<Record<string, string>> = {
88
+ UK: "GB", GBR: "GB", "GREAT BRITAIN": "GB", BRITAIN: "GB", ENGLAND: "GB",
89
+ USA: "US", "U.S.": "US", "UNITED STATES OF AMERICA": "US",
90
+ JPN: "JP", CHE: "CH", CAN: "CA", AUS: "AU", NZL: "NZ", SWE: "SE", NOR: "NO", DNK: "DK", HKG: "HK", SGP: "SG",
91
+ CHN: "CN", "MAINLAND CHINA": "CN", "CHINA (MAINLAND)": "CN", "PEOPLE'S REPUBLIC OF CHINA": "CN",
92
+ KOR: "KR", KOREA: "KR", "REPUBLIC OF KOREA": "KR", "KOREA, SOUTH": "KR", "KOREA, REPUBLIC OF": "KR",
93
+ TWN: "TW", "TAIWAN, CHINA": "TW", IND: "IN", IDN: "ID", MYS: "MY", PHL: "PH", THA: "TH", VNM: "VN", "VIET NAM": "VN", PAK: "PK",
94
+ POL: "PL", CZE: "CZ", "CZECH REPUBLIC": "CZ", HUN: "HU", ROU: "RO", UKR: "UA", TUR: "TR", TURKEY: "TR", "TÜRKIYE": "TR", TURKIYE: "TR",
95
+ KAZ: "KZ", ISR: "IL", SAU: "SA", ARE: "AE", UAE: "AE", QAT: "QA", EGY: "EG", ZAF: "ZA", NGA: "NG", KEN: "KE",
96
+ MEX: "MX", BRA: "BR", COL: "CO", CHL: "CL", PER: "PE", ARG: "AR",
97
+ DEU: "DE", FRA: "FR", ITA: "IT", ESP: "ES", NLD: "NL", HOLLAND: "NL", "THE NETHERLANDS": "NL", BEL: "BE", AUT: "AT", IRL: "IE",
98
+ PRT: "PT", FIN: "FI", GRC: "GR", LUX: "LU", ISL: "IS", EST: "EE", LVA: "LV", LTU: "LT", BGR: "BG",
99
+ RUS: "RU", "RUSSIAN FEDERATION": "RU", BHR: "BH", CIV: "CI", "IVORY COAST": "CI", "COTE D'IVOIRE": "CI", "CÔTE D'IVOIRE": "CI",
100
+ "HONG KONG": "HK", "HONG KONG SAR": "HK", DOM: "DO", PAN: "PA", KWT: "KW", IRN: "IR", IRAN: "IR", "IRAN, ISLAMIC REPUBLIC OF": "IR", IRQ: "IQ", VEN: "VE", VENEZUELA: "VE",
101
+ BEN: "BJ", BOL: "BO", BOLIVIA: "BO", ETH: "ET", HND: "HN", PRY: "PY", UGA: "UG", UZB: "UZ",
102
+ TUN: "TN", MAR: "MA", CRI: "CR",
103
+ };
104
+
105
+ let regionCodes: Map<string, string> | null = null;
106
+
107
+ /** English names of every region with a flag, from the runtime's region names. */
108
+ function namedRegions(): Map<string, string> {
109
+ if (regionCodes) return regionCodes;
110
+ regionCodes = new Map();
111
+ try {
112
+ const names = new Intl.DisplayNames(["en"], { type: "region", fallback: "none" });
113
+ for (const code of Object.keys(FLAG_ART)) {
114
+ const name = names.of(code);
115
+ if (name) regionCodes.set(name.toUpperCase().replaceAll("’", "'"), code);
116
+ }
117
+ } catch {
118
+ // Intentional ignore: without region names, codes and the aliases above still resolve.
119
+ }
120
+ return regionCodes;
121
+ }
122
+
123
+ /**
124
+ * The region whose flag stands for `value`, as a pane shows it: an ISO 3166
125
+ * alpha-2 or alpha-3 code (`GB`, `GBR`, `UK`), the euro area (`EU`, `EA`,
126
+ * "Euro area"), or the country's English name ("United Kingdom", "Korea").
127
+ * Null for anything with no flag: a region, a city, several countries.
128
+ */
129
+ export function flagRegion(value: string | null | undefined): string | null {
130
+ const key = value?.trim().toUpperCase();
131
+ if (!key) return null;
132
+ if (EURO_AREA.has(key)) return "EU";
133
+ const code = REGION_ALIASES[key] ?? (/^[A-Z]{2}$/.test(key) ? key : namedRegions().get(key.replaceAll("’", "'")) ?? null);
134
+ return code && FLAG_ART[code] ? code : null;
135
+ }
136
+
137
+ /**
138
+ * A table cell led by the flag of the country `value` names, through the
139
+ * cell's `leading`, on the desktop and the web. The terminal's cell comes
140
+ * back as it was, so its output does not change. A value with no flag keeps
141
+ * the flag's room, blank, so a column's text stays in line; widen the column
142
+ * by `COUNTRY_FLAG_CELLS` on the desktop.
143
+ */
144
+ export function withCountryFlag(cell: DataTableCell, value: string | null | undefined, desktop: boolean): DataTableCell {
145
+ if (!desktop) return cell;
146
+ return { ...cell, leading: createElement(CountryFlag, { region: flagRegion(value), reserve: true }) };
147
+ }
@@ -5,6 +5,7 @@ import { useThemeColors } from "../../../../theme/theme-context";
5
5
  import { usePaneInstance } from "../../../../state/app/context";
6
6
  import { useViewport } from "../../../../react/input";
7
7
  import { measurePerf } from "../../../../utils/perf-marks";
8
+ import { displayWidth } from "../../../../utils/format";
8
9
  import { useDoubleClickActivation } from "../../../use-double-click-activation";
9
10
  import { useScrollBoxScrollActivity } from "../../../table-view-shared";
10
11
  import { EmptyState } from "../../status";
@@ -31,6 +32,7 @@ import {
31
32
  cutColumnText,
32
33
  resolveDataTableColumnClips,
33
34
  resolveDataTableVisibleWindow,
35
+ resolveMoreColumnsHint,
34
36
  reuseDataTableColumnClips,
35
37
  type DataTableColumnClip,
36
38
  } from "./model";
@@ -378,6 +380,27 @@ export function OpenTuiDataTable<T, C extends DataTableColumn = DataTableColumn>
378
380
  () => tableColumnStarts(displayColumns, columnGap),
379
381
  [columnGap, displayColumns],
380
382
  );
383
+ // Columns out of view past the right edge: the header row ends in "more →" there, a press on it scrolls to
384
+ // them, and the rows leave its cells blank, so a narrow pane says it has more than it shows. The header's
385
+ // scroll box is as wide as the body's viewport (measuredViewportWidth), so the header row has a blank cell
386
+ // past it, over the body's vertical scrollbar; the hint is laid over the row, not inside the scroll box,
387
+ // and takes that cell first.
388
+ const besideHeader = Math.max(0, Math.min(1, (scrollRef.current?.width ?? 0) - measuredViewportWidth));
389
+ const moreColumns = horizontalScrollbarVisible ? resolveMoreColumnsHint({
390
+ columns: displayColumns.map((column) => ({
391
+ width: column.width,
392
+ align: column.align,
393
+ label: sortColumnId === column.id ? `${column.label}${column.label ? " " : ""}▲` : column.label,
394
+ })),
395
+ columnGap,
396
+ columnStarts,
397
+ frozenFirstColumn: freezeFirstColumn,
398
+ besideHeader,
399
+ horizontalPadding,
400
+ scrollLeft,
401
+ viewportWidth: measuredViewportWidth,
402
+ }) : null;
403
+ const moreColumnsReserve = moreColumns?.reserve ?? 0;
381
404
  // A scroll step that cuts the columns as the last one did keeps the same
382
405
  // array, so the memoized rows skip the render.
383
406
  const columnClipsRef = useRef<readonly (DataTableColumnClip | null)[] | null>(null);
@@ -387,12 +410,13 @@ export function OpenTuiDataTable<T, C extends DataTableColumn = DataTableColumn>
387
410
  columnStarts,
388
411
  frozenFirstColumn: freezeFirstColumn,
389
412
  horizontalPadding,
413
+ rightReserve: moreColumnsReserve,
390
414
  scrollLeft,
391
415
  // A table that cannot scroll sideways fits its own columns; one it cut could never be scrolled to.
392
416
  viewportWidth: showHorizontalScrollbar ? measuredViewportWidth : 0,
393
417
  widths: displayColumns.map((column) => column.width),
394
418
  })),
395
- [columnGap, columnStarts, displayColumns, freezeFirstColumn, horizontalPadding, measuredViewportWidth, scrollLeft, showHorizontalScrollbar],
419
+ [columnGap, columnStarts, displayColumns, freezeFirstColumn, horizontalPadding, measuredViewportWidth, moreColumnsReserve, scrollLeft, showHorizontalScrollbar],
396
420
  );
397
421
  const reportVisibleRange = useVisibleRangeEmitter({
398
422
  itemCount: items.length,
@@ -454,6 +478,17 @@ export function OpenTuiDataTable<T, C extends DataTableColumn = DataTableColumn>
454
478
  scrollRef: headerScrollRef,
455
479
  onHorizontalScroll: syncBodyScroll,
456
480
  });
481
+ // "more →" steps right as Shift+Right does: half the viewport.
482
+ const scrollToMoreColumns = useCallback(() => {
483
+ const body = scrollRef.current;
484
+ const viewportWidth = body?.viewport?.width ?? 0;
485
+ if (!body || viewportWidth <= 0) return;
486
+ const maxLeft = Math.max(0, (body.scrollWidth ?? 0) - viewportWidth);
487
+ body.scrollLeft = Math.min(maxLeft, (body.scrollLeft ?? 0) + Math.max(1, Math.floor(viewportWidth / 2)));
488
+ syncHeaderScroll();
489
+ setScrollLeft(body.scrollLeft ?? 0);
490
+ nativeRenderer.requestRender();
491
+ }, [nativeRenderer, scrollRef, syncHeaderScroll]);
457
492
  const handleBodySizeChange = useCallback(() => {
458
493
  measureContentWidth();
459
494
  setScrollVersion((current) => current + 1);
@@ -616,7 +651,9 @@ export function OpenTuiDataTable<T, C extends DataTableColumn = DataTableColumn>
616
651
  const hasNextLabel = columnIndex < displayColumns.length - 1
617
652
  && tableColumnLeadGap(displayColumns, columnIndex + 1, columnGap) === 0;
618
653
  const label = column.label + indicator;
619
- const labelText = " ".repeat(inset) + (clip
654
+ // A figure the right edge cuts is blank in every row (cutColumnText), so its label is too.
655
+ const figuresCut = clip !== null && column.align === "right" && clip.inset + clip.width < column.width;
656
+ const labelText = figuresCut ? " ".repeat(inset + Math.max(0, clip.width)) : " ".repeat(inset) + (clip
620
657
  // Cut on the right, the label's last cell is the edge.
621
658
  ? cutColumnText(label, column.align, column.width, clip, (text, width, cutRight) => (
622
659
  fitTableHeaderText(text, width, column.align, hasNextLabel && !cutRight)
@@ -650,6 +687,28 @@ export function OpenTuiDataTable<T, C extends DataTableColumn = DataTableColumn>
650
687
  })}
651
688
  </Box>
652
689
  </ScrollBox>
690
+ {moreColumns ? (
691
+ <Box
692
+ position="absolute"
693
+ top={0}
694
+ left={moreColumns.left}
695
+ width={displayWidth(moreColumns.text)}
696
+ height={1}
697
+ zIndex={2}
698
+ backgroundColor={colors.panel}
699
+ hoverBackgroundColor={hoverBg(colors)}
700
+ cursor="pointer"
701
+ onMouseDown={(event: any) => {
702
+ event.preventDefault?.();
703
+ event.stopPropagation?.();
704
+ focusPane();
705
+ onTableMouseDown?.(event);
706
+ scrollToMoreColumns();
707
+ }}
708
+ >
709
+ <Text fg={colors.textDim}>{moreColumns.text}</Text>
710
+ </Box>
711
+ ) : null}
653
712
 
654
713
  <ScrollBox
655
714
  id={bodyScrollId}
@@ -1,4 +1,5 @@
1
1
  import { displayWidth } from "../../../../utils/format";
2
+ import { tableColumnLeadGap } from "../../table-layout";
2
3
 
3
4
  /**
4
5
  * Where the viewport cuts a column: `inset` cells hidden on its left (past the
@@ -61,10 +62,113 @@ export function reuseDataTableColumnClips(
61
62
  return previous.length === next.length && next.every((clip, index) => sameClip(clip, previous[index] ?? null)) ? previous : next;
62
63
  }
63
64
 
65
+ /**
66
+ * What a table's header says at its right edge while columns are out of view
67
+ * past it, longest first: the longest that fits beside the last column shown
68
+ * whole is drawn. With that column against the edge, the arrow takes the
69
+ * blank its label ends in. The hint never hides a column: with no blank to
70
+ * take, the horizontal scrollbar is the only sign.
71
+ */
72
+ const MORE_COLUMNS_LABELS = ["more →", "more", "→"] as const;
73
+
74
+ export interface MoreColumnsHint {
75
+ /** The cells the hint draws: its label, after a blank unless it takes the last column's own. */
76
+ text: string;
77
+ /** Where `text` starts, from the viewport's left edge. */
78
+ left: number;
79
+ /** Cells at the body's right edge the rows leave blank under the hint (`resolveDataTableColumnClips`). */
80
+ reserve: number;
81
+ }
82
+
83
+ interface HintColumn {
84
+ width: number;
85
+ align?: string;
86
+ /** The header label as drawn, with its sort mark. */
87
+ label: string;
88
+ }
89
+
90
+ /**
91
+ * Whether a column is out of view past the body's right edge at this scroll.
92
+ * A column the edge cuts counts when it shows nothing to read: figures cut on
93
+ * the right are blank (`cutColumnText`), and text shows less than its label.
94
+ * Text cut after its label ends in an ellipsis instead.
95
+ */
96
+ function hasColumnsPastRightEdge(columns: readonly HintColumn[], starts: readonly number[], right: number): boolean {
97
+ return columns.some((column, index) => {
98
+ const start = starts[index] ?? 0;
99
+ if (start + column.width <= right) return false;
100
+ const shown = right - start;
101
+ return shown <= 0 || (column.align ?? "left") !== "left" || shown < displayWidth(column.label);
102
+ });
103
+ }
104
+
105
+ /**
106
+ * The "more →" hint at the header's right edge while columns are out of view
107
+ * past it, or null. The header's scroll box is as wide as the viewport, and
108
+ * `besideHeader` blank cells follow it on the header row (the cell over the
109
+ * body's vertical scrollbar); the hint, laid over the row, can reach them.
110
+ * The hint sits after a blank: a gap, cells past the last column shown whole,
111
+ * or that column's own trailing blank (a label shorter than its column keeps
112
+ * one, `fitTableHeaderText`), and only cut columns give it room. Never in a
113
+ * viewport too narrow to show a column beside it, or before it is measured.
114
+ */
115
+ export function resolveMoreColumnsHint({
116
+ columns,
117
+ columnGap,
118
+ columnStarts,
119
+ besideHeader = 0,
120
+ frozenFirstColumn = false,
121
+ horizontalPadding,
122
+ scrollLeft,
123
+ viewportWidth,
124
+ }: {
125
+ columns: readonly HintColumn[];
126
+ columnGap: number;
127
+ /** Where each column's content starts, from the first column (tableColumnStarts). */
128
+ columnStarts: readonly number[];
129
+ /** Blank cells right of the header's scroll box on the header row. */
130
+ besideHeader?: number;
131
+ frozenFirstColumn?: boolean;
132
+ horizontalPadding: number;
133
+ scrollLeft: number;
134
+ viewportWidth: number;
135
+ }): MoreColumnsHint | null {
136
+ const longest = displayWidth(MORE_COLUMNS_LABELS[0]) + 1;
137
+ if (columns.length === 0 || viewportWidth < longest * 2) return null;
138
+ const right = scrollLeft + viewportWidth;
139
+ const starts = columns.map((_, index) => horizontalPadding + (columnStarts[index] ?? 0));
140
+ if (!hasColumnsPastRightEdge(columns, starts, right)) return null;
141
+ // The last column drawn whole (a frozen first column rides along with the scroll), and whether its label
142
+ // ends in a blank of its own.
143
+ let lastEnd = scrollLeft;
144
+ let lastPadded = false;
145
+ columns.forEach((column, index) => {
146
+ const start = (starts[index] ?? 0) + (frozenFirstColumn && index === 0 ? scrollLeft : 0);
147
+ const end = start + column.width;
148
+ if (end > right || end <= lastEnd) return;
149
+ lastEnd = end;
150
+ const next = columns[index + 1];
151
+ lastPadded = !!next && tableColumnLeadGap(columns, index + 1, columnGap) === 0 && displayWidth(column.label) < column.width;
152
+ });
153
+ const headerRight = right + Math.max(0, besideHeader);
154
+ const place = (label: string) => {
155
+ const labelStart = headerRight - displayWidth(label);
156
+ // The rows stop where the blank before the label starts, unless that blank is the last column's own.
157
+ const rowsEnd = labelStart === lastEnd && lastPadded ? lastEnd : labelStart - 1;
158
+ return { text: ` ${label}`, left: labelStart - 1 - scrollLeft, reserve: Math.max(0, right - rowsEnd), fits: rowsEnd >= lastEnd };
159
+ };
160
+ const fitted = MORE_COLUMNS_LABELS.map(place).find((candidate) => candidate.fits);
161
+ if (fitted) return { text: fitted.text, left: fitted.left, reserve: fitted.reserve };
162
+ // The last column ends at the header's edge: the arrow takes its label's trailing blank, the rows keep it.
163
+ if (lastPadded && headerRight === lastEnd) return { text: MORE_COLUMNS_LABELS[2], left: lastEnd - 1 - scrollLeft, reserve: 0 };
164
+ return null;
165
+ }
166
+
64
167
  /**
65
168
  * Each column's clip at the current scroll, null for a column shown whole.
66
169
  * A frozen first column stays, and what slides under it counts as cut on the
67
- * left. Null for the whole table when every column is whole or nothing is
170
+ * left. `rightReserve` cells at the right edge show no column (under the
171
+ * "more →" hint, `resolveMoreColumnsHint`). Null for the whole table when every column is whole or nothing is
68
172
  * measured yet.
69
173
  */
70
174
  export function resolveDataTableColumnClips({
@@ -72,6 +176,7 @@ export function resolveDataTableColumnClips({
72
176
  columnStarts,
73
177
  frozenFirstColumn,
74
178
  horizontalPadding,
179
+ rightReserve = 0,
75
180
  scrollLeft,
76
181
  viewportWidth,
77
182
  widths,
@@ -81,13 +186,15 @@ export function resolveDataTableColumnClips({
81
186
  columnStarts: readonly number[];
82
187
  frozenFirstColumn: boolean;
83
188
  horizontalPadding: number;
189
+ /** Cells at the viewport's right edge that show no column. */
190
+ rightReserve?: number;
84
191
  scrollLeft: number;
85
192
  viewportWidth: number;
86
193
  /** Each column's drawn width. */
87
194
  widths: readonly number[];
88
195
  }): (DataTableColumnClip | null)[] | null {
89
196
  if (viewportWidth <= 0 || widths.length === 0) return null;
90
- const right = scrollLeft + viewportWidth;
197
+ const right = scrollLeft + viewportWidth - Math.max(0, rightReserve);
91
198
  const left = frozenFirstColumn ? scrollLeft + horizontalPadding + (widths[0] ?? 0) + columnGap : scrollLeft;
92
199
  let cut = false;
93
200
  const clips = widths.map((width, index): DataTableColumnClip | null => {
@@ -178,7 +178,7 @@ export interface DataTableProps<
178
178
  */
179
179
  exportCsv?: () => string;
180
180
  /**
181
- * A rendered-view report (`gloomberb fn`) reads every row, not only those
181
+ * A rendered-view report (`gloom fn`) reads every row, not only those
182
182
  * the viewport shows. For a bounded table a reader needs whole, such as an
183
183
  * option chain's strike window; leave it off for long or paged lists.
184
184
  */
@@ -5,6 +5,7 @@ import { blendForContrast, higherContrast } from "../../theme/color-utils";
5
5
  import { useThemeColors } from "../../theme/theme-context";
6
6
  import { Box, Text, TextAttributes, useUiCapabilities } from "../../ui";
7
7
  import { truncateToDisplayWidth } from "../../utils/format";
8
+ import { CountryFlagLead } from "./country-flag";
8
9
  import { usePaneLinkMenuEntry } from "./external-link";
9
10
  import { titleCase } from "./header-case";
10
11
  import { statToneColor, type StatTone } from "./stat-grid";
@@ -69,6 +70,8 @@ export interface KeyValueRowProps {
69
70
  * `PaneLinkMenu` the pane menu lists it as `link.label`, so the keyboard reaches what a click opens.
70
71
  */
71
72
  link?: { label: string; onOpen: () => void };
73
+ /** The country the value names (a code or a name): the desktop and the web lead the value with its flag. */
74
+ country?: string | null;
72
75
  }
73
76
 
74
77
  /**
@@ -120,7 +123,7 @@ export function KeyValueRow(props: KeyValueRowProps) {
120
123
  * width in characters, the value and detail taking the rest of the row and
121
124
  * clipped in CSS where they run out of it.
122
125
  */
123
- function NativeKeyValueRow({ label, value, detail, tone, color, width, labelWidth, emphasis = true, align = "left", link }: KeyValueRowProps) {
126
+ function NativeKeyValueRow({ label, value, detail, tone, color, width, labelWidth, emphasis = true, align = "left", link, country }: KeyValueRowProps) {
124
127
  const colors = useThemeColors();
125
128
  usePaneLinkMenuEntry(link ? `key-value:${label}:${value}` : null, link?.label ?? "", () => link?.onOpen());
126
129
  const target = link ? {
@@ -136,6 +139,7 @@ function NativeKeyValueRow({ label, value, detail, tone, color, width, labelWidt
136
139
  <Box width={width === undefined ? undefined : "100%"} flexDirection="row" overflow="hidden" data-gloom-ui="key-value-row" {...target}>
137
140
  {/* At least the label width, in characters; a longer label keeps every character and moves its value along. */}
138
141
  <Text fg={colors.textDim} style={{ ...NATIVE_CLIP_STYLE, flex: "0 0 auto", minWidth: `${labelChars}ch`, paddingRight: "1ch", boxSizing: "border-box" }}>{t(label)}</Text>
142
+ {country ? <CountryFlagLead value={country} /> : null}
139
143
  <Text
140
144
  fg={color ?? statToneColor(tone, colors) ?? colors.text}
141
145
  attributes={emphasis ? TextAttributes.BOLD : undefined}
@@ -36,8 +36,10 @@ export { FieldGrid, GridFieldView, fieldGridColumns, fieldGridRows } from "./fie
36
36
  export type { FieldGridProps, GridField } from "./field-grid";
37
37
  export { StatGrid, statGridColumns, statGridRows } from "./stat-grid";
38
38
  export { ColumnGrid, ColumnGridPair } from "./column-grid";
39
- export type { ColumnGridCell, ColumnGridColumn, ColumnGridPairProps, ColumnGridProps } from "./column-grid";
39
+ export type { ColumnGridCell, ColumnGridColumn, ColumnGridLink, ColumnGridPairProps, ColumnGridProps } from "./column-grid";
40
40
  export type { StatGridProps, StatItem } from "./stat-grid";
41
+ export { COUNTRY_FLAG_CELLS, CountryFlag, CountryFlagLead, withCountryFlag, withFlagRoom } from "./country-flag";
42
+ export type { CountryFlagProps } from "./country-flag";
41
43
  export { RatioBar } from "./ratio-bar";
42
44
  export type { RatioBarProps } from "./ratio-bar";
43
45
  export { RangeTrack } from "./range-track";