@cloudflare/kumo 1.15.0 → 1.17.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 (266) hide show
  1. package/CHANGELOG.md +144 -0
  2. package/ai/USAGE.md +3 -1
  3. package/ai/component-registry.json +511 -66
  4. package/ai/component-registry.md +776 -59
  5. package/ai/schemas.ts +33 -7
  6. package/dist/.build-complete +1 -1
  7. package/dist/ai/schemas.d.ts +158 -39
  8. package/dist/ai/schemas.d.ts.map +1 -1
  9. package/dist/ai/schemas.js +456 -418
  10. package/dist/ai/schemas.js.map +1 -1
  11. package/dist/chunks/{Legend-mkh1v83sz972e29d.js → Legend-o0ntojbaplmszwk0.js} +115 -101
  12. package/dist/chunks/Legend-o0ntojbaplmszwk0.js.map +1 -0
  13. package/dist/chunks/badge-n80t3z8u9ttlxi20.js +120 -0
  14. package/dist/chunks/badge-n80t3z8u9ttlxi20.js.map +1 -0
  15. package/dist/chunks/banner-nz0eryqnz3qd86ln.js +79 -0
  16. package/dist/chunks/banner-nz0eryqnz3qd86ln.js.map +1 -0
  17. package/dist/chunks/{breadcrumbs-m79gm4gjwbfajpna.js → breadcrumbs-cjgn3w4drahvqnuj.js} +3 -3
  18. package/dist/chunks/{breadcrumbs-m79gm4gjwbfajpna.js.map → breadcrumbs-cjgn3w4drahvqnuj.js.map} +1 -1
  19. package/dist/chunks/{button-j0hi0afn33w9lxgi.js → button-odxi0hp4fvi5i2w3.js} +50 -48
  20. package/dist/chunks/button-odxi0hp4fvi5i2w3.js.map +1 -0
  21. package/dist/chunks/{checkbox-bvzuggmadtqawis4.js → checkbox-dx8x0rzv582yjv7n.js} +38 -47
  22. package/dist/chunks/{checkbox-bvzuggmadtqawis4.js.map → checkbox-dx8x0rzv582yjv7n.js.map} +1 -1
  23. package/dist/chunks/{clipboard-text-mwcknzn75qdvigrd.js → clipboard-text-kyk51d1ze7zvdn4q.js} +55 -54
  24. package/dist/chunks/clipboard-text-kyk51d1ze7zvdn4q.js.map +1 -0
  25. package/dist/chunks/{combobox-ndbaroqh1c0u49ye.js → combobox-9fhjzprab46csmon.js} +97 -82
  26. package/dist/chunks/combobox-9fhjzprab46csmon.js.map +1 -0
  27. package/dist/chunks/{command-palette-ejoszjfivybu9yi5.js → command-palette-kenx2bbdzd4kpx36.js} +158 -154
  28. package/dist/chunks/command-palette-kenx2bbdzd4kpx36.js.map +1 -0
  29. package/dist/chunks/{dialog-gkmecnx48ge38jrr.js → dialog-e05ysa8t2fklw065.js} +22 -20
  30. package/dist/chunks/dialog-e05ysa8t2fklw065.js.map +1 -0
  31. package/dist/chunks/{dropdown-i8n7nv3cvkvb1x3e.js → dropdown-g587px7zv3ssaxr4.js} +96 -90
  32. package/dist/chunks/dropdown-g587px7zv3ssaxr4.js.map +1 -0
  33. package/dist/chunks/{empty-hrwtammqp0b2nvtf.js → empty-fuz1un7r7mbz0kim.js} +2 -2
  34. package/dist/chunks/{empty-hrwtammqp0b2nvtf.js.map → empty-fuz1un7r7mbz0kim.js.map} +1 -1
  35. package/dist/chunks/{field-lweivfadxgpqhuqi.js → field-fq504lyu7ttsh5m9.js} +3 -3
  36. package/dist/chunks/{field-lweivfadxgpqhuqi.js.map → field-fq504lyu7ttsh5m9.js.map} +1 -1
  37. package/dist/chunks/hcl-hcu7d6ja6t540ijn.js +8 -0
  38. package/dist/chunks/hcl-hcu7d6ja6t540ijn.js.map +1 -0
  39. package/dist/chunks/{input-area-obli4ufvu40bfpgp.js → input-area-nq40szg9110on89c.js} +4 -4
  40. package/dist/chunks/{input-area-obli4ufvu40bfpgp.js.map → input-area-nq40szg9110on89c.js.map} +1 -1
  41. package/dist/chunks/{input-group-dwtsd04lzf2bcsdo.js → input-group-hbebbyh8fo6aqydn.js} +3 -3
  42. package/dist/chunks/{input-group-dwtsd04lzf2bcsdo.js.map → input-group-hbebbyh8fo6aqydn.js.map} +1 -1
  43. package/dist/chunks/{input-ko2dne1givlxq7sz.js → input-kvhyo3p4859bexvx.js} +4 -4
  44. package/dist/chunks/input-kvhyo3p4859bexvx.js.map +1 -0
  45. package/dist/chunks/{label-kjahhybc191quieo.js → label-j9owppbgnn35mebg.js} +3 -3
  46. package/dist/chunks/{label-kjahhybc191quieo.js.map → label-j9owppbgnn35mebg.js.map} +1 -1
  47. package/dist/chunks/{layer-card-mu2w82x6ko1nhhtr.js → layer-card-l5yjvrxry1dhte57.js} +8 -8
  48. package/dist/chunks/{layer-card-mu2w82x6ko1nhhtr.js.map → layer-card-l5yjvrxry1dhte57.js.map} +1 -1
  49. package/dist/chunks/{link-lpzl5s47pmobk361.js → link-hmmf3k1xn6rm72rt.js} +2 -2
  50. package/dist/chunks/{link-lpzl5s47pmobk361.js.map → link-hmmf3k1xn6rm72rt.js.map} +1 -1
  51. package/dist/chunks/{menubar-ifxxdoa35zz79z1q.js → menubar-abojnm0uwjuni8ok.js} +20 -20
  52. package/dist/chunks/menubar-abojnm0uwjuni8ok.js.map +1 -0
  53. package/dist/chunks/{meter-fbtqfg0okpwmaiju.js → meter-i84dte2f82qmvn7y.js} +2 -2
  54. package/dist/chunks/{meter-fbtqfg0okpwmaiju.js.map → meter-i84dte2f82qmvn7y.js.map} +1 -1
  55. package/dist/chunks/{pagination-eo0gzzm7v5w8niqe.js → pagination-pbd7qqik97ac0l7m.js} +3 -3
  56. package/dist/chunks/{pagination-eo0gzzm7v5w8niqe.js.map → pagination-pbd7qqik97ac0l7m.js.map} +1 -1
  57. package/dist/chunks/{popover-dd7hi5ajeoq9od1i.js → popover-i951xjcgezeqr4iv.js} +31 -28
  58. package/dist/chunks/popover-i951xjcgezeqr4iv.js.map +1 -0
  59. package/dist/chunks/portal-provider-hwmkdmkpvct0cb76.js +18 -0
  60. package/dist/chunks/portal-provider-hwmkdmkpvct0cb76.js.map +1 -0
  61. package/dist/chunks/{radio-oi9iw7ls1t04j377.js → radio-l2vkcue40d84fmo1.js} +13 -16
  62. package/dist/chunks/{radio-oi9iw7ls1t04j377.js.map → radio-l2vkcue40d84fmo1.js.map} +1 -1
  63. package/dist/chunks/{select-0m0xklfwdlx8dwba.js → select-paedwa3nlhpq82ua.js} +39 -37
  64. package/dist/chunks/select-paedwa3nlhpq82ua.js.map +1 -0
  65. package/dist/chunks/{sensitive-input-rjpykxn2llh0thx1.js → sensitive-input-kznmknpp5h1grc6k.js} +97 -91
  66. package/dist/chunks/sensitive-input-kznmknpp5h1grc6k.js.map +1 -0
  67. package/dist/chunks/sidebar-jepeq7gaf4issuw6.js +875 -0
  68. package/dist/chunks/sidebar-jepeq7gaf4issuw6.js.map +1 -0
  69. package/dist/chunks/skeleton-line-epxenksfesr2fkcv.js +33 -0
  70. package/dist/chunks/skeleton-line-epxenksfesr2fkcv.js.map +1 -0
  71. package/dist/chunks/surface-blo81kgy9g0sexgm.js +36 -0
  72. package/dist/chunks/surface-blo81kgy9g0sexgm.js.map +1 -0
  73. package/dist/chunks/{switch-lv4mrrkfl5uc99xo.js → switch-i0zwcp3wq6vsxm1c.js} +64 -64
  74. package/dist/chunks/{switch-lv4mrrkfl5uc99xo.js.map → switch-i0zwcp3wq6vsxm1c.js.map} +1 -1
  75. package/dist/chunks/table-nrcw19tlpduayukl.js +183 -0
  76. package/dist/chunks/table-nrcw19tlpduayukl.js.map +1 -0
  77. package/dist/chunks/tabs-bw92jb303zxw7w4f.js +92 -0
  78. package/dist/chunks/{tabs-hy6oa7xtf96d9mxt.js.map → tabs-bw92jb303zxw7w4f.js.map} +1 -1
  79. package/dist/chunks/{text-gzt92mlji1lug13d.js → text-nmyi1rkwdj37f30f.js} +24 -22
  80. package/dist/chunks/text-nmyi1rkwdj37f30f.js.map +1 -0
  81. package/dist/chunks/{toast-kswfqmjysxcrwij3.js → toast-lrnwby56drs7vtae.js} +61 -59
  82. package/dist/chunks/toast-lrnwby56drs7vtae.js.map +1 -0
  83. package/dist/chunks/toml-nczb2z9n0o23o3ci.js +8 -0
  84. package/dist/chunks/toml-nczb2z9n0o23o3ci.js.map +1 -0
  85. package/dist/chunks/{tooltip-k68wcv9mrigb7rcb.js → tooltip-cit9ltlxfuhwctuj.js} +24 -21
  86. package/dist/chunks/tooltip-cit9ltlxfuhwctuj.js.map +1 -0
  87. package/dist/chunks/{vendor-base-ui-cpvkrhz4zgw9nw2b.js → vendor-base-ui-n30qblevnpk9cc5c.js} +551 -549
  88. package/dist/chunks/{vendor-base-ui-cpvkrhz4zgw9nw2b.js.map → vendor-base-ui-n30qblevnpk9cc5c.js.map} +1 -1
  89. package/dist/code/server.js +11 -9
  90. package/dist/code/server.js.map +1 -1
  91. package/dist/code.js +16 -14
  92. package/dist/code.js.map +1 -1
  93. package/dist/components/badge.js +1 -1
  94. package/dist/components/banner.js +1 -1
  95. package/dist/components/breadcrumbs.js +1 -1
  96. package/dist/components/button.js +1 -1
  97. package/dist/components/chart.js +1 -1
  98. package/dist/components/checkbox.js +1 -1
  99. package/dist/components/clipboard-text.js +1 -1
  100. package/dist/components/combobox.js +1 -1
  101. package/dist/components/command-palette.js +1 -1
  102. package/dist/components/dialog.js +1 -1
  103. package/dist/components/dropdown.js +1 -1
  104. package/dist/components/empty.js +1 -1
  105. package/dist/components/field.js +1 -1
  106. package/dist/components/flow.js +2142 -2090
  107. package/dist/components/flow.js.map +1 -1
  108. package/dist/components/input.js +3 -3
  109. package/dist/components/label.js +1 -1
  110. package/dist/components/layer-card.js +1 -1
  111. package/dist/components/link.js +1 -1
  112. package/dist/components/loader.js +1 -1
  113. package/dist/components/menubar.js +1 -1
  114. package/dist/components/meter.js +1 -1
  115. package/dist/components/pagination.js +1 -1
  116. package/dist/components/popover.js +1 -1
  117. package/dist/components/radio.js +1 -1
  118. package/dist/components/select.js +1 -1
  119. package/dist/components/sensitive-input.js +1 -1
  120. package/dist/components/sidebar.js +35 -0
  121. package/dist/components/sidebar.js.map +1 -0
  122. package/dist/components/surface.js +1 -1
  123. package/dist/components/switch.js +1 -1
  124. package/dist/components/table.js +1 -1
  125. package/dist/components/tabs.js +1 -1
  126. package/dist/components/text.js +1 -1
  127. package/dist/components/toast.js +2 -2
  128. package/dist/components/tooltip.js +1 -1
  129. package/dist/index.js +192 -159
  130. package/dist/index.js.map +1 -1
  131. package/dist/primitives/accordion.js +1 -1
  132. package/dist/primitives/alert-dialog.js +1 -1
  133. package/dist/primitives/autocomplete.js +1 -1
  134. package/dist/primitives/avatar.js +1 -1
  135. package/dist/primitives/button.js +1 -1
  136. package/dist/primitives/checkbox-group.js +1 -1
  137. package/dist/primitives/checkbox.js +1 -1
  138. package/dist/primitives/collapsible.js +1 -1
  139. package/dist/primitives/combobox.js +1 -1
  140. package/dist/primitives/context-menu.js +1 -1
  141. package/dist/primitives/csp-provider.js +1 -1
  142. package/dist/primitives/dialog.js +1 -1
  143. package/dist/primitives/direction-provider.js +1 -1
  144. package/dist/primitives/drawer.js +1 -1
  145. package/dist/primitives/field.js +1 -1
  146. package/dist/primitives/fieldset.js +1 -1
  147. package/dist/primitives/form.js +1 -1
  148. package/dist/primitives/input.js +1 -1
  149. package/dist/primitives/menu.js +1 -1
  150. package/dist/primitives/menubar.js +1 -1
  151. package/dist/primitives/meter.js +1 -1
  152. package/dist/primitives/navigation-menu.js +1 -1
  153. package/dist/primitives/number-field.js +1 -1
  154. package/dist/primitives/popover.js +1 -1
  155. package/dist/primitives/preview-card.js +1 -1
  156. package/dist/primitives/progress.js +1 -1
  157. package/dist/primitives/radio-group.js +1 -1
  158. package/dist/primitives/radio.js +1 -1
  159. package/dist/primitives/scroll-area.js +1 -1
  160. package/dist/primitives/select.js +1 -1
  161. package/dist/primitives/separator.js +1 -1
  162. package/dist/primitives/slider.js +1 -1
  163. package/dist/primitives/switch.js +1 -1
  164. package/dist/primitives/tabs.js +1 -1
  165. package/dist/primitives/toast.js +1 -1
  166. package/dist/primitives/toggle-group.js +1 -1
  167. package/dist/primitives/toggle.js +1 -1
  168. package/dist/primitives/toolbar.js +1 -1
  169. package/dist/primitives/tooltip.js +1 -1
  170. package/dist/primitives.js +1 -1
  171. package/dist/scripts/theme-generator/config.d.ts.map +1 -1
  172. package/dist/scripts/theme-generator/config.js +288 -24
  173. package/dist/scripts/theme-generator/config.js.map +1 -1
  174. package/dist/src/code/provider.d.ts.map +1 -1
  175. package/dist/src/code/server.d.ts.map +1 -1
  176. package/dist/src/code/types.d.ts +1 -1
  177. package/dist/src/code/types.d.ts.map +1 -1
  178. package/dist/src/components/badge/badge.d.ts +95 -22
  179. package/dist/src/components/badge/badge.d.ts.map +1 -1
  180. package/dist/src/components/banner/banner.d.ts +2 -0
  181. package/dist/src/components/banner/banner.d.ts.map +1 -1
  182. package/dist/src/components/button/button.d.ts +2 -0
  183. package/dist/src/components/button/button.d.ts.map +1 -1
  184. package/dist/src/components/chart/EChart.d.ts.map +1 -1
  185. package/dist/src/components/chart/TimeseriesChart.d.ts +11 -1
  186. package/dist/src/components/chart/TimeseriesChart.d.ts.map +1 -1
  187. package/dist/src/components/checkbox/checkbox.d.ts.map +1 -1
  188. package/dist/src/components/clipboard-text/clipboard-text.d.ts +2 -0
  189. package/dist/src/components/clipboard-text/clipboard-text.d.ts.map +1 -1
  190. package/dist/src/components/combobox/combobox.d.ts +8 -1
  191. package/dist/src/components/combobox/combobox.d.ts.map +1 -1
  192. package/dist/src/components/command-palette/command-palette.d.ts +9 -2
  193. package/dist/src/components/command-palette/command-palette.d.ts.map +1 -1
  194. package/dist/src/components/command-palette/types.d.ts +7 -0
  195. package/dist/src/components/command-palette/types.d.ts.map +1 -1
  196. package/dist/src/components/dialog/dialog.d.ts +8 -1
  197. package/dist/src/components/dialog/dialog.d.ts.map +1 -1
  198. package/dist/src/components/dropdown/dropdown.d.ts +17 -2
  199. package/dist/src/components/dropdown/dropdown.d.ts.map +1 -1
  200. package/dist/src/components/flow/diagram.d.ts.map +1 -1
  201. package/dist/src/components/flow/node.d.ts.map +1 -1
  202. package/dist/src/components/flow/parallel.d.ts.map +1 -1
  203. package/dist/src/components/loader/skeleton-line.d.ts +2 -1
  204. package/dist/src/components/loader/skeleton-line.d.ts.map +1 -1
  205. package/dist/src/components/popover/popover.d.ts +8 -1
  206. package/dist/src/components/popover/popover.d.ts.map +1 -1
  207. package/dist/src/components/radio/radio.d.ts.map +1 -1
  208. package/dist/src/components/select/select.d.ts +8 -1
  209. package/dist/src/components/select/select.d.ts.map +1 -1
  210. package/dist/src/components/sensitive-input/sensitive-input.d.ts.map +1 -1
  211. package/dist/src/components/sidebar/index.d.ts +2 -0
  212. package/dist/src/components/sidebar/index.d.ts.map +1 -0
  213. package/dist/src/components/sidebar/sidebar.d.ts +556 -0
  214. package/dist/src/components/sidebar/sidebar.d.ts.map +1 -0
  215. package/dist/src/components/surface/surface.d.ts +23 -23
  216. package/dist/src/components/surface/surface.d.ts.map +1 -1
  217. package/dist/src/components/table/table.d.ts +34 -2
  218. package/dist/src/components/table/table.d.ts.map +1 -1
  219. package/dist/src/components/tabs/tabs.d.ts.map +1 -1
  220. package/dist/src/components/text/text.d.ts +5 -0
  221. package/dist/src/components/text/text.d.ts.map +1 -1
  222. package/dist/src/components/toast/toast.d.ts +16 -9
  223. package/dist/src/components/toast/toast.d.ts.map +1 -1
  224. package/dist/src/components/tooltip/tooltip.d.ts +11 -6
  225. package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
  226. package/dist/src/index.d.ts +2 -0
  227. package/dist/src/index.d.ts.map +1 -1
  228. package/dist/src/utils/index.d.ts +1 -0
  229. package/dist/src/utils/index.d.ts.map +1 -1
  230. package/dist/src/utils/portal-provider.d.ts +56 -0
  231. package/dist/src/utils/portal-provider.d.ts.map +1 -0
  232. package/dist/styles/kumo-binding.css +49 -46
  233. package/dist/styles/kumo-standalone.css +1 -1
  234. package/dist/styles/theme-fedramp.css +3 -3
  235. package/dist/styles/theme-kumo.css +202 -22
  236. package/dist/utils.js +8 -6
  237. package/dist/utils.js.map +1 -1
  238. package/package.json +7 -3
  239. package/scripts/component-registry/index.ts +12 -0
  240. package/scripts/theme-generator/config.ts +298 -24
  241. package/dist/chunks/Legend-mkh1v83sz972e29d.js.map +0 -1
  242. package/dist/chunks/badge-mrshucy2530o70cq.js +0 -56
  243. package/dist/chunks/badge-mrshucy2530o70cq.js.map +0 -1
  244. package/dist/chunks/banner-vzdjbqsb6em7tmdk.js +0 -75
  245. package/dist/chunks/banner-vzdjbqsb6em7tmdk.js.map +0 -1
  246. package/dist/chunks/button-j0hi0afn33w9lxgi.js.map +0 -1
  247. package/dist/chunks/clipboard-text-mwcknzn75qdvigrd.js.map +0 -1
  248. package/dist/chunks/combobox-ndbaroqh1c0u49ye.js.map +0 -1
  249. package/dist/chunks/command-palette-ejoszjfivybu9yi5.js.map +0 -1
  250. package/dist/chunks/dialog-gkmecnx48ge38jrr.js.map +0 -1
  251. package/dist/chunks/dropdown-i8n7nv3cvkvb1x3e.js.map +0 -1
  252. package/dist/chunks/input-ko2dne1givlxq7sz.js.map +0 -1
  253. package/dist/chunks/menubar-ifxxdoa35zz79z1q.js.map +0 -1
  254. package/dist/chunks/popover-dd7hi5ajeoq9od1i.js.map +0 -1
  255. package/dist/chunks/select-0m0xklfwdlx8dwba.js.map +0 -1
  256. package/dist/chunks/sensitive-input-rjpykxn2llh0thx1.js.map +0 -1
  257. package/dist/chunks/skeleton-line-1j5exu6vv07mmhfb.js +0 -28
  258. package/dist/chunks/skeleton-line-1j5exu6vv07mmhfb.js.map +0 -1
  259. package/dist/chunks/surface-dhshylwccuaz91d1.js +0 -21
  260. package/dist/chunks/surface-dhshylwccuaz91d1.js.map +0 -1
  261. package/dist/chunks/table-fh7jmfip27vdapxm.js +0 -155
  262. package/dist/chunks/table-fh7jmfip27vdapxm.js.map +0 -1
  263. package/dist/chunks/tabs-hy6oa7xtf96d9mxt.js +0 -86
  264. package/dist/chunks/text-gzt92mlji1lug13d.js.map +0 -1
  265. package/dist/chunks/toast-kswfqmjysxcrwij3.js.map +0 -1
  266. package/dist/chunks/tooltip-k68wcv9mrigb7rcb.js.map +0 -1
