gloomberb 0.16.1 → 0.16.3

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 (643) hide show
  1. package/README.md +2 -1
  2. package/package.json +2 -1
  3. package/src/api-client/beneficial-owners.ts +92 -0
  4. package/src/api-client/data.ts +26 -8
  5. package/src/api-client/errors.ts +12 -0
  6. package/src/api-client/geo.ts +363 -0
  7. package/src/api-client/index.ts +2 -0
  8. package/src/api-client/market-discovery.ts +10 -0
  9. package/src/api-client/paths.ts +30 -1
  10. package/src/api-client/perps.ts +37 -0
  11. package/src/api-client/request.ts +5 -2
  12. package/src/api-client/types.ts +2 -0
  13. package/src/brokers/account-cache.ts +69 -0
  14. package/src/cli/command-options.ts +74 -0
  15. package/src/cli/commands/command-utils.ts +37 -0
  16. package/src/cli/commands/crypto-hints.ts +75 -0
  17. package/src/cli/commands/market.ts +560 -136
  18. package/src/cli/commands/overview.ts +136 -48
  19. package/src/cli/commands/ticker.ts +220 -67
  20. package/src/cli/desktop-pane-shot.ts +37 -4
  21. package/src/cli/freshness.ts +61 -0
  22. package/src/cli/help.ts +27 -6
  23. package/src/cli/helpers.ts +4 -8
  24. package/src/cli/history-rows.ts +187 -15
  25. package/src/cli/index.ts +23 -8
  26. package/src/cli/listing-arg.ts +321 -0
  27. package/src/cli/options.ts +5 -1
  28. package/src/cli/pane-functions/access-gate.ts +42 -0
  29. package/src/cli/pane-functions/capabilities.ts +5 -0
  30. package/src/cli/pane-functions/catalog.ts +28 -1
  31. package/src/cli/pane-functions/data.ts +3 -1
  32. package/src/cli/pane-functions/dom.ts +87 -16
  33. package/src/cli/pane-functions/freshness.ts +400 -0
  34. package/src/cli/pane-functions/function-help.ts +31 -22
  35. package/src/cli/pane-functions/headless.ts +201 -41
  36. package/src/cli/pane-functions/index.ts +24 -6
  37. package/src/cli/pane-functions/options.ts +3 -0
  38. package/src/cli/pane-functions/report.ts +12 -1
  39. package/src/cli/pane-functions/resolver.ts +63 -9
  40. package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
  41. package/src/cli/pane-functions/screenshot.ts +11 -3
  42. package/src/cli/registry.ts +6 -3
  43. package/src/cli/report-tables.ts +460 -0
  44. package/src/cli/result.ts +53 -29
  45. package/src/cli/ticker-resolution.ts +7 -5
  46. package/src/components/chart/composite/composite-chart.tsx +88 -2536
  47. package/src/components/chart/composite/drawing-store.ts +59 -0
  48. package/src/components/chart/composite/legend.tsx +319 -0
  49. package/src/components/chart/composite/panel-bitmap.ts +139 -0
  50. package/src/components/chart/composite/panel-gestures.ts +59 -0
  51. package/src/components/chart/composite/panel-labels.ts +107 -0
  52. package/src/components/chart/composite/panel-surface.tsx +876 -0
  53. package/src/components/chart/composite/tool-catalog.ts +98 -0
  54. package/src/components/chart/composite/toolbar.tsx +186 -0
  55. package/src/components/chart/composite/tools.ts +8 -0
  56. package/src/components/chart/composite/use-composite-chart-keyboard.ts +703 -0
  57. package/src/components/chart/composite/use-composite-viewport.ts +143 -0
  58. package/src/components/command-bar/list/model.ts +5 -0
  59. package/src/components/command-bar/list/view.tsx +16 -3
  60. package/src/components/command-bar/pane-templates/workflow.ts +1 -0
  61. package/src/components/command-bar/routes/ticker-search/actions.ts +5 -0
  62. package/src/components/command-bar/workflow/ops.ts +1 -1
  63. package/src/components/command-bar/workflow/tickers.ts +6 -0
  64. package/src/components/data-table/export.ts +6 -51
  65. package/src/components/data-table/view.tsx +32 -11
  66. package/src/components/feedback-dialog.tsx +2 -1
  67. package/src/components/form-modal/field-row.tsx +2 -2
  68. package/src/components/layout/detached-pane-shell.tsx +6 -3
  69. package/src/components/layout/pane/content.tsx +23 -10
  70. package/src/components/layout/pane/error-boundary.tsx +103 -0
  71. package/src/components/layout/pane/footer/registration.tsx +68 -23
  72. package/src/components/layout/pane/header.tsx +11 -11
  73. package/src/components/layout/shell/active-drag.ts +67 -35
  74. package/src/components/layout/shell/cursor-occlusion.ts +6 -5
  75. package/src/components/layout/shell/drag/index.ts +12 -7
  76. package/src/components/layout/shell/drag/live.ts +122 -0
  77. package/src/components/layout/shell/drag/overlays.tsx +179 -35
  78. package/src/components/layout/shell/drag/runtime.ts +62 -50
  79. package/src/components/layout/shell/drag/slide.ts +10 -0
  80. package/src/components/layout/shell/index.tsx +37 -51
  81. package/src/components/layout/shell/menu.ts +2 -1
  82. package/src/components/layout/shell/native/pointer-runtime.ts +13 -13
  83. package/src/components/layout/shell/native/surfaces.ts +30 -14
  84. package/src/components/layout/shell/pane/actions.ts +2 -1
  85. package/src/components/layout/shell/pane/layers.tsx +419 -168
  86. package/src/components/layout/shell/terminal-pointer-runtime.ts +18 -18
  87. package/src/components/layout/shell/window-mode/overlays.tsx +12 -4
  88. package/src/components/metric-treemap/heat-surface.tsx +43 -16
  89. package/src/components/metric-treemap/heat-tiles.ts +18 -0
  90. package/src/components/metric-treemap/layout.ts +2 -0
  91. package/src/components/onboarding/onboarding-keyboard.ts +311 -0
  92. package/src/components/onboarding/onboarding-wizard.tsx +101 -788
  93. package/src/components/onboarding/use-onboarding-broker-form.ts +263 -0
  94. package/src/components/onboarding/use-onboarding-progress.ts +298 -0
  95. package/src/components/onboarding/use-onboarding-upgrade.ts +83 -0
  96. package/src/components/ticker/list-table-view.tsx +13 -1
  97. package/src/components/ui/fields.tsx +8 -0
  98. package/src/components/ui/range-track.tsx +10 -3
  99. package/src/components/ui/status.tsx +8 -2
  100. package/src/components/ui/tabs.tsx +7 -4
  101. package/src/components/ui/text-prompt-dialog.tsx +4 -2
  102. package/src/data/config/store/normalize.ts +17 -1
  103. package/src/data/json-persistence.ts +17 -3
  104. package/src/data/json-storage.ts +2 -0
  105. package/src/data/memory-resource-store.ts +46 -0
  106. package/src/i18n/es.ts +19 -1
  107. package/src/i18n/ja.ts +19 -1
  108. package/src/i18n/ko.ts +19 -1
  109. package/src/i18n/zh-cn.ts +19 -1
  110. package/src/i18n/zh-tw.ts +19 -1
  111. package/src/market-data/coordinator/chart.ts +1 -1
  112. package/src/market-data/coordinator/quotes.ts +23 -4
  113. package/src/market-data/fx-closes.ts +72 -0
  114. package/src/market-data/market/freshness.ts +123 -6
  115. package/src/market-data/market/session-close-note.ts +57 -0
  116. package/src/market-data/market/status.ts +151 -0
  117. package/src/market-data/published-apac-sessions.ts +66 -0
  118. package/src/market-data/quotes/contributions.ts +2 -0
  119. package/src/market-data/quotes/freshness.ts +5 -0
  120. package/src/market-data/quotes/resolution.ts +2 -0
  121. package/src/market-data/quotes/screener-live-quotes.ts +49 -4
  122. package/src/plugins/builtin/account-management/pane.tsx +4 -0
  123. package/src/plugins/builtin/alerts/cli.ts +10 -5
  124. package/src/plugins/builtin/alerts/index.tsx +1 -0
  125. package/src/plugins/builtin/analytics/metrics.ts +8 -3
  126. package/src/plugins/builtin/analytics/pane-model.ts +10 -6
  127. package/src/plugins/builtin/analytics/risk-client.ts +191 -66
  128. package/src/plugins/builtin/analytics/risk-fx.ts +102 -0
  129. package/src/plugins/builtin/analytics/risk-headless.ts +19 -13
  130. package/src/plugins/builtin/analytics/risk-model.ts +45 -17
  131. package/src/plugins/builtin/analytics/risk-pane.tsx +1 -0
  132. package/src/plugins/builtin/analytics/risk-test-data.ts +25 -1
  133. package/src/plugins/builtin/attention/headless.ts +6 -4
  134. package/src/plugins/builtin/attention/index.tsx +1 -1
  135. package/src/plugins/builtin/attention/pane.tsx +2 -2
  136. package/src/plugins/builtin/awards/headless.ts +1 -0
  137. package/src/plugins/builtin/awards/pane.tsx +1 -1
  138. package/src/plugins/builtin/backtest/headless.ts +1 -0
  139. package/src/plugins/builtin/bond-calculator/headless.ts +1 -0
  140. package/src/plugins/builtin/buildout/index.tsx +1 -0
  141. package/src/plugins/builtin/catalysts/detail.tsx +1 -1
  142. package/src/plugins/builtin/catalysts/headless.ts +3 -1
  143. package/src/plugins/builtin/cds/headless.ts +2 -0
  144. package/src/plugins/builtin/central-bank-rates/headless.ts +1 -0
  145. package/src/plugins/builtin/chart-composer/headless.ts +38 -3
  146. package/src/plugins/builtin/chart-composer/index.tsx +3 -1
  147. package/src/plugins/builtin/chart-composer/series-expression.ts +18 -2
  148. package/src/plugins/builtin/chat/channels.ts +19 -3
  149. package/src/plugins/builtin/chat/content/composer-runtime.ts +28 -13
  150. package/src/plugins/builtin/chat/content/footer.tsx +15 -6
  151. package/src/plugins/builtin/chat/content/index.tsx +120 -21
  152. package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +261 -113
  153. package/src/plugins/builtin/chat/content/transcript.tsx +20 -2
  154. package/src/plugins/builtin/chat/direct-messages.ts +200 -0
  155. package/src/plugins/builtin/chat/index.tsx +1 -0
  156. package/src/plugins/builtin/chat/message/desktop.tsx +3 -0
  157. package/src/plugins/builtin/chat/message/header.tsx +16 -6
  158. package/src/plugins/builtin/chat/message/inline-tokens.tsx +72 -32
  159. package/src/plugins/builtin/chat/message/profile-popover.tsx +96 -12
  160. package/src/plugins/builtin/chat/message/terminal.tsx +3 -0
  161. package/src/plugins/builtin/chat/message/types.ts +14 -2
  162. package/src/plugins/builtin/chat/profile-popover.ts +18 -13
  163. package/src/plugins/builtin/clinical-trials/index.tsx +1 -0
  164. package/src/plugins/builtin/cloud/askg/executor.ts +2 -1
  165. package/src/plugins/builtin/cloud/plugin.tsx +1 -0
  166. package/src/plugins/builtin/cloud/team/module.tsx +1 -0
  167. package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
  168. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  169. package/src/plugins/builtin/comment-letters/index.tsx +1 -0
  170. package/src/plugins/builtin/company-attention/headless.ts +5 -1
  171. package/src/plugins/builtin/company-attention/pane.tsx +2 -2
  172. package/src/plugins/builtin/company-kpis/headless.ts +1 -0
  173. package/src/plugins/builtin/congress-trades/headless.ts +1 -0
  174. package/src/plugins/builtin/correlation/compute.ts +59 -16
  175. package/src/plugins/builtin/correlation/geo.ts +34 -0
  176. package/src/plugins/builtin/correlation/headless-schema.ts +4 -1
  177. package/src/plugins/builtin/correlation/headless.ts +42 -8
  178. package/src/plugins/builtin/correlation/history.ts +2 -0
  179. package/src/plugins/builtin/correlation/index.tsx +68 -14
  180. package/src/plugins/builtin/correlation/matrix/model.ts +17 -2
  181. package/src/plugins/builtin/correlation/matrix/selection.ts +5 -3
  182. package/src/plugins/builtin/correlation/relationship/model.ts +1 -1
  183. package/src/plugins/builtin/correlation/relationship/pane.tsx +4 -2
  184. package/src/plugins/builtin/correlation/relationship/view-model.ts +16 -1
  185. package/src/plugins/builtin/correlation/settings.ts +1 -1
  186. package/src/plugins/builtin/cot/headless.ts +6 -3
  187. package/src/plugins/builtin/cot/index.tsx +3 -3
  188. package/src/plugins/builtin/cot/model.ts +36 -3
  189. package/src/plugins/builtin/cpi/headless.ts +4 -0
  190. package/src/plugins/builtin/credit-boards/headless.ts +2 -0
  191. package/src/plugins/builtin/credit-conditions/headless.ts +1 -0
  192. package/src/plugins/builtin/credit-documents/gauge.tsx +5 -8
  193. package/src/plugins/builtin/credit-documents/headless.ts +2 -0
  194. package/src/plugins/builtin/crypto-board/headless.ts +3 -0
  195. package/src/plugins/builtin/custom-view/loader.ts +1 -1
  196. package/src/plugins/builtin/debt-maturities/headless.ts +4 -0
  197. package/src/plugins/builtin/dividend-yield/headless.ts +1 -0
  198. package/src/plugins/builtin/doe/headless.ts +7 -0
  199. package/src/plugins/builtin/doe/range-bar.tsx +7 -37
  200. package/src/plugins/builtin/earnings/headless.ts +5 -0
  201. package/src/plugins/builtin/earnings-calls/headless.ts +1 -0
  202. package/src/plugins/builtin/earnings-ripple/client.ts +91 -18
  203. package/src/plugins/builtin/earnings-ripple/headless.ts +28 -8
  204. package/src/plugins/builtin/earnings-ripple/index.tsx +2 -2
  205. package/src/plugins/builtin/earnings-ripple/model.ts +97 -7
  206. package/src/plugins/builtin/earnings-ripple/pane.tsx +148 -23
  207. package/src/plugins/builtin/econ/index.tsx +1 -0
  208. package/src/plugins/builtin/econ-statistics/headless.ts +2 -0
  209. package/src/plugins/builtin/equity-screener/headless.ts +2 -0
  210. package/src/plugins/builtin/estimate-revisions/headless.ts +1 -0
  211. package/src/plugins/builtin/executives/index.tsx +1 -0
  212. package/src/plugins/builtin/exposure/headless.ts +3 -1
  213. package/src/plugins/builtin/fear-greed/headless.ts +2 -0
  214. package/src/plugins/builtin/filing-events/index.tsx +1 -0
  215. package/src/plugins/builtin/futures-curve/client.ts +12 -3
  216. package/src/plugins/builtin/futures-curve/headless.ts +39 -10
  217. package/src/plugins/builtin/futures-curve/index.tsx +3 -3
  218. package/src/plugins/builtin/futures-curve/model.ts +188 -4
  219. package/src/plugins/builtin/futures-curve/pane.tsx +51 -9
  220. package/src/plugins/builtin/gpu/headless.ts +7 -3
  221. package/src/plugins/builtin/gpu/ladder.tsx +26 -30
  222. package/src/plugins/builtin/gpu/model.ts +27 -1
  223. package/src/plugins/builtin/holders/beneficial-client.ts +209 -0
  224. package/src/plugins/builtin/holders/beneficial-model.ts +279 -0
  225. package/src/plugins/builtin/holders/beneficial-report.ts +126 -0
  226. package/src/plugins/builtin/holders/beneficial-view.tsx +241 -0
  227. package/src/plugins/builtin/holders/client.ts +3 -6
  228. package/src/plugins/builtin/holders/format.ts +31 -1
  229. package/src/plugins/builtin/holders/headless.ts +161 -6
  230. package/src/plugins/builtin/holders/index.tsx +10 -3
  231. package/src/plugins/builtin/holders/pane.tsx +42 -16
  232. package/src/plugins/builtin/holders/report-header.ts +136 -0
  233. package/src/plugins/builtin/holders/table-model.ts +20 -5
  234. package/src/plugins/builtin/holders/thirteenf-match.ts +29 -1
  235. package/src/plugins/builtin/holders/types.ts +2 -1
  236. package/src/plugins/builtin/insider/headless.ts +2 -0
  237. package/src/plugins/builtin/ipo-calendar/headless.ts +1 -0
  238. package/src/plugins/builtin/iv-history/headless.ts +4 -1
  239. package/src/plugins/builtin/jobs/headless.ts +1 -0
  240. package/src/plugins/builtin/kelly-sizer/index.tsx +1 -0
  241. package/src/plugins/builtin/kelly-sizer/pane.tsx +12 -6
  242. package/src/plugins/builtin/kelly-sizer/portfolio.ts +25 -0
  243. package/src/plugins/builtin/macro-day/headless.ts +2 -0
  244. package/src/plugins/builtin/market-halts/index.tsx +1 -0
  245. package/src/plugins/builtin/market-heatmap/data.ts +2 -0
  246. package/src/plugins/builtin/market-heatmap/headless.ts +135 -0
  247. package/src/plugins/builtin/market-heatmap/index.tsx +39 -46
  248. package/src/plugins/builtin/market-heatmap/model.ts +146 -0
  249. package/src/plugins/builtin/market-heatmap/portfolio.ts +23 -4
  250. package/src/plugins/builtin/market-movers/headless.ts +2 -0
  251. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  252. package/src/plugins/builtin/members/client.ts +20 -3
  253. package/src/plugins/builtin/members/headless.ts +5 -3
  254. package/src/plugins/builtin/members/model.ts +10 -2
  255. package/src/plugins/builtin/members/pane.tsx +23 -6
  256. package/src/plugins/builtin/mna/distress/headless.ts +1 -0
  257. package/src/plugins/builtin/mna/headless.ts +1 -0
  258. package/src/plugins/builtin/money-markets/headless.ts +1 -0
  259. package/src/plugins/builtin/news/headless.ts +2 -0
  260. package/src/plugins/builtin/news/wire/index.tsx +8 -1
  261. package/src/plugins/builtin/notes/cli.ts +14 -6
  262. package/src/plugins/builtin/notes/index.tsx +1 -0
  263. package/src/plugins/builtin/openfda/index.tsx +1 -0
  264. package/src/plugins/builtin/options-calculator/headless.ts +2 -0
  265. package/src/plugins/builtin/options-positioning/headless.ts +3 -0
  266. package/src/plugins/builtin/options-scenario/headless.ts +5 -0
  267. package/src/plugins/builtin/pe-band/client.ts +48 -3
  268. package/src/plugins/builtin/pe-band/headless.ts +25 -7
  269. package/src/plugins/builtin/pe-band/model.ts +92 -16
  270. package/src/plugins/builtin/pe-band/pane.tsx +33 -16
  271. package/src/plugins/builtin/perps/client.ts +50 -3
  272. package/src/plugins/builtin/perps/headless.ts +144 -16
  273. package/src/plugins/builtin/perps/index.tsx +6 -6
  274. package/src/plugins/builtin/perps/model.ts +189 -12
  275. package/src/plugins/builtin/perps/pane.tsx +249 -48
  276. package/src/plugins/builtin/portfolio-list/account-metrics.ts +16 -1
  277. package/src/plugins/builtin/portfolio-list/allocation.ts +248 -0
  278. package/src/plugins/builtin/portfolio-list/cached-account.ts +42 -0
  279. package/src/plugins/builtin/portfolio-list/cell-version.ts +19 -1
  280. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +328 -29
  281. package/src/plugins/builtin/portfolio-list/cli/render.ts +232 -39
  282. package/src/plugins/builtin/portfolio-list/cli/shared.ts +67 -2
  283. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +35 -31
  284. package/src/plugins/builtin/portfolio-list/column-values.ts +124 -47
  285. package/src/plugins/builtin/portfolio-list/headless.ts +100 -16
  286. package/src/plugins/builtin/portfolio-list/index.tsx +14 -3
  287. package/src/plugins/builtin/portfolio-list/live-valuation.ts +7 -5
  288. package/src/plugins/builtin/portfolio-list/mutations.ts +55 -1
  289. package/src/plugins/builtin/portfolio-list/pane/data.ts +6 -0
  290. package/src/plugins/builtin/portfolio-list/pane/index.tsx +53 -16
  291. package/src/plugins/builtin/portfolio-list/settings.ts +33 -2
  292. package/src/plugins/builtin/portfolio-list/summary/index.tsx +46 -5
  293. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +11 -1
  294. package/src/plugins/builtin/portfolio-list/summary/totals.ts +26 -7
  295. package/src/plugins/builtin/power/headless.ts +3 -1
  296. package/src/plugins/builtin/rate-path/headless.ts +2 -0
  297. package/src/plugins/builtin/realized-vol/headless.ts +2 -0
  298. package/src/plugins/builtin/relative-rotation/headless.ts +2 -0
  299. package/src/plugins/builtin/research/analyst-headless.ts +3 -0
  300. package/src/plugins/builtin/research/events-headless.ts +2 -0
  301. package/src/plugins/builtin/research/headless.ts +2 -0
  302. package/src/plugins/builtin/research/index.tsx +1 -0
  303. package/src/plugins/builtin/research/relative-valuation-headless.ts +10 -5
  304. package/src/plugins/builtin/research/relative-valuation-model.ts +18 -6
  305. package/src/plugins/builtin/research/relative-valuation-pane.tsx +3 -3
  306. package/src/plugins/builtin/research-search/index.tsx +1 -0
  307. package/src/plugins/builtin/revenue-breakdown/headless.ts +2 -0
  308. package/src/plugins/builtin/reverse-dcf/headless.ts +2 -0
  309. package/src/plugins/builtin/reverse-dcf/model.ts +2 -1
  310. package/src/plugins/builtin/risk-factors/headless.ts +2 -0
  311. package/src/plugins/builtin/scanner/flow-history.ts +2 -13
  312. package/src/plugins/builtin/scanner/headless.ts +14 -0
  313. package/src/plugins/builtin/seasonality/headless.ts +2 -0
  314. package/src/plugins/builtin/sec/command-bar-search.ts +14 -4
  315. package/src/plugins/builtin/sec/filing-content.ts +42 -17
  316. package/src/plugins/builtin/sec/forms.ts +12 -0
  317. package/src/plugins/builtin/sec/headless.ts +2 -0
  318. package/src/plugins/builtin/sectors/client.ts +1 -0
  319. package/src/plugins/builtin/sectors/headless.ts +9 -1
  320. package/src/plugins/builtin/sectors/sector-model.ts +2 -0
  321. package/src/plugins/builtin/shared/crypto-pair.ts +14 -0
  322. package/src/plugins/builtin/shared/locked-rows.tsx +1 -1
  323. package/src/plugins/builtin/shared/members-menu.tsx +260 -0
  324. package/src/plugins/builtin/shared/report-freshness.ts +57 -0
  325. package/src/plugins/builtin/shared/research-cells.tsx +4 -9
  326. package/src/plugins/builtin/short-interest/headless.ts +2 -0
  327. package/src/plugins/builtin/short-interest/watch-headless.ts +1 -0
  328. package/src/plugins/builtin/short-volume/headless.ts +1 -0
  329. package/src/plugins/builtin/short-volume/pane.tsx +1 -1
  330. package/src/plugins/builtin/social-mentions/headless.ts +1 -0
  331. package/src/plugins/builtin/social-mentions/pane.tsx +1 -1
  332. package/src/plugins/builtin/supply-chain/headless.ts +7 -1
  333. package/src/plugins/builtin/supply-chain/index.tsx +10 -1
  334. package/src/plugins/builtin/supply-chain/model.ts +27 -2
  335. package/src/plugins/builtin/supply-chain/pane.tsx +71 -32
  336. package/src/plugins/builtin/themes/headless.ts +3 -0
  337. package/src/plugins/builtin/themes/pane.tsx +3 -0
  338. package/src/plugins/builtin/thirteenf/headless.ts +110 -25
  339. package/src/plugins/builtin/thirteenf/report-notes.ts +149 -0
  340. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +4 -0
  341. package/src/plugins/builtin/ticker-detail/financials/model.ts +25 -2
  342. package/src/plugins/builtin/ticker-detail/headless.ts +27 -5
  343. package/src/plugins/builtin/ticker-detail/index.tsx +1 -0
  344. package/src/plugins/builtin/ticker-detail/overview/model.ts +17 -5
  345. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +27 -26
  346. package/src/plugins/builtin/time-sales/headless.ts +5 -1
  347. package/src/plugins/builtin/treasury-auctions/headless.ts +1 -0
  348. package/src/plugins/builtin/volatility/headless.ts +6 -1
  349. package/src/plugins/builtin/world-indices/headless.ts +2 -0
  350. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +159 -0
  351. package/src/plugins/builtin/world-venue-map/basemap.ts +232 -0
  352. package/src/plugins/builtin/world-venue-map/client.ts +45 -0
  353. package/src/plugins/builtin/world-venue-map/country-labels.ts +78 -0
  354. package/src/plugins/builtin/world-venue-map/entity-detail.tsx +147 -0
  355. package/src/plugins/builtin/world-venue-map/entity-table.ts +59 -0
  356. package/src/plugins/builtin/world-venue-map/evidence.ts +77 -0
  357. package/src/plugins/builtin/world-venue-map/feed.ts +293 -0
  358. package/src/plugins/builtin/world-venue-map/geo-draw.tsx +248 -0
  359. package/src/plugins/builtin/world-venue-map/geo-series.ts +142 -0
  360. package/src/plugins/builtin/world-venue-map/geo-svg.tsx +448 -0
  361. package/src/plugins/builtin/world-venue-map/headless.ts +146 -0
  362. package/src/plugins/builtin/world-venue-map/ids.ts +1 -0
  363. package/src/plugins/builtin/world-venue-map/index.ts +69 -6
  364. package/src/plugins/builtin/world-venue-map/layered-pane.tsx +565 -0
  365. package/src/plugins/builtin/world-venue-map/layers.ts +406 -0
  366. package/src/plugins/builtin/world-venue-map/map-symbols.ts +220 -0
  367. package/src/plugins/builtin/world-venue-map/map.tsx +557 -85
  368. package/src/plugins/builtin/world-venue-map/model.ts +23 -4
  369. package/src/plugins/builtin/world-venue-map/natural-earth/index.chunk.ts +202 -0
  370. package/src/plugins/builtin/world-venue-map/natural-earth/labels.chunk.ts +244 -0
  371. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n00.chunk.ts +4 -0
  372. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n15.chunk.ts +4 -0
  373. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n30.chunk.ts +4 -0
  374. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n45.chunk.ts +4 -0
  375. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n60.chunk.ts +4 -0
  376. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n75.chunk.ts +4 -0
  377. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s15.chunk.ts +4 -0
  378. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s30.chunk.ts +4 -0
  379. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s60.chunk.ts +4 -0
  380. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n00.chunk.ts +4 -0
  381. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n15.chunk.ts +4 -0
  382. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n30.chunk.ts +4 -0
  383. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n45.chunk.ts +4 -0
  384. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n60.chunk.ts +4 -0
  385. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n75.chunk.ts +4 -0
  386. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s15.chunk.ts +4 -0
  387. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s30.chunk.ts +4 -0
  388. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s45.chunk.ts +4 -0
  389. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n00.chunk.ts +4 -0
  390. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n15.chunk.ts +4 -0
  391. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n30.chunk.ts +4 -0
  392. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n45.chunk.ts +4 -0
  393. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n60.chunk.ts +4 -0
  394. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n75.chunk.ts +4 -0
  395. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s15.chunk.ts +4 -0
  396. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s30.chunk.ts +4 -0
  397. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s45.chunk.ts +4 -0
  398. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s60.chunk.ts +4 -0
  399. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n00.chunk.ts +4 -0
  400. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n15.chunk.ts +4 -0
  401. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n30.chunk.ts +4 -0
  402. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n45.chunk.ts +4 -0
  403. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n60.chunk.ts +4 -0
  404. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n75.chunk.ts +4 -0
  405. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s15.chunk.ts +4 -0
  406. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s30.chunk.ts +4 -0
  407. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s60.chunk.ts +4 -0
  408. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n00.chunk.ts +4 -0
  409. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n15.chunk.ts +4 -0
  410. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n30.chunk.ts +4 -0
  411. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n45.chunk.ts +4 -0
  412. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n60.chunk.ts +4 -0
  413. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n75.chunk.ts +4 -0
  414. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s15.chunk.ts +4 -0
  415. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s30.chunk.ts +4 -0
  416. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s60.chunk.ts +4 -0
  417. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n00.chunk.ts +4 -0
  418. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n15.chunk.ts +4 -0
  419. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n30.chunk.ts +4 -0
  420. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n45.chunk.ts +4 -0
  421. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n60.chunk.ts +4 -0
  422. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n75.chunk.ts +4 -0
  423. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075s45.chunk.ts +4 -0
  424. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n00.chunk.ts +4 -0
  425. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n15.chunk.ts +4 -0
  426. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n30.chunk.ts +4 -0
  427. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n45.chunk.ts +4 -0
  428. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n60.chunk.ts +4 -0
  429. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n75.chunk.ts +4 -0
  430. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090s15.chunk.ts +4 -0
  431. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n00.chunk.ts +4 -0
  432. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n15.chunk.ts +4 -0
  433. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n30.chunk.ts +4 -0
  434. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n45.chunk.ts +4 -0
  435. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n60.chunk.ts +4 -0
  436. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n75.chunk.ts +4 -0
  437. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s15.chunk.ts +4 -0
  438. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s30.chunk.ts +4 -0
  439. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s45.chunk.ts +4 -0
  440. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n00.chunk.ts +4 -0
  441. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n15.chunk.ts +4 -0
  442. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n30.chunk.ts +4 -0
  443. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n45.chunk.ts +4 -0
  444. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n60.chunk.ts +4 -0
  445. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s15.chunk.ts +4 -0
  446. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s30.chunk.ts +4 -0
  447. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s45.chunk.ts +4 -0
  448. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n00.chunk.ts +4 -0
  449. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n15.chunk.ts +4 -0
  450. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n30.chunk.ts +4 -0
  451. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n45.chunk.ts +4 -0
  452. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n60.chunk.ts +4 -0
  453. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n75.chunk.ts +4 -0
  454. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s15.chunk.ts +4 -0
  455. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s30.chunk.ts +4 -0
  456. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s45.chunk.ts +4 -0
  457. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n00.chunk.ts +4 -0
  458. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n15.chunk.ts +4 -0
  459. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n45.chunk.ts +4 -0
  460. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n60.chunk.ts +4 -0
  461. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n75.chunk.ts +4 -0
  462. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s15.chunk.ts +4 -0
  463. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s30.chunk.ts +4 -0
  464. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s45.chunk.ts +4 -0
  465. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s60.chunk.ts +4 -0
  466. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n00.chunk.ts +4 -0
  467. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n15.chunk.ts +4 -0
  468. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n45.chunk.ts +4 -0
  469. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n60.chunk.ts +4 -0
  470. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s15.chunk.ts +4 -0
  471. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s30.chunk.ts +4 -0
  472. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s45.chunk.ts +4 -0
  473. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s60.chunk.ts +4 -0
  474. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n00.chunk.ts +4 -0
  475. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n15.chunk.ts +4 -0
  476. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n30.chunk.ts +4 -0
  477. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n45.chunk.ts +4 -0
  478. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n60.chunk.ts +4 -0
  479. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n75.chunk.ts +4 -0
  480. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s15.chunk.ts +4 -0
  481. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s30.chunk.ts +4 -0
  482. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s45.chunk.ts +4 -0
  483. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n00.chunk.ts +4 -0
  484. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n15.chunk.ts +4 -0
  485. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n30.chunk.ts +4 -0
  486. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n60.chunk.ts +4 -0
  487. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n75.chunk.ts +4 -0
  488. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030s30.chunk.ts +4 -0
  489. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030s60.chunk.ts +4 -0
  490. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n30.chunk.ts +4 -0
  491. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n45.chunk.ts +4 -0
  492. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n60.chunk.ts +4 -0
  493. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n75.chunk.ts +4 -0
  494. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s15.chunk.ts +4 -0
  495. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s30.chunk.ts +4 -0
  496. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s60.chunk.ts +4 -0
  497. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n00.chunk.ts +4 -0
  498. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n30.chunk.ts +4 -0
  499. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n45.chunk.ts +4 -0
  500. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n60.chunk.ts +4 -0
  501. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n75.chunk.ts +4 -0
  502. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s15.chunk.ts +4 -0
  503. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s30.chunk.ts +4 -0
  504. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s45.chunk.ts +4 -0
  505. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s60.chunk.ts +4 -0
  506. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n00.chunk.ts +4 -0
  507. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n15.chunk.ts +4 -0
  508. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n30.chunk.ts +4 -0
  509. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n45.chunk.ts +4 -0
  510. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n60.chunk.ts +4 -0
  511. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n75.chunk.ts +4 -0
  512. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s15.chunk.ts +4 -0
  513. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s30.chunk.ts +4 -0
  514. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s45.chunk.ts +4 -0
  515. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s60.chunk.ts +4 -0
  516. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n00.chunk.ts +4 -0
  517. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n15.chunk.ts +4 -0
  518. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n30.chunk.ts +4 -0
  519. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n45.chunk.ts +4 -0
  520. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n60.chunk.ts +4 -0
  521. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n75.chunk.ts +4 -0
  522. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s15.chunk.ts +4 -0
  523. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s30.chunk.ts +4 -0
  524. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s45.chunk.ts +4 -0
  525. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s60.chunk.ts +4 -0
  526. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n00.chunk.ts +4 -0
  527. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n15.chunk.ts +4 -0
  528. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n30.chunk.ts +4 -0
  529. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n45.chunk.ts +4 -0
  530. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n60.chunk.ts +4 -0
  531. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n75.chunk.ts +4 -0
  532. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105s15.chunk.ts +4 -0
  533. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n00.chunk.ts +4 -0
  534. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n15.chunk.ts +4 -0
  535. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n30.chunk.ts +4 -0
  536. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n45.chunk.ts +4 -0
  537. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n60.chunk.ts +4 -0
  538. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n75.chunk.ts +4 -0
  539. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120s30.chunk.ts +4 -0
  540. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n30.chunk.ts +4 -0
  541. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n45.chunk.ts +4 -0
  542. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n60.chunk.ts +4 -0
  543. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n75.chunk.ts +4 -0
  544. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135s30.chunk.ts +4 -0
  545. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150n45.chunk.ts +4 -0
  546. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150n60.chunk.ts +4 -0
  547. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150s15.chunk.ts +4 -0
  548. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150s30.chunk.ts +4 -0
  549. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n00.chunk.ts +4 -0
  550. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n15.chunk.ts +4 -0
  551. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n45.chunk.ts +4 -0
  552. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n60.chunk.ts +4 -0
  553. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165s15.chunk.ts +4 -0
  554. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165s30.chunk.ts +4 -0
  555. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n00.chunk.ts +4 -0
  556. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n15.chunk.ts +4 -0
  557. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n45.chunk.ts +4 -0
  558. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n60.chunk.ts +4 -0
  559. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s15.chunk.ts +4 -0
  560. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s30.chunk.ts +4 -0
  561. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s45.chunk.ts +4 -0
  562. package/src/plugins/builtin/world-venue-map/natural-earth/world-50m.chunk.ts +4 -0
  563. package/src/plugins/builtin/world-venue-map/pane.tsx +35 -44
  564. package/src/plugins/builtin/world-venue-map/use-geo.ts +55 -0
  565. package/src/plugins/builtin/world-venue-map/venue-header.tsx +32 -0
  566. package/src/plugins/builtin/yield-curve/headless.ts +16 -0
  567. package/src/plugins/loader.ts +13 -1
  568. package/src/plugins/registry/pane-settings.ts +1 -0
  569. package/src/renderers/browser/app-services.ts +3 -1
  570. package/src/renderers/dom/build-assets.ts +81 -3
  571. package/src/renderers/dom/data-table/dom.ts +31 -0
  572. package/src/renderers/dom/data-table/index.tsx +5 -0
  573. package/src/renderers/dom/data-table/row.tsx +2 -0
  574. package/src/renderers/dom/desktop/controls.tsx +7 -3
  575. package/src/renderers/dom/desktop/list-view.tsx +35 -10
  576. package/src/renderers/dom/desktop/popover.tsx +73 -14
  577. package/src/renderers/dom/host/box.tsx +113 -17
  578. package/src/renderers/dom/host/drag-shield.ts +24 -0
  579. package/src/renderers/dom/host/input.tsx +14 -3
  580. package/src/renderers/dom/host/live-frame.ts +54 -0
  581. package/src/renderers/dom/host/mouse.ts +8 -1
  582. package/src/renderers/dom/host/scroll-box.tsx +6 -5
  583. package/src/renderers/dom/host/tabs.tsx +3 -2
  584. package/src/renderers/dom/styles.css +16 -9
  585. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +7 -0
  586. package/src/renderers/electrobun/bun/desktop/backend.ts +2 -0
  587. package/src/renderers/electrobun/bun/desktop/initialization.ts +13 -0
  588. package/src/renderers/electrobun/shared/protocol.ts +10 -1
  589. package/src/renderers/electrobun/view/backend-rpc.ts +10 -4
  590. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +4 -0
  591. package/src/renderers/electrobun/view/host/native.ts +0 -10
  592. package/src/renderers/electrobun/view/host/window-move.ts +28 -0
  593. package/src/renderers/electrobun/view/remote/persistence.ts +15 -2
  594. package/src/renderers/electrobun/view/rpc-timeout.ts +14 -3
  595. package/src/renderers/electrobun/view/ui-host.tsx +2 -5
  596. package/src/renderers/opentui/host.tsx +5 -0
  597. package/src/renderers/opentui/ui-host.tsx +7 -1
  598. package/src/sources/gloomberb-cloud/index.ts +25 -4
  599. package/src/sources/gloomberb-cloud/normalizers.ts +43 -23
  600. package/src/sources/provider-router/batches.ts +3 -3
  601. package/src/sources/provider-router/cached-routes.ts +4 -1
  602. package/src/sources/provider-router/financial-routes.ts +2 -2
  603. package/src/sources/provider-router/financials.ts +76 -12
  604. package/src/sources/provider-router/history.ts +15 -10
  605. package/src/sources/provider-router/primary.ts +2 -2
  606. package/src/sources/sec-registrant.ts +75 -0
  607. package/src/state/app/context/index.tsx +24 -8
  608. package/src/state/hooks/quote-streaming.ts +41 -26
  609. package/src/state/pane-scroll-registry.tsx +67 -35
  610. package/src/sync/core-contributors.ts +4 -0
  611. package/src/telemetry/crash-reports.ts +4 -1
  612. package/src/test-support/cli-context.ts +10 -2
  613. package/src/test-support/margin-account.ts +108 -0
  614. package/src/theme/heat-colors.ts +266 -84
  615. package/src/time-series/resolution.ts +15 -0
  616. package/src/time-series/resolve.ts +1 -1
  617. package/src/time-series/use-chart-resolution.ts +1 -1
  618. package/src/types/context-menu.ts +6 -0
  619. package/src/types/data-provider.ts +2 -0
  620. package/src/types/financials.ts +35 -3
  621. package/src/types/headless.ts +79 -2
  622. package/src/types/plugin.ts +20 -1
  623. package/src/types/ticker.ts +15 -0
  624. package/src/ui/host.tsx +26 -0
  625. package/src/ui/index.tsx +8 -3
  626. package/src/ui/scroll-box-axis.ts +26 -0
  627. package/src/updater/index.ts +9 -11
  628. package/src/utils/async-deadline.ts +21 -0
  629. package/src/utils/cli-output.ts +5 -1
  630. package/src/utils/crypto-pair.ts +41 -0
  631. package/src/utils/currency-units.ts +19 -0
  632. package/src/utils/depositary-receipt.ts +70 -0
  633. package/src/utils/display-number.ts +63 -0
  634. package/src/utils/exchanges.ts +72 -0
  635. package/src/utils/fire-and-forget.ts +24 -0
  636. package/src/utils/format.ts +13 -0
  637. package/src/utils/fundamentals.ts +17 -1
  638. package/src/utils/price-earnings.ts +70 -3
  639. package/src/utils/price-history-integrity.ts +19 -6
  640. package/src/utils/price-history.ts +58 -13
  641. package/src/utils/rpc-timeout-error.ts +27 -0
  642. package/src/utils/sec.ts +13 -1
  643. package/src/utils/utc-time.ts +79 -0
