@cloudflare/kumo 2.4.0 → 2.4.1
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 +6 -0
- package/dist/.build-complete +1 -1
- package/dist/chunks/{autocomplete-cvp5fsdt6gh0p3vu.js → autocomplete-d0w42h1frdu03df6.js} +29 -29
- package/dist/chunks/autocomplete-d0w42h1frdu03df6.js.map +1 -0
- package/dist/chunks/{combobox-dpptfpcmqfrso1xa.js → combobox-msvukodjsqzlvpqc.js} +39 -39
- package/dist/chunks/combobox-msvukodjsqzlvpqc.js.map +1 -0
- package/dist/components/autocomplete.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunks/autocomplete-cvp5fsdt6gh0p3vu.js.map +0 -1
- package/dist/chunks/combobox-dpptfpcmqfrso1xa.js.map +0 -1
package/CHANGELOG.md
CHANGED
package/dist/.build-complete
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
1780084158364
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as t, jsxs as
|
|
3
|
-
import { CheckIcon as
|
|
4
|
-
import { createContext as
|
|
5
|
-
import { K as u, i as
|
|
2
|
+
import { jsx as t, jsxs as C } from "react/jsx-runtime";
|
|
3
|
+
import { CheckIcon as y } from "@phosphor-icons/react";
|
|
4
|
+
import { createContext as v, useContext as I } from "react";
|
|
5
|
+
import { K as u, i as k } from "./input-en8hhb14mmt3tfwn.js";
|
|
6
6
|
import { c as r } from "./cn-ct4n7r74mh8y0f48.js";
|
|
7
|
-
import { r as
|
|
8
|
-
import { F as
|
|
9
|
-
import { by as
|
|
10
|
-
const p =
|
|
7
|
+
import { r as E } from "./resolve-variant-gw6eh7fa4st8ej7m.js";
|
|
8
|
+
import { F as T } from "./field-c8o7h3rlam4c9pcx.js";
|
|
9
|
+
import { by as w, aa as z, af as G, bx as L, ac as O, S as P, ad as _, ae as S, bw as U, an as R, ao as V, ap as F, ag as K } from "./vendor-base-ui-knphx7dts1vm1x37.js";
|
|
10
|
+
const p = v({
|
|
11
11
|
hasError: !1
|
|
12
12
|
}), W = {
|
|
13
13
|
size: u.size
|
|
@@ -18,7 +18,7 @@ function X({
|
|
|
18
18
|
size: o = l.size
|
|
19
19
|
} = {}) {
|
|
20
20
|
return r(
|
|
21
|
-
|
|
21
|
+
E(
|
|
22
22
|
u.size,
|
|
23
23
|
o,
|
|
24
24
|
l.size
|
|
@@ -34,9 +34,9 @@ function d({
|
|
|
34
34
|
children: m,
|
|
35
35
|
...i
|
|
36
36
|
}) {
|
|
37
|
-
const c = /* @__PURE__ */ t(p, { value: { hasError: !!a }, children: /* @__PURE__ */ t(
|
|
37
|
+
const g = i, c = /* @__PURE__ */ t(p.Provider, { value: { hasError: !!a }, children: /* @__PURE__ */ t(L, { ...g, children: m }) });
|
|
38
38
|
return o ? /* @__PURE__ */ t(
|
|
39
|
-
|
|
39
|
+
T,
|
|
40
40
|
{
|
|
41
41
|
label: o,
|
|
42
42
|
required: e,
|
|
@@ -54,10 +54,10 @@ function b({
|
|
|
54
54
|
}) {
|
|
55
55
|
const { hasError: n } = I(p);
|
|
56
56
|
return /* @__PURE__ */ t(
|
|
57
|
-
|
|
57
|
+
K,
|
|
58
58
|
{
|
|
59
59
|
className: r(
|
|
60
|
-
|
|
60
|
+
k({
|
|
61
61
|
size: e,
|
|
62
62
|
variant: n ? "error" : "default",
|
|
63
63
|
focusIndicator: !0
|
|
@@ -77,8 +77,8 @@ function f({
|
|
|
77
77
|
alignOffset: a,
|
|
78
78
|
side: m
|
|
79
79
|
}) {
|
|
80
|
-
return /* @__PURE__ */ t(
|
|
81
|
-
|
|
80
|
+
return /* @__PURE__ */ t(R, { children: /* @__PURE__ */ t(
|
|
81
|
+
V,
|
|
82
82
|
{
|
|
83
83
|
className: "outline-none",
|
|
84
84
|
align: s,
|
|
@@ -86,7 +86,7 @@ function f({
|
|
|
86
86
|
alignOffset: a,
|
|
87
87
|
side: m,
|
|
88
88
|
children: /* @__PURE__ */ t(
|
|
89
|
-
|
|
89
|
+
F,
|
|
90
90
|
{
|
|
91
91
|
className: (i) => r(
|
|
92
92
|
"flex flex-col",
|
|
@@ -102,12 +102,12 @@ function f({
|
|
|
102
102
|
}
|
|
103
103
|
) });
|
|
104
104
|
}
|
|
105
|
-
function
|
|
105
|
+
function M({
|
|
106
106
|
className: o,
|
|
107
107
|
...e
|
|
108
108
|
}) {
|
|
109
109
|
return /* @__PURE__ */ t(
|
|
110
|
-
|
|
110
|
+
O,
|
|
111
111
|
{
|
|
112
112
|
...e,
|
|
113
113
|
className: r(
|
|
@@ -118,8 +118,8 @@ function K({
|
|
|
118
118
|
);
|
|
119
119
|
}
|
|
120
120
|
function x({ children: o, ...e }) {
|
|
121
|
-
return /* @__PURE__ */
|
|
122
|
-
|
|
121
|
+
return /* @__PURE__ */ C(
|
|
122
|
+
U,
|
|
123
123
|
{
|
|
124
124
|
"data-kumo-component": "Autocomplete",
|
|
125
125
|
"data-kumo-part": "item",
|
|
@@ -127,14 +127,14 @@ function x({ children: o, ...e }) {
|
|
|
127
127
|
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",
|
|
128
128
|
children: [
|
|
129
129
|
/* @__PURE__ */ t("div", { className: "col-start-1", children: o }),
|
|
130
|
-
/* @__PURE__ */ t("span", { className: "col-start-2 hidden items-center group-data-selected:flex", children: /* @__PURE__ */ t(
|
|
130
|
+
/* @__PURE__ */ t("span", { className: "col-start-2 hidden items-center group-data-selected:flex", children: /* @__PURE__ */ t(y, { size: 14 }) })
|
|
131
131
|
]
|
|
132
132
|
}
|
|
133
133
|
);
|
|
134
134
|
}
|
|
135
135
|
function h(o) {
|
|
136
136
|
return /* @__PURE__ */ t(
|
|
137
|
-
|
|
137
|
+
S,
|
|
138
138
|
{
|
|
139
139
|
...o,
|
|
140
140
|
className: r(
|
|
@@ -146,7 +146,7 @@ function h(o) {
|
|
|
146
146
|
}
|
|
147
147
|
function N(o) {
|
|
148
148
|
return /* @__PURE__ */ t(
|
|
149
|
-
|
|
149
|
+
_,
|
|
150
150
|
{
|
|
151
151
|
...o,
|
|
152
152
|
className: "border-t border-kumo-line mt-2 pt-2 first:border-t-0 first:mt-0 first:pt-0"
|
|
@@ -155,7 +155,7 @@ function N(o) {
|
|
|
155
155
|
}
|
|
156
156
|
function A(o) {
|
|
157
157
|
return /* @__PURE__ */ t(
|
|
158
|
-
|
|
158
|
+
P,
|
|
159
159
|
{
|
|
160
160
|
...o,
|
|
161
161
|
className: r("mx-0 my-1 h-px bg-kumo-line", o.className)
|
|
@@ -177,12 +177,12 @@ const Y = Object.assign(d, {
|
|
|
177
177
|
GroupLabel: h,
|
|
178
178
|
Group: N,
|
|
179
179
|
Separator: A,
|
|
180
|
-
List:
|
|
180
|
+
List: M,
|
|
181
181
|
// Pass-through Base UI sub-components
|
|
182
|
-
Empty:
|
|
183
|
-
Collection:
|
|
182
|
+
Empty: G,
|
|
183
|
+
Collection: z,
|
|
184
184
|
// Filtering
|
|
185
|
-
useFilter:
|
|
185
|
+
useFilter: w
|
|
186
186
|
});
|
|
187
187
|
export {
|
|
188
188
|
Y as A,
|
|
@@ -190,4 +190,4 @@ export {
|
|
|
190
190
|
X as a,
|
|
191
191
|
l as b
|
|
192
192
|
};
|
|
193
|
-
//# sourceMappingURL=autocomplete-
|
|
193
|
+
//# sourceMappingURL=autocomplete-d0w42h1frdu03df6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete-d0w42h1frdu03df6.js","sources":["../../src/components/autocomplete/autocomplete.tsx"],"sourcesContent":["import { Autocomplete as AutocompleteBase } from \"@base-ui/react/autocomplete\";\nimport { CheckIcon } from \"@phosphor-icons/react\";\nimport { createContext, useContext, 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\nconst AutocompleteContext = createContext<{ hasError: boolean }>({\n hasError: false,\n});\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(\n resolveVariant(\n KUMO_INPUT_VARIANTS.size,\n size,\n KUMO_AUTOCOMPLETE_DEFAULT_VARIANTS.size,\n ).classes,\n );\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 <AutocompleteContext.Provider value={{ hasError: Boolean(error) }}>\n <AutocompleteBase.Root {...rootProps}>{children}</AutocompleteBase.Root>\n </AutocompleteContext.Provider>\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 const { hasError } = useContext(AutocompleteContext);\n return (\n <AutocompleteBase.Input\n className={cn(\n inputVariants({\n size,\n variant: hasError ? \"error\" : \"default\",\n focusIndicator: true,\n }),\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 data-kumo-component=\"Autocomplete\"\n data-kumo-part=\"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 // Filtering\n useFilter: AutocompleteBase.useFilter,\n});\n"],"names":["AutocompleteContext","createContext","KUMO_AUTOCOMPLETE_VARIANTS","KUMO_INPUT_VARIANTS","KUMO_AUTOCOMPLETE_DEFAULT_VARIANTS","autocompleteVariants","size","cn","resolveVariant","Root","label","required","labelTooltip","description","error","children","props","rootProps","control","jsx","AutocompleteBase.Root","Field","InputGroup","className","placeholder","hasError","useContext","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","AutocompleteBase.useFilter"],"mappings":"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"}
|
|
@@ -2,30 +2,30 @@
|
|
|
2
2
|
import { jsx as e, jsxs as m } from "react/jsx-runtime";
|
|
3
3
|
import { CheckIcon as T, XIcon as C, CaretDownIcon as N } from "@phosphor-icons/react";
|
|
4
4
|
import { createContext as E, useContext as g, Fragment as V } from "react";
|
|
5
|
-
import { i as p, K as
|
|
6
|
-
import { c as
|
|
7
|
-
import { F } from "./field-c8o7h3rlam4c9pcx.js";
|
|
8
|
-
import { u as
|
|
5
|
+
import { i as p, K as P } from "./input-en8hhb14mmt3tfwn.js";
|
|
6
|
+
import { c as r } from "./cn-ct4n7r74mh8y0f48.js";
|
|
7
|
+
import { F as j } from "./field-c8o7h3rlam4c9pcx.js";
|
|
8
|
+
import { u as F } from "./portal-provider-hwmkdmkpvct0cb76.js";
|
|
9
9
|
import { a6 as G, a7 as h, a8 as x, a9 as f, aa as L, ab as M, ac as _, ad as A, ae as K, af as O, ag as b, ah as U, ai as W, aj as B, ak as D, al as H, am as X, an as q, ao as J, ap as Q } from "./vendor-base-ui-knphx7dts1vm1x37.js";
|
|
10
|
-
|
|
10
|
+
P.size;
|
|
11
11
|
const u = E({ size: "base", hasError: !1 });
|
|
12
12
|
function y({
|
|
13
13
|
label: o,
|
|
14
14
|
required: a,
|
|
15
|
-
labelTooltip:
|
|
15
|
+
labelTooltip: i,
|
|
16
16
|
description: s,
|
|
17
17
|
error: t,
|
|
18
18
|
children: n,
|
|
19
19
|
size: d = "base",
|
|
20
20
|
...l
|
|
21
21
|
}) {
|
|
22
|
-
const c = /* @__PURE__ */ e(u, { value: { size: d, hasError: !!t }, children: /* @__PURE__ */ e(M, { ...l, children: n }) });
|
|
22
|
+
const c = /* @__PURE__ */ e(u.Provider, { value: { size: d, hasError: !!t }, children: /* @__PURE__ */ e(M, { ...l, children: n }) });
|
|
23
23
|
return o ? /* @__PURE__ */ e(
|
|
24
|
-
|
|
24
|
+
j,
|
|
25
25
|
{
|
|
26
26
|
label: o,
|
|
27
27
|
required: a,
|
|
28
|
-
labelTooltip:
|
|
28
|
+
labelTooltip: i,
|
|
29
29
|
description: s,
|
|
30
30
|
error: t ? typeof t == "string" ? { message: t, match: !0 } : t : void 0,
|
|
31
31
|
children: c
|
|
@@ -35,25 +35,25 @@ function y({
|
|
|
35
35
|
function k({
|
|
36
36
|
children: o,
|
|
37
37
|
className: a,
|
|
38
|
-
align:
|
|
38
|
+
align: i = "start",
|
|
39
39
|
sideOffset: s = 4,
|
|
40
40
|
alignOffset: t,
|
|
41
41
|
side: n,
|
|
42
42
|
container: d
|
|
43
43
|
}) {
|
|
44
|
-
const l =
|
|
44
|
+
const l = F();
|
|
45
45
|
return /* @__PURE__ */ e(q, { container: d ?? l ?? void 0, children: /* @__PURE__ */ e(
|
|
46
46
|
J,
|
|
47
47
|
{
|
|
48
48
|
className: "",
|
|
49
|
-
align:
|
|
49
|
+
align: i,
|
|
50
50
|
sideOffset: s,
|
|
51
51
|
alignOffset: t,
|
|
52
52
|
side: n,
|
|
53
53
|
children: /* @__PURE__ */ e(
|
|
54
54
|
Q,
|
|
55
55
|
{
|
|
56
|
-
className:
|
|
56
|
+
className: r(
|
|
57
57
|
"flex flex-col",
|
|
58
58
|
// flexbox layout for sticky input + scrollable list
|
|
59
59
|
"max-h-[min(var(--available-height),24rem)] max-w-(--available-width) min-w-(--anchor-width) py-1.5",
|
|
@@ -79,14 +79,14 @@ function v({
|
|
|
79
79
|
className: o,
|
|
80
80
|
...a
|
|
81
81
|
}) {
|
|
82
|
-
const { size:
|
|
82
|
+
const { size: i, hasError: s } = g(u), t = Y[i];
|
|
83
83
|
return /* @__PURE__ */ m(
|
|
84
84
|
f,
|
|
85
85
|
{
|
|
86
86
|
"data-kumo-component": "Combobox",
|
|
87
87
|
"data-kumo-part": "trigger",
|
|
88
|
-
className:
|
|
89
|
-
p({ size:
|
|
88
|
+
className: r(
|
|
89
|
+
p({ size: i, variant: s ? "error" : "default" }),
|
|
90
90
|
"relative flex items-center",
|
|
91
91
|
"data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed",
|
|
92
92
|
"data-[placeholder]:text-kumo-placeholder",
|
|
@@ -98,7 +98,7 @@ function v({
|
|
|
98
98
|
/* @__PURE__ */ e(
|
|
99
99
|
h,
|
|
100
100
|
{
|
|
101
|
-
className:
|
|
101
|
+
className: r(
|
|
102
102
|
"absolute top-1/2 -translate-y-1/2 flex items-center text-kumo-subtle",
|
|
103
103
|
t.iconRight
|
|
104
104
|
),
|
|
@@ -138,23 +138,23 @@ const Z = {
|
|
|
138
138
|
function z({
|
|
139
139
|
clearLabel: o = "Clear selection",
|
|
140
140
|
showOptionsLabel: a = "Show options",
|
|
141
|
-
...
|
|
141
|
+
...i
|
|
142
142
|
}) {
|
|
143
143
|
const { size: s, hasError: t } = g(u), n = Z[s];
|
|
144
144
|
return /* @__PURE__ */ m(
|
|
145
145
|
"div",
|
|
146
146
|
{
|
|
147
|
-
className:
|
|
147
|
+
className: r(
|
|
148
148
|
"relative inline-block w-full max-w-xs",
|
|
149
149
|
"has-[:disabled]:opacity-50 has-[:disabled]:cursor-not-allowed",
|
|
150
|
-
|
|
150
|
+
i.className
|
|
151
151
|
),
|
|
152
152
|
children: [
|
|
153
153
|
/* @__PURE__ */ e(
|
|
154
154
|
b,
|
|
155
155
|
{
|
|
156
|
-
...
|
|
157
|
-
className:
|
|
156
|
+
...i,
|
|
157
|
+
className: r(
|
|
158
158
|
p({ size: s, variant: t ? "error" : "default" }),
|
|
159
159
|
"w-full",
|
|
160
160
|
n.padding,
|
|
@@ -168,7 +168,7 @@ function z({
|
|
|
168
168
|
"data-kumo-component": "Combobox",
|
|
169
169
|
"data-kumo-part": "clear",
|
|
170
170
|
"aria-label": o,
|
|
171
|
-
className:
|
|
171
|
+
className: r(
|
|
172
172
|
"absolute top-1/2 flex -translate-y-1/2 cursor-pointer bg-transparent p-0",
|
|
173
173
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-0",
|
|
174
174
|
n.clearRight
|
|
@@ -182,7 +182,7 @@ function z({
|
|
|
182
182
|
"data-kumo-component": "Combobox",
|
|
183
183
|
"data-kumo-part": "trigger",
|
|
184
184
|
"aria-label": a,
|
|
185
|
-
className:
|
|
185
|
+
className: r(
|
|
186
186
|
"absolute top-1/2 -translate-y-1/2 flex items-center justify-center cursor-pointer text-kumo-subtle",
|
|
187
187
|
"m-0 bg-transparent p-0",
|
|
188
188
|
// Reset Stratus global button styles
|
|
@@ -198,15 +198,15 @@ function z({
|
|
|
198
198
|
function R({
|
|
199
199
|
children: o,
|
|
200
200
|
className: a,
|
|
201
|
-
...
|
|
201
|
+
...i
|
|
202
202
|
}) {
|
|
203
203
|
return /* @__PURE__ */ m(
|
|
204
204
|
U,
|
|
205
205
|
{
|
|
206
206
|
"data-kumo-component": "Combobox",
|
|
207
207
|
"data-kumo-part": "item",
|
|
208
|
-
...
|
|
209
|
-
className:
|
|
208
|
+
...i,
|
|
209
|
+
className: r(
|
|
210
210
|
"group mx-1.5 grid grid-cols-[1fr_16px] gap-2 rounded px-2 py-1.5 text-base",
|
|
211
211
|
"cursor-pointer data-highlighted:bg-kumo-tint",
|
|
212
212
|
// Disabled rows: muted text, no pointer, suppress highlight bg even
|
|
@@ -227,7 +227,7 @@ function $(o) {
|
|
|
227
227
|
O,
|
|
228
228
|
{
|
|
229
229
|
...o,
|
|
230
|
-
className:
|
|
230
|
+
className: r(
|
|
231
231
|
"mx-1.5 shrink-0 px-4 py-2 text-[0.925rem] leading-4 text-kumo-subtle empty:m-0 empty:p-0"
|
|
232
232
|
),
|
|
233
233
|
children: o.children ?? "No labels found."
|
|
@@ -239,7 +239,7 @@ function ee(o) {
|
|
|
239
239
|
b,
|
|
240
240
|
{
|
|
241
241
|
...o,
|
|
242
|
-
className:
|
|
242
|
+
className: r(
|
|
243
243
|
p(),
|
|
244
244
|
"mx-1.5 w-[calc(100%-0.75rem)] shrink-0 first:mb-2",
|
|
245
245
|
o.className
|
|
@@ -255,7 +255,7 @@ function oe({
|
|
|
255
255
|
_,
|
|
256
256
|
{
|
|
257
257
|
...a,
|
|
258
|
-
className:
|
|
258
|
+
className: r(
|
|
259
259
|
"min-h-0 flex-1 overflow-y-auto overscroll-contain scroll-pt-2 scroll-pb-2",
|
|
260
260
|
o
|
|
261
261
|
)
|
|
@@ -267,7 +267,7 @@ function ae(o) {
|
|
|
267
267
|
K,
|
|
268
268
|
{
|
|
269
269
|
...o,
|
|
270
|
-
className:
|
|
270
|
+
className: r(
|
|
271
271
|
"mx-1.5 px-2 py-1.5 text-sm text-kumo-subtle",
|
|
272
272
|
o.className
|
|
273
273
|
)
|
|
@@ -291,7 +291,7 @@ function w({
|
|
|
291
291
|
B,
|
|
292
292
|
{
|
|
293
293
|
...a,
|
|
294
|
-
className:
|
|
294
|
+
className: r(
|
|
295
295
|
"flex items-center gap-2.5",
|
|
296
296
|
// Layout
|
|
297
297
|
"h-6 pl-2 pr-[3px]",
|
|
@@ -311,7 +311,7 @@ function w({
|
|
|
311
311
|
"data-kumo-component": "Combobox",
|
|
312
312
|
"data-kumo-part": "chip-remove",
|
|
313
313
|
"aria-label": o,
|
|
314
|
-
className:
|
|
314
|
+
className: r(
|
|
315
315
|
"cursor-pointer rounded-md p-1 hover:bg-kumo-fill-hover",
|
|
316
316
|
"bg-transparent flex"
|
|
317
317
|
),
|
|
@@ -322,7 +322,7 @@ function w({
|
|
|
322
322
|
}
|
|
323
323
|
);
|
|
324
324
|
}
|
|
325
|
-
const
|
|
325
|
+
const re = {
|
|
326
326
|
xs: "min-h-5",
|
|
327
327
|
sm: "min-h-6.5",
|
|
328
328
|
base: "min-h-9",
|
|
@@ -331,7 +331,7 @@ const ie = {
|
|
|
331
331
|
function I({
|
|
332
332
|
placeholder: o,
|
|
333
333
|
renderItem: a,
|
|
334
|
-
className:
|
|
334
|
+
className: i,
|
|
335
335
|
inputSide: s = "right",
|
|
336
336
|
value: t
|
|
337
337
|
}) {
|
|
@@ -339,14 +339,14 @@ function I({
|
|
|
339
339
|
return /* @__PURE__ */ m(
|
|
340
340
|
H,
|
|
341
341
|
{
|
|
342
|
-
className:
|
|
342
|
+
className: r(
|
|
343
343
|
p({ size: n, variant: d ? "error" : "default" }),
|
|
344
344
|
"flex flex-col",
|
|
345
345
|
"gap-1 py-1 px-1.5",
|
|
346
|
-
|
|
346
|
+
re[n],
|
|
347
347
|
"h-auto",
|
|
348
348
|
"data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed",
|
|
349
|
-
|
|
349
|
+
i
|
|
350
350
|
),
|
|
351
351
|
children: [
|
|
352
352
|
s === "top" && /* @__PURE__ */ e(
|
|
@@ -405,4 +405,4 @@ const pe = Object.assign(y, {
|
|
|
405
405
|
export {
|
|
406
406
|
pe as C
|
|
407
407
|
};
|
|
408
|
-
//# sourceMappingURL=combobox-
|
|
408
|
+
//# sourceMappingURL=combobox-msvukodjsqzlvpqc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combobox-msvukodjsqzlvpqc.js","sources":["../../src/components/combobox/combobox.tsx"],"sourcesContent":["import { Combobox as ComboboxBase } from \"@base-ui/react/combobox\";\nimport { CaretDownIcon, CheckIcon, XIcon } from \"@phosphor-icons/react\";\nimport {\n Fragment,\n createContext,\n useContext,\n type PropsWithChildren,\n type ReactNode,\n} from \"react\";\nimport {\n inputVariants,\n KUMO_INPUT_VARIANTS,\n type KumoInputSize,\n} from \"../input/input\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\nimport { Field, type FieldErrorMatch } from \"../field/field\";\nimport {\n usePortalContainer,\n type PortalContainer,\n} from \"../../utils/portal-provider\";\n\n/** Combobox variant definitions. */\nexport const KUMO_COMBOBOX_VARIANTS = {\n size: KUMO_INPUT_VARIANTS.size,\n inputSide: {\n right: {\n classes: \"\",\n description: \"Input positioned inline to the right of chips\",\n },\n top: {\n classes: \"\",\n description: \"Input positioned above chips\",\n },\n },\n} as const;\n\nexport const KUMO_COMBOBOX_DEFAULT_VARIANTS = {\n size: \"base\",\n inputSide: \"right\",\n} as const;\n\n// Context to pass size and error state down to sub-components\nconst ComboboxContext = createContext<{\n size: KumoInputSize;\n hasError: boolean;\n}>({ size: \"base\", hasError: false });\n\n// Derived types from KUMO_COMBOBOX_VARIANTS\nexport type KumoComboboxSize = keyof typeof KUMO_COMBOBOX_VARIANTS.size;\nexport type KumoComboboxInputSide =\n keyof typeof KUMO_COMBOBOX_VARIANTS.inputSide;\n\nexport interface KumoComboboxVariantsProps {\n /**\n * Size of the combobox trigger. 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?: KumoComboboxSize;\n /**\n * Position of the text input relative to chips in multi-select mode.\n * - `\"right\"` — Input inline to the right of chips\n * - `\"top\"` — Input above chips\n * @default \"right\"\n */\n inputSide?: KumoComboboxInputSide;\n}\n\nexport function comboboxVariants({\n inputSide = KUMO_COMBOBOX_DEFAULT_VARIANTS.inputSide,\n}: KumoComboboxVariantsProps = {}) {\n return cn(\n resolveVariant(\n KUMO_COMBOBOX_VARIANTS.inputSide,\n inputSide,\n KUMO_COMBOBOX_DEFAULT_VARIANTS.inputSide,\n ).classes,\n );\n}\n\n// Legacy type alias for backwards compatibility\nexport type ComboboxInputSide = KumoComboboxInputSide;\nexport type ComboboxSize = KumoComboboxSize;\n\nexport type ComboboxRootProps<\n Value = unknown,\n Multiple extends boolean | undefined = false,\n> = ComboboxBase.Root.Props<Value, Multiple>;\n\n/**\n * Combobox component props (simplified for documentation; the actual Root is generic).\n *\n * Combobox provides an autocomplete/typeahead input with a filterable dropdown.\n * Supports single-select, multi-select with chips, grouped items, and Field wrapper integration.\n *\n * @example\n * ```tsx\n * // Single-select with search input\n * <Combobox value={value} onValueChange={setValue} items={options}>\n * <Combobox.TriggerInput placeholder=\"Search…\" />\n * <Combobox.Content>\n * <Combobox.List>\n * {(item) => <Combobox.Item value={item}>{item.label}</Combobox.Item>}\n * </Combobox.List>\n * <Combobox.Empty>No results</Combobox.Empty>\n * </Combobox.Content>\n * </Combobox>\n *\n * // Multi-select with chips\n * <Combobox multiple items={options} label=\"Tags\">\n * <Combobox.TriggerMultipleWithInput\n * placeholder=\"Add tag…\"\n * renderItem={(item) => <Combobox.Chip value={item}>{item.label}</Combobox.Chip>}\n * />\n * <Combobox.Content>\n * <Combobox.List>\n * {(item) => <Combobox.Item value={item}>{item.label}</Combobox.Item>}\n * </Combobox.List>\n * </Combobox.Content>\n * </Combobox>\n * ```\n */\nexport interface ComboboxProps extends KumoComboboxVariantsProps {\n /** Array of items to display in the dropdown */\n items: unknown[];\n /** Currently selected value(s) */\n value?: unknown;\n /** Callback when selection changes */\n onValueChange?: (value: unknown) => void;\n /** Enable multi-select mode */\n multiple?: boolean;\n /** Combobox content (trigger, content, items) */\n children: ReactNode;\n /** Additional CSS classes */\n className?: string;\n /** Label content for the combobox (enables Field wrapper) - can be a string or any React node */\n label?: ReactNode;\n /** Whether the combobox is required */\n required?: boolean;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** Helper text displayed below the combobox */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}\n\nfunction Root<Value, Multiple extends boolean | undefined = false>({\n label,\n required,\n labelTooltip,\n description,\n error,\n children,\n size = \"base\",\n ...props\n}: ComboboxBase.Root.Props<Value, Multiple> & {\n label?: ReactNode;\n required?: boolean;\n labelTooltip?: ReactNode;\n description?: ReactNode;\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n size?: KumoComboboxSize;\n}) {\n const comboboxControl = (\n <ComboboxContext.Provider value={{ size, hasError: Boolean(error) }}>\n <ComboboxBase.Root {...props}>{children}</ComboboxBase.Root>\n </ComboboxContext.Provider>\n );\n\n // Render with Field wrapper if label, description, or error are provided\n if (label) {\n return (\n <Field\n label={label}\n required={required}\n labelTooltip={labelTooltip}\n description={description}\n error={\n error\n ? typeof error === \"string\"\n ? { message: error, match: true }\n : error\n : undefined\n }\n >\n {comboboxControl}\n </Field>\n );\n }\n\n // Render bare combobox without Field wrapper\n return comboboxControl;\n}\n\nfunction Content({\n children,\n className,\n align = \"start\",\n sideOffset = 4,\n alignOffset,\n side,\n container: containerProp,\n}: PropsWithChildren<{\n className?: string;\n align?: ComboboxBase.Positioner.Props[\"align\"];\n alignOffset?: ComboboxBase.Positioner.Props[\"alignOffset\"];\n side?: ComboboxBase.Positioner.Props[\"side\"];\n sideOffset?: ComboboxBase.Positioner.Props[\"sideOffset\"];\n /**\n * Container element for the portal. Use this to render the combobox inside\n * a Shadow DOM or custom container. Overrides `KumoPortalProvider` context.\n * @default document.body (or KumoPortalProvider container if set)\n */\n container?: PortalContainer;\n}>) {\n const contextContainer = usePortalContainer();\n const container = containerProp ?? contextContainer ?? undefined;\n\n return (\n <ComboboxBase.Portal container={container}>\n <ComboboxBase.Positioner\n className=\"\"\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n side={side}\n >\n <ComboboxBase.Popup\n className={cn(\n \"flex flex-col\", // flexbox layout for sticky input + scrollable list\n \"max-h-[min(var(--available-height),24rem)] max-w-(--available-width) min-w-(--anchor-width) py-1.5\",\n \"bg-kumo-base text-kumo-default\", // background\n \"rounded-lg shadow-lg ring ring-kumo-line\", // border part\n className,\n )}\n >\n {children}\n </ComboboxBase.Popup>\n </ComboboxBase.Positioner>\n </ComboboxBase.Portal>\n );\n}\n\n// Size-dependent styles for TriggerValue icon\nconst triggerValueIconStyles: Record<\n KumoComboboxSize,\n { padding: string; iconSize: number; iconRight: string }\n> = {\n xs: { padding: \"pr-5\", iconSize: 12, iconRight: \"right-1\" },\n sm: { padding: \"pr-6\", iconSize: 14, iconRight: \"right-1.5\" },\n base: { padding: \"pr-8\", iconSize: 16, iconRight: \"right-2\" },\n lg: { padding: \"pr-10\", iconSize: 18, iconRight: \"right-3\" },\n};\n\nfunction TriggerValue({\n className,\n ...props\n}: ComboboxBase.Value.Props & { className?: string }) {\n const { size, hasError } = useContext(ComboboxContext);\n const iconStyles = triggerValueIconStyles[size];\n\n return (\n <ComboboxBase.Trigger\n data-kumo-component=\"Combobox\"\n data-kumo-part=\"trigger\"\n className={cn(\n inputVariants({ size, variant: hasError ? \"error\" : \"default\" }),\n \"relative flex items-center\",\n \"data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed\",\n \"data-[placeholder]:text-kumo-placeholder\",\n iconStyles.padding,\n className,\n )}\n >\n <ComboboxBase.Value {...props} />\n <ComboboxBase.Icon\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 flex items-center text-kumo-subtle\",\n iconStyles.iconRight,\n )}\n >\n <CaretDownIcon size={iconStyles.iconSize} className=\"fill-current\" />\n </ComboboxBase.Icon>\n </ComboboxBase.Trigger>\n );\n}\n\n// Size-dependent styles for TriggerInput icons\nconst triggerInputIconStyles: Record<\n KumoComboboxSize,\n { padding: string; iconSize: number; clearRight: string; caretRight: string }\n> = {\n xs: {\n padding: \"pr-7\",\n iconSize: 12,\n clearRight: \"right-5\",\n caretRight: \"right-1\",\n },\n sm: {\n padding: \"pr-9\",\n iconSize: 14,\n clearRight: \"right-6\",\n caretRight: \"right-1.5\",\n },\n base: {\n padding: \"pr-12\",\n iconSize: 16,\n clearRight: \"right-8\",\n caretRight: \"right-2\",\n },\n lg: {\n padding: \"pr-14\",\n iconSize: 18,\n clearRight: \"right-9\",\n caretRight: \"right-3\",\n },\n};\n\nfunction TriggerInput({\n clearLabel = \"Clear selection\",\n showOptionsLabel = \"Show options\",\n ...props\n}: ComboboxBase.Input.Props & {\n /** Accessible label for the clear button. Pass a translated string for i18n.\n * @default \"Clear selection\"\n */\n clearLabel?: string;\n /** Accessible label for the dropdown trigger. Pass a translated string for i18n.\n * @default \"Show options\"\n */\n showOptionsLabel?: string;\n}) {\n const { size, hasError } = useContext(ComboboxContext);\n const iconStyles = triggerInputIconStyles[size];\n\n return (\n <div\n className={cn(\n \"relative inline-block w-full max-w-xs\",\n \"has-[:disabled]:opacity-50 has-[:disabled]:cursor-not-allowed\",\n props.className,\n )}\n >\n <ComboboxBase.Input\n {...props}\n className={cn(\n inputVariants({ size, variant: hasError ? \"error\" : \"default\" }),\n \"w-full\",\n iconStyles.padding,\n \"disabled:cursor-not-allowed\",\n )}\n />\n\n <ComboboxBase.Clear\n data-kumo-component=\"Combobox\"\n data-kumo-part=\"clear\"\n aria-label={clearLabel}\n className={cn(\n \"absolute top-1/2 flex -translate-y-1/2 cursor-pointer bg-transparent p-0\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-0\",\n iconStyles.clearRight,\n )}\n >\n <XIcon size={iconStyles.iconSize} />\n </ComboboxBase.Clear>\n\n <ComboboxBase.Trigger\n data-kumo-component=\"Combobox\"\n data-kumo-part=\"trigger\"\n aria-label={showOptionsLabel}\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 flex items-center justify-center cursor-pointer text-kumo-subtle\",\n \"m-0 bg-transparent p-0\", // Reset Stratus global button styles\n iconStyles.caretRight,\n )}\n >\n <ComboboxBase.Icon className=\"flex items-center\">\n <CaretDownIcon size={iconStyles.iconSize} className=\"fill-current\" />\n </ComboboxBase.Icon>\n </ComboboxBase.Trigger>\n </div>\n );\n}\n\nfunction Item({\n children,\n className,\n ...props\n}: ComboboxBase.Item.Props & { className?: string }) {\n return (\n <ComboboxBase.Item\n data-kumo-component=\"Combobox\"\n data-kumo-part=\"item\"\n {...props}\n className={cn(\n \"group mx-1.5 grid grid-cols-[1fr_16px] gap-2 rounded px-2 py-1.5 text-base\",\n \"cursor-pointer data-highlighted:bg-kumo-tint\",\n // Disabled rows: muted text, no pointer, suppress highlight bg even\n // when keyboard nav lands on them. Base UI sets `data-disabled` on\n // the element when the `disabled` prop is true.\n \"data-[disabled]:cursor-not-allowed data-[disabled]:text-kumo-subtle data-[disabled]:opacity-60 data-[disabled]:data-highlighted:bg-transparent\",\n className,\n )}\n >\n <div className=\"col-start-1\">{children}</div>\n <ComboboxBase.ItemIndicator className=\"col-start-2 flex items-center\">\n <CheckIcon />\n </ComboboxBase.ItemIndicator>\n </ComboboxBase.Item>\n );\n}\n\nfunction Empty(props: ComboboxBase.Empty.Props) {\n return (\n <ComboboxBase.Empty\n {...props}\n className={cn(\n \"mx-1.5 shrink-0 px-4 py-2 text-[0.925rem] leading-4 text-kumo-subtle empty:m-0 empty:p-0\",\n )}\n children={props.children ?? \"No labels found.\"}\n />\n );\n}\n\nfunction Input(props: ComboboxBase.Input.Props) {\n return (\n <ComboboxBase.Input\n {...props}\n className={cn(\n inputVariants(),\n \"mx-1.5 w-[calc(100%-0.75rem)] shrink-0 first:mb-2\",\n props.className,\n )}\n />\n );\n}\n\nfunction List({\n className,\n ...props\n}: ComboboxBase.List.Props & { className?: string }) {\n return (\n <ComboboxBase.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 GroupLabel(props: ComboboxBase.GroupLabel.Props) {\n return (\n <ComboboxBase.GroupLabel\n {...props}\n className={cn(\n \"mx-1.5 px-2 py-1.5 text-sm text-kumo-subtle\",\n props.className,\n )}\n />\n );\n}\n\nfunction Group(props: ComboboxBase.Group.Props) {\n return (\n <ComboboxBase.Group\n {...props}\n className=\"border-t border-kumo-hairline mt-2 pt-2 first:border-t-0 first:mt-0 first:pt-0\"\n />\n );\n}\n\nfunction Chip({\n removeLabel = \"Remove\",\n ...props\n}: ComboboxBase.Chip.Props & {\n /** Accessible label for the chip remove button. Pass a translated string for i18n.\n * @default \"Remove\"\n */\n removeLabel?: string;\n}) {\n return (\n <ComboboxBase.Chip\n {...props}\n className={cn(\n \"flex items-center gap-2.5\", // Layout\n \"h-6 pl-2 pr-[3px]\", // Dimensions\n \"rounded-sm ring-1 ring-kumo-hairline\", // Border\n \"bg-kumo-overlay\", // Background\n \"text-sm\", // Typography\n )}\n >\n {props.children}\n <ComboboxBase.ChipRemove\n data-kumo-component=\"Combobox\"\n data-kumo-part=\"chip-remove\"\n aria-label={removeLabel}\n className={cn(\n \"cursor-pointer rounded-md p-1 hover:bg-kumo-fill-hover\",\n \"bg-transparent flex\",\n )}\n >\n <XIcon size={10} />\n </ComboboxBase.ChipRemove>\n </ComboboxBase.Chip>\n );\n}\n\n// Map size to min-height class for TriggerMultipleWithInput\nconst sizeToMinHeight: Record<KumoComboboxSize, string> = {\n xs: \"min-h-5\",\n sm: \"min-h-6.5\",\n base: \"min-h-9\",\n lg: \"min-h-10\",\n};\n\nfunction TriggerMultipleWithInput<ValueType>({\n placeholder,\n renderItem,\n className,\n inputSide = \"right\",\n value: controlledValue,\n}: {\n placeholder?: string;\n renderItem: (value: ValueType) => React.ReactNode;\n className?: string;\n inputSide?: \"right\" | \"top\";\n /** Optional controlled value for rendering chips (use when pre-selecting values) */\n value?: ValueType[];\n}) {\n const { size, hasError } = useContext(ComboboxContext);\n // Determine which value to use for rendering chips\n const chipsToRender = controlledValue;\n\n return (\n <ComboboxBase.Chips\n className={cn(\n inputVariants({ size, variant: hasError ? \"error\" : \"default\" }),\n \"flex flex-col\",\n \"gap-1 py-1 px-1.5\",\n sizeToMinHeight[size],\n \"h-auto\",\n \"data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed\",\n className,\n )}\n >\n {inputSide === \"top\" && (\n <ComboboxBase.Input\n placeholder={placeholder}\n className=\"w-full px-2 py-1 border-0 bg-inherit\"\n />\n )}\n {/* Chips container */}\n <div className=\"flex items-center flex-wrap gap-1.5 flex-1\">\n {/* Render chips from controlled value if provided */}\n {chipsToRender !== undefined &&\n chipsToRender.length > 0 &&\n chipsToRender.map((item) => renderItem(item))}\n {/* Also render from BaseUI's internal value for user selections */}\n <ComboboxBase.Value>\n {(internalValue: ValueType[]) => {\n // Skip rendering if using controlled value (to avoid duplicates)\n if (chipsToRender !== undefined) return null;\n return (\n <Fragment>\n {internalValue.map((item) => renderItem(item))}\n </Fragment>\n );\n }}\n </ComboboxBase.Value>\n {inputSide === \"right\" && (\n <ComboboxBase.Input\n placeholder={placeholder}\n className=\"min-w-[100px] flex-1 px-2 py-1 border-0 bg-inherit\"\n />\n )}\n </div>\n </ComboboxBase.Chips>\n );\n}\n\nRoot.displayName = \"Combobox.Root\";\nContent.displayName = \"Combobox.Content\";\nTriggerValue.displayName = \"Combobox.TriggerValue\";\nTriggerInput.displayName = \"Combobox.TriggerInput\";\nItem.displayName = \"Combobox.Item\";\nChip.displayName = \"Combobox.Chip\";\nTriggerMultipleWithInput.displayName = \"Combobox.TriggerMultipleWithInput\";\n\n/**\n * Combobox — autocomplete input with filterable dropdown list.\n *\n * Compound component: `Combobox` (Root), `.TriggerInput`, `.TriggerValue`,\n * `.TriggerMultipleWithInput`, `.Content`, `.Item`, `.Chip`, `.Input`,\n * `.Empty`, `.GroupLabel`, `.Group`, `.List`, `.Collection`.\n *\n * @example\n * ```tsx\n * <Combobox items={fruits} label=\"Fruit\">\n * <Combobox.TriggerInput placeholder=\"Pick a fruit…\" />\n * <Combobox.Content>\n * <Combobox.List>\n * {(item) => <Combobox.Item value={item}>{item}</Combobox.Item>}\n * </Combobox.List>\n * </Combobox.Content>\n * </Combobox>\n * ```\n *\n * @see https://base-ui.com/react/components/combobox\n */\nexport const Combobox = Object.assign(Root, {\n // Helper components\n Content,\n TriggerValue,\n TriggerInput,\n TriggerMultipleWithInput,\n\n // Slightly modified BaseUI\n Chip,\n Item,\n\n // Styled BaseUI\n Input,\n Empty,\n GroupLabel,\n Group,\n\n // Styled BaseUI\n List,\n\n // BaseUI\n Collection: ComboboxBase.Collection,\n\n Trigger: ComboboxBase.Trigger,\n Value: ComboboxBase.Value,\n Icon: ComboboxBase.Icon,\n\n // Filtering\n useFilter: ComboboxBase.useFilter,\n});\n"],"names":["KUMO_INPUT_VARIANTS","ComboboxContext","createContext","Root","label","required","labelTooltip","description","error","children","size","props","comboboxControl","ComboboxBase.Root","jsx","Field","Content","className","align","sideOffset","alignOffset","side","containerProp","contextContainer","usePortalContainer","ComboboxBase.Portal","ComboboxBase.Positioner","ComboboxBase.Popup","cn","triggerValueIconStyles","TriggerValue","hasError","useContext","iconStyles","jsxs","ComboboxBase.Trigger","inputVariants","ComboboxBase.Value","ComboboxBase.Icon","CaretDownIcon","triggerInputIconStyles","TriggerInput","clearLabel","showOptionsLabel","ComboboxBase.Input","ComboboxBase.Clear","XIcon","Item","ComboboxBase.Item","ComboboxBase.ItemIndicator","CheckIcon","Empty","ComboboxBase.Empty","Input","List","ComboboxBase.List","GroupLabel","ComboboxBase.GroupLabel","Group","ComboboxBase.Group","Chip","removeLabel","ComboboxBase.Chip","ComboboxBase.ChipRemove","sizeToMinHeight","TriggerMultipleWithInput","placeholder","renderItem","inputSide","controlledValue","chipsToRender","ComboboxBase.Chips","item","internalValue","Fragment","Combobox","ComboboxBase.Collection","ComboboxBase.useFilter"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { A as e, b as t, K as T, a as o } from "../chunks/autocomplete-
|
|
2
|
+
import { A as e, b as t, K as T, a as o } from "../chunks/autocomplete-d0w42h1frdu03df6.js";
|
|
3
3
|
export {
|
|
4
4
|
e as Autocomplete,
|
|
5
5
|
t as KUMO_AUTOCOMPLETE_DEFAULT_VARIANTS,
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import { D as sa } from "./chunks/date-range-picker-o8uyril1kogvhoei.js";
|
|
|
8
8
|
import { C as ia } from "./chunks/checkbox-dqih8tzzt3vhp870.js";
|
|
9
9
|
import { C as na } from "./chunks/clipboard-text-mrut8z3dt1w0efxz.js";
|
|
10
10
|
import { C as ma, a as pa } from "./chunks/code-bbnjm8vk9hxl129r.js";
|
|
11
|
-
import { C as Ta } from "./chunks/combobox-
|
|
11
|
+
import { C as Ta } from "./chunks/combobox-msvukodjsqzlvpqc.js";
|
|
12
12
|
import { a as M, D as U, c as N, e as b } from "./chunks/dialog-my9fioafdstq50mi.js";
|
|
13
13
|
import { d as Aa, b as Sa } from "./chunks/dialog-my9fioafdstq50mi.js";
|
|
14
14
|
import { D as ua } from "./chunks/dropdown-g4sb4cw9ffqaw5gx.js";
|
|
@@ -45,7 +45,7 @@ import { C as Ze, a as ao, K as eo, P as oo, g as ro } from "./chunks/cloudflare
|
|
|
45
45
|
import { D as to } from "./chunks/date-picker-mjocqqbggb76n8rt.js";
|
|
46
46
|
import { Flow as lo } from "./components/flow.js";
|
|
47
47
|
import { C as mo, a as po, b as fo, S as To, T as co } from "./chunks/SankeyChart-npoyr1j06svoxsfe.js";
|
|
48
|
-
import { A as So, b as bo, K as uo, a as xo } from "./chunks/autocomplete-
|
|
48
|
+
import { A as So, b as bo, K as uo, a as xo } from "./chunks/autocomplete-d0w42h1frdu03df6.js";
|
|
49
49
|
import { z as Co, A as Io, K as Lo, S as Ro, t as Eo, v as Oo, u as Mo, d as Uo, e as No, f as go, g as Ko, c as ho, h as Vo, k as Do, j as vo, s as Po, i as ko, l as Bo, n as Fo, m as yo, a as wo, q as zo, r as Go, b as jo, o as $o, x as qo, w as Ho, p as Wo, y as Xo } from "./chunks/sidebar-hzio700cg85f7f31.js";
|
|
50
50
|
import { a as Jo, K as Qo, T as Zo } from "./chunks/table-of-contents-jco9kvt48d34dwsw.js";
|
|
51
51
|
import { c as K } from "./chunks/cn-ct4n7r74mh8y0f48.js";
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete-cvp5fsdt6gh0p3vu.js","sources":["../../src/components/autocomplete/autocomplete.tsx"],"sourcesContent":["import { Autocomplete as AutocompleteBase } from \"@base-ui/react/autocomplete\";\nimport { CheckIcon } from \"@phosphor-icons/react\";\nimport { createContext, useContext, 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\nconst AutocompleteContext = createContext<{ hasError: boolean }>({\n hasError: false,\n});\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(\n resolveVariant(\n KUMO_INPUT_VARIANTS.size,\n size,\n KUMO_AUTOCOMPLETE_DEFAULT_VARIANTS.size,\n ).classes,\n );\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 <AutocompleteContext value={{ hasError: Boolean(error) }}>\n <AutocompleteBase.Root {...rootProps}>{children}</AutocompleteBase.Root>\n </AutocompleteContext>\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 const { hasError } = useContext(AutocompleteContext);\n return (\n <AutocompleteBase.Input\n className={cn(\n inputVariants({\n size,\n variant: hasError ? \"error\" : \"default\",\n focusIndicator: true,\n }),\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 data-kumo-component=\"Autocomplete\"\n data-kumo-part=\"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 // Filtering\n useFilter: AutocompleteBase.useFilter,\n});\n"],"names":["AutocompleteContext","createContext","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","hasError","useContext","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","AutocompleteBase.useFilter"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"combobox-dpptfpcmqfrso1xa.js","sources":["../../src/components/combobox/combobox.tsx"],"sourcesContent":["import { Combobox as ComboboxBase } from \"@base-ui/react/combobox\";\nimport { CaretDownIcon, CheckIcon, XIcon } from \"@phosphor-icons/react\";\nimport {\n Fragment,\n createContext,\n useContext,\n type PropsWithChildren,\n type ReactNode,\n} from \"react\";\nimport {\n inputVariants,\n KUMO_INPUT_VARIANTS,\n type KumoInputSize,\n} from \"../input/input\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\nimport { Field, type FieldErrorMatch } from \"../field/field\";\nimport {\n usePortalContainer,\n type PortalContainer,\n} from \"../../utils/portal-provider\";\n\n/** Combobox variant definitions. */\nexport const KUMO_COMBOBOX_VARIANTS = {\n size: KUMO_INPUT_VARIANTS.size,\n inputSide: {\n right: {\n classes: \"\",\n description: \"Input positioned inline to the right of chips\",\n },\n top: {\n classes: \"\",\n description: \"Input positioned above chips\",\n },\n },\n} as const;\n\nexport const KUMO_COMBOBOX_DEFAULT_VARIANTS = {\n size: \"base\",\n inputSide: \"right\",\n} as const;\n\n// Context to pass size and error state down to sub-components\nconst ComboboxContext = createContext<{\n size: KumoInputSize;\n hasError: boolean;\n}>({ size: \"base\", hasError: false });\n\n// Derived types from KUMO_COMBOBOX_VARIANTS\nexport type KumoComboboxSize = keyof typeof KUMO_COMBOBOX_VARIANTS.size;\nexport type KumoComboboxInputSide =\n keyof typeof KUMO_COMBOBOX_VARIANTS.inputSide;\n\nexport interface KumoComboboxVariantsProps {\n /**\n * Size of the combobox trigger. 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?: KumoComboboxSize;\n /**\n * Position of the text input relative to chips in multi-select mode.\n * - `\"right\"` — Input inline to the right of chips\n * - `\"top\"` — Input above chips\n * @default \"right\"\n */\n inputSide?: KumoComboboxInputSide;\n}\n\nexport function comboboxVariants({\n inputSide = KUMO_COMBOBOX_DEFAULT_VARIANTS.inputSide,\n}: KumoComboboxVariantsProps = {}) {\n return cn(\n resolveVariant(\n KUMO_COMBOBOX_VARIANTS.inputSide,\n inputSide,\n KUMO_COMBOBOX_DEFAULT_VARIANTS.inputSide,\n ).classes,\n );\n}\n\n// Legacy type alias for backwards compatibility\nexport type ComboboxInputSide = KumoComboboxInputSide;\nexport type ComboboxSize = KumoComboboxSize;\n\nexport type ComboboxRootProps<\n Value = unknown,\n Multiple extends boolean | undefined = false,\n> = ComboboxBase.Root.Props<Value, Multiple>;\n\n/**\n * Combobox component props (simplified for documentation; the actual Root is generic).\n *\n * Combobox provides an autocomplete/typeahead input with a filterable dropdown.\n * Supports single-select, multi-select with chips, grouped items, and Field wrapper integration.\n *\n * @example\n * ```tsx\n * // Single-select with search input\n * <Combobox value={value} onValueChange={setValue} items={options}>\n * <Combobox.TriggerInput placeholder=\"Search…\" />\n * <Combobox.Content>\n * <Combobox.List>\n * {(item) => <Combobox.Item value={item}>{item.label}</Combobox.Item>}\n * </Combobox.List>\n * <Combobox.Empty>No results</Combobox.Empty>\n * </Combobox.Content>\n * </Combobox>\n *\n * // Multi-select with chips\n * <Combobox multiple items={options} label=\"Tags\">\n * <Combobox.TriggerMultipleWithInput\n * placeholder=\"Add tag…\"\n * renderItem={(item) => <Combobox.Chip value={item}>{item.label}</Combobox.Chip>}\n * />\n * <Combobox.Content>\n * <Combobox.List>\n * {(item) => <Combobox.Item value={item}>{item.label}</Combobox.Item>}\n * </Combobox.List>\n * </Combobox.Content>\n * </Combobox>\n * ```\n */\nexport interface ComboboxProps extends KumoComboboxVariantsProps {\n /** Array of items to display in the dropdown */\n items: unknown[];\n /** Currently selected value(s) */\n value?: unknown;\n /** Callback when selection changes */\n onValueChange?: (value: unknown) => void;\n /** Enable multi-select mode */\n multiple?: boolean;\n /** Combobox content (trigger, content, items) */\n children: ReactNode;\n /** Additional CSS classes */\n className?: string;\n /** Label content for the combobox (enables Field wrapper) - can be a string or any React node */\n label?: ReactNode;\n /** Whether the combobox is required */\n required?: boolean;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** Helper text displayed below the combobox */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}\n\nfunction Root<Value, Multiple extends boolean | undefined = false>({\n label,\n required,\n labelTooltip,\n description,\n error,\n children,\n size = \"base\",\n ...props\n}: ComboboxBase.Root.Props<Value, Multiple> & {\n label?: ReactNode;\n required?: boolean;\n labelTooltip?: ReactNode;\n description?: ReactNode;\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n size?: KumoComboboxSize;\n}) {\n const comboboxControl = (\n <ComboboxContext value={{ size, hasError: Boolean(error) }}>\n <ComboboxBase.Root {...props}>{children}</ComboboxBase.Root>\n </ComboboxContext>\n );\n\n // Render with Field wrapper if label, description, or error are provided\n if (label) {\n return (\n <Field\n label={label}\n required={required}\n labelTooltip={labelTooltip}\n description={description}\n error={\n error\n ? typeof error === \"string\"\n ? { message: error, match: true }\n : error\n : undefined\n }\n >\n {comboboxControl}\n </Field>\n );\n }\n\n // Render bare combobox without Field wrapper\n return comboboxControl;\n}\n\nfunction Content({\n children,\n className,\n align = \"start\",\n sideOffset = 4,\n alignOffset,\n side,\n container: containerProp,\n}: PropsWithChildren<{\n className?: string;\n align?: ComboboxBase.Positioner.Props[\"align\"];\n alignOffset?: ComboboxBase.Positioner.Props[\"alignOffset\"];\n side?: ComboboxBase.Positioner.Props[\"side\"];\n sideOffset?: ComboboxBase.Positioner.Props[\"sideOffset\"];\n /**\n * Container element for the portal. Use this to render the combobox inside\n * a Shadow DOM or custom container. Overrides `KumoPortalProvider` context.\n * @default document.body (or KumoPortalProvider container if set)\n */\n container?: PortalContainer;\n}>) {\n const contextContainer = usePortalContainer();\n const container = containerProp ?? contextContainer ?? undefined;\n\n return (\n <ComboboxBase.Portal container={container}>\n <ComboboxBase.Positioner\n className=\"\"\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n side={side}\n >\n <ComboboxBase.Popup\n className={cn(\n \"flex flex-col\", // flexbox layout for sticky input + scrollable list\n \"max-h-[min(var(--available-height),24rem)] max-w-(--available-width) min-w-(--anchor-width) py-1.5\",\n \"bg-kumo-base text-kumo-default\", // background\n \"rounded-lg shadow-lg ring ring-kumo-line\", // border part\n className,\n )}\n >\n {children}\n </ComboboxBase.Popup>\n </ComboboxBase.Positioner>\n </ComboboxBase.Portal>\n );\n}\n\n// Size-dependent styles for TriggerValue icon\nconst triggerValueIconStyles: Record<\n KumoComboboxSize,\n { padding: string; iconSize: number; iconRight: string }\n> = {\n xs: { padding: \"pr-5\", iconSize: 12, iconRight: \"right-1\" },\n sm: { padding: \"pr-6\", iconSize: 14, iconRight: \"right-1.5\" },\n base: { padding: \"pr-8\", iconSize: 16, iconRight: \"right-2\" },\n lg: { padding: \"pr-10\", iconSize: 18, iconRight: \"right-3\" },\n};\n\nfunction TriggerValue({\n className,\n ...props\n}: ComboboxBase.Value.Props & { className?: string }) {\n const { size, hasError } = useContext(ComboboxContext);\n const iconStyles = triggerValueIconStyles[size];\n\n return (\n <ComboboxBase.Trigger\n data-kumo-component=\"Combobox\"\n data-kumo-part=\"trigger\"\n className={cn(\n inputVariants({ size, variant: hasError ? \"error\" : \"default\" }),\n \"relative flex items-center\",\n \"data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed\",\n \"data-[placeholder]:text-kumo-placeholder\",\n iconStyles.padding,\n className,\n )}\n >\n <ComboboxBase.Value {...props} />\n <ComboboxBase.Icon\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 flex items-center text-kumo-subtle\",\n iconStyles.iconRight,\n )}\n >\n <CaretDownIcon size={iconStyles.iconSize} className=\"fill-current\" />\n </ComboboxBase.Icon>\n </ComboboxBase.Trigger>\n );\n}\n\n// Size-dependent styles for TriggerInput icons\nconst triggerInputIconStyles: Record<\n KumoComboboxSize,\n { padding: string; iconSize: number; clearRight: string; caretRight: string }\n> = {\n xs: {\n padding: \"pr-7\",\n iconSize: 12,\n clearRight: \"right-5\",\n caretRight: \"right-1\",\n },\n sm: {\n padding: \"pr-9\",\n iconSize: 14,\n clearRight: \"right-6\",\n caretRight: \"right-1.5\",\n },\n base: {\n padding: \"pr-12\",\n iconSize: 16,\n clearRight: \"right-8\",\n caretRight: \"right-2\",\n },\n lg: {\n padding: \"pr-14\",\n iconSize: 18,\n clearRight: \"right-9\",\n caretRight: \"right-3\",\n },\n};\n\nfunction TriggerInput({\n clearLabel = \"Clear selection\",\n showOptionsLabel = \"Show options\",\n ...props\n}: ComboboxBase.Input.Props & {\n /** Accessible label for the clear button. Pass a translated string for i18n.\n * @default \"Clear selection\"\n */\n clearLabel?: string;\n /** Accessible label for the dropdown trigger. Pass a translated string for i18n.\n * @default \"Show options\"\n */\n showOptionsLabel?: string;\n}) {\n const { size, hasError } = useContext(ComboboxContext);\n const iconStyles = triggerInputIconStyles[size];\n\n return (\n <div\n className={cn(\n \"relative inline-block w-full max-w-xs\",\n \"has-[:disabled]:opacity-50 has-[:disabled]:cursor-not-allowed\",\n props.className,\n )}\n >\n <ComboboxBase.Input\n {...props}\n className={cn(\n inputVariants({ size, variant: hasError ? \"error\" : \"default\" }),\n \"w-full\",\n iconStyles.padding,\n \"disabled:cursor-not-allowed\",\n )}\n />\n\n <ComboboxBase.Clear\n data-kumo-component=\"Combobox\"\n data-kumo-part=\"clear\"\n aria-label={clearLabel}\n className={cn(\n \"absolute top-1/2 flex -translate-y-1/2 cursor-pointer bg-transparent p-0\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-0\",\n iconStyles.clearRight,\n )}\n >\n <XIcon size={iconStyles.iconSize} />\n </ComboboxBase.Clear>\n\n <ComboboxBase.Trigger\n data-kumo-component=\"Combobox\"\n data-kumo-part=\"trigger\"\n aria-label={showOptionsLabel}\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 flex items-center justify-center cursor-pointer text-kumo-subtle\",\n \"m-0 bg-transparent p-0\", // Reset Stratus global button styles\n iconStyles.caretRight,\n )}\n >\n <ComboboxBase.Icon className=\"flex items-center\">\n <CaretDownIcon size={iconStyles.iconSize} className=\"fill-current\" />\n </ComboboxBase.Icon>\n </ComboboxBase.Trigger>\n </div>\n );\n}\n\nfunction Item({\n children,\n className,\n ...props\n}: ComboboxBase.Item.Props & { className?: string }) {\n return (\n <ComboboxBase.Item\n data-kumo-component=\"Combobox\"\n data-kumo-part=\"item\"\n {...props}\n className={cn(\n \"group mx-1.5 grid grid-cols-[1fr_16px] gap-2 rounded px-2 py-1.5 text-base\",\n \"cursor-pointer data-highlighted:bg-kumo-tint\",\n // Disabled rows: muted text, no pointer, suppress highlight bg even\n // when keyboard nav lands on them. Base UI sets `data-disabled` on\n // the element when the `disabled` prop is true.\n \"data-[disabled]:cursor-not-allowed data-[disabled]:text-kumo-subtle data-[disabled]:opacity-60 data-[disabled]:data-highlighted:bg-transparent\",\n className,\n )}\n >\n <div className=\"col-start-1\">{children}</div>\n <ComboboxBase.ItemIndicator className=\"col-start-2 flex items-center\">\n <CheckIcon />\n </ComboboxBase.ItemIndicator>\n </ComboboxBase.Item>\n );\n}\n\nfunction Empty(props: ComboboxBase.Empty.Props) {\n return (\n <ComboboxBase.Empty\n {...props}\n className={cn(\n \"mx-1.5 shrink-0 px-4 py-2 text-[0.925rem] leading-4 text-kumo-subtle empty:m-0 empty:p-0\",\n )}\n children={props.children ?? \"No labels found.\"}\n />\n );\n}\n\nfunction Input(props: ComboboxBase.Input.Props) {\n return (\n <ComboboxBase.Input\n {...props}\n className={cn(\n inputVariants(),\n \"mx-1.5 w-[calc(100%-0.75rem)] shrink-0 first:mb-2\",\n props.className,\n )}\n />\n );\n}\n\nfunction List({\n className,\n ...props\n}: ComboboxBase.List.Props & { className?: string }) {\n return (\n <ComboboxBase.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 GroupLabel(props: ComboboxBase.GroupLabel.Props) {\n return (\n <ComboboxBase.GroupLabel\n {...props}\n className={cn(\n \"mx-1.5 px-2 py-1.5 text-sm text-kumo-subtle\",\n props.className,\n )}\n />\n );\n}\n\nfunction Group(props: ComboboxBase.Group.Props) {\n return (\n <ComboboxBase.Group\n {...props}\n className=\"border-t border-kumo-hairline mt-2 pt-2 first:border-t-0 first:mt-0 first:pt-0\"\n />\n );\n}\n\nfunction Chip({\n removeLabel = \"Remove\",\n ...props\n}: ComboboxBase.Chip.Props & {\n /** Accessible label for the chip remove button. Pass a translated string for i18n.\n * @default \"Remove\"\n */\n removeLabel?: string;\n}) {\n return (\n <ComboboxBase.Chip\n {...props}\n className={cn(\n \"flex items-center gap-2.5\", // Layout\n \"h-6 pl-2 pr-[3px]\", // Dimensions\n \"rounded-sm ring-1 ring-kumo-hairline\", // Border\n \"bg-kumo-overlay\", // Background\n \"text-sm\", // Typography\n )}\n >\n {props.children}\n <ComboboxBase.ChipRemove\n data-kumo-component=\"Combobox\"\n data-kumo-part=\"chip-remove\"\n aria-label={removeLabel}\n className={cn(\n \"cursor-pointer rounded-md p-1 hover:bg-kumo-fill-hover\",\n \"bg-transparent flex\",\n )}\n >\n <XIcon size={10} />\n </ComboboxBase.ChipRemove>\n </ComboboxBase.Chip>\n );\n}\n\n// Map size to min-height class for TriggerMultipleWithInput\nconst sizeToMinHeight: Record<KumoComboboxSize, string> = {\n xs: \"min-h-5\",\n sm: \"min-h-6.5\",\n base: \"min-h-9\",\n lg: \"min-h-10\",\n};\n\nfunction TriggerMultipleWithInput<ValueType>({\n placeholder,\n renderItem,\n className,\n inputSide = \"right\",\n value: controlledValue,\n}: {\n placeholder?: string;\n renderItem: (value: ValueType) => React.ReactNode;\n className?: string;\n inputSide?: \"right\" | \"top\";\n /** Optional controlled value for rendering chips (use when pre-selecting values) */\n value?: ValueType[];\n}) {\n const { size, hasError } = useContext(ComboboxContext);\n // Determine which value to use for rendering chips\n const chipsToRender = controlledValue;\n\n return (\n <ComboboxBase.Chips\n className={cn(\n inputVariants({ size, variant: hasError ? \"error\" : \"default\" }),\n \"flex flex-col\",\n \"gap-1 py-1 px-1.5\",\n sizeToMinHeight[size],\n \"h-auto\",\n \"data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed\",\n className,\n )}\n >\n {inputSide === \"top\" && (\n <ComboboxBase.Input\n placeholder={placeholder}\n className=\"w-full px-2 py-1 border-0 bg-inherit\"\n />\n )}\n {/* Chips container */}\n <div className=\"flex items-center flex-wrap gap-1.5 flex-1\">\n {/* Render chips from controlled value if provided */}\n {chipsToRender !== undefined &&\n chipsToRender.length > 0 &&\n chipsToRender.map((item) => renderItem(item))}\n {/* Also render from BaseUI's internal value for user selections */}\n <ComboboxBase.Value>\n {(internalValue: ValueType[]) => {\n // Skip rendering if using controlled value (to avoid duplicates)\n if (chipsToRender !== undefined) return null;\n return (\n <Fragment>\n {internalValue.map((item) => renderItem(item))}\n </Fragment>\n );\n }}\n </ComboboxBase.Value>\n {inputSide === \"right\" && (\n <ComboboxBase.Input\n placeholder={placeholder}\n className=\"min-w-[100px] flex-1 px-2 py-1 border-0 bg-inherit\"\n />\n )}\n </div>\n </ComboboxBase.Chips>\n );\n}\n\nRoot.displayName = \"Combobox.Root\";\nContent.displayName = \"Combobox.Content\";\nTriggerValue.displayName = \"Combobox.TriggerValue\";\nTriggerInput.displayName = \"Combobox.TriggerInput\";\nItem.displayName = \"Combobox.Item\";\nChip.displayName = \"Combobox.Chip\";\nTriggerMultipleWithInput.displayName = \"Combobox.TriggerMultipleWithInput\";\n\n/**\n * Combobox — autocomplete input with filterable dropdown list.\n *\n * Compound component: `Combobox` (Root), `.TriggerInput`, `.TriggerValue`,\n * `.TriggerMultipleWithInput`, `.Content`, `.Item`, `.Chip`, `.Input`,\n * `.Empty`, `.GroupLabel`, `.Group`, `.List`, `.Collection`.\n *\n * @example\n * ```tsx\n * <Combobox items={fruits} label=\"Fruit\">\n * <Combobox.TriggerInput placeholder=\"Pick a fruit…\" />\n * <Combobox.Content>\n * <Combobox.List>\n * {(item) => <Combobox.Item value={item}>{item}</Combobox.Item>}\n * </Combobox.List>\n * </Combobox.Content>\n * </Combobox>\n * ```\n *\n * @see https://base-ui.com/react/components/combobox\n */\nexport const Combobox = Object.assign(Root, {\n // Helper components\n Content,\n TriggerValue,\n TriggerInput,\n TriggerMultipleWithInput,\n\n // Slightly modified BaseUI\n Chip,\n Item,\n\n // Styled BaseUI\n Input,\n Empty,\n GroupLabel,\n Group,\n\n // Styled BaseUI\n List,\n\n // BaseUI\n Collection: ComboboxBase.Collection,\n\n Trigger: ComboboxBase.Trigger,\n Value: ComboboxBase.Value,\n Icon: ComboboxBase.Icon,\n\n // Filtering\n useFilter: ComboboxBase.useFilter,\n});\n"],"names":["KUMO_INPUT_VARIANTS","ComboboxContext","createContext","Root","label","required","labelTooltip","description","error","children","size","props","comboboxControl","jsx","ComboboxBase.Root","Field","Content","className","align","sideOffset","alignOffset","side","containerProp","contextContainer","usePortalContainer","ComboboxBase.Portal","ComboboxBase.Positioner","ComboboxBase.Popup","cn","triggerValueIconStyles","TriggerValue","hasError","useContext","iconStyles","jsxs","ComboboxBase.Trigger","inputVariants","ComboboxBase.Value","ComboboxBase.Icon","CaretDownIcon","triggerInputIconStyles","TriggerInput","clearLabel","showOptionsLabel","ComboboxBase.Input","ComboboxBase.Clear","XIcon","Item","ComboboxBase.Item","ComboboxBase.ItemIndicator","CheckIcon","Empty","ComboboxBase.Empty","Input","List","ComboboxBase.List","GroupLabel","ComboboxBase.GroupLabel","Group","ComboboxBase.Group","Chip","removeLabel","ComboboxBase.Chip","ComboboxBase.ChipRemove","sizeToMinHeight","TriggerMultipleWithInput","placeholder","renderItem","inputSide","controlledValue","chipsToRender","ComboboxBase.Chips","item","internalValue","Fragment","Combobox","ComboboxBase.Collection","ComboboxBase.useFilter"],"mappings":"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"}
|