tldraw 3.16.0-next.15f085081fd5 → 3.16.0-next.2f9d39693e4c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-cjs/index.d.ts +134 -102
- package/dist-cjs/index.js +25 -14
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/arrowLabel.js +6 -0
- package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +3 -3
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +3 -0
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -3
- package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/useEditablePlainText.js +0 -2
- package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
- package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +0 -2
- package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +9 -4
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +255 -316
- package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/{primitives/TldrawUiButtonPicker.js → StylePanel/StylePanelButtonPicker.js} +52 -45
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +7 -0
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js +68 -0
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js.map +7 -0
- package/dist-cjs/lib/ui/components/StylePanel/{DoubleDropdownPicker.js → StylePanelDoubleDropdownPicker.js} +23 -22
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js.map +7 -0
- package/dist-cjs/lib/ui/components/StylePanel/{DropdownPicker.js → StylePanelDropdownPicker.js} +23 -20
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js.map +7 -0
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js +28 -0
- package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js.map +7 -0
- package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js +3 -2
- package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +38 -9
- package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js +15 -3
- package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js +3 -3
- package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +10 -1
- package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +17 -4
- package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +2 -0
- package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +7 -0
- package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
- package/dist-cjs/lib/ui/context/actions.js +7 -8
- package/dist-cjs/lib/ui/context/actions.js.map +2 -2
- package/dist-cjs/lib/ui/context/events.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/useExportAs.js +3 -2
- package/dist-cjs/lib/ui/hooks/useExportAs.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useTools.js +1 -1
- package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +1 -0
- package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
- package/dist-cjs/lib/ui/version.js +3 -3
- package/dist-cjs/lib/ui/version.js.map +1 -1
- package/dist-cjs/lib/utils/export/copyAs.js +1 -2
- package/dist-cjs/lib/utils/export/copyAs.js.map +2 -2
- package/dist-cjs/lib/utils/export/export.js +0 -20
- package/dist-cjs/lib/utils/export/export.js.map +2 -2
- package/dist-cjs/lib/utils/export/exportAs.js +1 -2
- package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
- package/dist-esm/index.d.mts +134 -102
- package/dist-esm/index.mjs +51 -28
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +6 -0
- package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +3 -3
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +3 -0
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +1 -3
- package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs +0 -2
- package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
- package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +0 -2
- package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +14 -5
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +257 -320
- package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/{primitives/TldrawUiButtonPicker.mjs → StylePanel/StylePanelButtonPicker.mjs} +54 -43
- package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +7 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs +48 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs.map +7 -0
- package/dist-esm/lib/ui/components/StylePanel/{DoubleDropdownPicker.mjs → StylePanelDoubleDropdownPicker.mjs} +20 -19
- package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs.map +7 -0
- package/dist-esm/lib/ui/components/StylePanel/{DropdownPicker.mjs → StylePanelDropdownPicker.mjs} +20 -17
- package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs.map +7 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs +8 -0
- package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs.map +7 -0
- package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs +3 -2
- package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +38 -9
- package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs +15 -3
- package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs +3 -3
- package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +10 -1
- package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +17 -4
- package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +2 -0
- package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +7 -0
- package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
- package/dist-esm/lib/ui/context/actions.mjs +7 -8
- package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
- package/dist-esm/lib/ui/context/events.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/useExportAs.mjs +3 -2
- package/dist-esm/lib/ui/hooks/useExportAs.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useTools.mjs +1 -1
- package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +1 -0
- package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
- package/dist-esm/lib/ui/version.mjs +3 -3
- package/dist-esm/lib/ui/version.mjs.map +1 -1
- package/dist-esm/lib/utils/export/copyAs.mjs +1 -2
- package/dist-esm/lib/utils/export/copyAs.mjs.map +2 -2
- package/dist-esm/lib/utils/export/export.mjs +0 -20
- package/dist-esm/lib/utils/export/export.mjs.map +2 -2
- package/dist-esm/lib/utils/export/exportAs.mjs +1 -2
- package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
- package/package.json +3 -3
- package/src/index.ts +38 -21
- package/src/lib/shapes/arrow/arrowLabel.ts +8 -0
- package/src/lib/shapes/frame/FrameShapeUtil.tsx +4 -0
- package/src/lib/shapes/shared/PlainTextLabel.tsx +0 -6
- package/src/lib/shapes/shared/useEditablePlainText.ts +0 -6
- package/src/lib/shapes/shared/useImageOrVideoAsset.ts +0 -7
- package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +27 -13
- package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +260 -381
- package/src/lib/ui/components/{primitives/TldrawUiButtonPicker.tsx → StylePanel/StylePanelButtonPicker.tsx} +63 -50
- package/src/lib/ui/components/StylePanel/StylePanelContext.tsx +63 -0
- package/src/lib/ui/components/StylePanel/{DoubleDropdownPicker.tsx → StylePanelDoubleDropdownPicker.tsx} +28 -19
- package/src/lib/ui/components/StylePanel/StylePanelDropdownPicker.tsx +119 -0
- package/src/lib/ui/components/StylePanel/StylePanelSubheading.tsx +9 -0
- package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +4 -3
- package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +32 -15
- package/src/lib/ui/components/Toolbar/DefaultVideoToolbarContent.tsx +12 -4
- package/src/lib/ui/components/Toolbar/LinkEditor.tsx +5 -5
- package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +6 -1
- package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +50 -30
- package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +3 -0
- package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +10 -0
- package/src/lib/ui/context/actions.tsx +7 -8
- package/src/lib/ui/context/events.tsx +1 -1
- package/src/lib/ui/hooks/useExportAs.ts +3 -2
- package/src/lib/ui/hooks/useTools.tsx +1 -1
- package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +1 -0
- package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +1 -0
- package/src/lib/ui/version.ts +3 -3
- package/src/lib/ui.css +16 -2
- package/src/lib/utils/export/copyAs.ts +1 -24
- package/src/lib/utils/export/export.ts +0 -36
- package/src/lib/utils/export/exportAs.ts +1 -32
- package/src/test/custom-clipping.test.ts +436 -0
- package/tldraw.css +16 -2
- package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +0 -7
- package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +0 -7
- package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +0 -7
- package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +0 -7
- package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +0 -7
- package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +0 -7
- package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +0 -110
|
@@ -4,46 +4,52 @@ import {
|
|
|
4
4
|
SharedStyle,
|
|
5
5
|
StyleProp,
|
|
6
6
|
TLDefaultColorStyle,
|
|
7
|
-
TLDefaultColorTheme,
|
|
8
7
|
useEditor,
|
|
9
8
|
} from '@tldraw/editor'
|
|
10
9
|
import { memo, ReactElement, useMemo, useRef } from 'react'
|
|
10
|
+
import { useDefaultColorTheme } from '../../../shapes/shared/useDefaultColorTheme'
|
|
11
11
|
import { StyleValuesForUi } from '../../../styles'
|
|
12
12
|
import { PORTRAIT_BREAKPOINT } from '../../constants'
|
|
13
13
|
import { useBreakpoint } from '../../context/breakpoints'
|
|
14
14
|
import { TLUiTranslationKey } from '../../hooks/useTranslation/TLUiTranslationKey'
|
|
15
15
|
import { useTranslation } from '../../hooks/useTranslation/useTranslation'
|
|
16
|
-
import { TldrawUiButtonIcon } from '
|
|
17
|
-
import {
|
|
18
|
-
|
|
16
|
+
import { TldrawUiButtonIcon } from '../primitives/Button/TldrawUiButtonIcon'
|
|
17
|
+
import {
|
|
18
|
+
TldrawUiToolbar,
|
|
19
|
+
TldrawUiToolbarToggleGroup,
|
|
20
|
+
TldrawUiToolbarToggleItem,
|
|
21
|
+
} from '../primitives/TldrawUiToolbar'
|
|
22
|
+
import { TldrawUiGrid, TldrawUiRow } from '../primitives/layout'
|
|
23
|
+
import { useStylePanelContext } from './StylePanelContext'
|
|
24
|
+
import { StylePanelSubheading } from './StylePanelSubheading'
|
|
19
25
|
|
|
20
26
|
/** @public */
|
|
21
|
-
export interface
|
|
27
|
+
export interface StylePanelButtonPickerProps<T extends string> {
|
|
22
28
|
title: string
|
|
23
29
|
uiType: string
|
|
24
30
|
style: StyleProp<T>
|
|
25
31
|
value: SharedStyle<T>
|
|
26
32
|
items: StyleValuesForUi<T>
|
|
27
|
-
|
|
28
|
-
onValueChange(style: StyleProp<T>, value: T): void
|
|
33
|
+
onValueChange?(style: StyleProp<T>, value: T): void
|
|
29
34
|
onHistoryMark?(id: string): void
|
|
30
35
|
}
|
|
31
36
|
|
|
32
37
|
/** @public */
|
|
33
|
-
export const
|
|
34
|
-
props:
|
|
38
|
+
export const StylePanelButtonPicker = memo(function StylePanelButtonPicker<T extends string>(
|
|
39
|
+
props: StylePanelButtonPickerProps<T>
|
|
35
40
|
) {
|
|
41
|
+
const ctx = useStylePanelContext()
|
|
42
|
+
|
|
36
43
|
const {
|
|
37
44
|
uiType,
|
|
38
45
|
items,
|
|
39
46
|
title,
|
|
40
47
|
style,
|
|
41
48
|
value,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
onHistoryMark,
|
|
45
|
-
theme,
|
|
49
|
+
onValueChange = ctx.onValueChange,
|
|
50
|
+
onHistoryMark = ctx.onHistoryMark,
|
|
46
51
|
} = props
|
|
52
|
+
const theme = useDefaultColorTheme()
|
|
47
53
|
const editor = useEditor()
|
|
48
54
|
const msg = useTranslation()
|
|
49
55
|
const breakpoint = useBreakpoint()
|
|
@@ -117,43 +123,50 @@ export const TldrawUiButtonPicker = memo(function TldrawUiButtonPicker<T extends
|
|
|
117
123
|
}
|
|
118
124
|
}, [editor, breakpoint, value, onHistoryMark, onValueChange, style])
|
|
119
125
|
|
|
120
|
-
const
|
|
126
|
+
const Layout = items.length > 4 ? TldrawUiGrid : TldrawUiRow
|
|
121
127
|
|
|
122
128
|
return (
|
|
123
|
-
|
|
124
|
-
<
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
129
|
+
<>
|
|
130
|
+
{ctx.showUiLabels && <StylePanelSubheading>{title}</StylePanelSubheading>}
|
|
131
|
+
<TldrawUiToolbar label={title}>
|
|
132
|
+
<TldrawUiToolbarToggleGroup
|
|
133
|
+
data-testid={`style.${uiType}`}
|
|
134
|
+
type="single"
|
|
135
|
+
value={value.type === 'shared' ? value.value : undefined}
|
|
136
|
+
asChild
|
|
137
|
+
>
|
|
138
|
+
<Layout>
|
|
139
|
+
{items.map((item) => {
|
|
140
|
+
const label =
|
|
141
|
+
title + ' — ' + msg(`${uiType}-style.${item.value}` as TLUiTranslationKey)
|
|
142
|
+
return (
|
|
143
|
+
<TldrawUiToolbarToggleItem
|
|
144
|
+
type="icon"
|
|
145
|
+
key={item.value}
|
|
146
|
+
data-id={item.value}
|
|
147
|
+
data-testid={`style.${uiType}.${item.value}`}
|
|
148
|
+
aria-label={label}
|
|
149
|
+
value={item.value}
|
|
150
|
+
data-state={value.type === 'shared' && value.value === item.value ? 'on' : 'off'}
|
|
151
|
+
data-isactive={value.type === 'shared' && value.value === item.value}
|
|
152
|
+
title={label}
|
|
153
|
+
style={
|
|
154
|
+
style === (DefaultColorStyle as StyleProp<unknown>)
|
|
155
|
+
? { color: getColorValue(theme, item.value as TLDefaultColorStyle, 'solid') }
|
|
156
|
+
: undefined
|
|
157
|
+
}
|
|
158
|
+
onPointerEnter={handleButtonPointerEnter}
|
|
159
|
+
onPointerDown={handleButtonPointerDown}
|
|
160
|
+
onPointerUp={handleButtonPointerUp}
|
|
161
|
+
onClick={handleButtonClick}
|
|
162
|
+
>
|
|
163
|
+
<TldrawUiButtonIcon icon={item.icon} />
|
|
164
|
+
</TldrawUiToolbarToggleItem>
|
|
165
|
+
)
|
|
166
|
+
})}
|
|
167
|
+
</Layout>
|
|
168
|
+
</TldrawUiToolbarToggleGroup>
|
|
169
|
+
</TldrawUiToolbar>
|
|
170
|
+
</>
|
|
158
171
|
)
|
|
159
|
-
}) as <T extends string>(props:
|
|
172
|
+
}) as <T extends string>(props: StylePanelButtonPickerProps<T>) => ReactElement
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { ReadonlySharedStyleMap, StyleProp, useEditor, useValue } from '@tldraw/editor'
|
|
2
|
+
import { createContext, useCallback, useContext } from 'react'
|
|
3
|
+
import { useUiEvents } from '../../context/events'
|
|
4
|
+
|
|
5
|
+
/** @public */
|
|
6
|
+
export interface StylePanelContext {
|
|
7
|
+
styles: ReadonlySharedStyleMap
|
|
8
|
+
showUiLabels: boolean
|
|
9
|
+
onHistoryMark(id: string): void
|
|
10
|
+
onValueChange<T>(style: StyleProp<T>, value: T): void
|
|
11
|
+
}
|
|
12
|
+
const StylePanelContext = createContext<null | StylePanelContext>(null)
|
|
13
|
+
|
|
14
|
+
/** @public */
|
|
15
|
+
export interface StylePanelContextProviderProps {
|
|
16
|
+
children: React.ReactNode
|
|
17
|
+
styles: ReadonlySharedStyleMap
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** @public @react */
|
|
21
|
+
export function StylePanelContextProvider({ children, styles }: StylePanelContextProviderProps) {
|
|
22
|
+
const editor = useEditor()
|
|
23
|
+
const trackEvent = useUiEvents()
|
|
24
|
+
|
|
25
|
+
const onHistoryMark = useCallback((id: string) => editor.markHistoryStoppingPoint(id), [editor])
|
|
26
|
+
const showUiLabels = useValue('showUiLabels', () => editor.user.getShowUiLabels(), [editor])
|
|
27
|
+
const onValueChange = useCallback(
|
|
28
|
+
function <T>(style: StyleProp<T>, value: T) {
|
|
29
|
+
editor.run(() => {
|
|
30
|
+
if (editor.isIn('select')) {
|
|
31
|
+
editor.setStyleForSelectedShapes(style, value)
|
|
32
|
+
}
|
|
33
|
+
editor.setStyleForNextShapes(style, value)
|
|
34
|
+
editor.updateInstanceState({ isChangingStyle: true })
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
trackEvent('set-style', { source: 'style-panel', id: style.id, value: value as string })
|
|
38
|
+
},
|
|
39
|
+
[editor, trackEvent]
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<StylePanelContext.Provider
|
|
44
|
+
value={{
|
|
45
|
+
styles: styles,
|
|
46
|
+
showUiLabels,
|
|
47
|
+
onHistoryMark,
|
|
48
|
+
onValueChange,
|
|
49
|
+
}}
|
|
50
|
+
>
|
|
51
|
+
{children}
|
|
52
|
+
</StylePanelContext.Provider>
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** @public */
|
|
57
|
+
export function useStylePanelContext() {
|
|
58
|
+
const context = useContext(StylePanelContext)
|
|
59
|
+
if (!context) {
|
|
60
|
+
throw new Error('useStylePanelContext must be used within a StylePanelContextProvider')
|
|
61
|
+
}
|
|
62
|
+
return context
|
|
63
|
+
}
|
|
@@ -11,8 +11,10 @@ import {
|
|
|
11
11
|
} from '../primitives/TldrawUiPopover'
|
|
12
12
|
import { TldrawUiToolbar, TldrawUiToolbarButton } from '../primitives/TldrawUiToolbar'
|
|
13
13
|
import { TldrawUiMenuContextProvider } from '../primitives/menus/TldrawUiMenuContext'
|
|
14
|
+
import { useStylePanelContext } from './StylePanelContext'
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
/** @public */
|
|
17
|
+
export interface StylePanelDoubleDropdownPickerProps<T extends string> {
|
|
16
18
|
uiTypeA: string
|
|
17
19
|
uiTypeB: string
|
|
18
20
|
label: TLUiTranslationKey | Exclude<string, TLUiTranslationKey>
|
|
@@ -24,23 +26,27 @@ interface DoubleDropdownPickerProps<T extends string> {
|
|
|
24
26
|
styleB: StyleProp<T>
|
|
25
27
|
valueA: SharedStyle<T>
|
|
26
28
|
valueB: SharedStyle<T>
|
|
27
|
-
onValueChange(style: StyleProp<T>, value: T): void
|
|
29
|
+
onValueChange?(style: StyleProp<T>, value: T): void
|
|
28
30
|
}
|
|
29
31
|
|
|
30
|
-
function DoubleDropdownPickerInner<T extends string>(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
32
|
+
function DoubleDropdownPickerInner<T extends string>(
|
|
33
|
+
props: StylePanelDoubleDropdownPickerProps<T>
|
|
34
|
+
) {
|
|
35
|
+
const ctx = useStylePanelContext()
|
|
36
|
+
const {
|
|
37
|
+
label,
|
|
38
|
+
uiTypeA,
|
|
39
|
+
uiTypeB,
|
|
40
|
+
labelA,
|
|
41
|
+
labelB,
|
|
42
|
+
itemsA,
|
|
43
|
+
itemsB,
|
|
44
|
+
styleA,
|
|
45
|
+
styleB,
|
|
46
|
+
valueA,
|
|
47
|
+
valueB,
|
|
48
|
+
onValueChange = ctx.onValueChange,
|
|
49
|
+
} = props
|
|
44
50
|
const editor = useEditor()
|
|
45
51
|
const msg = useTranslation()
|
|
46
52
|
const [isOpenA, setIsOpenA] = React.useState(false)
|
|
@@ -155,6 +161,9 @@ function DoubleDropdownPickerInner<T extends string>({
|
|
|
155
161
|
}
|
|
156
162
|
|
|
157
163
|
// need to memo like this to get generics
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
164
|
+
/** @public @react */
|
|
165
|
+
export const StylePanelDoubleDropdownPicker = React.memo(DoubleDropdownPickerInner) as <
|
|
166
|
+
T extends string,
|
|
167
|
+
>(
|
|
168
|
+
props: StylePanelDoubleDropdownPickerProps<T>
|
|
169
|
+
) => React.JSX.Element
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { SharedStyle, StyleProp, tlmenus, useEditor } from '@tldraw/editor'
|
|
2
|
+
import * as React from 'react'
|
|
3
|
+
import { StyleValuesForUi } from '../../../styles'
|
|
4
|
+
import { TLUiTranslationKey } from '../../hooks/useTranslation/TLUiTranslationKey'
|
|
5
|
+
import { useTranslation } from '../../hooks/useTranslation/useTranslation'
|
|
6
|
+
import { TLUiIconType } from '../../icon-types'
|
|
7
|
+
import { TldrawUiButtonIcon } from '../primitives/Button/TldrawUiButtonIcon'
|
|
8
|
+
import { TldrawUiButtonLabel } from '../primitives/Button/TldrawUiButtonLabel'
|
|
9
|
+
import {
|
|
10
|
+
TldrawUiPopover,
|
|
11
|
+
TldrawUiPopoverContent,
|
|
12
|
+
TldrawUiPopoverTrigger,
|
|
13
|
+
} from '../primitives/TldrawUiPopover'
|
|
14
|
+
import { TldrawUiToolbar, TldrawUiToolbarButton } from '../primitives/TldrawUiToolbar'
|
|
15
|
+
import { TldrawUiMenuContextProvider } from '../primitives/menus/TldrawUiMenuContext'
|
|
16
|
+
import { useStylePanelContext } from './StylePanelContext'
|
|
17
|
+
|
|
18
|
+
/** @public */
|
|
19
|
+
export interface StylePanelDropdownPickerProps<T extends string> {
|
|
20
|
+
id: string
|
|
21
|
+
label?: TLUiTranslationKey | Exclude<string, TLUiTranslationKey>
|
|
22
|
+
uiType: string
|
|
23
|
+
stylePanelType: string
|
|
24
|
+
style: StyleProp<T>
|
|
25
|
+
value: SharedStyle<T>
|
|
26
|
+
items: StyleValuesForUi<T>
|
|
27
|
+
type: 'icon' | 'tool' | 'menu'
|
|
28
|
+
onValueChange?(style: StyleProp<T>, value: T): void
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function DropdownPickerInner<T extends string>(props: StylePanelDropdownPickerProps<T>) {
|
|
32
|
+
const ctx = useStylePanelContext()
|
|
33
|
+
const {
|
|
34
|
+
id,
|
|
35
|
+
label,
|
|
36
|
+
uiType,
|
|
37
|
+
stylePanelType,
|
|
38
|
+
style,
|
|
39
|
+
items,
|
|
40
|
+
type,
|
|
41
|
+
value,
|
|
42
|
+
onValueChange = ctx.onValueChange,
|
|
43
|
+
} = props
|
|
44
|
+
const msg = useTranslation()
|
|
45
|
+
const editor = useEditor()
|
|
46
|
+
const [isOpen, setIsOpen] = React.useState(false)
|
|
47
|
+
|
|
48
|
+
const icon = React.useMemo(
|
|
49
|
+
() => items.find((item) => value.type === 'shared' && item.value === value.value)?.icon,
|
|
50
|
+
[items, value]
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
const stylePanelName = msg(`style-panel.${stylePanelType}` as TLUiTranslationKey)
|
|
54
|
+
|
|
55
|
+
const titleStr =
|
|
56
|
+
value.type === 'mixed'
|
|
57
|
+
? msg('style-panel.mixed')
|
|
58
|
+
: stylePanelName + ' — ' + msg(`${uiType}-style.${value.value}` as TLUiTranslationKey)
|
|
59
|
+
const labelStr = label ? msg(label) : ''
|
|
60
|
+
|
|
61
|
+
const popoverId = `style panel ${id}`
|
|
62
|
+
return (
|
|
63
|
+
<TldrawUiToolbar label={stylePanelName}>
|
|
64
|
+
<TldrawUiPopover
|
|
65
|
+
id={popoverId}
|
|
66
|
+
open={isOpen}
|
|
67
|
+
onOpenChange={setIsOpen}
|
|
68
|
+
className="tlui-style-panel__dropdown-picker"
|
|
69
|
+
>
|
|
70
|
+
<TldrawUiPopoverTrigger>
|
|
71
|
+
<TldrawUiToolbarButton
|
|
72
|
+
type={type}
|
|
73
|
+
data-testid={`style.${uiType}`}
|
|
74
|
+
data-direction="left"
|
|
75
|
+
title={titleStr}
|
|
76
|
+
>
|
|
77
|
+
{labelStr && <TldrawUiButtonLabel>{labelStr}</TldrawUiButtonLabel>}
|
|
78
|
+
<TldrawUiButtonIcon icon={(icon as TLUiIconType) ?? 'mixed'} />
|
|
79
|
+
</TldrawUiToolbarButton>
|
|
80
|
+
</TldrawUiPopoverTrigger>
|
|
81
|
+
<TldrawUiPopoverContent side="left" align="center">
|
|
82
|
+
<TldrawUiToolbar orientation={items.length > 4 ? 'grid' : 'horizontal'} label={labelStr}>
|
|
83
|
+
<TldrawUiMenuContextProvider type="icons" sourceId="style-panel">
|
|
84
|
+
{items.map((item) => {
|
|
85
|
+
return (
|
|
86
|
+
<TldrawUiToolbarButton
|
|
87
|
+
key={item.value}
|
|
88
|
+
type="icon"
|
|
89
|
+
data-testid={`style.${uiType}.${item.value}`}
|
|
90
|
+
title={
|
|
91
|
+
stylePanelName +
|
|
92
|
+
' — ' +
|
|
93
|
+
msg(`${uiType}-style.${item.value}` as TLUiTranslationKey)
|
|
94
|
+
}
|
|
95
|
+
isActive={icon === item.icon}
|
|
96
|
+
onClick={() => {
|
|
97
|
+
ctx.onHistoryMark('select style dropdown item')
|
|
98
|
+
onValueChange(style, item.value)
|
|
99
|
+
tlmenus.deleteOpenMenu(popoverId, editor.contextId)
|
|
100
|
+
setIsOpen(false)
|
|
101
|
+
}}
|
|
102
|
+
>
|
|
103
|
+
<TldrawUiButtonIcon icon={item.icon} />
|
|
104
|
+
</TldrawUiToolbarButton>
|
|
105
|
+
)
|
|
106
|
+
})}
|
|
107
|
+
</TldrawUiMenuContextProvider>
|
|
108
|
+
</TldrawUiToolbar>
|
|
109
|
+
</TldrawUiPopoverContent>
|
|
110
|
+
</TldrawUiPopover>
|
|
111
|
+
</TldrawUiToolbar>
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// need to export like this to get generics
|
|
116
|
+
/** @public @react */
|
|
117
|
+
export const StylePanelDropdownPicker = React.memo(DropdownPickerInner) as <T extends string>(
|
|
118
|
+
props: StylePanelDropdownPickerProps<T>
|
|
119
|
+
) => React.JSX.Element
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** @public */
|
|
2
|
+
export interface StylePanelSubheadingProps {
|
|
3
|
+
children: React.ReactNode
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
/** @public @react */
|
|
7
|
+
export function StylePanelSubheading({ children }: StylePanelSubheadingProps) {
|
|
8
|
+
return <h3 className="tlui-style-panel__subheading">{children}</h3>
|
|
9
|
+
}
|
|
@@ -2,9 +2,9 @@ import { preventDefault, TLShape, TLShapeId, useEditor } from '@tldraw/editor'
|
|
|
2
2
|
import { useCallback, useEffect, useRef, useState } from 'react'
|
|
3
3
|
import { useUiEvents } from '../../context/events'
|
|
4
4
|
import { useTranslation } from '../../hooks/useTranslation/useTranslation'
|
|
5
|
-
import { TldrawUiButton } from '../primitives/Button/TldrawUiButton'
|
|
6
5
|
import { TldrawUiButtonIcon } from '../primitives/Button/TldrawUiButtonIcon'
|
|
7
6
|
import { TldrawUiInput } from '../primitives/TldrawUiInput'
|
|
7
|
+
import { TldrawUiToolbarButton } from '../primitives/TldrawUiToolbar'
|
|
8
8
|
|
|
9
9
|
/** @public */
|
|
10
10
|
export interface AltTextEditorProps {
|
|
@@ -76,14 +76,15 @@ export function AltTextEditor({ shapeId, onClose, source }: AltTextEditorProps)
|
|
|
76
76
|
disabled={isReadonly}
|
|
77
77
|
/>
|
|
78
78
|
{!isReadonly && (
|
|
79
|
-
<
|
|
79
|
+
<TldrawUiToolbarButton
|
|
80
80
|
title={msg('tool.media-alt-text-confirm')}
|
|
81
|
+
data-testid="tool.media-alt-text-confirm"
|
|
81
82
|
type="icon"
|
|
82
83
|
onPointerDown={preventDefault}
|
|
83
84
|
onClick={handleConfirm}
|
|
84
85
|
>
|
|
85
86
|
<TldrawUiButtonIcon small icon="check" />
|
|
86
|
-
</
|
|
87
|
+
</TldrawUiToolbarButton>
|
|
87
88
|
)}
|
|
88
89
|
</>
|
|
89
90
|
)
|
|
@@ -22,7 +22,6 @@ import {
|
|
|
22
22
|
import { useActions } from '../../context/actions'
|
|
23
23
|
import { useUiEvents } from '../../context/events'
|
|
24
24
|
import { useTranslation } from '../../hooks/useTranslation/useTranslation'
|
|
25
|
-
import { TldrawUiButton } from '../primitives/Button/TldrawUiButton'
|
|
26
25
|
import { TldrawUiButtonIcon } from '../primitives/Button/TldrawUiButtonIcon'
|
|
27
26
|
import { TldrawUiButtonLabel } from '../primitives/Button/TldrawUiButtonLabel'
|
|
28
27
|
import {
|
|
@@ -32,6 +31,7 @@ import {
|
|
|
32
31
|
TldrawUiDropdownMenuTrigger,
|
|
33
32
|
} from '../primitives/TldrawUiDropdownMenu'
|
|
34
33
|
import { TldrawUiSlider } from '../primitives/TldrawUiSlider'
|
|
34
|
+
import { TldrawUiToolbarButton } from '../primitives/TldrawUiToolbar'
|
|
35
35
|
|
|
36
36
|
/** @public */
|
|
37
37
|
export interface DefaultImageToolbarContentProps {
|
|
@@ -226,9 +226,13 @@ export const DefaultImageToolbarContent = track(function DefaultImageToolbarCont
|
|
|
226
226
|
/>
|
|
227
227
|
<TldrawUiDropdownMenuRoot id="image-toolbar-aspect-ratio">
|
|
228
228
|
<TldrawUiDropdownMenuTrigger>
|
|
229
|
-
<
|
|
229
|
+
<TldrawUiToolbarButton
|
|
230
|
+
title={msg('tool.aspect-ratio')}
|
|
231
|
+
type="icon"
|
|
232
|
+
data-testid="tool.image-aspect-ratio"
|
|
233
|
+
>
|
|
230
234
|
<TldrawUiButtonIcon icon="corners" />
|
|
231
|
-
</
|
|
235
|
+
</TldrawUiToolbarButton>
|
|
232
236
|
</TldrawUiDropdownMenuTrigger>
|
|
233
237
|
<TldrawUiDropdownMenuContent side="top" align="center">
|
|
234
238
|
{ASPECT_RATIO_OPTIONS.map((aspectRatio) => {
|
|
@@ -268,14 +272,15 @@ export const DefaultImageToolbarContent = track(function DefaultImageToolbarCont
|
|
|
268
272
|
})}
|
|
269
273
|
</TldrawUiDropdownMenuContent>
|
|
270
274
|
</TldrawUiDropdownMenuRoot>
|
|
271
|
-
<
|
|
275
|
+
<TldrawUiToolbarButton
|
|
272
276
|
type="icon"
|
|
273
277
|
onClick={onManipulatingEnd}
|
|
274
|
-
data-testid="tool.image-confirm"
|
|
278
|
+
data-testid="tool.image-crop-confirm"
|
|
275
279
|
style={{ borderLeft: '1px solid var(--tl-color-divider)', marginLeft: '2px' }}
|
|
280
|
+
title={msg('tool.image-crop-confirm')}
|
|
276
281
|
>
|
|
277
282
|
<TldrawUiButtonIcon small icon="check" />
|
|
278
|
-
</
|
|
283
|
+
</TldrawUiToolbarButton>
|
|
279
284
|
</>
|
|
280
285
|
)
|
|
281
286
|
}
|
|
@@ -283,33 +288,45 @@ export const DefaultImageToolbarContent = track(function DefaultImageToolbarCont
|
|
|
283
288
|
return (
|
|
284
289
|
<>
|
|
285
290
|
{!isReadonly && (
|
|
286
|
-
<
|
|
291
|
+
<TldrawUiToolbarButton
|
|
292
|
+
type="icon"
|
|
293
|
+
data-testid="tool.image-replace"
|
|
294
|
+
onClick={handleImageReplace}
|
|
295
|
+
title={msg('tool.replace-media')}
|
|
296
|
+
>
|
|
287
297
|
<TldrawUiButtonIcon small icon="tool-media" />
|
|
288
|
-
</
|
|
298
|
+
</TldrawUiToolbarButton>
|
|
289
299
|
)}
|
|
290
300
|
{!isReadonly && (
|
|
291
|
-
<
|
|
301
|
+
<TldrawUiToolbarButton
|
|
302
|
+
type="icon"
|
|
303
|
+
title={msg('tool.image-crop')}
|
|
304
|
+
onClick={onManipulatingStart}
|
|
305
|
+
data-testid="tool.image-crop"
|
|
306
|
+
>
|
|
292
307
|
<TldrawUiButtonIcon small icon="crop" />
|
|
293
|
-
</
|
|
308
|
+
</TldrawUiToolbarButton>
|
|
294
309
|
)}
|
|
295
|
-
<
|
|
310
|
+
<TldrawUiToolbarButton
|
|
296
311
|
type="icon"
|
|
297
312
|
title={msg('action.download-original')}
|
|
298
313
|
onClick={handleImageDownload}
|
|
314
|
+
data-testid="tool.image-download"
|
|
299
315
|
>
|
|
300
316
|
<TldrawUiButtonIcon small icon="download" />
|
|
301
|
-
</
|
|
317
|
+
</TldrawUiToolbarButton>
|
|
302
318
|
{(altText || !isReadonly) && (
|
|
303
|
-
<
|
|
304
|
-
type="
|
|
319
|
+
<TldrawUiToolbarButton
|
|
320
|
+
type="icon"
|
|
305
321
|
title={msg('tool.media-alt-text')}
|
|
322
|
+
data-testid="tool.image-alt-text"
|
|
306
323
|
onClick={() => {
|
|
307
324
|
trackEvent('alt-text-start', { source })
|
|
308
325
|
onEditAltTextStart()
|
|
309
326
|
}}
|
|
310
327
|
>
|
|
311
328
|
<TldrawUiButtonIcon small icon="alt" />
|
|
312
|
-
</
|
|
329
|
+
</TldrawUiToolbarButton>
|
|
313
330
|
)}
|
|
314
331
|
</>
|
|
315
332
|
)
|
|
@@ -5,6 +5,7 @@ import { useUiEvents } from '../../context/events'
|
|
|
5
5
|
import { useTranslation } from '../../hooks/useTranslation/useTranslation'
|
|
6
6
|
import { TldrawUiButton } from '../primitives/Button/TldrawUiButton'
|
|
7
7
|
import { TldrawUiButtonIcon } from '../primitives/Button/TldrawUiButtonIcon'
|
|
8
|
+
import { TldrawUiToolbarButton } from '../primitives/TldrawUiToolbar'
|
|
8
9
|
|
|
9
10
|
/** @public */
|
|
10
11
|
export interface DefaultVideoToolbarContentProps {
|
|
@@ -44,7 +45,12 @@ export const DefaultVideoToolbarContent = track(function DefaultVideoToolbarCont
|
|
|
44
45
|
return (
|
|
45
46
|
<>
|
|
46
47
|
{!isReadonly && (
|
|
47
|
-
<TldrawUiButton
|
|
48
|
+
<TldrawUiButton
|
|
49
|
+
type="icon"
|
|
50
|
+
title={msg('tool.replace-media')}
|
|
51
|
+
onClick={handleVideoReplace}
|
|
52
|
+
data-testid="tool.video-replace"
|
|
53
|
+
>
|
|
48
54
|
<TldrawUiButtonIcon small icon="tool-media" />
|
|
49
55
|
</TldrawUiButton>
|
|
50
56
|
)}
|
|
@@ -52,21 +58,23 @@ export const DefaultVideoToolbarContent = track(function DefaultVideoToolbarCont
|
|
|
52
58
|
type="icon"
|
|
53
59
|
title={msg('action.download-original')}
|
|
54
60
|
onClick={handleVideoDownload}
|
|
61
|
+
data-testid="tool.video-download"
|
|
55
62
|
>
|
|
56
63
|
<TldrawUiButtonIcon small icon="download" />
|
|
57
64
|
</TldrawUiButton>
|
|
58
65
|
{(altText || !isReadonly) && (
|
|
59
|
-
<
|
|
60
|
-
type="
|
|
66
|
+
<TldrawUiToolbarButton
|
|
67
|
+
type="icon"
|
|
61
68
|
isActive={!!altText}
|
|
62
69
|
title={msg('tool.media-alt-text')}
|
|
70
|
+
data-testid="tool.video-alt-text"
|
|
63
71
|
onClick={() => {
|
|
64
72
|
trackEvent('alt-text-start', { source })
|
|
65
73
|
onEditAltTextStart()
|
|
66
74
|
}}
|
|
67
75
|
>
|
|
68
76
|
<TldrawUiButtonIcon small icon="alt" />
|
|
69
|
-
</
|
|
77
|
+
</TldrawUiToolbarButton>
|
|
70
78
|
)}
|
|
71
79
|
</>
|
|
72
80
|
)
|
|
@@ -2,9 +2,9 @@ import { preventDefault, TiptapEditor, useEditor } from '@tldraw/editor'
|
|
|
2
2
|
import { useEffect, useRef, useState } from 'react'
|
|
3
3
|
import { useUiEvents } from '../../context/events'
|
|
4
4
|
import { useTranslation } from '../../hooks/useTranslation/useTranslation'
|
|
5
|
-
import { TldrawUiButton } from '../primitives/Button/TldrawUiButton'
|
|
6
5
|
import { TldrawUiButtonIcon } from '../primitives/Button/TldrawUiButtonIcon'
|
|
7
6
|
import { TldrawUiInput } from '../primitives/TldrawUiInput'
|
|
7
|
+
import { TldrawUiToolbarButton } from '../primitives/TldrawUiToolbar'
|
|
8
8
|
|
|
9
9
|
/** @public */
|
|
10
10
|
export interface LinkEditorProps {
|
|
@@ -76,7 +76,7 @@ export function LinkEditor({ textEditor, value: initialValue, onClose }: LinkEdi
|
|
|
76
76
|
onCancel={handleLinkCancel}
|
|
77
77
|
placeholder="example.com"
|
|
78
78
|
/>
|
|
79
|
-
<
|
|
79
|
+
<TldrawUiToolbarButton
|
|
80
80
|
className="tlui-rich-text__toolbar-link-visit"
|
|
81
81
|
title={msg('tool.rich-text-link-visit')}
|
|
82
82
|
type="icon"
|
|
@@ -85,8 +85,8 @@ export function LinkEditor({ textEditor, value: initialValue, onClose }: LinkEdi
|
|
|
85
85
|
disabled={!value}
|
|
86
86
|
>
|
|
87
87
|
<TldrawUiButtonIcon small icon="external-link" />
|
|
88
|
-
</
|
|
89
|
-
<
|
|
88
|
+
</TldrawUiToolbarButton>
|
|
89
|
+
<TldrawUiToolbarButton
|
|
90
90
|
className="tlui-rich-text__toolbar-link-remove"
|
|
91
91
|
title={msg('tool.rich-text-link-remove')}
|
|
92
92
|
data-testid="rich-text.link-remove"
|
|
@@ -95,7 +95,7 @@ export function LinkEditor({ textEditor, value: initialValue, onClose }: LinkEdi
|
|
|
95
95
|
onClick={handleRemoveLink}
|
|
96
96
|
>
|
|
97
97
|
<TldrawUiButtonIcon small icon="trash" />
|
|
98
|
-
</
|
|
98
|
+
</TldrawUiToolbarButton>
|
|
99
99
|
</>
|
|
100
100
|
)
|
|
101
101
|
}
|
|
@@ -172,7 +172,12 @@ export const TldrawUiContextualToolbar = ({
|
|
|
172
172
|
className={classNames('tlui-contextual-toolbar', className)}
|
|
173
173
|
onPointerDown={stopEventPropagation}
|
|
174
174
|
>
|
|
175
|
-
<TldrawUiToolbar
|
|
175
|
+
<TldrawUiToolbar
|
|
176
|
+
orientation="horizontal"
|
|
177
|
+
className="tlui-menu"
|
|
178
|
+
label={label}
|
|
179
|
+
tooltipSide="top"
|
|
180
|
+
>
|
|
176
181
|
{children}
|
|
177
182
|
</TldrawUiToolbar>
|
|
178
183
|
</div>
|