@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,83 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunk3TG6ZVFGjs = require('./chunk-3TG6ZVFG.js');
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
var _chunkQHCOMBHIjs = require('./chunk-QHCOMBHI.js');
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
var _chunkCKGMFUU2js = require('./chunk-CKGMFUU2.js');
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
var _chunkPSPAJNNBjs = require('./chunk-PSPAJNNB.js');
|
|
20
|
+
|
|
21
|
+
// components/form/multi-select.tsx
|
|
22
|
+
var _isString2 = require('lodash-es/isString'); var _isString3 = _interopRequireDefault(_isString2);
|
|
23
|
+
var _kebabCase2 = require('lodash-es/kebabCase'); var _kebabCase3 = _interopRequireDefault(_kebabCase2);
|
|
24
|
+
var _react = require('react'); var _react2 = _interopRequireDefault(_react);
|
|
25
|
+
function FormMultiSelect({
|
|
26
|
+
id,
|
|
27
|
+
name,
|
|
28
|
+
label,
|
|
29
|
+
placeholder = "Select options...",
|
|
30
|
+
data,
|
|
31
|
+
value = [],
|
|
32
|
+
onChange,
|
|
33
|
+
classNames,
|
|
34
|
+
required,
|
|
35
|
+
disabled,
|
|
36
|
+
loop = false
|
|
37
|
+
}) {
|
|
38
|
+
const options = _react2.default.useMemo(() => {
|
|
39
|
+
if (!data || data.length === 0) return [];
|
|
40
|
+
if (_isString3.default.call(void 0, data[0])) {
|
|
41
|
+
return data.map((currentValue) => ({ label: currentValue, value: currentValue }));
|
|
42
|
+
}
|
|
43
|
+
return data;
|
|
44
|
+
}, [data]);
|
|
45
|
+
const selectedValues = _react2.default.useMemo(() => {
|
|
46
|
+
return value.map((currentValue) => options.find((option) => option.value === currentValue)).filter((option) => !!option);
|
|
47
|
+
}, [options, value]);
|
|
48
|
+
const handleValueChange = (newValues) => {
|
|
49
|
+
onChange(newValues.map((currentValue) => currentValue.value));
|
|
50
|
+
};
|
|
51
|
+
if (!id) id = _kebabCase3.default.call(void 0, name);
|
|
52
|
+
return /* @__PURE__ */ _react2.default.createElement("div", { className: _chunkPSPAJNNBjs.cn.call(void 0, "flex flex-col gap-2", classNames == null ? void 0 : classNames.wrapper) }, label && /* @__PURE__ */ _react2.default.createElement(_chunkCKGMFUU2js.Label, { htmlFor: id, className: classNames == null ? void 0 : classNames.label, required }, label), /* @__PURE__ */ _react2.default.createElement(
|
|
53
|
+
_chunk3TG6ZVFGjs.MultiSelector,
|
|
54
|
+
{
|
|
55
|
+
values: selectedValues,
|
|
56
|
+
onValuesChange: handleValueChange,
|
|
57
|
+
loop,
|
|
58
|
+
disabled,
|
|
59
|
+
className: "p-0"
|
|
60
|
+
},
|
|
61
|
+
/* @__PURE__ */ _react2.default.createElement(_chunkQHCOMBHIjs.Popover, null, /* @__PURE__ */ _react2.default.createElement(_chunkQHCOMBHIjs.PopoverTrigger, { asChild: true }, /* @__PURE__ */ _react2.default.createElement(_chunk3TG6ZVFGjs.MultiSelectorTrigger, { className: _chunkPSPAJNNBjs.cn.call(void 0, "cursor-pointer", classNames == null ? void 0 : classNames.trigger) }, /* @__PURE__ */ _react2.default.createElement(
|
|
62
|
+
_chunk3TG6ZVFGjs.MultiSelectorInput,
|
|
63
|
+
{
|
|
64
|
+
id,
|
|
65
|
+
disabled,
|
|
66
|
+
placeholder: selectedValues.length === 0 ? placeholder : "",
|
|
67
|
+
className: classNames == null ? void 0 : classNames.input
|
|
68
|
+
}
|
|
69
|
+
))), /* @__PURE__ */ _react2.default.createElement(
|
|
70
|
+
_chunkQHCOMBHIjs.PopoverContent,
|
|
71
|
+
{
|
|
72
|
+
align: "start",
|
|
73
|
+
className: _chunkPSPAJNNBjs.cn.call(void 0, "w-[var(--radix-popover-trigger-width)] p-0", classNames == null ? void 0 : classNames.content)
|
|
74
|
+
},
|
|
75
|
+
/* @__PURE__ */ _react2.default.createElement(_chunk3TG6ZVFGjs.MultiSelectorList, { className: "static relative border-none shadow-none" }, options.map((option) => /* @__PURE__ */ _react2.default.createElement(_chunk3TG6ZVFGjs.MultiSelectorItem, { key: option.value, value: option.value, label: option.label }, /* @__PURE__ */ _react2.default.createElement("span", null, option.label))))
|
|
76
|
+
))
|
|
77
|
+
));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
exports.FormMultiSelect = FormMultiSelect;
|
|
83
|
+
//# sourceMappingURL=chunk-IQIHYWXX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-IQIHYWXX.js","../components/form/multi-select.tsx"],"names":[],"mappings":"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","file":"/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-IQIHYWXX.js","sourcesContent":[null,"\"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"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
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
|
|
5
|
+
var _chunkLPDYWZN6js = require('./chunk-LPDYWZN6.js');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
@@ -60,13 +60,13 @@ function CommandDialog(_a) {
|
|
|
60
60
|
}
|
|
61
61
|
function CommandInput(_a) {
|
|
62
62
|
var _b = _a, { className } = _b, props = _chunk2NMEKWO5js.__objRest.call(void 0, _b, ["className"]);
|
|
63
|
-
return /* @__PURE__ */ React.createElement("div", { "data-slot": "command-input-wrapper", className: "p-1 pb-0" }, /* @__PURE__ */ React.createElement(
|
|
63
|
+
return /* @__PURE__ */ React.createElement("div", { "data-slot": "command-input-wrapper", className: "p-1 pb-0" }, /* @__PURE__ */ React.createElement(_chunkLPDYWZN6js.InputGroup, { className: "bg-input/30 border-input/30 h-8! rounded-lg! shadow-none! *:data-[slot=input-group-addon]:pl-2!" }, /* @__PURE__ */ React.createElement(
|
|
64
64
|
_cmdk.Command.Input,
|
|
65
65
|
_chunk2NMEKWO5js.__spreadValues.call(void 0, {
|
|
66
66
|
"data-slot": "command-input",
|
|
67
67
|
className: _chunkPSPAJNNBjs.cn.call(void 0, "w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50", className)
|
|
68
68
|
}, props)
|
|
69
|
-
), /* @__PURE__ */ React.createElement(
|
|
69
|
+
), /* @__PURE__ */ React.createElement(_chunkLPDYWZN6js.InputGroupAddon, null, /* @__PURE__ */ React.createElement(_lucidereact.SearchIcon, { className: "size-4 shrink-0 opacity-50" }))));
|
|
70
70
|
}
|
|
71
71
|
function CommandList(_a) {
|
|
72
72
|
var _b = _a, { className } = _b, props = _chunk2NMEKWO5js.__objRest.call(void 0, _b, ["className"]);
|
|
@@ -151,4 +151,4 @@ function CommandShortcut(_a) {
|
|
|
151
151
|
|
|
152
152
|
|
|
153
153
|
exports.Command = Command; exports.CommandDialog = CommandDialog; exports.CommandInput = CommandInput; exports.CommandList = CommandList; exports.CommandEmpty = CommandEmpty; exports.CommandGroup = CommandGroup; exports.CommandSeparator = CommandSeparator; exports.CommandItem = CommandItem; exports.CommandShortcut = CommandShortcut;
|
|
154
|
-
//# sourceMappingURL=chunk-
|
|
154
|
+
//# sourceMappingURL=chunk-LAIO3QZX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-LAIO3QZX.js","../components/ui/command.tsx"],"names":[],"mappings":"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","file":"/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-LAIO3QZX.js","sourcesContent":[null,"\"use client\";\nimport * as React from 'react';\nimport { Command as CommandPrimitive } from 'cmdk';\n\nimport { cn } from '../../utils/ui';\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from './dialog';\nimport { InputGroup, InputGroupAddon } from './input-group';\nimport { SearchIcon, CheckIcon } from 'lucide-react';\n\nfunction Command({ className, ...props }: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n 'bg-popover text-popover-foreground rounded-xl! p-1 flex size-full flex-col overflow-hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandDialog({\n title = 'Command Palette',\n description = 'Search for a command to run...',\n children,\n className,\n showCloseButton = false,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string;\n description?: string;\n className?: string;\n showCloseButton?: boolean;\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent\n className={cn('rounded-xl! top-1/3 translate-y-0 overflow-hidden p-0', className)}\n showCloseButton={showCloseButton}\n >\n {children}\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction CommandInput({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div data-slot=\"command-input-wrapper\" className=\"p-1 pb-0\">\n <InputGroup className=\"bg-input/30 border-input/30 h-8! rounded-lg! shadow-none! *:data-[slot=input-group-addon]:pl-2!\">\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn('w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50', className)}\n {...props}\n />\n <InputGroupAddon>\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n </InputGroupAddon>\n </InputGroup>\n </div>\n );\n}\n\nfunction CommandList({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn('no-scrollbar max-h-72 scroll-py-1 outline-none overflow-x-hidden overflow-y-auto', className)}\n {...props}\n />\n );\n}\n\nfunction CommandEmpty({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className={cn('py-6 text-center text-sm', className)}\n {...props}\n />\n );\n}\n\nfunction CommandGroup({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n 'text-foreground **:[[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandSeparator({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn('bg-border -mx-1 h-px', className)}\n {...props}\n />\n );\n}\n\nfunction CommandItem({ className, children, ...props }: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"data-[selected=true]:bg-muted data-[selected=true]:text-foreground data-[selected=true]:*:[svg]:text-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-lg! [&_svg:not([class*='size-'])]:size-4 group/command-item data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n >\n {children}\n <CheckIcon className=\"ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100\" />\n </CommandPrimitive.Item>\n );\n}\n\nfunction CommandShortcut({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n 'text-muted-foreground group-data-selected/command-item:text-foreground ml-auto text-xs tracking-widest',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
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
|
-
var
|
|
4
|
+
var _chunkRJG7QLDDjs = require('./chunk-RJG7QLDD.js');
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunkUFRPUC7Kjs = require('./chunk-UFRPUC7K.js');
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
var _chunkKB6BX6LAjs = require('./chunk-KB6BX6LA.js');
|
|
@@ -156,4 +156,4 @@ function InputGroupTextarea(_a) {
|
|
|
156
156
|
|
|
157
157
|
|
|
158
158
|
exports.InputGroup = InputGroup; exports.InputGroupAddon = InputGroupAddon; exports.InputGroupButton = InputGroupButton; exports.InputGroupText = InputGroupText; exports.InputGroupInput = InputGroupInput; exports.InputGroupTextarea = InputGroupTextarea;
|
|
159
|
-
//# sourceMappingURL=chunk-
|
|
159
|
+
//# sourceMappingURL=chunk-LPDYWZN6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-LPDYWZN6.js","../components/ui/input-group.tsx"],"names":["_a","_b"],"mappings":"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","file":"/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-LPDYWZN6.js","sourcesContent":[null,"\"use client\";\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../../utils/ui';\nimport { Button } from './button';\nimport { Input } from './input';\nimport { Textarea } from './textarea';\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n 'border-input dark:bg-input/30 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-disabled:bg-input/50 dark:has-disabled:bg-input/80 h-8 rounded-lg border transition-colors in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-3 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5 group/input-group relative flex w-full min-w-0 items-center outline-none has-[>textarea]:h-auto',\n className,\n )}\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted-foreground h-auto gap-2 py-1.5 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4 flex cursor-text items-center justify-center select-none\",\n {\n variants: {\n align: {\n 'inline-start': 'pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem] order-first',\n 'inline-end': 'pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem] order-last',\n 'block-start':\n 'px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2 order-first w-full justify-start',\n 'block-end': 'px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2 order-last w-full justify-start',\n },\n },\n defaultVariants: {\n align: 'inline-start',\n },\n },\n);\n\nfunction InputGroupAddon({\n className,\n align = 'inline-start',\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest('button')) {\n return;\n }\n e.currentTarget.parentElement?.querySelector('input')?.focus();\n }}\n {...props}\n />\n );\n}\n\nconst inputGroupButtonVariants = cva('gap-2 text-sm flex items-center shadow-none', {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: '',\n 'icon-xs': 'size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0',\n 'icon-sm': 'size-8 p-0 has-[>svg]:p-0',\n },\n },\n defaultVariants: {\n size: 'xs',\n },\n});\n\nfunction InputGroupButton({\n className,\n type = 'button',\n variant = 'ghost',\n size = 'xs',\n ...props\n}: Omit<React.ComponentProps<typeof Button>, 'size'> & VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n className={cn(\n \"text-muted-foreground gap-2 text-sm [&_svg:not([class*='size-'])]:size-4 flex items-center [&_svg]:pointer-events-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({ className, ...props }: React.ComponentProps<'input'>) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n 'rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent flex-1',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupTextarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n 'rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent flex-1 resize-none',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { InputGroup, InputGroupAddon, InputGroupButton, InputGroupText, InputGroupInput, InputGroupTextarea };\n"]}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
CommandInput,
|
|
6
6
|
CommandItem,
|
|
7
7
|
CommandList
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-ZFBUIBJH.mjs";
|
|
9
9
|
import {
|
|
10
10
|
Popover,
|
|
11
11
|
PopoverContent,
|
|
@@ -84,4 +84,4 @@ function FormSearchableSelect({
|
|
|
84
84
|
export {
|
|
85
85
|
FormSearchableSelect
|
|
86
86
|
};
|
|
87
|
-
//# sourceMappingURL=chunk-
|
|
87
|
+
//# sourceMappingURL=chunk-RJVQU443.mjs.map
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TagPicker
|
|
3
|
+
} from "./chunk-ZQK6REIM.mjs";
|
|
4
|
+
import {
|
|
5
|
+
Label
|
|
6
|
+
} from "./chunk-MM5OJOOR.mjs";
|
|
7
|
+
import {
|
|
8
|
+
cn
|
|
9
|
+
} from "./chunk-KGUUDFJE.mjs";
|
|
10
|
+
|
|
11
|
+
// components/form/tag-picker.tsx
|
|
12
|
+
import _kebabCase from "lodash-es/kebabCase";
|
|
13
|
+
function FormTagPicker({
|
|
14
|
+
id,
|
|
15
|
+
name,
|
|
16
|
+
label,
|
|
17
|
+
value,
|
|
18
|
+
onChange,
|
|
19
|
+
suggestions = [],
|
|
20
|
+
placeholder = "Add tags...",
|
|
21
|
+
disabled = false,
|
|
22
|
+
required = false,
|
|
23
|
+
classNames
|
|
24
|
+
}) {
|
|
25
|
+
if (!id) id = _kebabCase(name);
|
|
26
|
+
return /* @__PURE__ */ React.createElement("div", { className: cn("space-y-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(
|
|
27
|
+
TagPicker,
|
|
28
|
+
{
|
|
29
|
+
id,
|
|
30
|
+
value,
|
|
31
|
+
onChange,
|
|
32
|
+
suggestions,
|
|
33
|
+
placeholder,
|
|
34
|
+
disabled,
|
|
35
|
+
className: classNames == null ? void 0 : classNames.input
|
|
36
|
+
}
|
|
37
|
+
));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export {
|
|
41
|
+
FormTagPicker
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=chunk-USW6AILM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/form/tag-picker.tsx"],"sourcesContent":["\"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"],"mappings":";;;;;;;;;;;AACA,OAAO,gBAAgB;AAuBhB,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc,CAAC;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AACF,GAAuB;AACrB,MAAI,CAAC,GAAI,MAAK,WAAW,IAAI;AAE7B,SACE,oCAAC,SAAI,WAAW,GAAG,aAAa,yCAAY,OAAO,KAChD,SACC,oCAAC,SAAM,SAAS,IAAI,WAAW,yCAAY,OAAO,YAC/C,KACH,GAGF;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,yCAAY;AAAA;AAAA,EACzB,CACF;AAEJ;","names":[]}
|
|
@@ -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-
|
|
158
|
+
//# sourceMappingURL=chunk-YDRPNCWF.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
InputGroup,
|
|
3
3
|
InputGroupAddon
|
|
4
|
-
} from "./chunk-
|
|
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-
|
|
153
|
+
//# sourceMappingURL=chunk-ZFBUIBJH.mjs.map
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Badge
|
|
3
|
+
} from "./chunk-WIISPZZE.mjs";
|
|
4
|
+
import {
|
|
5
|
+
cn
|
|
6
|
+
} from "./chunk-KGUUDFJE.mjs";
|
|
7
|
+
|
|
8
|
+
// components/ui/tag-picker.tsx
|
|
9
|
+
import { IconPlus, IconX } from "@tabler/icons-react";
|
|
10
|
+
import { useMemo, useState } from "react";
|
|
11
|
+
function normalizeTagName(name) {
|
|
12
|
+
return name.replace(/\s+/g, " ").trim();
|
|
13
|
+
}
|
|
14
|
+
function TagPicker({
|
|
15
|
+
id,
|
|
16
|
+
value,
|
|
17
|
+
onChange,
|
|
18
|
+
suggestions = [],
|
|
19
|
+
placeholder = "Add tags...",
|
|
20
|
+
disabled = false,
|
|
21
|
+
className
|
|
22
|
+
}) {
|
|
23
|
+
const [inputValue, setInputValue] = useState("");
|
|
24
|
+
const [isFocused, setIsFocused] = useState(false);
|
|
25
|
+
const selectedKeys = useMemo(() => new Set(value.map((item) => item.toLocaleLowerCase())), [value]);
|
|
26
|
+
const normalizedInput = normalizeTagName(inputValue);
|
|
27
|
+
const normalizedInputKey = normalizedInput.toLocaleLowerCase();
|
|
28
|
+
const filteredSuggestions = useMemo(() => {
|
|
29
|
+
return suggestions.filter((suggestion) => !selectedKeys.has(suggestion.toLocaleLowerCase())).filter((suggestion) => {
|
|
30
|
+
if (!normalizedInput) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
return suggestion.toLocaleLowerCase().includes(normalizedInputKey);
|
|
34
|
+
}).slice(0, 8);
|
|
35
|
+
}, [normalizedInput, normalizedInputKey, selectedKeys, suggestions]);
|
|
36
|
+
const canCreate = !!normalizedInput && !selectedKeys.has(normalizedInputKey) && !suggestions.some((suggestion) => suggestion.toLocaleLowerCase() === normalizedInputKey);
|
|
37
|
+
const addTag = (rawName) => {
|
|
38
|
+
const nextName = normalizeTagName(rawName);
|
|
39
|
+
if (!nextName) {
|
|
40
|
+
setInputValue("");
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const nextKey = nextName.toLocaleLowerCase();
|
|
44
|
+
const matchingSuggestion = suggestions.find((suggestion) => suggestion.toLocaleLowerCase() === nextKey);
|
|
45
|
+
const finalName = matchingSuggestion != null ? matchingSuggestion : nextName;
|
|
46
|
+
if (selectedKeys.has(finalName.toLocaleLowerCase())) {
|
|
47
|
+
setInputValue("");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
onChange([...value, finalName]);
|
|
51
|
+
setInputValue("");
|
|
52
|
+
};
|
|
53
|
+
const removeTag = (tagName) => {
|
|
54
|
+
onChange(value.filter((item) => item.toLocaleLowerCase() !== tagName.toLocaleLowerCase()));
|
|
55
|
+
};
|
|
56
|
+
const showMenu = !disabled && isFocused && (filteredSuggestions.length > 0 || canCreate);
|
|
57
|
+
return /* @__PURE__ */ React.createElement("div", { className: cn("space-y-2", className) }, /* @__PURE__ */ React.createElement("div", { className: "relative" }, /* @__PURE__ */ React.createElement(
|
|
58
|
+
"div",
|
|
59
|
+
{
|
|
60
|
+
className: cn(
|
|
61
|
+
"flex min-h-8 flex-wrap items-center gap-1 rounded-lg border bg-background px-2 py-1 text-sm",
|
|
62
|
+
"focus-within:ring-1 focus-within:ring-ring",
|
|
63
|
+
disabled && "cursor-not-allowed opacity-60"
|
|
64
|
+
)
|
|
65
|
+
},
|
|
66
|
+
value.map((tagName) => /* @__PURE__ */ React.createElement(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(
|
|
67
|
+
"button",
|
|
68
|
+
{
|
|
69
|
+
type: "button",
|
|
70
|
+
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",
|
|
71
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
72
|
+
onClick: () => removeTag(tagName),
|
|
73
|
+
"aria-label": `Remove ${tagName}`
|
|
74
|
+
},
|
|
75
|
+
/* @__PURE__ */ React.createElement(IconX, { className: "h-3.5 w-3.5" })
|
|
76
|
+
))),
|
|
77
|
+
/* @__PURE__ */ React.createElement(
|
|
78
|
+
"input",
|
|
79
|
+
{
|
|
80
|
+
id,
|
|
81
|
+
value: inputValue,
|
|
82
|
+
disabled,
|
|
83
|
+
placeholder: value.length === 0 ? placeholder : "",
|
|
84
|
+
className: "min-w-24 flex-1 border-0 bg-transparent p-0 pl-1 text-sm outline-none placeholder:text-muted-foreground",
|
|
85
|
+
onFocus: () => setIsFocused(true),
|
|
86
|
+
onBlur: () => {
|
|
87
|
+
window.setTimeout(() => setIsFocused(false), 100);
|
|
88
|
+
},
|
|
89
|
+
onChange: (event) => setInputValue(event.target.value),
|
|
90
|
+
onKeyDown: (event) => {
|
|
91
|
+
if ((event.key === "Enter" || event.key === ",") && normalizedInput) {
|
|
92
|
+
event.preventDefault();
|
|
93
|
+
addTag(normalizedInput);
|
|
94
|
+
}
|
|
95
|
+
if (event.key === "Backspace" && !inputValue && value.length > 0) {
|
|
96
|
+
event.preventDefault();
|
|
97
|
+
removeTag(value[value.length - 1]);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
), 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(
|
|
103
|
+
"button",
|
|
104
|
+
{
|
|
105
|
+
key: suggestion,
|
|
106
|
+
type: "button",
|
|
107
|
+
className: "flex w-full items-center justify-between rounded-sm px-2 py-1.5 text-left text-sm hover:bg-muted",
|
|
108
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
109
|
+
onClick: () => addTag(suggestion)
|
|
110
|
+
},
|
|
111
|
+
/* @__PURE__ */ React.createElement("span", null, suggestion),
|
|
112
|
+
/* @__PURE__ */ React.createElement("span", { className: "text-xs text-muted-foreground" }, "Existing")
|
|
113
|
+
)), canCreate && /* @__PURE__ */ React.createElement(
|
|
114
|
+
"button",
|
|
115
|
+
{
|
|
116
|
+
type: "button",
|
|
117
|
+
className: "flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-muted",
|
|
118
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
119
|
+
onClick: () => addTag(normalizedInput)
|
|
120
|
+
},
|
|
121
|
+
/* @__PURE__ */ React.createElement(IconPlus, { className: "h-3.5 w-3.5" }),
|
|
122
|
+
/* @__PURE__ */ React.createElement("span", null, 'Create "', normalizedInput, '"')
|
|
123
|
+
))));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export {
|
|
127
|
+
TagPicker
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=chunk-ZQK6REIM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/ui/tag-picker.tsx"],"sourcesContent":["\"use client\";\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 "{normalizedInput}"</span>\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -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 };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
var _chunkIQIHYWXXjs = require('../../chunk-IQIHYWXX.js');
|
|
6
|
+
require('../../chunk-3TG6ZVFG.js');
|
|
7
|
+
require('../../chunk-LAIO3QZX.js');
|
|
8
|
+
require('../../chunk-LPDYWZN6.js');
|
|
9
|
+
require('../../chunk-RFORRZRN.js');
|
|
10
|
+
require('../../chunk-RJG7QLDD.js');
|
|
11
|
+
require('../../chunk-UFRPUC7K.js');
|
|
12
|
+
require('../../chunk-2YMMYND2.js');
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
var _chunk6POWZMNDjs = require('../../chunk-6POWZMND.js');
|
|
16
|
+
require('../../chunk-QHCOMBHI.js');
|
|
17
|
+
require('../../chunk-KB6BX6LA.js');
|
|
18
|
+
require('../../chunk-GV62APQ6.js');
|
|
19
|
+
require('../../chunk-CKGMFUU2.js');
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
var _chunkPSPAJNNBjs = require('../../chunk-PSPAJNNB.js');
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
var _chunk2NMEKWO5js = require('../../chunk-2NMEKWO5.js');
|
|
27
|
+
|
|
28
|
+
// components/form/hook-multi-select.tsx
|
|
29
|
+
var _reacthookform = require('react-hook-form');
|
|
30
|
+
function HookFormMultiSelect(_a) {
|
|
31
|
+
var _b = _a, {
|
|
32
|
+
id,
|
|
33
|
+
name,
|
|
34
|
+
label,
|
|
35
|
+
error,
|
|
36
|
+
rules,
|
|
37
|
+
classNames,
|
|
38
|
+
disabled = false
|
|
39
|
+
} = _b, rest = _chunk2NMEKWO5js.__objRest.call(void 0, _b, [
|
|
40
|
+
"id",
|
|
41
|
+
"name",
|
|
42
|
+
"label",
|
|
43
|
+
"error",
|
|
44
|
+
"rules",
|
|
45
|
+
"classNames",
|
|
46
|
+
"disabled"
|
|
47
|
+
]);
|
|
48
|
+
const { control } = _reacthookform.useFormContext.call(void 0, );
|
|
49
|
+
const _a2 = classNames != null ? classNames : {}, { wrapper } = _a2, restClassnames = _chunk2NMEKWO5js.__objRest.call(void 0, _a2, ["wrapper"]);
|
|
50
|
+
return /* @__PURE__ */ React.createElement("div", { className: _chunkPSPAJNNBjs.cn.call(void 0, "$hook-multi-select", wrapper) }, /* @__PURE__ */ React.createElement(
|
|
51
|
+
_reacthookform.Controller,
|
|
52
|
+
{
|
|
53
|
+
control,
|
|
54
|
+
name,
|
|
55
|
+
rules,
|
|
56
|
+
render: ({ field: { onChange, value } }) => {
|
|
57
|
+
return /* @__PURE__ */ React.createElement(
|
|
58
|
+
_chunkIQIHYWXXjs.FormMultiSelect,
|
|
59
|
+
_chunk2NMEKWO5js.__spreadValues.call(void 0, {
|
|
60
|
+
id,
|
|
61
|
+
name,
|
|
62
|
+
label,
|
|
63
|
+
value: value != null ? value : [],
|
|
64
|
+
onChange,
|
|
65
|
+
disabled,
|
|
66
|
+
classNames: restClassnames
|
|
67
|
+
}, rest)
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
), /* @__PURE__ */ React.createElement(_chunk6POWZMNDjs.FormError, { field: name, className: "mt-1", message: error }));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
exports.HookFormMultiSelect = HookFormMultiSelect;
|
|
76
|
+
//# sourceMappingURL=hook-multi-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/jahn/projects/shadcn-theme/packages/react/dist/components/form/hook-multi-select.js","../../../components/form/hook-multi-select.tsx"],"names":["_a"],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,0DAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC;AACE;AACF,0DAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC;AACE;AACF,0DAAgC;AAChC;AACE;AACA;AACF,0DAAgC;AAChC;AACA;ACzBA,gDAAwE;AASjE,SAAS,mBAAA,CAA2C,EAAA,EAaxD;AAbwD,EAAA,IAAA,GAAA,EAAA,EAAA,EACzD;AAAA,IAAA,EAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW;AAAA,EAjBb,EAAA,EAU2D,EAAA,EAQtD,KAAA,EAAA,wCAAA,EARsD,EAQtD;AAAA,IAPH,IAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,EAAA,CAAA,CAAA;AAOA,EAAA,MAAM,EAAE,QAAQ,EAAA,EAAI,2CAAA,CAAkB;AACtC,EAAA,MAAuCA,IAAAA,EAAA,WAAA,GAAA,KAAA,EAAA,WAAA,EAAc,CAAC,CAAA,EAA9C,EAAA,QAzBV,EAAA,EAyByCA,GAAAA,EAAnB,eAAA,EAAA,wCAAA,GAAmBA,EAAnB,CAAZ,SAAA,CAAA,CAAA;AAER,EAAA,uBACE,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,iCAAA,oBAAG,EAAsB,OAAO,EAAA,CAAA,kBAC9C,KAAA,CAAA,aAAA;AAAA,IAAC,yBAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,MAAM,EAAE,CAAA,EAAA,GAAM;AAC1C,QAAA,uBACE,KAAA,CAAA,aAAA;AAAA,UAAC,gCAAA;AAAA,UAAA,6CAAA;AAAA,YACC,EAAA;AAAA,YACA,IAAA;AAAA,YACA,KAAA;AAAA,YACA,KAAA,EAAO,MAAA,GAAA,KAAA,EAAA,MAAA,EAAS,CAAC,CAAA;AAAA,YACjB,QAAA;AAAA,YACA,QAAA;AAAA,YACA,UAAA,EAAY;AAAA,UAAA,CAAA,EACR,IAAA;AAAA,QACN,CAAA;AAAA,MAEJ;AAAA,IAAA;AAAA,EACF,CAAA,kBAEA,KAAA,CAAA,aAAA,CAAC,0BAAA,EAAA,EAAU,KAAA,EAAO,IAAA,EAAM,SAAA,EAAU,MAAA,EAAO,OAAA,EAAS,MAAA,CAAO,CAC3D,CAAA;AAEJ;ADmBA;AACE;AACF,kDAAC","file":"/home/jahn/projects/shadcn-theme/packages/react/dist/components/form/hook-multi-select.js","sourcesContent":[null,"\"use client\";\nimport { Controller, type FieldValues, type Path, useFormContext } from 'react-hook-form';\n\nimport { cn } from '../../utils/ui';\nimport { FormError } from './error';\nimport { FormMultiSelect } from './multi-select';\n\nimport type { FormMultiSelectProps } from './multi-select';\nimport type { HookFormRules } from './types';\n\nexport function HookFormMultiSelect<T extends FieldValues>({\n id,\n name,\n label,\n error,\n rules,\n classNames,\n disabled = false,\n ...rest\n}: Omit<FormMultiSelectProps, 'name' | 'onChange' | 'value'> & {\n rules?: HookFormRules<T>;\n name: Path<T>;\n error?: string;\n}) {\n const { control } = useFormContext<T>();\n const { wrapper, ...restClassnames } = classNames ?? {};\n\n return (\n <div className={cn('$hook-multi-select', wrapper)}>\n <Controller\n control={control}\n name={name}\n rules={rules}\n render={({ field: { onChange, value } }) => {\n return (\n <FormMultiSelect\n id={id}\n name={name}\n label={label}\n value={value ?? []}\n onChange={onChange}\n disabled={disabled}\n classNames={restClassnames}\n {...rest}\n />\n );\n }}\n />\n\n <FormError field={name} className=\"mt-1\" message={error} />\n </div>\n );\n}\n"]}
|