feat: CalenTIQ Admin branding (wordmark, favicon, titles). Refs EventHub/EventHubSpec#10
CI / test (push) Successful in 47s
CI / push-image (push) Successful in 1m46s
CI / deploy-ift (push) Successful in 7s
CI / ci-done (push) Successful in 0s
CI / e2e-ift (push) Successful in 20s
CI / deploy-stage (push) Successful in 1m29s
CI / e2e-stage (push) Successful in 23s
CI / test (push) Successful in 47s
CI / push-image (push) Successful in 1m46s
CI / deploy-ift (push) Successful in 7s
CI / ci-done (push) Successful in 0s
CI / e2e-ift (push) Successful in 20s
CI / deploy-stage (push) Successful in 1m29s
CI / e2e-stage (push) Successful in 23s
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
import React from 'react';
|
||||
import { cn } from '@/lib/utils';
|
||||
|
||||
type Size = 'sm' | 'md' | 'lg';
|
||||
|
||||
type Props = {
|
||||
size?: Size;
|
||||
className?: string;
|
||||
/** Show Time Arc mark next to wordmark (default true). */
|
||||
withMark?: boolean;
|
||||
/** Append muted "Admin" after the brand (sidebar / login). */
|
||||
withAdmin?: boolean;
|
||||
};
|
||||
|
||||
const sizeMap: Record<Size, { mark: string; text: string; admin: string }> = {
|
||||
sm: { mark: 'h-5 w-5', text: 'text-sm', admin: 'text-[11px]' },
|
||||
md: { mark: 'h-7 w-7', text: 'text-2xl', admin: 'text-sm' },
|
||||
lg: { mark: 'h-10 w-10', text: 'text-4xl', admin: 'text-base' },
|
||||
};
|
||||
|
||||
/**
|
||||
* Public brand lockup: Time Arc + CalenTIQ (Admin).
|
||||
* Uses currentColor so the mark follows theme foreground.
|
||||
*/
|
||||
const BrandWordmark: React.FC<Props> = ({
|
||||
size = 'md',
|
||||
className,
|
||||
withMark = true,
|
||||
withAdmin = false,
|
||||
}) => {
|
||||
const s = sizeMap[size];
|
||||
return (
|
||||
<div
|
||||
className={cn('inline-flex items-center gap-2 text-foreground', className)}
|
||||
data-testid="brand-wordmark"
|
||||
aria-label={withAdmin ? 'CalenTIQ Admin' : 'CalenTIQ'}
|
||||
>
|
||||
{withMark && (
|
||||
<svg
|
||||
className={cn('shrink-0', s.mark)}
|
||||
viewBox="0 0 1024 1024"
|
||||
fill="none"
|
||||
aria-hidden
|
||||
>
|
||||
<g
|
||||
stroke="currentColor"
|
||||
strokeWidth="48"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
>
|
||||
<path d="M512 132 A380 380 0 1 0 512 892" />
|
||||
<path d="M512 512 L377.77 434.50" />
|
||||
<path d="M512 512 L698.20 404.50" />
|
||||
</g>
|
||||
<circle cx="512" cy="512" r="24" fill="currentColor" />
|
||||
<circle cx="816.06" cy="207.94" r="18" fill="currentColor" />
|
||||
<circle cx="884.39" cy="297.00" r="18" fill="currentColor" />
|
||||
<circle cx="927.35" cy="400.71" r="18" fill="currentColor" />
|
||||
<circle cx="942.00" cy="512.00" r="18" fill="currentColor" />
|
||||
<circle cx="927.35" cy="623.29" r="18" fill="currentColor" />
|
||||
<circle cx="884.39" cy="727.00" r="18" fill="currentColor" />
|
||||
<circle cx="816.06" cy="816.06" r="18" fill="currentColor" />
|
||||
</svg>
|
||||
)}
|
||||
<p className={cn('leading-none font-extrabold tracking-tight', s.text)}>
|
||||
Calen<span className="text-primary">TIQ</span>
|
||||
{withAdmin && (
|
||||
<span className={cn('ml-1.5 font-semibold opacity-70', s.admin)}>Admin</span>
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default BrandWordmark;
|
||||
Reference in New Issue
Block a user