kaleido-ui 0.2.2 → 0.2.5

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 (318) hide show
  1. package/README.md +80 -18
  2. package/dist/icon-AvUL0Cws.d.cts +135 -0
  3. package/dist/icon-AvUL0Cws.d.ts +135 -0
  4. package/dist/native/index.cjs +0 -126
  5. package/dist/native/index.js +0 -126
  6. package/dist/web/assets/kaleidoswap-brand.js +11 -0
  7. package/dist/web/assets/protocol-icons.js +7 -0
  8. package/dist/web/chunk-25RRZDZ2.js +269 -0
  9. package/dist/web/chunk-2Q5SSNFO.js +63 -0
  10. package/dist/web/chunk-2VKFRAX3.js +39 -0
  11. package/dist/web/chunk-3CHDKHXW.js +150 -0
  12. package/dist/web/chunk-4BTXTIE6.js +126 -0
  13. package/dist/web/chunk-4L55ANVR.js +330 -0
  14. package/dist/web/chunk-4UMKXXAK.js +33 -0
  15. package/dist/web/chunk-536NL4X2.js +89 -0
  16. package/dist/web/chunk-563GMWFT.js +32 -0
  17. package/dist/web/chunk-5GBURTY4.js +33 -0
  18. package/dist/web/chunk-5INE4WNW.js +291 -0
  19. package/dist/web/chunk-5MM5YGGG.js +43 -0
  20. package/dist/web/chunk-5NCVH6N5.js +81 -0
  21. package/dist/web/chunk-5V2KMO56.js +55 -0
  22. package/dist/web/chunk-5WBAFYPH.js +62 -0
  23. package/dist/web/chunk-6PNGSAJB.js +55 -0
  24. package/dist/web/chunk-7L35JISL.js +106 -0
  25. package/dist/web/chunk-7L7DQFHJ.js +85 -0
  26. package/dist/web/chunk-7OE6AXLY.js +27 -0
  27. package/dist/web/chunk-7Y7FEBKK.js +85 -0
  28. package/dist/web/chunk-A6MSV4MA.js +83 -0
  29. package/dist/web/chunk-A7MPRLJL.js +169 -0
  30. package/dist/web/chunk-AMIAAHZM.js +232 -0
  31. package/dist/web/chunk-ASHU5XNR.js +21 -0
  32. package/dist/web/chunk-AU5ZGWGA.js +247 -0
  33. package/dist/web/chunk-AVJ56TMD.js +107 -0
  34. package/dist/web/chunk-AWKCO62W.js +191 -0
  35. package/dist/web/chunk-BGUBHWIO.js +41 -0
  36. package/dist/web/chunk-BYHIH2LP.js +56 -0
  37. package/dist/web/chunk-CBE7BT3M.js +87 -0
  38. package/dist/web/chunk-CJATW6EO.js +108 -0
  39. package/dist/web/chunk-CPIM2QKZ.js +666 -0
  40. package/dist/web/chunk-CRMLYZIX.js +35 -0
  41. package/dist/web/chunk-CXLGQSHM.js +417 -0
  42. package/dist/web/chunk-CXMCWSWC.js +20 -0
  43. package/dist/web/chunk-CXPYTWEC.js +43 -0
  44. package/dist/web/chunk-CZGN7SQH.js +41 -0
  45. package/dist/web/chunk-CZPNI33A.js +31 -0
  46. package/dist/web/chunk-D2ZG6TZM.js +96 -0
  47. package/dist/web/chunk-D5CPIS6B.js +169 -0
  48. package/dist/web/chunk-DCUAE6PX.js +202 -0
  49. package/dist/web/chunk-DUAFJ3CX.js +179 -0
  50. package/dist/web/chunk-DV66AZXI.js +368 -0
  51. package/dist/web/chunk-DY72P3EE.js +86 -0
  52. package/dist/web/chunk-DZMOH67F.js +43 -0
  53. package/dist/web/chunk-EBQ35SOM.js +177 -0
  54. package/dist/web/chunk-EXWE5KM6.js +48 -0
  55. package/dist/web/chunk-F2LIZX5K.js +140 -0
  56. package/dist/web/chunk-FSQV54O4.js +61 -0
  57. package/dist/web/chunk-G26YNXL3.js +82 -0
  58. package/dist/web/chunk-G2MJL3VP.js +54 -0
  59. package/dist/web/chunk-G2ZYNR3W.js +28 -0
  60. package/dist/web/chunk-GEXPB5CG.js +63 -0
  61. package/dist/web/chunk-GX5URFML.js +375 -0
  62. package/dist/web/chunk-GZZ5KVON.js +70 -0
  63. package/dist/web/chunk-H3GYLFHP.js +30 -0
  64. package/dist/web/chunk-HKF7IPXV.js +146 -0
  65. package/dist/web/chunk-HKIYPISK.js +175 -0
  66. package/dist/web/chunk-HLPL5AHD.js +54 -0
  67. package/dist/web/chunk-HO65ENYH.js +99 -0
  68. package/dist/web/chunk-HP25HN7Q.js +69 -0
  69. package/dist/web/chunk-HVKSBEZN.js +98 -0
  70. package/dist/web/chunk-HWKXZNBN.js +74 -0
  71. package/dist/web/chunk-HY3VMT27.js +64 -0
  72. package/dist/web/chunk-I2N3HZ4M.js +60 -0
  73. package/dist/web/chunk-I7KNV2UC.js +109 -0
  74. package/dist/web/chunk-INKE5FS6.js +128 -0
  75. package/dist/web/chunk-IWDBETXQ.js +254 -0
  76. package/dist/web/chunk-IZCLPO4E.js +42 -0
  77. package/dist/web/chunk-JY3H7ZAI.js +41 -0
  78. package/dist/web/chunk-JYM5NHBA.js +80 -0
  79. package/dist/web/chunk-K7JVP24O.js +89 -0
  80. package/dist/web/chunk-KDNYIMGR.js +197 -0
  81. package/dist/web/chunk-KMQN66HU.js +27 -0
  82. package/dist/web/chunk-LOGZGZWN.js +1 -0
  83. package/dist/web/chunk-LPDB7EHH.js +65 -0
  84. package/dist/web/chunk-LSY4DY2I.js +72 -0
  85. package/dist/web/chunk-LYLWGJ4R.js +66 -0
  86. package/dist/web/chunk-MKMZH4XD.js +98 -0
  87. package/dist/web/chunk-MTQ22SKE.js +39 -0
  88. package/dist/web/chunk-MTQOAMDW.js +8 -0
  89. package/dist/web/chunk-NEXA6VGG.js +91 -0
  90. package/dist/web/chunk-NHOCTXPF.js +151 -0
  91. package/dist/web/chunk-NNGVB3US.js +176 -0
  92. package/dist/web/chunk-NXPVF5WX.js +74 -0
  93. package/dist/web/chunk-O2TTO5FS.js +24 -0
  94. package/dist/web/chunk-O4IIYGDL.js +70 -0
  95. package/dist/web/chunk-OI7WX7NE.js +17 -0
  96. package/dist/web/chunk-OWSKP527.js +80 -0
  97. package/dist/web/chunk-OX3J3FYX.js +64 -0
  98. package/dist/web/chunk-OZXDXNMR.js +110 -0
  99. package/dist/web/chunk-PIXLIWSO.js +62 -0
  100. package/dist/web/chunk-PMGIJMRO.js +207 -0
  101. package/dist/web/chunk-Q2IXLUSM.js +56 -0
  102. package/dist/web/chunk-QGWVZ5NG.js +73 -0
  103. package/dist/web/chunk-QLUUM53Z.js +90 -0
  104. package/dist/web/chunk-QRFFLA3N.js +84 -0
  105. package/dist/web/chunk-QTZT7QMI.js +83 -0
  106. package/dist/web/chunk-QXZ2WY3B.js +38 -0
  107. package/dist/web/chunk-R2MV4S4U.js +50 -0
  108. package/dist/web/chunk-RA5YGBRB.js +106 -0
  109. package/dist/web/chunk-RIOY4LFJ.js +141 -0
  110. package/dist/web/chunk-RULT57JR.js +85 -0
  111. package/dist/web/chunk-RWJHJMVJ.js +67 -0
  112. package/dist/web/chunk-RXXYUYBP.js +25 -0
  113. package/dist/web/chunk-SGXLWU4V.js +96 -0
  114. package/dist/web/chunk-SIE2FP2T.js +62 -0
  115. package/dist/web/chunk-STMNX3QT.js +109 -0
  116. package/dist/web/chunk-SUOATMIA.js +113 -0
  117. package/dist/web/chunk-SVYDLG2C.js +558 -0
  118. package/dist/web/chunk-T2NBG4KF.js +276 -0
  119. package/dist/web/chunk-T7CEJV6P.js +66 -0
  120. package/dist/web/chunk-TAA6PO5V.js +63 -0
  121. package/dist/web/chunk-TI7NWMEQ.js +34 -0
  122. package/dist/web/chunk-TJGHAD5O.js +40 -0
  123. package/dist/web/chunk-TKRMGN7J.js +8 -0
  124. package/dist/web/chunk-TS4UYWJJ.js +105 -0
  125. package/dist/web/chunk-TY6SGZC7.js +94 -0
  126. package/dist/web/chunk-U2UWLSDG.js +86 -0
  127. package/dist/web/chunk-UHXOPILM.js +101 -0
  128. package/dist/web/chunk-UXLWWQ4J.js +20 -0
  129. package/dist/web/chunk-UZ4LWR4X.js +26 -0
  130. package/dist/web/chunk-V3UI2XX7.js +444 -0
  131. package/dist/web/chunk-VAMCLWLF.js +403 -0
  132. package/dist/web/chunk-VLZMX43R.js +45 -0
  133. package/dist/web/chunk-VM6AGMYO.js +46 -0
  134. package/dist/web/chunk-VNL2QI5B.js +43 -0
  135. package/dist/web/chunk-VYQHGSK6.js +244 -0
  136. package/dist/web/chunk-W4E2N3UN.js +58 -0
  137. package/dist/web/chunk-W4G74KFZ.js +362 -0
  138. package/dist/web/chunk-WBW5E6LC.js +101 -0
  139. package/dist/web/chunk-WEPSTI3Z.js +83 -0
  140. package/dist/web/chunk-WOAWUXER.js +139 -0
  141. package/dist/web/chunk-X2RA4EG3.js +86 -0
  142. package/dist/web/chunk-X3MYWPNO.js +230 -0
  143. package/dist/web/chunk-XDSOOOYL.js +35 -0
  144. package/dist/web/chunk-XIMTRQZ3.js +220 -0
  145. package/dist/web/chunk-XMUXOKIP.js +159 -0
  146. package/dist/web/chunk-XXH4TYKZ.js +276 -0
  147. package/dist/web/chunk-XYNURYMC.js +129 -0
  148. package/dist/web/chunk-XZQUQOR3.js +48 -0
  149. package/dist/web/chunk-Y2W5YG6Y.js +57 -0
  150. package/dist/web/chunk-YFYAMVTL.js +383 -0
  151. package/dist/web/chunk-YLP46BJK.js +50 -0
  152. package/dist/web/chunk-YMM73FLL.js +84 -0
  153. package/dist/web/chunk-YQDCU7ZL.js +49 -0
  154. package/dist/web/chunk-YQQ7GDLZ.js +30 -0
  155. package/dist/web/chunk-YRRZ22OK.js +139 -0
  156. package/dist/web/chunk-YXVOFEDT.js +85 -0
  157. package/dist/web/chunk-Z3H2FQVX.js +120 -0
  158. package/dist/web/chunk-ZDCKYQKS.js +108 -0
  159. package/dist/web/chunk-ZR32WYJA.js +55 -0
  160. package/dist/web/chunk-ZTVV4KBT.js +28 -0
  161. package/dist/web/components/account-capabilities-card.js +21 -0
  162. package/dist/web/components/account-menu.js +18 -0
  163. package/dist/web/components/account-settings-shared.js +50 -0
  164. package/dist/web/components/account-status-tabs.js +20 -0
  165. package/dist/web/components/action-tile.js +8 -0
  166. package/dist/web/components/activity-detail-row.js +22 -0
  167. package/dist/web/components/activity-filter-bar.js +22 -0
  168. package/dist/web/components/activity-list.js +23 -0
  169. package/dist/web/components/activity-network-filters.js +19 -0
  170. package/dist/web/components/activity-row.js +15 -0
  171. package/dist/web/components/activity-type-tabs.js +17 -0
  172. package/dist/web/components/alert-banner.js +13 -0
  173. package/dist/web/components/amount.js +8 -0
  174. package/dist/web/components/app-icon.js +15 -0
  175. package/dist/web/components/asset-card.js +21 -0
  176. package/dist/web/components/asset-icon.js +10 -0
  177. package/dist/web/components/asset-selector.js +24 -0
  178. package/dist/web/components/balance-breakdown.js +18 -0
  179. package/dist/web/components/basic-collapsible.js +11 -0
  180. package/dist/web/components/bottom-nav.js +13 -0
  181. package/dist/web/components/bottom-sheet.js +15 -0
  182. package/dist/web/components/btc-unified-receive.js +28 -0
  183. package/dist/web/components/charts/bar-chart.js +24 -0
  184. package/dist/web/components/charts/bar-list.js +24 -0
  185. package/dist/web/components/charts/core.js +63 -0
  186. package/dist/web/components/charts/donut-chart.js +26 -0
  187. package/dist/web/components/charts/index.js +72 -0
  188. package/dist/web/components/charts/line-chart.js +26 -0
  189. package/dist/web/components/charts/meter.js +24 -0
  190. package/dist/web/components/charts/mixed-chart.js +24 -0
  191. package/dist/web/components/charts/scatter-chart.js +24 -0
  192. package/dist/web/components/charts/sparkline.js +8 -0
  193. package/dist/web/components/choice-group.js +11 -0
  194. package/dist/web/components/code-block.js +21 -0
  195. package/dist/web/components/confirm-dialog.js +15 -0
  196. package/dist/web/components/copy-button.js +21 -0
  197. package/dist/web/components/copyable.js +20 -0
  198. package/dist/web/components/date-range-filter.js +16 -0
  199. package/dist/web/components/deposit-asset-selection.js +24 -0
  200. package/dist/web/components/deposit-generated-view.js +23 -0
  201. package/dist/web/components/deposit-invoice-generation.js +35 -0
  202. package/dist/web/components/deposit-network-default-modal.js +13 -0
  203. package/dist/web/components/deposit-pre-generation.js +17 -0
  204. package/dist/web/components/deposit-success-screen.js +20 -0
  205. package/dist/web/components/deposit-ui-shared.js +28 -0
  206. package/dist/web/components/disclosure-card.js +11 -0
  207. package/dist/web/components/dotted-leader.js +8 -0
  208. package/dist/web/components/empty-state.js +8 -0
  209. package/dist/web/components/environment-indicator.js +9 -0
  210. package/dist/web/components/error-boundary.js +10 -0
  211. package/dist/web/components/event-timeline.js +8 -0
  212. package/dist/web/components/extension-page-frame.js +15 -0
  213. package/dist/web/components/filter-bar.js +15 -0
  214. package/dist/web/components/filter-chip-group.js +8 -0
  215. package/dist/web/components/filter-dropdown.js +12 -0
  216. package/dist/web/components/floating-notice.js +12 -0
  217. package/dist/web/components/form-field.js +10 -0
  218. package/dist/web/components/halo-backdrop.js +8 -0
  219. package/dist/web/components/info-chip.js +24 -0
  220. package/dist/web/components/info-panel.js +13 -0
  221. package/dist/web/components/inline-selector.js +11 -0
  222. package/dist/web/components/instants-statement.js +20 -0
  223. package/dist/web/components/kaleidoscope-hero-animation.js +11 -0
  224. package/dist/web/components/kaleidoswap-logo.js +12 -0
  225. package/dist/web/components/list-field.js +14 -0
  226. package/dist/web/components/list-summary.js +8 -0
  227. package/dist/web/components/metric-card.js +14 -0
  228. package/dist/web/components/mobile-hero-animation.js +8 -0
  229. package/dist/web/components/network-badge.js +14 -0
  230. package/dist/web/components/network-icon.js +21 -0
  231. package/dist/web/components/network-status-chip.js +11 -0
  232. package/dist/web/components/notice-bar.js +8 -0
  233. package/dist/web/components/one-time-secret-dialog.js +18 -0
  234. package/dist/web/components/option-selector.js +12 -0
  235. package/dist/web/components/page-header.js +12 -0
  236. package/dist/web/components/page-shell.js +18 -0
  237. package/dist/web/components/pager.js +11 -0
  238. package/dist/web/components/period-select.js +20 -0
  239. package/dist/web/components/qr-code.js +10 -0
  240. package/dist/web/components/query-state.js +19 -0
  241. package/dist/web/components/read-status.js +15 -0
  242. package/dist/web/components/record-list.js +17 -0
  243. package/dist/web/components/recovery-phrase-card.js +20 -0
  244. package/dist/web/components/restricted.js +9 -0
  245. package/dist/web/components/secret-reveal-card.js +20 -0
  246. package/dist/web/components/section-header.js +9 -0
  247. package/dist/web/components/section-label.js +8 -0
  248. package/dist/web/components/selectable-card.js +8 -0
  249. package/dist/web/components/setting-item.js +13 -0
  250. package/dist/web/components/settings-section-card.js +11 -0
  251. package/dist/web/components/settings-selector-row.js +8 -0
  252. package/dist/web/components/settings-tile.js +21 -0
  253. package/dist/web/components/skeleton.js +10 -0
  254. package/dist/web/components/status-badge.js +13 -0
  255. package/dist/web/components/status-icon-badge.js +15 -0
  256. package/dist/web/components/stepper-number-input.js +10 -0
  257. package/dist/web/components/summary-rows.js +9 -0
  258. package/dist/web/components/swap-badge.js +11 -0
  259. package/dist/web/components/swap-input-card.js +28 -0
  260. package/dist/web/components/swap-step-list.js +10 -0
  261. package/dist/web/components/switch-row.js +9 -0
  262. package/dist/web/components/theme-toggle.js +12 -0
  263. package/dist/web/components/transaction-card.js +14 -0
  264. package/dist/web/components/trend-chart.js +28 -0
  265. package/dist/web/components/value-list.js +20 -0
  266. package/dist/web/components/wallet-asset-list.js +22 -0
  267. package/dist/web/components/withdraw-amount-input.js +13 -0
  268. package/dist/web/components/withdraw-confirmation.js +17 -0
  269. package/dist/web/components/withdraw-destination-input.js +14 -0
  270. package/dist/web/components/withdraw-invoice-info.js +10 -0
  271. package/dist/web/components/withdraw-route-selector.js +9 -0
  272. package/dist/web/components/withdraw-success.js +12 -0
  273. package/dist/web/hooks/use-asset-icon.js +11 -0
  274. package/dist/web/hooks/use-copy-to-clipboard.js +7 -0
  275. package/dist/web/hooks/use-media-query.js +9 -0
  276. package/dist/web/hooks/use-theme-mode.js +9 -0
  277. package/dist/web/hooks/use-toast.js +11 -0
  278. package/dist/web/icons/filled.js +15 -0
  279. package/dist/web/icons/index.js +13 -0
  280. package/dist/web/icons/outlined.js +221 -0
  281. package/dist/web/icons/public.js +248 -0
  282. package/dist/web/icons.cjs +776 -0
  283. package/dist/web/icons.d.cts +123 -0
  284. package/dist/web/icons.d.ts +123 -0
  285. package/dist/web/index.cjs +2573 -2507
  286. package/dist/web/index.d.cts +32 -110
  287. package/dist/web/index.d.ts +32 -110
  288. package/dist/web/index.js +592 -14464
  289. package/dist/web/primitives/avatar.js +10 -0
  290. package/dist/web/primitives/button.js +10 -0
  291. package/dist/web/primitives/card.js +20 -0
  292. package/dist/web/primitives/collapsible.js +16 -0
  293. package/dist/web/primitives/dialog.js +30 -0
  294. package/dist/web/primitives/dot-pagination.js +8 -0
  295. package/dist/web/primitives/drawer.js +43 -0
  296. package/dist/web/primitives/dropdown-menu.js +28 -0
  297. package/dist/web/primitives/glyph-button.js +10 -0
  298. package/dist/web/primitives/icon-button.js +15 -0
  299. package/dist/web/primitives/icon-glyph.js +8 -0
  300. package/dist/web/primitives/icon.js +16 -0
  301. package/dist/web/primitives/input.js +9 -0
  302. package/dist/web/primitives/label.js +9 -0
  303. package/dist/web/primitives/menu-search.js +20 -0
  304. package/dist/web/primitives/number-input.js +11 -0
  305. package/dist/web/primitives/popover.js +18 -0
  306. package/dist/web/primitives/scroll-area.js +12 -0
  307. package/dist/web/primitives/select.js +27 -0
  308. package/dist/web/primitives/switch.js +8 -0
  309. package/dist/web/primitives/table.js +27 -0
  310. package/dist/web/primitives/tabs.js +14 -0
  311. package/dist/web/primitives/toast.js +24 -0
  312. package/dist/web/primitives/toaster.js +15 -0
  313. package/dist/web/primitives/tooltip.js +10 -0
  314. package/dist/web/utils/amount-display.js +13 -0
  315. package/dist/web/utils/cn.js +7 -0
  316. package/dist/web/utils/field-styles.js +7 -0
  317. package/dist/web/utils/type-roles.js +7 -0
  318. package/package.json +9 -1
