kaleido-ui 0.2.1 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/README.md +37 -10
  2. package/dist/css/kaleido-ui.css +0 -4
  3. package/dist/icon-AvUL0Cws.d.cts +135 -0
  4. package/dist/icon-AvUL0Cws.d.ts +135 -0
  5. package/dist/native/index.cjs +0 -126
  6. package/dist/native/index.js +0 -126
  7. package/dist/web/assets/kaleidoswap-brand.js +11 -0
  8. package/dist/web/assets/protocol-icons.js +7 -0
  9. package/dist/web/chunk-25RRZDZ2.js +269 -0
  10. package/dist/web/chunk-27CY5EHL.js +230 -0
  11. package/dist/web/chunk-2GNXC446.js +84 -0
  12. package/dist/web/chunk-2NCH2ZDU.js +129 -0
  13. package/dist/web/chunk-2OGYEUYV.js +220 -0
  14. package/dist/web/chunk-2Q5SSNFO.js +63 -0
  15. package/dist/web/chunk-2REWXJEN.js +96 -0
  16. package/dist/web/chunk-2VAS6VYJ.js +106 -0
  17. package/dist/web/chunk-2VKFRAX3.js +39 -0
  18. package/dist/web/chunk-2Z6KFK4Z.js +41 -0
  19. package/dist/web/chunk-4246Y2F2.js +276 -0
  20. package/dist/web/chunk-4MLPMRXA.js +85 -0
  21. package/dist/web/chunk-4QLR4ZNK.js +383 -0
  22. package/dist/web/chunk-4UMKXXAK.js +33 -0
  23. package/dist/web/chunk-563GMWFT.js +32 -0
  24. package/dist/web/chunk-5BNDC7M4.js +50 -0
  25. package/dist/web/chunk-5GBURTY4.js +33 -0
  26. package/dist/web/chunk-5MM5YGGG.js +43 -0
  27. package/dist/web/chunk-5PZ2XVWL.js +85 -0
  28. package/dist/web/chunk-5V2KMO56.js +55 -0
  29. package/dist/web/chunk-5WBAFYPH.js +62 -0
  30. package/dist/web/chunk-62HIDJCD.js +98 -0
  31. package/dist/web/chunk-6IBQJIHT.js +56 -0
  32. package/dist/web/chunk-6PNGSAJB.js +55 -0
  33. package/dist/web/chunk-6VKWG5FJ.js +159 -0
  34. package/dist/web/chunk-76DAZT7Q.js +107 -0
  35. package/dist/web/chunk-7NS5S2PG.js +126 -0
  36. package/dist/web/chunk-7OE6AXLY.js +27 -0
  37. package/dist/web/chunk-7YUPXESC.js +666 -0
  38. package/dist/web/chunk-A3TKIXSI.js +197 -0
  39. package/dist/web/chunk-A3XHFJ6J.js +120 -0
  40. package/dist/web/chunk-A6MSV4MA.js +83 -0
  41. package/dist/web/chunk-A7MPRLJL.js +169 -0
  42. package/dist/web/chunk-AP7Q2FCS.js +43 -0
  43. package/dist/web/chunk-ASHU5XNR.js +21 -0
  44. package/dist/web/chunk-BGUBHWIO.js +41 -0
  45. package/dist/web/chunk-BY2KCPTX.js +444 -0
  46. package/dist/web/chunk-C7YIQDGQ.js +57 -0
  47. package/dist/web/chunk-CBE7BT3M.js +87 -0
  48. package/dist/web/chunk-CJATW6EO.js +108 -0
  49. package/dist/web/chunk-CRDCVB5X.js +96 -0
  50. package/dist/web/chunk-CRMLYZIX.js +35 -0
  51. package/dist/web/chunk-CXMCWSWC.js +20 -0
  52. package/dist/web/chunk-CZPNI33A.js +31 -0
  53. package/dist/web/chunk-DCUAE6PX.js +202 -0
  54. package/dist/web/chunk-DDMDRAD6.js +403 -0
  55. package/dist/web/chunk-DH7VXKGM.js +247 -0
  56. package/dist/web/chunk-DNHRMPKI.js +63 -0
  57. package/dist/web/chunk-DXFFYCU3.js +83 -0
  58. package/dist/web/chunk-EK5N3ZPW.js +417 -0
  59. package/dist/web/chunk-F2LIZX5K.js +140 -0
  60. package/dist/web/chunk-FSQV54O4.js +61 -0
  61. package/dist/web/chunk-FWOIRFV5.js +73 -0
  62. package/dist/web/chunk-G2MJL3VP.js +54 -0
  63. package/dist/web/chunk-G2ZYNR3W.js +28 -0
  64. package/dist/web/chunk-G373WZMN.js +150 -0
  65. package/dist/web/chunk-GMJGTSCQ.js +82 -0
  66. package/dist/web/chunk-GX7GBHJ6.js +362 -0
  67. package/dist/web/chunk-GZZ5KVON.js +70 -0
  68. package/dist/web/chunk-H3GYLFHP.js +30 -0
  69. package/dist/web/chunk-HDLOPDFX.js +89 -0
  70. package/dist/web/chunk-HP25HN7Q.js +69 -0
  71. package/dist/web/chunk-HVKSBEZN.js +98 -0
  72. package/dist/web/chunk-HWKXZNBN.js +74 -0
  73. package/dist/web/chunk-HY3VMT27.js +64 -0
  74. package/dist/web/chunk-IK32AIOS.js +27 -0
  75. package/dist/web/chunk-IMER4KGH.js +151 -0
  76. package/dist/web/chunk-IV6AAVUE.js +177 -0
  77. package/dist/web/chunk-JWMFTRDC.js +254 -0
  78. package/dist/web/chunk-JY3H7ZAI.js +41 -0
  79. package/dist/web/chunk-JY73M73T.js +175 -0
  80. package/dist/web/chunk-JYM5NHBA.js +80 -0
  81. package/dist/web/chunk-JZ3BUM5L.js +368 -0
  82. package/dist/web/chunk-KIMWCG5N.js +108 -0
  83. package/dist/web/chunk-L2UPQLY7.js +43 -0
  84. package/dist/web/chunk-LFAORJQK.js +81 -0
  85. package/dist/web/chunk-LOGZGZWN.js +1 -0
  86. package/dist/web/chunk-LPDB7EHH.js +65 -0
  87. package/dist/web/chunk-LSY4DY2I.js +72 -0
  88. package/dist/web/chunk-LYCLVP26.js +101 -0
  89. package/dist/web/chunk-LZ6PIXUO.js +43 -0
  90. package/dist/web/chunk-LZ723UCB.js +96 -0
  91. package/dist/web/chunk-M6RXTQEL.js +90 -0
  92. package/dist/web/chunk-MTQ22SKE.js +39 -0
  93. package/dist/web/chunk-MTQOAMDW.js +8 -0
  94. package/dist/web/chunk-NEXA6VGG.js +91 -0
  95. package/dist/web/chunk-NSA777UY.js +89 -0
  96. package/dist/web/chunk-O2TTO5FS.js +24 -0
  97. package/dist/web/chunk-O6NPTMDN.js +191 -0
  98. package/dist/web/chunk-OI7WX7NE.js +17 -0
  99. package/dist/web/chunk-OWSKP527.js +80 -0
  100. package/dist/web/chunk-OX3J3FYX.js +64 -0
  101. package/dist/web/chunk-PCKRLEAO.js +40 -0
  102. package/dist/web/chunk-PMGIJMRO.js +207 -0
  103. package/dist/web/chunk-PS7Q6MMU.js +60 -0
  104. package/dist/web/chunk-PTSOVDKH.js +169 -0
  105. package/dist/web/chunk-QBZSLR7U.js +54 -0
  106. package/dist/web/chunk-QCQRA6L5.js +63 -0
  107. package/dist/web/chunk-QFIGSIXA.js +558 -0
  108. package/dist/web/chunk-QRFFLA3N.js +84 -0
  109. package/dist/web/chunk-QXCCUYNY.js +232 -0
  110. package/dist/web/chunk-QXZ2WY3B.js +38 -0
  111. package/dist/web/chunk-R2MV4S4U.js +50 -0
  112. package/dist/web/chunk-R3IIXFGK.js +48 -0
  113. package/dist/web/chunk-RIOY4LFJ.js +141 -0
  114. package/dist/web/chunk-RV7Z3B3V.js +106 -0
  115. package/dist/web/chunk-RXXYUYBP.js +25 -0
  116. package/dist/web/chunk-S2ICIIH2.js +109 -0
  117. package/dist/web/chunk-SJNOBBU5.js +86 -0
  118. package/dist/web/chunk-STMNX3QT.js +109 -0
  119. package/dist/web/chunk-T7CEJV6P.js +66 -0
  120. package/dist/web/chunk-TBEKRQGW.js +99 -0
  121. package/dist/web/chunk-TCFHH5TE.js +179 -0
  122. package/dist/web/chunk-TI7NWMEQ.js +34 -0
  123. package/dist/web/chunk-TKRMGN7J.js +8 -0
  124. package/dist/web/chunk-TMK3SVYI.js +62 -0
  125. package/dist/web/chunk-TPGNO74K.js +67 -0
  126. package/dist/web/chunk-TS4UYWJJ.js +105 -0
  127. package/dist/web/chunk-TY6SGZC7.js +94 -0
  128. package/dist/web/chunk-UHXOPILM.js +101 -0
  129. package/dist/web/chunk-UK6ZL4MX.js +375 -0
  130. package/dist/web/chunk-UXLWWQ4J.js +20 -0
  131. package/dist/web/chunk-UZ4LWR4X.js +26 -0
  132. package/dist/web/chunk-VLZMX43R.js +45 -0
  133. package/dist/web/chunk-VM6AGMYO.js +46 -0
  134. package/dist/web/chunk-VUGV3ELU.js +176 -0
  135. package/dist/web/chunk-VYQHGSK6.js +244 -0
  136. package/dist/web/chunk-VZF5C3C6.js +146 -0
  137. package/dist/web/chunk-W4E2N3UN.js +58 -0
  138. package/dist/web/chunk-WEPSTI3Z.js +83 -0
  139. package/dist/web/chunk-WOAWUXER.js +139 -0
  140. package/dist/web/chunk-WURSWAKE.js +74 -0
  141. package/dist/web/chunk-WWF7IJBF.js +330 -0
  142. package/dist/web/chunk-X2RA4EG3.js +86 -0
  143. package/dist/web/chunk-XCQGJYGF.js +42 -0
  144. package/dist/web/chunk-XDSOOOYL.js +35 -0
  145. package/dist/web/chunk-XPHFJPUQ.js +291 -0
  146. package/dist/web/chunk-XXH4TYKZ.js +276 -0
  147. package/dist/web/chunk-XZQUQOR3.js +48 -0
  148. package/dist/web/chunk-Y3W6LOOE.js +66 -0
  149. package/dist/web/chunk-YNB4SSLD.js +113 -0
  150. package/dist/web/chunk-YQDCU7ZL.js +49 -0
  151. package/dist/web/chunk-YQQ7GDLZ.js +30 -0
  152. package/dist/web/chunk-YTXWYWVD.js +70 -0
  153. package/dist/web/chunk-YXVOFEDT.js +85 -0
  154. package/dist/web/chunk-Z2SS7UJ4.js +139 -0
  155. package/dist/web/chunk-Z5LVT3BD.js +128 -0
  156. package/dist/web/chunk-Z5O67WTL.js +85 -0
  157. package/dist/web/chunk-ZPNGHBKB.js +86 -0
  158. package/dist/web/chunk-ZR32WYJA.js +55 -0
  159. package/dist/web/chunk-ZRIBB4EB.js +62 -0
  160. package/dist/web/chunk-ZTVV4KBT.js +28 -0
  161. package/dist/web/chunk-ZXCT3Y6P.js +56 -0
  162. package/dist/web/components/account-capabilities-card.js +21 -0
  163. package/dist/web/components/account-menu.js +18 -0
  164. package/dist/web/components/account-settings-shared.js +50 -0
  165. package/dist/web/components/account-status-tabs.js +20 -0
  166. package/dist/web/components/action-tile.js +8 -0
  167. package/dist/web/components/activity-detail-row.js +22 -0
  168. package/dist/web/components/activity-filter-bar.js +22 -0
  169. package/dist/web/components/activity-list.js +23 -0
  170. package/dist/web/components/activity-network-filters.js +19 -0
  171. package/dist/web/components/activity-row.js +15 -0
  172. package/dist/web/components/activity-type-tabs.js +17 -0
  173. package/dist/web/components/alert-banner.js +13 -0
  174. package/dist/web/components/amount.js +8 -0
  175. package/dist/web/components/app-icon.js +15 -0
  176. package/dist/web/components/asset-card.js +21 -0
  177. package/dist/web/components/asset-icon.js +10 -0
  178. package/dist/web/components/asset-selector.js +24 -0
  179. package/dist/web/components/balance-breakdown.js +18 -0
  180. package/dist/web/components/basic-collapsible.js +11 -0
  181. package/dist/web/components/bottom-nav.js +13 -0
  182. package/dist/web/components/bottom-sheet.js +15 -0
  183. package/dist/web/components/btc-unified-receive.js +28 -0
  184. package/dist/web/components/charts/bar-chart.js +24 -0
  185. package/dist/web/components/charts/bar-list.js +24 -0
  186. package/dist/web/components/charts/core.js +63 -0
  187. package/dist/web/components/charts/donut-chart.js +26 -0
  188. package/dist/web/components/charts/index.js +72 -0
  189. package/dist/web/components/charts/line-chart.js +26 -0
  190. package/dist/web/components/charts/meter.js +24 -0
  191. package/dist/web/components/charts/mixed-chart.js +24 -0
  192. package/dist/web/components/charts/scatter-chart.js +24 -0
  193. package/dist/web/components/charts/sparkline.js +8 -0
  194. package/dist/web/components/choice-group.js +11 -0
  195. package/dist/web/components/code-block.js +21 -0
  196. package/dist/web/components/confirm-dialog.js +15 -0
  197. package/dist/web/components/copy-button.js +21 -0
  198. package/dist/web/components/copyable.js +20 -0
  199. package/dist/web/components/date-range-filter.js +16 -0
  200. package/dist/web/components/deposit-asset-selection.js +24 -0
  201. package/dist/web/components/deposit-generated-view.js +23 -0
  202. package/dist/web/components/deposit-invoice-generation.js +35 -0
  203. package/dist/web/components/deposit-network-default-modal.js +13 -0
  204. package/dist/web/components/deposit-pre-generation.js +17 -0
  205. package/dist/web/components/deposit-success-screen.js +20 -0
  206. package/dist/web/components/deposit-ui-shared.js +28 -0
  207. package/dist/web/components/disclosure-card.js +11 -0
  208. package/dist/web/components/dotted-leader.js +8 -0
  209. package/dist/web/components/empty-state.js +8 -0
  210. package/dist/web/components/environment-indicator.js +9 -0
  211. package/dist/web/components/error-boundary.js +10 -0
  212. package/dist/web/components/event-timeline.js +8 -0
  213. package/dist/web/components/extension-page-frame.js +15 -0
  214. package/dist/web/components/filter-bar.js +15 -0
  215. package/dist/web/components/filter-chip-group.js +8 -0
  216. package/dist/web/components/filter-dropdown.js +12 -0
  217. package/dist/web/components/floating-notice.js +12 -0
  218. package/dist/web/components/form-field.js +10 -0
  219. package/dist/web/components/halo-backdrop.js +8 -0
  220. package/dist/web/components/info-chip.js +24 -0
  221. package/dist/web/components/info-panel.js +13 -0
  222. package/dist/web/components/inline-selector.js +11 -0
  223. package/dist/web/components/instants-statement.js +20 -0
  224. package/dist/web/components/kaleidoscope-hero-animation.js +11 -0
  225. package/dist/web/components/kaleidoswap-logo.js +12 -0
  226. package/dist/web/components/list-field.js +14 -0
  227. package/dist/web/components/list-summary.js +8 -0
  228. package/dist/web/components/metric-card.js +14 -0
  229. package/dist/web/components/mobile-hero-animation.js +8 -0
  230. package/dist/web/components/network-badge.js +14 -0
  231. package/dist/web/components/network-icon.js +21 -0
  232. package/dist/web/components/network-status-chip.js +11 -0
  233. package/dist/web/components/notice-bar.js +8 -0
  234. package/dist/web/components/one-time-secret-dialog.js +18 -0
  235. package/dist/web/components/option-selector.js +12 -0
  236. package/dist/web/components/page-header.js +12 -0
  237. package/dist/web/components/page-shell.js +18 -0
  238. package/dist/web/components/pager.js +11 -0
  239. package/dist/web/components/period-select.js +20 -0
  240. package/dist/web/components/qr-code.js +10 -0
  241. package/dist/web/components/query-state.js +19 -0
  242. package/dist/web/components/read-status.js +15 -0
  243. package/dist/web/components/record-list.js +17 -0
  244. package/dist/web/components/recovery-phrase-card.js +20 -0
  245. package/dist/web/components/restricted.js +9 -0
  246. package/dist/web/components/secret-reveal-card.js +20 -0
  247. package/dist/web/components/section-header.js +9 -0
  248. package/dist/web/components/section-label.js +8 -0
  249. package/dist/web/components/selectable-card.js +8 -0
  250. package/dist/web/components/setting-item.js +13 -0
  251. package/dist/web/components/settings-section-card.js +11 -0
  252. package/dist/web/components/settings-selector-row.js +8 -0
  253. package/dist/web/components/settings-tile.js +21 -0
  254. package/dist/web/components/skeleton.js +10 -0
  255. package/dist/web/components/status-badge.js +13 -0
  256. package/dist/web/components/status-icon-badge.js +15 -0
  257. package/dist/web/components/stepper-number-input.js +10 -0
  258. package/dist/web/components/summary-rows.js +9 -0
  259. package/dist/web/components/swap-badge.js +11 -0
  260. package/dist/web/components/swap-input-card.js +28 -0
  261. package/dist/web/components/swap-step-list.js +10 -0
  262. package/dist/web/components/switch-row.js +9 -0
  263. package/dist/web/components/theme-toggle.js +12 -0
  264. package/dist/web/components/transaction-card.js +14 -0
  265. package/dist/web/components/trend-chart.js +28 -0
  266. package/dist/web/components/value-list.js +20 -0
  267. package/dist/web/components/wallet-asset-list.js +22 -0
  268. package/dist/web/components/withdraw-amount-input.js +13 -0
  269. package/dist/web/components/withdraw-confirmation.js +17 -0
  270. package/dist/web/components/withdraw-destination-input.js +14 -0
  271. package/dist/web/components/withdraw-invoice-info.js +10 -0
  272. package/dist/web/components/withdraw-route-selector.js +9 -0
  273. package/dist/web/components/withdraw-success.js +12 -0
  274. package/dist/web/hooks/use-asset-icon.js +11 -0
  275. package/dist/web/hooks/use-copy-to-clipboard.js +7 -0
  276. package/dist/web/hooks/use-media-query.js +9 -0
  277. package/dist/web/hooks/use-theme-mode.js +9 -0
  278. package/dist/web/hooks/use-toast.js +11 -0
  279. package/dist/web/icons/filled.js +15 -0
  280. package/dist/web/icons/index.js +13 -0
  281. package/dist/web/icons/outlined.js +221 -0
  282. package/dist/web/icons/public.js +248 -0
  283. package/dist/web/icons.cjs +776 -0
  284. package/dist/web/icons.d.cts +123 -0
  285. package/dist/web/icons.d.ts +123 -0
  286. package/dist/web/index.cjs +3447 -2567
  287. package/dist/web/index.d.cts +507 -113
  288. package/dist/web/index.d.ts +507 -113
  289. package/dist/web/index.js +612 -13675
  290. package/dist/web/primitives/avatar.js +10 -0
  291. package/dist/web/primitives/button.js +10 -0
  292. package/dist/web/primitives/card.js +20 -0
  293. package/dist/web/primitives/collapsible.js +16 -0
  294. package/dist/web/primitives/dialog.js +30 -0
  295. package/dist/web/primitives/dot-pagination.js +8 -0
  296. package/dist/web/primitives/drawer.js +43 -0
  297. package/dist/web/primitives/dropdown-menu.js +28 -0
  298. package/dist/web/primitives/glyph-button.js +10 -0
  299. package/dist/web/primitives/icon-button.js +15 -0
  300. package/dist/web/primitives/icon-glyph.js +8 -0
  301. package/dist/web/primitives/icon.js +16 -0
  302. package/dist/web/primitives/input.js +9 -0
  303. package/dist/web/primitives/label.js +9 -0
  304. package/dist/web/primitives/menu-search.js +20 -0
  305. package/dist/web/primitives/number-input.js +11 -0
  306. package/dist/web/primitives/popover.js +18 -0
  307. package/dist/web/primitives/scroll-area.js +12 -0
  308. package/dist/web/primitives/select.js +27 -0
  309. package/dist/web/primitives/switch.js +8 -0
  310. package/dist/web/primitives/table.js +27 -0
  311. package/dist/web/primitives/tabs.js +14 -0
  312. package/dist/web/primitives/toast.js +24 -0
  313. package/dist/web/primitives/toaster.js +15 -0
  314. package/dist/web/primitives/tooltip.js +10 -0
  315. package/dist/web/utils/amount-display.js +13 -0
  316. package/dist/web/utils/cn.js +7 -0
  317. package/dist/web/utils/field-styles.js +7 -0
  318. package/dist/web/utils/type-roles.js +7 -0
  319. package/package.json +9 -1
