import type { Meta, StoryObj } from 'storybook-solidjs-vite'; import { For } from 'solid-js'; import { Loader, type LoaderVariant, type LoaderSize } from './loader'; import { componentDescription } from '../stories/docs/element-controls'; const meta = { title: 'Solid (Advanced)/Elements/Loader', component: Loader, tags: ['autodocs'], parameters: { layout: 'padded', docs: { controls: { exclude: ['use:eventListener'] }, description: componentDescription([ 'A loading indicator with twelve animated **variants** (spinners, dots, bars, terminal, and text-based) in three **sizes**.', '**When to use:** while waiting on an async operation — a streaming response, a tool call, or any pending state.', '**How to use:** pick a `variant` and `size`. Text variants (`text-blink`, `text-shimmer`, `loading-dots`) display the `text` prop (defaults to "Thinking").', '**Placement:** inside assistant message bubbles, send-button states, empty states, or anywhere an in-progress signal is needed.', ]), }, }, argTypes: { variant: { control: 'select', options: [ 'circular', 'classic', 'pulse', 'pulse-dot', 'dots', 'typing', 'wave', 'bars', 'terminal', 'text-blink', 'text-shimmer', 'loading-dots', ], description: 'Animation style of the loader.', table: { defaultValue: { summary: 'circular' } }, }, size: { control: 'select', options: ['sm', 'md', 'lg'], description: 'Loader size preset.', table: { defaultValue: { summary: 'md' } }, }, text: { control: 'text', description: 'Label shown by the text variants (`text-blink`, `text-shimmer`, `loading-dots`).', table: { defaultValue: { summary: 'Thinking' } }, }, class: { control: 'text', description: 'Additional CSS classes for the loader element.', }, }, args: { variant: 'circular', size: 'md', text: 'Thinking', }, render: (args) => , } satisfies Meta; export default meta; type Story = StoryObj; const IMPORT = `import { Loader } from '@kitn.ai/chat';`; const src = (code: string) => ({ parameters: { docs: { source: { code: `${IMPORT}\n\n${code}`, language: 'tsx' } } }, }); /** Interactive playground — switch variant, size, and text to explore every loader. */ export const Playground: Story = { ...src(``), }; export const Classic: Story = { args: { variant: 'classic' }, ...src(``), }; export const Pulse: Story = { args: { variant: 'pulse' }, ...src(``), }; export const PulseDot: Story = { args: { variant: 'pulse-dot' }, ...src(``), }; export const Dots: Story = { args: { variant: 'dots' }, ...src(``), }; export const Typing: Story = { args: { variant: 'typing' }, ...src(``), }; export const Wave: Story = { args: { variant: 'wave' }, ...src(``), }; export const Bars: Story = { args: { variant: 'bars' }, ...src(``), }; export const Terminal: Story = { args: { variant: 'terminal' }, ...src(``), }; export const TextBlink: Story = { args: { variant: 'text-blink', text: 'Thinking' }, ...src(``), }; export const TextShimmer: Story = { args: { variant: 'text-shimmer', text: 'Analyzing' }, ...src(``), }; export const LoadingDots: Story = { args: { variant: 'loading-dots', text: 'Processing' }, ...src(``), }; const allVariants: LoaderVariant[] = [ 'circular', 'classic', 'pulse', 'pulse-dot', 'dots', 'typing', 'wave', 'bars', 'terminal', 'text-blink', 'text-shimmer', 'loading-dots', ]; const allSizes: LoaderSize[] = ['sm', 'md', 'lg']; /** Every variant across every size (showcase — not driven by controls). */ export const AllVariantsGrid: Story = { render: () => (
{(variant) => (
{variant} {(size) => (
)}
)}
), ...src(` `), }; /** A single variant rendered at all three sizes (showcase). */ export const AllSizes: Story = { render: () => (

Small

Medium

Large

), ...src(` `), };