@frontify/fondue 12.0.0-beta.61 → 12.0.0-beta.62

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.
@@ -3,44 +3,39 @@ import { useButton as re } from "@react-aria/button";
3
3
  import { useFocusRing as le, FocusScope as oe } from "@react-aria/focus";
4
4
  import { merge as ie } from "../../utilities/merge.es.js";
5
5
  import { Validation as se } from "../../utilities/validation.es.js";
6
- import { AnimatePresence as ce, motion as O } from "framer-motion";
7
- import t, { useState as V, useRef as v } from "react";
8
- import { getInputWidth as ue, getPaddingClasses as me } from "./helpers.es.js";
9
- import { useClickOutside as fe } from "../../hooks/useClickOutside.es.js";
10
- import { CheckboxState as ge } from "../Checkbox/Checkbox.es.js";
11
- import { Trigger as de, TriggerEmphasis as y } from "../Trigger/Trigger.es.js";
12
- import { Tag as A, TagSize as f, TagType as z } from "../Tag/Tag.es.js";
13
- import { Menu as we } from "../Menu/Menu.es.js";
14
- import { OptionalItems as pe, DefaultItem as he, NoSearchResults as Ee } from "./SelectMenuItems/SelectMenuItems.es.js";
15
- import { Text as B } from "../../typography/Text/Text.es.js";
16
- import { MenuItem as ke } from "../MenuItem/MenuItem.es.js";
17
- var xe = /* @__PURE__ */ ((n) => (n.Default = "Default", n.Summarized = "Summarized", n))(xe || {}), ve = /* @__PURE__ */ ((n) => (n.Small = "Small", n.Medium = "Medium", n))(ve || {}), Ce = /* @__PURE__ */ ((n) => (n.Default = "Default", n.Weak = "Weak", n))(Ce || {});
18
- const Pe = ({
6
+ import { AnimatePresence as ce, motion as V } from "framer-motion";
7
+ import t, { useState as y, useRef as v, useEffect as ue } from "react";
8
+ import { getInputWidth as me, getPaddingClasses as fe } from "./helpers.es.js";
9
+ import { useClickOutside as ge } from "../../hooks/useClickOutside.es.js";
10
+ import { CheckboxState as de } from "../Checkbox/Checkbox.es.js";
11
+ import { Trigger as we, TriggerEmphasis as A } from "../Trigger/Trigger.es.js";
12
+ import { Tag as z, TagSize as g, TagType as B } from "../Tag/Tag.es.js";
13
+ import { Menu as pe } from "../Menu/Menu.es.js";
14
+ import { OptionalItems as he, DefaultItem as Ee, NoSearchResults as ke } from "./SelectMenuItems/SelectMenuItems.es.js";
15
+ import { Text as F } from "../../typography/Text/Text.es.js";
16
+ import { MenuItem as xe } from "../MenuItem/MenuItem.es.js";
17
+ var ve = /* @__PURE__ */ ((n) => (n.Default = "Default", n.Summarized = "Summarized", n))(ve || {}), Ce = /* @__PURE__ */ ((n) => (n.Small = "Small", n.Medium = "Medium", n))(Ce || {}), De = /* @__PURE__ */ ((n) => (n.Default = "Default", n.Weak = "Weak", n))(De || {});
18
+ const qe = ({
19
19
  items: n,
20
20
  activeItemKeys: r,
21
- onSelectionChange: g,
22
- ariaLabel: F = "Select list",
23
- disabled: j = !1,
21
+ onSelectionChange: d,
22
+ ariaLabel: j = "Select list",
23
+ disabled: P = !1,
24
24
  placeholder: s,
25
25
  label: C,
26
26
  filterLabel: D,
27
- noResultsLabel: P,
27
+ noResultsLabel: q,
28
28
  type: S = "Default",
29
- size: d = "Medium",
30
- validation: q = se.Default,
29
+ size: w = "Medium",
30
+ validation: G = se.Default,
31
31
  emphasis: c = "Default",
32
32
  decorator: b = null,
33
- filterable: w = !1,
34
- summarizedLabel: p,
35
- indeterminateItemKeys: h
33
+ filterable: p = !1,
34
+ summarizedLabel: h,
35
+ indeterminateItemKeys: u
36
36
  }) => {
37
- const [l, E] = V(!1), [o, G] = V(
38
- n.map((e) => {
39
- const a = { ...e, label: e.value };
40
- return h != null && h.includes(e.value) ? { ...a, state: ge.Mixed } : a;
41
- })
42
- ), H = !!o.find((e) => !e.isCategory && !e.isDivider), J = v(null), i = v(null), k = v(null), { isFocusVisible: Q, focusProps: U } = le(), u = r.length > 0, X = p != null ? p : [r.length, "selected"].join(" "), Y = ue(u, D, s), T = () => E(!1);
43
- fe(null, T, [i == null ? void 0 : i.current]);
37
+ const [l, E] = y(!1), [o, T] = y([]), H = !!o.find((e) => !e.isCategory && !e.isDivider), J = v(null), i = v(null), k = v(null), { isFocusVisible: Q, focusProps: U } = le(), m = r.length > 0, X = h != null ? h : [r.length, "selected"].join(" "), Y = me(m, D, s), N = () => E(!1);
38
+ ge(null, N, [i == null ? void 0 : i.current]);
44
39
  const x = () => E((e) => !e), { buttonProps: Z } = re(
45
40
  {
46
41
  onPress: x,
@@ -50,28 +45,35 @@ const Pe = ({
50
45
  elementType: "div"
51
46
  },
52
47
  J
53
- ), N = (e) => {
48
+ ), W = (e) => {
54
49
  const a = new Set(r);
55
- a.has(e) ? a.delete(e) : a.add(e), g(Array.from(a));
50
+ a.has(e) ? a.delete(e) : a.add(e), d(Array.from(a));
56
51
  }, _ = (e) => {
57
- e.code === "Space" && (k.current !== document.activeElement || !w) && x();
58
- }, $ = () => c === "Weak" ? u ? "" : "tw-text-text-weak" : "", W = () => c === "Weak" || !l ? z.Selected : z.SelectedWithFocus, L = (e) => {
59
- G(
52
+ e.code === "Space" && (k.current !== document.activeElement || !p) && x();
53
+ }, $ = () => c === "Weak" ? m ? "" : "tw-text-text-weak" : "", M = () => c === "Weak" || !l ? B.Selected : B.SelectedWithFocus, L = (e) => {
54
+ T(
60
55
  n.filter((a) => a.isCategory || a.isDivider ? !0 : a.value.toLowerCase().includes(e.currentTarget.value.toLowerCase())).map((a) => ({ ...a, label: a.value }))
61
56
  );
62
57
  };
63
- return /* @__PURE__ */ t.createElement("div", {
58
+ return ue(() => {
59
+ T(
60
+ n.map((e) => {
61
+ const a = { ...e, label: e.value };
62
+ return u != null && u.includes(e.value) ? { ...a, state: de.Mixed } : a;
63
+ })
64
+ );
65
+ }, [n, u]), /* @__PURE__ */ t.createElement("div", {
64
66
  className: "tw-relative",
65
67
  ref: i
66
- }, /* @__PURE__ */ t.createElement(de, {
67
- disabled: j,
68
+ }, /* @__PURE__ */ t.createElement(we, {
69
+ disabled: P,
68
70
  buttonProps: Z,
69
71
  isFocusVisible: Q,
70
72
  isOpen: l,
71
- validation: q,
72
- emphasis: c === "Default" ? y.Default : y.Weak
73
+ validation: G,
74
+ emphasis: c === "Default" ? A.Default : A.Weak
73
75
  }, /* @__PURE__ */ t.createElement("div", {
74
- className: ie(["tw-flex tw-flex-1 tw-gap-2", me(d)])
76
+ className: ie(["tw-flex tw-flex-1 tw-gap-2", fe(w)])
75
77
  }, /* @__PURE__ */ t.createElement("div", {
76
78
  className: "tw-flex tw-flex-1 tw-gap-2 focus:tw-outline-0",
77
79
  onClick: (e) => {
@@ -85,28 +87,28 @@ const Pe = ({
85
87
  className: "tw-flex tw-flex-wrap tw-gap-2 tw-outline-none tw-items-center tw-min-h-[28px]"
86
88
  }, b && /* @__PURE__ */ t.createElement("div", {
87
89
  className: $()
88
- }, b), C && u && /* @__PURE__ */ t.createElement(B, {
90
+ }, b), C && m && /* @__PURE__ */ t.createElement(F, {
89
91
  weight: "strong"
90
- }, C), S === "Default" && r.map((e) => /* @__PURE__ */ t.createElement(A, {
92
+ }, C), S === "Default" && r.map((e) => /* @__PURE__ */ t.createElement(z, {
91
93
  key: e,
92
- type: W(),
94
+ type: M(),
93
95
  label: e.toString(),
94
- size: d === "Small" ? f.Small : f.Medium,
95
- onClick: () => N(e)
96
- })), S === "Summarized" && u && /* @__PURE__ */ t.createElement(A, {
97
- type: W(),
96
+ size: w === "Small" ? g.Small : g.Medium,
97
+ onClick: () => W(e)
98
+ })), S === "Summarized" && m && /* @__PURE__ */ t.createElement(z, {
99
+ type: M(),
98
100
  label: X,
99
- size: d === "Small" ? f.Small : f.Medium,
100
- onClick: () => g([])
101
- }), !w && r.length === 0 && s && /* @__PURE__ */ t.createElement(B, {
101
+ size: w === "Small" ? g.Small : g.Medium,
102
+ onClick: () => d([])
103
+ }), !p && r.length === 0 && s && /* @__PURE__ */ t.createElement(F, {
102
104
  color: "weak"
103
- }, s)), w && /* @__PURE__ */ t.createElement("input", {
105
+ }, s)), p && /* @__PURE__ */ t.createElement("input", {
104
106
  ref: k,
105
107
  className: "focus:tw-outline-0 tw-text-s tw-bg-transparent",
106
108
  style: { maxWidth: Y },
107
109
  placeholder: r.length === 0 ? s : D,
108
110
  onChange: L
109
- })))), /* @__PURE__ */ t.createElement(ce, null, l && (c === "Default" ? /* @__PURE__ */ t.createElement(O.div, {
111
+ })))), /* @__PURE__ */ t.createElement(ce, null, l && (c === "Default" ? /* @__PURE__ */ t.createElement(V.div, {
110
112
  className: "tw-absolute tw-left-0 tw-w-full tw-overflow-hidden tw-p-0 tw-shadow-mid tw-list-none tw-m-0 tw-mt-2 tw-z-30 tw-bg-base tw-min-w-[18rem]",
111
113
  key: "content",
112
114
  initial: { height: 0 },
@@ -119,11 +121,11 @@ const Pe = ({
119
121
  className: "tw-p-4"
120
122
  }, /* @__PURE__ */ t.createElement(ae, {
121
123
  activeValues: r.map((e) => e.toString()),
122
- setActiveValues: g,
124
+ setActiveValues: d,
123
125
  checkboxes: o.filter((e) => !e.isDivider && !e.isCategory),
124
126
  direction: ne.Vertical,
125
- ariaLabel: F
126
- })))) : /* @__PURE__ */ t.createElement(O.div, {
127
+ ariaLabel: j
128
+ })))) : /* @__PURE__ */ t.createElement(V.div, {
127
129
  initial: {
128
130
  opacity: 0
129
131
  },
@@ -136,35 +138,35 @@ const Pe = ({
136
138
  transition: { duration: 0.15 }
137
139
  },
138
140
  transition: { ease: [0.04, 0.62, 0.23, 0.98] }
139
- }, /* @__PURE__ */ t.createElement(we, {
141
+ }, /* @__PURE__ */ t.createElement(pe, {
140
142
  open: l,
141
- onClose: T,
143
+ onClose: N,
142
144
  triggerRef: i
143
145
  }, o.length > 0 && H ? o.map((e, a) => {
144
- const { label: M, value: m, avatar: I, imgSrc: K } = e, R = !!r.find((te) => te === m), ee = () => N(M);
145
- return e.isCategory || e.isDivider ? /* @__PURE__ */ t.createElement(pe, {
146
- key: m + e,
146
+ const { label: R, value: f, avatar: I, imgSrc: K } = e, O = !!r.find((te) => te === f), ee = () => W(R);
147
+ return e.isCategory || e.isDivider ? /* @__PURE__ */ t.createElement(he, {
148
+ key: f + e,
147
149
  checkboxes: o,
148
150
  index: a
149
- }) : /* @__PURE__ */ t.createElement(ke, {
150
- checked: R,
151
+ }) : /* @__PURE__ */ t.createElement(xe, {
152
+ checked: O,
151
153
  onClick: ee,
152
- key: m
153
- }, /* @__PURE__ */ t.createElement(he, {
154
- label: M,
155
- value: m,
154
+ key: f
155
+ }, /* @__PURE__ */ t.createElement(Ee, {
156
+ label: R,
157
+ value: f,
156
158
  avatar: I,
157
159
  imgSrc: K,
158
- isChecked: R
160
+ isChecked: O
159
161
  }));
160
- }) : /* @__PURE__ */ t.createElement(Ee, {
161
- label: P
162
+ }) : /* @__PURE__ */ t.createElement(ke, {
163
+ label: q
162
164
  }))))));
163
165
  };
164
166
  export {
165
- Pe as MultiSelect,
166
- Ce as MultiSelectEmphasis,
167
- ve as MultiSelectSize,
168
- xe as MultiSelectType
167
+ qe as MultiSelect,
168
+ De as MultiSelectEmphasis,
169
+ Ce as MultiSelectSize,
170
+ ve as MultiSelectType
169
171
  };
170
172
  //# sourceMappingURL=MultiSelect.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MultiSelect.es.js","sources":["../../../src/components/MultiSelect/MultiSelect.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { Checklist, ChecklistDirection } from '@components/Checklist/Checklist';\nimport { Tag, TagSize, TagType } from '@components/Tag';\nimport { Trigger, TriggerEmphasis } from '@components/Trigger';\nimport { Text } from '@typography/Text';\nimport { useButton } from '@react-aria/button';\nimport { FocusScope, useFocusRing } from '@react-aria/focus';\nimport { merge } from '@utilities/merge';\nimport { Validation } from '@utilities/validation';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport React, { ChangeEvent, FC, KeyboardEvent, useRef, useState } from 'react';\nimport { getInputWidth, getPaddingClasses } from './helpers';\nimport { Menu } from '@components/Menu';\nimport { MenuItem } from '@components/MenuItem';\nimport { useClickOutside } from '@hooks/useClickOutside';\nimport { DefaultItem, NoSearchResults, OptionalItems } from './SelectMenuItems';\nimport { CheckboxState } from '@components/Checkbox/Checkbox';\n\nexport enum MultiSelectType {\n Default = 'Default',\n Summarized = 'Summarized',\n}\n\nexport enum MultiSelectSize {\n Small = 'Small',\n Medium = 'Medium',\n}\n\nexport enum MultiSelectEmphasis {\n Default = 'Default',\n Weak = 'Weak',\n}\n\nexport type MultiSelectItem = {\n value: string;\n isCategory?: boolean;\n isDivider?: boolean;\n avatar?: React.ReactNode;\n imgSrc?: string;\n ariaLabel?: string;\n};\n\nexport type MultiSelectProps = {\n items: MultiSelectItem[];\n activeItemKeys: (string | number)[];\n disabled?: boolean;\n onSelectionChange: (keys: (string | number)[]) => void;\n ariaLabel?: string;\n label?: string;\n placeholder?: string;\n type?: MultiSelectType;\n size?: MultiSelectSize;\n validation?: Validation;\n emphasis?: MultiSelectEmphasis;\n decorator?: React.ReactNode;\n filterable?: boolean;\n filterLabel?: string;\n noResultsLabel?: string;\n summarizedLabel?: string;\n indeterminateItemKeys?: (string | number)[];\n};\n\nexport type Item = {\n label: string;\n value: string;\n avatar?: React.ReactNode;\n isCategory?: boolean;\n isDivider?: boolean;\n imgSrc?: string;\n ariaLabel?: string;\n};\n\nexport const MultiSelect: FC<MultiSelectProps> = ({\n items,\n activeItemKeys,\n onSelectionChange,\n ariaLabel = 'Select list',\n disabled = false,\n placeholder,\n label,\n filterLabel,\n noResultsLabel,\n type = MultiSelectType.Default,\n size = MultiSelectSize.Medium,\n validation = Validation.Default,\n emphasis = MultiSelectEmphasis.Default,\n decorator = null,\n filterable = false,\n summarizedLabel: summarizedLabelFromProps,\n indeterminateItemKeys,\n}) => {\n const [open, setOpen] = useState(false);\n const [checkboxes, setCheckboxes] = useState<Item[]>(\n items.map((item) => {\n const checkboxBaseItem = { ...item, label: item.value };\n if (indeterminateItemKeys?.includes(item.value)) {\n return { ...checkboxBaseItem, state: CheckboxState.Mixed };\n }\n return checkboxBaseItem;\n }),\n );\n const hasResults = !!checkboxes.find((item) => !item.isCategory && !item.isDivider);\n const triggerRef = useRef<HTMLDivElement | null>(null);\n const multiSelectRef = useRef<HTMLDivElement | null>(null);\n const filterInputRef = useRef<HTMLInputElement | null>(null);\n const { isFocusVisible, focusProps } = useFocusRing();\n\n const hasSelectedItems = activeItemKeys.length > 0;\n const summarizedLabel = summarizedLabelFromProps ?? [activeItemKeys.length, 'selected'].join(' ');\n const inputWidth = getInputWidth(hasSelectedItems, filterLabel, placeholder);\n\n const handleClose = () => setOpen(false);\n\n useClickOutside(null, handleClose, [multiSelectRef?.current as HTMLElement]);\n\n const toggleOpen = () => setOpen((open) => !open);\n\n const { buttonProps } = useButton(\n {\n onPress: toggleOpen,\n onKeyDown: (e) => {\n if (e.key === 'Escape') {\n setOpen(false);\n }\n },\n elementType: 'div',\n },\n triggerRef,\n );\n\n const toggleSelection = (key: string | number) => {\n const keySet = new Set(activeItemKeys);\n\n if (keySet.has(key)) {\n keySet.delete(key);\n } else {\n keySet.add(key);\n }\n\n onSelectionChange(Array.from(keySet));\n };\n\n const handleSpacebarToggle = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.code === 'Space' && (filterInputRef.current !== document.activeElement || !filterable)) {\n toggleOpen();\n }\n };\n\n const getDecoratorClasses = () => {\n if (emphasis === MultiSelectEmphasis.Weak) {\n return hasSelectedItems ? '' : 'tw-text-text-weak';\n }\n\n return '';\n };\n\n const getTagType = () => {\n if (emphasis === MultiSelectEmphasis.Weak || !open) {\n return TagType.Selected;\n }\n return TagType.SelectedWithFocus;\n };\n\n const handleFilterChange = (e: ChangeEvent<HTMLInputElement>) => {\n setCheckboxes(\n items\n .filter((item) => {\n if (item.isCategory || item.isDivider) {\n return true;\n }\n\n return item.value.toLowerCase().includes(e.currentTarget.value.toLowerCase());\n })\n .map((item) => ({ ...item, label: item.value })),\n );\n };\n\n return (\n <div className=\"tw-relative\" ref={multiSelectRef}>\n <Trigger\n disabled={disabled}\n buttonProps={buttonProps}\n isFocusVisible={isFocusVisible}\n isOpen={open}\n validation={validation}\n emphasis={emphasis === MultiSelectEmphasis.Default ? TriggerEmphasis.Default : TriggerEmphasis.Weak}\n >\n <div className={merge(['tw-flex tw-flex-1 tw-gap-2', getPaddingClasses(size)])}>\n <div\n className=\"tw-flex tw-flex-1 tw-gap-2 focus:tw-outline-0\"\n onClick={(e) => {\n if (e.target === filterInputRef.current && open) {\n return;\n }\n toggleOpen();\n }}\n role=\"button\"\n {...focusProps}\n tabIndex={0}\n onKeyDown={handleSpacebarToggle}\n >\n <div className=\"tw-flex tw-flex-wrap tw-gap-2 tw-outline-none tw-items-center tw-min-h-[28px]\">\n {decorator && <div className={getDecoratorClasses()}>{decorator}</div>}\n {label && hasSelectedItems && <Text weight=\"strong\">{label}</Text>}\n {type === MultiSelectType.Default &&\n activeItemKeys.map((key) => (\n <Tag\n key={key}\n type={getTagType()}\n label={key.toString()}\n size={size === MultiSelectSize.Small ? TagSize.Small : TagSize.Medium}\n onClick={() => toggleSelection(key)}\n />\n ))}\n\n {type === MultiSelectType.Summarized && hasSelectedItems && (\n <Tag\n type={getTagType()}\n label={summarizedLabel}\n size={size === MultiSelectSize.Small ? TagSize.Small : TagSize.Medium}\n onClick={() => onSelectionChange([])}\n />\n )}\n\n {!filterable && activeItemKeys.length === 0 && placeholder && (\n <Text color=\"weak\">{placeholder}</Text>\n )}\n </div>\n {filterable && (\n <input\n ref={filterInputRef}\n className=\"focus:tw-outline-0 tw-text-s tw-bg-transparent\"\n style={{ maxWidth: inputWidth }}\n placeholder={activeItemKeys.length === 0 ? placeholder : filterLabel}\n onChange={handleFilterChange}\n />\n )}\n </div>\n </div>\n </Trigger>\n <AnimatePresence>\n {open &&\n (emphasis === MultiSelectEmphasis.Default ? (\n <motion.div\n className=\"tw-absolute tw-left-0 tw-w-full tw-overflow-hidden tw-p-0 tw-shadow-mid tw-list-none tw-m-0 tw-mt-2 tw-z-30 tw-bg-base tw-min-w-[18rem]\"\n key=\"content\"\n initial={{ height: 0 }}\n animate={{ height: 'auto' }}\n exit={{ height: 0 }}\n transition={{ ease: [0.04, 0.62, 0.23, 0.98] }}\n >\n <FocusScope restoreFocus>\n <div className=\"tw-p-4\">\n <Checklist\n activeValues={activeItemKeys.map((key) => key.toString())}\n setActiveValues={onSelectionChange}\n checkboxes={checkboxes.filter((item) => !item.isDivider && !item.isCategory)}\n direction={ChecklistDirection.Vertical}\n ariaLabel={ariaLabel}\n />\n </div>\n </FocusScope>\n </motion.div>\n ) : (\n <motion.div\n initial={{\n opacity: 0,\n }}\n animate={{\n opacity: 1,\n transition: { duration: 0.15 },\n }}\n exit={{\n opacity: 0,\n transition: { duration: 0.15 },\n }}\n transition={{ ease: [0.04, 0.62, 0.23, 0.98] }}\n >\n <Menu open={open} onClose={handleClose} triggerRef={multiSelectRef}>\n {checkboxes.length > 0 && hasResults ? (\n checkboxes.map((item, index) => {\n const { label, value, avatar, imgSrc } = item;\n const isChecked = !!activeItemKeys.find((key) => key === value);\n const handleMenuItemClick = () => toggleSelection(label);\n\n if (item.isCategory || item.isDivider) {\n return (\n <OptionalItems\n key={value + item}\n {...{\n checkboxes,\n index,\n }}\n />\n );\n }\n\n return (\n <MenuItem checked={isChecked} onClick={handleMenuItemClick} key={value}>\n <DefaultItem {...{ label, value, avatar, imgSrc, isChecked }} />\n </MenuItem>\n );\n })\n ) : (\n <NoSearchResults label={noResultsLabel} />\n )}\n </Menu>\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n );\n};\n"],"names":["MultiSelectType","MultiSelectSize","MultiSelectEmphasis","MultiSelect","items","activeItemKeys","onSelectionChange","ariaLabel","disabled","placeholder","label","filterLabel","noResultsLabel","type","size","validation","Validation","emphasis","decorator","filterable","summarizedLabelFromProps","indeterminateItemKeys","open","setOpen","useState","checkboxes","setCheckboxes","item","checkboxBaseItem","CheckboxState","hasResults","triggerRef","useRef","multiSelectRef","filterInputRef","isFocusVisible","focusProps","useFocusRing","hasSelectedItems","summarizedLabel","inputWidth","getInputWidth","handleClose","useClickOutside","toggleOpen","buttonProps","useButton","toggleSelection","key","keySet","handleSpacebarToggle","getDecoratorClasses","getTagType","TagType","handleFilterChange","React","Trigger","TriggerEmphasis","merge","getPaddingClasses","Text","Tag","TagSize","AnimatePresence","motion","FocusScope","Checklist","ChecklistDirection","Menu","index","value","avatar","imgSrc","isChecked","handleMenuItemClick","OptionalItems","MenuItem","DefaultItem","NoSearchResults"],"mappings":"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"}
1
+ {"version":3,"file":"MultiSelect.es.js","sources":["../../../src/components/MultiSelect/MultiSelect.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { Checklist, ChecklistDirection } from '@components/Checklist/Checklist';\nimport { Tag, TagSize, TagType } from '@components/Tag';\nimport { Trigger, TriggerEmphasis } from '@components/Trigger';\nimport { Text } from '@typography/Text';\nimport { useButton } from '@react-aria/button';\nimport { FocusScope, useFocusRing } from '@react-aria/focus';\nimport { merge } from '@utilities/merge';\nimport { Validation } from '@utilities/validation';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport React, { ChangeEvent, FC, KeyboardEvent, useEffect, useRef, useState } from 'react';\nimport { getInputWidth, getPaddingClasses } from './helpers';\nimport { Menu } from '@components/Menu';\nimport { MenuItem } from '@components/MenuItem';\nimport { useClickOutside } from '@hooks/useClickOutside';\nimport { DefaultItem, NoSearchResults, OptionalItems } from './SelectMenuItems';\nimport { CheckboxState } from '@components/Checkbox/Checkbox';\n\nexport enum MultiSelectType {\n Default = 'Default',\n Summarized = 'Summarized',\n}\n\nexport enum MultiSelectSize {\n Small = 'Small',\n Medium = 'Medium',\n}\n\nexport enum MultiSelectEmphasis {\n Default = 'Default',\n Weak = 'Weak',\n}\n\nexport type MultiSelectItem = {\n value: string;\n isCategory?: boolean;\n isDivider?: boolean;\n avatar?: React.ReactNode;\n imgSrc?: string;\n ariaLabel?: string;\n};\n\nexport type MultiSelectProps = {\n items: MultiSelectItem[];\n activeItemKeys: (string | number)[];\n disabled?: boolean;\n onSelectionChange: (keys: (string | number)[]) => void;\n ariaLabel?: string;\n label?: string;\n placeholder?: string;\n type?: MultiSelectType;\n size?: MultiSelectSize;\n validation?: Validation;\n emphasis?: MultiSelectEmphasis;\n decorator?: React.ReactNode;\n filterable?: boolean;\n filterLabel?: string;\n noResultsLabel?: string;\n summarizedLabel?: string;\n indeterminateItemKeys?: (string | number)[];\n};\n\nexport type Item = {\n label: string;\n value: string;\n avatar?: React.ReactNode;\n isCategory?: boolean;\n isDivider?: boolean;\n imgSrc?: string;\n ariaLabel?: string;\n};\n\nexport const MultiSelect: FC<MultiSelectProps> = ({\n items,\n activeItemKeys,\n onSelectionChange,\n ariaLabel = 'Select list',\n disabled = false,\n placeholder,\n label,\n filterLabel,\n noResultsLabel,\n type = MultiSelectType.Default,\n size = MultiSelectSize.Medium,\n validation = Validation.Default,\n emphasis = MultiSelectEmphasis.Default,\n decorator = null,\n filterable = false,\n summarizedLabel: summarizedLabelFromProps,\n indeterminateItemKeys,\n}) => {\n const [open, setOpen] = useState(false);\n const [checkboxes, setCheckboxes] = useState<Item[]>([]);\n const hasResults = !!checkboxes.find((item) => !item.isCategory && !item.isDivider);\n const triggerRef = useRef<HTMLDivElement | null>(null);\n const multiSelectRef = useRef<HTMLDivElement | null>(null);\n const filterInputRef = useRef<HTMLInputElement | null>(null);\n const { isFocusVisible, focusProps } = useFocusRing();\n\n const hasSelectedItems = activeItemKeys.length > 0;\n const summarizedLabel = summarizedLabelFromProps ?? [activeItemKeys.length, 'selected'].join(' ');\n const inputWidth = getInputWidth(hasSelectedItems, filterLabel, placeholder);\n\n const handleClose = () => setOpen(false);\n\n useClickOutside(null, handleClose, [multiSelectRef?.current as HTMLElement]);\n\n const toggleOpen = () => setOpen((open) => !open);\n\n const { buttonProps } = useButton(\n {\n onPress: toggleOpen,\n onKeyDown: (e) => {\n if (e.key === 'Escape') {\n setOpen(false);\n }\n },\n elementType: 'div',\n },\n triggerRef,\n );\n\n const toggleSelection = (key: string | number) => {\n const keySet = new Set(activeItemKeys);\n\n if (keySet.has(key)) {\n keySet.delete(key);\n } else {\n keySet.add(key);\n }\n\n onSelectionChange(Array.from(keySet));\n };\n\n const handleSpacebarToggle = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.code === 'Space' && (filterInputRef.current !== document.activeElement || !filterable)) {\n toggleOpen();\n }\n };\n\n const getDecoratorClasses = () => {\n if (emphasis === MultiSelectEmphasis.Weak) {\n return hasSelectedItems ? '' : 'tw-text-text-weak';\n }\n\n return '';\n };\n\n const getTagType = () => {\n if (emphasis === MultiSelectEmphasis.Weak || !open) {\n return TagType.Selected;\n }\n return TagType.SelectedWithFocus;\n };\n\n const handleFilterChange = (e: ChangeEvent<HTMLInputElement>) => {\n setCheckboxes(\n items\n .filter((item) => {\n if (item.isCategory || item.isDivider) {\n return true;\n }\n\n return item.value.toLowerCase().includes(e.currentTarget.value.toLowerCase());\n })\n .map((item) => ({ ...item, label: item.value })),\n );\n };\n\n useEffect(() => {\n setCheckboxes(\n items.map((item) => {\n const checkboxBaseItem = { ...item, label: item.value };\n if (indeterminateItemKeys?.includes(item.value)) {\n return { ...checkboxBaseItem, state: CheckboxState.Mixed };\n }\n return checkboxBaseItem;\n }),\n );\n }, [items, indeterminateItemKeys]);\n\n return (\n <div className=\"tw-relative\" ref={multiSelectRef}>\n <Trigger\n disabled={disabled}\n buttonProps={buttonProps}\n isFocusVisible={isFocusVisible}\n isOpen={open}\n validation={validation}\n emphasis={emphasis === MultiSelectEmphasis.Default ? TriggerEmphasis.Default : TriggerEmphasis.Weak}\n >\n <div className={merge(['tw-flex tw-flex-1 tw-gap-2', getPaddingClasses(size)])}>\n <div\n className=\"tw-flex tw-flex-1 tw-gap-2 focus:tw-outline-0\"\n onClick={(e) => {\n if (e.target === filterInputRef.current && open) {\n return;\n }\n toggleOpen();\n }}\n role=\"button\"\n {...focusProps}\n tabIndex={0}\n onKeyDown={handleSpacebarToggle}\n >\n <div className=\"tw-flex tw-flex-wrap tw-gap-2 tw-outline-none tw-items-center tw-min-h-[28px]\">\n {decorator && <div className={getDecoratorClasses()}>{decorator}</div>}\n {label && hasSelectedItems && <Text weight=\"strong\">{label}</Text>}\n {type === MultiSelectType.Default &&\n activeItemKeys.map((key) => (\n <Tag\n key={key}\n type={getTagType()}\n label={key.toString()}\n size={size === MultiSelectSize.Small ? TagSize.Small : TagSize.Medium}\n onClick={() => toggleSelection(key)}\n />\n ))}\n\n {type === MultiSelectType.Summarized && hasSelectedItems && (\n <Tag\n type={getTagType()}\n label={summarizedLabel}\n size={size === MultiSelectSize.Small ? TagSize.Small : TagSize.Medium}\n onClick={() => onSelectionChange([])}\n />\n )}\n\n {!filterable && activeItemKeys.length === 0 && placeholder && (\n <Text color=\"weak\">{placeholder}</Text>\n )}\n </div>\n {filterable && (\n <input\n ref={filterInputRef}\n className=\"focus:tw-outline-0 tw-text-s tw-bg-transparent\"\n style={{ maxWidth: inputWidth }}\n placeholder={activeItemKeys.length === 0 ? placeholder : filterLabel}\n onChange={handleFilterChange}\n />\n )}\n </div>\n </div>\n </Trigger>\n <AnimatePresence>\n {open &&\n (emphasis === MultiSelectEmphasis.Default ? (\n <motion.div\n className=\"tw-absolute tw-left-0 tw-w-full tw-overflow-hidden tw-p-0 tw-shadow-mid tw-list-none tw-m-0 tw-mt-2 tw-z-30 tw-bg-base tw-min-w-[18rem]\"\n key=\"content\"\n initial={{ height: 0 }}\n animate={{ height: 'auto' }}\n exit={{ height: 0 }}\n transition={{ ease: [0.04, 0.62, 0.23, 0.98] }}\n >\n <FocusScope restoreFocus>\n <div className=\"tw-p-4\">\n <Checklist\n activeValues={activeItemKeys.map((key) => key.toString())}\n setActiveValues={onSelectionChange}\n checkboxes={checkboxes.filter((item) => !item.isDivider && !item.isCategory)}\n direction={ChecklistDirection.Vertical}\n ariaLabel={ariaLabel}\n />\n </div>\n </FocusScope>\n </motion.div>\n ) : (\n <motion.div\n initial={{\n opacity: 0,\n }}\n animate={{\n opacity: 1,\n transition: { duration: 0.15 },\n }}\n exit={{\n opacity: 0,\n transition: { duration: 0.15 },\n }}\n transition={{ ease: [0.04, 0.62, 0.23, 0.98] }}\n >\n <Menu open={open} onClose={handleClose} triggerRef={multiSelectRef}>\n {checkboxes.length > 0 && hasResults ? (\n checkboxes.map((item, index) => {\n const { label, value, avatar, imgSrc } = item;\n const isChecked = !!activeItemKeys.find((key) => key === value);\n const handleMenuItemClick = () => toggleSelection(label);\n\n if (item.isCategory || item.isDivider) {\n return (\n <OptionalItems\n key={value + item}\n {...{\n checkboxes,\n index,\n }}\n />\n );\n }\n\n return (\n <MenuItem checked={isChecked} onClick={handleMenuItemClick} key={value}>\n <DefaultItem {...{ label, value, avatar, imgSrc, isChecked }} />\n </MenuItem>\n );\n })\n ) : (\n <NoSearchResults label={noResultsLabel} />\n )}\n </Menu>\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n );\n};\n"],"names":["MultiSelectType","MultiSelectSize","MultiSelectEmphasis","MultiSelect","items","activeItemKeys","onSelectionChange","ariaLabel","disabled","placeholder","label","filterLabel","noResultsLabel","type","size","validation","Validation","emphasis","decorator","filterable","summarizedLabelFromProps","indeterminateItemKeys","open","setOpen","useState","checkboxes","setCheckboxes","hasResults","item","triggerRef","useRef","multiSelectRef","filterInputRef","isFocusVisible","focusProps","useFocusRing","hasSelectedItems","summarizedLabel","inputWidth","getInputWidth","handleClose","useClickOutside","toggleOpen","buttonProps","useButton","toggleSelection","key","keySet","handleSpacebarToggle","getDecoratorClasses","getTagType","TagType","handleFilterChange","useEffect","checkboxBaseItem","CheckboxState","React","Trigger","TriggerEmphasis","merge","getPaddingClasses","Text","Tag","TagSize","AnimatePresence","motion","FocusScope","Checklist","ChecklistDirection","Menu","index","value","avatar","imgSrc","isChecked","handleMenuItemClick","OptionalItems","MenuItem","DefaultItem","NoSearchResults"],"mappings":"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"}