@cloudflare/kumo 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +80 -0
- package/ai/component-registry.json +166 -123
- package/ai/component-registry.md +349 -215
- package/ai/schemas.ts +7 -2
- package/dist/.build-complete +1 -1
- package/dist/ai/schemas.d.ts +46 -34
- package/dist/ai/schemas.d.ts.map +1 -1
- package/dist/ai/schemas.js +12 -4
- package/dist/ai/schemas.js.map +1 -1
- package/dist/chunks/SankeyChart-npoyr1j06svoxsfe.js +770 -0
- package/dist/chunks/SankeyChart-npoyr1j06svoxsfe.js.map +1 -0
- package/dist/chunks/{autocomplete-h39m8kzoq0csjh9l.js → autocomplete-cvp5fsdt6gh0p3vu.js} +32 -28
- package/dist/chunks/autocomplete-cvp5fsdt6gh0p3vu.js.map +1 -0
- package/dist/chunks/{badge-e9w8qrjmeu9nocf6.js → badge-c1th6h6ahz7eu49q.js} +2 -2
- package/dist/chunks/badge-c1th6h6ahz7eu49q.js.map +1 -0
- package/dist/chunks/banner-es5iwuk4pf25e29e.js +120 -0
- package/dist/chunks/banner-es5iwuk4pf25e29e.js.map +1 -0
- package/dist/chunks/{breadcrumbs-g4pyoikibpoxsgw4.js → breadcrumbs-j214mimk5zj4ffp4.js} +8 -6
- package/dist/chunks/breadcrumbs-j214mimk5zj4ffp4.js.map +1 -0
- package/dist/chunks/{button-fxdpoacmq5rv1adk.js → button-mnrxu6dud2x5js5b.js} +19 -17
- package/dist/chunks/{button-fxdpoacmq5rv1adk.js.map → button-mnrxu6dud2x5js5b.js.map} +1 -1
- package/dist/chunks/{checkbox-dtoq56ieijj9m6vr.js → checkbox-dqih8tzzt3vhp870.js} +25 -19
- package/dist/chunks/checkbox-dqih8tzzt3vhp870.js.map +1 -0
- package/dist/chunks/{clipboard-text-nvdsloomefwgcxat.js → clipboard-text-mrut8z3dt1w0efxz.js} +4 -4
- package/dist/chunks/{clipboard-text-nvdsloomefwgcxat.js.map → clipboard-text-mrut8z3dt1w0efxz.js.map} +1 -1
- package/dist/chunks/{collapsible-cnsxmp7dko87pgx0.js → collapsible-nzqcf9zwnjkxqzr6.js} +21 -17
- package/dist/chunks/collapsible-nzqcf9zwnjkxqzr6.js.map +1 -0
- package/dist/chunks/{combobox-jcqn64ixr4557a0s.js → combobox-dpptfpcmqfrso1xa.js} +115 -103
- package/dist/chunks/combobox-dpptfpcmqfrso1xa.js.map +1 -0
- package/dist/chunks/{command-palette-jrq7p16tff6n46nj.js → command-palette-fqhyacp33fhyf696.js} +5 -5
- package/dist/chunks/{command-palette-jrq7p16tff6n46nj.js.map → command-palette-fqhyacp33fhyf696.js.map} +1 -1
- package/dist/chunks/{dialog-gndju3sqg1lmpb3f.js → dialog-my9fioafdstq50mi.js} +49 -33
- package/dist/chunks/{dialog-gndju3sqg1lmpb3f.js.map → dialog-my9fioafdstq50mi.js.map} +1 -1
- package/dist/chunks/{dropdown-k6orz4j043xybf54.js → dropdown-g4sb4cw9ffqaw5gx.js} +54 -44
- package/dist/chunks/dropdown-g4sb4cw9ffqaw5gx.js.map +1 -0
- package/dist/chunks/{empty-ni12ufom1kkakbuc.js → empty-n17inn1z67bpohkw.js} +2 -2
- package/dist/chunks/{empty-ni12ufom1kkakbuc.js.map → empty-n17inn1z67bpohkw.js.map} +1 -1
- package/dist/chunks/{field-n16udu32tpyq5udz.js → field-c8o7h3rlam4c9pcx.js} +3 -3
- package/dist/chunks/{field-n16udu32tpyq5udz.js.map → field-c8o7h3rlam4c9pcx.js.map} +1 -1
- package/dist/chunks/{input-area-hhhpgg0ev8bowtrk.js → input-area-eurk3seud30ricwn.js} +4 -4
- package/dist/chunks/{input-area-hhhpgg0ev8bowtrk.js.map → input-area-eurk3seud30ricwn.js.map} +1 -1
- package/dist/chunks/{input-mv7giprcc6hfkpq3.js → input-en8hhb14mmt3tfwn.js} +3 -3
- package/dist/chunks/{input-mv7giprcc6hfkpq3.js.map → input-en8hhb14mmt3tfwn.js.map} +1 -1
- package/dist/chunks/{input-group-kkw5j7rwzhj66h10.js → input-group-d09ocmjcbdai0gze.js} +5 -5
- package/dist/chunks/{input-group-kkw5j7rwzhj66h10.js.map → input-group-d09ocmjcbdai0gze.js.map} +1 -1
- package/dist/chunks/{label-f6yvqca8qhbpvkq8.js → label-c8rz453pti66slki.js} +3 -3
- package/dist/chunks/{label-f6yvqca8qhbpvkq8.js.map → label-c8rz453pti66slki.js.map} +1 -1
- package/dist/chunks/{layer-card-gegkqhkjy65l1ueo.js → layer-card-er4flkcxmzfug8jw.js} +2 -2
- package/dist/chunks/{layer-card-gegkqhkjy65l1ueo.js.map → layer-card-er4flkcxmzfug8jw.js.map} +1 -1
- package/dist/chunks/{link-jjk7qolyol7s1jkk.js → link-i6vnwyjcwvjz5btm.js} +20 -19
- package/dist/chunks/{link-jjk7qolyol7s1jkk.js.map → link-i6vnwyjcwvjz5btm.js.map} +1 -1
- package/dist/chunks/menubar-ng5if56amh1tto4j.js +98 -0
- package/dist/chunks/menubar-ng5if56amh1tto4j.js.map +1 -0
- package/dist/chunks/{meter-kxn34sy6l2mz5dwq.js → meter-d5igshkjqttl1fdj.js} +2 -2
- package/dist/chunks/{meter-kxn34sy6l2mz5dwq.js.map → meter-d5igshkjqttl1fdj.js.map} +1 -1
- package/dist/chunks/{pagination-ixbq8ssuuo0jxaa4.js → pagination-bw7vwca4wrfjm8vb.js} +3 -3
- package/dist/chunks/{pagination-ixbq8ssuuo0jxaa4.js.map → pagination-bw7vwca4wrfjm8vb.js.map} +1 -1
- package/dist/chunks/{popover-js5ds3szd43kspja.js → popover-ozf1j7oi7pxiudyz.js} +4 -2
- package/dist/chunks/popover-ozf1j7oi7pxiudyz.js.map +1 -0
- package/dist/chunks/{radio-nyw89v4eafptepmz.js → radio-gpg6kmzonr2cayq1.js} +54 -46
- package/dist/chunks/radio-gpg6kmzonr2cayq1.js.map +1 -0
- package/dist/chunks/{select-o2i7aovnu8v1zv8t.js → select-dw9iw35ug7yer3o3.js} +101 -91
- package/dist/chunks/select-dw9iw35ug7yer3o3.js.map +1 -0
- package/dist/chunks/{sensitive-input-bjg6m791yz7g6bn3.js → sensitive-input-dgoxjtoxl4zqa51v.js} +50 -44
- package/dist/chunks/{sensitive-input-bjg6m791yz7g6bn3.js.map → sensitive-input-dgoxjtoxl4zqa51v.js.map} +1 -1
- package/dist/chunks/sidebar-hzio700cg85f7f31.js +1014 -0
- package/dist/chunks/sidebar-hzio700cg85f7f31.js.map +1 -0
- package/dist/chunks/{surface-lzwbh3f5t0gxc83t.js → surface-iyejjbqogjbo7ise.js} +2 -2
- package/dist/chunks/{surface-lzwbh3f5t0gxc83t.js.map → surface-iyejjbqogjbo7ise.js.map} +1 -1
- package/dist/chunks/{switch-d9cs31oj4rjtg717.js → switch-g8f77h69h34xld06.js} +50 -45
- package/dist/chunks/switch-g8f77h69h34xld06.js.map +1 -0
- package/dist/chunks/{table-c6qemc2jmv22cv3p.js → table-e1te1im2tt2ez05y.js} +2 -2
- package/dist/chunks/{table-c6qemc2jmv22cv3p.js.map → table-e1te1im2tt2ez05y.js.map} +1 -1
- package/dist/chunks/{table-of-contents-fzyv7uhnnyr13dqu.js → table-of-contents-jco9kvt48d34dwsw.js} +34 -30
- package/dist/chunks/table-of-contents-jco9kvt48d34dwsw.js.map +1 -0
- package/dist/chunks/{tabs-f0ztlooi91ko9g04.js → tabs-hice1yy5q2t889z8.js} +6 -4
- package/dist/chunks/tabs-hice1yy5q2t889z8.js.map +1 -0
- package/dist/chunks/{toast-ejfm5cbt9yulqhol.js → toast-kvbgct0jvfmn4mas.js} +29 -27
- package/dist/chunks/{toast-ejfm5cbt9yulqhol.js.map → toast-kvbgct0jvfmn4mas.js.map} +1 -1
- package/dist/chunks/{tooltip-o6xfw9jjclv9pxaj.js → tooltip-ken77ixya0qpidie.js} +6 -6
- package/dist/chunks/{tooltip-o6xfw9jjclv9pxaj.js.map → tooltip-ken77ixya0qpidie.js.map} +1 -1
- package/dist/chunks/{vendor-base-ui-mzjqwv5teijixz8h.js → vendor-base-ui-knphx7dts1vm1x37.js} +1726 -1719
- package/dist/chunks/{vendor-base-ui-mzjqwv5teijixz8h.js.map → vendor-base-ui-knphx7dts1vm1x37.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/chart.js +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/clipboard-text.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/input-group.js +1 -1
- package/dist/components/input.js +3 -3
- package/dist/components/label.js +1 -1
- package/dist/components/layer-card.js +1 -1
- package/dist/components/link.js +1 -1
- package/dist/components/menubar.js +1 -1
- package/dist/components/meter.js +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/popover.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/sidebar.js +22 -23
- package/dist/components/surface.js +1 -1
- package/dist/components/switch.js +1 -1
- package/dist/components/table-of-contents.js +1 -1
- package/dist/components/table.js +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/toast.js +2 -2
- package/dist/components/tooltip.js +1 -1
- package/dist/index.js +122 -123
- package/dist/primitives/accordion.js +1 -1
- package/dist/primitives/alert-dialog.js +1 -1
- package/dist/primitives/autocomplete.js +1 -1
- package/dist/primitives/avatar.js +1 -1
- package/dist/primitives/button.js +1 -1
- package/dist/primitives/checkbox-group.js +1 -1
- package/dist/primitives/checkbox.js +1 -1
- package/dist/primitives/collapsible.js +1 -1
- package/dist/primitives/combobox.js +1 -1
- package/dist/primitives/context-menu.js +1 -1
- package/dist/primitives/csp-provider.js +1 -1
- package/dist/primitives/dialog.js +1 -1
- package/dist/primitives/direction-provider.js +1 -1
- package/dist/primitives/drawer.js +1 -1
- package/dist/primitives/field.js +1 -1
- package/dist/primitives/fieldset.js +1 -1
- package/dist/primitives/form.js +1 -1
- package/dist/primitives/input.js +1 -1
- package/dist/primitives/menu.js +1 -1
- package/dist/primitives/menubar.js +1 -1
- package/dist/primitives/meter.js +1 -1
- package/dist/primitives/navigation-menu.js +1 -1
- package/dist/primitives/number-field.js +1 -1
- package/dist/primitives/otp-field.js +1 -1
- package/dist/primitives/popover.js +1 -1
- package/dist/primitives/preview-card.js +1 -1
- package/dist/primitives/progress.js +1 -1
- package/dist/primitives/radio-group.js +1 -1
- package/dist/primitives/radio.js +1 -1
- package/dist/primitives/scroll-area.js +1 -1
- package/dist/primitives/select.js +1 -1
- package/dist/primitives/separator.js +1 -1
- package/dist/primitives/slider.js +1 -1
- package/dist/primitives/switch.js +1 -1
- package/dist/primitives/tabs.js +1 -1
- package/dist/primitives/toast.js +1 -1
- package/dist/primitives/toggle-group.js +1 -1
- package/dist/primitives/toggle.js +1 -1
- package/dist/primitives/toolbar.js +1 -1
- package/dist/primitives/tooltip.js +1 -1
- package/dist/primitives.js +1 -1
- package/dist/scripts/theme-generator/config.d.ts.map +1 -1
- package/dist/scripts/theme-generator/config.js +36 -38
- package/dist/scripts/theme-generator/config.js.map +1 -1
- package/dist/scripts/theme-generator/generate-css.d.ts.map +1 -1
- package/dist/scripts/theme-generator/types.d.ts +8 -2
- package/dist/scripts/theme-generator/types.d.ts.map +1 -1
- package/dist/src/components/autocomplete/autocomplete.d.ts +1 -0
- package/dist/src/components/autocomplete/autocomplete.d.ts.map +1 -1
- package/dist/src/components/autocomplete/index.d.ts +1 -0
- package/dist/src/components/autocomplete/index.d.ts.map +1 -1
- package/dist/src/components/badge/badge.d.ts +1 -1
- package/dist/src/components/banner/banner.d.ts +14 -7
- 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/chart/TimeseriesChart.d.ts +43 -1
- package/dist/src/components/chart/TimeseriesChart.d.ts.map +1 -1
- package/dist/src/components/checkbox/checkbox.d.ts.map +1 -1
- package/dist/src/components/collapsible/collapsible.d.ts.map +1 -1
- package/dist/src/components/combobox/combobox.d.ts +1 -0
- package/dist/src/components/combobox/combobox.d.ts.map +1 -1
- package/dist/src/components/combobox/index.d.ts +1 -0
- package/dist/src/components/combobox/index.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/link/link.d.ts.map +1 -1
- package/dist/src/components/menubar/menubar.d.ts.map +1 -1
- package/dist/src/components/popover/popover.d.ts.map +1 -1
- package/dist/src/components/radio/radio.d.ts.map +1 -1
- package/dist/src/components/select/select.d.ts.map +1 -1
- package/dist/src/components/sensitive-input/sensitive-input.d.ts.map +1 -1
- package/dist/src/components/sidebar/index.d.ts +1 -1
- package/dist/src/components/sidebar/index.d.ts.map +1 -1
- package/dist/src/components/sidebar/sidebar.d.ts +159 -146
- package/dist/src/components/sidebar/sidebar.d.ts.map +1 -1
- package/dist/src/components/switch/switch.d.ts.map +1 -1
- package/dist/src/components/table-of-contents/table-of-contents.d.ts.map +1 -1
- package/dist/src/components/tabs/tabs.d.ts.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/styles/kumo-standalone.css +1 -1
- package/dist/styles/kumo.css +37 -0
- package/dist/styles/theme-kumo.css +28 -35
- package/package.json +4 -1
- package/scripts/theme-generator/config.ts +37 -39
- package/scripts/theme-generator/generate-css.ts +4 -1
- package/scripts/theme-generator/types.ts +8 -2
- package/dist/chunks/SankeyChart-krkvltewpn3bbupw.js +0 -651
- package/dist/chunks/SankeyChart-krkvltewpn3bbupw.js.map +0 -1
- package/dist/chunks/autocomplete-h39m8kzoq0csjh9l.js.map +0 -1
- package/dist/chunks/badge-e9w8qrjmeu9nocf6.js.map +0 -1
- package/dist/chunks/banner-ip2lm8r87hich557.js +0 -88
- package/dist/chunks/banner-ip2lm8r87hich557.js.map +0 -1
- package/dist/chunks/breadcrumbs-g4pyoikibpoxsgw4.js.map +0 -1
- package/dist/chunks/checkbox-dtoq56ieijj9m6vr.js.map +0 -1
- package/dist/chunks/collapsible-cnsxmp7dko87pgx0.js.map +0 -1
- package/dist/chunks/combobox-jcqn64ixr4557a0s.js.map +0 -1
- package/dist/chunks/dropdown-k6orz4j043xybf54.js.map +0 -1
- package/dist/chunks/menubar-d5s6h96nw8ggy04a.js +0 -96
- package/dist/chunks/menubar-d5s6h96nw8ggy04a.js.map +0 -1
- package/dist/chunks/popover-js5ds3szd43kspja.js.map +0 -1
- package/dist/chunks/radio-nyw89v4eafptepmz.js.map +0 -1
- package/dist/chunks/select-o2i7aovnu8v1zv8t.js.map +0 -1
- package/dist/chunks/sidebar-izcfqkrzt4vqn8ez.js +0 -875
- package/dist/chunks/sidebar-izcfqkrzt4vqn8ez.js.map +0 -1
- package/dist/chunks/switch-d9cs31oj4rjtg717.js.map +0 -1
- package/dist/chunks/table-of-contents-fzyv7uhnnyr13dqu.js.map +0 -1
- package/dist/chunks/tabs-f0ztlooi91ko9g04.js.map +0 -1
|
@@ -1,122 +1,130 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs as m, jsx as a } from "react/jsx-runtime";
|
|
3
|
-
import { CaretUpDownIcon as
|
|
4
|
-
import { useId as
|
|
3
|
+
import { CaretUpDownIcon as H, CheckIcon as J } from "@phosphor-icons/react";
|
|
4
|
+
import { useId as Q, forwardRef as g } from "react";
|
|
5
5
|
import { c as l } from "./cn-ct4n7r74mh8y0f48.js";
|
|
6
|
-
import { b as
|
|
7
|
-
import { K as
|
|
8
|
-
import { S as
|
|
9
|
-
import { L as
|
|
10
|
-
import { F as
|
|
11
|
-
import { u as
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
const
|
|
6
|
+
import { b as X } from "./button-mnrxu6dud2x5js5b.js";
|
|
7
|
+
import { K as Y } from "./input-en8hhb14mmt3tfwn.js";
|
|
8
|
+
import { S as Z } from "./skeleton-line-epxenksfesr2fkcv.js";
|
|
9
|
+
import { L as q } from "./label-c8rz453pti66slki.js";
|
|
10
|
+
import { F as ee } from "./field-c8o7h3rlam4c9pcx.js";
|
|
11
|
+
import { u as te } from "./portal-provider-hwmkdmkpvct0cb76.js";
|
|
12
|
+
import { b1 as ae, b2 as oe, b3 as se, b4 as ne, b5 as le, b6 as ie, b7 as re, b8 as ce, b9 as de, ba as ue, bb as me, bc as be, bd as fe, be as pe, S as ge } from "./vendor-base-ui-knphx7dts1vm1x37.js";
|
|
13
|
+
Y.size;
|
|
14
|
+
const A = {
|
|
15
15
|
size: "base"
|
|
16
16
|
};
|
|
17
|
-
function
|
|
18
|
-
size: e =
|
|
17
|
+
function he({
|
|
18
|
+
size: e = A.size
|
|
19
19
|
} = {}) {
|
|
20
20
|
return l(
|
|
21
|
-
|
|
21
|
+
X({ size: e }),
|
|
22
22
|
"justify-between font-normal",
|
|
23
23
|
"focus:opacity-100 focus:ring-kumo-focus/50 focus-visible:ring-inset *:in-focus:opacity-100"
|
|
24
24
|
);
|
|
25
25
|
}
|
|
26
|
-
const
|
|
26
|
+
const z = {
|
|
27
27
|
xs: { iconSize: 12, className: "text-kumo-subtle" },
|
|
28
28
|
sm: { iconSize: 14, className: "text-kumo-subtle" },
|
|
29
29
|
base: { iconSize: 16, className: "text-kumo-subtle" },
|
|
30
30
|
lg: { iconSize: 18, className: "text-kumo-subtle" }
|
|
31
31
|
};
|
|
32
|
-
function
|
|
32
|
+
function O(e) {
|
|
33
33
|
if (e == null || typeof e != "object" || Array.isArray(e) || "$$typeof" in e || e instanceof Promise) return !1;
|
|
34
|
-
const
|
|
35
|
-
return "label" in
|
|
34
|
+
const o = e;
|
|
35
|
+
return "label" in o && o.label !== void 0;
|
|
36
36
|
}
|
|
37
|
-
function
|
|
38
|
-
return Array.isArray(e) ? e : Object.entries(e).map(([
|
|
39
|
-
value:
|
|
40
|
-
label:
|
|
37
|
+
function C(e) {
|
|
38
|
+
return Array.isArray(e) ? e : Object.entries(e).map(([o, s]) => ({
|
|
39
|
+
value: o,
|
|
40
|
+
label: O(s) ? s.label : s
|
|
41
41
|
}));
|
|
42
42
|
}
|
|
43
|
-
function
|
|
44
|
-
const
|
|
43
|
+
function Se(e) {
|
|
44
|
+
const o = C(e), s = /* @__PURE__ */ new Map();
|
|
45
45
|
if (!Array.isArray(e))
|
|
46
46
|
for (const [t, i] of Object.entries(e))
|
|
47
|
-
|
|
48
|
-
return
|
|
49
|
-
const c = typeof t.value == "string" ? t.value : `option-${i}`, u = typeof t.value == "string" ?
|
|
50
|
-
return /* @__PURE__ */ a(
|
|
47
|
+
O(i) && s.set(t, { disabled: i.disabled });
|
|
48
|
+
return o.filter((t) => t.value !== null).map((t, i) => {
|
|
49
|
+
const c = typeof t.value == "string" ? t.value : `option-${i}`, u = typeof t.value == "string" ? s.get(t.value) : void 0;
|
|
50
|
+
return /* @__PURE__ */ a(F, { value: t.value, disabled: u?.disabled, children: t.label }, c);
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
function d({
|
|
54
54
|
children: e,
|
|
55
|
-
className:
|
|
56
|
-
renderValue:
|
|
55
|
+
className: o,
|
|
56
|
+
renderValue: s,
|
|
57
57
|
label: t,
|
|
58
58
|
hideLabel: i,
|
|
59
59
|
placeholder: c,
|
|
60
60
|
loading: u,
|
|
61
|
-
size: b =
|
|
62
|
-
labelTooltip:
|
|
61
|
+
size: b = A.size,
|
|
62
|
+
labelTooltip: h,
|
|
63
63
|
description: f,
|
|
64
64
|
error: n,
|
|
65
|
-
required:
|
|
66
|
-
container:
|
|
65
|
+
required: S,
|
|
66
|
+
container: _,
|
|
67
67
|
...r
|
|
68
68
|
}) {
|
|
69
|
-
const
|
|
69
|
+
const y = Q(), E = te(), T = _ ?? E ?? void 0, x = r, U = x["aria-label"], V = x["aria-labelledby"], D = typeof t == "string" ? t : c;
|
|
70
70
|
process.env.NODE_ENV !== "production" && i !== void 0 && console.warn(
|
|
71
71
|
'[Kumo Select]: `hideLabel` is deprecated. For hidden labels, use `aria-label` instead of `label` + `hideLabel={true}`.\n Migration:\n - For visible labels: <Select label="Country" /> (hideLabel no longer needed)\n - For hidden labels: <Select aria-label="Select a country" /> (remove label and hideLabel)'
|
|
72
72
|
);
|
|
73
|
-
const
|
|
74
|
-
|
|
73
|
+
const N = t && i !== !0, k = N ? void 0 : V ?? (t ? y : void 0), K = U ?? (k ? void 0 : D), M = r.items ? C(r.items) : void 0, R = e || (r.items ? Se(r.items) : null), $ = s ? (p) => {
|
|
74
|
+
const I = c != null ? /* @__PURE__ */ a("span", { className: "text-kumo-placeholder", children: c }) : null;
|
|
75
|
+
if (p == null || p === "")
|
|
76
|
+
return I;
|
|
77
|
+
const w = s(p);
|
|
78
|
+
return w ?? I;
|
|
79
|
+
} : void 0, { items: ye, ...B } = r, W = t ? /* @__PURE__ */ a(de, { className: "m-0 select-none text-base font-medium text-kumo-default", children: /* @__PURE__ */ a(
|
|
80
|
+
q,
|
|
75
81
|
{
|
|
76
|
-
showOptional:
|
|
77
|
-
tooltip: i ? void 0 :
|
|
82
|
+
showOptional: S === !1,
|
|
83
|
+
tooltip: i ? void 0 : h,
|
|
78
84
|
asContent: !0,
|
|
79
85
|
children: t
|
|
80
86
|
}
|
|
81
87
|
) }) : null, v = /* @__PURE__ */ m(
|
|
82
|
-
|
|
88
|
+
ae,
|
|
83
89
|
{
|
|
84
|
-
...
|
|
85
|
-
items:
|
|
90
|
+
...B,
|
|
91
|
+
items: M,
|
|
86
92
|
disabled: u || r.disabled,
|
|
87
93
|
children: [
|
|
88
|
-
|
|
94
|
+
W,
|
|
89
95
|
/* @__PURE__ */ m(
|
|
90
|
-
|
|
96
|
+
oe,
|
|
91
97
|
{
|
|
98
|
+
"data-kumo-component": "Select",
|
|
99
|
+
"data-kumo-part": "trigger",
|
|
92
100
|
className: l(
|
|
93
|
-
|
|
101
|
+
he({ size: b }),
|
|
94
102
|
r.disabled && "cursor-not-allowed opacity-50",
|
|
95
103
|
n && "!ring-kumo-danger focus:ring-kumo-danger/50 focus:ring-[1.5px]",
|
|
96
|
-
|
|
104
|
+
o
|
|
97
105
|
),
|
|
98
|
-
"aria-label":
|
|
99
|
-
"aria-labelledby":
|
|
106
|
+
"aria-label": K,
|
|
107
|
+
"aria-labelledby": k,
|
|
100
108
|
children: [
|
|
101
|
-
u ? /* @__PURE__ */ a(
|
|
102
|
-
|
|
109
|
+
u ? /* @__PURE__ */ a(Z, { className: "w-32" }) : /* @__PURE__ */ a(
|
|
110
|
+
se,
|
|
103
111
|
{
|
|
104
112
|
placeholder: c,
|
|
105
113
|
className: "min-w-0 truncate data-[placeholder]:text-kumo-placeholder",
|
|
106
|
-
children:
|
|
114
|
+
children: $
|
|
107
115
|
}
|
|
108
116
|
),
|
|
109
117
|
/* @__PURE__ */ a(
|
|
110
|
-
|
|
118
|
+
ne,
|
|
111
119
|
{
|
|
112
120
|
className: l(
|
|
113
121
|
"flex shrink-0 items-center",
|
|
114
|
-
|
|
122
|
+
z[b].className
|
|
115
123
|
),
|
|
116
124
|
children: /* @__PURE__ */ a(
|
|
117
|
-
|
|
125
|
+
H,
|
|
118
126
|
{
|
|
119
|
-
size:
|
|
127
|
+
size: z[b].iconSize,
|
|
120
128
|
className: "fill-current"
|
|
121
129
|
}
|
|
122
130
|
)
|
|
@@ -125,8 +133,8 @@ function d({
|
|
|
125
133
|
]
|
|
126
134
|
}
|
|
127
135
|
),
|
|
128
|
-
/* @__PURE__ */ a(
|
|
129
|
-
|
|
136
|
+
/* @__PURE__ */ a(le, { container: T, children: /* @__PURE__ */ a(ie, { children: /* @__PURE__ */ a(
|
|
137
|
+
re,
|
|
130
138
|
{
|
|
131
139
|
className: l(
|
|
132
140
|
"flex flex-col",
|
|
@@ -135,12 +143,12 @@ function d({
|
|
|
135
143
|
"min-w-[calc(var(--anchor-width)+3px)] py-1.5"
|
|
136
144
|
),
|
|
137
145
|
children: /* @__PURE__ */ a(
|
|
138
|
-
|
|
146
|
+
ce,
|
|
139
147
|
{
|
|
140
148
|
className: l(
|
|
141
149
|
"min-h-0 flex-1 overflow-y-auto overscroll-none scroll-pt-2 scroll-pb-2"
|
|
142
150
|
),
|
|
143
|
-
children:
|
|
151
|
+
children: R
|
|
144
152
|
}
|
|
145
153
|
)
|
|
146
154
|
}
|
|
@@ -148,32 +156,34 @@ function d({
|
|
|
148
156
|
]
|
|
149
157
|
}
|
|
150
158
|
);
|
|
151
|
-
if (
|
|
159
|
+
if (N)
|
|
152
160
|
return /* @__PURE__ */ a(
|
|
153
|
-
|
|
161
|
+
ee,
|
|
154
162
|
{
|
|
155
163
|
label: t,
|
|
156
|
-
required:
|
|
157
|
-
labelTooltip:
|
|
164
|
+
required: S,
|
|
165
|
+
labelTooltip: h,
|
|
158
166
|
description: f,
|
|
159
167
|
error: n ? typeof n == "string" ? { message: n, match: !0 } : n : void 0,
|
|
160
168
|
hideLabel: !0,
|
|
161
169
|
children: v
|
|
162
170
|
}
|
|
163
171
|
);
|
|
164
|
-
const
|
|
172
|
+
const L = n ? typeof n == "string" ? { message: n } : n : void 0;
|
|
165
173
|
return /* @__PURE__ */ m("div", { className: "grid gap-2", children: [
|
|
166
|
-
t && /* @__PURE__ */ a("span", { id:
|
|
174
|
+
t && /* @__PURE__ */ a("span", { id: y, className: "sr-only", children: t }),
|
|
167
175
|
v,
|
|
168
|
-
|
|
176
|
+
L ? /* @__PURE__ */ a("span", { className: "text-sm text-kumo-danger", children: L.message }) : f && /* @__PURE__ */ a("span", { className: "text-sm leading-snug text-kumo-subtle", children: f })
|
|
169
177
|
] });
|
|
170
178
|
}
|
|
171
|
-
function
|
|
179
|
+
function F({ children: e, value: o, disabled: s, className: t }) {
|
|
172
180
|
return /* @__PURE__ */ m(
|
|
173
|
-
|
|
181
|
+
ue,
|
|
174
182
|
{
|
|
175
|
-
|
|
176
|
-
|
|
183
|
+
"data-kumo-component": "Select",
|
|
184
|
+
"data-kumo-part": "option",
|
|
185
|
+
value: o,
|
|
186
|
+
disabled: s,
|
|
177
187
|
className: l(
|
|
178
188
|
"group mx-1.5 flex cursor-pointer items-center justify-between gap-2 rounded px-2 py-1.5 text-base outline-none",
|
|
179
189
|
"focus-visible:z-50 focus-visible:ring-2 focus-visible:ring-kumo-brand focus-visible:ring-inset",
|
|
@@ -182,46 +192,46 @@ function O({ children: e, value: s, disabled: o, className: t }) {
|
|
|
182
192
|
t
|
|
183
193
|
),
|
|
184
194
|
children: [
|
|
185
|
-
/* @__PURE__ */ a(
|
|
186
|
-
/* @__PURE__ */ a(
|
|
195
|
+
/* @__PURE__ */ a(me, { children: e }),
|
|
196
|
+
/* @__PURE__ */ a(be, { children: /* @__PURE__ */ a(J, {}) })
|
|
187
197
|
]
|
|
188
198
|
}
|
|
189
199
|
);
|
|
190
200
|
}
|
|
191
|
-
const
|
|
192
|
-
({ children: e, className:
|
|
201
|
+
const G = g(
|
|
202
|
+
({ children: e, className: o }, s) => /* @__PURE__ */ a(fe, { ref: s, className: l(o), children: e })
|
|
193
203
|
);
|
|
194
|
-
|
|
195
|
-
const
|
|
196
|
-
({ children: e, className:
|
|
197
|
-
|
|
204
|
+
G.displayName = "Select.Group";
|
|
205
|
+
const j = g(
|
|
206
|
+
({ children: e, className: o }, s) => /* @__PURE__ */ a(
|
|
207
|
+
pe,
|
|
198
208
|
{
|
|
199
|
-
ref:
|
|
209
|
+
ref: s,
|
|
200
210
|
className: l(
|
|
201
211
|
"px-3.5 py-1.5 text-sm font-semibold text-kumo-subtle",
|
|
202
|
-
|
|
212
|
+
o
|
|
203
213
|
),
|
|
204
214
|
children: e
|
|
205
215
|
}
|
|
206
216
|
)
|
|
207
217
|
);
|
|
208
|
-
|
|
209
|
-
const
|
|
210
|
-
({ className: e },
|
|
211
|
-
|
|
218
|
+
j.displayName = "Select.GroupLabel";
|
|
219
|
+
const P = g(
|
|
220
|
+
({ className: e }, o) => /* @__PURE__ */ a(
|
|
221
|
+
ge,
|
|
212
222
|
{
|
|
213
|
-
ref:
|
|
223
|
+
ref: o,
|
|
214
224
|
className: l("-mx-1 my-1 h-px bg-kumo-hairline", e)
|
|
215
225
|
}
|
|
216
226
|
)
|
|
217
227
|
);
|
|
218
|
-
|
|
219
|
-
d.Option =
|
|
220
|
-
d.Group =
|
|
221
|
-
d.GroupLabel =
|
|
222
|
-
d.Separator =
|
|
228
|
+
P.displayName = "Select.Separator";
|
|
229
|
+
d.Option = F;
|
|
230
|
+
d.Group = G;
|
|
231
|
+
d.GroupLabel = j;
|
|
232
|
+
d.Separator = P;
|
|
223
233
|
d.Option.displayName = "Select.Option";
|
|
224
234
|
export {
|
|
225
235
|
d as S
|
|
226
236
|
};
|
|
227
|
-
//# sourceMappingURL=select-
|
|
237
|
+
//# sourceMappingURL=select-dw9iw35ug7yer3o3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-dw9iw35ug7yer3o3.js","sources":["../../src/components/select/select.tsx"],"sourcesContent":["import { Select as SelectBase } from \"@base-ui/react/select\";\nimport { CaretUpDownIcon, CheckIcon } from \"@phosphor-icons/react\";\nimport { forwardRef, useId } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { buttonVariants } from \"../button\";\nimport { KUMO_INPUT_VARIANTS, type KumoInputSize } from \"../input/input\";\nimport { SkeletonLine } from \"../loader\";\nimport { Label } from \"../label\";\nimport { Field, type FieldErrorMatch } from \"../field/field\";\nimport {\n usePortalContainer,\n type PortalContainer,\n} from \"../../utils/portal-provider\";\n\n/** Select variant definitions. */\nexport const KUMO_SELECT_VARIANTS = {\n size: KUMO_INPUT_VARIANTS.size,\n} as const;\n\nexport const KUMO_SELECT_DEFAULT_VARIANTS = {\n size: \"base\",\n} as const;\n\n/**\n * Select component styling metadata for Figma plugin code generation\n * Extracted from select.tsx implementation (source of truth)\n */\nexport const KUMO_SELECT_STYLING = {\n trigger: {\n height: 36, // h-9\n paddingX: 12, // px-3\n borderRadius: 8, // rounded-lg\n background: \"bg-kumo-elevated\",\n text: \"text-color-surface\",\n ring: \"color-border\",\n fontSize: 16, // text-base\n fontWeight: 400, // font-normal\n },\n stateTokens: {\n focus: { ring: \"color-active\" },\n disabled: { opacity: 0.5 },\n },\n icons: {\n caret: { name: \"ph-caret-up-down\", size: 20 },\n check: { name: \"ph-check\", size: 20 },\n },\n popup: {\n background: \"bg-kumo-elevated\",\n ring: \"border-kumo-line\",\n borderRadius: 8, // rounded-lg\n padding: 6, // p-1.5\n },\n option: {\n paddingX: 8, // px-2\n paddingY: 6, // py-1.5\n borderRadius: 4, // rounded\n fontSize: 16, // text-base\n highlightBackground: \"color-surface-secondary\",\n },\n} as const;\n\n// Derived types from KUMO_SELECT_VARIANTS\nexport type KumoSelectSize = keyof typeof KUMO_SELECT_VARIANTS.size;\n\nexport interface KumoSelectVariantsProps {\n /**\n * Size of the select 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?: KumoSelectSize;\n}\n\nexport function selectVariants({\n size = KUMO_SELECT_DEFAULT_VARIANTS.size,\n}: KumoSelectVariantsProps = {}) {\n return cn(\n buttonVariants({ size }),\n \"justify-between font-normal\",\n \"focus:opacity-100 focus:ring-kumo-focus/50 focus-visible:ring-inset *:in-focus:opacity-100\",\n );\n}\n\nconst triggerIconStyles: Record<\n KumoInputSize,\n { iconSize: number; className: string }\n> = {\n xs: { iconSize: 12, className: \"text-kumo-subtle\" },\n sm: { iconSize: 14, className: \"text-kumo-subtle\" },\n base: { iconSize: 16, className: \"text-kumo-subtle\" },\n lg: { iconSize: 18, className: \"text-kumo-subtle\" },\n};\n\n/**\n * Shape for items that carry extra metadata (disabled state, tooltip).\n * Plain `ReactNode` values are still supported for backward compatibility.\n */\nexport interface SelectItemDescriptor {\n /** Display label for the option. */\n label: ReactNode;\n /** When `true`, the option cannot be selected. */\n disabled?: boolean;\n}\n\n/** Value type accepted by the `items` object-map prop. */\nexport type SelectItemValue = ReactNode | SelectItemDescriptor;\n\nfunction isItemDescriptor(\n value: SelectItemValue,\n): value is SelectItemDescriptor {\n if (value === null || value === undefined) return false;\n if (typeof value !== \"object\" || Array.isArray(value)) return false;\n // React elements have $$typeof — exclude them\n if (\"$$typeof\" in (value as object)) return false;\n // Promises are not descriptors\n if (value instanceof Promise) return false;\n // Must have a defined label (not just the key existing)\n const candidate = value as unknown as Record<string, unknown>;\n return \"label\" in candidate && candidate.label !== undefined;\n}\n\n/**\n * Normalizes items to array format for Base UI.\n * Object maps are converted to array format so Base UI can properly\n * handle value matching and placeholder display.\n */\nfunction normalizeItems<T>(\n items:\n | Record<string, SelectItemValue>\n | ReadonlyArray<{ label: ReactNode; value: T }>,\n): ReadonlyArray<{ label: ReactNode; value: T }> {\n if (Array.isArray(items)) {\n return items;\n }\n // Convert object map to array format\n return Object.entries(items).map(([key, entry]) => ({\n value: key as T,\n label: isItemDescriptor(entry) ? entry.label : entry,\n }));\n}\n\n/**\n * Auto-generates Select.Option elements from items prop.\n * Only used when children are not explicitly provided.\n * Filters out null values (typically used for placeholders).\n */\nfunction renderOptionsFromItems<T>(\n items:\n | Record<string, SelectItemValue>\n | ReadonlyArray<{ label: ReactNode; value: T }>,\n): ReactNode {\n const normalizedItems = normalizeItems(items);\n\n // Build a lookup for disabled metadata from object-map items.\n // Object-map keys are always strings (Record<string, ...>), so the lookup\n // uses string keys. The array form ({ label, value }[]) does not support\n // descriptors — consumers should use the children API for that case.\n const disabledLookup = new Map<string, { disabled?: boolean }>();\n if (!Array.isArray(items)) {\n for (const [key, entry] of Object.entries(items)) {\n if (isItemDescriptor(entry)) {\n disabledLookup.set(key, { disabled: entry.disabled });\n }\n }\n }\n\n // Filter out null values and render options\n return normalizedItems\n .filter((item) => item.value !== null)\n .map((item, index) => {\n const key =\n typeof item.value === \"string\" ? item.value : `option-${index}`;\n // When items is an object-map, value is always a string key from\n // Object.entries. When items is an array, disabledLookup is empty.\n const meta =\n typeof item.value === \"string\"\n ? disabledLookup.get(item.value)\n : undefined;\n\n return (\n <Option key={key} value={item.value} disabled={meta?.disabled}>\n {item.label}\n </Option>\n );\n });\n}\n\ntype SelectPropsGeneric<T, Multiple extends boolean | undefined = false> = Omit<\n SelectBase.Root.Props<T, Multiple>,\n \"items\"\n> &\n KumoSelectVariantsProps & {\n multiple?: Multiple;\n /**\n * A function that returns a `ReactNode` to format the selected value.\n * Only called when a value is selected — use `placeholder` for the empty state.\n * @example\n * ```tsx\n * <Select\n * placeholder=\"Select a user...\"\n * renderValue={(user) => user.name}\n * />\n * ```\n */\n renderValue?: (value: Multiple extends true ? T[] : T) => ReactNode;\n className?: string;\n /**\n * Data structure of items rendered in the popup.\n * Accepts a plain object map (`{ key: \"Label\" }`) or an array of `{ label, value }`.\n *\n * Object-map values can be a `ReactNode` (backward-compatible) **or** a\n * `SelectItemDescriptor` for extra metadata:\n *\n * ```tsx\n * items={{\n * apple: \"Apple\",\n * banana: { label: \"Banana\", disabled: true, disabledReason: \"Out of season\" },\n * }}\n * ```\n */\n items?:\n | Record<string, SelectItemValue>\n | ReadonlyArray<{ label: ReactNode; value: T }>;\n /**\n * Label content for the select.\n * When provided, enables the Field wrapper with a visible label.\n * For accessibility without a visible label, use `aria-label` instead.\n */\n label?: ReactNode;\n /**\n * @deprecated Use `aria-label` for hidden labels instead of `label` + `hideLabel={true}`.\n * When `label` is provided without `hideLabel`, the label is now visible by default (matching Input behavior).\n * This prop will be removed in a future version.\n */\n hideLabel?: boolean;\n placeholder?: string;\n loading?: boolean;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** Helper text displayed below the select */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n /**\n * Container element for the portal. Use this to render the select inside\n * a Shadow DOM or custom container. Overrides `KumoPortalProvider` context.\n * @default document.body (or KumoPortalProvider container if set)\n */\n container?: PortalContainer;\n };\n\n/**\n * Select component props.\n *\n * **Accessible Name Required:** Select should have one of:\n * 1. `label` prop (recommended) - enables Field wrapper with visible label\n * 2. `aria-label` - for selects without visible label (accessibility-only)\n * 3. `aria-labelledby` - for custom label association\n *\n * @example\n * ```tsx\n * // With visible label (recommended)\n * <Select label=\"Country\" onValueChange={setValue}>\n * <Select.Option value=\"us\">United States</Select.Option>\n * <Select.Option value=\"uk\">United Kingdom</Select.Option>\n * </Select>\n *\n * // Without visible label (use aria-label for accessibility)\n * <Select aria-label=\"Select a country\" onValueChange={setValue}>\n * <Select.Option value=\"us\">United States</Select.Option>\n * </Select>\n * ```\n */\nexport interface SelectProps {\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Size of the select trigger. Matches Input component sizes. */\n size?: KumoSelectSize;\n /**\n * Label content for the select.\n * When provided, enables the Field wrapper with a visible label above the select.\n * For accessibility without a visible label, use `aria-label` instead.\n */\n label?: ReactNode;\n /**\n * @deprecated Use `aria-label` for hidden labels instead of `label` + `hideLabel={true}`.\n * When `label` is provided without `hideLabel`, the label is now visible by default (matching Input behavior).\n * This prop will be removed in a future version.\n */\n hideLabel?: boolean;\n /** Placeholder text shown when no value is selected. */\n placeholder?: string;\n /** When `true`, shows a skeleton loader in place of the selected value. */\n loading?: boolean;\n /** Whether the select is disabled. */\n disabled?: boolean;\n /** Whether the select is required. When `false`, shows \"(optional)\" text. */\n required?: boolean;\n /** Tooltip content displayed next to the label via an info icon. */\n labelTooltip?: ReactNode;\n /** Currently selected value (controlled mode). */\n value?: unknown;\n /** Initial value for uncontrolled mode. */\n defaultValue?: unknown;\n /** Callback fired when the selected value changes. */\n onValueChange?: (value: unknown) => void;\n /** Enable multi-select mode. */\n multiple?: boolean;\n /** `Select.Option` elements to render in the dropdown. */\n children?: ReactNode;\n /** Helper text displayed below the select. */\n description?: ReactNode;\n /** Error message string or validation error object with `match` key. */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}\n\n/**\n * Select.Option component props.\n */\nexport interface SelectOptionProps {\n /** The option content. */\n children: ReactNode;\n /** The value associated with this option. */\n value: unknown;\n /** When `true`, the option cannot be selected. */\n disabled?: boolean;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n}\n\n/**\n * Dropdown for selecting a value from a list of options.\n * Wraps Base UI Select with Kumo styling and optional Field integration.\n *\n * @example\n * ```tsx\n * <Select label=\"Fruit\" onValueChange={setFruit}>\n * <Select.Option value=\"apple\">Apple</Select.Option>\n * <Select.Option value=\"banana\">Banana</Select.Option>\n * </Select>\n * ```\n */\nexport function Select<T, Multiple extends boolean | undefined = false>({\n children,\n className,\n renderValue,\n label,\n hideLabel,\n placeholder,\n loading,\n size = KUMO_SELECT_DEFAULT_VARIANTS.size,\n labelTooltip,\n description,\n error,\n required,\n container: containerProp,\n ...props\n}: SelectPropsGeneric<T, Multiple> & { required?: boolean }) {\n const labelId = useId();\n const contextContainer = usePortalContainer();\n const container = containerProp ?? contextContainer ?? undefined;\n const propLookup = props as Record<string, unknown>;\n const ariaLabel = propLookup[\"aria-label\"] as string | undefined;\n const ariaLabelledby = propLookup[\"aria-labelledby\"] as string | undefined;\n // For aria-label, use string label or placeholder (ReactNode labels can't be used for aria-label)\n const fallbackLabel = typeof label === \"string\" ? label : placeholder;\n\n // Deprecation warning for hideLabel\n if (process.env.NODE_ENV !== \"production\" && hideLabel !== undefined) {\n console.warn(\n \"[Kumo Select]: `hideLabel` is deprecated. For hidden labels, use `aria-label` instead of `label` + `hideLabel={true}`.\\n\" +\n \" Migration:\\n\" +\n ' - For visible labels: <Select label=\"Country\" /> (hideLabel no longer needed)\\n' +\n ' - For hidden labels: <Select aria-label=\"Select a country\" /> (remove label and hideLabel)',\n );\n }\n\n // New behavior: label presence determines Field wrapper visibility (like Input)\n // hideLabel is only respected for backward compatibility when explicitly set to true\n const useFieldWrapper = label && hideLabel !== true;\n const triggerLabelledBy = useFieldWrapper\n ? undefined\n : (ariaLabelledby ?? (label ? labelId : undefined));\n const triggerAriaLabel =\n ariaLabel ?? (!triggerLabelledBy ? fallbackLabel : undefined);\n\n // Normalize items to array format for Base UI compatibility\n // This fixes placeholder not showing with object map items\n const normalizedItems = props.items ? normalizeItems(props.items) : undefined;\n\n // Auto-render children from items if no explicit children provided\n const renderedChildren = children\n ? children\n : props.items\n ? renderOptionsFromItems(props.items)\n : null;\n\n // Wrap renderValue to handle null values properly:\n // - When value is null, show placeholder (Base UI ignores placeholder when children fn provided)\n // - When value is non-null, call user's renderValue\n const valueChildrenFn = renderValue\n ? (value: unknown) => {\n const placeholderNode =\n placeholder != null ? (\n <span className=\"text-kumo-placeholder\">{placeholder}</span>\n ) : null;\n\n if (value == null || value === \"\") {\n return placeholderNode;\n }\n\n // Cast through `any` as a deliberate type boundary: Base UI passes `unknown`,\n // but our renderValue expects the generic T (or T[] for multiple)\n const rendered = renderValue(value as any);\n\n if (rendered == null) {\n return placeholderNode;\n }\n\n return rendered;\n }\n : undefined;\n\n // Exclude Kumo-extended `items` from Base UI spread — we pass `normalizedItems` instead\n const { items: _items, ...baseProps } = props;\n\n // Use Base UI's Select.Label for accessible naming — avoids the\n // hover/focus coupling that a native <label> (from Field) would cause.\n const showOptional = required === false;\n const selectLabelNode = label ? (\n <SelectBase.Label className=\"m-0 select-none text-base font-medium text-kumo-default\">\n <Label\n showOptional={showOptional}\n tooltip={hideLabel ? undefined : labelTooltip}\n asContent\n >\n {label}\n </Label>\n </SelectBase.Label>\n ) : null;\n\n const selectControl = (\n <SelectBase.Root\n {...baseProps}\n items={normalizedItems}\n disabled={loading || props.disabled}\n >\n {selectLabelNode}\n <SelectBase.Trigger\n data-kumo-component=\"Select\"\n data-kumo-part=\"trigger\"\n className={cn(\n selectVariants({ size }),\n props.disabled && \"cursor-not-allowed opacity-50\",\n error &&\n \"!ring-kumo-danger focus:ring-kumo-danger/50 focus:ring-[1.5px]\",\n className,\n )}\n aria-label={triggerAriaLabel}\n aria-labelledby={triggerLabelledBy}\n >\n {loading ? (\n <SkeletonLine className=\"w-32\" />\n ) : (\n <SelectBase.Value\n placeholder={placeholder}\n className=\"min-w-0 truncate data-[placeholder]:text-kumo-placeholder\"\n >\n {valueChildrenFn}\n </SelectBase.Value>\n )}\n <SelectBase.Icon\n className={cn(\n \"flex shrink-0 items-center\",\n triggerIconStyles[size].className,\n )}\n >\n <CaretUpDownIcon\n size={triggerIconStyles[size].iconSize}\n className=\"fill-current\"\n />\n </SelectBase.Icon>\n </SelectBase.Trigger>\n <SelectBase.Portal container={container}>\n <SelectBase.Positioner>\n <SelectBase.Popup\n className={cn(\n \"flex flex-col\",\n \"max-h-[var(--available-height)] bg-kumo-base text-kumo-default\",\n \"rounded-lg shadow-lg ring ring-kumo-line\",\n \"min-w-[calc(var(--anchor-width)+3px)] py-1.5\",\n )}\n >\n <SelectBase.List\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto overscroll-none scroll-pt-2 scroll-pb-2\",\n )}\n >\n {renderedChildren}\n </SelectBase.List>\n </SelectBase.Popup>\n </SelectBase.Positioner>\n </SelectBase.Portal>\n </SelectBase.Root>\n );\n\n // Use Field wrapper when label is provided and not hidden\n if (useFieldWrapper) {\n return (\n <Field\n label={label}\n required={required}\n labelTooltip={labelTooltip}\n description={description}\n error={\n error\n ? typeof error === \"string\"\n ? { message: error, match: true }\n : error\n : undefined\n }\n hideLabel\n >\n {selectControl}\n </Field>\n );\n }\n\n // Render with standalone label when label is hidden (sr-only)\n // Still show description/error for accessibility and UX\n const normalizedError = error\n ? typeof error === \"string\"\n ? { message: error, match: true as const }\n : error\n : undefined;\n\n return (\n <div className=\"grid gap-2\">\n {label && (\n <span id={labelId} className=\"sr-only\">\n {label}\n </span>\n )}\n {selectControl}\n {normalizedError ? (\n <span className=\"text-sm text-kumo-danger\">\n {normalizedError.message}\n </span>\n ) : (\n description && (\n <span className=\"text-sm leading-snug text-kumo-subtle\">\n {description}\n </span>\n )\n )}\n </div>\n );\n}\n\ntype OptionProps<T> = {\n children: ReactNode;\n value: T;\n /** When `true`, the option cannot be selected. */\n disabled?: boolean;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n};\n\nfunction Option<T>({ children, value, disabled, className }: OptionProps<T>) {\n return (\n <SelectBase.Item\n data-kumo-component=\"Select\"\n data-kumo-part=\"option\"\n value={value}\n disabled={disabled}\n className={cn(\n \"group mx-1.5 flex cursor-pointer items-center justify-between gap-2 rounded px-2 py-1.5 text-base outline-none\",\n \"focus-visible:z-50 focus-visible:ring-2 focus-visible:ring-kumo-brand focus-visible:ring-inset\",\n \"data-highlighted:bg-kumo-tint\",\n \"data-[disabled]:pointer-events-none data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n className,\n )}\n >\n <SelectBase.ItemText>{children}</SelectBase.ItemText>\n <SelectBase.ItemIndicator>\n <CheckIcon />\n </SelectBase.ItemIndicator>\n </SelectBase.Item>\n );\n}\n\n// --- Select.Group ---\n\ntype GroupProps = {\n children: ReactNode;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n};\n\n/**\n * Groups related options together with an accessible `role=\"group\"`.\n * Use with `Select.GroupLabel` to provide a visible heading for the group.\n *\n * @example\n * ```tsx\n * <Select.Group>\n * <Select.GroupLabel>Fruits</Select.GroupLabel>\n * <Select.Option value=\"apple\">Apple</Select.Option>\n * </Select.Group>\n * ```\n */\nconst Group = forwardRef<HTMLDivElement, GroupProps>(\n ({ children, className }, ref) => (\n <SelectBase.Group ref={ref} className={cn(className)}>\n {children}\n </SelectBase.Group>\n ),\n);\nGroup.displayName = \"Select.Group\";\n\n// --- Select.GroupLabel ---\n\ntype GroupLabelProps = {\n children: ReactNode;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n};\n\n/**\n * A visible heading for a `Select.Group`.\n * Automatically associated with its parent group for accessibility.\n *\n * @example\n * ```tsx\n * <Select.Group>\n * <Select.GroupLabel>Available</Select.GroupLabel>\n * <Select.Option value=\"a\">Option A</Select.Option>\n * </Select.Group>\n * ```\n */\nconst GroupLabel = forwardRef<HTMLDivElement, GroupLabelProps>(\n ({ children, className }, ref) => (\n <SelectBase.GroupLabel\n ref={ref}\n className={cn(\n \"px-3.5 py-1.5 text-sm font-semibold text-kumo-subtle\",\n className,\n )}\n >\n {children}\n </SelectBase.GroupLabel>\n ),\n);\nGroupLabel.displayName = \"Select.GroupLabel\";\n\n// --- Select.Separator ---\n\ntype SeparatorProps = {\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n};\n\n/**\n * A visual divider between option groups.\n *\n * @example\n * ```tsx\n * <Select.Option value=\"a\">Option A</Select.Option>\n * <Select.Separator />\n * <Select.Option value=\"b\">Option B</Select.Option>\n * ```\n */\nconst Separator = forwardRef<HTMLDivElement, SeparatorProps>(\n ({ className }, ref) => (\n <SelectBase.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-kumo-hairline\", className)}\n />\n ),\n);\nSeparator.displayName = \"Select.Separator\";\n\n// --- Assign sub-components ---\n\nSelect.Option = Option;\nSelect.Group = Group;\nSelect.GroupLabel = GroupLabel;\nSelect.Separator = Separator;\n\n(Select.Option as { displayName?: string }).displayName = \"Select.Option\";\n"],"names":["KUMO_INPUT_VARIANTS","KUMO_SELECT_DEFAULT_VARIANTS","selectVariants","size","cn","buttonVariants","triggerIconStyles","isItemDescriptor","value","candidate","normalizeItems","items","key","entry","renderOptionsFromItems","normalizedItems","disabledLookup","item","index","meta","jsx","Option","Select","children","className","renderValue","label","hideLabel","placeholder","loading","labelTooltip","description","error","required","containerProp","props","labelId","useId","contextContainer","usePortalContainer","container","propLookup","ariaLabel","ariaLabelledby","fallbackLabel","useFieldWrapper","triggerLabelledBy","triggerAriaLabel","renderedChildren","valueChildrenFn","placeholderNode","rendered","_items","baseProps","selectLabelNode","SelectBase.Label","Label","selectControl","jsxs","SelectBase.Root","SelectBase.Trigger","SkeletonLine","SelectBase.Value","SelectBase.Icon","CaretUpDownIcon","SelectBase.Portal","SelectBase.Positioner","SelectBase.Popup","SelectBase.List","Field","normalizedError","disabled","SelectBase.Item","SelectBase.ItemText","SelectBase.ItemIndicator","CheckIcon","Group","forwardRef","ref","SelectBase.Group","GroupLabel","SelectBase.GroupLabel","Separator","SelectBase.Separator"],"mappings":";;;;;;;;;;;;AAiBQA,EAAoB;AAGrB,MAAMC,IAA+B;AAAA,EAC1C,MAAM;AACR;AAuDO,SAASC,GAAe;AAAA,EAC7B,MAAAC,IAAOF,EAA6B;AACtC,IAA6B,IAAI;AAC/B,SAAOG;AAAA,IACLC,EAAe,EAAE,MAAAF,GAAM;AAAA,IACvB;AAAA,IACA;AAAA,EAAA;AAEJ;AAEA,MAAMG,IAGF;AAAA,EACF,IAAI,EAAE,UAAU,IAAI,WAAW,mBAAA;AAAA,EAC/B,IAAI,EAAE,UAAU,IAAI,WAAW,mBAAA;AAAA,EAC/B,MAAM,EAAE,UAAU,IAAI,WAAW,mBAAA;AAAA,EACjC,IAAI,EAAE,UAAU,IAAI,WAAW,mBAAA;AACjC;AAgBA,SAASC,EACPC,GAC+B;AAM/B,MALIA,KAAU,QACV,OAAOA,KAAU,YAAY,MAAM,QAAQA,CAAK,KAEhD,cAAeA,KAEfA,aAAiB,QAAS,QAAO;AAErC,QAAMC,IAAYD;AAClB,SAAO,WAAWC,KAAaA,EAAU,UAAU;AACrD;AAOA,SAASC,EACPC,GAG+C;AAC/C,SAAI,MAAM,QAAQA,CAAK,IACdA,IAGF,OAAO,QAAQA,CAAK,EAAE,IAAI,CAAC,CAACC,GAAKC,CAAK,OAAO;AAAA,IAClD,OAAOD;AAAA,IACP,OAAOL,EAAiBM,CAAK,IAAIA,EAAM,QAAQA;AAAA,EAAA,EAC/C;AACJ;AAOA,SAASC,GACPH,GAGW;AACX,QAAMI,IAAkBL,EAAeC,CAAK,GAMtCK,wBAAqB,IAAA;AAC3B,MAAI,CAAC,MAAM,QAAQL,CAAK;AACtB,eAAW,CAACC,GAAKC,CAAK,KAAK,OAAO,QAAQF,CAAK;AAC7C,MAAIJ,EAAiBM,CAAK,KACxBG,EAAe,IAAIJ,GAAK,EAAE,UAAUC,EAAM,UAAU;AAM1D,SAAOE,EACJ,OAAO,CAACE,MAASA,EAAK,UAAU,IAAI,EACpC,IAAI,CAACA,GAAMC,MAAU;AACpB,UAAMN,IACJ,OAAOK,EAAK,SAAU,WAAWA,EAAK,QAAQ,UAAUC,CAAK,IAGzDC,IACJ,OAAOF,EAAK,SAAU,WAClBD,EAAe,IAAIC,EAAK,KAAK,IAC7B;AAEN,WACE,gBAAAG,EAACC,GAAA,EAAiB,OAAOJ,EAAK,OAAO,UAAUE,GAAM,UAClD,UAAAF,EAAK,MAAA,GADKL,CAEb;AAAA,EAEJ,CAAC;AACL;AA6JO,SAASU,EAAwD;AAAA,EACtE,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA,MAAA1B,IAAOF,EAA6B;AAAA,EACpC,cAAA6B;AAAA,EACA,aAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAWC;AAAA,EACX,GAAGC;AACL,GAA6D;AAC3D,QAAMC,IAAUC,EAAA,GACVC,IAAmBC,GAAA,GACnBC,IAAYN,KAAiBI,KAAoB,QACjDG,IAAaN,GACbO,IAAYD,EAAW,YAAY,GACnCE,IAAiBF,EAAW,iBAAiB,GAE7CG,IAAgB,OAAOlB,KAAU,WAAWA,IAAQE;AAG1D,EAAI,QAAQ,IAAI,aAAa,gBAAgBD,MAAc,UACzD,QAAQ;AAAA,IACN;AAAA,EAAA;AASJ,QAAMkB,IAAkBnB,KAASC,MAAc,IACzCmB,IAAoBD,IACtB,SACCF,MAAmBjB,IAAQU,IAAU,SACpCW,IACJL,MAAeI,IAAoC,SAAhBF,IAI/B7B,IAAkBoB,EAAM,QAAQzB,EAAeyB,EAAM,KAAK,IAAI,QAG9Da,IAAmBzB,MAErBY,EAAM,QACJrB,GAAuBqB,EAAM,KAAK,IAClC,OAKAc,IAAkBxB,IACpB,CAACjB,MAAmB;AAClB,UAAM0C,IACJtB,KAAe,OACb,gBAAAR,EAAC,UAAK,WAAU,yBAAyB,aAAY,IACnD;AAEN,QAAIZ,KAAS,QAAQA,MAAU;AAC7B,aAAO0C;AAKT,UAAMC,IAAW1B,EAAYjB,CAAY;AAEzC,WAAI2C,KACKD;AAAA,EAIX,IACA,QAGE,EAAE,OAAOE,IAAQ,GAAGC,MAAclB,GAKlCmB,IAAkB5B,IACtB,gBAAAN,EAACmC,IAAA,EAAiB,WAAU,2DAC1B,UAAA,gBAAAnC;AAAA,IAACoC;AAAA,IAAA;AAAA,MACC,cAJevB,MAAa;AAAA,MAK5B,SAASN,IAAY,SAAYG;AAAA,MACjC,WAAS;AAAA,MAER,UAAAJ;AAAA,IAAA;AAAA,EAAA,GAEL,IACE,MAEE+B,IACJ,gBAAAC;AAAA,IAACC;AAAAA,IAAA;AAAA,MACE,GAAGN;AAAA,MACJ,OAAOtC;AAAA,MACP,UAAUc,KAAWM,EAAM;AAAA,MAE1B,UAAA;AAAA,QAAAmB;AAAA,QACD,gBAAAI;AAAA,UAACE;AAAAA,UAAA;AAAA,YACC,uBAAoB;AAAA,YACpB,kBAAe;AAAA,YACf,WAAWxD;AAAA,cACTF,GAAe,EAAE,MAAAC,GAAM;AAAA,cACvBgC,EAAM,YAAY;AAAA,cAClBH,KACE;AAAA,cACFR;AAAA,YAAA;AAAA,YAEF,cAAYuB;AAAA,YACZ,mBAAiBD;AAAA,YAEhB,UAAA;AAAA,cAAAjB,IACC,gBAAAT,EAACyC,GAAA,EAAa,WAAU,OAAA,CAAO,IAE/B,gBAAAzC;AAAA,gBAAC0C;AAAAA,gBAAA;AAAA,kBACC,aAAAlC;AAAA,kBACA,WAAU;AAAA,kBAET,UAAAqB;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGL,gBAAA7B;AAAA,gBAAC2C;AAAAA,gBAAA;AAAA,kBACC,WAAW3D;AAAA,oBACT;AAAA,oBACAE,EAAkBH,CAAI,EAAE;AAAA,kBAAA;AAAA,kBAG1B,UAAA,gBAAAiB;AAAA,oBAAC4C;AAAA,oBAAA;AAAA,sBACC,MAAM1D,EAAkBH,CAAI,EAAE;AAAA,sBAC9B,WAAU;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACZ;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAAiB,EAAC6C,IAAA,EAAkB,WAAAzB,GACjB,UAAA,gBAAApB,EAAC8C,IAAA,EACC,UAAA,gBAAA9C;AAAA,UAAC+C;AAAAA,UAAA;AAAA,YACC,WAAW/D;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,YAGF,UAAA,gBAAAgB;AAAA,cAACgD;AAAAA,cAAA;AAAA,gBACC,WAAWhE;AAAA,kBACT;AAAA,gBAAA;AAAA,gBAGD,UAAA4C;AAAA,cAAA;AAAA,YAAA;AAAA,UACH;AAAA,QAAA,GAEJ,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAKJ,MAAIH;AACF,WACE,gBAAAzB;AAAA,MAACiD;AAAA,MAAA;AAAA,QACC,OAAA3C;AAAA,QACA,UAAAO;AAAA,QACA,cAAAH;AAAA,QACA,aAAAC;AAAA,QACA,OACEC,IACI,OAAOA,KAAU,WACf,EAAE,SAASA,GAAO,OAAO,GAAA,IACzBA,IACF;AAAA,QAEN,WAAS;AAAA,QAER,UAAAyB;AAAA,MAAA;AAAA,IAAA;AAOP,QAAMa,IAAkBtC,IACpB,OAAOA,KAAU,WACf,EAAE,SAASA,EAA4B,IACvCA,IACF;AAEJ,SACE,gBAAA0B,EAAC,OAAA,EAAI,WAAU,cACZ,UAAA;AAAA,IAAAhC,uBACE,QAAA,EAAK,IAAIU,GAAS,WAAU,WAC1B,UAAAV,GACH;AAAA,IAED+B;AAAA,IACAa,IACC,gBAAAlD,EAAC,QAAA,EAAK,WAAU,4BACb,UAAAkD,EAAgB,QAAA,CACnB,IAEAvC,KACE,gBAAAX,EAAC,QAAA,EAAK,WAAU,yCACb,UAAAW,EAAA,CACH;AAAA,EAAA,GAGN;AAEJ;AAWA,SAASV,EAAU,EAAE,UAAAE,GAAU,OAAAf,GAAO,UAAA+D,GAAU,WAAA/C,KAA6B;AAC3E,SACE,gBAAAkC;AAAA,IAACc;AAAAA,IAAA;AAAA,MACC,uBAAoB;AAAA,MACpB,kBAAe;AAAA,MACf,OAAAhE;AAAA,MACA,UAAA+D;AAAA,MACA,WAAWnE;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAoB;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA,gBAAAJ,EAACqD,IAAA,EAAqB,UAAAlD,GAAS;AAAA,0BAC9BmD,IAAA,EACC,UAAA,gBAAAtD,EAACuD,KAAU,EAAA,CACb;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAsBA,MAAMC,IAAQC;AAAA,EACZ,CAAC,EAAE,UAAAtD,GAAU,WAAAC,KAAasD,MACxB,gBAAA1D,EAAC2D,IAAA,EAAiB,KAAAD,GAAU,WAAW1E,EAAGoB,CAAS,GAChD,UAAAD,EAAA,CACH;AAEJ;AACAqD,EAAM,cAAc;AAsBpB,MAAMI,IAAaH;AAAA,EACjB,CAAC,EAAE,UAAAtD,GAAU,WAAAC,EAAA,GAAasD,MACxB,gBAAA1D;AAAA,IAAC6D;AAAAA,IAAA;AAAA,MACC,KAAAH;AAAA,MACA,WAAW1E;AAAA,QACT;AAAA,QACAoB;AAAA,MAAA;AAAA,MAGD,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGP;AACAyD,EAAW,cAAc;AAmBzB,MAAME,IAAYL;AAAA,EAChB,CAAC,EAAE,WAAArD,KAAasD,MACd,gBAAA1D;AAAA,IAAC+D;AAAAA,IAAA;AAAA,MACC,KAAAL;AAAA,MACA,WAAW1E,EAAG,oCAAoCoB,CAAS;AAAA,IAAA;AAAA,EAAA;AAGjE;AACA0D,EAAU,cAAc;AAIxB5D,EAAO,SAASD;AAChBC,EAAO,QAAQsD;AACftD,EAAO,aAAa0D;AACpB1D,EAAO,YAAY4D;AAElB5D,EAAO,OAAoC,cAAc;"}
|