@egose/shadcn-theme 0.1.6 → 0.1.7
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/chunk-2NUE7GJ3.js +44 -0
- package/chunk-2NUE7GJ3.js.map +1 -0
- package/chunk-3PZY5HRH.mjs +82 -0
- package/chunk-3PZY5HRH.mjs.map +1 -0
- package/{components/ui/extension/multi-select.js → chunk-3TG6ZVFG.js} +63 -62
- package/chunk-3TG6ZVFG.js.map +1 -0
- package/{components/ui/extension/multi-select.mjs → chunk-7JYFZETL.mjs} +64 -63
- package/chunk-7JYFZETL.mjs.map +1 -0
- package/chunk-FSU3BKPK.js +130 -0
- package/chunk-FSU3BKPK.js.map +1 -0
- package/{chunk-3ZN766EW.js → chunk-G6WKPZTL.js} +3 -3
- package/{chunk-3ZN766EW.js.map → chunk-G6WKPZTL.js.map} +1 -1
- package/chunk-IQIHYWXX.js +83 -0
- package/chunk-IQIHYWXX.js.map +1 -0
- package/{chunk-AJLAS62X.js → chunk-LAIO3QZX.js} +4 -4
- package/{chunk-AJLAS62X.js.map → chunk-LAIO3QZX.js.map} +1 -1
- package/{chunk-MJT6B7OJ.js → chunk-LPDYWZN6.js} +3 -3
- package/{chunk-MJT6B7OJ.js.map → chunk-LPDYWZN6.js.map} +1 -1
- package/{chunk-432PQWGO.mjs → chunk-RJVQU443.mjs} +2 -2
- package/chunk-USW6AILM.mjs +43 -0
- package/chunk-USW6AILM.mjs.map +1 -0
- package/{chunk-HKZRXGJ7.mjs → chunk-YDRPNCWF.mjs} +4 -4
- package/{chunk-ZMMYQNQV.mjs → chunk-ZFBUIBJH.mjs} +2 -2
- package/chunk-ZQK6REIM.mjs +129 -0
- package/chunk-ZQK6REIM.mjs.map +1 -0
- package/components/form/hook-multi-select.d.mts +14 -0
- package/components/form/hook-multi-select.d.ts +14 -0
- package/components/form/hook-multi-select.js +76 -0
- package/components/form/hook-multi-select.js.map +1 -0
- package/components/form/hook-multi-select.mjs +75 -0
- package/components/form/hook-multi-select.mjs.map +1 -0
- package/components/form/hook-searchable-select.js +5 -5
- package/components/form/hook-searchable-select.mjs +4 -4
- package/components/form/hook-tag-picker.d.mts +12 -0
- package/components/form/hook-tag-picker.d.ts +12 -0
- package/components/form/hook-tag-picker.js +66 -0
- package/components/form/hook-tag-picker.js.map +1 -0
- package/components/form/hook-tag-picker.mjs +65 -0
- package/components/form/hook-tag-picker.mjs.map +1 -0
- package/components/form/multi-select.d.mts +25 -1
- package/components/form/multi-select.d.ts +25 -1
- package/components/form/multi-select.js +20 -1
- package/components/form/multi-select.js.map +1 -1
- package/components/form/multi-select.mjs +19 -0
- package/components/form/searchable-select.js +5 -5
- package/components/form/searchable-select.mjs +4 -4
- package/components/form/tag-picker.d.mts +21 -0
- package/components/form/tag-picker.d.ts +21 -0
- package/components/form/tag-picker.js +14 -0
- package/components/form/tag-picker.js.map +1 -0
- package/components/form/tag-picker.mjs +13 -0
- package/components/form/tag-picker.mjs.map +1 -0
- package/components/ui/combobox.js +5 -5
- package/components/ui/combobox.mjs +2 -2
- package/components/ui/command.js +4 -4
- package/components/ui/command.mjs +3 -3
- package/components/ui/input-group.js +3 -3
- package/components/ui/input-group.mjs +2 -2
- package/components/ui/{extension/multi-select.d.mts → multi-select.d.mts} +4 -3
- package/components/ui/{extension/multi-select.d.ts → multi-select.d.ts} +4 -3
- package/components/ui/multi-select.js +29 -0
- package/components/ui/multi-select.js.map +1 -0
- package/components/ui/multi-select.mjs +28 -0
- package/components/ui/multi-select.mjs.map +1 -0
- package/components/ui/tag-picker.d.mts +14 -0
- package/components/ui/tag-picker.d.ts +14 -0
- package/components/ui/tag-picker.js +12 -0
- package/components/ui/tag-picker.js.map +1 -0
- package/components/ui/tag-picker.mjs +11 -0
- package/components/ui/tag-picker.mjs.map +1 -0
- package/components/widgets/dialog-manager/index.js +1 -1
- package/components/widgets/dialog-manager/index.js.map +1 -1
- package/components/widgets/dialog-manager/index.mjs +1 -1
- package/layouts/sidebar1/app-sidebar.js +2 -2
- package/layouts/sidebar1/app-sidebar.mjs +2 -2
- package/layouts/sidebar1/context-switcher.js +1 -1
- package/layouts/sidebar1/context-switcher.mjs +1 -1
- package/layouts/sidebar1/index.js +3 -3
- package/layouts/sidebar1/index.js.map +1 -1
- package/layouts/sidebar1/index.mjs +3 -3
- package/layouts/sidebar1/nav-menus.js +1 -1
- package/layouts/sidebar1/nav-menus.mjs +1 -1
- package/layouts/sidebar1/nav-user.js +2 -2
- package/layouts/sidebar1/nav-user.mjs +2 -2
- package/layouts/simple/index.js +2 -2
- package/layouts/simple/index.mjs +3 -3
- package/package.json +1 -1
- package/components/ui/extension/multi-select.js.map +0 -1
- package/components/ui/extension/multi-select.mjs.map +0 -1
- /package/{chunk-432PQWGO.mjs.map → chunk-RJVQU443.mjs.map} +0 -0
- /package/{chunk-HKZRXGJ7.mjs.map → chunk-YDRPNCWF.mjs.map} +0 -0
- /package/{chunk-ZMMYQNQV.mjs.map → chunk-ZFBUIBJH.mjs.map} +0 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
3
|
+
|
|
4
|
+
var _chunkFSU3BKPKjs = require('./chunk-FSU3BKPK.js');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var _chunkCKGMFUU2js = require('./chunk-CKGMFUU2.js');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
var _chunkPSPAJNNBjs = require('./chunk-PSPAJNNB.js');
|
|
11
|
+
|
|
12
|
+
// components/form/tag-picker.tsx
|
|
13
|
+
var _kebabCase2 = require('lodash-es/kebabCase'); var _kebabCase3 = _interopRequireDefault(_kebabCase2);
|
|
14
|
+
function FormTagPicker({
|
|
15
|
+
id,
|
|
16
|
+
name,
|
|
17
|
+
label,
|
|
18
|
+
value,
|
|
19
|
+
onChange,
|
|
20
|
+
suggestions = [],
|
|
21
|
+
placeholder = "Add tags...",
|
|
22
|
+
disabled = false,
|
|
23
|
+
required = false,
|
|
24
|
+
classNames
|
|
25
|
+
}) {
|
|
26
|
+
if (!id) id = _kebabCase3.default.call(void 0, name);
|
|
27
|
+
return /* @__PURE__ */ React.createElement("div", { className: _chunkPSPAJNNBjs.cn.call(void 0, "space-y-2", classNames == null ? void 0 : classNames.wrapper) }, label && /* @__PURE__ */ React.createElement(_chunkCKGMFUU2js.Label, { htmlFor: id, className: classNames == null ? void 0 : classNames.label, required }, label), /* @__PURE__ */ React.createElement(
|
|
28
|
+
_chunkFSU3BKPKjs.TagPicker,
|
|
29
|
+
{
|
|
30
|
+
id,
|
|
31
|
+
value,
|
|
32
|
+
onChange,
|
|
33
|
+
suggestions,
|
|
34
|
+
placeholder,
|
|
35
|
+
disabled,
|
|
36
|
+
className: classNames == null ? void 0 : classNames.input
|
|
37
|
+
}
|
|
38
|
+
));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
exports.FormTagPicker = FormTagPicker;
|
|
44
|
+
//# sourceMappingURL=chunk-2NUE7GJ3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-2NUE7GJ3.js","../components/form/tag-picker.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACTA,wGAAuB;AAuBhB,SAAS,aAAA,CAAc;AAAA,EAC5B,EAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA,EAAc,CAAC,CAAA;AAAA,EACf,YAAA,EAAc,aAAA;AAAA,EACd,SAAA,EAAW,KAAA;AAAA,EACX,SAAA,EAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAuB;AACrB,EAAA,GAAA,CAAI,CAAC,EAAA,EAAI,GAAA,EAAK,iCAAA,IAAe,CAAA;AAE7B,EAAA,uBACE,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,iCAAA,WAAG,EAAa,WAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,UAAA,CAAY,OAAO,EAAA,CAAA,EAChD,MAAA,mBACC,KAAA,CAAA,aAAA,CAAC,sBAAA,EAAA,EAAM,OAAA,EAAS,EAAA,EAAI,SAAA,EAAW,WAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,UAAA,CAAY,KAAA,EAAO,SAAA,CAAA,EAC/C,KACH,CAAA,kBAGF,KAAA,CAAA,aAAA;AAAA,IAAC,0BAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAW,WAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,UAAA,CAAY;AAAA,IAAA;AAAA,EACzB,CACF,CAAA;AAEJ;ADnBA;AACA;AACE;AACF,sCAAC","file":"/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-2NUE7GJ3.js","sourcesContent":[null,"\"use client\";\nimport _kebabCase from 'lodash-es/kebabCase';\n\nimport { cn } from '../../utils/ui';\nimport { Label } from '../ui/label';\nimport { TagPicker } from '../ui/tag-picker';\n\nexport interface FormTagPickerProps {\n id?: string;\n name: string;\n label?: string;\n value: string[];\n onChange: (values: string[]) => void;\n suggestions?: string[];\n placeholder?: string;\n disabled?: boolean;\n required?: boolean;\n classNames?: {\n wrapper?: string;\n label?: string;\n input?: string;\n };\n}\n\nexport function FormTagPicker({\n id,\n name,\n label,\n value,\n onChange,\n suggestions = [],\n placeholder = 'Add tags...',\n disabled = false,\n required = false,\n classNames,\n}: FormTagPickerProps) {\n if (!id) id = _kebabCase(name);\n\n return (\n <div className={cn('space-y-2', classNames?.wrapper)}>\n {label && (\n <Label htmlFor={id} className={classNames?.label} required={required}>\n {label}\n </Label>\n )}\n\n <TagPicker\n id={id}\n value={value}\n onChange={onChange}\n suggestions={suggestions}\n placeholder={placeholder}\n disabled={disabled}\n className={classNames?.input}\n />\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MultiSelector,
|
|
3
|
+
MultiSelectorInput,
|
|
4
|
+
MultiSelectorItem,
|
|
5
|
+
MultiSelectorList,
|
|
6
|
+
MultiSelectorTrigger
|
|
7
|
+
} from "./chunk-7JYFZETL.mjs";
|
|
8
|
+
import {
|
|
9
|
+
Popover,
|
|
10
|
+
PopoverContent,
|
|
11
|
+
PopoverTrigger
|
|
12
|
+
} from "./chunk-CSL3CTEN.mjs";
|
|
13
|
+
import {
|
|
14
|
+
Label
|
|
15
|
+
} from "./chunk-MM5OJOOR.mjs";
|
|
16
|
+
import {
|
|
17
|
+
cn
|
|
18
|
+
} from "./chunk-KGUUDFJE.mjs";
|
|
19
|
+
|
|
20
|
+
// components/form/multi-select.tsx
|
|
21
|
+
import _isString from "lodash-es/isString";
|
|
22
|
+
import _kebabCase from "lodash-es/kebabCase";
|
|
23
|
+
import React from "react";
|
|
24
|
+
function FormMultiSelect({
|
|
25
|
+
id,
|
|
26
|
+
name,
|
|
27
|
+
label,
|
|
28
|
+
placeholder = "Select options...",
|
|
29
|
+
data,
|
|
30
|
+
value = [],
|
|
31
|
+
onChange,
|
|
32
|
+
classNames,
|
|
33
|
+
required,
|
|
34
|
+
disabled,
|
|
35
|
+
loop = false
|
|
36
|
+
}) {
|
|
37
|
+
const options = React.useMemo(() => {
|
|
38
|
+
if (!data || data.length === 0) return [];
|
|
39
|
+
if (_isString(data[0])) {
|
|
40
|
+
return data.map((currentValue) => ({ label: currentValue, value: currentValue }));
|
|
41
|
+
}
|
|
42
|
+
return data;
|
|
43
|
+
}, [data]);
|
|
44
|
+
const selectedValues = React.useMemo(() => {
|
|
45
|
+
return value.map((currentValue) => options.find((option) => option.value === currentValue)).filter((option) => !!option);
|
|
46
|
+
}, [options, value]);
|
|
47
|
+
const handleValueChange = (newValues) => {
|
|
48
|
+
onChange(newValues.map((currentValue) => currentValue.value));
|
|
49
|
+
};
|
|
50
|
+
if (!id) id = _kebabCase(name);
|
|
51
|
+
return /* @__PURE__ */ React.createElement("div", { className: cn("flex flex-col gap-2", classNames == null ? void 0 : classNames.wrapper) }, label && /* @__PURE__ */ React.createElement(Label, { htmlFor: id, className: classNames == null ? void 0 : classNames.label, required }, label), /* @__PURE__ */ React.createElement(
|
|
52
|
+
MultiSelector,
|
|
53
|
+
{
|
|
54
|
+
values: selectedValues,
|
|
55
|
+
onValuesChange: handleValueChange,
|
|
56
|
+
loop,
|
|
57
|
+
disabled,
|
|
58
|
+
className: "p-0"
|
|
59
|
+
},
|
|
60
|
+
/* @__PURE__ */ React.createElement(Popover, null, /* @__PURE__ */ React.createElement(PopoverTrigger, { asChild: true }, /* @__PURE__ */ React.createElement(MultiSelectorTrigger, { className: cn("cursor-pointer", classNames == null ? void 0 : classNames.trigger) }, /* @__PURE__ */ React.createElement(
|
|
61
|
+
MultiSelectorInput,
|
|
62
|
+
{
|
|
63
|
+
id,
|
|
64
|
+
disabled,
|
|
65
|
+
placeholder: selectedValues.length === 0 ? placeholder : "",
|
|
66
|
+
className: classNames == null ? void 0 : classNames.input
|
|
67
|
+
}
|
|
68
|
+
))), /* @__PURE__ */ React.createElement(
|
|
69
|
+
PopoverContent,
|
|
70
|
+
{
|
|
71
|
+
align: "start",
|
|
72
|
+
className: cn("w-[var(--radix-popover-trigger-width)] p-0", classNames == null ? void 0 : classNames.content)
|
|
73
|
+
},
|
|
74
|
+
/* @__PURE__ */ React.createElement(MultiSelectorList, { className: "static relative border-none shadow-none" }, options.map((option) => /* @__PURE__ */ React.createElement(MultiSelectorItem, { key: option.value, value: option.value, label: option.label }, /* @__PURE__ */ React.createElement("span", null, option.label))))
|
|
75
|
+
))
|
|
76
|
+
));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export {
|
|
80
|
+
FormMultiSelect
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=chunk-3PZY5HRH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/form/multi-select.tsx"],"sourcesContent":["\"use client\";\nimport _isString from 'lodash-es/isString';\nimport _kebabCase from 'lodash-es/kebabCase';\nimport React from 'react';\n\nimport { cn } from '../../utils/ui';\nimport { Label } from '../ui/label';\nimport {\n MultiSelector,\n MultiSelectorInput,\n MultiSelectorItem,\n MultiSelectorList,\n MultiSelectorTrigger,\n type MultiSelectValue,\n} from '../ui/multi-select';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\n\nexport interface FormMultiSelectProps {\n id?: string;\n name: string;\n label?: string;\n placeholder?: string;\n data: MultiSelectValue[] | string[];\n value: string[];\n onChange: (values: string[]) => void;\n classNames?: {\n wrapper?: string;\n label?: string;\n trigger?: string;\n input?: string;\n content?: string;\n };\n required?: boolean;\n disabled?: boolean;\n loop?: boolean;\n}\n\nexport function FormMultiSelect({\n id,\n name,\n label,\n placeholder = 'Select options...',\n data,\n value = [],\n onChange,\n classNames,\n required,\n disabled,\n loop = false,\n}: FormMultiSelectProps) {\n const options: MultiSelectValue[] = React.useMemo(() => {\n if (!data || data.length === 0) return [];\n if (_isString(data[0])) {\n return (data as string[]).map((currentValue) => ({ label: currentValue, value: currentValue }));\n }\n return data as MultiSelectValue[];\n }, [data]);\n\n const selectedValues = React.useMemo(() => {\n return value\n .map((currentValue) => options.find((option) => option.value === currentValue))\n .filter((option): option is MultiSelectValue => !!option);\n }, [options, value]);\n\n const handleValueChange = (newValues: MultiSelectValue[]) => {\n onChange(newValues.map((currentValue) => currentValue.value));\n };\n\n if (!id) id = _kebabCase(name);\n\n return (\n <div className={cn('flex flex-col gap-2', classNames?.wrapper)}>\n {label && (\n <Label htmlFor={id} className={classNames?.label} required={required}>\n {label}\n </Label>\n )}\n\n <MultiSelector\n values={selectedValues}\n onValuesChange={handleValueChange}\n loop={loop}\n disabled={disabled}\n className=\"p-0\"\n >\n <Popover>\n <PopoverTrigger asChild>\n <MultiSelectorTrigger className={cn('cursor-pointer', classNames?.trigger)}>\n <MultiSelectorInput\n id={id}\n disabled={disabled}\n placeholder={selectedValues.length === 0 ? placeholder : ''}\n className={classNames?.input}\n />\n </MultiSelectorTrigger>\n </PopoverTrigger>\n\n <PopoverContent\n align=\"start\"\n className={cn('w-[var(--radix-popover-trigger-width)] p-0', classNames?.content)}\n >\n <MultiSelectorList className=\"static relative border-none shadow-none\">\n {options.map((option) => (\n <MultiSelectorItem key={option.value} value={option.value} label={option.label}>\n <span>{option.label}</span>\n </MultiSelectorItem>\n ))}\n </MultiSelectorList>\n </PopoverContent>\n </Popover>\n </MultiSelector>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AACA,OAAO,eAAe;AACtB,OAAO,gBAAgB;AACvB,OAAO,WAAW;AAkCX,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,QAAQ,CAAC;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAAyB;AACvB,QAAM,UAA8B,MAAM,QAAQ,MAAM;AACtD,QAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO,CAAC;AACxC,QAAI,UAAU,KAAK,CAAC,CAAC,GAAG;AACtB,aAAQ,KAAkB,IAAI,CAAC,kBAAkB,EAAE,OAAO,cAAc,OAAO,aAAa,EAAE;AAAA,IAChG;AACA,WAAO;AAAA,EACT,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,iBAAiB,MAAM,QAAQ,MAAM;AACzC,WAAO,MACJ,IAAI,CAAC,iBAAiB,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,YAAY,CAAC,EAC7E,OAAO,CAAC,WAAuC,CAAC,CAAC,MAAM;AAAA,EAC5D,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,QAAM,oBAAoB,CAAC,cAAkC;AAC3D,aAAS,UAAU,IAAI,CAAC,iBAAiB,aAAa,KAAK,CAAC;AAAA,EAC9D;AAEA,MAAI,CAAC,GAAI,MAAK,WAAW,IAAI;AAE7B,SACE,oCAAC,SAAI,WAAW,GAAG,uBAAuB,yCAAY,OAAO,KAC1D,SACC,oCAAC,SAAM,SAAS,IAAI,WAAW,yCAAY,OAAO,YAC/C,KACH,GAGF;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,MACA,WAAU;AAAA;AAAA,IAEV,oCAAC,eACC,oCAAC,kBAAe,SAAO,QACrB,oCAAC,wBAAqB,WAAW,GAAG,kBAAkB,yCAAY,OAAO,KACvE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,aAAa,eAAe,WAAW,IAAI,cAAc;AAAA,QACzD,WAAW,yCAAY;AAAA;AAAA,IACzB,CACF,CACF,GAEA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,WAAW,GAAG,8CAA8C,yCAAY,OAAO;AAAA;AAAA,MAE/E,oCAAC,qBAAkB,WAAU,6CAC1B,QAAQ,IAAI,CAAC,WACZ,oCAAC,qBAAkB,KAAK,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,SACvE,oCAAC,cAAM,OAAO,KAAM,CACtB,CACD,CACH;AAAA,IACF,CACF;AAAA,EACF,CACF;AAEJ;","names":[]}
|
|
@@ -2,29 +2,22 @@
|
|
|
2
2
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var _chunk2YMMYND2js = require('../../../chunk-2YMMYND2.js');
|
|
6
5
|
|
|
7
6
|
|
|
7
|
+
var _chunkLAIO3QZXjs = require('./chunk-LAIO3QZX.js');
|
|
8
8
|
|
|
9
9
|
|
|
10
|
+
var _chunk2YMMYND2js = require('./chunk-2YMMYND2.js');
|
|
10
11
|
|
|
11
|
-
var _chunkAJLAS62Xjs = require('../../../chunk-AJLAS62X.js');
|
|
12
|
-
require('../../../chunk-MJT6B7OJ.js');
|
|
13
|
-
require('../../../chunk-RFORRZRN.js');
|
|
14
|
-
require('../../../chunk-UFRPUC7K.js');
|
|
15
|
-
require('../../../chunk-RJG7QLDD.js');
|
|
16
|
-
require('../../../chunk-KB6BX6LA.js');
|
|
17
|
-
require('../../../chunk-GV62APQ6.js');
|
|
18
12
|
|
|
13
|
+
var _chunkPSPAJNNBjs = require('./chunk-PSPAJNNB.js');
|
|
19
14
|
|
|
20
|
-
var _chunkPSPAJNNBjs = require('../../../chunk-PSPAJNNB.js');
|
|
21
15
|
|
|
22
16
|
|
|
23
17
|
|
|
18
|
+
var _chunk2NMEKWO5js = require('./chunk-2NMEKWO5.js');
|
|
24
19
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
// components/ui/extension/multi-select.tsx
|
|
20
|
+
// components/ui/multi-select.tsx
|
|
28
21
|
var _iconsreact = require('@tabler/icons-react');
|
|
29
22
|
var _cmdk = require('cmdk');
|
|
30
23
|
var _react = require('react'); var _react2 = _interopRequireDefault(_react);
|
|
@@ -51,14 +44,16 @@ var MultiSelector = (_a) => {
|
|
|
51
44
|
loop = false,
|
|
52
45
|
className,
|
|
53
46
|
children,
|
|
54
|
-
dir
|
|
47
|
+
dir,
|
|
48
|
+
disabled = false
|
|
55
49
|
} = _b, props = _chunk2NMEKWO5js.__objRest.call(void 0, _b, [
|
|
56
50
|
"values",
|
|
57
51
|
"onValuesChange",
|
|
58
52
|
"loop",
|
|
59
53
|
"className",
|
|
60
54
|
"children",
|
|
61
|
-
"dir"
|
|
55
|
+
"dir",
|
|
56
|
+
"disabled"
|
|
62
57
|
]);
|
|
63
58
|
const [inputValue, setInputValue] = _react.useState.call(void 0, "");
|
|
64
59
|
const [open, setOpen] = _react.useState.call(void 0, false);
|
|
@@ -66,20 +61,21 @@ var MultiSelector = (_a) => {
|
|
|
66
61
|
const inputRef = _react2.default.useRef(null);
|
|
67
62
|
const onValueChangeHandler = _react.useCallback.call(void 0,
|
|
68
63
|
(val) => {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
64
|
+
if (disabled) return;
|
|
65
|
+
const exists = value.some((currentValue) => currentValue.value === val.value);
|
|
66
|
+
if (exists) {
|
|
67
|
+
onValueChange(value.filter((currentValue) => currentValue.value !== val.value));
|
|
72
68
|
} else {
|
|
73
69
|
onValueChange([...value, val]);
|
|
74
70
|
}
|
|
75
71
|
},
|
|
76
|
-
|
|
77
|
-
[value]
|
|
72
|
+
[disabled, onValueChange, value]
|
|
78
73
|
);
|
|
79
74
|
const handleKeyDown = _react.useCallback.call(void 0,
|
|
80
75
|
(e) => {
|
|
81
76
|
var _a2, _b2;
|
|
82
77
|
e.stopPropagation();
|
|
78
|
+
if (disabled) return;
|
|
83
79
|
const target = inputRef.current;
|
|
84
80
|
if (!target) return;
|
|
85
81
|
const selectionStart = (_a2 = target.selectionStart) != null ? _a2 : 0;
|
|
@@ -105,10 +101,8 @@ var MultiSelector = (_a) => {
|
|
|
105
101
|
if (value.length > 0 && (activeIndex !== -1 || loop)) {
|
|
106
102
|
moveNext();
|
|
107
103
|
}
|
|
108
|
-
} else {
|
|
109
|
-
|
|
110
|
-
movePrev();
|
|
111
|
-
}
|
|
104
|
+
} else if (value.length > 0 && target.selectionStart === 0) {
|
|
105
|
+
movePrev();
|
|
112
106
|
}
|
|
113
107
|
break;
|
|
114
108
|
case "ArrowRight":
|
|
@@ -116,10 +110,8 @@ var MultiSelector = (_a) => {
|
|
|
116
110
|
if (value.length > 0 && target.selectionStart === 0) {
|
|
117
111
|
movePrev();
|
|
118
112
|
}
|
|
119
|
-
} else {
|
|
120
|
-
|
|
121
|
-
moveNext();
|
|
122
|
-
}
|
|
113
|
+
} else if (value.length > 0 && (activeIndex !== -1 || loop)) {
|
|
114
|
+
moveNext();
|
|
123
115
|
}
|
|
124
116
|
break;
|
|
125
117
|
case "Backspace":
|
|
@@ -128,10 +120,8 @@ var MultiSelector = (_a) => {
|
|
|
128
120
|
if (activeIndex !== -1 && activeIndex < value.length) {
|
|
129
121
|
onValueChangeHandler(value[activeIndex]);
|
|
130
122
|
moveCurrent();
|
|
131
|
-
} else {
|
|
132
|
-
|
|
133
|
-
onValueChangeHandler(value[value.length - 1]);
|
|
134
|
-
}
|
|
123
|
+
} else if (target.selectionStart === 0) {
|
|
124
|
+
onValueChangeHandler(value[value.length - 1]);
|
|
135
125
|
}
|
|
136
126
|
}
|
|
137
127
|
break;
|
|
@@ -148,7 +138,7 @@ var MultiSelector = (_a) => {
|
|
|
148
138
|
break;
|
|
149
139
|
}
|
|
150
140
|
},
|
|
151
|
-
[
|
|
141
|
+
[activeIndex, dir, disabled, loop, onValueChangeHandler, open, value]
|
|
152
142
|
);
|
|
153
143
|
return /* @__PURE__ */ _react2.default.createElement(
|
|
154
144
|
MultiSelectContext.Provider,
|
|
@@ -162,14 +152,15 @@ var MultiSelector = (_a) => {
|
|
|
162
152
|
setInputValue,
|
|
163
153
|
activeIndex,
|
|
164
154
|
setActiveIndex,
|
|
165
|
-
ref: inputRef
|
|
155
|
+
ref: inputRef,
|
|
156
|
+
disabled
|
|
166
157
|
}
|
|
167
158
|
},
|
|
168
159
|
/* @__PURE__ */ _react2.default.createElement(
|
|
169
|
-
|
|
160
|
+
_chunkLAIO3QZXjs.Command,
|
|
170
161
|
_chunk2NMEKWO5js.__spreadValues.call(void 0, {
|
|
171
162
|
onKeyDown: handleKeyDown,
|
|
172
|
-
className: _chunkPSPAJNNBjs.cn.call(void 0, "
|
|
163
|
+
className: _chunkPSPAJNNBjs.cn.call(void 0, "flex flex-col overflow-visible bg-transparent", className),
|
|
173
164
|
dir
|
|
174
165
|
}, props),
|
|
175
166
|
children
|
|
@@ -179,7 +170,7 @@ var MultiSelector = (_a) => {
|
|
|
179
170
|
var MultiSelectorTrigger = _react.forwardRef.call(void 0,
|
|
180
171
|
(_a, ref) => {
|
|
181
172
|
var _b = _a, { className, children } = _b, props = _chunk2NMEKWO5js.__objRest.call(void 0, _b, ["className", "children"]);
|
|
182
|
-
const { value, onValueChange, activeIndex } = useMultiSelect();
|
|
173
|
+
const { value, onValueChange, activeIndex, disabled } = useMultiSelect();
|
|
183
174
|
const mousePreventDefault = _react.useCallback.call(void 0, (e) => {
|
|
184
175
|
e.preventDefault();
|
|
185
176
|
e.stopPropagation();
|
|
@@ -189,10 +180,9 @@ var MultiSelectorTrigger = _react.forwardRef.call(void 0,
|
|
|
189
180
|
_chunk2NMEKWO5js.__spreadValues.call(void 0, {
|
|
190
181
|
ref,
|
|
191
182
|
className: _chunkPSPAJNNBjs.cn.call(void 0,
|
|
192
|
-
"flex flex-wrap gap-1
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
},
|
|
183
|
+
"flex flex-wrap gap-1 rounded-lg border bg-background px-2 py-1",
|
|
184
|
+
activeIndex === -1 && "focus-within:ring-1 focus-within:ring-ring",
|
|
185
|
+
disabled && "cursor-not-allowed opacity-60",
|
|
196
186
|
className
|
|
197
187
|
)
|
|
198
188
|
}, props),
|
|
@@ -201,8 +191,8 @@ var MultiSelectorTrigger = _react.forwardRef.call(void 0,
|
|
|
201
191
|
{
|
|
202
192
|
key: item.value,
|
|
203
193
|
className: _chunkPSPAJNNBjs.cn.call(void 0,
|
|
204
|
-
"
|
|
205
|
-
activeIndex === index && "ring-2 ring-muted-foreground
|
|
194
|
+
"flex items-center gap-1 rounded-md px-1.5",
|
|
195
|
+
activeIndex === index && "ring-2 ring-muted-foreground"
|
|
206
196
|
),
|
|
207
197
|
variant: "secondary"
|
|
208
198
|
},
|
|
@@ -210,14 +200,19 @@ var MultiSelectorTrigger = _react.forwardRef.call(void 0,
|
|
|
210
200
|
/* @__PURE__ */ _react2.default.createElement(
|
|
211
201
|
"button",
|
|
212
202
|
{
|
|
213
|
-
"aria-label": `Remove ${item} option`,
|
|
214
|
-
"aria-roledescription": "button to remove option",
|
|
203
|
+
"aria-label": `Remove ${item.label} option`,
|
|
215
204
|
type: "button",
|
|
205
|
+
disabled,
|
|
216
206
|
onMouseDown: mousePreventDefault,
|
|
217
|
-
onClick: () =>
|
|
207
|
+
onClick: (event) => {
|
|
208
|
+
event.preventDefault();
|
|
209
|
+
event.stopPropagation();
|
|
210
|
+
onValueChange(item);
|
|
211
|
+
},
|
|
212
|
+
className: "inline-flex cursor-pointer items-center justify-center rounded-md p-1 transition-colors hover:bg-red-50 hover:text-red-700 focus-visible:bg-red-100 focus-visible:outline-none disabled:cursor-not-allowed"
|
|
218
213
|
},
|
|
219
214
|
/* @__PURE__ */ _react2.default.createElement("span", { className: "sr-only" }, "Remove ", item.label, " option"),
|
|
220
|
-
/* @__PURE__ */ _react2.default.createElement(_iconsreact.IconX, { className: "h-
|
|
215
|
+
/* @__PURE__ */ _react2.default.createElement(_iconsreact.IconX, { className: "h-3.5 w-3.5" })
|
|
221
216
|
)
|
|
222
217
|
)),
|
|
223
218
|
children
|
|
@@ -226,14 +221,15 @@ var MultiSelectorTrigger = _react.forwardRef.call(void 0,
|
|
|
226
221
|
);
|
|
227
222
|
MultiSelectorTrigger.displayName = "MultiSelectorTrigger";
|
|
228
223
|
var MultiSelectorInput = _react.forwardRef.call(void 0, (_a, ref) => {
|
|
229
|
-
var _b = _a, { className } = _b, props = _chunk2NMEKWO5js.__objRest.call(void 0, _b, ["className"]);
|
|
230
|
-
const { setOpen, inputValue, setInputValue, activeIndex, setActiveIndex, ref: inputRef } = useMultiSelect();
|
|
224
|
+
var _b = _a, { className, disabled: disabledProp } = _b, props = _chunk2NMEKWO5js.__objRest.call(void 0, _b, ["className", "disabled"]);
|
|
225
|
+
const { setOpen, inputValue, setInputValue, activeIndex, setActiveIndex, ref: inputRef, disabled } = useMultiSelect();
|
|
231
226
|
return /* @__PURE__ */ _react2.default.createElement(
|
|
232
227
|
_cmdk.Command.Input,
|
|
233
228
|
_chunk2NMEKWO5js.__spreadProps.call(void 0, _chunk2NMEKWO5js.__spreadValues.call(void 0, {}, props), {
|
|
234
229
|
tabIndex: 0,
|
|
235
230
|
ref: inputRef,
|
|
236
231
|
value: inputValue,
|
|
232
|
+
disabled: disabled || disabledProp,
|
|
237
233
|
onValueChange: activeIndex === -1 ? setInputValue : void 0,
|
|
238
234
|
onBlur: () => {
|
|
239
235
|
setInputValue("");
|
|
@@ -242,7 +238,7 @@ var MultiSelectorInput = _react.forwardRef.call(void 0, (_a, ref) => {
|
|
|
242
238
|
onFocus: () => setOpen(true),
|
|
243
239
|
onClick: () => setActiveIndex(-1),
|
|
244
240
|
className: _chunkPSPAJNNBjs.cn.call(void 0,
|
|
245
|
-
"
|
|
241
|
+
"flex-1 border-none bg-transparent p-0 text-sm outline-none placeholder:text-muted-foreground focus:outline-none focus:ring-0",
|
|
246
242
|
className,
|
|
247
243
|
activeIndex !== -1 && "caret-transparent"
|
|
248
244
|
)
|
|
@@ -252,41 +248,45 @@ var MultiSelectorInput = _react.forwardRef.call(void 0, (_a, ref) => {
|
|
|
252
248
|
MultiSelectorInput.displayName = "MultiSelectorInput";
|
|
253
249
|
var MultiSelectorContent = _react.forwardRef.call(void 0, ({ children }, ref) => {
|
|
254
250
|
const { open } = useMultiSelect();
|
|
255
|
-
|
|
251
|
+
if (!open) return null;
|
|
252
|
+
return /* @__PURE__ */ _react2.default.createElement("div", { ref, className: "relative" }, children);
|
|
256
253
|
});
|
|
257
254
|
MultiSelectorContent.displayName = "MultiSelectorContent";
|
|
258
255
|
var MultiSelectorList = _react.forwardRef.call(void 0, ({ className, children }, ref) => {
|
|
259
256
|
return /* @__PURE__ */ _react2.default.createElement(
|
|
260
|
-
|
|
257
|
+
_chunkLAIO3QZXjs.CommandList,
|
|
261
258
|
{
|
|
262
259
|
ref,
|
|
263
260
|
className: _chunkPSPAJNNBjs.cn.call(void 0,
|
|
264
|
-
"
|
|
261
|
+
"absolute top-0 z-100 flex w-full flex-col gap-2 rounded-md border border-muted bg-background p-2 shadow-md scrollbar-thin scrollbar-track-transparent scrollbar-thumb-rounded-lg scrollbar-thumb-muted-foreground transition-colors dark:scrollbar-thumb-muted",
|
|
265
262
|
className
|
|
266
263
|
)
|
|
267
264
|
},
|
|
268
265
|
children,
|
|
269
|
-
/* @__PURE__ */ _react2.default.createElement(
|
|
266
|
+
/* @__PURE__ */ _react2.default.createElement(_chunkLAIO3QZXjs.CommandEmpty, null, /* @__PURE__ */ _react2.default.createElement("span", { className: "text-muted-foreground" }, "No results found"))
|
|
270
267
|
);
|
|
271
268
|
});
|
|
272
269
|
MultiSelectorList.displayName = "MultiSelectorList";
|
|
273
270
|
var MultiSelectorItem = _react.forwardRef.call(void 0, (_a, ref) => {
|
|
274
|
-
var _b = _a, { className, value, label, children } = _b, props = _chunk2NMEKWO5js.__objRest.call(void 0, _b, ["className", "value", "label", "children"]);
|
|
275
|
-
const { value:
|
|
271
|
+
var _b = _a, { className, value, label, children, disabled: disabledProp } = _b, props = _chunk2NMEKWO5js.__objRest.call(void 0, _b, ["className", "value", "label", "children", "disabled"]);
|
|
272
|
+
const { value: options, onValueChange, setInputValue, disabled } = useMultiSelect();
|
|
276
273
|
const mousePreventDefault = _react.useCallback.call(void 0, (e) => {
|
|
277
274
|
e.preventDefault();
|
|
278
275
|
e.stopPropagation();
|
|
279
276
|
}, []);
|
|
280
|
-
const isIncluded = searchForValue(
|
|
277
|
+
const isIncluded = searchForValue(options, {
|
|
281
278
|
value,
|
|
282
279
|
label
|
|
283
280
|
}) !== -1;
|
|
281
|
+
const isDisabled = disabled || disabledProp;
|
|
284
282
|
return /* @__PURE__ */ _react2.default.createElement(
|
|
285
|
-
|
|
283
|
+
_chunkLAIO3QZXjs.CommandItem,
|
|
286
284
|
_chunk2NMEKWO5js.__spreadProps.call(void 0, _chunk2NMEKWO5js.__spreadValues.call(void 0, {
|
|
287
285
|
ref
|
|
288
286
|
}, props), {
|
|
287
|
+
disabled: isDisabled,
|
|
289
288
|
onSelect: () => {
|
|
289
|
+
if (isDisabled) return;
|
|
290
290
|
onValueChange({
|
|
291
291
|
value,
|
|
292
292
|
label
|
|
@@ -294,10 +294,10 @@ var MultiSelectorItem = _react.forwardRef.call(void 0, (_a, ref) => {
|
|
|
294
294
|
setInputValue("");
|
|
295
295
|
},
|
|
296
296
|
className: _chunkPSPAJNNBjs.cn.call(void 0,
|
|
297
|
-
"
|
|
297
|
+
"flex cursor-pointer justify-between rounded-md px-2 py-1 transition-colors",
|
|
298
298
|
className,
|
|
299
|
-
isIncluded && "opacity-50
|
|
300
|
-
|
|
299
|
+
isIncluded && "cursor-default opacity-50",
|
|
300
|
+
isDisabled && "cursor-not-allowed opacity-50"
|
|
301
301
|
),
|
|
302
302
|
onMouseDown: mousePreventDefault
|
|
303
303
|
}),
|
|
@@ -313,5 +313,6 @@ MultiSelectorItem.displayName = "MultiSelectorItem";
|
|
|
313
313
|
|
|
314
314
|
|
|
315
315
|
|
|
316
|
-
|
|
317
|
-
|
|
316
|
+
|
|
317
|
+
exports.MultiSelector = MultiSelector; exports.MultiSelectorTrigger = MultiSelectorTrigger; exports.MultiSelectorInput = MultiSelectorInput; exports.MultiSelectorContent = MultiSelectorContent; exports.MultiSelectorList = MultiSelectorList; exports.MultiSelectorItem = MultiSelectorItem;
|
|
318
|
+
//# sourceMappingURL=chunk-3TG6ZVFG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-3TG6ZVFG.js","../components/ui/multi-select.tsx"],"names":["_a","_b"],"mappings":"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","file":"/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-3TG6ZVFG.js","sourcesContent":[null,"\"use client\";\nimport { IconCheck, IconX } from '@tabler/icons-react';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport React, { type KeyboardEvent, createContext, forwardRef, useCallback, useContext, useState } from 'react';\n\nimport { cn } from '../../utils/ui';\nimport { Badge } from './badge';\nimport { Command, CommandEmpty, CommandItem, CommandList } from './command';\n\nexport type MultiSelectValue = {\n value: string;\n label: string;\n};\n\ninterface MultiSelectorProps extends React.ComponentPropsWithoutRef<typeof CommandPrimitive> {\n values: MultiSelectValue[];\n onValuesChange: (value: MultiSelectValue[]) => void;\n loop?: boolean;\n className?: string;\n children?: React.ReactNode;\n dir?: 'ltr' | 'rtl';\n disabled?: boolean;\n}\n\ninterface MultiSelectContextProps {\n value: MultiSelectValue[];\n onValueChange: (value: MultiSelectValue) => void;\n open: boolean;\n setOpen: (value: boolean) => void;\n inputValue: string;\n setInputValue: React.Dispatch<React.SetStateAction<string>>;\n activeIndex: number;\n setActiveIndex: React.Dispatch<React.SetStateAction<number>>;\n ref: React.RefObject<HTMLInputElement | null>;\n disabled: boolean;\n}\n\nconst MultiSelectContext = createContext<MultiSelectContextProps | null>(null);\n\nconst useMultiSelect = () => {\n const context = useContext(MultiSelectContext);\n if (!context) {\n throw new Error('useMultiSelect must be used within MultiSelectProvider');\n }\n return context;\n};\n\nfunction searchForValue(source: MultiSelectValue[], value: MultiSelectValue) {\n for (let i = 0; i < source.length; i++) {\n if (source[i].value === value.value) {\n return i;\n }\n }\n return -1;\n}\n\nconst MultiSelector = ({\n values: value,\n onValuesChange: onValueChange,\n loop = false,\n className,\n children,\n dir,\n disabled = false,\n ...props\n}: MultiSelectorProps) => {\n const [inputValue, setInputValue] = useState('');\n const [open, setOpen] = useState<boolean>(false);\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const onValueChangeHandler = useCallback(\n (val: MultiSelectValue) => {\n if (disabled) return;\n\n const exists = value.some((currentValue) => currentValue.value === val.value);\n if (exists) {\n onValueChange(value.filter((currentValue) => currentValue.value !== val.value));\n } else {\n onValueChange([...value, val]);\n }\n },\n [disabled, onValueChange, value],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n e.stopPropagation();\n\n if (disabled) return;\n\n const target = inputRef.current;\n\n if (!target) return;\n\n const selectionStart = target.selectionStart ?? 0;\n const selectionEnd = target.selectionEnd ?? 0;\n\n if (selectionStart !== selectionEnd) {\n return;\n }\n\n const moveNext = () => {\n const nextIndex = activeIndex + 1;\n setActiveIndex(nextIndex > value.length - 1 ? (loop ? 0 : -1) : nextIndex);\n };\n\n const movePrev = () => {\n const prevIndex = activeIndex - 1;\n setActiveIndex(prevIndex < 0 ? value.length - 1 : prevIndex);\n };\n\n const moveCurrent = () => {\n const newIndex = activeIndex - 1 <= 0 ? (value.length - 1 === 0 ? -1 : 0) : activeIndex - 1;\n setActiveIndex(newIndex);\n };\n\n switch (e.key) {\n case 'ArrowLeft':\n if (dir === 'rtl') {\n if (value.length > 0 && (activeIndex !== -1 || loop)) {\n moveNext();\n }\n } else if (value.length > 0 && target.selectionStart === 0) {\n movePrev();\n }\n break;\n\n case 'ArrowRight':\n if (dir === 'rtl') {\n if (value.length > 0 && target.selectionStart === 0) {\n movePrev();\n }\n } else if (value.length > 0 && (activeIndex !== -1 || loop)) {\n moveNext();\n }\n break;\n\n case 'Backspace':\n case 'Delete':\n if (value.length > 0) {\n if (activeIndex !== -1 && activeIndex < value.length) {\n onValueChangeHandler(value[activeIndex]);\n moveCurrent();\n } else if (target.selectionStart === 0) {\n onValueChangeHandler(value[value.length - 1]);\n }\n }\n break;\n\n case 'Enter':\n setOpen(true);\n break;\n\n case 'Escape':\n if (activeIndex !== -1) {\n setActiveIndex(-1);\n } else if (open) {\n setInputValue('');\n setOpen(false);\n }\n break;\n }\n },\n [activeIndex, dir, disabled, loop, onValueChangeHandler, open, value],\n );\n\n return (\n <MultiSelectContext.Provider\n value={{\n value,\n onValueChange: onValueChangeHandler,\n open,\n setOpen,\n inputValue,\n setInputValue,\n activeIndex,\n setActiveIndex,\n ref: inputRef,\n disabled,\n }}\n >\n <Command\n onKeyDown={handleKeyDown}\n className={cn('flex flex-col overflow-visible bg-transparent', className)}\n dir={dir}\n {...props}\n >\n {children}\n </Command>\n </MultiSelectContext.Provider>\n );\n};\n\nconst MultiSelectorTrigger = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => {\n const { value, onValueChange, activeIndex, disabled } = useMultiSelect();\n\n const mousePreventDefault = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-wrap gap-1 rounded-lg border bg-background px-2 py-1',\n activeIndex === -1 && 'focus-within:ring-1 focus-within:ring-ring',\n disabled && 'cursor-not-allowed opacity-60',\n className,\n )}\n {...props}\n >\n {value.map((item, index) => (\n <Badge\n key={item.value}\n className={cn(\n 'flex items-center gap-1 rounded-md px-1.5',\n activeIndex === index && 'ring-2 ring-muted-foreground',\n )}\n variant=\"secondary\"\n >\n <span className=\"text-xs\">{item.label}</span>\n <button\n aria-label={`Remove ${item.label} option`}\n type=\"button\"\n disabled={disabled}\n onMouseDown={mousePreventDefault}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n\n onValueChange(item);\n }}\n className=\"inline-flex cursor-pointer items-center justify-center rounded-md p-1 transition-colors hover:bg-red-50 hover:text-red-700 focus-visible:bg-red-100 focus-visible:outline-none disabled:cursor-not-allowed\"\n >\n <span className=\"sr-only\">Remove {item.label} option</span>\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </Badge>\n ))}\n {children}\n </div>\n );\n },\n);\n\nMultiSelectorTrigger.displayName = 'MultiSelectorTrigger';\n\nconst MultiSelectorInput = forwardRef<\n React.ElementRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, disabled: disabledProp, ...props }, ref) => {\n const { setOpen, inputValue, setInputValue, activeIndex, setActiveIndex, ref: inputRef, disabled } = useMultiSelect();\n\n return (\n <CommandPrimitive.Input\n {...props}\n tabIndex={0}\n ref={inputRef}\n value={inputValue}\n disabled={disabled || disabledProp}\n onValueChange={activeIndex === -1 ? setInputValue : undefined}\n onBlur={() => {\n setInputValue('');\n setOpen(false);\n }}\n onFocus={() => setOpen(true)}\n onClick={() => setActiveIndex(-1)}\n className={cn(\n 'flex-1 border-none bg-transparent p-0 text-sm outline-none placeholder:text-muted-foreground focus:outline-none focus:ring-0',\n className,\n activeIndex !== -1 && 'caret-transparent',\n )}\n />\n );\n});\n\nMultiSelectorInput.displayName = 'MultiSelectorInput';\n\nconst MultiSelectorContent = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ children }, ref) => {\n const { open } = useMultiSelect();\n\n if (!open) return null;\n\n return (\n <div ref={ref} className=\"relative\">\n {children}\n </div>\n );\n});\n\nMultiSelectorContent.displayName = 'MultiSelectorContent';\n\nconst MultiSelectorList = forwardRef<\n React.ElementRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, children }, ref) => {\n return (\n <CommandList\n ref={ref}\n className={cn(\n 'absolute top-0 z-100 flex w-full flex-col gap-2 rounded-md border border-muted bg-background p-2 shadow-md scrollbar-thin scrollbar-track-transparent scrollbar-thumb-rounded-lg scrollbar-thumb-muted-foreground transition-colors dark:scrollbar-thumb-muted',\n className,\n )}\n >\n {children}\n <CommandEmpty>\n <span className=\"text-muted-foreground\">No results found</span>\n </CommandEmpty>\n </CommandList>\n );\n});\n\nMultiSelectorList.displayName = 'MultiSelectorList';\n\nconst MultiSelectorItem = forwardRef<\n React.ElementRef<typeof CommandPrimitive.Item>,\n { value: string; label: string } & React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, value, label, children, disabled: disabledProp, ...props }, ref) => {\n const { value: options, onValueChange, setInputValue, disabled } = useMultiSelect();\n\n const mousePreventDefault = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const isIncluded =\n searchForValue(options, {\n value,\n label,\n }) !== -1;\n\n const isDisabled = disabled || disabledProp;\n\n return (\n <CommandItem\n ref={ref}\n {...props}\n disabled={isDisabled}\n onSelect={() => {\n if (isDisabled) return;\n\n onValueChange({\n value,\n label,\n });\n setInputValue('');\n }}\n className={cn(\n 'flex cursor-pointer justify-between rounded-md px-2 py-1 transition-colors',\n className,\n isIncluded && 'cursor-default opacity-50',\n isDisabled && 'cursor-not-allowed opacity-50',\n )}\n onMouseDown={mousePreventDefault}\n >\n {children}\n {isIncluded && <IconCheck className=\"h-4 w-4\" />}\n </CommandItem>\n );\n});\n\nMultiSelectorItem.displayName = 'MultiSelectorItem';\n\nexport {\n MultiSelector,\n MultiSelectorTrigger,\n MultiSelectorInput,\n MultiSelectorContent,\n MultiSelectorList,\n MultiSelectorItem,\n};\n"]}
|