@cloudflare/kumo 2.2.2 → 2.4.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 (252) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/ai/component-registry.json +194 -128
  3. package/ai/component-registry.md +412 -221
  4. package/ai/schemas.ts +8 -2
  5. package/dist/.build-complete +1 -1
  6. package/dist/ai/schemas.d.ts +58 -38
  7. package/dist/ai/schemas.d.ts.map +1 -1
  8. package/dist/ai/schemas.js +14 -4
  9. package/dist/ai/schemas.js.map +1 -1
  10. package/dist/chunks/SankeyChart-npoyr1j06svoxsfe.js +770 -0
  11. package/dist/chunks/SankeyChart-npoyr1j06svoxsfe.js.map +1 -0
  12. package/dist/chunks/{autocomplete-mhrvtq4y5n21vr0t.js → autocomplete-cvp5fsdt6gh0p3vu.js} +86 -68
  13. package/dist/chunks/autocomplete-cvp5fsdt6gh0p3vu.js.map +1 -0
  14. package/dist/chunks/{badge-kqox9toi0sygfbno.js → badge-c1th6h6ahz7eu49q.js} +80 -19
  15. package/dist/chunks/badge-c1th6h6ahz7eu49q.js.map +1 -0
  16. package/dist/chunks/banner-es5iwuk4pf25e29e.js +120 -0
  17. package/dist/chunks/banner-es5iwuk4pf25e29e.js.map +1 -0
  18. package/dist/chunks/{breadcrumbs-ohstavaqvycoremm.js → breadcrumbs-j214mimk5zj4ffp4.js} +8 -6
  19. package/dist/chunks/breadcrumbs-j214mimk5zj4ffp4.js.map +1 -0
  20. package/dist/chunks/{button-oevxukl0zmwoq4tb.js → button-mnrxu6dud2x5js5b.js} +19 -17
  21. package/dist/chunks/{button-oevxukl0zmwoq4tb.js.map → button-mnrxu6dud2x5js5b.js.map} +1 -1
  22. package/dist/chunks/{checkbox-h6vkv17lnq854z2c.js → checkbox-dqih8tzzt3vhp870.js} +25 -19
  23. package/dist/chunks/checkbox-dqih8tzzt3vhp870.js.map +1 -0
  24. package/dist/chunks/{clipboard-text-kyy71jmx7umdh8k8.js → clipboard-text-mrut8z3dt1w0efxz.js} +4 -4
  25. package/dist/chunks/{clipboard-text-kyy71jmx7umdh8k8.js.map → clipboard-text-mrut8z3dt1w0efxz.js.map} +1 -1
  26. package/dist/chunks/{collapsible-ej6p2bq758sw30nk.js → collapsible-nzqcf9zwnjkxqzr6.js} +21 -17
  27. package/dist/chunks/collapsible-nzqcf9zwnjkxqzr6.js.map +1 -0
  28. package/dist/chunks/{combobox-g3cudlfajecou4va.js → combobox-dpptfpcmqfrso1xa.js} +123 -111
  29. package/dist/chunks/combobox-dpptfpcmqfrso1xa.js.map +1 -0
  30. package/dist/chunks/{command-palette-eep807rf6iapoz8r.js → command-palette-fqhyacp33fhyf696.js} +12 -12
  31. package/dist/chunks/{command-palette-eep807rf6iapoz8r.js.map → command-palette-fqhyacp33fhyf696.js.map} +1 -1
  32. package/dist/chunks/dialog-my9fioafdstq50mi.js +134 -0
  33. package/dist/chunks/dialog-my9fioafdstq50mi.js.map +1 -0
  34. package/dist/chunks/{dropdown-cobpydatw4vlb3ov.js → dropdown-g4sb4cw9ffqaw5gx.js} +54 -44
  35. package/dist/chunks/dropdown-g4sb4cw9ffqaw5gx.js.map +1 -0
  36. package/dist/chunks/{empty-n3r7xutkb9sxjaso.js → empty-n17inn1z67bpohkw.js} +2 -2
  37. package/dist/chunks/{empty-n3r7xutkb9sxjaso.js.map → empty-n17inn1z67bpohkw.js.map} +1 -1
  38. package/dist/chunks/{field-l1oapopp6kjnephi.js → field-c8o7h3rlam4c9pcx.js} +3 -3
  39. package/dist/chunks/{field-l1oapopp6kjnephi.js.map → field-c8o7h3rlam4c9pcx.js.map} +1 -1
  40. package/dist/chunks/{input-area-gudamx1ruz8rxiw2.js → input-area-eurk3seud30ricwn.js} +4 -4
  41. package/dist/chunks/{input-area-gudamx1ruz8rxiw2.js.map → input-area-eurk3seud30ricwn.js.map} +1 -1
  42. package/dist/chunks/{input-i3os21puacqw4r75.js → input-en8hhb14mmt3tfwn.js} +3 -3
  43. package/dist/chunks/{input-i3os21puacqw4r75.js.map → input-en8hhb14mmt3tfwn.js.map} +1 -1
  44. package/dist/chunks/{input-group-gy08vju7eoogil8k.js → input-group-d09ocmjcbdai0gze.js} +70 -70
  45. package/dist/chunks/input-group-d09ocmjcbdai0gze.js.map +1 -0
  46. package/dist/chunks/{label-i0bj94d43irz0k1x.js → label-c8rz453pti66slki.js} +3 -3
  47. package/dist/chunks/{label-i0bj94d43irz0k1x.js.map → label-c8rz453pti66slki.js.map} +1 -1
  48. package/dist/chunks/{layer-card-hyz8lfxceudt05pv.js → layer-card-er4flkcxmzfug8jw.js} +2 -2
  49. package/dist/chunks/{layer-card-hyz8lfxceudt05pv.js.map → layer-card-er4flkcxmzfug8jw.js.map} +1 -1
  50. package/dist/chunks/{link-lkzjiitte3l29q87.js → link-i6vnwyjcwvjz5btm.js} +20 -19
  51. package/dist/chunks/{link-lkzjiitte3l29q87.js.map → link-i6vnwyjcwvjz5btm.js.map} +1 -1
  52. package/dist/chunks/menubar-ng5if56amh1tto4j.js +98 -0
  53. package/dist/chunks/menubar-ng5if56amh1tto4j.js.map +1 -0
  54. package/dist/chunks/{meter-jbxkh6gfggx1kjna.js → meter-d5igshkjqttl1fdj.js} +2 -2
  55. package/dist/chunks/{meter-jbxkh6gfggx1kjna.js.map → meter-d5igshkjqttl1fdj.js.map} +1 -1
  56. package/dist/chunks/{pagination-ceetno8sc1rd0wr2.js → pagination-bw7vwca4wrfjm8vb.js} +3 -3
  57. package/dist/chunks/{pagination-ceetno8sc1rd0wr2.js.map → pagination-bw7vwca4wrfjm8vb.js.map} +1 -1
  58. package/dist/chunks/{popover-i4opvl9g0as52fyx.js → popover-ozf1j7oi7pxiudyz.js} +4 -2
  59. package/dist/chunks/popover-ozf1j7oi7pxiudyz.js.map +1 -0
  60. package/dist/chunks/{radio-g56o5rftpu1qpxuv.js → radio-gpg6kmzonr2cayq1.js} +54 -46
  61. package/dist/chunks/radio-gpg6kmzonr2cayq1.js.map +1 -0
  62. package/dist/chunks/select-dw9iw35ug7yer3o3.js +237 -0
  63. package/dist/chunks/select-dw9iw35ug7yer3o3.js.map +1 -0
  64. package/dist/chunks/{sensitive-input-hokm527ollnz9dqc.js → sensitive-input-dgoxjtoxl4zqa51v.js} +101 -92
  65. package/dist/chunks/sensitive-input-dgoxjtoxl4zqa51v.js.map +1 -0
  66. package/dist/chunks/sidebar-hzio700cg85f7f31.js +1014 -0
  67. package/dist/chunks/sidebar-hzio700cg85f7f31.js.map +1 -0
  68. package/dist/chunks/{surface-ck1nt2uqfzmod4sz.js → surface-iyejjbqogjbo7ise.js} +2 -2
  69. package/dist/chunks/{surface-ck1nt2uqfzmod4sz.js.map → surface-iyejjbqogjbo7ise.js.map} +1 -1
  70. package/dist/chunks/{switch-fv0ttj24uhocvuh8.js → switch-g8f77h69h34xld06.js} +50 -45
  71. package/dist/chunks/switch-g8f77h69h34xld06.js.map +1 -0
  72. package/dist/chunks/{table-nsfcgpo93gfetrhh.js → table-e1te1im2tt2ez05y.js} +2 -2
  73. package/dist/chunks/{table-nsfcgpo93gfetrhh.js.map → table-e1te1im2tt2ez05y.js.map} +1 -1
  74. package/dist/chunks/{table-of-contents-fzyv7uhnnyr13dqu.js → table-of-contents-jco9kvt48d34dwsw.js} +34 -30
  75. package/dist/chunks/table-of-contents-jco9kvt48d34dwsw.js.map +1 -0
  76. package/dist/chunks/{tabs-g8ier5pehjpfxauf.js → tabs-hice1yy5q2t889z8.js} +6 -4
  77. package/dist/chunks/tabs-hice1yy5q2t889z8.js.map +1 -0
  78. package/dist/chunks/{toast-ofqlfmddcyka091n.js → toast-kvbgct0jvfmn4mas.js} +29 -27
  79. package/dist/chunks/{toast-ofqlfmddcyka091n.js.map → toast-kvbgct0jvfmn4mas.js.map} +1 -1
  80. package/dist/chunks/{tooltip-icvb67awe1zolz61.js → tooltip-ken77ixya0qpidie.js} +13 -13
  81. package/dist/chunks/{tooltip-icvb67awe1zolz61.js.map → tooltip-ken77ixya0qpidie.js.map} +1 -1
  82. package/dist/chunks/vendor-base-ui-knphx7dts1vm1x37.js +24710 -0
  83. package/dist/chunks/vendor-base-ui-knphx7dts1vm1x37.js.map +1 -0
  84. package/dist/chunks/{vendor-floating-ui-dwag5e88viikh2zs.js → vendor-floating-ui-c4mwmh0xmfzevy9l.js} +5 -5
  85. package/dist/chunks/{vendor-floating-ui-dwag5e88viikh2zs.js.map → vendor-floating-ui-c4mwmh0xmfzevy9l.js.map} +1 -1
  86. package/dist/chunks/vendor-utils-m5h2xu7s2rs3pgk5.js +217 -0
  87. package/dist/chunks/vendor-utils-m5h2xu7s2rs3pgk5.js.map +1 -0
  88. package/dist/code.js +1 -1
  89. package/dist/components/autocomplete.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/collapsible.js +1 -1
  98. package/dist/components/combobox.js +1 -1
  99. package/dist/components/command-palette.js +1 -1
  100. package/dist/components/dialog.js +1 -1
  101. package/dist/components/dropdown.js +1 -1
  102. package/dist/components/empty.js +1 -1
  103. package/dist/components/field.js +1 -1
  104. package/dist/components/input-group.js +1 -1
  105. package/dist/components/input.js +3 -3
  106. package/dist/components/label.js +1 -1
  107. package/dist/components/layer-card.js +1 -1
  108. package/dist/components/link.js +1 -1
  109. package/dist/components/menubar.js +1 -1
  110. package/dist/components/meter.js +1 -1
  111. package/dist/components/pagination.js +1 -1
  112. package/dist/components/popover.js +1 -1
  113. package/dist/components/radio.js +1 -1
  114. package/dist/components/select.js +1 -1
  115. package/dist/components/sensitive-input.js +1 -1
  116. package/dist/components/sidebar.js +22 -23
  117. package/dist/components/surface.js +1 -1
  118. package/dist/components/switch.js +1 -1
  119. package/dist/components/table-of-contents.js +1 -1
  120. package/dist/components/table.js +1 -1
  121. package/dist/components/tabs.js +1 -1
  122. package/dist/components/toast.js +2 -2
  123. package/dist/components/tooltip.js +1 -1
  124. package/dist/index.js +122 -123
  125. package/dist/primitives/accordion.js +1 -1
  126. package/dist/primitives/alert-dialog.js +1 -1
  127. package/dist/primitives/autocomplete.js +1 -1
  128. package/dist/primitives/avatar.js +1 -1
  129. package/dist/primitives/button.js +1 -1
  130. package/dist/primitives/checkbox-group.js +1 -1
  131. package/dist/primitives/checkbox.js +1 -1
  132. package/dist/primitives/collapsible.js +1 -1
  133. package/dist/primitives/combobox.js +1 -1
  134. package/dist/primitives/context-menu.js +1 -1
  135. package/dist/primitives/csp-provider.js +1 -1
  136. package/dist/primitives/dialog.js +1 -1
  137. package/dist/primitives/direction-provider.js +1 -1
  138. package/dist/primitives/drawer.js +1 -1
  139. package/dist/primitives/field.js +1 -1
  140. package/dist/primitives/fieldset.js +1 -1
  141. package/dist/primitives/form.js +1 -1
  142. package/dist/primitives/input.js +1 -1
  143. package/dist/primitives/menu.js +1 -1
  144. package/dist/primitives/menubar.js +1 -1
  145. package/dist/primitives/meter.js +1 -1
  146. package/dist/primitives/navigation-menu.js +1 -1
  147. package/dist/primitives/number-field.js +1 -1
  148. package/dist/primitives/otp-field.js +1 -1
  149. package/dist/primitives/popover.js +1 -1
  150. package/dist/primitives/preview-card.js +1 -1
  151. package/dist/primitives/progress.js +1 -1
  152. package/dist/primitives/radio-group.js +1 -1
  153. package/dist/primitives/radio.js +1 -1
  154. package/dist/primitives/scroll-area.js +1 -1
  155. package/dist/primitives/select.js +1 -1
  156. package/dist/primitives/separator.js +1 -1
  157. package/dist/primitives/slider.js +1 -1
  158. package/dist/primitives/switch.js +1 -1
  159. package/dist/primitives/tabs.js +1 -1
  160. package/dist/primitives/toast.js +1 -1
  161. package/dist/primitives/toggle-group.js +1 -1
  162. package/dist/primitives/toggle.js +1 -1
  163. package/dist/primitives/toolbar.js +1 -1
  164. package/dist/primitives/tooltip.js +1 -1
  165. package/dist/primitives.js +1 -1
  166. package/dist/scripts/theme-generator/config.d.ts.map +1 -1
  167. package/dist/scripts/theme-generator/config.js +37 -39
  168. package/dist/scripts/theme-generator/config.js.map +1 -1
  169. package/dist/scripts/theme-generator/generate-css.d.ts.map +1 -1
  170. package/dist/scripts/theme-generator/types.d.ts +8 -2
  171. package/dist/scripts/theme-generator/types.d.ts.map +1 -1
  172. package/dist/src/components/autocomplete/autocomplete.d.ts +1 -0
  173. package/dist/src/components/autocomplete/autocomplete.d.ts.map +1 -1
  174. package/dist/src/components/autocomplete/index.d.ts +1 -0
  175. package/dist/src/components/autocomplete/index.d.ts.map +1 -1
  176. package/dist/src/components/badge/badge.d.ts +51 -3
  177. package/dist/src/components/badge/badge.d.ts.map +1 -1
  178. package/dist/src/components/banner/banner.d.ts +14 -7
  179. package/dist/src/components/banner/banner.d.ts.map +1 -1
  180. package/dist/src/components/breadcrumbs/breadcrumbs.d.ts.map +1 -1
  181. package/dist/src/components/button/button.d.ts.map +1 -1
  182. package/dist/src/components/chart/SankeyChart.d.ts +6 -1
  183. package/dist/src/components/chart/SankeyChart.d.ts.map +1 -1
  184. package/dist/src/components/chart/TimeseriesChart.d.ts +43 -1
  185. package/dist/src/components/chart/TimeseriesChart.d.ts.map +1 -1
  186. package/dist/src/components/checkbox/checkbox.d.ts.map +1 -1
  187. package/dist/src/components/collapsible/collapsible.d.ts.map +1 -1
  188. package/dist/src/components/combobox/combobox.d.ts +1 -0
  189. package/dist/src/components/combobox/combobox.d.ts.map +1 -1
  190. package/dist/src/components/combobox/index.d.ts +1 -0
  191. package/dist/src/components/combobox/index.d.ts.map +1 -1
  192. package/dist/src/components/dialog/dialog.d.ts +11 -4
  193. package/dist/src/components/dialog/dialog.d.ts.map +1 -1
  194. package/dist/src/components/dropdown/dropdown.d.ts.map +1 -1
  195. package/dist/src/components/input-group/input-group-button.d.ts.map +1 -1
  196. package/dist/src/components/input-group/input-group-input.d.ts.map +1 -1
  197. package/dist/src/components/input-group/input-group.d.ts.map +1 -1
  198. package/dist/src/components/link/link.d.ts.map +1 -1
  199. package/dist/src/components/menubar/menubar.d.ts.map +1 -1
  200. package/dist/src/components/popover/popover.d.ts.map +1 -1
  201. package/dist/src/components/radio/radio.d.ts.map +1 -1
  202. package/dist/src/components/select/select.d.ts.map +1 -1
  203. package/dist/src/components/sensitive-input/sensitive-input.d.ts.map +1 -1
  204. package/dist/src/components/sidebar/index.d.ts +1 -1
  205. package/dist/src/components/sidebar/index.d.ts.map +1 -1
  206. package/dist/src/components/sidebar/sidebar.d.ts +159 -146
  207. package/dist/src/components/sidebar/sidebar.d.ts.map +1 -1
  208. package/dist/src/components/switch/switch.d.ts.map +1 -1
  209. package/dist/src/components/table-of-contents/table-of-contents.d.ts.map +1 -1
  210. package/dist/src/components/tabs/tabs.d.ts.map +1 -1
  211. package/dist/src/components/toast/toast.d.ts.map +1 -1
  212. package/dist/src/index.d.ts +1 -1
  213. package/dist/src/index.d.ts.map +1 -1
  214. package/dist/styles/kumo-binding.css +0 -18
  215. package/dist/styles/kumo-standalone.css +1 -1
  216. package/dist/styles/kumo.css +37 -0
  217. package/dist/styles/theme-kumo.css +30 -37
  218. package/package.json +5 -2
  219. package/scripts/generate-primitives.ts +6 -1
  220. package/scripts/theme-generator/config.ts +38 -40
  221. package/scripts/theme-generator/generate-css.ts +4 -1
  222. package/scripts/theme-generator/types.ts +8 -2
  223. package/dist/chunks/SankeyChart-dkq90770ad7hgzx3.js +0 -635
  224. package/dist/chunks/SankeyChart-dkq90770ad7hgzx3.js.map +0 -1
  225. package/dist/chunks/autocomplete-mhrvtq4y5n21vr0t.js.map +0 -1
  226. package/dist/chunks/badge-kqox9toi0sygfbno.js.map +0 -1
  227. package/dist/chunks/banner-ip2lm8r87hich557.js +0 -88
  228. package/dist/chunks/banner-ip2lm8r87hich557.js.map +0 -1
  229. package/dist/chunks/breadcrumbs-ohstavaqvycoremm.js.map +0 -1
  230. package/dist/chunks/checkbox-h6vkv17lnq854z2c.js.map +0 -1
  231. package/dist/chunks/collapsible-ej6p2bq758sw30nk.js.map +0 -1
  232. package/dist/chunks/combobox-g3cudlfajecou4va.js.map +0 -1
  233. package/dist/chunks/dialog-fo3qhv9fgiadq5gp.js +0 -115
  234. package/dist/chunks/dialog-fo3qhv9fgiadq5gp.js.map +0 -1
  235. package/dist/chunks/dropdown-cobpydatw4vlb3ov.js.map +0 -1
  236. package/dist/chunks/input-group-gy08vju7eoogil8k.js.map +0 -1
  237. package/dist/chunks/menubar-jalggrag4utvdpey.js +0 -96
  238. package/dist/chunks/menubar-jalggrag4utvdpey.js.map +0 -1
  239. package/dist/chunks/popover-i4opvl9g0as52fyx.js.map +0 -1
  240. package/dist/chunks/radio-g56o5rftpu1qpxuv.js.map +0 -1
  241. package/dist/chunks/select-g1xvti1k1hj7xe5t.js +0 -226
  242. package/dist/chunks/select-g1xvti1k1hj7xe5t.js.map +0 -1
  243. package/dist/chunks/sensitive-input-hokm527ollnz9dqc.js.map +0 -1
  244. package/dist/chunks/sidebar-oan40ylmqkyui21w.js +0 -875
  245. package/dist/chunks/sidebar-oan40ylmqkyui21w.js.map +0 -1
  246. package/dist/chunks/switch-fv0ttj24uhocvuh8.js.map +0 -1
  247. package/dist/chunks/table-of-contents-fzyv7uhnnyr13dqu.js.map +0 -1
  248. package/dist/chunks/tabs-g8ier5pehjpfxauf.js.map +0 -1
  249. package/dist/chunks/vendor-base-ui-nbyiqqi138hcoz52.js +0 -24639
  250. package/dist/chunks/vendor-base-ui-nbyiqqi138hcoz52.js.map +0 -1
  251. package/dist/chunks/vendor-utils-ixnhxmehwihk5tr7.js +0 -534
  252. package/dist/chunks/vendor-utils-ixnhxmehwihk5tr7.js.map +0 -1
