import { SharedStyle, StyleProp, tlmenus, useEditor } from '@tldraw/editor' import * as React from 'react' import { StyleValuesForUi } from '../../../styles' import { TLUiTranslationKey } from '../../hooks/useTranslation/TLUiTranslationKey' import { useTranslation } from '../../hooks/useTranslation/useTranslation' import { styleMessageId, stylePanelMessages } from '../../styleMessages' import { TldrawUiButtonIcon } from '../primitives/Button/TldrawUiButtonIcon' import { TldrawUiMenuContextProvider } from '../primitives/menus/TldrawUiMenuContext' import { TldrawUiPopover, TldrawUiPopoverContent, TldrawUiPopoverTrigger, } from '../primitives/TldrawUiPopover' import { TldrawUiToolbar, TldrawUiToolbarButton } from '../primitives/TldrawUiToolbar' import { useStylePanelContext } from './StylePanelContext' /** @public */ export interface StylePanelDoubleDropdownPickerProps { uiTypeA: string uiTypeB: string label: TLUiTranslationKey | Exclude labelA: TLUiTranslationKey | Exclude labelB: TLUiTranslationKey | Exclude itemsA: StyleValuesForUi itemsB: StyleValuesForUi styleA: StyleProp styleB: StyleProp valueA: SharedStyle valueB: SharedStyle onValueChange?(style: StyleProp, value: T): void } function StylePanelDoubleDropdownPickerInner( props: StylePanelDoubleDropdownPickerProps ) { const msg = useTranslation() return (
{msg(props.label)}
) } function StylePanelDoubleDropdownPickerInlineInner( props: StylePanelDoubleDropdownPickerProps ) { const ctx = useStylePanelContext() const { uiTypeA, uiTypeB, labelA, labelB, itemsA, itemsB, styleA, styleB, valueA, valueB, onValueChange = ctx.onValueChange, } = props if (valueA === undefined && valueB === undefined) return null return ( <> ) } function DropdownHalf({ id, uiType, label, items, style, value, onValueChange, sideOffset, invertIcon, }: { id: string uiType: string label: TLUiTranslationKey | Exclude items: StyleValuesForUi style: StyleProp value: SharedStyle onValueChange(style: StyleProp, value: T): void sideOffset: number invertIcon?: boolean }) { const ctx = useStylePanelContext() const editor = useEditor() const msg = useTranslation() const [isOpen, setIsOpen] = React.useState(false) const icon = React.useMemo( () => items.find((item) => value.type === 'shared' && value.value === item.value)?.icon ?? 'mixed', [items, value] ) return ( {items.map((item) => ( { ctx.onHistoryMark('select style dropdown item') onValueChange(style, item.value) tlmenus.deleteOpenMenu(id, editor.contextId) setIsOpen(false) }} > ))} ) } // need to memo like this to get generics /** @public @react */ export const StylePanelDoubleDropdownPicker = React.memo(StylePanelDoubleDropdownPickerInner) as < T extends string, >( props: StylePanelDoubleDropdownPickerProps ) => React.JSX.Element /** @public @react */ export const StylePanelDoubleDropdownPickerInline = React.memo( StylePanelDoubleDropdownPickerInlineInner ) as (props: StylePanelDoubleDropdownPickerProps) => React.JSX.Element