zframes 0.7.0 → 0.8.0

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 (265) hide show
  1. package/dist/index.js +1773 -214
  2. package/package.json +5 -5
  3. package/runtime/assets/bar-chart-DmyKFv_O.js +1 -0
  4. package/runtime/assets/{bitcoin-dominance-rskkp4h2.js → bitcoin-dominance-Y-pfXAWg.js} +1 -1
  5. package/runtime/assets/{breakeven-DyCA3ya5.js → breakeven-D5o1aZeG.js} +1 -1
  6. package/runtime/assets/{breathing-C8Y-Izs8.js → breathing-C3xWrMh-.js} +1 -1
  7. package/runtime/assets/btc-block-size-bars-Dm4d1uP6.js +1 -0
  8. package/runtime/assets/{btc-blocks-BxS4aEAB.js → btc-blocks-Dh75DtBl.js} +1 -1
  9. package/runtime/assets/{btc-difficulty-CNFxEiPh.js → btc-difficulty-DT6GcCi7.js} +1 -1
  10. package/runtime/assets/btc-difficulty-chart-D6G_nIaV.js +1 -0
  11. package/runtime/assets/{btc-fees-Db-5JKh9.js → btc-fees-CAwJQaIo.js} +1 -1
  12. package/runtime/assets/btc-hashrate-CWvKwoGY.js +1 -0
  13. package/runtime/assets/{btc-mempool-DFgUVk8y.js → btc-mempool-C_PwdChj.js} +1 -1
  14. package/runtime/assets/{btc-shared-DeqDaCze.js → btc-shared-yOWoU9Im.js} +1 -1
  15. package/runtime/assets/bubbles-shared-DY914nhm.js +1 -0
  16. package/runtime/assets/{calculator-v01_FkZv.js → calculator-DmCi3Diy.js} +1 -1
  17. package/runtime/assets/capital-structure-bars-CCL6FBZT.js +1 -0
  18. package/runtime/assets/{chain-activity-CuA1eiPY.js → chain-activity-DmVXPTCW.js} +1 -1
  19. package/runtime/assets/chain-activity-bars-C2_6k9uI.js +1 -0
  20. package/runtime/assets/chain-activity-scatter-KDstJ2gQ.js +1 -0
  21. package/runtime/assets/chain-price-movers-C7cM87Np.js +1 -0
  22. package/runtime/assets/chart-utils-DGogNvJT.js +1 -0
  23. package/runtime/assets/checklist-aIHO99Oy.js +1 -0
  24. package/runtime/assets/{clock-BWFux5om.js → clock-RTIdbX_o.js} +1 -1
  25. package/runtime/assets/coin-momentum-heatmap-BqpZC5MD.js +1 -0
  26. package/runtime/assets/coin-momentum-scatter-BLQuQ5y9.js +1 -0
  27. package/runtime/assets/{coin-movers-BcXfoFc6.js → coin-movers-BcLGwl1y.js} +1 -1
  28. package/runtime/assets/{countdown-CXSOeUWD.js → countdown-DiZVeLK1.js} +1 -1
  29. package/runtime/assets/custom-data-BgQF-y2R.js +1 -0
  30. package/runtime/assets/{cycle-shared-pyXzkgt1.js → cycle-shared-XoGVsOjC.js} +1 -1
  31. package/runtime/assets/{cycle-signals-BrKJX2c6.js → cycle-signals-1fCJGzfH.js} +1 -1
  32. package/runtime/assets/cycle-valuation-composite-BBA7wxL2.js +1 -0
  33. package/runtime/assets/d3-ibrLIlQc.js +1 -0
  34. package/runtime/assets/{daily-analysis-CWluVygw.js → daily-analysis-w96yBGxi.js} +1 -1
  35. package/runtime/assets/{day-meter-Bi5OZCC4.js → day-meter-D7SyWAWO.js} +1 -1
  36. package/runtime/assets/{defi-revenue-CFNSNfG7.js → defi-revenue-DC7iVw-b.js} +1 -1
  37. package/runtime/assets/dex-hot-pools-CbBeDh7R.js +1 -0
  38. package/runtime/assets/dex-pool-bubbles-DsS26KRy.js +1 -0
  39. package/runtime/assets/dex-pool-liquidity-scatter-Cam1cxZL.js +1 -0
  40. package/runtime/assets/{dex-pool-treemap-DqvlN1Jo.js → dex-pool-treemap-CuU6G6rY.js} +1 -1
  41. package/runtime/assets/dex-volume-bubbles-DZvYb1Gu.js +1 -0
  42. package/runtime/assets/dex-volume-chart-BmJMKgts.js +1 -0
  43. package/runtime/assets/dex-volume-share-area-B16TypiP.js +1 -0
  44. package/runtime/assets/{dex-volume-treemap-qyEBx4ll.js → dex-volume-treemap-Kl3BycC8.js} +1 -1
  45. package/runtime/assets/{dice-CuzcQipj.js → dice-BBWeIZ4c.js} +1 -1
  46. package/runtime/assets/dino-game-CacSVnNs.js +1 -0
  47. package/runtime/assets/divider-BDbJkoKt.js +1 -0
  48. package/runtime/assets/dominance-bars-D7mHdU5j.js +1 -0
  49. package/runtime/assets/dominance-gauge-D4Dizu40.js +1 -0
  50. package/runtime/assets/{drawdy-Bxr7eJ-7.js → drawdy-C4Xes6ll.js} +1 -1
  51. package/runtime/assets/{dxy-CVbZmRsT.js → dxy-CQqmlBOH.js} +1 -1
  52. package/runtime/assets/dxy-chart-COvjjHiK.js +1 -0
  53. package/runtime/assets/editor-C9dj6xX0.css +1 -0
  54. package/runtime/assets/editor-CFgkD4LH.js +68 -0
  55. package/runtime/assets/etf-flow-bars-DQmhSdlG.js +1 -0
  56. package/runtime/assets/etf-flow-calendar-BtU4tAJx.js +1 -0
  57. package/runtime/assets/{etf-flows-Cl1WliDl.js → etf-flows-B5HTl_O2.js} +1 -1
  58. package/runtime/assets/{etf-flows-chart-B4Im9TVy.js → etf-flows-chart-CrJq5l_U.js} +1 -1
  59. package/runtime/assets/etf-issuer-bars-C8CS42V9.js +1 -0
  60. package/runtime/assets/etf-issuer-treemap-B8V6wOUz.js +1 -0
  61. package/runtime/assets/eth-issuance-impact-DBfYkAhQ.js +1 -0
  62. package/runtime/assets/{eth-staking-_q2b8DEx.js → eth-staking-CS-soUKT.js} +1 -1
  63. package/runtime/assets/{eth-supply-55OpYYBL.js → eth-supply-5f4GEmei.js} +1 -1
  64. package/runtime/assets/{fear-greed-CywOCckQ.js → fear-greed-D20BQ0ai.js} +1 -1
  65. package/runtime/assets/fear-greed-chart-CzqxRAt0.js +1 -0
  66. package/runtime/assets/{filings-feed-CosEi4NL.js → filings-feed-C-uvwTLC.js} +1 -1
  67. package/runtime/assets/filings-mix-OIhf0PEq.js +1 -0
  68. package/runtime/assets/{financial-stress-DBCae4TA.js → financial-stress-B29D-qDA.js} +1 -1
  69. package/runtime/assets/{flappy-bird-CBVgwfgX.js → flappy-bird-DGYf5Ewk.js} +1 -1
  70. package/runtime/assets/format-DxkEZcwQ.js +1 -0
  71. package/runtime/assets/fundamentals-CcvmrNcz.js +1 -0
  72. package/runtime/assets/funding-bars-D7M6sJZL.js +1 -0
  73. package/runtime/assets/funding-carry-area-Dq7ytVeR.js +1 -0
  74. package/runtime/assets/funding-comparison-Ci4xJZk2.js +1 -0
  75. package/runtime/assets/funding-crowding-scatter-nUiUaNV4.js +1 -0
  76. package/runtime/assets/funding-heatmap-B5zG3T9U.js +1 -0
  77. package/runtime/assets/funding-leaderboard-bars-cf5-s8-T.js +1 -0
  78. package/runtime/assets/{funding-rate-chart-Da9WMKyJ.js → funding-rate-chart-Dp06ipCG.js} +1 -1
  79. package/runtime/assets/funding-spread-bars-CZdgC9ni.js +1 -0
  80. package/runtime/assets/funding-venue-heatmap-C-Kh1qHo.js +1 -0
  81. package/runtime/assets/{fx-board-CxhwDBHO.js → fx-board-C4yCDDGZ.js} +1 -1
  82. package/runtime/assets/fx-cross-heatmap-DHP7jzo6.js +1 -0
  83. package/runtime/assets/fx-movers-bars-8q6fFcdY.js +1 -0
  84. package/runtime/assets/fx-trend-chart-DEtRTau8.js +1 -0
  85. package/runtime/assets/{game-ui-Dy_QYsPr.js → game-ui-BiMS2KJf.js} +1 -1
  86. package/runtime/assets/heading-B6HiIuvX.js +1 -0
  87. package/runtime/assets/hero-number-DUjENGj6.js +1 -0
  88. package/runtime/assets/{holiday-calendar-C77t3m6c.js → holiday-calendar-qi7M9l4n.js} +1 -1
  89. package/runtime/assets/image-D5ZO4DFB.js +1 -0
  90. package/runtime/assets/image-gallery-Dpr218ld.js +1 -0
  91. package/runtime/assets/index-5ezz63At.css +1 -0
  92. package/runtime/assets/{index-DKixdHYB.js → index-BpPIfN5S.js} +1 -1
  93. package/runtime/assets/index-CiYWppnQ.js +1108 -0
  94. package/runtime/assets/index-D051JGM1.js +1 -0
  95. package/runtime/assets/index-DuNO-RcB.js +1 -0
  96. package/runtime/assets/indicators-Cw7CVPn4.js +1 -0
  97. package/runtime/assets/inflation-pulse-cleNvOgk.js +1 -0
  98. package/runtime/assets/{journal-log-BDu39CBE.js → journal-log-BYS6KBP0.js} +1 -1
  99. package/runtime/assets/{journal-open-FejLOzlA.js → journal-open-Dd-2HpWe.js} +1 -1
  100. package/runtime/assets/{journal-results-CtKy6MZM.js → journal-results-Bo95cRBC.js} +1 -1
  101. package/runtime/assets/{journal-score-Bd7IDYl4.js → journal-score-CQ5jNovg.js} +1 -1
  102. package/runtime/assets/{journal-store-KCRoPnI_.js → journal-store-DVDSxNMj.js} +1 -1
  103. package/runtime/assets/{journal-ui-C_htu3aM.js → journal-ui-P_aNAgF1.js} +1 -1
  104. package/runtime/assets/labor-force-flow-0vecYFin.js +1 -0
  105. package/runtime/assets/labor-market-BSxSRnKx.js +1 -0
  106. package/runtime/assets/{lightning-stats-botYMCIX.js → lightning-stats-CBj576A7.js} +1 -1
  107. package/runtime/assets/{link-grid-DFuD6XVK.js → link-grid-MCfSDZZw.js} +1 -1
  108. package/runtime/assets/liquidity-basis-bars-CPGTcxkm.js +1 -0
  109. package/runtime/assets/{ma-multiplier-s6ix-kL8.js → ma-multiplier-g4p5Pi3k.js} +1 -1
  110. package/runtime/assets/{macro-calendar-Dhnx2n5Q.js → macro-calendar-d2JHausW.js} +1 -1
  111. package/runtime/assets/market-bubbles-CDCGDkEQ.js +1 -0
  112. package/runtime/assets/{market-cap-treemap-BWtivvac.js → market-cap-treemap-BSElYaQa.js} +1 -1
  113. package/runtime/assets/market-hours-BH2Focsr.js +1 -0
  114. package/runtime/assets/market-scatter-CdXDxlvI.js +1 -0
  115. package/runtime/assets/{marquee-NHBiLJUk.js → marquee-DAz20C7s.js} +1 -1
  116. package/runtime/assets/mayer-multiple-mJbiBIAH.js +1 -0
  117. package/runtime/assets/mempool-fee-curve-DC21aRj_.js +1 -0
  118. package/runtime/assets/{mini-line-chart-QWeuTPfP.js → mini-line-chart-DyG55cVW.js} +1 -1
  119. package/runtime/assets/{mining-pools-BxipfJmv.js → mining-pools-DDrcI0JC.js} +1 -1
  120. package/runtime/assets/mining-pools-share-BTghpuPh.js +1 -0
  121. package/runtime/assets/misery-index-BFKKI3-y.js +1 -0
  122. package/runtime/assets/mover-row-9TS6-Vx5.js +1 -0
  123. package/runtime/assets/movers-bars-BGRZiztL.js +1 -0
  124. package/runtime/assets/movers-bubbles-DKwj1mvp.js +1 -0
  125. package/runtime/assets/{mvrv-BIwCiyRN.js → mvrv-bAGE8y8s.js} +1 -1
  126. package/runtime/assets/mvrv-zscore-chart-BBQG73VU.js +1 -0
  127. package/runtime/assets/{national-debt-DwC5azy3.js → national-debt-DKFxcreA.js} +1 -1
  128. package/runtime/assets/news-feed-BdERDNLF.js +1 -0
  129. package/runtime/assets/nft-activity-bars-DDM29Mlf.js +1 -0
  130. package/runtime/assets/nft-bubbles-piuKr-F-.js +1 -0
  131. package/runtime/assets/{nft-collections-sD-yDfKU.js → nft-collections-BRT3lGEI.js} +1 -1
  132. package/runtime/assets/nft-scatter-v2AlapcL.js +1 -0
  133. package/runtime/assets/{nft-treemap-Bqhk41Of.js → nft-treemap-DOoBuiAe.js} +1 -1
  134. package/runtime/assets/note-Cge-Twe7.js +3 -0
  135. package/runtime/assets/{nupl-U-WHVDJ0.js → nupl-DyKmiugr.js} +1 -1
  136. package/runtime/assets/nupl-cycle-chart-CjPXwU_H.js +1 -0
  137. package/runtime/assets/nyfed-fed-funds-band-gauge-CgtBzt19.js +1 -0
  138. package/runtime/assets/nyfed-reference-rate-bars-XM22e3m1.js +1 -0
  139. package/runtime/assets/nyfed-sofr-term-averages-bars-BX8DdQdy.js +1 -0
  140. package/runtime/assets/ofr-stress-category-area-DJ9A1Jek.js +1 -0
  141. package/runtime/assets/ohlcv-volume-bars-DjbIATbf.js +1 -0
  142. package/runtime/assets/oi-treemap-DN3lHhIw.js +1 -0
  143. package/runtime/assets/onchain-oscillator-overlay-BhHhVrFw.js +1 -0
  144. package/runtime/assets/{open-interest-C0_M6MkH.js → open-interest-CQz_hue7.js} +1 -1
  145. package/runtime/assets/options-flow-skew-BnNt577O.js +1 -0
  146. package/runtime/assets/{options-iv-CIHzBULM.js → options-iv-DRlcGyOA.js} +1 -1
  147. package/runtime/assets/options-max-pain-DttmKvGL.js +1 -0
  148. package/runtime/assets/options-max-pain-multi-BWvVp8w0.js +1 -0
  149. package/runtime/assets/options-oi-ladder-heatmap-D-GtQnYR.js +1 -0
  150. package/runtime/assets/options-oi-skew-C7zh_o7-.js +1 -0
  151. package/runtime/assets/{options-oi-strike-Db8lP27S.js → options-oi-strike-CRd6fuzZ.js} +1 -1
  152. package/runtime/assets/{options-put-call-5ex7Ablt.js → options-put-call-DaSJMaWB.js} +1 -1
  153. package/runtime/assets/options-vol-smile-DLg5yS2Q.js +1 -0
  154. package/runtime/assets/options-vol-spread-DzhDF8S2.js +1 -0
  155. package/runtime/assets/payrolls-bars-DUfM2bRV.js +1 -0
  156. package/runtime/assets/{pi-cycle-eACZGQhd.js → pi-cycle-Dnep9J9d.js} +1 -1
  157. package/runtime/assets/pie-chart-BIxKuHm-.js +1 -0
  158. package/runtime/assets/{pomodoro-CaS6y-eQ.js → pomodoro-462F-K_R.js} +1 -1
  159. package/runtime/assets/portfolio-allocation-BmnvEhEW.js +1 -0
  160. package/runtime/assets/portfolio-common-DPg-LM-S.js +1 -0
  161. package/runtime/assets/{portfolio-holdings-D-SG9B5X.js → portfolio-holdings-pJ3PcDtA.js} +1 -1
  162. package/runtime/assets/portfolio-movers-88ySthIZ.js +1 -0
  163. package/runtime/assets/{portfolio-value-DPKyirHc.js → portfolio-value-BIrDQqeD.js} +1 -1
  164. package/runtime/assets/portfolio-value-bars-B5PlVsS-.js +1 -0
  165. package/runtime/assets/prediction-market-bars-CjhLqjKZ.js +1 -0
  166. package/runtime/assets/prediction-market-scatter-PFzl9aUV.js +1 -0
  167. package/runtime/assets/{prediction-markets-Cnf0KZba.js → prediction-markets-COBBk6vK.js} +1 -1
  168. package/runtime/assets/prediction-markets-bubble-OHW4Fyta.js +1 -0
  169. package/runtime/assets/{price-chart-BEnpZLyb.js → price-chart-CttRCaIA.js} +1 -1
  170. package/runtime/assets/{price-compare-8LvkF-xq.js → price-compare-DNhtDisn.js} +1 -1
  171. package/runtime/assets/{price-liveline-DkTeXuC2.js → price-liveline-DR_topxQ.js} +1 -1
  172. package/runtime/assets/price-ticker-DgbqT8Ft.js +1 -0
  173. package/runtime/assets/protocol-fees-bubbles-DJKiIQLP.js +1 -0
  174. package/runtime/assets/{protocol-fees-treemap-fvVOfUFt.js → protocol-fees-treemap-YkaWU0jI.js} +1 -1
  175. package/runtime/assets/protocol-fees-vs-tvl-scatter-BdbfLYV5.js +1 -0
  176. package/runtime/assets/protocol-tvl-bubbles-BC38d6kb.js +1 -0
  177. package/runtime/assets/protocol-tvl-by-category-D6xbGiRH.js +1 -0
  178. package/runtime/assets/{protocol-tvl-chart-BfrszRqq.js → protocol-tvl-chart-MRYKJKC8.js} +1 -1
  179. package/runtime/assets/protocol-tvl-share-area-BaLjcOpi.js +1 -0
  180. package/runtime/assets/{protocol-tvl-treemap-v5kaQdP4.js → protocol-tvl-treemap-DdIxlR7K.js} +1 -1
  181. package/runtime/assets/{puell-multiple-BdOLF9Wh.js → puell-multiple-C-5BP2qr.js} +1 -1
  182. package/runtime/assets/put-call-gauge-CIL56SWp.js +1 -0
  183. package/runtime/assets/{quote-slpulzHo.js → quote-BCahDrH2.js} +1 -1
  184. package/runtime/assets/radial-gauge-0BzRQ6fO.js +1 -0
  185. package/runtime/assets/{rates-board-B6hHyiDM.js → rates-board-JeVYxfxX.js} +1 -1
  186. package/runtime/assets/real-wages-CxYcPexL.js +1 -0
  187. package/runtime/assets/realized-price-DfKM0AQB.js +1 -0
  188. package/runtime/assets/{reserve-risk-_07r_h5w.js → reserve-risk-CZ8W5vox.js} +1 -1
  189. package/runtime/assets/{returns-projector-NBs7iGAV.js → returns-projector-D8UX1710.js} +1 -1
  190. package/runtime/assets/{risk-reward-Baq_TRho.js → risk-reward-DgkqN_mw.js} +1 -1
  191. package/runtime/assets/{rsi-momentum-B6oTu5W6.js → rsi-momentum-DLc5Fw80.js} +1 -1
  192. package/runtime/assets/{rules-card-D98hKEwY.js → rules-card-B5gZWhLc.js} +1 -1
  193. package/runtime/assets/scatter-chart-B28DJ7P-.js +1 -0
  194. package/runtime/assets/sector-bars-CahrlX_u.js +1 -0
  195. package/runtime/assets/sector-bubbles-DdfZ6e5Q.js +1 -0
  196. package/runtime/assets/{sector-performance-DlnYIM-L.js → sector-performance-BdYXFE7z.js} +1 -1
  197. package/runtime/assets/{sector-treemap-C3sX3Q9o.js → sector-treemap-DBA5ilb3.js} +1 -1
  198. package/runtime/assets/sentiment-gauge-BD6U6U9e.js +1 -0
  199. package/runtime/assets/{session-progress-BYwNuuP-.js → session-progress-1UWc9VqZ.js} +1 -1
  200. package/runtime/assets/{short-volume-CxBDSjP6.js → short-volume-BR5Bd4dE.js} +1 -1
  201. package/runtime/assets/short-volume-bars-qHwd3DwT.js +1 -0
  202. package/runtime/assets/{snake-CGV0Kg4z.js → snake-VPnsi0wu.js} +1 -1
  203. package/runtime/assets/{sopr-DAn99w9D.js → sopr-pPCw72oY.js} +1 -1
  204. package/runtime/assets/{spotify-embed-BBfim9vk.js → spotify-embed-BAYLjQ13.js} +1 -1
  205. package/runtime/assets/{stablecoin-chains-D4EKi_YR.js → stablecoin-chains-gXvliWf0.js} +1 -1
  206. package/runtime/assets/{stablecoin-supply-1m6FGR7-.js → stablecoin-supply-cKbLU-qq.js} +1 -1
  207. package/runtime/assets/stopwatch-USjNEK2T.js +1 -0
  208. package/runtime/assets/{top-movers-CAqBZOUL.js → top-movers-m16-LIpD.js} +1 -1
  209. package/runtime/assets/treasury-auction-demand-scatter-qtbp6UWp.js +1 -0
  210. package/runtime/assets/treasury-auction-size-bars-BN1UAVmo.js +1 -0
  211. package/runtime/assets/{treasury-auctions-Bl19yaM_.js → treasury-auctions-BiOh-3vx.js} +1 -1
  212. package/runtime/assets/treasury-avg-rate-bars-CJ1IViWy.js +1 -0
  213. package/runtime/assets/treasury-debt-composition-area-BPy8-h89.js +1 -0
  214. package/runtime/assets/{treemap-leaf-A45Ge4-e.js → treemap-leaf-QG-L-SIG.js} +1 -1
  215. package/runtime/assets/trending-bars-D_8IduL8.js +1 -0
  216. package/runtime/assets/trending-bubbles-DYxWvz2k.js +1 -0
  217. package/runtime/assets/{trending-coins-Dm9R9zGQ.js → trending-coins-DqSuuuF9.js} +1 -1
  218. package/runtime/assets/tvl-bars-inXG_MRY.js +1 -0
  219. package/runtime/assets/tvl-bubbles-C5-rCI8e.js +1 -0
  220. package/runtime/assets/tvl-treemap-KR6k_75O.js +1 -0
  221. package/runtime/assets/{video-CkvIGlHg.js → video-DcFqrZ43.js} +1 -1
  222. package/runtime/assets/volume-movers-scatter-C4nPVYp-.js +1 -0
  223. package/runtime/assets/{volume-profile-UJPTgNwV.js → volume-profile-BYg0s84c.js} +1 -1
  224. package/runtime/assets/volume-share-donut-DCtz5g5J.js +1 -0
  225. package/runtime/assets/yield-composition-scatter-Djup_wzz.js +1 -0
  226. package/runtime/assets/{yield-curve-DlXQg4sl.js → yield-curve-BM9IJJt6.js} +1 -1
  227. package/runtime/assets/yield-momentum-bars-gE1357zR.js +1 -0
  228. package/runtime/assets/yield-risk-pie-qhN37WPr.js +1 -0
  229. package/runtime/assets/yield-scanner-CbcLN2kK.js +1 -0
  230. package/runtime/assets/yield-scatter-B6ic-t9n.js +1 -0
  231. package/runtime/index.html +2 -2
  232. package/runtime/widget-icons/custom-data.png +0 -0
  233. package/runtime/assets/btc-hashrate-Dy2c30Gb.js +0 -1
  234. package/runtime/assets/chart-utils-Ct7WziT9.js +0 -1
  235. package/runtime/assets/checklist-Be_y1aTE.js +0 -1
  236. package/runtime/assets/d3-Dr3MHXm3.js +0 -1
  237. package/runtime/assets/dex-hot-pools-C4TrRB17.js +0 -1
  238. package/runtime/assets/dex-volume-chart-BLR-L_B0.js +0 -1
  239. package/runtime/assets/dino-game-CiGWzsag.js +0 -1
  240. package/runtime/assets/divider-DvK5oM9v.js +0 -1
  241. package/runtime/assets/editor-CQM8mtD8.css +0 -1
  242. package/runtime/assets/editor-EOEtB4_n.js +0 -68
  243. package/runtime/assets/format-CfAcS4D8.js +0 -1
  244. package/runtime/assets/fundamentals-zRwGUcmb.js +0 -1
  245. package/runtime/assets/funding-comparison-wCNoCb1H.js +0 -1
  246. package/runtime/assets/funding-heatmap-a4zdnKi9.js +0 -1
  247. package/runtime/assets/heading-b5H33lig.js +0 -1
  248. package/runtime/assets/image-C8ZSUHEx.js +0 -1
  249. package/runtime/assets/index-C-VdMqKb.css +0 -1
  250. package/runtime/assets/index-kB-TyxKi.js +0 -1073
  251. package/runtime/assets/indicators-CogwjDn9.js +0 -1
  252. package/runtime/assets/inflation-pulse-CoXcuabd.js +0 -1
  253. package/runtime/assets/labor-market-DR0j05Gy.js +0 -1
  254. package/runtime/assets/market-hours-wSrW5Elv.js +0 -1
  255. package/runtime/assets/mayer-multiple-CZC5q6ra.js +0 -1
  256. package/runtime/assets/mover-row-CUd1i2yt.js +0 -1
  257. package/runtime/assets/news-feed-BhAsJ6gt.js +0 -1
  258. package/runtime/assets/note-C1-RPOvR.js +0 -1
  259. package/runtime/assets/portfolio-allocation-NR-4wbGL.js +0 -1
  260. package/runtime/assets/portfolio-common-Cfpnudvk.js +0 -1
  261. package/runtime/assets/price-ticker-DgDJ3k4b.js +0 -1
  262. package/runtime/assets/realized-price-dn6bApj-.js +0 -1
  263. package/runtime/assets/stopwatch-CCqsSaII.js +0 -1
  264. package/runtime/assets/tvl-treemap-CSM9ioUr.js +0 -1
  265. package/runtime/assets/yield-scanner-Qm88hZuv.js +0 -1
