@cloudflare/kumo 1.17.0 → 1.19.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 (263) hide show
  1. package/CHANGELOG.md +143 -0
  2. package/ai/USAGE.md +38 -32
  3. package/ai/component-registry.json +289 -178
  4. package/ai/component-registry.md +980 -507
  5. package/ai/schemas.ts +20 -4
  6. package/dist/.build-complete +1 -1
  7. package/dist/ai/schemas.d.ts +95 -56
  8. package/dist/ai/schemas.d.ts.map +1 -1
  9. package/dist/ai/schemas.js +165 -148
  10. package/dist/ai/schemas.js.map +1 -1
  11. package/dist/chunks/{Legend-o0ntojbaplmszwk0.js → Legend-ks7se6149vsa3tze.js} +127 -118
  12. package/dist/chunks/Legend-ks7se6149vsa3tze.js.map +1 -0
  13. package/dist/chunks/badge-dan90i0rzy4pwa1j.js +102 -0
  14. package/dist/chunks/badge-dan90i0rzy4pwa1j.js.map +1 -0
  15. package/dist/chunks/{banner-nz0eryqnz3qd86ln.js → banner-eiwcnk7ts21s3bnb.js} +4 -4
  16. package/dist/chunks/{banner-nz0eryqnz3qd86ln.js.map → banner-eiwcnk7ts21s3bnb.js.map} +1 -1
  17. package/dist/chunks/{breadcrumbs-cjgn3w4drahvqnuj.js → breadcrumbs-ge20hcb3o5spswrk.js} +2 -2
  18. package/dist/chunks/{breadcrumbs-cjgn3w4drahvqnuj.js.map → breadcrumbs-ge20hcb3o5spswrk.js.map} +1 -1
  19. package/dist/chunks/{button-odxi0hp4fvi5i2w3.js → button-oaqi7ykdisyskoos.js} +8 -8
  20. package/dist/chunks/button-oaqi7ykdisyskoos.js.map +1 -0
  21. package/dist/chunks/{checkbox-dx8x0rzv582yjv7n.js → checkbox-mwgmohffm22ut13s.js} +15 -15
  22. package/dist/chunks/checkbox-mwgmohffm22ut13s.js.map +1 -0
  23. package/dist/chunks/{clipboard-text-kyk51d1ze7zvdn4q.js → clipboard-text-dxczqon3d27xp6f0.js} +10 -10
  24. package/dist/chunks/{clipboard-text-kyk51d1ze7zvdn4q.js.map → clipboard-text-dxczqon3d27xp6f0.js.map} +1 -1
  25. package/dist/chunks/{cloudflare-logo-bgts2jgsdh7sslw4.js → cloudflare-logo-pbavoe1wu8nr5c4n.js} +9 -9
  26. package/dist/chunks/{cloudflare-logo-bgts2jgsdh7sslw4.js.map → cloudflare-logo-pbavoe1wu8nr5c4n.js.map} +1 -1
  27. package/dist/chunks/{code-liq1g6f5lhee305d.js → code-cz0w1y5z4h29a9eg.js} +18 -18
  28. package/dist/chunks/code-cz0w1y5z4h29a9eg.js.map +1 -0
  29. package/dist/chunks/{combobox-9fhjzprab46csmon.js → combobox-eaowwt1xr4d23gsn.js} +113 -101
  30. package/dist/chunks/combobox-eaowwt1xr4d23gsn.js.map +1 -0
  31. package/dist/chunks/{command-palette-kenx2bbdzd4kpx36.js → command-palette-maqtbmpfev9mysqd.js} +20 -20
  32. package/dist/chunks/command-palette-maqtbmpfev9mysqd.js.map +1 -0
  33. package/dist/chunks/{dialog-e05ysa8t2fklw065.js → dialog-e3m5bhs7fds26p9y.js} +25 -25
  34. package/dist/chunks/dialog-e3m5bhs7fds26p9y.js.map +1 -0
  35. package/dist/chunks/{dropdown-g587px7zv3ssaxr4.js → dropdown-ewte287db3vyt8t5.js} +94 -92
  36. package/dist/chunks/{dropdown-g587px7zv3ssaxr4.js.map → dropdown-ewte287db3vyt8t5.js.map} +1 -1
  37. package/dist/chunks/{empty-fuz1un7r7mbz0kim.js → empty-dr1eckm2z40euns6.js} +2 -2
  38. package/dist/chunks/{empty-fuz1un7r7mbz0kim.js.map → empty-dr1eckm2z40euns6.js.map} +1 -1
  39. package/dist/chunks/{field-fq504lyu7ttsh5m9.js → field-bo5gmna16odrrb1q.js} +3 -3
  40. package/dist/chunks/{field-fq504lyu7ttsh5m9.js.map → field-bo5gmna16odrrb1q.js.map} +1 -1
  41. package/dist/chunks/{grid-m9r71jxo2b8q1972.js → grid-hj1ylz16p7g5uelh.js} +2 -2
  42. package/dist/chunks/{grid-m9r71jxo2b8q1972.js.map → grid-hj1ylz16p7g5uelh.js.map} +1 -1
  43. package/dist/chunks/input-area-jkkkjej6luumrqpa.js +78 -0
  44. package/dist/chunks/input-area-jkkkjej6luumrqpa.js.map +1 -0
  45. package/dist/chunks/input-cw05pbqdburghkus.js +113 -0
  46. package/dist/chunks/input-cw05pbqdburghkus.js.map +1 -0
  47. package/dist/chunks/{input-group-hbebbyh8fo6aqydn.js → input-group-lfugneuz71g42n0w.js} +27 -27
  48. package/dist/chunks/input-group-lfugneuz71g42n0w.js.map +1 -0
  49. package/dist/chunks/label-cvyvbqmt4mt757ff.js +68 -0
  50. package/dist/chunks/{label-j9owppbgnn35mebg.js.map → label-cvyvbqmt4mt757ff.js.map} +1 -1
  51. package/dist/chunks/layer-card-ljqth3yxgnk04v2o.js +46 -0
  52. package/dist/chunks/layer-card-ljqth3yxgnk04v2o.js.map +1 -0
  53. package/dist/chunks/{link-hmmf3k1xn6rm72rt.js → link-fjnhtxvfe5ieamjf.js} +2 -2
  54. package/dist/chunks/{link-hmmf3k1xn6rm72rt.js.map → link-fjnhtxvfe5ieamjf.js.map} +1 -1
  55. package/dist/chunks/{loader-m5wfmqwgucrr4i5v.js → loader-hr2w7cpqeev3p3vl.js} +9 -6
  56. package/dist/chunks/loader-hr2w7cpqeev3p3vl.js.map +1 -0
  57. package/dist/chunks/menubar-e5e4zwfagr0wx023.js +96 -0
  58. package/dist/chunks/menubar-e5e4zwfagr0wx023.js.map +1 -0
  59. package/dist/chunks/{meter-i84dte2f82qmvn7y.js → meter-duj3micor1lqj3y2.js} +2 -2
  60. package/dist/chunks/{meter-i84dte2f82qmvn7y.js.map → meter-duj3micor1lqj3y2.js.map} +1 -1
  61. package/dist/chunks/pagination-olaypvwr8swsmn8m.js +266 -0
  62. package/dist/chunks/pagination-olaypvwr8swsmn8m.js.map +1 -0
  63. package/dist/chunks/{popover-i951xjcgezeqr4iv.js → popover-nv9cmzbo7mf6bky0.js} +68 -72
  64. package/dist/chunks/popover-nv9cmzbo7mf6bky0.js.map +1 -0
  65. package/dist/chunks/{radio-l2vkcue40d84fmo1.js → radio-ihxbe37us2jnqtzf.js} +38 -38
  66. package/dist/chunks/radio-ihxbe37us2jnqtzf.js.map +1 -0
  67. package/dist/chunks/select-nx6ded5swra74iar.js +213 -0
  68. package/dist/chunks/select-nx6ded5swra74iar.js.map +1 -0
  69. package/dist/chunks/{sensitive-input-kznmknpp5h1grc6k.js → sensitive-input-00fujb510rrn61v9.js} +34 -34
  70. package/dist/chunks/{sensitive-input-kznmknpp5h1grc6k.js.map → sensitive-input-00fujb510rrn61v9.js.map} +1 -1
  71. package/dist/chunks/{sidebar-jepeq7gaf4issuw6.js → sidebar-ltbfius1eolkl8tb.js} +24 -28
  72. package/dist/chunks/sidebar-ltbfius1eolkl8tb.js.map +1 -0
  73. package/dist/chunks/surface-dfgurg5eu3et4vw1.js +29 -0
  74. package/dist/chunks/surface-dfgurg5eu3et4vw1.js.map +1 -0
  75. package/dist/chunks/{switch-i0zwcp3wq6vsxm1c.js → switch-fbv3iawqo3o3jgap.js} +104 -102
  76. package/dist/chunks/switch-fbv3iawqo3o3jgap.js.map +1 -0
  77. package/dist/chunks/table-of-contents-f813ivi7ta23vqdm.js +88 -0
  78. package/dist/chunks/table-of-contents-f813ivi7ta23vqdm.js.map +1 -0
  79. package/dist/chunks/table-olwwulga2l3hdwlx.js +189 -0
  80. package/dist/chunks/table-olwwulga2l3hdwlx.js.map +1 -0
  81. package/dist/chunks/{tabs-bw92jb303zxw7w4f.js → tabs-lohcglgppp6gj0hp.js} +16 -16
  82. package/dist/chunks/{tabs-bw92jb303zxw7w4f.js.map → tabs-lohcglgppp6gj0hp.js.map} +1 -1
  83. package/dist/chunks/{toast-lrnwby56drs7vtae.js → toast-dg52x89yd231mxhe.js} +30 -30
  84. package/dist/chunks/{toast-lrnwby56drs7vtae.js.map → toast-dg52x89yd231mxhe.js.map} +1 -1
  85. package/dist/chunks/{tooltip-cit9ltlxfuhwctuj.js → tooltip-hikjvdbg3xghnq1x.js} +38 -33
  86. package/dist/chunks/tooltip-hikjvdbg3xghnq1x.js.map +1 -0
  87. package/dist/chunks/{vendor-base-ui-n30qblevnpk9cc5c.js → vendor-base-ui-m5pz3e8c4grg5qmj.js} +46 -43
  88. package/dist/chunks/{vendor-base-ui-n30qblevnpk9cc5c.js.map → vendor-base-ui-m5pz3e8c4grg5qmj.js.map} +1 -1
  89. package/dist/code.js +1 -1
  90. package/dist/components/badge.js +1 -1
  91. package/dist/components/banner.js +1 -1
  92. package/dist/components/breadcrumbs.js +1 -1
  93. package/dist/components/button.js +1 -1
  94. package/dist/components/chart.js +1 -1
  95. package/dist/components/checkbox.js +1 -1
  96. package/dist/components/clipboard-text.js +1 -1
  97. package/dist/components/cloudflare-logo.js +1 -1
  98. package/dist/components/code.js +1 -1
  99. package/dist/components/combobox.js +1 -1
  100. package/dist/components/command-palette.js +1 -1
  101. package/dist/components/dialog.js +1 -1
  102. package/dist/components/dropdown.js +1 -1
  103. package/dist/components/empty.js +1 -1
  104. package/dist/components/field.js +1 -1
  105. package/dist/components/flow.js +2 -2
  106. package/dist/components/flow.js.map +1 -1
  107. package/dist/components/grid.js +1 -1
  108. package/dist/components/input.js +3 -3
  109. package/dist/components/label.js +1 -1
  110. package/dist/components/layer-card.js +1 -1
  111. package/dist/components/link.js +1 -1
  112. package/dist/components/loader.js +1 -1
  113. package/dist/components/menubar.js +1 -1
  114. package/dist/components/meter.js +1 -1
  115. package/dist/components/pagination.js +1 -1
  116. package/dist/components/popover.js +1 -1
  117. package/dist/components/radio.js +1 -1
  118. package/dist/components/select.js +1 -1
  119. package/dist/components/sensitive-input.js +1 -1
  120. package/dist/components/sidebar.js +1 -1
  121. package/dist/components/surface.js +1 -1
  122. package/dist/components/switch.js +1 -1
  123. package/dist/components/table-of-contents.js +8 -0
  124. package/dist/components/table-of-contents.js.map +1 -0
  125. package/dist/components/table.js +1 -1
  126. package/dist/components/tabs.js +1 -1
  127. package/dist/components/toast.js +2 -2
  128. package/dist/components/tooltip.js +1 -1
  129. package/dist/index.js +128 -124
  130. package/dist/index.js.map +1 -1
  131. package/dist/primitives/accordion.js +1 -1
  132. package/dist/primitives/alert-dialog.js +1 -1
  133. package/dist/primitives/autocomplete.js +1 -1
  134. package/dist/primitives/avatar.js +1 -1
  135. package/dist/primitives/button.js +1 -1
  136. package/dist/primitives/checkbox-group.js +1 -1
  137. package/dist/primitives/checkbox.js +1 -1
  138. package/dist/primitives/collapsible.js +1 -1
  139. package/dist/primitives/combobox.js +1 -1
  140. package/dist/primitives/context-menu.js +1 -1
  141. package/dist/primitives/csp-provider.js +1 -1
  142. package/dist/primitives/dialog.js +1 -1
  143. package/dist/primitives/direction-provider.js +1 -1
  144. package/dist/primitives/drawer.js +1 -1
  145. package/dist/primitives/field.js +1 -1
  146. package/dist/primitives/fieldset.js +1 -1
  147. package/dist/primitives/form.js +1 -1
  148. package/dist/primitives/input.js +1 -1
  149. package/dist/primitives/menu.js +1 -1
  150. package/dist/primitives/menubar.js +1 -1
  151. package/dist/primitives/meter.js +1 -1
  152. package/dist/primitives/navigation-menu.js +1 -1
  153. package/dist/primitives/number-field.js +1 -1
  154. package/dist/primitives/popover.js +1 -1
  155. package/dist/primitives/preview-card.js +1 -1
  156. package/dist/primitives/progress.js +1 -1
  157. package/dist/primitives/radio-group.js +1 -1
  158. package/dist/primitives/radio.js +1 -1
  159. package/dist/primitives/scroll-area.js +1 -1
  160. package/dist/primitives/select.js +1 -1
  161. package/dist/primitives/separator.js +1 -1
  162. package/dist/primitives/slider.js +1 -1
  163. package/dist/primitives/switch.js +1 -1
  164. package/dist/primitives/tabs.js +1 -1
  165. package/dist/primitives/toast.js +1 -1
  166. package/dist/primitives/toggle-group.js +1 -1
  167. package/dist/primitives/toggle.js +1 -1
  168. package/dist/primitives/toolbar.js +1 -1
  169. package/dist/primitives/tooltip.js +1 -1
  170. package/dist/primitives.js +1 -1
  171. package/dist/scripts/theme-generator/config.d.ts.map +1 -1
  172. package/dist/scripts/theme-generator/config.js +32 -113
  173. package/dist/scripts/theme-generator/config.js.map +1 -1
  174. package/dist/src/components/badge/badge.d.ts +61 -79
  175. package/dist/src/components/badge/badge.d.ts.map +1 -1
  176. package/dist/src/components/banner/banner.d.ts +3 -3
  177. package/dist/src/components/button/button.d.ts +3 -3
  178. package/dist/src/components/button/button.d.ts.map +1 -1
  179. package/dist/src/components/chart/EChart.d.ts +18 -2
  180. package/dist/src/components/chart/EChart.d.ts.map +1 -1
  181. package/dist/src/components/chart/TimeseriesChart.d.ts.map +1 -1
  182. package/dist/src/components/chart/index.d.ts +1 -1
  183. package/dist/src/components/chart/index.d.ts.map +1 -1
  184. package/dist/src/components/checkbox/checkbox.d.ts +1 -1
  185. package/dist/src/components/code/code.d.ts.map +1 -1
  186. package/dist/src/components/combobox/combobox.d.ts +16 -2
  187. package/dist/src/components/combobox/combobox.d.ts.map +1 -1
  188. package/dist/src/components/dropdown/dropdown.d.ts.map +1 -1
  189. package/dist/src/components/input/input-area.d.ts.map +1 -1
  190. package/dist/src/components/input/input.d.ts +1 -2
  191. package/dist/src/components/input/input.d.ts.map +1 -1
  192. package/dist/src/components/label/label.d.ts.map +1 -1
  193. package/dist/src/components/layer-card/layer-card.d.ts +39 -5
  194. package/dist/src/components/layer-card/layer-card.d.ts.map +1 -1
  195. package/dist/src/components/loader/loader.d.ts +7 -1
  196. package/dist/src/components/loader/loader.d.ts.map +1 -1
  197. package/dist/src/components/menubar/menubar.d.ts.map +1 -1
  198. package/dist/src/components/pagination/pagination.d.ts +62 -2
  199. package/dist/src/components/pagination/pagination.d.ts.map +1 -1
  200. package/dist/src/components/popover/popover.d.ts +35 -8
  201. package/dist/src/components/popover/popover.d.ts.map +1 -1
  202. package/dist/src/components/radio/radio.d.ts +2 -2
  203. package/dist/src/components/select/select.d.ts +115 -7
  204. package/dist/src/components/select/select.d.ts.map +1 -1
  205. package/dist/src/components/sensitive-input/sensitive-input.d.ts +1 -1
  206. package/dist/src/components/sidebar/sidebar.d.ts +2 -2
  207. package/dist/src/components/sidebar/sidebar.d.ts.map +1 -1
  208. package/dist/src/components/surface/index.d.ts +3 -0
  209. package/dist/src/components/surface/index.d.ts.map +1 -1
  210. package/dist/src/components/surface/surface.d.ts +14 -10
  211. package/dist/src/components/surface/surface.d.ts.map +1 -1
  212. package/dist/src/components/switch/switch.d.ts.map +1 -1
  213. package/dist/src/components/table/table.d.ts.map +1 -1
  214. package/dist/src/components/table-of-contents/index.d.ts +2 -0
  215. package/dist/src/components/table-of-contents/index.d.ts.map +1 -0
  216. package/dist/src/components/table-of-contents/table-of-contents.d.ts +70 -0
  217. package/dist/src/components/table-of-contents/table-of-contents.d.ts.map +1 -0
  218. package/dist/src/components/toast/toast.d.ts +1 -1
  219. package/dist/src/components/tooltip/tooltip.d.ts +25 -6
  220. package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
  221. package/dist/src/index.d.ts +6 -2
  222. package/dist/src/index.d.ts.map +1 -1
  223. package/dist/styles/kumo-binding.css +4 -0
  224. package/dist/styles/kumo-standalone.css +1 -1
  225. package/dist/styles/theme-fedramp.css +3 -3
  226. package/dist/styles/theme-kumo.css +66 -127
  227. package/package.json +5 -1
  228. package/scripts/component-registry/index.test.ts +4 -4
  229. package/scripts/component-registry/metadata.ts +3 -3
  230. package/scripts/theme-generator/config.ts +37 -116
  231. package/dist/chunks/Legend-o0ntojbaplmszwk0.js.map +0 -1
  232. package/dist/chunks/badge-n80t3z8u9ttlxi20.js +0 -120
  233. package/dist/chunks/badge-n80t3z8u9ttlxi20.js.map +0 -1
  234. package/dist/chunks/button-odxi0hp4fvi5i2w3.js.map +0 -1
  235. package/dist/chunks/checkbox-dx8x0rzv582yjv7n.js.map +0 -1
  236. package/dist/chunks/code-liq1g6f5lhee305d.js.map +0 -1
  237. package/dist/chunks/combobox-9fhjzprab46csmon.js.map +0 -1
  238. package/dist/chunks/command-palette-kenx2bbdzd4kpx36.js.map +0 -1
  239. package/dist/chunks/dialog-e05ysa8t2fklw065.js.map +0 -1
  240. package/dist/chunks/input-area-nq40szg9110on89c.js +0 -74
  241. package/dist/chunks/input-area-nq40szg9110on89c.js.map +0 -1
  242. package/dist/chunks/input-group-hbebbyh8fo6aqydn.js.map +0 -1
  243. package/dist/chunks/input-kvhyo3p4859bexvx.js +0 -109
  244. package/dist/chunks/input-kvhyo3p4859bexvx.js.map +0 -1
  245. package/dist/chunks/label-j9owppbgnn35mebg.js +0 -62
  246. package/dist/chunks/layer-card-l5yjvrxry1dhte57.js +0 -44
  247. package/dist/chunks/layer-card-l5yjvrxry1dhte57.js.map +0 -1
  248. package/dist/chunks/loader-m5wfmqwgucrr4i5v.js.map +0 -1
  249. package/dist/chunks/menubar-abojnm0uwjuni8ok.js +0 -92
  250. package/dist/chunks/menubar-abojnm0uwjuni8ok.js.map +0 -1
  251. package/dist/chunks/pagination-pbd7qqik97ac0l7m.js +0 -224
  252. package/dist/chunks/pagination-pbd7qqik97ac0l7m.js.map +0 -1
  253. package/dist/chunks/popover-i951xjcgezeqr4iv.js.map +0 -1
  254. package/dist/chunks/radio-l2vkcue40d84fmo1.js.map +0 -1
  255. package/dist/chunks/select-paedwa3nlhpq82ua.js +0 -132
  256. package/dist/chunks/select-paedwa3nlhpq82ua.js.map +0 -1
  257. package/dist/chunks/sidebar-jepeq7gaf4issuw6.js.map +0 -1
  258. package/dist/chunks/surface-blo81kgy9g0sexgm.js +0 -36
  259. package/dist/chunks/surface-blo81kgy9g0sexgm.js.map +0 -1
  260. package/dist/chunks/switch-i0zwcp3wq6vsxm1c.js.map +0 -1
  261. package/dist/chunks/table-nrcw19tlpduayukl.js +0 -183
  262. package/dist/chunks/table-nrcw19tlpduayukl.js.map +0 -1
  263. package/dist/chunks/tooltip-cit9ltlxfuhwctuj.js.map +0 -1