@@ -0,0 +1,70 @@
1
+ "use client";
2
+ import {
3
+ Icon
4
+ } from "./chunk-A6MSV4MA.js";
5
+ import {
6
+ isIconName
7
+ } from "./chunk-VYQHGSK6.js";
8
+ import {
9
+ IconGlyph
10
+ } from "./chunk-YQQ7GDLZ.js";
11
+ import {
12
+ cn
13
+ } from "./chunk-PMGIJMRO.js";
14
+ import {
15
+ ChevronRight
16
+ } from "./chunk-XXH4TYKZ.js";
17
+
18
+ // src/web/components/setting-item.tsx
19
+ import { jsx, jsxs } from "react/jsx-runtime";
20
+ function SettingItem({
21
+ icon,
22
+ iconSrc,
23
+ iconAlt,
24
+ title,
25
+ description,
26
+ value,
27
+ onClick,
28
+ showChevron = true,
29
+ className,
30
+ iconColor = "text-secondary-content"
31
+ }) {
32
+ const isClickable = !!onClick;
33
+ return /* @__PURE__ */ jsx(
34
+ "div",
35
+ {
36
+ className: cn(
37
+ "p-5 rounded-2xl bg-card/55 backdrop-blur-xl backdrop-saturate-150 bg-gradient-card shadow-card-secondary transition-all duration-200 group",
38
+ isClickable && "cursor-pointer hover:shadow-card-hover-soft hover:-translate-y-0.5 active:scale-[0.98]",
39
+ className
40
+ ),
41
+ onClick,
42
+ children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
43
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 flex-1 min-w-0", children: [
44
+ (icon || iconSrc) && /* @__PURE__ */ jsx(
45
+ "div",
46
+ {
47
+ className: cn(
48
+ "flex-shrink-0 size-10 rounded-xl flex items-center justify-center bg-secondary/15 group-hover-gradient-violet group-hover:shadow-glow-violet-faint group-hover:scale-105 transition-all",
49
+ iconColor
50
+ ),
51
+ children: iconSrc ? /* @__PURE__ */ jsx("img", { src: iconSrc, alt: iconAlt ?? title, className: "size-5 object-contain" }) : isIconName(icon) ? /* @__PURE__ */ jsx(Icon, { name: icon, className: "text-icon-xl" }) : typeof icon === "string" ? null : icon
52
+ }
53
+ ),
54
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col flex-1 min-w-0", children: [
55
+ /* @__PURE__ */ jsx("span", { className: "font-bold text-body text-foreground tracking-wide", children: title }),
56
+ description && /* @__PURE__ */ jsx("span", { className: "text-caption text-muted-foreground mt-0.5 font-medium", children: description })
57
+ ] })
58
+ ] }),
59
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-shrink-0", children: [
60
+ value && /* @__PURE__ */ jsx("span", { className: "text-caption text-muted-foreground font-mono", children: value }),
61
+ showChevron && isClickable && /* @__PURE__ */ jsx(IconGlyph, { glyph: ChevronRight, className: "text-icon-md text-muted-foreground group-hover:scale-110 group-hover:text-secondary-content transition-all" })
62
+ ] })
63
+ ] })
64
+ }
65
+ );
66
+ }
67
+
68
+ export {
69
+ SettingItem
70
+ };
@@ -0,0 +1,17 @@
1
+ "use client";
2
+
3
+ // src/web/icons/filled.tsx
4
+ import { jsx } from "react/jsx-runtime";
5
+ var AccountBalanceWalletFilled = (props) => /* @__PURE__ */ jsx("svg", { viewBox: "0 0 128 128", fill: "currentColor", "aria-hidden": "true", ...props, children: /* @__PURE__ */ jsx("path", { d: "M111.954 95.9607V101.292C111.954 107.156 107.156 111.954 101.292 111.954H26.6557C20.7381 111.954 15.9934 107.156 15.9934 101.292V26.6557C15.9934 20.7915 20.7381 15.9934 26.6557 15.9934H101.292C107.156 15.9934 111.954 20.7915 111.954 26.6557V31.9869H63.9738C58.0562 31.9869 53.3115 36.7849 53.3115 42.6492V85.2984C53.3115 91.1627 58.0562 95.9607 63.9738 95.9607H111.954ZM63.9738 85.2984H117.285V42.6492H63.9738V85.2984ZM85.2984 71.9705C80.8735 71.9705 77.3016 68.3986 77.3016 63.9738C77.3016 59.5489 80.8735 55.9771 85.2984 55.9771C89.7232 55.9771 93.2951 59.5489 93.2951 63.9738C93.2951 68.3986 89.7232 71.9705 85.2984 71.9705Z" }) });
6
+ var CheckCircleFilled = (props) => /* @__PURE__ */ jsx("svg", { viewBox: "0 0 128 128", fill: "currentColor", "aria-hidden": "true", ...props, children: /* @__PURE__ */ jsx("path", { d: "M63.9739 10.6624C34.5459 10.6624 10.6624 34.5459 10.6624 63.9739C10.6624 93.4018 34.5459 117.285 63.9739 117.285C93.4018 117.285 117.285 93.4018 117.285 63.9739C117.285 34.5459 93.4018 10.6624 63.9739 10.6624ZM53.3116 90.6296L26.6558 63.9739L34.1727 56.4569L53.3116 75.5424L93.775 35.079L101.292 42.6493L53.3116 90.6296Z" }) });
7
+ var HistoryFilled = (props) => /* @__PURE__ */ jsx("svg", { viewBox: "0 0 128 128", fill: "currentColor", "aria-hidden": "true", ...props, children: /* @__PURE__ */ jsx("path", { d: "M69.3049 15.9934C42.809 15.9934 21.3245 37.4779 21.3245 63.9738H5.33105L26.0692 84.7119L26.4424 85.4583L47.9803 63.9738H31.9868C31.9868 43.3422 48.6733 26.6557 69.3049 26.6557C89.9364 26.6557 106.623 43.3422 106.623 63.9738C106.623 84.6053 89.9364 101.292 69.3049 101.292C59.0157 101.292 49.6862 97.0802 42.969 90.3096L35.3987 97.8799C44.0885 106.57 56.0303 111.954 69.3049 111.954C95.8007 111.954 117.285 90.4696 117.285 63.9738C117.285 37.4779 95.8007 15.9934 69.3049 15.9934ZM63.9737 42.6492V69.3049L86.791 82.846L90.6295 76.3953L71.9704 65.3065V42.6492H63.9737Z" }) });
8
+ var SettingsFilled = (props) => /* @__PURE__ */ jsx("svg", { viewBox: "0 0 128 128", fill: "currentColor", "aria-hidden": "true", ...props, children: /* @__PURE__ */ jsx("path", { d: "M102.038 68.9852C102.251 67.3859 102.358 65.7332 102.358 63.974C102.358 62.268 102.251 60.562 101.985 58.9627L112.807 50.5395C113.767 49.7931 114.033 48.3537 113.447 47.2875L103.211 29.588C102.571 28.4152 101.238 28.042 100.066 28.4152L87.3241 33.5331C84.6585 31.5073 81.833 29.8013 78.6877 28.5218L76.7684 14.9807C76.5552 13.7012 75.489 12.7949 74.2095 12.7949H53.7379C52.4584 12.7949 51.4455 13.7012 51.2322 14.9807L49.313 28.5218C46.1676 29.8013 43.2888 31.5606 40.6766 33.5331L27.9351 28.4152C26.7623 27.9887 25.4295 28.4152 24.7897 29.588L14.6072 47.2875C13.9675 48.407 14.1807 49.7931 15.247 50.5395L26.0692 58.9627C25.8027 60.562 25.5894 62.3213 25.5894 63.974C25.5894 65.6266 25.696 67.3859 25.9626 68.9852L15.1404 77.4085C14.1807 78.1548 13.9142 79.5942 14.5006 80.6605L24.7364 98.3599C25.3762 99.5327 26.7089 99.9059 27.8818 99.5327L40.6232 94.4148C43.2888 96.4407 46.1143 98.1466 49.2597 99.4261L51.1789 112.967C51.4455 114.247 52.4584 115.153 53.7379 115.153H74.2095C75.489 115.153 76.5552 114.247 76.7151 112.967L78.6343 99.4261C81.7797 98.1466 84.6586 96.4407 87.2708 94.4148L100.012 99.5327C101.185 99.9592 102.518 99.5327 103.158 98.3599L113.393 80.6605C114.033 79.4876 113.767 78.1548 112.754 77.4085L102.038 68.9852ZM63.9737 83.1661C53.418 83.1661 44.7815 74.5296 44.7815 63.974C44.7815 53.4183 53.418 44.7818 63.9737 44.7818C74.5294 44.7818 83.1658 53.4183 83.1658 63.974C83.1658 74.5296 74.5294 83.1661 63.9737 83.1661Z" }) });
9
+ var SwapHorizFilled = (props) => /* @__PURE__ */ jsx("svg", { viewBox: "0 0 128 128", fill: "currentColor", "aria-hidden": "true", ...props, children: /* @__PURE__ */ jsx("path", { d: "M37.2648 58.6427L15.9935 79.9673L37.2648 101.292V85.2984H74.6361V74.6361H37.2648V58.6427ZM111.954 47.9804L90.6829 26.6558V42.6492H53.3115V53.3115H90.6829V69.305L111.954 47.9804Z" }) });
10
+
11
+ export {
12
+ AccountBalanceWalletFilled,
13
+ CheckCircleFilled,
14
+ HistoryFilled,
15
+ SettingsFilled,
16
+ SwapHorizFilled
17
+ };
@@ -0,0 +1,80 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-PMGIJMRO.js";
5
+
6
+ // src/web/primitives/button.tsx
7
+ import * as React from "react";
8
+ import { Slot } from "@radix-ui/react-slot";
9
+ import { cva } from "class-variance-authority";
10
+ import { jsx } from "react/jsx-runtime";
11
+ var buttonVariants = cva(
12
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-xl text-caption font-semibold ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 active:scale-[0.98]",
13
+ {
14
+ variants: {
15
+ variant: {
16
+ default: "bg-primary bg-gradient-primary text-primary-foreground shadow-button-primary hover:brightness-110 hover:shadow-button-primary-hover disabled:shadow-none",
17
+ destructive: "bg-destructive bg-gradient-destructive text-white shadow-raised hover:brightness-110",
18
+ outline: "border border-primary/50 bg-transparent text-brand hover:bg-primary/5 hover:border-primary hover:shadow-button-outline-hover hover:brightness-115",
19
+ secondary: "bg-secondary bg-gradient-violet text-secondary-foreground shadow-button-violet hover:brightness-110 hover:shadow-glow-violet disabled:shadow-none",
20
+ ghost: "text-brand hover:bg-primary/10 hover:brightness-115 hover:[&_span]:brightness-115 active:bg-primary/15 active:brightness-100",
21
+ link: "text-brand underline-offset-4 hover:underline",
22
+ glow: "bg-primary bg-gradient-primary text-primary-foreground shadow-glow-primary hover:shadow-glow-primary-strong",
23
+ // Flat: one violet fill, a stronger one on hover, no gradient.
24
+ surface: "bg-secondary/15 text-secondary-content hover:bg-secondary/25 hover:shadow-button-surface-hover active:bg-secondary/30",
25
+ cta: "w-full bg-primary bg-gradient-primary text-primary-foreground font-bold rounded-2xl shadow-button-primary hover:brightness-110 hover:shadow-button-primary-hover disabled:opacity-50 disabled:cursor-not-allowed disabled:shadow-none",
26
+ "cta-gradient": "w-full bg-secondary bg-gradient-brand-dark text-white font-extrabold rounded-2xl shadow-glow-brand hover:brightness-115 hover:-translate-y-0.5 active:translate-y-0 disabled:opacity-40 disabled:shadow-none disabled:cursor-not-allowed",
27
+ "danger-subtle": "bg-danger/10 text-danger-fg font-bold rounded-xl hover:bg-danger/15 hover:brightness-115",
28
+ // danger-subtle without its resting tint: the danger glyph alone, tinted on hover.
29
+ "danger-quiet": "text-danger-fg hover:bg-danger/10 active:bg-danger/15",
30
+ hyperlink: "group text-muted-foreground underline underline-offset-2 hover:text-foreground hover:decoration-primary hover:[&_.icon]:text-brand bg-transparent font-normal",
31
+ // Hierarchy variants — primary/secondary/tertiary action emphasis.
32
+ // Pair with size="lg" or size="cta" for full-bleed buttons.
33
+ h1: "w-full bg-primary bg-gradient-primary text-primary-foreground font-bold rounded-2xl shadow-button-primary hover:brightness-110 hover:shadow-button-primary-hover disabled:opacity-50 disabled:cursor-not-allowed disabled:shadow-none",
34
+ h2: "w-full bg-secondary/15 text-secondary-content font-semibold rounded-xl hover:bg-secondary/25 hover:shadow-button-surface-hover active:bg-secondary/30",
35
+ h3: "text-brand font-semibold rounded-lg hover:bg-primary/10 active:bg-primary/15",
36
+ // The icon-only default: a muted glyph that turns violet on the violet hover.
37
+ quiet: "text-muted-foreground hover-gradient-violet hover:text-secondary-content"
38
+ },
39
+ size: {
40
+ default: "h-11 px-5 py-2",
41
+ xs: "h-7 rounded-lg px-2 text-caption",
42
+ sm: "h-9 rounded-lg px-3 text-caption",
43
+ lg: "h-14 rounded-xl px-8 text-body font-bold",
44
+ xl: "h-16 rounded-2xl px-10 text-subhead font-bold",
45
+ cta: "h-14 py-4 px-6 text-subhead",
46
+ "cta-lg": "h-[60px] py-5 px-6 text-subhead",
47
+ // Icon-only: a square that sizes its own glyph, so callers pass a bare <Icon>.
48
+ // sm 32 / md 40 / lg 50 px (7 / 9 / 11 spacing steps) — inline row actions, toolbar and close, headers.
49
+ "icon-sm": "size-7 rounded-lg p-0 [&_svg]:text-icon-md",
50
+ icon: "size-9 rounded-xl p-0 [&_svg]:text-icon-lg",
51
+ "icon-lg": "size-11 rounded-xl p-0 [&_svg]:text-icon-xl",
52
+ /** @deprecated The icon steps stop at `icon-lg`; this is the same size. */
53
+ "icon-xl": "size-11 rounded-xl p-0 [&_svg]:text-icon-xl"
54
+ }
55
+ },
56
+ defaultVariants: {
57
+ variant: "default",
58
+ size: "default"
59
+ }
60
+ }
61
+ );
62
+ var Button = React.forwardRef(
63
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
64
+ const Comp = asChild ? Slot : "button";
65
+ return /* @__PURE__ */ jsx(
66
+ Comp,
67
+ {
68
+ className: cn(buttonVariants({ variant, size, className })),
69
+ ref,
70
+ ...props
71
+ }
72
+ );
73
+ }
74
+ );
75
+ Button.displayName = "Button";
76
+
77
+ export {
78
+ buttonVariants,
79
+ Button
80
+ };
@@ -0,0 +1,64 @@
1
+ "use client";
2
+ import {
3
+ DottedLeader
4
+ } from "./chunk-CXMCWSWC.js";
5
+ import {
6
+ cn
7
+ } from "./chunk-PMGIJMRO.js";
8
+
9
+ // src/web/components/summary-rows.tsx
10
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
+ var valueTone = {
12
+ default: "text-foreground",
13
+ primary: "text-brand",
14
+ warning: "text-warning-fg",
15
+ danger: "text-danger-fg",
16
+ success: "text-success-fg",
17
+ muted: "text-muted-foreground"
18
+ };
19
+ var rowClass = "flex items-center gap-3 py-1";
20
+ function SummaryRows({ rows, as = "dl", className }) {
21
+ const List = as;
22
+ const isDl = as === "dl";
23
+ const Label = isDl ? "dt" : "span";
24
+ const Value = isDl ? "dd" : "div";
25
+ return /* @__PURE__ */ jsx(
26
+ List,
27
+ {
28
+ "data-slot": "summary-rows",
29
+ className: cn("m-0 list-none p-0", className),
30
+ children: rows.map((row, index) => {
31
+ const muted = row.tone === "muted";
32
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
33
+ /* @__PURE__ */ jsx(Label, { className: "shrink-0 text-caption text-muted-foreground", children: row.label }),
34
+ /* @__PURE__ */ jsx(DottedLeader, {}),
35
+ /* @__PURE__ */ jsxs(Value, { className: "m-0 flex min-w-0 max-w-[65%] items-baseline gap-2", children: [
36
+ /* @__PURE__ */ jsx(
37
+ "span",
38
+ {
39
+ className: cn(
40
+ "truncate tabular-nums",
41
+ row.emphasis ? "text-body font-bold" : muted ? "text-caption font-normal" : "text-body font-medium",
42
+ row.mono && "font-mono text-caption",
43
+ valueTone[row.tone ?? "default"]
44
+ ),
45
+ children: row.value
46
+ }
47
+ ),
48
+ row.hint && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-xxs text-muted-foreground", children: row.hint })
49
+ ] })
50
+ ] });
51
+ const rowProps = {
52
+ "data-slot": "summary-row",
53
+ "data-emphasis": row.emphasis ? "true" : void 0,
54
+ className: rowClass
55
+ };
56
+ return isDl ? /* @__PURE__ */ jsx("div", { ...rowProps, children: content }, index) : /* @__PURE__ */ jsx("li", { ...rowProps, children: content }, index);
57
+ })
58
+ }
59
+ );
60
+ }
61
+
62
+ export {
63
+ SummaryRows
64
+ };
@@ -0,0 +1,110 @@
1
+ "use client";
2
+ import {
3
+ ChartFrame,
4
+ defaultChartFormat
5
+ } from "./chunk-CXLGQSHM.js";
6
+ import {
7
+ cn
8
+ } from "./chunk-PMGIJMRO.js";
9
+
10
+ // src/web/components/charts/bar-list.tsx
11
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
+ function BarList({
13
+ items,
14
+ label,
15
+ formatValue = defaultChartFormat,
16
+ max,
17
+ sort = "none",
18
+ showPercent = true,
19
+ labelWidth,
20
+ empty,
21
+ className,
22
+ ...head
23
+ }) {
24
+ if (items.length === 0) return /* @__PURE__ */ jsx(Fragment, { children: empty ?? null });
25
+ const rows = sort === "desc" ? [...items].sort((a, b) => b.value - a.value) : items;
26
+ const top = Math.max(max ?? 0, ...rows.map((item) => item.value), 0) || 1;
27
+ const sum = rows.reduce((acc, item) => acc + Math.max(0, item.value), 0);
28
+ const percentOf = (item) => formatPercent(item.percent ?? (sum > 0 ? Math.max(0, item.value) / sum : 0));
29
+ const framed = head.title !== void 0 || (head.timeframes?.length ?? 0) > 0;
30
+ const label_ = labelWidth ? `minmax(0,${labelWidth})` : "auto";
31
+ const wideColumns = showPercent ? `${label_} 1fr auto auto` : `${label_} 1fr auto`;
32
+ const list = /* @__PURE__ */ jsx(
33
+ "ol",
34
+ {
35
+ "data-slot": "bar-list",
36
+ "aria-label": label,
37
+ className: cn(
38
+ "m-0 grid list-none gap-y-3 p-0 text-caption sm:items-center sm:gap-x-3 sm:gap-y-2",
39
+ "sm:[grid-template-columns:var(--bar-list-columns)]",
40
+ // Under a head, a little more air than the plots' own top margin.
41
+ framed && "pt-2",
42
+ className
43
+ ),
44
+ style: { "--bar-list-columns": wideColumns },
45
+ children: rows.map((item) => {
46
+ const share = Math.max(0, item.value) / top;
47
+ return /* @__PURE__ */ jsxs(
48
+ "li",
49
+ {
50
+ "data-slot": "bar-list-row",
51
+ className: cn(
52
+ // Narrow: label and value on one line, the bar under them.
53
+ "grid items-baseline gap-x-3 gap-y-1.5",
54
+ showPercent ? "grid-cols-[minmax(0,1fr)_auto_auto]" : "grid-cols-[minmax(0,1fr)_auto]",
55
+ "sm:col-span-full sm:grid-cols-subgrid sm:items-center sm:gap-y-0"
56
+ ),
57
+ children: [
58
+ /* @__PURE__ */ jsx("span", { className: cn("min-w-0 truncate text-muted-foreground", !labelWidth && "sm:max-w-[10rem]"), children: item.label }),
59
+ /* @__PURE__ */ jsx(
60
+ "span",
61
+ {
62
+ className: "order-last col-span-full h-2 overflow-hidden rounded-full bg-primary/15 shadow-inner sm:order-none sm:col-span-1",
63
+ "aria-hidden": "true",
64
+ children: /* @__PURE__ */ jsx(
65
+ "span",
66
+ {
67
+ className: "block h-full rounded-full bg-primary bg-gradient-primary",
68
+ style: {
69
+ width: `${share * 100}%`,
70
+ // A non-zero value keeps a sliver, so it never reads as zero.
71
+ minWidth: item.value > 0 ? 4 : 0
72
+ }
73
+ }
74
+ )
75
+ }
76
+ ),
77
+ /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap text-right font-semibold tabular-nums text-foreground", children: item.valueText ?? formatValue(item.value) }),
78
+ showPercent && /* @__PURE__ */ jsx("span", { className: "text-right tabular-nums text-muted-foreground", children: percentOf(item) })
79
+ ]
80
+ },
81
+ item.id
82
+ );
83
+ })
84
+ }
85
+ );
86
+ if (!framed) return list;
87
+ return /* @__PURE__ */ jsx(
88
+ ChartFrame,
89
+ {
90
+ ...head,
91
+ label,
92
+ table: {
93
+ columns: showPercent ? ["Item", "Value", "Percent"] : ["Item", "Value"],
94
+ rows: rows.map((item) => {
95
+ const value = item.valueText ?? formatValue(item.value);
96
+ return showPercent ? [item.label, value, percentOf(item)] : [item.label, value];
97
+ })
98
+ },
99
+ children: list
100
+ }
101
+ );
102
+ }
103
+ function formatPercent(fraction) {
104
+ if (fraction > 0 && fraction < 5e-3) return "<1%";
105
+ return `${Math.round(fraction * 100)}%`;
106
+ }
107
+
108
+ export {
109
+ BarList
110
+ };
@@ -0,0 +1,62 @@
1
+ "use client";
2
+ import {
3
+ Collapsible,
4
+ CollapsibleChevron,
5
+ CollapsibleContent,
6
+ CollapsibleTrigger
7
+ } from "./chunk-Q2IXLUSM.js";
8
+ import {
9
+ cn
10
+ } from "./chunk-PMGIJMRO.js";
11
+
12
+ // src/web/components/disclosure-card.tsx
13
+ import { jsx, jsxs } from "react/jsx-runtime";
14
+ function DisclosureCard({
15
+ title,
16
+ children,
17
+ open,
18
+ onOpenChange,
19
+ defaultOpen,
20
+ icon,
21
+ className,
22
+ triggerClassName,
23
+ contentClassName
24
+ }) {
25
+ return /* @__PURE__ */ jsxs(
26
+ Collapsible,
27
+ {
28
+ open,
29
+ onOpenChange,
30
+ defaultOpen,
31
+ "data-slot": "disclosure-card",
32
+ className: cn(
33
+ "group/disclosure overflow-hidden rounded-xl bg-surface-inset/40 shadow-raised transition-all",
34
+ className
35
+ ),
36
+ children: [
37
+ /* @__PURE__ */ jsxs(
38
+ CollapsibleTrigger,
39
+ {
40
+ type: "button",
41
+ className: cn(
42
+ "flex w-full items-center justify-between gap-2 px-3 py-2 text-left hover-gradient-violet focus-visible:ring-inset",
43
+ triggerClassName
44
+ ),
45
+ children: [
46
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-center gap-1.5", children: [
47
+ icon,
48
+ /* @__PURE__ */ jsx("span", { className: "truncate text-caption font-bold text-foreground", children: title })
49
+ ] }),
50
+ /* @__PURE__ */ jsx(CollapsibleChevron, {})
51
+ ]
52
+ }
53
+ ),
54
+ /* @__PURE__ */ jsx(CollapsibleContent, { className: cn("px-3 pb-3 pt-1", contentClassName), children })
55
+ ]
56
+ }
57
+ );
58
+ }
59
+
60
+ export {
61
+ DisclosureCard
62
+ };
@@ -0,0 +1,207 @@
1
+ "use client";
2
+
3
+ // src/web/utils/cn.ts
4
+ import { clsx } from "clsx";
5
+ import { extendTailwindMerge } from "tailwind-merge";
6
+
7
+ // src/tokens/radius.ts
8
+ var radius = {
9
+ none: "0px",
10
+ xs: "2px",
11
+ sm: "4px",
12
+ md: "6px",
13
+ lg: "8px",
14
+ xl: "12px",
15
+ "2xl": "16px",
16
+ "3xl": "24px",
17
+ "4xl": "32px",
18
+ full: "9999px",
19
+ // Semantic aliases
20
+ card: "16px",
21
+ panel: "24px",
22
+ nav: "32px",
23
+ pill: "9999px"
24
+ };
25
+
26
+ // src/tokens/shadows.ts
27
+ var ink = (alpha) => `rgb(var(--app-shadow) / calc(${alpha} * var(--app-shadow-strength)))`;
28
+ var rim = "inset 0 1px 0 0 rgb(255 255 255 / var(--app-rim-alpha))";
29
+ var shadow = {
30
+ glow: "0 0 20px rgba(10, 10, 10, 0.15)",
31
+ glowStrong: "0 0 30px rgba(10, 10, 10, 0.25)",
32
+ glowSubtle: "0 0 15px rgba(10, 10, 10, 0.12)",
33
+ glowAccent: "0 4px 30px rgba(10, 10, 10, 0.18)",
34
+ /** Header separation shadow for sticky app chrome. */
35
+ header: "0 10px 24px rgba(7, 4, 22, 0.35), 0 1px 0 rgba(164, 138, 255, 0.08)",
36
+ /** Brand green glow — drives all primary CTA / focus halos. */
37
+ glowPrimarySoft: "0 0 8px rgba(21, 233, 154, 0.5)",
38
+ /** A selected option in a row of options: the green halo, held down so the row stays calm. */
39
+ glowPrimaryFaint: "0 0 6px rgba(21, 233, 154, 0.22)",
40
+ glowPrimary: "0 0 30px rgba(21, 233, 154, 0.45)",
41
+ glowPrimaryStrong: "0 0 40px rgba(21, 233, 154, 0.55)",
42
+ /** Brand violet glow — selected / protocol / active accents. */
43
+ glowVioletSoft: "0 0 12px rgba(111, 50, 255, 0.45)",
44
+ /** The violet halo held down — an icon tile lit by its row's hover. */
45
+ glowVioletFaint: "0 0 8px rgba(111, 50, 255, 0.25)",
46
+ glowViolet: "0 0 30px rgba(111, 50, 255, 0.5)",
47
+ /** Both accents at once — green left, violet right. Brand moments only. */
48
+ glowBrand: "-10px 0 32px -8px rgba(21, 233, 154, 0.45), 10px 0 32px -8px rgba(111, 50, 255, 0.55)",
49
+ /** Resting card: soft violet-black drop. No rim light: the glass edge is the
50
+ * gradient ring kaleido-ui/css draws on every `.shadow-card`, and an inset
51
+ * rim under it would taper into a second line round the corners. */
52
+ card: `0 2px 6px -1px ${ink(0.45)}, 0 12px 32px -12px ${ink(0.7)}`,
53
+ /** Secondary card: the resting card's drop under its own name, so the glass
54
+ * edge kaleido-ui/css draws on `.shadow-card` stays off it. */
55
+ cardSecondary: `0 2px 6px -1px ${ink(0.45)}, 0 12px 32px -12px ${ink(0.7)}`,
56
+ /** Hovered / lifted card: deeper drop with a violet under-glow. */
57
+ cardHover: `0 4px 12px -2px ${ink(0.5)}, 0 20px 44px -14px rgba(111, 50, 255, 0.26)`,
58
+ /** Hover on a settings-style card: a soft violet under-glow, no deeper drop. */
59
+ cardHoverSoft: "0 6px 20px -10px rgba(111, 50, 255, 0.3)",
60
+ /** Small raised control or row inside a card (tiles, chips, inputs). */
61
+ raised: `${rim}, 0 2px 4px -1px ${ink(0.4)}, 0 6px 14px -6px ${ink(0.55)}`,
62
+ /** Primary (green) button: coloured drop, no edge line. */
63
+ buttonPrimary: "0 6px 14px -8px rgba(21, 233, 154, 0.4)",
64
+ /** Primary button on hover: its resting drop, plus a halo a notch under `glowPrimary`. */
65
+ buttonPrimaryHover: "0 6px 14px -8px rgba(21, 233, 154, 0.4), 0 0 14px rgba(21, 233, 154, 0.16)",
66
+ /** Violet button: coloured drop, no edge line. */
67
+ buttonViolet: "0 8px 22px -8px rgba(111, 50, 255, 0.75)",
68
+ /** Outline button on hover: the soft green halo round its border. */
69
+ buttonOutlineHover: "0 0 8px rgba(21, 233, 154, 0.5)",
70
+ /** Surface (violet) button on hover: the soft violet halo round its ring. */
71
+ buttonSurfaceHover: "0 0 12px rgba(111, 50, 255, 0.45)",
72
+ /** The current row of a nav / drawer: the green halo round its ring. */
73
+ navActive: "0 0 8px rgba(21, 233, 154, 0.5)",
74
+ /** Floating popover / modal elevation on dark surfaces. */
75
+ popover: "0 0 0 1px rgba(164, 138, 255, 0.10), 0 24px 60px -12px rgba(7, 4, 22, 0.8), 0 0 48px -16px rgba(111, 50, 255, 0.35)",
76
+ /** Toast / inline-notification elevation. */
77
+ toast: "0 0 0 1px rgba(164, 138, 255, 0.10), 0 12px 36px -8px rgba(7, 4, 22, 0.6)"
78
+ };
79
+ var lightInk = (alpha) => `rgba(20, 20, 43, ${alpha})`;
80
+ var shadowLight = {
81
+ glow: `0 0 20px ${lightInk(0.08)}`,
82
+ glowStrong: `0 0 30px ${lightInk(0.12)}`,
83
+ glowSubtle: `0 0 15px ${lightInk(0.06)}`,
84
+ glowAccent: `0 4px 30px ${lightInk(0.1)}`,
85
+ header: `0 1px 0 ${lightInk(0.06)}, 0 6px 16px -10px ${lightInk(0.14)}`,
86
+ glowPrimarySoft: "0 0 0 3px rgba(23, 181, 129, 0.16), 0 2px 8px -2px rgba(23, 181, 129, 0.25)",
87
+ glowPrimaryFaint: "0 0 0 2px rgba(23, 181, 129, 0.1), 0 2px 6px -2px rgba(23, 181, 129, 0.16)",
88
+ glowPrimary: "0 6px 20px -6px rgba(23, 181, 129, 0.4)",
89
+ glowPrimaryStrong: "0 10px 28px -8px rgba(23, 181, 129, 0.5)",
90
+ glowVioletSoft: "0 0 0 3px rgba(111, 50, 255, 0.12), 0 2px 8px -2px rgba(111, 50, 255, 0.2)",
91
+ glowVioletFaint: "0 0 0 2px rgba(111, 50, 255, 0.1), 0 2px 6px -2px rgba(111, 50, 255, 0.14)",
92
+ glowViolet: "0 6px 20px -6px rgba(111, 50, 255, 0.32)",
93
+ glowBrand: "-8px 6px 24px -10px rgba(23, 181, 129, 0.4), 8px 6px 24px -10px rgba(111, 50, 255, 0.36)",
94
+ card: `0 1px 2px ${lightInk(0.05)}, 0 4px 12px -4px ${lightInk(0.08)}, 0 14px 32px -16px ${lightInk(0.14)}`,
95
+ cardSecondary: `0 1px 2px ${lightInk(0.05)}, 0 4px 12px -4px ${lightInk(0.08)}, 0 14px 32px -16px ${lightInk(0.14)}`,
96
+ cardHover: `0 2px 4px ${lightInk(0.05)}, 0 10px 24px -8px ${lightInk(0.12)}, 0 22px 44px -18px rgba(111, 50, 255, 0.18)`,
97
+ cardHoverSoft: "0 4px 14px -8px rgba(111, 50, 255, 0.16)",
98
+ raised: `0 1px 2px ${lightInk(0.08)}, 0 3px 8px -3px ${lightInk(0.12)}`,
99
+ buttonPrimary: "0 1px 2px rgba(13, 122, 88, 0.18), 0 4px 10px -6px rgba(23, 181, 129, 0.32)",
100
+ buttonPrimaryHover: "0 1px 2px rgba(13, 122, 88, 0.18), 0 4px 10px -6px rgba(23, 181, 129, 0.32), 0 3px 10px -6px rgba(23, 181, 129, 0.2)",
101
+ buttonViolet: "0 1px 2px rgba(55, 20, 136, 0.22), 0 6px 14px -6px rgba(111, 50, 255, 0.45)",
102
+ // A 1px halo, not glowPrimarySoft's 3px: on white that ring reads as a thick border.
103
+ buttonOutlineHover: "0 0 0 1px rgba(23, 181, 129, 0.12), 0 2px 8px -3px rgba(23, 181, 129, 0.25)",
104
+ // Likewise a 1px halo, where glowVioletSoft's 3px reads as a thick border.
105
+ buttonSurfaceHover: "0 2px 8px -3px rgba(111, 50, 255, 0.22)",
106
+ // The row already carries a 1px ring: the halo is a drop only, or the two
107
+ // stack into the thick green border the light theme showed.
108
+ navActive: "0 2px 8px -3px rgba(23, 181, 129, 0.3)",
109
+ popover: `0 0 0 1px ${lightInk(0.06)}, 0 4px 10px -4px ${lightInk(0.08)}, 0 18px 40px -14px ${lightInk(0.2)}`,
110
+ toast: `0 0 0 1px ${lightInk(0.06)}, 0 10px 28px -10px ${lightInk(0.2)}`
111
+ };
112
+
113
+ // src/tokens/typography.ts
114
+ var typeScale = {
115
+ mini: ["10px", "13px"],
116
+ xxs: ["11px", "15px"],
117
+ tiny: ["12px", "17px"],
118
+ caption: ["14px", "20px"],
119
+ body: ["16px", "24px"],
120
+ subhead: ["18px", "26px"],
121
+ title: ["22px", "30px"],
122
+ headline: ["30px", "36px"],
123
+ display: ["38px", "44px"]
124
+ };
125
+ var letterSpacing = {
126
+ eyebrow: "0.18em",
127
+ eyebrowWide: "0.22em"
128
+ };
129
+ var iconSize = {
130
+ xxs: "11px",
131
+ // dense inline status / timestamp icons
132
+ xs: "13px",
133
+ sm: "14px",
134
+ md: "16px",
135
+ // default
136
+ lg: "18px",
137
+ xl: "20px",
138
+ "2xl": "24px",
139
+ "3xl": "28px",
140
+ "4xl": "32px",
141
+ "5xl": "40px",
142
+ "6xl": "64px"
143
+ // hero / success / error glyphs
144
+ };
145
+
146
+ // src/web/utils/cn.ts
147
+ var camelToKebab = (value) => value.replace(/([A-Z])/g, (m) => `-${m.toLowerCase()}`);
148
+ var fontSizes = [
149
+ ...Object.keys(typeScale),
150
+ ...Object.keys(iconSize).map((key) => `icon-${key}`)
151
+ ];
152
+ var radii = Object.keys(radius).filter(
153
+ (key) => ["card", "panel", "nav", "pill"].includes(key)
154
+ );
155
+ var shadows = Object.keys(shadow).map(camelToKebab);
156
+ var roundedGroups = [
157
+ "rounded",
158
+ "rounded-s",
159
+ "rounded-e",
160
+ "rounded-t",
161
+ "rounded-r",
162
+ "rounded-b",
163
+ "rounded-l",
164
+ "rounded-ss",
165
+ "rounded-se",
166
+ "rounded-ee",
167
+ "rounded-es",
168
+ "rounded-tl",
169
+ "rounded-tr",
170
+ "rounded-br",
171
+ "rounded-bl"
172
+ ];
173
+ var bgImages = [
174
+ "gradient-brand",
175
+ "gradient-brand-dark",
176
+ "gradient-primary",
177
+ "gradient-violet",
178
+ "gradient-card",
179
+ "gradient-card-hero",
180
+ "gradient-active",
181
+ "gradient-headline",
182
+ "page-radial",
183
+ "page-brand",
184
+ "card-sheen"
185
+ ];
186
+ var twMerge = extendTailwindMerge({
187
+ extend: {
188
+ classGroups: {
189
+ "font-size": [{ text: fontSizes }],
190
+ "bg-image": [{ bg: bgImages }],
191
+ "text-gradient": ["text-gradient-brand"],
192
+ "border-gradient": ["border-gradient-brand"],
193
+ tracking: [{ tracking: Object.keys(letterSpacing).map(camelToKebab) }],
194
+ shadow: [{ shadow: shadows }],
195
+ ...Object.fromEntries(
196
+ roundedGroups.map((group) => [group, [{ [group]: radii }]])
197
+ )
198
+ }
199
+ }
200
+ });
201
+ function cn(...inputs) {
202
+ return twMerge(clsx(inputs));
203
+ }
204
+
205
+ export {
206
+ cn
207
+ };
@@ -0,0 +1,56 @@
1
+ "use client";
2
+ import {
3
+ IconGlyph
4
+ } from "./chunk-YQQ7GDLZ.js";
5
+ import {
6
+ cn
7
+ } from "./chunk-PMGIJMRO.js";
8
+ import {
9
+ ExpandMore
10
+ } from "./chunk-XXH4TYKZ.js";
11
+
12
+ // src/web/primitives/collapsible.tsx
13
+ import * as React from "react";
14
+ import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
15
+ import { jsx } from "react/jsx-runtime";
16
+ var Collapsible = CollapsiblePrimitive.Root;
17
+ var CollapsibleTrigger = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
18
+ CollapsiblePrimitive.Trigger,
19
+ {
20
+ ref,
21
+ "data-slot": "collapsible-trigger",
22
+ className: cn("group/collapsible transition-all focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50 focus-visible:shadow-glow-primary-soft", className),
23
+ ...props
24
+ }
25
+ ));
26
+ CollapsibleTrigger.displayName = CollapsiblePrimitive.Trigger.displayName;
27
+ var CollapsibleContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
28
+ CollapsiblePrimitive.Content,
29
+ {
30
+ ref,
31
+ "data-slot": "collapsible-content",
32
+ className: cn("data-[state=open]:animate-fade-in motion-reduce:animate-none", className),
33
+ ...props
34
+ }
35
+ ));
36
+ CollapsibleContent.displayName = CollapsiblePrimitive.Content.displayName;
37
+ function CollapsibleChevron({ className }) {
38
+ return /* @__PURE__ */ jsx(
39
+ IconGlyph,
40
+ {
41
+ glyph: ExpandMore,
42
+ "aria-hidden": "true",
43
+ className: cn(
44
+ "shrink-0 text-icon-md text-muted-foreground transition-transform duration-200 group-hover/collapsible:text-secondary-content group-data-[state=open]/collapsible:rotate-180 group-data-[state=open]/collapsible:text-secondary-content motion-reduce:transition-none",
45
+ className
46
+ )
47
+ }
48
+ );
49
+ }
50
+
51
+ export {
52
+ Collapsible,
53
+ CollapsibleTrigger,
54
+ CollapsibleContent,
55
+ CollapsibleChevron
56
+ };