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: () => (
),
...src(`
`),
};