diff --git a/src/actions/actionProperties.tsx b/src/actions/actionProperties.tsx index 5d025546..2589fc77 100644 --- a/src/actions/actionProperties.tsx +++ b/src/actions/actionProperties.tsx @@ -1,4 +1,5 @@ import React from "react"; +import { getLanguage } from "../i18n"; import { ExcalidrawElement, ExcalidrawTextElement, @@ -16,7 +17,7 @@ import { } from "../scene"; import { ButtonSelect } from "../components/ButtonSelect"; import { ButtonIconSelect } from "../components/ButtonIconSelect"; -import { ButtonIconCycle } from "../components/ButtonIconCycle"; +import { IconPicker } from "../components/IconPicker"; import { isTextElement, redrawTextBoundingBox, @@ -43,7 +44,10 @@ import { SloppinessArchitectIcon, SloppinessArtistIcon, SloppinessCartoonistIcon, - ArrowArrowheadIcon, + ArrowheadArrowIcon, + ArrowheadBarIcon, + ArrowheadDotIcon, + ArrowheadNoneIcon, } from "../components/icons"; import { EVENT_CHANGE, trackEvent } from "../analytics"; import colors from "../colors"; @@ -671,66 +675,124 @@ export const actionChangeArrowhead = register({ commitToHistory: true, }; }, - PanelComponent: ({ elements, appState, updateData }) => ( -
- ), + PanelComponent: ({ elements, appState, updateData }) => { + const isRTL = getLanguage().rtl; + + return ( + + ); + }, }); diff --git a/src/components/IconPicker.scss b/src/components/IconPicker.scss new file mode 100644 index 00000000..49be1ca0 --- /dev/null +++ b/src/components/IconPicker.scss @@ -0,0 +1,137 @@ +@import "open-color/open-color.scss"; + +.excalidraw { + .picker-container { + display: inline-block; + box-sizing: border-box; + margin-right: 0.25rem; + } + + .picker { + background: var(--popup-background-color); + border: 0px solid transparentize($oc-white, 0.75); + box-shadow: transparentize($oc-black, 0.75) 0px 1px 4px; + border-radius: 4px; + position: absolute; + } + + .picker-container button, + .picker button { + position: relative; + display: flex; + align-items: center; + justify-content: center; + + &:focus { + outline: transparent; + background-color: var(--button-gray-2); + & svg { + opacity: 1; + } + } + + &:hover { + background-color: var(--button-gray-2); + } + + &:active { + background-color: var(--button-gray-3); + } + + &:disabled { + cursor: not-allowed; + } + + svg { + margin: 0; + width: 36px; + height: 18px; + opacity: 0.6; + pointer-events: none; + } + } + + .picker button { + padding: 0.25rem 0.28rem 0.35rem 0.25rem; + } + + .picker-triangle { + width: 0px; + height: 0px; + position: relative; + top: -10px; + :root[dir="ltr"] & { + left: 12px; + } + + :root[dir="rtl"] & { + right: 12px; + } + z-index: 10; + + &:before { + content: ""; + position: absolute; + border-style: solid; + border-width: 0px 9px 10px; + border-color: transparent transparent transparentize($oc-black, 0.9); + top: -1px; + } + + &:after { + content: ""; + position: absolute; + border-style: solid; + border-width: 0px 9px 10px; + border-color: transparent transparent var(--popup-background-color); + } + } + + .picker-content { + padding: 0.5rem; + display: grid; + grid-auto-flow: column; + grid-gap: 0.5rem; + border-radius: 4px; + } + + .picker-keybinding { + position: absolute; + bottom: 2px; + + :root[dir="ltr"] & { + right: 2px; + } + + :root[dir="rtl"] & { + left: 2px; + } + + font-size: 0.7em; + } + + .picker-type-canvasBackground .picker-keybinding { + color: #aaa; + } + + .picker-type-elementBackground .picker-keybinding { + color: #fff; + } + + .picker-swatch[aria-label="transparent"] .picker-keybinding { + color: #aaa; + } + + .picker-type-elementStroke .picker-keybinding { + color: #d4d4d4; + } + + &.Appearance_dark { + .picker-type-elementBackground .picker-keybinding { + color: #000; + } + .picker-swatch[aria-label="transparent"] .picker-keybinding { + color: #000; + } + } +} diff --git a/src/components/IconPicker.tsx b/src/components/IconPicker.tsx new file mode 100644 index 00000000..77e9d5f8 --- /dev/null +++ b/src/components/IconPicker.tsx @@ -0,0 +1,188 @@ +import React from "react"; +import { Popover } from "./Popover"; + +import "./IconPicker.scss"; +import { isArrowKey, KEYS } from "../keys"; +import { getLanguage } from "../i18n"; + +function Picker