@mattermost/compass-ui 0.1.0-alpha.3 → 0.1.0-alpha.5
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/dist/compass-ui-standalone.css +10 -0
- package/dist/compass-ui.css +2 -0
- package/dist/components/action-button/ActionButton.cjs +1 -1
- package/dist/components/action-button/ActionButton.cjs.map +1 -1
- package/dist/components/action-button/ActionButton.d.ts +2 -1
- package/dist/components/action-button/ActionButton.d.ts.map +1 -1
- package/dist/components/action-button/ActionButton.js +22 -12
- package/dist/components/action-button/ActionButton.js.map +1 -1
- package/dist/components/action-button/ActionButton.module.css +1 -1
- package/dist/components/action-button/ActionButton.module.scss.cjs +1 -1
- package/dist/components/action-button/ActionButton.module.scss.js +5 -5
- package/dist/components/admin-panel/AdminPanel.d.ts +1 -1
- package/dist/components/attachment-card/AttachmentCard.cjs +1 -1
- package/dist/components/attachment-card/AttachmentCard.cjs.map +1 -1
- package/dist/components/attachment-card/AttachmentCard.d.ts +3 -1
- package/dist/components/attachment-card/AttachmentCard.d.ts.map +1 -1
- package/dist/components/attachment-card/AttachmentCard.js +92 -82
- package/dist/components/attachment-card/AttachmentCard.js.map +1 -1
- package/dist/components/attachment-card/AttachmentCard.module.css +1 -1
- package/dist/components/attachment-card/AttachmentCard.module.scss.cjs +1 -1
- package/dist/components/attachment-card/AttachmentCard.module.scss.js +19 -18
- package/dist/components/attachment-card/AttachmentCard.module.scss.js.map +1 -1
- package/dist/components/button/Button.module.css +1 -1
- package/dist/components/button/Button.module.scss.cjs +1 -1
- package/dist/components/button/Button.module.scss.js +15 -15
- package/dist/components/channel-sidebar-item/ChannelSidebarItem.cjs +1 -1
- package/dist/components/channel-sidebar-item/ChannelSidebarItem.cjs.map +1 -1
- package/dist/components/channel-sidebar-item/ChannelSidebarItem.d.ts +4 -1
- package/dist/components/channel-sidebar-item/ChannelSidebarItem.d.ts.map +1 -1
- package/dist/components/channel-sidebar-item/ChannelSidebarItem.js +112 -92
- package/dist/components/channel-sidebar-item/ChannelSidebarItem.js.map +1 -1
- package/dist/components/channel-sidebar-item/ChannelSidebarItem.module.css +1 -1
- package/dist/components/channel-sidebar-item/ChannelSidebarItem.module.scss.cjs +1 -1
- package/dist/components/channel-sidebar-item/ChannelSidebarItem.module.scss.js +22 -20
- package/dist/components/channel-sidebar-item/ChannelSidebarItem.module.scss.js.map +1 -1
- package/dist/components/channels-sidebar/channelsSidebarModel.d.ts +1 -1
- package/dist/components/checkbox/Checkbox.cjs +1 -1
- package/dist/components/checkbox/Checkbox.cjs.map +1 -1
- package/dist/components/checkbox/Checkbox.d.ts +3 -3
- package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/checkbox/Checkbox.js +21 -20
- package/dist/components/checkbox/Checkbox.js.map +1 -1
- package/dist/components/checkbox/Checkbox.module.css +1 -1
- package/dist/components/checkbox/Checkbox.module.scss.cjs +1 -1
- package/dist/components/checkbox/Checkbox.module.scss.js +7 -7
- package/dist/components/chip/Chip.cjs +1 -1
- package/dist/components/chip/Chip.cjs.map +1 -1
- package/dist/components/chip/Chip.d.ts +3 -5
- package/dist/components/chip/Chip.d.ts.map +1 -1
- package/dist/components/chip/Chip.js +90 -48
- package/dist/components/chip/Chip.js.map +1 -1
- package/dist/components/chip/Chip.module.css +1 -1
- package/dist/components/chip/Chip.module.scss.cjs +1 -1
- package/dist/components/chip/Chip.module.scss.js +9 -9
- package/dist/components/chip/ChipGroup.cjs +2 -0
- package/dist/components/chip/ChipGroup.cjs.map +1 -0
- package/dist/components/chip/ChipGroup.d.ts +16 -0
- package/dist/components/chip/ChipGroup.d.ts.map +1 -0
- package/dist/components/chip/ChipGroup.js +112 -0
- package/dist/components/chip/ChipGroup.js.map +1 -0
- package/dist/components/chip/ChipGroup.module.css +1 -0
- package/dist/components/chip/ChipGroup.module.scss.cjs +2 -0
- package/dist/components/chip/ChipGroup.module.scss.cjs.map +1 -0
- package/dist/components/chip/ChipGroup.module.scss.js +7 -0
- package/dist/components/chip/ChipGroup.module.scss.js.map +1 -0
- package/dist/components/chip/index.cjs +1 -1
- package/dist/components/chip/index.d.ts +2 -0
- package/dist/components/chip/index.d.ts.map +1 -1
- package/dist/components/chip/index.js +4 -2
- package/dist/components/chip/index.js.map +1 -1
- package/dist/components/combobox/Combobox.cjs +1 -1
- package/dist/components/combobox/Combobox.cjs.map +1 -1
- package/dist/components/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.js +115 -109
- package/dist/components/combobox/Combobox.js.map +1 -1
- package/dist/components/combobox/Combobox.module.css +1 -1
- package/dist/components/combobox/Combobox.module.scss.cjs +1 -1
- package/dist/components/combobox/Combobox.module.scss.js +27 -29
- package/dist/components/date-range-picker/DateRangePicker.cjs +1 -1
- package/dist/components/date-range-picker/DateRangePicker.cjs.map +1 -1
- package/dist/components/date-range-picker/DateRangePicker.js +154 -154
- package/dist/components/date-range-picker/DateRangePicker.js.map +1 -1
- package/dist/components/date-range-picker/DateRangePicker.module.css +1 -1
- package/dist/components/date-range-picker/DateRangePicker.module.scss.cjs +1 -1
- package/dist/components/date-range-picker/DateRangePicker.module.scss.js +28 -45
- package/dist/components/dropdown/Dropdown.cjs +1 -1
- package/dist/components/dropdown/Dropdown.cjs.map +1 -1
- package/dist/components/dropdown/Dropdown.js +1 -1
- package/dist/components/dropdown/Dropdown.js.map +1 -1
- package/dist/components/dropdown/Dropdown.module.css +1 -1
- package/dist/components/dropdown/Dropdown.module.scss.cjs +1 -1
- package/dist/components/dropdown/Dropdown.module.scss.js +15 -16
- package/dist/components/empty-state/EmptyState.d.ts +2 -2
- package/dist/components/feature-discovery-panel/FeatureDiscoveryPanel.d.ts +2 -2
- package/dist/components/global-banner/GlobalBanner.module.css +1 -1
- package/dist/components/global-banner/GlobalBanner.module.scss.cjs +1 -1
- package/dist/components/global-banner/GlobalBanner.module.scss.js +10 -10
- package/dist/components/icon-button/IconButton.cjs +1 -1
- package/dist/components/icon-button/IconButton.cjs.map +1 -1
- package/dist/components/icon-button/IconButton.d.ts +1 -1
- package/dist/components/icon-button/IconButton.d.ts.map +1 -1
- package/dist/components/icon-button/IconButton.js +14 -14
- package/dist/components/icon-button/IconButton.js.map +1 -1
- package/dist/components/icon-button/IconButton.module.css +1 -1
- package/dist/components/icon-button/IconButton.module.scss.cjs +1 -1
- package/dist/components/icon-button/IconButton.module.scss.js +15 -15
- package/dist/components/image-preview/ImagePreview.cjs +1 -1
- package/dist/components/image-preview/ImagePreview.cjs.map +1 -1
- package/dist/components/image-preview/ImagePreview.d.ts +2 -1
- package/dist/components/image-preview/ImagePreview.d.ts.map +1 -1
- package/dist/components/image-preview/ImagePreview.js +70 -52
- package/dist/components/image-preview/ImagePreview.js.map +1 -1
- package/dist/components/image-preview/ImagePreview.module.css +1 -1
- package/dist/components/image-preview/ImagePreview.module.scss.cjs +1 -1
- package/dist/components/image-preview/ImagePreview.module.scss.js +15 -15
- package/dist/components/menu-item/MenuItem.cjs +1 -1
- package/dist/components/menu-item/MenuItem.cjs.map +1 -1
- package/dist/components/menu-item/MenuItem.js +11 -11
- package/dist/components/menu-item/MenuItem.js.map +1 -1
- package/dist/components/menu-item/MenuItem.module.css +1 -1
- package/dist/components/menu-item/MenuItem.module.scss.cjs +1 -1
- package/dist/components/menu-item/MenuItem.module.scss.js +16 -16
- package/dist/components/message/Message.d.ts +1 -1
- package/dist/components/message/Message.module.css +1 -1
- package/dist/components/message/Message.module.scss.cjs +1 -1
- package/dist/components/message/Message.module.scss.js +20 -20
- package/dist/components/message-reactions/MessageReactions.module.css +1 -1
- package/dist/components/message-reactions/MessageReactions.module.scss.cjs +1 -1
- package/dist/components/message-reactions/MessageReactions.module.scss.js +12 -12
- package/dist/components/modal/Modal.cjs +1 -1
- package/dist/components/modal/Modal.cjs.map +1 -1
- package/dist/components/modal/Modal.d.ts +9 -1
- package/dist/components/modal/Modal.d.ts.map +1 -1
- package/dist/components/modal/Modal.js +30 -20
- package/dist/components/modal/Modal.js.map +1 -1
- package/dist/components/modal/Modal.module.css +1 -1
- package/dist/components/modal/Modal.module.scss.cjs +1 -1
- package/dist/components/modal/Modal.module.scss.js +18 -17
- package/dist/components/modal/Modal.module.scss.js.map +1 -1
- package/dist/components/modal/index.d.ts +1 -1
- package/dist/components/modal/index.d.ts.map +1 -1
- package/dist/components/more-unreads-banner/MoreUnreadsBanner.module.css +1 -1
- package/dist/components/more-unreads-banner/MoreUnreadsBanner.module.scss.cjs +1 -1
- package/dist/components/more-unreads-banner/MoreUnreadsBanner.module.scss.js +5 -5
- package/dist/components/pagination-dots/PaginationDots.module.css +1 -1
- package/dist/components/pagination-dots/PaginationDots.module.scss.cjs +1 -1
- package/dist/components/pagination-dots/PaginationDots.module.scss.js +8 -8
- package/dist/components/radio/Radio.cjs +1 -1
- package/dist/components/radio/Radio.cjs.map +1 -1
- package/dist/components/radio/Radio.d.ts +3 -3
- package/dist/components/radio/Radio.d.ts.map +1 -1
- package/dist/components/radio/Radio.js +11 -11
- package/dist/components/radio/Radio.js.map +1 -1
- package/dist/components/radio/Radio.module.css +1 -1
- package/dist/components/radio/Radio.module.scss.cjs +1 -1
- package/dist/components/radio/Radio.module.scss.js +11 -11
- package/dist/components/right-sidebar/RightSidebarHeader/RightSidebarHeader.d.ts +1 -1
- package/dist/components/search-input/SearchInput.cjs +1 -1
- package/dist/components/search-input/SearchInput.cjs.map +1 -1
- package/dist/components/search-input/SearchInput.d.ts +2 -0
- package/dist/components/search-input/SearchInput.d.ts.map +1 -1
- package/dist/components/search-input/SearchInput.js +78 -64
- package/dist/components/search-input/SearchInput.js.map +1 -1
- package/dist/components/search-input/SearchInput.module.css +1 -1
- package/dist/components/search-input/SearchInput.module.scss.cjs +1 -1
- package/dist/components/search-input/SearchInput.module.scss.js +16 -23
- package/dist/components/search-input/SearchInput.module.scss.js.map +1 -1
- package/dist/components/select/Select.cjs +1 -1
- package/dist/components/select/Select.cjs.map +1 -1
- package/dist/components/select/Select.d.ts.map +1 -1
- package/dist/components/select/Select.js +64 -64
- package/dist/components/select/Select.js.map +1 -1
- package/dist/components/select/Select.module.css +1 -1
- package/dist/components/select/Select.module.scss.cjs +1 -1
- package/dist/components/select/Select.module.scss.js +24 -26
- package/dist/components/switch/Switch.cjs +1 -1
- package/dist/components/switch/Switch.cjs.map +1 -1
- package/dist/components/switch/Switch.d.ts.map +1 -1
- package/dist/components/switch/Switch.js +2 -2
- package/dist/components/switch/Switch.js.map +1 -1
- package/dist/components/switch/Switch.module.css +1 -1
- package/dist/components/switch/Switch.module.scss.cjs +1 -1
- package/dist/components/switch/Switch.module.scss.js +15 -15
- package/dist/components/tabs/Tabs.cjs +1 -1
- package/dist/components/tabs/Tabs.cjs.map +1 -1
- package/dist/components/tabs/Tabs.d.ts +4 -0
- package/dist/components/tabs/Tabs.d.ts.map +1 -1
- package/dist/components/tabs/Tabs.js +47 -31
- package/dist/components/tabs/Tabs.js.map +1 -1
- package/dist/components/tabs/Tabs.module.css +1 -1
- package/dist/components/tabs/Tabs.module.scss.cjs +1 -1
- package/dist/components/tabs/Tabs.module.scss.js +8 -7
- package/dist/components/tabs/Tabs.module.scss.js.map +1 -1
- package/dist/components/tag/Tag.module.css +1 -1
- package/dist/components/tag/Tag.module.scss.cjs +1 -1
- package/dist/components/tag/Tag.module.scss.js +15 -15
- package/dist/components/text-area/TextArea.cjs +1 -1
- package/dist/components/text-area/TextArea.cjs.map +1 -1
- package/dist/components/text-area/TextArea.d.ts.map +1 -1
- package/dist/components/text-area/TextArea.js +57 -56
- package/dist/components/text-area/TextArea.js.map +1 -1
- package/dist/components/text-area/TextArea.module.css +1 -1
- package/dist/components/text-area/TextArea.module.scss.cjs +1 -1
- package/dist/components/text-area/TextArea.module.scss.js +12 -17
- package/dist/components/text-input/TextInput.cjs +1 -1
- package/dist/components/text-input/TextInput.cjs.map +1 -1
- package/dist/components/text-input/TextInput.d.ts.map +1 -1
- package/dist/components/text-input/TextInput.js +59 -58
- package/dist/components/text-input/TextInput.js.map +1 -1
- package/dist/components/text-input/TextInput.module.css +1 -1
- package/dist/components/text-input/TextInput.module.scss.cjs +1 -1
- package/dist/components/text-input/TextInput.module.scss.js +16 -24
- package/dist/components/thread-footer/ThreadFooter.cjs +1 -1
- package/dist/components/thread-footer/ThreadFooter.cjs.map +1 -1
- package/dist/components/thread-footer/ThreadFooter.d.ts +7 -8
- package/dist/components/thread-footer/ThreadFooter.d.ts.map +1 -1
- package/dist/components/thread-footer/ThreadFooter.js +59 -62
- package/dist/components/thread-footer/ThreadFooter.js.map +1 -1
- package/dist/components/thread-footer/ThreadFooter.module.css +1 -1
- package/dist/components/thread-footer/ThreadFooter.module.scss.cjs +1 -1
- package/dist/components/thread-footer/ThreadFooter.module.scss.js +17 -17
- package/dist/components/thread-footer/index.d.ts +7 -1
- package/dist/components/thread-footer/index.d.ts.map +1 -1
- package/dist/components/thread-list-item/ThreadListItem.cjs +1 -1
- package/dist/components/thread-list-item/ThreadListItem.cjs.map +1 -1
- package/dist/components/thread-list-item/ThreadListItem.d.ts +2 -2
- package/dist/components/thread-list-item/ThreadListItem.d.ts.map +1 -1
- package/dist/components/thread-list-item/ThreadListItem.js +102 -87
- package/dist/components/thread-list-item/ThreadListItem.js.map +1 -1
- package/dist/components/thread-list-item/ThreadListItem.module.css +1 -1
- package/dist/components/thread-list-item/ThreadListItem.module.scss.cjs +1 -1
- package/dist/components/thread-list-item/ThreadListItem.module.scss.js +26 -23
- package/dist/components/thread-list-item/ThreadListItem.module.scss.js.map +1 -1
- package/dist/components/thread-list-item/index.d.ts +1 -1
- package/dist/components/toast/Toast.module.css +1 -1
- package/dist/components/toast/Toast.module.scss.cjs +1 -1
- package/dist/components/toast/Toast.module.scss.js +6 -6
- package/dist/components/tour-point/TourPoint.module.css +1 -1
- package/dist/components/tour-point/TourPoint.module.scss.cjs +1 -1
- package/dist/components/tour-point/TourPoint.module.scss.js +28 -28
- package/dist/hooks/use-anchored-popup-portal.cjs +1 -1
- package/dist/hooks/use-anchored-popup-portal.cjs.map +1 -0
- package/dist/hooks/use-anchored-popup-portal.d.ts +1 -1
- package/dist/hooks/use-anchored-popup-portal.d.ts.map +1 -0
- package/dist/hooks/use-anchored-popup-portal.js +1 -1
- package/dist/hooks/use-anchored-popup-portal.js.map +1 -0
- package/dist/hooks/use-controllable.cjs +1 -1
- package/dist/hooks/use-controllable.cjs.map +1 -0
- package/dist/hooks/use-controllable.d.ts +1 -1
- package/dist/hooks/use-controllable.d.ts.map +1 -0
- package/dist/hooks/use-controllable.js +1 -1
- package/dist/hooks/{useControllable.cjs.map → use-controllable.js.map} +1 -1
- package/dist/hooks/use-exit-animation.cjs +1 -1
- package/dist/hooks/use-exit-animation.cjs.map +1 -0
- package/dist/hooks/use-exit-animation.d.ts +1 -1
- package/dist/hooks/use-exit-animation.d.ts.map +1 -0
- package/dist/hooks/use-exit-animation.js +1 -1
- package/dist/hooks/use-exit-animation.js.map +1 -0
- package/dist/hooks/use-outside-close.cjs +1 -1
- package/dist/hooks/use-outside-close.cjs.map +1 -0
- package/dist/hooks/use-outside-close.d.ts +1 -1
- package/dist/hooks/use-outside-close.d.ts.map +1 -0
- package/dist/hooks/use-outside-close.js +1 -1
- package/dist/hooks/use-outside-close.js.map +1 -0
- package/dist/hooks/use-popover-transition.cjs +1 -1
- package/dist/hooks/use-popover-transition.cjs.map +1 -0
- package/dist/hooks/use-popover-transition.d.ts +1 -1
- package/dist/hooks/use-popover-transition.d.ts.map +1 -0
- package/dist/hooks/use-popover-transition.js +1 -1
- package/dist/hooks/use-popover-transition.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.css +32 -30
- package/dist/index.d.ts +96 -96
- package/dist/index.js +156 -154
- package/dist/index.js.map +1 -1
- package/package.json +12 -12
- package/dist/hooks/useAnchoredPopupPortal.cjs.map +0 -1
- package/dist/hooks/useAnchoredPopupPortal.d.ts.map +0 -1
- package/dist/hooks/useAnchoredPopupPortal.js.map +0 -1
- package/dist/hooks/useControllable.d.ts.map +0 -1
- package/dist/hooks/useControllable.js.map +0 -1
- package/dist/hooks/useExitAnimation.cjs.map +0 -1
- package/dist/hooks/useExitAnimation.d.ts.map +0 -1
- package/dist/hooks/useExitAnimation.js.map +0 -1
- package/dist/hooks/useOutsideClose.cjs.map +0 -1
- package/dist/hooks/useOutsideClose.d.ts.map +0 -1
- package/dist/hooks/useOutsideClose.js.map +0 -1
- package/dist/hooks/usePopoverTransition.cjs.map +0 -1
- package/dist/hooks/usePopoverTransition.d.ts.map +0 -1
- package/dist/hooks/usePopoverTransition.js.map +0 -1
|
@@ -1,35 +1,36 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { forwardRef as
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import Ke from "../
|
|
1
|
+
import { jsxs as B, jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as Ue, useId as je, useRef as K, useCallback as m, useState as A, useMemo as G, useEffect as ie } from "react";
|
|
3
|
+
import __ze from "@mattermost/compass-icons/components/chevron-down.js";const ze=__ze&&__ze.default?__ze.default:__ze;
|
|
4
|
+
import Le from "../chip/Chip.js";
|
|
5
|
+
import Ke from "../chip/ChipGroup.js";
|
|
6
|
+
import Ge from "../icon/Icon.js";
|
|
6
7
|
import Qe from "../menu-item/MenuItem.js";
|
|
7
8
|
import Xe, { PopoverMenuScroll as qe } from "../popover-menu/PopoverMenu.js";
|
|
8
|
-
import
|
|
9
|
-
import { useAnchoredPopupPortal as
|
|
10
|
-
import { useOutsideClose as
|
|
11
|
-
import { usePopoverTransition as
|
|
12
|
-
import { toKebab as
|
|
9
|
+
import We from "../user-avatar/UserAvatar.js";
|
|
10
|
+
import { useAnchoredPopupPortal as Ye } from "../../hooks/use-anchored-popup-portal.js";
|
|
11
|
+
import { useOutsideClose as Ze } from "../../hooks/use-outside-close.js";
|
|
12
|
+
import { usePopoverTransition as Je } from "../../hooks/use-popover-transition.js";
|
|
13
|
+
import { toKebab as er } from "../../utils/string.js";
|
|
13
14
|
import o from "./Combobox.module.scss.js";
|
|
14
|
-
const ue = 280,
|
|
15
|
+
const ue = 280, rr = {
|
|
15
16
|
small: "small",
|
|
16
17
|
medium: "medium",
|
|
17
18
|
large: "large"
|
|
18
19
|
};
|
|
19
|
-
function
|
|
20
|
+
function nr(l, u) {
|
|
20
21
|
return u ? l.label.toLowerCase().includes(u.toLowerCase()) : !0;
|
|
21
22
|
}
|
|
22
|
-
function
|
|
23
|
+
function tr(l) {
|
|
23
24
|
return l == null ? null : Array.isArray(l) ? l[0] ?? null : l === "" ? null : l;
|
|
24
25
|
}
|
|
25
|
-
function
|
|
26
|
+
function or(l) {
|
|
26
27
|
return l == null ? [] : Array.isArray(l) ? l : l === "" ? [] : [l];
|
|
27
28
|
}
|
|
28
|
-
function
|
|
29
|
+
function lr(l) {
|
|
29
30
|
if (l.leadingVisual != null) return l.leadingVisual;
|
|
30
31
|
if (l.leadingAvatar != null)
|
|
31
32
|
return /* @__PURE__ */ i(
|
|
32
|
-
|
|
33
|
+
We,
|
|
33
34
|
{
|
|
34
35
|
src: l.leadingAvatar.src,
|
|
35
36
|
alt: l.leadingAvatar.alt,
|
|
@@ -37,40 +38,40 @@ function or(l) {
|
|
|
37
38
|
}
|
|
38
39
|
);
|
|
39
40
|
}
|
|
40
|
-
const
|
|
41
|
+
const _r = Ue(function({
|
|
41
42
|
options: u,
|
|
42
43
|
multiple: t = !1,
|
|
43
|
-
value:
|
|
44
|
-
defaultValue:
|
|
44
|
+
value: Q,
|
|
45
|
+
defaultValue: X,
|
|
45
46
|
onChange: N,
|
|
46
|
-
inputValue:
|
|
47
|
+
inputValue: $,
|
|
47
48
|
defaultInputValue: de = "",
|
|
48
49
|
onInputChange: v,
|
|
49
|
-
label:
|
|
50
|
+
label: g,
|
|
50
51
|
placeholder: fe,
|
|
51
|
-
leadingIcon:
|
|
52
|
-
size:
|
|
52
|
+
leadingIcon: F,
|
|
53
|
+
size: q = "medium",
|
|
53
54
|
invalid: W = !1,
|
|
54
|
-
disabled:
|
|
55
|
+
disabled: h = !1,
|
|
55
56
|
filter: V = !0,
|
|
56
57
|
emptyMessage: be = "No results",
|
|
57
58
|
className: me = "",
|
|
58
59
|
id: ve,
|
|
59
60
|
"aria-label": Y,
|
|
60
|
-
portalContainer:
|
|
61
|
-
zIndex:
|
|
61
|
+
portalContainer: he = null,
|
|
62
|
+
zIndex: pe
|
|
62
63
|
}, D) {
|
|
63
|
-
const
|
|
64
|
+
const xe = je(), R = ve ?? xe, _ = `${R}-listbox`, S = K(null), Z = K(null), I = K(null), ge = m(
|
|
64
65
|
(e) => {
|
|
65
|
-
|
|
66
|
+
I.current = e, typeof D == "function" ? D(e) : D && (D.current = e);
|
|
66
67
|
},
|
|
67
68
|
[D]
|
|
68
|
-
), H =
|
|
69
|
+
), H = Q !== void 0, [_e, ye] = A(() => X !== void 0 ? X : t ? [] : null), J = H ? Q : _e, d = t ? null : tr(J), c = t ? or(J) : [], f = $ !== void 0, [C, T] = A(de), [a, ee] = A(!1), [Ae, re] = A(!1), [b, p] = A(-1), [O, U] = A(null), M = G(
|
|
69
70
|
() => d == null ? void 0 : u.find((e) => e.value === d),
|
|
70
71
|
[u, d]
|
|
71
|
-
),
|
|
72
|
+
), j = f ? $ : t ? C : O !== null ? O : (M == null ? void 0 : M.label) ?? C, ne = f ? $ : t ? C : O !== null ? O : "", z = m(
|
|
72
73
|
(e) => {
|
|
73
|
-
f || (
|
|
74
|
+
f || (T(e), t || U(e)), v == null || v(e);
|
|
74
75
|
},
|
|
75
76
|
[f, t, v]
|
|
76
77
|
), w = m(
|
|
@@ -78,28 +79,28 @@ const pr = Te(function({
|
|
|
78
79
|
H || ye(e), N == null || N(e);
|
|
79
80
|
},
|
|
80
81
|
[H, N]
|
|
81
|
-
), s =
|
|
82
|
+
), s = G(() => {
|
|
82
83
|
if (V === !1) return u;
|
|
83
|
-
const e = typeof V == "function" ? V :
|
|
84
|
+
const e = typeof V == "function" ? V : nr;
|
|
84
85
|
return u.filter((r) => e(r, ne));
|
|
85
|
-
}, [u, V, ne]), { mounted: te, visible:
|
|
86
|
-
placement:
|
|
86
|
+
}, [u, V, ne]), { mounted: te, visible: De } = Je(a), {
|
|
87
|
+
placement: Ie,
|
|
87
88
|
maxHeight: we,
|
|
88
89
|
style: ke,
|
|
89
90
|
portalRef: oe,
|
|
90
91
|
renderPortal: Ne
|
|
91
|
-
} =
|
|
92
|
+
} = Ye(Z, te, {
|
|
92
93
|
preferredHeight: ue,
|
|
93
94
|
maxHeightCap: ue,
|
|
94
|
-
portalContainer:
|
|
95
|
-
zIndex:
|
|
95
|
+
portalContainer: he,
|
|
96
|
+
zIndex: pe
|
|
96
97
|
}), y = m(() => {
|
|
97
|
-
ee(!1),
|
|
98
|
+
ee(!1), p(-1), !t && !f && (U(null), T(""));
|
|
98
99
|
}, [t, f]), k = m(() => {
|
|
99
|
-
|
|
100
|
-
}, [
|
|
101
|
-
|
|
102
|
-
a &&
|
|
100
|
+
h || ee(!0);
|
|
101
|
+
}, [h]);
|
|
102
|
+
Ze(S, a, y, oe), ie(() => {
|
|
103
|
+
a && p((e) => {
|
|
103
104
|
if (s.length === 0) return -1;
|
|
104
105
|
if (e >= 0 && e < s.length) return e;
|
|
105
106
|
const r = t ? s.findIndex((n) => c.includes(n.value)) : s.findIndex((n) => n.value === d);
|
|
@@ -114,38 +115,37 @@ const pr = Te(function({
|
|
|
114
115
|
var r;
|
|
115
116
|
if (!e.disabled) {
|
|
116
117
|
if (t) {
|
|
117
|
-
const n = c.includes(e.value) ? c.filter((
|
|
118
|
-
w(n),
|
|
118
|
+
const n = c.includes(e.value) ? c.filter((x) => x !== e.value) : [...c, e.value];
|
|
119
|
+
w(n), z(""), y(), (r = I.current) == null || r.focus();
|
|
119
120
|
return;
|
|
120
121
|
}
|
|
121
|
-
w(e.value), f ? v == null || v(e.label) : (
|
|
122
|
+
w(e.value), f ? v == null || v(e.label) : (T(""), U(null)), y();
|
|
122
123
|
}
|
|
123
124
|
},
|
|
124
125
|
[
|
|
125
126
|
t,
|
|
126
127
|
c,
|
|
127
128
|
w,
|
|
128
|
-
|
|
129
|
+
z,
|
|
129
130
|
f,
|
|
130
131
|
v,
|
|
131
132
|
y
|
|
132
133
|
]
|
|
133
134
|
), se = m(
|
|
134
135
|
(e) => {
|
|
135
|
-
|
|
136
|
-
t && (w(c.filter((n) => n !== e)), (r = _.current) == null || r.focus());
|
|
136
|
+
t && w(c.filter((r) => r !== e));
|
|
137
137
|
},
|
|
138
138
|
[t, c, w]
|
|
139
139
|
), ae = m(
|
|
140
140
|
(e) => {
|
|
141
|
-
const r = s.map((n,
|
|
141
|
+
const r = s.map((n, x) => ({ o: n, i: x })).filter(({ o: n }) => !n.disabled);
|
|
142
142
|
if (r.length === 0) {
|
|
143
|
-
|
|
143
|
+
p(-1);
|
|
144
144
|
return;
|
|
145
145
|
}
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
return r[
|
|
146
|
+
p((n) => {
|
|
147
|
+
const x = r.findIndex(({ i: L }) => L === n), P = x < 0 ? e > 0 ? 0 : r.length - 1 : (x + e + r.length) % r.length;
|
|
148
|
+
return r[P].i;
|
|
149
149
|
});
|
|
150
150
|
},
|
|
151
151
|
[s]
|
|
@@ -155,25 +155,25 @@ const pr = Te(function({
|
|
|
155
155
|
const e = s[b];
|
|
156
156
|
if (!e) return;
|
|
157
157
|
const r = document.getElementById(
|
|
158
|
-
`${
|
|
158
|
+
`${_}-option-${e.value}`
|
|
159
159
|
);
|
|
160
160
|
r == null || r.scrollIntoView({ block: "nearest" });
|
|
161
|
-
}, [a, b, s,
|
|
161
|
+
}, [a, b, s, _]);
|
|
162
162
|
const Oe = (e) => {
|
|
163
163
|
const r = e.target.value;
|
|
164
|
-
|
|
164
|
+
z(r), a || k(), p(0);
|
|
165
165
|
}, Me = () => {
|
|
166
166
|
re(!0), k(), !t && !f && M && requestAnimationFrame(() => {
|
|
167
167
|
var e;
|
|
168
|
-
(e =
|
|
168
|
+
(e = I.current) == null || e.select();
|
|
169
169
|
});
|
|
170
170
|
}, Ee = (e) => {
|
|
171
171
|
var n;
|
|
172
172
|
const r = e.relatedTarget;
|
|
173
|
-
r && ((n =
|
|
173
|
+
r && ((n = S.current) != null && n.contains(r)) || re(!1);
|
|
174
174
|
}, Pe = (e) => {
|
|
175
175
|
var r;
|
|
176
|
-
if (!
|
|
176
|
+
if (!h)
|
|
177
177
|
switch (e.key) {
|
|
178
178
|
case "ArrowDown":
|
|
179
179
|
e.preventDefault(), a ? ae(1) : k();
|
|
@@ -182,7 +182,7 @@ const pr = Te(function({
|
|
|
182
182
|
e.preventDefault(), a ? ae(-1) : k();
|
|
183
183
|
break;
|
|
184
184
|
case "Home":
|
|
185
|
-
a && s.length > 0 && (e.preventDefault(),
|
|
185
|
+
a && s.length > 0 && (e.preventDefault(), p(
|
|
186
186
|
s.findIndex((n) => !n.disabled) >= 0 ? s.findIndex((n) => !n.disabled) : 0
|
|
187
187
|
));
|
|
188
188
|
break;
|
|
@@ -191,7 +191,7 @@ const pr = Te(function({
|
|
|
191
191
|
e.preventDefault();
|
|
192
192
|
for (let n = s.length - 1; n >= 0; n--)
|
|
193
193
|
if (!((r = s[n]) != null && r.disabled)) {
|
|
194
|
-
|
|
194
|
+
p(n);
|
|
195
195
|
break;
|
|
196
196
|
}
|
|
197
197
|
}
|
|
@@ -203,7 +203,7 @@ const pr = Te(function({
|
|
|
203
203
|
a && (e.preventDefault(), y());
|
|
204
204
|
break;
|
|
205
205
|
case "Backspace":
|
|
206
|
-
t &&
|
|
206
|
+
t && j === "" && c.length > 0 && (e.preventDefault(), se(c[c.length - 1]));
|
|
207
207
|
break;
|
|
208
208
|
case "Tab":
|
|
209
209
|
y();
|
|
@@ -211,70 +211,76 @@ const pr = Te(function({
|
|
|
211
211
|
}
|
|
212
212
|
}, Be = (e) => {
|
|
213
213
|
var r;
|
|
214
|
-
|
|
215
|
-
},
|
|
214
|
+
h || e.target.closest("[data-chip]") || (e.target !== I.current && (e.preventDefault(), (r = I.current) == null || r.focus()), a || k());
|
|
215
|
+
}, $e = t ? c.length > 0 : d != null && d !== "", Fe = j.length > 0, Re = Ae || a || $e || Fe, ce = b >= 0 ? s[b] : void 0, Se = ce != null ? `${_}-option-${ce.value}` : void 0, E = G(
|
|
216
216
|
() => u.filter((e) => c.includes(e.value)),
|
|
217
217
|
[u, c]
|
|
218
|
-
),
|
|
218
|
+
), He = o[`combobox--size-${er(q)}`], Ce = t && E.length > 0, Te = [
|
|
219
219
|
o.combobox,
|
|
220
|
-
|
|
220
|
+
He,
|
|
221
221
|
W ? o["combobox--invalid"] : "",
|
|
222
|
-
|
|
223
|
-
|
|
222
|
+
g != null && Re ? o["combobox--label-floated"] : "",
|
|
223
|
+
F != null ? o["combobox--has-leading-icon"] : "",
|
|
224
224
|
Ce ? o["combobox--has-chips"] : "",
|
|
225
225
|
a ? o["combobox--open"] : "",
|
|
226
|
-
|
|
226
|
+
h ? o["combobox--disabled"] : "",
|
|
227
227
|
me
|
|
228
228
|
].filter(Boolean).join(" ");
|
|
229
|
-
return /* @__PURE__ */
|
|
230
|
-
/* @__PURE__ */
|
|
229
|
+
return /* @__PURE__ */ B("div", { className: Te, ref: S, children: [
|
|
230
|
+
/* @__PURE__ */ B(
|
|
231
231
|
"div",
|
|
232
232
|
{
|
|
233
233
|
className: o.combobox__wrapper,
|
|
234
234
|
ref: Z,
|
|
235
235
|
children: [
|
|
236
|
-
|
|
237
|
-
/* @__PURE__ */
|
|
236
|
+
g != null && /* @__PURE__ */ i("label", { className: o.combobox__label, htmlFor: R, children: g }),
|
|
237
|
+
/* @__PURE__ */ B(
|
|
238
238
|
"div",
|
|
239
239
|
{
|
|
240
240
|
className: o.combobox__inner,
|
|
241
241
|
onMouseDown: Be,
|
|
242
242
|
children: [
|
|
243
|
-
|
|
244
|
-
/* @__PURE__ */
|
|
245
|
-
t &&
|
|
246
|
-
|
|
243
|
+
F != null && /* @__PURE__ */ i("span", { className: o["combobox__leading-icon"], "aria-hidden": !0, children: F }),
|
|
244
|
+
/* @__PURE__ */ B("div", { className: o.combobox__value, children: [
|
|
245
|
+
t && E.length > 0 && /* @__PURE__ */ i(
|
|
246
|
+
Ke,
|
|
247
247
|
{
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
248
|
+
"aria-label": typeof g == "string" ? `${g} selections` : "Selected",
|
|
249
|
+
disabled: h,
|
|
250
|
+
children: E.map((e) => /* @__PURE__ */ i(
|
|
251
|
+
Le,
|
|
252
|
+
{
|
|
253
|
+
size: rr[q],
|
|
254
|
+
leadingAvatar: e.leadingAvatar,
|
|
255
|
+
leadingIcon: e.leadingAvatar == null ? e.leadingVisual : void 0,
|
|
256
|
+
onRemove: h ? void 0 : (r) => {
|
|
257
|
+
r.stopPropagation(), se(e.value);
|
|
258
|
+
},
|
|
259
|
+
children: e.label
|
|
260
|
+
},
|
|
261
|
+
e.value
|
|
262
|
+
))
|
|
263
|
+
}
|
|
264
|
+
),
|
|
259
265
|
/* @__PURE__ */ i(
|
|
260
266
|
"input",
|
|
261
267
|
{
|
|
262
268
|
ref: ge,
|
|
263
|
-
id:
|
|
269
|
+
id: R,
|
|
264
270
|
className: o.combobox__control,
|
|
265
271
|
type: "text",
|
|
266
272
|
role: "combobox",
|
|
267
273
|
autoComplete: "off",
|
|
268
274
|
spellCheck: !1,
|
|
269
|
-
disabled:
|
|
270
|
-
placeholder: t &&
|
|
271
|
-
value:
|
|
275
|
+
disabled: h,
|
|
276
|
+
placeholder: t && E.length > 0 ? void 0 : fe,
|
|
277
|
+
value: j,
|
|
272
278
|
"aria-label": Y,
|
|
273
279
|
"aria-invalid": W ? !0 : void 0,
|
|
274
280
|
"aria-expanded": a,
|
|
275
|
-
"aria-controls":
|
|
281
|
+
"aria-controls": _,
|
|
276
282
|
"aria-autocomplete": "list",
|
|
277
|
-
"aria-activedescendant":
|
|
283
|
+
"aria-activedescendant": Se,
|
|
278
284
|
onChange: Oe,
|
|
279
285
|
onFocus: Me,
|
|
280
286
|
onBlur: Ee,
|
|
@@ -282,7 +288,7 @@ const pr = Te(function({
|
|
|
282
288
|
}
|
|
283
289
|
)
|
|
284
290
|
] }),
|
|
285
|
-
/* @__PURE__ */ i("span", { className: o
|
|
291
|
+
/* @__PURE__ */ i("span", { className: o["combobox__trailing-icon"], "aria-hidden": !0, children: /* @__PURE__ */ i(Ge, { size: "12", glyph: /* @__PURE__ */ i(ze, {}) }) })
|
|
286
292
|
]
|
|
287
293
|
}
|
|
288
294
|
)
|
|
@@ -296,20 +302,20 @@ const pr = Te(function({
|
|
|
296
302
|
ref: oe,
|
|
297
303
|
className: [
|
|
298
304
|
o.combobox__popup,
|
|
299
|
-
|
|
300
|
-
|
|
305
|
+
Ie === "above" ? o["combobox__popup--above"] : "",
|
|
306
|
+
De ? o["combobox__popup--visible"] : ""
|
|
301
307
|
].filter(Boolean).join(" "),
|
|
302
308
|
style: ke,
|
|
303
309
|
children: /* @__PURE__ */ i(Xe, { className: o.combobox__menu, children: /* @__PURE__ */ i(qe, { maxHeight: we, children: s.length === 0 ? /* @__PURE__ */ i("p", { className: o.combobox__empty, children: be }) : /* @__PURE__ */ i(
|
|
304
310
|
"ul",
|
|
305
311
|
{
|
|
306
|
-
id:
|
|
312
|
+
id: _,
|
|
307
313
|
className: o.combobox__list,
|
|
308
314
|
role: "listbox",
|
|
309
315
|
"aria-multiselectable": t || void 0,
|
|
310
|
-
"aria-label": typeof
|
|
316
|
+
"aria-label": typeof g == "string" ? g : Y ?? "Options",
|
|
311
317
|
children: s.map((e, r) => {
|
|
312
|
-
const n = Ve(e.value),
|
|
318
|
+
const n = Ve(e.value), x = r === b, P = lr(e);
|
|
313
319
|
return /* @__PURE__ */ i(
|
|
314
320
|
"li",
|
|
315
321
|
{
|
|
@@ -318,20 +324,20 @@ const pr = Te(function({
|
|
|
318
324
|
children: /* @__PURE__ */ i(
|
|
319
325
|
Qe,
|
|
320
326
|
{
|
|
321
|
-
id: `${
|
|
327
|
+
id: `${_}-option-${e.value}`,
|
|
322
328
|
role: "option",
|
|
323
329
|
label: e.label,
|
|
324
330
|
secondaryLabel: e.secondaryLabel,
|
|
325
|
-
leadingElement:
|
|
326
|
-
leadingVisual:
|
|
331
|
+
leadingElement: P != null,
|
|
332
|
+
leadingVisual: P,
|
|
327
333
|
trailingElement: n,
|
|
328
|
-
active:
|
|
334
|
+
active: x,
|
|
329
335
|
disabled: e.disabled,
|
|
330
336
|
"aria-selected": n,
|
|
331
|
-
onMouseDown: (
|
|
332
|
-
|
|
337
|
+
onMouseDown: (L) => {
|
|
338
|
+
L.preventDefault();
|
|
333
339
|
},
|
|
334
|
-
onMouseEnter: () =>
|
|
340
|
+
onMouseEnter: () => p(r),
|
|
335
341
|
onClick: () => le(e)
|
|
336
342
|
}
|
|
337
343
|
)
|
|
@@ -347,6 +353,6 @@ const pr = Te(function({
|
|
|
347
353
|
] });
|
|
348
354
|
});
|
|
349
355
|
export {
|
|
350
|
-
|
|
356
|
+
_r as default
|
|
351
357
|
};
|
|
352
358
|
//# sourceMappingURL=Combobox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Combobox.js","sources":["../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n FocusEvent,\n KeyboardEvent,\n MouseEvent,\n ReactNode,\n} from 'react';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport ChevronDownIcon from '@mattermost/compass-icons/components/chevron-down';\nimport Chip from '@/components/chip/Chip';\nimport type { ChipSize } from '@/components/chip/Chip';\nimport Icon from '@/components/icon/Icon';\nimport MenuItem from '@/components/menu-item/MenuItem';\nimport PopoverMenu, {\n PopoverMenuScroll,\n} from '@/components/popover-menu/PopoverMenu';\nimport UserAvatar from '@/components/user-avatar/UserAvatar';\nimport { useAnchoredPopupPortal } from '@/hooks/use-anchored-popup-portal';\nimport { useOutsideClose } from '@/hooks/use-outside-close';\nimport { usePopoverTransition } from '@/hooks/use-popover-transition';\nimport { toKebab } from '@/utils/string';\nimport styles from './Combobox.module.scss';\n\nexport type ComboboxSize = 'small' | 'medium' | 'large';\n\nexport type ComboboxOption = {\n value: string;\n label: string;\n disabled?: boolean;\n /** Leading content for the list row (icon or avatar node). */\n leadingVisual?: ReactNode;\n /** Avatar for chips / list when a photo is preferred over `leadingVisual`. */\n leadingAvatar?: { src: string; alt: string };\n secondaryLabel?: string;\n};\n\nexport interface ComboboxProps {\n options: ComboboxOption[];\n /** When true, selected values render as removable chips. Default: false. */\n multiple?: boolean;\n value?: string | string[] | null;\n defaultValue?: string | string[] | null;\n onChange?: (value: string | string[] | null) => void;\n inputValue?: string;\n defaultInputValue?: string;\n onInputChange?: (value: string) => void;\n label?: ReactNode;\n placeholder?: string;\n leadingIcon?: ReactNode;\n size?: ComboboxSize;\n invalid?: boolean;\n disabled?: boolean;\n /**\n * Client-side filter. `true` (default) matches labels case-insensitively.\n * `false` shows all options (caller filters via `inputValue` / `onInputChange`).\n */\n filter?: boolean | ((option: ComboboxOption, query: string) => boolean);\n emptyMessage?: string;\n className?: string;\n id?: string;\n 'aria-label'?: string;\n /** Portal mount node for the menu; defaults to `document.body`. */\n portalContainer?: HTMLElement | null;\n /** Stacking order for the portaled menu. */\n zIndex?: number;\n}\n\nconst POPUP_MAX_HEIGHT = 280;\n\nconst CHIP_SIZE_BY_COMBOBOX: Record<ComboboxSize, ChipSize> = {\n small: 'small',\n medium: 'medium',\n large: 'large',\n};\n\nfunction defaultFilter(option: ComboboxOption, query: string): boolean {\n if (!query) return true;\n return option.label.toLowerCase().includes(query.toLowerCase());\n}\n\nfunction toSingleValue(\n value: string | string[] | null | undefined,\n): string | null {\n if (value == null) return null;\n if (Array.isArray(value)) return value[0] ?? null;\n return value === '' ? null : value;\n}\n\nfunction toMultiValue(\n value: string | string[] | null | undefined,\n): string[] {\n if (value == null) return [];\n if (Array.isArray(value)) return value;\n return value === '' ? [] : [value];\n}\n\nfunction optionLeadingVisual(option: ComboboxOption): ReactNode | undefined {\n if (option.leadingVisual != null) return option.leadingVisual;\n if (option.leadingAvatar != null) {\n return (\n <UserAvatar\n src={option.leadingAvatar.src}\n alt={option.leadingAvatar.alt}\n size=\"24\"\n />\n );\n }\n return undefined;\n}\n\n/**\n * { value: 'town-square', label: 'Town Square' }, { value: 'off-topic', label: 'Off-Topic'\n * }, { value: 'design', label: 'Design' }, { value: 'engineering', label: 'Engineering' }, {\n * value: 'releases', label: 'Releases' }, ];\n */\nconst Combobox = forwardRef<HTMLInputElement, ComboboxProps>(function Combobox(\n {\n options,\n multiple = false,\n value: valueProp,\n defaultValue,\n onChange,\n inputValue: inputValueProp,\n defaultInputValue = '',\n onInputChange,\n label,\n placeholder,\n leadingIcon,\n size = 'medium',\n invalid = false,\n disabled = false,\n filter = true,\n emptyMessage = 'No results',\n className = '',\n id: idProp,\n 'aria-label': ariaLabel,\n portalContainer = null,\n zIndex,\n },\n ref,\n) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const listboxId = `${id}-listbox`;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n const isValueControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState<\n string | string[] | null\n >(() => {\n if (defaultValue !== undefined) return defaultValue;\n return multiple ? [] : null;\n });\n\n const rawValue = isValueControlled ? valueProp! : uncontrolledValue;\n const singleValue = multiple ? null : toSingleValue(rawValue);\n const multiValue = multiple ? toMultiValue(rawValue) : [];\n\n const isInputControlled = inputValueProp !== undefined;\n const [uncontrolledInput, setUncontrolledInput] = useState(defaultInputValue);\n const [isOpen, setIsOpen] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n const [queryOverride, setQueryOverride] = useState<string | null>(null);\n\n const selectedOption = useMemo(\n () =>\n singleValue == null\n ? undefined\n : options.find((o) => o.value === singleValue),\n [options, singleValue],\n );\n\n // Single-select: show the selected label until the user starts typing a filter.\n // `queryOverride !== null` means the field is in filter-edit mode.\n const displayInput = (() => {\n if (isInputControlled) return inputValueProp!;\n if (multiple) return uncontrolledInput;\n if (queryOverride !== null) return queryOverride;\n return selectedOption?.label ?? uncontrolledInput;\n })();\n\n const filterQuery = (() => {\n if (isInputControlled) return inputValueProp!;\n if (multiple) return uncontrolledInput;\n if (queryOverride !== null) return queryOverride;\n return '';\n })();\n\n const setInputDisplay = useCallback(\n (next: string) => {\n if (!isInputControlled) {\n setUncontrolledInput(next);\n if (!multiple) setQueryOverride(next);\n }\n onInputChange?.(next);\n },\n [isInputControlled, multiple, onInputChange],\n );\n\n const commitValue = useCallback(\n (next: string | string[] | null) => {\n if (!isValueControlled) setUncontrolledValue(next);\n onChange?.(next);\n },\n [isValueControlled, onChange],\n );\n\n const filteredOptions = useMemo(() => {\n if (filter === false) return options;\n const fn = typeof filter === 'function' ? filter : defaultFilter;\n return options.filter((o) => fn(o, filterQuery));\n }, [options, filter, filterQuery]);\n\n const { mounted: popupMounted, visible: popupVisible } =\n usePopoverTransition(isOpen);\n\n const {\n placement,\n maxHeight,\n style: popupStyle,\n portalRef,\n renderPortal,\n } = useAnchoredPopupPortal(anchorRef, popupMounted, {\n preferredHeight: POPUP_MAX_HEIGHT,\n maxHeightCap: POPUP_MAX_HEIGHT,\n portalContainer,\n zIndex,\n });\n\n const close = useCallback(() => {\n setIsOpen(false);\n setActiveIndex(-1);\n if (!multiple && !isInputControlled) {\n setQueryOverride(null);\n setUncontrolledInput('');\n }\n }, [multiple, isInputControlled]);\n\n const open = useCallback(() => {\n if (disabled) return;\n setIsOpen(true);\n }, [disabled]);\n\n useOutsideClose(rootRef, isOpen, close, portalRef);\n\n useEffect(() => {\n if (!isOpen) return;\n setActiveIndex((prev) => {\n if (filteredOptions.length === 0) return -1;\n if (prev >= 0 && prev < filteredOptions.length) return prev;\n const selectedIdx = multiple\n ? filteredOptions.findIndex((o) => multiValue.includes(o.value))\n : filteredOptions.findIndex((o) => o.value === singleValue);\n return selectedIdx >= 0 ? selectedIdx : 0;\n });\n }, [isOpen, filteredOptions, multiple, multiValue, singleValue]);\n\n const isSelected = useCallback(\n (optionValue: string) =>\n multiple\n ? multiValue.includes(optionValue)\n : singleValue === optionValue,\n [multiple, multiValue, singleValue],\n );\n\n const selectOption = useCallback(\n (option: ComboboxOption) => {\n if (option.disabled) return;\n\n if (multiple) {\n const next = multiValue.includes(option.value)\n ? multiValue.filter((v) => v !== option.value)\n : [...multiValue, option.value];\n commitValue(next);\n setInputDisplay('');\n close();\n inputRef.current?.focus();\n return;\n }\n\n commitValue(option.value);\n if (!isInputControlled) {\n setUncontrolledInput('');\n setQueryOverride(null);\n } else {\n onInputChange?.(option.label);\n }\n close();\n },\n [\n multiple,\n multiValue,\n commitValue,\n setInputDisplay,\n isInputControlled,\n onInputChange,\n close,\n ],\n );\n\n const removeValue = useCallback(\n (optionValue: string) => {\n if (!multiple) return;\n commitValue(multiValue.filter((v) => v !== optionValue));\n inputRef.current?.focus();\n },\n [multiple, multiValue, commitValue],\n );\n\n const moveActive = useCallback(\n (delta: number) => {\n const enabled = filteredOptions\n .map((o, i) => ({ o, i }))\n .filter(({ o }) => !o.disabled);\n if (enabled.length === 0) {\n setActiveIndex(-1);\n return;\n }\n setActiveIndex((prev) => {\n const currentPos = enabled.findIndex(({ i }) => i === prev);\n const nextPos =\n currentPos < 0\n ? delta > 0\n ? 0\n : enabled.length - 1\n : (currentPos + delta + enabled.length) % enabled.length;\n return enabled[nextPos].i;\n });\n },\n [filteredOptions],\n );\n\n useEffect(() => {\n if (!isOpen || activeIndex < 0) return;\n const option = filteredOptions[activeIndex];\n if (!option) return;\n const el = document.getElementById(\n `${listboxId}-option-${option.value}`,\n );\n el?.scrollIntoView({ block: 'nearest' });\n }, [isOpen, activeIndex, filteredOptions, listboxId]);\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n const next = e.target.value;\n setInputDisplay(next);\n if (!isOpen) open();\n setActiveIndex(0);\n };\n\n const handleFocus = () => {\n setIsFocused(true);\n open();\n // Select-all so the next keystroke replaces the selected label (filter mode).\n if (!multiple && !isInputControlled && selectedOption) {\n requestAnimationFrame(() => {\n inputRef.current?.select();\n });\n }\n };\n\n const handleBlur = (e: FocusEvent<HTMLInputElement>) => {\n // Delay so option mousedown can run first\n const related = e.relatedTarget as Node | null;\n if (related && rootRef.current?.contains(related)) return;\n setIsFocused(false);\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(-1);\n break;\n case 'Home':\n if (isOpen && filteredOptions.length > 0) {\n e.preventDefault();\n setActiveIndex(\n filteredOptions.findIndex((o) => !o.disabled) >= 0\n ? filteredOptions.findIndex((o) => !o.disabled)\n : 0,\n );\n }\n break;\n case 'End':\n if (isOpen && filteredOptions.length > 0) {\n e.preventDefault();\n for (let i = filteredOptions.length - 1; i >= 0; i--) {\n if (!filteredOptions[i]?.disabled) {\n setActiveIndex(i);\n break;\n }\n }\n }\n break;\n case 'Enter':\n if (isOpen && activeIndex >= 0 && filteredOptions[activeIndex]) {\n e.preventDefault();\n selectOption(filteredOptions[activeIndex]);\n }\n break;\n case 'Escape':\n if (isOpen) {\n e.preventDefault();\n close();\n }\n break;\n case 'Backspace':\n if (\n multiple &&\n displayInput === '' &&\n multiValue.length > 0\n ) {\n e.preventDefault();\n removeValue(multiValue[multiValue.length - 1]);\n }\n break;\n case 'Tab':\n close();\n break;\n default:\n break;\n }\n };\n\n const handleWrapperMouseDown = (e: MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n // Don't steal focus from chip remove buttons\n if ((e.target as HTMLElement).closest('button')) return;\n if (e.target !== inputRef.current) {\n e.preventDefault();\n inputRef.current?.focus();\n }\n if (!isOpen) open();\n };\n\n const hasSelection = multiple\n ? multiValue.length > 0\n : singleValue != null && singleValue !== '';\n const hasInputText = displayInput.length > 0;\n const labelFloated = isFocused || isOpen || hasSelection || hasInputText;\n\n const activeOption =\n activeIndex >= 0 ? filteredOptions[activeIndex] : undefined;\n const activeDescendant =\n activeOption != null ? `${listboxId}-option-${activeOption.value}` : undefined;\n\n const selectedOptions = useMemo(\n () => options.filter((o) => multiValue.includes(o.value)),\n [options, multiValue],\n );\n\n const sizeClass = styles[`combobox--size-${toKebab(size)}`];\n const hasChips = multiple && selectedOptions.length > 0;\n const rootClass = [\n styles.combobox,\n sizeClass,\n invalid ? styles['combobox--invalid'] : '',\n label != null && labelFloated ? styles['combobox--label-floated'] : '',\n leadingIcon != null ? styles['combobox--has-leading-icon'] : '',\n hasChips ? styles['combobox--has-chips'] : '',\n isOpen ? styles['combobox--open'] : '',\n disabled ? styles['combobox--disabled'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass} ref={rootRef}>\n <div\n className={styles.combobox__wrapper}\n ref={anchorRef}\n >\n {label != null && (\n <label className={styles.combobox__label} htmlFor={id}>\n {label}\n </label>\n )}\n <div\n className={styles.combobox__inner}\n onMouseDown={handleWrapperMouseDown}\n >\n {leadingIcon != null && (\n <span className={styles.combobox__leadingIcon} aria-hidden>\n {leadingIcon}\n </span>\n )}\n <div className={styles.combobox__value}>\n {multiple &&\n selectedOptions.map((option) => (\n <Chip\n key={option.value}\n size={CHIP_SIZE_BY_COMBOBOX[size]}\n leadingAvatar={option.leadingAvatar}\n leadingIcon={\n option.leadingAvatar == null\n ? option.leadingVisual\n : undefined\n }\n onRemove={\n disabled\n ? undefined\n : (ev) => {\n ev.stopPropagation();\n removeValue(option.value);\n }\n }\n removeLabel={`Remove ${option.label}`}\n >\n {option.label}\n </Chip>\n ))}\n <input\n ref={setInputRef}\n id={id}\n className={styles.combobox__control}\n type=\"text\"\n role=\"combobox\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={disabled}\n placeholder={\n multiple && selectedOptions.length > 0\n ? undefined\n : placeholder\n }\n value={displayInput}\n aria-label={ariaLabel}\n aria-invalid={invalid ? true : undefined}\n aria-expanded={isOpen}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeDescendant}\n onChange={handleInputChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n />\n </div>\n <span className={styles.combobox__trailingIcon} aria-hidden>\n <Icon size=\"12\" glyph={<ChevronDownIcon />} />\n </span>\n </div>\n </div>\n\n {popupMounted &&\n renderPortal(\n <div\n ref={portalRef}\n className={[\n styles.combobox__popup,\n placement === 'above' ? styles['combobox__popup--above'] : '',\n popupVisible ? styles['combobox__popup--visible'] : '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={popupStyle}\n >\n <PopoverMenu className={styles.combobox__menu}>\n <PopoverMenuScroll maxHeight={maxHeight}>\n {filteredOptions.length === 0 ? (\n <p className={styles.combobox__empty}>{emptyMessage}</p>\n ) : (\n <ul\n id={listboxId}\n className={styles.combobox__list}\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n aria-label={\n typeof label === 'string'\n ? label\n : (ariaLabel ?? 'Options')\n }\n >\n {filteredOptions.map((option, index) => {\n const selected = isSelected(option.value);\n const active = index === activeIndex;\n const leading = optionLeadingVisual(option);\n return (\n <li\n key={option.value}\n className={styles.combobox__option}\n role=\"presentation\"\n >\n <MenuItem\n id={`${listboxId}-option-${option.value}`}\n role=\"option\"\n label={option.label}\n secondaryLabel={option.secondaryLabel}\n leadingElement={leading != null}\n leadingVisual={leading}\n trailingElement={selected}\n active={active}\n disabled={option.disabled}\n aria-selected={selected}\n onMouseDown={(ev) => {\n // Prevent input blur before click handler\n ev.preventDefault();\n }}\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => selectOption(option)}\n />\n </li>\n );\n })}\n </ul>\n )}\n </PopoverMenuScroll>\n </PopoverMenu>\n </div>,\n )}\n </div>\n );\n});\n\nexport default Combobox;\n"],"names":["POPUP_MAX_HEIGHT","CHIP_SIZE_BY_COMBOBOX","defaultFilter","option","query","toSingleValue","value","toMultiValue","optionLeadingVisual","jsx","UserAvatar","Combobox","forwardRef","options","multiple","valueProp","defaultValue","onChange","inputValueProp","defaultInputValue","onInputChange","label","placeholder","leadingIcon","size","invalid","disabled","filter","emptyMessage","className","idProp","ariaLabel","portalContainer","zIndex","ref","generatedId","useId","id","listboxId","rootRef","useRef","anchorRef","inputRef","setInputRef","useCallback","node","isValueControlled","uncontrolledValue","setUncontrolledValue","useState","rawValue","singleValue","multiValue","isInputControlled","uncontrolledInput","setUncontrolledInput","isOpen","setIsOpen","isFocused","setIsFocused","activeIndex","setActiveIndex","queryOverride","setQueryOverride","selectedOption","useMemo","o","displayInput","filterQuery","setInputDisplay","next","commitValue","filteredOptions","fn","popupMounted","popupVisible","usePopoverTransition","placement","maxHeight","popupStyle","portalRef","renderPortal","useAnchoredPopupPortal","close","open","useOutsideClose","useEffect","prev","selectedIdx","isSelected","optionValue","selectOption","v","_a","removeValue","moveActive","delta","enabled","i","currentPos","nextPos","el","handleInputChange","handleFocus","handleBlur","related","handleKeyDown","handleWrapperMouseDown","hasSelection","hasInputText","labelFloated","activeOption","activeDescendant","selectedOptions","sizeClass","styles","toKebab","hasChips","rootClass","jsxs","Chip","ev","Icon","ChevronDownIcon","PopoverMenu","PopoverMenuScroll","index","selected","active","leading","MenuItem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Combobox.js","sources":["../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n FocusEvent,\n KeyboardEvent,\n MouseEvent,\n ReactNode,\n} from 'react';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport ChevronDownIcon from '@mattermost/compass-icons/components/chevron-down';\nimport Chip from '@/components/chip/Chip';\nimport ChipGroup from '@/components/chip/ChipGroup';\nimport type { ChipSize } from '@/components/chip/Chip';\nimport Icon from '@/components/icon/Icon';\nimport MenuItem from '@/components/menu-item/MenuItem';\nimport PopoverMenu, {\n PopoverMenuScroll,\n} from '@/components/popover-menu/PopoverMenu';\nimport UserAvatar from '@/components/user-avatar/UserAvatar';\nimport { useAnchoredPopupPortal } from '@/hooks/use-anchored-popup-portal';\nimport { useOutsideClose } from '@/hooks/use-outside-close';\nimport { usePopoverTransition } from '@/hooks/use-popover-transition';\nimport { toKebab } from '@/utils/string';\nimport styles from './Combobox.module.scss';\n\nexport type ComboboxSize = 'small' | 'medium' | 'large';\n\nexport type ComboboxOption = {\n value: string;\n label: string;\n disabled?: boolean;\n /** Leading content for the list row (icon or avatar node). */\n leadingVisual?: ReactNode;\n /** Avatar for chips / list when a photo is preferred over `leadingVisual`. */\n leadingAvatar?: { src: string; alt: string };\n secondaryLabel?: string;\n};\n\nexport interface ComboboxProps {\n options: ComboboxOption[];\n /** When true, selected values render as removable chips. Default: false. */\n multiple?: boolean;\n value?: string | string[] | null;\n defaultValue?: string | string[] | null;\n onChange?: (value: string | string[] | null) => void;\n inputValue?: string;\n defaultInputValue?: string;\n onInputChange?: (value: string) => void;\n label?: ReactNode;\n placeholder?: string;\n leadingIcon?: ReactNode;\n size?: ComboboxSize;\n invalid?: boolean;\n disabled?: boolean;\n /**\n * Client-side filter. `true` (default) matches labels case-insensitively.\n * `false` shows all options (caller filters via `inputValue` / `onInputChange`).\n */\n filter?: boolean | ((option: ComboboxOption, query: string) => boolean);\n emptyMessage?: string;\n className?: string;\n id?: string;\n 'aria-label'?: string;\n /** Portal mount node for the menu; defaults to `document.body`. */\n portalContainer?: HTMLElement | null;\n /** Stacking order for the portaled menu. */\n zIndex?: number;\n}\n\nconst POPUP_MAX_HEIGHT = 280;\n\nconst CHIP_SIZE_BY_COMBOBOX: Record<ComboboxSize, ChipSize> = {\n small: 'small',\n medium: 'medium',\n large: 'large',\n};\n\nfunction defaultFilter(option: ComboboxOption, query: string): boolean {\n if (!query) return true;\n return option.label.toLowerCase().includes(query.toLowerCase());\n}\n\nfunction toSingleValue(\n value: string | string[] | null | undefined,\n): string | null {\n if (value == null) return null;\n if (Array.isArray(value)) return value[0] ?? null;\n return value === '' ? null : value;\n}\n\nfunction toMultiValue(\n value: string | string[] | null | undefined,\n): string[] {\n if (value == null) return [];\n if (Array.isArray(value)) return value;\n return value === '' ? [] : [value];\n}\n\nfunction optionLeadingVisual(option: ComboboxOption): ReactNode | undefined {\n if (option.leadingVisual != null) return option.leadingVisual;\n if (option.leadingAvatar != null) {\n return (\n <UserAvatar\n src={option.leadingAvatar.src}\n alt={option.leadingAvatar.alt}\n size=\"24\"\n />\n );\n }\n return undefined;\n}\n\n/**\n * { value: 'town-square', label: 'Town Square' }, { value: 'off-topic', label: 'Off-Topic'\n * }, { value: 'design', label: 'Design' }, { value: 'engineering', label: 'Engineering' }, {\n * value: 'releases', label: 'Releases' }, ];\n */\nconst Combobox = forwardRef<HTMLInputElement, ComboboxProps>(function Combobox(\n {\n options,\n multiple = false,\n value: valueProp,\n defaultValue,\n onChange,\n inputValue: inputValueProp,\n defaultInputValue = '',\n onInputChange,\n label,\n placeholder,\n leadingIcon,\n size = 'medium',\n invalid = false,\n disabled = false,\n filter = true,\n emptyMessage = 'No results',\n className = '',\n id: idProp,\n 'aria-label': ariaLabel,\n portalContainer = null,\n zIndex,\n },\n ref,\n) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const listboxId = `${id}-listbox`;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n const isValueControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState<\n string | string[] | null\n >(() => {\n if (defaultValue !== undefined) return defaultValue;\n return multiple ? [] : null;\n });\n\n const rawValue = isValueControlled ? valueProp! : uncontrolledValue;\n const singleValue = multiple ? null : toSingleValue(rawValue);\n const multiValue = multiple ? toMultiValue(rawValue) : [];\n\n const isInputControlled = inputValueProp !== undefined;\n const [uncontrolledInput, setUncontrolledInput] = useState(defaultInputValue);\n const [isOpen, setIsOpen] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n const [queryOverride, setQueryOverride] = useState<string | null>(null);\n\n const selectedOption = useMemo(\n () =>\n singleValue == null\n ? undefined\n : options.find((o) => o.value === singleValue),\n [options, singleValue],\n );\n\n // Single-select: show the selected label until the user starts typing a filter.\n // `queryOverride !== null` means the field is in filter-edit mode.\n const displayInput = (() => {\n if (isInputControlled) return inputValueProp!;\n if (multiple) return uncontrolledInput;\n if (queryOverride !== null) return queryOverride;\n return selectedOption?.label ?? uncontrolledInput;\n })();\n\n const filterQuery = (() => {\n if (isInputControlled) return inputValueProp!;\n if (multiple) return uncontrolledInput;\n if (queryOverride !== null) return queryOverride;\n return '';\n })();\n\n const setInputDisplay = useCallback(\n (next: string) => {\n if (!isInputControlled) {\n setUncontrolledInput(next);\n if (!multiple) setQueryOverride(next);\n }\n onInputChange?.(next);\n },\n [isInputControlled, multiple, onInputChange],\n );\n\n const commitValue = useCallback(\n (next: string | string[] | null) => {\n if (!isValueControlled) setUncontrolledValue(next);\n onChange?.(next);\n },\n [isValueControlled, onChange],\n );\n\n const filteredOptions = useMemo(() => {\n if (filter === false) return options;\n const fn = typeof filter === 'function' ? filter : defaultFilter;\n return options.filter((o) => fn(o, filterQuery));\n }, [options, filter, filterQuery]);\n\n const { mounted: popupMounted, visible: popupVisible } =\n usePopoverTransition(isOpen);\n\n const {\n placement,\n maxHeight,\n style: popupStyle,\n portalRef,\n renderPortal,\n } = useAnchoredPopupPortal(anchorRef, popupMounted, {\n preferredHeight: POPUP_MAX_HEIGHT,\n maxHeightCap: POPUP_MAX_HEIGHT,\n portalContainer,\n zIndex,\n });\n\n const close = useCallback(() => {\n setIsOpen(false);\n setActiveIndex(-1);\n if (!multiple && !isInputControlled) {\n setQueryOverride(null);\n setUncontrolledInput('');\n }\n }, [multiple, isInputControlled]);\n\n const open = useCallback(() => {\n if (disabled) return;\n setIsOpen(true);\n }, [disabled]);\n\n useOutsideClose(rootRef, isOpen, close, portalRef);\n\n useEffect(() => {\n if (!isOpen) return;\n setActiveIndex((prev) => {\n if (filteredOptions.length === 0) return -1;\n if (prev >= 0 && prev < filteredOptions.length) return prev;\n const selectedIdx = multiple\n ? filteredOptions.findIndex((o) => multiValue.includes(o.value))\n : filteredOptions.findIndex((o) => o.value === singleValue);\n return selectedIdx >= 0 ? selectedIdx : 0;\n });\n }, [isOpen, filteredOptions, multiple, multiValue, singleValue]);\n\n const isSelected = useCallback(\n (optionValue: string) =>\n multiple\n ? multiValue.includes(optionValue)\n : singleValue === optionValue,\n [multiple, multiValue, singleValue],\n );\n\n const selectOption = useCallback(\n (option: ComboboxOption) => {\n if (option.disabled) return;\n\n if (multiple) {\n const next = multiValue.includes(option.value)\n ? multiValue.filter((v) => v !== option.value)\n : [...multiValue, option.value];\n commitValue(next);\n setInputDisplay('');\n close();\n inputRef.current?.focus();\n return;\n }\n\n commitValue(option.value);\n if (!isInputControlled) {\n setUncontrolledInput('');\n setQueryOverride(null);\n } else {\n onInputChange?.(option.label);\n }\n close();\n },\n [\n multiple,\n multiValue,\n commitValue,\n setInputDisplay,\n isInputControlled,\n onInputChange,\n close,\n ],\n );\n\n const removeValue = useCallback(\n (optionValue: string) => {\n if (!multiple) return;\n commitValue(multiValue.filter((v) => v !== optionValue));\n },\n [multiple, multiValue, commitValue],\n );\n\n const moveActive = useCallback(\n (delta: number) => {\n const enabled = filteredOptions\n .map((o, i) => ({ o, i }))\n .filter(({ o }) => !o.disabled);\n if (enabled.length === 0) {\n setActiveIndex(-1);\n return;\n }\n setActiveIndex((prev) => {\n const currentPos = enabled.findIndex(({ i }) => i === prev);\n const nextPos =\n currentPos < 0\n ? delta > 0\n ? 0\n : enabled.length - 1\n : (currentPos + delta + enabled.length) % enabled.length;\n return enabled[nextPos].i;\n });\n },\n [filteredOptions],\n );\n\n useEffect(() => {\n if (!isOpen || activeIndex < 0) return;\n const option = filteredOptions[activeIndex];\n if (!option) return;\n const el = document.getElementById(\n `${listboxId}-option-${option.value}`,\n );\n el?.scrollIntoView({ block: 'nearest' });\n }, [isOpen, activeIndex, filteredOptions, listboxId]);\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n const next = e.target.value;\n setInputDisplay(next);\n if (!isOpen) open();\n setActiveIndex(0);\n };\n\n const handleFocus = () => {\n setIsFocused(true);\n open();\n // Select-all so the next keystroke replaces the selected label (filter mode).\n if (!multiple && !isInputControlled && selectedOption) {\n requestAnimationFrame(() => {\n inputRef.current?.select();\n });\n }\n };\n\n const handleBlur = (e: FocusEvent<HTMLInputElement>) => {\n // Delay so option mousedown can run first\n const related = e.relatedTarget as Node | null;\n if (related && rootRef.current?.contains(related)) return;\n setIsFocused(false);\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(-1);\n break;\n case 'Home':\n if (isOpen && filteredOptions.length > 0) {\n e.preventDefault();\n setActiveIndex(\n filteredOptions.findIndex((o) => !o.disabled) >= 0\n ? filteredOptions.findIndex((o) => !o.disabled)\n : 0,\n );\n }\n break;\n case 'End':\n if (isOpen && filteredOptions.length > 0) {\n e.preventDefault();\n for (let i = filteredOptions.length - 1; i >= 0; i--) {\n if (!filteredOptions[i]?.disabled) {\n setActiveIndex(i);\n break;\n }\n }\n }\n break;\n case 'Enter':\n if (isOpen && activeIndex >= 0 && filteredOptions[activeIndex]) {\n e.preventDefault();\n selectOption(filteredOptions[activeIndex]);\n }\n break;\n case 'Escape':\n if (isOpen) {\n e.preventDefault();\n close();\n }\n break;\n case 'Backspace':\n if (\n multiple &&\n displayInput === '' &&\n multiValue.length > 0\n ) {\n e.preventDefault();\n removeValue(multiValue[multiValue.length - 1]);\n }\n break;\n case 'Tab':\n close();\n break;\n default:\n break;\n }\n };\n\n const handleWrapperMouseDown = (e: MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n // Don't steal focus from chips or their remove buttons\n if ((e.target as HTMLElement).closest('[data-chip]')) return;\n if (e.target !== inputRef.current) {\n e.preventDefault();\n inputRef.current?.focus();\n }\n if (!isOpen) open();\n };\n\n const hasSelection = multiple\n ? multiValue.length > 0\n : singleValue != null && singleValue !== '';\n const hasInputText = displayInput.length > 0;\n const labelFloated = isFocused || isOpen || hasSelection || hasInputText;\n\n const activeOption =\n activeIndex >= 0 ? filteredOptions[activeIndex] : undefined;\n const activeDescendant =\n activeOption != null ? `${listboxId}-option-${activeOption.value}` : undefined;\n\n const selectedOptions = useMemo(\n () => options.filter((o) => multiValue.includes(o.value)),\n [options, multiValue],\n );\n\n const sizeClass = styles[`combobox--size-${toKebab(size)}`];\n const hasChips = multiple && selectedOptions.length > 0;\n const rootClass = [\n styles.combobox,\n sizeClass,\n invalid ? styles['combobox--invalid'] : '',\n label != null && labelFloated ? styles['combobox--label-floated'] : '',\n leadingIcon != null ? styles['combobox--has-leading-icon'] : '',\n hasChips ? styles['combobox--has-chips'] : '',\n isOpen ? styles['combobox--open'] : '',\n disabled ? styles['combobox--disabled'] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={rootClass} ref={rootRef}>\n <div\n className={styles.combobox__wrapper}\n ref={anchorRef}\n >\n {label != null && (\n <label className={styles.combobox__label} htmlFor={id}>\n {label}\n </label>\n )}\n <div\n className={styles.combobox__inner}\n onMouseDown={handleWrapperMouseDown}\n >\n {leadingIcon != null && (\n <span className={styles['combobox__leading-icon']} aria-hidden>\n {leadingIcon}\n </span>\n )}\n <div className={styles.combobox__value}>\n {multiple && selectedOptions.length > 0 && (\n <ChipGroup\n aria-label={\n typeof label === 'string' ? `${label} selections` : 'Selected'\n }\n disabled={disabled}\n >\n {selectedOptions.map((option) => (\n <Chip\n key={option.value}\n size={CHIP_SIZE_BY_COMBOBOX[size]}\n leadingAvatar={option.leadingAvatar}\n leadingIcon={\n option.leadingAvatar == null\n ? option.leadingVisual\n : undefined\n }\n onRemove={\n disabled\n ? undefined\n : (ev) => {\n ev.stopPropagation();\n removeValue(option.value);\n }\n }\n >\n {option.label}\n </Chip>\n ))}\n </ChipGroup>\n )}\n <input\n ref={setInputRef}\n id={id}\n className={styles.combobox__control}\n type=\"text\"\n role=\"combobox\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={disabled}\n placeholder={\n multiple && selectedOptions.length > 0\n ? undefined\n : placeholder\n }\n value={displayInput}\n aria-label={ariaLabel}\n aria-invalid={invalid ? true : undefined}\n aria-expanded={isOpen}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeDescendant}\n onChange={handleInputChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n />\n </div>\n <span className={styles['combobox__trailing-icon']} aria-hidden>\n <Icon size=\"12\" glyph={<ChevronDownIcon />} />\n </span>\n </div>\n </div>\n\n {popupMounted &&\n renderPortal(\n <div\n ref={portalRef}\n className={[\n styles.combobox__popup,\n placement === 'above' ? styles['combobox__popup--above'] : '',\n popupVisible ? styles['combobox__popup--visible'] : '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={popupStyle}\n >\n <PopoverMenu className={styles.combobox__menu}>\n <PopoverMenuScroll maxHeight={maxHeight}>\n {filteredOptions.length === 0 ? (\n <p className={styles.combobox__empty}>{emptyMessage}</p>\n ) : (\n <ul\n id={listboxId}\n className={styles.combobox__list}\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n aria-label={\n typeof label === 'string'\n ? label\n : (ariaLabel ?? 'Options')\n }\n >\n {filteredOptions.map((option, index) => {\n const selected = isSelected(option.value);\n const active = index === activeIndex;\n const leading = optionLeadingVisual(option);\n return (\n <li\n key={option.value}\n className={styles.combobox__option}\n role=\"presentation\"\n >\n <MenuItem\n id={`${listboxId}-option-${option.value}`}\n role=\"option\"\n label={option.label}\n secondaryLabel={option.secondaryLabel}\n leadingElement={leading != null}\n leadingVisual={leading}\n trailingElement={selected}\n active={active}\n disabled={option.disabled}\n aria-selected={selected}\n onMouseDown={(ev) => {\n // Prevent input blur before click handler\n ev.preventDefault();\n }}\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => selectOption(option)}\n />\n </li>\n );\n })}\n </ul>\n )}\n </PopoverMenuScroll>\n </PopoverMenu>\n </div>,\n )}\n </div>\n );\n});\n\nexport default Combobox;\n"],"names":["POPUP_MAX_HEIGHT","CHIP_SIZE_BY_COMBOBOX","defaultFilter","option","query","toSingleValue","value","toMultiValue","optionLeadingVisual","jsx","UserAvatar","Combobox","forwardRef","options","multiple","valueProp","defaultValue","onChange","inputValueProp","defaultInputValue","onInputChange","label","placeholder","leadingIcon","size","invalid","disabled","filter","emptyMessage","className","idProp","ariaLabel","portalContainer","zIndex","ref","generatedId","useId","id","listboxId","rootRef","useRef","anchorRef","inputRef","setInputRef","useCallback","node","isValueControlled","uncontrolledValue","setUncontrolledValue","useState","rawValue","singleValue","multiValue","isInputControlled","uncontrolledInput","setUncontrolledInput","isOpen","setIsOpen","isFocused","setIsFocused","activeIndex","setActiveIndex","queryOverride","setQueryOverride","selectedOption","useMemo","o","displayInput","filterQuery","setInputDisplay","next","commitValue","filteredOptions","fn","popupMounted","popupVisible","usePopoverTransition","placement","maxHeight","popupStyle","portalRef","renderPortal","useAnchoredPopupPortal","close","open","useOutsideClose","useEffect","prev","selectedIdx","isSelected","optionValue","selectOption","v","_a","removeValue","moveActive","delta","enabled","i","currentPos","nextPos","el","handleInputChange","handleFocus","handleBlur","related","handleKeyDown","handleWrapperMouseDown","hasSelection","hasInputText","labelFloated","activeOption","activeDescendant","selectedOptions","sizeClass","styles","toKebab","hasChips","rootClass","jsxs","ChipGroup","Chip","ev","Icon","ChevronDownIcon","PopoverMenu","PopoverMenuScroll","index","selected","active","leading","MenuItem"],"mappings":";;;;;;;;;;;;;;AA4EA,MAAMA,KAAmB,KAEnBC,KAAwD;AAAA,EAC5D,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,SAASC,GAAcC,GAAwBC,GAAwB;AACrE,SAAKA,IACED,EAAO,MAAM,YAAA,EAAc,SAASC,EAAM,aAAa,IAD3C;AAErB;AAEA,SAASC,GACPC,GACe;AACf,SAAIA,KAAS,OAAa,OACtB,MAAM,QAAQA,CAAK,IAAUA,EAAM,CAAC,KAAK,OACtCA,MAAU,KAAK,OAAOA;AAC/B;AAEA,SAASC,GACPD,GACU;AACV,SAAIA,KAAS,OAAa,CAAA,IACtB,MAAM,QAAQA,CAAK,IAAUA,IAC1BA,MAAU,KAAK,CAAA,IAAK,CAACA,CAAK;AACnC;AAEA,SAASE,GAAoBL,GAA+C;AAC1E,MAAIA,EAAO,iBAAiB,KAAM,QAAOA,EAAO;AAChD,MAAIA,EAAO,iBAAiB;AAC1B,WACE,gBAAAM;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,KAAKP,EAAO,cAAc;AAAA,QAC1B,KAAKA,EAAO,cAAc;AAAA,QAC1B,MAAK;AAAA,MAAA;AAAA,IAAA;AAKb;AAOA,MAAMQ,KAAWC,GAA4C,SAC3D;AAAA,EACE,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,OAAOC;AAAA,EACP,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAYC;AAAA,EACZ,mBAAAC,KAAoB;AAAA,EACpB,eAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,SAAAC,IAAU;AAAA,EACV,UAAAC,IAAW;AAAA,EACX,QAAAC,IAAS;AAAA,EACT,cAAAC,KAAe;AAAA,EACf,WAAAC,KAAY;AAAA,EACZ,IAAIC;AAAA,EACJ,cAAcC;AAAA,EACd,iBAAAC,KAAkB;AAAA,EAClB,QAAAC;AACF,GACAC,GACA;AACA,QAAMC,KAAcC,GAAA,GACdC,IAAKP,MAAUK,IACfG,IAAY,GAAGD,CAAE,YAEjBE,IAAUC,EAAuB,IAAI,GACrCC,IAAYD,EAAuB,IAAI,GACvCE,IAAWF,EAAgC,IAAI,GAE/CG,KAAcC;AAAA,IAClB,CAACC,MAAkC;AACjC,MAAAH,EAAS,UAAUG,GACf,OAAOX,KAAQ,aAAYA,EAAIW,CAAI,IAC9BX,QAAS,UAAUW;AAAA,IAC9B;AAAA,IACA,CAACX,CAAG;AAAA,EAAA,GAGAY,IAAoB/B,MAAc,QAClC,CAACgC,IAAmBC,EAAoB,IAAIC,EAEhD,MACIjC,MAAiB,SAAkBA,IAChCF,IAAW,CAAA,IAAK,IACxB,GAEKoC,IAAWJ,IAAoB/B,IAAagC,IAC5CI,IAAcrC,IAAW,OAAOT,GAAc6C,CAAQ,GACtDE,IAAatC,IAAWP,GAAa2C,CAAQ,IAAI,CAAA,GAEjDG,IAAoBnC,MAAmB,QACvC,CAACoC,GAAmBC,CAAoB,IAAIN,EAAS9B,EAAiB,GACtE,CAACqC,GAAQC,EAAS,IAAIR,EAAS,EAAK,GACpC,CAACS,IAAWC,EAAY,IAAIV,EAAS,EAAK,GAC1C,CAACW,GAAaC,CAAc,IAAIZ,EAAS,EAAE,GAC3C,CAACa,GAAeC,CAAgB,IAAId,EAAwB,IAAI,GAEhEe,IAAiBC;AAAA,IACrB,MACEd,KAAe,OACX,SACAtC,EAAQ,KAAK,CAACqD,MAAMA,EAAE,UAAUf,CAAW;AAAA,IACjD,CAACtC,GAASsC,CAAW;AAAA,EAAA,GAKjBgB,IACAd,IAA0BnC,IAC1BJ,IAAiBwC,IACjBQ,MAAkB,OAAaA,KAC5BE,KAAA,gBAAAA,EAAgB,UAASV,GAG5Bc,KACAf,IAA0BnC,IAC1BJ,IAAiBwC,IACjBQ,MAAkB,OAAaA,IAC5B,IAGHO,IAAkBzB;AAAA,IACtB,CAAC0B,MAAiB;AAChB,MAAKjB,MACHE,EAAqBe,CAAI,GACpBxD,KAAUiD,EAAiBO,CAAI,IAEtClD,KAAA,QAAAA,EAAgBkD;AAAA,IAClB;AAAA,IACA,CAACjB,GAAmBvC,GAAUM,CAAa;AAAA,EAAA,GAGvCmD,IAAc3B;AAAA,IAClB,CAAC0B,MAAmC;AAClC,MAAKxB,KAAmBE,GAAqBsB,CAAI,GACjDrD,KAAA,QAAAA,EAAWqD;AAAA,IACb;AAAA,IACA,CAACxB,GAAmB7B,CAAQ;AAAA,EAAA,GAGxBuD,IAAkBP,EAAQ,MAAM;AACpC,QAAItC,MAAW,GAAO,QAAOd;AAC7B,UAAM4D,IAAK,OAAO9C,KAAW,aAAaA,IAASzB;AACnD,WAAOW,EAAQ,OAAO,CAACqD,MAAMO,EAAGP,GAAGE,EAAW,CAAC;AAAA,EACjD,GAAG,CAACvD,GAASc,GAAQyC,EAAW,CAAC,GAE3B,EAAE,SAASM,IAAc,SAASC,GAAA,IACtCC,GAAqBpB,CAAM,GAEvB;AAAA,IACJ,WAAAqB;AAAA,IACA,WAAAC;AAAA,IACA,OAAOC;AAAA,IACP,WAAAC;AAAA,IACA,cAAAC;AAAA,EAAA,IACEC,GAAuBzC,GAAWiC,IAAc;AAAA,IAClD,iBAAiB1E;AAAA,IACjB,cAAcA;AAAA,IACd,iBAAAgC;AAAA,IACA,QAAAC;AAAA,EAAA,CACD,GAEKkD,IAAQvC,EAAY,MAAM;AAC9B,IAAAa,GAAU,EAAK,GACfI,EAAe,EAAE,GACb,CAAC/C,KAAY,CAACuC,MAChBU,EAAiB,IAAI,GACrBR,EAAqB,EAAE;AAAA,EAE3B,GAAG,CAACzC,GAAUuC,CAAiB,CAAC,GAE1B+B,IAAOxC,EAAY,MAAM;AAC7B,IAAIlB,KACJ+B,GAAU,EAAI;AAAA,EAChB,GAAG,CAAC/B,CAAQ,CAAC;AAEb,EAAA2D,GAAgB9C,GAASiB,GAAQ2B,GAAOH,EAAS,GAEjDM,GAAU,MAAM;AACd,IAAK9B,KACLK,EAAe,CAAC0B,MAAS;AACvB,UAAIf,EAAgB,WAAW,EAAG,QAAO;AACzC,UAAIe,KAAQ,KAAKA,IAAOf,EAAgB,OAAQ,QAAOe;AACvD,YAAMC,IAAc1E,IAChB0D,EAAgB,UAAU,CAACN,MAAMd,EAAW,SAASc,EAAE,KAAK,CAAC,IAC7DM,EAAgB,UAAU,CAACN,MAAMA,EAAE,UAAUf,CAAW;AAC5D,aAAOqC,KAAe,IAAIA,IAAc;AAAA,IAC1C,CAAC;AAAA,EACH,GAAG,CAAChC,GAAQgB,GAAiB1D,GAAUsC,GAAYD,CAAW,CAAC;AAE/D,QAAMsC,KAAa7C;AAAA,IACjB,CAAC8C,MACC5E,IACIsC,EAAW,SAASsC,CAAW,IAC/BvC,MAAgBuC;AAAA,IACtB,CAAC5E,GAAUsC,GAAYD,CAAW;AAAA,EAAA,GAG9BwC,KAAe/C;AAAA,IACnB,CAACzC,MAA2B;;AAC1B,UAAI,CAAAA,EAAO,UAEX;AAAA,YAAIW,GAAU;AACZ,gBAAMwD,IAAOlB,EAAW,SAASjD,EAAO,KAAK,IACzCiD,EAAW,OAAO,CAACwC,MAAMA,MAAMzF,EAAO,KAAK,IAC3C,CAAC,GAAGiD,GAAYjD,EAAO,KAAK;AAChC,UAAAoE,EAAYD,CAAI,GAChBD,EAAgB,EAAE,GAClBc,EAAA,IACAU,IAAAnD,EAAS,YAAT,QAAAmD,EAAkB;AAClB;AAAA,QACF;AAEA,QAAAtB,EAAYpE,EAAO,KAAK,GACnBkD,IAIHjC,KAAA,QAAAA,EAAgBjB,EAAO,UAHvBoD,EAAqB,EAAE,GACvBQ,EAAiB,IAAI,IAIvBoB,EAAA;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MACErE;AAAA,MACAsC;AAAA,MACAmB;AAAA,MACAF;AAAA,MACAhB;AAAA,MACAjC;AAAA,MACA+D;AAAA,IAAA;AAAA,EACF,GAGIW,KAAclD;AAAA,IAClB,CAAC8C,MAAwB;AACvB,MAAK5E,KACLyD,EAAYnB,EAAW,OAAO,CAACwC,MAAMA,MAAMF,CAAW,CAAC;AAAA,IACzD;AAAA,IACA,CAAC5E,GAAUsC,GAAYmB,CAAW;AAAA,EAAA,GAG9BwB,KAAanD;AAAA,IACjB,CAACoD,MAAkB;AACjB,YAAMC,IAAUzB,EACb,IAAI,CAACN,GAAGgC,OAAO,EAAE,GAAAhC,GAAG,GAAAgC,EAAA,EAAI,EACxB,OAAO,CAAC,EAAE,GAAAhC,QAAQ,CAACA,EAAE,QAAQ;AAChC,UAAI+B,EAAQ,WAAW,GAAG;AACxB,QAAApC,EAAe,EAAE;AACjB;AAAA,MACF;AACA,MAAAA,EAAe,CAAC0B,MAAS;AACvB,cAAMY,IAAaF,EAAQ,UAAU,CAAC,EAAE,GAAAC,EAAA,MAAQA,MAAMX,CAAI,GACpDa,IACJD,IAAa,IACTH,IAAQ,IACN,IACAC,EAAQ,SAAS,KAClBE,IAAaH,IAAQC,EAAQ,UAAUA,EAAQ;AACtD,eAAOA,EAAQG,CAAO,EAAE;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,IACA,CAAC5B,CAAe;AAAA,EAAA;AAGlB,EAAAc,GAAU,MAAM;AACd,QAAI,CAAC9B,KAAUI,IAAc,EAAG;AAChC,UAAMzD,IAASqE,EAAgBZ,CAAW;AAC1C,QAAI,CAACzD,EAAQ;AACb,UAAMkG,IAAK,SAAS;AAAA,MAClB,GAAG/D,CAAS,WAAWnC,EAAO,KAAK;AAAA,IAAA;AAErC,IAAAkG,KAAA,QAAAA,EAAI,eAAe,EAAE,OAAO,UAAA;AAAA,EAC9B,GAAG,CAAC7C,GAAQI,GAAaY,GAAiBlC,CAAS,CAAC;AAEpD,QAAMgE,KAAoB,CAAC,MAAqC;AAC9D,UAAMhC,IAAO,EAAE,OAAO;AACtB,IAAAD,EAAgBC,CAAI,GACfd,KAAQ4B,EAAA,GACbvB,EAAe,CAAC;AAAA,EAClB,GAEM0C,KAAc,MAAM;AACxB,IAAA5C,GAAa,EAAI,GACjByB,EAAA,GAEI,CAACtE,KAAY,CAACuC,KAAqBW,KACrC,sBAAsB,MAAM;;AAC1B,OAAA6B,IAAAnD,EAAS,YAAT,QAAAmD,EAAkB;AAAA,IACpB,CAAC;AAAA,EAEL,GAEMW,KAAa,CAAC,MAAoC;;AAEtD,UAAMC,IAAU,EAAE;AAClB,IAAIA,OAAWZ,IAAAtD,EAAQ,YAAR,QAAAsD,EAAiB,SAASY,OACzC9C,GAAa,EAAK;AAAA,EACpB,GAEM+C,KAAgB,CAAC,MAAuC;;AAC5D,QAAI,CAAAhF;AAEJ,cAAQ,EAAE,KAAA;AAAA,QACR,KAAK;AACH,YAAE,eAAA,GACG8B,OACW,CAAC,IADJ4B,EAAA;AAEb;AAAA,QACF,KAAK;AACH,YAAE,eAAA,GACG5B,OACW,EAAE,IADL4B,EAAA;AAEb;AAAA,QACF,KAAK;AACH,UAAI5B,KAAUgB,EAAgB,SAAS,MACrC,EAAE,eAAA,GACFX;AAAA,YACEW,EAAgB,UAAU,CAACN,MAAM,CAACA,EAAE,QAAQ,KAAK,IAC7CM,EAAgB,UAAU,CAACN,MAAM,CAACA,EAAE,QAAQ,IAC5C;AAAA,UAAA;AAGR;AAAA,QACF,KAAK;AACH,cAAIV,KAAUgB,EAAgB,SAAS,GAAG;AACxC,cAAE,eAAA;AACF,qBAAS0B,IAAI1B,EAAgB,SAAS,GAAG0B,KAAK,GAAGA;AAC/C,kBAAI,GAACL,IAAArB,EAAgB0B,CAAC,MAAjB,QAAAL,EAAoB,WAAU;AACjC,gBAAAhC,EAAeqC,CAAC;AAChB;AAAA,cACF;AAAA,UAEJ;AACA;AAAA,QACF,KAAK;AACH,UAAI1C,KAAUI,KAAe,KAAKY,EAAgBZ,CAAW,MAC3D,EAAE,eAAA,GACF+B,GAAanB,EAAgBZ,CAAW,CAAC;AAE3C;AAAA,QACF,KAAK;AACH,UAAIJ,MACF,EAAE,eAAA,GACF2B,EAAA;AAEF;AAAA,QACF,KAAK;AACH,UACErE,KACAqD,MAAiB,MACjBf,EAAW,SAAS,MAEpB,EAAE,eAAA,GACF0C,GAAY1C,EAAWA,EAAW,SAAS,CAAC,CAAC;AAE/C;AAAA,QACF,KAAK;AACH,UAAA+B,EAAA;AACA;AAAA,MAEA;AAAA,EAEN,GAEMwB,KAAyB,CAAC,MAAkC;;AAChE,IAAIjF,KAEC,EAAE,OAAuB,QAAQ,aAAa,MAC/C,EAAE,WAAWgB,EAAS,YACxB,EAAE,eAAA,IACFmD,IAAAnD,EAAS,YAAT,QAAAmD,EAAkB,UAEfrC,KAAQ4B,EAAA;AAAA,EACf,GAEMwB,KAAe9F,IACjBsC,EAAW,SAAS,IACpBD,KAAe,QAAQA,MAAgB,IACrC0D,KAAe1C,EAAa,SAAS,GACrC2C,KAAepD,MAAaF,KAAUoD,MAAgBC,IAEtDE,KACJnD,KAAe,IAAIY,EAAgBZ,CAAW,IAAI,QAC9CoD,KACJD,MAAgB,OAAO,GAAGzE,CAAS,WAAWyE,GAAa,KAAK,KAAK,QAEjEE,IAAkBhD;AAAA,IACtB,MAAMpD,EAAQ,OAAO,CAACqD,MAAMd,EAAW,SAASc,EAAE,KAAK,CAAC;AAAA,IACxD,CAACrD,GAASuC,CAAU;AAAA,EAAA,GAGhB8D,KAAYC,EAAO,kBAAkBC,GAAQ5F,CAAI,CAAC,EAAE,GACpD6F,KAAWvG,KAAYmG,EAAgB,SAAS,GAChDK,KAAY;AAAA,IAChBH,EAAO;AAAA,IACPD;AAAA,IACAzF,IAAU0F,EAAO,mBAAmB,IAAI;AAAA,IACxC9F,KAAS,QAAQyF,KAAeK,EAAO,yBAAyB,IAAI;AAAA,IACpE5F,KAAe,OAAO4F,EAAO,4BAA4B,IAAI;AAAA,IAC7DE,KAAWF,EAAO,qBAAqB,IAAI;AAAA,IAC3C3D,IAAS2D,EAAO,gBAAgB,IAAI;AAAA,IACpCzF,IAAWyF,EAAO,oBAAoB,IAAI;AAAA,IAC1CtF;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAA0F,EAAC,OAAA,EAAI,WAAWD,IAAW,KAAK/E,GAC9B,UAAA;AAAA,IAAA,gBAAAgF;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWJ,EAAO;AAAA,QAClB,KAAK1E;AAAA,QAEJ,UAAA;AAAA,UAAApB,KAAS,0BACP,SAAA,EAAM,WAAW8F,EAAO,iBAAiB,SAAS9E,GAChD,UAAAhB,EAAA,CACH;AAAA,UAEF,gBAAAkG;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWJ,EAAO;AAAA,cAClB,aAAaR;AAAA,cAEZ,UAAA;AAAA,gBAAApF,KAAe,0BACb,QAAA,EAAK,WAAW4F,EAAO,wBAAwB,GAAG,eAAW,IAC3D,UAAA5F,EAAA,CACH;AAAA,gBAEF,gBAAAgG,EAAC,OAAA,EAAI,WAAWJ,EAAO,iBACpB,UAAA;AAAA,kBAAArG,KAAYmG,EAAgB,SAAS,KACpC,gBAAAxG;AAAA,oBAAC+G;AAAA,oBAAA;AAAA,sBACC,cACE,OAAOnG,KAAU,WAAW,GAAGA,CAAK,gBAAgB;AAAA,sBAEtD,UAAAK;AAAA,sBAEC,UAAAuF,EAAgB,IAAI,CAAC9G,MACpB,gBAAAM;AAAA,wBAACgH;AAAA,wBAAA;AAAA,0BAEC,MAAMxH,GAAsBuB,CAAI;AAAA,0BAChC,eAAerB,EAAO;AAAA,0BACtB,aACEA,EAAO,iBAAiB,OACpBA,EAAO,gBACP;AAAA,0BAEN,UACEuB,IACI,SACA,CAACgG,MAAO;AACN,4BAAAA,EAAG,gBAAA,GACH5B,GAAY3F,EAAO,KAAK;AAAA,0BAC1B;AAAA,0BAGL,UAAAA,EAAO;AAAA,wBAAA;AAAA,wBAjBHA,EAAO;AAAA,sBAAA,CAmBf;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAGL,gBAAAM;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,KAAKkC;AAAA,sBACL,IAAAN;AAAA,sBACA,WAAW8E,EAAO;AAAA,sBAClB,MAAK;AAAA,sBACL,MAAK;AAAA,sBACL,cAAa;AAAA,sBACb,YAAY;AAAA,sBACZ,UAAAzF;AAAA,sBACA,aACEZ,KAAYmG,EAAgB,SAAS,IACjC,SACA3F;AAAA,sBAEN,OAAO6C;AAAA,sBACP,cAAYpC;AAAA,sBACZ,gBAAcN,IAAU,KAAO;AAAA,sBAC/B,iBAAe+B;AAAA,sBACf,iBAAelB;AAAA,sBACf,qBAAkB;AAAA,sBAClB,yBAAuB0E;AAAA,sBACvB,UAAUV;AAAA,sBACV,SAASC;AAAA,sBACT,QAAQC;AAAA,sBACR,WAAWE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACb,GACF;AAAA,kCACC,QAAA,EAAK,WAAWS,EAAO,yBAAyB,GAAG,eAAW,IAC7D,UAAA,gBAAA1G,EAACkH,IAAA,EAAK,MAAK,MAAK,OAAO,gBAAAlH,EAACmH,IAAA,EAAgB,GAAI,EAAA,CAC9C;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAGDlD,MACCO;AAAA,MACE,gBAAAxE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAKuE;AAAA,UACL,WAAW;AAAA,YACTmC,EAAO;AAAA,YACPtC,OAAc,UAAUsC,EAAO,wBAAwB,IAAI;AAAA,YAC3DxC,KAAewC,EAAO,0BAA0B,IAAI;AAAA,UAAA,EAEnD,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UACX,OAAOpC;AAAA,UAEP,4BAAC8C,IAAA,EAAY,WAAWV,EAAO,gBAC7B,4BAACW,IAAA,EAAkB,WAAAhD,IAChB,UAAAN,EAAgB,WAAW,IAC1B,gBAAA/D,EAAC,KAAA,EAAE,WAAW0G,EAAO,iBAAkB,cAAa,IAEpD,gBAAA1G;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAI6B;AAAA,cACJ,WAAW6E,EAAO;AAAA,cAClB,MAAK;AAAA,cACL,wBAAsBrG,KAAY;AAAA,cAClC,cACE,OAAOO,KAAU,WACbA,IACCU,KAAa;AAAA,cAGnB,UAAAyC,EAAgB,IAAI,CAACrE,GAAQ4H,MAAU;AACtC,sBAAMC,IAAWvC,GAAWtF,EAAO,KAAK,GAClC8H,IAASF,MAAUnE,GACnBsE,IAAU1H,GAAoBL,CAAM;AAC1C,uBACE,gBAAAM;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBAEC,WAAW0G,EAAO;AAAA,oBAClB,MAAK;AAAA,oBAEL,UAAA,gBAAA1G;AAAA,sBAAC0H;AAAA,sBAAA;AAAA,wBACC,IAAI,GAAG7F,CAAS,WAAWnC,EAAO,KAAK;AAAA,wBACvC,MAAK;AAAA,wBACL,OAAOA,EAAO;AAAA,wBACd,gBAAgBA,EAAO;AAAA,wBACvB,gBAAgB+H,KAAW;AAAA,wBAC3B,eAAeA;AAAA,wBACf,iBAAiBF;AAAA,wBACjB,QAAAC;AAAA,wBACA,UAAU9H,EAAO;AAAA,wBACjB,iBAAe6H;AAAA,wBACf,aAAa,CAACN,MAAO;AAEnB,0BAAAA,EAAG,eAAA;AAAA,wBACL;AAAA,wBACA,cAAc,MAAM7D,EAAekE,CAAK;AAAA,wBACxC,SAAS,MAAMpC,GAAaxF,CAAM;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACpC;AAAA,kBArBKA,EAAO;AAAA,gBAAA;AAAA,cAwBlB,CAAC;AAAA,YAAA;AAAA,UAAA,GAGP,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EACF,GACJ;AAEJ,CAAC;"}
|