@next-degree/pickle-shared-js 0.3.19 → 0.3.20
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/README.md +47 -1
- package/dist/app/layout.cjs +70 -1
- package/dist/app/layout.cjs.map +1 -1
- package/dist/app/layout.css +1263 -1
- package/dist/app/layout.css.map +1 -1
- package/dist/app/layout.js +35 -1
- package/dist/app/layout.js.map +1 -1
- package/dist/app/page.cjs +774 -1
- package/dist/app/page.cjs.map +1 -1
- package/dist/app/page.js +743 -1
- package/dist/app/page.js.map +1 -1
- package/dist/assets/fonts/AmbitBold.cjs +2 -1
- package/dist/assets/fonts/AmbitBold.js +5 -1
- package/dist/assets/fonts/AmbitBoldItalic.cjs +2 -1
- package/dist/assets/fonts/AmbitBoldItalic.js +5 -1
- package/dist/assets/fonts/AmbitRegular.cjs +2 -1
- package/dist/assets/fonts/AmbitRegular.js +5 -1
- package/dist/components/demos/ComboboxDemo.cjs +759 -1
- package/dist/components/demos/ComboboxDemo.cjs.map +1 -1
- package/dist/components/demos/ComboboxDemo.js +731 -1
- package/dist/components/demos/ComboboxDemo.js.map +1 -1
- package/dist/components/demos/index.cjs +767 -1
- package/dist/components/demos/index.cjs.map +1 -1
- package/dist/components/demos/index.js +736 -1
- package/dist/components/demos/index.js.map +1 -1
- package/dist/components/primitives/command.cjs +223 -1
- package/dist/components/primitives/command.cjs.map +1 -1
- package/dist/components/primitives/command.js +181 -1
- package/dist/components/primitives/command.js.map +1 -1
- package/dist/components/primitives/dialog.cjs +137 -1
- package/dist/components/primitives/dialog.cjs.map +1 -1
- package/dist/components/primitives/dialog.js +92 -1
- package/dist/components/primitives/dialog.js.map +1 -1
- package/dist/components/primitives/popover.cjs +72 -1
- package/dist/components/primitives/popover.cjs.map +1 -1
- package/dist/components/primitives/popover.js +36 -1
- package/dist/components/primitives/popover.js.map +1 -1
- package/dist/components/primitives/separator.cjs +67 -1
- package/dist/components/primitives/separator.cjs.map +1 -1
- package/dist/components/primitives/separator.js +33 -1
- package/dist/components/primitives/separator.js.map +1 -1
- package/dist/components/ui/Badge.cjs +57 -1
- package/dist/components/ui/Badge.cjs.map +1 -1
- package/dist/components/ui/Badge.js +31 -1
- package/dist/components/ui/Badge.js.map +1 -1
- package/dist/components/ui/Button.cjs +145 -1
- package/dist/components/ui/Button.cjs.map +1 -1
- package/dist/components/ui/Button.js +118 -1
- package/dist/components/ui/Button.js.map +1 -1
- package/dist/components/ui/Checkbox.cjs +99 -1
- package/dist/components/ui/Checkbox.cjs.map +1 -1
- package/dist/components/ui/Checkbox.js +71 -1
- package/dist/components/ui/Checkbox.js.map +1 -1
- package/dist/components/ui/Chip.cjs +49 -1
- package/dist/components/ui/Chip.cjs.map +1 -1
- package/dist/components/ui/Chip.js +28 -1
- package/dist/components/ui/Chip.js.map +1 -1
- package/dist/components/ui/Combobox.cjs +564 -1
- package/dist/components/ui/Combobox.cjs.map +1 -1
- package/dist/components/ui/Combobox.js +532 -1
- package/dist/components/ui/Combobox.js.map +1 -1
- package/dist/components/ui/Label.cjs +50 -1
- package/dist/components/ui/Label.cjs.map +1 -1
- package/dist/components/ui/Label.js +27 -1
- package/dist/components/ui/Label.js.map +1 -1
- package/dist/components/ui/ListItem.cjs +151 -1
- package/dist/components/ui/ListItem.cjs.map +1 -1
- package/dist/components/ui/ListItem.js +120 -1
- package/dist/components/ui/ListItem.js.map +1 -1
- package/dist/components/ui/Select.cjs +246 -1
- package/dist/components/ui/Select.cjs.map +1 -1
- package/dist/components/ui/Select.js +221 -1
- package/dist/components/ui/Select.js.map +1 -1
- package/dist/index.cjs +855 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +817 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/utils.cjs +34 -1
- package/dist/lib/utils.cjs.map +1 -1
- package/dist/lib/utils.js +9 -1
- package/dist/lib/utils.js.map +1 -1
- package/dist/styles/globals.css +1263 -1
- package/dist/styles/globals.css.map +1 -1
- package/package.json +14 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/ListItem.tsx","../../../src/components/ui/Checkbox.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { cn } from '@/lib/utils'\nimport { CheckIcon } from 'lucide-react'\nimport { ComponentPropsWithoutRef, ReactNode } from 'react'\nimport Checkbox from '@/components/ui/Checkbox'\nimport { icons } from 'lucide-react'\n\ntype IconKey = keyof typeof icons\n\ninterface ListItemProps extends ComponentPropsWithoutRef<'li'> {\n icon?: string\n hasCheckbox?: boolean\n isSelected?: boolean\n title: string\n value: string\n description?: string\n}\n\nfunction ListItem({\n icon,\n hasCheckbox,\n isSelected,\n className,\n title,\n value,\n description,\n ...props\n}: ListItemProps) {\n const getIconIfValid = (icon: string): ReactNode => {\n if (icon in icons) {\n const IconComponent = icons[icon as IconKey]\n return <IconComponent size={14} />\n }\n return null\n }\n\n const optionIcon = icon ? getIconIfValid(icon) : undefined\n\n return (\n <li\n className={cn(\n 'group relative flex w-72 cursor-pointer flex-row items-center text-left text-sm',\n className\n )}\n {...props}\n data-state={isSelected ? 'checked' : 'unchecked'}\n >\n {optionIcon && <span className=\"mr-2\">{optionIcon}</span>}\n {hasCheckbox && (\n <Checkbox id={value} checked={isSelected} onClick={(e) => e.preventDefault()} />\n )}\n <div>\n <p>{title}</p>\n <p className=\"text-xs text-grey-80\">{description}</p>\n </div>\n\n <CheckIcon\n className=\"absolute inset-y-0 right-0 my-auto hidden w-6 text-green-100 group-data-[state=checked]:block\"\n size={16}\n />\n </li>\n )\n}\n\nexport default ListItem\n","'use client'\n\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox'\nimport { Check, Minus } from 'lucide-react'\nimport {\n type ComponentPropsWithoutRef,\n type ElementRef,\n forwardRef,\n type PropsWithChildren,\n} from 'react'\n\nimport { cn } from '@/lib/utils'\n\nconst CheckboxToggle = forwardRef<\n ElementRef<typeof CheckboxPrimitive.Root>,\n ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n 'group',\n 'peer',\n 'h-5',\n 'w-5',\n 'shrink-0',\n 'rounded-md',\n 'border',\n 'border-grey-10',\n 'outline',\n 'outline-1',\n 'outline-offset-2',\n 'outline-transparent',\n 'hover:border-grey-20',\n 'focus:outline-purple-100',\n 'active:border-green-80',\n 'disabled:cursor-not-allowed',\n 'disabled:opacity-50',\n 'data-[state=checked]:bg-green-80',\n 'data-[state=indeterminate]:bg-green-80',\n 'data-[state=checked]:text-white',\n 'data-[state=indeterminate]:text-primary-foreground',\n props.disabled &&\n 'data-[state=checked]:text-foreground bg-grey-20 data-[state=checked]:bg-grey-20',\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center text-current\">\n <Check className=\"hidden h-4 w-4 group-data-[state=checked]:block\" />\n <Minus className=\"hidden h-4 w-4 group-data-[state=indeterminate]:block\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckboxToggle.displayName = CheckboxPrimitive.Root.displayName\n\ninterface Props extends CheckboxPrimitive.CheckboxProps, PropsWithChildren {\n error?: string\n classNames?: {\n wrapper?: string\n label?: string\n }\n}\n\nconst Checkbox = forwardRef<ElementRef<typeof CheckboxPrimitive.Root>, Props>(\n ({ classNames, children, ...props }, ref) => {\n const { disabled } = props\n const id = props.id ?? `${props.name ?? props.value?.toString()}-checkbox`\n const labelClassName = disabled ? 'text-grey-40 pointer-events-none' : ''\n return (\n <div className={cn('flex space-x-2', classNames?.wrapper)}>\n <CheckboxToggle id={id} disabled={disabled} ref={ref} {...props} />\n <label htmlFor={id} className={cn(labelClassName, classNames?.label)}>\n {children}\n </label>\n </div>\n )\n }\n)\nCheckbox.displayName = 'Checkbox'\n\nexport default Checkbox\n"],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/ListItem.tsx","../../../src/components/ui/Checkbox.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { cn } from '@/lib/utils'\nimport { CheckIcon } from 'lucide-react'\nimport { ComponentPropsWithoutRef, ReactNode } from 'react'\nimport Checkbox from '@/components/ui/Checkbox'\nimport { icons } from 'lucide-react'\n\ntype IconKey = keyof typeof icons\n\ninterface ListItemProps extends ComponentPropsWithoutRef<'li'> {\n icon?: string\n hasCheckbox?: boolean\n isSelected?: boolean\n title: string\n value: string\n description?: string\n}\n\nfunction ListItem({\n icon,\n hasCheckbox,\n isSelected,\n className,\n title,\n value,\n description,\n ...props\n}: ListItemProps) {\n const getIconIfValid = (icon: string): ReactNode => {\n if (icon in icons) {\n const IconComponent = icons[icon as IconKey]\n return <IconComponent size={14} />\n }\n return null\n }\n\n const optionIcon = icon ? getIconIfValid(icon) : undefined\n\n return (\n <li\n className={cn(\n 'group relative flex w-72 cursor-pointer flex-row items-center text-left text-sm',\n className\n )}\n {...props}\n data-state={isSelected ? 'checked' : 'unchecked'}\n >\n {optionIcon && <span className=\"mr-2\">{optionIcon}</span>}\n {hasCheckbox && (\n <Checkbox id={value} checked={isSelected} onClick={(e) => e.preventDefault()} />\n )}\n <div>\n <p>{title}</p>\n <p className=\"text-xs text-grey-80\">{description}</p>\n </div>\n\n <CheckIcon\n className=\"absolute inset-y-0 right-0 my-auto hidden w-6 text-green-100 group-data-[state=checked]:block\"\n size={16}\n />\n </li>\n )\n}\n\nexport default ListItem\n","'use client'\n\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox'\nimport { Check, Minus } from 'lucide-react'\nimport {\n type ComponentPropsWithoutRef,\n type ElementRef,\n forwardRef,\n type PropsWithChildren,\n} from 'react'\n\nimport { cn } from '@/lib/utils'\n\nconst CheckboxToggle = forwardRef<\n ElementRef<typeof CheckboxPrimitive.Root>,\n ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n 'group',\n 'peer',\n 'h-5',\n 'w-5',\n 'shrink-0',\n 'rounded-md',\n 'border',\n 'border-grey-10',\n 'outline',\n 'outline-1',\n 'outline-offset-2',\n 'outline-transparent',\n 'hover:border-grey-20',\n 'focus:outline-purple-100',\n 'active:border-green-80',\n 'disabled:cursor-not-allowed',\n 'disabled:opacity-50',\n 'data-[state=checked]:bg-green-80',\n 'data-[state=indeterminate]:bg-green-80',\n 'data-[state=checked]:text-white',\n 'data-[state=indeterminate]:text-primary-foreground',\n props.disabled &&\n 'data-[state=checked]:text-foreground bg-grey-20 data-[state=checked]:bg-grey-20',\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center text-current\">\n <Check className=\"hidden h-4 w-4 group-data-[state=checked]:block\" />\n <Minus className=\"hidden h-4 w-4 group-data-[state=indeterminate]:block\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckboxToggle.displayName = CheckboxPrimitive.Root.displayName\n\ninterface Props extends CheckboxPrimitive.CheckboxProps, PropsWithChildren {\n error?: string\n classNames?: {\n wrapper?: string\n label?: string\n }\n}\n\nconst Checkbox = forwardRef<ElementRef<typeof CheckboxPrimitive.Root>, Props>(\n ({ classNames, children, ...props }, ref) => {\n const { disabled } = props\n const id = props.id ?? `${props.name ?? props.value?.toString()}-checkbox`\n const labelClassName = disabled ? 'text-grey-40 pointer-events-none' : ''\n return (\n <div className={cn('flex space-x-2', classNames?.wrapper)}>\n <CheckboxToggle id={id} disabled={disabled} ref={ref} {...props} />\n <label htmlFor={id} className={cn(labelClassName, classNames?.label)}>\n {children}\n </label>\n </div>\n )\n }\n)\nCheckbox.displayName = 'Checkbox'\n\nexport default Checkbox\n"],"mappings":";AAAA,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ACJA,SAAS,iBAAiB;;;ACC1B,YAAY,uBAAuB;AACnC,SAAS,OAAO,aAAa;AAC7B;AAAA,EAGE;AAAA,OAEK;AAsCH,SACE,KADF;AAlCJ,IAAM,iBAAiB,WAGrB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAmB;AAAA,EAAlB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,YACJ;AAAA,MACF;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ,+BAAmB,6BAAlB,EAA4B,WAAU,iDACrC;AAAA,0BAAC,SAAM,WAAU,mDAAkD;AAAA,MACnE,oBAAC,SAAM,WAAU,yDAAwD;AAAA,OAC3E;AAAA;AACF,CACD;AACD,eAAe,cAAgC,uBAAK;AAUpD,IAAM,WAAW;AAAA,EACf,CAAC,EAAE,YAAY,UAAU,GAAG,MAAM,GAAG,QAAQ;AAC3C,UAAM,EAAE,SAAS,IAAI;AACrB,UAAM,KAAK,MAAM,MAAM,GAAG,MAAM,QAAQ,MAAM,OAAO,SAAS,CAAC;AAC/D,UAAM,iBAAiB,WAAW,qCAAqC;AACvE,WACE,qBAAC,SAAI,WAAW,GAAG,kBAAkB,YAAY,OAAO,GACtD;AAAA,0BAAC,kBAAe,IAAQ,UAAoB,KAAW,GAAG,OAAO;AAAA,MACjE,oBAAC,WAAM,SAAS,IAAI,WAAW,GAAG,gBAAgB,YAAY,KAAK,GAChE,UACH;AAAA,OACF;AAAA,EAEJ;AACF;AACA,SAAS,cAAc;AAEvB,IAAO,mBAAQ;;;AD5Ef,SAAS,aAAa;AA0BT,gBAAAA,MAoBP,QAAAC,aApBO;AAbb,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkB;AAChB,QAAM,iBAAiB,CAACC,UAA4B;AAClD,QAAIA,SAAQ,OAAO;AACjB,YAAM,gBAAgB,MAAMA,KAAe;AAC3C,aAAO,gBAAAF,KAAC,iBAAc,MAAM,IAAI;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,OAAO,eAAe,IAAI,IAAI;AAEjD,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MACJ,cAAY,aAAa,YAAY;AAAA,MAEpC;AAAA,sBAAc,gBAAAD,KAAC,UAAK,WAAU,QAAQ,sBAAW;AAAA,QACjD,eACC,gBAAAA,KAAC,oBAAS,IAAI,OAAO,SAAS,YAAY,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG;AAAA,QAEhF,gBAAAC,MAAC,SACC;AAAA,0BAAAD,KAAC,OAAG,iBAAM;AAAA,UACV,gBAAAA,KAAC,OAAE,WAAU,wBAAwB,uBAAY;AAAA,WACnD;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAM;AAAA;AAAA,QACR;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,mBAAQ;","names":["jsx","jsxs","icon"]}
|
|
@@ -1,2 +1,247 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
|
|
31
|
+
// src/components/ui/Select.tsx
|
|
32
|
+
var Select_exports = {};
|
|
33
|
+
__export(Select_exports, {
|
|
34
|
+
default: () => Select_default
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(Select_exports);
|
|
37
|
+
var SelectPrimitive = __toESM(require("@radix-ui/react-select"), 1);
|
|
38
|
+
var import_lucide_react = require("lucide-react");
|
|
39
|
+
var import_react = require("react");
|
|
40
|
+
|
|
41
|
+
// src/lib/utils.ts
|
|
42
|
+
var import_clsx = require("clsx");
|
|
43
|
+
var import_tailwind_merge = require("tailwind-merge");
|
|
44
|
+
function cn(...inputs) {
|
|
45
|
+
return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/components/ui/Label.tsx
|
|
49
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
50
|
+
function Label({ text, className, ...props }) {
|
|
51
|
+
if (!text) return null;
|
|
52
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
53
|
+
"label",
|
|
54
|
+
{
|
|
55
|
+
className: cn(
|
|
56
|
+
"text-xs text-grey-80 peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
|
|
57
|
+
className
|
|
58
|
+
),
|
|
59
|
+
...props,
|
|
60
|
+
children: text
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
var Label_default = Label;
|
|
65
|
+
|
|
66
|
+
// src/components/ui/Chip.tsx
|
|
67
|
+
var import_cva = require("cva");
|
|
68
|
+
var import_tailwind_merge2 = require("tailwind-merge");
|
|
69
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
70
|
+
var Chip = ({ className, variant, size, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: (0, import_tailwind_merge2.twMerge)(chipVariants({ variant, size, className })), ...props });
|
|
71
|
+
var chipVariants = (0, import_cva.cva)(["flex", "items-center", "rounded-3xl", "border", "w-fit"], {
|
|
72
|
+
variants: {
|
|
73
|
+
variant: {
|
|
74
|
+
neutral: ["text-grey-80", "border-grey-10"],
|
|
75
|
+
primary: ["text-purple-100", "border-purple-20"],
|
|
76
|
+
danger: ["text-pumpkin-100", "border-pumpkin-20"],
|
|
77
|
+
onboarding: ["text-green-100", "bg-green-10", "cursor-pointer"],
|
|
78
|
+
onboardingSelected: ["text-white", "bg-green-90", "cursor-pointer"]
|
|
79
|
+
},
|
|
80
|
+
size: {
|
|
81
|
+
small: ["text-sm", "leading-5", "px-2", "py-1", "gap-1.5"],
|
|
82
|
+
medium: ["text-base", "leading-6", "px-3", "py-2", "gap-2"]
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
defaultVariants: {
|
|
86
|
+
variant: "neutral",
|
|
87
|
+
size: "medium"
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
var Chip_default = Chip;
|
|
91
|
+
|
|
92
|
+
// src/components/primitives/separator.tsx
|
|
93
|
+
var SeparatorPrimitive = __toESM(require("@radix-ui/react-separator"), 1);
|
|
94
|
+
var React = __toESM(require("react"), 1);
|
|
95
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
96
|
+
var Separator = React.forwardRef(({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
97
|
+
SeparatorPrimitive.Root,
|
|
98
|
+
{
|
|
99
|
+
ref,
|
|
100
|
+
decorative,
|
|
101
|
+
orientation,
|
|
102
|
+
className: cn(
|
|
103
|
+
"shrink-0 bg-grey-10",
|
|
104
|
+
orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
|
|
105
|
+
className
|
|
106
|
+
),
|
|
107
|
+
...props
|
|
108
|
+
}
|
|
109
|
+
));
|
|
110
|
+
Separator.displayName = SeparatorPrimitive.Root.displayName;
|
|
111
|
+
|
|
112
|
+
// src/components/ui/Select.tsx
|
|
113
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
114
|
+
var Select = (0, import_react.forwardRef)(
|
|
115
|
+
({ label, options, placeholder, multiselect, classNames, ...props }, ref) => {
|
|
116
|
+
const { value, defaultValue, dir, className, onChange, ...rest } = props;
|
|
117
|
+
const [selected, setSelected] = (0, import_react.useState)([]);
|
|
118
|
+
const [open, setOpen] = (0, import_react.useState)(false);
|
|
119
|
+
const containerRef = (0, import_react.useRef)(null);
|
|
120
|
+
(0, import_react.useEffect)(() => {
|
|
121
|
+
if (!value) return setSelected([]);
|
|
122
|
+
setSelected(Array.isArray(value) ? value : [value]);
|
|
123
|
+
}, [value]);
|
|
124
|
+
const toggleOpen = () => setOpen((prev) => !prev);
|
|
125
|
+
const closeOnEscape = (event) => event.key === "Escape" && setOpen(false);
|
|
126
|
+
const setValueOnEnter = (event, value2) => event.key === "Enter" && handleChange(value2);
|
|
127
|
+
const chipLabels = selected?.map((s) => options?.find(({ value: value2 }) => value2 === s)).filter(Boolean);
|
|
128
|
+
function handleLabels() {
|
|
129
|
+
if (multiselect) {
|
|
130
|
+
return selected.map((o) => options?.find((option) => option.value === o)?.title).join(", ");
|
|
131
|
+
}
|
|
132
|
+
return options?.find((option) => option.value === selected.join())?.title;
|
|
133
|
+
}
|
|
134
|
+
function handleOnOpenChange(isOpen) {
|
|
135
|
+
if (!multiselect || isOpen) setOpen(isOpen);
|
|
136
|
+
}
|
|
137
|
+
function handleChange(newValue) {
|
|
138
|
+
let newSelected = [];
|
|
139
|
+
setSelected((prev) => {
|
|
140
|
+
newSelected = prev.includes(newValue) ? prev.filter((item) => item !== newValue) : [...prev, newValue];
|
|
141
|
+
return multiselect ? newSelected : [newValue];
|
|
142
|
+
});
|
|
143
|
+
onChange?.(multiselect ? newSelected : newValue);
|
|
144
|
+
}
|
|
145
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: cn("flex flex-col space-y-2", className), ref: containerRef, children: [
|
|
146
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Label_default, { text: label, className: classNames?.label }),
|
|
147
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
148
|
+
SelectPrimitive.Root,
|
|
149
|
+
{
|
|
150
|
+
open,
|
|
151
|
+
value: selected.join(","),
|
|
152
|
+
onOpenChange: handleOnOpenChange,
|
|
153
|
+
onValueChange: multiselect ? void 0 : handleChange,
|
|
154
|
+
defaultValue: typeof defaultValue === "string" ? defaultValue : void 0,
|
|
155
|
+
dir: dir === "rtl" ? "rtl" : "ltr",
|
|
156
|
+
...rest,
|
|
157
|
+
children: [
|
|
158
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
159
|
+
SelectPrimitive.Trigger,
|
|
160
|
+
{
|
|
161
|
+
ref,
|
|
162
|
+
"data-testid": `${label.toLowerCase()}-select-element`,
|
|
163
|
+
className: "group flex min-w-80 flex-row items-center justify-between gap-3 rounded-lg border border-grey-20 px-4 py-3 text-sm font-normal focus:outline-purple-100 disabled:bg-grey-5 data-[placeholder]:text-grey-50 data-[placeholder]:disabled:text-grey-40",
|
|
164
|
+
children: [
|
|
165
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "truncate", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
166
|
+
SelectPrimitive.Value,
|
|
167
|
+
{
|
|
168
|
+
placeholder: placeholder ?? "Select an option",
|
|
169
|
+
"aria-label": handleLabels(),
|
|
170
|
+
children: handleLabels()
|
|
171
|
+
}
|
|
172
|
+
) }),
|
|
173
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
174
|
+
import_lucide_react.ChevronDownIcon,
|
|
175
|
+
{
|
|
176
|
+
className: "transform text-black group-data-[state=open]:rotate-180",
|
|
177
|
+
size: "16"
|
|
178
|
+
}
|
|
179
|
+
)
|
|
180
|
+
]
|
|
181
|
+
}
|
|
182
|
+
),
|
|
183
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SelectPrimitive.Portal, { container: containerRef.current, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
184
|
+
SelectPrimitive.Content,
|
|
185
|
+
{
|
|
186
|
+
hideWhenDetached: true,
|
|
187
|
+
className: "z-10 max-h-[var(--radix-select-content-available-height)] w-[var(--radix-select-trigger-width)] overflow-hidden rounded-md bg-white py-2 shadow-lg",
|
|
188
|
+
position: "popper",
|
|
189
|
+
sideOffset: 4,
|
|
190
|
+
onPointerDownOutside: toggleOpen,
|
|
191
|
+
onKeyDown: closeOnEscape,
|
|
192
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(SelectPrimitive.Viewport, { children: [
|
|
193
|
+
multiselect && !!chipLabels?.length && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
194
|
+
SelectPrimitive.Group,
|
|
195
|
+
{
|
|
196
|
+
className: "mb-2 flex flex-row flex-wrap gap-1 px-2",
|
|
197
|
+
"data-testid": "selected-labels",
|
|
198
|
+
children: chipLabels?.map(
|
|
199
|
+
(chip) => chip && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Chip_default, { size: "small", variant: "primary", children: [
|
|
200
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: chip.title }),
|
|
201
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
202
|
+
import_lucide_react.X,
|
|
203
|
+
{
|
|
204
|
+
size: 18,
|
|
205
|
+
"data-testid": `chip-remove-${chip.value}`,
|
|
206
|
+
className: "cursor-pointer",
|
|
207
|
+
onClick: () => handleChange(chip.value)
|
|
208
|
+
}
|
|
209
|
+
)
|
|
210
|
+
] }, chip.title)
|
|
211
|
+
)
|
|
212
|
+
}
|
|
213
|
+
),
|
|
214
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Separator, {}),
|
|
215
|
+
options?.map(({ id, title, value: value2 }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
216
|
+
SelectPrimitive.Item,
|
|
217
|
+
{
|
|
218
|
+
value: value2,
|
|
219
|
+
className: "group relative cursor-pointer px-4 py-2 text-left text-sm hover:bg-purple-50 focus:bg-purple-50 focus:outline-none data-[state=checked]:bg-purple-50 data-[state=checked]:pr-10 data-[state=checked]:text-purple-100",
|
|
220
|
+
"data-state": selected.includes(value2) ? "checked" : "unchecked",
|
|
221
|
+
onKeyDown: (e) => setValueOnEnter(e, value2),
|
|
222
|
+
onClick: () => handleChange(value2),
|
|
223
|
+
children: [
|
|
224
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SelectPrimitive.ItemText, { children: title }),
|
|
225
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
226
|
+
import_lucide_react.CheckIcon,
|
|
227
|
+
{
|
|
228
|
+
className: "absolute inset-y-0 right-3 my-auto hidden w-6 text-purple-100 group-data-[state=checked]:block",
|
|
229
|
+
size: 16
|
|
230
|
+
}
|
|
231
|
+
)
|
|
232
|
+
]
|
|
233
|
+
},
|
|
234
|
+
id
|
|
235
|
+
))
|
|
236
|
+
] })
|
|
237
|
+
}
|
|
238
|
+
) })
|
|
239
|
+
]
|
|
240
|
+
}
|
|
241
|
+
)
|
|
242
|
+
] });
|
|
243
|
+
}
|
|
244
|
+
);
|
|
245
|
+
Select.displayName = "Select";
|
|
246
|
+
var Select_default = Select;
|
|
2
247
|
//# sourceMappingURL=Select.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/ui/Select.tsx","../../../src/lib/utils.ts","../../../src/components/ui/Label.tsx","../../../src/components/ui/Chip.tsx","../../../src/components/primitives/separator.tsx"],"sourcesContent":["'use client'\n\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { CheckIcon, ChevronDownIcon, X } from 'lucide-react'\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type KeyboardEvent,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport Label from '@/components/ui/Label'\nimport Chip from '@/components/ui/Chip'\nimport { Separator } from '@/components/primitives/separator'\nimport { cn } from '@/lib/utils'\n\ninterface Props extends Omit<ComponentPropsWithoutRef<'select'>, 'value' | 'onChange'> {\n label: string\n value?: string | string[]\n options?: { id: string | number; value: string; title: string }[]\n placeholder?: string\n multiselect?: boolean\n onChange?: (value: string | string[]) => void\n classNames?: { label?: string }\n}\n\nconst Select = forwardRef<HTMLButtonElement, Props>(\n ({ label, options, placeholder, multiselect, classNames, ...props }, ref) => {\n const { value, defaultValue, dir, className, onChange, ...rest } = props\n const [selected, setSelected] = useState<string[]>([])\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!value) return setSelected([])\n setSelected(Array.isArray(value) ? value : [value])\n }, [value])\n\n const toggleOpen = () => setOpen((prev) => !prev)\n const closeOnEscape = (event: KeyboardEvent) => event.key === 'Escape' && setOpen(false)\n const setValueOnEnter = (event: KeyboardEvent, value: string) =>\n event.key === 'Enter' && handleChange(value)\n\n const chipLabels = selected\n ?.map((s) => options?.find(({ value }) => value === s))\n .filter(Boolean)\n\n function handleLabels() {\n if (multiselect) {\n return selected.map((o) => options?.find((option) => option.value === o)?.title).join(', ')\n }\n return options?.find((option) => option.value === selected.join())?.title\n }\n\n function handleOnOpenChange(isOpen: boolean) {\n if (!multiselect || isOpen) setOpen(isOpen)\n }\n\n function handleChange(newValue: string) {\n let newSelected: string[] = []\n setSelected((prev) => {\n newSelected = prev.includes(newValue)\n ? prev.filter((item) => item !== newValue)\n : [...prev, newValue]\n return multiselect ? newSelected : [newValue]\n })\n onChange?.(multiselect ? newSelected : newValue)\n }\n\n return (\n <div className={cn('flex flex-col space-y-2', className)} ref={containerRef}>\n <Label text={label} className={classNames?.label} />\n\n <SelectPrimitive.Root\n open={open}\n value={selected.join(',')}\n onOpenChange={handleOnOpenChange}\n onValueChange={multiselect ? undefined : handleChange}\n defaultValue={typeof defaultValue === 'string' ? defaultValue : undefined}\n dir={dir === 'rtl' ? 'rtl' : 'ltr'}\n {...rest}\n >\n <SelectPrimitive.Trigger\n ref={ref}\n data-testid={`${label.toLowerCase()}-select-element`}\n className=\"group flex min-w-80 flex-row items-center justify-between gap-3 rounded-lg border border-grey-20 px-4 py-3 text-sm font-normal focus:outline-purple-100 disabled:bg-grey-5 data-[placeholder]:text-grey-50 data-[placeholder]:disabled:text-grey-40\"\n >\n <span className=\"truncate\">\n <SelectPrimitive.Value\n placeholder={placeholder ?? 'Select an option'}\n aria-label={handleLabels()}\n >\n {handleLabels()}\n </SelectPrimitive.Value>\n </span>\n\n <ChevronDownIcon\n className=\"transform text-black group-data-[state=open]:rotate-180\"\n size=\"16\"\n />\n </SelectPrimitive.Trigger>\n\n <SelectPrimitive.Portal container={containerRef.current}>\n <SelectPrimitive.Content\n hideWhenDetached\n className=\"z-10 max-h-[var(--radix-select-content-available-height)] w-[var(--radix-select-trigger-width)] overflow-hidden rounded-md bg-white py-2 shadow-lg\"\n position=\"popper\"\n sideOffset={4}\n onPointerDownOutside={toggleOpen}\n onKeyDown={closeOnEscape}\n >\n <SelectPrimitive.Viewport>\n {multiselect && !!chipLabels?.length && (\n <SelectPrimitive.Group\n className=\"mb-2 flex flex-row flex-wrap gap-1 px-2\"\n data-testid=\"selected-labels\"\n >\n {chipLabels?.map(\n (chip) =>\n chip && (\n <Chip key={chip.title} size=\"small\" variant=\"primary\">\n <span>{chip.title}</span>\n <X\n size={18}\n data-testid={`chip-remove-${chip.value}`}\n className=\"cursor-pointer\"\n onClick={() => handleChange(chip.value)}\n />\n </Chip>\n )\n )}\n </SelectPrimitive.Group>\n )}\n <Separator />\n {options?.map(({ id, title, value }) => (\n <SelectPrimitive.Item\n key={id}\n value={value}\n className=\"group relative cursor-pointer px-4 py-2 text-left text-sm hover:bg-purple-50 focus:bg-purple-50 focus:outline-none data-[state=checked]:bg-purple-50 data-[state=checked]:pr-10 data-[state=checked]:text-purple-100\"\n data-state={selected.includes(value) ? 'checked' : 'unchecked'}\n onKeyDown={(e) => setValueOnEnter(e, value)}\n onClick={() => handleChange(value)}\n >\n <SelectPrimitive.ItemText>{title}</SelectPrimitive.ItemText>\n <CheckIcon\n className=\"absolute inset-y-0 right-3 my-auto hidden w-6 text-purple-100 group-data-[state=checked]:block\"\n size={16}\n />\n </SelectPrimitive.Item>\n ))}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n </SelectPrimitive.Root>\n </div>\n )\n }\n)\n\nSelect.displayName = 'Select'\n\nexport default Select\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { type ComponentPropsWithoutRef } from 'react'\n\nimport { cn } from '@/lib/utils'\n\ninterface Props extends ComponentPropsWithoutRef<'label'> {\n text?: string\n}\n\nfunction Label({ text, className, ...props }: Readonly<Props>) {\n if (!text) return null\n\n return (\n <label\n className={cn(\n 'text-xs text-grey-80 peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className\n )}\n {...props}\n >\n {text}\n </label>\n )\n}\n\nexport default Label\n","import { cva, type VariantProps } from 'cva'\nimport React from 'react'\nimport { twMerge } from 'tailwind-merge'\n\ninterface ChipProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof chipVariants> {}\n\nconst Chip = ({ className, variant, size, ...props }: ChipProps) => (\n <div className={twMerge(chipVariants({ variant, size, className }))} {...props} />\n)\n\nconst chipVariants = cva(['flex', 'items-center', 'rounded-3xl', 'border', 'w-fit'], {\n variants: {\n variant: {\n neutral: ['text-grey-80', 'border-grey-10'],\n primary: ['text-purple-100', 'border-purple-20'],\n danger: ['text-pumpkin-100', 'border-pumpkin-20'],\n onboarding: ['text-green-100', 'bg-green-10', 'cursor-pointer'],\n onboardingSelected: ['text-white', 'bg-green-90', 'cursor-pointer'],\n },\n size: {\n small: ['text-sm', 'leading-5', 'px-2', 'py-1', 'gap-1.5'],\n medium: ['text-base', 'leading-6', 'px-3', 'py-2', 'gap-2'],\n },\n },\n defaultVariants: {\n variant: 'neutral',\n size: 'medium',\n },\n})\n\nexport default Chip\n","'use client'\r\n\r\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\r\nimport * as React from 'react'\r\n\r\nimport { cn } from '@/lib/utils'\r\n\r\nconst Separator = React.forwardRef<\r\n React.ElementRef<typeof SeparatorPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\r\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\r\n <SeparatorPrimitive.Root\r\n ref={ref}\r\n decorative={decorative}\r\n orientation={orientation}\r\n className={cn(\r\n 'shrink-0 bg-grey-10',\r\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nSeparator.displayName = SeparatorPrimitive.Root.displayName\r\n\r\nexport { Separator }\r\n"],"mappings":"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","names":["Select_exports","__export","Select_default","__toCommonJS","SelectPrimitive","import_lucide_react","import_react","import_clsx","import_tailwind_merge","cn","inputs","import_jsx_runtime","Label","text","className","props","cn","Label_default","import_cva","import_tailwind_merge","import_jsx_runtime","Chip","className","variant","size","props","chipVariants","Chip_default","SeparatorPrimitive","React","import_jsx_runtime","Separator","className","orientation","decorative","props","ref","cn","import_jsx_runtime","Select","label","options","placeholder","multiselect","classNames","props","ref","value","defaultValue","dir","className","onChange","rest","selected","setSelected","open","setOpen","containerRef","toggleOpen","prev","closeOnEscape","event","setValueOnEnter","handleChange","chipLabels","s","handleLabels","o","option","handleOnOpenChange","isOpen","newValue","newSelected","item","cn","Label_default","chip","Chip_default","Separator","id","title","e","Select_default"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ui/Select.tsx","../../../src/lib/utils.ts","../../../src/components/ui/Label.tsx","../../../src/components/ui/Chip.tsx","../../../src/components/primitives/separator.tsx"],"sourcesContent":["'use client'\n\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { CheckIcon, ChevronDownIcon, X } from 'lucide-react'\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type KeyboardEvent,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport Label from '@/components/ui/Label'\nimport Chip from '@/components/ui/Chip'\nimport { Separator } from '@/components/primitives/separator'\nimport { cn } from '@/lib/utils'\n\ninterface Props extends Omit<ComponentPropsWithoutRef<'select'>, 'value' | 'onChange'> {\n label: string\n value?: string | string[]\n options?: { id: string | number; value: string; title: string }[]\n placeholder?: string\n multiselect?: boolean\n onChange?: (value: string | string[]) => void\n classNames?: { label?: string }\n}\n\nconst Select = forwardRef<HTMLButtonElement, Props>(\n ({ label, options, placeholder, multiselect, classNames, ...props }, ref) => {\n const { value, defaultValue, dir, className, onChange, ...rest } = props\n const [selected, setSelected] = useState<string[]>([])\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!value) return setSelected([])\n setSelected(Array.isArray(value) ? value : [value])\n }, [value])\n\n const toggleOpen = () => setOpen((prev) => !prev)\n const closeOnEscape = (event: KeyboardEvent) => event.key === 'Escape' && setOpen(false)\n const setValueOnEnter = (event: KeyboardEvent, value: string) =>\n event.key === 'Enter' && handleChange(value)\n\n const chipLabels = selected\n ?.map((s) => options?.find(({ value }) => value === s))\n .filter(Boolean)\n\n function handleLabels() {\n if (multiselect) {\n return selected.map((o) => options?.find((option) => option.value === o)?.title).join(', ')\n }\n return options?.find((option) => option.value === selected.join())?.title\n }\n\n function handleOnOpenChange(isOpen: boolean) {\n if (!multiselect || isOpen) setOpen(isOpen)\n }\n\n function handleChange(newValue: string) {\n let newSelected: string[] = []\n setSelected((prev) => {\n newSelected = prev.includes(newValue)\n ? prev.filter((item) => item !== newValue)\n : [...prev, newValue]\n return multiselect ? newSelected : [newValue]\n })\n onChange?.(multiselect ? newSelected : newValue)\n }\n\n return (\n <div className={cn('flex flex-col space-y-2', className)} ref={containerRef}>\n <Label text={label} className={classNames?.label} />\n\n <SelectPrimitive.Root\n open={open}\n value={selected.join(',')}\n onOpenChange={handleOnOpenChange}\n onValueChange={multiselect ? undefined : handleChange}\n defaultValue={typeof defaultValue === 'string' ? defaultValue : undefined}\n dir={dir === 'rtl' ? 'rtl' : 'ltr'}\n {...rest}\n >\n <SelectPrimitive.Trigger\n ref={ref}\n data-testid={`${label.toLowerCase()}-select-element`}\n className=\"group flex min-w-80 flex-row items-center justify-between gap-3 rounded-lg border border-grey-20 px-4 py-3 text-sm font-normal focus:outline-purple-100 disabled:bg-grey-5 data-[placeholder]:text-grey-50 data-[placeholder]:disabled:text-grey-40\"\n >\n <span className=\"truncate\">\n <SelectPrimitive.Value\n placeholder={placeholder ?? 'Select an option'}\n aria-label={handleLabels()}\n >\n {handleLabels()}\n </SelectPrimitive.Value>\n </span>\n\n <ChevronDownIcon\n className=\"transform text-black group-data-[state=open]:rotate-180\"\n size=\"16\"\n />\n </SelectPrimitive.Trigger>\n\n <SelectPrimitive.Portal container={containerRef.current}>\n <SelectPrimitive.Content\n hideWhenDetached\n className=\"z-10 max-h-[var(--radix-select-content-available-height)] w-[var(--radix-select-trigger-width)] overflow-hidden rounded-md bg-white py-2 shadow-lg\"\n position=\"popper\"\n sideOffset={4}\n onPointerDownOutside={toggleOpen}\n onKeyDown={closeOnEscape}\n >\n <SelectPrimitive.Viewport>\n {multiselect && !!chipLabels?.length && (\n <SelectPrimitive.Group\n className=\"mb-2 flex flex-row flex-wrap gap-1 px-2\"\n data-testid=\"selected-labels\"\n >\n {chipLabels?.map(\n (chip) =>\n chip && (\n <Chip key={chip.title} size=\"small\" variant=\"primary\">\n <span>{chip.title}</span>\n <X\n size={18}\n data-testid={`chip-remove-${chip.value}`}\n className=\"cursor-pointer\"\n onClick={() => handleChange(chip.value)}\n />\n </Chip>\n )\n )}\n </SelectPrimitive.Group>\n )}\n <Separator />\n {options?.map(({ id, title, value }) => (\n <SelectPrimitive.Item\n key={id}\n value={value}\n className=\"group relative cursor-pointer px-4 py-2 text-left text-sm hover:bg-purple-50 focus:bg-purple-50 focus:outline-none data-[state=checked]:bg-purple-50 data-[state=checked]:pr-10 data-[state=checked]:text-purple-100\"\n data-state={selected.includes(value) ? 'checked' : 'unchecked'}\n onKeyDown={(e) => setValueOnEnter(e, value)}\n onClick={() => handleChange(value)}\n >\n <SelectPrimitive.ItemText>{title}</SelectPrimitive.ItemText>\n <CheckIcon\n className=\"absolute inset-y-0 right-3 my-auto hidden w-6 text-purple-100 group-data-[state=checked]:block\"\n size={16}\n />\n </SelectPrimitive.Item>\n ))}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n </SelectPrimitive.Root>\n </div>\n )\n }\n)\n\nSelect.displayName = 'Select'\n\nexport default Select\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { type ComponentPropsWithoutRef } from 'react'\n\nimport { cn } from '@/lib/utils'\n\ninterface Props extends ComponentPropsWithoutRef<'label'> {\n text?: string\n}\n\nfunction Label({ text, className, ...props }: Readonly<Props>) {\n if (!text) return null\n\n return (\n <label\n className={cn(\n 'text-xs text-grey-80 peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className\n )}\n {...props}\n >\n {text}\n </label>\n )\n}\n\nexport default Label\n","import { cva, type VariantProps } from 'cva'\nimport React from 'react'\nimport { twMerge } from 'tailwind-merge'\n\ninterface ChipProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof chipVariants> {}\n\nconst Chip = ({ className, variant, size, ...props }: ChipProps) => (\n <div className={twMerge(chipVariants({ variant, size, className }))} {...props} />\n)\n\nconst chipVariants = cva(['flex', 'items-center', 'rounded-3xl', 'border', 'w-fit'], {\n variants: {\n variant: {\n neutral: ['text-grey-80', 'border-grey-10'],\n primary: ['text-purple-100', 'border-purple-20'],\n danger: ['text-pumpkin-100', 'border-pumpkin-20'],\n onboarding: ['text-green-100', 'bg-green-10', 'cursor-pointer'],\n onboardingSelected: ['text-white', 'bg-green-90', 'cursor-pointer'],\n },\n size: {\n small: ['text-sm', 'leading-5', 'px-2', 'py-1', 'gap-1.5'],\n medium: ['text-base', 'leading-6', 'px-3', 'py-2', 'gap-2'],\n },\n },\n defaultVariants: {\n variant: 'neutral',\n size: 'medium',\n },\n})\n\nexport default Chip\n","'use client'\r\n\r\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\r\nimport * as React from 'react'\r\n\r\nimport { cn } from '@/lib/utils'\r\n\r\nconst Separator = React.forwardRef<\r\n React.ElementRef<typeof SeparatorPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\r\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\r\n <SeparatorPrimitive.Root\r\n ref={ref}\r\n decorative={decorative}\r\n orientation={orientation}\r\n className={cn(\r\n 'shrink-0 bg-grey-10',\r\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nSeparator.displayName = SeparatorPrimitive.Root.displayName\r\n\r\nexport { Separator }\r\n"],"mappings":"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","names":["import_tailwind_merge","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","value"]}
|
|
@@ -1,2 +1,222 @@
|
|
|
1
|
-
"use client";
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/components/ui/Select.tsx
|
|
4
|
+
import * as SelectPrimitive from "@radix-ui/react-select";
|
|
5
|
+
import { CheckIcon, ChevronDownIcon, X } from "lucide-react";
|
|
6
|
+
import {
|
|
7
|
+
forwardRef as forwardRef2,
|
|
8
|
+
useEffect,
|
|
9
|
+
useRef,
|
|
10
|
+
useState
|
|
11
|
+
} from "react";
|
|
12
|
+
|
|
13
|
+
// src/lib/utils.ts
|
|
14
|
+
import { clsx } from "clsx";
|
|
15
|
+
import { twMerge } from "tailwind-merge";
|
|
16
|
+
function cn(...inputs) {
|
|
17
|
+
return twMerge(clsx(inputs));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// src/components/ui/Label.tsx
|
|
21
|
+
import { jsx } from "react/jsx-runtime";
|
|
22
|
+
function Label({ text, className, ...props }) {
|
|
23
|
+
if (!text) return null;
|
|
24
|
+
return /* @__PURE__ */ jsx(
|
|
25
|
+
"label",
|
|
26
|
+
{
|
|
27
|
+
className: cn(
|
|
28
|
+
"text-xs text-grey-80 peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
|
|
29
|
+
className
|
|
30
|
+
),
|
|
31
|
+
...props,
|
|
32
|
+
children: text
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
var Label_default = Label;
|
|
37
|
+
|
|
38
|
+
// src/components/ui/Chip.tsx
|
|
39
|
+
import { cva } from "cva";
|
|
40
|
+
import { twMerge as twMerge2 } from "tailwind-merge";
|
|
41
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
42
|
+
var Chip = ({ className, variant, size, ...props }) => /* @__PURE__ */ jsx2("div", { className: twMerge2(chipVariants({ variant, size, className })), ...props });
|
|
43
|
+
var chipVariants = cva(["flex", "items-center", "rounded-3xl", "border", "w-fit"], {
|
|
44
|
+
variants: {
|
|
45
|
+
variant: {
|
|
46
|
+
neutral: ["text-grey-80", "border-grey-10"],
|
|
47
|
+
primary: ["text-purple-100", "border-purple-20"],
|
|
48
|
+
danger: ["text-pumpkin-100", "border-pumpkin-20"],
|
|
49
|
+
onboarding: ["text-green-100", "bg-green-10", "cursor-pointer"],
|
|
50
|
+
onboardingSelected: ["text-white", "bg-green-90", "cursor-pointer"]
|
|
51
|
+
},
|
|
52
|
+
size: {
|
|
53
|
+
small: ["text-sm", "leading-5", "px-2", "py-1", "gap-1.5"],
|
|
54
|
+
medium: ["text-base", "leading-6", "px-3", "py-2", "gap-2"]
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
defaultVariants: {
|
|
58
|
+
variant: "neutral",
|
|
59
|
+
size: "medium"
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
var Chip_default = Chip;
|
|
63
|
+
|
|
64
|
+
// src/components/primitives/separator.tsx
|
|
65
|
+
import * as SeparatorPrimitive from "@radix-ui/react-separator";
|
|
66
|
+
import * as React from "react";
|
|
67
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
68
|
+
var Separator = React.forwardRef(({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsx3(
|
|
69
|
+
SeparatorPrimitive.Root,
|
|
70
|
+
{
|
|
71
|
+
ref,
|
|
72
|
+
decorative,
|
|
73
|
+
orientation,
|
|
74
|
+
className: cn(
|
|
75
|
+
"shrink-0 bg-grey-10",
|
|
76
|
+
orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
|
|
77
|
+
className
|
|
78
|
+
),
|
|
79
|
+
...props
|
|
80
|
+
}
|
|
81
|
+
));
|
|
82
|
+
Separator.displayName = SeparatorPrimitive.Root.displayName;
|
|
83
|
+
|
|
84
|
+
// src/components/ui/Select.tsx
|
|
85
|
+
import { jsx as jsx4, jsxs } from "react/jsx-runtime";
|
|
86
|
+
var Select = forwardRef2(
|
|
87
|
+
({ label, options, placeholder, multiselect, classNames, ...props }, ref) => {
|
|
88
|
+
const { value, defaultValue, dir, className, onChange, ...rest } = props;
|
|
89
|
+
const [selected, setSelected] = useState([]);
|
|
90
|
+
const [open, setOpen] = useState(false);
|
|
91
|
+
const containerRef = useRef(null);
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
if (!value) return setSelected([]);
|
|
94
|
+
setSelected(Array.isArray(value) ? value : [value]);
|
|
95
|
+
}, [value]);
|
|
96
|
+
const toggleOpen = () => setOpen((prev) => !prev);
|
|
97
|
+
const closeOnEscape = (event) => event.key === "Escape" && setOpen(false);
|
|
98
|
+
const setValueOnEnter = (event, value2) => event.key === "Enter" && handleChange(value2);
|
|
99
|
+
const chipLabels = selected?.map((s) => options?.find(({ value: value2 }) => value2 === s)).filter(Boolean);
|
|
100
|
+
function handleLabels() {
|
|
101
|
+
if (multiselect) {
|
|
102
|
+
return selected.map((o) => options?.find((option) => option.value === o)?.title).join(", ");
|
|
103
|
+
}
|
|
104
|
+
return options?.find((option) => option.value === selected.join())?.title;
|
|
105
|
+
}
|
|
106
|
+
function handleOnOpenChange(isOpen) {
|
|
107
|
+
if (!multiselect || isOpen) setOpen(isOpen);
|
|
108
|
+
}
|
|
109
|
+
function handleChange(newValue) {
|
|
110
|
+
let newSelected = [];
|
|
111
|
+
setSelected((prev) => {
|
|
112
|
+
newSelected = prev.includes(newValue) ? prev.filter((item) => item !== newValue) : [...prev, newValue];
|
|
113
|
+
return multiselect ? newSelected : [newValue];
|
|
114
|
+
});
|
|
115
|
+
onChange?.(multiselect ? newSelected : newValue);
|
|
116
|
+
}
|
|
117
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col space-y-2", className), ref: containerRef, children: [
|
|
118
|
+
/* @__PURE__ */ jsx4(Label_default, { text: label, className: classNames?.label }),
|
|
119
|
+
/* @__PURE__ */ jsxs(
|
|
120
|
+
SelectPrimitive.Root,
|
|
121
|
+
{
|
|
122
|
+
open,
|
|
123
|
+
value: selected.join(","),
|
|
124
|
+
onOpenChange: handleOnOpenChange,
|
|
125
|
+
onValueChange: multiselect ? void 0 : handleChange,
|
|
126
|
+
defaultValue: typeof defaultValue === "string" ? defaultValue : void 0,
|
|
127
|
+
dir: dir === "rtl" ? "rtl" : "ltr",
|
|
128
|
+
...rest,
|
|
129
|
+
children: [
|
|
130
|
+
/* @__PURE__ */ jsxs(
|
|
131
|
+
SelectPrimitive.Trigger,
|
|
132
|
+
{
|
|
133
|
+
ref,
|
|
134
|
+
"data-testid": `${label.toLowerCase()}-select-element`,
|
|
135
|
+
className: "group flex min-w-80 flex-row items-center justify-between gap-3 rounded-lg border border-grey-20 px-4 py-3 text-sm font-normal focus:outline-purple-100 disabled:bg-grey-5 data-[placeholder]:text-grey-50 data-[placeholder]:disabled:text-grey-40",
|
|
136
|
+
children: [
|
|
137
|
+
/* @__PURE__ */ jsx4("span", { className: "truncate", children: /* @__PURE__ */ jsx4(
|
|
138
|
+
SelectPrimitive.Value,
|
|
139
|
+
{
|
|
140
|
+
placeholder: placeholder ?? "Select an option",
|
|
141
|
+
"aria-label": handleLabels(),
|
|
142
|
+
children: handleLabels()
|
|
143
|
+
}
|
|
144
|
+
) }),
|
|
145
|
+
/* @__PURE__ */ jsx4(
|
|
146
|
+
ChevronDownIcon,
|
|
147
|
+
{
|
|
148
|
+
className: "transform text-black group-data-[state=open]:rotate-180",
|
|
149
|
+
size: "16"
|
|
150
|
+
}
|
|
151
|
+
)
|
|
152
|
+
]
|
|
153
|
+
}
|
|
154
|
+
),
|
|
155
|
+
/* @__PURE__ */ jsx4(SelectPrimitive.Portal, { container: containerRef.current, children: /* @__PURE__ */ jsx4(
|
|
156
|
+
SelectPrimitive.Content,
|
|
157
|
+
{
|
|
158
|
+
hideWhenDetached: true,
|
|
159
|
+
className: "z-10 max-h-[var(--radix-select-content-available-height)] w-[var(--radix-select-trigger-width)] overflow-hidden rounded-md bg-white py-2 shadow-lg",
|
|
160
|
+
position: "popper",
|
|
161
|
+
sideOffset: 4,
|
|
162
|
+
onPointerDownOutside: toggleOpen,
|
|
163
|
+
onKeyDown: closeOnEscape,
|
|
164
|
+
children: /* @__PURE__ */ jsxs(SelectPrimitive.Viewport, { children: [
|
|
165
|
+
multiselect && !!chipLabels?.length && /* @__PURE__ */ jsx4(
|
|
166
|
+
SelectPrimitive.Group,
|
|
167
|
+
{
|
|
168
|
+
className: "mb-2 flex flex-row flex-wrap gap-1 px-2",
|
|
169
|
+
"data-testid": "selected-labels",
|
|
170
|
+
children: chipLabels?.map(
|
|
171
|
+
(chip) => chip && /* @__PURE__ */ jsxs(Chip_default, { size: "small", variant: "primary", children: [
|
|
172
|
+
/* @__PURE__ */ jsx4("span", { children: chip.title }),
|
|
173
|
+
/* @__PURE__ */ jsx4(
|
|
174
|
+
X,
|
|
175
|
+
{
|
|
176
|
+
size: 18,
|
|
177
|
+
"data-testid": `chip-remove-${chip.value}`,
|
|
178
|
+
className: "cursor-pointer",
|
|
179
|
+
onClick: () => handleChange(chip.value)
|
|
180
|
+
}
|
|
181
|
+
)
|
|
182
|
+
] }, chip.title)
|
|
183
|
+
)
|
|
184
|
+
}
|
|
185
|
+
),
|
|
186
|
+
/* @__PURE__ */ jsx4(Separator, {}),
|
|
187
|
+
options?.map(({ id, title, value: value2 }) => /* @__PURE__ */ jsxs(
|
|
188
|
+
SelectPrimitive.Item,
|
|
189
|
+
{
|
|
190
|
+
value: value2,
|
|
191
|
+
className: "group relative cursor-pointer px-4 py-2 text-left text-sm hover:bg-purple-50 focus:bg-purple-50 focus:outline-none data-[state=checked]:bg-purple-50 data-[state=checked]:pr-10 data-[state=checked]:text-purple-100",
|
|
192
|
+
"data-state": selected.includes(value2) ? "checked" : "unchecked",
|
|
193
|
+
onKeyDown: (e) => setValueOnEnter(e, value2),
|
|
194
|
+
onClick: () => handleChange(value2),
|
|
195
|
+
children: [
|
|
196
|
+
/* @__PURE__ */ jsx4(SelectPrimitive.ItemText, { children: title }),
|
|
197
|
+
/* @__PURE__ */ jsx4(
|
|
198
|
+
CheckIcon,
|
|
199
|
+
{
|
|
200
|
+
className: "absolute inset-y-0 right-3 my-auto hidden w-6 text-purple-100 group-data-[state=checked]:block",
|
|
201
|
+
size: 16
|
|
202
|
+
}
|
|
203
|
+
)
|
|
204
|
+
]
|
|
205
|
+
},
|
|
206
|
+
id
|
|
207
|
+
))
|
|
208
|
+
] })
|
|
209
|
+
}
|
|
210
|
+
) })
|
|
211
|
+
]
|
|
212
|
+
}
|
|
213
|
+
)
|
|
214
|
+
] });
|
|
215
|
+
}
|
|
216
|
+
);
|
|
217
|
+
Select.displayName = "Select";
|
|
218
|
+
var Select_default = Select;
|
|
219
|
+
export {
|
|
220
|
+
Select_default as default
|
|
221
|
+
};
|
|
2
222
|
//# sourceMappingURL=Select.js.map
|