@solace-health/ui 0.10.507 → 0.10.509
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/dist/chunk-2UIICL2U.cjs +2 -0
- package/dist/chunk-2UIICL2U.cjs.map +1 -0
- package/dist/{chunk-RH56SIYL.cjs → chunk-6LV6REZO.cjs} +2 -2
- package/dist/{chunk-RH56SIYL.cjs.map → chunk-6LV6REZO.cjs.map} +1 -1
- package/dist/chunk-MQL5R4MD.js +2 -0
- package/dist/chunk-MQL5R4MD.js.map +1 -0
- package/dist/chunk-MYZ4DUFT.cjs +2 -0
- package/dist/chunk-MYZ4DUFT.cjs.map +1 -0
- package/dist/chunk-O3OZOSXT.js +2 -0
- package/dist/chunk-O3OZOSXT.js.map +1 -0
- package/dist/chunk-QJVDJTD4.cjs +2 -0
- package/dist/chunk-QJVDJTD4.cjs.map +1 -0
- package/dist/{chunk-LNCG5XTP.js → chunk-QVOCV3VP.js} +2 -2
- package/dist/{chunk-LNCG5XTP.js.map → chunk-QVOCV3VP.js.map} +1 -1
- package/dist/chunk-ZO25Y6HY.js +2 -0
- package/dist/chunk-ZO25Y6HY.js.map +1 -0
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/v2/combobox/combobox.cjs +1 -1
- package/dist/v2/combobox/combobox.d.ts +8 -5
- package/dist/v2/combobox/combobox.js +1 -1
- package/dist/v2/combobox/combobox.stories.d.ts +1 -0
- package/dist/v2/combobox/dummy-data.cjs +2 -0
- package/dist/v2/combobox/dummy-data.cjs.map +1 -0
- package/dist/v2/combobox/dummy-data.d.ts +4 -0
- package/dist/v2/combobox/dummy-data.js +2 -0
- package/dist/v2/combobox/dummy-data.js.map +1 -0
- package/dist/v2/index.cjs +1 -1
- package/dist/v2/index.js +1 -1
- package/dist/v2/input/input.cjs +1 -1
- package/dist/v2/input/input.js +1 -1
- package/dist/v2/multiselect/multiselect.cjs +1 -1
- package/dist/v2/multiselect/multiselect.d.ts +1 -0
- package/dist/v2/multiselect/multiselect.js +1 -1
- package/dist/v2/switch/switch.cjs +1 -1
- package/dist/v2/switch/switch.d.ts +6 -4
- package/dist/v2/switch/switch.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-ESO2MGAY.cjs +0 -2
- package/dist/chunk-ESO2MGAY.cjs.map +0 -1
- package/dist/chunk-FZ4SG3S6.js +0 -2
- package/dist/chunk-FZ4SG3S6.js.map +0 -1
- package/dist/chunk-MBKRMANH.cjs +0 -2
- package/dist/chunk-MBKRMANH.cjs.map +0 -1
- package/dist/chunk-QITLI6MY.cjs +0 -2
- package/dist/chunk-QITLI6MY.cjs.map +0 -1
- package/dist/chunk-WSS5BEPI.js +0 -2
- package/dist/chunk-WSS5BEPI.js.map +0 -1
- package/dist/chunk-XRGEQXJG.js +0 -2
- package/dist/chunk-XRGEQXJG.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkQRO22BPZ_cjs=require('./chunk-QRO22BPZ.cjs'),r=require('@radix-ui/react-switch'),react=require('react'),jsxRuntime=require('react/jsx-runtime');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var r__namespace=/*#__PURE__*/_interopNamespace(r);function x({className:d,showLabels:t=false,onLabel:i="On",offLabel:n="Off",...e}){let[h,m]=react.useState(0),s=react.useRef(null);react.useEffect(()=>{t&&s.current&&m(s.current.offsetWidth);},[t,i,n]);let c=t?Math.max(44,h+34):44;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs(r__namespace.Root,{"data-slot":"switch",className:chunkQRO22BPZ_cjs.a("peer data-[state=checked]:bg-dark-green focus-visible:border-ring focus-visible:ring-ring/50 relative inline-flex h-6 min-w-11 shrink-0 cursor-pointer items-center rounded-full border border-transparent px-0 shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[state=unchecked]:bg-gray-500",d),style:{width:c},...e,children:[jsxRuntime.jsx(r__namespace.Thumb,{"data-slot":"switch-thumb",className:"bg-background pointer-events-none block size-4 rounded-full ring-0 transition-transform",style:{transform:e.checked?`translateX(${c-22}px)`:"translateX(4px)"},...e}),t&&jsxRuntime.jsx("span",{className:chunkQRO22BPZ_cjs.a("absolute text-base font-bold text-white uppercase transition-all",e.checked?"left-2":"right-2"),children:e.checked?i:n})]}),t&&jsxRuntime.jsx("span",{ref:s,className:"pointer-events-none invisible absolute font-sans text-base font-bold whitespace-nowrap uppercase",children:i.length>n.length?i:n})]})}exports.a=x;//# sourceMappingURL=chunk-2UIICL2U.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-2UIICL2U.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/v2/switch/switch.tsx"],"names":["Switch","className","showLabels","onLabel","offLabel","props","labelWidth","setLabelWidth","useState","measureRef","useRef","useEffect","dynamicWidth","jsxs","Fragment","r","cn","jsx"],"mappings":"4gBAWA,SAASA,CAAAA,CAAO,CACd,SAAAC,CAAAA,CAAAA,CACA,UAAAC,CAAAA,CAAAA,CAAa,MACb,OAAAC,CAAAA,CAAAA,CAAU,IACV,CAAA,QAAA,CAAAC,EAAW,KACX,CAAA,GAAGC,CACL,CAAA,CAAgB,CACd,GAAM,CAACC,CAAYC,CAAAA,CAAa,CAAIC,CAAAA,cAAAA,CAAS,CAAC,CAAA,CACxCC,EAAaC,YAAwB,CAAA,IAAI,CAE/CC,CAAAA,eAAAA,CAAU,IAAM,CACVT,CAAAA,EAAcO,CAAW,CAAA,OAAA,EAC3BF,EAAcE,CAAW,CAAA,OAAA,CAAQ,WAAW,EAEhD,EAAG,CAACP,CAAAA,CAAYC,CAASC,CAAAA,CAAQ,CAAC,CAElC,CAAA,IAAMQ,CAAeV,CAAAA,CAAAA,CAAa,KAAK,GAAI,CAAA,EAAA,CAAII,CAAa,CAAA,EAAE,EAAI,EAElE,CAAA,OACEO,eAAAC,CAAAA,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAD,eAAiB,CAAAE,YAAA,CAAA,IAAA,CAAhB,CACC,WAAU,CAAA,QAAA,CACV,SAAWC,CAAAA,mBAAAA,CACT,oWACAf,CACF,CAAA,CACA,KAAO,CAAA,CAAE,MAAOW,CAAa,CAAA,CAC5B,GAAGP,CAAAA,CAEJ,UAAAY,cAAiB,CAAAF,YAAA,CAAA,KAAA,CAAhB,CACC,WAAA,CAAU,eACV,SAAU,CAAA,yFAAA,CACV,KAAO,CAAA,CACL,UAAWV,CAAM,CAAA,OAAA,CAAU,CAAcO,WAAAA,EAAAA,CAAAA,CAAe,EAAE,CAAQ,GAAA,CAAA,CAAA,iBACpE,CACC,CAAA,GAAGP,CACN,CAAA,CAAA,CACCH,CACCe,EAAAA,cAAAA,CAAC,QACC,SAAWD,CAAAA,mBAAAA,CACT,kEACAX,CAAAA,CAAAA,CAAM,QAAU,QAAW,CAAA,SAC7B,CAEC,CAAA,QAAA,CAAAA,EAAM,OAAUF,CAAAA,CAAAA,CAAUC,CAC7B,CAAA,CAAA,CAAA,CAEJ,EAECF,CACCe,EAAAA,cAAAA,CAAC,MACC,CAAA,CAAA,GAAA,CAAKR,EACL,SAAU,CAAA,kGAAA,CAET,QAAAN,CAAAA,CAAAA,CAAQ,OAASC,CAAS,CAAA,MAAA,CAASD,CAAUC,CAAAA,CAAAA,CAChD,GAEJ,CAEJ","file":"chunk-2UIICL2U.cjs","sourcesContent":["import * as SwitchPrimitive from '@radix-ui/react-switch';\n\nimport { ComponentProps, useEffect, useRef, useState } from 'react';\nimport { cn } from '@/lib/utils';\n\ntype SwitchProps = ComponentProps<typeof SwitchPrimitive.Root> & {\n showLabels?: boolean;\n onLabel?: string;\n offLabel?: string;\n};\n\nfunction Switch({\n className,\n showLabels = false,\n onLabel = 'On',\n offLabel = 'Off',\n ...props\n}: SwitchProps) {\n const [labelWidth, setLabelWidth] = useState(0);\n const measureRef = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n if (showLabels && measureRef.current) {\n setLabelWidth(measureRef.current.offsetWidth);\n }\n }, [showLabels, onLabel, offLabel]);\n\n const dynamicWidth = showLabels ? Math.max(44, labelWidth + 34) : 44; // 44px is default width\n\n return (\n <>\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n 'peer data-[state=checked]:bg-dark-green focus-visible:border-ring focus-visible:ring-ring/50 relative inline-flex h-6 min-w-11 shrink-0 cursor-pointer items-center rounded-full border border-transparent px-0 shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[state=unchecked]:bg-gray-500',\n className,\n )}\n style={{ width: dynamicWidth }}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"bg-background pointer-events-none block size-4 rounded-full ring-0 transition-transform\"\n style={{\n transform: props.checked ? `translateX(${dynamicWidth - 22}px)` : 'translateX(4px)',\n }}\n {...props}\n />\n {showLabels && (\n <span\n className={cn(\n 'absolute text-base font-bold text-white uppercase transition-all',\n props.checked ? 'left-2' : 'right-2',\n )}\n >\n {props.checked ? onLabel : offLabel}\n </span>\n )}\n </SwitchPrimitive.Root>\n\n {showLabels && (\n <span\n ref={measureRef}\n className=\"pointer-events-none invisible absolute font-sans text-base font-bold whitespace-nowrap uppercase\"\n >\n {onLabel.length > offLabel.length ? onLabel : offLabel}\n </span>\n )}\n </>\n );\n}\n\nexport { Switch };\n"]}
|
|
@@ -23,5 +23,5 @@
|
|
|
23
23
|
aria-invalid:ring-destructive/20
|
|
24
24
|
dark:aria-invalid:ring-destructive/40
|
|
25
25
|
aria-invalid:border-destructive
|
|
26
|
-
`,search:"pr-8"}},defaultVariants:{variant:"default"}}),z=s__namespace.forwardRef(({className:f,variant:t,type:d,wrapperClassName:m=void 0,label:n,helperText:l,charLength:o,value:i,defaultValue:b,onChange:v,id:g,labelProps:h,...x},w)=>{let[y,N]=s.useState(i||b||""),u=g||s__namespace.useId(),c=i!==void 0?i:y,R=String(c).length,I=p=>{i===void 0&&N(p.target.value),v?.(p);};return jsxRuntime.jsxs("div",{className:chunkQRO22BPZ_cjs.a("relative w-full",m),children:[n&&(typeof n=="string"?jsxRuntime.jsx("label",{htmlFor:u,className:"header-xs text-primary mb-2 block font-bold",...h,children:n}):n),jsxRuntime.jsxs("div",{className:"relative",children:[jsxRuntime.jsx("input",{ref:w,id:u,type:d,"data-slot":"input",className:chunkQRO22BPZ_cjs.a(L({variant:t}),f),value:c,onChange:I,...x}),t==="invalid"&&jsxRuntime.jsx(hi2.HiOutlineExclamationCircle,{size:"1.5rem",className:"text-destructive pointer-events-none absolute top-3 right-2"}),t==="search"&&jsxRuntime.jsx(lu.LuSearch,{size:"1.25rem",className:"text-muted-foreground pointer-events-none absolute top-
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
26
|
+
`,search:"pr-8"}},defaultVariants:{variant:"default"}}),z=s__namespace.forwardRef(({className:f,variant:t,type:d,wrapperClassName:m=void 0,label:n,helperText:l,charLength:o,value:i,defaultValue:b,onChange:v,id:g,labelProps:h,...x},w)=>{let[y,N]=s.useState(i||b||""),u=g||s__namespace.useId(),c=i!==void 0?i:y,R=String(c).length,I=p=>{i===void 0&&N(p.target.value),v?.(p);};return jsxRuntime.jsxs("div",{className:chunkQRO22BPZ_cjs.a("relative w-full",m),children:[n&&(typeof n=="string"?jsxRuntime.jsx("label",{htmlFor:u,className:"header-xs text-primary mb-2 block font-bold",...h,children:n}):n),jsxRuntime.jsxs("div",{className:"relative",children:[jsxRuntime.jsx("input",{ref:w,id:u,type:d,"data-slot":"input",className:chunkQRO22BPZ_cjs.a(L({variant:t}),f),value:c,onChange:I,...x}),t==="invalid"&&jsxRuntime.jsx(hi2.HiOutlineExclamationCircle,{size:"1.5rem",className:"text-destructive pointer-events-none absolute top-3 right-2"}),t==="search"&&jsxRuntime.jsx(lu.LuSearch,{size:"1.25rem",className:"text-muted-foreground pointer-events-none absolute top-3.5 right-3"}),d==="time"&&jsxRuntime.jsx(lu.LuClock4,{size:"1.25rem",className:"text-muted-foreground pointer-events-none absolute top-3.5 right-3"})]}),(l||o)&&jsxRuntime.jsxs("div",{className:"mt-2 flex items-center justify-between",children:[jsxRuntime.jsx("span",{className:chunkQRO22BPZ_cjs.a("text-sm",t==="invalid"?"text-destructive":"text-secondary"),children:l||""}),o&&jsxRuntime.jsxs("span",{className:chunkQRO22BPZ_cjs.a("text-sm",t==="invalid"?"text-destructive":"text-secondary"),children:[R,"/",o]})]})]})});z.displayName="Input";exports.a=L;exports.b=z;//# sourceMappingURL=chunk-6LV6REZO.cjs.map
|
|
27
|
+
//# sourceMappingURL=chunk-6LV6REZO.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/v2/input/input.tsx"],"names":["inputVariants","cva","Input","s","className","variant","type","wrapperClassName","label","helperText","charLength","value","defaultValue","onChange","id","labelProps","props","ref","internalValue","setInternalValue","useState","inputId","currentValue","currentLength","handleChange","e","jsxs","cn","jsx","HiOutlineExclamationCircle","LuSearch","LuClock4"],"mappings":"2lBAQMA,IAAAA,CAAAA,CAAgBC,0BACpB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,CAQA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,OAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,CAQT,OAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAYT,CAAA,CAAA,MAAA,CAAQ,MACV,CACF,CAAA,CACA,gBAAiB,CACf,OAAA,CAAS,SACX,CACF,CACF,CAAA,CAWMC,EAAcC,YAClB,CAAA,UAAA,CAAA,CACE,CACE,SAAA,CAAAC,CACA,CAAA,OAAA,CAAAC,EACA,IAAAC,CAAAA,CAAAA,CACA,gBAAAC,CAAAA,CAAAA,CAAmB,MACnB,CAAA,KAAA,CAAAC,EACA,UAAAC,CAAAA,CAAAA,CACA,WAAAC,CACA,CAAA,KAAA,CAAAC,EACA,YAAAC,CAAAA,CAAAA,CACA,QAAAC,CAAAA,CAAAA,CACA,EAAAC,CAAAA,CAAAA,CACA,WAAAC,CACA,CAAA,GAAGC,CACL,CAAA,CACAC,CACG,GAAA,CACH,GAAM,CAACC,CAAAA,CAAeC,CAAgB,CAAA,CAAIC,UAAUT,CAAAA,CAAAA,EAASC,GAAgB,EAAa,CAAA,CACpFS,EAAUP,CAAY,EAAAX,YAAA,CAAA,KAAA,GAEtBmB,CAAeX,CAAAA,CAAAA,GAAU,MAAYA,CAAAA,CAAAA,CAAQO,CAC7CK,CAAAA,CAAAA,CAAgB,OAAOD,CAAY,CAAA,CAAE,MAErCE,CAAAA,CAAAA,CAAgBC,CAA2C,EAAA,CAC3Dd,IAAU,MACZQ,EAAAA,CAAAA,CAAiBM,CAAE,CAAA,MAAA,CAAO,KAAK,CAAA,CAEjCZ,IAAWY,CAAC,EACd,EAEA,OACEC,eAAAA,CAAC,OAAI,SAAWC,CAAAA,mBAAAA,CAAG,iBAAmBpB,CAAAA,CAAgB,CACnD,CAAA,QAAA,CAAA,CAAAC,IACE,OAAOA,CAAAA,EAAU,QAChBoB,CAAAA,cAAAA,CAAC,OACC,CAAA,CAAA,OAAA,CAASP,EACT,SAAU,CAAA,6CAAA,CACT,GAAGN,CAAAA,CAEH,QAAAP,CAAAA,CAAAA,CACH,EAEAA,CAEJkB,CAAAA,CAAAA,eAAAA,CAAC,OAAI,SAAU,CAAA,UAAA,CACb,UAAAE,cAAC,CAAA,OAAA,CAAA,CACC,GAAKX,CAAAA,CAAAA,CACL,EAAII,CAAAA,CAAAA,CACJ,KAAMf,CACN,CAAA,WAAA,CAAU,OACV,CAAA,SAAA,CAAWqB,mBAAG3B,CAAAA,CAAAA,CAAc,CAAE,OAAAK,CAAAA,CAAQ,CAAC,CAAA,CAAGD,CAAS,CAAA,CACnD,MAAOkB,CACP,CAAA,QAAA,CAAUE,EACT,GAAGR,CAAAA,CACN,EACCX,CAAY,GAAA,SAAA,EACXuB,cAACC,CAAAA,8BAAAA,CAAA,CACC,IAAA,CAAK,SACL,SAAU,CAAA,6DAAA,CACZ,CAEDxB,CAAAA,CAAAA,GAAY,QACXuB,EAAAA,cAAAA,CAACE,YAAA,CACC,IAAA,CAAK,SACL,CAAA,SAAA,CAAU,
|
|
1
|
+
{"version":3,"sources":["../src/v2/input/input.tsx"],"names":["inputVariants","cva","Input","s","className","variant","type","wrapperClassName","label","helperText","charLength","value","defaultValue","onChange","id","labelProps","props","ref","internalValue","setInternalValue","useState","inputId","currentValue","currentLength","handleChange","e","jsxs","cn","jsx","HiOutlineExclamationCircle","LuSearch","LuClock4"],"mappings":"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","file":"chunk-6LV6REZO.cjs","sourcesContent":["import * as React from 'react';\nimport { ForwardedRef, useState } from 'react';\nimport { cva, VariantProps } from 'class-variance-authority';\nimport { HiOutlineExclamationCircle } from 'react-icons/hi2';\nimport { LuClock4, LuSearch } from 'react-icons/lu';\n\nimport { cn } from '@/lib/utils';\n\nconst inputVariants = cva(\n `\n flex items-center h-12 w-full min-w-0 rounded-md border bg-white px-3 py-3 text-base transition-all outline-none\n dark:bg-input/30 border-input shadow-xs\n placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground\n file:inline-flex file:h-6 file:mr-2 file:border-0 file:text-foreground\n disabled:cursor-not-allowed disabled:opacity-50 disabled:pointer-events-none disabled:bg-gray-200\n focus-visible:ring-ring/50 focus-visible:ring-[3px] \n `,\n {\n variants: {\n variant: {\n default: `\n hover:enabled:border-dark-green \n focus:enabled:border-dark-green\n focus:enabled:shadow-green-300\n focus-within:shadow\n focus-within:shadow-green-300\n focus-visible:border-dark-green \n `,\n invalid: `\n border-destructive\n hover:border-destructive\n focus:border-destructive\n focus:shadow-red-100\n focus-within:shadow\n focus-within:shadow-red-100\n focus-visible:border-destructive\n aria-invalid:ring-destructive/20\n dark:aria-invalid:ring-destructive/40\n aria-invalid:border-destructive \n `,\n search: 'pr-8',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\ntype InputProps = React.ComponentProps<'input'> &\n VariantProps<typeof inputVariants> & {\n wrapperClassName?: string;\n label?: React.ReactNode;\n helperText?: string;\n charLength?: number;\n labelProps?: React.ComponentProps<'label'>;\n };\n\nconst Input = React.forwardRef(\n (\n {\n className,\n variant,\n type,\n wrapperClassName = undefined,\n label,\n helperText,\n charLength,\n value,\n defaultValue,\n onChange,\n id,\n labelProps,\n ...props\n }: InputProps,\n ref?: ForwardedRef<HTMLInputElement>,\n ) => {\n const [internalValue, setInternalValue] = useState((value || defaultValue || '') as string);\n const inputId = id || React.useId();\n\n const currentValue = value !== undefined ? value : internalValue;\n const currentLength = String(currentValue).length;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n return (\n <div className={cn('relative w-full', wrapperClassName)}>\n {label &&\n (typeof label === 'string' ? (\n <label\n htmlFor={inputId}\n className=\"header-xs text-primary mb-2 block font-bold\"\n {...labelProps}\n >\n {label}\n </label>\n ) : (\n label\n ))}\n <div className=\"relative\">\n <input\n ref={ref}\n id={inputId}\n type={type}\n data-slot=\"input\"\n className={cn(inputVariants({ variant }), className)}\n value={currentValue}\n onChange={handleChange}\n {...props}\n />\n {variant === 'invalid' && (\n <HiOutlineExclamationCircle\n size=\"1.5rem\"\n className=\"text-destructive pointer-events-none absolute top-3 right-2\"\n />\n )}\n {variant === 'search' && (\n <LuSearch\n size=\"1.25rem\"\n className=\"text-muted-foreground pointer-events-none absolute top-3.5 right-3\"\n />\n )}\n {type === 'time' && (\n <LuClock4\n size=\"1.25rem\"\n className=\"text-muted-foreground pointer-events-none absolute top-3.5 right-3\"\n />\n )}\n </div>\n {(helperText || charLength) && (\n <div className=\"mt-2 flex items-center justify-between\">\n <span\n className={cn(\n 'text-sm',\n variant === 'invalid' ? 'text-destructive' : 'text-secondary',\n )}\n >\n {helperText || ''}\n </span>\n {charLength && (\n <span\n className={cn(\n 'text-sm',\n variant === 'invalid' ? 'text-destructive' : 'text-secondary',\n )}\n >\n {currentLength}/{charLength}\n </span>\n )}\n </div>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = 'Input';\n\nexport { Input, inputVariants };\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {h,a as a$1,d,f}from'./chunk-XMEBDMUG.js';import {b}from'./chunk-WEGGMVJT.js';import {a}from'./chunk-YTIIAU4W.js';import {useCommandState,Command}from'cmdk';import {LuX,LuChevronUp,LuChevronDown,LuCheck}from'react-icons/lu';import {forwardRef,useRef,useState,useImperativeHandle,useCallback,useEffect}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';function he(r,i){let[l,f]=useState(r);return useEffect(()=>{let s=setTimeout(()=>f(r),i||500);return ()=>{clearTimeout(s);}},[r,i]),l}function D(r,i){if(r.length===0)return {};if(!i)return {"":r};let l={};return r.forEach(f=>{let s=f[i]||"";l[s]||(l[s]=[]),l[s].push(f);}),l}var Q=forwardRef(({className:r,...i},l)=>useCommandState(s=>s.filtered.count===0)?jsx("div",{ref:l,className:a("py-6 text-center text-sm",r),role:"presentation",...i}):null);Q.displayName="CommandEmpty";var we=forwardRef(({value:r,onChange:i,placeholder:l,defaultOptions:f$1=[],options:s,delay:Z,onSearch:b$1,onSearchSync:K,loadingIndicator:_,emptyIndicator:k,maxSelected:S=0,onMaxSelected:j,hidePlaceholderWhenSelected:F=true,disabled:g,groupBy:v,className:$,badgeWrapperClassName:ee,badgeClassName:te,getBadgeClassName:ne=()=>"",selectFirstItem:oe=true,triggerSearchOnFocus:M=false,commandProps:m,inputProps:O},re)=>{let d$1=useRef(null),[c,I]=useState(false),[ae,P]=useState(false),[se,W]=useState(false),V=useRef(null),[n,H]=useState(r||[]),[E,G]=useState(D(f$1,v)),[z,U]=useState(""),x=he(z,Z||500),ie=c?LuChevronUp:LuChevronDown;useImperativeHandle(re,()=>({selectedValue:[...n],input:d$1.current,focus:()=>d$1?.current?.focus(),reset:()=>H([])}),[n]);let C=e=>{V.current&&!V.current.contains(e.target)&&d$1.current&&!d$1.current.contains(e.target)&&(I(false),d$1.current.blur());},L=useCallback(e=>{let o=n.some(p=>p.value===e.value),t=!o&&!!S&&n.length>=S;U("");let h=o?n.filter(p=>p.value!==e.value):[...n,e];t&&(h=h.slice(1)),H(h),i?.(h),t&&j?.(n.length);},[S,i,j,n]),le=useCallback(e=>{let o=d$1.current;if(o){if((e.key==="Delete"||e.key==="Backspace")&&o.value===""&&n.length>0){let t=n[n.length-1];t&&!t.fixed&&L(t);}e.key==="Escape"&&o.blur();}},[L,n]);useEffect(()=>(c?(document.addEventListener("mousedown",C),document.addEventListener("touchend",C)):(document.removeEventListener("mousedown",C),document.removeEventListener("touchend",C)),()=>{document.removeEventListener("mousedown",C),document.removeEventListener("touchend",C);}),[c]),useEffect(()=>{r&&H(r);},[r]),useEffect(()=>{if(!s||b$1)return;let e=D(s||[],v);Object.entries(e).length!==Object.entries(E).length&&G(e);},[f$1,s,v,b$1,E]),useEffect(()=>{let e=()=>{let t=K?.(x);G(D(t||[],v));};(async()=>{!K||!c||(M&&e(),x&&e());})();},[x,v,c,M]),useEffect(()=>{let e=async()=>{W(true);let t=await b$1?.(x);G(D(t||[],v)),W(false);};(async()=>{!b$1||!c||(M&&await e(),x&&await e());})();},[x,v,c,M]);let ue=useCallback(()=>{if(k)return b$1&&Object.keys(E).length===0?jsx(h,{value:"-",disabled:true,children:k}):jsx(Q,{children:k})},[k,b$1,E]),de=useCallback(()=>{if(m?.filter)return m.filter},[m?.filter]);return jsxs(a$1,{ref:V,...m,onKeyDown:e=>{le(e),m?.onKeyDown?.(e);},className:a("h-auto overflow-visible bg-transparent",m?.className),shouldFilter:m?.shouldFilter!==void 0?m.shouldFilter:!b$1,filter:de(),children:[jsxs("button",{type:"button",className:a("items-center justify-between gap-2 p-3 whitespace-nowrap","border-input rounded-md border bg-white",c&&"border-dark-green","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40","disabled:cursor-not-allowed disabled:bg-gray-200","hover:not-disabled:border-dark-green","transition-all outline-none",{"cursor-text":!g&&n.length!==0},"flex w-full",$),onClick:()=>{g||d$1?.current?.focus();},disabled:g,children:[jsxs("div",{className:a("relative flex gap-1 overflow-auto [&::-webkit-scrollbar]:h-0",ee),children:[n.map(e=>jsxs(b,{className:a("data-[disabled]:text-secondary data-[disabled]:bg-transparent","data-[fixed]:bg-muted-foreground data-[fixed]:text-muted data-[fixed]:hover:bg-muted-foreground",te,ne(e),"py-0"),color:"green",rounded:true,"data-fixed":e.fixed,"data-disabled":g||void 0,children:[e?.selectedLabel??e.label,jsx("button",{type:"button",className:a("ring-offset-background focus:ring-ring ml-1 rounded-full outline-none focus:ring-2 focus:ring-offset-2",(g||e.fixed)&&"hidden"),onKeyDown:o=>{o.key==="Enter"&&L(e);},onMouseDown:o=>{o.preventDefault(),o.stopPropagation();},onClick:()=>L(e),children:jsx(LuX,{className:"text-muted-foreground hover:text-foreground h-3 w-3"})})]},e.value)),jsx(Command.Input,{...O,ref:d$1,value:z,disabled:g,onValueChange:e=>{U(e),O?.onValueChange?.(e);},onBlur:e=>{ae||I(false),O?.onBlur?.(e);},onFocus:e=>{I(true),O?.onFocus?.(e);},placeholder:F&&n.length!==0?"":l,className:a("placeholder:text-secondary flex-1 self-baseline bg-transparent outline-none",{"w-full":F,"ml-1":n.length!==0},O?.className)})]}),jsx(ie,{className:a("size-5 min-w-5 cursor-pointer",g&&"text-gray-600")})]}),jsx("div",{className:"relative",children:c&&jsx(d,{className:"bg-popover text-popover-foreground animate-in absolute top-1 z-10 w-full rounded-md border shadow-xs outline-none",onMouseLeave:()=>{P(false);},onMouseEnter:()=>{P(true);},onMouseUp:()=>{d$1?.current?.focus();},children:se?_:jsxs(Fragment,{children:[ue(),!oe&&jsx(h,{value:"-",className:"hidden"}),Object.entries(E).map(([e,o])=>jsx(f,{heading:e,className:"h-full overflow-auto",children:jsx("div",{className:"flex flex-col gap-1",children:o.map(t=>{let h$1=n.some(p=>p.value===t.value);return jsxs(h,{value:t.value,keywords:typeof t.label=="string"?[t.label]:void 0,disabled:t.disable,onMouseDown:p=>{p.preventDefault(),p.stopPropagation();},onSelect:()=>L(t),className:a("flex cursor-pointer items-center justify-between p-3 hover:bg-green-100 data-[selected=true]:bg-green-100",t.disable&&"text-muted-foreground cursor-default",h$1&&"bg-green-100"),children:[t.label,h$1&&jsx(LuCheck,{className:"h-4 w-4 text-green-800"})]},t.value)})})},e))]})})})]})});we.displayName="MultiSelect";export{he as a,we as b};//# sourceMappingURL=chunk-MQL5R4MD.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-MQL5R4MD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/v2/multiselect/multiselect.tsx"],"names":["useDebounce","value","delay","debouncedValue","setDebouncedValue","useState","useEffect","timer","transToGroupOption","options","groupBy","groupOption","option","key","CommandEmpty","forwardRef","className","props","forwardedRef","useCommandState","state","jsx","cn","MultiSelect","onChange","placeholder","arrayDefaultOptions","arrayOptions","onSearch","onSearchSync","loadingIndicator","emptyIndicator","maxSelected","onMaxSelected","hidePlaceholderWhenSelected","disabled","badgeWrapperClassName","badgeClassName","getBadgeClassName","selectFirstItem","triggerSearchOnFocus","commandProps","inputProps","ref","inputRef","useRef","open","setOpen","onScrollbar","setOnScrollbar","isLoading","setIsLoading","dropdownRef","selected","setSelected","setOptions","inputValue","setInputValue","debouncedSearchTerm","ChevronIcon","LuChevronUp","LuChevronDown","useImperativeHandle","handleClickOutside","event","toggleOption","useCallback","optionSelected","s","hitMaximum","newOptions","handleKeyDown","input","lastSelectOption","doSearchSync","res","doSearch","EmptyItem","CommandItem","commandFilter","jsxs","Command","Badge","e","LuX","CommandPrimitive","CommandList","Fragment","dropdowns","CommandGroup","LuCheck"],"mappings":"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","file":"chunk-MQL5R4MD.js","sourcesContent":["import { Command as CommandPrimitive, useCommandState } from 'cmdk';\nimport { LuCheck, LuChevronDown, LuChevronUp, LuX } from 'react-icons/lu';\nimport {\n ComponentProps,\n ComponentPropsWithoutRef,\n forwardRef,\n KeyboardEvent,\n ReactNode,\n Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\n\nimport { Badge } from '@/v2/badge/badge';\nimport { Command, CommandGroup, CommandItem, CommandList } from '@/v2/command/command';\nimport { cn } from '@/lib/utils';\n\nexport type Option = {\n value: string;\n label: string | ReactNode;\n selectedLabel?: string | ReactNode;\n disable?: boolean;\n /** fixed option that can't be removed. */\n fixed?: boolean;\n /** Group the options by providing key. */\n [key: string]: string | boolean | ReactNode | undefined;\n};\n\ninterface GroupOption {\n [key: string]: Option[];\n}\n\ninterface MultiSelectProps {\n value?: Option[];\n defaultOptions?: Option[];\n /** manually controlled options */\n options?: Option[];\n placeholder?: string;\n /** Loading component. */\n loadingIndicator?: ReactNode;\n /** Empty component. */\n emptyIndicator?: ReactNode;\n /** Debounce time for async search. Only work with `onSearch`. */\n delay?: number;\n /**\n * Only work with `onSearch` prop. Trigger search when `onFocus`.\n * For example, when user click on the input, it will trigger the search to get initial options.\n * */\n triggerSearchOnFocus?: boolean;\n /** async search */\n onSearch?: (value: string) => Promise<Option[]>;\n /**\n * sync search. This search will not show loadingIndicator.\n * The rest props are the same as async search.\n * i.e.: groupBy, delay.\n * */\n onSearchSync?: (value: string) => Option[];\n onChange?: (options: Option[]) => void;\n /** Limit the maximum number of selected options. */\n maxSelected?: number;\n /** When the number of selected options exceeds the limit, the onMaxSelected will be called. */\n onMaxSelected?: (maxLimit: number) => void;\n /** Hide the placeholder when there are options selected. */\n hidePlaceholderWhenSelected?: boolean;\n disabled?: boolean;\n /** Group the options base on provided key. */\n groupBy?: string;\n className?: string;\n badgeWrapperClassName?: string;\n badgeClassName?: string;\n getBadgeClassName?: (option: Option) => string;\n /**\n *\n * @reference: https://github.com/pacocoursey/cmdk/issues/171\n */\n selectFirstItem?: boolean;\n /** Props of `Command` */\n commandProps?: ComponentPropsWithoutRef<typeof Command>;\n /** Props of `CommandInput` */\n inputProps?: Omit<\n ComponentPropsWithoutRef<typeof CommandPrimitive.Input>,\n 'value' | 'placeholder' | 'disabled'\n >;\n}\n\nexport interface MultiSelectRef {\n selectedValue: Option[];\n input: HTMLInputElement;\n focus: () => void;\n reset: () => void;\n}\n\nexport function useDebounce<T>(value: T, delay?: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay || 500);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n\nfunction transToGroupOption(options: Option[], groupBy?: string) {\n if (options.length === 0) {\n return {};\n }\n if (!groupBy) {\n return {\n '': options,\n };\n }\n\n const groupOption: GroupOption = {};\n options.forEach((option) => {\n const key = (option[groupBy] as string) || '';\n if (!groupOption[key]) {\n groupOption[key] = [];\n }\n groupOption[key].push(option);\n });\n return groupOption;\n}\n\n/**\n * The `CommandEmpty` of shadcn/ui will cause the cmdk empty not rendering correctly.\n * So we create one and copy the `Empty` implementation from `cmdk`.\n *\n * @reference: https://github.com/hsuanyi-chou/shadcn-ui-expansions/issues/34#issuecomment-1949561607\n * */\nconst CommandEmpty = forwardRef<HTMLDivElement, ComponentProps<typeof CommandPrimitive.Empty>>(\n ({ className, ...props }, forwardedRef) => {\n const render = useCommandState((state) => state.filtered.count === 0);\n\n if (!render) return null;\n\n return (\n <div\n ref={forwardedRef}\n className={cn('py-6 text-center text-sm', className)}\n role=\"presentation\"\n {...props}\n />\n );\n },\n);\n\nCommandEmpty.displayName = 'CommandEmpty';\n\nexport const MultiSelect = forwardRef<MultiSelectRef, MultiSelectProps>(\n (\n {\n value,\n onChange,\n placeholder,\n defaultOptions: arrayDefaultOptions = [],\n options: arrayOptions,\n delay,\n onSearch,\n onSearchSync,\n loadingIndicator,\n emptyIndicator,\n maxSelected = 0,\n onMaxSelected,\n hidePlaceholderWhenSelected = true,\n disabled,\n groupBy,\n className,\n badgeWrapperClassName,\n badgeClassName,\n getBadgeClassName = () => '',\n selectFirstItem = true,\n triggerSearchOnFocus = false,\n commandProps,\n inputProps,\n }: MultiSelectProps,\n ref: Ref<MultiSelectRef>,\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [onScrollbar, setOnScrollbar] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const [selected, setSelected] = useState<Option[]>(value || []);\n const [options, setOptions] = useState<GroupOption>(\n transToGroupOption(arrayDefaultOptions, groupBy),\n );\n const [inputValue, setInputValue] = useState('');\n const debouncedSearchTerm = useDebounce(inputValue, delay || 500);\n\n const ChevronIcon = open ? LuChevronUp : LuChevronDown;\n\n useImperativeHandle(\n ref,\n () => ({\n selectedValue: [...selected],\n input: inputRef.current as HTMLInputElement,\n focus: () => inputRef?.current?.focus(),\n reset: () => setSelected([]),\n }),\n [selected],\n );\n\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n inputRef.current.blur();\n }\n };\n\n const toggleOption = useCallback(\n (option: Option) => {\n const optionSelected = selected.some((s) => s.value === option.value);\n const hitMaximum = !optionSelected && !!maxSelected && selected.length >= maxSelected;\n\n setInputValue('');\n\n let newOptions = optionSelected\n ? selected.filter((s) => s.value !== option.value)\n : [...selected, option];\n\n if (hitMaximum) newOptions = newOptions.slice(1); // Remove the first item if hit maximum\n\n setSelected(newOptions);\n onChange?.(newOptions);\n if (hitMaximum) onMaxSelected?.(selected.length);\n },\n [maxSelected, onChange, onMaxSelected, selected],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n const input = inputRef.current;\n if (input) {\n if (e.key === 'Delete' || e.key === 'Backspace') {\n if (input.value === '' && selected.length > 0) {\n const lastSelectOption = selected[selected.length - 1];\n // If there is a last item and it is not fixed, we can remove it.\n if (lastSelectOption && !lastSelectOption.fixed) {\n toggleOption(lastSelectOption);\n }\n }\n }\n // This is not a default behavior of the <input /> field\n if (e.key === 'Escape') {\n input.blur();\n }\n }\n },\n [toggleOption, selected],\n );\n\n useEffect(() => {\n if (open) {\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('touchend', handleClickOutside);\n } else {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('touchend', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('touchend', handleClickOutside);\n };\n }, [open]);\n\n useEffect(() => {\n if (value) {\n setSelected(value);\n }\n }, [value]);\n\n useEffect(() => {\n /** If `onSearch` is provided, do not trigger options updated. */\n if (!arrayOptions || onSearch) {\n return;\n }\n const newOptions = transToGroupOption(arrayOptions || [], groupBy);\n\n if (Object.entries(newOptions).length !== Object.entries(options).length) {\n setOptions(newOptions);\n }\n }, [arrayDefaultOptions, arrayOptions, groupBy, onSearch, options]);\n\n useEffect(() => {\n /** sync search */\n\n const doSearchSync = () => {\n const res = onSearchSync?.(debouncedSearchTerm);\n setOptions(transToGroupOption(res || [], groupBy));\n };\n\n const exec = async () => {\n if (!onSearchSync || !open) return;\n\n if (triggerSearchOnFocus) {\n doSearchSync();\n }\n\n if (debouncedSearchTerm) {\n doSearchSync();\n }\n };\n\n exec();\n }, [debouncedSearchTerm, groupBy, open, triggerSearchOnFocus]);\n\n useEffect(() => {\n /** async search */\n\n const doSearch = async () => {\n setIsLoading(true);\n const res = await onSearch?.(debouncedSearchTerm);\n setOptions(transToGroupOption(res || [], groupBy));\n setIsLoading(false);\n };\n\n const exec = async () => {\n if (!onSearch || !open) return;\n\n if (triggerSearchOnFocus) {\n await doSearch();\n }\n\n if (debouncedSearchTerm) {\n await doSearch();\n }\n };\n\n exec();\n }, [debouncedSearchTerm, groupBy, open, triggerSearchOnFocus]);\n\n const EmptyItem = useCallback(() => {\n if (!emptyIndicator) return undefined;\n\n // For async search that showing emptyIndicator\n if (onSearch && Object.keys(options).length === 0) {\n return (\n <CommandItem value=\"-\" disabled>\n {emptyIndicator}\n </CommandItem>\n );\n }\n\n return <CommandEmpty>{emptyIndicator}</CommandEmpty>;\n }, [emptyIndicator, onSearch, options]);\n\n const commandFilter = useCallback(() => {\n if (commandProps?.filter) {\n return commandProps.filter;\n }\n\n // Using default filter in `cmdk`. We don't have to provide it.\n return undefined;\n }, [commandProps?.filter]);\n\n return (\n <Command\n ref={dropdownRef}\n {...commandProps}\n onKeyDown={(e) => {\n handleKeyDown(e);\n commandProps?.onKeyDown?.(e);\n }}\n className={cn('h-auto overflow-visible bg-transparent', commandProps?.className)}\n shouldFilter={\n commandProps?.shouldFilter !== undefined ? commandProps.shouldFilter : !onSearch\n } // When onSearch is provided, we don't want to filter the options. You can still override it.\n filter={commandFilter()}\n >\n <button\n type=\"button\"\n className={cn(\n 'items-center justify-between gap-2 p-3 whitespace-nowrap',\n\n // Border & ring\n 'border-input rounded-md border bg-white',\n open && 'border-dark-green', // conditional green border when open\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n\n // States\n 'aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40',\n 'disabled:cursor-not-allowed disabled:bg-gray-200',\n 'hover:not-disabled:border-dark-green',\n\n // Shadow & transitions\n 'transition-all outline-none',\n {\n 'cursor-text': !disabled && selected.length !== 0,\n },\n 'flex w-full',\n className,\n )}\n onClick={() => {\n if (disabled) return;\n inputRef?.current?.focus();\n }}\n disabled={disabled}\n >\n <div\n className={cn(\n 'relative flex gap-1 overflow-auto [&::-webkit-scrollbar]:h-0',\n badgeWrapperClassName,\n )}\n >\n {selected.map((option) => {\n return (\n <Badge\n key={option.value}\n className={cn(\n 'data-[disabled]:text-secondary data-[disabled]:bg-transparent',\n 'data-[fixed]:bg-muted-foreground data-[fixed]:text-muted data-[fixed]:hover:bg-muted-foreground',\n badgeClassName,\n getBadgeClassName(option),\n 'py-0',\n )}\n color=\"green\"\n rounded\n data-fixed={option.fixed}\n data-disabled={disabled || undefined}\n >\n {option?.selectedLabel ?? option.label}\n <button\n type=\"button\"\n className={cn(\n 'ring-offset-background focus:ring-ring ml-1 rounded-full outline-none focus:ring-2 focus:ring-offset-2',\n (disabled || option.fixed) && 'hidden',\n )}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n toggleOption(option);\n }\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onClick={() => toggleOption(option)}\n >\n <LuX className=\"text-muted-foreground hover:text-foreground h-3 w-3\" />\n </button>\n </Badge>\n );\n })}\n <CommandPrimitive.Input\n {...inputProps}\n ref={inputRef}\n value={inputValue}\n disabled={disabled}\n onValueChange={(value) => {\n setInputValue(value);\n inputProps?.onValueChange?.(value);\n }}\n onBlur={(event) => {\n if (!onScrollbar) {\n setOpen(false);\n }\n inputProps?.onBlur?.(event);\n }}\n onFocus={(event) => {\n setOpen(true);\n inputProps?.onFocus?.(event);\n }}\n placeholder={hidePlaceholderWhenSelected && selected.length !== 0 ? '' : placeholder}\n className={cn(\n 'placeholder:text-secondary flex-1 self-baseline bg-transparent outline-none',\n {\n 'w-full': hidePlaceholderWhenSelected,\n 'ml-1': selected.length !== 0,\n },\n inputProps?.className,\n )}\n />\n </div>\n <ChevronIcon\n className={cn('size-5 min-w-5 cursor-pointer', disabled && 'text-gray-600')}\n />\n </button>\n <div className=\"relative\">\n {open && (\n <CommandList\n className=\"bg-popover text-popover-foreground animate-in absolute top-1 z-10 w-full rounded-md border shadow-xs outline-none\"\n onMouseLeave={() => {\n setOnScrollbar(false);\n }}\n onMouseEnter={() => {\n setOnScrollbar(true);\n }}\n onMouseUp={() => {\n inputRef?.current?.focus();\n }}\n >\n {isLoading ? (\n loadingIndicator\n ) : (\n <>\n {EmptyItem()}\n {!selectFirstItem && <CommandItem value=\"-\" className=\"hidden\" />}\n {Object.entries(options).map(([key, dropdowns]) => (\n <CommandGroup key={key} heading={key} className=\"h-full overflow-auto\">\n <div className=\"flex flex-col gap-1\">\n {dropdowns.map((option) => {\n const optionSelected = selected.some((s) => s.value === option.value);\n return (\n <CommandItem\n key={option.value}\n value={option.value}\n keywords={\n typeof option.label === 'string' ? [option.label] : undefined\n }\n disabled={option.disable}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onSelect={() => toggleOption(option)}\n className={cn(\n 'flex cursor-pointer items-center justify-between p-3 hover:bg-green-100 data-[selected=true]:bg-green-100',\n option.disable && 'text-muted-foreground cursor-default',\n optionSelected && 'bg-green-100',\n )}\n >\n {option.label}\n {optionSelected && <LuCheck className=\"h-4 w-4 text-green-800\" />}\n </CommandItem>\n );\n })}\n </div>\n </CommandGroup>\n ))}\n </>\n )}\n </CommandList>\n )}\n </div>\n </Command>\n );\n },\n);\n\nMultiSelect.displayName = 'MultiSelect';\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkHYP7A6HK_cjs=require('./chunk-HYP7A6HK.cjs'),chunkQQLW7HXZ_cjs=require('./chunk-QQLW7HXZ.cjs'),chunkQRO22BPZ_cjs=require('./chunk-QRO22BPZ.cjs'),cmdk=require('cmdk'),lu=require('react-icons/lu'),react=require('react'),jsxRuntime=require('react/jsx-runtime');function he(r,i){let[l,f]=react.useState(r);return react.useEffect(()=>{let s=setTimeout(()=>f(r),i||500);return ()=>{clearTimeout(s);}},[r,i]),l}function D(r,i){if(r.length===0)return {};if(!i)return {"":r};let l={};return r.forEach(f=>{let s=f[i]||"";l[s]||(l[s]=[]),l[s].push(f);}),l}var Q=react.forwardRef(({className:r,...i},l)=>cmdk.useCommandState(s=>s.filtered.count===0)?jsxRuntime.jsx("div",{ref:l,className:chunkQRO22BPZ_cjs.a("py-6 text-center text-sm",r),role:"presentation",...i}):null);Q.displayName="CommandEmpty";var we=react.forwardRef(({value:r,onChange:i,placeholder:l,defaultOptions:f=[],options:s,delay:Z,onSearch:b,onSearchSync:K,loadingIndicator:_,emptyIndicator:k,maxSelected:S=0,onMaxSelected:j,hidePlaceholderWhenSelected:F=true,disabled:g,groupBy:v,className:$,badgeWrapperClassName:ee,badgeClassName:te,getBadgeClassName:ne=()=>"",selectFirstItem:oe=true,triggerSearchOnFocus:M=false,commandProps:m,inputProps:O},re)=>{let d=react.useRef(null),[c,I]=react.useState(false),[ae,P]=react.useState(false),[se,W]=react.useState(false),V=react.useRef(null),[n,H]=react.useState(r||[]),[E,G]=react.useState(D(f,v)),[z,U]=react.useState(""),x=he(z,Z||500),ie=c?lu.LuChevronUp:lu.LuChevronDown;react.useImperativeHandle(re,()=>({selectedValue:[...n],input:d.current,focus:()=>d?.current?.focus(),reset:()=>H([])}),[n]);let C=e=>{V.current&&!V.current.contains(e.target)&&d.current&&!d.current.contains(e.target)&&(I(false),d.current.blur());},L=react.useCallback(e=>{let o=n.some(p=>p.value===e.value),t=!o&&!!S&&n.length>=S;U("");let h=o?n.filter(p=>p.value!==e.value):[...n,e];t&&(h=h.slice(1)),H(h),i?.(h),t&&j?.(n.length);},[S,i,j,n]),le=react.useCallback(e=>{let o=d.current;if(o){if((e.key==="Delete"||e.key==="Backspace")&&o.value===""&&n.length>0){let t=n[n.length-1];t&&!t.fixed&&L(t);}e.key==="Escape"&&o.blur();}},[L,n]);react.useEffect(()=>(c?(document.addEventListener("mousedown",C),document.addEventListener("touchend",C)):(document.removeEventListener("mousedown",C),document.removeEventListener("touchend",C)),()=>{document.removeEventListener("mousedown",C),document.removeEventListener("touchend",C);}),[c]),react.useEffect(()=>{r&&H(r);},[r]),react.useEffect(()=>{if(!s||b)return;let e=D(s||[],v);Object.entries(e).length!==Object.entries(E).length&&G(e);},[f,s,v,b,E]),react.useEffect(()=>{let e=()=>{let t=K?.(x);G(D(t||[],v));};(async()=>{!K||!c||(M&&e(),x&&e());})();},[x,v,c,M]),react.useEffect(()=>{let e=async()=>{W(true);let t=await b?.(x);G(D(t||[],v)),W(false);};(async()=>{!b||!c||(M&&await e(),x&&await e());})();},[x,v,c,M]);let ue=react.useCallback(()=>{if(k)return b&&Object.keys(E).length===0?jsxRuntime.jsx(chunkHYP7A6HK_cjs.h,{value:"-",disabled:true,children:k}):jsxRuntime.jsx(Q,{children:k})},[k,b,E]),de=react.useCallback(()=>{if(m?.filter)return m.filter},[m?.filter]);return jsxRuntime.jsxs(chunkHYP7A6HK_cjs.a,{ref:V,...m,onKeyDown:e=>{le(e),m?.onKeyDown?.(e);},className:chunkQRO22BPZ_cjs.a("h-auto overflow-visible bg-transparent",m?.className),shouldFilter:m?.shouldFilter!==void 0?m.shouldFilter:!b,filter:de(),children:[jsxRuntime.jsxs("button",{type:"button",className:chunkQRO22BPZ_cjs.a("items-center justify-between gap-2 p-3 whitespace-nowrap","border-input rounded-md border bg-white",c&&"border-dark-green","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40","disabled:cursor-not-allowed disabled:bg-gray-200","hover:not-disabled:border-dark-green","transition-all outline-none",{"cursor-text":!g&&n.length!==0},"flex w-full",$),onClick:()=>{g||d?.current?.focus();},disabled:g,children:[jsxRuntime.jsxs("div",{className:chunkQRO22BPZ_cjs.a("relative flex gap-1 overflow-auto [&::-webkit-scrollbar]:h-0",ee),children:[n.map(e=>jsxRuntime.jsxs(chunkQQLW7HXZ_cjs.b,{className:chunkQRO22BPZ_cjs.a("data-[disabled]:text-secondary data-[disabled]:bg-transparent","data-[fixed]:bg-muted-foreground data-[fixed]:text-muted data-[fixed]:hover:bg-muted-foreground",te,ne(e),"py-0"),color:"green",rounded:true,"data-fixed":e.fixed,"data-disabled":g||void 0,children:[e?.selectedLabel??e.label,jsxRuntime.jsx("button",{type:"button",className:chunkQRO22BPZ_cjs.a("ring-offset-background focus:ring-ring ml-1 rounded-full outline-none focus:ring-2 focus:ring-offset-2",(g||e.fixed)&&"hidden"),onKeyDown:o=>{o.key==="Enter"&&L(e);},onMouseDown:o=>{o.preventDefault(),o.stopPropagation();},onClick:()=>L(e),children:jsxRuntime.jsx(lu.LuX,{className:"text-muted-foreground hover:text-foreground h-3 w-3"})})]},e.value)),jsxRuntime.jsx(cmdk.Command.Input,{...O,ref:d,value:z,disabled:g,onValueChange:e=>{U(e),O?.onValueChange?.(e);},onBlur:e=>{ae||I(false),O?.onBlur?.(e);},onFocus:e=>{I(true),O?.onFocus?.(e);},placeholder:F&&n.length!==0?"":l,className:chunkQRO22BPZ_cjs.a("placeholder:text-secondary flex-1 self-baseline bg-transparent outline-none",{"w-full":F,"ml-1":n.length!==0},O?.className)})]}),jsxRuntime.jsx(ie,{className:chunkQRO22BPZ_cjs.a("size-5 min-w-5 cursor-pointer",g&&"text-gray-600")})]}),jsxRuntime.jsx("div",{className:"relative",children:c&&jsxRuntime.jsx(chunkHYP7A6HK_cjs.d,{className:"bg-popover text-popover-foreground animate-in absolute top-1 z-10 w-full rounded-md border shadow-xs outline-none",onMouseLeave:()=>{P(false);},onMouseEnter:()=>{P(true);},onMouseUp:()=>{d?.current?.focus();},children:se?_:jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[ue(),!oe&&jsxRuntime.jsx(chunkHYP7A6HK_cjs.h,{value:"-",className:"hidden"}),Object.entries(E).map(([e,o])=>jsxRuntime.jsx(chunkHYP7A6HK_cjs.f,{heading:e,className:"h-full overflow-auto",children:jsxRuntime.jsx("div",{className:"flex flex-col gap-1",children:o.map(t=>{let h=n.some(p=>p.value===t.value);return jsxRuntime.jsxs(chunkHYP7A6HK_cjs.h,{value:t.value,keywords:typeof t.label=="string"?[t.label]:void 0,disabled:t.disable,onMouseDown:p=>{p.preventDefault(),p.stopPropagation();},onSelect:()=>L(t),className:chunkQRO22BPZ_cjs.a("flex cursor-pointer items-center justify-between p-3 hover:bg-green-100 data-[selected=true]:bg-green-100",t.disable&&"text-muted-foreground cursor-default",h&&"bg-green-100"),children:[t.label,h&&jsxRuntime.jsx(lu.LuCheck,{className:"h-4 w-4 text-green-800"})]},t.value)})})},e))]})})})]})});we.displayName="MultiSelect";exports.a=he;exports.b=we;//# sourceMappingURL=chunk-MYZ4DUFT.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-MYZ4DUFT.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/v2/multiselect/multiselect.tsx"],"names":["useDebounce","value","delay","debouncedValue","setDebouncedValue","useState","useEffect","timer","transToGroupOption","options","groupBy","groupOption","option","key","CommandEmpty","forwardRef","className","props","forwardedRef","useCommandState","state","jsx","cn","MultiSelect","onChange","placeholder","arrayDefaultOptions","arrayOptions","onSearch","onSearchSync","loadingIndicator","emptyIndicator","maxSelected","onMaxSelected","hidePlaceholderWhenSelected","disabled","badgeWrapperClassName","badgeClassName","getBadgeClassName","selectFirstItem","triggerSearchOnFocus","commandProps","inputProps","ref","inputRef","useRef","open","setOpen","onScrollbar","setOnScrollbar","isLoading","setIsLoading","dropdownRef","selected","setSelected","setOptions","inputValue","setInputValue","debouncedSearchTerm","ChevronIcon","LuChevronUp","LuChevronDown","useImperativeHandle","handleClickOutside","event","toggleOption","useCallback","optionSelected","s","hitMaximum","newOptions","handleKeyDown","input","lastSelectOption","doSearchSync","res","doSearch","EmptyItem","CommandItem","commandFilter","jsxs","Command","Badge","e","LuX","CommandPrimitive","CommandList","Fragment","dropdowns","CommandGroup","LuCheck"],"mappings":"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","file":"chunk-MYZ4DUFT.cjs","sourcesContent":["import { Command as CommandPrimitive, useCommandState } from 'cmdk';\nimport { LuCheck, LuChevronDown, LuChevronUp, LuX } from 'react-icons/lu';\nimport {\n ComponentProps,\n ComponentPropsWithoutRef,\n forwardRef,\n KeyboardEvent,\n ReactNode,\n Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\n\nimport { Badge } from '@/v2/badge/badge';\nimport { Command, CommandGroup, CommandItem, CommandList } from '@/v2/command/command';\nimport { cn } from '@/lib/utils';\n\nexport type Option = {\n value: string;\n label: string | ReactNode;\n selectedLabel?: string | ReactNode;\n disable?: boolean;\n /** fixed option that can't be removed. */\n fixed?: boolean;\n /** Group the options by providing key. */\n [key: string]: string | boolean | ReactNode | undefined;\n};\n\ninterface GroupOption {\n [key: string]: Option[];\n}\n\ninterface MultiSelectProps {\n value?: Option[];\n defaultOptions?: Option[];\n /** manually controlled options */\n options?: Option[];\n placeholder?: string;\n /** Loading component. */\n loadingIndicator?: ReactNode;\n /** Empty component. */\n emptyIndicator?: ReactNode;\n /** Debounce time for async search. Only work with `onSearch`. */\n delay?: number;\n /**\n * Only work with `onSearch` prop. Trigger search when `onFocus`.\n * For example, when user click on the input, it will trigger the search to get initial options.\n * */\n triggerSearchOnFocus?: boolean;\n /** async search */\n onSearch?: (value: string) => Promise<Option[]>;\n /**\n * sync search. This search will not show loadingIndicator.\n * The rest props are the same as async search.\n * i.e.: groupBy, delay.\n * */\n onSearchSync?: (value: string) => Option[];\n onChange?: (options: Option[]) => void;\n /** Limit the maximum number of selected options. */\n maxSelected?: number;\n /** When the number of selected options exceeds the limit, the onMaxSelected will be called. */\n onMaxSelected?: (maxLimit: number) => void;\n /** Hide the placeholder when there are options selected. */\n hidePlaceholderWhenSelected?: boolean;\n disabled?: boolean;\n /** Group the options base on provided key. */\n groupBy?: string;\n className?: string;\n badgeWrapperClassName?: string;\n badgeClassName?: string;\n getBadgeClassName?: (option: Option) => string;\n /**\n *\n * @reference: https://github.com/pacocoursey/cmdk/issues/171\n */\n selectFirstItem?: boolean;\n /** Props of `Command` */\n commandProps?: ComponentPropsWithoutRef<typeof Command>;\n /** Props of `CommandInput` */\n inputProps?: Omit<\n ComponentPropsWithoutRef<typeof CommandPrimitive.Input>,\n 'value' | 'placeholder' | 'disabled'\n >;\n}\n\nexport interface MultiSelectRef {\n selectedValue: Option[];\n input: HTMLInputElement;\n focus: () => void;\n reset: () => void;\n}\n\nexport function useDebounce<T>(value: T, delay?: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay || 500);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n\nfunction transToGroupOption(options: Option[], groupBy?: string) {\n if (options.length === 0) {\n return {};\n }\n if (!groupBy) {\n return {\n '': options,\n };\n }\n\n const groupOption: GroupOption = {};\n options.forEach((option) => {\n const key = (option[groupBy] as string) || '';\n if (!groupOption[key]) {\n groupOption[key] = [];\n }\n groupOption[key].push(option);\n });\n return groupOption;\n}\n\n/**\n * The `CommandEmpty` of shadcn/ui will cause the cmdk empty not rendering correctly.\n * So we create one and copy the `Empty` implementation from `cmdk`.\n *\n * @reference: https://github.com/hsuanyi-chou/shadcn-ui-expansions/issues/34#issuecomment-1949561607\n * */\nconst CommandEmpty = forwardRef<HTMLDivElement, ComponentProps<typeof CommandPrimitive.Empty>>(\n ({ className, ...props }, forwardedRef) => {\n const render = useCommandState((state) => state.filtered.count === 0);\n\n if (!render) return null;\n\n return (\n <div\n ref={forwardedRef}\n className={cn('py-6 text-center text-sm', className)}\n role=\"presentation\"\n {...props}\n />\n );\n },\n);\n\nCommandEmpty.displayName = 'CommandEmpty';\n\nexport const MultiSelect = forwardRef<MultiSelectRef, MultiSelectProps>(\n (\n {\n value,\n onChange,\n placeholder,\n defaultOptions: arrayDefaultOptions = [],\n options: arrayOptions,\n delay,\n onSearch,\n onSearchSync,\n loadingIndicator,\n emptyIndicator,\n maxSelected = 0,\n onMaxSelected,\n hidePlaceholderWhenSelected = true,\n disabled,\n groupBy,\n className,\n badgeWrapperClassName,\n badgeClassName,\n getBadgeClassName = () => '',\n selectFirstItem = true,\n triggerSearchOnFocus = false,\n commandProps,\n inputProps,\n }: MultiSelectProps,\n ref: Ref<MultiSelectRef>,\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [onScrollbar, setOnScrollbar] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const [selected, setSelected] = useState<Option[]>(value || []);\n const [options, setOptions] = useState<GroupOption>(\n transToGroupOption(arrayDefaultOptions, groupBy),\n );\n const [inputValue, setInputValue] = useState('');\n const debouncedSearchTerm = useDebounce(inputValue, delay || 500);\n\n const ChevronIcon = open ? LuChevronUp : LuChevronDown;\n\n useImperativeHandle(\n ref,\n () => ({\n selectedValue: [...selected],\n input: inputRef.current as HTMLInputElement,\n focus: () => inputRef?.current?.focus(),\n reset: () => setSelected([]),\n }),\n [selected],\n );\n\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n inputRef.current.blur();\n }\n };\n\n const toggleOption = useCallback(\n (option: Option) => {\n const optionSelected = selected.some((s) => s.value === option.value);\n const hitMaximum = !optionSelected && !!maxSelected && selected.length >= maxSelected;\n\n setInputValue('');\n\n let newOptions = optionSelected\n ? selected.filter((s) => s.value !== option.value)\n : [...selected, option];\n\n if (hitMaximum) newOptions = newOptions.slice(1); // Remove the first item if hit maximum\n\n setSelected(newOptions);\n onChange?.(newOptions);\n if (hitMaximum) onMaxSelected?.(selected.length);\n },\n [maxSelected, onChange, onMaxSelected, selected],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n const input = inputRef.current;\n if (input) {\n if (e.key === 'Delete' || e.key === 'Backspace') {\n if (input.value === '' && selected.length > 0) {\n const lastSelectOption = selected[selected.length - 1];\n // If there is a last item and it is not fixed, we can remove it.\n if (lastSelectOption && !lastSelectOption.fixed) {\n toggleOption(lastSelectOption);\n }\n }\n }\n // This is not a default behavior of the <input /> field\n if (e.key === 'Escape') {\n input.blur();\n }\n }\n },\n [toggleOption, selected],\n );\n\n useEffect(() => {\n if (open) {\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('touchend', handleClickOutside);\n } else {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('touchend', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('touchend', handleClickOutside);\n };\n }, [open]);\n\n useEffect(() => {\n if (value) {\n setSelected(value);\n }\n }, [value]);\n\n useEffect(() => {\n /** If `onSearch` is provided, do not trigger options updated. */\n if (!arrayOptions || onSearch) {\n return;\n }\n const newOptions = transToGroupOption(arrayOptions || [], groupBy);\n\n if (Object.entries(newOptions).length !== Object.entries(options).length) {\n setOptions(newOptions);\n }\n }, [arrayDefaultOptions, arrayOptions, groupBy, onSearch, options]);\n\n useEffect(() => {\n /** sync search */\n\n const doSearchSync = () => {\n const res = onSearchSync?.(debouncedSearchTerm);\n setOptions(transToGroupOption(res || [], groupBy));\n };\n\n const exec = async () => {\n if (!onSearchSync || !open) return;\n\n if (triggerSearchOnFocus) {\n doSearchSync();\n }\n\n if (debouncedSearchTerm) {\n doSearchSync();\n }\n };\n\n exec();\n }, [debouncedSearchTerm, groupBy, open, triggerSearchOnFocus]);\n\n useEffect(() => {\n /** async search */\n\n const doSearch = async () => {\n setIsLoading(true);\n const res = await onSearch?.(debouncedSearchTerm);\n setOptions(transToGroupOption(res || [], groupBy));\n setIsLoading(false);\n };\n\n const exec = async () => {\n if (!onSearch || !open) return;\n\n if (triggerSearchOnFocus) {\n await doSearch();\n }\n\n if (debouncedSearchTerm) {\n await doSearch();\n }\n };\n\n exec();\n }, [debouncedSearchTerm, groupBy, open, triggerSearchOnFocus]);\n\n const EmptyItem = useCallback(() => {\n if (!emptyIndicator) return undefined;\n\n // For async search that showing emptyIndicator\n if (onSearch && Object.keys(options).length === 0) {\n return (\n <CommandItem value=\"-\" disabled>\n {emptyIndicator}\n </CommandItem>\n );\n }\n\n return <CommandEmpty>{emptyIndicator}</CommandEmpty>;\n }, [emptyIndicator, onSearch, options]);\n\n const commandFilter = useCallback(() => {\n if (commandProps?.filter) {\n return commandProps.filter;\n }\n\n // Using default filter in `cmdk`. We don't have to provide it.\n return undefined;\n }, [commandProps?.filter]);\n\n return (\n <Command\n ref={dropdownRef}\n {...commandProps}\n onKeyDown={(e) => {\n handleKeyDown(e);\n commandProps?.onKeyDown?.(e);\n }}\n className={cn('h-auto overflow-visible bg-transparent', commandProps?.className)}\n shouldFilter={\n commandProps?.shouldFilter !== undefined ? commandProps.shouldFilter : !onSearch\n } // When onSearch is provided, we don't want to filter the options. You can still override it.\n filter={commandFilter()}\n >\n <button\n type=\"button\"\n className={cn(\n 'items-center justify-between gap-2 p-3 whitespace-nowrap',\n\n // Border & ring\n 'border-input rounded-md border bg-white',\n open && 'border-dark-green', // conditional green border when open\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n\n // States\n 'aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40',\n 'disabled:cursor-not-allowed disabled:bg-gray-200',\n 'hover:not-disabled:border-dark-green',\n\n // Shadow & transitions\n 'transition-all outline-none',\n {\n 'cursor-text': !disabled && selected.length !== 0,\n },\n 'flex w-full',\n className,\n )}\n onClick={() => {\n if (disabled) return;\n inputRef?.current?.focus();\n }}\n disabled={disabled}\n >\n <div\n className={cn(\n 'relative flex gap-1 overflow-auto [&::-webkit-scrollbar]:h-0',\n badgeWrapperClassName,\n )}\n >\n {selected.map((option) => {\n return (\n <Badge\n key={option.value}\n className={cn(\n 'data-[disabled]:text-secondary data-[disabled]:bg-transparent',\n 'data-[fixed]:bg-muted-foreground data-[fixed]:text-muted data-[fixed]:hover:bg-muted-foreground',\n badgeClassName,\n getBadgeClassName(option),\n 'py-0',\n )}\n color=\"green\"\n rounded\n data-fixed={option.fixed}\n data-disabled={disabled || undefined}\n >\n {option?.selectedLabel ?? option.label}\n <button\n type=\"button\"\n className={cn(\n 'ring-offset-background focus:ring-ring ml-1 rounded-full outline-none focus:ring-2 focus:ring-offset-2',\n (disabled || option.fixed) && 'hidden',\n )}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n toggleOption(option);\n }\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onClick={() => toggleOption(option)}\n >\n <LuX className=\"text-muted-foreground hover:text-foreground h-3 w-3\" />\n </button>\n </Badge>\n );\n })}\n <CommandPrimitive.Input\n {...inputProps}\n ref={inputRef}\n value={inputValue}\n disabled={disabled}\n onValueChange={(value) => {\n setInputValue(value);\n inputProps?.onValueChange?.(value);\n }}\n onBlur={(event) => {\n if (!onScrollbar) {\n setOpen(false);\n }\n inputProps?.onBlur?.(event);\n }}\n onFocus={(event) => {\n setOpen(true);\n inputProps?.onFocus?.(event);\n }}\n placeholder={hidePlaceholderWhenSelected && selected.length !== 0 ? '' : placeholder}\n className={cn(\n 'placeholder:text-secondary flex-1 self-baseline bg-transparent outline-none',\n {\n 'w-full': hidePlaceholderWhenSelected,\n 'ml-1': selected.length !== 0,\n },\n inputProps?.className,\n )}\n />\n </div>\n <ChevronIcon\n className={cn('size-5 min-w-5 cursor-pointer', disabled && 'text-gray-600')}\n />\n </button>\n <div className=\"relative\">\n {open && (\n <CommandList\n className=\"bg-popover text-popover-foreground animate-in absolute top-1 z-10 w-full rounded-md border shadow-xs outline-none\"\n onMouseLeave={() => {\n setOnScrollbar(false);\n }}\n onMouseEnter={() => {\n setOnScrollbar(true);\n }}\n onMouseUp={() => {\n inputRef?.current?.focus();\n }}\n >\n {isLoading ? (\n loadingIndicator\n ) : (\n <>\n {EmptyItem()}\n {!selectFirstItem && <CommandItem value=\"-\" className=\"hidden\" />}\n {Object.entries(options).map(([key, dropdowns]) => (\n <CommandGroup key={key} heading={key} className=\"h-full overflow-auto\">\n <div className=\"flex flex-col gap-1\">\n {dropdowns.map((option) => {\n const optionSelected = selected.some((s) => s.value === option.value);\n return (\n <CommandItem\n key={option.value}\n value={option.value}\n keywords={\n typeof option.label === 'string' ? [option.label] : undefined\n }\n disabled={option.disable}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onSelect={() => toggleOption(option)}\n className={cn(\n 'flex cursor-pointer items-center justify-between p-3 hover:bg-green-100 data-[selected=true]:bg-green-100',\n option.disable && 'text-muted-foreground cursor-default',\n optionSelected && 'bg-green-100',\n )}\n >\n {option.label}\n {optionSelected && <LuCheck className=\"h-4 w-4 text-green-800\" />}\n </CommandItem>\n );\n })}\n </div>\n </CommandGroup>\n ))}\n </>\n )}\n </CommandList>\n )}\n </div>\n </Command>\n );\n },\n);\n\nMultiSelect.displayName = 'MultiSelect';\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {a}from'./chunk-YTIIAU4W.js';import*as r from'@radix-ui/react-switch';import {useState,useRef,useEffect}from'react';import {jsxs,Fragment,jsx}from'react/jsx-runtime';function x({className:d,showLabels:t=false,onLabel:i="On",offLabel:n="Off",...e}){let[h,m]=useState(0),s=useRef(null);useEffect(()=>{t&&s.current&&m(s.current.offsetWidth);},[t,i,n]);let c=t?Math.max(44,h+34):44;return jsxs(Fragment,{children:[jsxs(r.Root,{"data-slot":"switch",className:a("peer data-[state=checked]:bg-dark-green focus-visible:border-ring focus-visible:ring-ring/50 relative inline-flex h-6 min-w-11 shrink-0 cursor-pointer items-center rounded-full border border-transparent px-0 shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[state=unchecked]:bg-gray-500",d),style:{width:c},...e,children:[jsx(r.Thumb,{"data-slot":"switch-thumb",className:"bg-background pointer-events-none block size-4 rounded-full ring-0 transition-transform",style:{transform:e.checked?`translateX(${c-22}px)`:"translateX(4px)"},...e}),t&&jsx("span",{className:a("absolute text-base font-bold text-white uppercase transition-all",e.checked?"left-2":"right-2"),children:e.checked?i:n})]}),t&&jsx("span",{ref:s,className:"pointer-events-none invisible absolute font-sans text-base font-bold whitespace-nowrap uppercase",children:i.length>n.length?i:n})]})}export{x as a};//# sourceMappingURL=chunk-O3OZOSXT.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-O3OZOSXT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/v2/switch/switch.tsx"],"names":["Switch","className","showLabels","onLabel","offLabel","props","labelWidth","setLabelWidth","useState","measureRef","useRef","useEffect","dynamicWidth","jsxs","Fragment","cn","jsx"],"mappings":"6KAWA,SAASA,CAAAA,CAAO,CACd,SAAAC,CAAAA,CAAAA,CACA,UAAAC,CAAAA,CAAAA,CAAa,MACb,OAAAC,CAAAA,CAAAA,CAAU,IACV,CAAA,QAAA,CAAAC,EAAW,KACX,CAAA,GAAGC,CACL,CAAA,CAAgB,CACd,GAAM,CAACC,CAAYC,CAAAA,CAAa,CAAIC,CAAAA,QAAAA,CAAS,CAAC,CAAA,CACxCC,EAAaC,MAAwB,CAAA,IAAI,CAE/CC,CAAAA,SAAAA,CAAU,IAAM,CACVT,CAAAA,EAAcO,CAAW,CAAA,OAAA,EAC3BF,EAAcE,CAAW,CAAA,OAAA,CAAQ,WAAW,EAEhD,EAAG,CAACP,CAAAA,CAAYC,CAASC,CAAAA,CAAQ,CAAC,CAElC,CAAA,IAAMQ,CAAeV,CAAAA,CAAAA,CAAa,KAAK,GAAI,CAAA,EAAA,CAAII,CAAa,CAAA,EAAE,EAAI,EAElE,CAAA,OACEO,IAAAC,CAAAA,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAD,IAAiB,CAAA,CAAA,CAAA,IAAA,CAAhB,CACC,WAAU,CAAA,QAAA,CACV,SAAWE,CAAAA,CAAAA,CACT,oWACAd,CACF,CAAA,CACA,KAAO,CAAA,CAAE,MAAOW,CAAa,CAAA,CAC5B,GAAGP,CAAAA,CAEJ,UAAAW,GAAiB,CAAA,CAAA,CAAA,KAAA,CAAhB,CACC,WAAA,CAAU,eACV,SAAU,CAAA,yFAAA,CACV,KAAO,CAAA,CACL,UAAWX,CAAM,CAAA,OAAA,CAAU,CAAcO,WAAAA,EAAAA,CAAAA,CAAe,EAAE,CAAQ,GAAA,CAAA,CAAA,iBACpE,CACC,CAAA,GAAGP,CACN,CAAA,CAAA,CACCH,CACCc,EAAAA,GAAAA,CAAC,QACC,SAAWD,CAAAA,CAAAA,CACT,kEACAV,CAAAA,CAAAA,CAAM,QAAU,QAAW,CAAA,SAC7B,CAEC,CAAA,QAAA,CAAAA,EAAM,OAAUF,CAAAA,CAAAA,CAAUC,CAC7B,CAAA,CAAA,CAAA,CAEJ,EAECF,CACCc,EAAAA,GAAAA,CAAC,MACC,CAAA,CAAA,GAAA,CAAKP,EACL,SAAU,CAAA,kGAAA,CAET,QAAAN,CAAAA,CAAAA,CAAQ,OAASC,CAAS,CAAA,MAAA,CAASD,CAAUC,CAAAA,CAAAA,CAChD,GAEJ,CAEJ","file":"chunk-O3OZOSXT.js","sourcesContent":["import * as SwitchPrimitive from '@radix-ui/react-switch';\n\nimport { ComponentProps, useEffect, useRef, useState } from 'react';\nimport { cn } from '@/lib/utils';\n\ntype SwitchProps = ComponentProps<typeof SwitchPrimitive.Root> & {\n showLabels?: boolean;\n onLabel?: string;\n offLabel?: string;\n};\n\nfunction Switch({\n className,\n showLabels = false,\n onLabel = 'On',\n offLabel = 'Off',\n ...props\n}: SwitchProps) {\n const [labelWidth, setLabelWidth] = useState(0);\n const measureRef = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n if (showLabels && measureRef.current) {\n setLabelWidth(measureRef.current.offsetWidth);\n }\n }, [showLabels, onLabel, offLabel]);\n\n const dynamicWidth = showLabels ? Math.max(44, labelWidth + 34) : 44; // 44px is default width\n\n return (\n <>\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n 'peer data-[state=checked]:bg-dark-green focus-visible:border-ring focus-visible:ring-ring/50 relative inline-flex h-6 min-w-11 shrink-0 cursor-pointer items-center rounded-full border border-transparent px-0 shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[state=unchecked]:bg-gray-500',\n className,\n )}\n style={{ width: dynamicWidth }}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"bg-background pointer-events-none block size-4 rounded-full ring-0 transition-transform\"\n style={{\n transform: props.checked ? `translateX(${dynamicWidth - 22}px)` : 'translateX(4px)',\n }}\n {...props}\n />\n {showLabels && (\n <span\n className={cn(\n 'absolute text-base font-bold text-white uppercase transition-all',\n props.checked ? 'left-2' : 'right-2',\n )}\n >\n {props.checked ? onLabel : offLabel}\n </span>\n )}\n </SwitchPrimitive.Root>\n\n {showLabels && (\n <span\n ref={measureRef}\n className=\"pointer-events-none invisible absolute font-sans text-base font-bold whitespace-nowrap uppercase\"\n >\n {onLabel.length > offLabel.length ? onLabel : offLabel}\n </span>\n )}\n </>\n );\n}\n\nexport { Switch };\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunk3IALNK6B_cjs=require('./chunk-3IALNK6B.cjs'),chunkHYP7A6HK_cjs=require('./chunk-HYP7A6HK.cjs'),chunkQRO22BPZ_cjs=require('./chunk-QRO22BPZ.cjs'),lu=require('react-icons/lu'),react=require('react'),jsxRuntime=require('react/jsx-runtime');var j=({classNames:a=void 0,options:t,preSearchOptions:S=void 0,onChange:w=void 0,onOpenChange:d=void 0,placeholder:O="Select an option",searchLabel:P="Search...",notFoundMessage:k="Not found.",value:i=void 0,size:L="default"})=>{let[s,p]=react.useState(false),[N,l]=react.useState(false),z=N?t:S||t;return jsxRuntime.jsxs(chunk3IALNK6B_cjs.a,{open:s,onOpenChange:()=>{p(!s),l(false),d?.(!s);},children:[jsxRuntime.jsxs(chunk3IALNK6B_cjs.b,{className:chunkQRO22BPZ_cjs.a("focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive hover:border-dark-green inline-flex h-12 w-full shrink-0 cursor-pointer items-center justify-between gap-2 rounded-md border px-4 whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-5",L==="sm"&&"py-xs h-8 px-3 [&_svg:not([class*='size-'])]:size-4",a?.trigger),children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-2",children:[!i&&jsxRuntime.jsx(lu.LuSearch,{}),i?t.find(e=>e.value===i)?.label:O]}),jsxRuntime.jsx(lu.LuChevronsUpDown,{className:"opacity-50"})]}),jsxRuntime.jsx(chunk3IALNK6B_cjs.c,{className:chunkQRO22BPZ_cjs.a("w-[var(--radix-popover-trigger-width)] p-0",a?.content),children:jsxRuntime.jsxs(chunkHYP7A6HK_cjs.a,{children:[jsxRuntime.jsx(chunkHYP7A6HK_cjs.c,{placeholder:P,className:chunkQRO22BPZ_cjs.a("h-9",a?.input),onValueChange:e=>l(!!e)}),jsxRuntime.jsxs(chunkHYP7A6HK_cjs.d,{children:[jsxRuntime.jsx(chunkHYP7A6HK_cjs.e,{children:k}),jsxRuntime.jsx(chunkHYP7A6HK_cjs.f,{children:z.map(e=>jsxRuntime.jsxs(chunkHYP7A6HK_cjs.h,{value:e.value,keywords:[e.label,e.additionalSearchText??""],onSelect:m=>{w?.(m===i?"":m),p(false),d?.(false);},className:a?.item,children:[e.label,jsxRuntime.jsx(lu.LuCheck,{className:chunkQRO22BPZ_cjs.a("ml-auto",i===e.value?"opacity-100":"opacity-0")})]},e.value))})]})]})})]})};exports.a=j;//# sourceMappingURL=chunk-QJVDJTD4.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-QJVDJTD4.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/v2/combobox/combobox.tsx"],"names":["Combobox","classNames","options","preSearchOptions","onChange","onOpenChange","placeholder","searchLabel","notFoundMessage","value","size","open","setOpen","useState","isSearching","setIsSearching","optionsToDisplay","jsxs","Popover","PopoverTrigger","cn","jsx","LuSearch","item","LuChevronsUpDown","PopoverContent","Command","CommandInput","val","CommandList","CommandEmpty","CommandGroup","CommandItem","currentValue","LuCheck"],"mappings":"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","file":"chunk-QJVDJTD4.cjs","sourcesContent":["import { LuCheck, LuChevronsUpDown, LuSearch } from 'react-icons/lu';\nimport { useState } from 'react';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/v2/popover/popover';\nimport { cn } from '@/lib/utils';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/v2/command/command';\n\ntype ComboboxOption = {\n label: string;\n value: string;\n additionalSearchText?: string;\n};\n\ntype ComboboxProps = {\n classNames?: {\n content?: string;\n input?: string;\n item?: string;\n trigger?: string;\n };\n options: ComboboxOption[];\n preSearchOptions?: ComboboxOption[];\n onChange?: (value: string) => void;\n onOpenChange?: (open: boolean) => void;\n placeholder?: string;\n searchLabel?: string;\n notFoundMessage?: string;\n value?: string;\n size?: 'default' | 'sm';\n};\n\nexport const Combobox = ({\n classNames = undefined,\n options,\n preSearchOptions = undefined,\n onChange = undefined,\n onOpenChange = undefined,\n placeholder = 'Select an option',\n searchLabel = 'Search...',\n notFoundMessage = 'Not found.',\n value = undefined,\n size = 'default',\n}: ComboboxProps) => {\n const [open, setOpen] = useState(false);\n\n // Allow filtering down to just a subset of options before searching\n // NOTE: preSearchOptions is optional, while options is a required prop that we can fallback to\n const [isSearching, setIsSearching] = useState(false);\n const optionsToDisplay = isSearching ? options : preSearchOptions || options;\n\n const handleOpenChange = () => {\n setOpen(!open);\n setIsSearching(false);\n onOpenChange?.(!open);\n };\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger\n className={cn(\n \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive hover:border-dark-green inline-flex h-12 w-full shrink-0 cursor-pointer items-center justify-between gap-2 rounded-md border px-4 whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-5\",\n size === 'sm' && \"py-xs h-8 px-3 [&_svg:not([class*='size-'])]:size-4\",\n classNames?.trigger,\n )}\n >\n <div className=\"flex items-center gap-2\">\n {!value && <LuSearch />}\n {value ? options.find((item) => item.value === value)?.label : placeholder}\n </div>\n <LuChevronsUpDown className=\"opacity-50\" />\n </PopoverTrigger>\n <PopoverContent\n className={cn('w-[var(--radix-popover-trigger-width)] p-0', classNames?.content)}\n >\n <Command>\n <CommandInput\n placeholder={searchLabel}\n className={cn('h-9', classNames?.input)}\n onValueChange={(val) => setIsSearching(!!val)}\n />\n <CommandList>\n <CommandEmpty>{notFoundMessage}</CommandEmpty>\n <CommandGroup>\n {optionsToDisplay.map((item) => (\n <CommandItem\n key={item.value}\n value={item.value}\n keywords={[item.label, item.additionalSearchText ?? '']}\n onSelect={(currentValue) => {\n onChange?.(currentValue === value ? '' : currentValue);\n setOpen(false);\n onOpenChange?.(false);\n }}\n className={classNames?.item}\n >\n {item.label}\n <LuCheck\n className={cn('ml-auto', value === item.value ? 'opacity-100' : 'opacity-0')}\n />\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n};\n"]}
|
|
@@ -23,5 +23,5 @@ import {a}from'./chunk-YTIIAU4W.js';import*as s from'react';import {useState}fro
|
|
|
23
23
|
aria-invalid:ring-destructive/20
|
|
24
24
|
dark:aria-invalid:ring-destructive/40
|
|
25
25
|
aria-invalid:border-destructive
|
|
26
|
-
`,search:"pr-8"}},defaultVariants:{variant:"default"}}),z=s.forwardRef(({className:f,variant:t,type:d,wrapperClassName:m=void 0,label:n,helperText:l,charLength:o,value:i,defaultValue:b,onChange:v,id:g,labelProps:h,...x},w)=>{let[y,N]=useState(i||b||""),u=g||s.useId(),c=i!==void 0?i:y,R=String(c).length,I=p=>{i===void 0&&N(p.target.value),v?.(p);};return jsxs("div",{className:a("relative w-full",m),children:[n&&(typeof n=="string"?jsx("label",{htmlFor:u,className:"header-xs text-primary mb-2 block font-bold",...h,children:n}):n),jsxs("div",{className:"relative",children:[jsx("input",{ref:w,id:u,type:d,"data-slot":"input",className:a(L({variant:t}),f),value:c,onChange:I,...x}),t==="invalid"&&jsx(HiOutlineExclamationCircle,{size:"1.5rem",className:"text-destructive pointer-events-none absolute top-3 right-2"}),t==="search"&&jsx(LuSearch,{size:"1.25rem",className:"text-muted-foreground pointer-events-none absolute top-
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
26
|
+
`,search:"pr-8"}},defaultVariants:{variant:"default"}}),z=s.forwardRef(({className:f,variant:t,type:d,wrapperClassName:m=void 0,label:n,helperText:l,charLength:o,value:i,defaultValue:b,onChange:v,id:g,labelProps:h,...x},w)=>{let[y,N]=useState(i||b||""),u=g||s.useId(),c=i!==void 0?i:y,R=String(c).length,I=p=>{i===void 0&&N(p.target.value),v?.(p);};return jsxs("div",{className:a("relative w-full",m),children:[n&&(typeof n=="string"?jsx("label",{htmlFor:u,className:"header-xs text-primary mb-2 block font-bold",...h,children:n}):n),jsxs("div",{className:"relative",children:[jsx("input",{ref:w,id:u,type:d,"data-slot":"input",className:a(L({variant:t}),f),value:c,onChange:I,...x}),t==="invalid"&&jsx(HiOutlineExclamationCircle,{size:"1.5rem",className:"text-destructive pointer-events-none absolute top-3 right-2"}),t==="search"&&jsx(LuSearch,{size:"1.25rem",className:"text-muted-foreground pointer-events-none absolute top-3.5 right-3"}),d==="time"&&jsx(LuClock4,{size:"1.25rem",className:"text-muted-foreground pointer-events-none absolute top-3.5 right-3"})]}),(l||o)&&jsxs("div",{className:"mt-2 flex items-center justify-between",children:[jsx("span",{className:a("text-sm",t==="invalid"?"text-destructive":"text-secondary"),children:l||""}),o&&jsxs("span",{className:a("text-sm",t==="invalid"?"text-destructive":"text-secondary"),children:[R,"/",o]})]})]})});z.displayName="Input";export{L as a,z as b};//# sourceMappingURL=chunk-QVOCV3VP.js.map
|
|
27
|
+
//# sourceMappingURL=chunk-QVOCV3VP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/v2/input/input.tsx"],"names":["inputVariants","cva","Input","className","variant","type","wrapperClassName","label","helperText","charLength","value","defaultValue","onChange","id","labelProps","props","ref","internalValue","setInternalValue","useState","inputId","currentValue","currentLength","handleChange","e","jsxs","cn","jsx","HiOutlineExclamationCircle","LuSearch","LuClock4"],"mappings":"qRAQMA,IAAAA,CAAAA,CAAgBC,GACpB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,CAQA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,OAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,CAQT,OAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAYT,CAAA,CAAA,MAAA,CAAQ,MACV,CACF,CAAA,CACA,gBAAiB,CACf,OAAA,CAAS,SACX,CACF,CACF,CAAA,CAWMC,EAAc,CAClB,CAAA,UAAA,CAAA,CACE,CACE,SAAA,CAAAC,CACA,CAAA,OAAA,CAAAC,EACA,IAAAC,CAAAA,CAAAA,CACA,gBAAAC,CAAAA,CAAAA,CAAmB,MACnB,CAAA,KAAA,CAAAC,EACA,UAAAC,CAAAA,CAAAA,CACA,WAAAC,CACA,CAAA,KAAA,CAAAC,EACA,YAAAC,CAAAA,CAAAA,CACA,QAAAC,CAAAA,CAAAA,CACA,EAAAC,CAAAA,CAAAA,CACA,WAAAC,CACA,CAAA,GAAGC,CACL,CAAA,CACAC,CACG,GAAA,CACH,GAAM,CAACC,CAAAA,CAAeC,CAAgB,CAAA,CAAIC,QAAUT,CAAAA,CAAAA,EAASC,GAAgB,EAAa,CAAA,CACpFS,EAAUP,CAAY,EAAA,CAAA,CAAA,KAAA,GAEtBQ,CAAeX,CAAAA,CAAAA,GAAU,MAAYA,CAAAA,CAAAA,CAAQO,CAC7CK,CAAAA,CAAAA,CAAgB,OAAOD,CAAY,CAAA,CAAE,MAErCE,CAAAA,CAAAA,CAAgBC,CAA2C,EAAA,CAC3Dd,IAAU,MACZQ,EAAAA,CAAAA,CAAiBM,CAAE,CAAA,MAAA,CAAO,KAAK,CAAA,CAEjCZ,IAAWY,CAAC,EACd,EAEA,OACEC,IAAAA,CAAC,OAAI,SAAWC,CAAAA,CAAAA,CAAG,iBAAmBpB,CAAAA,CAAgB,CACnD,CAAA,QAAA,CAAA,CAAAC,IACE,OAAOA,CAAAA,EAAU,QAChBoB,CAAAA,GAAAA,CAAC,OACC,CAAA,CAAA,OAAA,CAASP,EACT,SAAU,CAAA,6CAAA,CACT,GAAGN,CAAAA,CAEH,QAAAP,CAAAA,CAAAA,CACH,EAEAA,CAEJkB,CAAAA,CAAAA,IAAAA,CAAC,OAAI,SAAU,CAAA,UAAA,CACb,UAAAE,GAAC,CAAA,OAAA,CAAA,CACC,GAAKX,CAAAA,CAAAA,CACL,EAAII,CAAAA,CAAAA,CACJ,KAAMf,CACN,CAAA,WAAA,CAAU,OACV,CAAA,SAAA,CAAWqB,CAAG1B,CAAAA,CAAAA,CAAc,CAAE,OAAAI,CAAAA,CAAQ,CAAC,CAAA,CAAGD,CAAS,CAAA,CACnD,MAAOkB,CACP,CAAA,QAAA,CAAUE,EACT,GAAGR,CAAAA,CACN,EACCX,CAAY,GAAA,SAAA,EACXuB,GAACC,CAAAA,0BAAAA,CAAA,CACC,IAAA,CAAK,SACL,SAAU,CAAA,6DAAA,CACZ,CAEDxB,CAAAA,CAAAA,GAAY,QACXuB,EAAAA,GAAAA,CAACE,SAAA,CACC,IAAA,CAAK,SACL,CAAA,SAAA,CAAU,
|
|
1
|
+
{"version":3,"sources":["../src/v2/input/input.tsx"],"names":["inputVariants","cva","Input","className","variant","type","wrapperClassName","label","helperText","charLength","value","defaultValue","onChange","id","labelProps","props","ref","internalValue","setInternalValue","useState","inputId","currentValue","currentLength","handleChange","e","jsxs","cn","jsx","HiOutlineExclamationCircle","LuSearch","LuClock4"],"mappings":"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","file":"chunk-QVOCV3VP.js","sourcesContent":["import * as React from 'react';\nimport { ForwardedRef, useState } from 'react';\nimport { cva, VariantProps } from 'class-variance-authority';\nimport { HiOutlineExclamationCircle } from 'react-icons/hi2';\nimport { LuClock4, LuSearch } from 'react-icons/lu';\n\nimport { cn } from '@/lib/utils';\n\nconst inputVariants = cva(\n `\n flex items-center h-12 w-full min-w-0 rounded-md border bg-white px-3 py-3 text-base transition-all outline-none\n dark:bg-input/30 border-input shadow-xs\n placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground\n file:inline-flex file:h-6 file:mr-2 file:border-0 file:text-foreground\n disabled:cursor-not-allowed disabled:opacity-50 disabled:pointer-events-none disabled:bg-gray-200\n focus-visible:ring-ring/50 focus-visible:ring-[3px] \n `,\n {\n variants: {\n variant: {\n default: `\n hover:enabled:border-dark-green \n focus:enabled:border-dark-green\n focus:enabled:shadow-green-300\n focus-within:shadow\n focus-within:shadow-green-300\n focus-visible:border-dark-green \n `,\n invalid: `\n border-destructive\n hover:border-destructive\n focus:border-destructive\n focus:shadow-red-100\n focus-within:shadow\n focus-within:shadow-red-100\n focus-visible:border-destructive\n aria-invalid:ring-destructive/20\n dark:aria-invalid:ring-destructive/40\n aria-invalid:border-destructive \n `,\n search: 'pr-8',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\ntype InputProps = React.ComponentProps<'input'> &\n VariantProps<typeof inputVariants> & {\n wrapperClassName?: string;\n label?: React.ReactNode;\n helperText?: string;\n charLength?: number;\n labelProps?: React.ComponentProps<'label'>;\n };\n\nconst Input = React.forwardRef(\n (\n {\n className,\n variant,\n type,\n wrapperClassName = undefined,\n label,\n helperText,\n charLength,\n value,\n defaultValue,\n onChange,\n id,\n labelProps,\n ...props\n }: InputProps,\n ref?: ForwardedRef<HTMLInputElement>,\n ) => {\n const [internalValue, setInternalValue] = useState((value || defaultValue || '') as string);\n const inputId = id || React.useId();\n\n const currentValue = value !== undefined ? value : internalValue;\n const currentLength = String(currentValue).length;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n return (\n <div className={cn('relative w-full', wrapperClassName)}>\n {label &&\n (typeof label === 'string' ? (\n <label\n htmlFor={inputId}\n className=\"header-xs text-primary mb-2 block font-bold\"\n {...labelProps}\n >\n {label}\n </label>\n ) : (\n label\n ))}\n <div className=\"relative\">\n <input\n ref={ref}\n id={inputId}\n type={type}\n data-slot=\"input\"\n className={cn(inputVariants({ variant }), className)}\n value={currentValue}\n onChange={handleChange}\n {...props}\n />\n {variant === 'invalid' && (\n <HiOutlineExclamationCircle\n size=\"1.5rem\"\n className=\"text-destructive pointer-events-none absolute top-3 right-2\"\n />\n )}\n {variant === 'search' && (\n <LuSearch\n size=\"1.25rem\"\n className=\"text-muted-foreground pointer-events-none absolute top-3.5 right-3\"\n />\n )}\n {type === 'time' && (\n <LuClock4\n size=\"1.25rem\"\n className=\"text-muted-foreground pointer-events-none absolute top-3.5 right-3\"\n />\n )}\n </div>\n {(helperText || charLength) && (\n <div className=\"mt-2 flex items-center justify-between\">\n <span\n className={cn(\n 'text-sm',\n variant === 'invalid' ? 'text-destructive' : 'text-secondary',\n )}\n >\n {helperText || ''}\n </span>\n {charLength && (\n <span\n className={cn(\n 'text-sm',\n variant === 'invalid' ? 'text-destructive' : 'text-secondary',\n )}\n >\n {currentLength}/{charLength}\n </span>\n )}\n </div>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = 'Input';\n\nexport { Input, inputVariants };\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {a,b,c}from'./chunk-UDU6Z7PN.js';import {a as a$2,c as c$1,d,e,f,h}from'./chunk-XMEBDMUG.js';import {a as a$1}from'./chunk-YTIIAU4W.js';import {LuSearch,LuChevronsUpDown,LuCheck}from'react-icons/lu';import {useState}from'react';import {jsxs,jsx}from'react/jsx-runtime';var j=({classNames:a$3=void 0,options:t,preSearchOptions:S=void 0,onChange:w=void 0,onOpenChange:d$1=void 0,placeholder:O="Select an option",searchLabel:P="Search...",notFoundMessage:k="Not found.",value:i=void 0,size:L="default"})=>{let[s,p]=useState(false),[N,l]=useState(false),z=N?t:S||t;return jsxs(a,{open:s,onOpenChange:()=>{p(!s),l(false),d$1?.(!s);},children:[jsxs(b,{className:a$1("focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive hover:border-dark-green inline-flex h-12 w-full shrink-0 cursor-pointer items-center justify-between gap-2 rounded-md border px-4 whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-5",L==="sm"&&"py-xs h-8 px-3 [&_svg:not([class*='size-'])]:size-4",a$3?.trigger),children:[jsxs("div",{className:"flex items-center gap-2",children:[!i&&jsx(LuSearch,{}),i?t.find(e=>e.value===i)?.label:O]}),jsx(LuChevronsUpDown,{className:"opacity-50"})]}),jsx(c,{className:a$1("w-[var(--radix-popover-trigger-width)] p-0",a$3?.content),children:jsxs(a$2,{children:[jsx(c$1,{placeholder:P,className:a$1("h-9",a$3?.input),onValueChange:e=>l(!!e)}),jsxs(d,{children:[jsx(e,{children:k}),jsx(f,{children:z.map(e=>jsxs(h,{value:e.value,keywords:[e.label,e.additionalSearchText??""],onSelect:m=>{w?.(m===i?"":m),p(false),d$1?.(false);},className:a$3?.item,children:[e.label,jsx(LuCheck,{className:a$1("ml-auto",i===e.value?"opacity-100":"opacity-0")})]},e.value))})]})]})})]})};export{j as a};//# sourceMappingURL=chunk-ZO25Y6HY.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-ZO25Y6HY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/v2/combobox/combobox.tsx"],"names":["Combobox","classNames","options","preSearchOptions","onChange","onOpenChange","placeholder","searchLabel","notFoundMessage","value","size","open","setOpen","useState","isSearching","setIsSearching","optionsToDisplay","jsxs","Popover","PopoverTrigger","cn","jsx","LuSearch","item","LuChevronsUpDown","PopoverContent","Command","CommandInput","val","CommandList","CommandEmpty","CommandGroup","CommandItem","currentValue","LuCheck"],"mappings":"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","file":"chunk-ZO25Y6HY.js","sourcesContent":["import { LuCheck, LuChevronsUpDown, LuSearch } from 'react-icons/lu';\nimport { useState } from 'react';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/v2/popover/popover';\nimport { cn } from '@/lib/utils';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/v2/command/command';\n\ntype ComboboxOption = {\n label: string;\n value: string;\n additionalSearchText?: string;\n};\n\ntype ComboboxProps = {\n classNames?: {\n content?: string;\n input?: string;\n item?: string;\n trigger?: string;\n };\n options: ComboboxOption[];\n preSearchOptions?: ComboboxOption[];\n onChange?: (value: string) => void;\n onOpenChange?: (open: boolean) => void;\n placeholder?: string;\n searchLabel?: string;\n notFoundMessage?: string;\n value?: string;\n size?: 'default' | 'sm';\n};\n\nexport const Combobox = ({\n classNames = undefined,\n options,\n preSearchOptions = undefined,\n onChange = undefined,\n onOpenChange = undefined,\n placeholder = 'Select an option',\n searchLabel = 'Search...',\n notFoundMessage = 'Not found.',\n value = undefined,\n size = 'default',\n}: ComboboxProps) => {\n const [open, setOpen] = useState(false);\n\n // Allow filtering down to just a subset of options before searching\n // NOTE: preSearchOptions is optional, while options is a required prop that we can fallback to\n const [isSearching, setIsSearching] = useState(false);\n const optionsToDisplay = isSearching ? options : preSearchOptions || options;\n\n const handleOpenChange = () => {\n setOpen(!open);\n setIsSearching(false);\n onOpenChange?.(!open);\n };\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger\n className={cn(\n \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive hover:border-dark-green inline-flex h-12 w-full shrink-0 cursor-pointer items-center justify-between gap-2 rounded-md border px-4 whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-5\",\n size === 'sm' && \"py-xs h-8 px-3 [&_svg:not([class*='size-'])]:size-4\",\n classNames?.trigger,\n )}\n >\n <div className=\"flex items-center gap-2\">\n {!value && <LuSearch />}\n {value ? options.find((item) => item.value === value)?.label : placeholder}\n </div>\n <LuChevronsUpDown className=\"opacity-50\" />\n </PopoverTrigger>\n <PopoverContent\n className={cn('w-[var(--radix-popover-trigger-width)] p-0', classNames?.content)}\n >\n <Command>\n <CommandInput\n placeholder={searchLabel}\n className={cn('h-9', classNames?.input)}\n onValueChange={(val) => setIsSearching(!!val)}\n />\n <CommandList>\n <CommandEmpty>{notFoundMessage}</CommandEmpty>\n <CommandGroup>\n {optionsToDisplay.map((item) => (\n <CommandItem\n key={item.value}\n value={item.value}\n keywords={[item.label, item.additionalSearchText ?? '']}\n onSelect={(currentValue) => {\n onChange?.(currentValue === value ? '' : currentValue);\n setOpen(false);\n onOpenChange?.(false);\n }}\n className={classNames?.item}\n >\n {item.label}\n <LuCheck\n className={cn('ml-auto', value === item.value ? 'opacity-100' : 'opacity-0')}\n />\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n};\n"]}
|