@@ -1,5 +1,5 @@
1
- import { colors } from "./colors";
2
- import { blendHex, contrastRatio, relativeLuminance } from "./color-utils";
1
+ import { colors, type ThemeColors } from "./colors";
2
+ import { blendHex, contrastRatio, higherContrast, relativeLuminance } from "./color-utils";
3
3
 
4
4
  const HEATMAP_BASE_BLEND = 0.35;
5
5
  const HEATMAP_TEXT_MIN_CONTRAST = 4.5;
@@ -100,46 +100,66 @@ export function resolveHeatCellColors(
100
100
  }
101
101
 
102
102
  /**
103
- * Heat map tiles: one fixed diverging hue scale for every theme, so a move
104
- * reads the same in Amber as in GitHub Light. Losses run to a bright hot
105
- * pink, a flat session sits on a muted violet and gains run to a bright aqua;
106
- * pink against aqua also separates for red-green colour blindness, where red
107
- * against green does not. Each tile takes whichever text reads best on it,
108
- * white on the violet middle and a dark navy on the bright ends, at 4.5:1 or
109
- * better. The stops were sampled from a market wall's pinks, violets and
110
- * aquas. A light theme starts from a pale lavender so the page is not a dark
111
- * block; the ends stay the same.
103
+ * Heat map tiles take their colours from the selected theme. Losses run from
104
+ * a muted middle to the theme's negative colour and gains to its positive, so
105
+ * the strongest tiles are the app's own down and up colours. The middle is
106
+ * the theme's neutral tone, lifted off a dark page or set into a light one
107
+ * just far enough to read as a tile. Colour builds in OKLab, hue ahead of
108
+ * lightness so a small move already leans to its side, and is full at 3%.
109
+ * Each tile takes whichever of the theme's light or dark text reads better
110
+ * on it, or white or black where neither reaches 4.5:1.
112
111
  */
