mirror of
https://github.com/supermemoryai/supermemory.git
synced 2026-10-07 02:58:11 +00:00
186 lines
5.4 KiB
TypeScript
186 lines
5.4 KiB
TypeScript
'use client';
|
|
|
|
import React from 'react';
|
|
|
|
import type { TColumnElement } from '@udecode/plate-layout';
|
|
|
|
import { cn, withRef } from '@udecode/cn';
|
|
import { useElement, useRemoveNodeButton } from '@udecode/plate-common/react';
|
|
import {
|
|
ColumnItemPlugin,
|
|
useColumnState,
|
|
useDebouncePopoverOpen,
|
|
} from '@udecode/plate-layout/react';
|
|
import { type LucideProps, Trash2Icon } from 'lucide-react';
|
|
import { useReadOnly } from 'slate-react';
|
|
|
|
import { Button } from './button';
|
|
import { PlateElement } from './plate-element';
|
|
import { Popover, PopoverAnchor, PopoverContent } from './popover';
|
|
import { Separator } from './separator';
|
|
|
|
export const ColumnGroupElement = withRef<typeof PlateElement>(
|
|
({ children, className, ...props }, ref) => {
|
|
return (
|
|
<PlateElement ref={ref} className={cn(className, 'my-2')} {...props}>
|
|
<ColumnFloatingToolbar>
|
|
<div className={cn('flex size-full gap-4 rounded')}>{children}</div>
|
|
</ColumnFloatingToolbar>
|
|
</PlateElement>
|
|
);
|
|
}
|
|
);
|
|
|
|
export function ColumnFloatingToolbar({ children }: React.PropsWithChildren) {
|
|
const readOnly = useReadOnly();
|
|
|
|
const {
|
|
setDoubleColumn,
|
|
setDoubleSideDoubleColumn,
|
|
setLeftSideDoubleColumn,
|
|
setRightSideDoubleColumn,
|
|
setThreeColumn,
|
|
} = useColumnState();
|
|
|
|
const element = useElement<TColumnElement>(ColumnItemPlugin.key);
|
|
|
|
const { props: buttonProps } = useRemoveNodeButton({ element });
|
|
|
|
const isOpen = useDebouncePopoverOpen();
|
|
|
|
if (readOnly) return <>{children}</>;
|
|
|
|
return (
|
|
<Popover open={isOpen} modal={false}>
|
|
<PopoverAnchor>{children}</PopoverAnchor>
|
|
<PopoverContent
|
|
className="w-auto p-1"
|
|
onOpenAutoFocus={(e) => e.preventDefault()}
|
|
align="center"
|
|
side="top"
|
|
sideOffset={10}
|
|
>
|
|
<div className="box-content flex items-center [&_svg]:size-4 [&_svg]:text-muted-foreground">
|
|
<Button size="icon" variant="ghost" onClick={setDoubleColumn}>
|
|
<DoubleColumnOutlined />
|
|
</Button>
|
|
<Button size="icon" variant="ghost" onClick={setThreeColumn}>
|
|
<ThreeColumnOutlined />
|
|
</Button>
|
|
<Button
|
|
size="icon"
|
|
variant="ghost"
|
|
onClick={setRightSideDoubleColumn}
|
|
>
|
|
<RightSideDoubleColumnOutlined />
|
|
</Button>
|
|
<Button size="icon" variant="ghost" onClick={setLeftSideDoubleColumn}>
|
|
<LeftSideDoubleColumnOutlined />
|
|
</Button>
|
|
<Button
|
|
size="icon"
|
|
variant="ghost"
|
|
onClick={setDoubleSideDoubleColumn}
|
|
>
|
|
<DoubleSideDoubleColumnOutlined />
|
|
</Button>
|
|
|
|
<Separator orientation="vertical" className="mx-1 h-6" />
|
|
<Button size="icon" variant="ghost" {...buttonProps}>
|
|
<Trash2Icon />
|
|
</Button>
|
|
</div>
|
|
</PopoverContent>
|
|
</Popover>
|
|
);
|
|
}
|
|
|
|
const DoubleColumnOutlined = (props: LucideProps) => (
|
|
<svg
|
|
fill="none"
|
|
height="16"
|
|
viewBox="0 0 16 16"
|
|
width="16"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
{...props}
|
|
>
|
|
<path
|
|
clipRule="evenodd"
|
|
d="M8.5 3H13V13H8.5V3ZM7.5 2H8.5H13C13.5523 2 14 2.44772 14 3V13C14 13.5523 13.5523 14 13 14H8.5H7.5H3C2.44772 14 2 13.5523 2 13V3C2 2.44772 2.44772 2 3 2H7.5ZM7.5 13H3L3 3H7.5V13Z"
|
|
fill="#595E6F"
|
|
fillRule="evenodd"
|
|
/>
|
|
</svg>
|
|
);
|
|
|
|
const ThreeColumnOutlined = (props: LucideProps) => (
|
|
<svg
|
|
fill="none"
|
|
height="16"
|
|
viewBox="0 0 16 16"
|
|
width="16"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
{...props}
|
|
>
|
|
<path
|
|
clipRule="evenodd"
|
|
d="M9.25 3H6.75V13H9.25V3ZM9.25 2H6.75H5.75H3C2.44772 2 2 2.44772 2 3V13C2 13.5523 2.44772 14 3 14H5.75H6.75H9.25H10.25H13C13.5523 14 14 13.5523 14 13V3C14 2.44772 13.5523 2 13 2H10.25H9.25ZM10.25 3V13H13V3H10.25ZM3 13H5.75V3H3L3 13Z"
|
|
fill="#4C5161"
|
|
fillRule="evenodd"
|
|
/>
|
|
</svg>
|
|
);
|
|
|
|
const RightSideDoubleColumnOutlined = (props: LucideProps) => (
|
|
<svg
|
|
fill="none"
|
|
height="16"
|
|
viewBox="0 0 16 16"
|
|
width="16"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
{...props}
|
|
>
|
|
<path
|
|
clipRule="evenodd"
|
|
d="M11.25 3H13V13H11.25V3ZM10.25 2H11.25H13C13.5523 2 14 2.44772 14 3V13C14 13.5523 13.5523 14 13 14H11.25H10.25H3C2.44772 14 2 13.5523 2 13V3C2 2.44772 2.44772 2 3 2H10.25ZM10.25 13H3L3 3H10.25V13Z"
|
|
fill="#595E6F"
|
|
fillRule="evenodd"
|
|
/>
|
|
</svg>
|
|
);
|
|
|
|
const LeftSideDoubleColumnOutlined = (props: LucideProps) => (
|
|
<svg
|
|
fill="none"
|
|
height="16"
|
|
viewBox="0 0 16 16"
|
|
width="16"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
{...props}
|
|
>
|
|
<path
|
|
clipRule="evenodd"
|
|
d="M5.75 3H13V13H5.75V3ZM4.75 2H5.75H13C13.5523 2 14 2.44772 14 3V13C14 13.5523 13.5523 14 13 14H5.75H4.75H3C2.44772 14 2 13.5523 2 13V3C2 2.44772 2.44772 2 3 2H4.75ZM4.75 13H3L3 3H4.75V13Z"
|
|
fill="#595E6F"
|
|
fillRule="evenodd"
|
|
/>
|
|
</svg>
|
|
);
|
|
|
|
const DoubleSideDoubleColumnOutlined = (props: LucideProps) => (
|
|
<svg
|
|
fill="none"
|
|
height="16"
|
|
viewBox="0 0 16 16"
|
|
width="16"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
{...props}
|
|
>
|
|
<path
|
|
clipRule="evenodd"
|
|
d="M10.25 3H5.75V13H10.25V3ZM10.25 2H5.75H4.75H3C2.44772 2 2 2.44772 2 3V13C2 13.5523 2.44772 14 3 14H4.75H5.75H10.25H11.25H13C13.5523 14 14 13.5523 14 13V3C14 2.44772 13.5523 2 13 2H11.25H10.25ZM11.25 3V13H13V3H11.25ZM3 13H4.75V3H3L3 13Z"
|
|
fill="#595E6F"
|
|
fillRule="evenodd"
|
|
/>
|
|
</svg>
|
|
);
|