@@ -0,0 +1,232 @@
1
+ "use client";
2
+ import {
3
+ ChartFrame,
4
+ ChartLegend,
5
+ ChartTooltip,
6
+ TICK_FONT,
7
+ axisTextWidth,
8
+ chartLabelIndices,
9
+ chartValueTicks,
10
+ defaultChartFormat,
11
+ nextActiveIndex,
12
+ plotClass,
13
+ seriesColor,
14
+ tooltipText,
15
+ useChartWidth,
16
+ useSeriesVisibility
17
+ } from "./chunk-EK5N3ZPW.js";
18
+ import {
19
+ cn
20
+ } from "./chunk-PMGIJMRO.js";
21
+
22
+ // src/web/components/charts/line-chart.tsx
23
+ import { useId, useState } from "react";
24
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
25
+ var MARGIN = { top: 12, right: 16, bottom: 26, left: 8 };
26
+ function LineChart({
27
+ data,
28
+ series: allSeries,
29
+ label,
30
+ scaleLabel,
31
+ area = false,
32
+ integer = false,
33
+ formatValue = defaultChartFormat,
34
+ height = 240,
35
+ empty,
36
+ className,
37
+ ...head
38
+ }) {
39
+ const [containerRef, width] = useChartWidth();
40
+ const [active, setActive] = useState(null);
41
+ const idBase = `line-${useId().replace(/[^a-zA-Z0-9_-]/g, "")}`;
42
+ const visibility = useSeriesVisibility(allSeries.map((s) => s.id));
43
+ const series = allSeries.filter((s) => visibility.isVisible(s.id));
44
+ const slotOf = (id) => allSeries.findIndex((s) => s.id === id);
45
+ const count = data.length;
46
+ if (count === 0 || series.length === 0) return /* @__PURE__ */ jsx(Fragment, { children: empty ?? null });
47
+ const max = Math.max(0, ...data.flatMap((d) => series.map((s) => d.values[s.id] ?? 0)));
48
+ const ticks = chartValueTicks(max, { integer });
49
+ const tickLabels = ticks.map(formatValue);
50
+ const plotLeft = MARGIN.left + axisTextWidth(tickLabels) + 8;
51
+ const plotRight = width - MARGIN.right;
52
+ const plotTop = MARGIN.top;
53
+ const plotBottom = height - MARGIN.bottom;
54
+ const plotWidth = Math.max(1, plotRight - plotLeft);
55
+ const plotHeight = Math.max(1, plotBottom - plotTop);
56
+ const top = max > 0 ? max : 1;
57
+ const x = (index) => count === 1 ? plotLeft + plotWidth / 2 : plotLeft + index / (count - 1) * plotWidth;
58
+ const y = (value) => plotBottom - Math.max(0, value) / top * plotHeight;
59
+ const labelIndices = chartLabelIndices(count, plotWidth / 72);
60
+ const showArea = area && series.length === 1;
61
+ const pathFor = (id) => data.map((d, index) => `${index === 0 ? "M" : "L"}${x(index).toFixed(2)},${y(d.values[id] ?? 0).toFixed(2)}`).join("");
62
+ const rowsAt = (index) => series.map((s, slot) => ({
63
+ id: s.id,
64
+ label: s.label,
65
+ value: formatValue(data[index].values[s.id] ?? 0),
66
+ color: seriesColor(slotOf(s.id))
67
+ }));
68
+ const onPointerMove = (event) => {
69
+ const box = event.currentTarget.getBoundingClientRect();
70
+ const px = (event.clientX - box.left) / box.width * width;
71
+ const ratio = count === 1 ? 0 : (px - plotLeft) / plotWidth;
72
+ setActive(Math.max(0, Math.min(count - 1, Math.round(ratio * (count - 1)))));
73
+ };
74
+ const onKeyDown = (event) => {
75
+ if (nextActiveIndex(event.key, active, count) === void 0) return;
76
+ event.preventDefault();
77
+ setActive((current) => {
78
+ const next = nextActiveIndex(event.key, current, count);
79
+ return next === void 0 ? current : next;
80
+ });
81
+ };
82
+ const activeDatum = active === null ? null : data[active];
83
+ return /* @__PURE__ */ jsx(
84
+ ChartFrame,
85
+ {
86
+ ...head,
87
+ label,
88
+ className,
89
+ scale: `${scaleLabel} \xB7 linear, from 0`,
90
+ legend: allSeries.length > 1 ? /* @__PURE__ */ jsx(
91
+ ChartLegend,
92
+ {
93
+ keyShape: "line",
94
+ items: allSeries.map((s, slot) => ({ id: s.id, label: s.label, color: seriesColor(slot) })),
95
+ ...visibility.legend
96
+ }
97
+ ) : void 0,
98
+ table: {
99
+ columns: ["Period", ...series.map((s) => s.label)],
100
+ rows: data.map((d) => [d.detail ?? d.label, ...series.map((s) => formatValue(d.values[s.id] ?? 0))])
101
+ },
102
+ announcement: activeDatum ? tooltipText(activeDatum.detail ?? activeDatum.label, rowsAt(active)) : void 0,
103
+ children: /* @__PURE__ */ jsxs(
104
+ "div",
105
+ {
106
+ ref: containerRef,
107
+ role: "group",
108
+ "aria-roledescription": "chart",
109
+ "aria-label": `${label}: ${count} points. Arrow keys move between them.`,
110
+ tabIndex: 0,
111
+ onKeyDown,
112
+ onBlur: () => setActive(null),
113
+ className: plotClass,
114
+ children: [
115
+ /* @__PURE__ */ jsxs(
116
+ "svg",
117
+ {
118
+ width: "100%",
119
+ height,
120
+ viewBox: `0 0 ${width} ${height}`,
121
+ className: "block overflow-visible",
122
+ "aria-hidden": "true",
123
+ onPointerMove,
124
+ onPointerLeave: () => setActive(null),
125
+ children: [
126
+ showArea && /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("linearGradient", { id: `${idBase}-wash`, x1: "0", x2: "0", y1: "0", y2: "1", children: [
127
+ /* @__PURE__ */ jsx("stop", { offset: "0", stopColor: seriesColor(0), stopOpacity: "0.14" }),
128
+ /* @__PURE__ */ jsx("stop", { offset: "1", stopColor: seriesColor(0), stopOpacity: "0.04" })
129
+ ] }) }),
130
+ /* @__PURE__ */ jsx("g", { "data-slot": "chart-y-axis", children: ticks.map((tick, index) => /* @__PURE__ */ jsxs("g", { children: [
131
+ /* @__PURE__ */ jsx("line", { x1: plotLeft, x2: plotRight, y1: y(tick), y2: y(tick), stroke: "var(--border)" }),
132
+ /* @__PURE__ */ jsx(
133
+ "text",
134
+ {
135
+ x: plotLeft - 8,
136
+ y: y(tick),
137
+ dy: "0.32em",
138
+ textAnchor: "end",
139
+ fontSize: TICK_FONT,
140
+ fill: "var(--muted-foreground)",
141
+ style: { fontVariantNumeric: "tabular-nums" },
142
+ children: tickLabels[index]
143
+ }
144
+ )
145
+ ] }, tick)) }),
146
+ showArea && /* @__PURE__ */ jsx(
147
+ "path",
148
+ {
149
+ "data-slot": "chart-area",
150
+ d: `${pathFor(series[0].id)}L${x(count - 1)},${plotBottom}L${x(0)},${plotBottom}Z`,
151
+ fill: `url(#${idBase}-wash)`
152
+ }
153
+ ),
154
+ /* @__PURE__ */ jsx("g", { "data-slot": "chart-lines", children: series.map((s, slot) => /* @__PURE__ */ jsx(
155
+ "path",
156
+ {
157
+ "data-series": s.id,
158
+ d: pathFor(s.id),
159
+ fill: "none",
160
+ stroke: seriesColor(slotOf(s.id)),
161
+ strokeWidth: 2,
162
+ strokeLinejoin: "round",
163
+ strokeLinecap: "round"
164
+ },
165
+ s.id
166
+ )) }),
167
+ /* @__PURE__ */ jsx("g", { "data-slot": "chart-end-markers", children: series.map((s, slot) => /* @__PURE__ */ jsx(
168
+ "circle",
169
+ {
170
+ cx: x(count - 1),
171
+ cy: y(data[count - 1].values[s.id] ?? 0),
172
+ r: 4,
173
+ fill: seriesColor(slotOf(s.id)),
174
+ stroke: "var(--card)",
175
+ strokeWidth: 2
176
+ },
177
+ s.id
178
+ )) }),
179
+ active !== null && /* @__PURE__ */ jsxs("g", { "data-slot": "chart-crosshair", children: [
180
+ /* @__PURE__ */ jsx("line", { x1: x(active), x2: x(active), y1: plotTop, y2: plotBottom, stroke: "var(--muted-foreground)", strokeWidth: 1 }),
181
+ series.map((s, slot) => /* @__PURE__ */ jsx(
182
+ "circle",
183
+ {
184
+ cx: x(active),
185
+ cy: y(data[active].values[s.id] ?? 0),
186
+ r: 4,
187
+ fill: seriesColor(slotOf(s.id)),
188
+ stroke: "var(--card)",
189
+ strokeWidth: 2
190
+ },
191
+ s.id
192
+ ))
193
+ ] }),
194
+ /* @__PURE__ */ jsx("g", { "data-slot": "chart-x-axis", children: labelIndices.map((index) => /* @__PURE__ */ jsx(
195
+ "text",
196
+ {
197
+ x: x(index),
198
+ y: plotBottom + 18,
199
+ textAnchor: index === 0 && count > 1 ? "start" : index === count - 1 && count > 1 ? "end" : "middle",
200
+ fontSize: TICK_FONT,
201
+ fill: "var(--muted-foreground)",
202
+ children: data[index].label
203
+ },
204
+ data[index].key
205
+ )) })
206
+ ]
207
+ }
208
+ ),
209
+ activeDatum && /* @__PURE__ */ jsx(
210
+ ChartTooltip,
211
+ {
212
+ title: activeDatum.detail ?? activeDatum.label,
213
+ rows: rowsAt(active),
214
+ x: x(active) * (containerRef.current ? containerRef.current.clientWidth / width : 1),
215
+ y: plotTop,
216
+ width: containerRef.current?.clientWidth ?? width
217
+ }
218
+ )
219
+ ]
220
+ }
221
+ )
222
+ }
223
+ );
224
+ }
225
+ function AreaChart(props) {
226
+ return /* @__PURE__ */ jsx(LineChart, { ...props, area: true, className: cn(props.className) });
227
+ }
228
+
229
+ export {
230
+ LineChart,
231
+ AreaChart
232
+ };
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import {
3
+ Switch
4
+ } from "./chunk-QRFFLA3N.js";
5
+ import {
6
+ cn
7
+ } from "./chunk-PMGIJMRO.js";
8
+
9
+ // src/web/components/switch-row.tsx
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ function SwitchRow({
12
+ label,
13
+ description,
14
+ checked,
15
+ disabled,
16
+ onCheckedChange,
17
+ className
18
+ }) {
19
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex items-start justify-between gap-3 rounded-xl bg-muted/40 p-3 shadow-raised transition-colors hover-gradient-violet", className), children: [
20
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
21
+ /* @__PURE__ */ jsx("p", { className: "text-body font-medium text-foreground", children: label }),
22
+ description && /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-caption leading-snug text-muted-foreground", children: description })
23
+ ] }),
24
+ /* @__PURE__ */ jsx(
25
+ Switch,
26
+ {
27
+ checked,
28
+ disabled,
29
+ onCheckedChange,
30
+ "aria-label": label
31
+ }
32
+ )
33
+ ] });
34
+ }
35
+
36
+ export {
37
+ SwitchRow
38
+ };
@@ -0,0 +1,50 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-PMGIJMRO.js";
5
+
6
+ // src/web/components/notice-bar.tsx
7
+ import { useEffect, useLayoutEffect, useRef } from "react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ var useIsomorphicLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
10
+ function NoticeBar({ children, hidden = false, heightVariable = "--kui-notice-height", className }) {
11
+ const ref = useRef(null);
12
+ useIsomorphicLayoutEffect(() => {
13
+ const element = ref.current;
14
+ const root = typeof document === "undefined" ? null : document.documentElement;
15
+ if (!root) return;
16
+ if (hidden || !element) {
17
+ root.style.removeProperty(heightVariable);
18
+ return;
19
+ }
20
+ const publish = () => root.style.setProperty(heightVariable, `${Math.round(element.getBoundingClientRect().height)}px`);
21
+ publish();
22
+ let cleanup;
23
+ if (typeof ResizeObserver !== "undefined") {
24
+ const observer = new ResizeObserver(publish);
25
+ observer.observe(element);
26
+ cleanup = () => observer.disconnect();
27
+ } else {
28
+ window.addEventListener("resize", publish);
29
+ cleanup = () => window.removeEventListener("resize", publish);
30
+ }
31
+ return () => {
32
+ cleanup();
33
+ root.style.removeProperty(heightVariable);
34
+ };
35
+ }, [hidden, heightVariable]);
36
+ if (hidden) return null;
37
+ return /* @__PURE__ */ jsx(
38
+ "div",
39
+ {
40
+ ref,
41
+ "data-slot": "notice-bar",
42
+ className: cn("fixed inset-x-0 top-0 z-[var(--z-popover)] bg-background/90 bg-gradient-card px-4 py-2 shadow-raised backdrop-blur-xl backdrop-saturate-150", className),
43
+ children
44
+ }
45
+ );
46
+ }
47
+
48
+ export {
49
+ NoticeBar
50
+ };
@@ -0,0 +1,48 @@
1
+ "use client";
2
+ import {
3
+ TabsList,
4
+ TabsTrigger
5
+ } from "./chunk-ZR32WYJA.js";
6
+ import {
7
+ AppIcon
8
+ } from "./chunk-PS7Q6MMU.js";
9
+
10
+ // src/web/components/activity-type-tabs.tsx
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ function ActivityTypeTabs({ counts = {} }) {
13
+ const actions = [
14
+ { value: "all", label: "All" },
15
+ { value: "received", label: "In", icon: "receive", actionIcon: "call_received" },
16
+ { value: "sent", label: "Out", icon: "send", actionIcon: "arrow_outward" },
17
+ { value: "swaps", label: "Swap", icon: "swap", actionIcon: "swap_horiz" }
18
+ ];
19
+ return /* @__PURE__ */ jsx(TabsList, { className: "grid h-12 w-full grid-cols-4 gap-1 rounded-2xl bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card p-1 shadow-card", children: actions.map((action) => /* @__PURE__ */ jsxs(
20
+ TabsTrigger,
21
+ {
22
+ value: action.value,
23
+ "data-action-icon": action.actionIcon,
24
+ className: "group h-full rounded-xl px-1.5 text-caption font-bold tracking-wide text-muted-foreground transition-all hover-gradient-violet hover:text-secondary-content data-[state=active]:bg-primary active-gradient-primary data-[state=active]:text-primary-foreground data-[state=active]:shadow-button-primary data-[state=active]:hover:bg-primary data-[state=active]:hover:text-primary-foreground",
25
+ children: [
26
+ action.icon && /* @__PURE__ */ jsx(
27
+ AppIcon,
28
+ {
29
+ name: action.icon,
30
+ size: "sm",
31
+ className: "mr-1 shrink-0 leading-none text-muted-foreground transition-colors group-hover:text-secondary-content group-data-[state=active]:text-primary-foreground"
32
+ }
33
+ ),
34
+ /* @__PURE__ */ jsx("span", { children: action.label }),
35
+ action.value === "all" && counts.all ? /* @__PURE__ */ jsxs("span", { className: "ml-1", children: [
36
+ "(",
37
+ counts.all,
38
+ ")"
39
+ ] }) : null
40
+ ]
41
+ },
42
+ action.value
43
+ )) });
44
+ }
45
+
46
+ export {
47
+ ActivityTypeTabs
48
+ };
@@ -0,0 +1,141 @@
1
+ "use client";
2
+ import {
3
+ Icon
4
+ } from "./chunk-A6MSV4MA.js";
5
+ import {
6
+ cn
7
+ } from "./chunk-PMGIJMRO.js";
8
+
9
+ // src/web/components/bottom-nav.tsx
10
+ import { useLayoutEffect, useRef } from "react";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ function BottomNav({
13
+ activeView,
14
+ items,
15
+ onChange,
16
+ position = "fixed",
17
+ className
18
+ }) {
19
+ const trackRef = useRef(null);
20
+ const blobRef = useRef(null);
21
+ const buttonRefs = useRef(/* @__PURE__ */ new Map());
22
+ const placed = useRef(null);
23
+ useLayoutEffect(() => {
24
+ const blob = blobRef.current;
25
+ const button = activeView !== void 0 ? buttonRefs.current.get(activeView) : void 0;
26
+ if (!blob) return;
27
+ if (!button) {
28
+ blob.style.opacity = "0";
29
+ placed.current = null;
30
+ return;
31
+ }
32
+ const to = { x: button.offsetLeft, w: button.offsetWidth };
33
+ const from = placed.current;
34
+ blob.style.opacity = "1";
35
+ blob.style.width = `${to.w}px`;
36
+ blob.style.transform = `translateX(${to.x}px)`;
37
+ placed.current = to;
38
+ const reduce = window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
39
+ if (!from || reduce || from.x === to.x && from.w === to.w) return;
40
+ if (typeof blob.animate !== "function") return;
41
+ const frame = (center, width, scaleY = 1) => `translateX(${center - width / 2}px) scaleY(${scaleY})`;
42
+ const fromC = from.x + from.w / 2;
43
+ const toC = to.x + to.w / 2;
44
+ const midC = (fromC + toC) / 2;
45
+ const pinched = Math.min(from.w, to.w) * 0.68;
46
+ const swollen = to.w * 1.08;
47
+ blob.animate(
48
+ [
49
+ { transform: frame(fromC, from.w), width: `${from.w}px`, offset: 0 },
50
+ { transform: frame(midC, pinched, 0.72), width: `${pinched}px`, offset: 0.45, easing: "cubic-bezier(0.2, 0.8, 0.3, 1)" },
51
+ { transform: frame(toC, swollen, 1.04), width: `${swollen}px`, offset: 0.78, easing: "ease-out" },
52
+ { transform: frame(toC, to.w), width: `${to.w}px`, offset: 1 }
53
+ ],
54
+ { duration: 560, easing: "cubic-bezier(0.45, 0, 0.25, 1)" }
55
+ );
56
+ }, [activeView, items.length]);
57
+ useLayoutEffect(() => {
58
+ const track = trackRef.current;
59
+ if (!track || typeof ResizeObserver === "undefined") return;
60
+ const observer = new ResizeObserver(() => {
61
+ const blob = blobRef.current;
62
+ const button = activeView !== void 0 ? buttonRefs.current.get(activeView) : void 0;
63
+ if (!blob || !button) return;
64
+ blob.style.width = `${button.offsetWidth}px`;
65
+ blob.style.transform = `translateX(${button.offsetLeft}px)`;
66
+ placed.current = { x: button.offsetLeft, w: button.offsetWidth };
67
+ });
68
+ observer.observe(track);
69
+ return () => observer.disconnect();
70
+ }, [activeView]);
71
+ return /* @__PURE__ */ jsx(
72
+ "nav",
73
+ {
74
+ className: cn(
75
+ "w-[90%] max-w-[21.25rem] rounded-full bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card shadow-card-secondary",
76
+ position === "fixed" ? "fixed bottom-6 left-1/2 z-[var(--z-nav)] -translate-x-1/2" : "relative",
77
+ className
78
+ ),
79
+ children: /* @__PURE__ */ jsxs("div", { ref: trackRef, className: "relative flex items-center justify-around px-0 py-2", children: [
80
+ /* @__PURE__ */ jsx(
81
+ "span",
82
+ {
83
+ ref: blobRef,
84
+ "aria-hidden": true,
85
+ className: "pointer-events-none absolute left-0 top-2 h-[3.25rem] rounded-full bg-primary bg-gradient-primary opacity-0 shadow-button-primary"
86
+ }
87
+ ),
88
+ items.map(({ id, label, icon, iconName, testId }) => {
89
+ const isActive = activeView === id;
90
+ return /* @__PURE__ */ jsxs(
91
+ "button",
92
+ {
93
+ ref: (node) => {
94
+ if (node) buttonRefs.current.set(id, node);
95
+ else buttonRefs.current.delete(id);
96
+ },
97
+ type: "button",
98
+ onClick: () => onChange(id),
99
+ "data-testid": testId ?? `bottom-nav-${id}`,
100
+ className: cn(
101
+ "relative z-10 flex h-[3.25rem] w-[4rem] flex-col items-center justify-center rounded-full transition-all duration-300",
102
+ isActive ? "text-primary-foreground" : "text-muted-foreground hover-gradient-violet hover:text-secondary-content active:scale-95"
103
+ ),
104
+ children: [
105
+ iconName ? /* @__PURE__ */ jsxs("div", { className: "relative size-icon-nav", children: [
106
+ /* @__PURE__ */ jsx(
107
+ Icon,
108
+ {
109
+ name: iconName,
110
+ className: cn(
111
+ "absolute inset-0 size-icon-nav transition-all duration-300",
112
+ isActive ? "opacity-0 scale-75" : "opacity-100 scale-100"
113
+ )
114
+ }
115
+ ),
116
+ /* @__PURE__ */ jsx(
117
+ Icon,
118
+ {
119
+ name: iconName,
120
+ filled: true,
121
+ className: cn(
122
+ "absolute inset-0 size-icon-nav transition-all duration-300",
123
+ isActive ? "opacity-100 scale-100" : "opacity-0 scale-75"
124
+ )
125
+ }
126
+ )
127
+ ] }) : icon ?? null,
128
+ /* @__PURE__ */ jsx("span", { className: "mt-0.5 max-w-full truncate text-xxs font-semibold leading-none transition-colors duration-300", children: label })
129
+ ]
130
+ },
131
+ id
132
+ );
133
+ })
134
+ ] })
135
+ }
136
+ );
137
+ }
138
+
139
+ export {
140
+ BottomNav
141
+ };
@@ -0,0 +1,106 @@
1
+ "use client";
2
+ import {
3
+ IconGlyph
4
+ } from "./chunk-YQQ7GDLZ.js";
5
+ import {
6
+ Check,
7
+ Close,
8
+ Help
9
+ } from "./chunk-XXH4TYKZ.js";
10
+ import {
11
+ cn
12
+ } from "./chunk-PMGIJMRO.js";
13
+
14
+ // src/web/components/swap-step-list.tsx
15
+ import { jsx, jsxs } from "react/jsx-runtime";
16
+ var defaultStatusLabels = {
17
+ done: "Done",
18
+ active: "In progress",
19
+ pending: "To do",
20
+ failed: "Failed",
21
+ unknown: "Cannot be checked"
22
+ };
23
+ var dotClass = {
24
+ done: "bg-primary bg-gradient-primary text-background shadow-glow-primary-soft",
25
+ active: "bg-secondary bg-gradient-brand text-white shadow-glow-violet",
26
+ pending: "bg-secondary/15 text-secondary-content ring-1 ring-inset ring-secondary/25",
27
+ failed: "bg-danger/20 text-danger-fg",
28
+ unknown: "bg-foreground/8 text-muted-foreground ring-1 ring-inset ring-foreground/10"
29
+ };
30
+ var labelClass = {
31
+ done: "text-foreground",
32
+ active: "text-foreground",
33
+ pending: "text-muted-foreground",
34
+ failed: "text-danger-fg",
35
+ unknown: "text-foreground"
36
+ };
37
+ function SwapStepList({ steps, connector = true, statusLabels, className }) {
38
+ const labels = { ...defaultStatusLabels, ...statusLabels };
39
+ return (
40
+ // A checklist's items stand alone, so a hairline rule separates them where
41
+ // a flow has its rail.
42
+ /* @__PURE__ */ jsx(
43
+ "div",
44
+ {
45
+ "data-slot": "swap-step-list",
46
+ className: cn("flex flex-col", !connector && "divide-y divide-divider/35", className),
47
+ children: steps.map((step, index) => {
48
+ const isLast = index === steps.length - 1;
49
+ return /* @__PURE__ */ jsxs(
50
+ "div",
51
+ {
52
+ "data-slot": "swap-step",
53
+ "data-status": step.status,
54
+ className: cn("flex gap-3", !connector && "py-3 first:pt-0 last:pb-0"),
55
+ children: [
56
+ /* @__PURE__ */ jsxs("div", { className: "flex w-5 shrink-0 flex-col items-center", children: [
57
+ /* @__PURE__ */ jsx(
58
+ "span",
59
+ {
60
+ "aria-hidden": true,
61
+ className: cn(
62
+ "flex size-5 items-center justify-center rounded-full text-xxs font-bold",
63
+ dotClass[step.status],
64
+ step.status === "active" && "animate-pulse"
65
+ ),
66
+ children: step.status === "done" ? /* @__PURE__ */ jsx(IconGlyph, { glyph: Check, className: "text-icon-sm" }) : step.status === "failed" ? /* @__PURE__ */ jsx(IconGlyph, { glyph: Close, className: "text-icon-sm" }) : step.status === "unknown" ? /* @__PURE__ */ jsx(IconGlyph, { glyph: Help, className: "text-icon-sm" }) : index + 1
67
+ }
68
+ ),
69
+ connector && !isLast && /* @__PURE__ */ jsx(
70
+ "span",
71
+ {
72
+ "aria-hidden": true,
73
+ className: cn(
74
+ "mt-1 w-0.5 flex-1",
75
+ step.status === "done" ? "bg-primary/60" : step.status === "active" ? "bg-secondary/40" : "bg-secondary/15"
76
+ )
77
+ }
78
+ )
79
+ ] }),
80
+ /* @__PURE__ */ jsxs("div", { className: cn("min-w-0 flex-1", connector && !isLast ? "pb-4" : "pb-0"), children: [
81
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
82
+ /* @__PURE__ */ jsxs("p", { className: cn("text-body font-medium", labelClass[step.status]), children: [
83
+ /* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
84
+ labels[step.status],
85
+ ": "
86
+ ] }),
87
+ step.label
88
+ ] }),
89
+ step.badges
90
+ ] }),
91
+ step.description && /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-caption leading-snug text-muted-foreground", children: step.description }),
92
+ step.action && /* @__PURE__ */ jsx("div", { className: "mt-2", children: step.action })
93
+ ] })
94
+ ]
95
+ },
96
+ step.id
97
+ );
98
+ })
99
+ }
100
+ )
101
+ );
102
+ }
103
+
104
+ export {
105
+ SwapStepList
106
+ };
@@ -0,0 +1,25 @@
1
+ "use client";
2
+ import {
3
+ eyebrow
4
+ } from "./chunk-MTQOAMDW.js";
5
+ import {
6
+ cn
7
+ } from "./chunk-PMGIJMRO.js";
8
+
9
+ // src/web/components/section-header.tsx
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ function SectionHeader({
12
+ children,
13
+ right,
14
+ as: Tag = "h2",
15
+ className
16
+ }) {
17
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center justify-between gap-3 px-1", className), children: [
18
+ /* @__PURE__ */ jsx(Tag, { className: cn("text-muted-foreground", eyebrow), children }),
19
+ right
20
+ ] });
21
+ }
22
+
23
+ export {
24
+ SectionHeader
25
+ };