@@ -53,7 +53,7 @@ export const THEME_CONFIG: ThemeConfig = {
53
53
  theme: {
54
54
  kumo: {
55
55
  light: "var(--color-neutral-500, oklch(55.6% 0 0))",
56
- dark: "var(--color-kumo-neutral-50, oklch(97.5% 0 0))",
56
+ dark: "var(--color-neutral-400, oklch(70.8% 0 0))",
57
57
  },
58
58
  },
59
59
  },
@@ -97,7 +97,7 @@ export const THEME_CONFIG: ThemeConfig = {
97
97
  newName: "",
98
98
  theme: {
99
99
  kumo: {
100
- light: "var(--color-blue-700, oklch(48.8% 0.243 264.376))",
100
+ light: "var(--color-blue-800, oklch(42.4% 0.199 265.638))",
101
101
  dark: "var(--color-blue-400, oklch(70.7% 0.165 254.624))",
102
102
  },
103
103
  },
@@ -106,8 +106,8 @@ export const THEME_CONFIG: ThemeConfig = {
106
106
  newName: "",
107
107
  theme: {
108
108
  kumo: {
109
- light: "var(--color-green-500, oklch(72.3% 0.219 149.579))",
110
- dark: "var(--color-green-400, oklch(79.2% 0.209 151.711))",
109
+ light: "var(--color-emerald-800, oklch(43.2% 0.095 166.913))",
110
+ dark: "var(--color-emerald-200, oklch(90.5% 0.093 164.15))",
111
111
  },
112
112
  },
113
113
  },
@@ -134,16 +134,6 @@ export const THEME_CONFIG: ThemeConfig = {
134
134
  * Badge text color tokens
135
135
  * Subtle variants need colored text; inverted needs flipping text
136
136
  */
137
- "kumo-badge-red-subtle": {
138
- newName: "",
139
- description: "Text color for subtle red badge",
140
- theme: {
141
- kumo: {
142
- light: "var(--color-red-800, oklch(44.4% 0.177 26.899))",
143
- dark: "var(--color-red-200, oklch(88.5% 0.062 18.334))",
144
- },
145
- },
146
- },
147
137
  "kumo-badge-orange-subtle": {
148
138
  newName: "",
149
139
  description: "Text color for subtle orange badge",
@@ -154,26 +144,6 @@ export const THEME_CONFIG: ThemeConfig = {
154
144
  },
155
145
  },
156
146
  },
157
- "kumo-badge-yellow-subtle": {
158
- newName: "",
159
- description: "Text color for subtle yellow badge",
160
- theme: {
161
- kumo: {
162
- light: "var(--color-yellow-800, oklch(47.6% 0.114 61.907))",
163
- dark: "var(--color-yellow-200, oklch(94.5% 0.129 101.54))",
164
- },
165
- },
166
- },
167
- "kumo-badge-green-subtle": {
168
- newName: "",
169
- description: "Text color for subtle green badge",
170
- theme: {
171
- kumo: {
172
- light: "var(--color-emerald-800, oklch(43.2% 0.095 166.913))",
173
- dark: "var(--color-emerald-200, oklch(90.5% 0.093 164.15))",
174
- },
175
- },
176
- },
177
147
  "kumo-badge-teal-subtle": {
178
148
  newName: "",
179
149
  description: "Text color for subtle teal badge",
@@ -184,16 +154,6 @@ export const THEME_CONFIG: ThemeConfig = {
184
154
  },
185
155
  },
186
156
  },
