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, }, }