//
// 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
))}
);
},
};