import type { Meta, StoryObj } from '@storybook/nextjs-vite'; import { UserSummary } from '../components/user-summary-stub'; /** Generate a square colored SVG avatar as a data URI */ const makeAvatar = (initials: string, bg = '#6366f1') => `data:image/svg+xml,${encodeURIComponent( `` + `` + `${initials}` + ``, )}`; const avatarJohn = makeAvatar('JD', '#6366f1'); const avatarJane = makeAvatar('JS', '#ec4899'); const avatarAlex = makeAvatar('AJ', '#14b8a6'); const avatarSarah = makeAvatar('SC', '#f59e0b'); const mspLogo = makeAvatar('S', '#161616'); const meta = { title: 'Components/UserSummary', component: UserSummary, argTypes: { compact: { control: 'boolean' }, avatarSize: { control: { type: 'number', min: 24, max: 120 } }, showEditButton: { control: 'boolean' }, editablePhoto: { control: 'boolean' }, }, parameters: { layout: 'padded', }, tags: ['autodocs'], } satisfies Meta; export default meta; type Story = StoryObj; // === Default (Full) === /** * Default full-size variant with avatar and email. */ export const Default: Story = { args: { name: 'John Doe', email: 'john.doe@example.com', avatarUrl: avatarJohn, }, }; /** * Full variant without an avatar — shows initials fallback. */ export const NoAvatar: Story = { args: { name: 'Jane Smith', email: 'jane.smith@example.com', }, }; /** * Full variant with subtitle replacing the email line. */ export const WithSubtitle: Story = { args: { name: 'Alex Johnson', email: 'alex@example.com', avatarUrl: avatarAlex, subtitle: '3 hours ago', }, }; // === Auth Providers === /** * Shows auth provider icons (Google + Microsoft). */ export const WithAuthProviders: Story = { args: { name: 'John Doe', email: 'john.doe@example.com', avatarUrl: avatarJohn, authProviders: ['google', 'microsoft'], }, }; // === MSP Preview === /** * Full variant with MSP details and logo badge. */ export const WithMSP: Story = { args: { name: 'Sarah Connor', email: 'sarah@skynet-msp.com', avatarUrl: avatarSarah, mspPreview: { name: 'Skynet MSP', seatCount: 1200, technicianCount: 45, annualRevenue: 2_500_000, logoUrl: mspLogo, }, }, }; /** * MSP preview without a logo — shows initial fallback on the badge. */ export const WithMSPNoLogo: Story = { args: { name: 'Sarah Connor', email: 'sarah@skynet-msp.com', avatarUrl: avatarSarah, mspPreview: { name: 'Skynet MSP', seatCount: 500, technicianCount: 12, }, }, }; // === Edit Button === /** * Shows the edit profile indicator. */ export const WithEditButton: Story = { args: { name: 'John Doe', email: 'john.doe@example.com', avatarUrl: avatarJohn, showEditButton: true, }, }; // === Full Featured === /** * All features enabled: avatar, MSP, auth providers, edit button. */ export const FullFeatured: Story = { args: { name: 'Sarah Connor', email: 'sarah@skynet-msp.com', avatarUrl: avatarSarah, authProviders: ['google', 'microsoft'], showEditButton: true, mspPreview: { name: 'Skynet MSP', seatCount: 1200, technicianCount: 45, annualRevenue: 2_500_000, logoUrl: mspLogo, }, }, }; // === Compact Variant === /** * Compact mode — minimal horizontal row for comment headers. */ export const Compact: Story = { args: { name: 'John Doe', email: 'john.doe@example.com', avatarUrl: avatarJohn, compact: true, }, }; /** * Compact mode without avatar. */ export const CompactNoAvatar: Story = { args: { name: 'Jane Smith', email: 'jane@example.com', compact: true, }, }; /** * Compact mode with subtitle instead of email. */ export const CompactWithSubtitle: Story = { args: { name: 'Alex Johnson', email: 'alex@example.com', avatarUrl: avatarAlex, compact: true, subtitle: '5 minutes ago', }, }; /** * Compact mode with MSP badge. */ export const CompactWithMSP: Story = { args: { name: 'Sarah Connor', email: 'sarah@skynet-msp.com', avatarUrl: avatarSarah, compact: true, mspPreview: { name: 'Skynet MSP', logoUrl: mspLogo, }, }, }; /** * Compact mode with a custom larger avatar size. */ export const CompactLargeAvatar: Story = { args: { name: 'John Doe', email: 'john.doe@example.com', avatarUrl: avatarJohn, compact: true, avatarSize: 64, }, };