@@ -2,11 +2,11 @@
2
2
  import { jsxs as c, jsx as e } from "react/jsx-runtime";
3
3
  import { CheckIcon as A, CopyIcon as S } from "@phosphor-icons/react";
4
4
  import { forwardRef as P, useState as _, useRef as I, useCallback as O } from "react";
5
- import { B as V } from "./button-oevxukl0zmwoq4tb.js";
6
- import { i as M } from "./input-i3os21puacqw4r75.js";
5
+ import { B as V } from "./button-mnrxu6dud2x5js5b.js";
6
+ import { i as M } from "./input-en8hhb14mmt3tfwn.js";
7
7
  import { c as s } from "./cn-ct4n7r74mh8y0f48.js";
8
8
  import { r as y } from "./resolve-variant-gw6eh7fa4st8ej7m.js";
9
- import { V as j, W as B, X as D, Y as E, Z as L, _ as U, $ as X, a0 as K, a1 as W, a2 as F, a3 as Y, a4 as Z, a5 as $ } from "./vendor-base-ui-nbyiqqi138hcoz52.js";
9
+ import { V as j, W as B, X as D, Y as E, Z as L, _ as U, $ as X, a0 as K, a1 as W, a2 as F, a3 as Y, a4 as Z, a5 as $ } from "./vendor-base-ui-knphx7dts1vm1x37.js";
10
10
  const v = j(), C = {
11
11
  size: {
12
12
  sm: {
@@ -188,4 +188,4 @@ J.displayName = "ClipboardText";
188
188
  export {
189
189
  J as C
190
190
  };
191
- //# sourceMappingURL=clipboard-text-kyy71jmx7umdh8k8.js.map
191
+ //# sourceMappingURL=clipboard-text-mrut8z3dt1w0efxz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"clipboard-text-kyy71jmx7umdh8k8.js","sources":["../../src/components/clipboard-text/clipboard-text.tsx"],"sourcesContent":["import { CheckIcon, CopyIcon } from \"@phosphor-icons/react\";\nimport { forwardRef, useCallback, useRef, useState } from \"react\";\nimport { Toast } from \"@base-ui/react/toast\";\nimport { Tooltip } from \"@base-ui/react/tooltip\";\nimport { Button } from \"../button\";\nimport { inputVariants } from \"../input\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\n\n// Create a toast manager for anchored \"Copied\" toasts\nconst clipboardToastManager = Toast.createToastManager();\n\n/** ClipboardText size variant definitions mapping sizes to their Tailwind classes. */\nexport const KUMO_CLIPBOARD_TEXT_VARIANTS = {\n size: {\n sm: {\n classes: \"text-xs\",\n buttonSize: \"sm\" as const,\n description: \"Small clipboard text for compact UIs\",\n },\n base: {\n classes: \"text-sm\",\n buttonSize: \"base\" as const,\n description: \"Default clipboard text size\",\n },\n lg: {\n classes: \"text-sm\",\n buttonSize: \"lg\" as const,\n description: \"Large clipboard text for prominent display\",\n },\n },\n} as const;\n\nexport const KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS = {\n size: \"lg\",\n} as const;\n\nconst clipboardTextAnimations = {\n slide: {\n initial:\n \"pointer-events-none absolute inset-0 flex items-center justify-center opacity-0 translate-y-full\",\n animate: \"translate-y-0 opacity-100\",\n end: \"pointer-events-none absolute inset-0 flex items-center justify-center opacity-0 -translate-y-full\",\n },\n} as const;\n\n// Derived types from KUMO_CLIPBOARD_TEXT_VARIANTS\nexport type KumoClipboardTextSize =\n keyof typeof KUMO_CLIPBOARD_TEXT_VARIANTS.size;\n\nexport interface KumoClipboardTextVariantsProps {\n /**\n * Size of the clipboard text field.\n * - `\"sm\"` — Small clipboard text for compact UIs\n * - `\"base\"` — Default clipboard text size\n * - `\"lg\"` — Large clipboard text for prominent display\n * @default \"lg\"\n */\n size?: KumoClipboardTextSize;\n}\n\nexport function clipboardTextVariants({\n size = KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS.size,\n}: KumoClipboardTextVariantsProps = {}) {\n return cn(\n // Base styles\n \"flex items-center overflow-hidden bg-kumo-base px-0 font-mono\",\n // Apply size styles from KUMO_CLIPBOARD_TEXT_VARIANTS\n resolveVariant(KUMO_CLIPBOARD_TEXT_VARIANTS.size, size, KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS.size).classes,\n );\n}\n\n// Legacy type alias for backwards compatibility\nexport type ClipboardTextSize = KumoClipboardTextSize;\n\n/**\n * ClipboardText component props.\n *\n * @example\n * ```tsx\n * <ClipboardText text=\"sk_live_abc123\" />\n * <ClipboardText text=\"npm install @cloudflare/kumo\" size=\"sm\" />\n * ```\n */\nexport interface ClipboardTextProps extends KumoClipboardTextVariantsProps {\n /** The text to display and copy to clipboard. */\n text: string;\n /** If provided, this text will be copied to clipboard instead of the `text` prop. */\n textToCopy?: string;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Callback fired after text is copied to clipboard. */\n onCopy?: () => void;\n /**\n * Tooltip config. Shows tooltip on hover, anchored toast on click.\n * @example\n * ```tsx\n * <ClipboardText\n * text=\"abc123\"\n * tooltip={{ text: \"Copy\", copiedText: \"Copied!\", side: \"top\" }}\n * />\n * ```\n */\n tooltip?: {\n /** Text shown in tooltip on hover. @default \"Copy\" */\n text?: string;\n /** Text shown in toast after copying. @default \"Copied\" */\n copiedText?: string;\n /** Tooltip/toast placement. @default \"top\" */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n };\n /** Accessible labels for i18n. */\n labels?: {\n /** @default \"Copy to clipboard\" */\n copyAction?: string;\n };\n}\n\n/**\n * Anchored toasts viewport - renders \"Copied\" toasts anchored to buttons\n */\nfunction AnchoredToasts() {\n const { toasts } = Toast.useToastManager();\n return (\n <Toast.Viewport className=\"pointer-events-none fixed inset-0 isolate\">\n {toasts.map((toast) => (\n <Toast.Positioner key={toast.id} toast={toast} className=\"absolute\">\n <Toast.Root\n toast={toast}\n className={cn(\n \"flex origin-[var(--transform-origin)] flex-col rounded-md bg-kumo-base px-3 py-1.5 text-xs text-kumo-default font-sans\",\n \"shadow-lg shadow-kumo-tip-shadow outline outline-kumo-fill\",\n )}\n >\n <Toast.Description />\n </Toast.Root>\n </Toast.Positioner>\n ))}\n </Toast.Viewport>\n );\n}\n\n/**\n * Internal wrapper that provides Toast context when tooltip is enabled.\n */\nfunction TooltipWrapper({ children }: { children: React.ReactNode }) {\n return (\n <Tooltip.Provider>\n <Toast.Provider toastManager={clipboardToastManager}>\n <AnchoredToasts />\n {children}\n </Toast.Provider>\n </Tooltip.Provider>\n );\n}\n\n/**\n * Read-only text field with a one-click copy-to-clipboard button.\n *\n * @example\n * ```tsx\n * <ClipboardText text=\"0c239dd2\" />\n * ```\n */\nexport const ClipboardText = forwardRef<HTMLDivElement, ClipboardTextProps>(\n (\n {\n text,\n textToCopy,\n className,\n size = KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS.size,\n onCopy,\n tooltip,\n labels: { copyAction = \"Copy to clipboard\" } = {},\n },\n ref,\n ) => {\n const [copied, setCopied] = useState(false);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const sizeConfig = resolveVariant(KUMO_CLIPBOARD_TEXT_VARIANTS.size, size, KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS.size);\n\n // Destructure tooltip config with defaults\n const {\n text: tooltipText = \"Copy\",\n copiedText = \"Copied\",\n side: tooltipSide = \"top\",\n } = tooltip ?? {};\n\n const copyToClipboard = useCallback(async () => {\n try {\n if (\n typeof navigator !== \"undefined\" &&\n navigator.clipboard &&\n typeof navigator.clipboard.writeText === \"function\"\n ) {\n await navigator.clipboard.writeText(textToCopy ?? text);\n } else if (typeof document !== \"undefined\") {\n // Fallback for older browsers\n const textarea = document.createElement(\"textarea\");\n textarea.value = textToCopy ?? text;\n textarea.setAttribute(\"readonly\", \"\");\n textarea.style.position = \"absolute\";\n textarea.style.left = \"-9999px\";\n document.body.appendChild(textarea);\n const selection = document.getSelection();\n const previousRange = selection?.rangeCount\n ? selection.getRangeAt(0)\n : null;\n textarea.select();\n try {\n document.execCommand(\"copy\");\n } finally {\n document.body.removeChild(textarea);\n if (previousRange) {\n selection?.removeAllRanges();\n selection?.addRange(previousRange);\n }\n }\n }\n\n setCopied(true);\n\n // Show anchored toast if tooltip mode is enabled\n if (tooltip) {\n clipboardToastManager.add({\n description: copiedText,\n positionerProps: {\n anchor: buttonRef.current,\n side: tooltipSide,\n sideOffset: 8,\n },\n timeout: 1500,\n onClose() {\n setCopied(false);\n },\n });\n } else {\n // Reset copied state after delay when no tooltip\n setTimeout(() => setCopied(false), 1500);\n }\n\n onCopy?.();\n } catch (error) {\n console.warn(\"Clipboard copy failed\", error);\n }\n }, [text, onCopy, tooltip, copiedText, tooltipSide]);\n\n const copyButton = (\n <Button\n ref={buttonRef}\n size={sizeConfig.buttonSize}\n variant=\"ghost\"\n className={cn(\n \"rounded-l-none rounded-r-[inherit] border-l! border-kumo-line! px-3 relative isolate overflow-hidden transition-all duration-200\",\n \"focus:ring-inset focus:ring-kumo-focus/50\",\n \"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-kumo-brand\",\n )}\n onClick={copyToClipboard}\n aria-label={copyAction}\n >\n <span\n className={cn(\n \"flex items-center gap-1 transition-all duration-200\",\n copied\n ? clipboardTextAnimations.slide.animate\n : clipboardTextAnimations.slide.initial,\n )}\n >\n <CheckIcon />\n </span>\n <span\n className={cn(\n \"flex items-center justify-center transition-all duration-200\",\n copied\n ? clipboardTextAnimations.slide.end\n : clipboardTextAnimations.slide.animate,\n )}\n >\n <CopyIcon />\n </span>\n </Button>\n );\n\n return (\n <div\n ref={ref}\n className={cn(\n inputVariants({ size: sizeConfig.buttonSize }),\n clipboardTextVariants({ size }),\n className,\n )}\n >\n <span className=\"grow truncate ps-4 pe-2\">{text}</span>\n {tooltip ? (\n <TooltipWrapper>\n <Tooltip.Root\n disabled={copied}\n onOpenChange={(open, eventDetails) => {\n // Prevent tooltip from closing when button is clicked\n if (eventDetails.reason === \"trigger-press\") {\n eventDetails.cancel();\n }\n }}\n >\n <Tooltip.Trigger render={copyButton} />\n <Tooltip.Portal>\n <Tooltip.Positioner side={tooltipSide} sideOffset={8}>\n <Tooltip.Popup\n className={cn(\n \"flex origin-[var(--transform-origin)] flex-col rounded-md bg-kumo-base px-3 py-1.5 text-xs text-kumo-default\",\n \"shadow-lg shadow-kumo-tip-shadow outline outline-kumo-fill\",\n )}\n >\n {tooltipText}\n </Tooltip.Popup>\n </Tooltip.Positioner>\n </Tooltip.Portal>\n </Tooltip.Root>\n </TooltipWrapper>\n ) : (\n copyButton\n )}\n <span className=\"sr-only\" aria-live=\"polite\">\n {copied ? copiedText : \"\"}\n </span>\n </div>\n );\n },\n);\n\nClipboardText.displayName = \"ClipboardText\";\n"],"names":["clipboardToastManager","Toast.createToastManager","KUMO_CLIPBOARD_TEXT_VARIANTS","KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS","clipboardTextAnimations","clipboardTextVariants","size","cn","resolveVariant","AnchoredToasts","toasts","Toast.useToastManager","Toast.Viewport","toast","Toast.Positioner","jsx","Toast.Root","Toast.Description","TooltipWrapper","children","Tooltip.Provider","Toast.Provider","ClipboardText","forwardRef","text","textToCopy","className","onCopy","tooltip","copyAction","ref","copied","setCopied","useState","buttonRef","useRef","sizeConfig","tooltipText","copiedText","tooltipSide","copyToClipboard","useCallback","textarea","selection","previousRange","error","copyButton","jsxs","Button","CheckIcon","CopyIcon","inputVariants","Tooltip.Root","open","eventDetails","Tooltip.Trigger","Tooltip.Portal","Tooltip.Positioner","Tooltip.Popup"],"mappings":"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"}
1
+ {"version":3,"file":"clipboard-text-mrut8z3dt1w0efxz.js","sources":["../../src/components/clipboard-text/clipboard-text.tsx"],"sourcesContent":["import { CheckIcon, CopyIcon } from \"@phosphor-icons/react\";\nimport { forwardRef, useCallback, useRef, useState } from \"react\";\nimport { Toast } from \"@base-ui/react/toast\";\nimport { Tooltip } from \"@base-ui/react/tooltip\";\nimport { Button } from \"../button\";\nimport { inputVariants } from \"../input\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\n\n// Create a toast manager for anchored \"Copied\" toasts\nconst clipboardToastManager = Toast.createToastManager();\n\n/** ClipboardText size variant definitions mapping sizes to their Tailwind classes. */\nexport const KUMO_CLIPBOARD_TEXT_VARIANTS = {\n size: {\n sm: {\n classes: \"text-xs\",\n buttonSize: \"sm\" as const,\n description: \"Small clipboard text for compact UIs\",\n },\n base: {\n classes: \"text-sm\",\n buttonSize: \"base\" as const,\n description: \"Default clipboard text size\",\n },\n lg: {\n classes: \"text-sm\",\n buttonSize: \"lg\" as const,\n description: \"Large clipboard text for prominent display\",\n },\n },\n} as const;\n\nexport const KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS = {\n size: \"lg\",\n} as const;\n\nconst clipboardTextAnimations = {\n slide: {\n initial:\n \"pointer-events-none absolute inset-0 flex items-center justify-center opacity-0 translate-y-full\",\n animate: \"translate-y-0 opacity-100\",\n end: \"pointer-events-none absolute inset-0 flex items-center justify-center opacity-0 -translate-y-full\",\n },\n} as const;\n\n// Derived types from KUMO_CLIPBOARD_TEXT_VARIANTS\nexport type KumoClipboardTextSize =\n keyof typeof KUMO_CLIPBOARD_TEXT_VARIANTS.size;\n\nexport interface KumoClipboardTextVariantsProps {\n /**\n * Size of the clipboard text field.\n * - `\"sm\"` — Small clipboard text for compact UIs\n * - `\"base\"` — Default clipboard text size\n * - `\"lg\"` — Large clipboard text for prominent display\n * @default \"lg\"\n */\n size?: KumoClipboardTextSize;\n}\n\nexport function clipboardTextVariants({\n size = KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS.size,\n}: KumoClipboardTextVariantsProps = {}) {\n return cn(\n // Base styles\n \"flex items-center overflow-hidden bg-kumo-base px-0 font-mono\",\n // Apply size styles from KUMO_CLIPBOARD_TEXT_VARIANTS\n resolveVariant(KUMO_CLIPBOARD_TEXT_VARIANTS.size, size, KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS.size).classes,\n );\n}\n\n// Legacy type alias for backwards compatibility\nexport type ClipboardTextSize = KumoClipboardTextSize;\n\n/**\n * ClipboardText component props.\n *\n * @example\n * ```tsx\n * <ClipboardText text=\"sk_live_abc123\" />\n * <ClipboardText text=\"npm install @cloudflare/kumo\" size=\"sm\" />\n * ```\n */\nexport interface ClipboardTextProps extends KumoClipboardTextVariantsProps {\n /** The text to display and copy to clipboard. */\n text: string;\n /** If provided, this text will be copied to clipboard instead of the `text` prop. */\n textToCopy?: string;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Callback fired after text is copied to clipboard. */\n onCopy?: () => void;\n /**\n * Tooltip config. Shows tooltip on hover, anchored toast on click.\n * @example\n * ```tsx\n * <ClipboardText\n * text=\"abc123\"\n * tooltip={{ text: \"Copy\", copiedText: \"Copied!\", side: \"top\" }}\n * />\n * ```\n */\n tooltip?: {\n /** Text shown in tooltip on hover. @default \"Copy\" */\n text?: string;\n /** Text shown in toast after copying. @default \"Copied\" */\n copiedText?: string;\n /** Tooltip/toast placement. @default \"top\" */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n };\n /** Accessible labels for i18n. */\n labels?: {\n /** @default \"Copy to clipboard\" */\n copyAction?: string;\n };\n}\n\n/**\n * Anchored toasts viewport - renders \"Copied\" toasts anchored to buttons\n */\nfunction AnchoredToasts() {\n const { toasts } = Toast.useToastManager();\n return (\n <Toast.Viewport className=\"pointer-events-none fixed inset-0 isolate\">\n {toasts.map((toast) => (\n <Toast.Positioner key={toast.id} toast={toast} className=\"absolute\">\n <Toast.Root\n toast={toast}\n className={cn(\n \"flex origin-[var(--transform-origin)] flex-col rounded-md bg-kumo-base px-3 py-1.5 text-xs text-kumo-default font-sans\",\n \"shadow-lg shadow-kumo-tip-shadow outline outline-kumo-fill\",\n )}\n >\n <Toast.Description />\n </Toast.Root>\n </Toast.Positioner>\n ))}\n </Toast.Viewport>\n );\n}\n\n/**\n * Internal wrapper that provides Toast context when tooltip is enabled.\n */\nfunction TooltipWrapper({ children }: { children: React.ReactNode }) {\n return (\n <Tooltip.Provider>\n <Toast.Provider toastManager={clipboardToastManager}>\n <AnchoredToasts />\n {children}\n </Toast.Provider>\n </Tooltip.Provider>\n );\n}\n\n/**\n * Read-only text field with a one-click copy-to-clipboard button.\n *\n * @example\n * ```tsx\n * <ClipboardText text=\"0c239dd2\" />\n * ```\n */\nexport const ClipboardText = forwardRef<HTMLDivElement, ClipboardTextProps>(\n (\n {\n text,\n textToCopy,\n className,\n size = KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS.size,\n onCopy,\n tooltip,\n labels: { copyAction = \"Copy to clipboard\" } = {},\n },\n ref,\n ) => {\n const [copied, setCopied] = useState(false);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const sizeConfig = resolveVariant(KUMO_CLIPBOARD_TEXT_VARIANTS.size, size, KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS.size);\n\n // Destructure tooltip config with defaults\n const {\n text: tooltipText = \"Copy\",\n copiedText = \"Copied\",\n side: tooltipSide = \"top\",\n } = tooltip ?? {};\n\n const copyToClipboard = useCallback(async () => {\n try {\n if (\n typeof navigator !== \"undefined\" &&\n navigator.clipboard &&\n typeof navigator.clipboard.writeText === \"function\"\n ) {\n await navigator.clipboard.writeText(textToCopy ?? text);\n } else if (typeof document !== \"undefined\") {\n // Fallback for older browsers\n const textarea = document.createElement(\"textarea\");\n textarea.value = textToCopy ?? text;\n textarea.setAttribute(\"readonly\", \"\");\n textarea.style.position = \"absolute\";\n textarea.style.left = \"-9999px\";\n document.body.appendChild(textarea);\n const selection = document.getSelection();\n const previousRange = selection?.rangeCount\n ? selection.getRangeAt(0)\n : null;\n textarea.select();\n try {\n document.execCommand(\"copy\");\n } finally {\n document.body.removeChild(textarea);\n if (previousRange) {\n selection?.removeAllRanges();\n selection?.addRange(previousRange);\n }\n }\n }\n\n setCopied(true);\n\n // Show anchored toast if tooltip mode is enabled\n if (tooltip) {\n clipboardToastManager.add({\n description: copiedText,\n positionerProps: {\n anchor: buttonRef.current,\n side: tooltipSide,\n sideOffset: 8,\n },\n timeout: 1500,\n onClose() {\n setCopied(false);\n },\n });\n } else {\n // Reset copied state after delay when no tooltip\n setTimeout(() => setCopied(false), 1500);\n }\n\n onCopy?.();\n } catch (error) {\n console.warn(\"Clipboard copy failed\", error);\n }\n }, [text, onCopy, tooltip, copiedText, tooltipSide]);\n\n const copyButton = (\n <Button\n ref={buttonRef}\n size={sizeConfig.buttonSize}\n variant=\"ghost\"\n className={cn(\n \"rounded-l-none rounded-r-[inherit] border-l! border-kumo-line! px-3 relative isolate overflow-hidden transition-all duration-200\",\n \"focus:ring-inset focus:ring-kumo-focus/50\",\n \"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-kumo-brand\",\n )}\n onClick={copyToClipboard}\n aria-label={copyAction}\n >\n <span\n className={cn(\n \"flex items-center gap-1 transition-all duration-200\",\n copied\n ? clipboardTextAnimations.slide.animate\n : clipboardTextAnimations.slide.initial,\n )}\n >\n <CheckIcon />\n </span>\n <span\n className={cn(\n \"flex items-center justify-center transition-all duration-200\",\n copied\n ? clipboardTextAnimations.slide.end\n : clipboardTextAnimations.slide.animate,\n )}\n >\n <CopyIcon />\n </span>\n </Button>\n );\n\n return (\n <div\n ref={ref}\n className={cn(\n inputVariants({ size: sizeConfig.buttonSize }),\n clipboardTextVariants({ size }),\n className,\n )}\n >\n <span className=\"grow truncate ps-4 pe-2\">{text}</span>\n {tooltip ? (\n <TooltipWrapper>\n <Tooltip.Root\n disabled={copied}\n onOpenChange={(open, eventDetails) => {\n // Prevent tooltip from closing when button is clicked\n if (eventDetails.reason === \"trigger-press\") {\n eventDetails.cancel();\n }\n }}\n >\n <Tooltip.Trigger render={copyButton} />\n <Tooltip.Portal>\n <Tooltip.Positioner side={tooltipSide} sideOffset={8}>\n <Tooltip.Popup\n className={cn(\n \"flex origin-[var(--transform-origin)] flex-col rounded-md bg-kumo-base px-3 py-1.5 text-xs text-kumo-default\",\n \"shadow-lg shadow-kumo-tip-shadow outline outline-kumo-fill\",\n )}\n >\n {tooltipText}\n </Tooltip.Popup>\n </Tooltip.Positioner>\n </Tooltip.Portal>\n </Tooltip.Root>\n </TooltipWrapper>\n ) : (\n copyButton\n )}\n <span className=\"sr-only\" aria-live=\"polite\">\n {copied ? copiedText : \"\"}\n </span>\n </div>\n );\n },\n);\n\nClipboardText.displayName = \"ClipboardText\";\n"],"names":["clipboardToastManager","Toast.createToastManager","KUMO_CLIPBOARD_TEXT_VARIANTS","KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS","clipboardTextAnimations","clipboardTextVariants","size","cn","resolveVariant","AnchoredToasts","toasts","Toast.useToastManager","Toast.Viewport","toast","Toast.Positioner","jsx","Toast.Root","Toast.Description","TooltipWrapper","children","Tooltip.Provider","Toast.Provider","ClipboardText","forwardRef","text","textToCopy","className","onCopy","tooltip","copyAction","ref","copied","setCopied","useState","buttonRef","useRef","sizeConfig","tooltipText","copiedText","tooltipSide","copyToClipboard","useCallback","textarea","selection","previousRange","error","copyButton","jsxs","Button","CheckIcon","CopyIcon","inputVariants","Tooltip.Root","open","eventDetails","Tooltip.Trigger","Tooltip.Portal","Tooltip.Positioner","Tooltip.Popup"],"mappings":"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"}
@@ -1,19 +1,21 @@
1
1
  "use client";
2
2
  import { jsx as o, jsxs as g } from "react/jsx-runtime";
3
- import { CaretDownIcon as u } from "@phosphor-icons/react";
3
+ import { CaretDownIcon as f } from "@phosphor-icons/react";
4
4
  import { forwardRef as r } from "react";
5
- import { c as t } from "./cn-ct4n7r74mh8y0f48.js";
6
- import { aO as C, aP as i, aQ as n } from "./vendor-base-ui-nbyiqqi138hcoz52.js";
7
- function s({ className: e, ...l }) {
5
+ import { c as s } from "./cn-ct4n7r74mh8y0f48.js";
6
+ import { aQ as C, aR as i, aS as n } from "./vendor-base-ui-knphx7dts1vm1x37.js";
7
+ function t({ className: e, ...l }) {
8
8
  return /* @__PURE__ */ o(C, { className: e, ...l });
9
9
  }
10
- s.displayName = "Collapsible.Root";
10
+ t.displayName = "Collapsible.Root";
11
11
  const p = r(
12
12
  ({ className: e, ...l }, a) => /* @__PURE__ */ o(
13
13
  n,
14
14
  {
15
15
  ref: a,
16
- className: t("cursor-pointer", e),
16
+ "data-kumo-component": "Collapsible",
17
+ "data-kumo-part": "trigger",
18
+ className: s("cursor-pointer", e),
17
19
  ...l
18
20
  }
19
21
  )
@@ -34,7 +36,9 @@ const c = r(({ children: e, className: l }, a) => /* @__PURE__ */ g(
34
36
  n,
35
37
  {
36
38
  ref: a,
37
- className: t(
39
+ "data-kumo-component": "Collapsible",
40
+ "data-kumo-part": "default-trigger",
41
+ className: s(
38
42
  // Defensive resets to prevent global button styles from polluting the trigger
39
43
  "bg-transparent border-none shadow-none p-0 m-0",
40
44
  // Base styles for the trigger
@@ -44,29 +48,29 @@ const c = r(({ children: e, className: l }, a) => /* @__PURE__ */ g(
44
48
  children: [
45
49
  e,
46
50
  " ",
47
- /* @__PURE__ */ o(u, { className: "h-4 w-4 transition-transform [[data-panel-open]_&]:rotate-180" })
51
+ /* @__PURE__ */ o(f, { className: "h-4 w-4 transition-transform [[data-panel-open]_&]:rotate-180" })
48
52
  ]
49
53
  }
50
54
  ));
51
55
  c.displayName = "Collapsible.DefaultTrigger";
52
- const b = r(({ children: e, className: l, ...a }, f) => /* @__PURE__ */ o(
56
+ const u = r(({ children: e, className: l, ...a }, b) => /* @__PURE__ */ o(
53
57
  i,
54
58
  {
55
- ref: f,
56
- className: t("my-2 space-y-4 border-l-2 border-kumo-fill pl-4", l),
59
+ ref: b,
60
+ className: s("my-2 space-y-4 border-l-2 border-kumo-fill pl-4", l),
57
61
  ...a,
58
62
  children: e
59
63
  }
60
64
  ));
61
- b.displayName = "Collapsible.DefaultPanel";
62
- const T = Object.assign(s, {
63
- Root: s,
65
+ u.displayName = "Collapsible.DefaultPanel";
66
+ const P = Object.assign(t, {
67
+ Root: t,
64
68
  Trigger: p,
65
69
  Panel: m,
66
70
  DefaultTrigger: c,
67
- DefaultPanel: b
71
+ DefaultPanel: u
68
72
  });
69
73
  export {
70
- T as C
74
+ P as C
71
75
  };
72
- //# sourceMappingURL=collapsible-ej6p2bq758sw30nk.js.map
76
+ //# sourceMappingURL=collapsible-nzqcf9zwnjkxqzr6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collapsible-nzqcf9zwnjkxqzr6.js","sources":["../../src/components/collapsible/collapsible.tsx"],"sourcesContent":["import { Collapsible as CollapsibleBase } from \"@base-ui/react/collapsible\";\nimport { CaretDownIcon } from \"@phosphor-icons/react\";\nimport {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nexport const KUMO_COLLAPSIBLE_VARIANTS = {} as const;\n\nexport const KUMO_COLLAPSIBLE_DEFAULT_VARIANTS = {} as const;\n\nexport interface KumoCollapsibleVariantsProps {}\n\nexport function collapsibleVariants(_props: KumoCollapsibleVariantsProps = {}) {\n return cn();\n}\n\n// =============================================================================\n// Collapsible Root\n// =============================================================================\n\ntype BaseRootProps = ComponentPropsWithoutRef<typeof CollapsibleBase.Root>;\n\nexport interface CollapsibleRootProps extends BaseRootProps {\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Root component that manages collapsible state.\n *\n * @example\n * ```tsx\n * <Collapsible.Root open={open} onOpenChange={setOpen}>\n * <Collapsible.Trigger>Toggle</Collapsible.Trigger>\n * <Collapsible.Panel>Content</Collapsible.Panel>\n * </Collapsible.Root>\n * ```\n */\nfunction CollapsibleRoot({ className, ...props }: CollapsibleRootProps) {\n return <CollapsibleBase.Root className={className} {...props} />;\n}\n\nCollapsibleRoot.displayName = \"Collapsible.Root\";\n\n// =============================================================================\n// Collapsible Trigger\n// =============================================================================\n\ntype BaseTriggerProps = ComponentPropsWithoutRef<\n typeof CollapsibleBase.Trigger\n>;\n\nexport interface CollapsibleTriggerProps extends BaseTriggerProps {\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Button that toggles the collapsible panel visibility.\n * Use the `render` prop to customize the trigger element.\n *\n * @example\n * ```tsx\n * // Default button\n * <Collapsible.Trigger>Show more</Collapsible.Trigger>\n *\n * // Custom trigger element\n * <Collapsible.Trigger render={<Button variant=\"ghost\" />}>\n * Toggle details\n * </Collapsible.Trigger>\n * ```\n */\nconst CollapsibleTrigger = forwardRef<HTMLButtonElement, CollapsibleTriggerProps>(\n ({ className, ...props }, ref) => {\n return (\n <CollapsibleBase.Trigger\n ref={ref}\n data-kumo-component=\"Collapsible\"\n data-kumo-part=\"trigger\"\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n );\n },\n);\n\nCollapsibleTrigger.displayName = \"Collapsible.Trigger\";\n\n// =============================================================================\n// Collapsible Panel\n// =============================================================================\n\ntype BasePanelProps = ComponentPropsWithoutRef<typeof CollapsibleBase.Panel>;\n\nexport interface CollapsiblePanelProps extends BasePanelProps {\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Container for collapsible content. Renders when the collapsible is open.\n *\n * @example\n * ```tsx\n * <Collapsible.Panel className=\"mt-2 space-y-4\">\n * <Text>Revealed content here</Text>\n * </Collapsible.Panel>\n * ```\n */\nconst CollapsiblePanel = forwardRef<HTMLDivElement, CollapsiblePanelProps>(\n ({ className, ...props }, ref) => {\n return (\n <CollapsibleBase.Panel\n ref={ref}\n className={className}\n {...props}\n />\n );\n },\n);\n\nCollapsiblePanel.displayName = \"Collapsible.Panel\";\n\n// =============================================================================\n// Default Trigger (Migration Affordance)\n// =============================================================================\n\nexport interface CollapsibleDefaultTriggerProps {\n /** Label text displayed in the trigger */\n children: ReactNode;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Pre-styled trigger with text label and animated caret icon.\n * Provides the same visual style as the previous Collapsible API.\n *\n * Use this for quick migration or when you want the default Kumo style.\n *\n * @example\n * ```tsx\n * <Collapsible.Root>\n * <Collapsible.DefaultTrigger>Show details</Collapsible.DefaultTrigger>\n * <Collapsible.Panel>Content</Collapsible.Panel>\n * </Collapsible.Root>\n * ```\n */\nconst CollapsibleDefaultTrigger = forwardRef<\n HTMLButtonElement,\n CollapsibleDefaultTriggerProps\n>(({ children, className }, ref) => {\n return (\n <CollapsibleBase.Trigger\n ref={ref}\n data-kumo-component=\"Collapsible\"\n data-kumo-part=\"default-trigger\"\n className={cn(\n // Defensive resets to prevent global button styles from polluting the trigger\n \"bg-transparent border-none shadow-none p-0 m-0\",\n // Base styles for the trigger\n \"flex cursor-pointer items-center gap-1 text-sm text-kumo-link select-none\",\n className,\n )}\n >\n {children}{\" \"}\n <CaretDownIcon className=\"h-4 w-4 transition-transform [[data-panel-open]_&]:rotate-180\" />\n </CollapsibleBase.Trigger>\n );\n});\n\nCollapsibleDefaultTrigger.displayName = \"Collapsible.DefaultTrigger\";\n\n// =============================================================================\n// Default Panel (Migration Affordance)\n// =============================================================================\n\nexport interface CollapsibleDefaultPanelProps extends BasePanelProps {\n /** Panel content */\n children: ReactNode;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Pre-styled panel with left border accent and standard spacing.\n * Provides the same visual style as the previous Collapsible API.\n *\n * @example\n * ```tsx\n * <Collapsible.Root>\n * <Collapsible.DefaultTrigger>Show details</Collapsible.DefaultTrigger>\n * <Collapsible.DefaultPanel>\n * <Text>Content with default styling</Text>\n * </Collapsible.DefaultPanel>\n * </Collapsible.Root>\n * ```\n */\nconst CollapsibleDefaultPanel = forwardRef<\n HTMLDivElement,\n CollapsibleDefaultPanelProps\n>(({ children, className, ...props }, ref) => {\n return (\n <CollapsibleBase.Panel\n ref={ref}\n className={cn(\"my-2 space-y-4 border-l-2 border-kumo-fill pl-4\", className)}\n {...props}\n >\n {children}\n </CollapsibleBase.Panel>\n );\n});\n\nCollapsibleDefaultPanel.displayName = \"Collapsible.DefaultPanel\";\n\n// =============================================================================\n// Compound Component Export\n// =============================================================================\n\n/**\n * Collapsible — a composable disclosure component for showing/hiding content.\n *\n * Built on Base UI's Collapsible with full composition support.\n *\n * ## Basic Usage\n *\n * ```tsx\n * const [open, setOpen] = useState(false);\n *\n * <Collapsible.Root open={open} onOpenChange={setOpen}>\n * <Collapsible.Trigger render={<Button variant=\"ghost\" />}>\n * Show details\n * </Collapsible.Trigger>\n * <Collapsible.Panel className=\"mt-2\">\n * <Text>Hidden content revealed when expanded.</Text>\n * </Collapsible.Panel>\n * </Collapsible.Root>\n * ```\n *\n * ## With Default Styling\n *\n * Use `DefaultTrigger` and `DefaultPanel` for the classic Kumo style:\n *\n * ```tsx\n * <Collapsible.Root>\n * <Collapsible.DefaultTrigger>Show details</Collapsible.DefaultTrigger>\n * <Collapsible.DefaultPanel>\n * <Text>Content with border-left accent</Text>\n * </Collapsible.DefaultPanel>\n * </Collapsible.Root>\n * ```\n *\n * ## Controlled Accordion Pattern\n *\n * ```tsx\n * const [activeIndex, setActiveIndex] = useState<number | null>(null);\n *\n * {items.map((item, i) => (\n * <Collapsible.Root\n * key={i}\n * open={activeIndex === i}\n * onOpenChange={(open) => setActiveIndex(open ? i : null)}\n * >\n * <Collapsible.DefaultTrigger>{item.title}</Collapsible.DefaultTrigger>\n * <Collapsible.DefaultPanel>{item.content}</Collapsible.DefaultPanel>\n * </Collapsible.Root>\n * ))}\n * ```\n */\nexport const Collapsible = Object.assign(CollapsibleRoot, {\n Root: CollapsibleRoot,\n Trigger: CollapsibleTrigger,\n Panel: CollapsiblePanel,\n DefaultTrigger: CollapsibleDefaultTrigger,\n DefaultPanel: CollapsibleDefaultPanel,\n});\n\n// =============================================================================\n// Type Exports\n// =============================================================================\n\nexport type CollapsibleProps = CollapsibleRootProps;\n"],"names":["CollapsibleRoot","className","props","CollapsibleBase.Root","CollapsibleTrigger","forwardRef","ref","jsx","CollapsibleBase.Trigger","cn","CollapsiblePanel","CollapsibleBase.Panel","CollapsibleDefaultTrigger","children","jsxs","CaretDownIcon","CollapsibleDefaultPanel","Collapsible"],"mappings":";;;;;;AA6CA,SAASA,EAAgB,EAAE,WAAAC,GAAW,GAAGC,KAA+B;AACtE,2BAAQC,GAAA,EAAqB,WAAAF,GAAuB,GAAGC,EAAA,CAAO;AAChE;AAEAF,EAAgB,cAAc;AA8B9B,MAAMI,IAAqBC;AAAA,EACzB,CAAC,EAAE,WAAAJ,GAAW,GAAGC,EAAA,GAASI,MAEtB,gBAAAC;AAAA,IAACC;AAAAA,IAAA;AAAA,MACC,KAAAF;AAAA,MACA,uBAAoB;AAAA,MACpB,kBAAe;AAAA,MACf,WAAWG,EAAG,kBAAkBR,CAAS;AAAA,MACxC,GAAGC;AAAA,IAAA;AAAA,EAAA;AAIZ;AAEAE,EAAmB,cAAc;AAuBjC,MAAMM,IAAmBL;AAAA,EACvB,CAAC,EAAE,WAAAJ,GAAW,GAAGC,EAAA,GAASI,MAEtB,gBAAAC;AAAA,IAACI;AAAAA,IAAA;AAAA,MACC,KAAAL;AAAA,MACA,WAAAL;AAAA,MACC,GAAGC;AAAA,IAAA;AAAA,EAAA;AAIZ;AAEAQ,EAAiB,cAAc;AA2B/B,MAAME,IAA4BP,EAGhC,CAAC,EAAE,UAAAQ,GAAU,WAAAZ,EAAA,GAAaK,MAExB,gBAAAQ;AAAA,EAACN;AAAAA,EAAA;AAAA,IACC,KAAAF;AAAA,IACA,uBAAoB;AAAA,IACpB,kBAAe;AAAA,IACf,WAAWG;AAAA;AAAA,MAET;AAAA;AAAA,MAEA;AAAA,MACAR;AAAA,IAAA;AAAA,IAGD,UAAA;AAAA,MAAAY;AAAA,MAAU;AAAA,MACX,gBAAAN,EAACQ,GAAA,EAAc,WAAU,gEAAA,CAAgE;AAAA,IAAA;AAAA,EAAA;AAAA,CAG9F;AAEDH,EAA0B,cAAc;AA2BxC,MAAMI,IAA0BX,EAG9B,CAAC,EAAE,UAAAQ,GAAU,WAAAZ,GAAW,GAAGC,EAAA,GAASI,MAElC,gBAAAC;AAAA,EAACI;AAAAA,EAAA;AAAA,IACC,KAAAL;AAAA,IACA,WAAWG,EAAG,mDAAmDR,CAAS;AAAA,IACzE,GAAGC;AAAA,IAEH,UAAAW;AAAA,EAAA;AAAA,CAGN;AAEDG,EAAwB,cAAc;AAwD/B,MAAMC,IAAc,OAAO,OAAOjB,GAAiB;AAAA,EACxD,MAAMA;AAAA,EACN,SAASI;AAAA,EACT,OAAOM;AAAA,EACP,gBAAgBE;AAAA,EAChB,cAAcI;AAChB,CAAC;"}