// // Copyright 2022 DXOS.org // import '@dxos-theme'; import { DndContext, type DragEndEvent, type DragStartEvent } from '@dnd-kit/core'; import { arrayMove, SortableContext, useSortable, verticalListSortingStrategy } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; import { useArrowNavigationGroup } from '@fluentui/react-tabster'; import { DotsSixVertical, PushPin } from '@phosphor-icons/react'; import React, { type ReactNode, useState } from 'react'; import { getSize, ghostHover, ghostSelected, ghostSelectedTrackingInterFromNormal, mx, surfaceShadow, } from '@dxos/react-ui-theme'; import { List, ListItem, type ListScopedProps } from './List'; import { withTheme } from '../../testing'; export default { title: 'ui/react-ui-core/List', component: List, decorators: [withTheme], parameters: { chromatic: { disableSnapshot: false } }, }; const UniformListItem = ({ id, text }: { id: string; text: string }) => { const { attributes, listeners, setNodeRef, transform } = useSortable({ id }); return ( {text} ); }; export const UniformSizeDraggable = { render: ({ ...args }) => { const [items, setItems] = useState( [...Array(12)].map((_, index) => ({ id: `listItem-${index}`, text: `List item ${index + 1}`, })), ); const handleDragEnd = (event: DragEndEvent) => { const { active, over } = event; if (active.id !== over?.id) { setItems((items) => { const oldIndex = items.findIndex((item) => item.id === active.id); const newIndex = items.findIndex((item) => item.id === over?.id); return arrayMove(items, oldIndex, newIndex); }); } }; return ( id)} strategy={verticalListSortingStrategy}> {items.map((item) => ( ))} ); }, args: {}, }; const ManySizesDraggableListItem = ({ id, text, className, dragging, __listScope, }: ListScopedProps<{ id: string; text: ReactNode; className?: string; dragging?: boolean }>) => { const { attributes, listeners, setNodeRef, transform } = useSortable({ id }); return ( {text} ); }; export const ManySizesDraggable = { render: ({ ...args }) => { const [items, setItems] = useState( [...Array(12)].map((_, index) => ({ id: `listItem-${index}`, text: (

{`List item ${index + 1}`}

), })), ); const [activeId, setActiveId] = useState(null); const handleDragStart = ({ active: { id } }: DragStartEvent) => setActiveId(id.toString()); const handleDragEnd = (event: DragEndEvent) => { const { active, over } = event; if (active.id !== over?.id) { setItems((items) => { const oldIndex = items.findIndex((item) => item.id === active.id); const newIndex = items.findIndex((item) => item.id === over?.id); return arrayMove(items, oldIndex, newIndex); }); } }; return ( id)} strategy={verticalListSortingStrategy}> {items.map(({ id, text }) => ( ))} ); }, args: {}, }; export const Collapsible = { render: ({ ...args }) => { const [items, _setItems] = useState( [...Array(12)].map((_, index) => ({ id: `listItem-${index}`, text: `List item ${index + 1}`, body: `Collapsible content for item ${index + 1}`, })), ); return ( {items.map(({ id, text, body }, index) => (
{index !== 2 ? : } {text}
{index !== 2 && {body}}
))}
); }, args: { variant: 'unordered', // toggleOpenLabel: 'Open/close storybook list item', // TODO(burdon): ??? }, }; export const SelectableListbox = { render: () => { const [selectedId, setSelectedId] = useState(); const arrowNavigationAttrs = useArrowNavigationGroup({ axis: 'vertical' }); const [items, _setItems] = useState( [...Array(12)].map((_, index) => ({ id: `listItem-${index}`, text: `List item ${index + 1}`, })), ); const handleKeyUp = (event: any, id: string) => { switch (event.key) { case ' ': case 'Enter': { setSelectedId(id); } } }; return ( {items.map(({ id, text }) => ( setSelectedId(id)} onKeyUp={(event) => handleKeyUp(event, id)} > Lorem ipsum dolor sit amet ))} ); }, };