diff --git a/packages/excalidraw/actions/actionProperties.tsx b/packages/excalidraw/actions/actionProperties.tsx index 7ad8e6fdb..031a080ce 100644 --- a/packages/excalidraw/actions/actionProperties.tsx +++ b/packages/excalidraw/actions/actionProperties.tsx @@ -1542,46 +1542,92 @@ export const actionChangeArrowhead = register({ }; }, PanelComponent: ({ elements, appState, updateData }) => { + const customOptions = useContext(ExcalidrawPropsCustomOptionsContext); + const isRTL = getLanguage().rtl; return (
{t("labels.arrowheads")} -
- ( - elements, - appState, - (element) => - isLinearElement(element) && canHaveArrowheads(element.type) - ? element.startArrowhead - : appState.currentItemStartArrowhead, - true, - appState.currentItemStartArrowhead, - )} - onChange={(value) => updateData({ position: "start", type: value })} - numberOfOptionsToAlwaysShow={4} - /> - ( - elements, - appState, - (element) => - isLinearElement(element) && canHaveArrowheads(element.type) - ? element.endArrowhead - : appState.currentItemEndArrowhead, - true, - appState.currentItemEndArrowhead, - )} - onChange={(value) => updateData({ position: "end", type: value })} - numberOfOptionsToAlwaysShow={4} - /> -
+ {customOptions?.pickerRenders?.ButtonList && ( + + ( + elements, + appState, + (element) => + isLinearElement(element) && canHaveArrowheads(element.type) + ? element.startArrowhead + : appState.currentItemStartArrowhead, + true, + appState.currentItemStartArrowhead, + )} + onChange={(value) => + updateData({ position: "start", type: value }) + } + numberOfOptionsToAlwaysShow={4} + /> + ( + elements, + appState, + (element) => + isLinearElement(element) && canHaveArrowheads(element.type) + ? element.endArrowhead + : appState.currentItemEndArrowhead, + true, + appState.currentItemEndArrowhead, + )} + onChange={(value) => updateData({ position: "end", type: value })} + numberOfOptionsToAlwaysShow={4} + /> + + )} + + {!customOptions?.pickerRenders?.ButtonList && ( +
+ ( + elements, + appState, + (element) => + isLinearElement(element) && canHaveArrowheads(element.type) + ? element.startArrowhead + : appState.currentItemStartArrowhead, + true, + appState.currentItemStartArrowhead, + )} + onChange={(value) => + updateData({ position: "start", type: value }) + } + numberOfOptionsToAlwaysShow={4} + /> + ( + elements, + appState, + (element) => + isLinearElement(element) && canHaveArrowheads(element.type) + ? element.endArrowhead + : appState.currentItemEndArrowhead, + true, + appState.currentItemEndArrowhead, + )} + onChange={(value) => updateData({ position: "end", type: value })} + numberOfOptionsToAlwaysShow={4} + /> +
+ )}
); }, diff --git a/packages/excalidraw/components/IconPicker.tsx b/packages/excalidraw/components/IconPicker.tsx index 5630ae8d7..04398834f 100644 --- a/packages/excalidraw/components/IconPicker.tsx +++ b/packages/excalidraw/components/IconPicker.tsx @@ -1,12 +1,14 @@ import * as Popover from "@radix-ui/react-popover"; import clsx from "clsx"; -import React, { useEffect } from "react"; +import React, { useContext, useEffect } from "react"; import { isArrowKey, KEYS } from "@excalidraw/common"; import { atom, useAtom } from "../editor-jotai"; import { getLanguage, t } from "../i18n"; +import { ExcalidrawPropsCustomOptionsContext } from "../types"; + import Collapsible from "./Stats/Collapsible"; import { useDevice } from "./App"; @@ -115,39 +117,63 @@ function Picker({ } }, [value, alwaysVisibleOptions, setShowMoreOptions]); + const customOptions = useContext(ExcalidrawPropsCustomOptionsContext); + const renderOptions = (options: Option[]) => { return (
- {options.map((option, i) => ( - - ))} + title: option.text, + children: ( + <> + {option.icon} + {/* {option.keyBinding && ( + + {option.keyBinding} + + )} */} + + ), + key: option.text, + onClick: () => onChange(option.value), + name: option.text, + }); + } + + return ( + + ); + })}
); }; @@ -162,7 +188,7 @@ function Picker({ align="start" sideOffset={12} style={{ zIndex: "var(--zIndex-popup)" }} - onKeyDown={handleKeyDown} + onKeyDown={customOptions?.disableKeyEvents ? undefined : handleKeyDown} >
({ numberOfOptionsToAlwaysShow?: number; group?: string; }) { + const customOptions = useContext(ExcalidrawPropsCustomOptionsContext); + const [isActive, setActive] = React.useState(false); const rPickerButton = React.useRef(null); + const renderTrigger = () => { + if (customOptions?.pickerRenders?.layerButtonRender) { + return ( + <> + setActive(!isActive)} + ref={rPickerButton} + className={isActive ? "active" : ""} + style={{ + padding: 0, + border: "unset", + width: 0, + }} + > + {options.find((option) => option.value === value)?.icon} + + {customOptions.pickerRenders.layerButtonRender({ + name: group, + title: "", + onClick: () => setActive(!isActive), + children: options.find((option) => option.value === value)?.icon, + active: isActive, + })} + + ); + } + }; + return (
setActive(open)}> - setActive(!isActive)} - ref={rPickerButton} - className={isActive ? "active" : ""} - > - {options.find((option) => option.value === value)?.icon} - + {renderTrigger()} {isActive && ( { wrapper.replaceChildren(canvas); canvas.classList.add("excalidraw__canvas", "static"); + canvas.id = "excalidraw__content-canvas"; } const widthString = `${props.appState.width}px`; diff --git a/packages/excalidraw/locales/zh-CN.json b/packages/excalidraw/locales/zh-CN.json index 5fbab16d7..404780184 100644 --- a/packages/excalidraw/locales/zh-CN.json +++ b/packages/excalidraw/locales/zh-CN.json @@ -44,12 +44,19 @@ "arrowhead_triangle_outline": "三角箭头(空心)", "arrowhead_diamond": "菱形", "arrowhead_diamond_outline": "菱形(空心)", + "arrowhead_crowfoot_many": "交叉箭头(多个)", + "arrowhead_crowfoot_one": "交叉箭头(一个)", + "arrowhead_crowfoot_one_or_many": "交叉箭头(一个或多个)", "arrowtypes": "箭头类型", + "arrowtype_sharp": "尖锐箭头", + "arrowtype_round": "圆润箭头", + "arrowtype_elbowed": "弯曲箭头", "fontSize": "字体大小", "fontFamily": "字体", "addWatermark": "添加 “使用 Excalidraw 创建” 水印", "handDrawn": "手写", "normal": "普通", + "more_options": "更多选项", "code": "代码", "small": "小", "medium": "中", diff --git a/packages/excalidraw/locales/zh-TW.json b/packages/excalidraw/locales/zh-TW.json index 149ed5a86..f9aa4779c 100644 --- a/packages/excalidraw/locales/zh-TW.json +++ b/packages/excalidraw/locales/zh-TW.json @@ -44,11 +44,19 @@ "arrowhead_triangle_outline": "三角形(外框)", "arrowhead_diamond": "菱形", "arrowhead_diamond_outline": "菱形(外框)", + "arrowhead_crowfoot_many": "交叉箭頭(多個)", + "arrowhead_crowfoot_one": "交叉箭頭(一個)", + "arrowhead_crowfoot_one_or_many": "交叉箭頭(一個或多個)", + "arrowtypes": "箭頭類型", + "arrowtype_sharp": "尖銳箭頭", + "arrowtype_round": "圓潤箭頭", + "arrowtype_elbowed": "彎曲箭頭", "fontSize": "字型大小", "fontFamily": "字體集", "addWatermark": "加上 \"Made with Excalidraw\" 浮水印", "handDrawn": "手寫", "normal": "一般", + "more_options": "更多選項", "code": "代碼", "small": "小", "medium": "中", diff --git a/packages/excalidraw/types.ts b/packages/excalidraw/types.ts index 6a1827239..6c6ee46b2 100644 --- a/packages/excalidraw/types.ts +++ b/packages/excalidraw/types.ts @@ -544,7 +544,7 @@ export interface ExcalidrawPropsCustomOptions { menuRender?: (props: { children: React.ReactNode }) => React.ReactNode; }; pickerRenders?: { - ButtonList?: React.ComponentType<{ children: React.ReactNode }>; + ButtonList?: React.ComponentType<{ children: React.ReactNode; className?: string }>; elementStrokeColors?: ColorTuple; elementBackgroundColors?: ColorTuple; buttonIconSelectRender?: ( @@ -569,6 +569,8 @@ export interface ExcalidrawPropsCustomOptions { name: string; visible?: boolean; hidden?: boolean; + key?: string; + active?: boolean; }) => JSX.Element; rangeRender?: (props: { value: number;