@cloudflare/kumo 2.0.1 → 2.0.3

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 (158) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/ai/component-registry.json +227 -16
  3. package/ai/component-registry.md +324 -8
  4. package/ai/schemas.ts +5 -2
  5. package/dist/.build-complete +1 -1
  6. package/dist/ai/schemas.d.ts +10 -4
  7. package/dist/ai/schemas.d.ts.map +1 -1
  8. package/dist/ai/schemas.js +510 -504
  9. package/dist/ai/schemas.js.map +1 -1
  10. package/dist/chunks/{autocomplete-48aq0d244bs2e8zv.js → autocomplete-ln55iimq2n2s5uex.js} +27 -26
  11. package/dist/chunks/autocomplete-ln55iimq2n2s5uex.js.map +1 -0
  12. package/dist/chunks/{badge-dan90i0rzy4pwa1j.js → badge-kqox9toi0sygfbno.js} +16 -16
  13. package/dist/chunks/badge-kqox9toi0sygfbno.js.map +1 -0
  14. package/dist/chunks/{banner-eiwcnk7ts21s3bnb.js → banner-eux4y8xaogjg64af.js} +32 -31
  15. package/dist/chunks/banner-eux4y8xaogjg64af.js.map +1 -0
  16. package/dist/chunks/{breadcrumbs-cxcwf2l1ki3ffg5d.js → breadcrumbs-do6uyvm4msqus0sz.js} +33 -32
  17. package/dist/chunks/breadcrumbs-do6uyvm4msqus0sz.js.map +1 -0
  18. package/dist/chunks/{button-6by9ntsa3nj553mq.js → button-dh366jtvswxj0fw3.js} +63 -62
  19. package/dist/chunks/button-dh366jtvswxj0fw3.js.map +1 -0
  20. package/dist/chunks/{checkbox-hvxfvhtx1qjo2mww.js → checkbox-cf2pwdupyjweg184.js} +2 -2
  21. package/dist/chunks/checkbox-cf2pwdupyjweg184.js.map +1 -0
  22. package/dist/chunks/{clipboard-text-hswydzx3iql369sd.js → clipboard-text-hn2uwdj4ozenezd5.js} +57 -56
  23. package/dist/chunks/clipboard-text-hn2uwdj4ozenezd5.js.map +1 -0
  24. package/dist/chunks/{code-f9v1ikwhekqw274q.js → code-bbnjm8vk9hxl129r.js} +20 -19
  25. package/dist/chunks/code-bbnjm8vk9hxl129r.js.map +1 -0
  26. package/dist/chunks/{collapsible-k8urhi16pg90jvxa.js → collapsible-nlp2jvcyuzxmq28o.js} +12 -11
  27. package/dist/chunks/{collapsible-k8urhi16pg90jvxa.js.map → collapsible-nlp2jvcyuzxmq28o.js.map} +1 -1
  28. package/dist/chunks/{combobox-fq36ye0hstote16x.js → combobox-fivcg1oorkmmmk78.js} +11 -10
  29. package/dist/chunks/combobox-fivcg1oorkmmmk78.js.map +1 -0
  30. package/dist/chunks/{command-palette-md65owxt5hv4rt9r.js → command-palette-kgiso245exdons4r.js} +2 -2
  31. package/dist/chunks/{command-palette-md65owxt5hv4rt9r.js.map → command-palette-kgiso245exdons4r.js.map} +1 -1
  32. package/dist/chunks/{dialog-k3f1fbam6nt96k8x.js → dialog-mqpvaidy0vnjwrfp.js} +16 -15
  33. package/dist/chunks/dialog-mqpvaidy0vnjwrfp.js.map +1 -0
  34. package/dist/chunks/{dropdown-zbax0zowy6m9zhmt.js → dropdown-gp5iptj1niq14lpv.js} +76 -75
  35. package/dist/chunks/dropdown-gp5iptj1niq14lpv.js.map +1 -0
  36. package/dist/chunks/{empty-b82oer7npkhtkx7k.js → empty-fr78te81o3qaj3in.js} +27 -26
  37. package/dist/chunks/empty-fr78te81o3qaj3in.js.map +1 -0
  38. package/dist/chunks/{field-c0wf94plit2gci59.js → field-dgf36p7cmz1crlnu.js} +2 -2
  39. package/dist/chunks/{field-c0wf94plit2gci59.js.map → field-dgf36p7cmz1crlnu.js.map} +1 -1
  40. package/dist/chunks/{grid-hj1ylz16p7g5uelh.js → grid-do93dv1rjggqxx7p.js} +30 -29
  41. package/dist/chunks/grid-do93dv1rjggqxx7p.js.map +1 -0
  42. package/dist/chunks/{input-ncfowphv81yq7fyy.js → input-2y9vg81trmamkb6k.js} +51 -50
  43. package/dist/chunks/input-2y9vg81trmamkb6k.js.map +1 -0
  44. package/dist/chunks/{input-area-bkyzu6f7gsck479h.js → input-area-i5wulip5pau3u6ss.js} +3 -3
  45. package/dist/chunks/{input-area-bkyzu6f7gsck479h.js.map → input-area-i5wulip5pau3u6ss.js.map} +1 -1
  46. package/dist/chunks/{input-group-bidweffa0zyg8gt0.js → input-group-bm9wxzovpvzn1c25.js} +4 -4
  47. package/dist/chunks/{input-group-bidweffa0zyg8gt0.js.map → input-group-bm9wxzovpvzn1c25.js.map} +1 -1
  48. package/dist/chunks/{label-c3h9i3y4wiccelt7.js → label-efa0uvb8zqyjwpc8.js} +2 -2
  49. package/dist/chunks/{label-c3h9i3y4wiccelt7.js.map → label-efa0uvb8zqyjwpc8.js.map} +1 -1
  50. package/dist/chunks/{link-kt74pxkud4olmcer.js → link-m9hlspftl34nseme.js} +28 -27
  51. package/dist/chunks/link-m9hlspftl34nseme.js.map +1 -0
  52. package/dist/chunks/{loader-hr2w7cpqeev3p3vl.js → loader-g8a6j76ue5nq0lr8.js} +15 -14
  53. package/dist/chunks/loader-g8a6j76ue5nq0lr8.js.map +1 -0
  54. package/dist/chunks/{pagination-jb3mncivbwsoi1se.js → pagination-fdmcwreb27eej9l3.js} +3 -3
  55. package/dist/chunks/pagination-fdmcwreb27eej9l3.js.map +1 -0
  56. package/dist/chunks/{radio-datzh3pilz8ojak1.js → radio-f95mt237ru8fyc03.js} +44 -43
  57. package/dist/chunks/radio-f95mt237ru8fyc03.js.map +1 -0
  58. package/dist/chunks/resolve-variant-gw6eh7fa4st8ej7m.js +11 -0
  59. package/dist/chunks/resolve-variant-gw6eh7fa4st8ej7m.js.map +1 -0
  60. package/dist/chunks/{select-g261chvosodu22i8.js → select-j8evv2iblgs5fa9s.js} +4 -4
  61. package/dist/chunks/{select-g261chvosodu22i8.js.map → select-j8evv2iblgs5fa9s.js.map} +1 -1
  62. package/dist/chunks/{sensitive-input-cijagk551mesdtk4.js → sensitive-input-cmb9jt42bv8jftei.js} +3 -3
  63. package/dist/chunks/{sensitive-input-cijagk551mesdtk4.js.map → sensitive-input-cmb9jt42bv8jftei.js.map} +1 -1
  64. package/dist/chunks/surface-k0e8mq1x00b7i8r6.js.map +1 -1
  65. package/dist/chunks/{switch-jdfsr3j3oa1qxegw.js → switch-c4qjga6x3axmoi20.js} +2 -2
  66. package/dist/chunks/switch-c4qjga6x3axmoi20.js.map +1 -0
  67. package/dist/chunks/{table-iudje0lva0z68jto.js → table-jvqy3tu48xa75n2t.js} +56 -55
  68. package/dist/chunks/table-jvqy3tu48xa75n2t.js.map +1 -0
  69. package/dist/chunks/{text-f7t467waymhb30sx.js → text-be7ehenoyldhyjma.js} +32 -28
  70. package/dist/chunks/text-be7ehenoyldhyjma.js.map +1 -0
  71. package/dist/chunks/{toast-h573o0tc7tefivk2.js → toast-c7kqwuj7qj9dx6gs.js} +75 -74
  72. package/dist/chunks/toast-c7kqwuj7qj9dx6gs.js.map +1 -0
  73. package/dist/chunks/tooltip-odudhkxe282wxinq.js.map +1 -1
  74. package/dist/code.js +1 -1
  75. package/dist/components/autocomplete.js +1 -1
  76. package/dist/components/badge.js +1 -1
  77. package/dist/components/banner.js +1 -1
  78. package/dist/components/breadcrumbs.js +1 -1
  79. package/dist/components/button.js +1 -1
  80. package/dist/components/checkbox.js +1 -1
  81. package/dist/components/clipboard-text.js +1 -1
  82. package/dist/components/code.js +1 -1
  83. package/dist/components/collapsible.js +1 -1
  84. package/dist/components/combobox.js +1 -1
  85. package/dist/components/command-palette.js +1 -1
  86. package/dist/components/dialog.js +1 -1
  87. package/dist/components/dropdown.js +1 -1
  88. package/dist/components/empty.js +1 -1
  89. package/dist/components/field.js +1 -1
  90. package/dist/components/grid.js +1 -1
  91. package/dist/components/input-group.js +1 -1
  92. package/dist/components/input.js +3 -3
  93. package/dist/components/label.js +1 -1
  94. package/dist/components/link.js +1 -1
  95. package/dist/components/loader.js +1 -1
  96. package/dist/components/pagination.js +1 -1
  97. package/dist/components/radio.js +1 -1
  98. package/dist/components/select.js +1 -1
  99. package/dist/components/sensitive-input.js +1 -1
  100. package/dist/components/switch.js +1 -1
  101. package/dist/components/table.js +1 -1
  102. package/dist/components/text.js +1 -1
  103. package/dist/components/toast.js +1 -1
  104. package/dist/index.js +34 -34
  105. package/dist/src/components/autocomplete/autocomplete.d.ts.map +1 -1
  106. package/dist/src/components/badge/badge.d.ts.map +1 -1
  107. package/dist/src/components/banner/banner.d.ts.map +1 -1
  108. package/dist/src/components/breadcrumbs/breadcrumbs.d.ts.map +1 -1
  109. package/dist/src/components/button/button.d.ts.map +1 -1
  110. package/dist/src/components/checkbox/checkbox.d.ts.map +1 -1
  111. package/dist/src/components/clipboard-text/clipboard-text.d.ts.map +1 -1
  112. package/dist/src/components/code/code.d.ts.map +1 -1
  113. package/dist/src/components/collapsible/collapsible.d.ts +1 -1
  114. package/dist/src/components/collapsible/collapsible.d.ts.map +1 -1
  115. package/dist/src/components/combobox/combobox.d.ts.map +1 -1
  116. package/dist/src/components/dialog/dialog.d.ts.map +1 -1
  117. package/dist/src/components/dropdown/dropdown.d.ts.map +1 -1
  118. package/dist/src/components/empty/empty.d.ts.map +1 -1
  119. package/dist/src/components/grid/grid.d.ts.map +1 -1
  120. package/dist/src/components/input/input.d.ts.map +1 -1
  121. package/dist/src/components/link/link.d.ts.map +1 -1
  122. package/dist/src/components/loader/loader.d.ts.map +1 -1
  123. package/dist/src/components/pagination/pagination.d.ts.map +1 -1
  124. package/dist/src/components/radio/radio.d.ts.map +1 -1
  125. package/dist/src/components/surface/surface.d.ts.map +1 -1
  126. package/dist/src/components/switch/switch.d.ts.map +1 -1
  127. package/dist/src/components/table/table.d.ts.map +1 -1
  128. package/dist/src/components/text/text.d.ts.map +1 -1
  129. package/dist/src/components/toast/toast.d.ts.map +1 -1
  130. package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
  131. package/dist/src/utils/resolve-variant.d.ts +27 -0
  132. package/dist/src/utils/resolve-variant.d.ts.map +1 -0
  133. package/package.json +1 -1
  134. package/scripts/component-registry/index.test.ts +42 -0
  135. package/scripts/component-registry/index.ts +18 -4
  136. package/scripts/component-registry/metadata.ts +239 -4
  137. package/dist/chunks/autocomplete-48aq0d244bs2e8zv.js.map +0 -1
  138. package/dist/chunks/badge-dan90i0rzy4pwa1j.js.map +0 -1
  139. package/dist/chunks/banner-eiwcnk7ts21s3bnb.js.map +0 -1
  140. package/dist/chunks/breadcrumbs-cxcwf2l1ki3ffg5d.js.map +0 -1
  141. package/dist/chunks/button-6by9ntsa3nj553mq.js.map +0 -1
  142. package/dist/chunks/checkbox-hvxfvhtx1qjo2mww.js.map +0 -1
  143. package/dist/chunks/clipboard-text-hswydzx3iql369sd.js.map +0 -1
  144. package/dist/chunks/code-f9v1ikwhekqw274q.js.map +0 -1
  145. package/dist/chunks/combobox-fq36ye0hstote16x.js.map +0 -1
  146. package/dist/chunks/dialog-k3f1fbam6nt96k8x.js.map +0 -1
  147. package/dist/chunks/dropdown-zbax0zowy6m9zhmt.js.map +0 -1
  148. package/dist/chunks/empty-b82oer7npkhtkx7k.js.map +0 -1
  149. package/dist/chunks/grid-hj1ylz16p7g5uelh.js.map +0 -1
  150. package/dist/chunks/input-ncfowphv81yq7fyy.js.map +0 -1
  151. package/dist/chunks/link-kt74pxkud4olmcer.js.map +0 -1
  152. package/dist/chunks/loader-hr2w7cpqeev3p3vl.js.map +0 -1
  153. package/dist/chunks/pagination-jb3mncivbwsoi1se.js.map +0 -1
  154. package/dist/chunks/radio-datzh3pilz8ojak1.js.map +0 -1
  155. package/dist/chunks/switch-jdfsr3j3oa1qxegw.js.map +0 -1
  156. package/dist/chunks/table-iudje0lva0z68jto.js.map +0 -1
  157. package/dist/chunks/text-f7t467waymhb30sx.js.map +0 -1
  158. package/dist/chunks/toast-h573o0tc7tefivk2.js.map +0 -1
