// // Copyright 2025 DXOS.org // import { type Meta, type StoryObj } from '@storybook/react-vite'; import React, { useEffect, useRef, useState } from 'react'; import { random } from '@dxos/random'; import { withLayout, withTheme } from '../../testing'; import { Button } from '../Button'; import { Panel } from '../Panel'; import { Toolbar } from '../Toolbar'; import { ScrollContainer, type ScrollContainerRootProps, type ScrollController } from './ScrollContainer'; type StoryArgs = ScrollContainerRootProps & { running?: boolean; initialLines?: number }; const DefaultStory = ({ initialLines = 0, running: runningProp, ...props }: StoryArgs) => { const [lines, setLines] = useState([]); const [running, setRunning] = useState(runningProp); const scroller = useRef(null); useEffect(() => { setLines(Array.from({ length: initialLines }, () => random.lorem.paragraph())); }, [initialLines]); useEffect(() => { if (!running) { return; } const i = setInterval(() => { setLines((lines) => [...lines, random.lorem.paragraph()]); }, 500); return () => clearInterval(i); }, [running]); return (
{lines.length}
{lines.map((line, index) => (
{line}
))}
); }; const meta = { title: 'ui/react-ui-core/components/ScrollContainer', component: ScrollContainer.Root, render: DefaultStory, decorators: [withTheme(), withLayout({ layout: 'column', classNames: 'w-[30rem]' })], } satisfies Meta; export default meta; type Story = StoryObj; export const Default: Story = { args: { pin: true, running: true, }, }; export const Large: Story = { args: { pin: true, initialLines: 100, }, };