@sth87/shadcn-design-system 0.0.33 → 0.0.34
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/cjs/components/Dialog/Dialog.cjs +1 -1
- package/dist/cjs/components/Dialog/Dialog.cjs.map +1 -1
- package/dist/cjs/components/Input/Input.cjs +1 -1
- package/dist/cjs/components/Input/Input.cjs.map +1 -1
- package/dist/esm/components/Dialog/Dialog.js +1 -1
- package/dist/esm/components/Dialog/Dialog.js.map +1 -1
- package/dist/esm/components/Input/Input.js +56 -56
- package/dist/esm/components/Input/Input.js.map +1 -1
- package/dist/types/components/Input/Input.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),b=require("react"),s=require("../../packages/ui/src/components/dialog.cjs"),c=require("../../packages/ui/src/components/alert-dialog.cjs"),I=require("../../packages/ui/src/components/scroll-area.cjs"),t=require("../../packages/ui/src/lib/utils.cjs"),W=require("../../utils/animations.cjs"),y=require("lucide-react"),S=require("../Button/Button.cjs"),X={dialog:null,confirm:e.jsx("div",{className:"size-12 flex items-center justify-center rounded-full bg-success/10 mx-auto mb-4",children:e.jsx(y.CheckCircle2,{className:"size-6 text-success"})}),alert:e.jsx("div",{className:"size-12 flex items-center justify-center rounded-full bg-error/10 mx-auto mb-4",children:e.jsx(y.AlertCircle,{className:"size-5 text-error"})}),info:e.jsx("div",{className:"size-12 flex items-center justify-center rounded-full bg-blue-500/10 mx-auto mb-4",children:e.jsx(y.Info,{className:"size-5 text-blue-500"})}),warning:e.jsx("div",{className:"size-12 flex items-center justify-center rounded-full bg-warning/10 mx-auto mb-4",children:e.jsx(y.AlertTriangle,{className:"size-5 text-warning"})})},Y={dialog:"",confirm:"border-blue-500/20",alert:"border-red-500/20",info:"border-blue-500/20",warning:"border-yellow-500/20"},Z={sm:"sm:max-w-sm",md:"sm:max-w-md",lg:"sm:max-w-lg",xl:"sm:max-w-xl","2xl":"sm:max-w-2xl max-h-[90vh]","3xl":"sm:max-w-3xl max-h-[90vh]","4xl":"sm:max-w-4xl max-h-[90vh]",full:"sm:max-w-[95vw] h-[98vh]"},$={center:"!top-[50%] !left-[50%] !translate-x-[-50%] !translate-y-[-50%]",top:"!top-4 !left-[50%] !translate-x-[-50%] !translate-y-0",bottom:"!top-auto !bottom-4 !left-[50%] !translate-x-[-50%] !translate-y-0",left:"!left-4 !top-[50%] !translate-x-0 !translate-y-[-50%]",right:"!left-auto !right-4 !top-[50%] !translate-x-0 !translate-y-[-50%]","top-left":"!top-4 !left-4 !translate-x-0 !translate-y-0","top-right":"!top-4 !left-auto !right-4 !translate-x-0 !translate-y-0","bottom-left":"!top-auto !bottom-4 !left-4 !translate-x-0 !translate-y-0","bottom-right":"!top-auto !bottom-4 !left-auto !right-4 !translate-x-0 !translate-y-0"},E=b.forwardRef((K,v)=>{const{variant:C="dialog",open:w,onOpenChange:A,title:l,description:a,children:u,trigger:f,footer:n,closeOnEsc:z=!0,closeOnOutside:_=!0,showCloseButton:P=!0,position:G="center",size:J="md",fullscreen:k=!1,scrollable:q=!0,stickyHeader:o=!1,stickyFooter:i=!1,animation:m,className:T,contentClassName:B,headerClassName:L,titleClassName:h,descriptionClassName:g,footerClassName:Q,confirmButton:x,cancelButton:d,showIcon:U=!0,backdropFilter:F=
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),b=require("react"),s=require("../../packages/ui/src/components/dialog.cjs"),c=require("../../packages/ui/src/components/alert-dialog.cjs"),I=require("../../packages/ui/src/components/scroll-area.cjs"),t=require("../../packages/ui/src/lib/utils.cjs"),W=require("../../utils/animations.cjs"),y=require("lucide-react"),S=require("../Button/Button.cjs"),X={dialog:null,confirm:e.jsx("div",{className:"size-12 flex items-center justify-center rounded-full bg-success/10 mx-auto mb-4",children:e.jsx(y.CheckCircle2,{className:"size-6 text-success"})}),alert:e.jsx("div",{className:"size-12 flex items-center justify-center rounded-full bg-error/10 mx-auto mb-4",children:e.jsx(y.AlertCircle,{className:"size-5 text-error"})}),info:e.jsx("div",{className:"size-12 flex items-center justify-center rounded-full bg-blue-500/10 mx-auto mb-4",children:e.jsx(y.Info,{className:"size-5 text-blue-500"})}),warning:e.jsx("div",{className:"size-12 flex items-center justify-center rounded-full bg-warning/10 mx-auto mb-4",children:e.jsx(y.AlertTriangle,{className:"size-5 text-warning"})})},Y={dialog:"",confirm:"border-blue-500/20",alert:"border-red-500/20",info:"border-blue-500/20",warning:"border-yellow-500/20"},Z={sm:"sm:max-w-sm",md:"sm:max-w-md",lg:"sm:max-w-lg",xl:"sm:max-w-xl","2xl":"sm:max-w-2xl max-h-[90vh]","3xl":"sm:max-w-3xl max-h-[90vh]","4xl":"sm:max-w-4xl max-h-[90vh]",full:"sm:max-w-[95vw] h-[98vh]"},$={center:"!top-[50%] !left-[50%] !translate-x-[-50%] !translate-y-[-50%]",top:"!top-4 !left-[50%] !translate-x-[-50%] !translate-y-0",bottom:"!top-auto !bottom-4 !left-[50%] !translate-x-[-50%] !translate-y-0",left:"!left-4 !top-[50%] !translate-x-0 !translate-y-[-50%]",right:"!left-auto !right-4 !top-[50%] !translate-x-0 !translate-y-[-50%]","top-left":"!top-4 !left-4 !translate-x-0 !translate-y-0","top-right":"!top-4 !left-auto !right-4 !translate-x-0 !translate-y-0","bottom-left":"!top-auto !bottom-4 !left-4 !translate-x-0 !translate-y-0","bottom-right":"!top-auto !bottom-4 !left-auto !right-4 !translate-x-0 !translate-y-0"},E=b.forwardRef((K,v)=>{const{variant:C="dialog",open:w,onOpenChange:A,title:l,description:a,children:u,trigger:f,footer:n,closeOnEsc:z=!0,closeOnOutside:_=!0,showCloseButton:P=!0,position:G="center",size:J="md",fullscreen:k=!1,scrollable:q=!0,stickyHeader:o=!1,stickyFooter:i=!1,animation:m,className:T,contentClassName:B,headerClassName:L,titleClassName:h,descriptionClassName:g,footerClassName:Q,confirmButton:x,cancelButton:d,showIcon:U=!0,backdropFilter:F=2,overlay:O="dark"}=K,V=b.useMemo(()=>m?W.animationClass(m):{className:""},[m]),M=t.cn("!p-0 !gap-0 flex flex-col",Z[k?"full":J],$[G],Y[C],V.className,k?"h-[98vh]":"max-h-[90vh]"),p=t.cn("px-6 pt-6 text-left",!q&&"contents space-y-0",L),j=t.cn("px-6 pb-6 sm:justify-end",!q&&"border-t py-4",Q),N=U?X[C]:null,R=b.useMemo(()=>l||N||a?e.jsxs(c.AlertDialogHeader,{className:t.cn("flex items-center gap-2 py-4",{"border-b":o},p),children:[(l||N)&&e.jsxs(c.AlertDialogTitle,{className:t.cn(h),children:[N,l]}),a&&e.jsx(c.AlertDialogDescription,{className:g,children:a})]}):null,[l,N,a,p,h,g,o]),H=b.useMemo(()=>{const r={variant:"solid",color:"primary",...x,text:x?.text??"Confirm"},D={variant:"outline",...d,text:d?.text??"Cancel"};return n||x||d?e.jsx(c.AlertDialogFooter,{className:t.cn("py-4",{"border-t":i},j),children:n||e.jsxs(e.Fragment,{children:[d&&e.jsx(S.default,{...D,onClick:()=>{D.onClick?.()},children:D.text}),x&&e.jsx(S.default,{...r,onClick:()=>{r.onClick?.()},children:r.text})]})}):null},[n,j,x,d,i]);return C!=="dialog"?e.jsxs(c.AlertDialog,{open:w,onOpenChange:A,children:[f&&e.jsx(c.AlertDialogTrigger,{asChild:!0,children:f}),e.jsxs(c.AlertDialogContent,{ref:v,className:t.cn(T,M),onEscapeKeyDown:r=>!z&&r.preventDefault(),noDefaultAnimation:!!m,backdropFilter:F,overlay:O,children:[o&&R,e.jsxs(I.ScrollArea,{className:"flex max-h-full flex-col overflow-hidden",children:[!o&&R,u&&e.jsx("div",{className:t.cn("px-6 py-4",B),children:u}),!i&&H]}),i&&H]})]}):e.jsxs(s.Dialog,{open:w,onOpenChange:A,children:[f&&e.jsx(s.DialogTrigger,{asChild:!0,children:f}),e.jsxs(s.DialogContent,{ref:v,className:t.cn(T,M),showCloseButton:P,onEscapeKeyDown:r=>!z&&r.preventDefault(),onInteractOutside:r=>!_&&r.preventDefault(),noDefaultAnimation:!!m,backdropFilter:F,overlay:O,children:[o&&(l||a)&&e.jsxs(s.DialogHeader,{className:t.cn({"py-4 border-b":o},p),children:[l&&e.jsx(s.DialogTitle,{className:h,children:l}),a&&e.jsx(s.DialogDescription,{className:g,children:a})]}),e.jsxs(I.ScrollArea,{className:"flex max-h-full flex-col overflow-hidden",children:[!o&&(l||a)&&e.jsxs(s.DialogHeader,{className:t.cn("py-4",p),children:[l&&e.jsx(s.DialogTitle,{className:h,children:l}),a&&e.jsx(s.DialogDescription,{className:g,children:a})]}),u&&e.jsx("div",{className:t.cn("px-6 py-4",B),children:u}),!i&&n&&e.jsx(s.DialogFooter,{className:t.cn("py-4",j),children:n})]}),i&&n&&e.jsx(s.DialogFooter,{className:t.cn({"py-4 border-t":i},j),children:n})]})]})});E.displayName="Dialog";exports.default=E;
|
|
2
2
|
//# sourceMappingURL=Dialog.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.cjs","sources":["../../../../src/components/Dialog/Dialog.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport {\n Dialog as SDialog,\n DialogContent as SDialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"@dsui/ui/components/dialog\";\nimport {\n AlertDialog,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"@dsui/ui/components/alert-dialog\";\nimport { ScrollArea } from \"@dsui/ui/components/scroll-area\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport type { BasicAnimation } from \"@/types/variables\";\nimport { animationClass } from \"@/utils/animations\";\nimport { AlertTriangle, Info, CheckCircle2, AlertCircle } from \"lucide-react\";\nimport Button, { type ButtonProps } from \"../Button/Button\";\n\nexport type DialogVariant = \"dialog\" | \"confirm\" | \"alert\" | \"info\" | \"warning\";\nexport type DialogSize =\n | \"sm\"\n | \"md\"\n | \"lg\"\n | \"xl\"\n | \"2xl\"\n | \"3xl\"\n | \"4xl\"\n | \"full\";\nexport type DialogPosition =\n | \"center\"\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\nexport interface DialogButtonConfig extends Omit<ButtonProps, \"children\"> {\n text?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport interface DialogProps {\n // Core props\n variant?: DialogVariant;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n\n // Content\n title?: React.ReactNode;\n description?: React.ReactNode;\n children?: React.ReactNode;\n trigger?: React.ReactNode;\n footer?: React.ReactNode;\n\n // Behavior\n closeOnEsc?: boolean;\n closeOnOutside?: boolean;\n showCloseButton?: boolean;\n\n // Layout\n position?: DialogPosition;\n size?: DialogSize;\n fullscreen?: boolean;\n scrollable?: boolean;\n stickyHeader?: boolean;\n stickyFooter?: boolean;\n\n // Animation\n animation?: BasicAnimation;\n\n // Styling\n className?: string;\n contentClassName?: string;\n headerClassName?: string;\n titleClassName?: string;\n descriptionClassName?: string;\n footerClassName?: string;\n overlayClassName?: string;\n\n // Overlay\n backdropFilter?: number;\n overlay?: \"dark\" | \"light\";\n\n // Alert/Confirm buttons\n confirmButton?: DialogButtonConfig;\n cancelButton?: DialogButtonConfig;\n\n // Alert/Confirm specific\n showIcon?: boolean;\n}\n\nconst variantIcons = {\n dialog: null,\n confirm: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-success/10 mx-auto mb-4\">\n <CheckCircle2 className=\"size-6 text-success\" />\n </div>\n ),\n alert: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-error/10 mx-auto mb-4\">\n <AlertCircle className=\"size-5 text-error\" />\n </div>\n ),\n info: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-blue-500/10 mx-auto mb-4\">\n <Info className=\"size-5 text-blue-500\" />\n </div>\n ),\n warning: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-warning/10 mx-auto mb-4\">\n <AlertTriangle className=\"size-5 text-warning\" />\n </div>\n ),\n};\n\nconst variantColors = {\n dialog: \"\",\n confirm: \"border-blue-500/20\",\n alert: \"border-red-500/20\",\n info: \"border-blue-500/20\",\n warning: \"border-yellow-500/20\",\n};\n\nconst sizeClasses: Record<DialogSize, string> = {\n sm: \"sm:max-w-sm\",\n md: \"sm:max-w-md\",\n lg: \"sm:max-w-lg\",\n xl: \"sm:max-w-xl\",\n \"2xl\": \"sm:max-w-2xl max-h-[90vh]\",\n \"3xl\": \"sm:max-w-3xl max-h-[90vh]\",\n \"4xl\": \"sm:max-w-4xl max-h-[90vh]\",\n full: \"sm:max-w-[95vw] h-[98vh]\",\n};\n\nconst positionClasses: Record<DialogPosition, string> = {\n center: \"!top-[50%] !left-[50%] !translate-x-[-50%] !translate-y-[-50%]\",\n top: \"!top-4 !left-[50%] !translate-x-[-50%] !translate-y-0\",\n bottom: \"!top-auto !bottom-4 !left-[50%] !translate-x-[-50%] !translate-y-0\",\n left: \"!left-4 !top-[50%] !translate-x-0 !translate-y-[-50%]\",\n right: \"!left-auto !right-4 !top-[50%] !translate-x-0 !translate-y-[-50%]\",\n \"top-left\": \"!top-4 !left-4 !translate-x-0 !translate-y-0\",\n \"top-right\": \"!top-4 !left-auto !right-4 !translate-x-0 !translate-y-0\",\n \"bottom-left\": \"!top-auto !bottom-4 !left-4 !translate-x-0 !translate-y-0\",\n \"bottom-right\":\n \"!top-auto !bottom-4 !left-auto !right-4 !translate-x-0 !translate-y-0\",\n};\n\nconst Dialog = React.forwardRef<HTMLDivElement, DialogProps>((props, ref) => {\n const {\n variant = \"dialog\",\n open,\n onOpenChange,\n title,\n description,\n children,\n trigger,\n footer,\n closeOnEsc = true,\n closeOnOutside = true,\n showCloseButton = true,\n position = \"center\",\n size = \"md\",\n fullscreen = false,\n scrollable = true,\n stickyHeader = false,\n stickyFooter = false,\n animation,\n className,\n contentClassName,\n headerClassName,\n titleClassName,\n descriptionClassName,\n footerClassName,\n // overlayClassName, // Not used in current implementation\n confirmButton,\n cancelButton,\n showIcon = true,\n backdropFilter = 0,\n overlay = \"dark\",\n } = props;\n\n const animationResult = useMemo(() => {\n return animation ? animationClass(animation) : { className: \"\" };\n }, [animation]);\n\n const contentClasses = cn(\n // Remove default padding and gap to allow custom header/footer\n \"!p-0 !gap-0 flex flex-col\",\n sizeClasses[fullscreen ? \"full\" : size],\n positionClasses[position],\n variantColors[variant],\n animationResult.className,\n fullscreen ? \"h-[98vh]\" : \"max-h-[90vh]\"\n );\n\n const headerClasses = cn(\n \"px-6 pt-6 text-left\",\n !scrollable && \"contents space-y-0\",\n headerClassName\n );\n\n const footerClasses = cn(\n \"px-6 pb-6 sm:justify-end\",\n !scrollable && \"border-t py-4\",\n footerClassName\n );\n\n const icon = showIcon ? variantIcons[variant] : null;\n\n const headerComponents = useMemo(() => {\n return title || icon || description ? (\n <AlertDialogHeader\n className={cn(\n \"flex items-center gap-2 py-4\",\n { \"border-b\": stickyHeader },\n headerClasses\n )}\n >\n {(title || icon) && (\n <AlertDialogTitle className={cn(titleClassName)}>\n {icon}\n {title}\n </AlertDialogTitle>\n )}\n {description && (\n <AlertDialogDescription className={descriptionClassName}>\n {description}\n </AlertDialogDescription>\n )}\n </AlertDialogHeader>\n ) : null;\n }, [\n title,\n icon,\n description,\n headerClasses,\n titleClassName,\n descriptionClassName,\n stickyHeader,\n ]);\n\n const footerComponents = useMemo(() => {\n // Merge configs with defaults\n const mergedConfirmButton: DialogButtonConfig = {\n variant: \"solid\",\n color: \"primary\",\n ...confirmButton,\n text: confirmButton?.text ?? \"Confirm\",\n };\n\n const mergedCancelButton: DialogButtonConfig = {\n variant: \"outline\",\n ...cancelButton,\n text: cancelButton?.text ?? \"Cancel\",\n };\n\n return footer || confirmButton || cancelButton ? (\n <AlertDialogFooter\n className={cn(\"py-4\", { \"border-t\": stickyFooter }, footerClasses)}\n >\n {footer || (\n <>\n {cancelButton && (\n <Button\n {...mergedCancelButton}\n onClick={() => {\n mergedCancelButton.onClick?.();\n }}\n >\n {mergedCancelButton.text}\n </Button>\n )}\n {confirmButton && (\n <Button\n {...mergedConfirmButton}\n onClick={() => {\n mergedConfirmButton.onClick?.();\n }}\n >\n {mergedConfirmButton.text}\n </Button>\n )}\n </>\n )}\n </AlertDialogFooter>\n ) : null;\n }, [footer, footerClasses, confirmButton, cancelButton, stickyFooter]);\n\n // For alert-style dialogs (confirm, alert, info, warning)\n if (variant !== \"dialog\") {\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n {trigger && <AlertDialogTrigger asChild>{trigger}</AlertDialogTrigger>}\n <AlertDialogContent\n ref={ref}\n className={cn(className, contentClasses)}\n onEscapeKeyDown={(e) => !closeOnEsc && e.preventDefault()}\n noDefaultAnimation={!!animation}\n backdropFilter={backdropFilter}\n overlay={overlay}\n >\n {stickyHeader && headerComponents}\n\n <ScrollArea className=\"flex max-h-full flex-col overflow-hidden\">\n {!stickyHeader && headerComponents}\n {children && (\n <div className={cn(\"px-6 py-4\", contentClassName)}>\n {children}\n </div>\n )}\n {!stickyFooter && footerComponents}\n </ScrollArea>\n\n {stickyFooter && footerComponents}\n </AlertDialogContent>\n </AlertDialog>\n );\n }\n\n // Regular dialog\n return (\n <SDialog open={open} onOpenChange={onOpenChange}>\n {trigger && <DialogTrigger asChild>{trigger}</DialogTrigger>}\n <SDialogContent\n ref={ref}\n className={cn(className, contentClasses)}\n showCloseButton={showCloseButton}\n onEscapeKeyDown={(e) => !closeOnEsc && e.preventDefault()}\n onInteractOutside={(e) => !closeOnOutside && e.preventDefault()}\n noDefaultAnimation={!!animation}\n backdropFilter={backdropFilter}\n overlay={overlay}\n >\n {stickyHeader && (title || description) && (\n <DialogHeader\n className={cn({ \"py-4 border-b\": stickyHeader }, headerClasses)}\n >\n {title && (\n <DialogTitle className={titleClassName}>{title}</DialogTitle>\n )}\n {description && (\n <DialogDescription className={descriptionClassName}>\n {description}\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n <ScrollArea className=\"flex max-h-full flex-col overflow-hidden\">\n {!stickyHeader && (title || description) && (\n <DialogHeader className={cn(\"py-4\", headerClasses)}>\n {title && (\n <DialogTitle className={titleClassName}>{title}</DialogTitle>\n )}\n {description && (\n <DialogDescription className={descriptionClassName}>\n {description}\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n {children && (\n <div className={cn(\"px-6 py-4\", contentClassName)}>{children}</div>\n )}\n {!stickyFooter && footer && (\n <DialogFooter className={cn(\"py-4\", footerClasses)}>\n {footer}\n </DialogFooter>\n )}\n </ScrollArea>\n {stickyFooter && footer && (\n <DialogFooter\n className={cn({ \"py-4 border-t\": stickyFooter }, footerClasses)}\n >\n {footer}\n </DialogFooter>\n )}\n </SDialogContent>\n </SDialog>\n );\n});\n\nDialog.displayName = \"Dialog\";\n\nexport default Dialog;\n"],"names":["variantIcons","jsx","CheckCircle2","AlertCircle","Info","AlertTriangle","variantColors","sizeClasses","positionClasses","Dialog","React","props","ref","variant","open","onOpenChange","title","description","children","trigger","footer","closeOnEsc","closeOnOutside","showCloseButton","position","size","fullscreen","scrollable","stickyHeader","stickyFooter","animation","className","contentClassName","headerClassName","titleClassName","descriptionClassName","footerClassName","confirmButton","cancelButton","showIcon","backdropFilter","overlay","animationResult","useMemo","animationClass","contentClasses","cn","headerClasses","footerClasses","icon","headerComponents","jsxs","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","footerComponents","mergedConfirmButton","mergedCancelButton","AlertDialogFooter","Fragment","Button","AlertDialog","AlertDialogTrigger","AlertDialogContent","e","ScrollArea","SDialog","DialogTrigger","SDialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dialog.cjs","sources":["../../../../src/components/Dialog/Dialog.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport {\n Dialog as SDialog,\n DialogContent as SDialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"@dsui/ui/components/dialog\";\nimport {\n AlertDialog,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"@dsui/ui/components/alert-dialog\";\nimport { ScrollArea } from \"@dsui/ui/components/scroll-area\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport type { BasicAnimation } from \"@/types/variables\";\nimport { animationClass } from \"@/utils/animations\";\nimport { AlertTriangle, Info, CheckCircle2, AlertCircle } from \"lucide-react\";\nimport Button, { type ButtonProps } from \"../Button/Button\";\n\nexport type DialogVariant = \"dialog\" | \"confirm\" | \"alert\" | \"info\" | \"warning\";\nexport type DialogSize =\n | \"sm\"\n | \"md\"\n | \"lg\"\n | \"xl\"\n | \"2xl\"\n | \"3xl\"\n | \"4xl\"\n | \"full\";\nexport type DialogPosition =\n | \"center\"\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\nexport interface DialogButtonConfig extends Omit<ButtonProps, \"children\"> {\n text?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport interface DialogProps {\n // Core props\n variant?: DialogVariant;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n\n // Content\n title?: React.ReactNode;\n description?: React.ReactNode;\n children?: React.ReactNode;\n trigger?: React.ReactNode;\n footer?: React.ReactNode;\n\n // Behavior\n closeOnEsc?: boolean;\n closeOnOutside?: boolean;\n showCloseButton?: boolean;\n\n // Layout\n position?: DialogPosition;\n size?: DialogSize;\n fullscreen?: boolean;\n scrollable?: boolean;\n stickyHeader?: boolean;\n stickyFooter?: boolean;\n\n // Animation\n animation?: BasicAnimation;\n\n // Styling\n className?: string;\n contentClassName?: string;\n headerClassName?: string;\n titleClassName?: string;\n descriptionClassName?: string;\n footerClassName?: string;\n overlayClassName?: string;\n\n // Overlay\n backdropFilter?: number;\n overlay?: \"dark\" | \"light\";\n\n // Alert/Confirm buttons\n confirmButton?: DialogButtonConfig;\n cancelButton?: DialogButtonConfig;\n\n // Alert/Confirm specific\n showIcon?: boolean;\n}\n\nconst variantIcons = {\n dialog: null,\n confirm: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-success/10 mx-auto mb-4\">\n <CheckCircle2 className=\"size-6 text-success\" />\n </div>\n ),\n alert: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-error/10 mx-auto mb-4\">\n <AlertCircle className=\"size-5 text-error\" />\n </div>\n ),\n info: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-blue-500/10 mx-auto mb-4\">\n <Info className=\"size-5 text-blue-500\" />\n </div>\n ),\n warning: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-warning/10 mx-auto mb-4\">\n <AlertTriangle className=\"size-5 text-warning\" />\n </div>\n ),\n};\n\nconst variantColors = {\n dialog: \"\",\n confirm: \"border-blue-500/20\",\n alert: \"border-red-500/20\",\n info: \"border-blue-500/20\",\n warning: \"border-yellow-500/20\",\n};\n\nconst sizeClasses: Record<DialogSize, string> = {\n sm: \"sm:max-w-sm\",\n md: \"sm:max-w-md\",\n lg: \"sm:max-w-lg\",\n xl: \"sm:max-w-xl\",\n \"2xl\": \"sm:max-w-2xl max-h-[90vh]\",\n \"3xl\": \"sm:max-w-3xl max-h-[90vh]\",\n \"4xl\": \"sm:max-w-4xl max-h-[90vh]\",\n full: \"sm:max-w-[95vw] h-[98vh]\",\n};\n\nconst positionClasses: Record<DialogPosition, string> = {\n center: \"!top-[50%] !left-[50%] !translate-x-[-50%] !translate-y-[-50%]\",\n top: \"!top-4 !left-[50%] !translate-x-[-50%] !translate-y-0\",\n bottom: \"!top-auto !bottom-4 !left-[50%] !translate-x-[-50%] !translate-y-0\",\n left: \"!left-4 !top-[50%] !translate-x-0 !translate-y-[-50%]\",\n right: \"!left-auto !right-4 !top-[50%] !translate-x-0 !translate-y-[-50%]\",\n \"top-left\": \"!top-4 !left-4 !translate-x-0 !translate-y-0\",\n \"top-right\": \"!top-4 !left-auto !right-4 !translate-x-0 !translate-y-0\",\n \"bottom-left\": \"!top-auto !bottom-4 !left-4 !translate-x-0 !translate-y-0\",\n \"bottom-right\":\n \"!top-auto !bottom-4 !left-auto !right-4 !translate-x-0 !translate-y-0\",\n};\n\nconst Dialog = React.forwardRef<HTMLDivElement, DialogProps>((props, ref) => {\n const {\n variant = \"dialog\",\n open,\n onOpenChange,\n title,\n description,\n children,\n trigger,\n footer,\n closeOnEsc = true,\n closeOnOutside = true,\n showCloseButton = true,\n position = \"center\",\n size = \"md\",\n fullscreen = false,\n scrollable = true,\n stickyHeader = false,\n stickyFooter = false,\n animation,\n className,\n contentClassName,\n headerClassName,\n titleClassName,\n descriptionClassName,\n footerClassName,\n // overlayClassName, // Not used in current implementation\n confirmButton,\n cancelButton,\n showIcon = true,\n backdropFilter = 2,\n overlay = \"dark\",\n } = props;\n\n const animationResult = useMemo(() => {\n return animation ? animationClass(animation) : { className: \"\" };\n }, [animation]);\n\n const contentClasses = cn(\n // Remove default padding and gap to allow custom header/footer\n \"!p-0 !gap-0 flex flex-col\",\n sizeClasses[fullscreen ? \"full\" : size],\n positionClasses[position],\n variantColors[variant],\n animationResult.className,\n fullscreen ? \"h-[98vh]\" : \"max-h-[90vh]\"\n );\n\n const headerClasses = cn(\n \"px-6 pt-6 text-left\",\n !scrollable && \"contents space-y-0\",\n headerClassName\n );\n\n const footerClasses = cn(\n \"px-6 pb-6 sm:justify-end\",\n !scrollable && \"border-t py-4\",\n footerClassName\n );\n\n const icon = showIcon ? variantIcons[variant] : null;\n\n const headerComponents = useMemo(() => {\n return title || icon || description ? (\n <AlertDialogHeader\n className={cn(\n \"flex items-center gap-2 py-4\",\n { \"border-b\": stickyHeader },\n headerClasses\n )}\n >\n {(title || icon) && (\n <AlertDialogTitle className={cn(titleClassName)}>\n {icon}\n {title}\n </AlertDialogTitle>\n )}\n {description && (\n <AlertDialogDescription className={descriptionClassName}>\n {description}\n </AlertDialogDescription>\n )}\n </AlertDialogHeader>\n ) : null;\n }, [\n title,\n icon,\n description,\n headerClasses,\n titleClassName,\n descriptionClassName,\n stickyHeader,\n ]);\n\n const footerComponents = useMemo(() => {\n // Merge configs with defaults\n const mergedConfirmButton: DialogButtonConfig = {\n variant: \"solid\",\n color: \"primary\",\n ...confirmButton,\n text: confirmButton?.text ?? \"Confirm\",\n };\n\n const mergedCancelButton: DialogButtonConfig = {\n variant: \"outline\",\n ...cancelButton,\n text: cancelButton?.text ?? \"Cancel\",\n };\n\n return footer || confirmButton || cancelButton ? (\n <AlertDialogFooter\n className={cn(\"py-4\", { \"border-t\": stickyFooter }, footerClasses)}\n >\n {footer || (\n <>\n {cancelButton && (\n <Button\n {...mergedCancelButton}\n onClick={() => {\n mergedCancelButton.onClick?.();\n }}\n >\n {mergedCancelButton.text}\n </Button>\n )}\n {confirmButton && (\n <Button\n {...mergedConfirmButton}\n onClick={() => {\n mergedConfirmButton.onClick?.();\n }}\n >\n {mergedConfirmButton.text}\n </Button>\n )}\n </>\n )}\n </AlertDialogFooter>\n ) : null;\n }, [footer, footerClasses, confirmButton, cancelButton, stickyFooter]);\n\n // For alert-style dialogs (confirm, alert, info, warning)\n if (variant !== \"dialog\") {\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n {trigger && <AlertDialogTrigger asChild>{trigger}</AlertDialogTrigger>}\n <AlertDialogContent\n ref={ref}\n className={cn(className, contentClasses)}\n onEscapeKeyDown={(e) => !closeOnEsc && e.preventDefault()}\n noDefaultAnimation={!!animation}\n backdropFilter={backdropFilter}\n overlay={overlay}\n >\n {stickyHeader && headerComponents}\n\n <ScrollArea className=\"flex max-h-full flex-col overflow-hidden\">\n {!stickyHeader && headerComponents}\n {children && (\n <div className={cn(\"px-6 py-4\", contentClassName)}>\n {children}\n </div>\n )}\n {!stickyFooter && footerComponents}\n </ScrollArea>\n\n {stickyFooter && footerComponents}\n </AlertDialogContent>\n </AlertDialog>\n );\n }\n\n // Regular dialog\n return (\n <SDialog open={open} onOpenChange={onOpenChange}>\n {trigger && <DialogTrigger asChild>{trigger}</DialogTrigger>}\n <SDialogContent\n ref={ref}\n className={cn(className, contentClasses)}\n showCloseButton={showCloseButton}\n onEscapeKeyDown={(e) => !closeOnEsc && e.preventDefault()}\n onInteractOutside={(e) => !closeOnOutside && e.preventDefault()}\n noDefaultAnimation={!!animation}\n backdropFilter={backdropFilter}\n overlay={overlay}\n >\n {stickyHeader && (title || description) && (\n <DialogHeader\n className={cn({ \"py-4 border-b\": stickyHeader }, headerClasses)}\n >\n {title && (\n <DialogTitle className={titleClassName}>{title}</DialogTitle>\n )}\n {description && (\n <DialogDescription className={descriptionClassName}>\n {description}\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n <ScrollArea className=\"flex max-h-full flex-col overflow-hidden\">\n {!stickyHeader && (title || description) && (\n <DialogHeader className={cn(\"py-4\", headerClasses)}>\n {title && (\n <DialogTitle className={titleClassName}>{title}</DialogTitle>\n )}\n {description && (\n <DialogDescription className={descriptionClassName}>\n {description}\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n {children && (\n <div className={cn(\"px-6 py-4\", contentClassName)}>{children}</div>\n )}\n {!stickyFooter && footer && (\n <DialogFooter className={cn(\"py-4\", footerClasses)}>\n {footer}\n </DialogFooter>\n )}\n </ScrollArea>\n {stickyFooter && footer && (\n <DialogFooter\n className={cn({ \"py-4 border-t\": stickyFooter }, footerClasses)}\n >\n {footer}\n </DialogFooter>\n )}\n </SDialogContent>\n </SDialog>\n );\n});\n\nDialog.displayName = \"Dialog\";\n\nexport default Dialog;\n"],"names":["variantIcons","jsx","CheckCircle2","AlertCircle","Info","AlertTriangle","variantColors","sizeClasses","positionClasses","Dialog","React","props","ref","variant","open","onOpenChange","title","description","children","trigger","footer","closeOnEsc","closeOnOutside","showCloseButton","position","size","fullscreen","scrollable","stickyHeader","stickyFooter","animation","className","contentClassName","headerClassName","titleClassName","descriptionClassName","footerClassName","confirmButton","cancelButton","showIcon","backdropFilter","overlay","animationResult","useMemo","animationClass","contentClasses","cn","headerClasses","footerClasses","icon","headerComponents","jsxs","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","footerComponents","mergedConfirmButton","mergedCancelButton","AlertDialogFooter","Fragment","Button","AlertDialog","AlertDialogTrigger","AlertDialogContent","e","ScrollArea","SDialog","DialogTrigger","SDialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("react/jsx-runtime"),a=require("react"),K=require("../../packages/ui/src/components/input.cjs"),l=require("../../packages/ui/src/lib/utils.cjs"),Q=require("../FloatLabel.cjs"),m=require("lucide-react"),W=require("use-mask-input"),Y=require("../Tooltip/Tooltip.cjs"),Z=require("../../packages/ui/src/components/label.cjs"),I=a.forwardRef(({className:D,label:
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("react/jsx-runtime"),a=require("react"),K=require("../../packages/ui/src/components/input.cjs"),l=require("../../packages/ui/src/lib/utils.cjs"),Q=require("../FloatLabel.cjs"),m=require("lucide-react"),W=require("use-mask-input"),Y=require("../Tooltip/Tooltip.cjs"),Z=require("../../packages/ui/src/components/label.cjs"),I=a.forwardRef(({className:D,label:v,helperText:p,state:N,size:i,isFloatLabel:u,type:s,mask:f,maskOptions:S,maxLength:b,showCharCount:E,infoTooltip:j,clearable:x,onClear:M,prefixIcon:o,suffixIcon:c,placeholder:_=" ",...e},B)=>{const[g,q]=a.useState(()=>typeof e.value=="string"?e.value.length:typeof e.defaultValue=="string"?e.defaultValue.length:0),H=t=>{q(t.target.value.length),e.onChange&&e.onChange(t)},O=()=>{if(r.current){r.current.value="",q(0);const t={target:r.current,currentTarget:r.current};e.onChange?.(t),M&&M()}},w=a.useId(),r=a.useRef(null),T=a.useCallback(t=>{if(r&&(r.current=t),f&&t){const d=W.withMask(f,S);typeof d=="function"&&d(t)}},[f,S]);a.useImperativeHandle(B,()=>r.current);const[P,U]=a.useState(!1),X={default:"text-muted-foreground",success:"text-success",warning:"text-warning",error:"text-error"},C=u?i==="xl"||i==="lg"?i:"xl":i||"normal",R=(()=>{const t={xs:{prefix:"pl-8",suffix:"pr-8"},sm:{prefix:"pl-9",suffix:"pr-9"},normal:{prefix:"pl-10",suffix:"pr-10"},lg:{prefix:"pl-11",suffix:"pr-11"},xl:{prefix:"pl-12",suffix:"pr-12"}};return t[C]||t.normal})(),V={xs:"size-3",sm:"size-3.5",normal:"size-4",lg:"size-4",xl:"size-4"}[C]||"size-4",A=()=>{const t=s==="number"||s==="password"||s==="datetime"||x&&(g>0||e?.value);return t&&c?s==="password"&&x&&(g>0||e?.value)?"pr-20":"pr-16":t?s==="password"&&x&&(g>0||e?.value)?"pr-16":"pr-10":c?R.suffix:""},k=(()=>{const t={xs:{left:"left-2.5",right:"right-2.5"},sm:{left:"left-3",right:"right-3"},normal:{left:"left-3",right:"right-3"},lg:{left:"left-3.5",right:"right-3.5"},xl:{left:"left-4",right:"right-4"}};return t[C]||t.normal})(),G=()=>{if(r.current){const t=Number(e.step||1),d=e.max?Number(e.max):1/0,y=Number(r.current.value||0),z=Math.min(y+t,d);r.current.value=String(z);const h=new Event("input",{bubbles:!0});r.current.dispatchEvent(h),e.onChange?.(h)}},J=()=>{if(r.current){const t=Number(e.step||1),d=e.min?Number(e.min):-1/0,y=Number(r.current.value||0),z=Math.max(y-t,d);r.current.value=String(z);const h=new Event("input",{bubbles:!0});r.current.dispatchEvent(h),e.onChange?.(h)}};return n.jsx("div",{className:D,children:n.jsxs("div",{className:l.cn("flex flex-col gap-1.5 relative flex-auto",{"floating-label relative":u}),children:[!u&&v&&n.jsxs(Z.Label,{htmlFor:w,className:"flex gap-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",children:[v,j&&n.jsx(Y.Tooltip,{content:j,children:n.jsx(m.Info,{className:"size-3.5 min-w-3.5"})})]}),n.jsxs("div",{className:"relative",children:[o&&n.jsx("div",{className:l.cn("absolute top-1/2 -translate-y-1/2 text-muted-foreground leading-0",k.left),children:a.isValidElement(o)?a.cloneElement(o,{className:l.cn(V,o.props?.className)}):o}),n.jsx(K.Input,{ref:T,id:w,className:l.cn("peer",{"pt-5 pb-1":u&&i!=="lg","[&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none [-moz-appearance:textfield] pr-8":s==="number"},o&&R.prefix,f&&"placeholder:text-slate-400 placeholder:opacity-100",A()),state:N,size:u?i==="xl"||i==="lg"?i:"xl":i,type:s==="password"?P?"text":"password":s,placeholder:_,maxLength:b,onChange:H,...e}),u&&n.jsx(Q.FloatingLabel,{htmlFor:w,size:i,infoTooltip:j,children:v}),s==="number"&&n.jsxs("div",{className:"absolute right-1 top-0 h-full flex flex-col gap-0.5",children:[n.jsx("button",{type:"button",onClick:G,disabled:e.disabled,className:l.cn("h-1/2 w-6 flex items-center justify-center rounded cursor-pointer hover:scale-150 transition-transform","disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent"),tabIndex:-1,children:n.jsx(m.ChevronUp,{className:"size-3"})}),n.jsx("button",{type:"button",onClick:J,disabled:e.disabled,className:l.cn("h-1/2 w-6 flex items-center justify-center rounded cursor-pointer hover:scale-150 transition-transform","disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent"),tabIndex:-1,children:n.jsx(m.ChevronDown,{className:"size-3"})})]}),x&&(g>0||e?.value)&&!e.disabled&&s!=="number"&&n.jsx("button",{type:"button",tabIndex:-1,className:l.cn("absolute top-1/2 -translate-y-1/2 p-1 rounded hover:bg-accent transition-colors cursor-pointer",s==="password"?c?"right-14":"right-10":c?"right-10":"right-2"),onClick:O,disabled:e.disabled,children:n.jsx(m.X,{className:"size-4"})}),s==="password"&&n.jsx("button",{type:"button",tabIndex:-1,className:l.cn("absolute top-1/2 -translate-y-1/2 p-1 rounded hover:bg-accent transition-colors",c?"right-10":"right-2"),onClick:()=>U(t=>!t),disabled:e.disabled,children:P?n.jsx(m.EyeOff,{className:"size-4"}):n.jsx(m.Eye,{className:"size-4"})}),c&&n.jsx("div",{className:l.cn("absolute top-1/2 -translate-y-1/2 text-muted-foreground leading-0",k.right),children:a.isValidElement(c)?a.cloneElement(c,{className:l.cn(V,c.props?.className)}):c})]}),(p||E&&typeof b=="number")&&n.jsxs("div",{className:"flex items-center justify-between text-xs gap-2",children:[p&&n.jsx("p",{className:l.cn("text-xs",N?X?.[N]:""),children:p}),E&&typeof b=="number"&&n.jsxs("span",{className:"ml-auto text-muted-foreground",children:[g," / ",b]})]})]})})});I.displayName="Input";exports.default=I;
|
|
2
2
|
//# sourceMappingURL=Input.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.cjs","sources":["../../../../src/components/Input/Input.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n Input as SInput,\n type InputProps as SInputProps,\n} from \"@dsui/ui/components/input\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport { FloatingLabel } from \"@/components/FloatLabel\";\nimport { Eye, EyeOff, ChevronDown, ChevronUp, Info, X } from \"lucide-react\";\nimport { withMask, type Options } from \"use-mask-input\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\nimport { Label } from \"../Label\";\n\n// Re-export base input props to avoid external dependency issues\nexport type BaseInputProps = Omit<React.ComponentProps<\"input\">, \"size\"> & {\n size?: \"normal\" | \"sm\" | \"xs\" | \"lg\" | \"xl\";\n state?: \"default\" | \"success\" | \"error\" | \"warning\";\n};\n\nexport type InputProps = BaseInputProps & {\n label?: string;\n helperText?: React.ReactNode;\n isFloatLabel?: boolean;\n mask?: string;\n maskOptions?: {\n placeholder?: string;\n inputFormat?: string;\n outputFormat?: string;\n showMaskOnHover?: boolean;\n showMaskOnFocus?: boolean;\n separate?: boolean;\n } & Options;\n maxLength?: number;\n showCharCount?: boolean;\n infoTooltip?: React.ReactNode;\n clearable?: boolean;\n onClear?: () => void;\n prefixIcon?: React.ReactNode;\n suffixIcon?: React.ReactNode;\n};\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n label,\n helperText,\n state,\n size,\n isFloatLabel,\n type,\n mask,\n maskOptions,\n maxLength,\n showCharCount,\n infoTooltip,\n clearable,\n onClear,\n prefixIcon,\n suffixIcon,\n placeholder = \" \",\n ...props\n },\n ref\n ) => {\n // Character count state\n const [charCount, setCharCount] = React.useState(() => {\n if (typeof props.value === \"string\") return props.value.length;\n if (typeof props.defaultValue === \"string\")\n return props.defaultValue.length;\n return 0;\n });\n\n const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n setCharCount(e.target.value.length);\n if (props.onChange) props.onChange(e);\n };\n\n const handleClear = () => {\n if (innerRef.current) {\n innerRef.current.value = \"\";\n setCharCount(0);\n const event = {\n target: innerRef.current,\n currentTarget: innerRef.current,\n } as React.ChangeEvent<HTMLInputElement>;\n props.onChange?.(event);\n if (onClear) onClear();\n }\n };\n\n const inputId = React.useId();\n const innerRef = React.useRef<HTMLInputElement>(null);\n\n // Combine refs\n const combinedRef = React.useCallback(\n (element: HTMLInputElement | null) => {\n // Set innerRef\n if (innerRef) {\n (\n innerRef as React.MutableRefObject<HTMLInputElement | null>\n ).current = element;\n }\n\n // Apply mask if provided\n if (mask && element) {\n const maskRefCallback = withMask(mask, maskOptions);\n if (typeof maskRefCallback === \"function\") {\n maskRefCallback(element);\n }\n }\n },\n [mask, maskOptions]\n );\n\n // Expose ref to parent\n React.useImperativeHandle(ref, () => innerRef.current!);\n\n const [showPassword, setShowPassword] = React.useState(false);\n\n // State\n const helperTextStyles = {\n default: \"text-muted-foreground\",\n success: \"text-success\",\n warning: \"text-warning\",\n error: \"text-error\",\n };\n\n // Calculate current size\n const currentSize = isFloatLabel\n ? size === \"xl\" || size === \"lg\"\n ? size\n : \"xl\"\n : size || \"normal\";\n\n // Calculate padding based on size and icons\n const getPadding = () => {\n const sizeMap = {\n xs: { prefix: \"pl-8\", suffix: \"pr-8\" },\n sm: { prefix: \"pl-9\", suffix: \"pr-9\" },\n normal: { prefix: \"pl-10\", suffix: \"pr-10\" },\n lg: { prefix: \"pl-11\", suffix: \"pr-11\" },\n xl: { prefix: \"pl-12\", suffix: \"pr-12\" },\n };\n\n return sizeMap[currentSize as keyof typeof sizeMap] || sizeMap.normal;\n };\n\n const padding = getPadding();\n\n // Get icon size class based on current size\n const getIconSizeClass = () => {\n const sizeMap = {\n xs: \"size-3\",\n sm: \"size-3.5\",\n normal: \"size-4\",\n lg: \"size-4\",\n xl: \"size-4\",\n };\n return sizeMap[currentSize as keyof typeof sizeMap] || \"size-4\";\n };\n\n const iconSizeClass = getIconSizeClass();\n\n // Calculate right padding considering built-in icons\n const getRightPadding = () => {\n const hasBuiltInSuffix =\n type === \"number\" ||\n type === \"password\" ||\n type === \"datetime\" ||\n (clearable && (charCount > 0 || props?.value));\n\n if (hasBuiltInSuffix && suffixIcon) {\n return type === \"password\" &&\n clearable &&\n (charCount > 0 || props?.value)\n ? \"pr-20\" // password + clear + custom icon\n : \"pr-16\"; // one built-in + custom icon\n }\n\n if (hasBuiltInSuffix) {\n return type === \"password\" &&\n clearable &&\n (charCount > 0 || props?.value)\n ? \"pr-16\" // password + clear\n : \"pr-10\"; // single built-in icon\n }\n\n if (suffixIcon) {\n return padding.suffix;\n }\n\n return \"\";\n };\n\n // Icon position calculations\n const getIconPosition = () => {\n const sizeMap = {\n xs: { left: \"left-2.5\", right: \"right-2.5\" },\n sm: { left: \"left-3\", right: \"right-3\" },\n normal: { left: \"left-3\", right: \"right-3\" },\n lg: { left: \"left-3.5\", right: \"right-3.5\" },\n xl: { left: \"left-4\", right: \"right-4\" },\n };\n\n return sizeMap[currentSize as keyof typeof sizeMap] || sizeMap.normal;\n };\n\n const iconPosition = getIconPosition();\n\n /* Spinner Button Handlers */\n const handleIncrement = () => {\n if (innerRef.current) {\n const step = Number(props.step || 1);\n const max = props.max ? Number(props.max) : Infinity;\n const currentValue = Number(innerRef.current.value || 0);\n const newValue = Math.min(currentValue + step, max);\n\n innerRef.current.value = String(newValue);\n const event = new Event(\"input\", { bubbles: true });\n innerRef.current.dispatchEvent(event);\n }\n };\n\n const handleDecrement = () => {\n if (innerRef.current) {\n const step = Number(props.step || 1);\n const min = props.min ? Number(props.min) : -Infinity;\n const currentValue = Number(innerRef.current.value || 0);\n const newValue = Math.max(currentValue - step, min);\n\n innerRef.current.value = String(newValue);\n const event = new Event(\"input\", { bubbles: true });\n innerRef.current.dispatchEvent(event);\n }\n };\n /* End Spinner Button Handlers */\n\n return (\n <div className={className}>\n <div\n className={cn(\"flex flex-col gap-1.5 relative flex-auto\", {\n \"floating-label relative\": isFloatLabel,\n })}\n >\n {!isFloatLabel && label && (\n <Label\n htmlFor={inputId}\n className=\"flex gap-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {infoTooltip && (\n <Tooltip content={infoTooltip}>\n <Info className=\"size-3.5 min-w-3.5\" />\n </Tooltip>\n )}\n </Label>\n )}\n\n <div className=\"relative\">\n {/* Prefix Icon */}\n {prefixIcon && (\n <div\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-muted-foreground leading-0\",\n iconPosition.left\n )}\n >\n {React.isValidElement(prefixIcon)\n ? React.cloneElement(prefixIcon, {\n className: cn(\n iconSizeClass,\n (prefixIcon.props as any)?.className\n ),\n } as Partial<unknown>)\n : prefixIcon}\n </div>\n )}\n\n <SInput\n ref={combinedRef}\n id={inputId}\n className={cn(\n \"peer\",\n {\n \"pt-5 pb-1\": isFloatLabel && size !== \"lg\",\n \"[&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none [-moz-appearance:textfield] pr-8\":\n type === \"number\",\n // \"[-webkit-text-fill-color:var(--foreground)]\": mask,\n },\n prefixIcon && padding.prefix,\n mask && \"placeholder:text-slate-400 placeholder:opacity-100\",\n getRightPadding()\n // className,\n )}\n state={state}\n size={\n isFloatLabel\n ? size === \"xl\" || size === \"lg\"\n ? size\n : \"xl\"\n : size\n }\n type={\n type === \"password\"\n ? showPassword\n ? \"text\"\n : \"password\"\n : type\n }\n placeholder={placeholder}\n maxLength={maxLength}\n onChange={handleInput}\n {...props}\n />\n {isFloatLabel && (\n <FloatingLabel\n htmlFor={inputId}\n size={size}\n infoTooltip={infoTooltip}\n >\n {label}\n </FloatingLabel>\n )}\n\n {/* Spinner Buttons */}\n {type === \"number\" && (\n <div className=\"absolute right-1 top-0 h-full flex flex-col gap-0.5\">\n <button\n type=\"button\"\n onClick={handleIncrement}\n disabled={props.disabled}\n className={cn(\n \"h-1/2 w-6 flex items-center justify-center rounded cursor-pointer hover:scale-150 transition-transform\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n )}\n tabIndex={-1}\n >\n <ChevronUp className=\"size-3\" />\n </button>\n <button\n type=\"button\"\n onClick={handleDecrement}\n disabled={props.disabled}\n className={cn(\n \"h-1/2 w-6 flex items-center justify-center rounded cursor-pointer hover:scale-150 transition-transform\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n )}\n tabIndex={-1}\n >\n <ChevronDown className=\"size-3\" />\n </button>\n </div>\n )}\n\n {/* Clear Button */}\n {clearable &&\n (charCount > 0 || props?.value) &&\n !props.disabled &&\n type !== \"number\" && (\n <button\n type=\"button\"\n tabIndex={-1}\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 p-1 rounded hover:bg-accent transition-colors cursor-pointer\",\n type === \"password\"\n ? suffixIcon\n ? \"right-14\"\n : \"right-10\"\n : suffixIcon\n ? \"right-10\"\n : \"right-2\"\n )}\n onClick={handleClear}\n disabled={props.disabled}\n >\n <X className=\"size-4\" />\n </button>\n )}\n\n {/* Show/Hide Password Button */}\n {type === \"password\" && (\n <button\n type=\"button\"\n tabIndex={-1}\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 p-1 rounded hover:bg-accent transition-colors\",\n suffixIcon ? \"right-10\" : \"right-2\"\n )}\n onClick={() => setShowPassword((prev) => !prev)}\n disabled={props.disabled}\n >\n {showPassword ? (\n <EyeOff className=\"size-4\" />\n ) : (\n <Eye className=\"size-4\" />\n )}\n </button>\n )}\n\n {/* Suffix Icon */}\n {suffixIcon && (\n <div\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-muted-foreground leading-0\",\n iconPosition.right\n )}\n >\n {React.isValidElement(suffixIcon)\n ? React.cloneElement(suffixIcon, {\n className: cn(\n iconSizeClass,\n (suffixIcon.props as any)?.className\n ),\n } as Partial<unknown>)\n : suffixIcon}\n </div>\n )}\n </div>\n\n {(helperText || (showCharCount && typeof maxLength === \"number\")) && (\n <div className=\"flex items-center justify-between text-xs gap-2\">\n {helperText && (\n <p\n className={cn(\n \"text-xs\",\n state ? helperTextStyles?.[state] : \"\"\n )}\n >\n {helperText}\n </p>\n )}\n {showCharCount && typeof maxLength === \"number\" && (\n <span className=\"ml-auto text-muted-foreground\">\n {charCount} / {maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\nexport default Input;\n"],"names":["Input","React","className","label","helperText","state","size","isFloatLabel","type","mask","maskOptions","maxLength","showCharCount","infoTooltip","clearable","onClear","prefixIcon","suffixIcon","placeholder","props","ref","charCount","setCharCount","handleInput","handleClear","innerRef","event","inputId","combinedRef","element","maskRefCallback","withMask","showPassword","setShowPassword","helperTextStyles","currentSize","padding","sizeMap","iconSizeClass","getRightPadding","hasBuiltInSuffix","iconPosition","handleIncrement","step","max","currentValue","newValue","handleDecrement","min","jsx","jsxs","cn","Label","Tooltip","Info","SInput","FloatingLabel","ChevronUp","ChevronDown","X","prev","EyeOff","Eye"],"mappings":"8bAwCMA,EAAQC,EAAM,WAClB,CACE,CACE,UAAAC,EAAA,MACAC,EACA,WAAAC,EACA,MAAAC,EACA,KAAAC,EACA,aAAAC,EACA,KAAAC,EACA,KAAAC,EACA,YAAAC,EACA,UAAAC,EACA,cAAAC,EACA,YAAAC,EACA,UAAAC,EACA,QAAAC,EACA,WAAAC,EACA,WAAAC,EACA,YAAAC,EAAc,IACd,GAAGC,CAAA,EAELC,IACG,CAEH,KAAM,CAACC,EAAWC,CAAY,EAAIrB,EAAM,SAAS,IAC3C,OAAOkB,EAAM,OAAU,SAAiBA,EAAM,MAAM,OACpD,OAAOA,EAAM,cAAiB,SACzBA,EAAM,aAAa,OACrB,CACR,EAEKI,EAAe,GAA2C,CAC9DD,EAAa,EAAE,OAAO,MAAM,MAAM,EAC9BH,EAAM,UAAUA,EAAM,SAAS,CAAC,CACtC,EAEMK,EAAc,IAAM,CACxB,GAAIC,EAAS,QAAS,CACpBA,EAAS,QAAQ,MAAQ,GACzBH,EAAa,CAAC,EACd,MAAMI,EAAQ,CACZ,OAAQD,EAAS,QACjB,cAAeA,EAAS,OAAA,EAE1BN,EAAM,WAAWO,CAAK,EAClBX,GAASA,EAAA,CACf,CACF,EAEMY,EAAU1B,EAAM,MAAA,EAChBwB,EAAWxB,EAAM,OAAyB,IAAI,EAG9C2B,EAAc3B,EAAM,YACvB4B,GAAqC,CASpC,GAPIJ,IAEAA,EACA,QAAUI,GAIVpB,GAAQoB,EAAS,CACnB,MAAMC,EAAkBC,EAAAA,SAAStB,EAAMC,CAAW,EAC9C,OAAOoB,GAAoB,YAC7BA,EAAgBD,CAAO,CAE3B,CACF,EACA,CAACpB,EAAMC,CAAW,CAAA,EAIpBT,EAAM,oBAAoBmB,EAAK,IAAMK,EAAS,OAAQ,EAEtD,KAAM,CAACO,EAAcC,CAAe,EAAIhC,EAAM,SAAS,EAAK,EAGtDiC,EAAmB,CACvB,QAAS,wBACT,QAAS,eACT,QAAS,eACT,MAAO,YAAA,EAIHC,EAAc5B,EAChBD,IAAS,MAAQA,IAAS,KACxBA,EACA,KACFA,GAAQ,SAeN8B,GAZa,IAAM,CACvB,MAAMC,EAAU,CACd,GAAI,CAAE,OAAQ,OAAQ,OAAQ,MAAA,EAC9B,GAAI,CAAE,OAAQ,OAAQ,OAAQ,MAAA,EAC9B,OAAQ,CAAE,OAAQ,QAAS,OAAQ,OAAA,EACnC,GAAI,CAAE,OAAQ,QAAS,OAAQ,OAAA,EAC/B,GAAI,CAAE,OAAQ,QAAS,OAAQ,OAAA,CAAQ,EAGzC,OAAOA,EAAQF,CAAmC,GAAKE,EAAQ,MACjE,GAEgB,EAcVC,EAVY,CACd,GAAI,SACJ,GAAI,WACJ,OAAQ,SACR,GAAI,SACJ,GAAI,QAAA,EAESH,CAAmC,GAAK,SAMnDI,EAAkB,IAAM,CAC5B,MAAMC,EACJhC,IAAS,UACTA,IAAS,YACTA,IAAS,YACRM,IAAcO,EAAY,GAAKF,GAAO,OAEzC,OAAIqB,GAAoBvB,EACfT,IAAS,YACdM,IACCO,EAAY,GAAKF,GAAO,OACvB,QACA,QAGFqB,EACKhC,IAAS,YACdM,IACCO,EAAY,GAAKF,GAAO,OACvB,QACA,QAGFF,EACKmB,EAAQ,OAGV,EACT,EAeMK,GAZkB,IAAM,CAC5B,MAAMJ,EAAU,CACd,GAAI,CAAE,KAAM,WAAY,MAAO,WAAA,EAC/B,GAAI,CAAE,KAAM,SAAU,MAAO,SAAA,EAC7B,OAAQ,CAAE,KAAM,SAAU,MAAO,SAAA,EACjC,GAAI,CAAE,KAAM,WAAY,MAAO,WAAA,EAC/B,GAAI,CAAE,KAAM,SAAU,MAAO,SAAA,CAAU,EAGzC,OAAOA,EAAQF,CAAmC,GAAKE,EAAQ,MACjE,GAEqB,EAGfK,EAAkB,IAAM,CAC5B,GAAIjB,EAAS,QAAS,CACpB,MAAMkB,EAAO,OAAOxB,EAAM,MAAQ,CAAC,EAC7ByB,EAAMzB,EAAM,IAAM,OAAOA,EAAM,GAAG,EAAI,IACtC0B,EAAe,OAAOpB,EAAS,QAAQ,OAAS,CAAC,EACjDqB,EAAW,KAAK,IAAID,EAAeF,EAAMC,CAAG,EAElDnB,EAAS,QAAQ,MAAQ,OAAOqB,CAAQ,EACxC,MAAMpB,EAAQ,IAAI,MAAM,QAAS,CAAE,QAAS,GAAM,EAClDD,EAAS,QAAQ,cAAcC,CAAK,CACtC,CACF,EAEMqB,EAAkB,IAAM,CAC5B,GAAItB,EAAS,QAAS,CACpB,MAAMkB,EAAO,OAAOxB,EAAM,MAAQ,CAAC,EAC7B6B,EAAM7B,EAAM,IAAM,OAAOA,EAAM,GAAG,EAAI,KACtC0B,EAAe,OAAOpB,EAAS,QAAQ,OAAS,CAAC,EACjDqB,EAAW,KAAK,IAAID,EAAeF,EAAMK,CAAG,EAElDvB,EAAS,QAAQ,MAAQ,OAAOqB,CAAQ,EACxC,MAAMpB,EAAQ,IAAI,MAAM,QAAS,CAAE,QAAS,GAAM,EAClDD,EAAS,QAAQ,cAAcC,CAAK,CACtC,CACF,EAGA,OACEuB,EAAAA,IAAC,OAAI,UAAA/C,EACH,SAAAgD,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAAA,GAAG,2CAA4C,CACxD,0BAA2B5C,CAAA,CAC5B,EAEA,SAAA,CAAA,CAACA,GAAgBJ,GAChB+C,EAAAA,KAACE,EAAAA,MAAA,CACC,QAASzB,EACT,UAAU,wGAET,SAAA,CAAAxB,EACAU,SACEwC,UAAA,CAAQ,QAASxC,EAChB,SAAAoC,EAAAA,IAACK,EAAAA,KAAA,CAAK,UAAU,oBAAA,CAAqB,CAAA,CACvC,CAAA,CAAA,CAAA,EAKNJ,EAAAA,KAAC,MAAA,CAAI,UAAU,WAEZ,SAAA,CAAAlC,GACCiC,EAAAA,IAAC,MAAA,CACC,UAAWE,EAAAA,GACT,oEACAV,EAAa,IAAA,EAGd,WAAM,eAAezB,CAAU,EAC5Bf,EAAM,aAAae,EAAY,CAC7B,UAAWmC,EAAAA,GACTb,EACCtB,EAAW,OAAe,SAAA,CAC7B,CACmB,EACrBA,CAAA,CAAA,EAIRiC,EAAAA,IAACM,EAAAA,MAAA,CACC,IAAK3B,EACL,GAAID,EACJ,UAAWwB,EAAAA,GACT,OACA,CACE,YAAa5C,GAAgBD,IAAS,KACtC,iIACEE,IAAS,QAAA,EAGbQ,GAAcoB,EAAQ,OACtB3B,GAAQ,qDACR8B,EAAA,CAAgB,EAGlB,MAAAlC,EACA,KACEE,EACID,IAAS,MAAQA,IAAS,KACxBA,EACA,KACFA,EAEN,KACEE,IAAS,WACLwB,EACE,OACA,WACFxB,EAEN,YAAAU,EACA,UAAAP,EACA,SAAUY,EACT,GAAGJ,CAAA,CAAA,EAELZ,GACC0C,EAAAA,IAACO,EAAAA,cAAA,CACC,QAAS7B,EACT,KAAArB,EACA,YAAAO,EAEC,SAAAV,CAAA,CAAA,EAKJK,IAAS,UACR0C,OAAC,MAAA,CAAI,UAAU,sDACb,SAAA,CAAAD,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAASP,EACT,SAAUvB,EAAM,SAChB,UAAWgC,EAAAA,GACT,yGACA,+EAAA,EAEF,SAAU,GAEV,SAAAF,EAAAA,IAACQ,EAAAA,UAAA,CAAU,UAAU,QAAA,CAAS,CAAA,CAAA,EAEhCR,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAASF,EACT,SAAU5B,EAAM,SAChB,UAAWgC,EAAAA,GACT,yGACA,+EAAA,EAEF,SAAU,GAEV,SAAAF,EAAAA,IAACS,EAAAA,YAAA,CAAY,UAAU,QAAA,CAAS,CAAA,CAAA,CAClC,EACF,EAID5C,IACEO,EAAY,GAAKF,GAAO,QACzB,CAACA,EAAM,UACPX,IAAS,UACPyC,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,SAAU,GACV,UAAWE,EAAAA,GACT,iGACA3C,IAAS,WACLS,EACE,WACA,WACFA,EACE,WACA,SAAA,EAER,QAASO,EACT,SAAUL,EAAM,SAEhB,SAAA8B,EAAAA,IAACU,EAAAA,EAAA,CAAE,UAAU,QAAA,CAAS,CAAA,CAAA,EAK3BnD,IAAS,YACRyC,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,SAAU,GACV,UAAWE,EAAAA,GACT,kFACAlC,EAAa,WAAa,SAAA,EAE5B,QAAS,IAAMgB,EAAiB2B,GAAS,CAACA,CAAI,EAC9C,SAAUzC,EAAM,SAEf,SAAAa,QACE6B,EAAAA,OAAA,CAAO,UAAU,SAAS,EAE3BZ,EAAAA,IAACa,EAAAA,IAAA,CAAI,UAAU,QAAA,CAAS,CAAA,CAAA,EAM7B7C,GACCgC,EAAAA,IAAC,MAAA,CACC,UAAWE,EAAAA,GACT,oEACAV,EAAa,KAAA,EAGd,WAAM,eAAexB,CAAU,EAC5BhB,EAAM,aAAagB,EAAY,CAC7B,UAAWkC,EAAAA,GACTb,EACCrB,EAAW,OAAe,SAAA,CAC7B,CACmB,EACrBA,CAAA,CAAA,CACN,EAEJ,GAEEb,GAAeQ,GAAiB,OAAOD,GAAc,WACrDuC,OAAC,MAAA,CAAI,UAAU,kDACZ,SAAA,CAAA9C,GACC6C,EAAAA,IAAC,IAAA,CACC,UAAWE,EAAAA,GACT,UACA9C,EAAQ6B,IAAmB7B,CAAK,EAAI,EAAA,EAGrC,SAAAD,CAAA,CAAA,EAGJQ,GAAiB,OAAOD,GAAc,UACrCuC,EAAAA,KAAC,OAAA,CAAK,UAAU,gCACb,SAAA,CAAA7B,EAAU,MAAIV,CAAA,CAAA,CACjB,CAAA,CAAA,CAEJ,CAAA,CAAA,CAAA,EAGN,CAEJ,CACF,EAEAX,EAAM,YAAc"}
|
|
1
|
+
{"version":3,"file":"Input.cjs","sources":["../../../../src/components/Input/Input.tsx"],"sourcesContent":["import React, { type ChangeEvent } from \"react\";\nimport {\n Input as SInput,\n type InputProps as SInputProps,\n} from \"@dsui/ui/components/input\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport { FloatingLabel } from \"@/components/FloatLabel\";\nimport { Eye, EyeOff, ChevronDown, ChevronUp, Info, X } from \"lucide-react\";\nimport { withMask, type Options } from \"use-mask-input\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\nimport { Label } from \"../Label\";\n\n// Re-export base input props to avoid external dependency issues\nexport type BaseInputProps = Omit<React.ComponentProps<\"input\">, \"size\"> & {\n size?: \"normal\" | \"sm\" | \"xs\" | \"lg\" | \"xl\";\n state?: \"default\" | \"success\" | \"error\" | \"warning\";\n};\n\nexport type InputProps = BaseInputProps & {\n label?: string;\n helperText?: React.ReactNode;\n isFloatLabel?: boolean;\n mask?: string;\n maskOptions?: {\n placeholder?: string;\n inputFormat?: string;\n outputFormat?: string;\n showMaskOnHover?: boolean;\n showMaskOnFocus?: boolean;\n separate?: boolean;\n } & Options;\n maxLength?: number;\n showCharCount?: boolean;\n infoTooltip?: React.ReactNode;\n clearable?: boolean;\n onClear?: () => void;\n prefixIcon?: React.ReactNode;\n suffixIcon?: React.ReactNode;\n};\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n label,\n helperText,\n state,\n size,\n isFloatLabel,\n type,\n mask,\n maskOptions,\n maxLength,\n showCharCount,\n infoTooltip,\n clearable,\n onClear,\n prefixIcon,\n suffixIcon,\n placeholder = \" \",\n ...props\n },\n ref\n ) => {\n // Character count state\n const [charCount, setCharCount] = React.useState(() => {\n if (typeof props.value === \"string\") return props.value.length;\n if (typeof props.defaultValue === \"string\")\n return props.defaultValue.length;\n return 0;\n });\n\n const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n setCharCount(e.target.value.length);\n if (props.onChange) props.onChange(e);\n };\n\n const handleClear = () => {\n if (innerRef.current) {\n innerRef.current.value = \"\";\n setCharCount(0);\n const event = {\n target: innerRef.current,\n currentTarget: innerRef.current,\n } as React.ChangeEvent<HTMLInputElement>;\n props.onChange?.(event);\n if (onClear) onClear();\n }\n };\n\n const inputId = React.useId();\n const innerRef = React.useRef<HTMLInputElement>(null);\n\n // Combine refs\n const combinedRef = React.useCallback(\n (element: HTMLInputElement | null) => {\n // Set innerRef\n if (innerRef) {\n (\n innerRef as React.MutableRefObject<HTMLInputElement | null>\n ).current = element;\n }\n\n // Apply mask if provided\n if (mask && element) {\n const maskRefCallback = withMask(mask, maskOptions);\n if (typeof maskRefCallback === \"function\") {\n maskRefCallback(element);\n }\n }\n },\n [mask, maskOptions]\n );\n\n // Expose ref to parent\n React.useImperativeHandle(ref, () => innerRef.current!);\n\n const [showPassword, setShowPassword] = React.useState(false);\n\n // State\n const helperTextStyles = {\n default: \"text-muted-foreground\",\n success: \"text-success\",\n warning: \"text-warning\",\n error: \"text-error\",\n };\n\n // Calculate current size\n const currentSize = isFloatLabel\n ? size === \"xl\" || size === \"lg\"\n ? size\n : \"xl\"\n : size || \"normal\";\n\n // Calculate padding based on size and icons\n const getPadding = () => {\n const sizeMap = {\n xs: { prefix: \"pl-8\", suffix: \"pr-8\" },\n sm: { prefix: \"pl-9\", suffix: \"pr-9\" },\n normal: { prefix: \"pl-10\", suffix: \"pr-10\" },\n lg: { prefix: \"pl-11\", suffix: \"pr-11\" },\n xl: { prefix: \"pl-12\", suffix: \"pr-12\" },\n };\n\n return sizeMap[currentSize as keyof typeof sizeMap] || sizeMap.normal;\n };\n\n const padding = getPadding();\n\n // Get icon size class based on current size\n const getIconSizeClass = () => {\n const sizeMap = {\n xs: \"size-3\",\n sm: \"size-3.5\",\n normal: \"size-4\",\n lg: \"size-4\",\n xl: \"size-4\",\n };\n return sizeMap[currentSize as keyof typeof sizeMap] || \"size-4\";\n };\n\n const iconSizeClass = getIconSizeClass();\n\n // Calculate right padding considering built-in icons\n const getRightPadding = () => {\n const hasBuiltInSuffix =\n type === \"number\" ||\n type === \"password\" ||\n type === \"datetime\" ||\n (clearable && (charCount > 0 || props?.value));\n\n if (hasBuiltInSuffix && suffixIcon) {\n return type === \"password\" &&\n clearable &&\n (charCount > 0 || props?.value)\n ? \"pr-20\" // password + clear + custom icon\n : \"pr-16\"; // one built-in + custom icon\n }\n\n if (hasBuiltInSuffix) {\n return type === \"password\" &&\n clearable &&\n (charCount > 0 || props?.value)\n ? \"pr-16\" // password + clear\n : \"pr-10\"; // single built-in icon\n }\n\n if (suffixIcon) {\n return padding.suffix;\n }\n\n return \"\";\n };\n\n // Icon position calculations\n const getIconPosition = () => {\n const sizeMap = {\n xs: { left: \"left-2.5\", right: \"right-2.5\" },\n sm: { left: \"left-3\", right: \"right-3\" },\n normal: { left: \"left-3\", right: \"right-3\" },\n lg: { left: \"left-3.5\", right: \"right-3.5\" },\n xl: { left: \"left-4\", right: \"right-4\" },\n };\n\n return sizeMap[currentSize as keyof typeof sizeMap] || sizeMap.normal;\n };\n\n const iconPosition = getIconPosition();\n\n /* Spinner Button Handlers */\n const handleIncrement = () => {\n if (innerRef.current) {\n const step = Number(props.step || 1);\n const max = props.max ? Number(props.max) : Infinity;\n const currentValue = Number(innerRef.current.value || 0);\n const newValue = Math.min(currentValue + step, max);\n\n innerRef.current.value = String(newValue);\n const event = new Event(\"input\", { bubbles: true });\n innerRef.current.dispatchEvent(event);\n props.onChange?.(event as unknown as ChangeEvent<HTMLInputElement>);\n }\n };\n\n const handleDecrement = () => {\n if (innerRef.current) {\n const step = Number(props.step || 1);\n const min = props.min ? Number(props.min) : -Infinity;\n const currentValue = Number(innerRef.current.value || 0);\n const newValue = Math.max(currentValue - step, min);\n\n innerRef.current.value = String(newValue);\n const event = new Event(\"input\", { bubbles: true });\n innerRef.current.dispatchEvent(event);\n props.onChange?.(event as unknown as ChangeEvent<HTMLInputElement>);\n }\n };\n /* End Spinner Button Handlers */\n\n return (\n <div className={className}>\n <div\n className={cn(\"flex flex-col gap-1.5 relative flex-auto\", {\n \"floating-label relative\": isFloatLabel,\n })}\n >\n {!isFloatLabel && label && (\n <Label\n htmlFor={inputId}\n className=\"flex gap-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {infoTooltip && (\n <Tooltip content={infoTooltip}>\n <Info className=\"size-3.5 min-w-3.5\" />\n </Tooltip>\n )}\n </Label>\n )}\n\n <div className=\"relative\">\n {/* Prefix Icon */}\n {prefixIcon && (\n <div\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-muted-foreground leading-0\",\n iconPosition.left\n )}\n >\n {React.isValidElement(prefixIcon)\n ? React.cloneElement(prefixIcon, {\n className: cn(\n iconSizeClass,\n (prefixIcon.props as any)?.className\n ),\n } as Partial<unknown>)\n : prefixIcon}\n </div>\n )}\n\n <SInput\n ref={combinedRef}\n id={inputId}\n className={cn(\n \"peer\",\n {\n \"pt-5 pb-1\": isFloatLabel && size !== \"lg\",\n \"[&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none [-moz-appearance:textfield] pr-8\":\n type === \"number\",\n // \"[-webkit-text-fill-color:var(--foreground)]\": mask,\n },\n prefixIcon && padding.prefix,\n mask && \"placeholder:text-slate-400 placeholder:opacity-100\",\n getRightPadding()\n // className,\n )}\n state={state}\n size={\n isFloatLabel\n ? size === \"xl\" || size === \"lg\"\n ? size\n : \"xl\"\n : size\n }\n type={\n type === \"password\"\n ? showPassword\n ? \"text\"\n : \"password\"\n : type\n }\n placeholder={placeholder}\n maxLength={maxLength}\n onChange={handleInput}\n {...props}\n />\n {isFloatLabel && (\n <FloatingLabel\n htmlFor={inputId}\n size={size}\n infoTooltip={infoTooltip}\n >\n {label}\n </FloatingLabel>\n )}\n\n {/* Spinner Buttons */}\n {type === \"number\" && (\n <div className=\"absolute right-1 top-0 h-full flex flex-col gap-0.5\">\n <button\n type=\"button\"\n onClick={handleIncrement}\n disabled={props.disabled}\n className={cn(\n \"h-1/2 w-6 flex items-center justify-center rounded cursor-pointer hover:scale-150 transition-transform\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n )}\n tabIndex={-1}\n >\n <ChevronUp className=\"size-3\" />\n </button>\n <button\n type=\"button\"\n onClick={handleDecrement}\n disabled={props.disabled}\n className={cn(\n \"h-1/2 w-6 flex items-center justify-center rounded cursor-pointer hover:scale-150 transition-transform\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n )}\n tabIndex={-1}\n >\n <ChevronDown className=\"size-3\" />\n </button>\n </div>\n )}\n\n {/* Clear Button */}\n {clearable &&\n (charCount > 0 || props?.value) &&\n !props.disabled &&\n type !== \"number\" && (\n <button\n type=\"button\"\n tabIndex={-1}\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 p-1 rounded hover:bg-accent transition-colors cursor-pointer\",\n type === \"password\"\n ? suffixIcon\n ? \"right-14\"\n : \"right-10\"\n : suffixIcon\n ? \"right-10\"\n : \"right-2\"\n )}\n onClick={handleClear}\n disabled={props.disabled}\n >\n <X className=\"size-4\" />\n </button>\n )}\n\n {/* Show/Hide Password Button */}\n {type === \"password\" && (\n <button\n type=\"button\"\n tabIndex={-1}\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 p-1 rounded hover:bg-accent transition-colors\",\n suffixIcon ? \"right-10\" : \"right-2\"\n )}\n onClick={() => setShowPassword((prev) => !prev)}\n disabled={props.disabled}\n >\n {showPassword ? (\n <EyeOff className=\"size-4\" />\n ) : (\n <Eye className=\"size-4\" />\n )}\n </button>\n )}\n\n {/* Suffix Icon */}\n {suffixIcon && (\n <div\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-muted-foreground leading-0\",\n iconPosition.right\n )}\n >\n {React.isValidElement(suffixIcon)\n ? React.cloneElement(suffixIcon, {\n className: cn(\n iconSizeClass,\n (suffixIcon.props as any)?.className\n ),\n } as Partial<unknown>)\n : suffixIcon}\n </div>\n )}\n </div>\n\n {(helperText || (showCharCount && typeof maxLength === \"number\")) && (\n <div className=\"flex items-center justify-between text-xs gap-2\">\n {helperText && (\n <p\n className={cn(\n \"text-xs\",\n state ? helperTextStyles?.[state] : \"\"\n )}\n >\n {helperText}\n </p>\n )}\n {showCharCount && typeof maxLength === \"number\" && (\n <span className=\"ml-auto text-muted-foreground\">\n {charCount} / {maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\nexport default Input;\n"],"names":["Input","React","className","label","helperText","state","size","isFloatLabel","type","mask","maskOptions","maxLength","showCharCount","infoTooltip","clearable","onClear","prefixIcon","suffixIcon","placeholder","props","ref","charCount","setCharCount","handleInput","e","handleClear","innerRef","event","inputId","combinedRef","element","maskRefCallback","withMask","showPassword","setShowPassword","helperTextStyles","currentSize","padding","sizeMap","iconSizeClass","getRightPadding","hasBuiltInSuffix","iconPosition","handleIncrement","step","max","currentValue","newValue","handleDecrement","min","jsx","jsxs","cn","Label","Tooltip","Info","SInput","FloatingLabel","ChevronUp","ChevronDown","X","prev","EyeOff","Eye"],"mappings":"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"}
|
|
@@ -68,7 +68,7 @@ const ue = {
|
|
|
68
68
|
confirmButton: m,
|
|
69
69
|
cancelButton: d,
|
|
70
70
|
showIcon: U = !0,
|
|
71
|
-
backdropFilter: F =
|
|
71
|
+
backdropFilter: F = 2,
|
|
72
72
|
overlay: O = "dark"
|
|
73
73
|
} = $, V = C(() => c ? ie(c) : { className: "" }, [c]), T = t(
|
|
74
74
|
// Remove default padding and gap to allow custom header/footer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.js","sources":["../../../../src/components/Dialog/Dialog.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport {\n Dialog as SDialog,\n DialogContent as SDialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"@dsui/ui/components/dialog\";\nimport {\n AlertDialog,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"@dsui/ui/components/alert-dialog\";\nimport { ScrollArea } from \"@dsui/ui/components/scroll-area\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport type { BasicAnimation } from \"@/types/variables\";\nimport { animationClass } from \"@/utils/animations\";\nimport { AlertTriangle, Info, CheckCircle2, AlertCircle } from \"lucide-react\";\nimport Button, { type ButtonProps } from \"../Button/Button\";\n\nexport type DialogVariant = \"dialog\" | \"confirm\" | \"alert\" | \"info\" | \"warning\";\nexport type DialogSize =\n | \"sm\"\n | \"md\"\n | \"lg\"\n | \"xl\"\n | \"2xl\"\n | \"3xl\"\n | \"4xl\"\n | \"full\";\nexport type DialogPosition =\n | \"center\"\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\nexport interface DialogButtonConfig extends Omit<ButtonProps, \"children\"> {\n text?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport interface DialogProps {\n // Core props\n variant?: DialogVariant;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n\n // Content\n title?: React.ReactNode;\n description?: React.ReactNode;\n children?: React.ReactNode;\n trigger?: React.ReactNode;\n footer?: React.ReactNode;\n\n // Behavior\n closeOnEsc?: boolean;\n closeOnOutside?: boolean;\n showCloseButton?: boolean;\n\n // Layout\n position?: DialogPosition;\n size?: DialogSize;\n fullscreen?: boolean;\n scrollable?: boolean;\n stickyHeader?: boolean;\n stickyFooter?: boolean;\n\n // Animation\n animation?: BasicAnimation;\n\n // Styling\n className?: string;\n contentClassName?: string;\n headerClassName?: string;\n titleClassName?: string;\n descriptionClassName?: string;\n footerClassName?: string;\n overlayClassName?: string;\n\n // Overlay\n backdropFilter?: number;\n overlay?: \"dark\" | \"light\";\n\n // Alert/Confirm buttons\n confirmButton?: DialogButtonConfig;\n cancelButton?: DialogButtonConfig;\n\n // Alert/Confirm specific\n showIcon?: boolean;\n}\n\nconst variantIcons = {\n dialog: null,\n confirm: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-success/10 mx-auto mb-4\">\n <CheckCircle2 className=\"size-6 text-success\" />\n </div>\n ),\n alert: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-error/10 mx-auto mb-4\">\n <AlertCircle className=\"size-5 text-error\" />\n </div>\n ),\n info: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-blue-500/10 mx-auto mb-4\">\n <Info className=\"size-5 text-blue-500\" />\n </div>\n ),\n warning: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-warning/10 mx-auto mb-4\">\n <AlertTriangle className=\"size-5 text-warning\" />\n </div>\n ),\n};\n\nconst variantColors = {\n dialog: \"\",\n confirm: \"border-blue-500/20\",\n alert: \"border-red-500/20\",\n info: \"border-blue-500/20\",\n warning: \"border-yellow-500/20\",\n};\n\nconst sizeClasses: Record<DialogSize, string> = {\n sm: \"sm:max-w-sm\",\n md: \"sm:max-w-md\",\n lg: \"sm:max-w-lg\",\n xl: \"sm:max-w-xl\",\n \"2xl\": \"sm:max-w-2xl max-h-[90vh]\",\n \"3xl\": \"sm:max-w-3xl max-h-[90vh]\",\n \"4xl\": \"sm:max-w-4xl max-h-[90vh]\",\n full: \"sm:max-w-[95vw] h-[98vh]\",\n};\n\nconst positionClasses: Record<DialogPosition, string> = {\n center: \"!top-[50%] !left-[50%] !translate-x-[-50%] !translate-y-[-50%]\",\n top: \"!top-4 !left-[50%] !translate-x-[-50%] !translate-y-0\",\n bottom: \"!top-auto !bottom-4 !left-[50%] !translate-x-[-50%] !translate-y-0\",\n left: \"!left-4 !top-[50%] !translate-x-0 !translate-y-[-50%]\",\n right: \"!left-auto !right-4 !top-[50%] !translate-x-0 !translate-y-[-50%]\",\n \"top-left\": \"!top-4 !left-4 !translate-x-0 !translate-y-0\",\n \"top-right\": \"!top-4 !left-auto !right-4 !translate-x-0 !translate-y-0\",\n \"bottom-left\": \"!top-auto !bottom-4 !left-4 !translate-x-0 !translate-y-0\",\n \"bottom-right\":\n \"!top-auto !bottom-4 !left-auto !right-4 !translate-x-0 !translate-y-0\",\n};\n\nconst Dialog = React.forwardRef<HTMLDivElement, DialogProps>((props, ref) => {\n const {\n variant = \"dialog\",\n open,\n onOpenChange,\n title,\n description,\n children,\n trigger,\n footer,\n closeOnEsc = true,\n closeOnOutside = true,\n showCloseButton = true,\n position = \"center\",\n size = \"md\",\n fullscreen = false,\n scrollable = true,\n stickyHeader = false,\n stickyFooter = false,\n animation,\n className,\n contentClassName,\n headerClassName,\n titleClassName,\n descriptionClassName,\n footerClassName,\n // overlayClassName, // Not used in current implementation\n confirmButton,\n cancelButton,\n showIcon = true,\n backdropFilter = 0,\n overlay = \"dark\",\n } = props;\n\n const animationResult = useMemo(() => {\n return animation ? animationClass(animation) : { className: \"\" };\n }, [animation]);\n\n const contentClasses = cn(\n // Remove default padding and gap to allow custom header/footer\n \"!p-0 !gap-0 flex flex-col\",\n sizeClasses[fullscreen ? \"full\" : size],\n positionClasses[position],\n variantColors[variant],\n animationResult.className,\n fullscreen ? \"h-[98vh]\" : \"max-h-[90vh]\"\n );\n\n const headerClasses = cn(\n \"px-6 pt-6 text-left\",\n !scrollable && \"contents space-y-0\",\n headerClassName\n );\n\n const footerClasses = cn(\n \"px-6 pb-6 sm:justify-end\",\n !scrollable && \"border-t py-4\",\n footerClassName\n );\n\n const icon = showIcon ? variantIcons[variant] : null;\n\n const headerComponents = useMemo(() => {\n return title || icon || description ? (\n <AlertDialogHeader\n className={cn(\n \"flex items-center gap-2 py-4\",\n { \"border-b\": stickyHeader },\n headerClasses\n )}\n >\n {(title || icon) && (\n <AlertDialogTitle className={cn(titleClassName)}>\n {icon}\n {title}\n </AlertDialogTitle>\n )}\n {description && (\n <AlertDialogDescription className={descriptionClassName}>\n {description}\n </AlertDialogDescription>\n )}\n </AlertDialogHeader>\n ) : null;\n }, [\n title,\n icon,\n description,\n headerClasses,\n titleClassName,\n descriptionClassName,\n stickyHeader,\n ]);\n\n const footerComponents = useMemo(() => {\n // Merge configs with defaults\n const mergedConfirmButton: DialogButtonConfig = {\n variant: \"solid\",\n color: \"primary\",\n ...confirmButton,\n text: confirmButton?.text ?? \"Confirm\",\n };\n\n const mergedCancelButton: DialogButtonConfig = {\n variant: \"outline\",\n ...cancelButton,\n text: cancelButton?.text ?? \"Cancel\",\n };\n\n return footer || confirmButton || cancelButton ? (\n <AlertDialogFooter\n className={cn(\"py-4\", { \"border-t\": stickyFooter }, footerClasses)}\n >\n {footer || (\n <>\n {cancelButton && (\n <Button\n {...mergedCancelButton}\n onClick={() => {\n mergedCancelButton.onClick?.();\n }}\n >\n {mergedCancelButton.text}\n </Button>\n )}\n {confirmButton && (\n <Button\n {...mergedConfirmButton}\n onClick={() => {\n mergedConfirmButton.onClick?.();\n }}\n >\n {mergedConfirmButton.text}\n </Button>\n )}\n </>\n )}\n </AlertDialogFooter>\n ) : null;\n }, [footer, footerClasses, confirmButton, cancelButton, stickyFooter]);\n\n // For alert-style dialogs (confirm, alert, info, warning)\n if (variant !== \"dialog\") {\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n {trigger && <AlertDialogTrigger asChild>{trigger}</AlertDialogTrigger>}\n <AlertDialogContent\n ref={ref}\n className={cn(className, contentClasses)}\n onEscapeKeyDown={(e) => !closeOnEsc && e.preventDefault()}\n noDefaultAnimation={!!animation}\n backdropFilter={backdropFilter}\n overlay={overlay}\n >\n {stickyHeader && headerComponents}\n\n <ScrollArea className=\"flex max-h-full flex-col overflow-hidden\">\n {!stickyHeader && headerComponents}\n {children && (\n <div className={cn(\"px-6 py-4\", contentClassName)}>\n {children}\n </div>\n )}\n {!stickyFooter && footerComponents}\n </ScrollArea>\n\n {stickyFooter && footerComponents}\n </AlertDialogContent>\n </AlertDialog>\n );\n }\n\n // Regular dialog\n return (\n <SDialog open={open} onOpenChange={onOpenChange}>\n {trigger && <DialogTrigger asChild>{trigger}</DialogTrigger>}\n <SDialogContent\n ref={ref}\n className={cn(className, contentClasses)}\n showCloseButton={showCloseButton}\n onEscapeKeyDown={(e) => !closeOnEsc && e.preventDefault()}\n onInteractOutside={(e) => !closeOnOutside && e.preventDefault()}\n noDefaultAnimation={!!animation}\n backdropFilter={backdropFilter}\n overlay={overlay}\n >\n {stickyHeader && (title || description) && (\n <DialogHeader\n className={cn({ \"py-4 border-b\": stickyHeader }, headerClasses)}\n >\n {title && (\n <DialogTitle className={titleClassName}>{title}</DialogTitle>\n )}\n {description && (\n <DialogDescription className={descriptionClassName}>\n {description}\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n <ScrollArea className=\"flex max-h-full flex-col overflow-hidden\">\n {!stickyHeader && (title || description) && (\n <DialogHeader className={cn(\"py-4\", headerClasses)}>\n {title && (\n <DialogTitle className={titleClassName}>{title}</DialogTitle>\n )}\n {description && (\n <DialogDescription className={descriptionClassName}>\n {description}\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n {children && (\n <div className={cn(\"px-6 py-4\", contentClassName)}>{children}</div>\n )}\n {!stickyFooter && footer && (\n <DialogFooter className={cn(\"py-4\", footerClasses)}>\n {footer}\n </DialogFooter>\n )}\n </ScrollArea>\n {stickyFooter && footer && (\n <DialogFooter\n className={cn({ \"py-4 border-t\": stickyFooter }, footerClasses)}\n >\n {footer}\n </DialogFooter>\n )}\n </SDialogContent>\n </SDialog>\n );\n});\n\nDialog.displayName = \"Dialog\";\n\nexport default Dialog;\n"],"names":["variantIcons","jsx","CheckCircle2","AlertCircle","Info","AlertTriangle","variantColors","sizeClasses","positionClasses","Dialog","React","props","ref","variant","open","onOpenChange","title","description","children","trigger","footer","closeOnEsc","closeOnOutside","showCloseButton","position","size","fullscreen","scrollable","stickyHeader","stickyFooter","animation","className","contentClassName","headerClassName","titleClassName","descriptionClassName","footerClassName","confirmButton","cancelButton","showIcon","backdropFilter","overlay","animationResult","useMemo","animationClass","contentClasses","cn","headerClasses","footerClasses","icon","headerComponents","jsxs","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","footerComponents","mergedConfirmButton","mergedCancelButton","AlertDialogFooter","Fragment","Button","AlertDialog","AlertDialogTrigger","AlertDialogContent","e","ScrollArea","SDialog","DialogTrigger","SDialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dialog.js","sources":["../../../../src/components/Dialog/Dialog.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport {\n Dialog as SDialog,\n DialogContent as SDialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"@dsui/ui/components/dialog\";\nimport {\n AlertDialog,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"@dsui/ui/components/alert-dialog\";\nimport { ScrollArea } from \"@dsui/ui/components/scroll-area\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport type { BasicAnimation } from \"@/types/variables\";\nimport { animationClass } from \"@/utils/animations\";\nimport { AlertTriangle, Info, CheckCircle2, AlertCircle } from \"lucide-react\";\nimport Button, { type ButtonProps } from \"../Button/Button\";\n\nexport type DialogVariant = \"dialog\" | \"confirm\" | \"alert\" | \"info\" | \"warning\";\nexport type DialogSize =\n | \"sm\"\n | \"md\"\n | \"lg\"\n | \"xl\"\n | \"2xl\"\n | \"3xl\"\n | \"4xl\"\n | \"full\";\nexport type DialogPosition =\n | \"center\"\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\nexport interface DialogButtonConfig extends Omit<ButtonProps, \"children\"> {\n text?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport interface DialogProps {\n // Core props\n variant?: DialogVariant;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n\n // Content\n title?: React.ReactNode;\n description?: React.ReactNode;\n children?: React.ReactNode;\n trigger?: React.ReactNode;\n footer?: React.ReactNode;\n\n // Behavior\n closeOnEsc?: boolean;\n closeOnOutside?: boolean;\n showCloseButton?: boolean;\n\n // Layout\n position?: DialogPosition;\n size?: DialogSize;\n fullscreen?: boolean;\n scrollable?: boolean;\n stickyHeader?: boolean;\n stickyFooter?: boolean;\n\n // Animation\n animation?: BasicAnimation;\n\n // Styling\n className?: string;\n contentClassName?: string;\n headerClassName?: string;\n titleClassName?: string;\n descriptionClassName?: string;\n footerClassName?: string;\n overlayClassName?: string;\n\n // Overlay\n backdropFilter?: number;\n overlay?: \"dark\" | \"light\";\n\n // Alert/Confirm buttons\n confirmButton?: DialogButtonConfig;\n cancelButton?: DialogButtonConfig;\n\n // Alert/Confirm specific\n showIcon?: boolean;\n}\n\nconst variantIcons = {\n dialog: null,\n confirm: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-success/10 mx-auto mb-4\">\n <CheckCircle2 className=\"size-6 text-success\" />\n </div>\n ),\n alert: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-error/10 mx-auto mb-4\">\n <AlertCircle className=\"size-5 text-error\" />\n </div>\n ),\n info: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-blue-500/10 mx-auto mb-4\">\n <Info className=\"size-5 text-blue-500\" />\n </div>\n ),\n warning: (\n <div className=\"size-12 flex items-center justify-center rounded-full bg-warning/10 mx-auto mb-4\">\n <AlertTriangle className=\"size-5 text-warning\" />\n </div>\n ),\n};\n\nconst variantColors = {\n dialog: \"\",\n confirm: \"border-blue-500/20\",\n alert: \"border-red-500/20\",\n info: \"border-blue-500/20\",\n warning: \"border-yellow-500/20\",\n};\n\nconst sizeClasses: Record<DialogSize, string> = {\n sm: \"sm:max-w-sm\",\n md: \"sm:max-w-md\",\n lg: \"sm:max-w-lg\",\n xl: \"sm:max-w-xl\",\n \"2xl\": \"sm:max-w-2xl max-h-[90vh]\",\n \"3xl\": \"sm:max-w-3xl max-h-[90vh]\",\n \"4xl\": \"sm:max-w-4xl max-h-[90vh]\",\n full: \"sm:max-w-[95vw] h-[98vh]\",\n};\n\nconst positionClasses: Record<DialogPosition, string> = {\n center: \"!top-[50%] !left-[50%] !translate-x-[-50%] !translate-y-[-50%]\",\n top: \"!top-4 !left-[50%] !translate-x-[-50%] !translate-y-0\",\n bottom: \"!top-auto !bottom-4 !left-[50%] !translate-x-[-50%] !translate-y-0\",\n left: \"!left-4 !top-[50%] !translate-x-0 !translate-y-[-50%]\",\n right: \"!left-auto !right-4 !top-[50%] !translate-x-0 !translate-y-[-50%]\",\n \"top-left\": \"!top-4 !left-4 !translate-x-0 !translate-y-0\",\n \"top-right\": \"!top-4 !left-auto !right-4 !translate-x-0 !translate-y-0\",\n \"bottom-left\": \"!top-auto !bottom-4 !left-4 !translate-x-0 !translate-y-0\",\n \"bottom-right\":\n \"!top-auto !bottom-4 !left-auto !right-4 !translate-x-0 !translate-y-0\",\n};\n\nconst Dialog = React.forwardRef<HTMLDivElement, DialogProps>((props, ref) => {\n const {\n variant = \"dialog\",\n open,\n onOpenChange,\n title,\n description,\n children,\n trigger,\n footer,\n closeOnEsc = true,\n closeOnOutside = true,\n showCloseButton = true,\n position = \"center\",\n size = \"md\",\n fullscreen = false,\n scrollable = true,\n stickyHeader = false,\n stickyFooter = false,\n animation,\n className,\n contentClassName,\n headerClassName,\n titleClassName,\n descriptionClassName,\n footerClassName,\n // overlayClassName, // Not used in current implementation\n confirmButton,\n cancelButton,\n showIcon = true,\n backdropFilter = 2,\n overlay = \"dark\",\n } = props;\n\n const animationResult = useMemo(() => {\n return animation ? animationClass(animation) : { className: \"\" };\n }, [animation]);\n\n const contentClasses = cn(\n // Remove default padding and gap to allow custom header/footer\n \"!p-0 !gap-0 flex flex-col\",\n sizeClasses[fullscreen ? \"full\" : size],\n positionClasses[position],\n variantColors[variant],\n animationResult.className,\n fullscreen ? \"h-[98vh]\" : \"max-h-[90vh]\"\n );\n\n const headerClasses = cn(\n \"px-6 pt-6 text-left\",\n !scrollable && \"contents space-y-0\",\n headerClassName\n );\n\n const footerClasses = cn(\n \"px-6 pb-6 sm:justify-end\",\n !scrollable && \"border-t py-4\",\n footerClassName\n );\n\n const icon = showIcon ? variantIcons[variant] : null;\n\n const headerComponents = useMemo(() => {\n return title || icon || description ? (\n <AlertDialogHeader\n className={cn(\n \"flex items-center gap-2 py-4\",\n { \"border-b\": stickyHeader },\n headerClasses\n )}\n >\n {(title || icon) && (\n <AlertDialogTitle className={cn(titleClassName)}>\n {icon}\n {title}\n </AlertDialogTitle>\n )}\n {description && (\n <AlertDialogDescription className={descriptionClassName}>\n {description}\n </AlertDialogDescription>\n )}\n </AlertDialogHeader>\n ) : null;\n }, [\n title,\n icon,\n description,\n headerClasses,\n titleClassName,\n descriptionClassName,\n stickyHeader,\n ]);\n\n const footerComponents = useMemo(() => {\n // Merge configs with defaults\n const mergedConfirmButton: DialogButtonConfig = {\n variant: \"solid\",\n color: \"primary\",\n ...confirmButton,\n text: confirmButton?.text ?? \"Confirm\",\n };\n\n const mergedCancelButton: DialogButtonConfig = {\n variant: \"outline\",\n ...cancelButton,\n text: cancelButton?.text ?? \"Cancel\",\n };\n\n return footer || confirmButton || cancelButton ? (\n <AlertDialogFooter\n className={cn(\"py-4\", { \"border-t\": stickyFooter }, footerClasses)}\n >\n {footer || (\n <>\n {cancelButton && (\n <Button\n {...mergedCancelButton}\n onClick={() => {\n mergedCancelButton.onClick?.();\n }}\n >\n {mergedCancelButton.text}\n </Button>\n )}\n {confirmButton && (\n <Button\n {...mergedConfirmButton}\n onClick={() => {\n mergedConfirmButton.onClick?.();\n }}\n >\n {mergedConfirmButton.text}\n </Button>\n )}\n </>\n )}\n </AlertDialogFooter>\n ) : null;\n }, [footer, footerClasses, confirmButton, cancelButton, stickyFooter]);\n\n // For alert-style dialogs (confirm, alert, info, warning)\n if (variant !== \"dialog\") {\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n {trigger && <AlertDialogTrigger asChild>{trigger}</AlertDialogTrigger>}\n <AlertDialogContent\n ref={ref}\n className={cn(className, contentClasses)}\n onEscapeKeyDown={(e) => !closeOnEsc && e.preventDefault()}\n noDefaultAnimation={!!animation}\n backdropFilter={backdropFilter}\n overlay={overlay}\n >\n {stickyHeader && headerComponents}\n\n <ScrollArea className=\"flex max-h-full flex-col overflow-hidden\">\n {!stickyHeader && headerComponents}\n {children && (\n <div className={cn(\"px-6 py-4\", contentClassName)}>\n {children}\n </div>\n )}\n {!stickyFooter && footerComponents}\n </ScrollArea>\n\n {stickyFooter && footerComponents}\n </AlertDialogContent>\n </AlertDialog>\n );\n }\n\n // Regular dialog\n return (\n <SDialog open={open} onOpenChange={onOpenChange}>\n {trigger && <DialogTrigger asChild>{trigger}</DialogTrigger>}\n <SDialogContent\n ref={ref}\n className={cn(className, contentClasses)}\n showCloseButton={showCloseButton}\n onEscapeKeyDown={(e) => !closeOnEsc && e.preventDefault()}\n onInteractOutside={(e) => !closeOnOutside && e.preventDefault()}\n noDefaultAnimation={!!animation}\n backdropFilter={backdropFilter}\n overlay={overlay}\n >\n {stickyHeader && (title || description) && (\n <DialogHeader\n className={cn({ \"py-4 border-b\": stickyHeader }, headerClasses)}\n >\n {title && (\n <DialogTitle className={titleClassName}>{title}</DialogTitle>\n )}\n {description && (\n <DialogDescription className={descriptionClassName}>\n {description}\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n <ScrollArea className=\"flex max-h-full flex-col overflow-hidden\">\n {!stickyHeader && (title || description) && (\n <DialogHeader className={cn(\"py-4\", headerClasses)}>\n {title && (\n <DialogTitle className={titleClassName}>{title}</DialogTitle>\n )}\n {description && (\n <DialogDescription className={descriptionClassName}>\n {description}\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n {children && (\n <div className={cn(\"px-6 py-4\", contentClassName)}>{children}</div>\n )}\n {!stickyFooter && footer && (\n <DialogFooter className={cn(\"py-4\", footerClasses)}>\n {footer}\n </DialogFooter>\n )}\n </ScrollArea>\n {stickyFooter && footer && (\n <DialogFooter\n className={cn({ \"py-4 border-t\": stickyFooter }, footerClasses)}\n >\n {footer}\n </DialogFooter>\n )}\n </SDialogContent>\n </SDialog>\n );\n});\n\nDialog.displayName = \"Dialog\";\n\nexport default Dialog;\n"],"names":["variantIcons","jsx","CheckCircle2","AlertCircle","Info","AlertTriangle","variantColors","sizeClasses","positionClasses","Dialog","React","props","ref","variant","open","onOpenChange","title","description","children","trigger","footer","closeOnEsc","closeOnOutside","showCloseButton","position","size","fullscreen","scrollable","stickyHeader","stickyFooter","animation","className","contentClassName","headerClassName","titleClassName","descriptionClassName","footerClassName","confirmButton","cancelButton","showIcon","backdropFilter","overlay","animationResult","useMemo","animationClass","contentClasses","cn","headerClasses","footerClasses","icon","headerComponents","jsxs","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","footerComponents","mergedConfirmButton","mergedCancelButton","AlertDialogFooter","Fragment","Button","AlertDialog","AlertDialogTrigger","AlertDialogContent","e","ScrollArea","SDialog","DialogTrigger","SDialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter"],"mappings":"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"}
|
|
@@ -10,43 +10,43 @@ import { Label as te } from "../../packages/ui/src/components/label.js";
|
|
|
10
10
|
const ne = s.forwardRef(
|
|
11
11
|
({
|
|
12
12
|
className: D,
|
|
13
|
-
label:
|
|
14
|
-
helperText:
|
|
15
|
-
state:
|
|
13
|
+
label: x,
|
|
14
|
+
helperText: v,
|
|
15
|
+
state: N,
|
|
16
16
|
size: i,
|
|
17
17
|
isFloatLabel: c,
|
|
18
18
|
type: a,
|
|
19
|
-
mask:
|
|
19
|
+
mask: h,
|
|
20
20
|
maskOptions: E,
|
|
21
|
-
maxLength:
|
|
21
|
+
maxLength: b,
|
|
22
22
|
showCharCount: P,
|
|
23
|
-
infoTooltip:
|
|
24
|
-
clearable:
|
|
23
|
+
infoTooltip: w,
|
|
24
|
+
clearable: p,
|
|
25
25
|
onClear: V,
|
|
26
26
|
prefixIcon: u,
|
|
27
27
|
suffixIcon: o,
|
|
28
28
|
placeholder: _ = " ",
|
|
29
|
-
...
|
|
29
|
+
...e
|
|
30
30
|
}, B) => {
|
|
31
|
-
const [f, I] = s.useState(() => typeof
|
|
32
|
-
I(
|
|
31
|
+
const [f, I] = s.useState(() => typeof e.value == "string" ? e.value.length : typeof e.defaultValue == "string" ? e.defaultValue.length : 0), H = (t) => {
|
|
32
|
+
I(t.target.value.length), e.onChange && e.onChange(t);
|
|
33
33
|
}, U = () => {
|
|
34
34
|
if (r.current) {
|
|
35
35
|
r.current.value = "", I(0);
|
|
36
|
-
const
|
|
36
|
+
const t = {
|
|
37
37
|
target: r.current,
|
|
38
38
|
currentTarget: r.current
|
|
39
39
|
};
|
|
40
|
-
|
|
40
|
+
e.onChange?.(t), V && V();
|
|
41
41
|
}
|
|
42
|
-
},
|
|
43
|
-
(
|
|
44
|
-
if (r && (r.current =
|
|
45
|
-
const d = L(
|
|
46
|
-
typeof d == "function" && d(
|
|
42
|
+
}, C = s.useId(), r = s.useRef(null), X = s.useCallback(
|
|
43
|
+
(t) => {
|
|
44
|
+
if (r && (r.current = t), h && t) {
|
|
45
|
+
const d = L(h, E);
|
|
46
|
+
typeof d == "function" && d(t);
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
|
-
[
|
|
49
|
+
[h, E]
|
|
50
50
|
);
|
|
51
51
|
s.useImperativeHandle(B, () => r.current);
|
|
52
52
|
const [M, $] = s.useState(!1), q = {
|
|
@@ -55,14 +55,14 @@ const ne = s.forwardRef(
|
|
|
55
55
|
warning: "text-warning",
|
|
56
56
|
error: "text-error"
|
|
57
57
|
}, y = c ? i === "xl" || i === "lg" ? i : "xl" : i || "normal", R = (() => {
|
|
58
|
-
const
|
|
58
|
+
const t = {
|
|
59
59
|
xs: { prefix: "pl-8", suffix: "pr-8" },
|
|
60
60
|
sm: { prefix: "pl-9", suffix: "pr-9" },
|
|
61
61
|
normal: { prefix: "pl-10", suffix: "pr-10" },
|
|
62
62
|
lg: { prefix: "pl-11", suffix: "pr-11" },
|
|
63
63
|
xl: { prefix: "pl-12", suffix: "pr-12" }
|
|
64
64
|
};
|
|
65
|
-
return
|
|
65
|
+
return t[y] || t.normal;
|
|
66
66
|
})(), k = {
|
|
67
67
|
xs: "size-3",
|
|
68
68
|
sm: "size-3.5",
|
|
@@ -70,30 +70,30 @@ const ne = s.forwardRef(
|
|
|
70
70
|
lg: "size-4",
|
|
71
71
|
xl: "size-4"
|
|
72
72
|
}[y] || "size-4", A = () => {
|
|
73
|
-
const
|
|
74
|
-
return
|
|
73
|
+
const t = a === "number" || a === "password" || a === "datetime" || p && (f > 0 || e?.value);
|
|
74
|
+
return t && o ? a === "password" && p && (f > 0 || e?.value) ? "pr-20" : "pr-16" : t ? a === "password" && p && (f > 0 || e?.value) ? "pr-16" : "pr-10" : o ? R.suffix : "";
|
|
75
75
|
}, j = (() => {
|
|
76
|
-
const
|
|
76
|
+
const t = {
|
|
77
77
|
xs: { left: "left-2.5", right: "right-2.5" },
|
|
78
78
|
sm: { left: "left-3", right: "right-3" },
|
|
79
79
|
normal: { left: "left-3", right: "right-3" },
|
|
80
80
|
lg: { left: "left-3.5", right: "right-3.5" },
|
|
81
81
|
xl: { left: "left-4", right: "right-4" }
|
|
82
82
|
};
|
|
83
|
-
return
|
|
83
|
+
return t[y] || t.normal;
|
|
84
84
|
})(), G = () => {
|
|
85
85
|
if (r.current) {
|
|
86
|
-
const
|
|
87
|
-
r.current.value = String(
|
|
88
|
-
const
|
|
89
|
-
r.current.dispatchEvent(
|
|
86
|
+
const t = Number(e.step || 1), d = e.max ? Number(e.max) : 1 / 0, z = Number(r.current.value || 0), S = Math.min(z + t, d);
|
|
87
|
+
r.current.value = String(S);
|
|
88
|
+
const g = new Event("input", { bubbles: !0 });
|
|
89
|
+
r.current.dispatchEvent(g), e.onChange?.(g);
|
|
90
90
|
}
|
|
91
91
|
}, J = () => {
|
|
92
92
|
if (r.current) {
|
|
93
|
-
const
|
|
94
|
-
r.current.value = String(
|
|
95
|
-
const
|
|
96
|
-
r.current.dispatchEvent(
|
|
93
|
+
const t = Number(e.step || 1), d = e.min ? Number(e.min) : -1 / 0, z = Number(r.current.value || 0), S = Math.max(z - t, d);
|
|
94
|
+
r.current.value = String(S);
|
|
95
|
+
const g = new Event("input", { bubbles: !0 });
|
|
96
|
+
r.current.dispatchEvent(g), e.onChange?.(g);
|
|
97
97
|
}
|
|
98
98
|
};
|
|
99
99
|
return /* @__PURE__ */ n("div", { className: D, children: /* @__PURE__ */ m(
|
|
@@ -103,14 +103,14 @@ const ne = s.forwardRef(
|
|
|
103
103
|
"floating-label relative": c
|
|
104
104
|
}),
|
|
105
105
|
children: [
|
|
106
|
-
!c &&
|
|
106
|
+
!c && x && /* @__PURE__ */ m(
|
|
107
107
|
te,
|
|
108
108
|
{
|
|
109
|
-
htmlFor:
|
|
109
|
+
htmlFor: C,
|
|
110
110
|
className: "flex gap-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
|
|
111
111
|
children: [
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
x,
|
|
113
|
+
w && /* @__PURE__ */ n(ee, { content: w, children: /* @__PURE__ */ n(Q, { className: "size-3.5 min-w-3.5" }) })
|
|
114
114
|
]
|
|
115
115
|
}
|
|
116
116
|
),
|
|
@@ -134,7 +134,7 @@ const ne = s.forwardRef(
|
|
|
134
134
|
K,
|
|
135
135
|
{
|
|
136
136
|
ref: X,
|
|
137
|
-
id:
|
|
137
|
+
id: C,
|
|
138
138
|
className: l(
|
|
139
139
|
"peer",
|
|
140
140
|
{
|
|
@@ -143,26 +143,26 @@ const ne = s.forwardRef(
|
|
|
143
143
|
// "[-webkit-text-fill-color:var(--foreground)]": mask,
|
|
144
144
|
},
|
|
145
145
|
u && R.prefix,
|
|
146
|
-
|
|
146
|
+
h && "placeholder:text-slate-400 placeholder:opacity-100",
|
|
147
147
|
A()
|
|
148
148
|
// className,
|
|
149
149
|
),
|
|
150
|
-
state:
|
|
150
|
+
state: N,
|
|
151
151
|
size: c ? i === "xl" || i === "lg" ? i : "xl" : i,
|
|
152
152
|
type: a === "password" ? M ? "text" : "password" : a,
|
|
153
153
|
placeholder: _,
|
|
154
|
-
maxLength:
|
|
154
|
+
maxLength: b,
|
|
155
155
|
onChange: H,
|
|
156
|
-
...
|
|
156
|
+
...e
|
|
157
157
|
}
|
|
158
158
|
),
|
|
159
159
|
c && /* @__PURE__ */ n(
|
|
160
160
|
O,
|
|
161
161
|
{
|
|
162
|
-
htmlFor:
|
|
162
|
+
htmlFor: C,
|
|
163
163
|
size: i,
|
|
164
|
-
infoTooltip:
|
|
165
|
-
children:
|
|
164
|
+
infoTooltip: w,
|
|
165
|
+
children: x
|
|
166
166
|
}
|
|
167
167
|
),
|
|
168
168
|
a === "number" && /* @__PURE__ */ m("div", { className: "absolute right-1 top-0 h-full flex flex-col gap-0.5", children: [
|
|
@@ -171,7 +171,7 @@ const ne = s.forwardRef(
|
|
|
171
171
|
{
|
|
172
172
|
type: "button",
|
|
173
173
|
onClick: G,
|
|
174
|
-
disabled:
|
|
174
|
+
disabled: e.disabled,
|
|
175
175
|
className: l(
|
|
176
176
|
"h-1/2 w-6 flex items-center justify-center rounded cursor-pointer hover:scale-150 transition-transform",
|
|
177
177
|
"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent"
|
|
@@ -185,7 +185,7 @@ const ne = s.forwardRef(
|
|
|
185
185
|
{
|
|
186
186
|
type: "button",
|
|
187
187
|
onClick: J,
|
|
188
|
-
disabled:
|
|
188
|
+
disabled: e.disabled,
|
|
189
189
|
className: l(
|
|
190
190
|
"h-1/2 w-6 flex items-center justify-center rounded cursor-pointer hover:scale-150 transition-transform",
|
|
191
191
|
"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent"
|
|
@@ -195,7 +195,7 @@ const ne = s.forwardRef(
|
|
|
195
195
|
}
|
|
196
196
|
)
|
|
197
197
|
] }),
|
|
198
|
-
|
|
198
|
+
p && (f > 0 || e?.value) && !e.disabled && a !== "number" && /* @__PURE__ */ n(
|
|
199
199
|
"button",
|
|
200
200
|
{
|
|
201
201
|
type: "button",
|
|
@@ -205,7 +205,7 @@ const ne = s.forwardRef(
|
|
|
205
205
|
a === "password" ? o ? "right-14" : "right-10" : o ? "right-10" : "right-2"
|
|
206
206
|
),
|
|
207
207
|
onClick: U,
|
|
208
|
-
disabled:
|
|
208
|
+
disabled: e.disabled,
|
|
209
209
|
children: /* @__PURE__ */ n(Z, { className: "size-4" })
|
|
210
210
|
}
|
|
211
211
|
),
|
|
@@ -218,8 +218,8 @@ const ne = s.forwardRef(
|
|
|
218
218
|
"absolute top-1/2 -translate-y-1/2 p-1 rounded hover:bg-accent transition-colors",
|
|
219
219
|
o ? "right-10" : "right-2"
|
|
220
220
|
),
|
|
221
|
-
onClick: () => $((
|
|
222
|
-
disabled:
|
|
221
|
+
onClick: () => $((t) => !t),
|
|
222
|
+
disabled: e.disabled,
|
|
223
223
|
children: M ? /* @__PURE__ */ n(T, { className: "size-4" }) : /* @__PURE__ */ n(F, { className: "size-4" })
|
|
224
224
|
}
|
|
225
225
|
),
|
|
@@ -239,21 +239,21 @@ const ne = s.forwardRef(
|
|
|
239
239
|
}
|
|
240
240
|
)
|
|
241
241
|
] }),
|
|
242
|
-
(
|
|
243
|
-
|
|
242
|
+
(v || P && typeof b == "number") && /* @__PURE__ */ m("div", { className: "flex items-center justify-between text-xs gap-2", children: [
|
|
243
|
+
v && /* @__PURE__ */ n(
|
|
244
244
|
"p",
|
|
245
245
|
{
|
|
246
246
|
className: l(
|
|
247
247
|
"text-xs",
|
|
248
|
-
|
|
248
|
+
N ? q?.[N] : ""
|
|
249
249
|
),
|
|
250
|
-
children:
|
|
250
|
+
children: v
|
|
251
251
|
}
|
|
252
252
|
),
|
|
253
|
-
P && typeof
|
|
253
|
+
P && typeof b == "number" && /* @__PURE__ */ m("span", { className: "ml-auto text-muted-foreground", children: [
|
|
254
254
|
f,
|
|
255
255
|
" / ",
|
|
256
|
-
|
|
256
|
+
b
|
|
257
257
|
] })
|
|
258
258
|
] })
|
|
259
259
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.js","sources":["../../../../src/components/Input/Input.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n Input as SInput,\n type InputProps as SInputProps,\n} from \"@dsui/ui/components/input\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport { FloatingLabel } from \"@/components/FloatLabel\";\nimport { Eye, EyeOff, ChevronDown, ChevronUp, Info, X } from \"lucide-react\";\nimport { withMask, type Options } from \"use-mask-input\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\nimport { Label } from \"../Label\";\n\n// Re-export base input props to avoid external dependency issues\nexport type BaseInputProps = Omit<React.ComponentProps<\"input\">, \"size\"> & {\n size?: \"normal\" | \"sm\" | \"xs\" | \"lg\" | \"xl\";\n state?: \"default\" | \"success\" | \"error\" | \"warning\";\n};\n\nexport type InputProps = BaseInputProps & {\n label?: string;\n helperText?: React.ReactNode;\n isFloatLabel?: boolean;\n mask?: string;\n maskOptions?: {\n placeholder?: string;\n inputFormat?: string;\n outputFormat?: string;\n showMaskOnHover?: boolean;\n showMaskOnFocus?: boolean;\n separate?: boolean;\n } & Options;\n maxLength?: number;\n showCharCount?: boolean;\n infoTooltip?: React.ReactNode;\n clearable?: boolean;\n onClear?: () => void;\n prefixIcon?: React.ReactNode;\n suffixIcon?: React.ReactNode;\n};\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n label,\n helperText,\n state,\n size,\n isFloatLabel,\n type,\n mask,\n maskOptions,\n maxLength,\n showCharCount,\n infoTooltip,\n clearable,\n onClear,\n prefixIcon,\n suffixIcon,\n placeholder = \" \",\n ...props\n },\n ref\n ) => {\n // Character count state\n const [charCount, setCharCount] = React.useState(() => {\n if (typeof props.value === \"string\") return props.value.length;\n if (typeof props.defaultValue === \"string\")\n return props.defaultValue.length;\n return 0;\n });\n\n const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n setCharCount(e.target.value.length);\n if (props.onChange) props.onChange(e);\n };\n\n const handleClear = () => {\n if (innerRef.current) {\n innerRef.current.value = \"\";\n setCharCount(0);\n const event = {\n target: innerRef.current,\n currentTarget: innerRef.current,\n } as React.ChangeEvent<HTMLInputElement>;\n props.onChange?.(event);\n if (onClear) onClear();\n }\n };\n\n const inputId = React.useId();\n const innerRef = React.useRef<HTMLInputElement>(null);\n\n // Combine refs\n const combinedRef = React.useCallback(\n (element: HTMLInputElement | null) => {\n // Set innerRef\n if (innerRef) {\n (\n innerRef as React.MutableRefObject<HTMLInputElement | null>\n ).current = element;\n }\n\n // Apply mask if provided\n if (mask && element) {\n const maskRefCallback = withMask(mask, maskOptions);\n if (typeof maskRefCallback === \"function\") {\n maskRefCallback(element);\n }\n }\n },\n [mask, maskOptions]\n );\n\n // Expose ref to parent\n React.useImperativeHandle(ref, () => innerRef.current!);\n\n const [showPassword, setShowPassword] = React.useState(false);\n\n // State\n const helperTextStyles = {\n default: \"text-muted-foreground\",\n success: \"text-success\",\n warning: \"text-warning\",\n error: \"text-error\",\n };\n\n // Calculate current size\n const currentSize = isFloatLabel\n ? size === \"xl\" || size === \"lg\"\n ? size\n : \"xl\"\n : size || \"normal\";\n\n // Calculate padding based on size and icons\n const getPadding = () => {\n const sizeMap = {\n xs: { prefix: \"pl-8\", suffix: \"pr-8\" },\n sm: { prefix: \"pl-9\", suffix: \"pr-9\" },\n normal: { prefix: \"pl-10\", suffix: \"pr-10\" },\n lg: { prefix: \"pl-11\", suffix: \"pr-11\" },\n xl: { prefix: \"pl-12\", suffix: \"pr-12\" },\n };\n\n return sizeMap[currentSize as keyof typeof sizeMap] || sizeMap.normal;\n };\n\n const padding = getPadding();\n\n // Get icon size class based on current size\n const getIconSizeClass = () => {\n const sizeMap = {\n xs: \"size-3\",\n sm: \"size-3.5\",\n normal: \"size-4\",\n lg: \"size-4\",\n xl: \"size-4\",\n };\n return sizeMap[currentSize as keyof typeof sizeMap] || \"size-4\";\n };\n\n const iconSizeClass = getIconSizeClass();\n\n // Calculate right padding considering built-in icons\n const getRightPadding = () => {\n const hasBuiltInSuffix =\n type === \"number\" ||\n type === \"password\" ||\n type === \"datetime\" ||\n (clearable && (charCount > 0 || props?.value));\n\n if (hasBuiltInSuffix && suffixIcon) {\n return type === \"password\" &&\n clearable &&\n (charCount > 0 || props?.value)\n ? \"pr-20\" // password + clear + custom icon\n : \"pr-16\"; // one built-in + custom icon\n }\n\n if (hasBuiltInSuffix) {\n return type === \"password\" &&\n clearable &&\n (charCount > 0 || props?.value)\n ? \"pr-16\" // password + clear\n : \"pr-10\"; // single built-in icon\n }\n\n if (suffixIcon) {\n return padding.suffix;\n }\n\n return \"\";\n };\n\n // Icon position calculations\n const getIconPosition = () => {\n const sizeMap = {\n xs: { left: \"left-2.5\", right: \"right-2.5\" },\n sm: { left: \"left-3\", right: \"right-3\" },\n normal: { left: \"left-3\", right: \"right-3\" },\n lg: { left: \"left-3.5\", right: \"right-3.5\" },\n xl: { left: \"left-4\", right: \"right-4\" },\n };\n\n return sizeMap[currentSize as keyof typeof sizeMap] || sizeMap.normal;\n };\n\n const iconPosition = getIconPosition();\n\n /* Spinner Button Handlers */\n const handleIncrement = () => {\n if (innerRef.current) {\n const step = Number(props.step || 1);\n const max = props.max ? Number(props.max) : Infinity;\n const currentValue = Number(innerRef.current.value || 0);\n const newValue = Math.min(currentValue + step, max);\n\n innerRef.current.value = String(newValue);\n const event = new Event(\"input\", { bubbles: true });\n innerRef.current.dispatchEvent(event);\n }\n };\n\n const handleDecrement = () => {\n if (innerRef.current) {\n const step = Number(props.step || 1);\n const min = props.min ? Number(props.min) : -Infinity;\n const currentValue = Number(innerRef.current.value || 0);\n const newValue = Math.max(currentValue - step, min);\n\n innerRef.current.value = String(newValue);\n const event = new Event(\"input\", { bubbles: true });\n innerRef.current.dispatchEvent(event);\n }\n };\n /* End Spinner Button Handlers */\n\n return (\n <div className={className}>\n <div\n className={cn(\"flex flex-col gap-1.5 relative flex-auto\", {\n \"floating-label relative\": isFloatLabel,\n })}\n >\n {!isFloatLabel && label && (\n <Label\n htmlFor={inputId}\n className=\"flex gap-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {infoTooltip && (\n <Tooltip content={infoTooltip}>\n <Info className=\"size-3.5 min-w-3.5\" />\n </Tooltip>\n )}\n </Label>\n )}\n\n <div className=\"relative\">\n {/* Prefix Icon */}\n {prefixIcon && (\n <div\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-muted-foreground leading-0\",\n iconPosition.left\n )}\n >\n {React.isValidElement(prefixIcon)\n ? React.cloneElement(prefixIcon, {\n className: cn(\n iconSizeClass,\n (prefixIcon.props as any)?.className\n ),\n } as Partial<unknown>)\n : prefixIcon}\n </div>\n )}\n\n <SInput\n ref={combinedRef}\n id={inputId}\n className={cn(\n \"peer\",\n {\n \"pt-5 pb-1\": isFloatLabel && size !== \"lg\",\n \"[&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none [-moz-appearance:textfield] pr-8\":\n type === \"number\",\n // \"[-webkit-text-fill-color:var(--foreground)]\": mask,\n },\n prefixIcon && padding.prefix,\n mask && \"placeholder:text-slate-400 placeholder:opacity-100\",\n getRightPadding()\n // className,\n )}\n state={state}\n size={\n isFloatLabel\n ? size === \"xl\" || size === \"lg\"\n ? size\n : \"xl\"\n : size\n }\n type={\n type === \"password\"\n ? showPassword\n ? \"text\"\n : \"password\"\n : type\n }\n placeholder={placeholder}\n maxLength={maxLength}\n onChange={handleInput}\n {...props}\n />\n {isFloatLabel && (\n <FloatingLabel\n htmlFor={inputId}\n size={size}\n infoTooltip={infoTooltip}\n >\n {label}\n </FloatingLabel>\n )}\n\n {/* Spinner Buttons */}\n {type === \"number\" && (\n <div className=\"absolute right-1 top-0 h-full flex flex-col gap-0.5\">\n <button\n type=\"button\"\n onClick={handleIncrement}\n disabled={props.disabled}\n className={cn(\n \"h-1/2 w-6 flex items-center justify-center rounded cursor-pointer hover:scale-150 transition-transform\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n )}\n tabIndex={-1}\n >\n <ChevronUp className=\"size-3\" />\n </button>\n <button\n type=\"button\"\n onClick={handleDecrement}\n disabled={props.disabled}\n className={cn(\n \"h-1/2 w-6 flex items-center justify-center rounded cursor-pointer hover:scale-150 transition-transform\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n )}\n tabIndex={-1}\n >\n <ChevronDown className=\"size-3\" />\n </button>\n </div>\n )}\n\n {/* Clear Button */}\n {clearable &&\n (charCount > 0 || props?.value) &&\n !props.disabled &&\n type !== \"number\" && (\n <button\n type=\"button\"\n tabIndex={-1}\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 p-1 rounded hover:bg-accent transition-colors cursor-pointer\",\n type === \"password\"\n ? suffixIcon\n ? \"right-14\"\n : \"right-10\"\n : suffixIcon\n ? \"right-10\"\n : \"right-2\"\n )}\n onClick={handleClear}\n disabled={props.disabled}\n >\n <X className=\"size-4\" />\n </button>\n )}\n\n {/* Show/Hide Password Button */}\n {type === \"password\" && (\n <button\n type=\"button\"\n tabIndex={-1}\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 p-1 rounded hover:bg-accent transition-colors\",\n suffixIcon ? \"right-10\" : \"right-2\"\n )}\n onClick={() => setShowPassword((prev) => !prev)}\n disabled={props.disabled}\n >\n {showPassword ? (\n <EyeOff className=\"size-4\" />\n ) : (\n <Eye className=\"size-4\" />\n )}\n </button>\n )}\n\n {/* Suffix Icon */}\n {suffixIcon && (\n <div\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-muted-foreground leading-0\",\n iconPosition.right\n )}\n >\n {React.isValidElement(suffixIcon)\n ? React.cloneElement(suffixIcon, {\n className: cn(\n iconSizeClass,\n (suffixIcon.props as any)?.className\n ),\n } as Partial<unknown>)\n : suffixIcon}\n </div>\n )}\n </div>\n\n {(helperText || (showCharCount && typeof maxLength === \"number\")) && (\n <div className=\"flex items-center justify-between text-xs gap-2\">\n {helperText && (\n <p\n className={cn(\n \"text-xs\",\n state ? helperTextStyles?.[state] : \"\"\n )}\n >\n {helperText}\n </p>\n )}\n {showCharCount && typeof maxLength === \"number\" && (\n <span className=\"ml-auto text-muted-foreground\">\n {charCount} / {maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\nexport default Input;\n"],"names":["Input","React","className","label","helperText","state","size","isFloatLabel","type","mask","maskOptions","maxLength","showCharCount","infoTooltip","clearable","onClear","prefixIcon","suffixIcon","placeholder","props","ref","charCount","setCharCount","handleInput","handleClear","innerRef","event","inputId","combinedRef","element","maskRefCallback","withMask","showPassword","setShowPassword","helperTextStyles","currentSize","padding","sizeMap","iconSizeClass","getRightPadding","hasBuiltInSuffix","iconPosition","handleIncrement","step","max","currentValue","newValue","handleDecrement","min","jsx","jsxs","cn","Label","Tooltip","Info","SInput","FloatingLabel","ChevronUp","ChevronDown","X","prev","EyeOff","Eye"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Input.js","sources":["../../../../src/components/Input/Input.tsx"],"sourcesContent":["import React, { type ChangeEvent } from \"react\";\nimport {\n Input as SInput,\n type InputProps as SInputProps,\n} from \"@dsui/ui/components/input\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport { FloatingLabel } from \"@/components/FloatLabel\";\nimport { Eye, EyeOff, ChevronDown, ChevronUp, Info, X } from \"lucide-react\";\nimport { withMask, type Options } from \"use-mask-input\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\nimport { Label } from \"../Label\";\n\n// Re-export base input props to avoid external dependency issues\nexport type BaseInputProps = Omit<React.ComponentProps<\"input\">, \"size\"> & {\n size?: \"normal\" | \"sm\" | \"xs\" | \"lg\" | \"xl\";\n state?: \"default\" | \"success\" | \"error\" | \"warning\";\n};\n\nexport type InputProps = BaseInputProps & {\n label?: string;\n helperText?: React.ReactNode;\n isFloatLabel?: boolean;\n mask?: string;\n maskOptions?: {\n placeholder?: string;\n inputFormat?: string;\n outputFormat?: string;\n showMaskOnHover?: boolean;\n showMaskOnFocus?: boolean;\n separate?: boolean;\n } & Options;\n maxLength?: number;\n showCharCount?: boolean;\n infoTooltip?: React.ReactNode;\n clearable?: boolean;\n onClear?: () => void;\n prefixIcon?: React.ReactNode;\n suffixIcon?: React.ReactNode;\n};\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n label,\n helperText,\n state,\n size,\n isFloatLabel,\n type,\n mask,\n maskOptions,\n maxLength,\n showCharCount,\n infoTooltip,\n clearable,\n onClear,\n prefixIcon,\n suffixIcon,\n placeholder = \" \",\n ...props\n },\n ref\n ) => {\n // Character count state\n const [charCount, setCharCount] = React.useState(() => {\n if (typeof props.value === \"string\") return props.value.length;\n if (typeof props.defaultValue === \"string\")\n return props.defaultValue.length;\n return 0;\n });\n\n const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n setCharCount(e.target.value.length);\n if (props.onChange) props.onChange(e);\n };\n\n const handleClear = () => {\n if (innerRef.current) {\n innerRef.current.value = \"\";\n setCharCount(0);\n const event = {\n target: innerRef.current,\n currentTarget: innerRef.current,\n } as React.ChangeEvent<HTMLInputElement>;\n props.onChange?.(event);\n if (onClear) onClear();\n }\n };\n\n const inputId = React.useId();\n const innerRef = React.useRef<HTMLInputElement>(null);\n\n // Combine refs\n const combinedRef = React.useCallback(\n (element: HTMLInputElement | null) => {\n // Set innerRef\n if (innerRef) {\n (\n innerRef as React.MutableRefObject<HTMLInputElement | null>\n ).current = element;\n }\n\n // Apply mask if provided\n if (mask && element) {\n const maskRefCallback = withMask(mask, maskOptions);\n if (typeof maskRefCallback === \"function\") {\n maskRefCallback(element);\n }\n }\n },\n [mask, maskOptions]\n );\n\n // Expose ref to parent\n React.useImperativeHandle(ref, () => innerRef.current!);\n\n const [showPassword, setShowPassword] = React.useState(false);\n\n // State\n const helperTextStyles = {\n default: \"text-muted-foreground\",\n success: \"text-success\",\n warning: \"text-warning\",\n error: \"text-error\",\n };\n\n // Calculate current size\n const currentSize = isFloatLabel\n ? size === \"xl\" || size === \"lg\"\n ? size\n : \"xl\"\n : size || \"normal\";\n\n // Calculate padding based on size and icons\n const getPadding = () => {\n const sizeMap = {\n xs: { prefix: \"pl-8\", suffix: \"pr-8\" },\n sm: { prefix: \"pl-9\", suffix: \"pr-9\" },\n normal: { prefix: \"pl-10\", suffix: \"pr-10\" },\n lg: { prefix: \"pl-11\", suffix: \"pr-11\" },\n xl: { prefix: \"pl-12\", suffix: \"pr-12\" },\n };\n\n return sizeMap[currentSize as keyof typeof sizeMap] || sizeMap.normal;\n };\n\n const padding = getPadding();\n\n // Get icon size class based on current size\n const getIconSizeClass = () => {\n const sizeMap = {\n xs: \"size-3\",\n sm: \"size-3.5\",\n normal: \"size-4\",\n lg: \"size-4\",\n xl: \"size-4\",\n };\n return sizeMap[currentSize as keyof typeof sizeMap] || \"size-4\";\n };\n\n const iconSizeClass = getIconSizeClass();\n\n // Calculate right padding considering built-in icons\n const getRightPadding = () => {\n const hasBuiltInSuffix =\n type === \"number\" ||\n type === \"password\" ||\n type === \"datetime\" ||\n (clearable && (charCount > 0 || props?.value));\n\n if (hasBuiltInSuffix && suffixIcon) {\n return type === \"password\" &&\n clearable &&\n (charCount > 0 || props?.value)\n ? \"pr-20\" // password + clear + custom icon\n : \"pr-16\"; // one built-in + custom icon\n }\n\n if (hasBuiltInSuffix) {\n return type === \"password\" &&\n clearable &&\n (charCount > 0 || props?.value)\n ? \"pr-16\" // password + clear\n : \"pr-10\"; // single built-in icon\n }\n\n if (suffixIcon) {\n return padding.suffix;\n }\n\n return \"\";\n };\n\n // Icon position calculations\n const getIconPosition = () => {\n const sizeMap = {\n xs: { left: \"left-2.5\", right: \"right-2.5\" },\n sm: { left: \"left-3\", right: \"right-3\" },\n normal: { left: \"left-3\", right: \"right-3\" },\n lg: { left: \"left-3.5\", right: \"right-3.5\" },\n xl: { left: \"left-4\", right: \"right-4\" },\n };\n\n return sizeMap[currentSize as keyof typeof sizeMap] || sizeMap.normal;\n };\n\n const iconPosition = getIconPosition();\n\n /* Spinner Button Handlers */\n const handleIncrement = () => {\n if (innerRef.current) {\n const step = Number(props.step || 1);\n const max = props.max ? Number(props.max) : Infinity;\n const currentValue = Number(innerRef.current.value || 0);\n const newValue = Math.min(currentValue + step, max);\n\n innerRef.current.value = String(newValue);\n const event = new Event(\"input\", { bubbles: true });\n innerRef.current.dispatchEvent(event);\n props.onChange?.(event as unknown as ChangeEvent<HTMLInputElement>);\n }\n };\n\n const handleDecrement = () => {\n if (innerRef.current) {\n const step = Number(props.step || 1);\n const min = props.min ? Number(props.min) : -Infinity;\n const currentValue = Number(innerRef.current.value || 0);\n const newValue = Math.max(currentValue - step, min);\n\n innerRef.current.value = String(newValue);\n const event = new Event(\"input\", { bubbles: true });\n innerRef.current.dispatchEvent(event);\n props.onChange?.(event as unknown as ChangeEvent<HTMLInputElement>);\n }\n };\n /* End Spinner Button Handlers */\n\n return (\n <div className={className}>\n <div\n className={cn(\"flex flex-col gap-1.5 relative flex-auto\", {\n \"floating-label relative\": isFloatLabel,\n })}\n >\n {!isFloatLabel && label && (\n <Label\n htmlFor={inputId}\n className=\"flex gap-2 text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {infoTooltip && (\n <Tooltip content={infoTooltip}>\n <Info className=\"size-3.5 min-w-3.5\" />\n </Tooltip>\n )}\n </Label>\n )}\n\n <div className=\"relative\">\n {/* Prefix Icon */}\n {prefixIcon && (\n <div\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-muted-foreground leading-0\",\n iconPosition.left\n )}\n >\n {React.isValidElement(prefixIcon)\n ? React.cloneElement(prefixIcon, {\n className: cn(\n iconSizeClass,\n (prefixIcon.props as any)?.className\n ),\n } as Partial<unknown>)\n : prefixIcon}\n </div>\n )}\n\n <SInput\n ref={combinedRef}\n id={inputId}\n className={cn(\n \"peer\",\n {\n \"pt-5 pb-1\": isFloatLabel && size !== \"lg\",\n \"[&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none [-moz-appearance:textfield] pr-8\":\n type === \"number\",\n // \"[-webkit-text-fill-color:var(--foreground)]\": mask,\n },\n prefixIcon && padding.prefix,\n mask && \"placeholder:text-slate-400 placeholder:opacity-100\",\n getRightPadding()\n // className,\n )}\n state={state}\n size={\n isFloatLabel\n ? size === \"xl\" || size === \"lg\"\n ? size\n : \"xl\"\n : size\n }\n type={\n type === \"password\"\n ? showPassword\n ? \"text\"\n : \"password\"\n : type\n }\n placeholder={placeholder}\n maxLength={maxLength}\n onChange={handleInput}\n {...props}\n />\n {isFloatLabel && (\n <FloatingLabel\n htmlFor={inputId}\n size={size}\n infoTooltip={infoTooltip}\n >\n {label}\n </FloatingLabel>\n )}\n\n {/* Spinner Buttons */}\n {type === \"number\" && (\n <div className=\"absolute right-1 top-0 h-full flex flex-col gap-0.5\">\n <button\n type=\"button\"\n onClick={handleIncrement}\n disabled={props.disabled}\n className={cn(\n \"h-1/2 w-6 flex items-center justify-center rounded cursor-pointer hover:scale-150 transition-transform\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n )}\n tabIndex={-1}\n >\n <ChevronUp className=\"size-3\" />\n </button>\n <button\n type=\"button\"\n onClick={handleDecrement}\n disabled={props.disabled}\n className={cn(\n \"h-1/2 w-6 flex items-center justify-center rounded cursor-pointer hover:scale-150 transition-transform\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n )}\n tabIndex={-1}\n >\n <ChevronDown className=\"size-3\" />\n </button>\n </div>\n )}\n\n {/* Clear Button */}\n {clearable &&\n (charCount > 0 || props?.value) &&\n !props.disabled &&\n type !== \"number\" && (\n <button\n type=\"button\"\n tabIndex={-1}\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 p-1 rounded hover:bg-accent transition-colors cursor-pointer\",\n type === \"password\"\n ? suffixIcon\n ? \"right-14\"\n : \"right-10\"\n : suffixIcon\n ? \"right-10\"\n : \"right-2\"\n )}\n onClick={handleClear}\n disabled={props.disabled}\n >\n <X className=\"size-4\" />\n </button>\n )}\n\n {/* Show/Hide Password Button */}\n {type === \"password\" && (\n <button\n type=\"button\"\n tabIndex={-1}\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 p-1 rounded hover:bg-accent transition-colors\",\n suffixIcon ? \"right-10\" : \"right-2\"\n )}\n onClick={() => setShowPassword((prev) => !prev)}\n disabled={props.disabled}\n >\n {showPassword ? (\n <EyeOff className=\"size-4\" />\n ) : (\n <Eye className=\"size-4\" />\n )}\n </button>\n )}\n\n {/* Suffix Icon */}\n {suffixIcon && (\n <div\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-muted-foreground leading-0\",\n iconPosition.right\n )}\n >\n {React.isValidElement(suffixIcon)\n ? React.cloneElement(suffixIcon, {\n className: cn(\n iconSizeClass,\n (suffixIcon.props as any)?.className\n ),\n } as Partial<unknown>)\n : suffixIcon}\n </div>\n )}\n </div>\n\n {(helperText || (showCharCount && typeof maxLength === \"number\")) && (\n <div className=\"flex items-center justify-between text-xs gap-2\">\n {helperText && (\n <p\n className={cn(\n \"text-xs\",\n state ? helperTextStyles?.[state] : \"\"\n )}\n >\n {helperText}\n </p>\n )}\n {showCharCount && typeof maxLength === \"number\" && (\n <span className=\"ml-auto text-muted-foreground\">\n {charCount} / {maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\nexport default Input;\n"],"names":["Input","React","className","label","helperText","state","size","isFloatLabel","type","mask","maskOptions","maxLength","showCharCount","infoTooltip","clearable","onClear","prefixIcon","suffixIcon","placeholder","props","ref","charCount","setCharCount","handleInput","e","handleClear","innerRef","event","inputId","combinedRef","element","maskRefCallback","withMask","showPassword","setShowPassword","helperTextStyles","currentSize","padding","sizeMap","iconSizeClass","getRightPadding","hasBuiltInSuffix","iconPosition","handleIncrement","step","max","currentValue","newValue","handleDecrement","min","jsx","jsxs","cn","Label","Tooltip","Info","SInput","FloatingLabel","ChevronUp","ChevronDown","X","prev","EyeOff","Eye"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/Input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/Input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAQhD,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAKxD,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,GAAG;IACzE,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE;QACZ,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,GAAG,OAAO,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B,CAAC;AAEF,QAAA,MAAM,KAAK,kGAoZV,CAAC;AAGF,eAAe,KAAK,CAAC"}
|