@egose/shadcn-theme 0.1.6 → 0.1.8

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.
Files changed (94) hide show
  1. package/chunk-ELSPE6GB.mjs +43 -0
  2. package/chunk-ELSPE6GB.mjs.map +1 -0
  3. package/{chunk-3ZN766EW.js → chunk-G6WKPZTL.js} +3 -3
  4. package/{chunk-3ZN766EW.js.map → chunk-G6WKPZTL.js.map} +1 -1
  5. package/{chunk-AJLAS62X.js → chunk-LAIO3QZX.js} +4 -4
  6. package/{chunk-AJLAS62X.js.map → chunk-LAIO3QZX.js.map} +1 -1
  7. package/{chunk-MJT6B7OJ.js → chunk-LPDYWZN6.js} +3 -3
  8. package/{chunk-MJT6B7OJ.js.map → chunk-LPDYWZN6.js.map} +1 -1
  9. package/chunk-NCJI2DCV.mjs +130 -0
  10. package/chunk-NCJI2DCV.mjs.map +1 -0
  11. package/chunk-P6L4JTWO.js +44 -0
  12. package/chunk-P6L4JTWO.js.map +1 -0
  13. package/{chunk-432PQWGO.mjs → chunk-RJVQU443.mjs} +2 -2
  14. package/{components/ui/extension/multi-select.mjs → chunk-RNKMPQDZ.mjs} +66 -64
  15. package/chunk-RNKMPQDZ.mjs.map +1 -0
  16. package/chunk-RSFL2TUC.mjs +82 -0
  17. package/chunk-RSFL2TUC.mjs.map +1 -0
  18. package/chunk-S6HQ25BZ.js +83 -0
  19. package/chunk-S6HQ25BZ.js.map +1 -0
  20. package/chunk-WK4MG4VT.js +131 -0
  21. package/chunk-WK4MG4VT.js.map +1 -0
  22. package/{components/ui/extension/multi-select.js → chunk-WXEEDLLR.js} +78 -76
  23. package/chunk-WXEEDLLR.js.map +1 -0
  24. package/{chunk-HKZRXGJ7.mjs → chunk-YDRPNCWF.mjs} +4 -4
  25. package/{chunk-ZMMYQNQV.mjs → chunk-ZFBUIBJH.mjs} +2 -2
  26. package/components/form/hook-multi-select.d.mts +14 -0
  27. package/components/form/hook-multi-select.d.ts +14 -0
  28. package/components/form/hook-multi-select.js +76 -0
  29. package/components/form/hook-multi-select.js.map +1 -0
  30. package/components/form/hook-multi-select.mjs +75 -0
  31. package/components/form/hook-multi-select.mjs.map +1 -0
  32. package/components/form/hook-searchable-select.js +5 -5
  33. package/components/form/hook-searchable-select.mjs +4 -4
  34. package/components/form/hook-tag-picker.d.mts +12 -0
  35. package/components/form/hook-tag-picker.d.ts +12 -0
  36. package/components/form/hook-tag-picker.js +66 -0
  37. package/components/form/hook-tag-picker.js.map +1 -0
  38. package/components/form/hook-tag-picker.mjs +65 -0
  39. package/components/form/hook-tag-picker.mjs.map +1 -0
  40. package/components/form/multi-select.d.mts +25 -1
  41. package/components/form/multi-select.d.ts +25 -1
  42. package/components/form/multi-select.js +20 -1
  43. package/components/form/multi-select.js.map +1 -1
  44. package/components/form/multi-select.mjs +19 -0
  45. package/components/form/searchable-select.js +5 -5
  46. package/components/form/searchable-select.mjs +4 -4
  47. package/components/form/tag-picker.d.mts +21 -0
  48. package/components/form/tag-picker.d.ts +21 -0
  49. package/components/form/tag-picker.js +14 -0
  50. package/components/form/tag-picker.js.map +1 -0
  51. package/components/form/tag-picker.mjs +13 -0
  52. package/components/form/tag-picker.mjs.map +1 -0
  53. package/components/ui/combobox.js +5 -5
  54. package/components/ui/combobox.mjs +2 -2
  55. package/components/ui/command.js +4 -4
  56. package/components/ui/command.mjs +3 -3
  57. package/components/ui/input-group.js +3 -3
  58. package/components/ui/input-group.mjs +2 -2
  59. package/components/ui/multi-select.d.mts +54 -0
  60. package/components/ui/multi-select.d.ts +54 -0
  61. package/components/ui/multi-select.js +29 -0
  62. package/components/ui/multi-select.js.map +1 -0
  63. package/components/ui/multi-select.mjs +28 -0
  64. package/components/ui/multi-select.mjs.map +1 -0
  65. package/components/ui/tag-picker.d.mts +14 -0
  66. package/components/ui/tag-picker.d.ts +14 -0
  67. package/components/ui/tag-picker.js +12 -0
  68. package/components/ui/tag-picker.js.map +1 -0
  69. package/components/ui/tag-picker.mjs +11 -0
  70. package/components/ui/tag-picker.mjs.map +1 -0
  71. package/components/widgets/dialog-manager/index.js +1 -1
  72. package/components/widgets/dialog-manager/index.js.map +1 -1
  73. package/components/widgets/dialog-manager/index.mjs +1 -1
  74. package/layouts/sidebar1/app-sidebar.js +2 -2
  75. package/layouts/sidebar1/app-sidebar.mjs +2 -2
  76. package/layouts/sidebar1/context-switcher.js +1 -1
  77. package/layouts/sidebar1/context-switcher.mjs +1 -1
  78. package/layouts/sidebar1/index.js +3 -3
  79. package/layouts/sidebar1/index.js.map +1 -1
  80. package/layouts/sidebar1/index.mjs +3 -3
  81. package/layouts/sidebar1/nav-menus.js +1 -1
  82. package/layouts/sidebar1/nav-menus.mjs +1 -1
  83. package/layouts/sidebar1/nav-user.js +2 -2
  84. package/layouts/sidebar1/nav-user.mjs +2 -2
  85. package/layouts/simple/index.js +2 -2
  86. package/layouts/simple/index.mjs +3 -3
  87. package/package.json +1 -1
  88. package/components/ui/extension/multi-select.d.mts +0 -53
  89. package/components/ui/extension/multi-select.d.ts +0 -53
  90. package/components/ui/extension/multi-select.js.map +0 -1
  91. package/components/ui/extension/multi-select.mjs.map +0 -1
  92. /package/{chunk-432PQWGO.mjs.map → chunk-RJVQU443.mjs.map} +0 -0
  93. /package/{chunk-HKZRXGJ7.mjs.map → chunk-YDRPNCWF.mjs.map} +0 -0
  94. /package/{chunk-ZMMYQNQV.mjs.map → chunk-ZFBUIBJH.mjs.map} +0 -0