113
112
  const HEATMAP_TILE_FULL_SCALE_PERCENT = 3;
114
- /** How fast colour builds from flat: below 1 a small move already leans to its hue. */
113
+ /** How fast colour builds from flat: below 1 a small move already leans to its side. */
115
114
  const HEATMAP_TILE_EASING = 0.8;
115
+ /** Hue arrives ahead of lightness, so a mid-size move is a clear colour, not a grey. */
116
+ const HEATMAP_TILE_HUE_LEAD = 0.4;
116
117
  const HEATMAP_TILE_TEXT_MIN_CONTRAST = 4.5;
117
- const HEATMAP_FLAT_DARK = { l: 0.53, c: 0.12, h: 296 } as const;
118
- const HEATMAP_FLAT_LIGHT = { l: 0.9, c: 0.035, h: 290 } as const;
119
- /** From flat to full strength, evenly spaced; dark pages pass a saturated middle stop on the way. */
120
- const HEATMAP_STOPS = {
121
- dark: {
122
- loss: [{ l: 0.62, c: 0.2, h: 350 }, { l: 0.7, c: 0.22, h: 356 }],
123
- gain: [{ l: 0.64, c: 0.1, h: 205 }, { l: 0.8, c: 0.13, h: 185 }],
124
- },
125
- light: {
126
- loss: [{ l: 0.7, c: 0.22, h: 356 }],
127
- gain: [{ l: 0.8, c: 0.13, h: 185 }],
128
- },
118
+ /** How far the flat middle stands off the page, as contrast against the background. */
119
+ const HEATMAP_FLAT_CONTRAST = { dark: 2.1, light: 1.4 } as const;
120
+ /** A missing move sits between the page and the flat middle: there, but saying nothing. */
121
+ const HEATMAP_MISSING_CONTRAST = { dark: 1.35, light: 1.16 } as const;
122
+ /** The middle keeps a hint of the theme's neutral tint, never a colour of its own. */
123
+ const HEATMAP_FLAT_MAX_CHROMA = 0.025;
124
+ const HEATMAP_MISSING_MAX_CHROMA = 0.008;
125
+ /** Light text tokens with more colour than this (a phosphor green, amber) are left off the tiles. */
126
+ const HEATMAP_INK_MAX_CHROMA = 0.06;
127
+ /** Luminance a token needs to count as the theme's light text, and may not exceed to count as its dark text. */
128
+ const HEATMAP_INK_LUMINANCE = { light: 0.6, dark: 0.05 } as const;
129
+ /** Below this an end has no hue to carry the scale. */
130
+ const HEATMAP_END_MIN_CHROMA = 0.05;
131
+ /** The full-strength end must stand this far from the flat middle... */
132
+ const HEATMAP_END_MIN_FROM_FLAT = 0.12;
133
+ /** ...and the two ends this far from each other. */
134
+ const HEATMAP_ENDS_MIN_APART = 0.15;
135
+ /**
136
+ * Only for a palette whose own up and down colours cannot carry the scale: an
137
+ * end too close to the page keeps its hue at this lightness, and an end with
138
+ * no hue, or two ends too alike, take the usual red and green.
139
+ */
140
+ const HEATMAP_FALLBACK = {
141
+ lightness: { dark: 0.7, light: 0.52 },
142
+ chroma: 0.15,
143
+ lossHue: 25,
144
+ gainHue: 150,
129
145
  } as const;
130
- const HEATMAP_MISSING_DARK = "#3a3a40";
131
- const HEATMAP_MISSING_LIGHT = "#cfcfd6";
132
- const HEATMAP_TEXT_LIGHT = "#ffffff";
133
- const HEATMAP_TEXT_DARK = "#0a0d1f";
134
- /** Where neither white nor the navy reaches 4.5:1, black always does. */
135
- const HEATMAP_TEXT_BLACK = "#000000";
146
+ /** How far a selected tile is pulled away from the page, further for a tile already near the end of the range. */
147
+ const HEATMAP_SELECTED_LIFT = { start: 0.45, step: 0.05, max: 0.8 } as const;
148
+ const HEATMAP_SELECTED_MIN_DISTANCE = 0.1;
136
149
  const HEATMAP_STEPS = 64;
150
+ const HEATMAP_SCALE_CACHE_LIMIT = 32;
137
151
 
138
152
  export interface HeatmapTileColors {
139
153
  background: string;
140
154
  foreground: string;
141
155
  }
142
156
 
157
+ /** A selected tile's outline on the desktop and the web: a ring, then a hairline of the page. */
158
+ export interface HeatmapSelectionRing {
159
+ outer: string;
160
+ inner: string;
161
+ }
162
+
143
163
  type Oklab = readonly [number, number, number];
144
164
 
145
165
  function srgbToLinear(channel: number): number {
@@ -168,89 +188,253 @@ export function hexToOklab(hex: string): Oklab {
168
188
  ];
169
189
  }
170
190
 
171
- function oklabToHex([lightness, a, b]: Oklab): string {
191
+ function oklabToLinear([lightness, a, b]: Oklab): [number, number, number] {
172
192
  const l = (lightness + 0.3963377774 * a + 0.2158037573 * b) ** 3;
173
193
  const m = (lightness - 0.1055613458 * a - 0.0638541728 * b) ** 3;
174
194
  const s = (lightness - 0.0894841775 * a - 1.291485548 * b) ** 3;
175
- const r = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;
176
- const g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;
177
- const blue = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;
178
- return `#${[r, g, blue].map((channel) => linearToSrgb(channel).toString(16).padStart(2, "0")).join("")}`;
195
+ return [
196
+ 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
197
+ -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
198
+ -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,
199
+ ];
200
+ }
201
+
202
+ function inGamut(color: Oklab): boolean {
203
+ return oklabToLinear(color).every((channel) => channel >= -0.0005 && channel <= 1.0005);
204
+ }
205
+
206
+ /** Into sRGB by giving up chroma, never lightness or hue, so a clipped colour cannot drift toward another. */
207
+ function toGamut(color: Oklab): Oklab {
208
+ if (inGamut(color)) return color;
209
+ const [lightness, a, b] = color;
210
+ let low = 0;
211
+ let high = 1;
212
+ for (let index = 0; index < 20; index += 1) {
213
+ const mid = (low + high) / 2;
214
+ if (inGamut([lightness, a * mid, b * mid])) low = mid;
215
+ else high = mid;
216
+ }
217
+ return [lightness, a * low, b * low];
218
+ }
219
+
220
+ function oklabToHex(color: Oklab): string {
221
+ return `#${oklabToLinear(toGamut(color)).map((channel) => linearToSrgb(channel).toString(16).padStart(2, "0")).join("")}`;
222
+ }
223
+
224
+ function chromaOf(color: Oklab): number {
225
+ return Math.hypot(color[1], color[2]);
226
+ }
227
+
228
+ function oklabDistance(left: Oklab, right: Oklab): number {
229
+ return Math.hypot(left[0] - right[0], left[1] - right[1], left[2] - right[2]);
179
230
  }
180
231
 
181
- function lch({ l, c, h }: Lch): Oklab {
182
- const radians = h * Math.PI / 180;
183
- return [l, c * Math.cos(radians), c * Math.sin(radians)];
232
+ /** The colour's hue at most `maxChroma` strong. */
233
+ function tint(color: Oklab, maxChroma: number): [number, number] {
234
+ const chroma = chromaOf(color);
235
+ const scale = chroma > maxChroma ? maxChroma / chroma : 1;
236
+ return [color[1] * scale, color[2] * scale];
237
+ }
238
+
239
+ /**
240
+ * The lightness at which a tile of this tint stands `contrast` off the page:
241
+ * above a dark page, below a light one.
242
+ */
243
+ function standOffPage(page: string, [a, b]: readonly [number, number], contrast: number, dark: boolean): Oklab {
244
+ const pageLightness = hexToOklab(page)[0];
245
+ let low = dark ? pageLightness : 0;
246
+ let high = dark ? 1 : pageLightness;
247
+ for (let index = 0; index < 24; index += 1) {
248
+ const mid = (low + high) / 2;
249
+ const reaches = contrastRatio(oklabToHex([mid, a, b]), page) >= contrast;
250
+ if (dark === reaches) high = mid;
251
+ else low = mid;
252
+ }
253
+ return toGamut([dark ? high : low, a, b]);
184
254
  }
185
255
 
186
- type Lch = { readonly l: number; readonly c: number; readonly h: number };
256
+ interface HeatmapInks {
257
+ light: string;
258
+ dark: string;
259
+ }
187
260
 
188
- /** Around the hue wheel the short way, so the scale passes through magenta and blue instead of grey. */
189
- function mixLch(from: Lch, to: Lch, ratio: number): Lch {
190
- const turn = ((to.h - from.h + 540) % 360) - 180;
261
+ /**
262
+ * The theme's own text for tiles: its lightest near-neutral tone and its
263
+ * darkest, with white and black where the theme has none.
264
+ */
265
+ function heatmapInks(palette: ThemeColors): HeatmapInks {
266
+ const tokens = [palette.textBright, palette.text, palette.selectedText, palette.headerText, palette.bg, palette.panel];
267
+ const lights = tokens.filter((token) => relativeLuminance(token) >= HEATMAP_INK_LUMINANCE.light && chromaOf(hexToOklab(token)) <= HEATMAP_INK_MAX_CHROMA);
268
+ const darks = tokens.filter((token) => relativeLuminance(token) <= HEATMAP_INK_LUMINANCE.dark);
191
269
  return {
192
- l: from.l + (to.l - from.l) * ratio,
193
- c: from.c + (to.c - from.c) * ratio,
194
- h: from.h + turn * ratio,
270
+ light: lights.reduce((best, token) => (relativeLuminance(token) > relativeLuminance(best) ? token : best), lights[0] ?? "#ffffff"),
271
+ dark: darks.reduce((best, token) => (relativeLuminance(token) < relativeLuminance(best) ? token : best), darks[0] ?? "#000000"),
195
272
  };
196
273
  }
197
274
 
198
- function heatmapTextColor(background: string): string {
199
- const best = highestContrast([HEATMAP_TEXT_LIGHT, HEATMAP_TEXT_DARK], background);
275
+ function heatmapTextColor(background: string, inks: HeatmapInks): string {
276
+ const best = higherContrast(inks.light, inks.dark, background);
200
277
  if (contrastRatio(best, background) >= HEATMAP_TILE_TEXT_MIN_CONTRAST) return best;
201
- return highestContrast([HEATMAP_TEXT_LIGHT, HEATMAP_TEXT_BLACK], background);
278
+ return higherContrast("#ffffff", "#000000", background);
279
+ }
280
+
281
+ interface HeatmapEnd {
282
+ color: Oklab;
283
+ /** The theme's own token when it carries the scale as is. */
284
+ hex: string;
285
+ }
286
+
287
+ function fallbackEnd(hue: number, dark: boolean): HeatmapEnd {
288
+ const radians = hue * Math.PI / 180;
289
+ const color = toGamut([
290
+ dark ? HEATMAP_FALLBACK.lightness.dark : HEATMAP_FALLBACK.lightness.light,
291
+ HEATMAP_FALLBACK.chroma * Math.cos(radians),
292
+ HEATMAP_FALLBACK.chroma * Math.sin(radians),
293
+ ]);
294
+ return { color, hex: oklabToHex(color) };
295
+ }
296
+
297
+ /**
298
+ * The theme's up or down colour as the end of the scale. One that sits too
299
+ * close to the page keeps its hue at a lightness that stands clear; one with
300
+ * no hue to speak of gives way to the fallback.
301
+ */
302
+ function heatmapEnd(token: string, fallbackHue: number, flat: Oklab, page: Oklab, dark: boolean): HeatmapEnd {
303
+ const color = hexToOklab(token);
304
+ const chroma = chromaOf(color);
305
+ if (chroma < HEATMAP_END_MIN_CHROMA) return fallbackEnd(fallbackHue, dark);
306
+ if (oklabDistance(color, flat) >= HEATMAP_END_MIN_FROM_FLAT && oklabDistance(color, page) >= oklabDistance(flat, page)) {
307
+ return { color, hex: token };
308
+ }
309
+ const scale = Math.max(chroma, HEATMAP_FALLBACK.chroma) / chroma;
310
+ const lifted = toGamut([
311
+ dark ? HEATMAP_FALLBACK.lightness.dark : HEATMAP_FALLBACK.lightness.light,
312
+ color[1] * scale,
313
+ color[2] * scale,
314
+ ]);
315
+ return { color: lifted, hex: oklabToHex(lifted) };
316
+ }
317
+
318
+ interface HeatmapScale {
319
+ /** 2 * HEATMAP_STEPS + 1 tiles from full loss to full gain. */
320
+ tiles: HeatmapTileColors[];
321
+ selected: HeatmapTileColors[];
322
+ missing: HeatmapTileColors;
323
+ missingSelected: HeatmapTileColors;
324
+ ring: HeatmapSelectionRing;
202
325
  }
203
326
 
204
- const heatmapScaleCache = new Map<string, HeatmapTileColors[]>();
327
+ function buildHeatmapScale(palette: ThemeColors): HeatmapScale {
328
+ // Dark is defined as the theme defines it: text lighter than the page.
329
+ const dark = relativeLuminance(palette.text) > relativeLuminance(palette.bg);
330
+ const inks = heatmapInks(palette);
331
+ const page = hexToOklab(palette.bg);
332
+ // Halfway between the page's tint and the neutral's, so a warm page gets a warm grey and a black one the neutral's.
333
+ const neutral = hexToOklab(palette.neutral);
334
+ const grey: Oklab = [neutral[0], (page[1] + neutral[1]) / 2, (page[2] + neutral[2]) / 2];
335
+ const flat = standOffPage(palette.bg, tint(grey, HEATMAP_FLAT_MAX_CHROMA), dark ? HEATMAP_FLAT_CONTRAST.dark : HEATMAP_FLAT_CONTRAST.light, dark);
336
+ let loss = heatmapEnd(palette.negative, HEATMAP_FALLBACK.lossHue, flat, page, dark);
337
+ let gain = heatmapEnd(palette.positive, HEATMAP_FALLBACK.gainHue, flat, page, dark);
338
+ if (oklabDistance(loss.color, gain.color) < HEATMAP_ENDS_MIN_APART) {
339
+ loss = fallbackEnd(HEATMAP_FALLBACK.lossHue, dark);
340
+ gain = fallbackEnd(HEATMAP_FALLBACK.gainHue, dark);
341
+ }
205
342
 
206
- /** 2 * HEATMAP_STEPS + 1 colours from full loss to full gain, built once per light or dark page. */
207
- function heatmapScale(light: boolean): HeatmapTileColors[] {
208
- const key = light ? "light" : "dark";
209
- const cached = heatmapScaleCache.get(key);
210
- if (cached) return cached;
211
- const flat = light ? HEATMAP_FLAT_LIGHT : HEATMAP_FLAT_DARK;
212
- const stops = HEATMAP_STOPS[key];
213
- const scale: HeatmapTileColors[] = [];
343
+ const lift = dark ? inks.light : inks.dark;
344
+ const tile = (background: string): HeatmapTileColors => ({ background, foreground: heatmapTextColor(background, inks) });
345
+ const selectedTile = (background: string) => {
346
+ let ratio: number = HEATMAP_SELECTED_LIFT.start;
347
+ while (ratio < HEATMAP_SELECTED_LIFT.max && oklabDistance(hexToOklab(blendHex(background, lift, ratio)), hexToOklab(background)) < HEATMAP_SELECTED_MIN_DISTANCE) {
348
+ ratio += HEATMAP_SELECTED_LIFT.step;
349
+ }
350
+ return tile(blendHex(background, lift, Math.min(ratio, HEATMAP_SELECTED_LIFT.max)));
351
+ };
352
+ const tiles: HeatmapTileColors[] = [];
214
353
  for (let step = -HEATMAP_STEPS; step <= HEATMAP_STEPS; step += 1) {
354
+ const end = step < 0 ? loss : gain;
355
+ if (Math.abs(step) === HEATMAP_STEPS) {
356
+ tiles.push(tile(end.hex));
357
+ continue;
358
+ }
215
359
  const strength = (Math.abs(step) / HEATMAP_STEPS) ** HEATMAP_TILE_EASING;
216
- const path: readonly Lch[] = [flat, ...(step < 0 ? stops.loss : stops.gain)];
217
- const position = strength * (path.length - 1);
218
- const segment = Math.min(path.length - 2, Math.floor(position));
219
- const background = oklabToHex(lch(mixLch(path[segment]!, path[segment + 1]!, position - segment)));
220
- scale.push({ background, foreground: heatmapTextColor(background) });
360
+ const hue = strength ** HEATMAP_TILE_HUE_LEAD;
361
+ tiles.push(tile(oklabToHex([
362
+ flat[0] + (end.color[0] - flat[0]) * strength,
363
+ flat[1] + (end.color[1] - flat[1]) * hue,
364
+ flat[2] + (end.color[2] - flat[2]) * hue,
365
+ ])));
221
366
  }
222
- heatmapScaleCache.set(key, scale);
223
- return scale;
367
+ const missing = tile(oklabToHex(standOffPage(
368
+ palette.bg,
369
+ tint(grey, HEATMAP_MISSING_MAX_CHROMA),
370
+ dark ? HEATMAP_MISSING_CONTRAST.dark : HEATMAP_MISSING_CONTRAST.light,
371
+ dark,
372
+ )));
373
+ return {
374
+ tiles,
375
+ selected: tiles.map(({ background }) => selectedTile(background)),
376
+ missing,
377
+ missingSelected: selectedTile(missing.background),
378
+ ring: { outer: lift, inner: palette.bg },
379
+ };
224
380
  }
225
381
 
226
- function isLightPage(): boolean {
227
- return relativeLuminance(colors.bg) > 0.4;
228
- }
382
+ const heatmapScaleCache = new Map<string, HeatmapScale>();
229
383
 
230
384
  /**
231
- * The tile colours for a day's move in percent. Full strength at +/-3%; a
232
- * missing move is neutral grey, never the flat colour, so it cannot pass for
233
- * an unchanged price.
385
+ * Built once per palette and keyed by its colours, never by its name or a
386
+ * light or dark flag, so a theme switch or an edited palette recolours the
387
+ * map at once.
234
388
  */
235
- export function resolveHeatmapTileColors(changePercent: number | null | undefined): HeatmapTileColors {
236
- const light = isLightPage();
237
- if (changePercent == null || !Number.isFinite(changePercent)) {
238
- const background = light ? HEATMAP_MISSING_LIGHT : HEATMAP_MISSING_DARK;
239
- return { background, foreground: heatmapTextColor(background) };
389
+ function heatmapScale(palette: ThemeColors): HeatmapScale {
390
+ const key = `${palette.bg}|${palette.panel}|${palette.text}|${palette.textBright}|${palette.selectedText}|${palette.headerText}|${palette.neutral}|${palette.positive}|${palette.negative}`;
391
+ let scale = heatmapScaleCache.get(key);
392
+ if (!scale) {
393
+ scale = buildHeatmapScale(palette);
394
+ if (heatmapScaleCache.size >= HEATMAP_SCALE_CACHE_LIMIT) heatmapScaleCache.clear();
395
+ heatmapScaleCache.set(key, scale);
240
396
  }
397
+ return scale;
398
+ }
399
+
400
+ function heatmapStep(changePercent: number): number {
241
401
  const ratio = Math.max(-1, Math.min(1, changePercent / HEATMAP_TILE_FULL_SCALE_PERCENT));
242
- return heatmapScale(light)[Math.round(ratio * HEATMAP_STEPS) + HEATMAP_STEPS]!;
402
+ return Math.round(ratio * HEATMAP_STEPS) + HEATMAP_STEPS;
403
+ }
404
+
405
+ function hasMove(changePercent: number | null | undefined): changePercent is number {
406
+ return changePercent != null && Number.isFinite(changePercent);
243
407
  }
244
408
 
245
- const HEATMAP_SELECTED_LIFT = 0.45;
409
+ /**
410
+ * The tile colours for a day's move in percent. Full strength at +/-3%; a
411
+ * missing move is the theme's grey, never the flat colour, so it cannot pass
412
+ * for an unchanged price.
413
+ */
414
+ export function resolveHeatmapTileColors(
415
+ changePercent: number | null | undefined,
416
+ palette: ThemeColors = colors,
417
+ ): HeatmapTileColors {
418
+ const scale = heatmapScale(palette);
419
+ return hasMove(changePercent) ? scale.tiles[heatmapStep(changePercent)]! : scale.missing;
420
+ }
246
421
 
247
422
  /**
248
423
  * The selected tile on a cell grid, which cannot draw an outline: the same
249
- * hue lifted toward white, so the selection still says which way it moved.
424
+ * hue pulled away from the page, lighter on a dark theme and deeper on a
425
+ * light one, so the selection still says which way it moved.
250
426
  */
251
- export function resolveHeatmapSelectedTileColors(changePercent: number | null | undefined): HeatmapTileColors {
252
- const background = blendHex(resolveHeatmapTileColors(changePercent).background, "#ffffff", HEATMAP_SELECTED_LIFT);
253
- return { background, foreground: heatmapTextColor(background) };
427
+ export function resolveHeatmapSelectedTileColors(
428
+ changePercent: number | null | undefined,
429
+ palette: ThemeColors = colors,
430
+ ): HeatmapTileColors {
431
+ const scale = heatmapScale(palette);
432
+ return hasMove(changePercent) ? scale.selected[heatmapStep(changePercent)]! : scale.missingSelected;
433
+ }
434
+
435
+ /** The selected tile's outline where one can be drawn: the theme's text tone against the page, then a hairline of the page. */
436
+ export function resolveHeatmapSelectionRing(palette: ThemeColors = colors): HeatmapSelectionRing {
437
+ return heatmapScale(palette).ring;
254
438
  }
255
439
 
256
440
  const oklabCache = new Map<string, Oklab>();
@@ -267,7 +451,5 @@ export function heatmapColorDistance(left: string, right: string): number {
267
451
  }
268
452
  return value;
269
453
  };
270
- const [l1, a1, b1] = read(left);
271
- const [l2, a2, b2] = read(right);
272
- return Math.hypot(l1 - l2, a1 - a2, b1 - b2);
454
+ return oklabDistance(read(left), read(right));
273
455
  }
@@ -37,6 +37,21 @@ const RANGE_PRESET_RESOLUTION: Record<TimeRange, ManualChartResolution> = {
37
37
  "ALL": "1mo",
38
38
  };
39
39
 
40
+ /**
41
+ * The bar size a price history for a range is served in, unlike the chart
42
+ * presets above: what `gloomberb history` and the historical prices pane get.
43
+ */
44
+ export const RANGE_HISTORY_RESOLUTION: Readonly<Record<TimeRange, ManualChartResolution>> = {
45
+ "1D": "5m",
46
+ "1W": "1h",
47
+ "1M": "1d",
48
+ "3M": "1d",
49
+ "6M": "1d",
50
+ "1Y": "1d",
51
+ "5Y": "1wk",
52
+ "ALL": "1mo",
53
+ };
54
+
40
55
  const RANGE_PRELOAD_BUFFER: Record<TimeRange, TimeRange> = {
41
56
  "1D": "1W",
42
57
  "1W": "1M",
@@ -1647,7 +1647,7 @@ async function resolveChartSpecPass(
1647
1647
  || (request.bounds.end !== null && now() - (request.bounds.end + 1) < 60 * 60_000);
1648
1648
  const staleCurrent = (value: LoadedPriceHistory) => currentWindow() && !!value.session
1649
1649
  && isPriceHistoryStaleForCurrentWindow(value.points, now(), {
1650
- exchange: source.instrument.exchange, session: value.session,
1650
+ symbol: source.instrument.symbol, exchange: source.instrument.exchange, session: value.session,
1651
1651
  ...(value.resolution ? { intervalMs: CHART_RESOLUTION_STEP_MS[value.resolution] } : {}),
1652
1652
  });
1653
1653
  if (staleCurrent(loaded)) {
@@ -105,7 +105,7 @@ function freshSeedPoints(
105
105
  // Broker contract/session interpretation remains unproven, as at acquisition.
106
106
  const session = instrument.instrument ? undefined : result.session;
107
107
  if (currentWindow && isIntradayResolution(resolution) && isPriceHistoryStaleForCurrentWindow(points, now, {
108
- exchange: target.exchange, intervalMs: CHART_RESOLUTION_STEP_MS[resolution], session,
108
+ symbol: target.symbol, exchange: target.exchange, intervalMs: CHART_RESOLUTION_STEP_MS[resolution], session,
109
109
  })) return null;
110
110
  return points.length ? points : null;
111
111
  }
@@ -80,6 +80,12 @@ export type ContextMenuContext =
80
80
  layoutIndex: number;
81
81
  layoutName: string;
82
82
  active: boolean;
83
+ }
84
+ | {
85
+ /** A person's name or @mention in the chat. */
86
+ kind: "chat-user";
87
+ userId: string;
88
+ username: string | null;
83
89
  };
84
90
 
85
91
  export function hasRunnableContextMenuItem(items: readonly ContextMenuItem[]): boolean {
@@ -116,6 +116,8 @@ export interface MarketDataRequestContext {
116
116
  historyRequestKey?: string;
117
117
  /** Intraday history should include pre-market and after-hours bars where the source has them. */
118
118
  historySession?: "extended";
119
+ /** The listing's company, from its own quote: an SEC lookup for a non-US listing checks the registrant against it. */
120
+ listingName?: string;
119
121
  }
120
122
 
121
123
  export interface CachedFinancialsTarget {
@@ -38,7 +38,21 @@ export interface QuoteMetadata {
38
38
  fieldSources?: Partial<Record<"currency" | "instrumentType", QuoteMetadataSource>>;
39
39
  }
40
40
 
41
- export interface Quote {
41
+ /**
42
+ * What a record's share counts count: depositary receipts or the ordinary
43
+ * shares behind them. Gloom Cloud states it only when it established it.
44
+ */
45
+ export type ShareBasis = "depositary_receipt" | "ordinary";
46
+
47
+ /** How a depositary receipt relates to the ordinary shares, as Gloom Cloud states it. */
48
+ interface DepositaryReceiptFacts {
49
+ /** Whether the listing is a depositary receipt; absent when unknown. */
50
+ isDepositaryReceipt?: boolean;
51
+ /** Ordinary shares per receipt, on a receipt's own records. */
52
+ adrRatio?: number;
53
+ }
54
+
55
+ export interface Quote extends DepositaryReceiptFacts {
42
56
  /** Applies to this price observation; a stored position cannot supply it. */
43
57
  priceBasis?: PriceBasis;
44
58
  /** Daily fund net asset value; independent of the units used to format its price. */
@@ -58,6 +72,9 @@ export interface Quote {
58
72
  regularClose?: number;
59
73
  /** Exchange-local date of regularClose; separate from the daily previous-close reference. */
60
74
  regularCloseSessionDate?: string;
75
+ /** Move of that completed regular session from the one before it, in this quote's currency; set and cleared together with regularClose. */
76
+ regularChange?: number;
77
+ regularChangePercent?: number;
61
78
  /** Provider's exchange-local session date for the daily quote reference. */
62
79
  changeSessionDate?: string;
63
80
  high52w?: number;
@@ -106,7 +123,11 @@ export interface QuoteContribution extends Quote {
106
123
 
107
124
  export type QuoteContributionMap = Record<string, QuoteContribution>;
108
125
 
109
- export interface Fundamentals {
126
+ export interface Fundamentals extends DepositaryReceiptFacts {
127
+ /** Every share count here is on this basis, the basis of the listing's price and market cap; absent when unproven. */
128
+ shareBasis?: ShareBasis;
129
+ /** On a receipt, the ordinary shares behind `sharesOutstanding`. */
130
+ underlyingOrdinaryShares?: number;
110
131
  source?: "gloom";
111
132
  fetchedAt?: string;
112
133
  stale?: boolean;
@@ -177,6 +198,8 @@ export interface HolderRecord {
177
198
  percentHeld?: number;
178
199
  changeShares?: number;
179
200
  changePercent?: number;
201
+ /** Set when the position's filing ties it to the receipts or to the ordinary shares. */
202
+ shareBasis?: ShareBasis;
180
203
  }
181
204
 
182
205
  interface HolderSummary {
@@ -186,11 +209,18 @@ interface HolderSummary {
186
209
  institutionsCount?: number;
187
210
  }
188
211
 
189
- export interface HolderData {
212
+ export interface HolderData extends DepositaryReceiptFacts {
190
213
  providerId?: string;
191
214
  symbol: string;
192
215
  name?: string;
216
+ /** The listing's price currency. */
193
217
  currency?: string;
218
+ /** The currency of `value`, which can differ from the listing's (USD on a London line priced from 13F filings). */
219
+ valueCurrency?: string;
220
+ /** Reported shares times the latest price, or times the price at the report date. */
221
+ valueBasis?: "latest_price" | "period_end_price";
222
+ /** Set when every row is on one basis. */
223
+ shareBasis?: ShareBasis;
194
224
  exchange?: string;
195
225
  asOf?: string;
196
226
  summary?: HolderSummary;
@@ -427,6 +457,8 @@ export interface ReportedEarningsCohort {
427
457
  export interface EarningsResultProvenance { version: 1; reported: ReportedEarningsCohort }
428
458
 
429
459
  export interface FinancialStatement {
460
+ /** The basis of this row's share counts and per-share earnings; absent when unproven. */
461
+ shareBasis?: ShareBasis;
430
462
  /** @deprecated No longer populated. */
431
463
  earningsResult?: EarningsResultProvenance;
432
464
  /** EPS lines unavailable for this period, for example because they disagree with the row's own income and shares. */