Compare commits

...

5 Commits

Author SHA1 Message Date
dwelle
7f4b72010e fix changing font when editing text 2021-10-28 18:52:31 +02:00
ad1992
eff5871147 Add more redacted fonts 2021-10-28 21:59:50 +05:30
ad1992
4eb5ec70be Add blokk 2021-10-28 14:17:35 +05:30
ad1992
ae2ab5f03a Add scribble 2021-10-28 13:46:56 +05:30
ad1992
468f20ae58 feat: Add wireframe font redacted 2021-10-28 13:23:10 +05:30
15 changed files with 148 additions and 37 deletions

Binary file not shown.

View File

@ -11,3 +11,33 @@
src: url("Cascadia.woff2"); src: url("Cascadia.woff2");
font-display: swap; font-display: swap;
} }
@font-face {
font-family: "REDACTED_REGULAR";
src: url("redacted-regular.woff2");
font-display: swap;
}
@font-face {
font-family: "REDACTED_SCRIPT_BOLD";
src: url("redacted-script-bold.woff2");
font-display: swap;
}
@font-face {
font-family: "REDACTED_SCRIPT_REGULAR";
src: url("redacted-script-regular.woff2");
font-display: swap;
}
@font-face {
font-family: "Scribble";
src: url("scribble-webfont.woff2");
font-display: swap;
}
@font-face {
font-family: "Blokk";
src: url("BLOKKNeue-Regular.woff2");
font-display: swap;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -13,9 +13,9 @@ import {
FillCrossHatchIcon, FillCrossHatchIcon,
FillHachureIcon, FillHachureIcon,
FillSolidIcon, FillSolidIcon,
FontFamilyCodeIcon, // FontFamilyCodeIcon,
FontFamilyHandDrawnIcon, // FontFamilyHandDrawnIcon,
FontFamilyNormalIcon, // FontFamilyNormalIcon,
FontSizeExtraLargeIcon, FontSizeExtraLargeIcon,
FontSizeLargeIcon, FontSizeLargeIcon,
FontSizeMediumIcon, FontSizeMediumIcon,
@ -34,7 +34,7 @@ import {
import { import {
DEFAULT_FONT_FAMILY, DEFAULT_FONT_FAMILY,
DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE,
FONT_FAMILY, //FONT_FAMILY,
} from "../constants"; } from "../constants";
import { import {
getNonDeletedElements, getNonDeletedElements,
@ -48,7 +48,7 @@ import {
ExcalidrawElement, ExcalidrawElement,
ExcalidrawLinearElement, ExcalidrawLinearElement,
ExcalidrawTextElement, ExcalidrawTextElement,
FontFamilyValues, //FontFamilyValues,
TextAlign, TextAlign,
} from "../element/types"; } from "../element/types";
import { getLanguage, t } from "../i18n"; import { getLanguage, t } from "../i18n";
@ -62,6 +62,7 @@ import {
} from "../scene"; } from "../scene";
import { hasStrokeColor } from "../scene/comparisons"; import { hasStrokeColor } from "../scene/comparisons";
import { register } from "./register"; import { register } from "./register";
import FontsList from "../components/FontList";
const changeProperty = ( const changeProperty = (
elements: readonly ExcalidrawElement[], elements: readonly ExcalidrawElement[],
@ -506,41 +507,43 @@ export const actionChangeFontFamily = register({
}; };
}, },
PanelComponent: ({ elements, appState, updateData }) => { PanelComponent: ({ elements, appState, updateData }) => {
const options: { // const options: {
value: FontFamilyValues; // value: FontFamilyValues;
text: string; // text: string;
icon: JSX.Element; // icon: JSX.Element;
}[] = [ // }[] = [
{ // {
value: FONT_FAMILY.Virgil, // value: FONT_FAMILY.Virgil,
text: t("labels.handDrawn"), // text: t("labels.handDrawn"),
icon: <FontFamilyHandDrawnIcon theme={appState.theme} />, // icon: <FontFamilyHandDrawnIcon theme={appState.theme} />,
}, // },
{ // {
value: FONT_FAMILY.Helvetica, // value: FONT_FAMILY.Helvetica,
text: t("labels.normal"), // text: t("labels.normal"),
icon: <FontFamilyNormalIcon theme={appState.theme} />, // icon: <FontFamilyNormalIcon theme={appState.theme} />,
}, // },
{ // {
value: FONT_FAMILY.Cascadia, // value: FONT_FAMILY.Cascadia,
text: t("labels.code"), // text: t("labels.code"),
icon: <FontFamilyCodeIcon theme={appState.theme} />, // icon: <FontFamilyCodeIcon theme={appState.theme} />,
}, // },
]; // ];
return ( return (
<fieldset> <fieldset>
<legend>{t("labels.fontFamily")}</legend> <legend>{t("labels.fontFamily")}</legend>
<ButtonIconSelect<FontFamilyValues | false> <FontsList
group="font-family" onChange={(val) => {
options={options} updateData(val);
value={getFormValue( }}
elements, currentFontFamily={
appState, getFormValue(
(element) => isTextElement(element) && element.fontFamily, elements,
appState.currentItemFontFamily || DEFAULT_FONT_FAMILY, appState,
)} (element) => isTextElement(element) && element.fontFamily,
onChange={(value) => updateData(value)} appState.currentItemFontFamily || DEFAULT_FONT_FAMILY,
) || DEFAULT_FONT_FAMILY
}
/> />
</fieldset> </fieldset>
); );

View File

@ -1919,6 +1919,10 @@ class App extends React.Component<AppProps, AppState> {
this.setState({ this.setState({
draggingElement: null, draggingElement: null,
editingElement: null, editingElement: null,
selectedElementIds: {
...this.state.selectedElementIds,
[element.id]: true,
},
}); });
if (this.state.elementLocked) { if (this.state.elementLocked) {
setCursorForShape(this.canvas, this.state.elementType); setCursorForShape(this.canvas, this.state.elementType);

View File

@ -0,0 +1,53 @@
import { FONT_FAMILY } from "../constants";
import { FontFamilyValues } from "../element/types";
const FontsList = ({
onChange,
currentFontFamily,
}: {
onChange: (val: FontFamilyValues) => void;
currentFontFamily: FontFamilyValues;
}) => {
return (
<select
className="dropdown-select"
onChange={(event) => {
onChange(Number(event.target.value));
}}
value={currentFontFamily}
>
<option key="virgil" value={FONT_FAMILY.Virgil}>
Hand-Drawn
</option>
<option key="helvetica" value={FONT_FAMILY.Helvetica}>
Normal
</option>
<option key="cascadia" value={FONT_FAMILY.Cascadia}>
code
</option>
<option key="redacted-regular" value={FONT_FAMILY.REDACTED_REGULAR}>
Redacted Regular
</option>
<option
key="redacted-script-regular"
value={FONT_FAMILY.REDACTED_SCRIPT_REGULAR}
>
Redacted Script
</option>
<option
key="redacted-script-bold"
value={FONT_FAMILY.REDACTED_SCRIPT_BOLD}
>
Redacted Script BOLD
</option>
<option key="Scribble" value={FONT_FAMILY.SCRIBBLE}>
Scribble
</option>
<option key="Blokk" value={FONT_FAMILY.BLOKK}>
Blokk
</option>
</select>
);
};
export default FontsList;

View File

@ -725,6 +725,7 @@ const LayerUI = ({
> >
{renderCustomFooter?.(false, appState)} {renderCustomFooter?.(false, appState)}
</div> </div>
<div <div
className={clsx( className={clsx(
"layer-ui__wrapper__footer-right zen-mode-transition", "layer-ui__wrapper__footer-right zen-mode-transition",

View File

@ -847,6 +847,18 @@ export const FontFamilyCodeIcon = React.memo(({ theme }: { theme: Theme }) =>
), ),
); );
export const FontFamilyWireframeIcon = React.memo(
({ theme }: { theme: Theme }) =>
createIcon(
<>
<path
fill={iconFillColor(theme)}
d="M448 75.2v361.7c0 24.3-19 43.2-43.2 43.2H43.2C19.3 480 0 461.4 0 436.8V75.2C0 51.1 18.8 32 43.2 32h361.7c24 0 43.1 18.8 43.1 43.2zm-37.3 361.6V75.2c0-3-2.6-5.8-5.8-5.8h-9.3L285.3 144 224 94.1 162.8 144 52.5 69.3h-9.3c-3.2 0-5.8 2.8-5.8 5.8v361.7c0 3 2.6 5.8 5.8 5.8h361.7c3.2.1 5.8-2.7 5.8-5.8zM150.2 186v37H76.7v-37h73.5zm0 74.4v37.3H76.7v-37.3h73.5zm11.1-147.3l54-43.7H96.8l64.5 43.7zm210 72.9v37h-196v-37h196zm0 74.4v37.3h-196v-37.3h196zm-84.6-147.3l64.5-43.7H232.8l53.9 43.7zM371.3 335v37.3h-99.4V335h99.4z"
></path>
</>,
),
);
export const TextAlignLeftIcon = React.memo(({ theme }: { theme: Theme }) => export const TextAlignLeftIcon = React.memo(({ theme }: { theme: Theme }) =>
createIcon( createIcon(
<path <path

View File

@ -68,6 +68,11 @@ export const FONT_FAMILY = {
Virgil: 1, Virgil: 1,
Helvetica: 2, Helvetica: 2,
Cascadia: 3, Cascadia: 3,
REDACTED_REGULAR: 4,
REDACTED_SCRIPT_REGULAR: 5,
REDACTED_SCRIPT_BOLD: 6,
SCRIBBLE: 7,
BLOKK: 8,
}; };
export const THEME = { export const THEME = {

View File

@ -319,7 +319,9 @@ export const textWysiwyg = ({
// prevent blur when changing properties from the menu // prevent blur when changing properties from the menu
const onPointerDown = (event: MouseEvent) => { const onPointerDown = (event: MouseEvent) => {
if ( if (event.target instanceof HTMLSelectElement) {
handleSubmit();
} else if (
(event.target instanceof HTMLElement || (event.target instanceof HTMLElement ||
event.target instanceof SVGElement) && event.target instanceof SVGElement) &&
event.target.closest(`.${CLASSES.SHAPE_ACTIONS_MENU}`) && event.target.closest(`.${CLASSES.SHAPE_ACTIONS_MENU}`) &&

View File

@ -50,6 +50,7 @@
"handDrawn": "Hand-drawn", "handDrawn": "Hand-drawn",
"normal": "Normal", "normal": "Normal",
"code": "Code", "code": "Code",
"wireframe": "Wireframe",
"small": "Small", "small": "Small",
"medium": "Medium", "medium": "Medium",
"large": "Large", "large": "Large",