@@ -0,0 +1,131 @@
1
+ "use client";
2
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }
3
+
4
+ var _chunk2YMMYND2js = require('./chunk-2YMMYND2.js');
5
+
6
+
7
+ var _chunkPSPAJNNBjs = require('./chunk-PSPAJNNB.js');
8
+
9
+ // components/ui/tag-picker.tsx
10
+ var _react = require('react'); var React = _interopRequireWildcard(_react);
11
+ var _iconsreact = require('@tabler/icons-react');
12
+
13
+ function normalizeTagName(name) {
14
+ return name.replace(/\s+/g, " ").trim();
15
+ }
16
+ function TagPicker({
17
+ id,
18
+ value,
19
+ onChange,
20
+ suggestions = [],
21
+ placeholder = "Add tags...",
22
+ disabled = false,
23
+ className
24
+ }) {
25
+ const [inputValue, setInputValue] = _react.useState.call(void 0, "");
26
+ const [isFocused, setIsFocused] = _react.useState.call(void 0, false);
27
+ const selectedKeys = _react.useMemo.call(void 0, () => new Set(value.map((item) => item.toLocaleLowerCase())), [value]);
28
+ const normalizedInput = normalizeTagName(inputValue);
29
+ const normalizedInputKey = normalizedInput.toLocaleLowerCase();
30
+ const filteredSuggestions = _react.useMemo.call(void 0, () => {
31
+ return suggestions.filter((suggestion) => !selectedKeys.has(suggestion.toLocaleLowerCase())).filter((suggestion) => {
32
+ if (!normalizedInput) {
33
+ return true;
34
+ }
35
+ return suggestion.toLocaleLowerCase().includes(normalizedInputKey);
36
+ }).slice(0, 8);
37
+ }, [normalizedInput, normalizedInputKey, selectedKeys, suggestions]);
38
+ const canCreate = !!normalizedInput && !selectedKeys.has(normalizedInputKey) && !suggestions.some((suggestion) => suggestion.toLocaleLowerCase() === normalizedInputKey);
39
+ const addTag = (rawName) => {
40
+ const nextName = normalizeTagName(rawName);
41
+ if (!nextName) {
42
+ setInputValue("");
43
+ return;
44
+ }
45
+ const nextKey = nextName.toLocaleLowerCase();
46
+ const matchingSuggestion = suggestions.find((suggestion) => suggestion.toLocaleLowerCase() === nextKey);
47
+ const finalName = matchingSuggestion != null ? matchingSuggestion : nextName;
48
+ if (selectedKeys.has(finalName.toLocaleLowerCase())) {
49
+ setInputValue("");
50
+ return;
51
+ }
52
+ onChange([...value, finalName]);
53
+ setInputValue("");
54
+ };
55
+ const removeTag = (tagName) => {
56
+ onChange(value.filter((item) => item.toLocaleLowerCase() !== tagName.toLocaleLowerCase()));
57
+ };
58
+ const showMenu = !disabled && isFocused && (filteredSuggestions.length > 0 || canCreate);
59
+ return /* @__PURE__ */ React.createElement("div", { className: _chunkPSPAJNNBjs.cn.call(void 0, "space-y-2", className) }, /* @__PURE__ */ React.createElement("div", { className: "relative" }, /* @__PURE__ */ React.createElement(
60
+ "div",
61
+ {
62
+ className: _chunkPSPAJNNBjs.cn.call(void 0,
63
+ "flex min-h-8 flex-wrap items-center gap-1 rounded-lg border bg-background px-2 py-1 text-sm",
64
+ "focus-within:ring-1 focus-within:ring-ring",
65
+ disabled && "cursor-not-allowed opacity-60"
66
+ )
67
+ },
68
+ value.map((tagName) => /* @__PURE__ */ React.createElement(_chunk2YMMYND2js.Badge, { key: tagName, variant: "secondary", className: "flex items-center gap-1 rounded-md px-1.5" }, /* @__PURE__ */ React.createElement("span", { className: "text-xs" }, tagName), !disabled && /* @__PURE__ */ React.createElement(
69
+ "button",
70
+ {
71
+ type: "button",
72
+ 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",
73
+ onMouseDown: (event) => event.preventDefault(),
74
+ onClick: () => removeTag(tagName),
75
+ "aria-label": `Remove ${tagName}`
76
+ },
77
+ /* @__PURE__ */ React.createElement(_iconsreact.IconX, { className: "h-3.5 w-3.5" })
78
+ ))),
79
+ /* @__PURE__ */ React.createElement(
80
+ "input",
81
+ {
82
+ id,
83
+ value: inputValue,
84
+ disabled,
85
+ placeholder: value.length === 0 ? placeholder : "",
86
+ className: "min-w-24 flex-1 border-0 bg-transparent p-0 pl-1 text-sm outline-none placeholder:text-muted-foreground",
87
+ onFocus: () => setIsFocused(true),
88
+ onBlur: () => {
89
+ window.setTimeout(() => setIsFocused(false), 100);
90
+ },
91
+ onChange: (event) => setInputValue(event.target.value),
92
+ onKeyDown: (event) => {
93
+ if ((event.key === "Enter" || event.key === ",") && normalizedInput) {
94
+ event.preventDefault();
95
+ addTag(normalizedInput);
96
+ }
97
+ if (event.key === "Backspace" && !inputValue && value.length > 0) {
98
+ event.preventDefault();
99
+ removeTag(value[value.length - 1]);
100
+ }
101
+ }
102
+ }
103
+ )
104
+ ), showMenu && /* @__PURE__ */ React.createElement("div", { className: "absolute z-50 mt-1 w-full rounded-md border bg-background p-1 shadow-md" }, filteredSuggestions.map((suggestion) => /* @__PURE__ */ React.createElement(
105
+ "button",
106
+ {
107
+ key: suggestion,
108
+ type: "button",
109
+ className: "flex w-full items-center justify-between rounded-sm px-2 py-1.5 text-left text-sm hover:bg-muted",
110
+ onMouseDown: (event) => event.preventDefault(),
111
+ onClick: () => addTag(suggestion)
112
+ },
113
+ /* @__PURE__ */ React.createElement("span", null, suggestion),
114
+ /* @__PURE__ */ React.createElement("span", { className: "text-xs text-muted-foreground" }, "Existing")
115
+ )), canCreate && /* @__PURE__ */ React.createElement(
116
+ "button",
117
+ {
118
+ type: "button",
119
+ className: "flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-muted",
120
+ onMouseDown: (event) => event.preventDefault(),
121
+ onClick: () => addTag(normalizedInput)
122
+ },
123
+ /* @__PURE__ */ React.createElement(_iconsreact.IconPlus, { className: "h-3.5 w-3.5" }),
124
+ /* @__PURE__ */ React.createElement("span", null, 'Create "', normalizedInput, '"')
125
+ ))));
126
+ }
127
+
128
+
129
+
130
+ exports.TagPicker = TagPicker;
131
+ //# sourceMappingURL=chunk-WK4MG4VT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-WK4MG4VT.js","../components/ui/tag-picker.tsx"],"names":[],"mappings":"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","file":"/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-WK4MG4VT.js","sourcesContent":[null,"\"use client\";\nimport * as React from 'react';\nimport { IconPlus, IconX } from '@tabler/icons-react';\nimport { useMemo, useState } from 'react';\n\nimport { cn } from '../../utils/ui';\nimport { Badge } from './badge';\n\nfunction normalizeTagName(name: string) {\n return name.replace(/\\s+/g, ' ').trim();\n}\n\nexport interface TagPickerProps {\n id?: string;\n value: string[];\n onChange: (values: string[]) => void;\n suggestions?: string[];\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function TagPicker({\n id,\n value,\n onChange,\n suggestions = [],\n placeholder = 'Add tags...',\n disabled = false,\n className,\n}: TagPickerProps) {\n const [inputValue, setInputValue] = useState('');\n const [isFocused, setIsFocused] = useState(false);\n\n const selectedKeys = useMemo(() => new Set(value.map((item) => item.toLocaleLowerCase())), [value]);\n const normalizedInput = normalizeTagName(inputValue);\n const normalizedInputKey = normalizedInput.toLocaleLowerCase();\n\n const filteredSuggestions = useMemo(() => {\n return suggestions\n .filter((suggestion) => !selectedKeys.has(suggestion.toLocaleLowerCase()))\n .filter((suggestion) => {\n if (!normalizedInput) {\n return true;\n }\n return suggestion.toLocaleLowerCase().includes(normalizedInputKey);\n })\n .slice(0, 8);\n }, [normalizedInput, normalizedInputKey, selectedKeys, suggestions]);\n\n const canCreate =\n !!normalizedInput &&\n !selectedKeys.has(normalizedInputKey) &&\n !suggestions.some((suggestion) => suggestion.toLocaleLowerCase() === normalizedInputKey);\n\n const addTag = (rawName: string) => {\n const nextName = normalizeTagName(rawName);\n if (!nextName) {\n setInputValue('');\n return;\n }\n\n const nextKey = nextName.toLocaleLowerCase();\n const matchingSuggestion = suggestions.find((suggestion) => suggestion.toLocaleLowerCase() === nextKey);\n const finalName = matchingSuggestion ?? nextName;\n\n if (selectedKeys.has(finalName.toLocaleLowerCase())) {\n setInputValue('');\n return;\n }\n\n onChange([...value, finalName]);\n setInputValue('');\n };\n\n const removeTag = (tagName: string) => {\n onChange(value.filter((item) => item.toLocaleLowerCase() !== tagName.toLocaleLowerCase()));\n };\n\n const showMenu = !disabled && isFocused && (filteredSuggestions.length > 0 || canCreate);\n\n return (\n <div className={cn('space-y-2', className)}>\n <div className=\"relative\">\n <div\n className={cn(\n 'flex min-h-8 flex-wrap items-center gap-1 rounded-lg border bg-background px-2 py-1 text-sm',\n 'focus-within:ring-1 focus-within:ring-ring',\n disabled && 'cursor-not-allowed opacity-60',\n )}\n >\n {value.map((tagName) => (\n <Badge key={tagName} variant=\"secondary\" className=\"flex items-center gap-1 rounded-md px-1.5\">\n <span className=\"text-xs\">{tagName}</span>\n {!disabled && (\n <button\n type=\"button\"\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\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => removeTag(tagName)}\n aria-label={`Remove ${tagName}`}\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </Badge>\n ))}\n\n <input\n id={id}\n value={inputValue}\n disabled={disabled}\n placeholder={value.length === 0 ? placeholder : ''}\n className=\"min-w-24 flex-1 border-0 bg-transparent p-0 pl-1 text-sm outline-none placeholder:text-muted-foreground\"\n onFocus={() => setIsFocused(true)}\n onBlur={() => {\n window.setTimeout(() => setIsFocused(false), 100);\n }}\n onChange={(event) => setInputValue(event.target.value)}\n onKeyDown={(event) => {\n if ((event.key === 'Enter' || event.key === ',') && normalizedInput) {\n event.preventDefault();\n addTag(normalizedInput);\n }\n\n if (event.key === 'Backspace' && !inputValue && value.length > 0) {\n event.preventDefault();\n removeTag(value[value.length - 1]);\n }\n }}\n />\n </div>\n\n {showMenu && (\n <div className=\"absolute z-50 mt-1 w-full rounded-md border bg-background p-1 shadow-md\">\n {filteredSuggestions.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n className=\"flex w-full items-center justify-between rounded-sm px-2 py-1.5 text-left text-sm hover:bg-muted\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => addTag(suggestion)}\n >\n <span>{suggestion}</span>\n <span className=\"text-xs text-muted-foreground\">Existing</span>\n </button>\n ))}\n\n {canCreate && (\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-muted\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => addTag(normalizedInput)}\n >\n <IconPlus className=\"h-3.5 w-3.5\" />\n <span>Create &quot;{normalizedInput}&quot;</span>\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
@@ -1,33 +1,27 @@
1
1
  "use client";
