Files
calendar/packages/ui/components/top-banner/TopBanner.tsx
T
Alex van AndelandGitHub b9128a7a0b chore: Add ./components/[name]/index.ts map to package.json (#17319)
* chore: Add ./components/[name]/index.ts map to package.json

* fix: Clarify Popover exports

* fix: re-add dropdown to calcom/ui barrel

* chore: Add icon barrel file re-export

* Fix all calcom/ui imports of its own barrel

* Never say 'fix all remaining..' it's never true

* Some type fixeS

* Linking fixes

* Rename sheet.tsx to Sheet.tsx

Done through UI, console does NOT like this.

* Fixed some test failures
2024-10-25 23:05:29 +01:00

59 lines
1.8 KiB
TypeScript

import classNames from "classnames";
import type { ReactNode } from "react";
import { TOP_BANNER_HEIGHT } from "@calcom/lib/constants";
import { Icon } from "../icon";
import type { IconName } from "../icon";
export type TopBannerProps = {
icon?: IconName;
text: string;
variant?: keyof typeof variantClassName;
actions?: ReactNode;
};
const variantClassName = {
default: "bg-gradient-primary",
warning: "bg-orange-400",
error: "bg-red-400",
};
const defaultIconProps = {
className: "text-emphasis h-4 w-4 stroke-[2.5px]",
};
export function TopBanner(props: TopBannerProps) {
const { icon, variant = "default", text, actions } = props;
const renderDefaultIconByVariant = () => {
switch (variant) {
case "error":
return <Icon {...defaultIconProps} name="triangle-alert" data-testid="variant-error" />;
case "warning":
return <Icon {...defaultIconProps} name="info" data-testid="variant-warning" />;
default:
return null;
}
};
const defaultIcon = renderDefaultIconByVariant();
return (
<div
data-testid="banner"
style={{ minHeight: TOP_BANNER_HEIGHT }}
className={classNames(
"flex w-full items-start justify-between gap-8 px-4 py-2 text-center lg:items-center",
variantClassName[variant]
)}>
<div className="flex flex-1 flex-col items-start justify-center gap-2 px-1 py-0.5 lg:flex-row lg:items-center">
<p className="text-emphasis flex flex-col items-start justify-center gap-2 text-left font-sans text-sm font-medium leading-4 lg:flex-row lg:items-center">
{icon ? <Icon {...defaultIconProps} name={icon} data-testid="variant-default" /> : defaultIcon}
{text}
</p>
{actions && <div className="text-sm font-medium">{actions}</div>}
</div>
</div>
);
}