@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
@@ -1,44 +1,47 @@
1
1
  "use client";
2
- import { jsxs as y, Fragment as ce, jsx as a } from "react/jsx-runtime";
2
+ import { jsxs as b, Fragment as ce, jsx as r } from "react/jsx-runtime";
3
3
  import { EyeSlash as ue, Eye as pe } from "@phosphor-icons/react";
4
- import { forwardRef as de, useState as C, useRef as N, useId as T, useCallback as c, useEffect as fe } from "react";
4
+ import { forwardRef as de, useState as C, useRef as N, useId as S, useCallback as c, useEffect as me } from "react";
5
5
  import { c as p } from "./cn-ct4n7r74mh8y0f48.js";
6
- import { K as me, i as he } from "./input-i3os21puacqw4r75.js";
7
- import { F as ge } from "./field-l1oapopp6kjnephi.js";
8
- import { I as ve } from "./vendor-base-ui-nbyiqqi138hcoz52.js";
9
- const Te = me, M = {
6
+ import { K as fe, i as ve } from "./input-en8hhb14mmt3tfwn.js";
7
+ import { F as he } from "./field-c8o7h3rlam4c9pcx.js";
8
+ import { I as ge } from "./vendor-base-ui-knphx7dts1vm1x37.js";
9
+ const Te = fe, ye = {
10
10
  size: "base",
11
11
  variant: "default"
12
12
  }, be = de(
13
13
  ({
14
- value: R,
14
+ value: T,
15
15
  defaultValue: B = "",
16
- onChange: S,
17
- onValueChange: E,
16
+ onChange: E,
17
+ onValueChange: R,
18
18
  onCopy: k,
19
- size: t = M.size,
20
- variant: j = M.variant,
21
- disabled: r = !1,
19
+ size: t = ye.size,
20
+ variant: V,
21
+ disabled: i = !1,
22
22
  readOnly: d = !1,
23
- id: $,
24
- autoComplete: H = "off",
25
- className: L,
26
- label: v,
27
- labelTooltip: X,
28
- description: Y,
29
- error: b,
30
- required: W,
31
- ...q
23
+ id: j,
24
+ autoComplete: $ = "off",
25
+ className: H,
26
+ label: y,
27
+ labelTooltip: L,
28
+ description: X,
29
+ error: m,
30
+ required: Y,
31
+ ...O
32
32
  }, f) => {
33
- const G = typeof v == "string" ? v : "Sensitive value", x = R !== void 0, [J, O] = C(B), m = x ? R : J, o = m.length > 0, [n, l] = C(
33
+ process.env.NODE_ENV !== "production" && V === "error" && console.warn(
34
+ '[Kumo SensitiveInput]: variant="error" is deprecated. Error styling is now automatically applied when the `error` prop is truthy. Simply remove the variant prop and pass an error message instead.'
35
+ );
36
+ const W = V ?? (m ? "error" : "default"), q = typeof y == "string" ? y : "Sensitive value", x = T !== void 0, [G, J] = C(B), v = x ? T : G, o = v.length > 0, [n, l] = C(
34
37
  () => o ? "masked" : "empty"
35
- ), [h, w] = C(!1), I = N(null), u = N(null), V = T(), Q = T(), Z = $ ?? Q, K = T(), z = c(
38
+ ), [h, w] = C(!1), I = N(null), u = N(null), K = S(), Q = S(), Z = j ?? Q, A = S(), z = c(
36
39
  (e) => {
37
40
  I.current = e, typeof f == "function" ? f(e) : f && (f.current = e);
38
41
  },
39
42
  [f]
40
43
  );
41
- fe(() => {
44
+ me(() => {
42
45
  if (h) {
43
46
  const e = setTimeout(() => w(!1), 2e3);
44
47
  return () => clearTimeout(e);
@@ -49,39 +52,39 @@ const Te = me, M = {
49
52
  e.stopPropagation();
50
53
  try {
51
54
  if (typeof navigator < "u" && navigator.clipboard && typeof navigator.clipboard.writeText == "function") {
52
- await navigator.clipboard.writeText(m), w(!0), k?.();
55
+ await navigator.clipboard.writeText(v), w(!0), k?.();
53
56
  return;
54
57
  }
55
58
  } catch {
56
59
  }
57
60
  if (typeof document < "u") {
58
- const i = document.createElement("textarea");
59
- i.value = m, i.setAttribute("readonly", ""), i.style.position = "absolute", i.style.left = "-9999px", document.body.appendChild(i);
60
- const g = document.getSelection(), F = g?.rangeCount ? g.getRangeAt(0) : null;
61
- i.select();
61
+ const a = document.createElement("textarea");
62
+ a.value = v, a.setAttribute("readonly", ""), a.style.position = "absolute", a.style.left = "-9999px", document.body.appendChild(a);
63
+ const g = document.getSelection(), M = g?.rangeCount ? g.getRangeAt(0) : null;
64
+ a.select();
62
65
  try {
63
66
  document.execCommand("copy"), w(!0), k?.();
64
67
  } catch (le) {
65
68
  console.warn("Clipboard copy failed", le);
66
69
  } finally {
67
- document.body.removeChild(i), F && (g?.removeAllRanges(), g?.addRange(F));
70
+ document.body.removeChild(a), M && (g?.removeAllRanges(), g?.addRange(M));
68
71
  }
69
72
  }
70
73
  },
71
- [m, k]
72
- ), A = N(o);
73
- A.current !== o && (A.current = o, !o && n === "masked" && l("empty"));
74
+ [v, k]
75
+ ), _ = N(o);
76
+ _.current !== o && (_.current = o, !o && n === "masked" && l("empty"));
74
77
  const te = c(
75
78
  (e) => {
76
- if (!r) {
79
+ if (!i) {
77
80
  if (u.current) {
78
- const i = u.current.getBoundingClientRect();
79
- if (!(e.clientX >= i.left && e.clientX <= i.right && e.clientY >= i.top && e.clientY <= i.bottom)) return;
81
+ const a = u.current.getBoundingClientRect();
82
+ if (!(e.clientX >= a.left && e.clientX <= a.right && e.clientY >= a.top && e.clientY <= a.bottom)) return;
80
83
  }
81
84
  n === "masked" && o && (l("revealed"), d || setTimeout(() => I.current?.focus(), 0));
82
85
  }
83
86
  },
84
- [n, o, r, d]
87
+ [n, o, i, d]
85
88
  ), ne = c(
86
89
  (e) => {
87
90
  e.stopPropagation(), n === "revealed" ? l("masked") : n === "empty" && o && l("revealed");
@@ -89,47 +92,47 @@ const Te = me, M = {
89
92
  [n, o]
90
93
  ), oe = c(
91
94
  (e) => {
92
- const i = e.target.value;
93
- x || O(i), n === "empty" && i.length > 0 && l("revealed"), S?.(e), E?.(i);
95
+ const a = e.target.value;
96
+ x || J(a), n === "empty" && a.length > 0 && l("revealed"), E?.(e), R?.(a);
94
97
  },
95
- [x, S, E, n]
96
- ), ie = c(
98
+ [x, E, R, n]
99
+ ), ae = c(
97
100
  (e) => {
98
101
  u.current && e.relatedTarget instanceof Node && u.current.contains(e.relatedTarget) || o && l("masked");
99
102
  },
100
103
  [o]
101
- ), re = c(
104
+ ), ie = c(
102
105
  (e) => {
103
- r || n === "masked" && o && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), l("revealed"), d || setTimeout(() => I.current?.focus(), 0));
106
+ i || n === "masked" && o && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), l("revealed"), d || setTimeout(() => I.current?.focus(), 0));
104
107
  },
105
- [n, o, r, d]
106
- ), ae = c(
108
+ [n, o, i, d]
109
+ ), re = c(
107
110
  (e) => {
108
111
  n === "revealed" && e.key === "Escape" && (l("masked"), setTimeout(() => u.current?.focus(), 0));
109
112
  },
110
113
  [n]
111
- ), s = n === "masked" && o, _ = !r && (n === "revealed" || n === "empty" && o), se = t === "xs" || t === "sm" ? "size-3" : "size-4", D = p(
112
- he({ size: t, variant: j, parentFocusIndicator: !0 }),
114
+ ), s = n === "masked" && o, D = !i && (n === "revealed" || n === "empty" && o), se = t === "xs" || t === "sm" ? "size-3" : "size-4", U = p(
115
+ ve({ size: t, variant: W, parentFocusIndicator: !0 }),
113
116
  "group/container relative flex w-full items-center",
114
117
  // Show browser-native focus outline on container when child input is focused
115
118
  "focus-within:outline focus-within:outline-2 focus-within:outline-kumo-focus",
116
- s && !r && "cursor-pointer",
117
- r && "cursor-not-allowed",
118
- L
119
- ), P = /* @__PURE__ */ y(ce, { children: [
120
- /* @__PURE__ */ a(
121
- ve,
119
+ s && !i && "cursor-pointer",
120
+ i && "cursor-not-allowed",
121
+ H
122
+ ), F = /* @__PURE__ */ b(ce, { children: [
123
+ /* @__PURE__ */ r(
124
+ ge,
122
125
  {
123
126
  ref: z,
124
127
  id: Z,
125
128
  type: n === "revealed" ? "text" : "password",
126
- value: m,
129
+ value: v,
127
130
  onChange: oe,
128
- onBlur: ie,
129
- onKeyDown: ae,
130
- disabled: r,
131
+ onBlur: ae,
132
+ onKeyDown: re,
133
+ disabled: i,
131
134
  readOnly: d || s,
132
- autoComplete: H,
135
+ autoComplete: $,
133
136
  tabIndex: s ? -1 : 0,
134
137
  className: p(
135
138
  "w-full border-0 bg-transparent p-0 text-kumo-default ring-0 outline-none kumo-input-placeholder disabled:cursor-not-allowed disabled:text-kumo-subtle",
@@ -140,10 +143,10 @@ const Te = me, M = {
140
143
  s && "pointer-events-none text-transparent"
141
144
  ),
142
145
  "aria-hidden": s,
143
- ...q
146
+ ...O
144
147
  }
145
148
  ),
146
- /* @__PURE__ */ a(
149
+ /* @__PURE__ */ r(
147
150
  "span",
148
151
  {
149
152
  className: p(
@@ -168,28 +171,30 @@ const Te = me, M = {
168
171
  "group/mask"
169
172
  ),
170
173
  "aria-hidden": "true",
171
- children: /* @__PURE__ */ y("span", { className: "relative", children: [
172
- /* @__PURE__ */ a(
174
+ children: /* @__PURE__ */ b("span", { className: "relative", children: [
175
+ /* @__PURE__ */ r(
173
176
  "span",
174
177
  {
175
178
  className: p(
176
- s && !r && "group-focus-within/container:invisible group-hover/mask:invisible"
179
+ s && !i && "group-focus-within/container:invisible group-hover/mask:invisible"
177
180
  ),
178
181
  children: "••••••••"
179
182
  }
180
183
  ),
181
- s && !r && /* @__PURE__ */ a("span", { className: "invisible absolute left-0 top-0 whitespace-nowrap text-kumo-subtle group-focus-within/container:visible group-hover/mask:visible", children: "Click to reveal" })
184
+ s && !i && /* @__PURE__ */ r("span", { className: "invisible absolute left-0 top-0 whitespace-nowrap text-kumo-subtle group-focus-within/container:visible group-hover/mask:visible", children: "Click to reveal" })
182
185
  ] })
183
186
  }
184
187
  ),
185
- /* @__PURE__ */ a(
188
+ /* @__PURE__ */ r(
186
189
  "button",
187
190
  {
188
191
  type: "button",
192
+ "data-kumo-component": "SensitiveInput",
193
+ "data-kumo-part": "toggle-visibility",
189
194
  onClick: ne,
190
195
  onKeyDown: (e) => e.stopPropagation(),
191
196
  "aria-label": n === "revealed" ? "Hide value" : "Reveal value",
192
- tabIndex: _ ? 0 : -1,
197
+ tabIndex: D ? 0 : -1,
193
198
  className: p(
194
199
  "absolute top-1/2 right-0 -translate-y-1/2 cursor-pointer text-kumo-subtle hover:text-kumo-default focus:text-kumo-default focus:ring-kumo-focus/50 focus-visible:ring-2 focus-visible:ring-kumo-brand focus-visible:rounded-sm",
195
200
  // Defensive styles to prevent global CSS pollution (e.g., button { background: gray })
@@ -200,15 +205,17 @@ const Te = me, M = {
200
205
  t === "base" && "right-3",
201
206
  t === "lg" && "right-4",
202
207
  se,
203
- !_ && "pointer-events-none opacity-0"
208
+ !D && "pointer-events-none opacity-0"
204
209
  ),
205
- children: n === "revealed" ? /* @__PURE__ */ a(ue, { className: "size-full" }) : /* @__PURE__ */ a(pe, { className: "size-full" })
210
+ children: n === "revealed" ? /* @__PURE__ */ r(ue, { className: "size-full" }) : /* @__PURE__ */ r(pe, { className: "size-full" })
206
211
  }
207
212
  ),
208
- o && !r && /* @__PURE__ */ a(
213
+ o && !i && /* @__PURE__ */ r(
209
214
  "button",
210
215
  {
211
216
  type: "button",
217
+ "data-kumo-component": "SensitiveInput",
218
+ "data-kumo-part": "copy",
212
219
  onClick: ee,
213
220
  onKeyDown: (e) => e.stopPropagation(),
214
221
  "aria-label": h ? "Copied" : "Copy to clipboard",
@@ -220,45 +227,47 @@ const Te = me, M = {
220
227
  children: h ? "Copied" : "Copy"
221
228
  }
222
229
  )
223
- ] }), U = /* @__PURE__ */ y("div", { children: [
224
- s ? /* @__PURE__ */ a(
230
+ ] }), P = /* @__PURE__ */ b("div", { children: [
231
+ s ? /* @__PURE__ */ r(
225
232
  "div",
226
233
  {
227
234
  ref: u,
228
235
  role: "button",
229
- tabIndex: r ? -1 : 0,
230
- className: D,
236
+ "data-kumo-component": "SensitiveInput",
237
+ "data-kumo-part": "masked-container",
238
+ tabIndex: i ? -1 : 0,
239
+ className: U,
231
240
  onClick: te,
232
- onKeyDown: re,
233
- "aria-label": `${G}, masked.`,
234
- "aria-describedby": `${K} ${V}`,
235
- "aria-disabled": r,
236
- children: P
241
+ onKeyDown: ie,
242
+ "aria-label": `${q}, masked.`,
243
+ "aria-describedby": `${A} ${K}`,
244
+ "aria-disabled": i,
245
+ children: F
237
246
  }
238
- ) : /* @__PURE__ */ a("div", { ref: u, className: D, children: P }),
239
- s && /* @__PURE__ */ a("span", { id: K, className: "sr-only", children: "Click or press Enter to reveal." }),
240
- /* @__PURE__ */ y("span", { id: V, className: "sr-only", "aria-live": "polite", children: [
247
+ ) : /* @__PURE__ */ r("div", { ref: u, className: U, children: F }),
248
+ s && /* @__PURE__ */ r("span", { id: A, className: "sr-only", children: "Click or press Enter to reveal." }),
249
+ /* @__PURE__ */ b("span", { id: K, className: "sr-only", "aria-live": "polite", children: [
241
250
  n === "masked" && o && "Value hidden",
242
251
  h && "Copied to clipboard"
243
252
  ] })
244
253
  ] });
245
- return v ? /* @__PURE__ */ a(
246
- ge,
254
+ return y ? /* @__PURE__ */ r(
255
+ he,
247
256
  {
248
- label: v,
249
- required: W,
250
- labelTooltip: X,
251
- description: Y,
252
- error: b ? typeof b == "string" ? { message: b, match: !0 } : b : void 0,
253
- children: U
257
+ label: y,
258
+ required: Y,
259
+ labelTooltip: L,
260
+ description: X,
261
+ error: m ? typeof m == "string" ? { message: m, match: !0 } : m : void 0,
262
+ children: P
254
263
  }
255
- ) : U;
264
+ ) : P;
256
265
  }
257
266
  );
258
267
  be.displayName = "SensitiveInput";
259
268
  export {
260
269
  Te as K,
261
270
  be as S,
262
- M as a
271
+ ye as a
263
272
  };
264
- //# sourceMappingURL=sensitive-input-hokm527ollnz9dqc.js.map
273
+ //# sourceMappingURL=sensitive-input-dgoxjtoxl4zqa51v.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensitive-input-dgoxjtoxl4zqa51v.js","sources":["../../src/components/sensitive-input/sensitive-input.tsx"],"sourcesContent":["import { Eye, EyeSlash } from \"@phosphor-icons/react\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Input as BaseInput } from \"@base-ui/react/input\";\nimport {\n inputVariants,\n KUMO_INPUT_VARIANTS,\n type KumoInputSize,\n type KumoInputVariant,\n} from \"../input/input\";\nimport { Field, type FieldErrorMatch } from \"../field/field\";\n\nexport const KUMO_SENSITIVE_INPUT_VARIANTS = KUMO_INPUT_VARIANTS;\n\nexport const KUMO_SENSITIVE_INPUT_DEFAULT_VARIANTS = {\n size: \"base\",\n variant: \"default\",\n} as const;\n\ntype Mode = \"masked\" | \"revealed\" | \"empty\";\n\n/**\n * SensitiveInput component props.\n *\n * @example\n * ```tsx\n * <SensitiveInput label=\"API Key\" defaultValue=\"sk_live_abc123xyz789\" />\n * <SensitiveInput label=\"Secret\" value={secret} onValueChange={setSecret} />\n * ```\n */\nexport interface SensitiveInputProps\n extends Omit<\n ComponentPropsWithoutRef<\"input\">,\n \"size\" | \"type\" | \"value\" | \"defaultValue\"\n > {\n /** Controlled value */\n value?: string;\n /** Uncontrolled default value */\n defaultValue?: string;\n /** Simplified change handler receiving just the value */\n onValueChange?: (value: string) => void;\n /** Callback fired after value is copied to clipboard */\n onCopy?: () => void;\n /**\n * Size of the input.\n * - `\"xs\"` — Extra small for compact UIs\n * - `\"sm\"` — Small for secondary fields\n * - `\"base\"` — Default input size\n * - `\"lg\"` — Large for prominent fields\n * @default \"base\"\n */\n size?: KumoInputSize;\n /**\n * Style variant of the input.\n * - `\"default\"` — Default input appearance\n * - `\"error\"` — Error state for validation failures\n * @default \"default\"\n */\n variant?: KumoInputVariant;\n /** Label content for the input (enables Field wrapper and sets masked state label) - can be a string or any React node */\n label?: ReactNode;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** Helper text displayed below the input */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}\n\n/**\n * Password/secret input that masks its value by default and reveals on click.\n * Includes a built-in copy-to-clipboard button on hover.\n *\n * @example\n * ```tsx\n * <SensitiveInput label=\"API Key\" defaultValue=\"sk_live_abc123xyz789\" />\n * ```\n */\nexport const SensitiveInput = forwardRef<HTMLInputElement, SensitiveInputProps>(\n (\n {\n value: controlledValue,\n defaultValue = \"\",\n onChange,\n onValueChange,\n onCopy,\n size = KUMO_SENSITIVE_INPUT_DEFAULT_VARIANTS.size,\n variant: variantProp,\n disabled = false,\n readOnly = false,\n id,\n autoComplete = \"off\",\n className,\n label,\n labelTooltip,\n description,\n error,\n required,\n ...inputProps\n },\n ref,\n ) => {\n // Deprecation warning for variant=\"error\"\n if (process.env.NODE_ENV !== \"production\" && variantProp === \"error\") {\n console.warn(\n '[Kumo SensitiveInput]: variant=\"error\" is deprecated. ' +\n \"Error styling is now automatically applied when the `error` prop is truthy. \" +\n \"Simply remove the variant prop and pass an error message instead.\",\n );\n }\n\n // Auto-apply error styling when error prop is truthy\n // Explicit variant prop takes precedence for backwards compatibility\n const variant = variantProp ?? (error ? \"error\" : \"default\");\n // For aria-label, only use string labels (ReactNode labels can't be used for aria-label)\n const ariaLabelFallback =\n typeof label === \"string\" ? label : \"Sensitive value\";\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue);\n const value = isControlled ? controlledValue : internalValue;\n const hasValue = value.length > 0;\n\n const [mode, setMode] = useState<Mode>(() =>\n hasValue ? \"masked\" : \"empty\",\n );\n\n const [copied, setCopied] = useState(false);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const liveRegionId = useId();\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const maskedInstructionId = useId();\n\n const mergedRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n // Reset copied state after 2 seconds\n useEffect(() => {\n if (copied) {\n const timeoutId = setTimeout(() => setCopied(false), 2000);\n return () => clearTimeout(timeoutId);\n }\n }, [copied]);\n\n const copyToClipboard = useCallback(\n async (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n try {\n if (\n typeof navigator !== \"undefined\" &&\n navigator.clipboard &&\n typeof navigator.clipboard.writeText === \"function\"\n ) {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopy?.();\n return;\n }\n } catch {\n // Fall through to manual fallback\n }\n\n if (typeof document !== \"undefined\") {\n const textarea = document.createElement(\"textarea\");\n textarea.value = value;\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 setCopied(true);\n onCopy?.();\n } catch (error) {\n console.warn(\"Clipboard copy failed\", error);\n } finally {\n document.body.removeChild(textarea);\n if (previousRange) {\n selection?.removeAllRanges();\n selection?.addRange(previousRange);\n }\n }\n }\n },\n [value, onCopy],\n );\n\n // Sync mode when value changes externally\n const prevHasValueRef = useRef(hasValue);\n if (prevHasValueRef.current !== hasValue) {\n prevHasValueRef.current = hasValue;\n if (!hasValue && mode === \"masked\") {\n setMode(\"empty\");\n }\n }\n\n const handleContainerClick = useCallback(\n (e: React.MouseEvent) => {\n if (disabled) return;\n // Ignore clicks that originated from outside (e.g., label click focusing input)\n // Label clicks trigger a click on the input, but the click coordinates are outside the container\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const isClickInsideContainer =\n e.clientX >= rect.left &&\n e.clientX <= rect.right &&\n e.clientY >= rect.top &&\n e.clientY <= rect.bottom;\n if (!isClickInsideContainer) return;\n }\n if (mode === \"masked\" && hasValue) {\n setMode(\"revealed\");\n if (!readOnly) {\n setTimeout(() => inputRef.current?.focus(), 0);\n }\n }\n },\n [mode, hasValue, disabled, readOnly],\n );\n\n const handleToggleVisibility = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n if (mode === \"revealed\") {\n setMode(\"masked\");\n } else if (mode === \"empty\" && hasValue) {\n setMode(\"revealed\");\n }\n },\n [mode, hasValue],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n if (!isControlled) {\n setInternalValue(newValue);\n }\n // When typing into an empty field, switch to revealed mode\n // so the input shows as type=\"text\" instead of type=\"password\"\n if (mode === \"empty\" && newValue.length > 0) {\n setMode(\"revealed\");\n }\n onChange?.(e);\n onValueChange?.(newValue);\n },\n [isControlled, onChange, onValueChange, mode],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n // Don't mask if focus is moving to a button inside the container (copy/eye buttons)\n if (\n containerRef.current &&\n e.relatedTarget instanceof Node &&\n containerRef.current.contains(e.relatedTarget)\n ) {\n return;\n }\n if (hasValue) {\n setMode(\"masked\");\n }\n },\n [hasValue],\n );\n\n const handleContainerKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n if (mode === \"masked\" && hasValue) {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setMode(\"revealed\");\n if (!readOnly) {\n setTimeout(() => inputRef.current?.focus(), 0);\n }\n }\n }\n },\n [mode, hasValue, disabled, readOnly],\n );\n\n const handleInputKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (mode === \"revealed\" && e.key === \"Escape\") {\n setMode(\"masked\");\n // Move focus to container to avoid focus trap (input becomes tabIndex={-1})\n setTimeout(() => containerRef.current?.focus(), 0);\n }\n },\n [mode],\n );\n\n const isMaskedWithValue = mode === \"masked\" && hasValue;\n const showEyeButton =\n !disabled && (mode === \"revealed\" || (mode === \"empty\" && hasValue));\n\n // Icon sizes matching input sizes\n const iconSize = size === \"xs\" || size === \"sm\" ? \"size-3\" : \"size-4\";\n\n const containerClassName = cn(\n inputVariants({ size, variant, parentFocusIndicator: true }),\n \"group/container relative flex w-full items-center\",\n // Show browser-native focus outline on container when child input is focused\n \"focus-within:outline focus-within:outline-2 focus-within:outline-kumo-focus\",\n isMaskedWithValue && !disabled && \"cursor-pointer\",\n disabled && \"cursor-not-allowed\",\n className,\n );\n\n const containerContent = (\n <>\n {/* Input - defines the width, always rendered */}\n <BaseInput\n ref={mergedRef}\n id={inputId}\n type={mode === \"revealed\" ? \"text\" : \"password\"}\n value={value}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleInputKeyDown}\n disabled={disabled}\n readOnly={readOnly || isMaskedWithValue}\n autoComplete={autoComplete}\n tabIndex={isMaskedWithValue ? -1 : 0}\n className={cn(\n \"w-full border-0 bg-transparent p-0 text-kumo-default ring-0 outline-none kumo-input-placeholder disabled:cursor-not-allowed disabled:text-kumo-subtle\",\n size === \"xs\" && \"pr-5\",\n size === \"sm\" && \"pr-6\",\n size === \"base\" && \"pr-8\",\n size === \"lg\" && \"pr-10\",\n isMaskedWithValue && \"pointer-events-none text-transparent\",\n )}\n aria-hidden={isMaskedWithValue}\n {...inputProps}\n />\n\n {/* Mask overlay - absolutely positioned, doesn't affect layout */}\n <span\n className={cn(\n \"pointer-events-none absolute inset-y-0 left-0 flex items-center overflow-hidden select-none\",\n // Match input pr padding (space for icon)\n size === \"xs\" && \"right-5\",\n size === \"sm\" && \"right-6\",\n size === \"base\" && \"right-8\",\n size === \"lg\" && \"right-10\",\n // Match the padding from inputVariants\n size === \"xs\" && \"px-1.5\",\n size === \"sm\" && \"px-2\",\n size === \"base\" && \"px-3\",\n size === \"lg\" && \"px-4\",\n // Hidden when not masked\n !isMaskedWithValue && \"invisible\",\n // When masked: enable pointer events\n isMaskedWithValue && \"pointer-events-auto\",\n // Text color - use text-kumo-default to contrast with bg-kumo-control input background\n \"text-kumo-default\",\n // Hover state - pure CSS, no React state (group for children)\n \"group/mask\",\n )}\n aria-hidden=\"true\"\n >\n {/* Both texts rendered, stacked. Visibility toggled on hover to prevent layout shift */}\n <span className=\"relative\">\n <span\n className={cn(\n isMaskedWithValue &&\n !disabled &&\n \"group-focus-within/container:invisible group-hover/mask:invisible\",\n )}\n >\n ••••••••\n </span>\n {isMaskedWithValue && !disabled && (\n <span className=\"invisible absolute left-0 top-0 whitespace-nowrap text-kumo-subtle group-focus-within/container:visible group-hover/mask:visible\">\n Click to reveal\n </span>\n )}\n </span>\n </span>\n\n {/* Eye button - absolutely positioned to the right */}\n <button\n type=\"button\"\n data-kumo-component=\"SensitiveInput\"\n data-kumo-part=\"toggle-visibility\"\n onClick={handleToggleVisibility}\n onKeyDown={(e) => e.stopPropagation()}\n aria-label={mode === \"revealed\" ? \"Hide value\" : \"Reveal value\"}\n tabIndex={showEyeButton ? 0 : -1}\n className={cn(\n \"absolute top-1/2 right-0 -translate-y-1/2 cursor-pointer text-kumo-subtle hover:text-kumo-default focus:text-kumo-default focus:ring-kumo-focus/50 focus-visible:ring-2 focus-visible:ring-kumo-brand focus-visible:rounded-sm\",\n // Defensive styles to prevent global CSS pollution (e.g., button { background: gray })\n \"bg-transparent border-none shadow-none p-0 m-0 h-auto min-h-0 inline-flex items-center justify-center\",\n // Match right padding from inputVariants\n size === \"xs\" && \"right-1.5\",\n size === \"sm\" && \"right-2\",\n size === \"base\" && \"right-3\",\n size === \"lg\" && \"right-4\",\n iconSize,\n !showEyeButton && \"pointer-events-none opacity-0\",\n )}\n >\n {mode === \"revealed\" ? (\n <EyeSlash className=\"size-full\" />\n ) : (\n <Eye className=\"size-full\" />\n )}\n </button>\n\n {/* Copy tab - appears on hover/focus at top right (hidden when disabled) */}\n {hasValue && !disabled && (\n <button\n type=\"button\"\n data-kumo-component=\"SensitiveInput\"\n data-kumo-part=\"copy\"\n onClick={copyToClipboard}\n onKeyDown={(e) => e.stopPropagation()}\n aria-label={copied ? \"Copied\" : \"Copy to clipboard\"}\n className={cn(\n \"absolute -top-px right-2 -translate-y-full cursor-pointer rounded-t-md bg-kumo-brand px-2 py-0.5 text-xs text-white opacity-0 transition-opacity group-focus-within/container:opacity-100 group-hover/container:opacity-100 hover:brightness-120 focus:outline-none focus:ring-kumo-focus/50 focus-visible:ring-2 focus-visible:ring-kumo-brand\",\n // Defensive styles to prevent global CSS pollution\n \"border-none shadow-none m-0 h-auto min-h-0\",\n )}\n >\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n )}\n </>\n );\n\n const input = (\n <div>\n {isMaskedWithValue ? (\n <div\n ref={containerRef}\n // Cannot use <button> here because containerContent contains interactive button elements (Copy, Reveal).\n // Using role=\"button\" with proper keyboard handling instead.\n // oxlint-disable-next-line prefer-tag-over-role\n role=\"button\"\n data-kumo-component=\"SensitiveInput\"\n data-kumo-part=\"masked-container\"\n tabIndex={disabled ? -1 : 0}\n className={containerClassName}\n onClick={handleContainerClick}\n onKeyDown={handleContainerKeyDown}\n aria-label={`${ariaLabelFallback}, masked.`}\n aria-describedby={`${maskedInstructionId} ${liveRegionId}`}\n aria-disabled={disabled}\n >\n {containerContent}\n </div>\n ) : (\n <div ref={containerRef} className={containerClassName}>\n {containerContent}\n </div>\n )}\n {isMaskedWithValue && (\n <span id={maskedInstructionId} className=\"sr-only\">\n Click or press Enter to reveal.\n </span>\n )}\n <span id={liveRegionId} className=\"sr-only\" aria-live=\"polite\">\n {mode === \"masked\" && hasValue && \"Value hidden\"}\n {copied && \"Copied to clipboard\"}\n </span>\n </div>\n );\n\n // Render with Field wrapper if label is provided\n if (label) {\n return (\n <Field\n label={label}\n required={required}\n labelTooltip={labelTooltip}\n description={description}\n error={\n error\n ? typeof error === \"string\"\n ? { message: error, match: true }\n : error\n : undefined\n }\n >\n {input}\n </Field>\n );\n }\n\n // Render bare input without Field wrapper\n return input;\n },\n);\n\nSensitiveInput.displayName = \"SensitiveInput\";\n"],"names":["KUMO_SENSITIVE_INPUT_VARIANTS","KUMO_INPUT_VARIANTS","KUMO_SENSITIVE_INPUT_DEFAULT_VARIANTS","SensitiveInput","forwardRef","controlledValue","defaultValue","onChange","onValueChange","onCopy","size","variantProp","disabled","readOnly","id","autoComplete","className","label","labelTooltip","description","error","required","inputProps","ref","variant","ariaLabelFallback","isControlled","internalValue","setInternalValue","useState","value","hasValue","mode","setMode","copied","setCopied","inputRef","useRef","containerRef","liveRegionId","useId","generatedId","inputId","maskedInstructionId","mergedRef","useCallback","node","useEffect","timeoutId","copyToClipboard","textarea","selection","previousRange","prevHasValueRef","handleContainerClick","rect","handleToggleVisibility","handleChange","newValue","handleBlur","handleContainerKeyDown","handleInputKeyDown","isMaskedWithValue","showEyeButton","iconSize","containerClassName","cn","inputVariants","containerContent","jsxs","Fragment","jsx","BaseInput","EyeSlash","Eye","input","Field"],"mappings":"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"}