@zentauri-ui/zentauri-components 0.0.93 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -34
- package/dist/chunk-B23TPTVG.mjs +11 -0
- package/dist/chunk-B23TPTVG.mjs.map +1 -0
- package/dist/{chunk-BZSIXBA7.js → chunk-BITDSQMR.js} +8 -6
- package/dist/chunk-BITDSQMR.js.map +1 -0
- package/dist/{chunk-VJHD7QZH.mjs → chunk-BORK3BJO.mjs} +4 -7
- package/dist/chunk-BORK3BJO.mjs.map +1 -0
- package/dist/chunk-WZ2GOU2J.js +13 -0
- package/dist/chunk-WZ2GOU2J.js.map +1 -0
- package/dist/ui/accordion.d.mts +1 -1
- package/dist/ui/accordion.d.ts +1 -1
- package/dist/ui/accordion.js +80 -61
- package/dist/ui/accordion.js.map +1 -1
- package/dist/ui/accordion.mjs +46 -39
- package/dist/ui/accordion.mjs.map +1 -1
- package/dist/ui/alert.d.mts +1 -1
- package/dist/ui/alert.d.ts +1 -1
- package/dist/ui/alert.js +57 -46
- package/dist/ui/alert.js.map +1 -1
- package/dist/ui/alert.mjs +28 -30
- package/dist/ui/alert.mjs.map +1 -1
- package/dist/ui/avatar.d.mts +59 -0
- package/dist/ui/avatar.d.ts +59 -0
- package/dist/ui/avatar.js +221 -0
- package/dist/ui/avatar.js.map +1 -0
- package/dist/ui/avatar.mjs +211 -0
- package/dist/ui/avatar.mjs.map +1 -0
- package/dist/ui/badge.js +20 -25
- package/dist/ui/badge.js.map +1 -1
- package/dist/ui/badge.mjs +8 -20
- package/dist/ui/badge.mjs.map +1 -1
- package/dist/ui/breadcrumb.d.mts +71 -0
- package/dist/ui/breadcrumb.d.ts +71 -0
- package/dist/ui/breadcrumb.js +174 -0
- package/dist/ui/breadcrumb.js.map +1 -0
- package/dist/ui/breadcrumb.mjs +161 -0
- package/dist/ui/breadcrumb.mjs.map +1 -0
- package/dist/ui/buttons.js +19 -21
- package/dist/ui/buttons.js.map +1 -1
- package/dist/ui/buttons.mjs +8 -18
- package/dist/ui/buttons.mjs.map +1 -1
- package/dist/ui/card.js +59 -54
- package/dist/ui/card.js.map +1 -1
- package/dist/ui/card.mjs +29 -39
- package/dist/ui/card.mjs.map +1 -1
- package/dist/ui/divider.js +39 -35
- package/dist/ui/divider.js.map +1 -1
- package/dist/ui/divider.mjs +18 -23
- package/dist/ui/divider.mjs.map +1 -1
- package/dist/ui/drawer.d.mts +1 -1
- package/dist/ui/drawer.d.ts +1 -1
- package/dist/ui/drawer.js +106 -73
- package/dist/ui/drawer.js.map +1 -1
- package/dist/ui/drawer.mjs +64 -45
- package/dist/ui/drawer.mjs.map +1 -1
- package/dist/ui/dropdown.js +42 -48
- package/dist/ui/dropdown.js.map +1 -1
- package/dist/ui/dropdown.mjs +13 -29
- package/dist/ui/dropdown.mjs.map +1 -1
- package/dist/ui/empty-state.d.mts +3 -3
- package/dist/ui/empty-state.d.ts +3 -3
- package/dist/ui/empty-state.js +83 -59
- package/dist/ui/empty-state.js.map +1 -1
- package/dist/ui/empty-state.mjs +64 -52
- package/dist/ui/empty-state.mjs.map +1 -1
- package/dist/ui/file-upload.d.mts +32 -0
- package/dist/ui/file-upload.d.ts +32 -0
- package/dist/ui/file-upload.js +142 -0
- package/dist/ui/file-upload.js.map +1 -0
- package/dist/ui/file-upload.mjs +139 -0
- package/dist/ui/file-upload.mjs.map +1 -0
- package/dist/ui/inputs.js +26 -31
- package/dist/ui/inputs.js.map +1 -1
- package/dist/ui/inputs.mjs +8 -19
- package/dist/ui/inputs.mjs.map +1 -1
- package/dist/ui/modal.d.mts +1 -1
- package/dist/ui/modal.d.ts +1 -1
- package/dist/ui/modal.js +116 -78
- package/dist/ui/modal.js.map +1 -1
- package/dist/ui/modal.mjs +74 -51
- package/dist/ui/modal.mjs.map +1 -1
- package/dist/ui/pagination.js +47 -60
- package/dist/ui/pagination.js.map +1 -1
- package/dist/ui/pagination.mjs +10 -32
- package/dist/ui/pagination.mjs.map +1 -1
- package/dist/ui/progress.js +70 -58
- package/dist/ui/progress.js.map +1 -1
- package/dist/ui/progress.mjs +44 -43
- package/dist/ui/progress.mjs.map +1 -1
- package/dist/ui/select.js +73 -81
- package/dist/ui/select.js.map +1 -1
- package/dist/ui/select.mjs +38 -59
- package/dist/ui/select.mjs.map +1 -1
- package/dist/ui/skeleton.js +45 -50
- package/dist/ui/skeleton.js.map +1 -1
- package/dist/ui/skeleton.mjs +8 -25
- package/dist/ui/skeleton.mjs.map +1 -1
- package/dist/ui/slider.d.mts +83 -0
- package/dist/ui/slider.d.ts +83 -0
- package/dist/ui/slider.js +521 -0
- package/dist/ui/slider.js.map +1 -0
- package/dist/ui/slider.mjs +511 -0
- package/dist/ui/slider.mjs.map +1 -0
- package/dist/ui/spinner.js +37 -38
- package/dist/ui/spinner.js.map +1 -1
- package/dist/ui/spinner.mjs +11 -18
- package/dist/ui/spinner.mjs.map +1 -1
- package/dist/ui/stepper.d.mts +64 -0
- package/dist/ui/stepper.d.ts +64 -0
- package/dist/ui/stepper.js +207 -0
- package/dist/ui/stepper.js.map +1 -0
- package/dist/ui/stepper.mjs +198 -0
- package/dist/ui/stepper.mjs.map +1 -0
- package/dist/ui/table.js +77 -79
- package/dist/ui/table.js.map +1 -1
- package/dist/ui/table.mjs +43 -60
- package/dist/ui/table.mjs.map +1 -1
- package/dist/ui/tabs.js +75 -75
- package/dist/ui/tabs.js.map +1 -1
- package/dist/ui/tabs.mjs +48 -59
- package/dist/ui/tabs.mjs.map +1 -1
- package/dist/ui/toast.d.mts +2 -2
- package/dist/ui/toast.d.ts +2 -2
- package/dist/ui/toast.js +111 -88
- package/dist/ui/toast.js.map +1 -1
- package/dist/ui/toast.mjs +77 -69
- package/dist/ui/toast.mjs.map +1 -1
- package/dist/ui/toggle.js +26 -28
- package/dist/ui/toggle.js.map +1 -1
- package/dist/ui/toggle.mjs +12 -21
- package/dist/ui/toggle.mjs.map +1 -1
- package/dist/ui/tooltip.js +29 -36
- package/dist/ui/tooltip.js.map +1 -1
- package/dist/ui/tooltip.mjs +8 -23
- package/dist/ui/tooltip.mjs.map +1 -1
- package/package.json +5 -3
- package/dist/chunk-BZSIXBA7.js.map +0 -1
- package/dist/chunk-E5UX537J.js +0 -11
- package/dist/chunk-E5UX537J.js.map +0 -1
- package/dist/chunk-MEWYFWBX.mjs +0 -14
- package/dist/chunk-MEWYFWBX.mjs.map +0 -1
- package/dist/chunk-VJHD7QZH.mjs.map +0 -1
package/dist/ui/alert.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/alert/alert.tsx","../../src/ui/alert/animations.ts","../../src/ui/alert/variants.ts"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext, useMemo } from \"react\";\nimport { motion } from \"framer-motion\";\nimport { HiExclamationTriangle, HiInformationCircle, HiXMark } from \"react-icons/hi2\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport { alertAnimationPresets } from \"./animations\";\nimport type { AlertProps, AlertSectionProps, AlertSize } from \"./types\";\nimport {\n alertDescriptionVariants,\n alertTitleVariants,\n alertVariants,\n} from \"./variants\";\n\nconst AlertSizeContext = createContext<AlertSize>(\"md\");\n\nfunction useAlertSize(): AlertSize {\n const ctx = useContext(AlertSizeContext);\n if (!ctx) {\n throw new Error(\"useAlertSize must be used within an Alert\");\n }\n return ctx;\n}\n\nexport function Alert(props: AlertProps) {\n const {\n className,\n triggerClassName,\n appearance,\n size = \"md\",\n animation = \"none\",\n closable = false,\n onClose,\n closeLabel = \"Dismiss alert\",\n children,\n ref,\n ...rest\n } = props;\n const motionProps = alertAnimationPresets[animation];\n const live = appearance === \"error\" ? \"assertive\" : \"polite\";\n\n const ctx = useMemo(() => size ?? \"md\", [size]);\n\n return (\n <AlertSizeContext.Provider value={ctx}>\n <motion.div\n ref={ref}\n data-slot=\"alert\"\n role=\"alert\"\n aria-live={live}\n className={cn(\n alertVariants({ appearance, size }),\n closable ? \"pr-12\" : \"\",\n className,\n )}\n initial={animation === \"none\" ? false : undefined}\n {...motionProps}\n {...rest}\n >\n {children}\n {closable ? (\n <button\n type=\"button\"\n data-slot=\"alert-close\"\n aria-label={closeLabel}\n onClick={onClose}\n className={cn(\n \"absolute right-3 top-3 inline-flex size-8 items-center justify-center rounded-md text-slate-200 transition hover:bg-white/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30\",\n triggerClassName,\n )}\n >\n <HiXMark className=\"size-4\" aria-hidden />\n </button>\n ) : null}\n </motion.div>\n </AlertSizeContext.Provider>\n );\n}\n\nAlert.displayName = \"Alert\";\n\nexport function AlertIcon({ className, children }: AlertSectionProps) {\n return (\n <span data-slot=\"alert-icon\" className={cn(\"mt-0.5 shrink-0 text-current\", className)}>\n {children}\n </span>\n );\n}\n\nAlertIcon.displayName = \"AlertIcon\";\n\nexport function AlertTitle({ className, children }: AlertSectionProps) {\n const size = useAlertSize();\n return (\n <div data-slot=\"alert-title\" className={cn(alertTitleVariants({ size }), className)}>\n {children}\n </div>\n );\n}\n\nAlertTitle.displayName = \"AlertTitle\";\n\nexport function AlertDescription({ className, children }: AlertSectionProps) {\n const size = useAlertSize();\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(alertDescriptionVariants({ size }), className)}\n >\n {children}\n </div>\n );\n}\n\nAlertDescription.displayName = \"AlertDescription\";\n\nexport function AlertClose({\n className,\n children,\n \"aria-label\": ariaLabel = \"Dismiss alert\",\n onClick,\n}: AlertSectionProps & { onClick?: () => void; \"aria-label\"?: string }) {\n return (\n <button\n type=\"button\"\n data-slot=\"alert-close\"\n aria-label={ariaLabel}\n onClick={onClick}\n className={cn(\n \"inline-flex size-8 items-center justify-center rounded-md text-slate-200 transition hover:bg-white/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30\",\n className,\n )}\n >\n {children ?? <HiXMark className=\"size-4\" aria-hidden />}\n </button>\n );\n}\n\nAlertClose.displayName = \"AlertClose\";\n\nexport function AlertDefaultIcon({ appearance }: { appearance?: AlertProps[\"appearance\"] }) {\n if (appearance === \"error\") {\n return <HiExclamationTriangle className=\"size-5\" aria-hidden />;\n }\n return <HiInformationCircle className=\"size-5\" aria-hidden />;\n}\n","import type { HTMLMotionProps } from \"framer-motion\";\n\nimport type { AlertAnimation } from \"./types\";\n\ntype AlertPresetMotionProps = Pick<\n HTMLMotionProps<\"div\">,\n \"initial\" | \"animate\" | \"transition\"\n>;\n\nexport type AlertAnimationPresets = Record<AlertAnimation, AlertPresetMotionProps>;\n\nexport const alertAnimationPresets: AlertAnimationPresets = {\n none: {},\n \"slide-down\": {\n initial: { y: -8, opacity: 0 },\n animate: { y: 0, opacity: 1 },\n transition: { type: \"spring\", stiffness: 420, damping: 30 },\n },\n fade: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n transition: { duration: 0.2 },\n },\n pop: {\n initial: { scale: 0.96, opacity: 0 },\n animate: { scale: 1, opacity: 1 },\n transition: { type: \"spring\", stiffness: 520, damping: 28 },\n },\n};\n","import { cva } from \"class-variance-authority\";\n\nexport const alertVariants = cva(\n \"relative flex w-full gap-3 border text-sm ring-offset-slate-950 transition-colors\",\n {\n variants: {\n appearance: {\n default: \"border-white/10 bg-white/5 text-slate-50\",\n success: \"border-emerald-500/40 bg-emerald-500/10 text-emerald-50\",\n warning: \"border-amber-500/40 bg-amber-500/10 text-amber-50\",\n error: \"border-rose-500/50 bg-rose-500/10 text-rose-50\",\n info: \"border-sky-500/40 bg-sky-500/10 text-sky-50\",\n ghost: \"border-transparent bg-transparent text-slate-200\",\n purple: \"border-purple-600 bg-purple-950/70 backdrop-blur-xl\",\n pink: \"border-pink-600 bg-pink-950/70 backdrop-blur-xl\",\n orange: \"border-orange-600 bg-orange-950/70 backdrop-blur-xl\",\n yellow: \"border-yellow-600 bg-yellow-950/70 backdrop-blur-xl\",\n teal: \"border-teal-600 bg-teal-950/70 backdrop-blur-xl\",\n indigo: \"border-indigo-600 bg-indigo-950/70 backdrop-blur-xl\",\n gray: \"border-gray-600 bg-gray-950/70 backdrop-blur-xl\",\n violet: \"border-violet-600 bg-violet-950/70 backdrop-blur-xl\",\n \"gradient-blue\": \"border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-green\": \"border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl\",\n \"gradient-red\": \"border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-yellow\": \"border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl\",\n \"gradient-purple\": \"border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-teal\": \"border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl\",\n \"gradient-indigo\": \"border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-pink\": \"border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl\",\n \"gradient-orange\": \"border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl\",\n },\n size: {\n sm: \"rounded-lg p-3\",\n md: \"rounded-xl p-4\",\n lg: \"rounded-2xl p-5 text-base\",\n },\n },\n defaultVariants: {\n appearance: \"default\",\n size: \"md\",\n },\n },\n);\n\nexport const alertTitleVariants = cva(\"font-semibold leading-tight\", {\n variants: {\n size: {\n sm: \"text-xs md:text-sm\",\n md: \"text-xs md:text-sm\",\n lg: \"text-xs md:text-sm\",\n },\n },\n defaultVariants: { size: \"md\" },\n});\n\nexport const alertDescriptionVariants = cva(\"text-slate-300\", {\n variants: {\n size: {\n sm: \"text-xs md:text-sm\",\n md: \"text-xs md:text-sm\",\n lg: \"text-xs md:text-sm\",\n },\n },\n defaultVariants: { size: \"md\" },\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/ui/alert/animations.ts","../../src/ui/alert/variants.ts","../../src/ui/alert/alert.tsx"],"names":[],"mappings":"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","file":"alert.mjs","sourcesContent":["import type { HTMLMotionProps } from \"framer-motion\";\n\nimport type { AlertAnimation } from \"./types\";\n\ntype AlertPresetMotionProps = Pick<\n HTMLMotionProps<\"div\">,\n \"initial\" | \"animate\" | \"transition\"\n>;\n\nexport type AlertAnimationPresets = Record<\n AlertAnimation,\n AlertPresetMotionProps\n>;\n\nexport const alertAnimationPresets: AlertAnimationPresets = {\n none: {},\n \"slide-down\": {\n initial: { y: -8, opacity: 0 },\n animate: { y: 0, opacity: 1 },\n transition: { type: \"spring\", stiffness: 420, damping: 30 },\n },\n fade: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n transition: { duration: 0.2 },\n },\n pop: {\n initial: { scale: 0.96, opacity: 0 },\n animate: { scale: 1, opacity: 1 },\n transition: { type: \"spring\", stiffness: 520, damping: 28 },\n },\n};\n","import { cva } from \"class-variance-authority\";\n\nexport const alertVariants = cva(\n \"relative flex w-full gap-3 border text-sm ring-offset-slate-950 transition-colors\",\n {\n variants: {\n appearance: {\n default: \"border-white/10 bg-white/5 text-slate-50\",\n success: \"border-emerald-500/40 bg-emerald-500/10 text-emerald-50\",\n warning: \"border-amber-500/40 bg-amber-500/10 text-amber-50\",\n error: \"border-rose-500/50 bg-rose-500/10 text-rose-50\",\n info: \"border-sky-500/40 bg-sky-500/10 text-sky-50\",\n ghost: \"border-transparent bg-transparent text-slate-200\",\n purple: \"border-purple-600 bg-purple-950/70 backdrop-blur-xl\",\n pink: \"border-pink-600 bg-pink-950/70 backdrop-blur-xl\",\n orange: \"border-orange-600 bg-orange-950/70 backdrop-blur-xl\",\n yellow: \"border-yellow-600 bg-yellow-950/70 backdrop-blur-xl\",\n teal: \"border-teal-600 bg-teal-950/70 backdrop-blur-xl\",\n indigo: \"border-indigo-600 bg-indigo-950/70 backdrop-blur-xl\",\n gray: \"border-gray-600 bg-gray-950/70 backdrop-blur-xl\",\n violet: \"border-violet-600 bg-violet-950/70 backdrop-blur-xl\",\n \"gradient-blue\":\n \"border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-green\":\n \"border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl\",\n \"gradient-red\":\n \"border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-yellow\":\n \"border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl\",\n \"gradient-purple\":\n \"border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-teal\":\n \"border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl\",\n \"gradient-indigo\":\n \"border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-pink\":\n \"border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl\",\n \"gradient-orange\":\n \"border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl\",\n },\n size: {\n sm: \"rounded-lg p-3\",\n md: \"rounded-xl p-4\",\n lg: \"rounded-2xl p-5 text-base\",\n },\n },\n defaultVariants: {\n appearance: \"default\",\n size: \"md\",\n },\n },\n);\n\nexport const alertTitleVariants = cva(\"font-semibold leading-tight\", {\n variants: {\n size: {\n sm: \"text-xs md:text-sm\",\n md: \"text-xs md:text-sm\",\n lg: \"text-xs md:text-sm\",\n },\n },\n defaultVariants: { size: \"md\" },\n});\n\nexport const alertDescriptionVariants = cva(\"text-slate-300\", {\n variants: {\n size: {\n sm: \"text-xs md:text-sm\",\n md: \"text-xs md:text-sm\",\n lg: \"text-xs md:text-sm\",\n },\n },\n defaultVariants: { size: \"md\" },\n});\n","\"use client\";\n\nimport { createContext, useContext, useMemo } from \"react\";\nimport { motion } from \"framer-motion\";\nimport {\n HiExclamationTriangle,\n HiInformationCircle,\n HiXMark,\n} from \"react-icons/hi2\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport { alertAnimationPresets } from \"./animations\";\nimport type { AlertProps, AlertSectionProps, AlertSize } from \"./types\";\nimport {\n alertDescriptionVariants,\n alertTitleVariants,\n alertVariants,\n} from \"./variants\";\n\nconst AlertSizeContext = createContext<AlertSize>(\"md\");\n\nfunction useAlertSize(): AlertSize {\n const ctx = useContext(AlertSizeContext);\n if (!ctx) {\n throw new Error(\"useAlertSize must be used within an Alert\");\n }\n return ctx;\n}\n\nexport function Alert(props: AlertProps) {\n const {\n className,\n triggerClassName,\n appearance,\n size = \"md\",\n animation = \"none\",\n closable = false,\n onClose,\n closeLabel = \"Dismiss alert\",\n children,\n ref,\n ...rest\n } = props;\n const motionProps = alertAnimationPresets[animation];\n const live = appearance === \"error\" ? \"assertive\" : \"polite\";\n\n const ctx = useMemo(() => size ?? \"md\", [size]);\n\n return (\n <AlertSizeContext.Provider value={ctx}>\n <motion.div\n ref={ref}\n data-slot=\"alert\"\n role=\"alert\"\n aria-live={live}\n className={cn(\n alertVariants({ appearance, size }),\n closable ? \"pr-12\" : \"\",\n className,\n )}\n initial={animation === \"none\" ? false : undefined}\n {...motionProps}\n {...rest}\n >\n {children}\n {closable ? (\n <button\n type=\"button\"\n data-slot=\"alert-close\"\n aria-label={closeLabel}\n onClick={onClose}\n className={cn(\n \"absolute right-3 top-3 inline-flex size-8 items-center justify-center rounded-md text-slate-200 transition hover:bg-white/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30\",\n triggerClassName,\n )}\n >\n <HiXMark className=\"size-4\" aria-hidden />\n </button>\n ) : null}\n </motion.div>\n </AlertSizeContext.Provider>\n );\n}\n\nAlert.displayName = \"Alert\";\n\nexport function AlertIcon({ className, children }: AlertSectionProps) {\n return (\n <span\n data-slot=\"alert-icon\"\n className={cn(\"mt-0.5 shrink-0 text-current\", className)}\n >\n {children}\n </span>\n );\n}\n\nAlertIcon.displayName = \"AlertIcon\";\n\nexport function AlertTitle({ className, children }: AlertSectionProps) {\n const size = useAlertSize();\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(alertTitleVariants({ size }), className)}\n >\n {children}\n </div>\n );\n}\n\nAlertTitle.displayName = \"AlertTitle\";\n\nexport function AlertDescription({ className, children }: AlertSectionProps) {\n const size = useAlertSize();\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(alertDescriptionVariants({ size }), className)}\n >\n {children}\n </div>\n );\n}\n\nAlertDescription.displayName = \"AlertDescription\";\n\nexport function AlertClose({\n className,\n children,\n \"aria-label\": ariaLabel = \"Dismiss alert\",\n onClick,\n}: AlertSectionProps & { onClick?: () => void; \"aria-label\"?: string }) {\n return (\n <button\n type=\"button\"\n data-slot=\"alert-close\"\n aria-label={ariaLabel}\n onClick={onClick}\n className={cn(\n \"inline-flex size-8 items-center justify-center rounded-md text-slate-200 transition hover:bg-white/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30\",\n className,\n )}\n >\n {children ?? <HiXMark className=\"size-4\" aria-hidden />}\n </button>\n );\n}\n\nAlertClose.displayName = \"AlertClose\";\n\nexport function AlertDefaultIcon({\n appearance,\n}: {\n appearance?: AlertProps[\"appearance\"];\n}) {\n if (appearance === \"error\") {\n return <HiExclamationTriangle className=\"size-5\" aria-hidden />;\n }\n return <HiInformationCircle className=\"size-5\" aria-hidden />;\n}\n"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { HTMLMotionProps } from 'framer-motion';
|
|
2
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
import { VariantProps } from 'class-variance-authority';
|
|
4
|
+
import { ReactNode, ComponentPropsWithoutRef } from 'react';
|
|
5
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
6
|
+
|
|
7
|
+
type AvatarAnimation = "none" | "subtle";
|
|
8
|
+
type AvatarAnimationPresets = Record<AvatarAnimation, Pick<HTMLMotionProps<"span">, "whileHover" | "whileTap" | "transition" | "initial">>;
|
|
9
|
+
declare const avatarAnimationPresets: AvatarAnimationPresets;
|
|
10
|
+
|
|
11
|
+
declare const avatarVariants: (props?: ({
|
|
12
|
+
appearance?: "default" | "muted" | "sky" | "rose" | "purple" | "pink" | "orange" | "yellow" | "teal" | "indigo" | "emerald" | "gray" | "amber" | "violet" | "gradient-blue" | "gradient-green" | "gradient-red" | "gradient-yellow" | "gradient-purple" | "gradient-teal" | "gradient-indigo" | "gradient-pink" | "gradient-orange" | null | undefined;
|
|
13
|
+
size?: "sm" | "md" | "lg" | "xl" | null | undefined;
|
|
14
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
15
|
+
declare const avatarImageVariants: (props?: class_variance_authority_types.ClassProp | undefined) => string;
|
|
16
|
+
declare const avatarFallbackVariants: (props?: class_variance_authority_types.ClassProp | undefined) => string;
|
|
17
|
+
declare const avatarGroupVariants: (props?: class_variance_authority_types.ClassProp | undefined) => string;
|
|
18
|
+
|
|
19
|
+
type AvatarVariantProps = VariantProps<typeof avatarVariants>;
|
|
20
|
+
type AvatarProps = AvatarVariantProps & Omit<HTMLMotionProps<"span">, "children"> & {
|
|
21
|
+
animation?: AvatarAnimation;
|
|
22
|
+
appearance?: AvatarVariantProps["appearance"];
|
|
23
|
+
children?: ReactNode;
|
|
24
|
+
};
|
|
25
|
+
type AvatarImageProps = ComponentPropsWithoutRef<"img">;
|
|
26
|
+
type AvatarFallbackProps = ComponentPropsWithoutRef<"span"> & {
|
|
27
|
+
delayMs?: number;
|
|
28
|
+
};
|
|
29
|
+
type AvatarGroupProps = ComponentPropsWithoutRef<"div"> & {
|
|
30
|
+
/** Max avatars before +N overflow label */
|
|
31
|
+
max?: number;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
declare function Avatar({ className, size, appearance, animation, children, ref, ...rest }: AvatarProps & {
|
|
35
|
+
ref?: React.Ref<HTMLSpanElement>;
|
|
36
|
+
}): react_jsx_runtime.JSX.Element;
|
|
37
|
+
declare namespace Avatar {
|
|
38
|
+
var displayName: string;
|
|
39
|
+
}
|
|
40
|
+
declare function AvatarImage({ className, onLoad, onError, ref, ...rest }: AvatarImageProps & {
|
|
41
|
+
ref?: React.Ref<HTMLImageElement>;
|
|
42
|
+
}): react_jsx_runtime.JSX.Element;
|
|
43
|
+
declare namespace AvatarImage {
|
|
44
|
+
var displayName: string;
|
|
45
|
+
}
|
|
46
|
+
declare function AvatarFallback({ className, delayMs, ref, ...rest }: AvatarFallbackProps & {
|
|
47
|
+
ref?: React.Ref<HTMLSpanElement>;
|
|
48
|
+
}): react_jsx_runtime.JSX.Element | null;
|
|
49
|
+
declare namespace AvatarFallback {
|
|
50
|
+
var displayName: string;
|
|
51
|
+
}
|
|
52
|
+
declare function AvatarGroup({ className, max, children, ref, ...rest }: AvatarGroupProps & {
|
|
53
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
54
|
+
}): react_jsx_runtime.JSX.Element;
|
|
55
|
+
declare namespace AvatarGroup {
|
|
56
|
+
var displayName: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { Avatar, type AvatarAnimation, type AvatarAnimationPresets, AvatarFallback, type AvatarFallbackProps, AvatarGroup, type AvatarGroupProps, AvatarImage, type AvatarImageProps, type AvatarProps, avatarAnimationPresets, avatarFallbackVariants, avatarGroupVariants, avatarImageVariants, avatarVariants };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { HTMLMotionProps } from 'framer-motion';
|
|
2
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
import { VariantProps } from 'class-variance-authority';
|
|
4
|
+
import { ReactNode, ComponentPropsWithoutRef } from 'react';
|
|
5
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
6
|
+
|
|
7
|
+
type AvatarAnimation = "none" | "subtle";
|
|
8
|
+
type AvatarAnimationPresets = Record<AvatarAnimation, Pick<HTMLMotionProps<"span">, "whileHover" | "whileTap" | "transition" | "initial">>;
|
|
9
|
+
declare const avatarAnimationPresets: AvatarAnimationPresets;
|
|
10
|
+
|
|
11
|
+
declare const avatarVariants: (props?: ({
|
|
12
|
+
appearance?: "default" | "muted" | "sky" | "rose" | "purple" | "pink" | "orange" | "yellow" | "teal" | "indigo" | "emerald" | "gray" | "amber" | "violet" | "gradient-blue" | "gradient-green" | "gradient-red" | "gradient-yellow" | "gradient-purple" | "gradient-teal" | "gradient-indigo" | "gradient-pink" | "gradient-orange" | null | undefined;
|
|
13
|
+
size?: "sm" | "md" | "lg" | "xl" | null | undefined;
|
|
14
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
15
|
+
declare const avatarImageVariants: (props?: class_variance_authority_types.ClassProp | undefined) => string;
|
|
16
|
+
declare const avatarFallbackVariants: (props?: class_variance_authority_types.ClassProp | undefined) => string;
|
|
17
|
+
declare const avatarGroupVariants: (props?: class_variance_authority_types.ClassProp | undefined) => string;
|
|
18
|
+
|
|
19
|
+
type AvatarVariantProps = VariantProps<typeof avatarVariants>;
|
|
20
|
+
type AvatarProps = AvatarVariantProps & Omit<HTMLMotionProps<"span">, "children"> & {
|
|
21
|
+
animation?: AvatarAnimation;
|
|
22
|
+
appearance?: AvatarVariantProps["appearance"];
|
|
23
|
+
children?: ReactNode;
|
|
24
|
+
};
|
|
25
|
+
type AvatarImageProps = ComponentPropsWithoutRef<"img">;
|
|
26
|
+
type AvatarFallbackProps = ComponentPropsWithoutRef<"span"> & {
|
|
27
|
+
delayMs?: number;
|
|
28
|
+
};
|
|
29
|
+
type AvatarGroupProps = ComponentPropsWithoutRef<"div"> & {
|
|
30
|
+
/** Max avatars before +N overflow label */
|
|
31
|
+
max?: number;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
declare function Avatar({ className, size, appearance, animation, children, ref, ...rest }: AvatarProps & {
|
|
35
|
+
ref?: React.Ref<HTMLSpanElement>;
|
|
36
|
+
}): react_jsx_runtime.JSX.Element;
|
|
37
|
+
declare namespace Avatar {
|
|
38
|
+
var displayName: string;
|
|
39
|
+
}
|
|
40
|
+
declare function AvatarImage({ className, onLoad, onError, ref, ...rest }: AvatarImageProps & {
|
|
41
|
+
ref?: React.Ref<HTMLImageElement>;
|
|
42
|
+
}): react_jsx_runtime.JSX.Element;
|
|
43
|
+
declare namespace AvatarImage {
|
|
44
|
+
var displayName: string;
|
|
45
|
+
}
|
|
46
|
+
declare function AvatarFallback({ className, delayMs, ref, ...rest }: AvatarFallbackProps & {
|
|
47
|
+
ref?: React.Ref<HTMLSpanElement>;
|
|
48
|
+
}): react_jsx_runtime.JSX.Element | null;
|
|
49
|
+
declare namespace AvatarFallback {
|
|
50
|
+
var displayName: string;
|
|
51
|
+
}
|
|
52
|
+
declare function AvatarGroup({ className, max, children, ref, ...rest }: AvatarGroupProps & {
|
|
53
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
54
|
+
}): react_jsx_runtime.JSX.Element;
|
|
55
|
+
declare namespace AvatarGroup {
|
|
56
|
+
var displayName: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { Avatar, type AvatarAnimation, type AvatarAnimationPresets, AvatarFallback, type AvatarFallbackProps, AvatarGroup, type AvatarGroupProps, AvatarImage, type AvatarImageProps, type AvatarProps, avatarAnimationPresets, avatarFallbackVariants, avatarGroupVariants, avatarImageVariants, avatarVariants };
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkWZ2GOU2J_js = require('../chunk-WZ2GOU2J.js');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var framerMotion = require('framer-motion');
|
|
7
|
+
var classVarianceAuthority = require('class-variance-authority');
|
|
8
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
9
|
+
|
|
10
|
+
// src/ui/avatar/animations.ts
|
|
11
|
+
var avatarAnimationPresets = {
|
|
12
|
+
none: { initial: false },
|
|
13
|
+
subtle: {
|
|
14
|
+
initial: false,
|
|
15
|
+
whileHover: { scale: 1.03 },
|
|
16
|
+
whileTap: { scale: 0.98 },
|
|
17
|
+
transition: { type: "spring", stiffness: 420, damping: 28 }
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
var avatarVariants = classVarianceAuthority.cva(
|
|
21
|
+
"relative flex shrink-0 overflow-hidden rounded-full border border-white/10 bg-white/10 text-slate-200",
|
|
22
|
+
{
|
|
23
|
+
variants: {
|
|
24
|
+
appearance: {
|
|
25
|
+
default: "border-white/10 bg-white/10 text-slate-200",
|
|
26
|
+
muted: "border-black/40 bg-slate-950 dark:border-white/10 dark:bg-slate-950/40 text-slate-200",
|
|
27
|
+
sky: "border-sky-600 bg-sky-600/[0.03] text-slate-200",
|
|
28
|
+
rose: "border-rose-600 bg-rose-600/[0.03] text-slate-200",
|
|
29
|
+
purple: "border-purple-600 bg-purple-600/[0.03] text-slate-200",
|
|
30
|
+
pink: "border-pink-600 bg-pink-600/[0.03] text-slate-200",
|
|
31
|
+
orange: "border-orange-600 bg-orange-600/[0.03] text-slate-200",
|
|
32
|
+
yellow: "border-yellow-600 bg-yellow-600/[0.03] text-slate-200",
|
|
33
|
+
teal: "border-teal-600 bg-teal-600/[0.03] text-slate-200",
|
|
34
|
+
indigo: "border-indigo-600 bg-indigo-600/[0.03] text-slate-200",
|
|
35
|
+
emerald: "border-emerald-600 bg-emerald-600/[0.03] text-slate-200",
|
|
36
|
+
gray: "border-gray-600 bg-gray-600/[0.03] text-slate-200",
|
|
37
|
+
amber: "border-amber-600 bg-amber-600/[0.03] text-slate-200",
|
|
38
|
+
violet: "border-violet-600 bg-violet-600/[0.03] text-slate-200",
|
|
39
|
+
"gradient-blue": "border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl text-slate-200",
|
|
40
|
+
"gradient-green": "border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl text-slate-200",
|
|
41
|
+
"gradient-red": "border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl text-slate-200",
|
|
42
|
+
"gradient-yellow": "border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl text-slate-200",
|
|
43
|
+
"gradient-purple": "border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl text-slate-200",
|
|
44
|
+
"gradient-teal": "border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl text-slate-200",
|
|
45
|
+
"gradient-indigo": "border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl text-slate-200",
|
|
46
|
+
"gradient-pink": "border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl text-slate-200",
|
|
47
|
+
"gradient-orange": "border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl text-slate-200"
|
|
48
|
+
},
|
|
49
|
+
size: {
|
|
50
|
+
sm: "size-8 text-xs",
|
|
51
|
+
md: "size-10 text-sm",
|
|
52
|
+
lg: "size-12 text-base",
|
|
53
|
+
xl: "size-16 text-lg"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
defaultVariants: {
|
|
57
|
+
size: "md",
|
|
58
|
+
appearance: "default"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
var avatarImageVariants = classVarianceAuthority.cva("aspect-square size-full object-cover");
|
|
63
|
+
var avatarFallbackVariants = classVarianceAuthority.cva(
|
|
64
|
+
"flex size-full items-center justify-center bg-slate-800 font-medium text-slate-100"
|
|
65
|
+
);
|
|
66
|
+
var avatarGroupVariants = classVarianceAuthority.cva("flex items-center [&_[data-slot=avatar]]:-ml-2 [&_[data-slot=avatar]]:ring-2 [&_[data-slot=avatar]]:ring-slate-950 [&_[data-slot=avatar]]:first:ml-0");
|
|
67
|
+
var AvatarContext = react.createContext(null);
|
|
68
|
+
function useAvatarContext(component) {
|
|
69
|
+
const ctx = react.useContext(AvatarContext);
|
|
70
|
+
if (!ctx) {
|
|
71
|
+
throw new Error(`${component} must be used within <Avatar>`);
|
|
72
|
+
}
|
|
73
|
+
return ctx;
|
|
74
|
+
}
|
|
75
|
+
function Avatar({
|
|
76
|
+
className,
|
|
77
|
+
size,
|
|
78
|
+
appearance,
|
|
79
|
+
animation = "none",
|
|
80
|
+
children,
|
|
81
|
+
ref,
|
|
82
|
+
...rest
|
|
83
|
+
}) {
|
|
84
|
+
const [imageStatus, setImageStatus] = react.useState("idle");
|
|
85
|
+
const motionProps = avatarAnimationPresets[animation];
|
|
86
|
+
const ctx = react.useMemo(
|
|
87
|
+
() => ({ imageStatus, setImageStatus }),
|
|
88
|
+
[imageStatus]
|
|
89
|
+
);
|
|
90
|
+
return /* @__PURE__ */ jsxRuntime.jsx(AvatarContext.Provider, { value: ctx, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
91
|
+
framerMotion.motion.span,
|
|
92
|
+
{
|
|
93
|
+
ref,
|
|
94
|
+
"data-slot": "avatar",
|
|
95
|
+
className: chunkWZ2GOU2J_js.cn(avatarVariants({ size, appearance }), className),
|
|
96
|
+
...motionProps,
|
|
97
|
+
...rest,
|
|
98
|
+
children
|
|
99
|
+
}
|
|
100
|
+
) });
|
|
101
|
+
}
|
|
102
|
+
Avatar.displayName = "Avatar";
|
|
103
|
+
function AvatarImage({
|
|
104
|
+
className,
|
|
105
|
+
onLoad,
|
|
106
|
+
onError,
|
|
107
|
+
ref,
|
|
108
|
+
...rest
|
|
109
|
+
}) {
|
|
110
|
+
const { setImageStatus } = useAvatarContext("AvatarImage");
|
|
111
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
112
|
+
"img",
|
|
113
|
+
{
|
|
114
|
+
ref,
|
|
115
|
+
"data-slot": "avatar-image",
|
|
116
|
+
className: chunkWZ2GOU2J_js.cn(avatarImageVariants(), className),
|
|
117
|
+
onLoad: (e) => {
|
|
118
|
+
setImageStatus("loaded");
|
|
119
|
+
onLoad?.(e);
|
|
120
|
+
},
|
|
121
|
+
onError: (e) => {
|
|
122
|
+
setImageStatus("error");
|
|
123
|
+
onError?.(e);
|
|
124
|
+
},
|
|
125
|
+
...rest
|
|
126
|
+
}
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
AvatarImage.displayName = "AvatarImage";
|
|
130
|
+
function AvatarFallback({
|
|
131
|
+
className,
|
|
132
|
+
delayMs = 0,
|
|
133
|
+
ref,
|
|
134
|
+
...rest
|
|
135
|
+
}) {
|
|
136
|
+
const { imageStatus } = useAvatarContext("AvatarFallback");
|
|
137
|
+
const [show, setShow] = react.useState(delayMs === 0);
|
|
138
|
+
react.useEffect(() => {
|
|
139
|
+
if (imageStatus === "loaded") {
|
|
140
|
+
setShow(false);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (imageStatus === "error") {
|
|
144
|
+
setShow(true);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (delayMs <= 0) {
|
|
148
|
+
setShow(true);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const t = window.setTimeout(() => setShow(true), delayMs);
|
|
152
|
+
return () => window.clearTimeout(t);
|
|
153
|
+
}, [delayMs, imageStatus]);
|
|
154
|
+
if (!show) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
158
|
+
"span",
|
|
159
|
+
{
|
|
160
|
+
ref,
|
|
161
|
+
"data-slot": "avatar-fallback",
|
|
162
|
+
className: chunkWZ2GOU2J_js.cn(avatarFallbackVariants(), className),
|
|
163
|
+
...rest
|
|
164
|
+
}
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
AvatarFallback.displayName = "AvatarFallback";
|
|
168
|
+
function AvatarGroup({
|
|
169
|
+
className,
|
|
170
|
+
max,
|
|
171
|
+
children,
|
|
172
|
+
ref,
|
|
173
|
+
...rest
|
|
174
|
+
}) {
|
|
175
|
+
const childArray = react.useMemo(
|
|
176
|
+
() => react.Children.toArray(children).filter(react.isValidElement),
|
|
177
|
+
[children]
|
|
178
|
+
);
|
|
179
|
+
const visible = max !== void 0 ? childArray.slice(0, max) : childArray;
|
|
180
|
+
const overflow = max !== void 0 && childArray.length > max ? childArray.length - max : 0;
|
|
181
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
182
|
+
"div",
|
|
183
|
+
{
|
|
184
|
+
ref,
|
|
185
|
+
"data-slot": "avatar-group",
|
|
186
|
+
className: chunkWZ2GOU2J_js.cn(avatarGroupVariants(), className),
|
|
187
|
+
...rest,
|
|
188
|
+
children: [
|
|
189
|
+
visible,
|
|
190
|
+
overflow > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
191
|
+
"span",
|
|
192
|
+
{
|
|
193
|
+
"data-slot": "avatar-group-overflow",
|
|
194
|
+
className: chunkWZ2GOU2J_js.cn(
|
|
195
|
+
avatarVariants({ size: "md" }),
|
|
196
|
+
"z-10 grid place-items-center bg-slate-800 text-xs font-semibold text-white"
|
|
197
|
+
),
|
|
198
|
+
"aria-label": `${overflow} more`,
|
|
199
|
+
children: [
|
|
200
|
+
"+",
|
|
201
|
+
overflow
|
|
202
|
+
]
|
|
203
|
+
}
|
|
204
|
+
) : null
|
|
205
|
+
]
|
|
206
|
+
}
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
AvatarGroup.displayName = "AvatarGroup";
|
|
210
|
+
|
|
211
|
+
exports.Avatar = Avatar;
|
|
212
|
+
exports.AvatarFallback = AvatarFallback;
|
|
213
|
+
exports.AvatarGroup = AvatarGroup;
|
|
214
|
+
exports.AvatarImage = AvatarImage;
|
|
215
|
+
exports.avatarAnimationPresets = avatarAnimationPresets;
|
|
216
|
+
exports.avatarFallbackVariants = avatarFallbackVariants;
|
|
217
|
+
exports.avatarGroupVariants = avatarGroupVariants;
|
|
218
|
+
exports.avatarImageVariants = avatarImageVariants;
|
|
219
|
+
exports.avatarVariants = avatarVariants;
|
|
220
|
+
//# sourceMappingURL=avatar.js.map
|
|
221
|
+
//# sourceMappingURL=avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ui/avatar/animations.ts","../../src/ui/avatar/variants.ts","../../src/ui/avatar/avatar.tsx"],"names":["cva","createContext","useContext","useState","useMemo","jsx","motion","cn","useEffect","Children","isValidElement","jsxs"],"mappings":"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","file":"avatar.js","sourcesContent":["import type { HTMLMotionProps } from \"framer-motion\";\n\nexport type AvatarAnimation = \"none\" | \"subtle\";\n\nexport type AvatarAnimationPresets = Record<\n AvatarAnimation,\n Pick<\n HTMLMotionProps<\"span\">,\n \"whileHover\" | \"whileTap\" | \"transition\" | \"initial\"\n >\n>;\n\nexport const avatarAnimationPresets: AvatarAnimationPresets = {\n none: { initial: false },\n subtle: {\n initial: false,\n whileHover: { scale: 1.03 },\n whileTap: { scale: 0.98 },\n transition: { type: \"spring\", stiffness: 420, damping: 28 },\n },\n};\n","import { cva } from \"class-variance-authority\";\n\nexport const avatarVariants = cva(\n \"relative flex shrink-0 overflow-hidden rounded-full border border-white/10 bg-white/10 text-slate-200\",\n {\n variants: {\n appearance: {\n default: \"border-white/10 bg-white/10 text-slate-200\",\n muted: \"border-black/40 bg-slate-950 dark:border-white/10 dark:bg-slate-950/40 text-slate-200\",\n sky: \"border-sky-600 bg-sky-600/[0.03] text-slate-200\",\n rose: \"border-rose-600 bg-rose-600/[0.03] text-slate-200\",\n purple: \"border-purple-600 bg-purple-600/[0.03] text-slate-200\",\n pink: \"border-pink-600 bg-pink-600/[0.03] text-slate-200\",\n orange: \"border-orange-600 bg-orange-600/[0.03] text-slate-200\",\n yellow: \"border-yellow-600 bg-yellow-600/[0.03] text-slate-200\",\n teal: \"border-teal-600 bg-teal-600/[0.03] text-slate-200\",\n indigo: \"border-indigo-600 bg-indigo-600/[0.03] text-slate-200\",\n emerald: \"border-emerald-600 bg-emerald-600/[0.03] text-slate-200\",\n gray: \"border-gray-600 bg-gray-600/[0.03] text-slate-200\",\n amber: \"border-amber-600 bg-amber-600/[0.03] text-slate-200\",\n violet: \"border-violet-600 bg-violet-600/[0.03] text-slate-200\",\n \"gradient-blue\": \"border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-green\": \"border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-red\": \"border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-yellow\": \"border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-purple\": \"border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-teal\": \"border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-indigo\": \"border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-pink\": \"border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-orange\": \"border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl text-slate-200\",\n },\n size: {\n sm: \"size-8 text-xs\",\n md: \"size-10 text-sm\",\n lg: \"size-12 text-base\",\n xl: \"size-16 text-lg\",\n },\n },\n defaultVariants: {\n size: \"md\",\n appearance: \"default\",\n },\n },\n);\n\nexport const avatarImageVariants = cva(\"aspect-square size-full object-cover\");\n\nexport const avatarFallbackVariants = cva(\n \"flex size-full items-center justify-center bg-slate-800 font-medium text-slate-100\",\n);\n\nexport const avatarGroupVariants = cva(\"flex items-center [&_[data-slot=avatar]]:-ml-2 [&_[data-slot=avatar]]:ring-2 [&_[data-slot=avatar]]:ring-slate-950 [&_[data-slot=avatar]]:first:ml-0\");\n","\"use client\";\n\nimport {\n Children,\n createContext,\n isValidElement,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { motion } from \"framer-motion\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport { avatarAnimationPresets } from \"./animations\";\nimport type {\n AvatarFallbackProps,\n AvatarGroupProps,\n AvatarImageProps,\n AvatarProps,\n} from \"./types\";\nimport {\n avatarFallbackVariants,\n avatarGroupVariants,\n avatarImageVariants,\n avatarVariants,\n} from \"./variants\";\n\ntype ImageStatus = \"idle\" | \"loaded\" | \"error\";\n\ntype AvatarCtx = {\n imageStatus: ImageStatus;\n setImageStatus: (v: ImageStatus) => void;\n};\n\nconst AvatarContext = createContext<AvatarCtx | null>(null);\n\nfunction useAvatarContext(component: string): AvatarCtx {\n const ctx = useContext(AvatarContext);\n if (!ctx) {\n throw new Error(`${component} must be used within <Avatar>`);\n }\n return ctx;\n}\n\nexport function Avatar({\n className,\n size,\n appearance,\n animation = \"none\",\n children,\n ref,\n ...rest\n}: AvatarProps & { ref?: React.Ref<HTMLSpanElement> }) {\n const [imageStatus, setImageStatus] = useState<ImageStatus>(\"idle\");\n const motionProps = avatarAnimationPresets[animation];\n const ctx = useMemo(\n () => ({ imageStatus, setImageStatus }),\n [imageStatus],\n );\n\n return (\n <AvatarContext.Provider value={ctx}>\n <motion.span\n ref={ref}\n data-slot=\"avatar\"\n className={cn(avatarVariants({ size, appearance }), className)}\n {...motionProps}\n {...rest}\n >\n {children}\n </motion.span>\n </AvatarContext.Provider>\n );\n}\n\nAvatar.displayName = \"Avatar\";\n\nexport function AvatarImage({\n className,\n onLoad,\n onError,\n ref,\n ...rest\n}: AvatarImageProps & { ref?: React.Ref<HTMLImageElement> }) {\n const { setImageStatus } = useAvatarContext(\"AvatarImage\");\n\n return (\n <img\n ref={ref}\n data-slot=\"avatar-image\"\n className={cn(avatarImageVariants(), className)}\n onLoad={(e) => {\n setImageStatus(\"loaded\");\n onLoad?.(e);\n }}\n onError={(e) => {\n setImageStatus(\"error\");\n onError?.(e);\n }}\n {...rest}\n />\n );\n}\n\nAvatarImage.displayName = \"AvatarImage\";\n\nexport function AvatarFallback({\n className,\n delayMs = 0,\n ref,\n ...rest\n}: AvatarFallbackProps & { ref?: React.Ref<HTMLSpanElement> }) {\n const { imageStatus } = useAvatarContext(\"AvatarFallback\");\n const [show, setShow] = useState(delayMs === 0);\n\n useEffect(() => {\n if (imageStatus === \"loaded\") {\n setShow(false);\n return;\n }\n if (imageStatus === \"error\") {\n setShow(true);\n return;\n }\n if (delayMs <= 0) {\n setShow(true);\n return;\n }\n const t = window.setTimeout(() => setShow(true), delayMs);\n return () => window.clearTimeout(t);\n }, [delayMs, imageStatus]);\n\n if (!show) {\n return null;\n }\n\n return (\n <span\n ref={ref}\n data-slot=\"avatar-fallback\"\n className={cn(avatarFallbackVariants(), className)}\n {...rest}\n />\n );\n}\n\nAvatarFallback.displayName = \"AvatarFallback\";\n\nexport function AvatarGroup({\n className,\n max,\n children,\n ref,\n ...rest\n}: AvatarGroupProps & { ref?: React.Ref<HTMLDivElement> }) {\n const childArray = useMemo(\n () => Children.toArray(children).filter(isValidElement),\n [children],\n );\n const visible = max !== undefined ? childArray.slice(0, max) : childArray;\n const overflow =\n max !== undefined && childArray.length > max\n ? childArray.length - max\n : 0;\n\n return (\n <div\n ref={ref}\n data-slot=\"avatar-group\"\n className={cn(avatarGroupVariants(), className)}\n {...rest}\n >\n {visible}\n {overflow > 0 ? (\n <span\n data-slot=\"avatar-group-overflow\"\n className={cn(\n avatarVariants({ size: \"md\" }),\n \"z-10 grid place-items-center bg-slate-800 text-xs font-semibold text-white\",\n )}\n aria-label={`${overflow} more`}\n >\n +{overflow}\n </span>\n ) : null}\n </div>\n );\n}\n\nAvatarGroup.displayName = \"AvatarGroup\";\n"]}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from '../chunk-B23TPTVG.mjs';
|
|
3
|
+
import { createContext, useState, useMemo, useEffect, Children, isValidElement, useContext } from 'react';
|
|
4
|
+
import { motion } from 'framer-motion';
|
|
5
|
+
import { cva } from 'class-variance-authority';
|
|
6
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
// src/ui/avatar/animations.ts
|
|
9
|
+
var avatarAnimationPresets = {
|
|
10
|
+
none: { initial: false },
|
|
11
|
+
subtle: {
|
|
12
|
+
initial: false,
|
|
13
|
+
whileHover: { scale: 1.03 },
|
|
14
|
+
whileTap: { scale: 0.98 },
|
|
15
|
+
transition: { type: "spring", stiffness: 420, damping: 28 }
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
var avatarVariants = cva(
|
|
19
|
+
"relative flex shrink-0 overflow-hidden rounded-full border border-white/10 bg-white/10 text-slate-200",
|
|
20
|
+
{
|
|
21
|
+
variants: {
|
|
22
|
+
appearance: {
|
|
23
|
+
default: "border-white/10 bg-white/10 text-slate-200",
|
|
24
|
+
muted: "border-black/40 bg-slate-950 dark:border-white/10 dark:bg-slate-950/40 text-slate-200",
|
|
25
|
+
sky: "border-sky-600 bg-sky-600/[0.03] text-slate-200",
|
|
26
|
+
rose: "border-rose-600 bg-rose-600/[0.03] text-slate-200",
|
|
27
|
+
purple: "border-purple-600 bg-purple-600/[0.03] text-slate-200",
|
|
28
|
+
pink: "border-pink-600 bg-pink-600/[0.03] text-slate-200",
|
|
29
|
+
orange: "border-orange-600 bg-orange-600/[0.03] text-slate-200",
|
|
30
|
+
yellow: "border-yellow-600 bg-yellow-600/[0.03] text-slate-200",
|
|
31
|
+
teal: "border-teal-600 bg-teal-600/[0.03] text-slate-200",
|
|
32
|
+
indigo: "border-indigo-600 bg-indigo-600/[0.03] text-slate-200",
|
|
33
|
+
emerald: "border-emerald-600 bg-emerald-600/[0.03] text-slate-200",
|
|
34
|
+
gray: "border-gray-600 bg-gray-600/[0.03] text-slate-200",
|
|
35
|
+
amber: "border-amber-600 bg-amber-600/[0.03] text-slate-200",
|
|
36
|
+
violet: "border-violet-600 bg-violet-600/[0.03] text-slate-200",
|
|
37
|
+
"gradient-blue": "border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl text-slate-200",
|
|
38
|
+
"gradient-green": "border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl text-slate-200",
|
|
39
|
+
"gradient-red": "border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl text-slate-200",
|
|
40
|
+
"gradient-yellow": "border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl text-slate-200",
|
|
41
|
+
"gradient-purple": "border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl text-slate-200",
|
|
42
|
+
"gradient-teal": "border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl text-slate-200",
|
|
43
|
+
"gradient-indigo": "border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl text-slate-200",
|
|
44
|
+
"gradient-pink": "border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl text-slate-200",
|
|
45
|
+
"gradient-orange": "border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl text-slate-200"
|
|
46
|
+
},
|
|
47
|
+
size: {
|
|
48
|
+
sm: "size-8 text-xs",
|
|
49
|
+
md: "size-10 text-sm",
|
|
50
|
+
lg: "size-12 text-base",
|
|
51
|
+
xl: "size-16 text-lg"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
defaultVariants: {
|
|
55
|
+
size: "md",
|
|
56
|
+
appearance: "default"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
var avatarImageVariants = cva("aspect-square size-full object-cover");
|
|
61
|
+
var avatarFallbackVariants = cva(
|
|
62
|
+
"flex size-full items-center justify-center bg-slate-800 font-medium text-slate-100"
|
|
63
|
+
);
|
|
64
|
+
var avatarGroupVariants = cva("flex items-center [&_[data-slot=avatar]]:-ml-2 [&_[data-slot=avatar]]:ring-2 [&_[data-slot=avatar]]:ring-slate-950 [&_[data-slot=avatar]]:first:ml-0");
|
|
65
|
+
var AvatarContext = createContext(null);
|
|
66
|
+
function useAvatarContext(component) {
|
|
67
|
+
const ctx = useContext(AvatarContext);
|
|
68
|
+
if (!ctx) {
|
|
69
|
+
throw new Error(`${component} must be used within <Avatar>`);
|
|
70
|
+
}
|
|
71
|
+
return ctx;
|
|
72
|
+
}
|
|
73
|
+
function Avatar({
|
|
74
|
+
className,
|
|
75
|
+
size,
|
|
76
|
+
appearance,
|
|
77
|
+
animation = "none",
|
|
78
|
+
children,
|
|
79
|
+
ref,
|
|
80
|
+
...rest
|
|
81
|
+
}) {
|
|
82
|
+
const [imageStatus, setImageStatus] = useState("idle");
|
|
83
|
+
const motionProps = avatarAnimationPresets[animation];
|
|
84
|
+
const ctx = useMemo(
|
|
85
|
+
() => ({ imageStatus, setImageStatus }),
|
|
86
|
+
[imageStatus]
|
|
87
|
+
);
|
|
88
|
+
return /* @__PURE__ */ jsx(AvatarContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx(
|
|
89
|
+
motion.span,
|
|
90
|
+
{
|
|
91
|
+
ref,
|
|
92
|
+
"data-slot": "avatar",
|
|
93
|
+
className: cn(avatarVariants({ size, appearance }), className),
|
|
94
|
+
...motionProps,
|
|
95
|
+
...rest,
|
|
96
|
+
children
|
|
97
|
+
}
|
|
98
|
+
) });
|
|
99
|
+
}
|
|
100
|
+
Avatar.displayName = "Avatar";
|
|
101
|
+
function AvatarImage({
|
|
102
|
+
className,
|
|
103
|
+
onLoad,
|
|
104
|
+
onError,
|
|
105
|
+
ref,
|
|
106
|
+
...rest
|
|
107
|
+
}) {
|
|
108
|
+
const { setImageStatus } = useAvatarContext("AvatarImage");
|
|
109
|
+
return /* @__PURE__ */ jsx(
|
|
110
|
+
"img",
|
|
111
|
+
{
|
|
112
|
+
ref,
|
|
113
|
+
"data-slot": "avatar-image",
|
|
114
|
+
className: cn(avatarImageVariants(), className),
|
|
115
|
+
onLoad: (e) => {
|
|
116
|
+
setImageStatus("loaded");
|
|
117
|
+
onLoad?.(e);
|
|
118
|
+
},
|
|
119
|
+
onError: (e) => {
|
|
120
|
+
setImageStatus("error");
|
|
121
|
+
onError?.(e);
|
|
122
|
+
},
|
|
123
|
+
...rest
|
|
124
|
+
}
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
AvatarImage.displayName = "AvatarImage";
|
|
128
|
+
function AvatarFallback({
|
|
129
|
+
className,
|
|
130
|
+
delayMs = 0,
|
|
131
|
+
ref,
|
|
132
|
+
...rest
|
|
133
|
+
}) {
|
|
134
|
+
const { imageStatus } = useAvatarContext("AvatarFallback");
|
|
135
|
+
const [show, setShow] = useState(delayMs === 0);
|
|
136
|
+
useEffect(() => {
|
|
137
|
+
if (imageStatus === "loaded") {
|
|
138
|
+
setShow(false);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (imageStatus === "error") {
|
|
142
|
+
setShow(true);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (delayMs <= 0) {
|
|
146
|
+
setShow(true);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const t = window.setTimeout(() => setShow(true), delayMs);
|
|
150
|
+
return () => window.clearTimeout(t);
|
|
151
|
+
}, [delayMs, imageStatus]);
|
|
152
|
+
if (!show) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
return /* @__PURE__ */ jsx(
|
|
156
|
+
"span",
|
|
157
|
+
{
|
|
158
|
+
ref,
|
|
159
|
+
"data-slot": "avatar-fallback",
|
|
160
|
+
className: cn(avatarFallbackVariants(), className),
|
|
161
|
+
...rest
|
|
162
|
+
}
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
AvatarFallback.displayName = "AvatarFallback";
|
|
166
|
+
function AvatarGroup({
|
|
167
|
+
className,
|
|
168
|
+
max,
|
|
169
|
+
children,
|
|
170
|
+
ref,
|
|
171
|
+
...rest
|
|
172
|
+
}) {
|
|
173
|
+
const childArray = useMemo(
|
|
174
|
+
() => Children.toArray(children).filter(isValidElement),
|
|
175
|
+
[children]
|
|
176
|
+
);
|
|
177
|
+
const visible = max !== void 0 ? childArray.slice(0, max) : childArray;
|
|
178
|
+
const overflow = max !== void 0 && childArray.length > max ? childArray.length - max : 0;
|
|
179
|
+
return /* @__PURE__ */ jsxs(
|
|
180
|
+
"div",
|
|
181
|
+
{
|
|
182
|
+
ref,
|
|
183
|
+
"data-slot": "avatar-group",
|
|
184
|
+
className: cn(avatarGroupVariants(), className),
|
|
185
|
+
...rest,
|
|
186
|
+
children: [
|
|
187
|
+
visible,
|
|
188
|
+
overflow > 0 ? /* @__PURE__ */ jsxs(
|
|
189
|
+
"span",
|
|
190
|
+
{
|
|
191
|
+
"data-slot": "avatar-group-overflow",
|
|
192
|
+
className: cn(
|
|
193
|
+
avatarVariants({ size: "md" }),
|
|
194
|
+
"z-10 grid place-items-center bg-slate-800 text-xs font-semibold text-white"
|
|
195
|
+
),
|
|
196
|
+
"aria-label": `${overflow} more`,
|
|
197
|
+
children: [
|
|
198
|
+
"+",
|
|
199
|
+
overflow
|
|
200
|
+
]
|
|
201
|
+
}
|
|
202
|
+
) : null
|
|
203
|
+
]
|
|
204
|
+
}
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
AvatarGroup.displayName = "AvatarGroup";
|
|
208
|
+
|
|
209
|
+
export { Avatar, AvatarFallback, AvatarGroup, AvatarImage, avatarAnimationPresets, avatarFallbackVariants, avatarGroupVariants, avatarImageVariants, avatarVariants };
|
|
210
|
+
//# sourceMappingURL=avatar.mjs.map
|
|
211
|
+
//# sourceMappingURL=avatar.mjs.map
|