187
- "kumo-badge-blue-subtle": {
188
- newName: "",
189
- description: "Text color for subtle blue badge",
190
- theme: {
191
- kumo: {
192
- light: "var(--color-blue-800, oklch(42.4% 0.199 265.638))",
193
- dark: "var(--color-blue-200, oklch(88.2% 0.059 254.128))",
194
- },
195
- },
196
- },
197
157
  "kumo-badge-neutral-subtle": {
198
158
  newName: "",
199
159
  description: "Text color for subtle neutral badge",
@@ -206,7 +166,8 @@ export const THEME_CONFIG: ThemeConfig = {
206
166
  },
207
167
  "kumo-badge-inverted": {
208
168
  newName: "",
209
- description: "Text color for inverted badge (white in light, black in dark)",
169
+ description:
170
+ "Text color for inverted badge (white in light, black in dark)",
210
171
  theme: {
211
172
  kumo: {
212
173
  light: "var(--color-white, #fff)",
@@ -234,7 +195,7 @@ export const THEME_CONFIG: ThemeConfig = {
234
195
  dark: "#5b697c",
235
196
  },
236
197
  },
237
- },
198
+ },
238
199
  "kumo-elevated": {
239
200
  newName: "",
240
201
  theme: {
@@ -249,7 +210,7 @@ export const THEME_CONFIG: ThemeConfig = {
249
210
  theme: {
250
211
  kumo: {
251
212
  light: "var(--color-kumo-neutral-125, oklch(96% 0 0))",
252
- dark: "var(--color-kumo-neutral-950, oklch(12% 0 0))",
213
+ dark: "var(--color-kumo-neutral-950, oklch(15% 0 0))",
253
214
  },
254
215
  },
255
216
  },
@@ -352,16 +313,16 @@ export const THEME_CONFIG: ThemeConfig = {
352
313
  theme: {
353
314
  kumo: {
354
315
  light: "oklch(14.5% 0 0 / 0.1)",
355
- dark: "var(--color-neutral-800, oklch(26.9% 0 0))",
316
+ dark: "var(--color-kumo-neutral-750, oklch(32% 0 0))",
356
317
  },
357
318
  },
358
319
  },
359
- "kumo-ring": {
320
+ "kumo-hairline": {
360
321
  newName: "",
361
322
  theme: {
362
323
  kumo: {
363
324
  light: "var(--color-kumo-neutral-150, oklch(93.5% 0 0))",
364
- dark: "var(--color-neutral-700, oklch(37.1% 0 0))",
325
+ dark: "var(--color-neutral-800, oklch(26.9% 0 0))",
365
326
  },
366
327
  fedramp: {
367
328
  light: "#c8d4e5",
@@ -407,16 +368,16 @@ export const THEME_CONFIG: ThemeConfig = {
407
368
  },
408
369
  },
409
370
  },
410
- "kumo-info": {
371
+ "kumo-info-tint": {
411
372
  newName: "",
412
373
  theme: {
413
374
  kumo: {
414
- light: "var(--color-blue-500, oklch(62.3% 0.214 259.815))",
415
- dark: "var(--color-blue-400, oklch(70.7% 0.165 254.624))",
375
+ light: "var(--color-blue-100, oklch(93.2% 0.032 255.585))",
376
+ dark: "var(--color-blue-900, oklch(37.9% 0.146 265.522))",
416
377
  },
417
378
  },
418
379
  },
419
- "kumo-info-tint": {
380
+ "kumo-info": {
420
381
  newName: "",
421
382
  theme: {
422
383
  kumo: {
@@ -425,16 +386,16 @@ export const THEME_CONFIG: ThemeConfig = {
425
386
  },
426
387
  },
427
388
  },
428
- "kumo-warning": {
389
+ "kumo-warning-tint": {
429
390
  newName: "",
430
391
  theme: {
431
392
  kumo: {
432
- light: "var(--color-yellow-500, oklch(79.5% 0.184 86.047))",
393
+ light: "var(--color-yellow-100, oklch(97.3% 0.071 103.193))",
433
394
  dark: "var(--color-yellow-700, oklch(55.4% 0.135 66.442))",
434
395
  },
435
396
  },
436
397
  },
437
- "kumo-warning-tint": {
398
+ "kumo-warning": {
438
399
  newName: "",
439
400
  theme: {
440
401
  kumo: {
@@ -443,34 +404,34 @@ export const THEME_CONFIG: ThemeConfig = {
443
404
  },
444
405
  },
445
406
  },
446
- "kumo-danger": {
407
+ "kumo-danger-tint": {
447
408
  newName: "",
448
409
  theme: {
449
410
  kumo: {
450
- light: "var(--color-red-500, oklch(63.7% 0.237 25.331))",
451
- dark: "var(--color-red-700, oklch(50.5% 0.213 27.518))",
411
+ light: "var(--color-red-100, oklch(93.6% 0.032 17.717))",
412
+ dark: "var(--color-red-900, oklch(39.6% 0.141 25.723))",
452
413
  },
453
414
  },
454
415
  },
455
- "kumo-danger-tint": {
416
+ "kumo-danger": {
456
417
  newName: "",
457
418
  theme: {
458
419
  kumo: {
459
- light: "var(--color-red-300, oklch(80.8% 0.114 19.571))",
420
+ light: "var(--color-red-500, oklch(63.7% 0.237 25.331))",
460
421
  dark: "var(--color-red-900, oklch(39.6% 0.141 25.723))",
461
422
  },
462
423
  },
463
424
  },
464
- "kumo-success": {
425
+ "kumo-success-tint": {
465
426
  newName: "",
466
427
  theme: {
467
428
  kumo: {
468
- light: "var(--color-green-500, oklch(72.3% 0.219 149.579))",
469
- dark: "var(--color-green-700, oklch(52.7% 0.154 150.069))",
429
+ light: "var(--color-emerald-100, oklch(95% 0.052 163.051))",
430
+ dark: "var(--color-emerald-900, oklch(37.8% 0.077 168.94))",
470
431
  },
471
432
  },
472
433
  },
473
- "kumo-success-tint": {
434
+ "kumo-success": {
474
435
  newName: "",
475
436
  theme: {
476
437
  kumo: {
@@ -497,16 +458,6 @@ export const THEME_CONFIG: ThemeConfig = {
497
458
  },
498
459
  },
499
460
  },
500
- "kumo-badge-red-subtle": {
501
- newName: "",
502
- description: "Subtle red badge background",
503
- theme: {
504
- kumo: {
505
- light: "var(--color-red-100, oklch(93.6% 0.032 17.717))",
506
- dark: "var(--color-red-900, oklch(39.6% 0.141 25.723))",
507
- },
508
- },
509
- },
510
461
 
511
462
  // Orange
512
463
  "kumo-badge-orange": {
@@ -514,8 +465,8 @@ export const THEME_CONFIG: ThemeConfig = {
514
465
  description: "Orange badge background",
515
466
  theme: {
516
467
  kumo: {
517
- light: "var(--color-orange-600, oklch(64.6% 0.222 41.116))",
518
- dark: "var(--color-orange-700, oklch(55.3% 0.195 38.402))",
468
+ light: "var(--color-orange-650, oklch(81.5% 0.197 76))",
469
+ dark: "var(--color-orange-650, oklch(81.5% 0.197 76))",
519
470
  },
520
471
  },
521
472
  },
@@ -530,24 +481,13 @@ export const THEME_CONFIG: ThemeConfig = {
530
481
  },
531
482
  },
532
483
 
533
- // Yellow
534
- "kumo-badge-yellow": {
535
- newName: "",
536
- description: "Yellow badge background",
537
- theme: {
538
- kumo: {
539
- light: "var(--color-yellow-600, oklch(68.1% 0.162 75.834))",
540
- dark: "var(--color-yellow-700, oklch(55.4% 0.135 66.442))",
541
- },
542
- },
543
- },
544
- "kumo-badge-yellow-subtle": {
484
+ "kumo-badge-purple": {
545
485
  newName: "",
546
- description: "Subtle yellow badge background",
486
+ description: "Purple badge background",
547
487
  theme: {
548
488
  kumo: {
549
- light: "var(--color-yellow-100, oklch(97.3% 0.071 103.193))",
550
- dark: "var(--color-yellow-900, oklch(42.1% 0.095 57.708))",
489
+ light: "var(--color-purple-600, oklch(60% 0.118 184.704))",
490
+ dark: "var(--color-purple-700, oklch(50.8% 0.118 165.612))",
551
491
  },
552
492
  },
553
493
  },
@@ -558,21 +498,11 @@ export const THEME_CONFIG: ThemeConfig = {
558
498
  description: "Green badge background",
559
499
  theme: {
560
500
  kumo: {
561
- light: "var(--color-emerald-600, oklch(59.6% 0.145 163.225))",
501
+ light: "var(--color-emerald-700, oklch(50.8% 0.118 165.612))",
562
502
  dark: "var(--color-emerald-700, oklch(50.8% 0.118 165.612))",
563
503
  },
564
504
  },
565
505
  },
566
- "kumo-badge-green-subtle": {
567
- newName: "",
568
- description: "Subtle green badge background",
569
- theme: {
570
- kumo: {
571
- light: "var(--color-emerald-100, oklch(95% 0.052 163.051))",
572
- dark: "var(--color-emerald-900, oklch(37.8% 0.077 168.94))",
573
- },
574
- },
575
- },
576
506
 
577
507
  // Teal
578
508
  "kumo-badge-teal": {
@@ -580,7 +510,7 @@ export const THEME_CONFIG: ThemeConfig = {
580
510
  description: "Teal badge background",
581
511
  theme: {
582
512
  kumo: {
583
- light: "var(--color-teal-600, oklch(60% 0.118 184.704))",
513
+ light: "var(--color-teal-650, oklch(54.9% 0.096 184.565))",
584
514
  dark: "var(--color-teal-700, oklch(51.1% 0.096 186.391))",
585
515
  },
586
516
  },
@@ -607,16 +537,6 @@ export const THEME_CONFIG: ThemeConfig = {
607
537
  },
608
538
  },
609
539
  },
610
- "kumo-badge-blue-subtle": {
611
- newName: "",
612
- description: "Subtle blue badge background",
613
- theme: {
614
- kumo: {
615
- light: "var(--color-blue-100, oklch(93.2% 0.032 255.585))",
616
- dark: "var(--color-blue-900, oklch(37.9% 0.146 265.522))",
617
- },
618
- },
619
- },
620
540
 
621
541
  // Neutral
622
542
  "kumo-badge-neutral": {
@@ -635,7 +555,8 @@ export const THEME_CONFIG: ThemeConfig = {
635
555
  // Inverted
636
556
  "kumo-badge-inverted": {
637
557
  newName: "",
638
- description: "Inverted badge background (near-black in light, white in dark)",
558
+ description:
559
+ "Inverted badge background (near-black in light, white in dark)",
639
560
  theme: {
640
561
  kumo: {
641
562
  light: "var(--color-neutral-950, oklch(14.5% 0 0))",
@@ -1 +0,0 @@
1
- {"version":3,"file":"Legend-o0ntojbaplmszwk0.js","sources":["../../src/components/chart/Color.ts","../../src/components/chart/EChart.tsx","../../src/components/chart/TimeseriesChart.tsx","../../src/components/chart/Legend.tsx"],"sourcesContent":["/**\n * Categorical colors for light mode — used when assigning colors to data series\n * by index (e.g. the first series gets Blue, the second gets Violet, etc.).\n */\nenum ChartCategoricalLightColors {\n Blue = \"#086FFF\",\n Violet = \"#CF7EE9\",\n Cyan = \"#73CEE6\",\n Indigo = \"#5B5FEF\",\n LightBlue = \"#82B6FF\",\n Pink = \"#F5609F\",\n Indigo3 = \"#C2BDF3\",\n Violet2 = \"#8D1EB1\",\n Violet3 = \"#EBCAF6\",\n Indigo2 = \"#7366E4\",\n}\n\n/**\n * Categorical colors for dark mode — same hues as the light palette but with\n * `E6` alpha (90% opacity) appended to soften contrast on dark backgrounds.\n */\nenum ChartCategoricalDarkColors {\n Blue = \"#086FFFE6\",\n Violet = \"#CF7EE9E6\",\n Cyan = \"#73CEE6E6\",\n Indigo = \"#5B5FEFE6\",\n LightBlue = \"#82B6FFE6\",\n Pink = \"#F5609FE6\",\n Indigo3 = \"#C2BDF3E6\",\n Violet2 = \"#8D1EB1E6\",\n Violet3 = \"#EBCAF6E6\",\n Indigo2 = \"#7366E4E6\",\n}\n\n/**\n * Semantic colors for light mode — used to convey meaning (status, severity)\n * rather than just distinguishing series. Use via `ChartPalette.semantic()`.\n */\nenum ChartSemanticLightColors {\n Attention = \"#FC574A\",\n Warning = \"#F8A054\",\n Neutral = \"#82B6FF\",\n NeutralLight = \"#B9D6FF\",\n Disabled = \"#B6B6B6\",\n DisabledLight = \"#D9D9D9\",\n}\n\n/**\n * Semantic colors for dark mode — same meanings as the light palette but with\n * `E6` alpha (90% opacity) for dark backgrounds.\n */\nenum ChartSemanticDarkColors {\n Attention = \"#FC574AE6\",\n Warning = \"#F8A054E6\",\n Neutral = \"#82B6FFE6\",\n NeutralLight = \"#B9D6FFE6\",\n Disabled = \"#B6B6B6E6\",\n DisabledLight = \"#D9D9D9E6\",\n}\n\n/**\n * Ordered list of categorical colors for light mode, indexed by series position.\n * Used as the default ECharts color palette when `isDarkMode` is `false`.\n */\nexport const CHART_LIGHT_COLORS = [\n ChartCategoricalLightColors.Blue,\n ChartCategoricalLightColors.Violet,\n ChartCategoricalLightColors.Cyan,\n ChartCategoricalLightColors.Indigo,\n ChartCategoricalLightColors.LightBlue,\n ChartCategoricalLightColors.Pink,\n ChartCategoricalLightColors.Indigo3,\n ChartCategoricalLightColors.Violet2,\n ChartCategoricalLightColors.Violet3,\n ChartCategoricalLightColors.Indigo2,\n];\n\n/**\n * Ordered list of categorical colors for dark mode, indexed by series position.\n * Used as the default ECharts color palette when `isDarkMode` is `true`.\n */\nexport const CHART_DARK_COLORS = [\n ChartCategoricalDarkColors.Blue,\n ChartCategoricalDarkColors.Violet,\n ChartCategoricalDarkColors.Cyan,\n ChartCategoricalDarkColors.Indigo,\n ChartCategoricalDarkColors.LightBlue,\n ChartCategoricalDarkColors.Pink,\n ChartCategoricalDarkColors.Indigo3,\n ChartCategoricalDarkColors.Violet2,\n ChartCategoricalDarkColors.Violet3,\n ChartCategoricalDarkColors.Indigo2,\n];\n\n/**\n * Utilities for resolving Kumo chart colors by semantic name or series index.\n * Both functions accept an `isDarkMode` flag and return the appropriate hex color.\n */\nexport namespace ChartPalette {\n /**\n * Returns the hex color for a named semantic value (status, severity, etc.).\n *\n * @example\n * ```ts\n * ChartPalette.semantic(\"Attention\") // \"#FC574A\" (light)\n * ChartPalette.semantic(\"Warning\", true) // \"#F8A054E6\" (dark)\n * ```\n */\n export function semantic(\n name:\n | \"Attention\"\n | \"Warning\"\n | \"Neutral\"\n | \"NeutralLight\"\n | \"Disabled\"\n | \"DisabledLight\",\n isDarkMode = false,\n ) {\n return isDarkMode\n ? ChartSemanticDarkColors[name]\n : ChartSemanticLightColors[name];\n }\n\n /**\n * Returns the categorical color for a given series index.\n * Wraps around via modulo when `index` exceeds the palette length (10 colors).\n *\n * @example\n * ```ts\n * ChartPalette.color(0) // Blue (light)\n * ChartPalette.color(0, true) // Blue with E6 alpha (dark)\n * ChartPalette.color(10) // wraps back to Blue\n * ```\n */\n export function color(index: number, isDarkMode = false) {\n return isDarkMode\n ? CHART_DARK_COLORS[index % CHART_DARK_COLORS.length]\n : CHART_LIGHT_COLORS[index % CHART_LIGHT_COLORS.length];\n }\n}\n","import type * as echarts from \"echarts/core\";\nimport type { EChartsOption, SetOptionOpts } from \"echarts\";\nimport { forwardRef, useEffect, useRef } from \"react\";\nimport { cn } from \"../../utils\";\nimport { CHART_DARK_COLORS, CHART_LIGHT_COLORS } from \"./Color\";\n\n/** Parameters passed to mouse event handlers on chart elements */\ntype EChartsMouseEventParams = {\n /** The type of component that triggered the event (e.g. \"series\", \"markPoint\") */\n componentType: string;\n /** Series type (e.g. \"line\", \"bar\") — present when componentType is \"series\" */\n seriesType?: string;\n /** Zero-based index of the series in the option.series array */\n seriesIndex?: number;\n /** Name of the series */\n seriesName?: string;\n /** Name of the data item */\n name?: string;\n /** Zero-based index of the data item within its series */\n dataIndex?: number;\n /** Raw data item value */\n data?: any;\n /** Sub-type of data (e.g. \"node\", \"edge\" for graph series) */\n dataType?: string;\n /** Numeric or array value of the data item */\n value?: number | any[];\n /** Resolved color of the series or data item */\n color?: string;\n};\n\n/**\n * ECharts event handlers that can be attached to a `Chart`.\n * Pass a subset via the `onEvents` prop; handlers are registered lazily and\n * cleaned up automatically when removed or when the chart is unmounted.\n */\nexport interface ChartEvents {\n // Mouse events — fired on chart elements (series, marks, etc.)\n click: (params: EChartsMouseEventParams) => void;\n dblclick: (params: EChartsMouseEventParams) => void;\n mousedown: (params: EChartsMouseEventParams) => void;\n mousemove: (params: EChartsMouseEventParams) => void;\n mouseup: (params: EChartsMouseEventParams) => void;\n mouseover: (params: EChartsMouseEventParams) => void;\n mouseout: (params: EChartsMouseEventParams) => void;\n /** Fired when the pointer leaves the chart canvas entirely */\n globalout: (params: any) => void;\n contextmenu: (params: any) => void;\n\n // Legend events\n /** Fired when any legend item's selected state changes */\n legendselectchanged: (params: {\n name: string;\n /** Map of series name → selected state for all legend items */\n selected: Record<string, boolean>;\n }) => void;\n legendselected: (params: any) => void;\n legendunselected: (params: any) => void;\n legendscroll: (params: any) => void;\n\n // Data zoom / timeline events\n datazoom: (params: any) => void;\n datarangeselected: (params: any) => void;\n timelinechanged: (params: any) => void;\n timelineplaychanged: (params: any) => void;\n\n // Toolbox events\n restore: (params: any) => void;\n dataviewchanged: (params: any) => void;\n magictypechanged: (params: any) => void;\n\n // Pie chart selection events\n pieselectchanged: (params: any) => void;\n pieselected: (params: any) => void;\n pieunselected: (params: any) => void;\n\n // Map / geo selection events\n mapselectchanged: (params: any) => void;\n mapselected: (params: any) => void;\n mapunselected: (params: any) => void;\n geoselectchanged: (params: any) => void;\n geoselected: (params: any) => void;\n geounselected: (params: any) => void;\n\n axisareaselected: (params: any) => void;\n\n // Brush / selection events\n brush: (params: any) => void;\n brushselected: (params: any) => void;\n /** Fired when the user finishes drawing a brush selection */\n brushend: (params: {\n areas: Array<{\n /** Coordinate range covered by the brush — interpretation depends on axis type */\n coordRange: any;\n brushType?: string;\n panelId?: string;\n range?: any;\n }>;\n }) => void;\n}\n\n/** Props for the low-level `Chart` wrapper around Apache ECharts */\nexport interface ChartProps {\n /**\n * The ECharts core instance imported by the consumer.\n * Passed in rather than imported directly so the consumer controls which\n * ECharts modules are bundled (tree-shaking).\n */\n echarts: typeof echarts;\n /** ECharts option object — passed through to `chart.setOption()` */\n options: EChartsOption;\n /**\n * Additional options passed as the second argument to `chart.setOption()`.\n * Defaults to `{ notMerge: false, lazyUpdate: true }`.\n */\n optionUpdateBehavior?: SetOptionOpts;\n /** Additional CSS classes applied to the chart container `<div>` */\n className?: string;\n /**\n * When `true`, initialises ECharts with its built-in dark theme.\n * Changing this value after mount destroys and re-creates the chart instance.\n */\n isDarkMode?: boolean;\n /** Height of the chart container in pixels. Defaults to `350`. */\n height?: number;\n /** Subset of ECharts events to listen for. Handlers are bound/unbound reactively. */\n onEvents?: Partial<ChartEvents>;\n}\n\n/**\n * Chart — a low-level wrapper around [Apache ECharts](https://echarts.apache.org).\n *\n * Manages the ECharts instance lifecycle (init, option updates, event binding,\n * resize observation, and disposal). Exposes the raw `echarts.ECharts` instance\n * via `ref` for imperative access when needed.\n *\n * Prefer `TimeseriesChart` for time-series data; use this component when you\n * need full control over the ECharts option object.\n *\n * @example\n * ```tsx\n * import * as echarts from \"echarts/core\";\n * import { BarChart } from \"echarts/charts\";\n * import { GridComponent } from \"echarts/components\";\n * import { CanvasRenderer } from \"echarts/renderers\";\n *\n * echarts.use([BarChart, GridComponent, CanvasRenderer]);\n *\n * <Chart\n * echarts={echarts}\n * options={{ xAxis: { data: [\"A\", \"B\"] }, yAxis: {}, series: [{ type: \"bar\", data: [1, 2] }] }}\n * />\n * ```\n */\nexport const Chart = forwardRef<echarts.ECharts, ChartProps>(function Chart(\n {\n echarts,\n options,\n optionUpdateBehavior,\n className,\n isDarkMode,\n height = 350,\n onEvents,\n }: ChartProps,\n ref,\n) {\n // Ref to the container DOM node that ECharts renders into\n const elRef = useRef<HTMLDivElement | null>(null);\n // Ref to the active ECharts instance\n const chartRef = useRef<echarts.ECharts | null>(null);\n // Keeps the latest onEvents object without triggering re-binding on every render\n const handlersRef = useRef<Partial<ChartEvents>>({});\n // Stable wrapper functions per event name — avoids creating new closures on re-render\n const wrappersRef = useRef<Record<string, (params: any) => void>>({});\n // Tracks which event names are currently bound to the chart instance\n const boundEventsRef = useRef<Set<string>>(new Set());\n\n // Init and cleanup\n useEffect(() => {\n if (!elRef.current) return;\n\n const chart = echarts.init(\n elRef.current,\n isDarkMode\n ? \"dark\"\n : {\n color: isDarkMode ? CHART_DARK_COLORS : CHART_LIGHT_COLORS,\n },\n );\n chartRef.current = chart;\n\n if (typeof ref === \"function\") ref(chart);\n else if (ref) ref.current = chart;\n\n return () => {\n for (const event of boundEventsRef.current) {\n const wrapper = wrappersRef.current[event];\n if (wrapper) chart.off(event, wrapper);\n }\n boundEventsRef.current.clear();\n if (typeof ref === \"function\") ref(null);\n else if (ref) ref.current = null;\n chartRef.current = null;\n chart.dispose();\n };\n }, [elRef, isDarkMode]);\n\n // Update options\n useEffect(() => {\n const chart = chartRef.current;\n if (!chart) return;\n\n chart.setOption(options, {\n notMerge: false,\n lazyUpdate: true,\n ...optionUpdateBehavior,\n });\n }, [isDarkMode, optionUpdateBehavior, options]);\n\n // Keep handlersRef in sync so wrapper closures always call the latest handler\n // without needing to re-bind listeners on every render\n useEffect(() => {\n handlersRef.current = onEvents ?? {};\n }, [onEvents]);\n\n // Reactively bind and unbind event listeners when onEvents changes.\n // Uses stable wrapper functions (wrappersRef) so the same function reference\n // is passed to both chart.on() and chart.off(), which ECharts requires.\n useEffect(() => {\n const chart = chartRef.current;\n if (!chart) return;\n\n const nextBound = new Set<string>();\n\n for (const [event, handler] of Object.entries(onEvents ?? {})) {\n if (typeof handler !== \"function\") continue;\n nextBound.add(event);\n\n if (!wrappersRef.current[event]) {\n wrappersRef.current[event] = (params: any) => {\n const current = handlersRef.current as Record<\n string,\n ((p: any) => void) | undefined\n >;\n current[event]?.(params);\n };\n }\n\n if (!boundEventsRef.current.has(event)) {\n chart.on(event, wrappersRef.current[event]);\n }\n }\n\n for (const event of boundEventsRef.current) {\n if (nextBound.has(event)) continue;\n const wrapper = wrappersRef.current[event];\n if (wrapper) {\n chart.off(event, wrapper);\n }\n }\n\n boundEventsRef.current = nextBound;\n }, [echarts, isDarkMode, onEvents]);\n\n // Resize handling\n useEffect(() => {\n const chart = chartRef.current;\n const el = elRef.current;\n if (!chart || !el) return;\n\n // Flag to skip the very first trigger\n let isInitial = true;\n\n const ro = new ResizeObserver(() => {\n if (isInitial) {\n isInitial = false;\n return; // Skip the first resize to let the animation play\n }\n chart.resize();\n });\n\n ro.observe(el);\n\n return () => ro.disconnect();\n }, []);\n\n return (\n <div\n ref={elRef}\n className={cn(\"w-full\", className)}\n style={{ height }}\n tabIndex={options.aria?.enabled ? 0 : undefined}\n role={options.aria?.enabled ? \"img\" : undefined}\n />\n );\n});\n\nChart.displayName = \"Chart\";\n","import type * as echarts from \"echarts/core\";\nimport type { LineSeriesOption, BarSeriesOption } from \"echarts/charts\";\nimport type { EChartsOption } from \"echarts\";\nimport { useEffect, useMemo, useRef } from \"react\";\nimport { Chart, ChartEvents } from \"./EChart\";\n\n/** A single data series rendered on a `TimeseriesChart` */\nexport interface TimeseriesData {\n /** Display name shown in tooltips and legends */\n name: string;\n /** Array of `[timestamp_ms, value]` tuples ordered by time */\n data: [number, number][];\n /** Hex color string used for this series' line, bars, and legend dot */\n color: string;\n}\n\n/** Props for `TimeseriesChart` */\nexport interface TimeseriesChartProps {\n /**\n * The ECharts core instance imported by the consumer.\n * Passed in rather than imported directly so the consumer controls which\n * ECharts modules are bundled (tree-shaking).\n */\n echarts: typeof echarts;\n /** Visual style of each series. Defaults to `\"line\"`. */\n type?: \"line\" | \"bar\";\n /** Array of time series data to display on the chart */\n data: TimeseriesData[];\n /** Label for the x-axis (time axis) */\n xAxisName?: string;\n /** Number of ticks to display on the x-axis */\n xAxisTickCount?: number;\n /**\n * Custom formatter for x-axis tick labels.\n * Receives the raw timestamp in milliseconds and returns a display string,\n * overriding ECharts' built-in time formatting.\n */\n xAxisTickFormat?: (value: number) => string;\n /**\n * Custom formatter for y-axis tick labels.\n * Receives the raw value and returns a display string.\n * When omitted, ECharts' built-in formatter is used.\n */\n yAxisTickFormat?: (value: number) => string;\n /**\n * @deprecated Use `tooltipValueFormat` instead. This prop formats tooltip\n * values, not y-axis tick labels. It will be removed in a future major version.\n */\n yAxisTickLabelFormat?: (value: number) => string;\n /** Label for the y-axis (value axis) */\n yAxisName?: string;\n /** Number of ticks to display on the y-axis */\n yAxisTickCount?: number;\n /**\n * Custom formatter for tooltip values.\n * Receives the raw y-value and returns a display string.\n * When omitted, the raw value is shown. Takes precedence over the\n * deprecated `yAxisTickLabelFormat` prop.\n */\n tooltipValueFormat?: (value: number) => string;\n /** Indicates incomplete data periods with optional before/after timestamps in ms */\n incomplete?: { before?: number; after?: number };\n /** Height of the chart in pixels. Defaults to `350`. */\n height?: number;\n /** Callback fired when user selects a time range via brush selection */\n onTimeRangeChange?: (from: number, to: number) => void;\n /** When `true`, switches the chart to ECharts' built-in dark theme */\n isDarkMode?: boolean;\n /**\n * When `true`, renders a vertical gradient fill beneath each line series.\n * The gradient fades from the series' color at the top to transparent at the bottom.\n * Has no effect when `type` is `\"bar\"`.\n */\n gradient?: boolean;\n /**\n * When `true`, hides the chart and displays an animated sine-wave skeleton\n * that oscillates back and forth to indicate that data is being fetched.\n */\n loading?: boolean;\n /**\n * Accessible description for screen readers. When provided, it is passed to\n * ECharts' `aria.label.description` and announced when the chart receives\n * focus. Consumers are responsible for writing a meaningful description —\n * see the W3C guidance on complex images for recommendations.\n *\n * @see https://www.w3.org/WAI/tutorials/images/complex/\n * @see https://echarts.apache.org/handbook/en/best-practices/aria/\n */\n ariaDescription?: string;\n}\n\n/**\n * TimeseriesChart — a time-series line or bar chart.\n *\n * Built on `Chart` (Apache ECharts) with opinionated defaults for time-series data:\n * a time-typed x-axis, dashed lines for incomplete data periods, brush-based\n * time range selection, and automatic tooltip deduplication.\n *\n * @example\n * ```tsx\n * import * as echarts from \"echarts/core\";\n * import { LineChart } from \"echarts/charts\";\n * import { GridComponent, TooltipComponent, BrushComponent, ToolboxComponent } from \"echarts/components\";\n * import { CanvasRenderer } from \"echarts/renderers\";\n *\n * echarts.use([LineChart, GridComponent, TooltipComponent, BrushComponent, ToolboxComponent, CanvasRenderer]);\n *\n * const [range, setRange] = useState<[number, number]>();\n *\n * <TimeseriesChart\n * echarts={echarts}\n * data={[{ name: \"Requests\", data: [[Date.now(), 42]], color: \"#086FFF\" }]}\n * xAxisName=\"Time\"\n * xAxisTickFormat={(ts) => new Date(ts).toLocaleTimeString()}\n * yAxisName=\"Count\"\n * yAxisTickFormat={(value) => `${value / 1000}k`}\n * tooltipValueFormat={(value) => `${value.toFixed(2)} req/s`}\n * onTimeRangeChange={(from, to) => setRange([from, to])}\n * />\n * ```\n */\nexport function TimeseriesChart({\n echarts,\n type = \"line\",\n data,\n xAxisName,\n xAxisTickCount,\n xAxisTickFormat,\n yAxisTickFormat,\n yAxisTickLabelFormat,\n yAxisName,\n yAxisTickCount,\n tooltipValueFormat,\n onTimeRangeChange,\n height = 350,\n incomplete,\n isDarkMode,\n gradient,\n loading,\n ariaDescription,\n}: TimeseriesChartProps) {\n const chartRef = useRef<echarts.ECharts | null>(null);\n const incompleteBefore = incomplete?.before;\n const incompleteAfter = incomplete?.after;\n\n const options = useMemo(() => {\n const transformSeries: Array<LineSeriesOption | BarSeriesOption> = [];\n\n const seriesType =\n type === \"bar\"\n ? ({ type: \"bar\", stack: \"total\" } as const)\n : ({ type: \"line\", showSymbol: false } as const);\n\n for (const s of data) {\n const incompleteBeforePoints =\n incompleteBefore && type === \"line\"\n ? s.data.filter((point) => point[0] <= incompleteBefore)\n : [];\n\n const incompleteAfterPoints =\n incompleteAfter && type === \"line\"\n ? s.data.filter((point) => point[0] >= incompleteAfter)\n : [];\n\n const completePoints =\n incompleteBeforePoints.length > 0 || incompleteAfterPoints.length > 0\n ? s.data.slice(\n Math.max(0, incompleteBeforePoints.length - 1),\n Math.max(0, s.data.length - incompleteAfterPoints.length + 1),\n )\n : s.data;\n\n // Main complete data series\n const areaStyle =\n gradient && type === \"line\"\n ? {\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n { offset: 0, color: colorWithOpacity(s.color, 0.4) },\n { offset: 1, color: colorWithOpacity(s.color, 0) },\n ]),\n }\n : undefined;\n\n transformSeries.push({\n data: completePoints,\n color: s.color,\n name: s.name,\n emphasis: { focus: \"series\" },\n ...(areaStyle ? { areaStyle } : {}),\n ...seriesType,\n });\n\n // Incomplete data series with dashed lines\n const incompleteSeriesConfig = {\n color: s.color,\n name: s.name,\n type: \"line\" as const,\n lineStyle: { type: \"dashed\" as const },\n showSymbol: false,\n emphasis: { focus: \"series\" as const },\n };\n\n if (incompleteBeforePoints.length > 0) {\n transformSeries.push({\n ...incompleteSeriesConfig,\n data: incompleteBeforePoints,\n });\n }\n\n if (incompleteAfterPoints.length > 0) {\n transformSeries.push({\n ...incompleteSeriesConfig,\n data: incompleteAfterPoints,\n });\n }\n }\n\n return {\n aria: {\n enabled: true,\n ...(ariaDescription && { label: { description: ariaDescription } }),\n },\n brush: {\n snapToData: true,\n xAxisIndex: \"all\" as const,\n brushType: \"lineX\" as const,\n brushMode: \"single\" as const,\n outOfBrush: {\n colorAlpha: 0.3,\n },\n brushStyle: {\n borderWidth: 1,\n color: \"rgba(120,140,180,0.3)\",\n borderColor: \"rgba(120,140,180,0.8)\",\n },\n },\n tooltip: {\n trigger: \"axis\" as const,\n axisPointer: { type: \"shadow\" as const },\n formatter: (params: any) => {\n const items = Array.isArray(params) ? params : [params];\n\n // Track seen series names to avoid duplicates in tooltip\n // This is needed because incomplete data series (dashed lines) and complete data series\n // can overlap at the same timestamp, causing duplicate entries in the tooltip\n const seenNames = new Set<string>();\n const filteredParams = items.filter((param: any) => {\n if (seenNames.has(param.seriesName)) return false;\n seenNames.add(param.seriesName);\n return true;\n });\n\n const first = filteredParams[0];\n const ts = first?.value?.[0] ?? first?.axisValue;\n const header =\n ts != null\n ? `<div style=\"font-weight:600;margin-bottom:4px;\">${formatTimestamp(ts)}</div>`\n : \"\";\n\n const rows = filteredParams\n .map((param: any) => {\n const value = param?.value?.[1];\n const formatFn = tooltipValueFormat ?? yAxisTickLabelFormat;\n return `${param.marker} ${param.seriesName}: <strong>${formatFn ? formatFn(value) : value}</strong>`;\n })\n .join(\"<br/>\");\n\n return `${header}${rows}`;\n },\n },\n backgroundColor: \"transparent\",\n toolbox: { show: false },\n xAxis: {\n name: xAxisName,\n nameLocation: \"middle\" as const,\n nameGap: 30,\n type: \"time\" as const,\n splitLine: {\n show: false,\n },\n axisLine: { show: false },\n splitNumber: xAxisTickCount ?? 5,\n ...(xAxisTickFormat && {\n axisLabel: {\n formatter: (value: number) => xAxisTickFormat(value),\n },\n }),\n },\n yAxis: {\n name: yAxisName,\n nameLocation: \"middle\" as const,\n nameGap: 40,\n type: \"value\" as const,\n axisTick: { show: true },\n axisLabel: {\n margin: 15,\n ...(yAxisTickFormat && {\n formatter: (value: number) => yAxisTickFormat(value),\n }),\n },\n splitLine: {\n show: true,\n lineStyle: { type: \"dashed\" as const, width: 1 },\n },\n splitNumber: yAxisTickCount,\n },\n grid: {\n left: yAxisName ? 30 : 24,\n right: 24,\n top: 24,\n bottom: xAxisName ? 30 : 24,\n },\n series: transformSeries,\n };\n }, [\n data,\n xAxisName,\n xAxisTickCount,\n xAxisTickFormat,\n yAxisTickFormat,\n yAxisTickLabelFormat,\n yAxisName,\n yAxisTickCount,\n tooltipValueFormat,\n incompleteBefore,\n incompleteAfter,\n type,\n gradient,\n echarts,\n ariaDescription,\n ]);\n\n const events = useMemo<Partial<ChartEvents>>(() => {\n if (!onTimeRangeChange) return {};\n\n return {\n brushend: (params) => {\n const range = params.areas[0].coordRange;\n onTimeRangeChange(range[0], range[1]);\n chartRef.current?.dispatchAction({ type: \"brush\", areas: [] });\n },\n };\n }, [onTimeRangeChange]);\n\n // Activate the lineX brush cursor when a time-range callback is provided,\n // and deactivate it on cleanup so the cursor resets when the prop is removed.\n const hasTimeRangeCallback = !!onTimeRangeChange;\n useEffect(() => {\n const chart = chartRef.current;\n if (chart && hasTimeRangeCallback) {\n chart.dispatchAction({\n type: \"takeGlobalCursor\",\n key: \"brush\",\n brushOption: {\n brushType: \"lineX\" as const,\n brushMode: \"single\" as const,\n },\n });\n\n return () => {\n chart.dispatchAction({\n type: \"takeGlobalCursor\",\n key: \"brush\",\n brushOption: {\n brushType: false,\n },\n });\n };\n }\n // `loading` controls whether <Chart> is mounted. When it flips to false,\n // chartRef.current becomes available and the brush cursor must be activated.\n // Without this dep, the effect won't re-run after Chart mounts.\n }, [chartRef, hasTimeRangeCallback, loading]);\n\n return (\n <div className=\"relative w-full\" style={{ height }}>\n {loading && <ChartWaveLoader height={height} isDarkMode={isDarkMode} />}\n {!loading && (\n <Chart\n echarts={echarts}\n ref={chartRef}\n options={options as EChartsOption}\n height={height}\n isDarkMode={isDarkMode}\n onEvents={events}\n />\n )}\n </div>\n );\n}\n\n/**\n * Animated sine-wave skeleton shown while `TimeseriesChart` is in `loading` state.\n * Renders multiple staggered wave paths that sweep continuously left-to-right,\n * mimicking the motion of live time-series data being drawn.\n */\nfunction ChartWaveLoader({\n height,\n isDarkMode,\n}: {\n height: number;\n isDarkMode?: boolean;\n}) {\n const mid = height / 2;\n const amp = Math.min(height * 0.12, 28);\n const period = 400;\n const steps = 120;\n\n const points: string[] = [];\n for (let i = 0; i <= steps; i++) {\n const x = -period + (i / steps) * period * 3;\n const y = mid + Math.sin((i / steps) * 2 * Math.PI * 3) * amp;\n points.push(`${i === 0 ? \"M\" : \"L\"}${x.toFixed(2)},${y.toFixed(2)}`);\n }\n const d = points.join(\" \");\n\n const strokeColor = isDarkMode ? \"rgba(255,255,255,0.5)\" : \"rgba(0,0,0,0.2)\";\n\n return (\n <div\n aria-hidden=\"true\"\n className=\"absolute inset-0 overflow-hidden\"\n style={{ height }}\n >\n <svg\n width=\"100%\"\n height={height}\n viewBox={`0 0 ${period} ${height}`}\n preserveAspectRatio=\"none\"\n className=\"w-full animate-pulse\"\n >\n <path\n d={d}\n fill=\"none\"\n stroke={strokeColor}\n strokeWidth=\"2\"\n style={{\n animation: `kumo-chart-wave 2.4s linear infinite`,\n transformOrigin: \"0 0\",\n }}\n />\n </svg>\n </div>\n );\n}\n\n/**\n * Returns an `rgba(r, g, b, alpha)` string for any hex or rgb(a) color input,\n * replacing whatever opacity was already present with the given `alpha` (0–1).\n *\n * Handles:\n * - 6-digit hex: `#RRGGBB`\n * - 8-digit hex: `#RRGGBBAA` ← strips existing alpha\n * - 3-digit hex: `#RGB`\n * - `rgb(r, g, b)`\n * - `rgba(r, g, b, a)` ← replaces existing alpha\n */\nfunction colorWithOpacity(color: string, alpha: number): string {\n const a = Math.max(0, Math.min(1, alpha));\n\n // rgb / rgba\n const rgbMatch = color.match(\n /rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i,\n );\n if (rgbMatch) {\n return `rgba(${rgbMatch[1]}, ${rgbMatch[2]}, ${rgbMatch[3]}, ${a})`;\n }\n\n // hex — strip leading #\n let hex = color.replace(/^#/, \"\");\n\n // expand 3-digit → 6-digit\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n\n // strip 8-digit alpha → keep only 6\n if (hex.length === 8) {\n hex = hex.slice(0, 6);\n }\n\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n}\n\n/** Zero-pads a number to two digits (e.g. `5` → `\"05\"`) */\nfunction pad(n: number) {\n return n.toString().padStart(2, \"0\");\n}\n\n/**\n * Formats a timestamp as `\"YYYY-MM-DD HH:mm:ss\"` for use in chart tooltips.\n * Accepts a Unix timestamp in milliseconds, an ISO date string, or a `Date` object.\n */\nfunction formatTimestamp(ts: number | string | Date): string {\n const d = new Date(ts);\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n}\n","import { cn } from \"../../utils\";\n\n/** Shared props for both legend item variants */\ninterface LegendItemProps {\n /** Series name shown as a label */\n name: string;\n /** Hex color string for the series indicator dot */\n color: string;\n /** Formatted value string to display */\n value: string;\n /** Optional unit label shown after the value (e.g. `\"ms\"`, `\"%\"`) */\n unit?: string;\n /** When `true`, renders the item at 50% opacity to indicate a deselected state */\n inactive?: boolean;\n}\n\n/**\n * Large legend item — stacked layout with a colored dot + series name on top\n * and a large value with an optional small unit below. Use for prominent\n * single-metric displays such as dashboard cards.\n */\nfunction LargeItem({ color, value, name, unit, inactive }: LegendItemProps) {\n return (\n <div className=\"inline-flex flex-col gap-2 min-w-42 py-2\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\"size-2 rounded-full inline-block\", {\n \"opacity-50\": inactive,\n })}\n style={{ backgroundColor: color }}\n />\n <span className={cn(\"text-xs\", { \"opacity-50\": inactive })}>\n {name}\n </span>\n </div>\n <div className=\"flex items-baseline gap-0.5\">\n <span\n className={cn(\"text-lg font-medium leading-none\", {\n \"opacity-50\": inactive,\n })}\n >\n {value}\n </span>\n {unit && (\n <span\n className={cn(\"text-xs text-kumo-subtle leading-none\", {\n \"opacity-50\": inactive,\n })}\n >\n {unit}\n </span>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Small legend item — inline layout with a colored dot, series name, and value\n * on a single row. Use for compact legends below or beside a chart.\n */\nfunction SmallItem({ color, value, name, inactive }: LegendItemProps) {\n return (\n <div className=\"inline-flex items-center gap-2\">\n <span\n className={cn(\"size-2 rounded-full inline-block\", {\n \"opacity-50\": inactive,\n })}\n style={{ backgroundColor: color }}\n />\n <span className={cn(\"text-xs\", { \"opacity-50\": inactive })}>{name}</span>\n <span className={cn(\"text-xs font-medium\", { \"opacity-50\": inactive })}>\n {value}\n </span>\n </div>\n );\n}\n\n/**\n * ChartLegend — pre-built legend item components for use alongside a chart.\n *\n * - `ChartLegend.SmallItem` — compact inline layout; suited for multi-series legends\n * - `ChartLegend.LargeItem` — stacked layout with a large value; suited for single-metric cards\n *\n * @example\n * ```tsx\n * <ChartLegend.SmallItem name=\"Requests\" color=\"#086FFF\" value=\"1,234\" />\n * <ChartLegend.LargeItem name=\"Latency\" color=\"#CF7EE9\" value=\"42\" unit=\"ms\" inactive />\n * ```\n */\nexport const ChartLegend = {\n SmallItem,\n LargeItem,\n};\n"],"names":["ChartSemanticLightColors","ChartSemanticDarkColors","CHART_LIGHT_COLORS","CHART_DARK_COLORS","ChartPalette","semantic","name","isDarkMode","color","index","Chart","forwardRef","echarts","options","optionUpdateBehavior","className","height","onEvents","ref","elRef","useRef","chartRef","handlersRef","wrappersRef","boundEventsRef","useEffect","chart","event","wrapper","nextBound","handler","params","el","isInitial","ro","jsx","cn","TimeseriesChart","type","data","xAxisName","xAxisTickCount","xAxisTickFormat","yAxisTickFormat","yAxisTickLabelFormat","yAxisName","yAxisTickCount","tooltipValueFormat","onTimeRangeChange","incomplete","gradient","loading","ariaDescription","incompleteBefore","incompleteAfter","useMemo","transformSeries","seriesType","s","incompleteBeforePoints","point","incompleteAfterPoints","completePoints","areaStyle","colorWithOpacity","incompleteSeriesConfig","items","seenNames","filteredParams","param","first","ts","header","formatTimestamp","rows","value","formatFn","events","range","hasTimeRangeCallback","ChartWaveLoader","mid","amp","period","steps","points","i","x","d","strokeColor","alpha","rgbMatch","hex","r","g","b","pad","n","LargeItem","unit","inactive","jsxs","SmallItem","ChartLegend"],"mappings":";;;;AAsCA,IAAKA,sBAAAA,OACHA,EAAA,YAAY,WACZA,EAAA,UAAU,WACVA,EAAA,UAAU,WACVA,EAAA,eAAe,WACfA,EAAA,WAAW,WACXA,EAAA,gBAAgB,WANbA,IAAAA,KAAA,CAAA,CAAA,GAaAC,sBAAAA,OACHA,EAAA,YAAY,aACZA,EAAA,UAAU,aACVA,EAAA,UAAU,aACVA,EAAA,eAAe,aACfA,EAAA,WAAW,aACXA,EAAA,gBAAgB,aANbA,IAAAA,KAAA,CAAA,CAAA;AAaE,MAAMC,IAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AACF,GAMaC,IAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AACF;AAMO,IAAUC;AAAA,CAAV,CAAUA,MAAV;AAUE,WAASC,EACdC,GAOAC,IAAa,IACb;AACA,WAAOA,IACHN,EAAwBK,CAAI,IAC5BN,EAAyBM,CAAI;AAAA,EACnC;AAbOF,EAAAA,EAAS,WAAAC;AA0BT,WAASG,EAAMC,GAAeF,IAAa,IAAO;AACvD,WAAOA,IACHJ,EAAkBM,IAAQN,EAAkB,MAAM,IAClDD,EAAmBO,IAAQP,EAAmB,MAAM;AAAA,EAC1D;AAJOE,EAAAA,EAAS,QAAAI;AAAA,GApCDJ,MAAAA,IAAA,CAAA,EAAA;ACuDV,MAAMM,IAAQC,EAAwC,SAC3D;AAAA,EACE,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,YAAAR;AAAA,EACA,QAAAS,IAAS;AAAA,EACT,UAAAC;AACF,GACAC,GACA;AAEA,QAAMC,IAAQC,EAA8B,IAAI,GAE1CC,IAAWD,EAA+B,IAAI,GAE9CE,IAAcF,EAA6B,EAAE,GAE7CG,IAAcH,EAA8C,EAAE,GAE9DI,IAAiBJ,EAAoB,oBAAI,KAAK;AAGpD,SAAAK,EAAU,MAAM;AACd,QAAI,CAACN,EAAM,QAAS;AAEpB,UAAMO,IAAQd,EAAQ;AAAA,MACpBO,EAAM;AAAA,MACNZ,IACI,SACA;AAAA,QACE,OAAOA,IAAaJ,IAAoBD;AAAA,MAAA;AAAA,IAC1C;AAEN,WAAAmB,EAAS,UAAUK,GAEf,OAAOR,KAAQ,aAAYA,EAAIQ,CAAK,IAC/BR,QAAS,UAAUQ,IAErB,MAAM;AACX,iBAAWC,KAASH,EAAe,SAAS;AAC1C,cAAMI,IAAUL,EAAY,QAAQI,CAAK;AACzC,QAAIC,KAASF,EAAM,IAAIC,GAAOC,CAAO;AAAA,MACvC;AACA,MAAAJ,EAAe,QAAQ,MAAA,GACnB,OAAON,KAAQ,aAAYA,EAAI,IAAI,IAC9BA,QAAS,UAAU,OAC5BG,EAAS,UAAU,MACnBK,EAAM,QAAA;AAAA,IACR;AAAA,EACF,GAAG,CAACP,GAAOZ,CAAU,CAAC,GAGtBkB,EAAU,MAAM;AACd,UAAMC,IAAQL,EAAS;AACvB,IAAKK,KAELA,EAAM,UAAUb,GAAS;AAAA,MACvB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,GAAGC;AAAA,IAAA,CACJ;AAAA,EACH,GAAG,CAACP,GAAYO,GAAsBD,CAAO,CAAC,GAI9CY,EAAU,MAAM;AACd,IAAAH,EAAY,UAAUL,KAAY,CAAA;AAAA,EACpC,GAAG,CAACA,CAAQ,CAAC,GAKbQ,EAAU,MAAM;AACd,UAAMC,IAAQL,EAAS;AACvB,QAAI,CAACK,EAAO;AAEZ,UAAMG,wBAAgB,IAAA;AAEtB,eAAW,CAACF,GAAOG,CAAO,KAAK,OAAO,QAAQb,KAAY,CAAA,CAAE;AAC1D,MAAI,OAAOa,KAAY,eACvBD,EAAU,IAAIF,CAAK,GAEdJ,EAAY,QAAQI,CAAK,MAC5BJ,EAAY,QAAQI,CAAK,IAAI,CAACI,MAAgB;AAK5C,QAJgBT,EAAY,QAIpBK,CAAK,IAAII,CAAM;AAAA,MACzB,IAGGP,EAAe,QAAQ,IAAIG,CAAK,KACnCD,EAAM,GAAGC,GAAOJ,EAAY,QAAQI,CAAK,CAAC;AAI9C,eAAWA,KAASH,EAAe,SAAS;AAC1C,UAAIK,EAAU,IAAIF,CAAK,EAAG;AAC1B,YAAMC,IAAUL,EAAY,QAAQI,CAAK;AACzC,MAAIC,KACFF,EAAM,IAAIC,GAAOC,CAAO;AAAA,IAE5B;AAEA,IAAAJ,EAAe,UAAUK;AAAA,EAC3B,GAAG,CAACjB,GAASL,GAAYU,CAAQ,CAAC,GAGlCQ,EAAU,MAAM;AACd,UAAMC,IAAQL,EAAS,SACjBW,IAAKb,EAAM;AACjB,QAAI,CAACO,KAAS,CAACM,EAAI;AAGnB,QAAIC,IAAY;AAEhB,UAAMC,IAAK,IAAI,eAAe,MAAM;AAClC,UAAID,GAAW;AACb,QAAAA,IAAY;AACZ;AAAA,MACF;AACA,MAAAP,EAAM,OAAA;AAAA,IACR,CAAC;AAED,WAAAQ,EAAG,QAAQF,CAAE,GAEN,MAAME,EAAG,WAAA;AAAA,EAClB,GAAG,CAAA,CAAE,GAGH,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKhB;AAAA,MACL,WAAWiB,EAAG,UAAUrB,CAAS;AAAA,MACjC,OAAO,EAAE,QAAAC,EAAA;AAAA,MACT,UAAUH,EAAQ,MAAM,UAAU,IAAI;AAAA,MACtC,MAAMA,EAAQ,MAAM,UAAU,QAAQ;AAAA,IAAA;AAAA,EAAA;AAG5C,CAAC;AAEDH,EAAM,cAAc;AC/Kb,SAAS2B,GAAgB;AAAA,EAC9B,SAAAzB;AAAA,EACA,MAAA0B,IAAO;AAAA,EACP,MAAAC;AAAA,EACA,WAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,QAAAhC,IAAS;AAAA,EACT,YAAAiC;AAAA,EACA,YAAA1C;AAAA,EACA,UAAA2C;AAAA,EACA,SAAAC;AAAA,EACA,iBAAAC;AACF,GAAyB;AACvB,QAAM/B,IAAWD,EAA+B,IAAI,GAC9CiC,IAAmBJ,GAAY,QAC/BK,IAAkBL,GAAY,OAE9BpC,IAAU0C,EAAQ,MAAM;AAC5B,UAAMC,IAA6D,CAAA,GAE7DC,IACJnB,MAAS,QACJ,EAAE,MAAM,OAAO,OAAO,QAAA,IACtB,EAAE,MAAM,QAAQ,YAAY,GAAA;AAEnC,eAAWoB,KAAKnB,GAAM;AACpB,YAAMoB,IACJN,KAAoBf,MAAS,SACzBoB,EAAE,KAAK,OAAO,CAACE,MAAUA,EAAM,CAAC,KAAKP,CAAgB,IACrD,CAAA,GAEAQ,IACJP,KAAmBhB,MAAS,SACxBoB,EAAE,KAAK,OAAO,CAACE,MAAUA,EAAM,CAAC,KAAKN,CAAe,IACpD,CAAA,GAEAQ,IACJH,EAAuB,SAAS,KAAKE,EAAsB,SAAS,IAChEH,EAAE,KAAK;AAAA,QACL,KAAK,IAAI,GAAGC,EAAuB,SAAS,CAAC;AAAA,QAC7C,KAAK,IAAI,GAAGD,EAAE,KAAK,SAASG,EAAsB,SAAS,CAAC;AAAA,MAAA,IAE9DH,EAAE,MAGFK,IACJb,KAAYZ,MAAS,SACjB;AAAA,QACE,OAAO,IAAI1B,EAAQ,QAAQ,eAAe,GAAG,GAAG,GAAG,GAAG;AAAA,UACpD,EAAE,QAAQ,GAAG,OAAOoD,EAAiBN,EAAE,OAAO,GAAG,EAAA;AAAA,UACjD,EAAE,QAAQ,GAAG,OAAOM,EAAiBN,EAAE,OAAO,CAAC,EAAA;AAAA,QAAE,CAClD;AAAA,MAAA,IAEH;AAEN,MAAAF,EAAgB,KAAK;AAAA,QACnB,MAAMM;AAAA,QACN,OAAOJ,EAAE;AAAA,QACT,MAAMA,EAAE;AAAA,QACR,UAAU,EAAE,OAAO,SAAA;AAAA,QACnB,GAAIK,IAAY,EAAE,WAAAA,EAAA,IAAc,CAAA;AAAA,QAChC,GAAGN;AAAA,MAAA,CACJ;AAGD,YAAMQ,IAAyB;AAAA,QAC7B,OAAOP,EAAE;AAAA,QACT,MAAMA,EAAE;AAAA,QACR,MAAM;AAAA,QACN,WAAW,EAAE,MAAM,SAAA;AAAA,QACnB,YAAY;AAAA,QACZ,UAAU,EAAE,OAAO,SAAA;AAAA,MAAkB;AAGvC,MAAIC,EAAuB,SAAS,KAClCH,EAAgB,KAAK;AAAA,QACnB,GAAGS;AAAA,QACH,MAAMN;AAAA,MAAA,CACP,GAGCE,EAAsB,SAAS,KACjCL,EAAgB,KAAK;AAAA,QACnB,GAAGS;AAAA,QACH,MAAMJ;AAAA,MAAA,CACP;AAAA,IAEL;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,GAAIT,KAAmB,EAAE,OAAO,EAAE,aAAaA,IAAgB;AAAA,MAAE;AAAA,MAEnE,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,WAAW;AAAA,QACX,YAAY;AAAA,UACV,YAAY;AAAA,QAAA;AAAA,QAEd,YAAY;AAAA,UACV,aAAa;AAAA,UACb,OAAO;AAAA,UACP,aAAa;AAAA,QAAA;AAAA,MACf;AAAA,MAEF,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aAAa,EAAE,MAAM,SAAA;AAAA,QACrB,WAAW,CAACrB,MAAgB;AAC1B,gBAAMmC,IAAQ,MAAM,QAAQnC,CAAM,IAAIA,IAAS,CAACA,CAAM,GAKhDoC,wBAAgB,IAAA,GAChBC,IAAiBF,EAAM,OAAO,CAACG,MAC/BF,EAAU,IAAIE,EAAM,UAAU,IAAU,MAC5CF,EAAU,IAAIE,EAAM,UAAU,GACvB,GACR,GAEKC,IAAQF,EAAe,CAAC,GACxBG,IAAKD,GAAO,QAAQ,CAAC,KAAKA,GAAO,WACjCE,IACJD,KAAM,OACF,mDAAmDE,EAAgBF,CAAE,CAAC,WACtE,IAEAG,IAAON,EACV,IAAI,CAACC,MAAe;AACnB,kBAAMM,IAAQN,GAAO,QAAQ,CAAC,GACxBO,IAAW7B,KAAsBH;AACvC,mBAAO,GAAGyB,EAAM,MAAM,IAAIA,EAAM,UAAU,aAAaO,IAAWA,EAASD,CAAK,IAAIA,CAAK;AAAA,UAC3F,CAAC,EACA,KAAK,OAAO;AAEf,iBAAO,GAAGH,CAAM,GAAGE,CAAI;AAAA,QACzB;AAAA,MAAA;AAAA,MAEF,iBAAiB;AAAA,MACjB,SAAS,EAAE,MAAM,GAAA;AAAA,MACjB,OAAO;AAAA,QACL,MAAMlC;AAAA,QACN,cAAc;AAAA,QACd,SAAS;AAAA,QACT,MAAM;AAAA,QACN,WAAW;AAAA,UACT,MAAM;AAAA,QAAA;AAAA,QAER,UAAU,EAAE,MAAM,GAAA;AAAA,QAClB,aAAaC,KAAkB;AAAA,QAC/B,GAAIC,KAAmB;AAAA,UACrB,WAAW;AAAA,YACT,WAAW,CAACiC,MAAkBjC,EAAgBiC,CAAK;AAAA,UAAA;AAAA,QACrD;AAAA,MACF;AAAA,MAEF,OAAO;AAAA,QACL,MAAM9B;AAAA,QACN,cAAc;AAAA,QACd,SAAS;AAAA,QACT,MAAM;AAAA,QACN,UAAU,EAAE,MAAM,GAAA;AAAA,QAClB,WAAW;AAAA,UACT,QAAQ;AAAA,UACR,GAAIF,KAAmB;AAAA,YACrB,WAAW,CAACgC,MAAkBhC,EAAgBgC,CAAK;AAAA,UAAA;AAAA,QACrD;AAAA,QAEF,WAAW;AAAA,UACT,MAAM;AAAA,UACN,WAAW,EAAE,MAAM,UAAmB,OAAO,EAAA;AAAA,QAAE;AAAA,QAEjD,aAAa7B;AAAA,MAAA;AAAA,MAEf,MAAM;AAAA,QACJ,MAAMD,IAAY,KAAK;AAAA,QACvB,OAAO;AAAA,QACP,KAAK;AAAA,QACL,QAAQL,IAAY,KAAK;AAAA,MAAA;AAAA,MAE3B,QAAQgB;AAAA,IAAA;AAAA,EAEZ,GAAG;AAAA,IACDjB;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAM;AAAA,IACAC;AAAA,IACAhB;AAAA,IACAY;AAAA,IACAtC;AAAA,IACAwC;AAAA,EAAA,CACD,GAEKyB,IAAStB,EAA8B,MACtCP,IAEE;AAAA,IACL,UAAU,CAACjB,MAAW;AACpB,YAAM+C,IAAQ/C,EAAO,MAAM,CAAC,EAAE;AAC9B,MAAAiB,EAAkB8B,EAAM,CAAC,GAAGA,EAAM,CAAC,CAAC,GACpCzD,EAAS,SAAS,eAAe,EAAE,MAAM,SAAS,OAAO,CAAA,GAAI;AAAA,IAC/D;AAAA,EAAA,IAP6B,CAAA,GAS9B,CAAC2B,CAAiB,CAAC,GAIhB+B,IAAuB,CAAC,CAAC/B;AAC/B,SAAAvB,EAAU,MAAM;AACd,UAAMC,IAAQL,EAAS;AACvB,QAAIK,KAASqD;AACX,aAAArD,EAAM,eAAe;AAAA,QACnB,MAAM;AAAA,QACN,KAAK;AAAA,QACL,aAAa;AAAA,UACX,WAAW;AAAA,UACX,WAAW;AAAA,QAAA;AAAA,MACb,CACD,GAEM,MAAM;AACX,QAAAA,EAAM,eAAe;AAAA,UACnB,MAAM;AAAA,UACN,KAAK;AAAA,UACL,aAAa;AAAA,YACX,WAAW;AAAA,UAAA;AAAA,QACb,CACD;AAAA,MACH;AAAA,EAKJ,GAAG,CAACL,GAAU0D,GAAsB5B,CAAO,CAAC,qBAGzC,OAAA,EAAI,WAAU,mBAAkB,OAAO,EAAE,QAAAnC,KACvC,UAAA;AAAA,IAAAmC,KAAW,gBAAAhB,EAAC6C,GAAA,EAAgB,QAAAhE,GAAgB,YAAAT,EAAA,CAAwB;AAAA,IACpE,CAAC4C,KACA,gBAAAhB;AAAA,MAACzB;AAAA,MAAA;AAAA,QACC,SAAAE;AAAA,QACA,KAAKS;AAAA,QACL,SAAAR;AAAA,QACA,QAAAG;AAAA,QACA,YAAAT;AAAA,QACA,UAAUsE;AAAA,MAAA;AAAA,IAAA;AAAA,EACZ,GAEJ;AAEJ;AAOA,SAASG,EAAgB;AAAA,EACvB,QAAAhE;AAAA,EACA,YAAAT;AACF,GAGG;AACD,QAAM0E,IAAMjE,IAAS,GACfkE,IAAM,KAAK,IAAIlE,IAAS,MAAM,EAAE,GAChCmE,IAAS,KACTC,IAAQ,KAERC,IAAmB,CAAA;AACzB,WAASC,IAAI,GAAGA,KAAKF,GAAOE,KAAK;AAC/B,UAAMC,IAAI,CAACJ,IAAUG,IAAIF,IAASD,IAAS,GACrC,IAAIF,IAAM,KAAK,IAAKK,IAAIF,IAAS,IAAI,KAAK,KAAK,CAAC,IAAIF;AAC1D,IAAAG,EAAO,KAAK,GAAGC,MAAM,IAAI,MAAM,GAAG,GAAGC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE;AAAA,EACrE;AACA,QAAMC,IAAIH,EAAO,KAAK,GAAG,GAEnBI,IAAclF,IAAa,0BAA0B;AAE3D,SACE,gBAAA4B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAY;AAAA,MACZ,WAAU;AAAA,MACV,OAAO,EAAE,QAAAnB,EAAA;AAAA,MAET,UAAA,gBAAAmB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,QAAAnB;AAAA,UACA,SAAS,OAAOmE,CAAM,IAAInE,CAAM;AAAA,UAChC,qBAAoB;AAAA,UACpB,WAAU;AAAA,UAEV,UAAA,gBAAAmB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,GAAAqD;AAAA,cACA,MAAK;AAAA,cACL,QAAQC;AAAA,cACR,aAAY;AAAA,cACZ,OAAO;AAAA,gBACL,WAAW;AAAA,gBACX,iBAAiB;AAAA,cAAA;AAAA,YACnB;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN;AAaA,SAASzB,EAAiBxD,GAAekF,GAAuB;AAC9D,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAK,CAAC,GAGlCC,IAAWnF,EAAM;AAAA,IACrB;AAAA,EAAA;AAEF,MAAImF;AACF,WAAO,QAAQA,EAAS,CAAC,CAAC,KAAKA,EAAS,CAAC,CAAC,KAAKA,EAAS,CAAC,CAAC,KAAK,CAAC;AAIlE,MAAIC,IAAMpF,EAAM,QAAQ,MAAM,EAAE;AAGhC,EAAIoF,EAAI,WAAW,MACjBA,IAAMA,EAAI,CAAC,IAAIA,EAAI,CAAC,IAAIA,EAAI,CAAC,IAAIA,EAAI,CAAC,IAAIA,EAAI,CAAC,IAAIA,EAAI,CAAC,IAItDA,EAAI,WAAW,MACjBA,IAAMA,EAAI,MAAM,GAAG,CAAC;AAGtB,QAAMC,IAAI,SAASD,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE,GAChCE,IAAI,SAASF,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE,GAChCG,IAAI,SAASH,EAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAEtC,SAAO,QAAQC,CAAC,KAAKC,CAAC,KAAKC,CAAC,KAAK,CAAC;AACpC;AAGA,SAASC,EAAIC,GAAW;AACtB,SAAOA,EAAE,SAAA,EAAW,SAAS,GAAG,GAAG;AACrC;AAMA,SAASxB,EAAgBF,GAAoC;AAC3D,QAAMiB,IAAI,IAAI,KAAKjB,CAAE;AACrB,SAAO,GAAGiB,EAAE,YAAA,CAAa,IAAIQ,EAAIR,EAAE,SAAA,IAAa,CAAC,CAAC,IAAIQ,EAAIR,EAAE,SAAS,CAAC,IAAIQ,EAAIR,EAAE,SAAA,CAAU,CAAC,IAAIQ,EAAIR,EAAE,WAAA,CAAY,CAAC,IAAIQ,EAAIR,EAAE,WAAA,CAAY,CAAC;AAC3I;AC/dA,SAASU,GAAU,EAAE,OAAA1F,GAAO,OAAAmE,GAAO,MAAArE,GAAM,MAAA6F,GAAM,UAAAC,KAA6B;AAC1E,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,4CACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,MAAA,gBAAAlE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWC,EAAG,oCAAoC;AAAA,YAChD,cAAcgE;AAAA,UAAA,CACf;AAAA,UACD,OAAO,EAAE,iBAAiB5F,EAAA;AAAA,QAAM;AAAA,MAAA;AAAA,MAElC,gBAAA2B,EAAC,QAAA,EAAK,WAAWC,EAAG,WAAW,EAAE,cAAcgE,EAAA,CAAU,GACtD,UAAA9F,EAAA,CACH;AAAA,IAAA,GACF;AAAA,IACA,gBAAA+F,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,MAAA,gBAAAlE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWC,EAAG,oCAAoC;AAAA,YAChD,cAAcgE;AAAA,UAAA,CACf;AAAA,UAEA,UAAAzB;AAAA,QAAA;AAAA,MAAA;AAAA,MAEFwB,KACC,gBAAAhE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWC,EAAG,yCAAyC;AAAA,YACrD,cAAcgE;AAAA,UAAA,CACf;AAAA,UAEA,UAAAD;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;AAMA,SAASG,GAAU,EAAE,OAAA9F,GAAO,OAAAmE,GAAO,MAAArE,GAAM,UAAA8F,KAA6B;AACpE,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA;AAAA,IAAA,gBAAAlE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWC,EAAG,oCAAoC;AAAA,UAChD,cAAcgE;AAAA,QAAA,CACf;AAAA,QACD,OAAO,EAAE,iBAAiB5F,EAAA;AAAA,MAAM;AAAA,IAAA;AAAA,IAElC,gBAAA2B,EAAC,QAAA,EAAK,WAAWC,EAAG,WAAW,EAAE,cAAcgE,EAAA,CAAU,GAAI,UAAA9F,EAAA,CAAK;AAAA,IAClE,gBAAA6B,EAAC,QAAA,EAAK,WAAWC,EAAG,uBAAuB,EAAE,cAAcgE,EAAA,CAAU,GAClE,UAAAzB,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;AAcO,MAAM4B,KAAc;AAAA,EACzB,WAAAD;AAAA,EACA,WAAAJ;AACF;"}
@@ -1,120 +0,0 @@
1
- "use client";
2
- import { jsx as b } from "react/jsx-runtime";
3
- import { c as r } from "./cn-ct4n7r74mh8y0f48.js";
4
- const l = "inline-flex w-fit flex-none shrink-0 items-center justify-self-start rounded-full px-2 py-0.5 text-xs font-medium whitespace-nowrap", a = {
5
- variant: {
6
- red: {
7
- classes: "bg-kumo-badge-red text-white",
8
- description: "Red badge"
9
- },
10
- "red-subtle": {
11
- classes: "bg-kumo-badge-red-subtle text-kumo-badge-red-subtle",
12
- description: "Subtle red badge"
13
- },
14
- orange: {
15
- classes: "bg-kumo-badge-orange text-white",
16
- description: "Orange badge"
17
- },
18
- "orange-subtle": {
19
- classes: "bg-kumo-badge-orange-subtle text-kumo-badge-orange-subtle",
20
- description: "Subtle orange badge"
21
- },
22
- yellow: {
23
- classes: "bg-kumo-badge-yellow text-white",
24
- description: "Yellow badge"
25
- },
26
- "yellow-subtle": {
27
- classes: "bg-kumo-badge-yellow-subtle text-kumo-badge-yellow-subtle",
28
- description: "Subtle yellow badge"
29
- },
30
- green: {
31
- classes: "bg-kumo-badge-green text-white",
32
- description: "Green badge"
33
- },
34
- "green-subtle": {
35
- classes: "bg-kumo-badge-green-subtle text-kumo-badge-green-subtle",
36
- description: "Subtle green badge"
37
- },
38
- teal: {
39
- classes: "bg-kumo-badge-teal text-white",
40
- description: "Teal badge"
41
- },
42
- "teal-subtle": {
43
- classes: "bg-kumo-badge-teal-subtle text-kumo-badge-teal-subtle",
44
- description: "Subtle teal badge"
45
- },
46
- blue: {
47
- classes: "bg-kumo-badge-blue text-white",
48
- description: "Blue badge"
49
- },
50
- "blue-subtle": {
51
- classes: "bg-kumo-badge-blue-subtle text-kumo-badge-blue-subtle",
52
- description: "Subtle blue badge"
53
- },
54
- neutral: {
55
- classes: "bg-kumo-badge-neutral text-white",
56
- description: "Neutral badge"
57
- },
58
- "neutral-subtle": {
59
- classes: "bg-kumo-fill text-kumo-badge-neutral-subtle",
60
- description: "Subtle neutral badge"
61
- },
62
- inverted: {
63
- classes: "bg-kumo-badge-inverted text-kumo-badge-inverted",
64
- description: "Inverted badge"
65
- },
66
- outline: {
67
- classes: "border border-kumo-fill bg-transparent text-kumo-default",
68
- description: "Bordered badge with transparent background"
69
- },
70
- beta: {
71
- classes: "border border-dashed border-kumo-brand bg-transparent text-kumo-link",
72
- description: "Indicates beta or experimental features"
73
- },
74
- /** @deprecated Use `"inverted"` instead. */
75
- primary: {
76
- classes: "bg-kumo-badge-inverted text-kumo-badge-inverted",
77
- description: "Deprecated. Use inverted instead."
78
- },
79
- /** @deprecated Use `"neutral"` instead. */
80
- secondary: {
81
- classes: "bg-kumo-badge-neutral text-white",
82
- description: "Deprecated. Use neutral instead."
83
- },
84
- /** @deprecated Use `"red"` instead. */
85
- destructive: {
86
- classes: "bg-kumo-badge-red text-white",
87
- description: "Deprecated. Use red instead."
88
- },
89
- /** @deprecated Use `"green"` instead. */
90
- success: {
91
- classes: "bg-kumo-badge-green text-white",
92
- description: "Deprecated. Use green instead."
93
- }
94
- }
95
- }, s = {
96
- variant: "neutral"
97
- };
98
- function n({
99
- variant: e = s.variant
100
- } = {}) {
101
- const t = a.variant[e];
102
- return r(
103
- // Base styles (exported as KUMO_BADGE_BASE_STYLES for Figma plugin)
104
- l,
105
- // Apply variant styles from KUMO_BADGE_VARIANTS (fallback to primary if variant not found)
106
- t?.classes ?? a.variant[s.variant].classes
107
- );
108
- }
109
- function u({
110
- variant: e = s.variant,
111
- className: t,
112
- children: d
113
- }) {
114
- return /* @__PURE__ */ b("span", { className: r(n({ variant: e }), t), children: d });
115
- }
116
- export {
117
- u as B,
118
- l as K
119
- };
120
- //# sourceMappingURL=badge-n80t3z8u9ttlxi20.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"badge-n80t3z8u9ttlxi20.js","sources":["../../src/components/badge/badge.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Base styles applied to all badge variants. */\nexport const KUMO_BADGE_BASE_STYLES =\n \"inline-flex w-fit flex-none shrink-0 items-center justify-self-start rounded-full px-2 py-0.5 text-xs font-medium whitespace-nowrap\";\n\n/** Badge variant definitions mapping variant names to their Tailwind classes and descriptions. */\nexport const KUMO_BADGE_VARIANTS = {\n variant: {\n red: {\n classes: \"bg-kumo-badge-red text-white\",\n description: \"Red badge\",\n },\n \"red-subtle\": {\n classes: \"bg-kumo-badge-red-subtle text-kumo-badge-red-subtle\",\n description: \"Subtle red badge\",\n },\n orange: {\n classes: \"bg-kumo-badge-orange text-white\",\n description: \"Orange badge\",\n },\n \"orange-subtle\": {\n classes: \"bg-kumo-badge-orange-subtle text-kumo-badge-orange-subtle\",\n description: \"Subtle orange badge\",\n },\n yellow: {\n classes: \"bg-kumo-badge-yellow text-white\",\n description: \"Yellow badge\",\n },\n \"yellow-subtle\": {\n classes: \"bg-kumo-badge-yellow-subtle text-kumo-badge-yellow-subtle\",\n description: \"Subtle yellow badge\",\n },\n green: {\n classes: \"bg-kumo-badge-green text-white\",\n description: \"Green badge\",\n },\n \"green-subtle\": {\n classes: \"bg-kumo-badge-green-subtle text-kumo-badge-green-subtle\",\n description: \"Subtle green badge\",\n },\n teal: {\n classes: \"bg-kumo-badge-teal text-white\",\n description: \"Teal badge\",\n },\n \"teal-subtle\": {\n classes: \"bg-kumo-badge-teal-subtle text-kumo-badge-teal-subtle\",\n description: \"Subtle teal badge\",\n },\n blue: {\n classes: \"bg-kumo-badge-blue text-white\",\n description: \"Blue badge\",\n },\n \"blue-subtle\": {\n classes: \"bg-kumo-badge-blue-subtle text-kumo-badge-blue-subtle\",\n description: \"Subtle blue badge\",\n },\n neutral: {\n classes: \"bg-kumo-badge-neutral text-white\",\n description: \"Neutral badge\",\n },\n \"neutral-subtle\": {\n classes: \"bg-kumo-fill text-kumo-badge-neutral-subtle\",\n description: \"Subtle neutral badge\",\n },\n inverted: {\n classes: \"bg-kumo-badge-inverted text-kumo-badge-inverted\",\n description: \"Inverted badge\",\n },\n outline: {\n classes: \"border border-kumo-fill bg-transparent text-kumo-default\",\n description: \"Bordered badge with transparent background\",\n },\n beta: {\n classes:\n \"border border-dashed border-kumo-brand bg-transparent text-kumo-link\",\n description: \"Indicates beta or experimental features\",\n },\n /** @deprecated Use `\"inverted\"` instead. */\n primary: {\n classes: \"bg-kumo-badge-inverted text-kumo-badge-inverted\",\n description: \"Deprecated. Use inverted instead.\",\n },\n /** @deprecated Use `\"neutral\"` instead. */\n secondary: {\n classes: \"bg-kumo-badge-neutral text-white\",\n description: \"Deprecated. Use neutral instead.\",\n },\n /** @deprecated Use `\"red\"` instead. */\n destructive: {\n classes: \"bg-kumo-badge-red text-white\",\n description: \"Deprecated. Use red instead.\",\n },\n /** @deprecated Use `\"green\"` instead. */\n success: {\n classes: \"bg-kumo-badge-green text-white\",\n description: \"Deprecated. Use green instead.\",\n },\n },\n} as const;\n\nexport const KUMO_BADGE_DEFAULT_VARIANTS = {\n variant: \"neutral\",\n} as const;\n\n// Derived types from KUMO_BADGE_VARIANTS\nexport type KumoBadgeVariant = keyof typeof KUMO_BADGE_VARIANTS.variant;\n\nexport interface KumoBadgeVariantsProps {\n variant?: KumoBadgeVariant;\n}\n\nexport function badgeVariants({\n variant = KUMO_BADGE_DEFAULT_VARIANTS.variant,\n}: KumoBadgeVariantsProps = {}) {\n const variantConfig = KUMO_BADGE_VARIANTS.variant[variant];\n return cn(\n // Base styles (exported as KUMO_BADGE_BASE_STYLES for Figma plugin)\n KUMO_BADGE_BASE_STYLES,\n // Apply variant styles from KUMO_BADGE_VARIANTS (fallback to primary if variant not found)\n variantConfig?.classes ??\n KUMO_BADGE_VARIANTS.variant[KUMO_BADGE_DEFAULT_VARIANTS.variant].classes,\n );\n}\n\n// Legacy type alias for backwards compatibility\nexport type BadgeVariant = KumoBadgeVariant;\n\n/**\n * Badge component props.\n *\n * @example\n * ```tsx\n * <Badge variant=\"green\">Active</Badge>\n * <Badge variant=\"red\">Error</Badge>\n * <Badge variant=\"neutral\">Inactive</Badge>\n * ```\n */\nexport interface BadgeProps {\n /**\n * Color variant of the badge.\n * - `\"red\"` / `\"red-subtle\"` — Red badge\n * - `\"orange\"` / `\"orange-subtle\"` — Orange badge\n * - `\"yellow\"` / `\"yellow-subtle\"` — Yellow badge\n * - `\"green\"` / `\"green-subtle\"` — Green badge (emerald scale)\n * - `\"teal\"` / `\"teal-subtle\"` — Teal badge\n * - `\"blue\"` / `\"blue-subtle\"` — Blue badge\n * - `\"neutral\"` / `\"neutral-subtle\"` — Neutral badge\n * - `\"inverted\"` — Inverted badge (near-black, white in dark mode)\n * - `\"outline\"` — Bordered badge with transparent background\n * - `\"beta\"` — Dashed-border badge for beta/experimental features\n * - `\"primary\"` — **Deprecated.** Use `\"inverted\"` instead.\n * - `\"secondary\"` — **Deprecated.** Use `\"neutral\"` instead.\n * - `\"destructive\"` — **Deprecated.** Use `\"red\"` instead.\n * - `\"success\"` — **Deprecated.** Use `\"green\"` instead.\n * @default \"neutral\"\n */\n variant?: KumoBadgeVariant;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Content rendered inside the badge. */\n children: ReactNode;\n}\n\n/**\n * Small status label for categorizing or highlighting content.\n *\n * @example\n * ```tsx\n * <Badge variant=\"green\">Active</Badge>\n * ```\n */\nexport function Badge({\n variant = KUMO_BADGE_DEFAULT_VARIANTS.variant,\n className,\n children,\n}: BadgeProps) {\n return (\n <span className={cn(badgeVariants({ variant }), className)}>\n {children}\n </span>\n );\n}\n"],"names":["KUMO_BADGE_BASE_STYLES","KUMO_BADGE_VARIANTS","KUMO_BADGE_DEFAULT_VARIANTS","badgeVariants","variant","variantConfig","cn","Badge","className","children","jsx"],"mappings":";;;AAIO,MAAMA,IACX,uIAGWC,IAAsB;AAAA,EACjC,SAAS;AAAA,IACP,KAAK;AAAA,MACH,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,cAAc;AAAA,MACZ,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,OAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,gBAAgB;AAAA,MACd,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,eAAe;AAAA,MACb,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,eAAe;AAAA,MACb,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,kBAAkB;AAAA,MAChB,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,UAAU;AAAA,MACR,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM;AAAA,MACJ,SACE;AAAA,MACF,aAAa;AAAA,IAAA;AAAA;AAAA,IAGf,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA;AAAA,IAGf,WAAW;AAAA,MACT,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA;AAAA,IAGf,aAAa;AAAA,MACX,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA;AAAA,IAGf,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GAEaC,IAA8B;AAAA,EACzC,SAAS;AACX;AASO,SAASC,EAAc;AAAA,EAC5B,SAAAC,IAAUF,EAA4B;AACxC,IAA4B,IAAI;AAC9B,QAAMG,IAAgBJ,EAAoB,QAAQG,CAAO;AACzD,SAAOE;AAAA;AAAA,IAELN;AAAA;AAAA,IAEAK,GAAe,WACbJ,EAAoB,QAAQC,EAA4B,OAAO,EAAE;AAAA,EAAA;AAEvE;AAiDO,SAASK,EAAM;AAAA,EACpB,SAAAH,IAAUF,EAA4B;AAAA,EACtC,WAAAM;AAAA,EACA,UAAAC;AACF,GAAe;AACb,SACE,gBAAAC,EAAC,QAAA,EAAK,WAAWJ,EAAGH,EAAc,EAAE,SAAAC,GAAS,GAAGI,CAAS,GACtD,UAAAC,EAAA,CACH;AAEJ;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"button-odxi0hp4fvi5i2w3.js","sources":["../../src/components/button/button.tsx"],"sourcesContent":["import React from \"react\";\nimport { ArrowsClockwise, type Icon } from \"@phosphor-icons/react\";\nimport { Loader } from \"../loader/loader\";\nimport { Tooltip } from \"../tooltip/tooltip\";\nimport { cn } from \"../../utils/cn\";\nimport { useLinkComponent } from \"../../utils/link-provider\";\n\n/** Button variant definitions mapping shape, size, and variant names to their Tailwind classes. */\nexport const KUMO_BUTTON_VARIANTS = {\n shape: {\n base: {\n classes: \"\",\n description: \"Default rectangular button shape\",\n },\n square: {\n classes: \"items-center justify-center p-0\",\n description: \"Square button for icon-only actions\",\n },\n circle: {\n classes: \"items-center justify-center p-0 rounded-full\",\n description: \"Circular button for icon-only actions\",\n },\n },\n size: {\n xs: {\n classes: \"h-5 gap-1 rounded-sm px-1.5 text-xs\",\n description: \"Extra small button for compact UIs\",\n },\n sm: {\n classes: \"h-6.5 gap-1 rounded-md px-2 text-xs\",\n description: \"Small button for secondary actions\",\n },\n base: {\n classes: \"h-9 gap-1.5 rounded-lg px-3 text-base\",\n description: \"Default button size\",\n },\n lg: {\n classes: \"h-10 gap-2 rounded-lg px-4 text-base\",\n description: \"Large button for primary CTAs\",\n },\n },\n compactSize: {\n xs: { classes: \"size-3.5\" },\n sm: { classes: \"size-6.5\" },\n base: { classes: \"size-9\" },\n lg: { classes: \"size-10\" },\n },\n variant: {\n primary: {\n classes:\n \"bg-kumo-brand !text-white hover:bg-kumo-brand-hover focus:bg-kumo-brand-hover disabled:bg-kumo-brand/50\",\n description: \"High-emphasis button for primary actions\",\n },\n secondary: {\n classes:\n \"bg-kumo-base !text-kumo-default ring not-disabled:hover:border-secondary! not-disabled:hover:bg-kumo-tint disabled:bg-kumo-base/50 disabled:!text-kumo-default/70 ring-kumo-ring data-[state=open]:bg-kumo-base\",\n description: \"Default button style for most actions\",\n },\n ghost: {\n classes: \"text-kumo-default hover:bg-kumo-tint shadow-none bg-inherit\",\n description: \"Minimal button with no background\",\n },\n destructive: {\n classes: \"bg-kumo-danger !text-white hover:bg-kumo-danger/70\",\n description: \"Danger button for destructive actions like delete\",\n },\n \"secondary-destructive\": {\n classes:\n \"bg-kumo-base !text-kumo-danger ring not-disabled:hover:border-secondary! not-disabled:hover:bg-kumo-base disabled:bg-kumo-base/50 disabled:!text-kumo-danger/70 ring-kumo-line data-[state=open]:bg-kumo-base\",\n description:\n \"Secondary button with destructive text for less prominent dangerous actions\",\n },\n outline: {\n classes: \"bg-transparent text-kumo-default ring ring-kumo-ring\",\n description: \"Bordered button with transparent background\",\n },\n },\n} as const;\n\nexport const KUMO_BUTTON_DEFAULT_VARIANTS = {\n shape: \"base\",\n size: \"base\",\n variant: \"secondary\",\n} as const;\n\n// Derived types from KUMO_BUTTON_VARIANTS\nexport type KumoButtonShape = keyof typeof KUMO_BUTTON_VARIANTS.shape;\nexport type KumoButtonSize = keyof typeof KUMO_BUTTON_VARIANTS.size;\nexport type KumoButtonVariant = keyof typeof KUMO_BUTTON_VARIANTS.variant;\n\nexport interface KumoButtonVariantsProps {\n /**\n * Button shape.\n * - `\"base\"` — Default rectangular button\n * - `\"square\"` — Square button for icon-only actions\n * - `\"circle\"` — Circular button for icon-only actions\n * @default \"base\"\n */\n shape?: KumoButtonShape;\n /**\n * Button size.\n * - `\"xs\"` — Extra small for compact UIs\n * - `\"sm\"` — Small for secondary actions\n * - `\"base\"` — Default size\n * - `\"lg\"` — Large for primary CTAs\n * @default \"base\"\n */\n size?: KumoButtonSize;\n /**\n * Visual style of the button.\n * - `\"primary\"` — High-emphasis, brand-colored for primary actions\n * - `\"secondary\"` — Default style with border for most actions\n * - `\"ghost\"` — Minimal, no background for tertiary actions\n * - `\"destructive\"` — Danger button for destructive actions\n * - `\"secondary-destructive\"` — Secondary style with destructive text\n * - `\"outline\"` — Bordered with transparent background\n * @default \"secondary\"\n */\n variant?: KumoButtonVariant;\n}\n\nexport function buttonVariants({\n variant = KUMO_BUTTON_DEFAULT_VARIANTS.variant,\n size = KUMO_BUTTON_DEFAULT_VARIANTS.size,\n shape = KUMO_BUTTON_DEFAULT_VARIANTS.shape,\n}: KumoButtonVariantsProps = {}) {\n const isCompactShape = shape === \"square\" || shape === \"circle\";\n\n return cn(\n // Base styles\n \"group flex w-max shrink-0 items-center font-medium select-none\",\n \"border-0 shadow-xs\",\n \"cursor-pointer\",\n // Disabled state\n \"disabled:cursor-not-allowed disabled:text-kumo-subtle\",\n // Apply variant, size, shape styles from KUMO_BUTTON_VARIANTS\n KUMO_BUTTON_VARIANTS.variant[variant].classes,\n KUMO_BUTTON_VARIANTS.size[size].classes,\n KUMO_BUTTON_VARIANTS.shape[shape].classes,\n isCompactShape && KUMO_BUTTON_VARIANTS.compactSize[size].classes,\n );\n}\n\n// Normalize icon prop to support both React elements and component types\nconst renderIconNode = (IconComponent?: Icon | React.ReactNode) => {\n if (!IconComponent) return null;\n if (React.isValidElement(IconComponent)) return IconComponent;\n const Comp = IconComponent as React.ComponentType<Record<string, unknown>>;\n return <Comp />;\n};\n\n/**\n * Button component props.\n *\n * Uses a discriminated union on `shape` so that icon-only buttons\n * (`shape=\"square\"` or `shape=\"circle\"`) require an `aria-label`.\n *\n * @example\n * ```tsx\n * <Button variant=\"primary\">Save</Button>\n * <Button variant=\"secondary\" shape=\"square\" icon={PlusIcon} aria-label=\"Add\" />\n * <Button variant=\"destructive\" loading>Deleting...</Button>\n * ```\n */\ntype ButtonBaseProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n /** Content rendered inside the button. */\n children?: React.ReactNode;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Icon from `@phosphor-icons/react` or a React element. Rendered before children. */\n icon?: Icon | React.ReactNode;\n /** Shows a loading spinner and disables interaction. */\n loading?: boolean;\n /** When set, wraps the button in a Tooltip with this content. */\n title?: React.ReactNode;\n};\n\ntype ButtonWithTextProps = ButtonBaseProps & {\n shape?: \"base\";\n size?: KumoButtonSize;\n variant?: KumoButtonVariant;\n};\n\ntype IconOnlyButtonProps = ButtonBaseProps & {\n shape: \"square\" | \"circle\";\n size?: KumoButtonSize;\n variant?: KumoButtonVariant;\n /** Required for icon-only buttons to provide accessible label for screen readers */\n \"aria-label\": string;\n};\n\nexport type ButtonProps = ButtonWithTextProps | IconOnlyButtonProps;\n\n/**\n * LinkButton component props — renders an anchor styled as a button.\n *\n * @example\n * ```tsx\n * <LinkButton href=\"/docs\" variant=\"ghost\" icon={BookIcon}>Docs</LinkButton>\n * <LinkButton href=\"https://example.com\" external>Visit Site</LinkButton>\n * ```\n */\nexport type LinkButtonProps = React.AnchorHTMLAttributes<HTMLAnchorElement> &\n KumoButtonVariantsProps & {\n /** Content rendered inside the link button. */\n children?: React.ReactNode;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Icon from `@phosphor-icons/react` or a React element. Rendered before children. */\n icon?: Icon | React.ReactNode;\n /** When `true`, opens in a new tab with `rel=\"noopener noreferrer\"`. */\n external?: boolean;\n linksExternal?: boolean;\n };\n\n/**\n * Primary action trigger. Supports multiple variants, sizes, shapes, icons, and loading state.\n *\n * @example\n * ```tsx\n * <Button variant=\"primary\">Save</Button>\n * <Button variant=\"secondary\" icon={PlusIcon}>Create Worker</Button>\n * ```\n */\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n className,\n disabled,\n loading,\n shape = \"base\",\n size = \"base\",\n variant = \"secondary\",\n icon: IconComponent,\n title,\n ...props\n },\n ref,\n ) => {\n const { type, ...restProps } = props;\n const button = (\n <button\n ref={ref}\n className={cn(\n buttonVariants({ variant, size, shape }),\n \"focus:opacity-100 focus-visible:ring-1 focus-visible:ring-kumo-ring *:in-focus:opacity-100\", // Focus styles\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n disabled={loading || disabled}\n type={type ?? \"button\"}\n {...restProps}\n >\n {loading && <Loader size={size === \"lg\" ? 16 : 14} />}\n {!loading && renderIconNode(IconComponent)}\n\n {children}\n </button>\n );\n\n if (title) {\n return (\n <Tooltip content={title} asChild>\n {button}\n </Tooltip>\n );\n }\n\n return button;\n },\n);\n\nButton.displayName = \"Button\";\n\n/**\n * Square button with a rotating arrows icon, used to trigger data refresh actions.\n *\n * @example\n * ```tsx\n * <RefreshButton loading={isRefreshing} onClick={refresh} />\n * ```\n */\nexport const RefreshButton = ({\n \"aria-label\": ariaLabel = \"Refresh\",\n loading,\n ...props\n}: ButtonProps) => (\n <Button shape=\"square\" aria-label={ariaLabel} {...props}>\n <ArrowsClockwise\n className={cn({\n \"animate-refresh\": loading,\n \"size-4.5\": props.size === \"base\" || !props.size,\n \"size-4\": props.size === \"sm\",\n \"size-5\": props.size === \"lg\",\n })}\n />\n </Button>\n);\n\n/**\n * Anchor element styled as a button. Integrates with `LinkProvider` for framework routing.\n *\n * @example\n * ```tsx\n * <LinkButton href=\"/settings\" variant=\"ghost\">Settings</LinkButton>\n * ```\n */\nexport const LinkButton = React.forwardRef<HTMLAnchorElement, LinkButtonProps>(\n (\n {\n children,\n className,\n external,\n href,\n shape = \"base\",\n size = \"base\",\n variant = \"ghost\",\n icon: IconComponent,\n // linksExternal = false,\n ...props\n },\n ref,\n ) => {\n const LinkComponent = useLinkComponent();\n const externalProps = external\n ? { target: \"_blank\", rel: \"noopener noreferrer\" }\n : {};\n\n return (\n <LinkComponent\n ref={ref}\n className={cn(\n buttonVariants({ variant, size, shape }),\n \"flex items-center no-underline!\",\n className,\n )}\n href={href}\n to={typeof href === \"string\" ? href : undefined}\n {...externalProps}\n {...props}\n >\n {renderIconNode(IconComponent)}\n {children}\n </LinkComponent>\n );\n },\n);\n\nLinkButton.displayName = \"LinkButton\";\n"],"names":["KUMO_BUTTON_VARIANTS","KUMO_BUTTON_DEFAULT_VARIANTS","buttonVariants","variant","size","shape","isCompactShape","cn","renderIconNode","IconComponent","React","Button","children","className","disabled","loading","title","props","ref","type","restProps","button","jsxs","Loader","Tooltip","RefreshButton","ariaLabel","jsx","ArrowsClockwise","LinkButton","external","href","LinkComponent","useLinkComponent","externalProps"],"mappings":"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"}