@@ -1,12 +1,13 @@
1
1
  "use client";
2
- import { jsx as a, jsxs as h } from "react/jsx-runtime";
3
- import f from "react";
4
- import { ArrowsClockwise as w } from "@phosphor-icons/react";
5
- import { L as N } from "./loader-hr2w7cpqeev3p3vl.js";
6
- import { T } from "./tooltip-odudhkxe282wxinq.js";
7
- import { c } from "./cn-ct4n7r74mh8y0f48.js";
8
- import { u as B } from "./link-provider-mn2voeohon7cj9o4.js";
9
- const i = {
2
+ import { jsx as r, jsxs as x } from "react/jsx-runtime";
3
+ import h from "react";
4
+ import { ArrowsClockwise as N } from "@phosphor-icons/react";
5
+ import { L as T } from "./loader-g8a6j76ue5nq0lr8.js";
6
+ import { T as B } from "./tooltip-odudhkxe282wxinq.js";
7
+ import { c as l } from "./cn-ct4n7r74mh8y0f48.js";
8
+ import { r as c } from "./resolve-variant-gw6eh7fa4st8ej7m.js";
9
+ import { u as L } from "./link-provider-mn2voeohon7cj9o4.js";
10
+ const u = {
10
11
  shape: {
11
12
  base: {
12
13
  classes: "",
@@ -71,18 +72,18 @@ const i = {
71
72
  description: "Bordered button with transparent background"
72
73
  }
73
74
  }
74
- }, g = {
75
+ }, a = {
75
76
  shape: "base",
76
77
  size: "base",
77
78
  variant: "secondary"
78
79
  };
79
- function x({
80
- variant: s = g.variant,
81
- size: t = g.size,
82
- shape: e = g.shape
80
+ function y({
81
+ variant: s = a.variant,
82
+ size: t = a.size,
83
+ shape: e = a.shape
83
84
  } = {}) {
84
85
  const o = e === "square" || e === "circle";
85
- return c(
86
+ return l(
86
87
  // Base styles
87
88
  "group flex w-max shrink-0 items-center font-medium select-none",
88
89
  "border-0 shadow-xs",
@@ -91,102 +92,102 @@ function x({
91
92
  // Disabled state
92
93
  "disabled:cursor-not-allowed disabled:text-kumo-subtle",
93
94
  // Apply variant, size, shape styles from KUMO_BUTTON_VARIANTS
94
- i.variant[s].classes,
95
- i.size[t].classes,
96
- i.shape[e].classes,
97
- o && i.compactSize[t].classes
95
+ c(u.variant, s, a.variant).classes,
96
+ c(u.size, t, a.size).classes,
97
+ c(u.shape, e, a.shape).classes,
98
+ o && c(u.compactSize, t, a.size).classes
98
99
  );
99
100
  }
100
- const y = (s) => s ? f.isValidElement(s) ? s : /* @__PURE__ */ a(s, {}) : null, v = f.forwardRef(
101
+ const v = (s) => s ? h.isValidElement(s) ? s : /* @__PURE__ */ r(s, {}) : null, z = h.forwardRef(
101
102
  ({
102
103
  children: s,
103
104
  className: t,
104
105
  disabled: e,
105
106
  loading: o,
106
- shape: u = "base",
107
- size: r = "base",
108
- variant: l = "secondary",
109
- icon: d,
110
- title: n,
111
- ...b
112
- }, m) => {
113
- const { type: p, ...z } = b, k = /* @__PURE__ */ h(
107
+ shape: d = "base",
108
+ size: n = "base",
109
+ variant: b = "secondary",
110
+ icon: m,
111
+ title: i,
112
+ ...p
113
+ }, g) => {
114
+ const { type: f, ...w } = p, k = /* @__PURE__ */ x(
114
115
  "button",
115
116
  {
116
- ref: m,
117
- className: c(
118
- x({ variant: l, size: r, shape: u }),
117
+ ref: g,
118
+ className: l(
119
+ y({ variant: b, size: n, shape: d }),
119
120
  e && "cursor-not-allowed opacity-50",
120
121
  t
121
122
  ),
122
123
  disabled: o || e,
123
- type: p ?? "button",
124
- ...z,
124
+ type: f ?? "button",
125
+ ...w,
125
126
  children: [
126
- o && /* @__PURE__ */ a(N, { size: r === "lg" ? 16 : 14 }),
127
- !o && y(d),
127
+ o && /* @__PURE__ */ r(T, { size: n === "lg" ? 16 : 14 }),
128
+ !o && v(m),
128
129
  s
129
130
  ]
130
131
  }
131
132
  );
132
- return n ? /* @__PURE__ */ a(T, { content: n, render: k }) : k;
133
+ return i ? /* @__PURE__ */ r(B, { content: i, render: k }) : k;
133
134
  }
134
135
  );
135
- v.displayName = "Button";
136
- const j = ({
136
+ z.displayName = "Button";
137
+ const q = ({
137
138
  "aria-label": s = "Refresh",
138
139
  loading: t,
139
140
  ...e
140
- }) => /* @__PURE__ */ a(v, { shape: "square", "aria-label": s, ...e, children: /* @__PURE__ */ a(
141
- w,
141
+ }) => /* @__PURE__ */ r(z, { shape: "square", "aria-label": s, ...e, children: /* @__PURE__ */ r(
142
+ N,
142
143
  {
143
- className: c({
144
+ className: l({
144
145
  "animate-refresh": t,
145
146
  "size-4.5": e.size === "base" || !e.size,
146
147
  "size-4": e.size === "sm",
147
148
  "size-5": e.size === "lg"
148
149
  })
149
150
  }
150
- ) }), L = f.forwardRef(
151
+ ) }), S = h.forwardRef(
151
152
  ({
152
153
  children: s,
153
154
  className: t,
154
155
  external: e,
155
156
  href: o,
156
- shape: u = "base",
157
- size: r = "base",
158
- variant: l = "ghost",
159
- icon: d,
157
+ shape: d = "base",
158
+ size: n = "base",
159
+ variant: b = "ghost",
160
+ icon: m,
160
161
  // linksExternal = false,
161
- ...n
162
- }, b) => {
163
- const m = B(), p = e ? { target: "_blank", rel: "noopener noreferrer" } : {};
164
- return /* @__PURE__ */ h(
165
- m,
162
+ ...i
163
+ }, p) => {
164
+ const g = L(), f = e ? { target: "_blank", rel: "noopener noreferrer" } : {};
165
+ return /* @__PURE__ */ x(
166
+ g,
166
167
  {
167
- ref: b,
168
- className: c(
169
- x({ variant: l, size: r, shape: u }),
168
+ ref: p,
169
+ className: l(
170
+ y({ variant: b, size: n, shape: d }),
170
171
  "flex items-center no-underline!",
171
172
  t
172
173
  ),
173
174
  href: o,
174
175
  to: typeof o == "string" ? o : void 0,
175
- ...p,
176
- ...n,
176
+ ...f,
177
+ ...i,
177
178
  children: [
178
- y(d),
179
+ v(m),
179
180
  s
180
181
  ]
181
182
  }
182
183
  );
183
184
  }
184
185
  );
185
- L.displayName = "LinkButton";
186
+ S.displayName = "LinkButton";
186
187
  export {
187
- v as B,
188
- L,
189
- j as R,
190
- x as b
188
+ z as B,
189
+ S as L,
190
+ q as R,
191
+ y as b
191
192
  };
192
- //# sourceMappingURL=button-6by9ntsa3nj553mq.js.map
193
+ //# sourceMappingURL=button-dh366jtvswxj0fw3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button-dh366jtvswxj0fw3.js","sources":["../../src/components/button/button.tsx"],"sourcesContent":["import React from \"react\";\nimport { ArrowsClockwise, type Icon } from \"@phosphor-icons/react\";\nimport { Loader } from \"../loader/loader\";\nimport { Tooltip } from \"../tooltip/tooltip\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\nimport { useLinkComponent } from \"../../utils/link-provider\";\n\n/** Button variant definitions mapping shape, size, and variant names to their Tailwind classes. */\nexport const KUMO_BUTTON_VARIANTS = {\n shape: {\n base: {\n classes: \"\",\n description: \"Default rectangular button shape\",\n },\n square: {\n classes: \"items-center justify-center p-0\",\n description: \"Square button for icon-only actions\",\n },\n circle: {\n classes: \"items-center justify-center p-0 rounded-full\",\n description: \"Circular button for icon-only actions\",\n },\n },\n size: {\n xs: {\n classes: \"h-5 gap-1 rounded-sm px-1.5 text-xs\",\n description: \"Extra small button for compact UIs\",\n },\n sm: {\n classes: \"h-6.5 gap-1 rounded-md px-2 text-xs\",\n description: \"Small button for secondary actions\",\n },\n base: {\n classes: \"h-9 gap-1.5 rounded-lg px-3 text-base\",\n description: \"Default button size\",\n },\n lg: {\n classes: \"h-10 gap-2 rounded-lg px-4 text-base\",\n description: \"Large button for primary CTAs\",\n },\n },\n compactSize: {\n xs: { classes: \"size-3.5\" },\n sm: { classes: \"size-6.5\" },\n base: { classes: \"size-9\" },\n lg: { classes: \"size-10\" },\n },\n variant: {\n primary: {\n classes:\n \"bg-kumo-brand !text-white hover:bg-kumo-brand-hover disabled:bg-kumo-brand/50\",\n description: \"High-emphasis button for primary actions\",\n },\n secondary: {\n classes:\n \"bg-kumo-base !text-kumo-default ring not-disabled:hover:bg-kumo-tint disabled:bg-kumo-base/50 disabled:!text-kumo-default/70 ring-kumo-hairline data-[state=open]:bg-kumo-base\",\n description: \"Default button style for most actions\",\n },\n ghost: {\n classes: \"text-kumo-default hover:bg-kumo-tint shadow-none bg-inherit\",\n description: \"Minimal button with no background\",\n },\n destructive: {\n classes: \"bg-kumo-danger !text-white hover:bg-kumo-danger/70\",\n description: \"Danger button for destructive actions like delete\",\n },\n \"secondary-destructive\": {\n classes:\n \"bg-kumo-base !text-kumo-danger ring not-disabled:hover:bg-kumo-base disabled:bg-kumo-base/50 disabled:!text-kumo-danger/70 ring-kumo-hairline data-[state=open]:bg-kumo-base\",\n description:\n \"Secondary button with destructive text for less prominent dangerous actions\",\n },\n outline: {\n classes: \"bg-transparent text-kumo-default ring ring-kumo-hairline\",\n description: \"Bordered button with transparent background\",\n },\n },\n} as const;\n\nexport const KUMO_BUTTON_DEFAULT_VARIANTS = {\n shape: \"base\",\n size: \"base\",\n variant: \"secondary\",\n} as const;\n\n// Derived types from KUMO_BUTTON_VARIANTS\nexport type KumoButtonShape = keyof typeof KUMO_BUTTON_VARIANTS.shape;\nexport type KumoButtonSize = keyof typeof KUMO_BUTTON_VARIANTS.size;\nexport type KumoButtonVariant = keyof typeof KUMO_BUTTON_VARIANTS.variant;\n\nexport interface KumoButtonVariantsProps {\n /**\n * Button shape.\n * - `\"base\"` — Default rectangular button\n * - `\"square\"` — Square button for icon-only actions\n * - `\"circle\"` — Circular button for icon-only actions\n * @default \"base\"\n */\n shape?: KumoButtonShape;\n /**\n * Button size.\n * - `\"xs\"` — Extra small for compact UIs\n * - `\"sm\"` — Small for secondary actions\n * - `\"base\"` — Default size\n * - `\"lg\"` — Large for primary CTAs\n * @default \"base\"\n */\n size?: KumoButtonSize;\n /**\n * Visual style of the button.\n * - `\"primary\"` — High-emphasis, brand-colored for primary actions\n * - `\"secondary\"` — Default style with border for most actions\n * - `\"ghost\"` — Minimal, no background for tertiary actions\n * - `\"destructive\"` — Danger button for destructive actions\n * - `\"secondary-destructive\"` — Secondary style with destructive text\n * - `\"outline\"` — Bordered with transparent background\n * @default \"secondary\"\n */\n variant?: KumoButtonVariant;\n}\n\nexport function buttonVariants({\n variant = KUMO_BUTTON_DEFAULT_VARIANTS.variant,\n size = KUMO_BUTTON_DEFAULT_VARIANTS.size,\n shape = KUMO_BUTTON_DEFAULT_VARIANTS.shape,\n}: KumoButtonVariantsProps = {}) {\n const isCompactShape = shape === \"square\" || shape === \"circle\";\n\n return cn(\n // Base styles\n \"group flex w-max shrink-0 items-center font-medium select-none\",\n \"border-0 shadow-xs\",\n \"focus:outline-none focus:ring-kumo-focus/50 focus-visible:ring-2 focus-visible:ring-kumo-brand\",\n \"cursor-pointer\",\n // Disabled state\n \"disabled:cursor-not-allowed disabled:text-kumo-subtle\",\n // Apply variant, size, shape styles from KUMO_BUTTON_VARIANTS\n resolveVariant(KUMO_BUTTON_VARIANTS.variant, variant, KUMO_BUTTON_DEFAULT_VARIANTS.variant).classes,\n resolveVariant(KUMO_BUTTON_VARIANTS.size, size, KUMO_BUTTON_DEFAULT_VARIANTS.size).classes,\n resolveVariant(KUMO_BUTTON_VARIANTS.shape, shape, KUMO_BUTTON_DEFAULT_VARIANTS.shape).classes,\n isCompactShape && resolveVariant(KUMO_BUTTON_VARIANTS.compactSize, size, KUMO_BUTTON_DEFAULT_VARIANTS.size).classes,\n );\n}\n\n// Normalize icon prop to support both React elements and component types\nconst renderIconNode = (IconComponent?: Icon | React.ReactNode) => {\n if (!IconComponent) return null;\n if (React.isValidElement(IconComponent)) return IconComponent;\n const Comp = IconComponent as React.ComponentType<Record<string, unknown>>;\n return <Comp />;\n};\n\n/**\n * Button component props.\n *\n * Uses a discriminated union on `shape` so that icon-only buttons\n * (`shape=\"square\"` or `shape=\"circle\"`) require an `aria-label`.\n *\n * @example\n * ```tsx\n * <Button variant=\"primary\">Save</Button>\n * <Button variant=\"secondary\" shape=\"square\" icon={PlusIcon} aria-label=\"Add\" />\n * <Button variant=\"destructive\" loading>Deleting...</Button>\n * ```\n */\ntype ButtonBaseProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n /** Content rendered inside the button. */\n children?: React.ReactNode;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Icon from `@phosphor-icons/react` or a React element. Rendered before children. */\n icon?: Icon | React.ReactNode;\n /** Shows a loading spinner and disables interaction. */\n loading?: boolean;\n /** When set, wraps the button in a Tooltip with this content. */\n title?: React.ReactNode;\n};\n\ntype ButtonWithTextProps = ButtonBaseProps & {\n shape?: \"base\";\n size?: KumoButtonSize;\n variant?: KumoButtonVariant;\n};\n\ntype IconOnlyButtonProps = ButtonBaseProps & {\n shape: \"square\" | \"circle\";\n size?: KumoButtonSize;\n variant?: KumoButtonVariant;\n /** Required for icon-only buttons to provide accessible label for screen readers */\n \"aria-label\": string;\n};\n\nexport type ButtonProps = ButtonWithTextProps | IconOnlyButtonProps;\n\n/**\n * LinkButton component props — renders an anchor styled as a button.\n *\n * @example\n * ```tsx\n * <LinkButton href=\"/docs\" variant=\"ghost\" icon={BookIcon}>Docs</LinkButton>\n * <LinkButton href=\"https://example.com\" external>Visit Site</LinkButton>\n * ```\n */\nexport type LinkButtonProps = React.AnchorHTMLAttributes<HTMLAnchorElement> &\n KumoButtonVariantsProps & {\n /** Content rendered inside the link button. */\n children?: React.ReactNode;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Icon from `@phosphor-icons/react` or a React element. Rendered before children. */\n icon?: Icon | React.ReactNode;\n /** When `true`, opens in a new tab with `rel=\"noopener noreferrer\"`. */\n external?: boolean;\n linksExternal?: boolean;\n };\n\n/**\n * Primary action trigger. Supports multiple variants, sizes, shapes, icons, and loading state.\n *\n * @example\n * ```tsx\n * <Button variant=\"primary\">Save</Button>\n * <Button variant=\"secondary\" icon={PlusIcon}>Create Worker</Button>\n * ```\n */\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n className,\n disabled,\n loading,\n shape = \"base\",\n size = \"base\",\n variant = \"secondary\",\n icon: IconComponent,\n title,\n ...props\n },\n ref,\n ) => {\n const { type, ...restProps } = props;\n const button = (\n <button\n ref={ref}\n className={cn(\n buttonVariants({ variant, size, shape }),\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n disabled={loading || disabled}\n type={type ?? \"button\"}\n {...restProps}\n >\n {loading && <Loader size={size === \"lg\" ? 16 : 14} />}\n {!loading && renderIconNode(IconComponent)}\n\n {children}\n </button>\n );\n\n if (title) {\n return <Tooltip content={title} render={button} />;\n }\n\n return button;\n },\n);\n\nButton.displayName = \"Button\";\n\n/**\n * Square button with a rotating arrows icon, used to trigger data refresh actions.\n *\n * @example\n * ```tsx\n * <RefreshButton loading={isRefreshing} onClick={refresh} />\n * ```\n */\nexport const RefreshButton = ({\n \"aria-label\": ariaLabel = \"Refresh\",\n loading,\n ...props\n}: ButtonProps) => (\n <Button shape=\"square\" aria-label={ariaLabel} {...props}>\n <ArrowsClockwise\n className={cn({\n \"animate-refresh\": loading,\n \"size-4.5\": props.size === \"base\" || !props.size,\n \"size-4\": props.size === \"sm\",\n \"size-5\": props.size === \"lg\",\n })}\n />\n </Button>\n);\n\n/**\n * Anchor element styled as a button. Integrates with `LinkProvider` for framework routing.\n *\n * @example\n * ```tsx\n * <LinkButton href=\"/settings\" variant=\"ghost\">Settings</LinkButton>\n * ```\n */\nexport const LinkButton = React.forwardRef<HTMLAnchorElement, LinkButtonProps>(\n (\n {\n children,\n className,\n external,\n href,\n shape = \"base\",\n size = \"base\",\n variant = \"ghost\",\n icon: IconComponent,\n // linksExternal = false,\n ...props\n },\n ref,\n ) => {\n const LinkComponent = useLinkComponent();\n const externalProps = external\n ? { target: \"_blank\", rel: \"noopener noreferrer\" }\n : {};\n\n return (\n <LinkComponent\n ref={ref}\n className={cn(\n buttonVariants({ variant, size, shape }),\n \"flex items-center no-underline!\",\n className,\n )}\n href={href}\n to={typeof href === \"string\" ? href : undefined}\n {...externalProps}\n {...props}\n >\n {renderIconNode(IconComponent)}\n {children}\n </LinkComponent>\n );\n },\n);\n\nLinkButton.displayName = \"LinkButton\";\n"],"names":["KUMO_BUTTON_VARIANTS","KUMO_BUTTON_DEFAULT_VARIANTS","buttonVariants","variant","size","shape","isCompactShape","cn","resolveVariant","renderIconNode","IconComponent","React","Button","children","className","disabled","loading","title","props","ref","type","restProps","button","jsxs","Loader","jsx","Tooltip","RefreshButton","ariaLabel","ArrowsClockwise","LinkButton","external","href","LinkComponent","useLinkComponent","externalProps"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { jsx as e, jsxs as x } from "react/jsx-runtime";
3
3
  import { forwardRef as p, createContext as B, useContext as F } from "react";
4
4
  import { MinusIcon as C, CheckIcon as v } from "@phosphor-icons/react";
5
5
  import { c as i } from "./cn-ct4n7r74mh8y0f48.js";
6
- import { L as E } from "./label-c3h9i3y4wiccelt7.js";
6
+ import { L as E } from "./label-efa0uvb8zqyjwpc8.js";
7
7
  import { L as N, N as y, O as K, P as R, Q as w, C as _, U as G } from "./vendor-base-ui-ie71jahf0czyf58j.js";
8
8
  const H = {
9
9
  variant: {
@@ -207,4 +207,4 @@ export {
207
207
  H as K,
208
208
  X as a
209
209
  };
210
- //# sourceMappingURL=checkbox-hvxfvhtx1qjo2mww.js.map
210
+ //# sourceMappingURL=checkbox-cf2pwdupyjweg184.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox-cf2pwdupyjweg184.js","sources":["../../src/components/checkbox/checkbox.tsx"],"sourcesContent":["import { forwardRef, createContext, useContext, type ReactNode } from \"react\";\nimport { CheckIcon, MinusIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\nimport { Label } from \"../label\";\nimport { Fieldset } from \"@base-ui/react/fieldset\";\nimport { Field as FieldBase } from \"@base-ui/react/field\";\nimport { CheckboxGroup as BaseCheckboxGroup } from \"@base-ui/react/checkbox-group\";\nimport { Checkbox as BaseCheckbox } from \"@base-ui/react/checkbox\";\n\n/** Event details passed to onCheckedChange callback. Re-exported from Base UI. */\nexport type CheckboxChangeEventDetails = Parameters<\n NonNullable<BaseCheckbox.Root.Props[\"onCheckedChange\"]>\n>[1];\n\n/** Checkbox variant definitions mapping variant names to their Tailwind classes. */\nexport const KUMO_CHECKBOX_VARIANTS = {\n variant: {\n default: {\n classes:\n \"[&:focus-within>span]:ring-kumo-focus [&:hover>span]:ring-kumo-hairline\",\n description: \"Default checkbox appearance\",\n },\n error: {\n classes: \"[&>span]:ring-kumo-danger\",\n description: \"Error state for validation failures\",\n },\n },\n} as const;\n\nexport const KUMO_CHECKBOX_DEFAULT_VARIANTS = {\n variant: \"default\",\n} as const;\n\n// Derived types from KUMO_CHECKBOX_VARIANTS\nexport type KumoCheckboxVariant = keyof typeof KUMO_CHECKBOX_VARIANTS.variant;\n\nexport interface KumoCheckboxVariantsProps {\n /**\n * Visual variant.\n * - `\"default\"` — Standard checkbox appearance\n * - `\"error\"` — Error state for validation failures\n * @default \"default\"\n */\n variant?: KumoCheckboxVariant;\n}\n\nexport function checkboxVariants({\n variant = KUMO_CHECKBOX_DEFAULT_VARIANTS.variant,\n}: KumoCheckboxVariantsProps = {}) {\n return cn(resolveVariant(KUMO_CHECKBOX_VARIANTS.variant, variant, KUMO_CHECKBOX_DEFAULT_VARIANTS.variant).classes);\n}\n\n// Legacy type alias for backwards compatibility\nexport type CheckboxVariant = KumoCheckboxVariant;\n\n// Context for passing controlFirst from Group to Items\nconst CheckboxGroupContext = createContext<{ controlFirst: boolean }>({\n controlFirst: true,\n});\n\n/**\n * Single checkbox component props with accessibility guidance.\n *\n * **Accessible Name Required:** Checkbox should have one of:\n * 1. `label` prop (recommended) - built-in Field wrapper with horizontal layout\n * 2. `aria-label` - for checkboxes without visible label\n * 3. `aria-labelledby` - for custom label association\n *\n * **Note:** When used inside Checkbox.Group or Dropdown, label is optional (parent provides context).\n *\n * Missing accessible names will trigger console warnings in development (unless inside a group).\n *\n * @example\n * // Recommended: Built-in Field wrapper with label\n * <Checkbox label=\"Accept terms and conditions\" />\n *\n * @example\n * // Control-first layout (checkbox before label)\n * <Checkbox label=\"Remember me\" controlFirst={true} />\n *\n * @example\n * // Label-first layout (label before checkbox)\n * <Checkbox label=\"Enable notifications\" controlFirst={false} />\n *\n * @example\n * // Error variant (visual only, no error text for single checkboxes)\n * <Checkbox label=\"Required field\" variant=\"error\" />\n *\n * @example\n * // Without visible label (aria-label required)\n * <Checkbox aria-label=\"Select all items\" />\n *\n * @example\n * // Custom label association\n * <label id=\"terms-label\">I accept the terms</label>\n * <Checkbox aria-labelledby=\"terms-label\" />\n *\n * @example\n * // Inside Checkbox.Group (label optional)\n * <Checkbox.Group legend=\"Preferences\">\n * <Checkbox.Item value=\"email\" label=\"Email notifications\" />\n * <Checkbox.Item value=\"sms\" label=\"SMS notifications\" />\n * </Checkbox.Group>\n */\nexport type CheckboxProps = {\n /** Visual variant: \"default\" or \"error\" for validation failures (visual only, no error text) */\n variant?: CheckboxVariant;\n /** Label content for the checkbox (enables built-in Field wrapper) - 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 /** When true (default), checkbox appears before label. When false, label appears before checkbox. */\n controlFirst?: boolean;\n /** Whether the checkbox is checked (controlled) */\n checked?: boolean;\n /** Whether the checkbox is in indeterminate state */\n indeterminate?: boolean;\n /** Whether the checkbox is disabled */\n disabled?: boolean;\n /** Callback when the checked state changes */\n onCheckedChange?: BaseCheckbox.Root.Props[\"onCheckedChange\"];\n /** Name for form submission */\n name?: string;\n /** Whether the field is required */\n required?: boolean;\n /** Additional class name */\n className?: string;\n /** Accessible label when no visible label is provided */\n \"aria-label\"?: string;\n /** ID of element that labels this checkbox */\n \"aria-labelledby\"?: string;\n};\n\n/**\n * Checkbox group component props (with built-in Fieldset and CheckboxGroup)\n *\n * Usage:\n * ```tsx\n * <Checkbox.Group\n * legend=\"Choose preferences\"\n * defaultValue={['email']}\n * error=\"You must select at least one option\"\n * >\n * <Checkbox.Item label=\"Email notifications\" value=\"email\" />\n * <Checkbox.Item label=\"SMS notifications\" value=\"sms\" />\n * </Checkbox.Group>\n * ```\n */\n/**\n * Props for Checkbox.Legend — a composable sub-component for labeling a Checkbox.Group.\n *\n * Place as a direct child of `<Checkbox.Group>` to provide a styled, accessible legend.\n * Accepts `className` for full styling control (e.g. `className=\"sr-only\"` to visually hide).\n *\n * @example\n * ```tsx\n * <Checkbox.Group>\n * <Checkbox.Legend className=\"sr-only\">Preferences</Checkbox.Legend>\n * <Checkbox.Item label=\"Email\" value=\"email\" />\n * </Checkbox.Group>\n * ```\n */\nexport interface CheckboxLegendProps {\n /** Legend content */\n children: ReactNode;\n /** Additional CSS classes (e.g. \"sr-only\" to visually hide the legend) */\n className?: string;\n}\n\nexport interface CheckboxGroupProps {\n /**\n * Legend text for the group.\n * For more control over legend styling, omit this prop and use `<Checkbox.Legend>` as a child instead.\n */\n legend?: string;\n /** Child Checkbox.Item components (and optionally a Checkbox.Legend) */\n children: ReactNode;\n /** Error message for the group (only appears in groups, not single checkboxes) */\n error?: string;\n /** Helper text for the group */\n description?: ReactNode;\n /** Values of checkboxes that should be initially checked (uncontrolled) */\n defaultValue?: string[];\n /** Values of checkboxes that should be checked (controlled) */\n value?: string[];\n /** Event handler called when checkbox values change */\n onValueChange?: (value: string[]) => void;\n /** All possible checkbox values (required for parent checkbox pattern) */\n allValues?: string[];\n /** Whether all checkboxes in the group are disabled */\n disabled?: boolean;\n /** When true (default), checkbox appears before label. When false, label appears before checkbox. */\n controlFirst?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Individual checkbox item within a group\n */\nexport type CheckboxItemProps = {\n /** Visual variant: \"default\" or \"error\" for validation failures */\n variant?: CheckboxVariant;\n /** Label text displayed next to checkbox */\n label: string;\n /** Value of the checkbox (required when used in Checkbox.Group) */\n value?: string;\n /** Additional CSS classes for the label wrapper */\n className?: string;\n checked?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n /** Callback when the checked state changes */\n onCheckedChange?: BaseCheckbox.Root.Props[\"onCheckedChange\"];\n name?: string;\n};\n\n// Single checkbox with built-in Field\nconst CheckboxBase = forwardRef<HTMLButtonElement, CheckboxProps>(\n (\n {\n className,\n checked,\n indeterminate,\n disabled,\n variant = \"default\",\n label,\n labelTooltip,\n controlFirst = true,\n onCheckedChange,\n required,\n name,\n ...props\n },\n ref,\n ) => {\n // A11y enforcement: warn in dev if no accessible name provided\n if (process.env.NODE_ENV !== \"production\") {\n const hasLabel = Boolean(label);\n const hasAriaLabel = Boolean(props[\"aria-label\"]);\n const hasAriaLabelledBy = Boolean(props[\"aria-labelledby\"]);\n\n if (!hasLabel && !hasAriaLabel && !hasAriaLabelledBy) {\n console.warn(\n \"[Kumo Checkbox]: Checkbox must have an accessible name. Provide either:\\n\" +\n \" - label prop: <Checkbox label='Accept terms' />\\n\" +\n \" - aria-label: <Checkbox aria-label='Select item' />\\n\" +\n \" - aria-labelledby for custom label association\\n\" +\n \" Note: When used inside Checkbox.Group, label is optional\",\n );\n }\n }\n\n const checkboxControl = (\n <BaseCheckbox.Root\n ref={ref}\n name={name}\n checked={checked}\n indeterminate={indeterminate}\n disabled={disabled}\n onCheckedChange={onCheckedChange}\n className={cn(\n \"relative flex h-4 w-4 items-center justify-center rounded-sm border-0 bg-kumo-base ring focus:outline-none after:absolute after:-inset-x-3 after:-inset-y-2\",\n variant === \"error\" ? \"ring-kumo-danger\" : \"ring-kumo-hairline\",\n !disabled &&\n \"hover:ring-kumo-hairline focus:ring-kumo-focus focus:ring-2 focus-visible:ring-2 focus-visible:ring-kumo-brand\",\n \"data-[checked]:bg-kumo-contrast data-[checked]:ring-kumo-contrast data-[indeterminate]:bg-kumo-contrast data-[indeterminate]:ring-kumo-contrast\",\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n {...props}\n >\n <BaseCheckbox.Indicator\n keepMounted\n className=\"flex items-center justify-center text-kumo-inverse data-[unchecked]:invisible\"\n render={(renderProps, state) => (\n <span {...renderProps}>\n {state.indeterminate ? (\n <MinusIcon weight=\"bold\" size={12} />\n ) : (\n <CheckIcon weight=\"bold\" size={12} />\n )}\n </span>\n )}\n />\n </BaseCheckbox.Root>\n );\n\n // If no label provided, return bare checkbox (for use in other components like Dropdown)\n if (!label) {\n return checkboxControl;\n }\n\n // Use Field.Root + Field.Label enclosing pattern for proper a11y association\n // See: https://base-ui.com/react/components/field\n return (\n <FieldBase.Root className=\"inline-flex\">\n <FieldBase.Label\n className={cn(\n \"!m-0 !min-h-0 !text-base inline-flex items-center gap-2\",\n controlFirst ? \"flex-row\" : \"flex-row-reverse justify-end\",\n disabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n )}\n >\n {checkboxControl}\n <Label\n showOptional={required === false}\n tooltip={labelTooltip}\n asContent\n >\n {label}\n </Label>\n </FieldBase.Label>\n </FieldBase.Root>\n );\n },\n);\n\nCheckboxBase.displayName = \"Checkbox\";\n\n// Checkbox.Item for use within Checkbox.Group\nconst CheckboxItem = forwardRef<HTMLButtonElement, CheckboxItemProps>(\n (\n {\n className,\n checked,\n indeterminate,\n disabled,\n variant = \"default\",\n label,\n value,\n onCheckedChange,\n name,\n },\n ref,\n ) => {\n const { controlFirst } = useContext(CheckboxGroupContext);\n\n return (\n <label\n className={cn(\n \"m-0 relative inline-flex items-center gap-2\",\n // Control first (default): checkbox before label\n // Label first: label before checkbox using flex-row-reverse\n !controlFirst && \"flex-row-reverse justify-end\",\n disabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\",\n className,\n )}\n >\n <BaseCheckbox.Root\n ref={ref}\n value={value}\n name={name}\n checked={checked}\n indeterminate={indeterminate}\n disabled={disabled}\n onCheckedChange={onCheckedChange}\n className={cn(\n \"peer relative flex h-4 w-4 items-center justify-center rounded-sm border-0 bg-kumo-base ring after:absolute after:-inset-x-3 after:-inset-y-2\",\n variant === \"error\" ? \"ring-kumo-danger\" : \"ring-kumo-hairline\",\n !disabled &&\n \"group-hover:ring-kumo-hairline hover:ring-kumo-hairline focus:ring-kumo-focus focus:ring-2 focus-visible:ring-2 focus-visible:ring-kumo-brand\",\n \"data-[checked]:bg-kumo-contrast data-[checked]:ring-kumo-contrast data-[indeterminate]:bg-kumo-contrast data-[indeterminate]:ring-kumo-contrast\",\n )}\n >\n <BaseCheckbox.Indicator\n keepMounted\n className=\"flex items-center justify-center text-kumo-inverse data-[unchecked]:invisible\"\n render={(renderProps, state) => (\n <span {...renderProps}>\n {state.indeterminate ? (\n <MinusIcon weight=\"bold\" size={12} />\n ) : (\n <CheckIcon weight=\"bold\" size={12} />\n )}\n </span>\n )}\n />\n </BaseCheckbox.Root>\n <span className=\"text-base text-kumo-default\">{label}</span>\n </label>\n );\n },\n);\n\nCheckboxItem.displayName = \"Checkbox.Item\";\n\n// Checkbox.Legend — composable legend sub-component for Checkbox.Group\nfunction CheckboxLegend({ children, className }: CheckboxLegendProps) {\n return (\n <Fieldset.Legend\n className={cn(\"text-base font-medium text-kumo-default\", className)}\n >\n {children}\n </Fieldset.Legend>\n );\n}\n\nCheckboxLegend.displayName = \"Checkbox.Legend\";\n\n// Checkbox.Group with built-in Fieldset and CheckboxGroup\nfunction CheckboxGroup({\n legend,\n children,\n error,\n description,\n defaultValue,\n value,\n onValueChange,\n allValues,\n disabled,\n controlFirst = true,\n className,\n}: CheckboxGroupProps) {\n return (\n <CheckboxGroupContext.Provider value={{ controlFirst }}>\n <BaseCheckboxGroup\n defaultValue={defaultValue}\n value={value}\n onValueChange={onValueChange}\n allValues={allValues}\n disabled={disabled}\n >\n <Fieldset.Root className={cn(\"flex flex-col gap-4\", className)}>\n {legend && (\n <Fieldset.Legend className=\"text-base font-medium text-kumo-default\">\n {legend}\n </Fieldset.Legend>\n )}\n <div className=\"flex flex-col gap-2\">{children}</div>\n {error && <p className=\"text-sm text-kumo-danger\">{error}</p>}\n {description && (\n <p className=\"text-sm text-kumo-subtle\">{description}</p>\n )}\n </Fieldset.Root>\n </BaseCheckboxGroup>\n </CheckboxGroupContext.Provider>\n );\n}\n\n// Compound component\nexport const Checkbox = Object.assign(CheckboxBase, {\n Item: CheckboxItem,\n Group: CheckboxGroup,\n Legend: CheckboxLegend,\n});\n\nCheckbox.displayName = \"Checkbox\";\n"],"names":["KUMO_CHECKBOX_VARIANTS","KUMO_CHECKBOX_DEFAULT_VARIANTS","CheckboxGroupContext","createContext","CheckboxBase","forwardRef","className","checked","indeterminate","disabled","variant","label","labelTooltip","controlFirst","onCheckedChange","required","name","props","ref","hasLabel","hasAriaLabel","hasAriaLabelledBy","checkboxControl","jsx","BaseCheckbox.Root","cn","BaseCheckbox.Indicator","renderProps","state","MinusIcon","CheckIcon","FieldBase.Root","jsxs","FieldBase.Label","Label","CheckboxItem","value","useContext","CheckboxLegend","children","Fieldset.Legend","CheckboxGroup","legend","error","description","defaultValue","onValueChange","allValues","BaseCheckboxGroup","Fieldset.Root","Checkbox"],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  "use client";
2
2
  import { jsxs as c, jsx as e } from "react/jsx-runtime";
3
- import { CheckIcon as R, CopyIcon as A } from "@phosphor-icons/react";
4
- import { forwardRef as S, useState as P, useRef as _, useCallback as I } from "react";
5
- import { B as O } from "./button-6by9ntsa3nj553mq.js";
6
- import { i as M } from "./input-ncfowphv81yq7fyy.js";
3
+ import { CheckIcon as A, CopyIcon as S } from "@phosphor-icons/react";
4
+ import { forwardRef as P, useState as _, useRef as I, useCallback as O } from "react";
5
+ import { B as V } from "./button-dh366jtvswxj0fw3.js";
6
+ import { i as M } from "./input-2y9vg81trmamkb6k.js";
7
7
  import { c as s } from "./cn-ct4n7r74mh8y0f48.js";
8
- import { V, W as j, X as B, Y as D, Z as E, _ as L, $ as U, a0 as X, a1 as K, a2 as W, a3 as F, a4 as Y, a5 as Z } from "./vendor-base-ui-ie71jahf0czyf58j.js";
9
- const T = V(), y = {
8
+ import { r as y } from "./resolve-variant-gw6eh7fa4st8ej7m.js";
9
+ import { V as j, W as B, X as D, Y as E, Z as L, _ as U, $ as X, a0 as K, a1 as W, a2 as F, a3 as Y, a4 as Z, a5 as $ } from "./vendor-base-ui-ie71jahf0czyf58j.js";
10
+ const v = j(), C = {
10
11
  size: {
11
12
  sm: {
12
13
  classes: "text-xs",
@@ -24,7 +25,7 @@ const T = V(), y = {
24
25
  description: "Large clipboard text for prominent display"
25
26
  }
26
27
  }
27
- }, v = {
28
+ }, d = {
28
29
  size: "lg"
29
30
  }, l = {
30
31
  slide: {
@@ -33,92 +34,92 @@ const T = V(), y = {
33
34
  end: "pointer-events-none absolute inset-0 flex items-center justify-center opacity-0 -translate-y-full"
34
35
  }
35
36
  };
36
- function $({
37
- size: o = v.size
37
+ function q({
38
+ size: o = d.size
38
39
  } = {}) {
39
40
  return s(
40
41
  // Base styles
41
42
  "flex items-center overflow-hidden bg-kumo-base px-0 font-mono",
42
43
  // Apply size styles from KUMO_CLIPBOARD_TEXT_VARIANTS
43
- y.size[o].classes
44
+ y(C.size, o, d.size).classes
44
45
  );
45
46
  }
46
- function q() {
47
- const { toasts: o } = K();
48
- return /* @__PURE__ */ e(W, { className: "pointer-events-none fixed inset-0 isolate", children: o.map((a) => /* @__PURE__ */ e(F, { toast: a, className: "absolute", children: /* @__PURE__ */ e(
49
- Y,
47
+ function G() {
48
+ const { toasts: o } = W();
49
+ return /* @__PURE__ */ e(F, { className: "pointer-events-none fixed inset-0 isolate", children: o.map((a) => /* @__PURE__ */ e(Y, { toast: a, className: "absolute", children: /* @__PURE__ */ e(
50
+ Z,
50
51
  {
51
52
  toast: a,
52
53
  className: s(
53
54
  "flex origin-[var(--transform-origin)] flex-col rounded-md bg-kumo-base px-3 py-1.5 text-xs text-kumo-default font-sans",
54
55
  "shadow-lg shadow-kumo-tip-shadow outline outline-kumo-fill"
55
56
  ),
56
- children: /* @__PURE__ */ e(Z, {})
57
+ children: /* @__PURE__ */ e($, {})
57
58
  }
58
59
  ) }, a.id)) });
59
60
  }
60
- function G({ children: o }) {
61
- return /* @__PURE__ */ e(U, { children: /* @__PURE__ */ c(X, { toastManager: T, children: [
62
- /* @__PURE__ */ e(q, {}),
61
+ function H({ children: o }) {
62
+ return /* @__PURE__ */ e(X, { children: /* @__PURE__ */ c(K, { toastManager: v, children: [
63
+ /* @__PURE__ */ e(G, {}),
63
64
  o
64
65
  ] }) });
65
66
  }
66
- const H = S(
67
+ const J = P(
67
68
  ({
68
69
  text: o,
69
70
  textToCopy: a,
70
- className: C,
71
- size: m = v.size,
72
- onCopy: f,
71
+ className: z,
72
+ size: f = d.size,
73
+ onCopy: b,
73
74
  tooltip: n,
74
75
  labels: { copyAction: k = "Copy to clipboard" } = {}
75
76
  }, w) => {
76
- const [r, d] = P(!1), b = _(null), g = y.size[m], {
77
- text: z = "Copy",
78
- copiedText: p = "Copied",
79
- side: u = "top"
80
- } = n ?? {}, N = I(async () => {
77
+ const [r, p] = _(!1), g = I(null), x = y(C.size, f, d.size), {
78
+ text: N = "Copy",
79
+ copiedText: u = "Copied",
80
+ side: m = "top"
81
+ } = n ?? {}, R = O(async () => {
81
82
  try {
82
83
  if (typeof navigator < "u" && navigator.clipboard && typeof navigator.clipboard.writeText == "function")
83
84
  await navigator.clipboard.writeText(a ?? o);
84
85
  else if (typeof document < "u") {
85
86
  const t = document.createElement("textarea");
86
87
  t.value = a ?? o, t.setAttribute("readonly", ""), t.style.position = "absolute", t.style.left = "-9999px", document.body.appendChild(t);
87
- const i = document.getSelection(), h = i?.rangeCount ? i.getRangeAt(0) : null;
88
+ const i = document.getSelection(), T = i?.rangeCount ? i.getRangeAt(0) : null;
88
89
  t.select();
89
90
  try {
90
91
  document.execCommand("copy");
91
92
  } finally {
92
- document.body.removeChild(t), h && (i?.removeAllRanges(), i?.addRange(h));
93
+ document.body.removeChild(t), T && (i?.removeAllRanges(), i?.addRange(T));
93
94
  }
94
95
  }
95
- d(!0), n ? T.add({
96
- description: p,
96
+ p(!0), n ? v.add({
97
+ description: u,
97
98
  positionerProps: {
98
- anchor: b.current,
99
- side: u,
99
+ anchor: g.current,
100
+ side: m,
100
101
  sideOffset: 8
101
102
  },
102
103
  timeout: 1500,
103
104
  onClose() {
104
- d(!1);
105
+ p(!1);
105
106
  }
106
- }) : setTimeout(() => d(!1), 1500), f?.();
107
+ }) : setTimeout(() => p(!1), 1500), b?.();
107
108
  } catch (t) {
108
109
  console.warn("Clipboard copy failed", t);
109
110
  }
110
- }, [o, f, n, p, u]), x = /* @__PURE__ */ c(
111
- O,
111
+ }, [o, b, n, u, m]), h = /* @__PURE__ */ c(
112
+ V,
112
113
  {
113
- ref: b,
114
- size: g.buttonSize,
114
+ ref: g,
115
+ size: x.buttonSize,
115
116
  variant: "ghost",
116
117
  className: s(
117
118
  "rounded-l-none rounded-r-[inherit] border-l! border-kumo-line! px-3 relative isolate overflow-hidden transition-all duration-200",
118
119
  "focus:ring-inset focus:ring-kumo-focus/50",
119
120
  "focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-kumo-brand"
120
121
  ),
121
- onClick: N,
122
+ onClick: R,
122
123
  "aria-label": k,
123
124
  children: [
124
125
  /* @__PURE__ */ e(
@@ -128,7 +129,7 @@ const H = S(
128
129
  "flex items-center gap-1 transition-all duration-200",
129
130
  r ? l.slide.animate : l.slide.initial
130
131
  ),
131
- children: /* @__PURE__ */ e(R, {})
132
+ children: /* @__PURE__ */ e(A, {})
132
133
  }
133
134
  ),
134
135
  /* @__PURE__ */ e(
@@ -138,7 +139,7 @@ const H = S(
138
139
  "flex items-center justify-center transition-all duration-200",
139
140
  r ? l.slide.end : l.slide.animate
140
141
  ),
141
- children: /* @__PURE__ */ e(A, {})
142
+ children: /* @__PURE__ */ e(S, {})
142
143
  }
143
144
  )
144
145
  ]
@@ -149,42 +150,42 @@ const H = S(
149
150
  {
150
151
  ref: w,
151
152
  className: s(
152
- M({ size: g.buttonSize }),
153
- $({ size: m }),
154
- C
153
+ M({ size: x.buttonSize }),
154
+ q({ size: f }),
155
+ z
155
156
  ),
156
157
  children: [
157
158
  /* @__PURE__ */ e("span", { className: "grow truncate ps-4 pe-2", children: o }),
158
- n ? /* @__PURE__ */ e(G, { children: /* @__PURE__ */ c(
159
- j,
159
+ n ? /* @__PURE__ */ e(H, { children: /* @__PURE__ */ c(
160
+ B,
160
161
  {
161
162
  disabled: r,
162
163
  onOpenChange: (t, i) => {
163
164
  i.reason === "trigger-press" && i.cancel();
164
165
  },
165
166
  children: [
166
- /* @__PURE__ */ e(B, { render: x }),
167
- /* @__PURE__ */ e(D, { children: /* @__PURE__ */ e(E, { side: u, sideOffset: 8, children: /* @__PURE__ */ e(
168
- L,
167
+ /* @__PURE__ */ e(D, { render: h }),
168
+ /* @__PURE__ */ e(E, { children: /* @__PURE__ */ e(L, { side: m, sideOffset: 8, children: /* @__PURE__ */ e(
169
+ U,
169
170
  {
170
171
  className: s(
171
172
  "flex origin-[var(--transform-origin)] flex-col rounded-md bg-kumo-base px-3 py-1.5 text-xs text-kumo-default",
172
173
  "shadow-lg shadow-kumo-tip-shadow outline outline-kumo-fill"
173
174
  ),
174
- children: z
175
+ children: N
175
176
  }
176
177
  ) }) })
177
178
  ]
178
179
  }
179
- ) }) : x,
180
- /* @__PURE__ */ e("span", { className: "sr-only", "aria-live": "polite", children: r ? p : "" })
180
+ ) }) : h,
181
+ /* @__PURE__ */ e("span", { className: "sr-only", "aria-live": "polite", children: r ? u : "" })
181
182
  ]
182
183
  }
183
184
  );
184
185
  }
185
186
  );
186
- H.displayName = "ClipboardText";
187
+ J.displayName = "ClipboardText";
187
188
  export {
188
- H as C
189
+ J as C
189
190
  };
190
- //# sourceMappingURL=clipboard-text-hswydzx3iql369sd.js.map
191
+ //# sourceMappingURL=clipboard-text-hn2uwdj4ozenezd5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard-text-hn2uwdj4ozenezd5.js","sources":["../../src/components/clipboard-text/clipboard-text.tsx"],"sourcesContent":["import { CheckIcon, CopyIcon } from \"@phosphor-icons/react\";\nimport { forwardRef, useCallback, useRef, useState } from \"react\";\nimport { Toast } from \"@base-ui/react/toast\";\nimport { Tooltip } from \"@base-ui/react/tooltip\";\nimport { Button } from \"../button\";\nimport { inputVariants } from \"../input\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\n\n// Create a toast manager for anchored \"Copied\" toasts\nconst clipboardToastManager = Toast.createToastManager();\n\n/** ClipboardText size variant definitions mapping sizes to their Tailwind classes. */\nexport const KUMO_CLIPBOARD_TEXT_VARIANTS = {\n size: {\n sm: {\n classes: \"text-xs\",\n buttonSize: \"sm\" as const,\n description: \"Small clipboard text for compact UIs\",\n },\n base: {\n classes: \"text-sm\",\n buttonSize: \"base\" as const,\n description: \"Default clipboard text size\",\n },\n lg: {\n classes: \"text-sm\",\n buttonSize: \"lg\" as const,\n description: \"Large clipboard text for prominent display\",\n },\n },\n} as const;\n\nexport const KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS = {\n size: \"lg\",\n} as const;\n\nconst clipboardTextAnimations = {\n slide: {\n initial:\n \"pointer-events-none absolute inset-0 flex items-center justify-center opacity-0 translate-y-full\",\n animate: \"translate-y-0 opacity-100\",\n end: \"pointer-events-none absolute inset-0 flex items-center justify-center opacity-0 -translate-y-full\",\n },\n} as const;\n\n// Derived types from KUMO_CLIPBOARD_TEXT_VARIANTS\nexport type KumoClipboardTextSize =\n keyof typeof KUMO_CLIPBOARD_TEXT_VARIANTS.size;\n\nexport interface KumoClipboardTextVariantsProps {\n /**\n * Size of the clipboard text field.\n * - `\"sm\"` — Small clipboard text for compact UIs\n * - `\"base\"` — Default clipboard text size\n * - `\"lg\"` — Large clipboard text for prominent display\n * @default \"lg\"\n */\n size?: KumoClipboardTextSize;\n}\n\nexport function clipboardTextVariants({\n size = KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS.size,\n}: KumoClipboardTextVariantsProps = {}) {\n return cn(\n // Base styles\n \"flex items-center overflow-hidden bg-kumo-base px-0 font-mono\",\n // Apply size styles from KUMO_CLIPBOARD_TEXT_VARIANTS\n resolveVariant(KUMO_CLIPBOARD_TEXT_VARIANTS.size, size, KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS.size).classes,\n );\n}\n\n// Legacy type alias for backwards compatibility\nexport type ClipboardTextSize = KumoClipboardTextSize;\n\n/**\n * ClipboardText component props.\n *\n * @example\n * ```tsx\n * <ClipboardText text=\"sk_live_abc123\" />\n * <ClipboardText text=\"npm install @cloudflare/kumo\" size=\"sm\" />\n * ```\n */\nexport interface ClipboardTextProps extends KumoClipboardTextVariantsProps {\n /** The text to display and copy to clipboard. */\n text: string;\n /** If provided, this text will be copied to clipboard instead of the `text` prop. */\n textToCopy?: string;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Callback fired after text is copied to clipboard. */\n onCopy?: () => void;\n /**\n * Tooltip config. Shows tooltip on hover, anchored toast on click.\n * @example\n * ```tsx\n * <ClipboardText\n * text=\"abc123\"\n * tooltip={{ text: \"Copy\", copiedText: \"Copied!\", side: \"top\" }}\n * />\n * ```\n */\n tooltip?: {\n /** Text shown in tooltip on hover. @default \"Copy\" */\n text?: string;\n /** Text shown in toast after copying. @default \"Copied\" */\n copiedText?: string;\n /** Tooltip/toast placement. @default \"top\" */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n };\n /** Accessible labels for i18n. */\n labels?: {\n /** @default \"Copy to clipboard\" */\n copyAction?: string;\n };\n}\n\n/**\n * Anchored toasts viewport - renders \"Copied\" toasts anchored to buttons\n */\nfunction AnchoredToasts() {\n const { toasts } = Toast.useToastManager();\n return (\n <Toast.Viewport className=\"pointer-events-none fixed inset-0 isolate\">\n {toasts.map((toast) => (\n <Toast.Positioner key={toast.id} toast={toast} className=\"absolute\">\n <Toast.Root\n toast={toast}\n className={cn(\n \"flex origin-[var(--transform-origin)] flex-col rounded-md bg-kumo-base px-3 py-1.5 text-xs text-kumo-default font-sans\",\n \"shadow-lg shadow-kumo-tip-shadow outline outline-kumo-fill\",\n )}\n >\n <Toast.Description />\n </Toast.Root>\n </Toast.Positioner>\n ))}\n </Toast.Viewport>\n );\n}\n\n/**\n * Internal wrapper that provides Toast context when tooltip is enabled.\n */\nfunction TooltipWrapper({ children }: { children: React.ReactNode }) {\n return (\n <Tooltip.Provider>\n <Toast.Provider toastManager={clipboardToastManager}>\n <AnchoredToasts />\n {children}\n </Toast.Provider>\n </Tooltip.Provider>\n );\n}\n\n/**\n * Read-only text field with a one-click copy-to-clipboard button.\n *\n * @example\n * ```tsx\n * <ClipboardText text=\"0c239dd2\" />\n * ```\n */\nexport const ClipboardText = forwardRef<HTMLDivElement, ClipboardTextProps>(\n (\n {\n text,\n textToCopy,\n className,\n size = KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS.size,\n onCopy,\n tooltip,\n labels: { copyAction = \"Copy to clipboard\" } = {},\n },\n ref,\n ) => {\n const [copied, setCopied] = useState(false);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const sizeConfig = resolveVariant(KUMO_CLIPBOARD_TEXT_VARIANTS.size, size, KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS.size);\n\n // Destructure tooltip config with defaults\n const {\n text: tooltipText = \"Copy\",\n copiedText = \"Copied\",\n side: tooltipSide = \"top\",\n } = tooltip ?? {};\n\n const copyToClipboard = useCallback(async () => {\n try {\n if (\n typeof navigator !== \"undefined\" &&\n navigator.clipboard &&\n typeof navigator.clipboard.writeText === \"function\"\n ) {\n await navigator.clipboard.writeText(textToCopy ?? text);\n } else if (typeof document !== \"undefined\") {\n // Fallback for older browsers\n const textarea = document.createElement(\"textarea\");\n textarea.value = textToCopy ?? text;\n textarea.setAttribute(\"readonly\", \"\");\n textarea.style.position = \"absolute\";\n textarea.style.left = \"-9999px\";\n document.body.appendChild(textarea);\n const selection = document.getSelection();\n const previousRange = selection?.rangeCount\n ? selection.getRangeAt(0)\n : null;\n textarea.select();\n try {\n document.execCommand(\"copy\");\n } finally {\n document.body.removeChild(textarea);\n if (previousRange) {\n selection?.removeAllRanges();\n selection?.addRange(previousRange);\n }\n }\n }\n\n setCopied(true);\n\n // Show anchored toast if tooltip mode is enabled\n if (tooltip) {\n clipboardToastManager.add({\n description: copiedText,\n positionerProps: {\n anchor: buttonRef.current,\n side: tooltipSide,\n sideOffset: 8,\n },\n timeout: 1500,\n onClose() {\n setCopied(false);\n },\n });\n } else {\n // Reset copied state after delay when no tooltip\n setTimeout(() => setCopied(false), 1500);\n }\n\n onCopy?.();\n } catch (error) {\n console.warn(\"Clipboard copy failed\", error);\n }\n }, [text, onCopy, tooltip, copiedText, tooltipSide]);\n\n const copyButton = (\n <Button\n ref={buttonRef}\n size={sizeConfig.buttonSize}\n variant=\"ghost\"\n className={cn(\n \"rounded-l-none rounded-r-[inherit] border-l! border-kumo-line! px-3 relative isolate overflow-hidden transition-all duration-200\",\n \"focus:ring-inset focus:ring-kumo-focus/50\",\n \"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-kumo-brand\",\n )}\n onClick={copyToClipboard}\n aria-label={copyAction}\n >\n <span\n className={cn(\n \"flex items-center gap-1 transition-all duration-200\",\n copied\n ? clipboardTextAnimations.slide.animate\n : clipboardTextAnimations.slide.initial,\n )}\n >\n <CheckIcon />\n </span>\n <span\n className={cn(\n \"flex items-center justify-center transition-all duration-200\",\n copied\n ? clipboardTextAnimations.slide.end\n : clipboardTextAnimations.slide.animate,\n )}\n >\n <CopyIcon />\n </span>\n </Button>\n );\n\n return (\n <div\n ref={ref}\n className={cn(\n inputVariants({ size: sizeConfig.buttonSize }),\n clipboardTextVariants({ size }),\n className,\n )}\n >\n <span className=\"grow truncate ps-4 pe-2\">{text}</span>\n {tooltip ? (\n <TooltipWrapper>\n <Tooltip.Root\n disabled={copied}\n onOpenChange={(open, eventDetails) => {\n // Prevent tooltip from closing when button is clicked\n if (eventDetails.reason === \"trigger-press\") {\n eventDetails.cancel();\n }\n }}\n >\n <Tooltip.Trigger render={copyButton} />\n <Tooltip.Portal>\n <Tooltip.Positioner side={tooltipSide} sideOffset={8}>\n <Tooltip.Popup\n className={cn(\n \"flex origin-[var(--transform-origin)] flex-col rounded-md bg-kumo-base px-3 py-1.5 text-xs text-kumo-default\",\n \"shadow-lg shadow-kumo-tip-shadow outline outline-kumo-fill\",\n )}\n >\n {tooltipText}\n </Tooltip.Popup>\n </Tooltip.Positioner>\n </Tooltip.Portal>\n </Tooltip.Root>\n </TooltipWrapper>\n ) : (\n copyButton\n )}\n <span className=\"sr-only\" aria-live=\"polite\">\n {copied ? copiedText : \"\"}\n </span>\n </div>\n );\n },\n);\n\nClipboardText.displayName = \"ClipboardText\";\n"],"names":["clipboardToastManager","Toast.createToastManager","KUMO_CLIPBOARD_TEXT_VARIANTS","KUMO_CLIPBOARD_TEXT_DEFAULT_VARIANTS","clipboardTextAnimations","clipboardTextVariants","size","cn","resolveVariant","AnchoredToasts","toasts","Toast.useToastManager","Toast.Viewport","toast","Toast.Positioner","jsx","Toast.Root","Toast.Description","TooltipWrapper","children","Tooltip.Provider","Toast.Provider","ClipboardText","forwardRef","text","textToCopy","className","onCopy","tooltip","copyAction","ref","copied","setCopied","useState","buttonRef","useRef","sizeConfig","tooltipText","copiedText","tooltipSide","copyToClipboard","useCallback","textarea","selection","previousRange","error","copyButton","jsxs","Button","CheckIcon","CopyIcon","inputVariants","Tooltip.Root","open","eventDetails","Tooltip.Trigger","Tooltip.Portal","Tooltip.Positioner","Tooltip.Popup"],"mappings":"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"}