2
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }
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
- var _chunk2NMEKWO5js = require('../../../chunk-2NMEKWO5.js');
26
-
27
- // components/ui/extension/multi-select.tsx
20
+ // components/ui/multi-select.tsx
21
+ var _react = require('react'); var React = _interopRequireWildcard(_react);
28
22
  var _iconsreact = require('@tabler/icons-react');
29
23
  var _cmdk = require('cmdk');
30
- var _react = require('react'); var _react2 = _interopRequireDefault(_react);
24
+
31
25
  var MultiSelectContext = _react.createContext.call(void 0, null);
32
26
  var useMultiSelect = () => {
33
27
  const context = _react.useContext.call(void 0, MultiSelectContext);
@@ -51,35 +45,38 @@ var MultiSelector = (_a) => {
51
45
  loop = false,
52
46
  className,
53
47
  children,
54
- dir
48
+ dir,
49
+ disabled = false
55
50
  } = _b, props = _chunk2NMEKWO5js.__objRest.call(void 0, _b, [
56
51
  "values",
57
52
  "onValuesChange",
58
53
  "loop",
59
54
  "className",
60
55
  "children",
61
- "dir"
56
+ "dir",
57
+ "disabled"
62
58
  ]);
63
59
  const [inputValue, setInputValue] = _react.useState.call(void 0, "");
64
60
  const [open, setOpen] = _react.useState.call(void 0, false);
65
61
  const [activeIndex, setActiveIndex] = _react.useState.call(void 0, -1);
66
- const inputRef = _react2.default.useRef(null);
62
+ const inputRef = React.useRef(null);
67
63
  const onValueChangeHandler = _react.useCallback.call(void 0,
68
64
  (val) => {
69
- const element = searchForValue(value, val);
70
- if (element !== -1) {
71
- onValueChange(value.filter((_, index) => index !== element));
65
+ if (disabled) return;
66
+ const exists = value.some((currentValue) => currentValue.value === val.value);
67
+ if (exists) {
68
+ onValueChange(value.filter((currentValue) => currentValue.value !== val.value));
72
69
  } else {
73
70
  onValueChange([...value, val]);
74
71
  }
75
72
  },
76
- // eslint-disable-next-line react-hooks/exhaustive-deps
77
- [value]
73
+ [disabled, onValueChange, value]
78
74
  );
79
75
  const handleKeyDown = _react.useCallback.call(void 0,
80
76
  (e) => {
81
77
  var _a2, _b2;
82
78
  e.stopPropagation();
79
+ if (disabled) return;
83
80
  const target = inputRef.current;
84
81
  if (!target) return;
85
82
  const selectionStart = (_a2 = target.selectionStart) != null ? _a2 : 0;
@@ -105,10 +102,8 @@ var MultiSelector = (_a) => {
105
102
  if (value.length > 0 && (activeIndex !== -1 || loop)) {
106
103
  moveNext();
107
104
  }
108
- } else {
109
- if (value.length > 0 && target.selectionStart === 0) {
110
- movePrev();
111
- }
105
+ } else if (value.length > 0 && target.selectionStart === 0) {
106
+ movePrev();
112
107
  }
113
108
  break;
114
109
  case "ArrowRight":
@@ -116,10 +111,8 @@ var MultiSelector = (_a) => {
116
111
  if (value.length > 0 && target.selectionStart === 0) {
117
112
  movePrev();
118
113
  }
119
- } else {
120
- if (value.length > 0 && (activeIndex !== -1 || loop)) {
121
- moveNext();
122
- }
114
+ } else if (value.length > 0 && (activeIndex !== -1 || loop)) {
115
+ moveNext();
123
116
  }
124
117
  break;
125
118
  case "Backspace":
@@ -128,10 +121,8 @@ var MultiSelector = (_a) => {
128
121
  if (activeIndex !== -1 && activeIndex < value.length) {
129
122
  onValueChangeHandler(value[activeIndex]);
130
123
  moveCurrent();
131
- } else {
132
- if (target.selectionStart === 0) {
133
- onValueChangeHandler(value[value.length - 1]);
134
- }
124
+ } else if (target.selectionStart === 0) {
125
+ onValueChangeHandler(value[value.length - 1]);
135
126
  }
136
127
  }
137
128
  break;
@@ -148,9 +139,9 @@ var MultiSelector = (_a) => {
148
139
  break;
149
140
  }
150
141
  },
151
- [value, activeIndex, loop]
142
+ [activeIndex, dir, disabled, loop, onValueChangeHandler, open, value]
152
143
  );
153
- return /* @__PURE__ */ _react2.default.createElement(
144
+ return /* @__PURE__ */ React.createElement(
154
145
  MultiSelectContext.Provider,
155
146
  {
156
147
  value: {
@@ -162,14 +153,15 @@ var MultiSelector = (_a) => {
162
153
  setInputValue,
163
154
  activeIndex,
164
155
  setActiveIndex,
165
- ref: inputRef
156
+ ref: inputRef,
157
+ disabled
166
158
  }
167
159
  },
168
- /* @__PURE__ */ _react2.default.createElement(
169
- _chunkAJLAS62Xjs.Command,
160
+ /* @__PURE__ */ React.createElement(
161
+ _chunkLAIO3QZXjs.Command,
170
162
  _chunk2NMEKWO5js.__spreadValues.call(void 0, {
171
163
  onKeyDown: handleKeyDown,
172
- className: _chunkPSPAJNNBjs.cn.call(void 0, "overflow-visible bg-transparent flex flex-col space-y-2", className),
164
+ className: _chunkPSPAJNNBjs.cn.call(void 0, "flex flex-col overflow-visible bg-transparent", className),
173
165
  dir
174
166
  }, props),
175
167
  children
@@ -179,45 +171,49 @@ var MultiSelector = (_a) => {
179
171
  var MultiSelectorTrigger = _react.forwardRef.call(void 0,
180
172
  (_a, ref) => {
181
173
  var _b = _a, { className, children } = _b, props = _chunk2NMEKWO5js.__objRest.call(void 0, _b, ["className", "children"]);
182
- const { value, onValueChange, activeIndex } = useMultiSelect();
174
+ const { value, onValueChange, activeIndex, disabled } = useMultiSelect();
183
175
  const mousePreventDefault = _react.useCallback.call(void 0, (e) => {
184
176
  e.preventDefault();
185
177
  e.stopPropagation();
186
178
  }, []);
187
- return /* @__PURE__ */ _react2.default.createElement(
179
+ return /* @__PURE__ */ React.createElement(
188
180
  "div",
189
181
  _chunk2NMEKWO5js.__spreadValues.call(void 0, {
190
182
  ref,
191
183
  className: _chunkPSPAJNNBjs.cn.call(void 0,
192
- "flex flex-wrap gap-1 px-2 py-2 ring-1 ring-muted rounded-lg bg-background border rounded-sm",
193
- {
194
- "ring-1 focus-within:ring-ring": activeIndex === -1
195
- },
184
+ "flex flex-wrap gap-1 rounded-lg border bg-background px-2 py-1",
185
+ activeIndex === -1 && "focus-within:ring-1 focus-within:ring-ring",
186
+ disabled && "cursor-not-allowed opacity-60",
196
187
  className
197
188
  )
198
189
  }, props),
199
- value.map((item, index) => /* @__PURE__ */ _react2.default.createElement(
190
+ value.map((item, index) => /* @__PURE__ */ React.createElement(
200
191
  _chunk2YMMYND2js.Badge,
201
192
  {
202
193
  key: item.value,
203
194
  className: _chunkPSPAJNNBjs.cn.call(void 0,
204
- "px-1.5 rounded-md flex items-center gap-1",
205
- activeIndex === index && "ring-2 ring-muted-foreground "
195
+ "flex items-center gap-1 rounded-md px-1.5",
196
+ activeIndex === index && "ring-2 ring-muted-foreground"
206
197
  ),
207
198
  variant: "secondary"
208
199
  },
209
- /* @__PURE__ */ _react2.default.createElement("span", { className: "text-xs" }, item.label),
210
- /* @__PURE__ */ _react2.default.createElement(
200
+ /* @__PURE__ */ React.createElement("span", { className: "text-xs" }, item.label),
201
+ /* @__PURE__ */ React.createElement(
211
202
  "button",
212
203
  {
213
- "aria-label": `Remove ${item} option`,
214
- "aria-roledescription": "button to remove option",
204
+ "aria-label": `Remove ${item.label} option`,
215
205
  type: "button",
206
+ disabled,
216
207
  onMouseDown: mousePreventDefault,
217
- onClick: () => onValueChange(item)
208
+ onClick: (event) => {
209
+ event.preventDefault();
210
+ event.stopPropagation();
211
+ onValueChange(item);
212
+ },
213
+ 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
214
  },
219
- /* @__PURE__ */ _react2.default.createElement("span", { className: "sr-only" }, "Remove ", item.label, " option"),
220
- /* @__PURE__ */ _react2.default.createElement(_iconsreact.IconX, { className: "h-4 w-4 hover:stroke-destructive" })
215
+ /* @__PURE__ */ React.createElement("span", { className: "sr-only" }, "Remove ", item.label, " option"),
216
+ /* @__PURE__ */ React.createElement(_iconsreact.IconX, { className: "h-3.5 w-3.5" })
221
217
  )
222
218
  )),
223
219
  children
@@ -226,14 +222,15 @@ var MultiSelectorTrigger = _react.forwardRef.call(void 0,
226
222
  );
227
223
  MultiSelectorTrigger.displayName = "MultiSelectorTrigger";
228
224
  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();
231
- return /* @__PURE__ */ _react2.default.createElement(
225
+ var _b = _a, { className, disabled: disabledProp } = _b, props = _chunk2NMEKWO5js.__objRest.call(void 0, _b, ["className", "disabled"]);
226
+ const { setOpen, inputValue, setInputValue, activeIndex, setActiveIndex, ref: inputRef, disabled } = useMultiSelect();
227
+ return /* @__PURE__ */ React.createElement(
232
228
  _cmdk.Command.Input,
233
229
  _chunk2NMEKWO5js.__spreadProps.call(void 0, _chunk2NMEKWO5js.__spreadValues.call(void 0, {}, props), {
234
230
  tabIndex: 0,
235
231
  ref: inputRef,
236
232
  value: inputValue,
233
+ disabled: disabled || disabledProp,
237
234
  onValueChange: activeIndex === -1 ? setInputValue : void 0,
238
235
  onBlur: () => {
239
236
  setInputValue("");
@@ -242,7 +239,7 @@ var MultiSelectorInput = _react.forwardRef.call(void 0, (_a, ref) => {
242
239
  onFocus: () => setOpen(true),
243
240
  onClick: () => setActiveIndex(-1),
244
241
  className: _chunkPSPAJNNBjs.cn.call(void 0,
245
- "p-0 bg-transparent border-none outline-none focus:outline-none focus:ring-0 placeholder:text-muted-foreground flex-1 text-sm",
242
+ "flex-1 border-none bg-transparent p-0 text-sm outline-none placeholder:text-muted-foreground focus:outline-none focus:ring-0",
246
243
  className,
247
244
  activeIndex !== -1 && "caret-transparent"
248
245
  )
@@ -252,41 +249,45 @@ var MultiSelectorInput = _react.forwardRef.call(void 0, (_a, ref) => {
252
249
  MultiSelectorInput.displayName = "MultiSelectorInput";
253
250
  var MultiSelectorContent = _react.forwardRef.call(void 0, ({ children }, ref) => {
254
251
  const { open } = useMultiSelect();
255
- return /* @__PURE__ */ _react2.default.createElement("div", { ref, className: "relative" }, open ? children : null);
252
+ if (!open) return null;
253
+ return /* @__PURE__ */ React.createElement("div", { ref, className: "relative" }, children);
256
254
  });
257
255
  MultiSelectorContent.displayName = "MultiSelectorContent";
258
256
  var MultiSelectorList = _react.forwardRef.call(void 0, ({ className, children }, ref) => {
259
- return /* @__PURE__ */ _react2.default.createElement(
260
- _chunkAJLAS62Xjs.CommandList,
257
+ return /* @__PURE__ */ React.createElement(
258
+ _chunkLAIO3QZXjs.CommandList,
261
259
  {
262
260
  ref,
263
261
  className: _chunkPSPAJNNBjs.cn.call(void 0,
264
- "p-2 flex flex-col gap-2 rounded-md scrollbar-thin scrollbar-track-transparent transition-colors scrollbar-thumb-muted-foreground dark:scrollbar-thumb-muted scrollbar-thumb-rounded-lg w-full absolute bg-background shadow-md z-100 border border-muted top-0",
262
+ "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
263
  className
266
264
  )
267
265
  },
268
266
  children,
269
- /* @__PURE__ */ _react2.default.createElement(_chunkAJLAS62Xjs.CommandEmpty, null, /* @__PURE__ */ _react2.default.createElement("span", { className: "text-muted-foreground" }, "No results found"))
267
+ /* @__PURE__ */ React.createElement(_chunkLAIO3QZXjs.CommandEmpty, null, /* @__PURE__ */ React.createElement("span", { className: "text-muted-foreground" }, "No results found"))
270
268
  );
271
269
  });
272
270
  MultiSelectorList.displayName = "MultiSelectorList";
273
271
  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: Options, onValueChange, setInputValue } = useMultiSelect();
272
+ var _b = _a, { className, value, label, children, disabled: disabledProp } = _b, props = _chunk2NMEKWO5js.__objRest.call(void 0, _b, ["className", "value", "label", "children", "disabled"]);
273
+ const { value: options, onValueChange, setInputValue, disabled } = useMultiSelect();
276
274
  const mousePreventDefault = _react.useCallback.call(void 0, (e) => {
277
275
  e.preventDefault();
278
276
  e.stopPropagation();
279
277
  }, []);
280
- const isIncluded = searchForValue(Options, {
278
+ const isIncluded = searchForValue(options, {
281
279
  value,
282
280
  label
283
281
  }) !== -1;
284
- return /* @__PURE__ */ _react2.default.createElement(
285
- _chunkAJLAS62Xjs.CommandItem,
282
+ const isDisabled = disabled || disabledProp;
283
+ return /* @__PURE__ */ React.createElement(
284
+ _chunkLAIO3QZXjs.CommandItem,
286
285
  _chunk2NMEKWO5js.__spreadProps.call(void 0, _chunk2NMEKWO5js.__spreadValues.call(void 0, {
287
286
  ref
288
287
  }, props), {
288
+ disabled: isDisabled,
289
289
  onSelect: () => {
290
+ if (isDisabled) return;
290
291
  onValueChange({
291
292
  value,
292
293
  label
@@ -294,15 +295,15 @@ var MultiSelectorItem = _react.forwardRef.call(void 0, (_a, ref) => {
294
295
  setInputValue("");
295
296
  },
296
297
  className: _chunkPSPAJNNBjs.cn.call(void 0,
297
- "rounded-md cursor-pointer px-2 py-1 transition-colors flex justify-between",
298
+ "flex cursor-pointer justify-between rounded-md px-2 py-1 transition-colors",
298
299
  className,
299
- isIncluded && "opacity-50 cursor-default",
300
- props.disabled && "opacity-50 cursor-not-allowed"
300
+ isIncluded && "cursor-default opacity-50",
301
+ isDisabled && "cursor-not-allowed opacity-50"
301
302
  ),
302
303
  onMouseDown: mousePreventDefault
303
304
  }),
304
305
  children,
305
- isIncluded && /* @__PURE__ */ _react2.default.createElement(_iconsreact.IconCheck, { className: "h-4 w-4" })
306
+ isIncluded && /* @__PURE__ */ React.createElement(_iconsreact.IconCheck, { className: "h-4 w-4" })
306
307
  );
307
308
  });
308
309
  MultiSelectorItem.displayName = "MultiSelectorItem";
@@ -313,5 +314,6 @@ MultiSelectorItem.displayName = "MultiSelectorItem";
313
314
 
314
315
 
315
316
 
316
- exports.MultiSelector = MultiSelector; exports.MultiSelectorContent = MultiSelectorContent; exports.MultiSelectorInput = MultiSelectorInput; exports.MultiSelectorItem = MultiSelectorItem; exports.MultiSelectorList = MultiSelectorList; exports.MultiSelectorTrigger = MultiSelectorTrigger;
317
- //# sourceMappingURL=multi-select.js.map
317
+
318
+ exports.MultiSelector = MultiSelector; exports.MultiSelectorTrigger = MultiSelectorTrigger; exports.MultiSelectorInput = MultiSelectorInput; exports.MultiSelectorContent = MultiSelectorContent; exports.MultiSelectorList = MultiSelectorList; exports.MultiSelectorItem = MultiSelectorItem;
319
+ //# sourceMappingURL=chunk-WXEEDLLR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-WXEEDLLR.js","../components/ui/multi-select.tsx"],"names":["_a","_b"],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACF,sDAA4B;AAC5B;AACA;ACjBA,2EAAuB;AACvB,iDAAiC;AACjC,4BAA4C;AAC5C;AAkCA,IAAM,mBAAA,EAAqB,kCAAA,IAAkD,CAAA;AAE7E,IAAM,eAAA,EAAiB,CAAA,EAAA,GAAM;AAC3B,EAAA,MAAM,QAAA,EAAU,+BAAA,kBAA6B,CAAA;AAC7C,EAAA,GAAA,CAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,wDAAwD,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,OAAA;AACT,CAAA;AAEA,SAAS,cAAA,CAAe,MAAA,EAA4B,KAAA,EAAyB;AAC3E,EAAA,IAAA,CAAA,IAAS,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,MAAA,IAAU,KAAA,CAAM,KAAA,EAAO;AACnC,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,CAAA,CAAA;AACT;AAEA,IAAM,cAAA,EAAgB,CAAC,EAAA,EAAA,GASG;AATH,EAAA,IAAA,GAAA,EAAA,EAAA,EACrB;AAAA,IAAA,MAAA,EAAQ,KAAA;AAAA,IACR,cAAA,EAAgB,aAAA;AAAA,IAChB,KAAA,EAAO,KAAA;AAAA,IACP,SAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAA;AAAA,IACA,SAAA,EAAW;AAAA,EAhEb,EAAA,EAyDuB,EAAA,EAQlB,MAAA,EAAA,wCAAA,EARkB,EAQlB;AAAA,IAPH,QAAA;AAAA,IACA,gBAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,EAAA,CAAA,CAAA;AAGA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,EAAA,EAAI,6BAAA,EAAW,CAAA;AAC/C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,EAAA,EAAI,6BAAA,KAAuB,CAAA;AAC/C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,EAAA,EAAI,6BAAA,CAAiB,CAAE,CAAA;AACzD,EAAA,MAAM,SAAA,EAAiB,KAAA,CAAA,MAAA,CAAyB,IAAI,CAAA;AAEpD,EAAA,MAAM,qBAAA,EAAuB,gCAAA;AAAA,IAC3B,CAAC,GAAA,EAAA,GAA0B;AACzB,MAAA,GAAA,CAAI,QAAA,EAAU,MAAA;AAEd,MAAA,MAAM,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,CAAC,YAAA,EAAA,GAAiB,YAAA,CAAa,MAAA,IAAU,GAAA,CAAI,KAAK,CAAA;AAC5E,MAAA,GAAA,CAAI,MAAA,EAAQ;AACV,QAAA,aAAA,CAAc,KAAA,CAAM,MAAA,CAAO,CAAC,YAAA,EAAA,GAAiB,YAAA,CAAa,MAAA,IAAU,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,MAChF,EAAA,KAAO;AACL,QAAA,aAAA,CAAc,CAAC,GAAG,KAAA,EAAO,GAAG,CAAC,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,aAAA,EAAe,KAAK;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,cAAA,EAAgB,gCAAA;AAAA,IACpB,CAAC,CAAA,EAAA,GAAqC;AAvF1C,MAAA,IAAAA,GAAAA,EAAAC,GAAAA;AAwFM,MAAA,CAAA,CAAE,eAAA,CAAgB,CAAA;AAElB,MAAA,GAAA,CAAI,QAAA,EAAU,MAAA;AAEd,MAAA,MAAM,OAAA,EAAS,QAAA,CAAS,OAAA;AAExB,MAAA,GAAA,CAAI,CAAC,MAAA,EAAQ,MAAA;AAEb,MAAA,MAAM,eAAA,EAAA,CAAiBD,IAAAA,EAAA,MAAA,CAAO,cAAA,EAAA,GAAP,KAAA,EAAAA,IAAAA,EAAyB,CAAA;AAChD,MAAA,MAAM,aAAA,EAAA,CAAeC,IAAAA,EAAA,MAAA,CAAO,YAAA,EAAA,GAAP,KAAA,EAAAA,IAAAA,EAAuB,CAAA;AAE5C,MAAA,GAAA,CAAI,eAAA,IAAmB,YAAA,EAAc;AACnC,QAAA,MAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,EAAW,CAAA,EAAA,GAAM;AACrB,QAAA,MAAM,UAAA,EAAY,YAAA,EAAc,CAAA;AAChC,QAAA,cAAA,CAAe,UAAA,EAAY,KAAA,CAAM,OAAA,EAAS,EAAA,EAAK,KAAA,EAAO,EAAA,EAAI,CAAA,EAAA,EAAM,SAAS,CAAA;AAAA,MAC3E,CAAA;AAEA,MAAA,MAAM,SAAA,EAAW,CAAA,EAAA,GAAM;AACrB,QAAA,MAAM,UAAA,EAAY,YAAA,EAAc,CAAA;AAChC,QAAA,cAAA,CAAe,UAAA,EAAY,EAAA,EAAI,KAAA,CAAM,OAAA,EAAS,EAAA,EAAI,SAAS,CAAA;AAAA,MAC7D,CAAA;AAEA,MAAA,MAAM,YAAA,EAAc,CAAA,EAAA,GAAM;AACxB,QAAA,MAAM,SAAA,EAAW,YAAA,EAAc,EAAA,GAAK,EAAA,EAAK,KAAA,CAAM,OAAA,EAAS,EAAA,IAAM,EAAA,EAAI,CAAA,EAAA,EAAK,EAAA,EAAK,YAAA,EAAc,CAAA;AAC1F,QAAA,cAAA,CAAe,QAAQ,CAAA;AAAA,MACzB,CAAA;AAEA,MAAA,OAAA,CAAQ,CAAA,CAAE,GAAA,EAAK;AAAA,QACb,KAAK,WAAA;AACH,UAAA,GAAA,CAAI,IAAA,IAAQ,KAAA,EAAO;AACjB,YAAA,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,EAAA,GAAA,CAAM,YAAA,IAAgB,CAAA,EAAA,GAAM,IAAA,CAAA,EAAO;AACpD,cAAA,QAAA,CAAS,CAAA;AAAA,YACX;AAAA,UACF,EAAA,KAAA,GAAA,CAAW,KAAA,CAAM,OAAA,EAAS,EAAA,GAAK,MAAA,CAAO,eAAA,IAAmB,CAAA,EAAG;AAC1D,YAAA,QAAA,CAAS,CAAA;AAAA,UACX;AACA,UAAA,KAAA;AAAA,QAEF,KAAK,YAAA;AACH,UAAA,GAAA,CAAI,IAAA,IAAQ,KAAA,EAAO;AACjB,YAAA,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,EAAA,GAAK,MAAA,CAAO,eAAA,IAAmB,CAAA,EAAG;AACnD,cAAA,QAAA,CAAS,CAAA;AAAA,YACX;AAAA,UACF,EAAA,KAAA,GAAA,CAAW,KAAA,CAAM,OAAA,EAAS,EAAA,GAAA,CAAM,YAAA,IAAgB,CAAA,EAAA,GAAM,IAAA,CAAA,EAAO;AAC3D,YAAA,QAAA,CAAS,CAAA;AAAA,UACX;AACA,UAAA,KAAA;AAAA,QAEF,KAAK,WAAA;AAAA,QACL,KAAK,QAAA;AACH,UAAA,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG;AACpB,YAAA,GAAA,CAAI,YAAA,IAAgB,CAAA,EAAA,GAAM,YAAA,EAAc,KAAA,CAAM,MAAA,EAAQ;AACpD,cAAA,oBAAA,CAAqB,KAAA,CAAM,WAAW,CAAC,CAAA;AACvC,cAAA,WAAA,CAAY,CAAA;AAAA,YACd,EAAA,KAAA,GAAA,CAAW,MAAA,CAAO,eAAA,IAAmB,CAAA,EAAG;AACtC,cAAA,oBAAA,CAAqB,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,CAAC,CAAC,CAAA;AAAA,YAC9C;AAAA,UACF;AACA,UAAA,KAAA;AAAA,QAEF,KAAK,OAAA;AACH,UAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,UAAA,KAAA;AAAA,QAEF,KAAK,QAAA;AACH,UAAA,GAAA,CAAI,YAAA,IAAgB,CAAA,CAAA,EAAI;AACtB,YAAA,cAAA,CAAe,CAAA,CAAE,CAAA;AAAA,UACnB,EAAA,KAAA,GAAA,CAAW,IAAA,EAAM;AACf,YAAA,aAAA,CAAc,EAAE,CAAA;AAChB,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,UACf;AACA,UAAA,KAAA;AAAA,MACJ;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,oBAAA,EAAsB,IAAA,EAAM,KAAK;AAAA,EACtE,CAAA;AAEA,EAAA,uBACE,KAAA,CAAA,aAAA;AAAA,IAAC,kBAAA,CAAmB,QAAA;AAAA,IAAnB;AAAA,MACC,KAAA,EAAO;AAAA,QACL,KAAA;AAAA,QACA,aAAA,EAAe,oBAAA;AAAA,QACf,IAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA;AAAA,QACA,aAAA;AAAA,QACA,WAAA;AAAA,QACA,cAAA;AAAA,QACA,GAAA,EAAK,QAAA;AAAA,QACL;AAAA,MACF;AAAA,IAAA,CAAA;AAAA,oBAEA,KAAA,CAAA,aAAA;AAAA,MAAC,wBAAA;AAAA,MAAA,6CAAA;AAAA,QACC,SAAA,EAAW,aAAA;AAAA,QACX,SAAA,EAAW,iCAAA,+CAAG,EAAiD,SAAS,CAAA;AAAA,QACxE;AAAA,MAAA,CAAA,EACI,KAAA,CAAA;AAAA,MAEH;AAAA,IACH;AAAA,EACF,CAAA;AAEJ,CAAA;AAEA,IAAM,qBAAA,EAAuB,+BAAA;AAAA,EAC3B,CAAC,EAAA,EAAmC,GAAA,EAAA,GAAQ;AAA3C,IAAA,IAAA,GAAA,EAAA,EAAA,EAAE,EAAA,SAAA,EAAW,SApMhB,EAAA,EAoMG,EAAA,EAA0B,MAAA,EAAA,wCAAA,EAA1B,EAA0B,CAAxB,WAAA,EAAW,UAAA,CAAA,CAAA;AACZ,IAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,WAAA,EAAa,SAAS,EAAA,EAAI,cAAA,CAAe,CAAA;AAEvE,IAAA,MAAM,oBAAA,EAAsB,gCAAA,CAAa,CAAA,EAAA,GAAwB;AAC/D,MAAA,CAAA,CAAE,cAAA,CAAe,CAAA;AACjB,MAAA,CAAA,CAAE,eAAA,CAAgB,CAAA;AAAA,IACpB,CAAA,EAAG,CAAC,CAAC,CAAA;AAEL,IAAA,uBACE,KAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA,6CAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,iCAAA;AAAA,UACT,gEAAA;AAAA,UACA,YAAA,IAAgB,CAAA,EAAA,GAAM,4CAAA;AAAA,UACtB,SAAA,GAAY,+BAAA;AAAA,UACZ;AAAA,QACF;AAAA,MAAA,CAAA,EACI,KAAA,CAAA;AAAA,MAEH,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,EAAA,mBAChB,KAAA,CAAA,aAAA;AAAA,QAAC,sBAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,IAAA,CAAK,KAAA;AAAA,UACV,SAAA,EAAW,iCAAA;AAAA,YACT,2CAAA;AAAA,YACA,YAAA,IAAgB,MAAA,GAAS;AAAA,UAC3B,CAAA;AAAA,UACA,OAAA,EAAQ;AAAA,QAAA,CAAA;AAAA,wBAER,KAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,CAAA,EAAW,IAAA,CAAK,KAAM,CAAA;AAAA,wBACtC,KAAA,CAAA,aAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAY,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,OAAA,CAAA;AAAA,YAChC,IAAA,EAAK,QAAA;AAAA,YACL,QAAA;AAAA,YACA,WAAA,EAAa,mBAAA;AAAA,YACb,OAAA,EAAS,CAAC,KAAA,EAAA,GAAU;AAClB,cAAA,KAAA,CAAM,cAAA,CAAe,CAAA;AACrB,cAAA,KAAA,CAAM,eAAA,CAAgB,CAAA;AAEtB,cAAA,aAAA,CAAc,IAAI,CAAA;AAAA,YACpB,CAAA;AAAA,YACA,SAAA,EAAU;AAAA,UAAA,CAAA;AAAA,0BAEV,KAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,CAAA,EAAU,SAAA,EAAQ,IAAA,CAAK,KAAA,EAAM,SAAO,CAAA;AAAA,0BACpD,KAAA,CAAA,aAAA,CAAC,iBAAA,EAAA,EAAM,SAAA,EAAU,cAAA,CAAc;AAAA,QACjC;AAAA,MACF,CACD,CAAA;AAAA,MACA;AAAA,IACH,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,oBAAA,CAAqB,YAAA,EAAc,sBAAA;AAEnC,IAAM,mBAAA,EAAqB,+BAAA,CAGxB,EAAA,EAAiD,GAAA,EAAA,GAAQ;AAAzD,EAAA,IAAA,GAAA,EAAA,EAAA,EAAE,EAAA,SAAA,EAAW,QAAA,EAAU,aA9P1B,EAAA,EA8PG,EAAA,EAAwC,MAAA,EAAA,wCAAA,EAAxC,EAAwC,CAAtC,WAAA,EAAW,UAAA,CAAA,CAAA;AACd,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAY,aAAA,EAAe,WAAA,EAAa,cAAA,EAAgB,GAAA,EAAK,QAAA,EAAU,SAAS,EAAA,EAAI,cAAA,CAAe,CAAA;AAEpH,EAAA,uBACE,KAAA,CAAA,aAAA;AAAA,IAAC,aAAA,CAAiB,KAAA;AAAA,IAAjB,4CAAA,6CAAA,CAAA,CAAA,EACK,KAAA,CAAA,EADL;AAAA,MAEC,QAAA,EAAU,CAAA;AAAA,MACV,GAAA,EAAK,QAAA;AAAA,MACL,KAAA,EAAO,UAAA;AAAA,MACP,QAAA,EAAU,SAAA,GAAY,YAAA;AAAA,MACtB,aAAA,EAAe,YAAA,IAAgB,CAAA,EAAA,EAAK,cAAA,EAAgB,KAAA,CAAA;AAAA,MACpD,MAAA,EAAQ,CAAA,EAAA,GAAM;AACZ,QAAA,aAAA,CAAc,EAAE,CAAA;AAChB,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACf,CAAA;AAAA,MACA,OAAA,EAAS,CAAA,EAAA,GAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,MAC3B,OAAA,EAAS,CAAA,EAAA,GAAM,cAAA,CAAe,CAAA,CAAE,CAAA;AAAA,MAChC,SAAA,EAAW,iCAAA;AAAA,QACT,8HAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA,IAAgB,CAAA,EAAA,GAAM;AAAA,MACxB;AAAA,IAAA,CAAA;AAAA,EACF,CAAA;AAEJ,CAAC,CAAA;AAED,kBAAA,CAAmB,YAAA,EAAc,oBAAA;AAEjC,IAAM,qBAAA,EAAuB,+BAAA,CAAkE,EAAE,SAAS,CAAA,EAAG,GAAA,EAAA,GAAQ;AACnH,EAAA,MAAM,EAAE,KAAK,EAAA,EAAI,cAAA,CAAe,CAAA;AAEhC,EAAA,GAAA,CAAI,CAAC,IAAA,EAAM,OAAO,IAAA;AAElB,EAAA,uBACE,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAU,WAAA,CAAA,EACtB,QACH,CAAA;AAEJ,CAAC,CAAA;AAED,oBAAA,CAAqB,YAAA,EAAc,sBAAA;AAEnC,IAAM,kBAAA,EAAoB,+BAAA,CAGvB,EAAE,SAAA,EAAW,SAAS,CAAA,EAAG,GAAA,EAAA,GAAQ;AAClC,EAAA,uBACE,KAAA,CAAA,aAAA;AAAA,IAAC,4BAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,iCAAA;AAAA,QACT,gQAAA;AAAA,QACA;AAAA,MACF;AAAA,IAAA,CAAA;AAAA,IAEC,QAAA;AAAA,oBACD,KAAA,CAAA,aAAA,CAAC,6BAAA,EAAA,IAAA,kBACC,KAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,CAAA,EAAwB,kBAAgB,CAC1D;AAAA,EACF,CAAA;AAEJ,CAAC,CAAA;AAED,iBAAA,CAAkB,YAAA,EAAc,mBAAA;AAEhC,IAAM,kBAAA,EAAoB,+BAAA,CAGvB,EAAA,EAAyE,GAAA,EAAA,GAAQ;AAAjF,EAAA,IAAA,GAAA,EAAA,EAAA,EAAE,EAAA,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,aAjUlD,EAAA,EAiUG,EAAA,EAAgE,MAAA,EAAA,wCAAA,EAAhE,EAAgE,CAA9D,WAAA,EAAW,OAAA,EAAO,OAAA,EAAO,UAAA,EAAU,UAAA,CAAA,CAAA;AACtC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,aAAA,EAAe,aAAA,EAAe,SAAS,EAAA,EAAI,cAAA,CAAe,CAAA;AAElF,EAAA,MAAM,oBAAA,EAAsB,gCAAA,CAAa,CAAA,EAAA,GAAwB;AAC/D,IAAA,CAAA,CAAE,cAAA,CAAe,CAAA;AACjB,IAAA,CAAA,CAAE,eAAA,CAAgB,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,CAAC,CAAA;AAEL,EAAA,MAAM,WAAA,EACJ,cAAA,CAAe,OAAA,EAAS;AAAA,IACtB,KAAA;AAAA,IACA;AAAA,EACF,CAAC,EAAA,IAAM,CAAA,CAAA;AAET,EAAA,MAAM,WAAA,EAAa,SAAA,GAAY,YAAA;AAE/B,EAAA,uBACE,KAAA,CAAA,aAAA;AAAA,IAAC,4BAAA;AAAA,IAAA,4CAAA,6CAAA;AAAA,MACC;AAAA,IAAA,CAAA,EACI,KAAA,CAAA,EAFL;AAAA,MAGC,QAAA,EAAU,UAAA;AAAA,MACV,QAAA,EAAU,CAAA,EAAA,GAAM;AACd,QAAA,GAAA,CAAI,UAAA,EAAY,MAAA;AAEhB,QAAA,aAAA,CAAc;AAAA,UACZ,KAAA;AAAA,UACA;AAAA,QACF,CAAC,CAAA;AACD,QAAA,aAAA,CAAc,EAAE,CAAA;AAAA,MAClB,CAAA;AAAA,MACA,SAAA,EAAW,iCAAA;AAAA,QACT,4EAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA,GAAc,2BAAA;AAAA,QACd,WAAA,GAAc;AAAA,MAChB,CAAA;AAAA,MACA,WAAA,EAAa;AAAA,IAAA,CAAA,CAAA;AAAA,IAEZ,QAAA;AAAA,IACA,WAAA,mBAAc,KAAA,CAAA,aAAA,CAAC,qBAAA,EAAA,EAAU,SAAA,EAAU,UAAA,CAAU;AAAA,EAChD,CAAA;AAEJ,CAAC,CAAA;AAED,iBAAA,CAAkB,YAAA,EAAc,mBAAA;ADzDhC;AACA;AACE;AACA;AACA;AACA;AACA;AACA;AACF,+RAAC","file":"/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-WXEEDLLR.js","sourcesContent":[null,"\"use client\";\nimport * as React from 'react';\nimport { IconCheck, IconX } from '@tabler/icons-react';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport { 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"]}
@@ -1,9 +1,9 @@
1
- import {
2
- Input
3
- } from "./chunk-QF6PFV6M.mjs";
4
1
  import {
5
2
  Textarea
6
3
  } from "./chunk-YQENFZOY.mjs";
4
+ import {
5
+ Input
6
+ } from "./chunk-QF6PFV6M.mjs";
7
7
  import {
8
8
  Button
9
9
  } from "./chunk-7BYWDRRI.mjs";
@@ -155,4 +155,4 @@ export {
155
155
  InputGroupInput,
156
156
  InputGroupTextarea
157
157
  };
158
- //# sourceMappingURL=chunk-HKZRXGJ7.mjs.map
158
+ //# sourceMappingURL=chunk-YDRPNCWF.mjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  InputGroup,
3
3
  InputGroupAddon
4
- } from "./chunk-HKZRXGJ7.mjs";
4
+ } from "./chunk-YDRPNCWF.mjs";
5
5
  import {
6
6
  Dialog,
7
7
  DialogContent,
@@ -150,4 +150,4 @@ export {
150
150
  CommandItem,
151
151
  CommandShortcut
152
152
  };
153
- //# sourceMappingURL=chunk-ZMMYQNQV.mjs.map
153
+ //# sourceMappingURL=chunk-ZFBUIBJH.mjs.map
@@ -0,0 +1,14 @@
1
+ import * as React from 'react';
2
+ import { FieldValues, Path } from 'react-hook-form';
3
+ import { FormMultiSelectProps } from './multi-select.mjs';
4
+ import { HookFormRules } from './types.mjs';
5
+ import '../ui/multi-select.mjs';
6
+ import 'cmdk';
7
+
8
+ declare function HookFormMultiSelect<T extends FieldValues>({ id, name, label, error, rules, classNames, disabled, ...rest }: Omit<FormMultiSelectProps, 'name' | 'onChange' | 'value'> & {
9
+ rules?: HookFormRules<T>;
10
+ name: Path<T>;
11
+ error?: string;
12
+ }): React.JSX.Element;
13
+
14
+ export { HookFormMultiSelect };
@@ -0,0 +1,14 @@
1
+ import * as React from 'react';
2
+ import { FieldValues, Path } from 'react-hook-form';
3
+ import { FormMultiSelectProps } from './multi-select.js';
4
+ import { HookFormRules } from './types.js';
5
+ import '../ui/multi-select.js';
6
+ import 'cmdk';
7
+
8
+ declare function HookFormMultiSelect<T extends FieldValues>({ id, name, label, error, rules, classNames, disabled, ...rest }: Omit<FormMultiSelectProps, 'name' | 'onChange' | 'value'> & {
9
+ rules?: HookFormRules<T>;
10
+ name: Path<T>;
11
+ error?: string;
12
+ }): React.JSX.Element;
13
+
14
+ export { HookFormMultiSelect };