@@ -1,19 +1,20 @@
1
1
  "use client";
2
2
  import { jsxs as r, jsx as e } from "react/jsx-runtime";
3
- import { CaretUpDownIcon as z, CheckIcon as C } from "@phosphor-icons/react";
4
- import { useId as O } from "react";
3
+ import { CaretUpDownIcon as P, CheckIcon as V } from "@phosphor-icons/react";
4
+ import { useId as A } from "react";
5
5
  import { c as v } from "./cn-ct4n7r74mh8y0f48.js";
6
- import { b as V } from "./button-j0hi0afn33w9lxgi.js";
7
- import { S as A } from "./skeleton-line-1j5exu6vv07mmhfb.js";
8
- import { F as E } from "./field-lweivfadxgpqhuqi.js";
9
- import { aV as P, aW as D, aX as T, aY as W, aZ as _, a_ as $, a$ as B, b0 as K, b1 as M, b2 as R } from "./vendor-base-ui-cpvkrhz4zgw9nw2b.js";
6
+ import { b as E } from "./button-odxi0hp4fvi5i2w3.js";
7
+ import { S as D } from "./skeleton-line-epxenksfesr2fkcv.js";
8
+ import { F as T } from "./field-fq504lyu7ttsh5m9.js";
9
+ import { u as W } from "./portal-provider-hwmkdmkpvct0cb76.js";
10
+ import { aV as _, aW as $, aX as B, aY as K, aZ as M, a_ as R, a$ as U, b0 as X, b1 as Y, b2 as Z } from "./vendor-base-ui-n30qblevnpk9cc5c.js";
10
11
  function y(t) {
11
- return Array.isArray(t) ? t : Object.entries(t).map(([s, a]) => ({
12
- value: s,
12
+ return Array.isArray(t) ? t : Object.entries(t).map(([o, a]) => ({
13
+ value: o,
13
14
  label: a
14
15
  }));
15
16
  }
16
- function U(t) {
17
+ function q(t) {
17
18
  return y(t).filter((a) => a.value !== null).map((a, n) => /* @__PURE__ */ e(
18
19
  S,
19
20
  {
@@ -23,58 +24,59 @@ function U(t) {
23
24
  typeof a.value == "string" ? a.value : `option-${n}`
24
25
  ));
25
26
  }
26
- function X({
27
+ function G({
27
28
  children: t,
28
- className: s,
29
+ className: o,
29
30
  renderValue: a,
30
31
  label: n,
31
32
  hideLabel: c,
32
33
  placeholder: d,
33
34
  loading: m,
34
35
  labelTooltip: x,
35
- description: o,
36
+ description: s,
36
37
  error: i,
37
38
  required: I,
39
+ container: k,
38
40
  ...l
39
41
  }) {
40
- const u = O(), b = l, k = b["aria-label"], N = b["aria-labelledby"], w = typeof n == "string" ? n : d;
42
+ const u = A(), N = W(), w = k ?? N ?? void 0, b = l, L = b["aria-label"], C = b["aria-labelledby"], F = typeof n == "string" ? n : d;
41
43
  process.env.NODE_ENV !== "production" && c !== void 0 && console.warn(
42
44
  '[Kumo Select]: `hideLabel` is deprecated. For hidden labels, use `aria-label` instead of `label` + `hideLabel={true}`.\n Migration:\n - For visible labels: <Select label="Country" /> (hideLabel no longer needed)\n - For hidden labels: <Select aria-label="Select a country" /> (remove label and hideLabel)'
43
45
  );
44
- const f = n && c !== !0, g = f ? void 0 : N ?? (n ? u : void 0), L = k ?? (g ? void 0 : w), F = l.items ? y(l.items) : void 0, j = t ?? (l.items ? U(l.items) : null), h = /* @__PURE__ */ r(
45
- P,
46
+ const f = n && c !== !0, g = f ? void 0 : C ?? (n ? u : void 0), j = L ?? (g ? void 0 : F), z = l.items ? y(l.items) : void 0, O = t ?? (l.items ? q(l.items) : null), h = /* @__PURE__ */ r(
47
+ _,
46
48
  {
47
49
  ...l,
48
- items: F,
50
+ items: z,
49
51
  disabled: m || l.disabled,
50
52
  children: [
51
53
  /* @__PURE__ */ r(
52
- D,
54
+ $,
53
55
  {
54
56
  className: v(
55
- V(),
57
+ E(),
56
58
  "justify-between font-normal",
57
59
  "focus:opacity-100 focus-visible:ring-1 focus-visible:ring-kumo-ring *:in-focus:opacity-100",
58
60
  l.disabled && "cursor-not-allowed opacity-50",
59
- s
61
+ o
60
62
  ),
61
- "aria-label": L,
63
+ "aria-label": j,
62
64
  "aria-labelledby": g,
63
65
  children: [
64
- m ? /* @__PURE__ */ e(A, { className: "w-32" }) : /* @__PURE__ */ e(
65
- T,
66
+ m ? /* @__PURE__ */ e(D, { className: "w-32" }) : /* @__PURE__ */ e(
67
+ B,
66
68
  {
67
69
  placeholder: d,
68
70
  className: "min-w-0 truncate",
69
71
  children: a
70
72
  }
71
73
  ),
72
- /* @__PURE__ */ e(W, { className: "flex shrink-0 items-center", children: /* @__PURE__ */ e(z, {}) })
74
+ /* @__PURE__ */ e(K, { className: "flex shrink-0 items-center", children: /* @__PURE__ */ e(P, {}) })
73
75
  ]
74
76
  }
75
77
  ),
76
- /* @__PURE__ */ e(_, { children: /* @__PURE__ */ e($, { children: /* @__PURE__ */ e(
77
- B,
78
+ /* @__PURE__ */ e(M, { container: w, children: /* @__PURE__ */ e(R, { children: /* @__PURE__ */ e(
79
+ U,
78
80
  {
79
81
  className: v(
80
82
  "overflow-hidden bg-kumo-base text-kumo-default",
@@ -85,7 +87,7 @@ function X({
85
87
  "min-w-[calc(var(--anchor-width)+3px)] p-1.5"
86
88
  // spacing
87
89
  ),
88
- children: j
90
+ children: O
89
91
  }
90
92
  ) }) })
91
93
  ]
@@ -93,12 +95,12 @@ function X({
93
95
  );
94
96
  if (f)
95
97
  return /* @__PURE__ */ e(
96
- E,
98
+ T,
97
99
  {
98
100
  label: n,
99
101
  required: I,
100
102
  labelTooltip: x,
101
- description: o,
103
+ description: s,
102
104
  error: i ? typeof i == "string" ? { message: i, match: !0 } : i : void 0,
103
105
  children: h
104
106
  }
@@ -107,24 +109,24 @@ function X({
107
109
  return /* @__PURE__ */ r("div", { className: "grid gap-2", children: [
108
110
  n && /* @__PURE__ */ e("span", { id: u, className: "sr-only", children: n }),
109
111
  h,
110
- p ? /* @__PURE__ */ e("span", { className: "text-sm text-kumo-danger", children: p.message }) : o && /* @__PURE__ */ e("span", { className: "text-sm leading-snug text-kumo-subtle", children: o })
112
+ p ? /* @__PURE__ */ e("span", { className: "text-sm text-kumo-danger", children: p.message }) : s && /* @__PURE__ */ e("span", { className: "text-sm leading-snug text-kumo-subtle", children: s })
111
113
  ] });
112
114
  }
113
- function S({ children: t, value: s }) {
115
+ function S({ children: t, value: o }) {
114
116
  return /* @__PURE__ */ r(
115
- K,
117
+ X,
116
118
  {
117
- value: s,
119
+ value: o,
118
120
  className: "group flex cursor-pointer items-center justify-between gap-2 rounded px-2 py-1.5 text-base data-highlighted:bg-kumo-tint",
119
121
  children: [
120
- /* @__PURE__ */ e(M, { children: t }),
121
- /* @__PURE__ */ e(R, { children: /* @__PURE__ */ e(C, {}) })
122
+ /* @__PURE__ */ e(Y, { children: t }),
123
+ /* @__PURE__ */ e(Z, { children: /* @__PURE__ */ e(V, {}) })
122
124
  ]
123
125
  }
124
126
  );
125
127
  }
126
- X.Option = S;
128
+ G.Option = S;
127
129
  export {
128
- X as S
130
+ G as S
129
131
  };
130
- //# sourceMappingURL=select-0m0xklfwdlx8dwba.js.map
132
+ //# sourceMappingURL=select-paedwa3nlhpq82ua.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-paedwa3nlhpq82ua.js","sources":["../../src/components/select/select.tsx"],"sourcesContent":["import { Select as SelectBase } from \"@base-ui/react/select\";\nimport { CaretUpDownIcon, CheckIcon } from \"@phosphor-icons/react\";\nimport { useId } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { buttonVariants } from \"../button\";\nimport { SkeletonLine } from \"../loader\";\nimport { Field, type FieldErrorMatch } from \"../field/field\";\nimport {\n usePortalContainer,\n type PortalContainer,\n} from \"../../utils/portal-provider\";\n\n/** Select variant definitions (currently empty, reserved for future additions). */\nexport const KUMO_SELECT_VARIANTS = {\n // Select currently has no variant options but structure is ready for future additions\n} as const;\n\nexport const KUMO_SELECT_DEFAULT_VARIANTS = {} as const;\n\n/**\n * Select component styling metadata for Figma plugin code generation\n * Extracted from select.tsx implementation (source of truth)\n */\nexport const KUMO_SELECT_STYLING = {\n trigger: {\n height: 36, // h-9\n paddingX: 12, // px-3\n borderRadius: 8, // rounded-lg\n background: \"color-secondary\",\n text: \"text-color-surface\",\n ring: \"color-border\",\n fontSize: 16, // text-base\n fontWeight: 400, // font-normal\n },\n stateTokens: {\n focus: { ring: \"color-active\" },\n disabled: { opacity: 0.5 },\n },\n icons: {\n caret: { name: \"ph-caret-up-down\", size: 20 },\n check: { name: \"ph-check\", size: 20 },\n },\n popup: {\n background: \"color-secondary\",\n ring: \"color-border\",\n borderRadius: 8, // rounded-lg\n padding: 6, // p-1.5\n },\n option: {\n paddingX: 8, // px-2\n paddingY: 6, // py-1.5\n borderRadius: 4, // rounded\n fontSize: 16, // text-base\n highlightBackground: \"color-surface-secondary\",\n },\n} as const;\n\n// Derived types from KUMO_SELECT_VARIANTS\nexport interface KumoSelectVariantsProps {}\n\nexport function selectVariants(_props: KumoSelectVariantsProps = {}) {\n return cn(\n buttonVariants(),\n \"justify-between font-normal\",\n \"focus:opacity-100 focus-visible:ring-1 focus-visible:ring-kumo-ring *:in-focus:opacity-100\",\n );\n}\n\n/**\n * Normalizes items to array format for Base UI.\n * Object maps are converted to array format so Base UI can properly\n * handle value matching and placeholder display.\n */\nfunction normalizeItems<T>(\n items:\n | Record<string, ReactNode>\n | ReadonlyArray<{ label: ReactNode; value: T }>,\n): ReadonlyArray<{ label: ReactNode; value: T }> {\n if (Array.isArray(items)) {\n return items;\n }\n // Convert object map to array format\n return Object.entries(items).map(([key, label]) => ({\n value: key as T,\n label,\n }));\n}\n\n/**\n * Auto-generates Select.Option elements from items prop.\n * Only used when children are not explicitly provided.\n * Filters out null values (typically used for placeholders).\n */\nfunction renderOptionsFromItems<T>(\n items:\n | Record<string, ReactNode>\n | ReadonlyArray<{ label: ReactNode; value: T }>,\n): ReactNode {\n const normalizedItems = normalizeItems(items);\n\n // Filter out null values and render options\n return normalizedItems\n .filter((item) => item.value !== null)\n .map((item, index) => (\n <Option\n key={typeof item.value === \"string\" ? item.value : `option-${index}`}\n value={item.value}\n >\n {item.label}\n </Option>\n ));\n}\n\ntype SelectPropsGeneric<\n T,\n Multiple extends boolean | undefined = false,\n> = SelectBase.Root.Props<T, Multiple> &\n KumoSelectVariantsProps & {\n multiple?: Multiple;\n renderValue?: (value: Multiple extends true ? T[] : T) => ReactNode;\n className?: string;\n /**\n * Label content for the select.\n * When provided, enables the Field wrapper with a visible label.\n * For accessibility without a visible label, use `aria-label` instead.\n */\n label?: ReactNode;\n /**\n * @deprecated Use `aria-label` for hidden labels instead of `label` + `hideLabel={true}`.\n * When `label` is provided without `hideLabel`, the label is now visible by default (matching Input behavior).\n * This prop will be removed in a future version.\n */\n hideLabel?: boolean;\n placeholder?: string;\n loading?: boolean;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** Helper text displayed below the select */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n /**\n * Container element for the portal. Use this to render the select inside\n * a Shadow DOM or custom container. Overrides `KumoPortalProvider` context.\n * @default document.body (or KumoPortalProvider container if set)\n */\n container?: PortalContainer;\n };\n\n/**\n * Select component props.\n *\n * **Accessible Name Required:** Select should have one of:\n * 1. `label` prop (recommended) - enables Field wrapper with visible label\n * 2. `aria-label` - for selects without visible label (accessibility-only)\n * 3. `aria-labelledby` - for custom label association\n *\n * @example\n * ```tsx\n * // With visible label (recommended)\n * <Select label=\"Country\" onValueChange={setValue}>\n * <Select.Option value=\"us\">United States</Select.Option>\n * <Select.Option value=\"uk\">United Kingdom</Select.Option>\n * </Select>\n *\n * // Without visible label (use aria-label for accessibility)\n * <Select aria-label=\"Select a country\" onValueChange={setValue}>\n * <Select.Option value=\"us\">United States</Select.Option>\n * </Select>\n * ```\n */\nexport interface SelectProps {\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /**\n * Label content for the select.\n * When provided, enables the Field wrapper with a visible label above the select.\n * For accessibility without a visible label, use `aria-label` instead.\n */\n label?: ReactNode;\n /**\n * @deprecated Use `aria-label` for hidden labels instead of `label` + `hideLabel={true}`.\n * When `label` is provided without `hideLabel`, the label is now visible by default (matching Input behavior).\n * This prop will be removed in a future version.\n */\n hideLabel?: boolean;\n /** Placeholder text shown when no value is selected. */\n placeholder?: string;\n /** When `true`, shows a skeleton loader in place of the selected value. */\n loading?: boolean;\n /** Whether the select is disabled. */\n disabled?: boolean;\n /** Whether the select is required. When `false`, shows \"(optional)\" text. */\n required?: boolean;\n /** Tooltip content displayed next to the label via an info icon. */\n labelTooltip?: ReactNode;\n /** Currently selected value (controlled mode). */\n value?: unknown;\n /** Initial value for uncontrolled mode. */\n defaultValue?: unknown;\n /** Callback fired when the selected value changes. */\n onValueChange?: (value: unknown) => void;\n /** Enable multi-select mode. */\n multiple?: boolean;\n /** `Select.Option` elements to render in the dropdown. */\n children?: ReactNode;\n /** Helper text displayed below the select. */\n description?: ReactNode;\n /** Error message string or validation error object with `match` key. */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}\n\n/**\n * Dropdown for selecting a value from a list of options.\n * Wraps Base UI Select with Kumo styling and optional Field integration.\n *\n * @example\n * ```tsx\n * <Select label=\"Fruit\" onValueChange={setFruit}>\n * <Select.Option value=\"apple\">Apple</Select.Option>\n * <Select.Option value=\"banana\">Banana</Select.Option>\n * </Select>\n * ```\n */\nexport function Select<T, Multiple extends boolean | undefined = false>({\n children,\n className,\n renderValue,\n label,\n hideLabel,\n placeholder,\n loading,\n labelTooltip,\n description,\n error,\n required,\n container: containerProp,\n ...props\n}: SelectPropsGeneric<T, Multiple> & { required?: boolean }) {\n const labelId = useId();\n const contextContainer = usePortalContainer();\n const container = containerProp ?? contextContainer ?? undefined;\n const propLookup = props as Record<string, unknown>;\n const ariaLabel = propLookup[\"aria-label\"] as string | undefined;\n const ariaLabelledby = propLookup[\"aria-labelledby\"] as string | undefined;\n // For aria-label, use string label or placeholder (ReactNode labels can't be used for aria-label)\n const fallbackLabel = typeof label === \"string\" ? label : placeholder;\n\n // Deprecation warning for hideLabel\n if (process.env.NODE_ENV !== \"production\" && hideLabel !== undefined) {\n console.warn(\n \"[Kumo Select]: `hideLabel` is deprecated. For hidden labels, use `aria-label` instead of `label` + `hideLabel={true}`.\\n\" +\n \" Migration:\\n\" +\n ' - For visible labels: <Select label=\"Country\" /> (hideLabel no longer needed)\\n' +\n ' - For hidden labels: <Select aria-label=\"Select a country\" /> (remove label and hideLabel)',\n );\n }\n\n // New behavior: label presence determines Field wrapper visibility (like Input)\n // hideLabel is only respected for backward compatibility when explicitly set to true\n const useFieldWrapper = label && hideLabel !== true;\n const triggerLabelledBy = useFieldWrapper\n ? undefined\n : (ariaLabelledby ?? (label ? labelId : undefined));\n const triggerAriaLabel =\n ariaLabel ?? (!triggerLabelledBy ? fallbackLabel : undefined);\n\n // Normalize items to array format for Base UI compatibility\n // This fixes placeholder not showing with object map items\n const normalizedItems = props.items ? normalizeItems(props.items) : undefined;\n\n // Auto-render children from items if children not provided\n const renderedChildren =\n children ?? (props.items ? renderOptionsFromItems(props.items) : null);\n\n const selectControl = (\n <SelectBase.Root\n {...props}\n items={normalizedItems}\n disabled={loading || props.disabled}\n >\n <SelectBase.Trigger\n className={cn(\n buttonVariants(),\n \"justify-between font-normal\",\n \"focus:opacity-100 focus-visible:ring-1 focus-visible:ring-kumo-ring *:in-focus:opacity-100\",\n props.disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n aria-label={triggerAriaLabel}\n aria-labelledby={triggerLabelledBy}\n >\n {loading ? (\n <SkeletonLine className=\"w-32\" />\n ) : (\n <SelectBase.Value\n placeholder={placeholder}\n className=\"min-w-0 truncate\"\n >\n {renderValue}\n </SelectBase.Value>\n )}\n <SelectBase.Icon className=\"flex shrink-0 items-center\">\n <CaretUpDownIcon />\n </SelectBase.Icon>\n </SelectBase.Trigger>\n <SelectBase.Portal container={container}>\n <SelectBase.Positioner>\n <SelectBase.Popup\n className={cn(\n \"overflow-hidden bg-kumo-base text-kumo-default\", // background\n \"rounded-lg shadow-lg ring ring-kumo-ring\", // border part\n // 3px adjustment to account for padding + border differences\n \"min-w-[calc(var(--anchor-width)+3px)] p-1.5\", // spacing\n )}\n >\n {renderedChildren}\n </SelectBase.Popup>\n </SelectBase.Positioner>\n </SelectBase.Portal>\n </SelectBase.Root>\n );\n\n // Use Field wrapper when label is provided and not hidden\n if (useFieldWrapper) {\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 {selectControl}\n </Field>\n );\n }\n\n // Render with standalone label when label is hidden (sr-only)\n // Still show description/error for accessibility and UX\n const normalizedError = error\n ? typeof error === \"string\"\n ? { message: error, match: true as const }\n : error\n : undefined;\n\n return (\n <div className=\"grid gap-2\">\n {label && (\n <span id={labelId} className=\"sr-only\">\n {label}\n </span>\n )}\n {selectControl}\n {normalizedError ? (\n <span className=\"text-sm text-kumo-danger\">\n {normalizedError.message}\n </span>\n ) : (\n description && (\n <span className=\"text-sm leading-snug text-kumo-subtle\">\n {description}\n </span>\n )\n )}\n </div>\n );\n}\n\ntype OptionProps<T> = {\n children: ReactNode;\n value: T;\n};\n\nfunction Option<T>({ children, value }: OptionProps<T>) {\n return (\n <SelectBase.Item\n value={value}\n className=\"group flex cursor-pointer items-center justify-between gap-2 rounded px-2 py-1.5 text-base data-highlighted:bg-kumo-tint\"\n >\n <SelectBase.ItemText>{children}</SelectBase.ItemText>\n <SelectBase.ItemIndicator>\n <CheckIcon />\n </SelectBase.ItemIndicator>\n </SelectBase.Item>\n );\n}\n\nSelect.Option = Option;\n"],"names":["normalizeItems","items","key","label","renderOptionsFromItems","item","index","jsx","Option","Select","children","className","renderValue","hideLabel","placeholder","loading","labelTooltip","description","error","required","containerProp","props","labelId","useId","contextContainer","usePortalContainer","container","propLookup","ariaLabel","ariaLabelledby","fallbackLabel","useFieldWrapper","triggerLabelledBy","triggerAriaLabel","normalizedItems","renderedChildren","selectControl","jsxs","SelectBase.Root","SelectBase.Trigger","cn","buttonVariants","SkeletonLine","SelectBase.Value","SelectBase.Icon","CaretUpDownIcon","SelectBase.Portal","SelectBase.Positioner","SelectBase.Popup","Field","normalizedError","value","SelectBase.Item","SelectBase.ItemText","SelectBase.ItemIndicator","CheckIcon"],"mappings":"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"}
@@ -1,15 +1,15 @@
1
1
  "use client";
2
- import { jsxs as b, Fragment as ce, jsx as r } from "react/jsx-runtime";
2
+ import { jsxs as y, Fragment as ce, jsx as a } from "react/jsx-runtime";
3
3
  import { EyeSlash as ue, Eye as pe } from "@phosphor-icons/react";
4
- import { forwardRef as de, useState as w, useRef as N, useId as T, useCallback as l, useEffect as fe } from "react";
4
+ import { forwardRef as de, useState as C, useRef as N, useId as T, useCallback as c, useEffect as fe } from "react";
5
5
  import { c as p } from "./cn-ct4n7r74mh8y0f48.js";
6
- import { K as me, i as ve } from "./input-ko2dne1givlxq7sz.js";
7
- import { F as ge } from "./field-lweivfadxgpqhuqi.js";
8
- import { I as he } from "./vendor-base-ui-cpvkrhz4zgw9nw2b.js";
6
+ import { K as me, i as he } from "./input-kvhyo3p4859bexvx.js";
7
+ import { F as ve } from "./field-fq504lyu7ttsh5m9.js";
8
+ import { I as ge } from "./vendor-base-ui-n30qblevnpk9cc5c.js";
9
9
  const Te = me, M = {
10
10
  size: "base",
11
11
  variant: "default"
12
- }, ye = de(
12
+ }, be = de(
13
13
  ({
14
14
  value: R,
15
15
  defaultValue: B = "",
@@ -17,120 +17,122 @@ const Te = me, M = {
17
17
  onValueChange: E,
18
18
  onCopy: k,
19
19
  size: t = M.size,
20
- variant: $ = M.variant,
21
- disabled: i = !1,
20
+ variant: j = M.variant,
21
+ disabled: r = !1,
22
22
  readOnly: d = !1,
23
- id: j,
23
+ id: $,
24
24
  autoComplete: H = "off",
25
25
  className: L,
26
- label: h,
26
+ label: g,
27
27
  labelTooltip: X,
28
28
  description: Y,
29
- error: y,
29
+ error: b,
30
30
  required: W,
31
31
  ...q
32
32
  }, f) => {
33
- const G = typeof h == "string" ? h : "Sensitive value", x = R !== void 0, [J, O] = w(B), m = x ? R : J, n = m.length > 0, [o, c] = w(
34
- () => n ? "masked" : "empty"
35
- ), [v, I] = w(!1), C = N(null), u = N(null), V = T(), Q = T(), Z = j ?? Q, K = T(), z = l(
33
+ const G = typeof g == "string" ? g : "Sensitive value", x = R !== void 0, [J, O] = C(B), m = x ? R : J, o = m.length > 0, [n, l] = C(
34
+ () => o ? "masked" : "empty"
35
+ ), [h, w] = C(!1), I = N(null), u = N(null), V = T(), Q = T(), Z = $ ?? Q, K = T(), z = c(
36
36
  (e) => {
37
- C.current = e, typeof f == "function" ? f(e) : f && (f.current = e);
37
+ I.current = e, typeof f == "function" ? f(e) : f && (f.current = e);
38
38
  },
39
39
  [f]
40
40
  );
41
41
  fe(() => {
42
- if (v) {
43
- const e = setTimeout(() => I(!1), 2e3);
42
+ if (h) {
43
+ const e = setTimeout(() => w(!1), 2e3);
44
44
  return () => clearTimeout(e);
45
45
  }
46
- }, [v]);
47
- const ee = l(
46
+ }, [h]);
47
+ const ee = c(
48
48
  async (e) => {
49
49
  e.stopPropagation();
50
50
  try {
51
51
  if (typeof navigator < "u" && navigator.clipboard && typeof navigator.clipboard.writeText == "function") {
52
- await navigator.clipboard.writeText(m), I(!0), k?.();
52
+ await navigator.clipboard.writeText(m), w(!0), k?.();
53
53
  return;
54
54
  }
55
55
  } catch {
56
56
  }
57
57
  if (typeof document < "u") {
58
- const a = document.createElement("textarea");
59
- a.value = m, a.setAttribute("readonly", ""), a.style.position = "absolute", a.style.left = "-9999px", document.body.appendChild(a);
60
- const g = document.getSelection(), F = g?.rangeCount ? g.getRangeAt(0) : null;
61
- a.select();
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 v = document.getSelection(), F = v?.rangeCount ? v.getRangeAt(0) : null;
61
+ i.select();
62
62
  try {
63
- document.execCommand("copy"), I(!0), k?.();
63
+ document.execCommand("copy"), w(!0), k?.();
64
64
  } catch (le) {
65
65
  console.warn("Clipboard copy failed", le);
66
66
  } finally {
67
- document.body.removeChild(a), F && (g?.removeAllRanges(), g?.addRange(F));
67
+ document.body.removeChild(i), F && (v?.removeAllRanges(), v?.addRange(F));
68
68
  }
69
69
  }
70
70
  },
71
71
  [m, k]
72
- ), A = N(n);
73
- A.current !== n && (A.current = n, !n && o === "masked" && c("empty"));
74
- const te = l(
72
+ ), A = N(o);
73
+ A.current !== o && (A.current = o, !o && n === "masked" && l("empty"));
74
+ const te = c(
75
75
  (e) => {
76
- if (!i) {
76
+ if (!r) {
77
77
  if (u.current) {
78
- const a = u.current.getBoundingClientRect();
79
- if (!(e.clientX >= a.left && e.clientX <= a.right && e.clientY >= a.top && e.clientY <= a.bottom)) return;
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;
80
80
  }
81
- o === "masked" && n && (c("revealed"), d || setTimeout(() => C.current?.focus(), 0));
81
+ n === "masked" && o && (l("revealed"), d || setTimeout(() => I.current?.focus(), 0));
82
82
  }
83
83
  },
84
- [o, n, i, d]
85
- ), ne = l(
84
+ [n, o, r, d]
85
+ ), ne = c(
86
86
  (e) => {
87
- e.stopPropagation(), o === "revealed" ? c("masked") : o === "empty" && n && c("revealed");
87
+ e.stopPropagation(), n === "revealed" ? l("masked") : n === "empty" && o && l("revealed");
88
88
  },
89
- [o, n]
90
- ), oe = l(
89
+ [n, o]
90
+ ), oe = c(
91
91
  (e) => {
92
- const a = e.target.value;
93
- x || O(a), S?.(e), E?.(a);
92
+ const i = e.target.value;
93
+ x || O(i), n === "empty" && i.length > 0 && l("revealed"), S?.(e), E?.(i);
94
94
  },
95
- [x, S, E]
96
- ), ae = l(
95
+ [x, S, E, n]
96
+ ), ie = c(
97
97
  (e) => {
98
- u.current && e.relatedTarget instanceof Node && u.current.contains(e.relatedTarget) || n && c("masked");
98
+ u.current && e.relatedTarget instanceof Node && u.current.contains(e.relatedTarget) || o && l("masked");
99
99
  },
100
- [n]
101
- ), ie = l(
100
+ [o]
101
+ ), re = c(
102
102
  (e) => {
103
- i || o === "masked" && n && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), c("revealed"), d || setTimeout(() => C.current?.focus(), 0));
103
+ r || n === "masked" && o && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), l("revealed"), d || setTimeout(() => I.current?.focus(), 0));
104
104
  },
105
- [o, n, i, d]
106
- ), re = l(
105
+ [n, o, r, d]
106
+ ), ae = c(
107
107
  (e) => {
108
- o === "revealed" && e.key === "Escape" && (c("masked"), setTimeout(() => u.current?.focus(), 0));
108
+ n === "revealed" && e.key === "Escape" && (l("masked"), setTimeout(() => u.current?.focus(), 0));
109
109
  },
110
- [o]
111
- ), s = o === "masked" && n, _ = !i && (o === "revealed" || o === "empty" && n), se = t === "xs" || t === "sm" ? "size-3" : "size-4", D = p(
112
- ve({ size: t, variant: $, parentFocusIndicator: !0 }),
110
+ [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 }),
113
113
  "group/container relative flex w-full items-center",
114
- s && !i && "cursor-pointer",
115
- i && "cursor-not-allowed",
114
+ // Show browser-native focus outline on container when child input is focused
115
+ "focus-within:outline focus-within:outline-2 focus-within:outline-[-webkit-focus-ring-color]",
116
+ s && !r && "cursor-pointer",
117
+ r && "cursor-not-allowed",
116
118
  L
117
- ), P = /* @__PURE__ */ b(ce, { children: [
118
- /* @__PURE__ */ r(
119
- he,
119
+ ), P = /* @__PURE__ */ y(ce, { children: [
120
+ /* @__PURE__ */ a(
121
+ ge,
120
122
  {
121
123
  ref: z,
122
124
  id: Z,
123
- type: o === "revealed" ? "text" : "password",
125
+ type: n === "revealed" ? "text" : "password",
124
126
  value: m,
125
127
  onChange: oe,
126
- onBlur: ae,
127
- onKeyDown: re,
128
- disabled: i,
128
+ onBlur: ie,
129
+ onKeyDown: ae,
130
+ disabled: r,
129
131
  readOnly: d || s,
130
132
  autoComplete: H,
131
133
  tabIndex: s ? -1 : 0,
132
134
  className: p(
133
- "w-full border-0 bg-transparent p-0 text-kumo-default ring-0 kumo-input-placeholder disabled:cursor-not-allowed disabled:text-kumo-subtle",
135
+ "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",
134
136
  t === "xs" && "pr-5",
135
137
  t === "sm" && "pr-6",
136
138
  t === "base" && "pr-8",
@@ -141,7 +143,7 @@ const Te = me, M = {
141
143
  ...q
142
144
  }
143
145
  ),
144
- /* @__PURE__ */ r(
146
+ /* @__PURE__ */ a(
145
147
  "span",
146
148
  {
147
149
  className: p(
@@ -166,30 +168,32 @@ const Te = me, M = {
166
168
  "group/mask"
167
169
  ),
168
170
  "aria-hidden": "true",
169
- children: /* @__PURE__ */ b("span", { className: "relative", children: [
170
- /* @__PURE__ */ r(
171
+ children: /* @__PURE__ */ y("span", { className: "relative", children: [
172
+ /* @__PURE__ */ a(
171
173
  "span",
172
174
  {
173
175
  className: p(
174
- s && !i && "group-focus-within/container:invisible group-hover/mask:invisible"
176
+ s && !r && "group-focus-within/container:invisible group-hover/mask:invisible"
175
177
  ),
176
178
  children: "••••••••"
177
179
  }
178
180
  ),
179
- 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" })
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" })
180
182
  ] })
181
183
  }
182
184
  ),
183
- /* @__PURE__ */ r(
185
+ /* @__PURE__ */ a(
184
186
  "button",
185
187
  {
186
188
  type: "button",
187
189
  onClick: ne,
188
190
  onKeyDown: (e) => e.stopPropagation(),
189
- "aria-label": o === "revealed" ? "Hide value" : "Reveal value",
191
+ "aria-label": n === "revealed" ? "Hide value" : "Reveal value",
190
192
  tabIndex: _ ? 0 : -1,
191
193
  className: p(
192
194
  "absolute top-1/2 right-0 -translate-y-1/2 cursor-pointer text-kumo-subtle hover:text-kumo-default focus:text-kumo-default focus-visible:ring-1 focus-visible:ring-kumo-ring focus-visible:rounded-sm",
195
+ // Defensive styles to prevent global CSS pollution (e.g., button { background: gray })
196
+ "bg-transparent border-none shadow-none p-0 m-0 h-auto min-h-0 inline-flex items-center justify-center",
193
197
  // Match right padding from inputVariants
194
198
  t === "xs" && "right-1.5",
195
199
  t === "sm" && "right-2",
@@ -198,61 +202,63 @@ const Te = me, M = {
198
202
  se,
199
203
  !_ && "pointer-events-none opacity-0"
200
204
  ),
201
- children: o === "revealed" ? /* @__PURE__ */ r(ue, { className: "size-full" }) : /* @__PURE__ */ r(pe, { className: "size-full" })
205
+ children: n === "revealed" ? /* @__PURE__ */ a(ue, { className: "size-full" }) : /* @__PURE__ */ a(pe, { className: "size-full" })
202
206
  }
203
207
  ),
204
- n && !i && /* @__PURE__ */ r(
208
+ o && !r && /* @__PURE__ */ a(
205
209
  "button",
206
210
  {
207
211
  type: "button",
208
212
  onClick: ee,
209
213
  onKeyDown: (e) => e.stopPropagation(),
210
- "aria-label": v ? "Copied" : "Copy to clipboard",
214
+ "aria-label": h ? "Copied" : "Copy to clipboard",
211
215
  className: p(
212
- "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-visible:outline focus-visible:outline-offset-1 focus-visible:outline-kumo-ring"
216
+ "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-visible:outline focus-visible:outline-offset-1 focus-visible:outline-kumo-ring",
217
+ // Defensive styles to prevent global CSS pollution
218
+ "border-none shadow-none m-0 h-auto min-h-0"
213
219
  ),
214
- children: v ? "Copied" : "Copy"
220
+ children: h ? "Copied" : "Copy"
215
221
  }
216
222
  )
217
- ] }), U = /* @__PURE__ */ b("div", { children: [
218
- s ? /* @__PURE__ */ r(
223
+ ] }), U = /* @__PURE__ */ y("div", { children: [
224
+ s ? /* @__PURE__ */ a(
219
225
  "div",
220
226
  {
221
227
  ref: u,
222
228
  role: "button",
223
- tabIndex: i ? -1 : 0,
229
+ tabIndex: r ? -1 : 0,
224
230
  className: D,
225
231
  onClick: te,
226
- onKeyDown: ie,
232
+ onKeyDown: re,
227
233
  "aria-label": `${G}, masked.`,
228
234
  "aria-describedby": `${K} ${V}`,
229
- "aria-disabled": i,
235
+ "aria-disabled": r,
230
236
  children: P
231
237
  }
232
- ) : /* @__PURE__ */ r("div", { ref: u, className: D, children: P }),
233
- s && /* @__PURE__ */ r("span", { id: K, className: "sr-only", children: "Click or press Enter to reveal." }),
234
- /* @__PURE__ */ b("span", { id: V, className: "sr-only", "aria-live": "polite", children: [
235
- o === "masked" && n && "Value hidden",
236
- v && "Copied to clipboard"
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: [
241
+ n === "masked" && o && "Value hidden",
242
+ h && "Copied to clipboard"
237
243
  ] })
238
244
  ] });
239
- return h ? /* @__PURE__ */ r(
240
- ge,
245
+ return g ? /* @__PURE__ */ a(
246
+ ve,
241
247
  {
242
- label: h,
248
+ label: g,
243
249
  required: W,
244
250
  labelTooltip: X,
245
251
  description: Y,
246
- error: y ? typeof y == "string" ? { message: y, match: !0 } : y : void 0,
252
+ error: b ? typeof b == "string" ? { message: b, match: !0 } : b : void 0,
247
253
  children: U
248
254
  }
249
255
  ) : U;
250
256
  }
251
257
  );
252
- ye.displayName = "SensitiveInput";
258
+ be.displayName = "SensitiveInput";
253
259
  export {
254
260
  Te as K,
255
- ye as S,
261
+ be as S,
256
262
  M as a
257
263
  };
258
- //# sourceMappingURL=sensitive-input-rjpykxn2llh0thx1.js.map
264
+ //# sourceMappingURL=sensitive-input-kznmknpp5h1grc6k.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensitive-input-kznmknpp5h1grc6k.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 = KUMO_SENSITIVE_INPUT_DEFAULT_VARIANTS.variant,\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 // 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-[-webkit-focus-ring-color]\",\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 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-visible:ring-1 focus-visible:ring-kumo-ring 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 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-visible:outline focus-visible:outline-offset-1 focus-visible:outline-kumo-ring\",\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 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","variant","disabled","readOnly","id","autoComplete","className","label","labelTooltip","description","error","required","inputProps","ref","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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"}