@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.
- package/CHANGELOG.md +27 -0
- package/ai/component-registry.json +227 -16
- package/ai/component-registry.md +324 -8
- package/ai/schemas.ts +5 -2
- package/dist/.build-complete +1 -1
- package/dist/ai/schemas.d.ts +10 -4
- package/dist/ai/schemas.d.ts.map +1 -1
- package/dist/ai/schemas.js +510 -504
- package/dist/ai/schemas.js.map +1 -1
- package/dist/chunks/{autocomplete-48aq0d244bs2e8zv.js → autocomplete-ln55iimq2n2s5uex.js} +27 -26
- package/dist/chunks/autocomplete-ln55iimq2n2s5uex.js.map +1 -0
- package/dist/chunks/{badge-dan90i0rzy4pwa1j.js → badge-kqox9toi0sygfbno.js} +16 -16
- package/dist/chunks/badge-kqox9toi0sygfbno.js.map +1 -0
- package/dist/chunks/{banner-eiwcnk7ts21s3bnb.js → banner-eux4y8xaogjg64af.js} +32 -31
- package/dist/chunks/banner-eux4y8xaogjg64af.js.map +1 -0
- package/dist/chunks/{breadcrumbs-cxcwf2l1ki3ffg5d.js → breadcrumbs-do6uyvm4msqus0sz.js} +33 -32
- package/dist/chunks/breadcrumbs-do6uyvm4msqus0sz.js.map +1 -0
- package/dist/chunks/{button-6by9ntsa3nj553mq.js → button-dh366jtvswxj0fw3.js} +63 -62
- package/dist/chunks/button-dh366jtvswxj0fw3.js.map +1 -0
- package/dist/chunks/{checkbox-hvxfvhtx1qjo2mww.js → checkbox-cf2pwdupyjweg184.js} +2 -2
- package/dist/chunks/checkbox-cf2pwdupyjweg184.js.map +1 -0
- package/dist/chunks/{clipboard-text-hswydzx3iql369sd.js → clipboard-text-hn2uwdj4ozenezd5.js} +57 -56
- package/dist/chunks/clipboard-text-hn2uwdj4ozenezd5.js.map +1 -0
- package/dist/chunks/{code-f9v1ikwhekqw274q.js → code-bbnjm8vk9hxl129r.js} +20 -19
- package/dist/chunks/code-bbnjm8vk9hxl129r.js.map +1 -0
- package/dist/chunks/{collapsible-k8urhi16pg90jvxa.js → collapsible-nlp2jvcyuzxmq28o.js} +12 -11
- package/dist/chunks/{collapsible-k8urhi16pg90jvxa.js.map → collapsible-nlp2jvcyuzxmq28o.js.map} +1 -1
- package/dist/chunks/{combobox-fq36ye0hstote16x.js → combobox-fivcg1oorkmmmk78.js} +11 -10
- package/dist/chunks/combobox-fivcg1oorkmmmk78.js.map +1 -0
- package/dist/chunks/{command-palette-md65owxt5hv4rt9r.js → command-palette-kgiso245exdons4r.js} +2 -2
- package/dist/chunks/{command-palette-md65owxt5hv4rt9r.js.map → command-palette-kgiso245exdons4r.js.map} +1 -1
- package/dist/chunks/{dialog-k3f1fbam6nt96k8x.js → dialog-mqpvaidy0vnjwrfp.js} +16 -15
- package/dist/chunks/dialog-mqpvaidy0vnjwrfp.js.map +1 -0
- package/dist/chunks/{dropdown-zbax0zowy6m9zhmt.js → dropdown-gp5iptj1niq14lpv.js} +76 -75
- package/dist/chunks/dropdown-gp5iptj1niq14lpv.js.map +1 -0
- package/dist/chunks/{empty-b82oer7npkhtkx7k.js → empty-fr78te81o3qaj3in.js} +27 -26
- package/dist/chunks/empty-fr78te81o3qaj3in.js.map +1 -0
- package/dist/chunks/{field-c0wf94plit2gci59.js → field-dgf36p7cmz1crlnu.js} +2 -2
- package/dist/chunks/{field-c0wf94plit2gci59.js.map → field-dgf36p7cmz1crlnu.js.map} +1 -1
- package/dist/chunks/{grid-hj1ylz16p7g5uelh.js → grid-do93dv1rjggqxx7p.js} +30 -29
- package/dist/chunks/grid-do93dv1rjggqxx7p.js.map +1 -0
- package/dist/chunks/{input-ncfowphv81yq7fyy.js → input-2y9vg81trmamkb6k.js} +51 -50
- package/dist/chunks/input-2y9vg81trmamkb6k.js.map +1 -0
- package/dist/chunks/{input-area-bkyzu6f7gsck479h.js → input-area-i5wulip5pau3u6ss.js} +3 -3
- package/dist/chunks/{input-area-bkyzu6f7gsck479h.js.map → input-area-i5wulip5pau3u6ss.js.map} +1 -1
- package/dist/chunks/{input-group-bidweffa0zyg8gt0.js → input-group-bm9wxzovpvzn1c25.js} +4 -4
- package/dist/chunks/{input-group-bidweffa0zyg8gt0.js.map → input-group-bm9wxzovpvzn1c25.js.map} +1 -1
- package/dist/chunks/{label-c3h9i3y4wiccelt7.js → label-efa0uvb8zqyjwpc8.js} +2 -2
- package/dist/chunks/{label-c3h9i3y4wiccelt7.js.map → label-efa0uvb8zqyjwpc8.js.map} +1 -1
- package/dist/chunks/{link-kt74pxkud4olmcer.js → link-m9hlspftl34nseme.js} +28 -27
- package/dist/chunks/link-m9hlspftl34nseme.js.map +1 -0
- package/dist/chunks/{loader-hr2w7cpqeev3p3vl.js → loader-g8a6j76ue5nq0lr8.js} +15 -14
- package/dist/chunks/loader-g8a6j76ue5nq0lr8.js.map +1 -0
- package/dist/chunks/{pagination-jb3mncivbwsoi1se.js → pagination-fdmcwreb27eej9l3.js} +3 -3
- package/dist/chunks/pagination-fdmcwreb27eej9l3.js.map +1 -0
- package/dist/chunks/{radio-datzh3pilz8ojak1.js → radio-f95mt237ru8fyc03.js} +44 -43
- package/dist/chunks/radio-f95mt237ru8fyc03.js.map +1 -0
- package/dist/chunks/resolve-variant-gw6eh7fa4st8ej7m.js +11 -0
- package/dist/chunks/resolve-variant-gw6eh7fa4st8ej7m.js.map +1 -0
- package/dist/chunks/{select-g261chvosodu22i8.js → select-j8evv2iblgs5fa9s.js} +4 -4
- package/dist/chunks/{select-g261chvosodu22i8.js.map → select-j8evv2iblgs5fa9s.js.map} +1 -1
- package/dist/chunks/{sensitive-input-cijagk551mesdtk4.js → sensitive-input-cmb9jt42bv8jftei.js} +3 -3
- package/dist/chunks/{sensitive-input-cijagk551mesdtk4.js.map → sensitive-input-cmb9jt42bv8jftei.js.map} +1 -1
- package/dist/chunks/surface-k0e8mq1x00b7i8r6.js.map +1 -1
- package/dist/chunks/{switch-jdfsr3j3oa1qxegw.js → switch-c4qjga6x3axmoi20.js} +2 -2
- package/dist/chunks/switch-c4qjga6x3axmoi20.js.map +1 -0
- package/dist/chunks/{table-iudje0lva0z68jto.js → table-jvqy3tu48xa75n2t.js} +56 -55
- package/dist/chunks/table-jvqy3tu48xa75n2t.js.map +1 -0
- package/dist/chunks/{text-f7t467waymhb30sx.js → text-be7ehenoyldhyjma.js} +32 -28
- package/dist/chunks/text-be7ehenoyldhyjma.js.map +1 -0
- package/dist/chunks/{toast-h573o0tc7tefivk2.js → toast-c7kqwuj7qj9dx6gs.js} +75 -74
- package/dist/chunks/toast-c7kqwuj7qj9dx6gs.js.map +1 -0
- package/dist/chunks/tooltip-odudhkxe282wxinq.js.map +1 -1
- package/dist/code.js +1 -1
- package/dist/components/autocomplete.js +1 -1
- package/dist/components/badge.js +1 -1
- package/dist/components/banner.js +1 -1
- package/dist/components/breadcrumbs.js +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/clipboard-text.js +1 -1
- package/dist/components/code.js +1 -1
- package/dist/components/collapsible.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/command-palette.js +1 -1
- package/dist/components/dialog.js +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/empty.js +1 -1
- package/dist/components/field.js +1 -1
- package/dist/components/grid.js +1 -1
- package/dist/components/input-group.js +1 -1
- package/dist/components/input.js +3 -3
- package/dist/components/label.js +1 -1
- package/dist/components/link.js +1 -1
- package/dist/components/loader.js +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/radio.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/sensitive-input.js +1 -1
- package/dist/components/switch.js +1 -1
- package/dist/components/table.js +1 -1
- package/dist/components/text.js +1 -1
- package/dist/components/toast.js +1 -1
- package/dist/index.js +34 -34
- package/dist/src/components/autocomplete/autocomplete.d.ts.map +1 -1
- package/dist/src/components/badge/badge.d.ts.map +1 -1
- package/dist/src/components/banner/banner.d.ts.map +1 -1
- package/dist/src/components/breadcrumbs/breadcrumbs.d.ts.map +1 -1
- package/dist/src/components/button/button.d.ts.map +1 -1
- package/dist/src/components/checkbox/checkbox.d.ts.map +1 -1
- package/dist/src/components/clipboard-text/clipboard-text.d.ts.map +1 -1
- package/dist/src/components/code/code.d.ts.map +1 -1
- package/dist/src/components/collapsible/collapsible.d.ts +1 -1
- package/dist/src/components/collapsible/collapsible.d.ts.map +1 -1
- package/dist/src/components/combobox/combobox.d.ts.map +1 -1
- package/dist/src/components/dialog/dialog.d.ts.map +1 -1
- package/dist/src/components/dropdown/dropdown.d.ts.map +1 -1
- package/dist/src/components/empty/empty.d.ts.map +1 -1
- package/dist/src/components/grid/grid.d.ts.map +1 -1
- package/dist/src/components/input/input.d.ts.map +1 -1
- package/dist/src/components/link/link.d.ts.map +1 -1
- package/dist/src/components/loader/loader.d.ts.map +1 -1
- package/dist/src/components/pagination/pagination.d.ts.map +1 -1
- package/dist/src/components/radio/radio.d.ts.map +1 -1
- package/dist/src/components/surface/surface.d.ts.map +1 -1
- package/dist/src/components/switch/switch.d.ts.map +1 -1
- package/dist/src/components/table/table.d.ts.map +1 -1
- package/dist/src/components/text/text.d.ts.map +1 -1
- package/dist/src/components/toast/toast.d.ts.map +1 -1
- package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/src/utils/resolve-variant.d.ts +27 -0
- package/dist/src/utils/resolve-variant.d.ts.map +1 -0
- package/package.json +1 -1
- package/scripts/component-registry/index.test.ts +42 -0
- package/scripts/component-registry/index.ts +18 -4
- package/scripts/component-registry/metadata.ts +239 -4
- package/dist/chunks/autocomplete-48aq0d244bs2e8zv.js.map +0 -1
- package/dist/chunks/badge-dan90i0rzy4pwa1j.js.map +0 -1
- package/dist/chunks/banner-eiwcnk7ts21s3bnb.js.map +0 -1
- package/dist/chunks/breadcrumbs-cxcwf2l1ki3ffg5d.js.map +0 -1
- package/dist/chunks/button-6by9ntsa3nj553mq.js.map +0 -1
- package/dist/chunks/checkbox-hvxfvhtx1qjo2mww.js.map +0 -1
- package/dist/chunks/clipboard-text-hswydzx3iql369sd.js.map +0 -1
- package/dist/chunks/code-f9v1ikwhekqw274q.js.map +0 -1
- package/dist/chunks/combobox-fq36ye0hstote16x.js.map +0 -1
- package/dist/chunks/dialog-k3f1fbam6nt96k8x.js.map +0 -1
- package/dist/chunks/dropdown-zbax0zowy6m9zhmt.js.map +0 -1
- package/dist/chunks/empty-b82oer7npkhtkx7k.js.map +0 -1
- package/dist/chunks/grid-hj1ylz16p7g5uelh.js.map +0 -1
- package/dist/chunks/input-ncfowphv81yq7fyy.js.map +0 -1
- package/dist/chunks/link-kt74pxkud4olmcer.js.map +0 -1
- package/dist/chunks/loader-hr2w7cpqeev3p3vl.js.map +0 -1
- package/dist/chunks/pagination-jb3mncivbwsoi1se.js.map +0 -1
- package/dist/chunks/radio-datzh3pilz8ojak1.js.map +0 -1
- package/dist/chunks/switch-jdfsr3j3oa1qxegw.js.map +0 -1
- package/dist/chunks/table-iudje0lva0z68jto.js.map +0 -1
- package/dist/chunks/text-f7t467waymhb30sx.js.map +0 -1
- package/dist/chunks/toast-h573o0tc7tefivk2.js.map +0 -1
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as t, jsxs as A } from "react/jsx-runtime";
|
|
3
3
|
import { CheckIcon as g } from "@phosphor-icons/react";
|
|
4
|
-
import { K as
|
|
4
|
+
import { K as u, i as y } from "./input-2y9vg81trmamkb6k.js";
|
|
5
5
|
import { c as s } from "./cn-ct4n7r74mh8y0f48.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
import { r as C } from "./resolve-variant-gw6eh7fa4st8ej7m.js";
|
|
7
|
+
import { F as I } from "./field-dgf36p7cmz1crlnu.js";
|
|
8
|
+
import { a6 as v, ab as T, bu as k, a8 as z, S as G, a9 as L, aa as O, bt as P, am as _, an as w, ao as E, ac as S } from "./vendor-base-ui-ie71jahf0czyf58j.js";
|
|
9
|
+
const q = {
|
|
10
|
+
size: u.size
|
|
11
|
+
}, l = {
|
|
11
12
|
size: "base"
|
|
12
13
|
};
|
|
13
|
-
function
|
|
14
|
-
size: o =
|
|
14
|
+
function B({
|
|
15
|
+
size: o = l.size
|
|
15
16
|
} = {}) {
|
|
16
|
-
return s(
|
|
17
|
+
return s(C(u.size, o, l.size).classes);
|
|
17
18
|
}
|
|
18
19
|
function p({
|
|
19
20
|
label: o,
|
|
@@ -24,26 +25,26 @@ function p({
|
|
|
24
25
|
children: n,
|
|
25
26
|
...i
|
|
26
27
|
}) {
|
|
27
|
-
const
|
|
28
|
+
const c = /* @__PURE__ */ t(k, { ...i, children: n });
|
|
28
29
|
return o ? /* @__PURE__ */ t(
|
|
29
|
-
|
|
30
|
+
I,
|
|
30
31
|
{
|
|
31
32
|
label: o,
|
|
32
33
|
required: e,
|
|
33
34
|
labelTooltip: r,
|
|
34
35
|
description: m,
|
|
35
36
|
error: a ? typeof a == "string" ? { message: a, match: !0 } : a : void 0,
|
|
36
|
-
children:
|
|
37
|
+
children: c
|
|
37
38
|
}
|
|
38
|
-
) :
|
|
39
|
+
) : c;
|
|
39
40
|
}
|
|
40
41
|
function d({
|
|
41
42
|
className: o,
|
|
42
|
-
size: e =
|
|
43
|
+
size: e = l.size,
|
|
43
44
|
placeholder: r
|
|
44
45
|
}) {
|
|
45
46
|
return /* @__PURE__ */ t(
|
|
46
|
-
|
|
47
|
+
S,
|
|
47
48
|
{
|
|
48
49
|
className: s(
|
|
49
50
|
y({ size: e, focusIndicator: !0 }),
|
|
@@ -71,7 +72,7 @@ function b({
|
|
|
71
72
|
alignOffset: a,
|
|
72
73
|
side: n,
|
|
73
74
|
children: /* @__PURE__ */ t(
|
|
74
|
-
|
|
75
|
+
E,
|
|
75
76
|
{
|
|
76
77
|
className: (i) => s(
|
|
77
78
|
"flex flex-col",
|
|
@@ -87,12 +88,12 @@ function b({
|
|
|
87
88
|
}
|
|
88
89
|
) });
|
|
89
90
|
}
|
|
90
|
-
function
|
|
91
|
+
function U({
|
|
91
92
|
className: o,
|
|
92
93
|
...e
|
|
93
94
|
}) {
|
|
94
95
|
return /* @__PURE__ */ t(
|
|
95
|
-
|
|
96
|
+
z,
|
|
96
97
|
{
|
|
97
98
|
...e,
|
|
98
99
|
className: s(
|
|
@@ -152,7 +153,7 @@ f.displayName = "Autocomplete.Item";
|
|
|
152
153
|
x.displayName = "Autocomplete.GroupLabel";
|
|
153
154
|
N.displayName = "Autocomplete.Group";
|
|
154
155
|
h.displayName = "Autocomplete.Separator";
|
|
155
|
-
const
|
|
156
|
+
const H = Object.assign(p, {
|
|
156
157
|
// Styled compound sub-components
|
|
157
158
|
InputGroup: d,
|
|
158
159
|
Content: b,
|
|
@@ -160,15 +161,15 @@ const q = Object.assign(p, {
|
|
|
160
161
|
GroupLabel: x,
|
|
161
162
|
Group: N,
|
|
162
163
|
Separator: h,
|
|
163
|
-
List:
|
|
164
|
+
List: U,
|
|
164
165
|
// Pass-through Base UI sub-components
|
|
165
166
|
Empty: T,
|
|
166
|
-
Collection:
|
|
167
|
+
Collection: v
|
|
167
168
|
});
|
|
168
169
|
export {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
170
|
+
H as A,
|
|
171
|
+
q as K,
|
|
172
|
+
B as a,
|
|
173
|
+
l as b
|
|
173
174
|
};
|
|
174
|
-
//# sourceMappingURL=autocomplete-
|
|
175
|
+
//# sourceMappingURL=autocomplete-ln55iimq2n2s5uex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete-ln55iimq2n2s5uex.js","sources":["../../src/components/autocomplete/autocomplete.tsx"],"sourcesContent":["import { Autocomplete as AutocompleteBase } from \"@base-ui/react/autocomplete\";\nimport { CheckIcon } from \"@phosphor-icons/react\";\nimport { type ReactNode } from \"react\";\nimport { inputVariants, KUMO_INPUT_VARIANTS } from \"../input/input\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\nimport { Field, type FieldErrorMatch } from \"../field/field\";\n\n/** Autocomplete variant definitions. */\nexport const KUMO_AUTOCOMPLETE_VARIANTS = {\n size: KUMO_INPUT_VARIANTS.size,\n} as const;\n\nexport const KUMO_AUTOCOMPLETE_DEFAULT_VARIANTS = {\n size: \"base\",\n} as const;\n\n// Derived types from KUMO_AUTOCOMPLETE_VARIANTS\nexport type KumoAutocompleteSize = keyof typeof KUMO_AUTOCOMPLETE_VARIANTS.size;\n\nexport interface KumoAutocompleteVariantsProps {\n /**\n * Size of the autocomplete input. Matches Input component sizes.\n * - `\"xs\"` — Extra small for compact UIs (h-5 / 20px)\n * - `\"sm\"` — Small for secondary fields (h-6.5 / 26px)\n * - `\"base\"` — Default size (h-9 / 36px)\n * - `\"lg\"` — Large for prominent fields (h-10 / 40px)\n * @default \"base\"\n */\n size?: KumoAutocompleteSize;\n}\n\nexport function autocompleteVariants({\n size = KUMO_AUTOCOMPLETE_DEFAULT_VARIANTS.size,\n}: KumoAutocompleteVariantsProps = {}) {\n return cn(resolveVariant(KUMO_INPUT_VARIANTS.size, size, KUMO_AUTOCOMPLETE_DEFAULT_VARIANTS.size).classes);\n}\n\n/**\n * Autocomplete component props.\n *\n * Autocomplete provides a free-form text input with optional suggestions in a\n * filterable dropdown. Unlike Combobox, the input value is not constrained to\n * the suggestion list items.\n *\n * @example\n * ```tsx\n * <Autocomplete label=\"Country\" items={countries}>\n * <Autocomplete.InputGroup />\n * <Autocomplete.Content>\n * <Autocomplete.List>\n * {(item) => <Autocomplete.Item value={item}>{item}</Autocomplete.Item>}\n * </Autocomplete.List>\n * </Autocomplete.Content>\n * </Autocomplete>\n * ```\n */\nexport interface AutocompleteProps {\n /** Array of items to display in the dropdown */\n items: unknown[];\n /** The controlled input value */\n value?: string | number | string[];\n /** The uncontrolled default input value */\n defaultValue?: string | number | string[];\n /** Callback when the input value changes */\n onValueChange?: AutocompleteBase.Root.Props<unknown>[\"onValueChange\"];\n /** Whether the popup is open (controlled) */\n open?: boolean;\n /** Callback when the popup opens or closes */\n onOpenChange?: AutocompleteBase.Root.Props<unknown>[\"onOpenChange\"];\n /** Autocomplete content (input group, popup content) */\n children: ReactNode;\n /** Additional CSS classes */\n className?: string;\n /** Label content (enables Field wrapper) */\n label?: ReactNode;\n /** Whether the field is required */\n required?: boolean;\n /** Tooltip content to display next to the label */\n labelTooltip?: ReactNode;\n /** Helper text displayed below the field */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}\n\nfunction Root<ItemValue>({\n label,\n required,\n labelTooltip,\n description,\n error,\n children,\n ...props\n}: AutocompleteBase.Root.Props<ItemValue> & {\n label?: ReactNode;\n required?: boolean;\n labelTooltip?: ReactNode;\n description?: ReactNode;\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}) {\n const rootProps = props as Omit<\n AutocompleteBase.Root.Props<ItemValue>,\n \"items\"\n > & {\n items?: readonly ItemValue[];\n };\n const control = (\n <AutocompleteBase.Root {...rootProps}>{children}</AutocompleteBase.Root>\n );\n\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 {control}\n </Field>\n );\n }\n\n return control;\n}\n\nfunction InputGroup({\n className,\n size = KUMO_AUTOCOMPLETE_DEFAULT_VARIANTS.size,\n placeholder,\n}: {\n className?: string;\n size?: KumoAutocompleteSize;\n placeholder?: string;\n}) {\n return (\n <AutocompleteBase.Input\n className={cn(\n inputVariants({ size, focusIndicator: true }),\n \"w-full\",\n className,\n )}\n placeholder={placeholder}\n />\n );\n}\n\nfunction Content({\n children,\n className,\n align = \"start\",\n sideOffset = 4,\n alignOffset,\n side,\n}: {\n children?: ReactNode;\n className?: string;\n align?: AutocompleteBase.Positioner.Props[\"align\"];\n alignOffset?: AutocompleteBase.Positioner.Props[\"alignOffset\"];\n side?: AutocompleteBase.Positioner.Props[\"side\"];\n sideOffset?: AutocompleteBase.Positioner.Props[\"sideOffset\"];\n}) {\n return (\n <AutocompleteBase.Portal>\n <AutocompleteBase.Positioner\n className=\"outline-none\"\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n side={side}\n >\n <AutocompleteBase.Popup\n className={(state: AutocompleteBase.Popup.State) =>\n cn(\n \"flex flex-col\",\n \"max-h-[min(var(--available-height),24rem)] max-w-(--available-width) min-w-(--anchor-width) py-1.5\",\n \"bg-kumo-control text-kumo-default\",\n \"rounded-lg shadow-lg ring ring-kumo-line\",\n state.empty && \"hidden\",\n className,\n )\n }\n >\n {children}\n </AutocompleteBase.Popup>\n </AutocompleteBase.Positioner>\n </AutocompleteBase.Portal>\n );\n}\n\nfunction List({\n className,\n ...props\n}: AutocompleteBase.List.Props & { className?: string }) {\n return (\n <AutocompleteBase.List\n {...props}\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto overscroll-contain scroll-pt-2 scroll-pb-2\",\n className,\n )}\n />\n );\n}\n\nfunction Item({ children, ...props }: AutocompleteBase.Item.Props) {\n return (\n <AutocompleteBase.Item\n {...props}\n className=\"group mx-1.5 grid cursor-pointer grid-cols-[1fr_16px] gap-2 rounded px-2 py-1.5 text-base data-highlighted:bg-kumo-overlay data-selected:font-medium\"\n >\n <div className=\"col-start-1\">{children}</div>\n <span className=\"col-start-2 hidden items-center group-data-selected:flex\">\n <CheckIcon size={14} />\n </span>\n </AutocompleteBase.Item>\n );\n}\n\nfunction GroupLabel(props: AutocompleteBase.GroupLabel.Props) {\n return (\n <AutocompleteBase.GroupLabel\n {...props}\n className={cn(\n \"mx-1.5 px-2 py-1.5 text-sm text-kumo-strong\",\n props.className,\n )}\n />\n );\n}\n\nfunction Group(props: AutocompleteBase.Group.Props) {\n return (\n <AutocompleteBase.Group\n {...props}\n className=\"border-t border-kumo-line mt-2 pt-2 first:border-t-0 first:mt-0 first:pt-0\"\n />\n );\n}\n\nfunction Separator(props: AutocompleteBase.Separator.Props) {\n return (\n <AutocompleteBase.Separator\n {...props}\n className={cn(\"mx-0 my-1 h-px bg-kumo-line\", props.className)}\n />\n );\n}\n\nRoot.displayName = \"Autocomplete.Root\";\nInputGroup.displayName = \"Autocomplete.InputGroup\";\nContent.displayName = \"Autocomplete.Content\";\nItem.displayName = \"Autocomplete.Item\";\nGroupLabel.displayName = \"Autocomplete.GroupLabel\";\nGroup.displayName = \"Autocomplete.Group\";\nSeparator.displayName = \"Autocomplete.Separator\";\n\n/**\n * Autocomplete — free-form text input with an optional filtered suggestion list.\n *\n * Unlike Combobox, the input value is not restricted to items in the list.\n * Use Combobox when the selected value must come from the list.\n *\n * Compound component: `Autocomplete` (Root), `.InputGroup`, `.Content`, `.Item`,\n * `.GroupLabel`, `.Group`, `.Separator`, `.List`, `.Collection`.\n *\n * `InputGroup` renders the text input with Input component styling.\n * Pass a `size` prop to `InputGroup` to match the Input component sizes.\n *\n * @example\n * ```tsx\n * <Autocomplete items={fruits} label=\"Fruit\">\n * <Autocomplete.InputGroup size=\"base\" />\n * <Autocomplete.Content>\n * <Autocomplete.List>\n * {(item) => <Autocomplete.Item value={item}>{item}</Autocomplete.Item>}\n * </Autocomplete.List>\n * </Autocomplete.Content>\n * </Autocomplete>\n * ```\n *\n * @see https://base-ui.com/react/components/autocomplete\n */\nexport const Autocomplete = Object.assign(Root, {\n // Styled compound sub-components\n InputGroup,\n Content,\n Item,\n GroupLabel,\n Group,\n Separator,\n List,\n\n // Pass-through Base UI sub-components\n Empty: AutocompleteBase.Empty,\n Collection: AutocompleteBase.Collection,\n});\n"],"names":["KUMO_AUTOCOMPLETE_VARIANTS","KUMO_INPUT_VARIANTS","KUMO_AUTOCOMPLETE_DEFAULT_VARIANTS","autocompleteVariants","size","cn","resolveVariant","Root","label","required","labelTooltip","description","error","children","props","control","jsx","AutocompleteBase.Root","Field","InputGroup","className","placeholder","AutocompleteBase.Input","inputVariants","Content","align","sideOffset","alignOffset","side","AutocompleteBase.Portal","AutocompleteBase.Positioner","AutocompleteBase.Popup","state","List","AutocompleteBase.List","Item","jsxs","AutocompleteBase.Item","CheckIcon","GroupLabel","AutocompleteBase.GroupLabel","Group","AutocompleteBase.Group","Separator","AutocompleteBase.Separator","Autocomplete","AutocompleteBase.Empty","AutocompleteBase.Collection"],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as
|
|
3
|
-
import { c as
|
|
4
|
-
|
|
2
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
3
|
+
import { c as a } from "./cn-ct4n7r74mh8y0f48.js";
|
|
4
|
+
import { r as i } from "./resolve-variant-gw6eh7fa4st8ej7m.js";
|
|
5
|
+
const o = "inline-flex w-fit flex-none shrink-0 items-center justify-self-start rounded-full px-2 py-0.5 text-xs font-medium whitespace-nowrap", d = {
|
|
5
6
|
variant: {
|
|
6
7
|
/** Semantic token badges */
|
|
7
8
|
primary: {
|
|
@@ -74,29 +75,28 @@ const o = "inline-flex w-fit flex-none shrink-0 items-center justify-self-start
|
|
|
74
75
|
description: "Blue badge"
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
|
-
},
|
|
78
|
+
}, t = {
|
|
78
79
|
variant: "primary"
|
|
79
80
|
};
|
|
80
|
-
function
|
|
81
|
-
variant: e =
|
|
81
|
+
function b({
|
|
82
|
+
variant: e = t.variant
|
|
82
83
|
} = {}) {
|
|
83
|
-
|
|
84
|
-
return r(
|
|
84
|
+
return a(
|
|
85
85
|
// Base styles (exported as KUMO_BADGE_BASE_STYLES for Figma plugin)
|
|
86
86
|
o,
|
|
87
87
|
// Apply variant styles from KUMO_BADGE_VARIANTS (fallback to primary if variant not found)
|
|
88
|
-
|
|
88
|
+
i(d.variant, e, t.variant).classes
|
|
89
89
|
);
|
|
90
90
|
}
|
|
91
|
-
function
|
|
92
|
-
variant: e =
|
|
93
|
-
className:
|
|
94
|
-
children:
|
|
91
|
+
function l({
|
|
92
|
+
variant: e = t.variant,
|
|
93
|
+
className: s,
|
|
94
|
+
children: r
|
|
95
95
|
}) {
|
|
96
|
-
return /* @__PURE__ */
|
|
96
|
+
return /* @__PURE__ */ n("span", { className: a(b({ variant: e }), s), children: r });
|
|
97
97
|
}
|
|
98
98
|
export {
|
|
99
|
-
|
|
99
|
+
l as B,
|
|
100
100
|
o as K
|
|
101
101
|
};
|
|
102
|
-
//# sourceMappingURL=badge-
|
|
102
|
+
//# sourceMappingURL=badge-kqox9toi0sygfbno.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge-kqox9toi0sygfbno.js","sources":["../../src/components/badge/badge.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\n\n/** Base styles applied to all badge variants. */\nexport const KUMO_BADGE_BASE_STYLES =\n \"inline-flex w-fit flex-none shrink-0 items-center justify-self-start rounded-full px-2 py-0.5 text-xs font-medium whitespace-nowrap\";\n\n/** Badge variant definitions mapping variant names to their Tailwind classes and descriptions. */\nexport const KUMO_BADGE_VARIANTS = {\n variant: {\n /** Semantic token badges */\n primary: {\n classes: \"bg-kumo-badge-inverted text-kumo-badge-inverted\",\n description: \"Primary badge\",\n },\n secondary: {\n classes: \"bg-kumo-fill text-kumo-badge-neutral-subtle\",\n description: \"Secondary badge\",\n },\n error: {\n classes: \"bg-kumo-danger-tint/60 text-kumo-danger\",\n description: \"Error badge\",\n },\n warning: {\n classes: \"bg-kumo-warning-tint/70 text-kumo-warning\",\n description: \"Warning badge\",\n },\n success: {\n classes: \"bg-kumo-success-tint/70 text-kumo-success\",\n description: \"Success badge\",\n },\n destructive: {\n classes: \"bg-kumo-badge-red text-white\",\n description: \"Deprecated. Use red instead.\",\n },\n info: {\n classes: \"bg-kumo-info-tint/70 text-kumo-info\",\n description: \"Info badge\",\n },\n beta: {\n classes:\n \"border border-dashed border-kumo-brand bg-transparent text-kumo-link\",\n description: \"Indicates beta or experimental features\",\n },\n outline: {\n classes: \"border border-kumo-fill bg-transparent text-kumo-default\",\n description: \"Bordered badge with transparent background\",\n },\n\n /** Other color token variants */\n\n red: {\n classes: \"bg-kumo-badge-red text-white\",\n description: \"Red badge\",\n },\n green: {\n classes: \"bg-kumo-badge-green text-white\",\n description: \"Green badge\",\n },\n neutral: {\n classes: \"bg-kumo-badge-neutral text-white\",\n description: \"Neutral badge\",\n },\n orange: {\n classes: \"bg-kumo-badge-orange text-black\",\n description: \"Orange badge\",\n },\n purple: {\n classes: \"bg-kumo-badge-purple text-white\",\n description: \"Purple badge\",\n },\n teal: {\n classes: \"bg-kumo-badge-teal text-white\",\n description: \"Teal badge\",\n },\n \"teal-subtle\": {\n classes: \"bg-kumo-badge-teal-subtle text-kumo-badge-teal-subtle\",\n description: \"Subtle teal badge\",\n },\n blue: {\n classes: \"bg-kumo-badge-blue text-white\",\n description: \"Blue badge\",\n },\n },\n} as const;\n\nexport const KUMO_BADGE_DEFAULT_VARIANTS = {\n variant: \"primary\",\n} as const;\n\n// Derived types from KUMO_BADGE_VARIANTS\nexport type KumoBadgeVariant = keyof typeof KUMO_BADGE_VARIANTS.variant;\n\nexport interface KumoBadgeVariantsProps {\n variant?: KumoBadgeVariant;\n}\n\nexport function badgeVariants({\n variant = KUMO_BADGE_DEFAULT_VARIANTS.variant,\n}: KumoBadgeVariantsProps = {}) {\n return cn(\n // Base styles (exported as KUMO_BADGE_BASE_STYLES for Figma plugin)\n KUMO_BADGE_BASE_STYLES,\n // Apply variant styles from KUMO_BADGE_VARIANTS (fallback to primary if variant not found)\n resolveVariant(KUMO_BADGE_VARIANTS.variant, variant, KUMO_BADGE_DEFAULT_VARIANTS.variant).classes,\n );\n}\n\n// Legacy type alias for backwards compatibility\nexport type BadgeVariant = KumoBadgeVariant;\n\n/**\n * Badge component props.\n *\n * @example\n * ```tsx\n * <Badge variant=\"green\">Active</Badge>\n * <Badge variant=\"red\">Error</Badge>\n * <Badge variant=\"neutral\">Inactive</Badge>\n * ```\n */\nexport interface BadgeProps {\n /**\n * Color variant of the badge.\n * Recommended semantic variants:\n * - `\"primary\"` — Primary badge\n * - `\"secondary\"` — Secondary badge\n * - `\"error\"` — Error badge\n * - `\"warning\"` — Warning badge\n * - `\"success\"` — Success badge\n * - `\"info\"` — Info badge\n *\n * Additional token variants:\n * - `\"red\"`, `\"orange\"`, `\"green\"`, `\"teal\"`, `\"blue\"`, `\"purple\"`, `\"neutral\"`\n * - `\"teal-subtle\"`, `\"neutral-subtle\"`\n * - `\"inverted\"`\n * - `\"outline\"` — Bordered badge with transparent background\n * - `\"beta\"` — Dashed-border badge for beta/experimental features\n * @default \"secondary\"\n */\n variant?: KumoBadgeVariant;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Content rendered inside the badge. */\n children: ReactNode;\n}\n\n/**\n * Small status label for categorizing or highlighting content.\n *\n * @example\n * ```tsx\n * <Badge variant=\"green\">Active</Badge>\n * ```\n */\nexport function Badge({\n variant = KUMO_BADGE_DEFAULT_VARIANTS.variant,\n className,\n children,\n}: BadgeProps) {\n return (\n <span className={cn(badgeVariants({ variant }), className)}>\n {children}\n </span>\n );\n}\n"],"names":["KUMO_BADGE_BASE_STYLES","KUMO_BADGE_VARIANTS","KUMO_BADGE_DEFAULT_VARIANTS","badgeVariants","variant","cn","resolveVariant","Badge","className","children","jsx"],"mappings":";;;;AAKO,MAAMA,IACX,uIAGWC,IAAsB;AAAA,EACjC,SAAS;AAAA;AAAA,IAEP,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,WAAW;AAAA,MACT,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,OAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,aAAa;AAAA,MACX,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM;AAAA,MACJ,SACE;AAAA,MACF,aAAa;AAAA,IAAA;AAAA,IAEf,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA;AAAA,IAKf,KAAK;AAAA,MACH,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,OAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,eAAe;AAAA,MACb,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GAEaC,IAA8B;AAAA,EACzC,SAAS;AACX;AASO,SAASC,EAAc;AAAA,EAC5B,SAAAC,IAAUF,EAA4B;AACxC,IAA4B,IAAI;AAC9B,SAAOG;AAAA;AAAA,IAELL;AAAA;AAAA,IAEAM,EAAeL,EAAoB,SAASG,GAASF,EAA4B,OAAO,EAAE;AAAA,EAAA;AAE9F;AAiDO,SAASK,EAAM;AAAA,EACpB,SAAAH,IAAUF,EAA4B;AAAA,EACtC,WAAAM;AAAA,EACA,UAAAC;AACF,GAAe;AACb,SACE,gBAAAC,EAAC,QAAA,EAAK,WAAWL,EAAGF,EAAc,EAAE,SAAAC,GAAS,GAAGI,CAAS,GACtD,UAAAC,EAAA,CACH;AAEJ;"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsxs as i, jsx as
|
|
3
|
-
import { forwardRef as
|
|
2
|
+
import { jsxs as i, jsx as n } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as h, isValidElement as g } from "react";
|
|
4
4
|
import { c as r } from "./cn-ct4n7r74mh8y0f48.js";
|
|
5
|
-
|
|
5
|
+
import { r as k } from "./resolve-variant-gw6eh7fa4st8ej7m.js";
|
|
6
|
+
const E = "flex w-full items-start gap-3 rounded-lg border px-4 py-3 text-base", N = {
|
|
6
7
|
variant: {
|
|
7
8
|
default: {
|
|
8
9
|
classes: "bg-kumo-info-tint/30 border-kumo-info/50 text-kumo-info selection:bg-kumo-info",
|
|
@@ -20,60 +21,60 @@ const E = "flex w-full items-start gap-3 rounded-lg border px-4 py-3 text-base",
|
|
|
20
21
|
description: "Error banner for critical issues"
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
|
-
},
|
|
24
|
+
}, t = {
|
|
24
25
|
variant: "default"
|
|
25
26
|
};
|
|
26
|
-
function
|
|
27
|
-
variant: e =
|
|
27
|
+
function x({
|
|
28
|
+
variant: e = t.variant
|
|
28
29
|
} = {}) {
|
|
29
30
|
return r(
|
|
30
31
|
// Base styles (exported as KUMO_BANNER_BASE_STYLES for Figma plugin)
|
|
31
32
|
E,
|
|
32
33
|
// Apply variant styles from KUMO_BANNER_VARIANTS
|
|
33
|
-
|
|
34
|
+
k(N.variant, e, t.variant).classes
|
|
34
35
|
);
|
|
35
36
|
}
|
|
36
37
|
var R = /* @__PURE__ */ ((e) => (e[e.DEFAULT = 0] = "DEFAULT", e[e.ALERT = 1] = "ALERT", e[e.ERROR = 2] = "ERROR", e))(R || {});
|
|
37
|
-
const
|
|
38
|
+
const A = h(function({
|
|
38
39
|
icon: a,
|
|
39
|
-
title:
|
|
40
|
-
description:
|
|
41
|
-
action:
|
|
42
|
-
children:
|
|
43
|
-
text:
|
|
44
|
-
variant:
|
|
45
|
-
className:
|
|
46
|
-
},
|
|
47
|
-
const
|
|
48
|
-
if (
|
|
49
|
-
return /* @__PURE__ */ i("div", { ref:
|
|
50
|
-
a && /* @__PURE__ */
|
|
40
|
+
title: o,
|
|
41
|
+
description: s,
|
|
42
|
+
action: m,
|
|
43
|
+
children: b,
|
|
44
|
+
text: p,
|
|
45
|
+
variant: l = t.variant,
|
|
46
|
+
className: d
|
|
47
|
+
}, u) {
|
|
48
|
+
const f = k(N.variant, l, t.variant);
|
|
49
|
+
if (o || s)
|
|
50
|
+
return /* @__PURE__ */ i("div", { ref: u, className: r(x({ variant: l }), d), children: [
|
|
51
|
+
a && /* @__PURE__ */ n(
|
|
51
52
|
"span",
|
|
52
53
|
{
|
|
53
54
|
className: r(
|
|
54
55
|
"shrink-0 flex items-center h-[1.375em]",
|
|
55
|
-
|
|
56
|
+
f.iconClasses
|
|
56
57
|
),
|
|
57
58
|
children: a
|
|
58
59
|
}
|
|
59
60
|
),
|
|
60
61
|
/* @__PURE__ */ i("div", { className: "flex min-w-0 flex-1 items-center justify-between gap-3", children: [
|
|
61
62
|
/* @__PURE__ */ i("div", { className: "flex flex-col gap-0.5", children: [
|
|
62
|
-
|
|
63
|
-
|
|
63
|
+
o && /* @__PURE__ */ n("p", { className: "font-medium leading-snug", children: o }),
|
|
64
|
+
s && /* @__PURE__ */ n("div", { className: "text-sm leading-snug", children: g(s) ? s : /* @__PURE__ */ n("p", { children: s }) })
|
|
64
65
|
] }),
|
|
65
|
-
|
|
66
|
+
m && /* @__PURE__ */ n("div", { className: "flex shrink-0 items-center gap-2", children: m })
|
|
66
67
|
] })
|
|
67
68
|
] });
|
|
68
|
-
const
|
|
69
|
-
return /* @__PURE__ */ i("div", { ref:
|
|
70
|
-
a && /* @__PURE__ */
|
|
71
|
-
|
|
69
|
+
const c = b ?? p, v = g(c) ? c : /* @__PURE__ */ n("p", { children: c });
|
|
70
|
+
return /* @__PURE__ */ i("div", { ref: u, className: r(x({ variant: l }), d), children: [
|
|
71
|
+
a && /* @__PURE__ */ n("span", { className: r("shrink-0", f.iconClasses), children: a }),
|
|
72
|
+
v
|
|
72
73
|
] });
|
|
73
74
|
});
|
|
74
|
-
|
|
75
|
+
A.displayName = "Banner";
|
|
75
76
|
export {
|
|
76
|
-
|
|
77
|
+
A as B,
|
|
77
78
|
R as a
|
|
78
79
|
};
|
|
79
|
-
//# sourceMappingURL=banner-
|
|
80
|
+
//# sourceMappingURL=banner-eux4y8xaogjg64af.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner-eux4y8xaogjg64af.js","sources":["../../src/components/banner/banner.tsx"],"sourcesContent":["import { type ReactNode, isValidElement, forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\n\n/** Base styles applied to all banner variants. */\nexport const KUMO_BANNER_BASE_STYLES =\n \"flex w-full items-start gap-3 rounded-lg border px-4 py-3 text-base\";\n\n/** Banner variant definitions mapping variant names to their Tailwind classes and descriptions. */\nexport const KUMO_BANNER_VARIANTS = {\n variant: {\n default: {\n classes:\n \"bg-kumo-info-tint/30 border-kumo-info/50 text-kumo-info selection:bg-kumo-info\",\n iconClasses: \"text-kumo-info\",\n description: \"Informational banner for general messages\",\n },\n alert: {\n classes:\n \"bg-kumo-warning-tint/15 border-kumo-warning/50 text-kumo-warning selection:bg-kumo-warning\",\n iconClasses: \"text-kumo-warning\",\n description: \"Warning banner for cautionary messages\",\n },\n error: {\n classes:\n \"bg-kumo-danger-tint/15 border-kumo-danger/50 text-kumo-danger selection:bg-kumo-danger\",\n iconClasses: \"text-kumo-danger\",\n description: \"Error banner for critical issues\",\n },\n },\n} as const;\n\nexport const KUMO_BANNER_DEFAULT_VARIANTS = {\n variant: \"default\",\n} as const;\n\n// Derived types from KUMO_BANNER_VARIANTS\nexport type KumoBannerVariant = keyof typeof KUMO_BANNER_VARIANTS.variant;\n\nexport interface KumoBannerVariantsProps {\n /**\n * Visual style of the banner.\n * - `\"default\"` — Informational banner for general messages\n * - `\"alert\"` — Warning banner for cautionary messages\n * - `\"error\"` — Error banner for critical issues\n * @default \"default\"\n */\n variant?: KumoBannerVariant;\n}\n\nexport function bannerVariants({\n variant = KUMO_BANNER_DEFAULT_VARIANTS.variant,\n}: KumoBannerVariantsProps = {}) {\n return cn(\n // Base styles (exported as KUMO_BANNER_BASE_STYLES for Figma plugin)\n KUMO_BANNER_BASE_STYLES,\n // Apply variant styles from KUMO_BANNER_VARIANTS\n resolveVariant(KUMO_BANNER_VARIANTS.variant, variant, KUMO_BANNER_DEFAULT_VARIANTS.variant).classes,\n );\n}\n\n// Legacy enum for backwards compatibility\nexport enum BannerVariant {\n DEFAULT,\n ALERT,\n ERROR,\n}\n\n/**\n * Banner component props.\n *\n * @example\n * ```tsx\n * <Banner title=\"Update available\" description=\"A new version is ready to install.\" />\n * <Banner variant=\"alert\" title=\"Session expiring\" description=\"Your session will expire soon.\" />\n * <Banner variant=\"error\" title=\"Save failed\" description=\"We couldn't save your changes.\" />\n * ```\n */\nexport interface BannerProps {\n /** Icon element rendered before the banner content (e.g. from `@phosphor-icons/react`). */\n icon?: ReactNode;\n /** Primary heading text for the banner. Use for i18n string injection. */\n title?: string;\n /** Secondary description text displayed below the title. Use for i18n string injection. */\n description?: ReactNode;\n /** Action slot rendered at the trailing end of the banner (e.g. a CTA button or link). Only used in structured mode (with `title` or `description`). */\n action?: ReactNode;\n /** @deprecated Use `title` and `description` instead. Will be removed in a future major version. */\n text?: string;\n /** @deprecated Use `title` and `description` instead for better i18n support. */\n children?: ReactNode;\n /**\n * Visual style of the banner.\n * - `\"default\"` — Informational blue banner for general messages\n * - `\"alert\"` — Warning yellow banner for cautionary messages\n * - `\"error\"` — Error red banner for critical issues\n * @default \"default\"\n */\n variant?: KumoBannerVariant;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n}\n\n/**\n * Full-width message bar for informational, warning, or error notices.\n * Supports structured title/description for i18n, or simple children for basic usage.\n *\n * @example\n * ```tsx\n * // Structured (recommended for i18n)\n * <Banner\n * variant=\"alert\"\n * icon={<WarningCircle />}\n * title=\"Review required\"\n * description=\"Please review your billing information.\"\n * />\n *\n * // Simple (backwards compatible)\n * <Banner variant=\"alert\" icon={<WarningCircle />}>\n * Review your billing information.\n * </Banner>\n * ```\n */\nexport const Banner = forwardRef<HTMLDivElement, BannerProps>(function Banner(\n {\n icon,\n title,\n description,\n action,\n children,\n text,\n variant = KUMO_BANNER_DEFAULT_VARIANTS.variant,\n className,\n },\n ref,\n) {\n const variantConfig = resolveVariant(KUMO_BANNER_VARIANTS.variant, variant, KUMO_BANNER_DEFAULT_VARIANTS.variant);\n\n // Structured mode: title and/or description provided\n if (title || description) {\n return (\n <div ref={ref} className={cn(bannerVariants({ variant }), className)}>\n {icon && (\n <span\n className={cn(\n \"shrink-0 flex items-center h-[1.375em]\",\n variantConfig.iconClasses,\n )}\n >\n {icon}\n </span>\n )}\n <div className=\"flex min-w-0 flex-1 items-center justify-between gap-3\">\n <div className=\"flex flex-col gap-0.5\">\n {title && <p className=\"font-medium leading-snug\">{title}</p>}\n {description && (\n <div className=\"text-sm leading-snug\">\n {isValidElement(description) ? (\n description\n ) : (\n <p>{description}</p>\n )}\n </div>\n )}\n </div>\n {action && (\n <div className=\"flex shrink-0 items-center gap-2\">{action}</div>\n )}\n </div>\n </div>\n );\n }\n\n // Legacy mode: children or text prop\n const value = children ?? text;\n const content = isValidElement(value) ? value : <p>{value}</p>;\n\n return (\n <div ref={ref} className={cn(bannerVariants({ variant }), className)}>\n {icon && (\n <span className={cn(\"shrink-0\", variantConfig.iconClasses)}>\n {icon}\n </span>\n )}\n {content}\n </div>\n );\n});\n\nBanner.displayName = \"Banner\";\n"],"names":["KUMO_BANNER_BASE_STYLES","KUMO_BANNER_VARIANTS","KUMO_BANNER_DEFAULT_VARIANTS","bannerVariants","variant","cn","resolveVariant","BannerVariant","Banner","forwardRef","icon","title","description","action","children","text","className","ref","variantConfig","jsxs","jsx","isValidElement","value","content"],"mappings":";;;;;AAKO,MAAMA,IACX,uEAGWC,IAAuB;AAAA,EAClC,SAAS;AAAA,IACP,SAAS;AAAA,MACP,SACE;AAAA,MACF,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf,OAAO;AAAA,MACL,SACE;AAAA,MACF,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,IAEf,OAAO;AAAA,MACL,SACE;AAAA,MACF,aAAa;AAAA,MACb,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GAEaC,IAA+B;AAAA,EAC1C,SAAS;AACX;AAgBO,SAASC,EAAe;AAAA,EAC7B,SAAAC,IAAUF,EAA6B;AACzC,IAA6B,IAAI;AAC/B,SAAOG;AAAA;AAAA,IAELL;AAAA;AAAA,IAEAM,EAAeL,EAAqB,SAASG,GAASF,EAA6B,OAAO,EAAE;AAAA,EAAA;AAEhG;AAGO,IAAKK,sBAAAA,OACVA,EAAAA,EAAA,UAAA,CAAA,IAAA,WACAA,EAAAA,EAAA,QAAA,CAAA,IAAA,SACAA,EAAAA,EAAA,QAAA,CAAA,IAAA,SAHUA,IAAAA,KAAA,CAAA,CAAA;AA6DL,MAAMC,IAASC,EAAwC,SAC5D;AAAA,EACE,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,SAAAX,IAAUF,EAA6B;AAAA,EACvC,WAAAc;AACF,GACAC,GACA;AACA,QAAMC,IAAgBZ,EAAeL,EAAqB,SAASG,GAASF,EAA6B,OAAO;AAGhH,MAAIS,KAASC;AACX,WACE,gBAAAO,EAAC,OAAA,EAAI,KAAAF,GAAU,WAAWZ,EAAGF,EAAe,EAAE,SAAAC,EAAA,CAAS,GAAGY,CAAS,GAChE,UAAA;AAAA,MAAAN,KACC,gBAAAU;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWf;AAAA,YACT;AAAA,YACAa,EAAc;AAAA,UAAA;AAAA,UAGf,UAAAR;AAAA,QAAA;AAAA,MAAA;AAAA,MAGL,gBAAAS,EAAC,OAAA,EAAI,WAAU,0DACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,yBACZ,UAAA;AAAA,UAAAR,KAAS,gBAAAS,EAAC,KAAA,EAAE,WAAU,4BAA4B,UAAAT,GAAM;AAAA,UACxDC,KACC,gBAAAQ,EAAC,OAAA,EAAI,WAAU,wBACZ,UAAAC,EAAeT,CAAW,IACzBA,IAEA,gBAAAQ,EAAC,KAAA,EAAG,UAAAR,EAAA,CAAY,EAAA,CAEpB;AAAA,QAAA,GAEJ;AAAA,QACCC,KACC,gBAAAO,EAAC,OAAA,EAAI,WAAU,oCAAoC,UAAAP,EAAA,CAAO;AAAA,MAAA,EAAA,CAE9D;AAAA,IAAA,GACF;AAKJ,QAAMS,IAAQR,KAAYC,GACpBQ,IAAUF,EAAeC,CAAK,IAAIA,IAAQ,gBAAAF,EAAC,OAAG,UAAAE,GAAM;AAE1D,SACE,gBAAAH,EAAC,OAAA,EAAI,KAAAF,GAAU,WAAWZ,EAAGF,EAAe,EAAE,SAAAC,EAAA,CAAS,GAAGY,CAAS,GAChE,UAAA;AAAA,IAAAN,KACC,gBAAAU,EAAC,UAAK,WAAWf,EAAG,YAAYa,EAAc,WAAW,GACtD,UAAAR,EAAA,CACH;AAAA,IAEDa;AAAA,EAAA,GACH;AAEJ,CAAC;AAEDf,EAAO,cAAc;"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs as l, jsx as r } from "react/jsx-runtime";
|
|
3
|
-
import { Children as
|
|
4
|
-
import { CheckIcon as
|
|
5
|
-
import { B as
|
|
6
|
-
import { S as
|
|
7
|
-
import { u as
|
|
8
|
-
import { c as
|
|
9
|
-
|
|
3
|
+
import { Children as k, cloneElement as d, isValidElement as x, useState as C, useEffect as g } from "react";
|
|
4
|
+
import { CheckIcon as w, CopyIcon as N } from "@phosphor-icons/react";
|
|
5
|
+
import { B as y } from "./button-dh366jtvswxj0fw3.js";
|
|
6
|
+
import { S as v } from "./skeleton-line-epxenksfesr2fkcv.js";
|
|
7
|
+
import { u as I } from "./link-provider-mn2voeohon7cj9o4.js";
|
|
8
|
+
import { c as f } from "./cn-ct4n7r74mh8y0f48.js";
|
|
9
|
+
import { r as B } from "./resolve-variant-gw6eh7fa4st8ej7m.js";
|
|
10
|
+
const L = {
|
|
10
11
|
size: {
|
|
11
12
|
sm: {
|
|
12
13
|
classes: "text-sm h-10 gap-0.5",
|
|
@@ -17,15 +18,15 @@ const I = {
|
|
|
17
18
|
description: "Default breadcrumbs size"
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
|
-
},
|
|
21
|
+
}, b = {
|
|
21
22
|
size: "base"
|
|
22
23
|
};
|
|
23
|
-
function
|
|
24
|
-
size: t =
|
|
24
|
+
function A({
|
|
25
|
+
size: t = b.size
|
|
25
26
|
} = {}) {
|
|
26
|
-
return
|
|
27
|
+
return f(
|
|
27
28
|
"group mr-4 flex min-w-0 grow items-center overflow-hidden whitespace-nowrap",
|
|
28
|
-
|
|
29
|
+
B(L.size, t, b.size).classes
|
|
29
30
|
);
|
|
30
31
|
}
|
|
31
32
|
const u = ({
|
|
@@ -33,7 +34,7 @@ const u = ({
|
|
|
33
34
|
icon: e,
|
|
34
35
|
children: n
|
|
35
36
|
}) => {
|
|
36
|
-
const s =
|
|
37
|
+
const s = I();
|
|
37
38
|
return /* @__PURE__ */ l(
|
|
38
39
|
s,
|
|
39
40
|
{
|
|
@@ -53,7 +54,7 @@ function p({
|
|
|
53
54
|
}) {
|
|
54
55
|
return n ? /* @__PURE__ */ l("div", { className: "flex w-[125px] min-w-0 items-center gap-1", children: [
|
|
55
56
|
e && /* @__PURE__ */ r("span", { className: "flex shrink-0 items-center", children: e }),
|
|
56
|
-
/* @__PURE__ */ r(
|
|
57
|
+
/* @__PURE__ */ r(v, {})
|
|
57
58
|
] }) : /* @__PURE__ */ l(
|
|
58
59
|
"div",
|
|
59
60
|
{
|
|
@@ -85,17 +86,17 @@ function c() {
|
|
|
85
86
|
}
|
|
86
87
|
);
|
|
87
88
|
}
|
|
88
|
-
function
|
|
89
|
+
function S() {
|
|
89
90
|
return /* @__PURE__ */ r("span", { className: "flex shrink-0 items-center text-kumo-subtle", "aria-hidden": !0, children: "..." });
|
|
90
91
|
}
|
|
91
|
-
function
|
|
92
|
-
const [e, n] =
|
|
93
|
-
return
|
|
92
|
+
function E({ text: t }) {
|
|
93
|
+
const [e, n] = C(!1);
|
|
94
|
+
return g(() => {
|
|
94
95
|
if (!e) return;
|
|
95
96
|
const a = setTimeout(() => n(!1), 2e3);
|
|
96
97
|
return () => clearTimeout(a);
|
|
97
98
|
}, [e]), /* @__PURE__ */ r(
|
|
98
|
-
|
|
99
|
+
y,
|
|
99
100
|
{
|
|
100
101
|
variant: "ghost",
|
|
101
102
|
shape: "square",
|
|
@@ -111,7 +112,7 @@ function S({ text: t }) {
|
|
|
111
112
|
},
|
|
112
113
|
title: "Click to copy",
|
|
113
114
|
"aria-label": "Copy",
|
|
114
|
-
children: e ? /* @__PURE__ */ r(
|
|
115
|
+
children: e ? /* @__PURE__ */ r(w, { weight: "bold", className: "text-kumo-success" }) : /* @__PURE__ */ r(N, { weight: "regular" })
|
|
115
116
|
}
|
|
116
117
|
);
|
|
117
118
|
}
|
|
@@ -120,11 +121,11 @@ function m({
|
|
|
120
121
|
size: e = "base",
|
|
121
122
|
className: n
|
|
122
123
|
}) {
|
|
123
|
-
const s =
|
|
124
|
+
const s = k.toArray(t), a = z(s);
|
|
124
125
|
return /* @__PURE__ */ l(
|
|
125
126
|
"nav",
|
|
126
127
|
{
|
|
127
|
-
className:
|
|
128
|
+
className: f(A({ size: e }), n),
|
|
128
129
|
"aria-label": "breadcrumb",
|
|
129
130
|
children: [
|
|
130
131
|
/* @__PURE__ */ r("div", { className: "contents sm:hidden", children: a }),
|
|
@@ -134,33 +135,33 @@ function m({
|
|
|
134
135
|
);
|
|
135
136
|
}
|
|
136
137
|
function o(t, e) {
|
|
137
|
-
return
|
|
138
|
+
return x(t) && t.type === e;
|
|
138
139
|
}
|
|
139
|
-
function
|
|
140
|
+
function z(t) {
|
|
140
141
|
const e = t.filter(
|
|
141
142
|
(i) => o(i, u) || o(i, p)
|
|
142
143
|
);
|
|
143
144
|
if (e.length <= 2)
|
|
144
145
|
return t;
|
|
145
146
|
const [n, s] = e.slice(-2), a = [
|
|
146
|
-
/* @__PURE__ */ r(
|
|
147
|
+
/* @__PURE__ */ r(S, {}, "kumo-breadcrumb-mobile-ellipsis"),
|
|
147
148
|
/* @__PURE__ */ r(c, {}, "kumo-breadcrumb-mobile-separator-leading"),
|
|
148
149
|
d(n, { key: "kumo-breadcrumb-mobile-parent" }),
|
|
149
150
|
/* @__PURE__ */ r(c, {}, "kumo-breadcrumb-mobile-separator-trailing"),
|
|
150
151
|
d(s, { key: "kumo-breadcrumb-mobile-current" })
|
|
151
|
-
],
|
|
152
|
+
], h = t.filter(
|
|
152
153
|
(i) => !o(i, u) && !o(i, p) && !o(i, c)
|
|
153
154
|
);
|
|
154
|
-
return [...a, ...
|
|
155
|
+
return [...a, ...h];
|
|
155
156
|
}
|
|
156
157
|
m.Link = u;
|
|
157
158
|
m.Current = p;
|
|
158
159
|
m.Separator = c;
|
|
159
|
-
m.Clipboard =
|
|
160
|
+
m.Clipboard = E;
|
|
160
161
|
export {
|
|
161
162
|
m as B,
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
163
|
+
L as K,
|
|
164
|
+
b as a,
|
|
165
|
+
A as b
|
|
165
166
|
};
|
|
166
|
-
//# sourceMappingURL=breadcrumbs-
|
|
167
|
+
//# sourceMappingURL=breadcrumbs-do6uyvm4msqus0sz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumbs-do6uyvm4msqus0sz.js","sources":["../../src/components/breadcrumbs/breadcrumbs.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n isValidElement,\n useEffect,\n useState,\n type PropsWithChildren,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport { CheckIcon, CopyIcon } from \"@phosphor-icons/react\";\nimport { Button } from \"../../components/button\";\nimport { SkeletonLine } from \"../../components/loader/skeleton-line\";\nimport { useLinkComponent } from \"../../utils/link-provider\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\n\n/** Breadcrumbs size variant definitions. */\nexport const KUMO_BREADCRUMBS_VARIANTS = {\n size: {\n sm: {\n classes: \"text-sm h-10 gap-0.5\",\n description: \"Compact breadcrumbs for dense UIs\",\n },\n base: {\n classes: \"text-base h-12 gap-1\",\n description: \"Default breadcrumbs size\",\n },\n },\n} as const;\n\nexport const KUMO_BREADCRUMBS_DEFAULT_VARIANTS = {\n size: \"base\",\n} as const;\n\nexport type KumoBreadcrumbsSize = keyof typeof KUMO_BREADCRUMBS_VARIANTS.size;\n\nexport interface KumoBreadcrumbsVariantsProps {\n /**\n * Size of the breadcrumbs.\n * - `\"sm\"` — Compact breadcrumbs for dense UIs\n * - `\"base\"` — Default breadcrumbs size\n * @default \"base\"\n */\n size?: KumoBreadcrumbsSize;\n}\n\nexport function breadcrumbsVariants({\n size = KUMO_BREADCRUMBS_DEFAULT_VARIANTS.size,\n}: KumoBreadcrumbsVariantsProps = {}) {\n return cn(\n \"group mr-4 flex min-w-0 grow items-center overflow-hidden whitespace-nowrap\",\n resolveVariant(KUMO_BREADCRUMBS_VARIANTS.size, size, KUMO_BREADCRUMBS_DEFAULT_VARIANTS.size).classes,\n );\n}\n\nexport interface BreadcrumbsItemProps {\n href: string;\n icon?: React.ReactNode;\n}\n\nconst Link = ({\n href,\n icon,\n children,\n}: PropsWithChildren<BreadcrumbsItemProps>) => {\n const LinkComponent = useLinkComponent();\n\n return (\n <LinkComponent\n to={href}\n className=\"flex min-w-0 max-w-full items-center gap-1 text-kumo-subtle no-underline\"\n >\n {!!icon && <span className=\"flex shrink-0 items-center\">{icon}</span>}\n <span className=\"truncate\">{children}</span>\n </LinkComponent>\n );\n};\n\ninterface BreadcrumbsCurrentProps {\n loading?: boolean;\n icon?: React.ReactNode;\n}\n\nfunction Current({\n children,\n icon,\n loading,\n}: PropsWithChildren<BreadcrumbsCurrentProps>) {\n if (loading) {\n return (\n <div className=\"flex w-[125px] min-w-0 items-center gap-1\">\n {icon && <span className=\"flex shrink-0 items-center\">{icon}</span>}\n <SkeletonLine />\n </div>\n );\n }\n\n return (\n <div\n className=\"flex min-w-0 max-w-full items-center gap-1 font-medium\"\n aria-current=\"page\"\n >\n {icon && <span className=\"flex shrink-0 items-center\">{icon}</span>}\n <span className=\"truncate\">{children}</span>\n </div>\n );\n}\n\nfunction Separator() {\n return (\n <span\n className=\"flex shrink-0 items-center text-kumo-inactive\"\n aria-hidden=\"true\"\n >\n <svg width=\"24\" height=\"24\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n d=\"M10.75 8.75L14.25 12L10.75 15.25\"\n />\n </svg>\n </span>\n );\n}\n\nfunction MobileEllipsis() {\n return (\n <span className=\"flex shrink-0 items-center text-kumo-subtle\" aria-hidden>\n ...\n </span>\n );\n}\n\nfunction Clipboard({ text }: { text: string }) {\n const [isCopied, setIsCopied] = useState(false);\n\n useEffect(() => {\n if (!isCopied) return;\n\n const timeoutId = setTimeout(() => setIsCopied(false), 2000);\n return () => clearTimeout(timeoutId);\n }, [isCopied]);\n\n const handleCopyDeeplink = async () => {\n if (!text) return;\n\n try {\n await navigator.clipboard.writeText(text);\n setIsCopied(true);\n } catch (err) {\n console.error(\"Failed to copy deeplink:\", err);\n }\n };\n\n return (\n <Button\n variant=\"ghost\"\n shape=\"square\"\n size=\"sm\"\n className=\"opacity-0 transition-[opacity] group-hover:opacity-100\"\n onClick={handleCopyDeeplink}\n title=\"Click to copy\"\n aria-label=\"Copy\"\n >\n {isCopied ? (\n <CheckIcon weight=\"bold\" className=\"text-kumo-success\" />\n ) : (\n <CopyIcon weight=\"regular\" />\n )}\n </Button>\n );\n}\n\n/**\n * Breadcrumbs component props.\n *\n * @example\n * ```tsx\n * <Breadcrumbs>\n * <Breadcrumbs.Link href=\"/\">Home</Breadcrumbs.Link>\n * <Breadcrumbs.Separator />\n * <Breadcrumbs.Link href=\"/docs\">Docs</Breadcrumbs.Link>\n * <Breadcrumbs.Separator />\n * <Breadcrumbs.Current>Current Page</Breadcrumbs.Current>\n * </Breadcrumbs>\n * ```\n */\nexport interface BreadcrumbsProps\n extends PropsWithChildren,\n KumoBreadcrumbsVariantsProps {\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n}\n\n/**\n * Navigation breadcrumb trail showing the current page's location in a hierarchy.\n * Compound component with `Breadcrumbs.Link`, `Breadcrumbs.Current`, `Breadcrumbs.Separator`, and `Breadcrumbs.Clipboard`.\n *\n * @example\n * ```tsx\n * <Breadcrumbs>\n * <Breadcrumbs.Link href=\"/\">Home</Breadcrumbs.Link>\n * <Breadcrumbs.Separator />\n * <Breadcrumbs.Current>Dashboard</Breadcrumbs.Current>\n * </Breadcrumbs>\n * ```\n */\nexport function Breadcrumb({\n children,\n size = \"base\",\n className,\n}: BreadcrumbsProps) {\n const childArray = Children.toArray(children);\n const mobileChildren = getMobileBreadcrumbChildren(childArray);\n\n return (\n <nav\n className={cn(breadcrumbsVariants({ size }), className)}\n aria-label=\"breadcrumb\"\n >\n <div className=\"contents sm:hidden\">{mobileChildren}</div>\n <div className=\"hidden sm:contents\">{childArray}</div>\n </nav>\n );\n}\n\nfunction isComponentElement(\n child: ReactNode,\n component: unknown,\n): child is ReactElement {\n return isValidElement(child) && child.type === component;\n}\n\nfunction getMobileBreadcrumbChildren(children: ReactNode[]): ReactNode[] {\n const breadcrumbItems = children.filter(\n (child) =>\n isComponentElement(child, Link) || isComponentElement(child, Current),\n ) as ReactElement[];\n\n if (breadcrumbItems.length <= 2) {\n return children;\n }\n\n const [parentItem, currentItem] = breadcrumbItems.slice(-2);\n const trailingItems: ReactNode[] = [\n <MobileEllipsis key=\"kumo-breadcrumb-mobile-ellipsis\" />,\n <Separator key=\"kumo-breadcrumb-mobile-separator-leading\" />,\n cloneElement(parentItem, { key: \"kumo-breadcrumb-mobile-parent\" }),\n <Separator key=\"kumo-breadcrumb-mobile-separator-trailing\" />,\n cloneElement(currentItem, { key: \"kumo-breadcrumb-mobile-current\" }),\n ];\n\n const extras = children.filter(\n (child) =>\n !isComponentElement(child, Link) &&\n !isComponentElement(child, Current) &&\n !isComponentElement(child, Separator),\n );\n\n return [...trailingItems, ...extras];\n}\n\nBreadcrumb.Link = Link;\nBreadcrumb.Current = Current;\nBreadcrumb.Separator = Separator;\nBreadcrumb.Clipboard = Clipboard;\n"],"names":["KUMO_BREADCRUMBS_VARIANTS","KUMO_BREADCRUMBS_DEFAULT_VARIANTS","breadcrumbsVariants","size","cn","resolveVariant","Link","href","icon","children","LinkComponent","useLinkComponent","jsxs","jsx","Current","loading","SkeletonLine","Separator","MobileEllipsis","Clipboard","text","isCopied","setIsCopied","useState","useEffect","timeoutId","Button","err","CheckIcon","CopyIcon","Breadcrumb","className","childArray","Children","mobileChildren","getMobileBreadcrumbChildren","isComponentElement","child","component","isValidElement","breadcrumbItems","parentItem","currentItem","trailingItems","cloneElement","extras"],"mappings":"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"}
|