first commit

This commit is contained in:
Om Prakash Das
2026-07-02 18:39:11 +05:30
commit ed3eba27ec
251 changed files with 36276 additions and 0 deletions
@@ -0,0 +1,32 @@
import { Plus } from "@untitledui/icons";
import type { ButtonProps as AriaButtonProps } from "react-aria-components";
import { Tooltip as AriaTooltip, TooltipTrigger as AriaTooltipTrigger } from "@/components/base/tooltip/tooltip";
import { cx } from "@/utils/cx";
const sizes = {
xs: { root: "size-6", icon: "size-4" },
sm: { root: "size-8", icon: "size-4" },
md: { root: "size-10", icon: "size-5" },
};
interface AvatarAddButtonProps extends AriaButtonProps {
size: "xs" | "sm" | "md";
title?: string;
className?: string;
}
export const AvatarAddButton = ({ size, className, title = "Add user", ...props }: AvatarAddButtonProps) => (
<AriaTooltip title={title}>
<AriaTooltipTrigger
{...props}
aria-label={title}
className={cx(
"flex cursor-pointer items-center justify-center rounded-full border border-dashed border-primary bg-primary text-fg-quaternary outline-focus-ring transition duration-100 ease-linear hover:bg-primary_hover hover:text-fg-quaternary_hover focus-visible:outline-2 focus-visible:outline-offset-2 disabled:opacity-50",
sizes[size].root,
className,
)}
>
<Plus className={cx("text-current transition-inherit-all", sizes[size].icon)} />
</AriaTooltipTrigger>
</AriaTooltip>
);
@@ -0,0 +1,24 @@
import { cx } from "@/utils/cx";
const sizes = {
xs: "size-2",
sm: "size-3",
md: "size-3.5",
lg: "size-4",
xl: "size-4.5",
"2xl": "size-5 ring-[1.67px]",
};
interface AvatarCompanyIconProps {
size: "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
src: string;
alt?: string;
}
export const AvatarCompanyIcon = ({ size, src, alt }: AvatarCompanyIconProps) => (
<img
src={src}
alt={alt}
className={cx("absolute -right-0.5 -bottom-0.5 rounded-full bg-brand-50 object-cover ring-[1.5px] ring-bg-primary", sizes[size])}
/>
);
@@ -0,0 +1,14 @@
import { cx } from "@/utils/cx";
interface AvatarCountProps {
count: number;
className?: string;
}
export const AvatarCount = ({ count, className }: AvatarCountProps) => (
<div className={cx("absolute right-0 bottom-0 p-px", className)}>
<div className="flex size-3.5 items-center justify-center rounded-full bg-fg-error-primary text-center text-[10px] leading-[13px] font-bold text-white">
{count}
</div>
</div>
);
@@ -0,0 +1,48 @@
import { cx } from "@/utils/cx";
const sizes = {
xs: "size-1.5",
sm: "size-2",
md: "size-2.5",
lg: "size-3",
xl: "size-3.5",
"2xl": "size-4",
"3xl": "size-4.5",
"4xl": "size-5",
};
interface AvatarOnlineIndicatorProps {
size: "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" | "4xl";
status: "online" | "offline";
className?: string;
}
export const AvatarOnlineIndicator = ({ size, status, className }: AvatarOnlineIndicatorProps) => (
<span
className={cx(
"absolute right-0 bottom-0 flex justify-center rounded-full ring-[1.5px] ring-bg-primary",
status === "online" ? "bg-fg-success-secondary" : "bg-utility-neutral-300",
sizes[size],
className,
)}
style={{
backgroundImage:
"radial-gradient(43.75% 43.75% at 50% 28.75%, rgba(255, 255, 255, 0.05) 0%, rgba(255, 255, 255, 0.00) 100%), radial-gradient(50% 50% at 50% 50%, rgba(255, 255, 255, 0.00) 74.66%, rgba(255, 255, 255, 0.18) 100%), radial-gradient(75% 75% at 50% 0%, rgba(255, 255, 255, 0.00) 0%, rgba(255, 255, 255, 0.00) 50%, rgba(255, 255, 255, 0.08) 99%, rgba(255, 255, 255, 0.00) 100%)",
}}
>
{/* Reflection */}
<svg viewBox="0 0 7.2 2.85" fill="none" className="mt-[10%] h-[20%] w-[60%]">
<path
d="M7.2 1.83107C7.2 2.84235 5.58823 2.19729 3.6 2.19729C1.61177 2.19729 0 2.84235 0 1.83107C0 0.8198 1.61177 0 3.6 0C5.58823 0 7.2 0.8198 7.2 1.83107Z"
fill="url(#reflection-gradient)"
fillOpacity="0.4"
/>
<defs>
<linearGradient id="reflection-gradient" x1="3.6" y1="0" x2="3.6" y2="2.4" gradientUnits="userSpaceOnUse">
<stop stopColor="white" />
<stop offset="1" stopColor="white" stopOpacity="0.1" />
</linearGradient>
</defs>
</svg>
</span>
);
@@ -0,0 +1,4 @@
export * from "./avatar-add-button";
export * from "./avatar-company-icon";
export * from "./avatar-online-indicator";
export * from "./verified-tick";
@@ -0,0 +1,32 @@
import { cx } from "@/utils/cx";
const sizes = {
xs: "size-2.5",
sm: "size-3",
md: "size-3.5",
lg: "size-4",
xl: "size-4.5",
"2xl": "size-5",
"3xl": "size-6",
"4xl": "size-8",
};
interface VerifiedTickProps {
size: "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" | "4xl";
className?: string;
}
export const VerifiedTick = ({ size, className }: VerifiedTickProps) => (
<svg className={cx("z-10 text-utility-blue-500", sizes[size], className)} viewBox="0 0 10 10" fill="none">
<path
d="M7.72237 1.77098C7.81734 2.00068 7.99965 2.18326 8.2292 2.27858L9.03413 2.61199C9.26384 2.70714 9.44635 2.88965 9.5415 3.11936C9.63665 3.34908 9.63665 3.60718 9.5415 3.83689L9.20833 4.64125C9.11313 4.87106 9.113 5.12943 9.20863 5.35913L9.54122 6.16325C9.58839 6.27702 9.61268 6.39897 9.6127 6.52214C9.61272 6.6453 9.58847 6.76726 9.54134 6.88105C9.4942 6.99484 9.42511 7.09823 9.33801 7.18531C9.2509 7.27238 9.14749 7.34144 9.03369 7.38854L8.22934 7.72171C7.99964 7.81669 7.81706 7.99899 7.72174 8.22855L7.38833 9.03348C7.29318 9.26319 7.11067 9.4457 6.88096 9.54085C6.65124 9.636 6.39314 9.636 6.16343 9.54085L5.35907 9.20767C5.12935 9.11276 4.87134 9.11295 4.64177 9.20821L3.83684 9.54115C3.60725 9.63608 3.34937 9.636 3.11984 9.54092C2.89032 9.44585 2.70791 9.26356 2.6127 9.03409L2.27918 8.22892C2.18421 7.99923 2.0019 7.81665 1.77235 7.72133L0.967421 7.38792C0.737807 7.29281 0.555355 7.11041 0.460169 6.88083C0.364983 6.65125 0.364854 6.39327 0.45981 6.16359L0.792984 5.35924C0.8879 5.12952 0.887707 4.87151 0.792445 4.64193L0.459749 3.83642C0.41258 3.72265 0.388291 3.60069 0.388272 3.47753C0.388252 3.35436 0.412501 3.2324 0.459634 3.11861C0.506767 3.00482 0.57586 2.90144 0.662965 2.81436C0.75007 2.72728 0.853479 2.65822 0.967283 2.61113L1.77164 2.27795C2.00113 2.18306 2.1836 2.00099 2.27899 1.7717L2.6124 0.966768C2.70755 0.737054 2.89006 0.554547 3.11978 0.459397C3.34949 0.364246 3.60759 0.364246 3.83731 0.459397L4.64166 0.792571C4.87138 0.887487 5.12939 0.887293 5.35897 0.792031L6.16424 0.459913C6.39392 0.364816 6.65197 0.364836 6.88164 0.459968C7.11131 0.555099 7.29379 0.737554 7.38895 0.967208L7.72247 1.77238L7.72237 1.77098Z"
className="fill-current"
/>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M6.95829 3.68932C7.02509 3.58439 7.04747 3.45723 7.02051 3.3358C6.99356 3.21437 6.91946 3.10862 6.81454 3.04182C6.70961 2.97502 6.58245 2.95264 6.46102 2.97959C6.33959 3.00655 6.23384 3.08064 6.16704 3.18557L4.33141 6.06995L3.49141 5.01995C3.41375 4.92281 3.30069 4.8605 3.17709 4.84673C3.05349 4.83296 2.92949 4.86885 2.83235 4.94651C2.73522 5.02417 2.67291 5.13723 2.65914 5.26083C2.64536 5.38443 2.68125 5.50843 2.75891 5.60557L4.00891 7.16807C4.0555 7.22638 4.11533 7.27271 4.18344 7.30323C4.25154 7.33375 4.32595 7.34757 4.40047 7.34353C4.47499 7.3395 4.54747 7.31773 4.61188 7.28004C4.67629 7.24234 4.73077 7.18981 4.77079 7.12682L6.95829 3.68932Z"
fill="white"
/>
</svg>
);