package/dist/index.js CHANGED
@@ -55,9 +55,35 @@ var GridPositionSchema = z2.object({
55
55
  w: z2.number().int().min(1).describe("Width in grid columns"),
56
56
  h: z2.number().int().min(1).describe("Height in grid rows")
57
57
  });
58
+ var FrameStyleSchema = z2.object({
59
+ accentHue: z2.number().int().min(0).max(360).optional().describe(
60
+ "Override this card's accent hue (0\u2013360) \u2014 its rim, title dot, and highlights. Inherits theme.accentHue if unset."
61
+ ),
62
+ accentSat: z2.number().min(0).max(100).optional().describe("Override this card's accent saturation (0\u2013100)."),
63
+ baseHue: z2.number().int().min(0).max(360).optional().describe(
64
+ "Override this card's dark surface tint hue (0\u2013360) \u2014 warm or cool just this one card. Inherits theme.baseHue if unset."
65
+ ),
66
+ baseSat: z2.number().min(0).max(100).optional().describe("Override this card's surface tint saturation (0\u2013100)."),
67
+ surfaceOpacity: z2.number().min(0.3).max(1).optional().describe(
68
+ "Override this card's surface opacity (0.3\u20131) \u2014 drop it toward 0.5 for a single frosted/glassy card over the background."
69
+ ),
70
+ radius: z2.number().min(0).optional().describe("Override this card's corner radius in px (0 = square)."),
71
+ borderStrength: z2.number().min(0).max(1).optional().describe(
72
+ "Override this card's rim opacity (0\u20131); 0 = borderless flat card."
73
+ ),
74
+ density: z2.number().min(0.6).max(1.4).optional().describe("Override this card's padding scale (0.6\u20131.4)."),
75
+ elevation: z2.number().min(0).max(2).optional().describe(
76
+ "Override this card's shadow depth (0\u20132); raise it to float a hero card, 0 to flatten one."
77
+ )
78
+ }).describe(
79
+ "Per-frame cosmetic overrides \u2014 accent, surface tint, glass, corners, border, padding, shadow \u2014 for THIS card only. Every field optional; omit to inherit the dashboard `theme`/`appearance`."
80
+ );
58
81
  var FrameInstanceSchema = z2.object({
59
82
  id: z2.string().describe("Unique instance id within the dashboard"),
60
83
  frame: z2.string().describe("Name of a registered frame"),
84
+ style: FrameStyleSchema.optional().describe(
85
+ "Optional per-frame cosmetic overrides (accent, glass, corners, \u2026) for this card only. Omit to inherit the dashboard theme/appearance."
86
+ ),
61
87
  title: z2.string().optional().describe(
62
88
  'Optional custom card title. Omit it to use the frame\'s own polished default label (its catalogue `label`, e.g. "OI by Strike") \u2014 that is the norm. Only set this for a genuinely instance-specific label the default can\'t know, e.g. the ticker on a price-chart ("TSLA") or which outlet a news-feed shows. Never abbreviate. Ignored by chrome-less frames like heading.'
63
89
  ),
@@ -70,8 +96,8 @@ var FrameInstanceSchema = z2.object({
70
96
  )
71
97
  });
72
98
  var BackgroundSchema = z2.object({
73
- type: z2.enum(["none", "color", "gradient", "unicorn"]).default("none").describe(
74
- "Background style: 'none' (the signature dark indigo glow \u2014 the default), 'color' (a solid colour), 'gradient' (a custom two-colour linear gradient), or 'unicorn' (an animated Unicorn Studio scene)."
99
+ type: z2.enum(["none", "color", "gradient", "unicorn", "image"]).default("none").describe(
100
+ "Background style: 'none' (the signature dark indigo glow \u2014 the default), 'color' (a solid colour), 'gradient' (a custom two-colour linear gradient), 'unicorn' (an animated Unicorn Studio scene), or 'image' (a full-bleed photo/illustration behind the dashboard, with a legibility scrim)."
75
101
  ),
76
102
  color: z2.string().default("#0a0a12").describe(
77
103
  "Solid background colour (any CSS colour). Used when type is 'color'."
@@ -88,6 +114,18 @@ var BackgroundSchema = z2.object({
88
114
  dpi: z2.number().min(0.5).max(3).default(1.5).describe("Unicorn scene device-pixel-ratio cap (perf vs sharpness)."),
89
115
  opacity: z2.number().min(0).max(1).default(0.16).describe(
90
116
  "Opacity of the unicorn scene (0\u20131). Keep moderate (~0.15) so the animation reads as a living backdrop in the gutters without competing with the (opaque) dashboard cards."
117
+ ),
118
+ imageUrl: z2.string().optional().describe(
119
+ "Background image URL \u2014 required when type is 'image'. An https URL, or a local path served next to the dashboard (e.g. '/hero.png'). Rendered full-bleed behind everything."
120
+ ),
121
+ imageFit: z2.enum(["cover", "contain"]).default("cover").describe(
122
+ "How the background image fills the viewport when type is 'image': 'cover' crops to fill (default), 'contain' letterboxes to show the whole image."
123
+ ),
124
+ imageBlur: z2.number().min(0).max(40).default(0).describe(
125
+ "Gaussian blur applied to the background image in px (0\u201340). Blur a busy photo so the dashboard cards stay readable over it. Used when type is 'image'."
126
+ ),
127
+ overlayOpacity: z2.number().min(0).max(1).default(0.55).describe(
128
+ "Opacity of the dark scrim laid over the background image (0\u20131). Raise it to darken a bright image so card text stays legible; lower it to let the image show through. Used when type is 'image'."
91
129
  )
92
130
  }).describe("Visual background rendered behind the whole dashboard.");
93
131
  var ThemeSchema = z2.object({
@@ -108,9 +146,12 @@ var ThemeSchema = z2.object({
108
146
  ),
109
147
  downColor: z2.string().regex(/^#[0-9a-fA-F]{6}$/, "must be a 6-digit hex colour like #ff6b81").default("#ff6b81").describe(
110
148
  "Semantic colour for losses / negative change / bearish (down). 6-digit hex; default #ff6b81 (red). The counterpart to upColor \u2014 tints every loss delta, mover row, down-candle, and 'short'/'put' marker."
149
+ ),
150
+ surface: z2.enum(["dark", "light"]).default("dark").describe(
151
+ "Overall surface mode. 'dark' (default) is the signature dark dashboard \u2014 light text on dark cards. 'light' flips to a daylight scheme \u2014 dark text on near-white cards \u2014 for a printed/paper or bright-office look. The accent (baseHue tints the surface either way), the semantic up/down colours, and typography are unchanged; only the ink + card lightness invert."
111
152
  )
112
153
  }).describe(
113
- "Dashboard-wide colour identity \u2014 accent (rims/highlights), the dark card-surface tint (base), and the semantic up/down (gain/loss) colours."
154
+ "Dashboard-wide colour identity \u2014 accent (rims/highlights), the card-surface tint (base), the light/dark surface mode, and the semantic up/down (gain/loss) colours."
114
155
  );
115
156
  var TypographySchema = z2.object({
116
157
  fontFamily: z2.enum(["sans", "mono", "serif"]).default("sans").describe(
@@ -212,7 +253,10 @@ var DashboardSpecSchema = z2.preprocess(
212
253
  gradientAngle: 160,
213
254
  scale: 1,
214
255
  dpi: 1.5,
215
- opacity: 0.16
256
+ opacity: 0.16,
257
+ imageFit: "cover",
258
+ imageBlur: 0,
259
+ overlayOpacity: 0.55
216
260
  }),
217
261
  theme: ThemeSchema.default({
218
262
  accentHue: 242,
@@ -220,7 +264,8 @@ var DashboardSpecSchema = z2.preprocess(
220
264
  baseHue: 233,
221
265
  baseSat: 20,
222
266
  upColor: "#3fd08f",
223
- downColor: "#ff6b81"
267
+ downColor: "#ff6b81",
268
+ surface: "dark"
224
269
  }),
225
270
  typography: TypographySchema.default({
226
271
  fontFamily: "sans",
@@ -403,6 +448,41 @@ function defineFrameMeta(meta) {
403
448
 
404
449
  // ../frames/src/schemas.ts
405
450
  import { z as z3 } from "zod";
451
+
452
+ // ../frames/src/custom-data-shared.ts
453
+ function isBlockedHost(hostname) {
454
+ const host = hostname.toLowerCase().replace(/^\[|\]$/g, "");
455
+ if (host === "localhost" || host === "0.0.0.0" || host.endsWith(".localhost") || host.endsWith(".local") || host.endsWith(".internal") || host === "::1" || host === "::")
456
+ return true;
457
+ const v4 = host.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
458
+ if (v4) {
459
+ const [a, b] = [Number(v4[1]), Number(v4[2])];
460
+ if (a === 127 || a === 10 || a === 0) return true;
461
+ if (a === 192 && b === 168) return true;
462
+ if (a === 172 && b >= 16 && b <= 31) return true;
463
+ if (a === 169 && b === 254) return true;
464
+ if (a === 100 && b >= 64 && b <= 127) return true;
465
+ }
466
+ if (/^f[cd][0-9a-f]{2}:/i.test(host) || /^fe[89ab][0-9a-f]:/i.test(host))
467
+ return true;
468
+ return false;
469
+ }
470
+ function validateCustomUrl(url) {
471
+ let parsed;
472
+ try {
473
+ parsed = new URL(url);
474
+ } catch {
475
+ return "not a valid URL";
476
+ }
477
+ if (parsed.protocol !== "https:") return "only https:// URLs are allowed";
478
+ if (parsed.username || parsed.password)
479
+ return "URLs with embedded credentials are not allowed";
480
+ if (isBlockedHost(parsed.hostname))
481
+ return "private/localhost hosts are not allowed";
482
+ return null;
483
+ }
484
+
485
+ // ../frames/src/schemas.ts
406
486
  var widgetIcon = (name) => `/widget-icons/${name}.png`;
407
487
  var SOURCES = {
408
488
  hyperliquid: { name: "Hyperliquid", url: "https://hyperliquid.xyz" },
@@ -520,10 +600,13 @@ var noteMeta = defineFrameMeta({
520
600
  category: "layout",
521
601
  iconUrl: widgetIcon("note"),
522
602
  layout: { w: 4, h: 3, minW: 2, minH: 2 },
523
- description: "Free-form text note pinned to the dashboard \u2014 trading plans, reminders, watch levels. Needs no data provider.",
603
+ description: "Free-form text note pinned to the dashboard \u2014 trading plans, reminders, watch levels. Renders a safe Markdown subset: **bold**, *italic*, `inline code`, [links](https://\u2026), #/##/### headings, and - / 1. lists. Plain text still renders as written. Needs no data provider.",
524
604
  capabilities: [],
605
+ chrome: "plain",
525
606
  schema: z3.object({
526
- text: z3.string().min(1).describe("The note's text content. Plain text; newlines are preserved."),
607
+ text: z3.string().min(1).describe(
608
+ "The note's text content. Renders a safe Markdown subset \u2014 **bold**, *italic*, `code`, [text](https://url), #/##/### headings, and unordered (-) / ordered (1.) lists (raw HTML is never executed). Blank lines start new paragraphs; single newlines become line breaks. Plain text works too."
609
+ ),
527
610
  align: z3.enum(["left", "center"]).default("left").describe("Text alignment inside the card.")
528
611
  })
529
612
  });
@@ -847,6 +930,7 @@ var imageMeta = defineFrameMeta({
847
930
  layout: { w: 3, h: 3, minW: 1, minH: 1 },
848
931
  description: "Displays an image from a URL \u2014 logos, memes, chart screenshots, banners. Needs no data provider.",
849
932
  capabilities: [],
933
+ chrome: "plain",
850
934
  schema: z3.object({
851
935
  url: z3.string().min(1).describe("Image URL (https)."),
852
936
  alt: z3.string().default("").describe("Alt text for accessibility."),
@@ -855,6 +939,57 @@ var imageMeta = defineFrameMeta({
855
939
  )
856
940
  })
857
941
  });
942
+ var heroNumberMeta = defineFrameMeta({
943
+ name: "hero-number",
944
+ label: "Hero Number",
945
+ category: "layout",
946
+ iconUrl: widgetIcon("hero-number"),
947
+ layout: { w: 3, h: 2, minW: 2, minH: 1 },
948
+ description: "A big manual KPI card you fill in yourself \u2014 one headline number, a caption, and an optional signed change. Static text, not a live feed: use it to pin a figure that has no provider (a target, a personal goal, a fact from elsewhere), e.g. '$39.6T' national debt or '127 EH/s' hashrate. Needs no data provider.",
949
+ capabilities: [],
950
+ chrome: "plain",
951
+ schema: z3.object({
952
+ value: z3.string().min(1).describe(
953
+ 'The headline figure, shown large. Free text so you can include units/symbols, e.g. "$39.6T", "127 EH/s", "4.25%".'
954
+ ),
955
+ label: z3.string().default("").describe(
956
+ 'Caption naming what the number is, e.g. "US National Debt". Empty hides it.'
957
+ ),
958
+ delta: z3.string().default("").describe(
959
+ 'Optional change chip shown under the number, e.g. "+1.5%" or "-3 blocks". Empty hides it.'
960
+ ),
961
+ deltaDir: z3.enum(["up", "down", "neutral"]).default("neutral").describe(
962
+ "Tint for the delta chip: up = gain color, down = loss color, neutral = muted. Purely cosmetic \u2014 it does not parse the delta text."
963
+ ),
964
+ sublabel: z3.string().default("").describe(
965
+ 'Optional small line under the delta for context, e.g. "as of Jul 2026". Empty hides it.'
966
+ )
967
+ })
968
+ });
969
+ var imageGalleryMeta = defineFrameMeta({
970
+ name: "image-gallery",
971
+ label: "Image Gallery",
972
+ category: "layout",
973
+ iconUrl: widgetIcon("image-gallery"),
974
+ layout: { w: 4, h: 3, minW: 2, minH: 2 },
975
+ description: "A rotating gallery that cross-fades through a list of images on a timer \u2014 chart screenshots, memes, banners, a mood board. Needs no data provider.",
976
+ capabilities: [],
977
+ chrome: "plain",
978
+ schema: z3.object({
979
+ images: z3.array(
980
+ z3.object({
981
+ url: z3.string().min(1).describe("Image URL (https)."),
982
+ alt: z3.string().default("").describe("Alt text for accessibility.")
983
+ })
984
+ ).min(1).describe("The images to rotate through, in order. At least one."),
985
+ intervalSec: z3.number().int().min(0).default(6).describe(
986
+ "Seconds between cross-fades when there is more than one image. 0 shows the first image, fixed."
987
+ ),
988
+ fit: z3.enum(["cover", "contain"]).default("cover").describe(
989
+ "How each image fills the frame: cover crops to fill, contain letterboxes."
990
+ )
991
+ })
992
+ });
858
993
  var headingMeta = defineFrameMeta({
859
994
  name: "heading",
860
995
  label: "Heading",
@@ -866,7 +1001,13 @@ var headingMeta = defineFrameMeta({
866
1001
  chrome: "bare",
867
1002
  schema: z3.object({
868
1003
  title: z3.string().min(1).describe("The heading text."),
869
- subtitle: z3.string().optional().describe("Smaller supporting line under the title.")
1004
+ subtitle: z3.string().optional().describe("Smaller supporting line under the title."),
1005
+ accent: z3.number().min(0).max(360).optional().describe(
1006
+ "Optional hue (0\u2013360) that tints the marker dot, the rule, and the title. Omit to use the dashboard's own accent (the default look)."
1007
+ ),
1008
+ align: z3.enum(["left", "center"]).default("left").describe(
1009
+ "Left aligns the label with a trailing rule (default); center places the label between rules on both sides."
1010
+ )
870
1011
  })
871
1012
  });
872
1013
  var dailyAnalysisMeta = defineFrameMeta({
@@ -1154,6 +1295,7 @@ var videoMeta = defineFrameMeta({
1154
1295
  layout: { w: 4, h: 3, minW: 2, minH: 2 },
1155
1296
  description: "Embeds a video from a YouTube or Vimeo link (or any direct embed URL) as an iframe \u2014 a livestream, a market-news clip, a focus playlist. Needs no data provider.",
1156
1297
  capabilities: [],
1298
+ chrome: "plain",
1157
1299
  schema: z3.object({
1158
1300
  url: z3.string().min(1).describe(
1159
1301
  "Video URL \u2014 a YouTube watch/share link, a Vimeo link, or a direct embeddable URL (https)."
@@ -1197,6 +1339,7 @@ var linkGridMeta = defineFrameMeta({
1197
1339
  layout: { w: 3, h: 2, minW: 2, minH: 1 },
1198
1340
  description: "A grid of quick-launch tiles linking to your favourite sites \u2014 TradingView, exchanges, news, docs, your own dashboards. Each tile opens in a new tab and shows the destination site's favicon by default (fetched keyless from a public favicon service), with an optional per-link icon override and a first-letter fallback. Needs no data provider.",
1199
1341
  capabilities: [],
1342
+ chrome: "plain",
1200
1343
  schema: z3.object({
1201
1344
  links: z3.array(
1202
1345
  z3.object({
@@ -1247,6 +1390,7 @@ var quoteMeta = defineFrameMeta({
1247
1390
  layout: { w: 4, h: 2, minW: 2, minH: 1 },
1248
1391
  description: 'Displays a market or trading quote, centered \u2014 set one or rotate through several. A calm bit of wall-art for the dashboard: trading maxims, reminders of your own rules, mantras. Write any attribution into the text itself (e.g. "\u2026 \u2014 Buffett"). Needs no data provider.',
1249
1392
  capabilities: [],
1393
+ chrome: "plain",
1250
1394
  schema: z3.object({
1251
1395
  quotes: z3.array(z3.string().min(1)).min(1).default([
1252
1396
  "Be fearful when others are greedy, and greedy when others are fearful. \u2014 Warren Buffett",
@@ -1276,7 +1420,11 @@ var dividerMeta = defineFrameMeta({
1276
1420
  orientation: z3.enum(["horizontal", "vertical"]).default("horizontal").describe(
1277
1421
  "Horizontal rule (spans the width) or vertical rule (spans the height)."
1278
1422
  ),
1279
- style: z3.enum(["solid", "dashed", "dotted"]).default("solid").describe("Line style.")
1423
+ style: z3.enum(["solid", "dashed", "dotted"]).default("solid").describe("Line style."),
1424
+ accent: z3.number().min(0).max(360).optional().describe(
1425
+ "Optional hue (0\u2013360) that tints the rule and its label. Omit for the default subtle hairline."
1426
+ ),
1427
+ thickness: z3.number().int().min(1).max(8).default(1).describe("Rule thickness in pixels. 1 is the default hairline.")
1280
1428
  })
1281
1429
  });
1282
1430
  var diceMeta = defineFrameMeta({
@@ -2117,210 +2265,1603 @@ var dexPoolTreemapMeta = defineFrameMeta({
2117
2265
  count: z3.number().int().min(5).max(15).default(12).describe("How many trending pools to include (up to 15).")
2118
2266
  })
2119
2267
  });
2120
- var frameMetas = [
2121
- newsFeedMeta,
2122
- portfolioValueMeta,
2123
- portfolioAllocationMeta,
2124
- portfolioHoldingsMeta,
2125
- bitcoinDominanceMeta,
2126
- clockMeta,
2127
- dailyAnalysisMeta,
2128
- dinoGameMeta,
2129
- fearGreedMeta,
2130
- filingsFeedMeta,
2131
- fundamentalsMeta,
2132
- financialStressMeta,
2133
- laborMarketMeta,
2134
- nationalDebtMeta,
2135
- treasuryAuctionsMeta,
2136
- fundingHeatmapMeta,
2137
- fundingRateChartMeta,
2138
- headingMeta,
2139
- imageMeta,
2140
- inflationPulseMeta,
2141
- marketHoursMeta,
2142
- noteMeta,
2143
- priceChartMeta,
2144
- priceCompareMeta,
2145
- priceLivelineMeta,
2146
- priceTickerMeta,
2147
- ratesBoardMeta,
2148
- fxBoardMeta,
2149
- shortVolumeMeta,
2150
- topMoversMeta,
2151
- tvlTreemapMeta,
2152
- yieldCurveMeta,
2153
- dexVolumeTreemapMeta,
2154
- dexVolumeChartMeta,
2155
- protocolTvlTreemapMeta,
2156
- protocolTvlChartMeta,
2157
- protocolFeesTreemapMeta,
2158
- marketCapTreemapMeta,
2159
- openInterestMeta,
2160
- snakeMeta,
2161
- flappyBirdMeta,
2162
- videoMeta,
2163
- drawdyMeta,
2164
- countdownMeta,
2165
- linkGridMeta,
2166
- calculatorMeta,
2167
- quoteMeta,
2168
- dividerMeta,
2169
- btcFeesMeta,
2170
- btcMempoolMeta,
2171
- btcBlocksMeta,
2172
- btcHashrateMeta,
2173
- btcDifficultyMeta,
2174
- miningPoolsMeta,
2175
- lightningStatsMeta,
2176
- optionsPutCallMeta,
2177
- optionsIvMeta,
2178
- optionsOiStrikeMeta,
2179
- coinMoversMeta,
2180
- mvrvMeta,
2181
- nuplMeta,
2182
- soprMeta,
2183
- puellMultipleMeta,
2184
- mayerMultipleMeta,
2185
- piCycleMeta,
2186
- maMultiplierMeta,
2187
- rsiMomentumMeta,
2188
- volumeProfileMeta,
2189
- dxyMeta,
2190
- cycleSignalsMeta,
2191
- stablecoinSupplyMeta,
2192
- yieldScannerMeta,
2193
- defiRevenueMeta,
2194
- fundingComparisonMeta,
2195
- ethSupplyMeta,
2196
- ethStakingMeta,
2197
- predictionMarketsMeta,
2198
- etfFlowsMeta,
2199
- trendingCoinsMeta,
2200
- sectorPerformanceMeta,
2201
- macroCalendarMeta,
2202
- stablecoinChainsMeta,
2203
- sectorTreemapMeta,
2204
- etfFlowsChartMeta,
2205
- realizedPriceMeta,
2206
- reserveRiskMeta,
2207
- nftCollectionsMeta,
2208
- dexHotPoolsMeta,
2209
- chainActivityMeta,
2210
- nftTreemapMeta,
2211
- dexPoolTreemapMeta
2212
- ];
2213
- var allFrameMetas = [
2214
- ...frameMetas,
2215
- breakevenMeta,
2216
- breathingMeta,
2217
- checklistMeta,
2218
- dayMeterMeta,
2219
- diceMeta,
2220
- holidayCalendarMeta,
2221
- journalLogMeta,
2222
- journalOpenMeta,
2223
- journalResultsMeta,
2224
- journalScoreMeta,
2225
- marqueeMeta,
2226
- pomodoroMeta,
2227
- returnsProjectorMeta,
2228
- riskRewardMeta,
2229
- rulesCardMeta,
2230
- sessionProgressMeta,
2231
- spotifyEmbedMeta,
2232
- stopwatchMeta
2233
- ];
2234
-
2235
- // src/dashboards.ts
2236
- import { existsSync } from "fs";
2237
- function list() {
2238
- const entries = listDashboards();
2239
- if (entries.length === 0) {
2240
- console.log(`no dashboards in your store yet (${dashboardsDir()})`);
2241
- console.log(" create one: npx --yes zframes@latest init <name>");
2242
- return 0;
2243
- }
2244
- console.log(`dashboards in ${dashboardsDir()}:`);
2245
- for (const e of entries) {
2246
- const mark = e.isDefault ? "*" : " ";
2247
- const title = e.title ? ` \u2014 ${e.title}` : "";
2248
- console.log(` ${mark} ${e.name}${title}`);
2249
- }
2250
- if (entries.some((e) => e.isDefault)) {
2251
- console.log(
2252
- "\n * = default (served when you run `zframes serve` with no name)"
2253
- );
2254
- } else {
2255
- console.log("\n no default set \u2014 `zframes use <name>` to pick one.");
2256
- }
2257
- return 0;
2258
- }
2259
- function use(args) {
2260
- const name = args.find((a) => !a.startsWith("-"));
2261
- if (!name) {
2262
- console.error("usage: zframes use <name>");
2263
- return 1;
2264
- }
2265
- if (!isValidName(name)) {
2266
- console.error(
2267
- `\u2717 "${name}" is not a valid dashboard name (lowercase letters, digits, "-", "_")`
2268
- );
2269
- return 1;
2270
- }
2271
- if (!existsSync(dashboardPath(name))) {
2272
- console.error(
2273
- `\u2717 no dashboard named "${name}" in your store (${dashboardsDir()})`
2274
- );
2275
- console.error(
2276
- ` create it with \`zframes init ${name}\`, or run \`zframes list\` to see what's there.`
2277
- );
2278
- return 1;
2279
- }
2280
- setDefault(name);
2281
- console.log(`\u2713 default dashboard is now "${name}"`);
2282
- return 0;
2283
- }
2284
-
2285
- // src/init.ts
2286
- import { existsSync as existsSync2, mkdirSync as mkdirSync2, statSync as statSync2, writeFileSync as writeFileSync2 } from "fs";
2287
- import { dirname, resolve as resolve2 } from "path";
2288
-
2289
- // ../spec/src/presets.ts
2290
- var SCENE_DEFAULT_PROJECT_ID = "YrTzGatwjK7EoFpCSfgZ";
2291
-
2292
- // src/init.ts
2293
- function parseArgs(args) {
2294
- let target = "dashboard.json";
2295
- let title = "my dashboard";
2296
- let author = "";
2297
- let force = false;
2298
- let makeDefault = false;
2299
- for (let i = 0; i < args.length; i++) {
2300
- const a = args[i];
2301
- if (a === "--title" || a === "-t") {
2302
- title = args[++i] ?? "";
2303
- } else if (a.startsWith("--title=")) {
2304
- title = a.slice("--title=".length);
2305
- } else if (a === "--author" || a === "-a") {
2306
- author = args[++i] ?? "";
2307
- } else if (a.startsWith("--author=")) {
2308
- author = a.slice("--author=".length);
2309
- } else if (a === "--force" || a === "-f") {
2310
- force = true;
2311
- } else if (a === "--default") {
2312
- makeDefault = true;
2313
- } else if (!a.startsWith("-")) {
2314
- target = a;
2315
- } else {
2316
- return { error: `unknown option "${a}"` };
2317
- }
2318
- }
2319
- if (!title.trim()) return { error: "--title cannot be empty" };
2320
- return { target, title, author, force, makeDefault };
2321
- }
2322
- function resolveDest(target) {
2323
- const c = classifyTarget(target, process.cwd());
2268
+ var sectorBarsMeta = defineFrameMeta({
2269
+ name: "sector-bars",
2270
+ label: "Sector Bars",
2271
+ category: "crypto",
2272
+ iconUrl: widgetIcon("sector-bars"),
2273
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2274
+ description: "Crypto sector rotation as a diverging bar chart \u2014 market categories (L1s, DeFi, AI, memes, RWA, \u2026) ranked by 24h market-cap change, gains right in green, losses left in red. The chart-first sibling of the Sector Performance list. Keyless (CoinGecko categories).",
2275
+ capabilities: ["sector-performance"],
2276
+ source: SOURCES.coingecko,
2277
+ schema: z3.object({
2278
+ limit: z3.number().int().min(4).max(20).default(10).describe("How many sectors (by absolute 24h change) to chart.")
2279
+ })
2280
+ });
2281
+ var fundingBarsMeta = defineFrameMeta({
2282
+ name: "funding-bars",
2283
+ label: "Funding by Venue",
2284
+ category: "derivatives",
2285
+ iconUrl: widgetIcon("funding-bars"),
2286
+ layout: { w: 4, h: 3, minW: 3, minH: 2 },
2287
+ description: "One coin's predicted perpetual funding rate compared across venues (Hyperliquid vs Binance vs Bybit) as a diverging bar chart of annualized rates \u2014 positive funding (longs pay) in green, negative in red. Makes a funding-arb spread visible at a glance. Keyless (Hyperliquid predicted fundings).",
2288
+ capabilities: ["funding-comparison"],
2289
+ source: SOURCES.hyperliquid,
2290
+ schema: z3.object({
2291
+ coin: z3.string().min(1).default("BTC").describe('Coin to compare across venues, e.g. "BTC", "ETH", "SOL".')
2292
+ })
2293
+ });
2294
+ var etfFlowBarsMeta = defineFrameMeta({
2295
+ name: "etf-flow-bars",
2296
+ label: "ETF Flow Bars",
2297
+ category: "crypto",
2298
+ iconUrl: widgetIcon("etf-flow-bars"),
2299
+ layout: { w: 6, h: 3, minW: 3, minH: 3 },
2300
+ description: "Spot BTC or ETH ETF daily net flows as diverging bars \u2014 one bar per day, inflows up in green, outflows down in red. The classic ETF-flow chart; complements the cumulative line and per-issuer snapshot. Keyless (SoSoValue); best-effort, may be empty if the source is unavailable.",
2301
+ capabilities: ["etf-flows"],
2302
+ source: SOURCES.sosovalue,
2303
+ schema: z3.object({
2304
+ asset: z3.enum(["btc", "eth"]).default("btc").describe("Which spot-ETF complex to chart."),
2305
+ lookback: z3.enum(["1M", "3M", "6M"]).default("1M").describe("History window for the daily-flow bars.")
2306
+ })
2307
+ });
2308
+ var chainActivityBarsMeta = defineFrameMeta({
2309
+ name: "chain-activity-bars",
2310
+ label: "Chain Activity Bars",
2311
+ category: "onchain",
2312
+ iconUrl: widgetIcon("chain-activity-bars"),
2313
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2314
+ description: "24h confirmed transactions per major L1 (Bitcoin, Ethereum, Litecoin, Dogecoin, \u2026) as a horizontal bar chart, ranked busiest-first \u2014 cross-chain usage compared at a glance. The chart-first sibling of the Chain Activity table. Keyless (Blockchair).",
2315
+ capabilities: ["chain-activity"],
2316
+ source: SOURCES.blockchair,
2317
+ schema: z3.object({
2318
+ limit: z3.number().int().min(3).max(12).default(8).describe("How many chains (by 24h transactions) to chart.")
2319
+ })
2320
+ });
2321
+ var marketScatterMeta = defineFrameMeta({
2322
+ name: "market-scatter",
2323
+ label: "Market Scatter",
2324
+ category: "crypto",
2325
+ iconUrl: widgetIcon("market-scatter"),
2326
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
2327
+ description: "Top coins as a bubble scatter \u2014 24h price change on the x-axis, market cap on a log y-axis, bubble size by market cap. Shows in one view whether large caps or small caps are moving, and who's the outlier. Keyless (CoinGecko top-50 by market cap).",
2328
+ capabilities: ["coin-markets"],
2329
+ source: SOURCES.coingecko,
2330
+ schema: z3.object({
2331
+ limit: z3.number().int().min(10).max(50).default(30).describe("How many top coins (by market cap) to plot.")
2332
+ })
2333
+ });
2334
+ var marketBubblesMeta = defineFrameMeta({
2335
+ name: "market-bubbles",
2336
+ label: "Market Bubbles",
2337
+ category: "crypto",
2338
+ iconUrl: widgetIcon("market-bubbles"),
2339
+ layout: { w: 6, h: 5, minW: 4, minH: 3 },
2340
+ description: "Top coins as a floating bubble cloud \u2014 one logo bubble per coin, area by market cap, ring tinted green/red by 24h change. A playful at-a-glance map of where the market's weight sits; bubbles are draggable. Keyless (CoinGecko top-50 by market cap).",
2341
+ capabilities: ["coin-markets"],
2342
+ source: SOURCES.coingecko,
2343
+ schema: z3.object({
2344
+ limit: z3.number().int().min(5).max(50).default(25).describe("How many top coins (by market cap) to show."),
2345
+ sizeBy: z3.enum(["market-cap", "change"]).default("market-cap").describe(
2346
+ "Bubble sizing \u2014 'market-cap' weights by market cap, 'change' weights by absolute 24h % move (today's action, not size)."
2347
+ )
2348
+ })
2349
+ });
2350
+ var bubbleTopN = (max, def, what) => z3.number().int().min(3).max(max).default(def).describe(`How many of the largest ${what} to show.`);
2351
+ var tvlBubblesMeta = defineFrameMeta({
2352
+ name: "tvl-bubbles",
2353
+ label: "TVL Bubbles",
2354
+ category: "crypto",
2355
+ iconUrl: widgetIcon("tvl-bubbles"),
2356
+ layout: { w: 6, h: 4, minW: 3, minH: 3 },
2357
+ description: "Blockchain ecosystems as a floating bubble cloud, area by total value locked (TVL) \u2014 the bubble-chart sibling of the TVL treemap. Data from DeFiLlama. Draggable, playful answer to 'where does on-chain capital live'.",
2358
+ capabilities: ["tvl"],
2359
+ source: SOURCES.defillama,
2360
+ schema: z3.object({
2361
+ topN: bubbleTopN(30, 14, "chains")
2362
+ })
2363
+ });
2364
+ var protocolTvlBubblesMeta = defineFrameMeta({
2365
+ name: "protocol-tvl-bubbles",
2366
+ label: "Protocol TVL Bubbles",
2367
+ category: "crypto",
2368
+ iconUrl: widgetIcon("protocol-tvl-bubbles"),
2369
+ layout: { w: 6, h: 4, minW: 3, minH: 3 },
2370
+ description: "DeFi protocols as a bubble cloud \u2014 area by total value locked (TVL), ring tinted green/red by 1-day change. Data from DeFiLlama. Unlike tvl-bubbles (chains), this ranks individual protocols (Lido, Aave, EigenLayer\u2026).",
2371
+ capabilities: ["protocol-tvl"],
2372
+ source: SOURCES.defillama,
2373
+ schema: z3.object({
2374
+ topN: bubbleTopN(30, 14, "protocols by TVL")
2375
+ })
2376
+ });
2377
+ var dexVolumeBubblesMeta = defineFrameMeta({
2378
+ name: "dex-volume-bubbles",
2379
+ label: "DEX Volume Bubbles",
2380
+ category: "crypto",
2381
+ iconUrl: widgetIcon("dex-volume-bubbles"),
2382
+ layout: { w: 6, h: 4, minW: 3, minH: 3 },
2383
+ description: "Decentralized exchanges as a bubble cloud \u2014 area by trailing-24h trading volume, ring tinted green/red by 1-day change. Data from DeFiLlama. Where on-chain trading flow is concentrated right now.",
2384
+ capabilities: ["dex-volume"],
2385
+ source: SOURCES.defillama,
2386
+ schema: z3.object({
2387
+ topN: bubbleTopN(30, 14, "DEX protocols by 24h volume")
2388
+ })
2389
+ });
2390
+ var protocolFeesBubblesMeta = defineFrameMeta({
2391
+ name: "protocol-fees-bubbles",
2392
+ label: "Protocol Fees Bubbles",
2393
+ category: "crypto",
2394
+ iconUrl: widgetIcon("protocol-fees-bubbles"),
2395
+ layout: { w: 6, h: 4, minW: 3, minH: 3 },
2396
+ description: "Protocols as a bubble cloud \u2014 area by fees generated in the last 24h, ring tinted green/red by 1-day change. Data from DeFiLlama. Where users are actually paying for blockspace and services.",
2397
+ capabilities: ["protocol-fees"],
2398
+ source: SOURCES.defillama,
2399
+ schema: z3.object({
2400
+ topN: bubbleTopN(30, 14, "fee-earning protocols")
2401
+ })
2402
+ });
2403
+ var sectorBubblesMeta = defineFrameMeta({
2404
+ name: "sector-bubbles",
2405
+ label: "Sector Bubbles",
2406
+ category: "crypto",
2407
+ iconUrl: widgetIcon("sector-bubbles"),
2408
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
2409
+ description: "Crypto sector rotation as a bubble cloud \u2014 each category's area by market cap, ring tinted green/red by 24h change. The bubble-chart sibling of the sector treemap. Keyless (CoinGecko categories).",
2410
+ capabilities: ["sector-performance"],
2411
+ source: SOURCES.coingecko,
2412
+ schema: z3.object({
2413
+ limit: z3.number().int().min(6).max(30).default(16).describe("How many sectors to show.")
2414
+ })
2415
+ });
2416
+ var nftBubblesMeta = defineFrameMeta({
2417
+ name: "nft-bubbles",
2418
+ label: "NFT Bubbles",
2419
+ category: "crypto",
2420
+ iconUrl: widgetIcon("nft-bubbles"),
2421
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2422
+ description: "Blue-chip NFT collections as a bubble cloud \u2014 area by market capitalisation, ring tinted green/red by 24h floor-price change. Keyless (CoinGecko free tier).",
2423
+ capabilities: ["nft-market"],
2424
+ source: SOURCES.coingecko,
2425
+ schema: z3.object({
2426
+ topN: z3.number().int().min(4).max(10).default(8).describe("How many collections to show (up to 10 curated majors).")
2427
+ })
2428
+ });
2429
+ var dexPoolBubblesMeta = defineFrameMeta({
2430
+ name: "dex-pool-bubbles",
2431
+ label: "DEX Pool Bubbles",
2432
+ category: "onchain",
2433
+ iconUrl: widgetIcon("dex-pool-bubbles"),
2434
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2435
+ description: "Trending DEX pools on a chain as a bubble cloud \u2014 area by 24h trading volume, ring tinted green/red by 24h price change. Which pairs are pulling the most on-chain volume. Keyless (GeckoTerminal free tier).",
2436
+ capabilities: ["dex-pools"],
2437
+ source: SOURCES.geckoterminal,
2438
+ schema: z3.object({
2439
+ network: z3.enum(["eth", "solana", "base", "arbitrum", "bsc", "polygon_pos"]).default("eth").describe("Which chain's trending pools to show."),
2440
+ count: z3.number().int().min(5).max(15).default(12).describe("How many trending pools to include (up to 15).")
2441
+ })
2442
+ });
2443
+ var moversBubblesMeta = defineFrameMeta({
2444
+ name: "movers-bubbles",
2445
+ label: "Movers Bubbles",
2446
+ category: "crypto",
2447
+ iconUrl: widgetIcon("movers-bubbles"),
2448
+ layout: { w: 6, h: 5, minW: 4, minH: 3 },
2449
+ description: "The broad market's biggest movers as a bubble cloud \u2014 logo bubbles sized by the magnitude of the move over a chosen window, green for gainers, red for losers. Today's action at a glance, regardless of coin size. Keyless (CoinPaprika, ~2000 coins).",
2450
+ capabilities: ["coin-movers"],
2451
+ source: SOURCES.coinpaprika,
2452
+ schema: z3.object({
2453
+ window: z3.enum(["1h", "24h", "7d", "30d"]).default("24h").describe("Price-change window the movers are ranked by."),
2454
+ limit: z3.number().int().min(6).max(30).default(18).describe("Total bubbles \u2014 split evenly into top gainers and losers.")
2455
+ })
2456
+ });
2457
+ var sentimentGaugeMeta = defineFrameMeta({
2458
+ name: "sentiment-gauge",
2459
+ label: "Sentiment Gauge",
2460
+ category: "crypto",
2461
+ iconUrl: widgetIcon("sentiment-gauge"),
2462
+ layout: { w: 3, h: 3, minW: 2, minH: 2 },
2463
+ description: "Crypto fear & greed index as a radial gauge \u2014 the arc fills from extreme fear (0) to extreme greed (100) in the mood color, with the reading and classification in the center. A dial-style alternative to the Fear & Greed sparkline card. Keyless (alternative.me).",
2464
+ capabilities: ["sentiment"],
2465
+ source: SOURCES.alternativeMe,
2466
+ schema: z3.object({})
2467
+ });
2468
+ var moversBarsMeta = defineFrameMeta({
2469
+ name: "movers-bars",
2470
+ label: "Movers Bars",
2471
+ category: "crypto",
2472
+ iconUrl: widgetIcon("movers-bars"),
2473
+ layout: { w: 4, h: 5, minW: 3, minH: 4 },
2474
+ description: "Top gainers and losers across the broad crypto market as a diverging bar chart \u2014 the biggest movers over a chosen window, gains right in green, losses left in red, ranked by size. The chart-first sibling of the Coin Movers list. Keyless (CoinPaprika, ~2000 coins).",
2475
+ capabilities: ["coin-movers"],
2476
+ source: SOURCES.coinpaprika,
2477
+ schema: z3.object({
2478
+ window: z3.enum(["1h", "24h", "7d", "30d"]).default("24h").describe("Price-change window the movers are ranked by."),
2479
+ limit: z3.number().int().min(6).max(20).default(12).describe("Total bars \u2014 split evenly into top gainers and top losers.")
2480
+ })
2481
+ });
2482
+ var tvlBarsMeta = defineFrameMeta({
2483
+ name: "tvl-bars",
2484
+ label: "TVL by Chain Bars",
2485
+ category: "crypto",
2486
+ iconUrl: widgetIcon("tvl-bars"),
2487
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2488
+ description: "Total value locked (TVL) per blockchain as a horizontal bar chart, ranked largest-first \u2014 DeFi capital compared across chains at a glance. The chart-first sibling of the TVL treemap. Keyless (DeFiLlama).",
2489
+ capabilities: ["tvl"],
2490
+ source: SOURCES.defillama,
2491
+ schema: z3.object({
2492
+ limit: z3.number().int().min(4).max(20).default(10).describe("How many chains (by TVL) to chart.")
2493
+ })
2494
+ });
2495
+ var yieldScatterMeta = defineFrameMeta({
2496
+ name: "yield-scatter",
2497
+ label: "Yield Scatter",
2498
+ category: "crypto",
2499
+ iconUrl: widgetIcon("yield-scatter"),
2500
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
2501
+ description: "DeFi yield pools as a risk/reward bubble scatter \u2014 total APY on the x-axis, pool TVL on a log y-axis, bubble size by TVL. Surfaces the deep, high-yield pools (top-right) versus thin outliers in one view. The chart-first sibling of the Yield Scanner list. Keyless (DeFiLlama).",
2502
+ capabilities: ["yields"],
2503
+ source: SOURCES.defillama,
2504
+ schema: z3.object({
2505
+ limit: z3.number().int().min(10).max(60).default(40).describe("How many pools (by TVL) to plot."),
2506
+ maxApy: z3.number().min(10).max(1e3).default(100).describe(
2507
+ "Hide pools whose APY exceeds this, so extreme incentive outliers don't crush the x-axis."
2508
+ ),
2509
+ stablecoinOnly: z3.boolean().default(false).describe("Restrict to stablecoin pools only.")
2510
+ })
2511
+ });
2512
+ var nftScatterMeta = defineFrameMeta({
2513
+ name: "nft-scatter",
2514
+ label: "NFT Scatter",
2515
+ category: "crypto",
2516
+ iconUrl: widgetIcon("nft-scatter"),
2517
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
2518
+ description: "Blue-chip NFT collections as a bubble scatter \u2014 24h floor change on the x-axis, 24h trading volume on a log y-axis, bubble size by market cap. Shows which collections are moving on real volume versus thin floors. The chart-first sibling of the NFT Collections list. Keyless (CoinGecko, curated slugs).",
2519
+ capabilities: ["nft-market"],
2520
+ source: SOURCES.coingecko,
2521
+ schema: z3.object({
2522
+ limit: z3.number().int().min(5).max(15).default(12).describe("How many collections (by market cap) to plot.")
2523
+ })
2524
+ });
2525
+ var dominanceGaugeMeta = defineFrameMeta({
2526
+ name: "dominance-gauge",
2527
+ label: "Dominance Gauge",
2528
+ category: "crypto",
2529
+ iconUrl: widgetIcon("dominance-gauge"),
2530
+ layout: { w: 3, h: 3, minW: 2, minH: 2 },
2531
+ description: "One asset's share of total crypto market cap as a radial gauge \u2014 the arc fills from 0% to 100% dominance with the reading in the center. A dial-style alternative to the segmented Bitcoin Dominance bar. Keyless (CoinGecko global).",
2532
+ capabilities: ["global-market"],
2533
+ source: SOURCES.coingecko,
2534
+ schema: z3.object({
2535
+ coin: z3.enum(["btc", "eth"]).default("btc").describe("Which asset's market-cap dominance to gauge.")
2536
+ })
2537
+ });
2538
+ var putCallGaugeMeta = defineFrameMeta({
2539
+ name: "put-call-gauge",
2540
+ label: "Put/Call Gauge",
2541
+ category: "derivatives",
2542
+ iconUrl: widgetIcon("put-call-gauge"),
2543
+ layout: { w: 3, h: 3, minW: 2, minH: 2 },
2544
+ description: "Options put/call ratio as a radial gauge \u2014 the arc reads from 0 (all calls, bullish) through 1 (balanced) toward 2 (put-heavy, defensive), colored green below 1 and red above. A dial-style alternative to the Put/Call Ratio card. Keyless (Deribit).",
2545
+ capabilities: ["options-summary"],
2546
+ source: SOURCES.deribit,
2547
+ schema: z3.object({
2548
+ currency: z3.enum(["BTC", "ETH"]).default("BTC").describe("Options underlying to read the ratio for."),
2549
+ basis: z3.enum(["oi", "volume"]).default("oi").describe("Ratio basis \u2014 open interest or 24h contract volume.")
2550
+ })
2551
+ });
2552
+ var customDataMeta = defineFrameMeta({
2553
+ name: "custom-data",
2554
+ label: "Custom Data",
2555
+ category: "tools",
2556
+ iconUrl: widgetIcon("custom-data"),
2557
+ layout: { w: 4, h: 3, minW: 2, minH: 2 },
2558
+ description: "The escape hatch: renders ANY keyless HTTPS JSON API as a stat, line chart, bars, or label\u2192value table \u2014 for data no built-in frame covers (weather, sports, public stats, niche feeds). Fetches browser-direct, so the API must be CORS-open, need no key, and be public https (localhost/private hosts are refused). Point `values` at the JSON with a dot/bracket path \u2014 e.g. 'hourly.temperature_2m', 'data[0].price', 'items[*].name'. A path resolving to an array charts as a series; a scalar shows as a stat. Verify the URL and path against a real response before emitting them.",
2559
+ capabilities: [],
2560
+ schema: z3.object({
2561
+ url: z3.string().min(1).refine((u) => validateCustomUrl(u) === null, {
2562
+ message: "must be a public https:// URL (no credentials, no localhost/private hosts)"
2563
+ }).default(
2564
+ "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd"
2565
+ ).describe(
2566
+ "The JSON endpoint, public https only. Must be CORS-open and keyless \u2014 never embed an API key or token; the spec is shareable. Include query params in the URL."
2567
+ ),
2568
+ values: z3.string().min(1).max(200).default("bitcoin.usd").describe(
2569
+ "Dot/bracket path to the value(s) inside the response, e.g. 'hourly.temperature_2m' (array \u2192 series), 'data[0].price' (scalar \u2192 stat), 'items[*].volume' ([*] maps over an array). No expressions \u2014 keys, [indices], and [*] only."
2570
+ ),
2571
+ labels: z3.string().max(200).default("").describe(
2572
+ "Optional path to a parallel array of labels \u2014 x-axis ticks for bars, row names for the table, e.g. 'hourly.time' or 'items[*].name'. Empty = positional indices."
2573
+ ),
2574
+ display: z3.enum(["stat", "line", "bars", "table"]).default("stat").describe(
2575
+ "How to render: stat = big headline number (last value) with sparkline history; line = the series as a line chart; bars = labelled bar chart; table = label \u2192 value rows."
2576
+ ),
2577
+ label: z3.string().max(80).default("").describe(
2578
+ 'Caption naming the metric, e.g. "Bangkok Temp (\xB0C)". Empty shows only the API hostname.'
2579
+ ),
2580
+ unit: z3.string().max(12).default("").describe(
2581
+ 'Unit suffix appended to numeric values, e.g. "\xB0C", "%", "km".'
2582
+ ),
2583
+ refreshMinutes: z3.number().int().min(1).max(1440).default(15).describe(
2584
+ "Re-fetch interval in minutes. Be polite to free APIs \u2014 15+ unless the data genuinely moves faster."
2585
+ )
2586
+ })
2587
+ });
2588
+ var oiTreemapMeta = defineFrameMeta({
2589
+ name: "oi-treemap",
2590
+ label: "OI Treemap",
2591
+ category: "derivatives",
2592
+ iconUrl: widgetIcon("oi-treemap"),
2593
+ layout: { w: 6, h: 4, minW: 3, minH: 3 },
2594
+ description: "Treemap of live Hyperliquid open interest, sized by USD notional \u2014 largest markets first, the long tail rolled into a single 'Other' tile. A single-glance map of where perp capital concentrates right now. Keyless (Hyperliquid).",
2595
+ capabilities: ["open-interest"],
2596
+ source: SOURCES.hyperliquid,
2597
+ schema: z3.object({
2598
+ limit: z3.number().int().min(3).max(30).default(12).describe(
2599
+ "How many of the largest open-interest markets to show as individual tiles before rolling the rest into a single 'Other' tile."
2600
+ )
2601
+ })
2602
+ });
2603
+ var ohlcvVolumeBarsMeta = defineFrameMeta({
2604
+ name: "ohlcv-volume-bars",
2605
+ label: "OHLCV Volume Bars",
2606
+ category: "derivatives",
2607
+ iconUrl: widgetIcon("ohlcv-volume-bars"),
2608
+ layout: { w: 6, h: 3, minW: 3, minH: 2 },
2609
+ description: "Per-candle trading volume for one Hyperliquid symbol as vertical bars over time, each bar tinted green when that candle closed up and red when it closed down. Works for any HIP-3 perp (stocks, indices, commodities) and crypto. Keyless (Hyperliquid).",
2610
+ capabilities: ["ohlcv"],
2611
+ source: SOURCES.hyperliquid,
2612
+ schema: z3.object({
2613
+ symbol: z3.string().min(1).describe(
2614
+ 'Hyperliquid symbol to chart volume for. HIP-3 cross-asset: stocks "xyz:TSLA"/"xyz:NVDA", indices "xyz:SP500", commodities "xyz:GOLD". Crypto: "BTC", "ETH".'
2615
+ ),
2616
+ interval: z3.enum(["1m", "5m", "15m", "1h", "4h", "1d"]).default("1h").describe("Candle interval each volume bar represents.")
2617
+ })
2618
+ });
2619
+ var fundingSpreadBarsMeta = defineFrameMeta({
2620
+ name: "funding-spread-bars",
2621
+ label: "Funding Spread Bars",
2622
+ category: "derivatives",
2623
+ iconUrl: widgetIcon("funding-spread-bars"),
2624
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2625
+ description: "Cross-venue predicted funding-rate spread per coin (max \u2212 min annualized rate across Hyperliquid/Binance/Bybit) as a ranked horizontal bar chart \u2014 the widest spreads are the clearest funding-arbitrage or crowded-positioning candidates. The bars-first sibling of Cross-Venue Funding. Keyless (Hyperliquid predicted fundings).",
2626
+ capabilities: ["funding-comparison"],
2627
+ source: SOURCES.hyperliquid,
2628
+ schema: z3.object({
2629
+ limit: z3.number().int().min(3).max(20).default(10).describe("How many coins (by cross-venue funding spread) to chart.")
2630
+ })
2631
+ });
2632
+ var fundingVenueHeatmapMeta = defineFrameMeta({
2633
+ name: "funding-venue-heatmap",
2634
+ label: "Funding Venue Heatmap",
2635
+ category: "derivatives",
2636
+ iconUrl: widgetIcon("funding-venue-heatmap"),
2637
+ layout: { w: 6, h: 3, minW: 4, minH: 3 },
2638
+ description: "Heatmap of predicted annualized funding rates \u2014 coins as rows, venues (Hyperliquid/Binance/Bybit) as columns, green positive / red negative. Spots which venue is paying up (or charging) for a given coin at a glance. Keyless (Hyperliquid predicted fundings).",
2639
+ capabilities: ["funding-comparison"],
2640
+ source: SOURCES.hyperliquid,
2641
+ schema: z3.object({
2642
+ limit: z3.number().int().min(3).max(15).default(8).describe(
2643
+ "How many coins (by cross-venue funding spread) to include as heatmap rows."
2644
+ )
2645
+ })
2646
+ });
2647
+ var fundingCarryAreaMeta = defineFrameMeta({
2648
+ name: "funding-carry-area",
2649
+ label: "Funding Carry",
2650
+ category: "derivatives",
2651
+ iconUrl: widgetIcon("funding-carry-area"),
2652
+ layout: { w: 6, h: 3, minW: 3, minH: 2 },
2653
+ description: "Stacked area of each symbol's running cumulative funding cost or benefit over a configurable lookback \u2014 the running total a position would have paid or earned in funding, symbol by symbol. Shows whether carry has been a persistent drag or tailwind. Keyless (Hyperliquid).",
2654
+ capabilities: ["funding-history"],
2655
+ source: SOURCES.hyperliquid,
2656
+ schema: z3.object({
2657
+ symbols: z3.array(z3.string()).min(1).max(6).describe(
2658
+ 'Hyperliquid symbols to compare cumulative funding carry for, e.g. ["BTC", "ETH"]. Up to 6.'
2659
+ ),
2660
+ lookback: z3.enum(["24h", "7D", "1M"]).default("7D").describe("History window for the cumulative funding-carry chart.")
2661
+ })
2662
+ });
2663
+ var volumeShareDonutMeta = defineFrameMeta({
2664
+ name: "volume-share-donut",
2665
+ label: "Volume Share Donut",
2666
+ category: "derivatives",
2667
+ iconUrl: widgetIcon("volume-share-donut"),
2668
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2669
+ description: "Donut of 24h Hyperliquid trading volume share across the busiest symbols, top symbols as slices with the long tail rolled into 'Other'. Shows where perp trading activity concentrates right now. Keyless (Hyperliquid).",
2670
+ capabilities: ["day-stats"],
2671
+ source: SOURCES.hyperliquid,
2672
+ schema: z3.object({
2673
+ limit: z3.number().int().min(3).max(15).default(7).describe(
2674
+ "How many top symbols (by 24h notional volume) to show as individual slices before rolling the rest into a single 'Other' slice."
2675
+ )
2676
+ })
2677
+ });
2678
+ var volumeMoversScatterMeta = defineFrameMeta({
2679
+ name: "volume-movers-scatter",
2680
+ label: "Volume Movers Scatter",
2681
+ category: "derivatives",
2682
+ iconUrl: widgetIcon("volume-movers-scatter"),
2683
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
2684
+ description: "Hyperliquid perps as a bubble scatter \u2014 24h price change on the x-axis, 24h notional volume on a log y-axis, bubble size by volume. Shows whether the busiest markets are also the biggest movers, or diverging. Keyless (Hyperliquid).",
2685
+ capabilities: ["day-stats"],
2686
+ source: SOURCES.hyperliquid,
2687
+ schema: z3.object({
2688
+ limit: z3.number().int().min(10).max(60).default(40).describe(
2689
+ "How many of the busiest symbols (by 24h notional volume) to plot."
2690
+ )
2691
+ })
2692
+ });
2693
+ var fundingLeaderboardBarsMeta = defineFrameMeta({
2694
+ name: "funding-leaderboard-bars",
2695
+ label: "Funding Leaderboard",
2696
+ category: "derivatives",
2697
+ iconUrl: widgetIcon("funding-leaderboard-bars"),
2698
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2699
+ description: "Predicted hourly funding rate ranked across the whole Hyperliquid universe \u2014 crypto and HIP-3 equities together \u2014 as a diverging bar chart, largest absolute rates first. Surfaces the most expensive (or most rewarded) side to hold right now. Keyless (Hyperliquid).",
2700
+ capabilities: ["day-stats"],
2701
+ source: SOURCES.hyperliquid,
2702
+ schema: z3.object({
2703
+ limit: z3.number().int().min(3).max(20).default(10).describe("How many symbols (by absolute funding rate) to chart.")
2704
+ })
2705
+ });
2706
+ var fundingCrowdingScatterMeta = defineFrameMeta({
2707
+ name: "funding-crowding-scatter",
2708
+ label: "Funding Crowding Scatter",
2709
+ category: "derivatives",
2710
+ iconUrl: widgetIcon("funding-crowding-scatter"),
2711
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
2712
+ description: "24h price change (x) vs predicted funding rate (y) across Hyperliquid perps, bubble size by open interest \u2014 the combination of a stretched funding rate and heavy open interest flags a crowded, squeeze-prone position. Keyless (Hyperliquid).",
2713
+ capabilities: ["day-stats", "open-interest"],
2714
+ source: SOURCES.hyperliquid,
2715
+ schema: z3.object({
2716
+ limit: z3.number().int().min(10).max(60).default(40).describe("How many symbols (by open interest) to plot.")
2717
+ })
2718
+ });
2719
+ var liquidityBasisBarsMeta = defineFrameMeta({
2720
+ name: "liquidity-basis-bars",
2721
+ label: "Liquidity & Basis Bars",
2722
+ category: "derivatives",
2723
+ iconUrl: widgetIcon("liquidity-basis-bars"),
2724
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2725
+ description: "Ranked horizontal bars of a chosen liquidity/pricing metric across Hyperliquid perps \u2014 either the bid/ask impact-price spread (% of mark price) or the mark-vs-oracle basis (bps). Surfaces the least liquid or most stretched markets at a glance. Keyless (Hyperliquid).",
2726
+ capabilities: ["day-stats"],
2727
+ source: SOURCES.hyperliquid,
2728
+ schema: z3.object({
2729
+ metric: z3.enum(["spread", "basis"]).default("spread").describe(
2730
+ 'Which liquidity metric to rank by: "spread" (bid/ask impact-price spread as a % of mark price) or "basis" (mark-vs-oracle premium in basis points).'
2731
+ ),
2732
+ limit: z3.number().int().min(3).max(20).default(10).describe(
2733
+ "How many symbols (by the chosen metric's magnitude) to chart."
2734
+ )
2735
+ })
2736
+ });
2737
+ var coinMomentumHeatmapMeta = defineFrameMeta({
2738
+ name: "coin-momentum-heatmap",
2739
+ label: "Coin Momentum Heatmap",
2740
+ category: "crypto",
2741
+ iconUrl: widgetIcon("coin-momentum-heatmap"),
2742
+ layout: { w: 5, h: 5, minW: 4, minH: 3 },
2743
+ description: "Top coins by market-cap rank as a momentum heatmap \u2014 rows are coins, columns are 1h/24h/7d/30d change windows, colored diverging green/red by magnitude. Spot which coins are heating up (or cooling off) across every timeframe at a glance. Keyless (CoinPaprika, ~2000 coins).",
2744
+ capabilities: ["coin-movers"],
2745
+ source: SOURCES.coinpaprika,
2746
+ schema: z3.object({
2747
+ limit: z3.number().int().min(5).max(30).default(15).describe("How many top coins (by market-cap rank) to include as rows.")
2748
+ })
2749
+ });
2750
+ var coinMomentumScatterMeta = defineFrameMeta({
2751
+ name: "coin-momentum-scatter",
2752
+ label: "Coin Momentum Scatter",
2753
+ category: "crypto",
2754
+ iconUrl: widgetIcon("coin-momentum-scatter"),
2755
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
2756
+ description: "Broad-market coins as a momentum scatter \u2014 24h change on the x-axis, 7d change on the y-axis, bubble size by market cap, colored by 24h direction. Reveals whether today's move is a continuation or a reversal of the week's trend. Keyless (CoinPaprika, ~2000 coins).",
2757
+ capabilities: ["coin-movers"],
2758
+ source: SOURCES.coinpaprika,
2759
+ schema: z3.object({
2760
+ limit: z3.number().int().min(10).max(100).default(50).describe("How many top coins (by market-cap rank) to plot.")
2761
+ })
2762
+ });
2763
+ var trendingBarsMeta = defineFrameMeta({
2764
+ name: "trending-bars",
2765
+ label: "Trending Bars",
2766
+ category: "crypto",
2767
+ iconUrl: widgetIcon("trending-bars"),
2768
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2769
+ description: "The coins with the most search interest right now on CoinGecko as a diverging bar chart \u2014 24h change per trending coin, gains right in green, losses left in red. The chart-first sibling of the Trending Coins list. Keyless (CoinGecko).",
2770
+ capabilities: ["trending-coins"],
2771
+ source: SOURCES.coingecko,
2772
+ schema: z3.object({
2773
+ limit: z3.number().int().min(3).max(15).default(7).describe("How many trending coins to chart.")
2774
+ })
2775
+ });
2776
+ var nftActivityBarsMeta = defineFrameMeta({
2777
+ name: "nft-activity-bars",
2778
+ label: "NFT Activity Bars",
2779
+ category: "crypto",
2780
+ iconUrl: widgetIcon("nft-activity-bars"),
2781
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2782
+ description: "Blue-chip NFT collections ranked by 24h sales count as a horizontal bar chart \u2014 which collections are actually trading, not just holding a floor price. The chart-first sibling of the NFT Collections list. Keyless (CoinGecko, curated slugs).",
2783
+ capabilities: ["nft-market"],
2784
+ source: SOURCES.coingecko,
2785
+ schema: z3.object({
2786
+ limit: z3.number().int().min(5).max(15).default(10).describe("How many collections (by 24h sales) to chart.")
2787
+ })
2788
+ });
2789
+ var dominanceBarsMeta = defineFrameMeta({
2790
+ name: "dominance-bars",
2791
+ label: "Dominance Bars",
2792
+ category: "markets",
2793
+ iconUrl: widgetIcon("dominance-bars"),
2794
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2795
+ description: "Market-cap dominance for every asset in CoinGecko's global snapshot \u2014 not just BTC and ETH \u2014 as a horizontal bar chart, ranked largest-first. Surfaces the next tier (USDT, BNB, SOL, \u2026) the segmented Bitcoin Dominance bar collapses into 'Others'. Keyless (CoinGecko).",
2796
+ capabilities: ["global-market"],
2797
+ source: SOURCES.coingecko,
2798
+ schema: z3.object({
2799
+ limit: z3.number().int().min(3).max(15).default(8).describe("How many assets (by market-cap dominance) to chart.")
2800
+ })
2801
+ });
2802
+ var trendingBubblesMeta = defineFrameMeta({
2803
+ name: "trending-bubbles",
2804
+ label: "Trending Bubbles",
2805
+ category: "crypto",
2806
+ iconUrl: widgetIcon("trending-bubbles"),
2807
+ layout: { w: 6, h: 5, minW: 4, minH: 3 },
2808
+ description: "The coins with the most search interest right now on CoinGecko as a floating bubble cloud \u2014 bubble area by |24h change|, ring tinted green/red by direction. A movement-first alternative to the Trending Coins list. Keyless (CoinGecko).",
2809
+ capabilities: ["trending-coins"],
2810
+ source: SOURCES.coingecko,
2811
+ schema: z3.object({
2812
+ limit: z3.number().int().min(3).max(15).default(10).describe("How many trending coins to show.")
2813
+ })
2814
+ });
2815
+ var yieldRiskPieMeta = defineFrameMeta({
2816
+ name: "yield-risk-pie",
2817
+ label: "Yield Risk Pie",
2818
+ category: "crypto",
2819
+ iconUrl: widgetIcon("yield-risk-pie"),
2820
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2821
+ description: "DeFi yield pools grouped by impermanent-loss risk as a donut, sliced by total value locked (TVL) \u2014 no-IL-risk, IL-risk, and unknown, summed across every pool. A quick read on how much yield-seeking capital carries IL exposure. Keyless (DeFiLlama).",
2822
+ capabilities: ["yields"],
2823
+ source: SOURCES.defillama,
2824
+ schema: z3.object({})
2825
+ });
2826
+ var dexPoolLiquidityScatterMeta = defineFrameMeta({
2827
+ name: "dex-pool-liquidity-scatter",
2828
+ label: "DEX Pool Liquidity Scatter",
2829
+ category: "onchain",
2830
+ iconUrl: widgetIcon("dex-pool-liquidity-scatter"),
2831
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
2832
+ description: "Trending DEX pools on a chain as a liquidity-vs-volume bubble scatter \u2014 pool reserves on a log x-axis, 24h trading volume on a log y-axis, bubble size by 24h trade count, tinted green/red by 24h price change. Surfaces deep, active pools versus thin or quiet ones. Keyless (GeckoTerminal free tier).",
2833
+ capabilities: ["dex-pools"],
2834
+ source: SOURCES.geckoterminal,
2835
+ schema: z3.object({
2836
+ network: z3.enum(["eth", "solana", "base", "arbitrum", "bsc", "polygon_pos"]).default("eth").describe("Which chain's trending pools to show."),
2837
+ count: z3.number().int().min(5).max(15).default(12).describe("How many trending pools to plot (up to 15).")
2838
+ })
2839
+ });
2840
+ var protocolFeesVsTvlScatterMeta = defineFrameMeta({
2841
+ name: "protocol-fees-vs-tvl-scatter",
2842
+ label: "Protocol Fees vs TVL Scatter",
2843
+ category: "crypto",
2844
+ iconUrl: widgetIcon("protocol-fees-vs-tvl-scatter"),
2845
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
2846
+ description: "DeFi protocols as a fees-vs-TVL bubble scatter \u2014 total value locked on a log x-axis, trailing-24h fees on a log y-axis, bubble size by fees. Surfaces capital-efficient protocols earning outsized fees on their TVL versus large-but-quiet ones. Only protocols DeFiLlama reports both a TVL and a fees figure for are plotted. Keyless (DeFiLlama).",
2847
+ capabilities: ["protocol-tvl", "protocol-fees"],
2848
+ source: SOURCES.defillama,
2849
+ schema: z3.object({
2850
+ limit: z3.number().int().min(5).max(40).default(20).describe("How many protocols (by 24h fees) to plot.")
2851
+ })
2852
+ });
2853
+ var yieldCompositionScatterMeta = defineFrameMeta({
2854
+ name: "yield-composition-scatter",
2855
+ label: "Yield Composition Scatter",
2856
+ category: "crypto",
2857
+ iconUrl: widgetIcon("yield-composition-scatter"),
2858
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
2859
+ description: "DeFi yield pools as a base-vs-reward APY scatter \u2014 organic (base) APY on the x-axis, incentive (reward) APY on the y-axis, bubble size by TVL. Separates pools earning real organic yield from ones propped up by token incentives. Keyless (DeFiLlama).",
2860
+ capabilities: ["yields"],
2861
+ source: SOURCES.defillama,
2862
+ schema: z3.object({
2863
+ limit: z3.number().int().min(10).max(60).default(40).describe("How many pools (by TVL) to plot."),
2864
+ stablecoinOnly: z3.boolean().default(false).describe("Restrict to stablecoin pools only.")
2865
+ })
2866
+ });
2867
+ var protocolTvlByCategoryMeta = defineFrameMeta({
2868
+ name: "protocol-tvl-by-category",
2869
+ label: "Protocol TVL by Category",
2870
+ category: "crypto",
2871
+ iconUrl: widgetIcon("protocol-tvl-by-category"),
2872
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2873
+ description: "Total value locked (TVL) summed by DeFiLlama category \u2014 Dexes, Lending, Liquid Staking, and more \u2014 as a horizontal bar chart ranked largest-first. Shows which slice of DeFi actually holds the capital. Keyless (DeFiLlama).",
2874
+ capabilities: ["protocol-tvl"],
2875
+ source: SOURCES.defillama,
2876
+ schema: z3.object({
2877
+ limit: z3.number().int().min(4).max(20).default(10).describe("How many DeFi categories (by summed TVL) to chart.")
2878
+ })
2879
+ });
2880
+ var protocolTvlShareAreaMeta = defineFrameMeta({
2881
+ name: "protocol-tvl-share-area",
2882
+ label: "Protocol TVL Share Area",
2883
+ category: "crypto",
2884
+ iconUrl: widgetIcon("protocol-tvl-share-area"),
2885
+ layout: { w: 6, h: 3, minW: 3, minH: 2 },
2886
+ description: "Stacked area chart of total value locked (TVL) for several DeFi protocols over a lookback window, each protocol's slice stacked to show the combined total and how the mix shifts over time. The composition-focused sibling of the Protocol TVL Chart's overlaid lines. Data from DeFiLlama (daily granularity).",
2887
+ capabilities: ["protocol-tvl"],
2888
+ source: SOURCES.defillama,
2889
+ schema: z3.object({
2890
+ protocols: z3.array(z3.string()).min(1).max(6).describe(
2891
+ 'DeFiLlama protocol slugs (lowercase, hyphenated), e.g. ["lido", "aave", "eigenlayer"]. 1 to 6.'
2892
+ ),
2893
+ lookback: z3.enum(["7D", "1M", "3M"]).default("1M").describe("History window for the chart.")
2894
+ })
2895
+ });
2896
+ var dexVolumeShareAreaMeta = defineFrameMeta({
2897
+ name: "dex-volume-share-area",
2898
+ label: "DEX Volume Share Area",
2899
+ category: "crypto",
2900
+ iconUrl: widgetIcon("dex-volume-share-area"),
2901
+ layout: { w: 6, h: 3, minW: 3, minH: 2 },
2902
+ description: "Stacked area chart of daily DEX trading volume for several protocols over a lookback window, stacked to show combined volume and how each DEX's share shifts over time. The composition-focused sibling of the DEX Volume Chart's overlaid lines. Data from DeFiLlama (daily granularity).",
2903
+ capabilities: ["dex-volume"],
2904
+ source: SOURCES.defillama,
2905
+ schema: z3.object({
2906
+ protocols: z3.array(z3.string()).min(1).max(6).describe(
2907
+ 'DeFiLlama DEX protocol slugs (lowercase, hyphenated), e.g. ["uniswap", "pancakeswap", "aerodrome-slipstream"]. 1 to 6.'
2908
+ ),
2909
+ lookback: z3.enum(["7D", "1M", "3M"]).default("1M").describe("History window for the chart.")
2910
+ })
2911
+ });
2912
+ var yieldMomentumBarsMeta = defineFrameMeta({
2913
+ name: "yield-momentum-bars",
2914
+ label: "Yield Momentum Bars",
2915
+ category: "crypto",
2916
+ iconUrl: widgetIcon("yield-momentum-bars"),
2917
+ layout: { w: 4, h: 5, minW: 3, minH: 4 },
2918
+ description: "DeFi yield pools ranked by 7-day APY change as a diverging bar chart \u2014 the biggest APY gains and drops over the past week, filtered above a TVL floor to skip dust pools. Surfaces where yields are heating up or cooling off. Keyless (DeFiLlama).",
2919
+ capabilities: ["yields"],
2920
+ source: SOURCES.defillama,
2921
+ schema: z3.object({
2922
+ limit: z3.number().int().min(6).max(20).default(12).describe(
2923
+ "How many pools to chart, split into the largest 7-day APY gains and drops."
2924
+ ),
2925
+ minTvlUsd: z3.number().min(0).default(1e6).describe("Minimum pool TVL in USD \u2014 a liquidity floor to hide dust.")
2926
+ })
2927
+ });
2928
+ var btcDifficultyChartMeta = defineFrameMeta({
2929
+ name: "btc-difficulty-chart",
2930
+ label: "BTC Difficulty Chart",
2931
+ category: "bitcoin",
2932
+ iconUrl: widgetIcon("btc-difficulty-chart"),
2933
+ layout: { w: 6, h: 3, minW: 3, minH: 2 },
2934
+ description: "Bitcoin network difficulty over time as a line chart, with the current difficulty and hashrate as headline figures \u2014 the long-run mining-cost trend, charted rather than a single retarget countdown. Keyless (mempool.space).",
2935
+ capabilities: ["btc-hashrate"],
2936
+ source: SOURCES.mempool,
2937
+ schema: z3.object({
2938
+ window: z3.enum(["1y", "2y", "3y"]).default("1y").describe("History window for the difficulty line.")
2939
+ })
2940
+ });
2941
+ var btcBlockSizeBarsMeta = defineFrameMeta({
2942
+ name: "btc-block-size-bars",
2943
+ label: "BTC Block Size Bars",
2944
+ category: "bitcoin",
2945
+ iconUrl: widgetIcon("btc-block-size-bars"),
2946
+ layout: { w: 5, h: 4, minW: 3, minH: 3 },
2947
+ description: "Recent Bitcoin block sizes as a vertical bar chart, oldest to newest \u2014 spot when blocks are running full (near the ~4MB weight limit) versus half-empty. The chart-first sibling of the BTC Blocks feed. Keyless (mempool.space).",
2948
+ capabilities: ["btc-blocks"],
2949
+ source: SOURCES.mempool,
2950
+ schema: z3.object({
2951
+ count: z3.number().int().min(3).max(15).default(8).describe("How many recent blocks to chart (oldest \u2192 newest).")
2952
+ })
2953
+ });
2954
+ var chainPriceMoversMeta = defineFrameMeta({
2955
+ name: "chain-price-movers",
2956
+ label: "Chain Price Movers",
2957
+ category: "onchain",
2958
+ iconUrl: widgetIcon("chain-price-movers"),
2959
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2960
+ description: "24h native-asset price change per major L1 (Bitcoin, Ethereum, Litecoin, Dogecoin, \u2026) as a diverging bar chart, gains right in green, losses left in red. The price-led sibling of the Chain Activity Bars transaction chart. Keyless (Blockchair).",
2961
+ capabilities: ["chain-activity"],
2962
+ source: SOURCES.blockchair,
2963
+ schema: z3.object({
2964
+ limit: z3.number().int().min(3).max(12).default(8).describe("How many chains (by absolute 24h price change) to chart.")
2965
+ })
2966
+ });
2967
+ var chainActivityScatterMeta = defineFrameMeta({
2968
+ name: "chain-activity-scatter",
2969
+ label: "Chain Activity Scatter",
2970
+ category: "onchain",
2971
+ iconUrl: widgetIcon("chain-activity-scatter"),
2972
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
2973
+ description: "Major L1s as a bubble scatter \u2014 24h native-asset price change on the x-axis, 24h confirmed transactions on a log y-axis, bubble size by current mempool backlog. Shows which chains are both moving in price and busy on-chain. Keyless (Blockchair).",
2974
+ capabilities: ["chain-activity"],
2975
+ source: SOURCES.blockchair,
2976
+ schema: z3.object({})
2977
+ });
2978
+ var mempoolFeeCurveMeta = defineFrameMeta({
2979
+ name: "mempool-fee-curve",
2980
+ label: "Mempool Fee Curve",
2981
+ category: "bitcoin",
2982
+ iconUrl: widgetIcon("mempool-fee-curve"),
2983
+ layout: { w: 5, h: 3, minW: 3, minH: 2 },
2984
+ description: "Bitcoin mempool's projected next-to-mine blocks as a fee-decay bar chart \u2014 median sat/vB per block, tinted by urgency, showing how fast fees drop as you're willing to wait a block or two longer. The chart-first sibling of the BTC Mempool card. Keyless (mempool.space).",
2985
+ capabilities: ["btc-mempool"],
2986
+ source: SOURCES.mempool,
2987
+ schema: z3.object({
2988
+ projectedBlocks: z3.number().int().min(1).max(8).default(5).describe(
2989
+ "How many projected (yet-to-be-mined) blocks to chart, next-to-mine first."
2990
+ )
2991
+ })
2992
+ });
2993
+ var miningPoolsShareMeta = defineFrameMeta({
2994
+ name: "mining-pools-share",
2995
+ label: "Mining Pools Share",
2996
+ category: "bitcoin",
2997
+ iconUrl: widgetIcon("mining-pools-share"),
2998
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
2999
+ description: "Bitcoin mining-pool dominance as a donut \u2014 top pools by block share over a window plus an 'Other' slice, with the top-3 combined share in the center as a quick hashpower-concentration read. The chart-first sibling of the Mining Pools treemap. Keyless (mempool.space).",
3000
+ capabilities: ["mining-pools"],
3001
+ source: SOURCES.mempool,
3002
+ schema: z3.object({
3003
+ window: z3.enum(["24h", "3d", "1w", "1m"]).default("1w").describe("Window over which to measure each pool's block share."),
3004
+ topN: z3.number().int().min(3).max(8).default(5).describe(
3005
+ "How many of the largest pools to show as slices; the rest fold into 'Other'."
3006
+ )
3007
+ })
3008
+ });
3009
+ var optionsMaxPainMeta = defineFrameMeta({
3010
+ name: "options-max-pain",
3011
+ label: "Max Pain by Strike",
3012
+ category: "derivatives",
3013
+ iconUrl: widgetIcon("options-max-pain"),
3014
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
3015
+ description: "Max pain for the nearest Deribit options expiry (BTC or ETH) \u2014 the aggregate payout option writers would owe at each candidate settlement strike, as a bar chart, with the strike that minimizes it (where the most contracts expire worthless) highlighted against the current spot. Keyless (Deribit).",
3016
+ capabilities: ["options-summary"],
3017
+ source: SOURCES.deribit,
3018
+ schema: z3.object({
3019
+ currency: z3.enum(["BTC", "ETH"]).default("BTC").describe("Which Deribit options book \u2014 BTC or ETH.")
3020
+ })
3021
+ });
3022
+ var optionsOiSkewMeta = defineFrameMeta({
3023
+ name: "options-oi-skew",
3024
+ label: "OI Skew by Strike",
3025
+ category: "derivatives",
3026
+ iconUrl: widgetIcon("options-oi-skew"),
3027
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
3028
+ description: "Net call-minus-put open interest by strike for the nearest Deribit options expiry (BTC or ETH) \u2014 a single diverging bar per strike showing where positioning skews call-heavy (green, above zero) versus put-heavy (red, below zero) near spot. The netted sibling of OI by Strike. Keyless (Deribit).",
3029
+ capabilities: ["options-summary"],
3030
+ source: SOURCES.deribit,
3031
+ schema: z3.object({
3032
+ currency: z3.enum(["BTC", "ETH"]).default("BTC").describe("Which Deribit options book \u2014 BTC or ETH."),
3033
+ strikes: z3.number().int().min(6).max(30).default(14).describe(
3034
+ "How many strikes nearest the current spot to show (centered on the underlying price)."
3035
+ )
3036
+ })
3037
+ });
3038
+ var optionsVolSpreadMeta = defineFrameMeta({
3039
+ name: "options-vol-spread",
3040
+ label: "BTC/ETH Vol Spread",
3041
+ category: "derivatives",
3042
+ iconUrl: widgetIcon("options-vol-spread"),
3043
+ layout: { w: 6, h: 3, minW: 3, minH: 2 },
3044
+ description: "BTC DVOL and ETH DVOL implied-volatility indices plotted together over time \u2014 the spread between crypto's two most liquid vol benchmarks, and which one is pricing bigger expected swings. Keyless (Deribit).",
3045
+ capabilities: ["volatility-index"],
3046
+ source: SOURCES.deribit,
3047
+ schema: z3.object({
3048
+ lookback: z3.enum(["7D", "1M", "3M"]).default("1M").describe("History window for both volatility-index lines.")
3049
+ })
3050
+ });
3051
+ var optionsFlowSkewMeta = defineFrameMeta({
3052
+ name: "options-flow-skew",
3053
+ label: "Positioning vs Flow Skew",
3054
+ category: "derivatives",
3055
+ iconUrl: widgetIcon("options-flow-skew"),
3056
+ layout: { w: 4, h: 3, minW: 3, minH: 2 },
3057
+ description: "Call/put skew for BTC or ETH options across two bases at once \u2014 open interest (standing positioning) and 24h volume (today's flow) \u2014 as two diverging bars. Green = call-heavy, red = put-heavy; the two diverging signals fresh flow fighting stale positioning. Keyless (Deribit).",
3058
+ capabilities: ["options-summary"],
3059
+ source: SOURCES.deribit,
3060
+ schema: z3.object({
3061
+ currency: z3.enum(["BTC", "ETH"]).default("BTC").describe("Which Deribit options book \u2014 BTC or ETH.")
3062
+ })
3063
+ });
3064
+ var optionsVolSmileMeta = defineFrameMeta({
3065
+ name: "options-vol-smile",
3066
+ label: "Vol Smile",
3067
+ category: "derivatives",
3068
+ iconUrl: widgetIcon("options-vol-smile"),
3069
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
3070
+ description: "Implied volatility by strike for the nearest Deribit options expiry (BTC or ETH) \u2014 a call-IV line and a put-IV line across the strike range, the classic 'vol smile' shape that shows where the market prices tail risk richest. Keyless (Deribit).",
3071
+ capabilities: ["options-summary"],
3072
+ source: SOURCES.deribit,
3073
+ schema: z3.object({
3074
+ currency: z3.enum(["BTC", "ETH"]).default("BTC").describe("Which Deribit options book \u2014 BTC or ETH.")
3075
+ })
3076
+ });
3077
+ var optionsOiLadderHeatmapMeta = defineFrameMeta({
3078
+ name: "options-oi-ladder-heatmap",
3079
+ label: "OI Ladder Heatmap",
3080
+ category: "derivatives",
3081
+ iconUrl: widgetIcon("options-oi-ladder-heatmap"),
3082
+ layout: { w: 8, h: 5, minW: 5, minH: 4 },
3083
+ description: "Open interest across strike and expiry for BTC or ETH options, as a heatmap \u2014 expiries as rows (nearest first), strike bands as columns, cell shade by total call+put OI. Surfaces where positioning concentrates across the whole term structure, not just the nearest expiry. Keyless (Deribit).",
3084
+ capabilities: ["options-summary"],
3085
+ source: SOURCES.deribit,
3086
+ schema: z3.object({
3087
+ currency: z3.enum(["BTC", "ETH"]).default("BTC").describe("Which Deribit options book \u2014 BTC or ETH."),
3088
+ expiries: z3.number().int().min(3).max(16).default(8).describe(
3089
+ "How many upcoming expiries (nearest-first) to show as rows."
3090
+ ),
3091
+ buckets: z3.number().int().min(6).max(20).default(10).describe(
3092
+ "How many strike bands (columns) to bin open interest into, spanning the shown expiries' strike range."
3093
+ )
3094
+ })
3095
+ });
3096
+ var optionsMaxPainMultiMeta = defineFrameMeta({
3097
+ name: "options-max-pain-multi",
3098
+ label: "Max Pain by Expiry",
3099
+ category: "derivatives",
3100
+ iconUrl: widgetIcon("options-max-pain-multi"),
3101
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
3102
+ description: "Max pain strike for each upcoming Deribit options expiry (BTC or ETH), plotted as % deviation from spot \u2014 one bar per expiry, showing which dated books are pinned above versus below the current price. The term-structure sibling of Max Pain by Strike. Keyless (Deribit).",
3103
+ capabilities: ["options-summary"],
3104
+ source: SOURCES.deribit,
3105
+ schema: z3.object({
3106
+ currency: z3.enum(["BTC", "ETH"]).default("BTC").describe("Which Deribit options book \u2014 BTC or ETH."),
3107
+ expiries: z3.number().int().min(3).max(16).default(8).describe("How many upcoming expiries (nearest-first) to chart.")
3108
+ })
3109
+ });
3110
+ var mvrvZscoreChartMeta = defineFrameMeta({
3111
+ name: "mvrv-zscore-chart",
3112
+ label: "MVRV Z-Score Chart",
3113
+ category: "onchain",
3114
+ iconUrl: widgetIcon("mvrv-zscore-chart"),
3115
+ layout: { w: 6, h: 3, minW: 4, minH: 3 },
3116
+ description: "Bitcoin MVRV Z-Score plotted as a full daily time-series line, not just a sparkline \u2014 how many standard deviations market cap sits above realized cap across the whole available history. Historically, spikes above ~7 have marked cycle tops and dips below 0 mark deep-value bottoms. The chart-first sibling of the MVRV gauge. Keyless (Coin Metrics).",
3117
+ capabilities: ["onchain-valuation"],
3118
+ source: SOURCES.coinMetrics,
3119
+ schema: z3.object({
3120
+ window: z3.enum(["1Y", "2Y", "4Y", "all"]).default("all").describe("How much history the chart shows.")
3121
+ })
3122
+ });
3123
+ var nuplCycleChartMeta = defineFrameMeta({
3124
+ name: "nupl-cycle-chart",
3125
+ label: "NUPL Cycle Chart",
3126
+ category: "onchain",
3127
+ iconUrl: widgetIcon("nupl-cycle-chart"),
3128
+ layout: { w: 6, h: 3, minW: 4, minH: 3 },
3129
+ description: "Net Unrealized Profit/Loss plotted as a full daily time-series line across Bitcoin's cycle sentiment bands \u2014 Capitulation, Hope/Fear, Optimism, Belief, Euphoria/Greed. The chart-first sibling of the NUPL gauge. Keyless (Coin Metrics).",
3130
+ capabilities: ["onchain-valuation"],
3131
+ source: SOURCES.coinMetrics,
3132
+ schema: z3.object({
3133
+ window: z3.enum(["1Y", "2Y", "4Y", "all"]).default("all").describe("How much history the chart shows.")
3134
+ })
3135
+ });
3136
+ var cycleValuationCompositeMeta = defineFrameMeta({
3137
+ name: "cycle-valuation-composite",
3138
+ label: "Cycle Valuation Composite",
3139
+ category: "onchain",
3140
+ iconUrl: widgetIcon("cycle-valuation-composite"),
3141
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
3142
+ description: "Three cycle-valuation signals \u2014 MVRV Z-Score, NUPL, and BTC's 14-day RSI \u2014 overlaid on one chart, each independently min-max normalized to 0\u2013100% over the selected window so their unrelated native scales become directly comparable. All three near the top together reads late-cycle euphoria; all three near the bottom reads capitulation. Keyless (Coin Metrics).",
3143
+ capabilities: ["onchain-valuation", "price-history-daily"],
3144
+ source: SOURCES.coinMetrics,
3145
+ schema: z3.object({
3146
+ window: z3.enum(["1Y", "2Y", "4Y", "all"]).default("2Y").describe("How much history each signal is normalized and charted over.")
3147
+ })
3148
+ });
3149
+ var onchainOscillatorOverlayMeta = defineFrameMeta({
3150
+ name: "onchain-oscillator-overlay",
3151
+ label: "On-Chain Oscillator Overlay",
3152
+ category: "onchain",
3153
+ iconUrl: widgetIcon("onchain-oscillator-overlay"),
3154
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
3155
+ description: "SOPR, Puell Multiple, and Reserve Risk overlaid on one chart, each independently min-max normalized to 0\u2013100% over the selected window \u2014 three on-chain cycle oscillators with unrelated native scales made directly comparable. Keyless (bitcoin-data.com; polled once daily, best-effort per metric).",
3156
+ capabilities: ["onchain-cycle-extras"],
3157
+ source: SOURCES.bitcoinData,
3158
+ schema: z3.object({
3159
+ window: z3.enum(["90D", "180D", "1Y"]).default("1Y").describe("How much history each signal is normalized and charted over.")
3160
+ })
3161
+ });
3162
+ var ethIssuanceImpactMeta = defineFrameMeta({
3163
+ name: "eth-issuance-impact",
3164
+ label: "ETH Issuance Impact",
3165
+ category: "onchain",
3166
+ iconUrl: widgetIcon("eth-issuance-impact"),
3167
+ layout: { w: 4, h: 3, minW: 2, minH: 2 },
3168
+ description: "Ethereum's actual net annual supply growth (post-Merge PoS issuance minus EIP-1559 burn) vs the counterfactual pre-Merge PoW issuance rate, as diverging bars \u2014 how much leaner ETH's inflation is under proof-of-stake. Negative (deflationary) growth in green, positive (inflationary) in red. Keyless (ultrasound.money).",
3169
+ capabilities: ["eth-supply"],
3170
+ source: SOURCES.ultrasound,
3171
+ schema: z3.object({})
3172
+ });
3173
+ var treasuryAvgRateBarsMeta = defineFrameMeta({
3174
+ name: "treasury-avg-rate-bars",
3175
+ label: "Treasury Avg Rate Bars",
3176
+ category: "macro",
3177
+ iconUrl: widgetIcon("treasury-avg-rate-bars"),
3178
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
3179
+ description: "U.S. Treasury average interest rates across the full set of security classes as a horizontal bar chart, ranked highest-first. The chart-first sibling of the Rates Board's Treasury-rates section. Keyless (U.S. Treasury).",
3180
+ capabilities: ["treasury-rates"],
3181
+ source: SOURCES.treasury,
3182
+ schema: z3.object({
3183
+ limit: z3.number().int().min(5).max(25).default(20).describe(
3184
+ "How many security classes (by average rate, highest first) to chart."
3185
+ )
3186
+ })
3187
+ });
3188
+ var treasuryAuctionDemandScatterMeta = defineFrameMeta({
3189
+ name: "treasury-auction-demand-scatter",
3190
+ label: "Treasury Auction Demand",
3191
+ category: "macro",
3192
+ iconUrl: widgetIcon("treasury-auction-demand-scatter"),
3193
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
3194
+ description: "Recent completed U.S. Treasury auctions as a bubble scatter \u2014 awarded rate on the x-axis, bid-to-cover ratio (demand) on the y-axis, one dot per auction labelled by term. Reveals whether richer (lower-yield) auctions also draw stronger demand. Keyless (U.S. Treasury).",
3195
+ capabilities: ["treasury-auctions"],
3196
+ source: SOURCES.treasury,
3197
+ schema: z3.object({
3198
+ count: z3.number().int().min(5).max(30).default(20).describe(
3199
+ "How many recent completed auctions (with a reported rate and bid-to-cover) to plot."
3200
+ )
3201
+ })
3202
+ });
3203
+ var treasuryAuctionSizeBarsMeta = defineFrameMeta({
3204
+ name: "treasury-auction-size-bars",
3205
+ label: "Treasury Auction Size",
3206
+ category: "macro",
3207
+ iconUrl: widgetIcon("treasury-auction-size-bars"),
3208
+ layout: { w: 6, h: 3, minW: 3, minH: 3 },
3209
+ description: "Recent completed U.S. Treasury auctions as paired bars \u2014 the offering amount beside the amount actually accepted, per auction, oldest to newest. Shows at a glance how close each auction came to being fully subscribed. Keyless (U.S. Treasury).",
3210
+ capabilities: ["treasury-auctions"],
3211
+ source: SOURCES.treasury,
3212
+ schema: z3.object({
3213
+ count: z3.number().int().min(3).max(20).default(8).describe(
3214
+ "How many recent completed auctions to chart (oldest to newest)."
3215
+ )
3216
+ })
3217
+ });
3218
+ var nyfedReferenceRateBarsMeta = defineFrameMeta({
3219
+ name: "nyfed-reference-rate-bars",
3220
+ label: "NY Fed Rate Bars",
3221
+ category: "macro",
3222
+ iconUrl: widgetIcon("nyfed-reference-rate-bars"),
3223
+ layout: { w: 4, h: 3, minW: 3, minH: 2 },
3224
+ description: "The six official New York Fed reference rates (effective fed funds, SOFR, tri-party and broad general collateral repo, overnight bank funding, and SOFR averages) as a horizontal bar chart \u2014 level or reported volume. The chart-first sibling of the Rates Board's NY Fed section. Keyless (NY Fed).",
3225
+ capabilities: ["reference-rates"],
3226
+ source: SOURCES.nyFed,
3227
+ schema: z3.object({
3228
+ metric: z3.enum(["rate", "volume"]).default("rate").describe(
3229
+ `"rate" charts each reference rate's level (%); "volume" charts its reported trading volume in USD (SOFR averages report no volume and are skipped in this mode).`
3230
+ ),
3231
+ limit: z3.number().int().min(2).max(6).default(6).describe("How many of the six official reference rates to chart.")
3232
+ })
3233
+ });
3234
+ var nyfedSofrTermAveragesBarsMeta = defineFrameMeta({
3235
+ name: "nyfed-sofr-term-averages-bars",
3236
+ label: "SOFR Term Averages",
3237
+ category: "macro",
3238
+ iconUrl: widgetIcon("nyfed-sofr-term-averages-bars"),
3239
+ layout: { w: 3, h: 3, minW: 2, minH: 2 },
3240
+ description: "SOFR compounded average rates over the trailing 30, 90, and 180 days as a simple bar comparison \u2014 a quick read on where short-term secured funding costs have been trending. Keyless (NY Fed).",
3241
+ capabilities: ["reference-rates"],
3242
+ source: SOURCES.nyFed,
3243
+ schema: z3.object({})
3244
+ });
3245
+ var nyfedFedFundsBandGaugeMeta = defineFrameMeta({
3246
+ name: "nyfed-fed-funds-band-gauge",
3247
+ label: "Fed Funds Band Gauge",
3248
+ category: "macro",
3249
+ iconUrl: widgetIcon("nyfed-fed-funds-band-gauge"),
3250
+ layout: { w: 3, h: 3, minW: 2, minH: 2 },
3251
+ description: "The effective fed funds rate as a radial gauge inside the FOMC's current target band \u2014 the arc fills from the band's lower bound to its upper bound, with the live EFFR reading in the center. Makes it visible at a glance whether the effective rate is trading near the top, bottom, or middle of the target range. Keyless (NY Fed).",
3252
+ capabilities: ["reference-rates"],
3253
+ source: SOURCES.nyFed,
3254
+ schema: z3.object({})
3255
+ });
3256
+ var treasuryDebtCompositionAreaMeta = defineFrameMeta({
3257
+ name: "treasury-debt-composition-area",
3258
+ label: "Debt Composition",
3259
+ category: "macro",
3260
+ iconUrl: widgetIcon("treasury-debt-composition-area"),
3261
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
3262
+ description: "U.S. total public debt outstanding split into debt held by the public vs. intragovernmental holdings, as a stacked area chart over time \u2014 the two components that sum to the National Debt card's headline total. Keyless (U.S. Treasury).",
3263
+ capabilities: ["national-debt"],
3264
+ source: SOURCES.treasury,
3265
+ schema: z3.object({
3266
+ trendDays: z3.number().int().min(30).max(365).default(180).describe(
3267
+ "How many business days of history to load for the stacked area."
3268
+ )
3269
+ })
3270
+ });
3271
+ var ofrStressCategoryAreaMeta = defineFrameMeta({
3272
+ name: "ofr-stress-category-area",
3273
+ label: "FSI by Category",
3274
+ category: "macro",
3275
+ iconUrl: widgetIcon("ofr-stress-category-area"),
3276
+ layout: { w: 6, h: 5, minW: 4, minH: 3 },
3277
+ description: "The OFR Financial Stress Index decomposed into its five contributing categories (credit, equity valuation, safe assets, funding, volatility) as a stacked area chart over time \u2014 each category can be positive or negative and they sum to the overall index shown on the Financial Stress card. Keyless (OFR).",
3278
+ capabilities: ["financial-stress"],
3279
+ source: SOURCES.ofr,
3280
+ schema: z3.object({
3281
+ trendDays: z3.number().int().min(20).max(90).default(60).describe("How many recent daily readings to plot in the stacked area.")
3282
+ })
3283
+ });
3284
+ var miseryIndexMeta = defineFrameMeta({
3285
+ name: "misery-index",
3286
+ label: "Misery Index",
3287
+ category: "macro",
3288
+ iconUrl: widgetIcon("misery-index"),
3289
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
3290
+ description: "The classic 'Misery Index' \u2014 CPI year-over-year inflation stacked with the unemployment rate \u2014 as a two-series stacked area chart, month-aligned, plus the combined headline score. Monthly macro context for stock dashboards, not a live feed. Keyless (BLS).",
3291
+ capabilities: ["macro-series"],
3292
+ source: SOURCES.bls,
3293
+ schema: z3.object({
3294
+ months: z3.number().int().min(13).max(36).default(18).describe("How many recent monthly observations to chart.")
3295
+ })
3296
+ });
3297
+ var realWagesMeta = defineFrameMeta({
3298
+ name: "real-wages",
3299
+ label: "Real Wages",
3300
+ category: "macro",
3301
+ iconUrl: widgetIcon("real-wages"),
3302
+ layout: { w: 6, h: 3, minW: 3, minH: 2 },
3303
+ description: "Are paychecks outrunning inflation? A two-line chart comparing year-over-year average hourly earnings growth against year-over-year CPI inflation \u2014 when earnings run above CPI, real (inflation-adjusted) pay is rising. Monthly macro context, not a live feed. Keyless (BLS).",
3304
+ capabilities: ["macro-series"],
3305
+ source: SOURCES.bls,
3306
+ schema: z3.object({
3307
+ months: z3.number().int().min(13).max(36).default(18).describe(
3308
+ "How many recent monthly year-over-year observations to chart."
3309
+ )
3310
+ })
3311
+ });
3312
+ var laborForceFlowMeta = defineFrameMeta({
3313
+ name: "labor-force-flow",
3314
+ label: "Labor Force Flow",
3315
+ category: "macro",
3316
+ iconUrl: widgetIcon("labor-force-flow"),
3317
+ layout: { w: 6, h: 3, minW: 3, minH: 2 },
3318
+ description: "The unemployment rate and the labor-force participation rate plotted together over time \u2014 a rising unemployment rate alongside a falling participation rate points to people leaving the workforce rather than finding jobs. Monthly macro context, not a live feed. Keyless (BLS).",
3319
+ capabilities: ["macro-series"],
3320
+ source: SOURCES.bls,
3321
+ schema: z3.object({
3322
+ months: z3.number().int().min(13).max(36).default(18).describe("How many recent monthly observations to chart.")
3323
+ })
3324
+ });
3325
+ var payrollsBarsMeta = defineFrameMeta({
3326
+ name: "payrolls-bars",
3327
+ label: "Payrolls Bars",
3328
+ category: "macro",
3329
+ iconUrl: widgetIcon("payrolls-bars"),
3330
+ layout: { w: 6, h: 3, minW: 3, minH: 3 },
3331
+ description: "Monthly nonfarm payrolls net change as a diverging bar chart \u2014 jobs added up in green, jobs cut down in red. The chart-first sibling of the Labor Market frame's headline figure. Monthly macro data, not a live feed. Keyless (BLS).",
3332
+ capabilities: ["macro-series"],
3333
+ source: SOURCES.bls,
3334
+ schema: z3.object({
3335
+ months: z3.number().int().min(6).max(36).default(18).describe("How many recent months of net payroll change to chart.")
3336
+ })
3337
+ });
3338
+ var shortVolumeBarsMeta = defineFrameMeta({
3339
+ name: "short-volume-bars",
3340
+ label: "Short Volume Bars",
3341
+ category: "equities",
3342
+ iconUrl: widgetIcon("short-volume-bars"),
3343
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
3344
+ description: "Daily reported short-sale volume for a watchlist of US-listed stocks, ranked highest-first as a horizontal bar chart \u2014 the chart-first sibling of the Short Volume list. IMPORTANT: this is reported short volume (sell-side short flow, including market-maker hedging), NOT short interest, and is not a directional signal on its own. Daily data published the next business day; not a live feed. US equities only. (FINRA).",
3345
+ capabilities: ["short-volume"],
3346
+ source: SOURCES.finra,
3347
+ schema: z3.object({
3348
+ symbols: z3.array(z3.string()).min(1).max(12).describe(
3349
+ 'US-listed stock tickers to rank, e.g. ["TSLA","NVDA","AAPL"]. HIP-3 symbols ("xyz:TSLA") work too \u2014 the dex prefix is stripped. Crypto has no SEC/FINRA short-volume and is ignored.'
3350
+ )
3351
+ })
3352
+ });
3353
+ var capitalStructureBarsMeta = defineFrameMeta({
3354
+ name: "capital-structure-bars",
3355
+ label: "Capital Structure Bars",
3356
+ category: "equities",
3357
+ iconUrl: widgetIcon("capital-structure-bars"),
3358
+ layout: { w: 4, h: 3, minW: 3, minH: 2 },
3359
+ description: "One company's balance-sheet shape as a horizontal bar chart \u2014 total assets, shareholders' equity, and liabilities (derived as assets minus equity) \u2014 from SEC EDGAR XBRL company facts. Updates only when the company files (annual/quarterly), not a live feed. Requires the zframes runtime's data proxy (ships with `zframes serve` / `vite dev`); resolve by ticker (bundled top-500 map) or raw SEC CIK. (SEC EDGAR).",
3360
+ capabilities: ["fundamentals"],
3361
+ source: SOURCES.secEdgar,
3362
+ schema: z3.object({
3363
+ symbol: z3.string().min(1).describe(
3364
+ 'Company to chart \u2014 a ticker ("AAPL", "NVDA"), a HIP-3 symbol ("xyz:NVDA"), or a raw SEC CIK ("320193"). Tickers outside the bundled top-500 map need a CIK.'
3365
+ )
3366
+ })
3367
+ });
3368
+ var filingsMixMeta = defineFrameMeta({
3369
+ name: "filings-mix",
3370
+ label: "Filings Mix",
3371
+ category: "equities",
3372
+ iconUrl: widgetIcon("filings-mix"),
3373
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
3374
+ description: "What kind of paper is one company actually filing? A donut of recent SEC EDGAR filings bucketed into periodic & material reports (10-K, 10-Q, 8-K, registrations, proxies, activist stakes\u2026), insider ownership forms (3/4/5/144), and everything else \u2014 the chart-first sibling of the Filings Feed. Official data from SEC's free, CORS-safe submissions endpoint; event-driven, not a price feed. Resolve by ticker (bundled top-500 map) or raw SEC CIK. (SEC EDGAR).",
3375
+ capabilities: ["filings"],
3376
+ source: SOURCES.secEdgar,
3377
+ schema: z3.object({
3378
+ symbol: z3.string().min(1).describe(
3379
+ 'Company to show filing mix for \u2014 a ticker ("AAPL", "NVDA"), a HIP-3 symbol ("xyz:TSLA"), or a raw SEC CIK ("320193"). Tickers outside the bundled top-500 map need a CIK.'
3380
+ )
3381
+ })
3382
+ });
3383
+ var fxCrossHeatmapMeta = defineFrameMeta({
3384
+ name: "fx-cross-heatmap",
3385
+ label: "FX Cross Heatmap",
3386
+ category: "macro",
3387
+ iconUrl: widgetIcon("fx-cross-heatmap"),
3388
+ layout: { w: 6, h: 4, minW: 4, minH: 4 },
3389
+ description: "A full currency \xD7 currency cross-rate matrix as a heatmap \u2014 each cell is the day-over-day % change of that specific cross, derived from every listed currency's rate vs a common pivot, green up / red down. Spots which cross is moving hardest across an entire currency set, not just one pair at a time. Keyless (Frankfurter/ECB).",
3390
+ capabilities: ["fx-rates"],
3391
+ source: SOURCES.frankfurter,
3392
+ schema: z3.object({
3393
+ symbols: z3.array(z3.string().length(3)).min(3).max(8).default(["USD", "EUR", "GBP", "JPY", "CHF", "CAD"]).describe(
3394
+ 'Currencies (ISO 4217 codes) forming both axes of the matrix, e.g. ["USD","EUR","GBP","JPY"]. At least 3, so the grid shows more than one cross.'
3395
+ )
3396
+ })
3397
+ });
3398
+ var etfIssuerTreemapMeta = defineFrameMeta({
3399
+ name: "etf-issuer-treemap",
3400
+ label: "ETF Issuer Treemap",
3401
+ category: "crypto",
3402
+ iconUrl: widgetIcon("etf-issuer-treemap"),
3403
+ layout: { w: 5, h: 4, minW: 4, minH: 3 },
3404
+ description: "Spot BTC or ETH ETF issuers as a treemap \u2014 tile size by assets under management, tint green/red by that issuer's net flow today. Shows who holds the most AND who's gathering or losing assets right now, in one view. Best-effort; may be empty if the source is unavailable. Keyless (SoSoValue).",
3405
+ capabilities: ["etf-flows"],
3406
+ source: SOURCES.sosovalue,
3407
+ schema: z3.object({
3408
+ asset: z3.enum(["btc", "eth"]).default("btc").describe("Which spot-ETF complex to show."),
3409
+ limit: z3.number().int().min(3).max(15).default(10).describe("How many issuers (by AUM) to show in the treemap.")
3410
+ })
3411
+ });
3412
+ var fxTrendChartMeta = defineFrameMeta({
3413
+ name: "fx-trend-chart",
3414
+ label: "FX Trend Chart",
3415
+ category: "macro",
3416
+ iconUrl: widgetIcon("fx-trend-chart"),
3417
+ layout: { w: 6, h: 3, minW: 4, minH: 3 },
3418
+ description: "Several currencies' recent trend vs a base, each indexed to 0% at the start of the window so wildly different-magnitude pairs (JPY vs CHF) compare cleanly on one chart. The multi-line sibling of the FX Board. Keyless (Frankfurter/ECB).",
3419
+ capabilities: ["fx-rates"],
3420
+ source: SOURCES.frankfurter,
3421
+ schema: z3.object({
3422
+ base: z3.string().length(3).default("USD").describe(
3423
+ 'Base currency (ISO 4217 code) each line is quoted against, e.g. "USD".'
3424
+ ),
3425
+ symbols: z3.array(z3.string().length(3)).min(1).max(8).default(["EUR", "GBP", "JPY", "CHF"]).describe(
3426
+ 'Currencies to chart (ISO 4217 codes), e.g. ["EUR","GBP","JPY"]. A code equal to the base is skipped.'
3427
+ )
3428
+ })
3429
+ });
3430
+ var fearGreedChartMeta = defineFrameMeta({
3431
+ name: "fear-greed-chart",
3432
+ label: "Fear & Greed Chart",
3433
+ category: "sentiment",
3434
+ iconUrl: widgetIcon("fear-greed-chart"),
3435
+ layout: { w: 6, h: 3, minW: 4, minH: 3 },
3436
+ description: "Crypto Fear & Greed index over time as a line chart \u2014 the mood swing from extreme fear to extreme greed across a wide window, the line tinted by the latest reading. The chart-first sibling of the Fear & Greed card. Keyless (alternative.me).",
3437
+ capabilities: ["sentiment"],
3438
+ source: SOURCES.alternativeMe,
3439
+ schema: z3.object({
3440
+ days: z3.number().int().min(30).max(365).default(180).describe("How many days of index history to chart.")
3441
+ })
3442
+ });
3443
+ var predictionMarketBarsMeta = defineFrameMeta({
3444
+ name: "prediction-market-bars",
3445
+ label: "Prediction Market Bars",
3446
+ category: "sentiment",
3447
+ iconUrl: widgetIcon("prediction-market-bars"),
3448
+ layout: { w: 5, h: 5, minW: 4, minH: 4 },
3449
+ description: "Live Polymarket odds as a horizontal bar chart \u2014 the highest-volume open prediction markets ranked by trailing-24h volume. The chart-first sibling of the Prediction Markets list. Keyless (Polymarket).",
3450
+ capabilities: ["prediction-markets"],
3451
+ source: SOURCES.polymarket,
3452
+ schema: z3.object({
3453
+ limit: z3.number().int().min(3).max(15).default(8).describe("How many markets (by volume) to chart.")
3454
+ })
3455
+ });
3456
+ var dxyChartMeta = defineFrameMeta({
3457
+ name: "dxy-chart",
3458
+ label: "Dollar Index Chart",
3459
+ category: "macro",
3460
+ iconUrl: widgetIcon("dxy-chart"),
3461
+ layout: { w: 6, h: 3, minW: 4, minH: 3 },
3462
+ description: "US Dollar Index (DXY) as a line chart over time \u2014 the dollar's trend vs a basket of six major currencies, tinted green/red by its own direction. The chart-first sibling of the Dollar Index card. Keyless (Frankfurter/ECB).",
3463
+ capabilities: ["dollar-index"],
3464
+ source: SOURCES.frankfurter,
3465
+ schema: z3.object({})
3466
+ });
3467
+ var fxMoversBarsMeta = defineFrameMeta({
3468
+ name: "fx-movers-bars",
3469
+ label: "FX Movers Bars",
3470
+ category: "macro",
3471
+ iconUrl: widgetIcon("fx-movers-bars"),
3472
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
3473
+ description: "A currency set's day-over-day % change vs a base as a diverging bar chart \u2014 strengthening currencies right in green, weakening left in red, ranked by move. The chart-first sibling of the FX Board. Keyless (Frankfurter/ECB).",
3474
+ capabilities: ["fx-rates"],
3475
+ source: SOURCES.frankfurter,
3476
+ schema: z3.object({
3477
+ base: z3.string().length(3).default("USD").describe(
3478
+ 'Base currency (ISO 4217 code) each bar is quoted against, e.g. "USD".'
3479
+ ),
3480
+ symbols: z3.array(z3.string().length(3)).min(1).max(12).default(["EUR", "GBP", "JPY", "CHF", "CAD", "AUD"]).describe(
3481
+ 'Currencies to chart (ISO 4217 codes), e.g. ["EUR","GBP","JPY"]. A code equal to the base is skipped.'
3482
+ )
3483
+ })
3484
+ });
3485
+ var predictionMarketScatterMeta = defineFrameMeta({
3486
+ name: "prediction-market-scatter",
3487
+ label: "Prediction Market Scatter",
3488
+ category: "sentiment",
3489
+ iconUrl: widgetIcon("prediction-market-scatter"),
3490
+ layout: { w: 6, h: 4, minW: 4, minH: 3 },
3491
+ description: "Live Polymarket odds as a bubble scatter \u2014 each market's top-outcome probability on the x-axis, trailing-24h volume on a log y-axis, bubble size by volume. Surfaces high-conviction, high-volume markets versus thin long shots. The chart-first sibling of the Prediction Markets list. Keyless (Polymarket).",
3492
+ capabilities: ["prediction-markets"],
3493
+ source: SOURCES.polymarket,
3494
+ schema: z3.object({
3495
+ limit: z3.number().int().min(5).max(30).default(15).describe("How many markets (by volume) to plot.")
3496
+ })
3497
+ });
3498
+ var etfIssuerBarsMeta = defineFrameMeta({
3499
+ name: "etf-issuer-bars",
3500
+ label: "ETF Issuer Bars",
3501
+ category: "crypto",
3502
+ iconUrl: widgetIcon("etf-issuer-bars"),
3503
+ layout: { w: 4, h: 4, minW: 3, minH: 3 },
3504
+ description: "Spot BTC or ETH ETF issuers' daily net flow as a diverging bar chart \u2014 inflows right in green, outflows left in red, ranked by size. The chart-first sibling of the Spot ETF Flows list. Best-effort; may be empty if the source is unavailable. Keyless (SoSoValue).",
3505
+ capabilities: ["etf-flows"],
3506
+ source: SOURCES.sosovalue,
3507
+ schema: z3.object({
3508
+ asset: z3.enum(["btc", "eth"]).default("btc").describe("Which spot-ETF complex to chart."),
3509
+ limit: z3.number().int().min(3).max(15).default(10).describe("How many issuers (by |net flow|) to chart.")
3510
+ })
3511
+ });
3512
+ var portfolioMoversMeta = defineFrameMeta({
3513
+ name: "portfolio-movers",
3514
+ label: "Portfolio Movers",
3515
+ category: "portfolio",
3516
+ iconUrl: widgetIcon("portfolio-movers"),
3517
+ layout: { w: 4, h: 5, minW: 3, minH: 4 },
3518
+ description: "Your connected portfolio's holdings as a diverging bar chart of 24h price change \u2014 gainers right in green, losers left in red. Source is a connected Binance account (read-only key, in-app) or a public on-chain wallet address. Only holdings the source reports a 24h change for are shown \u2014 currently that's on-chain wallet holdings (priced via CoinGecko); a Binance-only portfolio will show its empty state until the account layer adds a price-change feed. Renders a connect prompt until a source is set.",
3519
+ capabilities: ["portfolio"],
3520
+ account: true,
3521
+ schema: z3.object({
3522
+ ...portfolioConfigShape,
3523
+ limit: z3.number().int().min(4).max(30).default(15).describe("How many holdings (by absolute 24h change) to chart.")
3524
+ })
3525
+ });
3526
+ var portfolioValueBarsMeta = defineFrameMeta({
3527
+ name: "portfolio-value-bars",
3528
+ label: "Portfolio Value Bars",
3529
+ category: "portfolio",
3530
+ iconUrl: widgetIcon("portfolio-value-bars"),
3531
+ layout: { w: 4, h: 5, minW: 3, minH: 4 },
3532
+ description: "Your connected portfolio's positions as a horizontal bar chart ranked by live USD value, largest first. The chart-first sibling of the Portfolio Holdings table. Source is a connected Binance account (read-only key, in-app) or a public on-chain wallet address. Renders a connect prompt until a source is set.",
3533
+ capabilities: ["portfolio", "quote-stream"],
3534
+ account: true,
3535
+ schema: z3.object({
3536
+ ...portfolioConfigShape,
3537
+ limit: z3.number().int().min(3).max(25).default(12).describe("How many holdings (by USD value, descending) to chart.")
3538
+ })
3539
+ });
3540
+ var etfFlowCalendarMeta = defineFrameMeta({
3541
+ name: "etf-flow-calendar",
3542
+ label: "ETF Flow Calendar",
3543
+ category: "crypto",
3544
+ iconUrl: widgetIcon("etf-flow-calendar"),
3545
+ layout: { w: 6, h: 5, minW: 4, minH: 3 },
3546
+ description: "Spot BTC or ETH ETF daily net flows as a GitHub-style calendar heatmap \u2014 one column per weekday, one row per week, green shades for inflow days and red for outflow days (intensity relative to the window). Surfaces weekly inflow/outflow rhythm the daily bar chart doesn't show at a glance. Keyless (SoSoValue); best-effort, may be empty if the source is unavailable.",
3547
+ capabilities: ["etf-flows"],
3548
+ source: SOURCES.sosovalue,
3549
+ schema: z3.object({
3550
+ asset: z3.enum(["btc", "eth"]).default("btc").describe("Which spot-ETF complex to chart."),
3551
+ lookback: z3.enum(["1M", "3M", "6M"]).default("3M").describe("History window for the calendar grid.")
3552
+ })
3553
+ });
3554
+ var predictionMarketsBubbleMeta = defineFrameMeta({
3555
+ name: "prediction-markets-bubble",
3556
+ label: "Prediction Markets Bubbles",
3557
+ category: "sentiment",
3558
+ iconUrl: widgetIcon("prediction-markets-bubble"),
3559
+ layout: { w: 6, h: 5, minW: 4, minH: 3 },
3560
+ description: "Live Polymarket odds as a floating bubble cloud \u2014 one bubble per open market, sized by 24h volume, tinted by how confident the leading outcome is (muted near a toss-up, vivid green near certain). The chart-first sibling of the Prediction Markets list. Keyless (Polymarket Gamma API).",
3561
+ capabilities: ["prediction-markets"],
3562
+ source: SOURCES.polymarket,
3563
+ schema: z3.object({
3564
+ limit: z3.number().int().min(3).max(20).default(10).describe("How many markets (by volume) to show.")
3565
+ })
3566
+ });
3567
+ var frameMetas = [
3568
+ customDataMeta,
3569
+ newsFeedMeta,
3570
+ portfolioValueMeta,
3571
+ portfolioAllocationMeta,
3572
+ portfolioHoldingsMeta,
3573
+ bitcoinDominanceMeta,
3574
+ clockMeta,
3575
+ dailyAnalysisMeta,
3576
+ dinoGameMeta,
3577
+ fearGreedMeta,
3578
+ filingsFeedMeta,
3579
+ fundamentalsMeta,
3580
+ financialStressMeta,
3581
+ laborMarketMeta,
3582
+ nationalDebtMeta,
3583
+ treasuryAuctionsMeta,
3584
+ fundingHeatmapMeta,
3585
+ fundingRateChartMeta,
3586
+ headingMeta,
3587
+ heroNumberMeta,
3588
+ imageMeta,
3589
+ imageGalleryMeta,
3590
+ inflationPulseMeta,
3591
+ marketHoursMeta,
3592
+ noteMeta,
3593
+ priceChartMeta,
3594
+ priceCompareMeta,
3595
+ priceLivelineMeta,
3596
+ priceTickerMeta,
3597
+ ratesBoardMeta,
3598
+ fxBoardMeta,
3599
+ shortVolumeMeta,
3600
+ topMoversMeta,
3601
+ tvlTreemapMeta,
3602
+ yieldCurveMeta,
3603
+ dexVolumeTreemapMeta,
3604
+ dexVolumeChartMeta,
3605
+ protocolTvlTreemapMeta,
3606
+ protocolTvlChartMeta,
3607
+ protocolFeesTreemapMeta,
3608
+ marketCapTreemapMeta,
3609
+ openInterestMeta,
3610
+ snakeMeta,
3611
+ flappyBirdMeta,
3612
+ videoMeta,
3613
+ drawdyMeta,
3614
+ countdownMeta,
3615
+ linkGridMeta,
3616
+ calculatorMeta,
3617
+ quoteMeta,
3618
+ dividerMeta,
3619
+ btcFeesMeta,
3620
+ btcMempoolMeta,
3621
+ btcBlocksMeta,
3622
+ btcHashrateMeta,
3623
+ btcDifficultyMeta,
3624
+ miningPoolsMeta,
3625
+ lightningStatsMeta,
3626
+ optionsPutCallMeta,
3627
+ optionsIvMeta,
3628
+ optionsOiStrikeMeta,
3629
+ coinMoversMeta,
3630
+ mvrvMeta,
3631
+ nuplMeta,
3632
+ soprMeta,
3633
+ puellMultipleMeta,
3634
+ mayerMultipleMeta,
3635
+ piCycleMeta,
3636
+ maMultiplierMeta,
3637
+ rsiMomentumMeta,
3638
+ volumeProfileMeta,
3639
+ dxyMeta,
3640
+ cycleSignalsMeta,
3641
+ stablecoinSupplyMeta,
3642
+ yieldScannerMeta,
3643
+ defiRevenueMeta,
3644
+ fundingComparisonMeta,
3645
+ ethSupplyMeta,
3646
+ ethStakingMeta,
3647
+ predictionMarketsMeta,
3648
+ etfFlowsMeta,
3649
+ trendingCoinsMeta,
3650
+ sectorPerformanceMeta,
3651
+ macroCalendarMeta,
3652
+ stablecoinChainsMeta,
3653
+ sectorTreemapMeta,
3654
+ etfFlowsChartMeta,
3655
+ realizedPriceMeta,
3656
+ reserveRiskMeta,
3657
+ nftCollectionsMeta,
3658
+ dexHotPoolsMeta,
3659
+ chainActivityMeta,
3660
+ nftTreemapMeta,
3661
+ dexPoolTreemapMeta,
3662
+ sectorBarsMeta,
3663
+ fundingBarsMeta,
3664
+ etfFlowBarsMeta,
3665
+ chainActivityBarsMeta,
3666
+ marketScatterMeta,
3667
+ marketBubblesMeta,
3668
+ tvlBubblesMeta,
3669
+ protocolTvlBubblesMeta,
3670
+ dexVolumeBubblesMeta,
3671
+ protocolFeesBubblesMeta,
3672
+ sectorBubblesMeta,
3673
+ nftBubblesMeta,
3674
+ dexPoolBubblesMeta,
3675
+ moversBubblesMeta,
3676
+ sentimentGaugeMeta,
3677
+ moversBarsMeta,
3678
+ tvlBarsMeta,
3679
+ yieldScatterMeta,
3680
+ nftScatterMeta,
3681
+ dominanceGaugeMeta,
3682
+ putCallGaugeMeta,
3683
+ oiTreemapMeta,
3684
+ ohlcvVolumeBarsMeta,
3685
+ fundingSpreadBarsMeta,
3686
+ fundingVenueHeatmapMeta,
3687
+ fundingCarryAreaMeta,
3688
+ volumeShareDonutMeta,
3689
+ volumeMoversScatterMeta,
3690
+ fundingLeaderboardBarsMeta,
3691
+ fundingCrowdingScatterMeta,
3692
+ liquidityBasisBarsMeta,
3693
+ coinMomentumHeatmapMeta,
3694
+ coinMomentumScatterMeta,
3695
+ trendingBarsMeta,
3696
+ nftActivityBarsMeta,
3697
+ dominanceBarsMeta,
3698
+ trendingBubblesMeta,
3699
+ yieldRiskPieMeta,
3700
+ dexPoolLiquidityScatterMeta,
3701
+ protocolFeesVsTvlScatterMeta,
3702
+ yieldCompositionScatterMeta,
3703
+ protocolTvlByCategoryMeta,
3704
+ protocolTvlShareAreaMeta,
3705
+ dexVolumeShareAreaMeta,
3706
+ yieldMomentumBarsMeta,
3707
+ btcDifficultyChartMeta,
3708
+ btcBlockSizeBarsMeta,
3709
+ chainPriceMoversMeta,
3710
+ chainActivityScatterMeta,
3711
+ mempoolFeeCurveMeta,
3712
+ miningPoolsShareMeta,
3713
+ optionsMaxPainMeta,
3714
+ optionsOiSkewMeta,
3715
+ optionsVolSpreadMeta,
3716
+ optionsFlowSkewMeta,
3717
+ optionsVolSmileMeta,
3718
+ optionsOiLadderHeatmapMeta,
3719
+ optionsMaxPainMultiMeta,
3720
+ mvrvZscoreChartMeta,
3721
+ nuplCycleChartMeta,
3722
+ cycleValuationCompositeMeta,
3723
+ onchainOscillatorOverlayMeta,
3724
+ ethIssuanceImpactMeta,
3725
+ treasuryAvgRateBarsMeta,
3726
+ treasuryAuctionDemandScatterMeta,
3727
+ treasuryAuctionSizeBarsMeta,
3728
+ nyfedReferenceRateBarsMeta,
3729
+ nyfedSofrTermAveragesBarsMeta,
3730
+ nyfedFedFundsBandGaugeMeta,
3731
+ treasuryDebtCompositionAreaMeta,
3732
+ ofrStressCategoryAreaMeta,
3733
+ miseryIndexMeta,
3734
+ realWagesMeta,
3735
+ laborForceFlowMeta,
3736
+ payrollsBarsMeta,
3737
+ shortVolumeBarsMeta,
3738
+ capitalStructureBarsMeta,
3739
+ filingsMixMeta,
3740
+ fxCrossHeatmapMeta,
3741
+ etfIssuerTreemapMeta,
3742
+ fxTrendChartMeta,
3743
+ fearGreedChartMeta,
3744
+ predictionMarketBarsMeta,
3745
+ dxyChartMeta,
3746
+ fxMoversBarsMeta,
3747
+ predictionMarketScatterMeta,
3748
+ etfIssuerBarsMeta,
3749
+ portfolioMoversMeta,
3750
+ portfolioValueBarsMeta,
3751
+ etfFlowCalendarMeta,
3752
+ predictionMarketsBubbleMeta
3753
+ ];
3754
+ var allFrameMetas = [
3755
+ ...frameMetas,
3756
+ breakevenMeta,
3757
+ breathingMeta,
3758
+ checklistMeta,
3759
+ dayMeterMeta,
3760
+ diceMeta,
3761
+ holidayCalendarMeta,
3762
+ journalLogMeta,
3763
+ journalOpenMeta,
3764
+ journalResultsMeta,
3765
+ journalScoreMeta,
3766
+ marqueeMeta,
3767
+ pomodoroMeta,
3768
+ returnsProjectorMeta,
3769
+ riskRewardMeta,
3770
+ rulesCardMeta,
3771
+ sessionProgressMeta,
3772
+ spotifyEmbedMeta,
3773
+ stopwatchMeta
3774
+ ];
3775
+
3776
+ // src/dashboards.ts
3777
+ import { existsSync } from "fs";
3778
+ function list() {
3779
+ const entries = listDashboards();
3780
+ if (entries.length === 0) {
3781
+ console.log(`no dashboards in your store yet (${dashboardsDir()})`);
3782
+ console.log(" create one: npx --yes zframes@latest init <name>");
3783
+ return 0;
3784
+ }
3785
+ console.log(`dashboards in ${dashboardsDir()}:`);
3786
+ for (const e of entries) {
3787
+ const mark = e.isDefault ? "*" : " ";
3788
+ const title = e.title ? ` \u2014 ${e.title}` : "";
3789
+ console.log(` ${mark} ${e.name}${title}`);
3790
+ }
3791
+ if (entries.some((e) => e.isDefault)) {
3792
+ console.log(
3793
+ "\n * = default (served when you run `zframes serve` with no name)"
3794
+ );
3795
+ } else {
3796
+ console.log("\n no default set \u2014 `zframes use <name>` to pick one.");
3797
+ }
3798
+ return 0;
3799
+ }
3800
+ function use(args) {
3801
+ const name = args.find((a) => !a.startsWith("-"));
3802
+ if (!name) {
3803
+ console.error("usage: zframes use <name>");
3804
+ return 1;
3805
+ }
3806
+ if (!isValidName(name)) {
3807
+ console.error(
3808
+ `\u2717 "${name}" is not a valid dashboard name (lowercase letters, digits, "-", "_")`
3809
+ );
3810
+ return 1;
3811
+ }
3812
+ if (!existsSync(dashboardPath(name))) {
3813
+ console.error(
3814
+ `\u2717 no dashboard named "${name}" in your store (${dashboardsDir()})`
3815
+ );
3816
+ console.error(
3817
+ ` create it with \`zframes init ${name}\`, or run \`zframes list\` to see what's there.`
3818
+ );
3819
+ return 1;
3820
+ }
3821
+ setDefault(name);
3822
+ console.log(`\u2713 default dashboard is now "${name}"`);
3823
+ return 0;
3824
+ }
3825
+
3826
+ // src/init.ts
3827
+ import { existsSync as existsSync2, mkdirSync as mkdirSync2, statSync as statSync2, writeFileSync as writeFileSync2 } from "fs";
3828
+ import { dirname, resolve as resolve2 } from "path";
3829
+
3830
+ // ../spec/src/presets.ts
3831
+ var SCENE_DEFAULT_PROJECT_ID = "YrTzGatwjK7EoFpCSfgZ";
3832
+
3833
+ // src/init.ts
3834
+ function parseArgs(args) {
3835
+ let target = "dashboard.json";
3836
+ let title = "my dashboard";
3837
+ let author = "";
3838
+ let force = false;
3839
+ let makeDefault = false;
3840
+ for (let i = 0; i < args.length; i++) {
3841
+ const a = args[i];
3842
+ if (a === "--title" || a === "-t") {
3843
+ title = args[++i] ?? "";
3844
+ } else if (a.startsWith("--title=")) {
3845
+ title = a.slice("--title=".length);
3846
+ } else if (a === "--author" || a === "-a") {
3847
+ author = args[++i] ?? "";
3848
+ } else if (a.startsWith("--author=")) {
3849
+ author = a.slice("--author=".length);
3850
+ } else if (a === "--force" || a === "-f") {
3851
+ force = true;
3852
+ } else if (a === "--default") {
3853
+ makeDefault = true;
3854
+ } else if (!a.startsWith("-")) {
3855
+ target = a;
3856
+ } else {
3857
+ return { error: `unknown option "${a}"` };
3858
+ }
3859
+ }
3860
+ if (!title.trim()) return { error: "--title cannot be empty" };
3861
+ return { target, title, author, force, makeDefault };
3862
+ }
3863
+ function resolveDest(target) {
3864
+ const c = classifyTarget(target, process.cwd());
2324
3865
  if ("error" in c) return c;
2325
3866
  if (c.kind === "store") return { dest: c.file, name: c.name };
2326
3867
  if (c.file.toLowerCase().endsWith(".json")) return { dest: c.file };
@@ -3980,6 +5521,11 @@ var VENUE_LABELS = {
3980
5521
  BybitPerp: "Bybit"
3981
5522
  };
3982
5523
  var dexOf = (symbol) => symbol.includes(":") ? symbol.split(":")[0] : "";
5524
+ function optNum(value) {
5525
+ if (value === void 0) return void 0;
5526
+ const n = Number(value);
5527
+ return Number.isFinite(n) ? n : void 0;
5528
+ }
3983
5529
  async function info(body) {
3984
5530
  return fetchJson(INFO_URL, void 0, {
3985
5531
  init: {
@@ -4114,11 +5660,24 @@ var HyperliquidProvider = class {
4114
5660
  const markPx = Number(ctx.markPx);
4115
5661
  const prevDayPx = Number(ctx.prevDayPx);
4116
5662
  if (!Number.isFinite(markPx) || !Number.isFinite(prevDayPx)) return;
4117
- out[asset.name] = {
5663
+ const stat = {
4118
5664
  markPx,
4119
5665
  prevDayPx,
4120
5666
  changePct: prevDayPx ? (markPx - prevDayPx) / prevDayPx * 100 : 0
4121
5667
  };
5668
+ const funding = optNum(ctx.funding);
5669
+ const dayNtlVlm = optNum(ctx.dayNtlVlm);
5670
+ const premium = optNum(ctx.premium);
5671
+ const oraclePx = optNum(ctx.oraclePx);
5672
+ const impactBid = ctx.impactPxs ? optNum(ctx.impactPxs[0]) : void 0;
5673
+ const impactAsk = ctx.impactPxs ? optNum(ctx.impactPxs[1]) : void 0;
5674
+ if (funding !== void 0) stat.funding = funding;
5675
+ if (dayNtlVlm !== void 0) stat.dayNtlVlm = dayNtlVlm;
5676
+ if (premium !== void 0) stat.premium = premium;
5677
+ if (oraclePx !== void 0) stat.oraclePx = oraclePx;
5678
+ if (impactBid !== void 0 && impactAsk !== void 0)
5679
+ stat.impactPxs = [impactBid, impactAsk];
5680
+ out[asset.name] = stat;
4122
5681
  });
4123
5682
  })
4124
5683
  );