diff --git a/examples/excalidraw/components/App.scss b/examples/excalidraw/components/ExampleApp.scss similarity index 100% rename from examples/excalidraw/components/App.scss rename to examples/excalidraw/components/ExampleApp.scss diff --git a/examples/excalidraw/components/App.tsx b/examples/excalidraw/components/ExampleApp.tsx similarity index 99% rename from examples/excalidraw/components/App.tsx rename to examples/excalidraw/components/ExampleApp.tsx index 7cfd8a05a..1e296786e 100644 --- a/examples/excalidraw/components/App.tsx +++ b/examples/excalidraw/components/ExampleApp.tsx @@ -40,7 +40,7 @@ import type { } from "@excalidraw/excalidraw/dist/excalidraw/element/types"; import type { ImportedLibraryData } from "@excalidraw/excalidraw/dist/excalidraw/data/types"; -import "./App.scss"; +import "./ExampleApp.scss"; type Comment = { x: number; @@ -73,7 +73,7 @@ export interface AppProps { excalidrawLib: typeof TExcalidraw; } -export default function App({ +export default function ExampleApp({ appTitle, useCustom, customArgs, diff --git a/examples/excalidraw/with-nextjs/src/excalidrawWrapper.tsx b/examples/excalidraw/with-nextjs/src/excalidrawWrapper.tsx index 40af9f0cc..e9fa3bb23 100644 --- a/examples/excalidraw/with-nextjs/src/excalidrawWrapper.tsx +++ b/examples/excalidraw/with-nextjs/src/excalidrawWrapper.tsx @@ -1,7 +1,7 @@ "use client"; import * as excalidrawLib from "@excalidraw/excalidraw"; import { Excalidraw } from "@excalidraw/excalidraw"; -import App from "../../components/App"; +import App from "../../components/ExampleApp"; import "@excalidraw/excalidraw/index.css"; diff --git a/examples/excalidraw/with-script-in-browser/index.tsx b/examples/excalidraw/with-script-in-browser/index.tsx index e8584d7ca..00daaddc8 100644 --- a/examples/excalidraw/with-script-in-browser/index.tsx +++ b/examples/excalidraw/with-script-in-browser/index.tsx @@ -1,4 +1,4 @@ -import App from "../components/App"; +import App from "../components/ExampleApp"; import React, { StrictMode } from "react"; import { createRoot } from "react-dom/client"; diff --git a/excalidraw-app/App.tsx b/excalidraw-app/App.tsx index 0076eead1..9b7eadff8 100644 --- a/excalidraw-app/App.tsx +++ b/excalidraw-app/App.tsx @@ -649,7 +649,12 @@ const ExcalidrawWrapper = () => { // Render the debug scene if the debug canvas is available if (debugCanvasRef.current && excalidrawAPI) { - debugRenderer(debugCanvasRef.current, appState, window.devicePixelRatio); + debugRenderer( + debugCanvasRef.current, + appState, + window.devicePixelRatio, + () => forceRefresh((prev) => !prev), + ); } }; diff --git a/excalidraw-app/components/DebugCanvas.tsx b/excalidraw-app/components/DebugCanvas.tsx index b610ab7b5..471167989 100644 --- a/excalidraw-app/components/DebugCanvas.tsx +++ b/excalidraw-app/components/DebugCanvas.tsx @@ -68,12 +68,17 @@ const _debugRenderer = ( canvas: HTMLCanvasElement, appState: AppState, scale: number, + refresh: () => void, ) => { const [normalizedWidth, normalizedHeight] = getNormalizedCanvasDimensions( canvas, scale, ); + if (appState.height !== canvas.height || appState.width !== canvas.width) { + refresh(); + } + const context = bootstrapCanvas({ canvas, scale, @@ -138,8 +143,13 @@ export const saveDebugState = (debug: { enabled: boolean }) => { }; export const debugRenderer = throttleRAF( - (canvas: HTMLCanvasElement, appState: AppState, scale: number) => { - _debugRenderer(canvas, appState, scale); + ( + canvas: HTMLCanvasElement, + appState: AppState, + scale: number, + refresh: () => void, + ) => { + _debugRenderer(canvas, appState, scale, refresh); }, { trailing: true }, ); diff --git a/excalidraw-app/data/LocalData.ts b/excalidraw-app/data/LocalData.ts index df753c89b..c8ac5b19a 100644 --- a/excalidraw-app/data/LocalData.ts +++ b/excalidraw-app/data/LocalData.ts @@ -20,7 +20,10 @@ import { get, } from "idb-keyval"; import { clearAppStateForLocalStorage } from "../../packages/excalidraw/appState"; -import { SEARCH_SIDEBAR } from "../../packages/excalidraw/constants"; +import { + CANVAS_SEARCH_TAB, + DEFAULT_SIDEBAR, +} from "../../packages/excalidraw/constants"; import type { LibraryPersistedData } from "../../packages/excalidraw/data/library"; import type { ImportedDataState } from "../../packages/excalidraw/data/types"; import { clearElementsForLocalStorage } from "../../packages/excalidraw/element"; @@ -69,7 +72,10 @@ const saveDataStateToLocalStorage = ( try { const _appState = clearAppStateForLocalStorage(appState); - if (_appState.openSidebar?.name === SEARCH_SIDEBAR.name) { + if ( + _appState.openSidebar?.name === DEFAULT_SIDEBAR.name && + _appState.openSidebar.tab === CANVAS_SEARCH_TAB + ) { _appState.openSidebar = null; } diff --git a/excalidraw-app/index.html b/excalidraw-app/index.html index 7ec74e181..02f153d8c 100644 --- a/excalidraw-app/index.html +++ b/excalidraw-app/index.html @@ -130,15 +130,6 @@ <% } %> - - - `. [#8107](https://github.com/excalidraw/excalidraw/pull/8135) - Added support for multiplayer undo/redo, by calculating invertible increments and storing them inside the local-only undo/redo stacks. [#7348](https://github.com/excalidraw/excalidraw/pull/7348) diff --git a/packages/excalidraw/actions/actionCanvas.tsx b/packages/excalidraw/actions/actionCanvas.tsx index 35fabcaf9..83b0ad529 100644 --- a/packages/excalidraw/actions/actionCanvas.tsx +++ b/packages/excalidraw/actions/actionCanvas.tsx @@ -24,7 +24,7 @@ import { CODES, KEYS } from "../keys"; import { getNormalizedZoom } from "../scene"; import { centerScrollOn } from "../scene/scroll"; import { getStateForZoom } from "../scene/zoom"; -import type { AppState } from "../types"; +import type { AppState, Offsets } from "../types"; import { getShortcutKey, updateActiveTool } from "../utils"; import { register } from "./register"; import { Tooltip } from "../components/Tooltip"; @@ -38,7 +38,7 @@ import { DEFAULT_CANVAS_BACKGROUND_PICKS } from "../colors"; import type { SceneBounds } from "../element/bounds"; import { setCursor } from "../cursor"; import { StoreAction } from "../store"; -import { clamp } from "../../math"; +import { clamp, roundToStep } from "../../math"; export const actionChangeViewBackgroundColor = register({ name: "changeViewBackgroundColor", @@ -259,89 +259,85 @@ const zoomValueToFitBoundsOnViewport = ( const adjustedZoomValue = smallestZoomValue * clamp(viewportZoomFactor, 0.1, 1); - const zoomAdjustedToSteps = - Math.floor(adjustedZoomValue / ZOOM_STEP) * ZOOM_STEP; - - return getNormalizedZoom(Math.min(zoomAdjustedToSteps, 1)); + return Math.min(adjustedZoomValue, 1); }; export const zoomToFitBounds = ({ bounds, appState, + canvasOffsets, fitToViewport = false, viewportZoomFactor = 1, + minZoom = -Infinity, + maxZoom = Infinity, }: { bounds: SceneBounds; + canvasOffsets?: Offsets; appState: Readonly; /** whether to fit content to viewport (beyond >100%) */ fitToViewport: boolean; /** zoom content to cover X of the viewport, when fitToViewport=true */ viewportZoomFactor?: number; + minZoom?: number; + maxZoom?: number; }) => { + viewportZoomFactor = clamp(viewportZoomFactor, MIN_ZOOM, MAX_ZOOM); + const [x1, y1, x2, y2] = bounds; const centerX = (x1 + x2) / 2; const centerY = (y1 + y2) / 2; - let newZoomValue; - let scrollX; - let scrollY; + const canvasOffsetLeft = canvasOffsets?.left ?? 0; + const canvasOffsetTop = canvasOffsets?.top ?? 0; + const canvasOffsetRight = canvasOffsets?.right ?? 0; + const canvasOffsetBottom = canvasOffsets?.bottom ?? 0; + + const effectiveCanvasWidth = + appState.width - canvasOffsetLeft - canvasOffsetRight; + const effectiveCanvasHeight = + appState.height - canvasOffsetTop - canvasOffsetBottom; + + let adjustedZoomValue; if (fitToViewport) { const commonBoundsWidth = x2 - x1; const commonBoundsHeight = y2 - y1; - newZoomValue = + adjustedZoomValue = Math.min( - appState.width / commonBoundsWidth, - appState.height / commonBoundsHeight, - ) * clamp(viewportZoomFactor, 0.1, 1); - - newZoomValue = getNormalizedZoom(newZoomValue); - - let appStateWidth = appState.width; - - if (appState.openSidebar) { - const sidebarDOMElem = document.querySelector( - ".sidebar", - ) as HTMLElement | null; - const sidebarWidth = sidebarDOMElem?.offsetWidth ?? 0; - const isRTL = document.documentElement.getAttribute("dir") === "rtl"; - - appStateWidth = !isRTL - ? appState.width - sidebarWidth - : appState.width + sidebarWidth; - } - - scrollX = (appStateWidth / 2) * (1 / newZoomValue) - centerX; - scrollY = (appState.height / 2) * (1 / newZoomValue) - centerY; + effectiveCanvasWidth / commonBoundsWidth, + effectiveCanvasHeight / commonBoundsHeight, + ) * viewportZoomFactor; } else { - newZoomValue = zoomValueToFitBoundsOnViewport( + adjustedZoomValue = zoomValueToFitBoundsOnViewport( bounds, { - width: appState.width, - height: appState.height, + width: effectiveCanvasWidth, + height: effectiveCanvasHeight, }, viewportZoomFactor, ); - - const centerScroll = centerScrollOn({ - scenePoint: { x: centerX, y: centerY }, - viewportDimensions: { - width: appState.width, - height: appState.height, - }, - zoom: { value: newZoomValue }, - }); - - scrollX = centerScroll.scrollX; - scrollY = centerScroll.scrollY; } + const newZoomValue = getNormalizedZoom( + clamp(roundToStep(adjustedZoomValue, ZOOM_STEP, "floor"), minZoom, maxZoom), + ); + + const centerScroll = centerScrollOn({ + scenePoint: { x: centerX, y: centerY }, + viewportDimensions: { + width: appState.width, + height: appState.height, + }, + offsets: canvasOffsets, + zoom: { value: newZoomValue }, + }); + return { appState: { ...appState, - scrollX, - scrollY, + scrollX: centerScroll.scrollX, + scrollY: centerScroll.scrollY, zoom: { value: newZoomValue }, }, storeAction: StoreAction.NONE, @@ -349,25 +345,34 @@ export const zoomToFitBounds = ({ }; export const zoomToFit = ({ + canvasOffsets, targetElements, appState, fitToViewport, viewportZoomFactor, + minZoom, + maxZoom, }: { + canvasOffsets?: Offsets; targetElements: readonly ExcalidrawElement[]; appState: Readonly; /** whether to fit content to viewport (beyond >100%) */ fitToViewport: boolean; /** zoom content to cover X of the viewport, when fitToViewport=true */ viewportZoomFactor?: number; + minZoom?: number; + maxZoom?: number; }) => { const commonBounds = getCommonBounds(getNonDeletedElements(targetElements)); return zoomToFitBounds({ + canvasOffsets, bounds: commonBounds, appState, fitToViewport, viewportZoomFactor, + minZoom, + maxZoom, }); }; @@ -388,6 +393,7 @@ export const actionZoomToFitSelectionInViewport = register({ userToFollow: null, }, fitToViewport: false, + canvasOffsets: app.getEditorUIOffsets(), }); }, // NOTE shift-2 should have been assigned actionZoomToFitSelection. @@ -413,7 +419,7 @@ export const actionZoomToFitSelection = register({ userToFollow: null, }, fitToViewport: true, - viewportZoomFactor: 0.7, + canvasOffsets: app.getEditorUIOffsets(), }); }, // NOTE this action should use shift-2 per figma, alas @@ -430,7 +436,7 @@ export const actionZoomToFit = register({ icon: zoomAreaIcon, viewMode: true, trackEvent: { category: "canvas" }, - perform: (elements, appState) => + perform: (elements, appState, _, app) => zoomToFit({ targetElements: elements, appState: { @@ -438,6 +444,7 @@ export const actionZoomToFit = register({ userToFollow: null, }, fitToViewport: false, + canvasOffsets: app.getEditorUIOffsets(), }), keyTest: (event) => event.code === CODES.ONE && diff --git a/packages/excalidraw/actions/actionFinalize.tsx b/packages/excalidraw/actions/actionFinalize.tsx index f19ab981f..f8c80e52e 100644 --- a/packages/excalidraw/actions/actionFinalize.tsx +++ b/packages/excalidraw/actions/actionFinalize.tsx @@ -217,6 +217,7 @@ export const actionFinalize = register({ onClick={updateData} visible={appState.multiElement != null} size={data?.size || "medium"} + style={{ pointerEvents: "all" }} /> ), }); diff --git a/packages/excalidraw/actions/actionFlip.test.tsx b/packages/excalidraw/actions/actionFlip.test.tsx new file mode 100644 index 000000000..c8a6239cd --- /dev/null +++ b/packages/excalidraw/actions/actionFlip.test.tsx @@ -0,0 +1,211 @@ +import React from "react"; +import { Excalidraw } from "../index"; +import { render } from "../tests/test-utils"; +import { API } from "../tests/helpers/api"; +import { point } from "../../math"; +import { actionFlipHorizontal, actionFlipVertical } from "./actionFlip"; + +const { h } = window; + +describe("flipping re-centers selection", () => { + it("elbow arrow touches group selection side yet it remains in place after multiple moves", async () => { + const elements = [ + API.createElement({ + type: "rectangle", + id: "rec1", + x: 100, + y: 100, + width: 100, + height: 100, + boundElements: [{ id: "arr", type: "arrow" }], + }), + API.createElement({ + type: "rectangle", + id: "rec2", + x: 220, + y: 250, + width: 100, + height: 100, + boundElements: [{ id: "arr", type: "arrow" }], + }), + API.createElement({ + type: "arrow", + id: "arr", + x: 149.9, + y: 95, + width: 156, + height: 239.9, + startBinding: { + elementId: "rec1", + focus: 0, + gap: 5, + fixedPoint: [0.49, -0.05], + }, + endBinding: { + elementId: "rec2", + focus: 0, + gap: 5, + fixedPoint: [-0.05, 0.49], + }, + startArrowhead: null, + endArrowhead: "arrow", + points: [ + point(0, 0), + point(0, -35), + point(-90.9, -35), + point(-90.9, 204.9), + point(65.1, 204.9), + ], + elbowed: true, + }), + ]; + await render(); + + API.setSelectedElements(elements); + + expect(Object.keys(h.state.selectedElementIds).length).toBe(3); + + API.executeAction(actionFlipHorizontal); + API.executeAction(actionFlipHorizontal); + API.executeAction(actionFlipHorizontal); + API.executeAction(actionFlipHorizontal); + + const rec1 = h.elements.find((el) => el.id === "rec1"); + expect(rec1?.x).toBeCloseTo(100); + expect(rec1?.y).toBeCloseTo(100); + + const rec2 = h.elements.find((el) => el.id === "rec2"); + expect(rec2?.x).toBeCloseTo(220); + expect(rec2?.y).toBeCloseTo(250); + }); +}); + +describe("flipping arrowheads", () => { + beforeEach(async () => { + await render(); + }); + + it("flipping bound arrow should flip arrowheads only", () => { + const rect = API.createElement({ + type: "rectangle", + boundElements: [{ type: "arrow", id: "arrow1" }], + }); + const arrow = API.createElement({ + type: "arrow", + id: "arrow1", + startArrowhead: "arrow", + endArrowhead: null, + endBinding: { + elementId: rect.id, + focus: 0.5, + gap: 5, + }, + }); + + API.setElements([rect, arrow]); + API.setSelectedElements([arrow]); + + expect(API.getElement(arrow).startArrowhead).toBe("arrow"); + expect(API.getElement(arrow).endArrowhead).toBe(null); + + API.executeAction(actionFlipHorizontal); + expect(API.getElement(arrow).startArrowhead).toBe(null); + expect(API.getElement(arrow).endArrowhead).toBe("arrow"); + + API.executeAction(actionFlipHorizontal); + expect(API.getElement(arrow).startArrowhead).toBe("arrow"); + expect(API.getElement(arrow).endArrowhead).toBe(null); + + API.executeAction(actionFlipVertical); + expect(API.getElement(arrow).startArrowhead).toBe(null); + expect(API.getElement(arrow).endArrowhead).toBe("arrow"); + }); + + it("flipping bound arrow should flip arrowheads only 2", () => { + const rect = API.createElement({ + type: "rectangle", + boundElements: [{ type: "arrow", id: "arrow1" }], + }); + const rect2 = API.createElement({ + type: "rectangle", + boundElements: [{ type: "arrow", id: "arrow1" }], + }); + const arrow = API.createElement({ + type: "arrow", + id: "arrow1", + startArrowhead: "arrow", + endArrowhead: "circle", + startBinding: { + elementId: rect.id, + focus: 0.5, + gap: 5, + }, + endBinding: { + elementId: rect2.id, + focus: 0.5, + gap: 5, + }, + }); + + API.setElements([rect, rect2, arrow]); + API.setSelectedElements([arrow]); + + expect(API.getElement(arrow).startArrowhead).toBe("arrow"); + expect(API.getElement(arrow).endArrowhead).toBe("circle"); + + API.executeAction(actionFlipHorizontal); + expect(API.getElement(arrow).startArrowhead).toBe("circle"); + expect(API.getElement(arrow).endArrowhead).toBe("arrow"); + + API.executeAction(actionFlipVertical); + expect(API.getElement(arrow).startArrowhead).toBe("arrow"); + expect(API.getElement(arrow).endArrowhead).toBe("circle"); + }); + + it("flipping unbound arrow shouldn't flip arrowheads", () => { + const arrow = API.createElement({ + type: "arrow", + id: "arrow1", + startArrowhead: "arrow", + endArrowhead: "circle", + }); + + API.setElements([arrow]); + API.setSelectedElements([arrow]); + + expect(API.getElement(arrow).startArrowhead).toBe("arrow"); + expect(API.getElement(arrow).endArrowhead).toBe("circle"); + + API.executeAction(actionFlipHorizontal); + expect(API.getElement(arrow).startArrowhead).toBe("arrow"); + expect(API.getElement(arrow).endArrowhead).toBe("circle"); + }); + + it("flipping bound arrow shouldn't flip arrowheads if selected alongside non-arrow eleemnt", () => { + const rect = API.createElement({ + type: "rectangle", + boundElements: [{ type: "arrow", id: "arrow1" }], + }); + const arrow = API.createElement({ + type: "arrow", + id: "arrow1", + startArrowhead: "arrow", + endArrowhead: null, + endBinding: { + elementId: rect.id, + focus: 0.5, + gap: 5, + }, + }); + + API.setElements([rect, arrow]); + API.setSelectedElements([rect, arrow]); + + expect(API.getElement(arrow).startArrowhead).toBe("arrow"); + expect(API.getElement(arrow).endArrowhead).toBe(null); + + API.executeAction(actionFlipHorizontal); + expect(API.getElement(arrow).startArrowhead).toBe("arrow"); + expect(API.getElement(arrow).endArrowhead).toBe(null); + }); +}); diff --git a/packages/excalidraw/actions/actionFlip.ts b/packages/excalidraw/actions/actionFlip.ts index a6dad249f..6b75b8fac 100644 --- a/packages/excalidraw/actions/actionFlip.ts +++ b/packages/excalidraw/actions/actionFlip.ts @@ -2,6 +2,8 @@ import { register } from "./register"; import { getSelectedElements } from "../scene"; import { getNonDeletedElements } from "../element"; import type { + ExcalidrawArrowElement, + ExcalidrawElbowArrowElement, ExcalidrawElement, NonDeleted, NonDeletedSceneElementsMap, @@ -18,7 +20,13 @@ import { import { updateFrameMembershipOfSelectedElements } from "../frame"; import { flipHorizontal, flipVertical } from "../components/icons"; import { StoreAction } from "../store"; -import { isLinearElement } from "../element/typeChecks"; +import { + isArrowElement, + isElbowArrow, + isLinearElement, +} from "../element/typeChecks"; +import { mutateElbowArrow } from "../element/routing"; +import { mutateElement, newElementWith } from "../element/mutateElement"; export const actionFlipHorizontal = register({ name: "flipHorizontal", @@ -109,7 +117,23 @@ const flipElements = ( flipDirection: "horizontal" | "vertical", app: AppClassProperties, ): ExcalidrawElement[] => { - const { minX, minY, maxX, maxY } = getCommonBoundingBox(selectedElements); + if ( + selectedElements.every( + (element) => + isArrowElement(element) && (element.startBinding || element.endBinding), + ) + ) { + return selectedElements.map((element) => { + const _element = element as ExcalidrawArrowElement; + return newElementWith(_element, { + startArrowhead: _element.endArrowhead, + endArrowhead: _element.startArrowhead, + }); + }); + } + + const { minX, minY, maxX, maxY, midX, midY } = + getCommonBoundingBox(selectedElements); resizeMultipleElements( elementsMap, @@ -131,5 +155,48 @@ const flipElements = ( [], ); + // --------------------------------------------------------------------------- + // flipping arrow elements (and potentially other) makes the selection group + // "move" across the canvas because of how arrows can bump against the "wall" + // of the selection, so we need to center the group back to the original + // position so that repeated flips don't accumulate the offset + + const { elbowArrows, otherElements } = selectedElements.reduce( + ( + acc: { + elbowArrows: ExcalidrawElbowArrowElement[]; + otherElements: ExcalidrawElement[]; + }, + element, + ) => + isElbowArrow(element) + ? { ...acc, elbowArrows: acc.elbowArrows.concat(element) } + : { ...acc, otherElements: acc.otherElements.concat(element) }, + { elbowArrows: [], otherElements: [] }, + ); + + const { midX: newMidX, midY: newMidY } = + getCommonBoundingBox(selectedElements); + const [diffX, diffY] = [midX - newMidX, midY - newMidY]; + otherElements.forEach((element) => + mutateElement(element, { + x: element.x + diffX, + y: element.y + diffY, + }), + ); + elbowArrows.forEach((element) => + mutateElbowArrow( + element, + elementsMap, + element.points, + undefined, + undefined, + { + informMutation: false, + }, + ), + ); + // --------------------------------------------------------------------------- + return selectedElements; }; diff --git a/packages/excalidraw/actions/actionProperties.tsx b/packages/excalidraw/actions/actionProperties.tsx index 0fa705f23..92fa32947 100644 --- a/packages/excalidraw/actions/actionProperties.tsx +++ b/packages/excalidraw/actions/actionProperties.tsx @@ -1685,19 +1685,6 @@ export const actionChangeArrowType = register({ : {}), }, ); - } else { - mutateElement( - newElement, - { - startBinding: newElement.startBinding - ? { ...newElement.startBinding, fixedPoint: null } - : null, - endBinding: newElement.endBinding - ? { ...newElement.endBinding, fixedPoint: null } - : null, - }, - false, - ); } return newElement; diff --git a/packages/excalidraw/actions/actionToggleSearchMenu.ts b/packages/excalidraw/actions/actionToggleSearchMenu.ts index 6072fd30c..02a58cd2b 100644 --- a/packages/excalidraw/actions/actionToggleSearchMenu.ts +++ b/packages/excalidraw/actions/actionToggleSearchMenu.ts @@ -3,7 +3,7 @@ import { register } from "./register"; import type { AppState } from "../types"; import { searchIcon } from "../components/icons"; import { StoreAction } from "../store"; -import { CLASSES, SEARCH_SIDEBAR } from "../constants"; +import { CANVAS_SEARCH_TAB, CLASSES, DEFAULT_SIDEBAR } from "../constants"; export const actionToggleSearchMenu = register({ name: "searchMenu", @@ -17,7 +17,10 @@ export const actionToggleSearchMenu = register({ predicate: (appState) => appState.gridModeEnabled, }, perform(elements, appState, _, app) { - if (appState.openSidebar?.name === SEARCH_SIDEBAR.name) { + if ( + appState.openSidebar?.name === DEFAULT_SIDEBAR.name && + appState.openSidebar.tab === CANVAS_SEARCH_TAB + ) { const searchInput = app.excalidrawContainerValue.container?.querySelector( `.${CLASSES.SEARCH_MENU_INPUT_WRAPPER} input`, @@ -31,13 +34,14 @@ export const actionToggleSearchMenu = register({ } searchInput?.focus(); + searchInput?.select(); return false; } return { appState: { ...appState, - openSidebar: { name: SEARCH_SIDEBAR.name }, + openSidebar: { name: DEFAULT_SIDEBAR.name, tab: CANVAS_SEARCH_TAB }, openDialog: null, }, storeAction: StoreAction.NONE, diff --git a/packages/excalidraw/components/App.tsx b/packages/excalidraw/components/App.tsx index 8276b88f4..08ad13fa5 100644 --- a/packages/excalidraw/components/App.tsx +++ b/packages/excalidraw/components/App.tsx @@ -185,6 +185,7 @@ import type { MagicGenerationData, ExcalidrawNonSelectionElement, ExcalidrawArrowElement, + NonDeletedSceneElementsMap, } from "../element/types"; import { getCenter, getDistance } from "../gesture"; import { @@ -259,6 +260,7 @@ import type { ElementsPendingErasure, GenerateDiagramToCode, NullableGridSize, + Offsets, } from "../types"; import { debounce, @@ -286,6 +288,7 @@ import { getDateTime, isShallowEqual, arrayToMap, + toBrandedType, } from "../utils"; import { createSrcDoc, @@ -434,7 +437,7 @@ import { actionTextAutoResize } from "../actions/actionTextAutoResize"; import { getVisibleSceneBounds } from "../element/bounds"; import { isMaybeMermaidDefinition } from "../mermaid"; import NewElementCanvas from "./canvases/NewElementCanvas"; -import { mutateElbowArrow } from "../element/routing"; +import { mutateElbowArrow, updateElbowArrow } from "../element/routing"; import { FlowChartCreator, FlowChartNavigator, @@ -3108,7 +3111,45 @@ class App extends React.Component { retainSeed?: boolean; fitToContent?: boolean; }) => { - const elements = restoreElements(opts.elements, null, undefined); + let elements = opts.elements.map((el, _, elements) => { + if (isElbowArrow(el)) { + const startEndElements = [ + el.startBinding && + elements.find((l) => l.id === el.startBinding?.elementId), + el.endBinding && + elements.find((l) => l.id === el.endBinding?.elementId), + ]; + const startBinding = startEndElements[0] ? el.startBinding : null; + const endBinding = startEndElements[1] ? el.endBinding : null; + return { + ...el, + ...updateElbowArrow( + { + ...el, + startBinding, + endBinding, + }, + toBrandedType( + new Map( + startEndElements + .filter((x) => x != null) + .map( + (el) => + [el!.id, el] as [ + string, + Ordered, + ], + ), + ), + ), + [el.points[0], el.points[el.points.length - 1]], + ), + }; + } + + return el; + }); + elements = restoreElements(elements, null, undefined); const [minX, minY, maxX, maxY] = getCommonBounds(elements); const elementsCenterX = distance(minX, maxX) / 2; @@ -3232,6 +3273,7 @@ class App extends React.Component { if (opts.fitToContent) { this.scrollToContent(newElements, { fitToContent: true, + canvasOffsets: this.getEditorUIOffsets(), }); } }; @@ -3544,7 +3586,7 @@ class App extends React.Component { target: | ExcalidrawElement | readonly ExcalidrawElement[] = this.scene.getNonDeletedElements(), - opts?: + opts?: ( | { fitToContent?: boolean; fitToViewport?: never; @@ -3561,7 +3603,12 @@ class App extends React.Component { viewportZoomFactor?: number; animate?: boolean; duration?: number; - }, + } + ) & { + minZoom?: number; + maxZoom?: number; + canvasOffsets?: Offsets; + }, ) => { this.cancelInProgressAnimation?.(); @@ -3574,10 +3621,13 @@ class App extends React.Component { if (opts?.fitToContent || opts?.fitToViewport) { const { appState } = zoomToFit({ + canvasOffsets: opts.canvasOffsets, targetElements, appState: this.state, fitToViewport: !!opts?.fitToViewport, viewportZoomFactor: opts?.viewportZoomFactor, + minZoom: opts?.minZoom, + maxZoom: opts?.maxZoom, }); zoom = appState.zoom; scrollX = appState.scrollX; @@ -3805,40 +3855,42 @@ class App extends React.Component { }, ); - public getEditorUIOffsets = (): { - top: number; - right: number; - bottom: number; - left: number; - } => { + public getEditorUIOffsets = (): Offsets => { const toolbarBottom = this.excalidrawContainerRef?.current ?.querySelector(".App-toolbar") ?.getBoundingClientRect()?.bottom ?? 0; - const sidebarWidth = Math.max( - this.excalidrawContainerRef?.current - ?.querySelector(".default-sidebar") - ?.getBoundingClientRect()?.width ?? 0, - ); - const propertiesPanelWidth = Math.max( - this.excalidrawContainerRef?.current - ?.querySelector(".App-menu__left") - ?.getBoundingClientRect()?.width ?? 0, - 0, - ); + const sidebarRect = this.excalidrawContainerRef?.current + ?.querySelector(".sidebar") + ?.getBoundingClientRect(); + const propertiesPanelRect = this.excalidrawContainerRef?.current + ?.querySelector(".App-menu__left") + ?.getBoundingClientRect(); + + const PADDING = 16; return getLanguage().rtl ? { - top: toolbarBottom, - right: propertiesPanelWidth, - bottom: 0, - left: sidebarWidth, + top: toolbarBottom + PADDING, + right: + Math.max( + this.state.width - + (propertiesPanelRect?.left ?? this.state.width), + 0, + ) + PADDING, + bottom: PADDING, + left: Math.max(sidebarRect?.right ?? 0, 0) + PADDING, } : { - top: toolbarBottom, - right: sidebarWidth, - bottom: 0, - left: propertiesPanelWidth, + top: toolbarBottom + PADDING, + right: Math.max( + this.state.width - + (sidebarRect?.left ?? this.state.width) + + PADDING, + 0, + ), + bottom: PADDING, + left: Math.max(propertiesPanelRect?.right ?? 0, 0) + PADDING, }; }; @@ -3923,7 +3975,7 @@ class App extends React.Component { animate: true, duration: 300, fitToContent: true, - viewportZoomFactor: 0.8, + canvasOffsets: this.getEditorUIOffsets(), }); } @@ -3979,6 +4031,7 @@ class App extends React.Component { this.scrollToContent(nextNode, { animate: true, duration: 300, + canvasOffsets: this.getEditorUIOffsets(), }); } } @@ -4411,6 +4464,7 @@ class App extends React.Component { this.scrollToContent(firstNode, { animate: true, duration: 300, + canvasOffsets: this.getEditorUIOffsets(), }); } } diff --git a/packages/excalidraw/components/DefaultSidebar.tsx b/packages/excalidraw/components/DefaultSidebar.tsx index 5cd588933..70b0c2d6c 100644 --- a/packages/excalidraw/components/DefaultSidebar.tsx +++ b/packages/excalidraw/components/DefaultSidebar.tsx @@ -1,5 +1,9 @@ import clsx from "clsx"; -import { DEFAULT_SIDEBAR, LIBRARY_SIDEBAR_TAB } from "../constants"; +import { + CANVAS_SEARCH_TAB, + DEFAULT_SIDEBAR, + LIBRARY_SIDEBAR_TAB, +} from "../constants"; import { useTunnels } from "../context/tunnels"; import { useUIAppState } from "../context/ui-appState"; import type { MarkOptional, Merge } from "../utility-types"; @@ -10,7 +14,8 @@ import { LibraryMenu } from "./LibraryMenu"; import type { SidebarProps, SidebarTriggerProps } from "./Sidebar/common"; import { Sidebar } from "./Sidebar/Sidebar"; import "../components/dropdownMenu/DropdownMenu.scss"; -import { t } from "../i18n"; +import { SearchMenu } from "./SearchMenu"; +import { LibraryIcon, searchIcon } from "./icons"; const DefaultSidebarTrigger = withInternalFallback( "DefaultSidebarTrigger", @@ -32,14 +37,11 @@ const DefaultSidebarTrigger = withInternalFallback( ); DefaultSidebarTrigger.displayName = "DefaultSidebarTrigger"; -const DefaultTabTriggers = ({ - children, - ...rest -}: { children: React.ReactNode } & React.HTMLAttributes) => { +const DefaultTabTriggers = ({ children }: { children: React.ReactNode }) => { const { DefaultSidebarTabTriggersTunnel } = useTunnels(); return ( - {children} + {children} ); }; @@ -66,16 +68,21 @@ export const DefaultSidebar = Object.assign( const { DefaultSidebarTabTriggersTunnel } = useTunnels(); + const isForceDocked = appState.openSidebar?.tab === CANVAS_SEARCH_TAB; + return ( { @@ -85,26 +92,22 @@ export const DefaultSidebar = Object.assign( > - {rest.__fallback && ( - - {t("toolBar.library")} - - )} - + + + {searchIcon} + + + {LibraryIcon} + + + + + + {children} diff --git a/packages/excalidraw/components/HintViewer.tsx b/packages/excalidraw/components/HintViewer.tsx index 7c3431c58..934ff9005 100644 --- a/packages/excalidraw/components/HintViewer.tsx +++ b/packages/excalidraw/components/HintViewer.tsx @@ -13,7 +13,7 @@ import { isEraserActive } from "../appState"; import "./HintViewer.scss"; import { isNodeInFlowchart } from "../element/flowchart"; import { isGridModeEnabled } from "../snapping"; -import { SEARCH_SIDEBAR } from "../constants"; +import { CANVAS_SEARCH_TAB, DEFAULT_SIDEBAR } from "../constants"; interface HintViewerProps { appState: UIAppState; @@ -32,7 +32,8 @@ const getHints = ({ const multiMode = appState.multiElement !== null; if ( - appState.openSidebar?.name === SEARCH_SIDEBAR.name && + appState.openSidebar?.name === DEFAULT_SIDEBAR.name && + appState.openSidebar.tab === CANVAS_SEARCH_TAB && appState.searchMatches?.length ) { return t("hints.dismissSearch"); diff --git a/packages/excalidraw/components/LayerUI.tsx b/packages/excalidraw/components/LayerUI.tsx index 01d5fd821..64c34dd1c 100644 --- a/packages/excalidraw/components/LayerUI.tsx +++ b/packages/excalidraw/components/LayerUI.tsx @@ -5,7 +5,6 @@ import { CLASSES, DEFAULT_SIDEBAR, LIBRARY_SIDEBAR_WIDTH, - SEARCH_SIDEBAR, TOOL_TYPE, } from "../constants"; import { showSelectedShapeActions } from "../element"; @@ -54,9 +53,6 @@ import { LibraryIcon } from "./icons"; import { UIAppStateContext } from "../context/ui-appState"; import { DefaultSidebar } from "./DefaultSidebar"; import { EyeDropper, activeEyeDropperAtom } from "./EyeDropper"; - -import "./LayerUI.scss"; -import "./Toolbar.scss"; import { mutateElement } from "../element/mutateElement"; import { ShapeCache } from "../scene/ShapeCache"; import Scene from "../scene/Scene"; @@ -64,7 +60,9 @@ import { LaserPointerButton } from "./LaserPointerButton"; import { TTDDialog } from "./TTDDialog/TTDDialog"; import { Stats } from "./Stats"; import { actionToggleStats } from "../actions"; -import { SearchSidebar } from "./SearchSidebar"; + +import "./LayerUI.scss"; +import "./Toolbar.scss"; interface LayerUIProps { actionManager: ActionManager; @@ -365,21 +363,16 @@ const LayerUI = ({ const renderSidebars = () => { return ( - <> - {appState.openSidebar?.name === SEARCH_SIDEBAR.name && ( - - )} - { - trackEvent( - "sidebar", - `toggleDock (${docked ? "dock" : "undock"})`, - `(${device.editor.isMobile ? "mobile" : "desktop"})`, - ); - }} - /> - > + { + trackEvent( + "sidebar", + `toggleDock (${docked ? "dock" : "undock"})`, + `(${device.editor.isMobile ? "mobile" : "desktop"})`, + ); + }} + /> ); }; diff --git a/packages/excalidraw/components/SearchMenu.tsx b/packages/excalidraw/components/SearchMenu.tsx index 58dd622dd..36922b0a5 100644 --- a/packages/excalidraw/components/SearchMenu.tsx +++ b/packages/excalidraw/components/SearchMenu.tsx @@ -20,6 +20,7 @@ import { CLASSES, EVENT } from "../constants"; import { useStable } from "../hooks/useStable"; import "./SearchMenu.scss"; +import { round } from "../../math"; const searchQueryAtom = atom(""); export const searchItemInFocusAtom = atom(null); @@ -154,16 +155,23 @@ export const SearchMenu = () => { const match = searchMatches.items[focusIndex]; if (match) { + const zoomValue = app.state.zoom.value; + const matchAsElement = newTextElement({ text: match.searchQuery, x: match.textElement.x + (match.matchedLines[0]?.offsetX ?? 0), y: match.textElement.y + (match.matchedLines[0]?.offsetY ?? 0), width: match.matchedLines[0]?.width, height: match.matchedLines[0]?.height, + fontSize: match.textElement.fontSize, + fontFamily: match.textElement.fontFamily, }); + const FONT_SIZE_LEGIBILITY_THRESHOLD = 14; + + const fontSize = match.textElement.fontSize; const isTextTiny = - match.textElement.fontSize * app.state.zoom.value < 12; + fontSize * zoomValue < FONT_SIZE_LEGIBILITY_THRESHOLD; if ( !isElementCompletelyInViewport( @@ -184,9 +192,17 @@ export const SearchMenu = () => { ) { let zoomOptions: Parameters[1]; - if (isTextTiny && app.state.zoom.value >= 1) { - zoomOptions = { fitToViewport: true }; - } else if (isTextTiny || app.state.zoom.value > 1) { + if (isTextTiny) { + if (fontSize >= FONT_SIZE_LEGIBILITY_THRESHOLD) { + zoomOptions = { fitToContent: true }; + } else { + zoomOptions = { + fitToViewport: true, + // calculate zoom level to make the fontSize ~equal to FONT_SIZE_THRESHOLD, rounded to nearest 10% + maxZoom: round(FONT_SIZE_LEGIBILITY_THRESHOLD / fontSize, 1), + }; + } + } else { zoomOptions = { fitToContent: true }; } @@ -194,6 +210,7 @@ export const SearchMenu = () => { animate: true, duration: 300, ...zoomOptions, + canvasOffsets: app.getEditorUIOffsets(), }); } } diff --git a/packages/excalidraw/components/SearchSidebar.tsx b/packages/excalidraw/components/SearchSidebar.tsx deleted file mode 100644 index 7cb93ac5f..000000000 --- a/packages/excalidraw/components/SearchSidebar.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { SEARCH_SIDEBAR } from "../constants"; -import { t } from "../i18n"; -import { SearchMenu } from "./SearchMenu"; -import { Sidebar } from "./Sidebar/Sidebar"; - -export const SearchSidebar = () => { - return ( - - - - - {t("search.title")} - - - - - - ); -}; diff --git a/packages/excalidraw/constants.ts b/packages/excalidraw/constants.ts index 31982d4fb..d43847b79 100644 --- a/packages/excalidraw/constants.ts +++ b/packages/excalidraw/constants.ts @@ -377,16 +377,13 @@ export const DEFAULT_ELEMENT_PROPS: { }; export const LIBRARY_SIDEBAR_TAB = "library"; +export const CANVAS_SEARCH_TAB = "search"; export const DEFAULT_SIDEBAR = { name: "default", defaultTab: LIBRARY_SIDEBAR_TAB, } as const; -export const SEARCH_SIDEBAR = { - name: "search", -}; - export const LIBRARY_DISABLED_TYPES = new Set([ "iframe", "embeddable", diff --git a/packages/excalidraw/data/__snapshots__/transform.test.ts.snap b/packages/excalidraw/data/__snapshots__/transform.test.ts.snap index 921118eb1..967de923e 100644 --- a/packages/excalidraw/data/__snapshots__/transform.test.ts.snap +++ b/packages/excalidraw/data/__snapshots__/transform.test.ts.snap @@ -6,11 +6,11 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "backgroundColor": "#d8f5a2", "boundElements": [ { - "id": "id45", + "id": "id47", "type": "arrow", }, { - "id": "id46", + "id": "id48", "type": "arrow", }, ], @@ -47,7 +47,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "backgroundColor": "transparent", "boundElements": [ { - "id": "id46", + "id": "id48", "type": "arrow", }, ], @@ -118,7 +118,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "seed": Any, "startArrowhead": null, "startBinding": { - "elementId": "id47", + "elementId": "id49", "fixedPoint": null, "focus": -0.08139534883720931, "gap": 1, @@ -200,7 +200,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing s "backgroundColor": "transparent", "boundElements": [ { - "id": "id45", + "id": "id47", "type": "arrow", }, ], @@ -238,7 +238,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t "backgroundColor": "transparent", "boundElements": [ { - "id": "id48", + "id": "id50", "type": "arrow", }, ], @@ -284,7 +284,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t "backgroundColor": "transparent", "boundElements": [ { - "id": "id48", + "id": "id50", "type": "arrow", }, ], @@ -329,7 +329,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t "backgroundColor": "transparent", "boundElements": [ { - "id": "id49", + "id": "id51", "type": "text", }, ], @@ -392,7 +392,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to existing t "autoResize": true, "backgroundColor": "transparent", "boundElements": null, - "containerId": "id48", + "containerId": "id50", "customData": undefined, "fillStyle": "solid", "fontFamily": 5, @@ -433,7 +433,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "backgroundColor": "transparent", "boundElements": [ { - "id": "id38", + "id": "id40", "type": "text", }, ], @@ -441,7 +441,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "elbowed": false, "endArrowhead": "arrow", "endBinding": { - "elementId": "id40", + "elementId": "id42", "fixedPoint": null, "focus": 0, "gap": 1, @@ -472,7 +472,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "seed": Any, "startArrowhead": null, "startBinding": { - "elementId": "id39", + "elementId": "id41", "fixedPoint": null, "focus": 0, "gap": 1, @@ -496,7 +496,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "autoResize": true, "backgroundColor": "transparent", "boundElements": null, - "containerId": "id37", + "containerId": "id39", "customData": undefined, "fillStyle": "solid", "fontFamily": 5, @@ -537,7 +537,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "backgroundColor": "transparent", "boundElements": [ { - "id": "id37", + "id": "id39", "type": "arrow", }, ], @@ -574,7 +574,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to shapes whe "backgroundColor": "transparent", "boundElements": [ { - "id": "id37", + "id": "id39", "type": "arrow", }, ], @@ -611,7 +611,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "backgroundColor": "transparent", "boundElements": [ { - "id": "id42", + "id": "id44", "type": "text", }, ], @@ -619,7 +619,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "elbowed": false, "endArrowhead": "arrow", "endBinding": { - "elementId": "id44", + "elementId": "id46", "fixedPoint": null, "focus": 0, "gap": 1, @@ -650,7 +650,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "seed": Any, "startArrowhead": null, "startBinding": { - "elementId": "id43", + "elementId": "id45", "fixedPoint": null, "focus": 0, "gap": 1, @@ -674,7 +674,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "autoResize": true, "backgroundColor": "transparent", "boundElements": null, - "containerId": "id41", + "containerId": "id43", "customData": undefined, "fillStyle": "solid", "fontFamily": 5, @@ -716,7 +716,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "backgroundColor": "transparent", "boundElements": [ { - "id": "id41", + "id": "id43", "type": "arrow", }, ], @@ -762,7 +762,7 @@ exports[`Test Transform > Test arrow bindings > should bind arrows to text when "backgroundColor": "transparent", "boundElements": [ { - "id": "id41", + "id": "id43", "type": "arrow", }, ], @@ -1303,7 +1303,7 @@ exports[`Test Transform > should transform the elements correctly when linear el "backgroundColor": "transparent", "boundElements": [ { - "id": "id54", + "id": "id56", "type": "text", }, { @@ -1346,7 +1346,7 @@ exports[`Test Transform > should transform the elements correctly when linear el "backgroundColor": "transparent", "boundElements": [ { - "id": "id55", + "id": "id57", "type": "text", }, ], @@ -1385,7 +1385,7 @@ exports[`Test Transform > should transform the elements correctly when linear el "backgroundColor": "transparent", "boundElements": [ { - "id": "id56", + "id": "id58", "type": "text", }, { @@ -1428,7 +1428,7 @@ exports[`Test Transform > should transform the elements correctly when linear el "backgroundColor": "transparent", "boundElements": [ { - "id": "id57", + "id": "id59", "type": "text", }, { @@ -1475,7 +1475,7 @@ exports[`Test Transform > should transform the elements correctly when linear el "backgroundColor": "transparent", "boundElements": [ { - "id": "id58", + "id": "id60", "type": "text", }, ], @@ -1540,7 +1540,7 @@ exports[`Test Transform > should transform the elements correctly when linear el "backgroundColor": "transparent", "boundElements": [ { - "id": "id59", + "id": "id61", "type": "text", }, ], diff --git a/packages/excalidraw/data/encode.ts b/packages/excalidraw/data/encode.ts index 1d5a59556..104ab1ca8 100644 --- a/packages/excalidraw/data/encode.ts +++ b/packages/excalidraw/data/encode.ts @@ -57,6 +57,15 @@ export const base64ToString = async (base64: string, isByteString = false) => { : byteStringToString(window.atob(base64)); }; +export const base64ToArrayBuffer = (base64: string): ArrayBuffer => { + if (typeof Buffer !== "undefined") { + // Node.js environment + return Buffer.from(base64, "base64").buffer; + } + // Browser environment + return byteStringToArrayBuffer(atob(base64)); +}; + // ----------------------------------------------------------------------------- // text encoding // ----------------------------------------------------------------------------- diff --git a/packages/excalidraw/data/restore.ts b/packages/excalidraw/data/restore.ts index 62652066f..b476995da 100644 --- a/packages/excalidraw/data/restore.ts +++ b/packages/excalidraw/data/restore.ts @@ -5,6 +5,7 @@ import type { ExcalidrawLinearElement, ExcalidrawSelectionElement, ExcalidrawTextElement, + FixedPointBinding, FontFamilyValues, OrderedExcalidrawElement, PointBinding, @@ -21,6 +22,7 @@ import { import { isArrowElement, isElbowArrow, + isFixedPointBinding, isLinearElement, isTextElement, isUsingAdaptiveRadius, @@ -101,8 +103,8 @@ const getFontFamilyByName = (fontFamilyName: string): FontFamilyValues => { const repairBinding = ( element: ExcalidrawLinearElement, - binding: PointBinding | null, -): PointBinding | null => { + binding: PointBinding | FixedPointBinding | null, +): PointBinding | FixedPointBinding | null => { if (!binding) { return null; } @@ -110,9 +112,11 @@ const repairBinding = ( return { ...binding, focus: binding.focus || 0, - fixedPoint: isElbowArrow(element) - ? normalizeFixedPoint(binding.fixedPoint ?? [0, 0]) - : null, + ...(isElbowArrow(element) && isFixedPointBinding(binding) + ? { + fixedPoint: normalizeFixedPoint(binding.fixedPoint ?? [0, 0]), + } + : {}), }; }; diff --git a/packages/excalidraw/data/transform.test.ts b/packages/excalidraw/data/transform.test.ts index d930cb923..d752f6766 100644 --- a/packages/excalidraw/data/transform.test.ts +++ b/packages/excalidraw/data/transform.test.ts @@ -309,28 +309,32 @@ describe("Test Transform", () => { }); describe("Test Frames", () => { + const elements: ExcalidrawElementSkeleton[] = [ + { + type: "rectangle", + x: 10, + y: 10, + strokeWidth: 2, + id: "1", + }, + { + type: "diamond", + x: 120, + y: 20, + backgroundColor: "#fff3bf", + strokeWidth: 2, + label: { + text: "HELLO EXCALIDRAW", + strokeColor: "#099268", + fontSize: 30, + }, + id: "2", + }, + ]; + it("should transform frames and update frame ids when regenerated", () => { const elementsSkeleton: ExcalidrawElementSkeleton[] = [ - { - type: "rectangle", - x: 10, - y: 10, - strokeWidth: 2, - id: "1", - }, - { - type: "diamond", - x: 120, - y: 20, - backgroundColor: "#fff3bf", - strokeWidth: 2, - label: { - text: "HELLO EXCALIDRAW", - strokeColor: "#099268", - fontSize: 30, - }, - id: "2", - }, + ...elements, { type: "frame", children: ["1", "2"], @@ -352,28 +356,9 @@ describe("Test Transform", () => { }); }); - it("should consider max of calculated and frame dimensions when provided", () => { + it("should consider user defined frame dimensions over calculated when provided", () => { const elementsSkeleton: ExcalidrawElementSkeleton[] = [ - { - type: "rectangle", - x: 10, - y: 10, - strokeWidth: 2, - id: "1", - }, - { - type: "diamond", - x: 120, - y: 20, - backgroundColor: "#fff3bf", - strokeWidth: 2, - label: { - text: "HELLO EXCALIDRAW", - strokeColor: "#099268", - fontSize: 30, - }, - id: "2", - }, + ...elements, { type: "frame", children: ["1", "2"], @@ -388,7 +373,27 @@ describe("Test Transform", () => { ); const frame = excalidrawElements.find((ele) => ele.type === "frame")!; expect(frame.width).toBe(800); - expect(frame.height).toBe(126); + expect(frame.height).toBe(100); + }); + + it("should consider user defined frame coordinates calculated when provided", () => { + const elementsSkeleton: ExcalidrawElementSkeleton[] = [ + ...elements, + { + type: "frame", + children: ["1", "2"], + name: "My frame", + x: 100, + y: 300, + }, + ]; + const excalidrawElements = convertToExcalidrawElements( + elementsSkeleton, + opts, + ); + const frame = excalidrawElements.find((ele) => ele.type === "frame")!; + expect(frame.x).toBe(100); + expect(frame.y).toBe(300); }); }); diff --git a/packages/excalidraw/data/transform.ts b/packages/excalidraw/data/transform.ts index 6573abd0d..aa276668b 100644 --- a/packages/excalidraw/data/transform.ts +++ b/packages/excalidraw/data/transform.ts @@ -46,6 +46,7 @@ import { assertNever, cloneJSON, getFontString, + isDevEnv, toBrandedType, } from "../utils"; import { getSizeFromPoints } from "../points"; @@ -717,7 +718,7 @@ export const convertToExcalidrawElements = ( } // Once all the excalidraw elements are created, we can add frames since we - // need to calculate coordinates and dimensions of frame which is possibe after all + // need to calculate coordinates and dimensions of frame which is possible after all // frame children are processed. for (const [id, element] of elementsWithIds) { if (element.type !== "frame" && element.type !== "magicframe") { @@ -764,10 +765,26 @@ export const convertToExcalidrawElements = ( maxX = maxX + PADDING; maxY = maxY + PADDING; - // Take the max of calculated and provided frame dimensions, whichever is higher - const width = Math.max(frame?.width, maxX - minX); - const height = Math.max(frame?.height, maxY - minY); - Object.assign(frame, { x: minX, y: minY, width, height }); + const frameX = frame?.x || minX; + const frameY = frame?.y || minY; + const frameWidth = frame?.width || maxX - minX; + const frameHeight = frame?.height || maxY - minY; + + Object.assign(frame, { + x: frameX, + y: frameY, + width: frameWidth, + height: frameHeight, + }); + if ( + isDevEnv() && + element.children.length && + (frame?.x || frame?.y || frame?.width || frame?.height) + ) { + console.info( + "User provided frame attributes are being considered, if you find this inaccurate, please remove any of the attributes - x, y, width and height so frame coordinates and dimensions are calculated automatically", + ); + } } return elementStore.getElements(); diff --git a/packages/excalidraw/element/binding.ts b/packages/excalidraw/element/binding.ts index fe820723f..62e66f645 100644 --- a/packages/excalidraw/element/binding.ts +++ b/packages/excalidraw/element/binding.ts @@ -39,6 +39,7 @@ import { isBindingElement, isBoundToContainer, isElbowArrow, + isFixedPointBinding, isFrameLikeElement, isLinearElement, isRectangularElement, @@ -797,7 +798,7 @@ export const bindPointToSnapToElementOutline = ( isVertical ? Math.abs(p[1] - i[1]) < 0.1 : Math.abs(p[0] - i[0]) < 0.1, - )[0] ?? point; + )[0] ?? p; } return p; @@ -1013,7 +1014,7 @@ const updateBoundPoint = ( const direction = startOrEnd === "startBinding" ? -1 : 1; const edgePointIndex = direction === -1 ? 0 : linearElement.points.length - 1; - if (isElbowArrow(linearElement)) { + if (isElbowArrow(linearElement) && isFixedPointBinding(binding)) { const fixedPoint = normalizeFixedPoint(binding.fixedPoint) ?? calculateFixedPointForElbowArrowBinding( diff --git a/packages/excalidraw/element/dragElements.ts b/packages/excalidraw/element/dragElements.ts index 18d78fdbe..5775f0eb7 100644 --- a/packages/excalidraw/element/dragElements.ts +++ b/packages/excalidraw/element/dragElements.ts @@ -35,7 +35,6 @@ export const dragSelectedElements = ( ) => { if ( _selectedElements.length === 1 && - isArrowElement(_selectedElements[0]) && isElbowArrow(_selectedElements[0]) && (_selectedElements[0].startBinding || _selectedElements[0].endBinding) ) { @@ -43,13 +42,7 @@ export const dragSelectedElements = ( } const selectedElements = _selectedElements.filter( - (el) => - !( - isArrowElement(el) && - isElbowArrow(el) && - el.startBinding && - el.endBinding - ), + (el) => !(isElbowArrow(el) && el.startBinding && el.endBinding), ); // we do not want a frame and its elements to be selected at the same time diff --git a/packages/excalidraw/element/linearElementEditor.ts b/packages/excalidraw/element/linearElementEditor.ts index 7607a2e16..e11c0b158 100644 --- a/packages/excalidraw/element/linearElementEditor.ts +++ b/packages/excalidraw/element/linearElementEditor.ts @@ -102,6 +102,7 @@ export class LinearElementEditor { public readonly endBindingElement: ExcalidrawBindableElement | null | "keep"; public readonly hoverPointIndex: number; public readonly segmentMidPointHoveredCoords: GlobalPoint | null; + public readonly elbowed: boolean; constructor(element: NonDeleted) { this.elementId = element.id as string & { @@ -131,6 +132,7 @@ export class LinearElementEditor { }; this.hoverPointIndex = -1; this.segmentMidPointHoveredCoords = null; + this.elbowed = isElbowArrow(element) && element.elbowed; } // --------------------------------------------------------------------------- @@ -1477,7 +1479,9 @@ export class LinearElementEditor { nextPoints, vector(offsetX, offsetY), bindings, - options, + { + isDragging: options?.isDragging, + }, ); } else { const nextCoords = getElementPointsCoords(element, nextPoints); diff --git a/packages/excalidraw/element/newElement.ts b/packages/excalidraw/element/newElement.ts index a3b259e36..aa02cc145 100644 --- a/packages/excalidraw/element/newElement.ts +++ b/packages/excalidraw/element/newElement.ts @@ -223,7 +223,6 @@ export const newTextElement = ( verticalAlign?: VerticalAlign; containerId?: ExcalidrawTextContainer["id"] | null; lineHeight?: ExcalidrawTextElement["lineHeight"]; - strokeWidth?: ExcalidrawTextElement["strokeWidth"]; autoResize?: ExcalidrawTextElement["autoResize"]; } & ElementConstructorOpts, ): NonDeleted => { diff --git a/packages/excalidraw/element/resizeElements.ts b/packages/excalidraw/element/resizeElements.ts index 3f3f8ef1e..0a01459e6 100644 --- a/packages/excalidraw/element/resizeElements.ts +++ b/packages/excalidraw/element/resizeElements.ts @@ -9,6 +9,7 @@ import type { ExcalidrawTextElementWithContainer, ExcalidrawImageElement, ElementsMap, + ExcalidrawArrowElement, NonDeletedSceneElementsMap, SceneElementsMap, } from "./types"; @@ -909,6 +910,8 @@ export const resizeMultipleElements = ( fontSize?: ExcalidrawTextElement["fontSize"]; scale?: ExcalidrawImageElement["scale"]; boundTextFontSize?: ExcalidrawTextElement["fontSize"]; + startBinding?: ExcalidrawArrowElement["startBinding"]; + endBinding?: ExcalidrawArrowElement["endBinding"]; }; }[] = []; @@ -993,19 +996,6 @@ export const resizeMultipleElements = ( mutateElement(element, update, false); - if (isArrowElement(element) && isElbowArrow(element)) { - mutateElbowArrow( - element, - elementsMap, - element.points, - undefined, - undefined, - { - informMutation: false, - }, - ); - } - updateBoundElements(element, elementsMap, { simultaneouslyUpdated: elementsToUpdate, oldSize: { width: oldWidth, height: oldHeight }, @@ -1059,7 +1049,7 @@ const rotateMultipleElements = ( (centerAngle + origAngle - element.angle) as Radians, ); - if (isArrowElement(element) && isElbowArrow(element)) { + if (isElbowArrow(element)) { const points = getArrowLocalFixedPoints(element, elementsMap); mutateElbowArrow(element, elementsMap, points); } else { diff --git a/packages/excalidraw/element/routing.test.tsx b/packages/excalidraw/element/routing.test.tsx index 9381541a5..e451fae5d 100644 --- a/packages/excalidraw/element/routing.test.tsx +++ b/packages/excalidraw/element/routing.test.tsx @@ -94,7 +94,16 @@ describe("elbow arrow routing", () => { describe("elbow arrow ui", () => { beforeEach(async () => { + localStorage.clear(); await render(); + + fireEvent.contextMenu(GlobalTestState.interactiveCanvas, { + button: 2, + clientX: 1, + clientY: 1, + }); + const contextMenu = UI.queryContextMenu(); + fireEvent.click(queryByTestId(contextMenu!, "stats")!); }); it("can follow bound shapes", async () => { @@ -130,8 +139,8 @@ describe("elbow arrow ui", () => { expect(arrow.elbowed).toBe(true); expect(arrow.points).toEqual([ [0, 0], - [35, 0], - [35, 200], + [45, 0], + [45, 200], [90, 200], ]); }); @@ -163,14 +172,6 @@ describe("elbow arrow ui", () => { h.state, )[0] as ExcalidrawArrowElement; - fireEvent.contextMenu(GlobalTestState.interactiveCanvas, { - button: 2, - clientX: 1, - clientY: 1, - }); - const contextMenu = UI.queryContextMenu(); - fireEvent.click(queryByTestId(contextMenu!, "stats")!); - mouse.click(51, 51); const inputAngle = UI.queryStatsProperty("A")?.querySelector( @@ -182,8 +183,8 @@ describe("elbow arrow ui", () => { [0, 0], [35, 0], [35, 90], - [25, 90], - [25, 165], + [35, 90], // Note that coordinates are rounded above! + [35, 165], [103, 165], ]); }); diff --git a/packages/excalidraw/element/routing.ts b/packages/excalidraw/element/routing.ts index 07f62ca82..895340c91 100644 --- a/packages/excalidraw/element/routing.ts +++ b/packages/excalidraw/element/routing.ts @@ -36,11 +36,11 @@ import { HEADING_UP, vectorToHeading, } from "./heading"; +import type { ElementUpdate } from "./mutateElement"; import { mutateElement } from "./mutateElement"; import { isBindableElement, isRectanguloidElement } from "./typeChecks"; import type { ExcalidrawElbowArrowElement, - FixedPointBinding, NonDeletedSceneElementsMap, SceneElementsMap, } from "./types"; @@ -72,16 +72,48 @@ export const mutateElbowArrow = ( elementsMap: NonDeletedSceneElementsMap | SceneElementsMap, nextPoints: readonly LocalPoint[], offset?: Vector, - otherUpdates?: { - startBinding?: FixedPointBinding | null; - endBinding?: FixedPointBinding | null; + otherUpdates?: Omit< + ElementUpdate, + "angle" | "x" | "y" | "width" | "height" | "elbowed" | "points" + >, + options?: { + isDragging?: boolean; + informMutation?: boolean; }, +) => { + const update = updateElbowArrow( + arrow, + elementsMap, + nextPoints, + offset, + options, + ); + if (update) { + mutateElement( + arrow, + { + ...otherUpdates, + ...update, + angle: 0 as Radians, + }, + options?.informMutation, + ); + } else { + console.error("Elbow arrow cannot find a route"); + } +}; + +export const updateElbowArrow = ( + arrow: ExcalidrawElbowArrowElement, + elementsMap: NonDeletedSceneElementsMap | SceneElementsMap, + nextPoints: readonly LocalPoint[], + offset?: Vector, options?: { isDragging?: boolean; disableBinding?: boolean; informMutation?: boolean; }, -) => { +): ElementUpdate | null => { const origStartGlobalPoint: GlobalPoint = pointTranslate( pointTranslate( nextPoints[0], @@ -235,6 +267,8 @@ export const mutateElbowArrow = ( BASE_PADDING, ), boundsOverlap, + hoveredStartElement && aabbForElement(hoveredStartElement), + hoveredEndElement && aabbForElement(hoveredEndElement), ); const startDonglePosition = getDonglePosition( dynamicAABBs[0], @@ -295,18 +329,10 @@ export const mutateElbowArrow = ( startDongle && points.unshift(startGlobalPoint); endDongle && points.push(endGlobalPoint); - mutateElement( - arrow, - { - ...otherUpdates, - ...normalizedArrowElementUpdate(simplifyElbowArrowPoints(points), 0, 0), - angle: 0 as Radians, - }, - options?.informMutation, - ); - } else { - console.error("Elbow arrow cannot find a route"); + return normalizedArrowElementUpdate(simplifyElbowArrowPoints(points), 0, 0); } + + return null; }; const offsetFromHeading = ( @@ -475,7 +501,11 @@ const generateDynamicAABBs = ( startDifference?: [number, number, number, number], endDifference?: [number, number, number, number], disableSideHack?: boolean, + startElementBounds?: Bounds | null, + endElementBounds?: Bounds | null, ): Bounds[] => { + const startEl = startElementBounds ?? a; + const endEl = endElementBounds ?? b; const [startUp, startRight, startDown, startLeft] = startDifference ?? [ 0, 0, 0, 0, ]; @@ -484,29 +514,29 @@ const generateDynamicAABBs = ( const first = [ a[0] > b[2] ? a[1] > b[3] || a[3] < b[1] - ? Math.min((a[0] + b[2]) / 2, a[0] - startLeft) - : (a[0] + b[2]) / 2 + ? Math.min((startEl[0] + endEl[2]) / 2, a[0] - startLeft) + : (startEl[0] + endEl[2]) / 2 : a[0] > b[0] ? a[0] - startLeft : common[0] - startLeft, a[1] > b[3] ? a[0] > b[2] || a[2] < b[0] - ? Math.min((a[1] + b[3]) / 2, a[1] - startUp) - : (a[1] + b[3]) / 2 + ? Math.min((startEl[1] + endEl[3]) / 2, a[1] - startUp) + : (startEl[1] + endEl[3]) / 2 : a[1] > b[1] ? a[1] - startUp : common[1] - startUp, a[2] < b[0] ? a[1] > b[3] || a[3] < b[1] - ? Math.max((a[2] + b[0]) / 2, a[2] + startRight) - : (a[2] + b[0]) / 2 + ? Math.max((startEl[2] + endEl[0]) / 2, a[2] + startRight) + : (startEl[2] + endEl[0]) / 2 : a[2] < b[2] ? a[2] + startRight : common[2] + startRight, a[3] < b[1] ? a[0] > b[2] || a[2] < b[0] - ? Math.max((a[3] + b[1]) / 2, a[3] + startDown) - : (a[3] + b[1]) / 2 + ? Math.max((startEl[3] + endEl[1]) / 2, a[3] + startDown) + : (startEl[3] + endEl[1]) / 2 : a[3] < b[3] ? a[3] + startDown : common[3] + startDown, @@ -514,29 +544,29 @@ const generateDynamicAABBs = ( const second = [ b[0] > a[2] ? b[1] > a[3] || b[3] < a[1] - ? Math.min((b[0] + a[2]) / 2, b[0] - endLeft) - : (b[0] + a[2]) / 2 + ? Math.min((endEl[0] + startEl[2]) / 2, b[0] - endLeft) + : (endEl[0] + startEl[2]) / 2 : b[0] > a[0] ? b[0] - endLeft : common[0] - endLeft, b[1] > a[3] ? b[0] > a[2] || b[2] < a[0] - ? Math.min((b[1] + a[3]) / 2, b[1] - endUp) - : (b[1] + a[3]) / 2 + ? Math.min((endEl[1] + startEl[3]) / 2, b[1] - endUp) + : (endEl[1] + startEl[3]) / 2 : b[1] > a[1] ? b[1] - endUp : common[1] - endUp, b[2] < a[0] ? b[1] > a[3] || b[3] < a[1] - ? Math.max((b[2] + a[0]) / 2, b[2] + endRight) - : (b[2] + a[0]) / 2 + ? Math.max((endEl[2] + startEl[0]) / 2, b[2] + endRight) + : (endEl[2] + startEl[0]) / 2 : b[2] < a[2] ? b[2] + endRight : common[2] + endRight, b[3] < a[1] ? b[0] > a[2] || b[2] < a[0] - ? Math.max((b[3] + a[1]) / 2, b[3] + endDown) - : (b[3] + a[1]) / 2 + ? Math.max((endEl[3] + startEl[1]) / 2, b[3] + endDown) + : (endEl[3] + startEl[1]) / 2 : b[3] < a[3] ? b[3] + endDown : common[3] + endDown, diff --git a/packages/excalidraw/element/sizeHelpers.ts b/packages/excalidraw/element/sizeHelpers.ts index b10f31f32..f633789a9 100644 --- a/packages/excalidraw/element/sizeHelpers.ts +++ b/packages/excalidraw/element/sizeHelpers.ts @@ -2,7 +2,7 @@ import type { ElementsMap, ExcalidrawElement } from "./types"; import { mutateElement } from "./mutateElement"; import { isFreeDrawElement, isLinearElement } from "./typeChecks"; import { SHIFT_LOCKING_ANGLE } from "../constants"; -import type { AppState, Zoom } from "../types"; +import type { AppState, Offsets, Zoom } from "../types"; import { getCommonBounds, getElementBounds } from "./bounds"; import { viewportCoordsToSceneCoords } from "../utils"; @@ -67,12 +67,7 @@ export const isElementCompletelyInViewport = ( scrollY: number; }, elementsMap: ElementsMap, - padding?: Partial<{ - top: number; - right: number; - bottom: number; - left: number; - }>, + padding?: Offsets, ) => { const [x1, y1, x2, y2] = getCommonBounds(elements, elementsMap); // scene coordinates const topLeftSceneCoords = viewportCoordsToSceneCoords( diff --git a/packages/excalidraw/element/textWysiwyg.tsx b/packages/excalidraw/element/textWysiwyg.tsx index 2281a0cc3..23778cb7b 100644 --- a/packages/excalidraw/element/textWysiwyg.tsx +++ b/packages/excalidraw/element/textWysiwyg.tsx @@ -247,7 +247,7 @@ export const textWysiwyg = ({ // adding left and right padding buffer, so that browser does not cut the glyphs (does not work in Safari) const padding = !isSafari - ? Math.ceil(updatedTextElement.fontSize / 2) + ? Math.ceil(updatedTextElement.fontSize / appState.zoom.value / 2) : 0; // Make sure text editor height doesn't go beyond viewport diff --git a/packages/excalidraw/element/typeChecks.ts b/packages/excalidraw/element/typeChecks.ts index 5ba089ab0..6bb4269f8 100644 --- a/packages/excalidraw/element/typeChecks.ts +++ b/packages/excalidraw/element/typeChecks.ts @@ -320,9 +320,12 @@ export const getDefaultRoundnessTypeForElement = ( }; export const isFixedPointBinding = ( - binding: PointBinding, + binding: PointBinding | FixedPointBinding, ): binding is FixedPointBinding => { - return binding.fixedPoint != null; + return ( + Object.hasOwn(binding, "fixedPoint") && + (binding as FixedPointBinding).fixedPoint != null + ); }; // TODO: Move this to @excalidraw/math diff --git a/packages/excalidraw/element/types.ts b/packages/excalidraw/element/types.ts index 9b0925427..5ebf50544 100644 --- a/packages/excalidraw/element/types.ts +++ b/packages/excalidraw/element/types.ts @@ -193,6 +193,7 @@ export type ExcalidrawElement = | ExcalidrawGenericElement | ExcalidrawTextElement | ExcalidrawLinearElement + | ExcalidrawArrowElement | ExcalidrawFreeDrawElement | ExcalidrawImageElement | ExcalidrawFrameElement @@ -268,15 +269,19 @@ export type PointBinding = { elementId: ExcalidrawBindableElement["id"]; focus: number; gap: number; - // Represents the fixed point binding information in form of a vertical and - // horizontal ratio (i.e. a percentage value in the 0.0-1.0 range). This ratio - // gives the user selected fixed point by multiplying the bound element width - // with fixedPoint[0] and the bound element height with fixedPoint[1] to get the - // bound element-local point coordinate. - fixedPoint: FixedPoint | null; }; -export type FixedPointBinding = Merge; +export type FixedPointBinding = Merge< + PointBinding, + { + // Represents the fixed point binding information in form of a vertical and + // horizontal ratio (i.e. a percentage value in the 0.0-1.0 range). This ratio + // gives the user selected fixed point by multiplying the bound element width + // with fixedPoint[0] and the bound element height with fixedPoint[1] to get the + // bound element-local point coordinate. + fixedPoint: FixedPoint; + } +>; export type Arrowhead = | "arrow" diff --git a/packages/excalidraw/fonts/ExcalidrawFont.ts b/packages/excalidraw/fonts/ExcalidrawFont.ts index 682ae7394..51d6578c6 100644 --- a/packages/excalidraw/fonts/ExcalidrawFont.ts +++ b/packages/excalidraw/fonts/ExcalidrawFont.ts @@ -1,4 +1,8 @@ -import { stringToBase64, toByteString } from "../data/encode"; +import { + base64ToArrayBuffer, + stringToBase64, + toByteString, +} from "../data/encode"; import { LOCAL_FONT_PROTOCOL } from "./metadata"; import loadWoff2 from "./wasm/woff2.loader"; import loadHbSubset from "./wasm/hb-subset.loader"; @@ -49,10 +53,7 @@ export class ExcalidrawFont implements Font { // it's dataurl (server), the font is inlined as base64, no need to fetch if (url.protocol === "data:") { - const arrayBuffer = Buffer.from( - url.toString().split(",")[1], - "base64", - ).buffer; + const arrayBuffer = base64ToArrayBuffer(url.toString().split(",")[1]); const base64 = await ExcalidrawFont.subsetGlyphsByCodePoints( arrayBuffer, diff --git a/packages/excalidraw/fonts/assets/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 b/packages/excalidraw/fonts/assets/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 new file mode 100644 index 000000000..51e6f53a8 Binary files /dev/null and b/packages/excalidraw/fonts/assets/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 differ diff --git a/packages/excalidraw/fonts/assets/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 b/packages/excalidraw/fonts/assets/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 new file mode 100644 index 000000000..1fe1443ba Binary files /dev/null and b/packages/excalidraw/fonts/assets/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 differ diff --git a/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 b/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 new file mode 100644 index 000000000..b9b1c20c0 Binary files /dev/null and b/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 differ diff --git a/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 b/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 new file mode 100644 index 000000000..c9f8bb017 Binary files /dev/null and b/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 differ diff --git a/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 b/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 new file mode 100644 index 000000000..6b0697140 Binary files /dev/null and b/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 differ diff --git a/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 b/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 new file mode 100644 index 000000000..c21a6ed08 Binary files /dev/null and b/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 differ diff --git a/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 b/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 new file mode 100644 index 000000000..bd56dc50d Binary files /dev/null and b/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 differ diff --git a/packages/excalidraw/fonts/index.ts b/packages/excalidraw/fonts/index.ts index 39f6bf8da..1de1f99c9 100644 --- a/packages/excalidraw/fonts/index.ts +++ b/packages/excalidraw/fonts/index.ts @@ -24,14 +24,14 @@ import Cascadia from "./assets/CascadiaCode-Regular.woff2"; import ComicShanns from "./assets/ComicShanns-Regular.woff2"; import LiberationSans from "./assets/LiberationSans-Regular.woff2"; -import LilitaLatin from "https://fonts.gstatic.com/s/lilitaone/v15/i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2"; -import LilitaLatinExt from "https://fonts.gstatic.com/s/lilitaone/v15/i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2"; +import LilitaLatin from "./assets/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2"; +import LilitaLatinExt from "./assets/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2"; -import NunitoLatin from "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2"; -import NunitoLatinExt from "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2"; -import NunitoCyrilic from "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2"; -import NunitoCyrilicExt from "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2"; -import NunitoVietnamese from "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2"; +import NunitoLatin from "./assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2"; +import NunitoLatinExt from "./assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2"; +import NunitoCyrilic from "./assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2"; +import NunitoCyrilicExt from "./assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2"; +import NunitoVietnamese from "./assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2"; export class Fonts { // it's ok to track fonts across multiple instances only once, so let's use diff --git a/packages/excalidraw/locales/en.json b/packages/excalidraw/locales/en.json index ff1fa2026..e4c5eea44 100644 --- a/packages/excalidraw/locales/en.json +++ b/packages/excalidraw/locales/en.json @@ -167,7 +167,7 @@ "noMatch": "No matches found...", "singleResult": "result", "multipleResults": "results", - "placeholder": "Find text..." + "placeholder": "Find text on canvas..." }, "buttons": { "clearReset": "Reset the canvas", diff --git a/packages/excalidraw/renderer/interactiveScene.ts b/packages/excalidraw/renderer/interactiveScene.ts index 0d03b0f5a..7dc84db99 100644 --- a/packages/excalidraw/renderer/interactiveScene.ts +++ b/packages/excalidraw/renderer/interactiveScene.ts @@ -52,7 +52,6 @@ import { } from "./helpers"; import oc from "open-color"; import { - isArrowElement, isElbowArrow, isFrameLikeElement, isLinearElement, @@ -807,7 +806,6 @@ const _renderInteractiveScene = ({ // Elbow arrow elements cannot be selected when bound on either end ( isSingleLinearElementSelected && - isArrowElement(element) && isElbowArrow(element) && (element.startBinding || element.endBinding) ) diff --git a/packages/excalidraw/renderer/staticSvgScene.ts b/packages/excalidraw/renderer/staticSvgScene.ts index 19169d4a9..f0bf98967 100644 --- a/packages/excalidraw/renderer/staticSvgScene.ts +++ b/packages/excalidraw/renderer/staticSvgScene.ts @@ -421,6 +421,7 @@ const renderElementToSvg = ( image.setAttribute("width", "100%"); image.setAttribute("height", "100%"); image.setAttribute("href", fileData.dataURL); + image.setAttribute("preserveAspectRatio", "none"); symbol.appendChild(image); diff --git a/packages/excalidraw/scene/export.ts b/packages/excalidraw/scene/export.ts index b120d0cc9..6d1b963fc 100644 --- a/packages/excalidraw/scene/export.ts +++ b/packages/excalidraw/scene/export.ts @@ -185,6 +185,11 @@ export const exportToCanvas = async ( exportingFrame ?? null, appState.frameRendering ?? null, ); + // for canvas export, don't clip if exporting a specific frame as it would + // clip the corners of the content + if (exportingFrame) { + frameRendering.clip = false; + } const elementsForRender = prepareElementsForRender({ elements, @@ -351,6 +356,11 @@ export const exportToSvg = async ( }) rotate(${frame.angle} ${cx} ${cy})" width="${frame.width}" height="${frame.height}" + ${ + exportingFrame + ? "" + : `rx=${FRAME_STYLE.radius} ry=${FRAME_STYLE.radius}` + } > `; diff --git a/packages/excalidraw/scene/scroll.ts b/packages/excalidraw/scene/scroll.ts index f3d6ac014..5d059e5b4 100644 --- a/packages/excalidraw/scene/scroll.ts +++ b/packages/excalidraw/scene/scroll.ts @@ -1,4 +1,4 @@ -import type { AppState, PointerCoords, Zoom } from "../types"; +import type { AppState, Offsets, PointerCoords, Zoom } from "../types"; import type { ExcalidrawElement } from "../element/types"; import { getCommonBounds, @@ -31,14 +31,28 @@ export const centerScrollOn = ({ scenePoint, viewportDimensions, zoom, + offsets, }: { scenePoint: PointerCoords; viewportDimensions: { height: number; width: number }; zoom: Zoom; + offsets?: Offsets; }) => { + let scrollX = + (viewportDimensions.width - (offsets?.right ?? 0)) / 2 / zoom.value - + scenePoint.x; + + scrollX += (offsets?.left ?? 0) / 2 / zoom.value; + + let scrollY = + (viewportDimensions.height - (offsets?.bottom ?? 0)) / 2 / zoom.value - + scenePoint.y; + + scrollY += (offsets?.top ?? 0) / 2 / zoom.value; + return { - scrollX: viewportDimensions.width / 2 / zoom.value - scenePoint.x, - scrollY: viewportDimensions.height / 2 / zoom.value - scenePoint.y, + scrollX, + scrollY, }; }; diff --git a/packages/excalidraw/tests/__snapshots__/export.test.tsx.snap b/packages/excalidraw/tests/__snapshots__/export.test.tsx.snap index cc2e6fa7b..8bcdb9c4e 100644 --- a/packages/excalidraw/tests/__snapshots__/export.test.tsx.snap +++ b/packages/excalidraw/tests/__snapshots__/export.test.tsx.snap @@ -1,7 +1,7 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`export > exporting svg containing transformed images > svg export output 1`] = ` -" +" diff --git a/packages/excalidraw/tests/__snapshots__/regressionTests.test.tsx.snap b/packages/excalidraw/tests/__snapshots__/regressionTests.test.tsx.snap index c4683267c..6e1f53503 100644 --- a/packages/excalidraw/tests/__snapshots__/regressionTests.test.tsx.snap +++ b/packages/excalidraw/tests/__snapshots__/regressionTests.test.tsx.snap @@ -8430,6 +8430,7 @@ exports[`regression tests > key 5 selects arrow tool > [end of test] appState 1` "selectedElementsAreBeingDragged": false, "selectedGroupIds": {}, "selectedLinearElement": LinearElementEditor { + "elbowed": false, "elementId": "id0", "endBindingElement": "keep", "hoverPointIndex": -1, @@ -8649,6 +8650,7 @@ exports[`regression tests > key 6 selects line tool > [end of test] appState 1`] "selectedElementsAreBeingDragged": false, "selectedGroupIds": {}, "selectedLinearElement": LinearElementEditor { + "elbowed": false, "elementId": "id0", "endBindingElement": "keep", "hoverPointIndex": -1, @@ -9058,6 +9060,7 @@ exports[`regression tests > key a selects arrow tool > [end of test] appState 1` "selectedElementsAreBeingDragged": false, "selectedGroupIds": {}, "selectedLinearElement": LinearElementEditor { + "elbowed": false, "elementId": "id0", "endBindingElement": "keep", "hoverPointIndex": -1, @@ -9454,6 +9457,7 @@ exports[`regression tests > key l selects line tool > [end of test] appState 1`] "selectedElementsAreBeingDragged": false, "selectedGroupIds": {}, "selectedLinearElement": LinearElementEditor { + "elbowed": false, "elementId": "id0", "endBindingElement": "keep", "hoverPointIndex": -1, diff --git a/packages/excalidraw/tests/helpers/api.ts b/packages/excalidraw/tests/helpers/api.ts index 6c16e5190..b7dc6e10d 100644 --- a/packages/excalidraw/tests/helpers/api.ts +++ b/packages/excalidraw/tests/helpers/api.ts @@ -9,6 +9,8 @@ import type { ExcalidrawFrameElement, ExcalidrawElementType, ExcalidrawMagicFrameElement, + ExcalidrawElbowArrowElement, + ExcalidrawArrowElement, } from "../../element/types"; import { newElement, newTextElement, newLinearElement } from "../../element"; import { DEFAULT_VERTICAL_ALIGN, ROUNDNESS } from "../../constants"; @@ -127,6 +129,10 @@ export class API { expect(API.getSelectedElements().length).toBe(0); }; + static getElement = (element: T): T => { + return h.app.scene.getElementsMapIncludingDeleted().get(element.id) as T || element; + } + static createElement = < T extends Exclude = "rectangle", >({ @@ -179,10 +185,16 @@ export class API { scale?: T extends "image" ? ExcalidrawImageElement["scale"] : never; status?: T extends "image" ? ExcalidrawImageElement["status"] : never; startBinding?: T extends "arrow" - ? ExcalidrawLinearElement["startBinding"] + ? ExcalidrawArrowElement["startBinding"] | ExcalidrawElbowArrowElement["startBinding"] : never; endBinding?: T extends "arrow" - ? ExcalidrawLinearElement["endBinding"] + ? ExcalidrawArrowElement["endBinding"] | ExcalidrawElbowArrowElement["endBinding"] + : never; + startArrowhead?: T extends "arrow" + ? ExcalidrawArrowElement["startArrowhead"] | ExcalidrawElbowArrowElement["startArrowhead"] + : never; + endArrowhead?: T extends "arrow" + ? ExcalidrawArrowElement["endArrowhead"] | ExcalidrawElbowArrowElement["endArrowhead"] : never; elbowed?: boolean; }): T extends "arrow" | "line" @@ -340,6 +352,8 @@ export class API { if (element.type === "arrow") { element.startBinding = rest.startBinding ?? null; element.endBinding = rest.endBinding ?? null; + element.startArrowhead = rest.startArrowhead ?? null; + element.endArrowhead = rest.endArrowhead ?? null; } if (id) { element.id = id; diff --git a/packages/excalidraw/tests/history.test.tsx b/packages/excalidraw/tests/history.test.tsx index 8e825e414..3c807cf91 100644 --- a/packages/excalidraw/tests/history.test.tsx +++ b/packages/excalidraw/tests/history.test.tsx @@ -31,6 +31,7 @@ import type { ExcalidrawGenericElement, ExcalidrawLinearElement, ExcalidrawTextElement, + FixedPointBinding, FractionalIndex, SceneElementsMap, } from "../element/types"; @@ -2049,13 +2050,13 @@ describe("history", () => { focus: -0.001587301587301948, gap: 5, fixedPoint: [1.0318471337579618, 0.49920634920634904], - }, + } as FixedPointBinding, endBinding: { elementId: "u2JGnnmoJ0VATV4vCNJE5", focus: -0.0016129032258049847, gap: 3.537079145500037, fixedPoint: [0.4991935483870975, -0.03875193720914723], - }, + } as FixedPointBinding, }, ], storeAction: StoreAction.CAPTURE, @@ -4455,7 +4456,7 @@ describe("history", () => { elements: [ h.elements[0], newElementWith(h.elements[1], { boundElements: [] }), - newElementWith(h.elements[2] as ExcalidrawLinearElement, { + newElementWith(h.elements[2] as ExcalidrawElbowArrowElement, { endBinding: { elementId: remoteContainer.id, gap: 1, @@ -4655,7 +4656,7 @@ describe("history", () => { // Simulate remote update API.updateScene({ elements: [ - newElementWith(h.elements[0] as ExcalidrawLinearElement, { + newElementWith(h.elements[0] as ExcalidrawElbowArrowElement, { startBinding: { elementId: rect1.id, gap: 1, diff --git a/packages/excalidraw/tests/resize.test.tsx b/packages/excalidraw/tests/resize.test.tsx index d18f5cd49..8de7157b1 100644 --- a/packages/excalidraw/tests/resize.test.tsx +++ b/packages/excalidraw/tests/resize.test.tsx @@ -4,6 +4,7 @@ import { render } from "./test-utils"; import { reseed } from "../random"; import { UI, Keyboard, Pointer } from "./helpers/ui"; import type { + ExcalidrawElbowArrowElement, ExcalidrawFreeDrawElement, ExcalidrawLinearElement, } from "../element/types"; @@ -333,6 +334,62 @@ describe("arrow element", () => { expect(label.angle).toBeCloseTo(0); expect(label.fontSize).toEqual(20); }); + + it("flips the fixed point binding on negative resize for single bindable", () => { + const rectangle = UI.createElement("rectangle", { + x: -100, + y: -75, + width: 95, + height: 100, + }); + UI.clickTool("arrow"); + UI.clickOnTestId("elbow-arrow"); + mouse.reset(); + mouse.moveTo(-5, 0); + mouse.click(); + mouse.moveTo(120, 200); + mouse.click(); + + const arrow = h.scene.getSelectedElements( + h.state, + )[0] as ExcalidrawElbowArrowElement; + + expect(arrow.startBinding?.fixedPoint?.[0]).toBeCloseTo(1.05); + expect(arrow.startBinding?.fixedPoint?.[1]).toBeCloseTo(0.75); + + UI.resize(rectangle, "se", [-200, -150]); + + expect(arrow.startBinding?.fixedPoint?.[0]).toBeCloseTo(1.05); + expect(arrow.startBinding?.fixedPoint?.[1]).toBeCloseTo(0.75); + }); + + it("flips the fixed point binding on negative resize for group selection", () => { + const rectangle = UI.createElement("rectangle", { + x: -100, + y: -75, + width: 95, + height: 100, + }); + UI.clickTool("arrow"); + UI.clickOnTestId("elbow-arrow"); + mouse.reset(); + mouse.moveTo(-5, 0); + mouse.click(); + mouse.moveTo(120, 200); + mouse.click(); + + const arrow = h.scene.getSelectedElements( + h.state, + )[0] as ExcalidrawElbowArrowElement; + + expect(arrow.startBinding?.fixedPoint?.[0]).toBeCloseTo(1.05); + expect(arrow.startBinding?.fixedPoint?.[1]).toBeCloseTo(0.75); + + UI.resize([rectangle, arrow], "nw", [300, 350]); + + expect(arrow.startBinding?.fixedPoint?.[0]).toBeCloseTo(-0.144, 2); + expect(arrow.startBinding?.fixedPoint?.[1]).toBeCloseTo(0.25); + }); }); describe("text element", () => { @@ -828,7 +885,6 @@ describe("multiple selection", () => { expect(leftBoundArrow.endBinding?.elementId).toBe( leftArrowBinding.elementId, ); - expect(leftBoundArrow.endBinding?.fixedPoint).toBeNull(); expect(leftBoundArrow.endBinding?.focus).toBe(leftArrowBinding.focus); expect(rightBoundArrow.x).toBeCloseTo(210); @@ -843,7 +899,6 @@ describe("multiple selection", () => { expect(rightBoundArrow.endBinding?.elementId).toBe( rightArrowBinding.elementId, ); - expect(rightBoundArrow.endBinding?.fixedPoint).toBeNull(); expect(rightBoundArrow.endBinding?.focus).toBe(rightArrowBinding.focus); }); diff --git a/packages/excalidraw/tests/scene/__snapshots__/export.test.ts.snap b/packages/excalidraw/tests/scene/__snapshots__/export.test.ts.snap index bab78a832..a75a36d0b 100644 --- a/packages/excalidraw/tests/scene/__snapshots__/export.test.ts.snap +++ b/packages/excalidraw/tests/scene/__snapshots__/export.test.ts.snap @@ -27,23 +27,23 @@ exports[`exportToSvg > with default arguments 1`] = ` } @font-face { font-family: Nunito; - src: url(data:font/woff2;base64,d09GMgABAAAAAAIsAA4AAAAABLQAAAHYAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cLgZgP1NUQVREAAQRCAoAKgsEAAE2AiQDBAQgBYQkByAb5wPIrgp4Mt6IIcJZFNCfWmZY6KzqazTt6AiVHCFawzJ7V0CQBKoSQQEpFKrCVxiSFbqqqsaTevKs/q7s6uBYmujMyA9wxb6a7XnEOcNnDLgG4nW8PoPzHzYpS2uqp51pL3eB/xZoxIllCQc80B9o4j/4xMbxQB+j+SC3hsm6JmI8RMaHj+aJApW6ZbkXlg4vXSE5FECg0og6LzxP9pOarug4tF1RLpbHeZqLX0pIt2mfy3pNG6eyGaRIjrnrr/gv2c//yGdjpJ/7DuJLin5eIZRLaObBMM/NpYpuXJ8z3SE088mEFANcCARESfwChCioAwESsVxBgeyxp6+vZ3Xzv8uz7Ae8tRk+p6RUTPOR7BmlEgh+STsAimNuKibilyluhBNe5/wCACSBKrcykVfgyb+RYcK/TGq9yMyCt3bOskSnR1FqTLMSVBsMGLQVltDKKw2IYA+wcGxHJCINY9mDOCaN4IZEo1ChY4xNg8DaB0RxDqnbMNjXJJRzF9iInqahtm67M8dOHFvXaYbn+wrGxKG3YZI+2V4CW58ovdfV1tFHXFJJiPH7T1FAJxEgYo5BKkA5iDIVQluOqZYWhQapGF6TAFhaFAAoTBIZsCFHi/0oV3gpVKwbAA==); + src: url(data:font/woff2;base64,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); } @font-face { font-family: Nunito; - src: url(data:font/woff2;base64,d09GMgABAAAAAAI0AA4AAAAABLQAAAHeAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cLgZgP1NUQVREAAQRCAoAKgsEAAE2AiQDBAQgBYQkByAb5wPIrgpsY9TYDjGuJ1F+MUed8Q+Do8lDKF1uhErOw/f7/X7tcy+iEk0SUSWRLDGExBCqZYuETCJVS3jlW/rvPv/y4Fra6szKjvjBubd/Nui7lGEMuAbidbw+g/MfFilLa6qnnWkvd4H/FmjEiWUJBzzQH2jiP/jExvFAH6P5ILeGybomYjxExoeP5okC5TpFmecWVieTSw4FIFBuSJ4Vngd7SlWTd4eom7xMLI/zNBO/FJHO0i6T1Zo29kTTT5Ecc9Nf4b9kP/+RT8dQL/MVxGuKXlYhlEpoZMEgy8mRiGYc/001h9DIJhNS9DEhEBBF8QsQokANCJCI5QoKZLddfb/er5n9XZpln/DYYniZkJR+fpjdo1gCwS/pEkByzEzFRPwywYywwWaOVQCAJFDhTCbyMtz5NzKM+ZdJtQeZmfPVzlkWafcoio0oVoJK/QGDNsMiWn6lPh7sAJo3ujXOJwmjmUNvVJIPNzgSgQhtMDoJAmM/EPVmRd2Cwb7gUMZdoCNqiprKqu32bGxtjOs0w8O+gFG9obdhkj7ZHgJXvyi9V1VWUUeciDjE+P07FJBxPiCij0EiQBmINBFCV4aukhKBBImYd0UfgKZEAIBAxeEBHTKU6I9yhpVChXUCAAAA); + src: url(data:font/woff2;base64,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); } @font-face { font-family: Nunito; - src: url(data:font/woff2;base64,d09GMgABAAAAAAIsAA4AAAAABLQAAAHYAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cLgZgP1NUQVREAAQRCAoAKgsEAAE2AiQDBAQgBYQkByAb5wPILgps9xRFkFEihAtyRcm3sWFhmEeo5Dz8tx/rvpmPqESTBE0lkSBySERCJxSLhLR5U7Uk2jzt3GfnB66lLWNU8Qd04uTtzX70HcgYcA3E63iUZs1n9bQz7eUu8N8CjTixwAIOeKA/0MR/8IlNNx7oYzQf5NYwWddEjIfI+PDR3FGg0bAs9+b23pkrpIJSQKDRjCovPE/2jZqu6Di0XVEulttVWotfakj36YLLQQ0bl7KZpEiOueu9/Jf8839UqzEzzv0A8SF9YJxXCPUSunkwzXN3raIbN+dMdwjdfLKQYoILgYCoiV+AEKVoAwESscqBAvl55Pju68dV2/rv+py/wJu+4f2SMlM2UqnaudRKIPgl5Qwg9QWdJuKXJW6EE163fAIAZIEm97KoGvDi38iw4F8mrV7LbNNzvWJZY9CdqDWnXgiaTQYM2gtraOOVJkRwDlg4tn0SkYaxbEMck0ZwSaJRqNABxqZBYOkVojh71KwZ7AsSyrkLbERHXV9Tu92JA4cOLMs0w5N1BWPi0Fs3SZ8sz4GNN5Tea2tq6SLOqCTE+P1HKKCTCBAxxSAVoBxEkQqhDcdYQ4NCg1QMr04ALA0KABQmiQzYkKPBfpRLvBQqrwwDAA==); + src: url(data:font/woff2;base64,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); } @font-face { font-family: Nunito; - src: url(data:font/woff2;base64,d09GMgABAAAAAAIoAA4AAAAABLQAAAHVAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cLgZgP1NUQVREAAQRCAoAKgsEAAE2AiQDBAQgBYQkByAb5wMRFZQHZF8mb0PNXjkIbeHQ4UpbWDTlYMnK5cOfavAw/zzrESo5EbTf6+zdCyBIAqHiUlkJRMJHmIKskVWRFZ4Uelb50Iz7S0IKNNGB0oyDDbgkjnxA+VCvYpk1vog5la7RoxGwSoMFQHNIwf6bvMXbb7uB/zbQEScWUOABB/oDJf6DJ5YWB/oY5UFuDZN1TcR4iIwPH80dBd1mzcrh6sxZnRpoDQTd1qyp8Hzy6v/JPaP30LMHRmG53ZSD/CblWFLgqIbNBWE2y5SSY+mk9V/qr9Nr9rO2mFcC8rUMi6qITgWjClaVl+6tZxG4/ezyvYhiVKOKkiUQBNKW3wCR1gQCConGgYL6Vik5uYHBH+T6E3yc6OHLTplP/6g2k2hXQPgla1sH3lJf6DTJbxPEedV9bQIAqqDHcZWmC+/+j44tH3TR772uDr2oN6zbTDun2m3YKIReywFCxkEb6b7Skm4ghBglR9vyebxlKPLNt+27HjvxxGew/DGCDtQsGvyXTehdSPR6qVWpddg/nU/LMs3gtu7yCJFbt56xvjyH9E/ovVql2tAfnq0bv/9CILBNpk8584BQPeMxltJeuez6zONGyYS47AK4ke1Awmg5eZRnZSUd); + src: url(data:font/woff2;base64,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); } @font-face { font-family: Nunito; - src: url(data:font/woff2;base64,d09GMgABAAAAAAIsAA4AAAAABLQAAAHXAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cLgZgP1NUQVREAAQRCAoAKgsEAAE2AiQDBAQgBYQkByAb5wPILgacMo33iNXw4rQ+nvxRQyQajY97hEpO8P1+7PfcdxGVaJKIKtmThcIQKqFYJCQypZO+JO2e/tu0qRygmchjGCYuED6gcn65sG8dyxhwDcTreH0G11fptDPt5S7w3wKNOLEs4YAH+gNN/Aef2Dge6GM0H+TWMFnXRIyHyPjw0TxRoFa/PLaydngJERnKEgRqTajzw/N074QN8V2QC3HA8jinpfglSLpPt8B2TRun8hmlSI45/JX/pfj5H3kxJoaxB4gvKYb5hVAtoZ0P43y3lzoxXP/NZiG0CyiEFCMAgYCoiF8AhChLTSBAIpYVFCieB7aWTjUt/64uih/woes7fJ67WFaVy3kiNwOVEgh+SQcAqsYYFRPxSxdDOBZ0IyAAQBaoc68QuQYv/o0MM/5l0uhNFlZ8tTPLCr0eRaUpzUpQbzRg0E5YQWuvNCKGI8jxxnVE8ckgOfaQNzbDhxsKg0ZHjkkuA0FrP4jw5pC6DYN9TSF4d5GL62kaauu2O3PsxLF1nWZ4vq+RbG/EbZinz7eX0NYvQe91tXX0cZd0Cm78/lMCMik+EG5OIjokeLgyHSFbnqmWFo2B6KR3TR+Qo0WDkMamUCEX8bS4j3KFn0Llq34AAA==); + src: url(data:font/woff2;base64,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); } @@ -153,23 +153,23 @@ exports[`exportToSvg > with exportEmbedScene 1`] = ` } @font-face { font-family: Nunito; - src: url(data:font/woff2;base64,d09GMgABAAAAAAIsAA4AAAAABLQAAAHYAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cLgZgP1NUQVREAAQRCAoAKgsEAAE2AiQDBAQgBYQkByAb5wPIrgp4Mt6IIcJZFNCfWmZY6KzqazTt6AiVHCFawzJ7V0CQBKoSQQEpFKrCVxiSFbqqqsaTevKs/q7s6uBYmujMyA9wxb6a7XnEOcNnDLgG4nW8PoPzHzYpS2uqp51pL3eB/xZoxIllCQc80B9o4j/4xMbxQB+j+SC3hsm6JmI8RMaHj+aJApW6ZbkXlg4vXSE5FECg0og6LzxP9pOarug4tF1RLpbHeZqLX0pIt2mfy3pNG6eyGaRIjrnrr/gv2c//yGdjpJ/7DuJLin5eIZRLaObBMM/NpYpuXJ8z3SE088mEFANcCARESfwChCioAwESsVxBgeyxp6+vZ3Xzv8uz7Ae8tRk+p6RUTPOR7BmlEgh+STsAimNuKibilyluhBNe5/wCACSBKrcykVfgyb+RYcK/TGq9yMyCt3bOskSnR1FqTLMSVBsMGLQVltDKKw2IYA+wcGxHJCINY9mDOCaN4IZEo1ChY4xNg8DaB0RxDqnbMNjXJJRzF9iInqahtm67M8dOHFvXaYbn+wrGxKG3YZI+2V4CW58ovdfV1tFHXFJJiPH7T1FAJxEgYo5BKkA5iDIVQluOqZYWhQapGF6TAFhaFAAoTBIZsCFHi/0oV3gpVKwbAA==); + src: url(data:font/woff2;base64,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); } @font-face { font-family: Nunito; - src: url(data:font/woff2;base64,d09GMgABAAAAAAI0AA4AAAAABLQAAAHeAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cLgZgP1NUQVREAAQRCAoAKgsEAAE2AiQDBAQgBYQkByAb5wPIrgpsY9TYDjGuJ1F+MUed8Q+Do8lDKF1uhErOw/f7/X7tcy+iEk0SUSWRLDGExBCqZYuETCJVS3jlW/rvPv/y4Fra6szKjvjBubd/Nui7lGEMuAbidbw+g/MfFilLa6qnnWkvd4H/FmjEiWUJBzzQH2jiP/jExvFAH6P5ILeGybomYjxExoeP5okC5TpFmecWVieTSw4FIFBuSJ4Vngd7SlWTd4eom7xMLI/zNBO/FJHO0i6T1Zo29kTTT5Ecc9Nf4b9kP/+RT8dQL/MVxGuKXlYhlEpoZMEgy8mRiGYc/001h9DIJhNS9DEhEBBF8QsQokANCJCI5QoKZLddfb/er5n9XZpln/DYYniZkJR+fpjdo1gCwS/pEkByzEzFRPwywYywwWaOVQCAJFDhTCbyMtz5NzKM+ZdJtQeZmfPVzlkWafcoio0oVoJK/QGDNsMiWn6lPh7sAJo3ujXOJwmjmUNvVJIPNzgSgQhtMDoJAmM/EPVmRd2Cwb7gUMZdoCNqiprKqu32bGxtjOs0w8O+gFG9obdhkj7ZHgJXvyi9V1VWUUeciDjE+P07FJBxPiCij0EiQBmINBFCV4aukhKBBImYd0UfgKZEAIBAxeEBHTKU6I9yhpVChXUCAAAA); + src: url(data:font/woff2;base64,d09GMgABAAAAACDIAA8AAAAATBAAACBoAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoEUG5s4HIIuBmA/U1RBVEQAgjARCArcOMh/C4IgAAE2AiQDhCgEIAWFIAeKHRszQDOjtqTVapGIitUkRBFsHEAUdrD4vyVoS8boetTVSjiETRQV3V2arZkZNeruUkeNHvVQ2HfrwFpBrMAJayLWrNkmSt3iwYJDWLBwJVdP7Pc7qu4yRuK5PJT7kW+THP1DKrBwFQbZI0uWhI5kNSvV8cDC1nW6w/Pb7H1wmPQPMIlSwUBFBUSyLFDBSDDBAmNrF9l3u1vFXe/Kiy6XJU8PN3x3v4DjATbUaYEN2P/lnHeTBWM2dp60adnmU7IDLtIg0P8ABAIJaIf30BoAXB709zr1/7Dek5SCwDBxJLvIE95uKUA0tazVWg1UDiBvZQM8b7eD6+2BVRDYeVJbhBkEn+RWlv/FVv8D6ANvQAECgBFgq63sGEzNWZ4FLso9qfjza5n2/327Ad5D3gNX1inq0xWqQmb+m8zPn7+zNBvYTIjmOHSAu5ltOqEyqbtTvUrOFghTQAUEuhWqxqC37FWtrC78E1cb3/+220KJQ9vjd/66rWm81UASW5UwUcxXmW99NoUb0BVSk76fWlEuFyFujLmNaSel/bmUMFW2EJD/ByHgZAFgAkDAAaYAQyA4y6wCAQoqCB4kTRpIBjYITzFIKTmImhpEzwLi5AapUg3i1Q3Sqw9kyBBIVBRkzATIQgtBllkGb5VV8CBAJ0c1/KYt9moA/8YGewH8tAz3A1gMQM5UAQEHf/7kYD9gPfFNIPntGeMATmMI0C0DtUTkiUNAAUlApPhVkYRRUsakJIRYPQqzvC2VCHFUQhaHRLAWW5UNseo605KYH+MxHP0RPFvYGv7wZHKHNfShipKQpm1xCIKF7skBBwmKM+8eDjxyx7XAgTv+9bsffe1TLHzfW16Vz0/dv3bOCU/hnh2wyxbrrADcMhdkdn5fcntcfmfoM8iPQUgCMsRBGmTqgtz8EPjvxV+wRqYnIV1O+8tpSMz2T/WyXNQbfZFhhjgEJZwGDZjBCHkwCfNhDpyYZK0tCBiCIVkK+EcakmCQqAAqawT6ZUhoyMKBjycAwNOYW5OIlSsfVYFi8FEFJqRAKnAo324m1H597fk6BUh16VZ4eEEGJVAKcll21BaOAToJetYI4s9zz79OOHEgcXD968QA3cQAAXCwXFXmi9H5/av/Perv57Fp2UeBvONkOKPxf79C/rMMah3GxfEMuFwX5OcjmdFquFBe9RejjJ6fVaS2T+4h7xlnEfay9mZelS1yOhKQt9hQeovqxF3Uklu/HMjHQP45x4thI3mXSi4ovwjJzXjeBZLWLQCpV5gQ04zW0Lm+lQ/2AxsMd8bIxE4Z38GoJjll5rJW5RHoh1rYihzyvOUJM2eTxtys7r+5k68byRx+QwHjTktDfm2PG/IGN1r8LhpHVL40yS4jjayRu0M8ZNdhckb6KMy94fds+QiD5zj4QqqZf/SVdC25y9TMdUytD/n5ePjb6r5x1Pb+IO+YxYkP4b68b6FvDofqPPAYfmMc8bIjKvlp0PPvZ0ieR4FY/l2aVY5H0fRdES/+MZDXKVh8xn0w/F/6vv6XEgfCnhWBv6Y+zDuH9YtxR9Xu7wYMF1qwCQ8cSasiLKabV86Ac+jyNxjHDyOsdX8NWXjer27hZjDe2R/Kqzf97BfTV6VDklrzbX8T8XS+9YbjEAaseaOE9AqmfB4gF0/GqRw01R/oZVwwkvzhaJ3vkbYJ+vnZvBiVYOTkY4JG2HSigPjAKADXU4sDvRSasZqXhLQ0uO+O3RXzQ/6WKwMT3kUAwJ/HFZ5gWY/m/nLorl9OlG8giBZ/5/fGgj42UdGmYhJk+QMTpdmlMArutZ+hzM9U/viTaRilsLBhc3Dicasj4NMoT4vYY1QmYNvNMY/2L7BIQJi8CP6oBe5xZC+UHoBBoydMxEmSswMmXivKfqVzEoF/Xtz1L4qDASalwunkNDHLgA5OkkJfTIIsFscMTKHASTJNMxIowiQJStPvTSwcCCRNAIIlUYJOxqMahGaE2Jdh9FSbSEbTvsAMoE55RhD1aeJ6YC0Dx9aU1MZW4ySJ18kxiIuBIRAFEBI31ZOlyNpZkBgAhalgcxKXORmYTAB9oIz+QMeq9703KDwsVjAyemw4aGaBBBs93YXaHqjHj/eFQXLY/oTaet+zowRZmt861lxhYQJBoUDGkUxsHJNxUVM74qwhJyV/q309DozQBSP6HAob2zaWzcaqSCtSrxdTjRTvXX8IDaTQDY8Afw4jLs75aFaAStx2TJHFLbOA8qDUAnZG+45DUsNxVVK2KuzH/gOCRw1epfmg9eb/vQC09SFeAXoOEH/KZcCK0mr7FjAVkjXbXDkdHIYA8IMhBLSwvUF+HS7YQJW4Xt8D3QJ6bgFTtA7yXrBIBSygwEugcTk4PBST3LhN3nStqa1vp1eiORPimkHMYuM1RdO3de3UWUajAT2+C8C/ycBcB64C318CwZ7RTf+NXnLIEQBrCTiwGeiZmFlo6VhJZCumkiZdBhYuHiGRTFnESpRSkFMqo6FWzsjGzq1CpSoeXvV8/Bo06dGrX5+QsGFDBo2Za55adearNipq3ITZRkTM0axRtwEcNZwWgEA50yggrAWIZYCHwMhWYPwG4g0QNwEUuJyhCrqmuMOCJE55mj3fKOIJ1akANVZFM3iC1FRnLx4XTjPVLCTTLMUlyR4EKQAdjEbzUJX3SotJ6WUcjIlXHSwSptJIdKZEFqUWZ4plpCReZGl8Bl+gpDLi6TIv1qCaZXIYqVkkktvBzmbD8TBDsjKZjIApuCnhkPiMwkXCmPgLMj/WWDLN4mSzGEgemex0sLNYT+chxIiQYSPSm49uiceoLrFIFJ5hSUriOPbzxNu4mlhiURMxltVW4IS9Oxmg6Vk748YIBH2bfl9SBGJud61PFlXhCp8WGtS2aNIMQALQSwR0c2NODQZAX2Y0rmDZCn6l8JvdV83YxIi0tdkVJGngROWuTQ91GE01CDtE7WXlTI9wgSXfDY1NGeoi5hNxUTZr8tk8IOUkxzPS3wjKyqb+kMD65pO0nvWSwdoKgZ2OrK5CrNiE1s1YqkKbb77czrIry7OS70y1IKy5AfcfAXLikGrLt83SrOT0uLhJ58700z1S1z5WzdiIM8hB/VerMaO3KGYrUtRbakLB/non5GpSZdmbn1wJvm3ilgpat9mYWDmzgElpzb9eFWHOFnsJFTcn83e7qvgPESRZ45AdvmiOx9BCk+3uKTiRSMrbFgdzyl4ppqJ0DEkoZ6qIVjvnCnJKPw0bE+xIzb9fBK8X5dwG++UzFPDx2g2ibRZ32yaiQkMUm+/rPglA4OxqavKNnzBJKKrFM+7W+QrpAMuXJrAJJ5JROfrhCa5BiS8+N852EGonBJlTvJfhykkf9kCzktF4k3Hm/Y5+htRQ/UaaNR3xuv3IgjrHXk70JaIG3q1TA7SmRMdqDP7hlF+8UBNDR0ZNRl6EGuFsajKpM2WCFibPsnisffoZh6hY/CoYZsO2PPl4IM5iyccsJfk9yLVtDI3tpSXHTSVZJ8aHKp/o9aZEpTpqs/Tr8eBE/0p2R79pzKYvTSbkBWHrJ5qVHB8XJ+vkkMebVqOENsSTbGLSiHef15mmdM0KLckPeyyh24EnUuMHmXSgtQ4rOruc5lO99yLZPPgEJegsJeyy7X/OFSmOS8YK9hRsDCS06d6B07dGqkxiHSFAB6UqpFpKovO02zIB/ISr4zOn4B88jKJ2pxj/H0ORhd6rypwgV00JlpLrIf4h0M1jn0H8rgVxBBHACVqlv1JzWOecJaq7GxE4GFYRMgSdP5zZFNJn8Q2qMt1cLUxjcpdG72wUNHZ1FHNuIBzK24i7H8Wda3ZDujqrqKr8mR4Gk2puc9xvy3kzpdd2TsmyG52C3+lhfpxMg4whsTQkYMauYVlPAm6W+zPNWhbsDVrDccNSsH3mR0QhWKHKHR6rSixpFMlQeDUrkRwXR+FpUW6cKiPCWmE89gWY0GPsOo7XOw7WuOsOnGx1gMHeFTJaeqQo8yO8Ez0EPk+hN+/IKIfxgYTkrVV31fGsbLW/DSwLPqviWOXLk6ngwZQnyk5OxIPqHTLhCRF5VbhdpnhwqXFU1NRH0av7iX8UAj647XrCqyU94a9lfBL2eydDA46pf7HHsiytsSbZyk5XvDnFE9prB+93ddiyqaMd+42oNZl52fg4w04yHh4FrTuy1tELwmJldbTZJJmsqdikrJs1qQrtVO0SIhr7mSgQkJuTEwLhMkvVrQZF3d5uFL8SGAyqHYLtDn11ir4y9HTmT2LSsBMEjhqoMjKSDcn1kHzjpb+ZGT1Slpe39p0TJwAninA8TRNaTlTqCMcpRWN5Z05O8PRZSrUGk8YTy5ErqEXevU05qwsSJNQm5BjnVD5KuQjHweRRBqcpqctEAsoQbs+BRDN8B0OvSRV38xhTvk85lUIjpacR2bzAm39E5200OuqXy6dLE1JMT4SVId43Drax9dBL5SfJsQvnT2Zea+XI4XQSq6ygomfyE/8sEmInrPnUjKUuxIbDKzRq6LjZTyUU0P2rWdqqXfmYH8U3uM4QcSHzPXNDs+UoiLM9muNV3RHDprBA6hbd9cOtG/6I13lGsw21sDEyVr8pqEvI5c+jeSPmLv5DvPbISma/IfFE4QpG9MCoGha/4V/EpV9FRDOZSBOLrt6FY8FE5Z8dWTfSkC+mioEVmksRpnRNnqFSD2yidIXFKho8vMh4+OizR2/e/OJKcuPO8HB3+64wWDptZzQMH49pS2d2UYVcY/NqSGRLXHW9pXG8PfyxecppU5aX2xTOKetFu10pl9uV9otghV2bve4DoSrJZE3j7HyXsp8998HOIOvUg6xKRq6jWy0br6uVze5WO3KrmfIH+9ODY98sDHNMjhuma2l0Hd38TwG9YF0h1cgtsy3o802ChaCjWIgRRbEoI3FbouZgaFMIG0WxTwzZhmBBmAiZE3f7iNJIMZRf8YrC77Aoikax7xSiSlfOOTAf2AtHkU6Y5pifeCdDJnh+GQ32IFHYhCAmOAW9+ursJDJJ0nPjMiMVNoEFtq+vdR/or5JMVjeO5ttmv9e1/zEsrm6K5lsrzB0a2ZzaxZH1/eZOddHsusnoxg39D2oXthS9Mjge6ugcDw2+Oo0F0cA5p9Oo1zv1znNAYa6X5Ej74+2nzdDQNz+2p5TVVpYXZp8yEruQBrrf58jl2w3FjWlyVS/71KVRE3nBPxNVDGmBNWOZIGdIQwzCbXCzx5LDs+gKW1JBLtgoZvmOXk2nV9HpsI5O18PfWbAgqIQ2KDlxVc37JfeUpJVK7t03RUl7k7Kvl0Jrlbz6Sy7vivpE2iCdOOeVzznczzivzAHZoKMMXdld725SFZ085+QHKdgHKfv8VJqW+Mpdb5kuH/ym1C0U67JkDfOSe3PlEkctUZohbMkTbErPHFLcKmUbqJV/Vr9GOPz5eQ9NoKkSZVZr4zAvAgcwU/zweXUqSNHaoyoddMpZvjJ1LbuE60DijlYbrrRMDbgY/KW9dHV2javZwlAtmKq8Uthx5K4NAZm6wsqysMOuHOguN+Q7WXNSa0soLJpHXk4sTDcfFufpxFx3EaG+xlfB0pJ//3v+k8KtXxPqGWAEJIrNlFDZFDbPXl4FRxA0AleVn6ZTyRz+7mNEc2NpmcKWxa/RELAAikYxSJNSrLY7df/ngpGKjGFrGaMIOspYi3Wh/pT/Gcn/pqS9m8x4n+UxgcSXrvmGC6+8qqXJPsAiKBLB3lKJnC5hzFk6d07qt/fge4Bp7iorHXDIWf4yjYcju9Cwp+Fmi0xidSbHpah1+LTZahE3ngCnH4wkEkUdWARBOzHf/jsNGq2mSVkUdjoKB5uVGs2y2e3ER2j0yP1sBy+XiCmHOF7R15TUw2NHJnk/aS90mKm84ig71Rnw035QqQskeVovt1TsRO9caNf/UPnW66+my7o4yVCxn6YmapSF+m4nqBzIFcRXn/1Ssn/q4zQNhdqza/kJ1vITu3ooFE3yAPveFD3z2U9p2hdw0/MZG57f2QsuJUUtDum2C1682Kxoganli3YtTN27cKiJTmUr5j00bnIe/JIFdOktFdDr/vokPN7W2jreEf7YVmNApZbTmiC2DOvNbFLuGp3bTD6anQXXIFuHGCN//i6VdsQI75DkaPp2F/9yfJKxnRFhBt0DOh8aQXec8HvpgSc0E9nu6wszhQN7sj8D/4AGMVplsUX6nOdCeNdld88C3wsZ6jrTRfELySezaIef2/NOUXOQhAVQJIqRuua/W7Tn6cOc5L0vJosnNVy73P/Cgh735V3zay48b8mXVdCwUVCkYwH/tXeWecgL/j5735wkKnelBLPLbKWOlXQdnaqjj9vtcjlfZk4rLmhKGb+/cKY8vr4+zlZX9eUWe+Qau1eNtxNXXuqL5IEJ4v/YqUkaRDthxIOy0MP5J2yUpPsbSRHEiyABhI0esoNiz8TCWBU8C0aaXO+eU17zTDUlvbVB0Mb3xC2i3W3oFnG/1vV8Inry9NoUWMVtoq5qPcDYzhxhbmd0+ryi8/YCxt86JqxvRJiXGSJQwrYNtc9yGK+vE7dQaXl7b6+mv7e6T0qnNvk2qvp6deDYgi7D1MuZ7WvMjiWNpqxwhT0qsjOXK7Cl261QpJ/CwGqTbUmTMTtcaY9k2pjL1VjQsOpKJTfPkbY8rarEXNTRVFTONdC0HPsWxtOrZdbCjsYCDUcLeOu75kcf+6k5dRPq8vktQ4xq/0kYfaGWQHNWJYWX3hKu67sb9sBzshnbGZ1zdZaNlu/XM7S9GY1ge7LBUpYcNEALToxgE3PCFQ3U5xHYCE942FWpPXbBHjDeeUZ4TzOTWcN8d2JUibqwVcKH1i6xzKM9BtM+sL0x9A1gqVPTTtqOtB7JNmP9rwBDIwnME2vVp+CGEIW/M7pBH1qD4uLss050hAzQelOdnAefNKR1vnuhNbP79G7ilQZGBW3PuTGbCR8ZRBFx30NP6tANiZVvco/05qDw2wTrs3/Hgrn7H/jdDKktoCwZxFdMeWAdla6Da//A1ZREgmU2aSWz78F6yLLjm9O9bICp6mWf+WaHBWz451QypdZgmXwYqv7UC1fRaFWw5xtcRdFwh9KaX5Pa9eA0y7T8G/wARxHcUGvf318tnvQ0TuT3zWv8+WMfNad+Ql0+r7Ur3+9+EGsLt3Y2Z7nJhQgWBIv0L3W51xPat1huhhMe+tbYVveqJXZf62qvY3+oSry4snE431xhbNVI59QuHljfHW+tLphdNzm0EaQ77zE/DqW/K/mv7911Lx7Uli2oO9j9lCjFEZ7obtYW1Xfl2v8rtx/VO8NnYs+43BqNxq0F+g+bVfT5r4QNpZ/CN+llmoqK+lBroE1so/6KYEFsT/fopIeWY+jiGU3cXkuDM7+nqRiw2u97sGR2va2lcGG3y4WsFhQe10gz9VtFDmMpt0qWTXqmQG3n5pU3Kor6bI7SUKDMasq5x3GUVtt9OolaxLYW1Vv9YM4YxZZjUewNhTWtOCtnpoj4iUFbqPKZPYcU+/JEAqEwb59yW/ZfXN4f2dvAhOXfYAXzGJOA5NNoUuSnkbyFzN+4ET2NXoh0MHcwP9i+eU3QauAJiUTaeiajkhTU+UhxP3j5N223oZ3oRJYQLoKbJpuyFJ/c9L5QZ05dAlaBBrCTyhTF+w/t8+Ye28SyrNEPVdsOH7AtO3k84UZgy+61l6x70QZfg+61GO/83VsivyUfX3bKd2azr1o3tMbC2rRjjW3egx8UycqTWBTcsKAF5X95GLnaeveGiyYyXhTwkZxaqpZM0VAdWTFsbq1KaKCAzOfSirtLGuDCxgaTJueqgXjZrJZpep0gCjFzM3Ub4oHpHqQrmRkdH4BJzEnqdthER0xwt01GmR9aotgWFE8sdK9ndeTm0S891XOAWGoDYErojRh5XmknD7NqLC1/boJMW/96RQXr4nwqF/MYE8/cwVyJRcEIdCOyjbI4mURkfGA5xDnIqX8JIyIljG2IkU73IHXYwXTT90TS+6ZD6WgdIltPyTYssmEntv/JfqxzLSImW18f7MSTE5gXZq9kHmNaguDKZX/kYcTzy4RE1oj41EpaJJNH08KrI1gArE80iN1MuG2UFxW5yrIHHA5EXEqjh0n+RwKTEY/rYTATvjDLC4vcSshdLZMVGuW3E25iwRP3OPeS3co6uU/Kjlt3VyiZ7rhKznmJUpFcwmHf66HwldaD0018+62vXOV0t7V31qz+MTmNr+g4jeEzeTlogLEZqwXMoBfALREsiq23sy56Nfr9Wg7ssCOdyFwRmMMyoxNGPeT15KmMUra/wEtR8CRoOrjFB67bv92mUvL1ll5IHrINokRzUYtRDfADObm2scltzxObqgXKNarJ4pfz814qnoSZr+ADh4Nm87Zc8J71DUIRWEujauED6FJs9hreKatVi25xEagsf1644qNfFQr0lFBl5ggo6IiubWjmEc/fRyiUaF1jksniExfn4njxZKKEJk01VwnKXpi3P/rkRG6tYVL2suArlK+tTyUfcMnZvnK1jy3P9jI3X+rQT6svHNTQ02X6bK5Z7PybrqZSNPS/dfjKqnpr+o2zF6XT+uFLF7wYeMcsL+OLi+36K9qLB2+kS40igUOgezBDQ6GqXxYDlWc1ZhelXT93QTOtG7n4hYeZZe9VyEMOBbtBpa3jgml1bUWK9lm6xhOYCUMD2LbVf9E82P6mWI3S35qvHr6J2Mt5OxwB9iDrdfyaR7KmdceOFNj2ZFkTo+mk+EqfTS8RaV1c5Vl0KbYR6bz0cOLsRGljVlYTaHhvLfmFcPb33h0ktfiaKe9RZJSgUWxGSc2nsPnu90VYRxXkPkfL4R2mtSDf6oY6za8vA/i3/B/BAL6HrqXyRX7GpePNtgqEWj60a2HKnoWLyt+ifllDl55F/XABlSfqoQ/kgHnAAWQI89KoKSeO5jNZaCeCeNARxESl2E8cycfYiHdxPHmGRJoh/0NZjUsZ2pqt4wn0ObkC7fmM7Gwtb0ZujkA/AfuTPQ629DNhisfOkf4G+GudzNg4efZsZj9+Uigaxs9lGk/HZH+kRgbA3b1Jtji06eDrjDm827l5t+E5jNfPDvcfaZSB2jc0TMa2G03L32U8LfDUU7QdcFrb1tXFlJHRee49/jZ5FeC2cZ18yF+xJzS6mCKaDWZtzHAQ2ENzO4Yyhad/YrYD1nyMwXyambydydgBcG24jpGdhJ8Di1fVzO3WpVYA3BBueUuqrtszd9VI9GfCTnBv8xtIxvKbieveGkc3qjP5gvsb0fEv5yfeLCcZ/UnKAC7c1EImQ9TLHPYojoqwDgTosyohE6wmvRjKmLTBoiUKSUgA4cwrY7B8yyFz5cUZ8q00xI5glQkhxEIiJMEsSVp8MmlMSLIAUcZREDd5uUUyXoCyfk1y8+/Fs4K0POoJVdYy0yB0EpNHPy+0NOkszxLSm+e38mQEvqXQRJahI2EoITCBRlPpOtVHxrGQAskSoSja0mvJfwQMYII+rjygZ8/6H9TM6/ffMoOUKwBW7P3ycj0XeY9lLG+rAcr5clmNkGQ06XIUDWZdqPXr6waBc7SPeCM1xg1FHJUaxd4dzfKuWE3lsknGcvMxbRWILhyvGwhEVxbN8+ojzkgk70m3IOEX5k2QO1EUFTYhrg1cnCVKsVx8Htc4u8XpigNSpbdQNJjlZaruSXlFciuu7l7MIFoSsta61jBetnhTa9LWgHhcgQJbug/if5NR9MXNtfvQhb6W1zVDxOJezvdpek5W38j78bDKN99Dx/L/p5z5x3ed4R1lpHR465PXv/8HAeqrpbEvPZusX8q/4vF/A3y+4AsC+PaFohkhzVvqOUAvHIAAvqxMPGaI4GxArna9nVuk/QEr2PKomh6kqDWqeITcELa05c1azzv4JJ1z97vltSkfl7UErUMpojCfEBfFisqcbpqyu8X1fGt52NLGkt9ISoM1CzCKka1Y0MWRliEDSnEN48xnUjoPr38YHL7ltX+hVsYqxeroHWNOA6zC2qWQoHU8FNVu+ZTSSVVzsEGMmEW2RqcFFcno07pRj9UNMidFZWYHLMLMvS7Y1fm4PsaCA8rGzZpXqG/iKktpFaQVceZScIh6JJdNOs4kQ3MHp3Zw+FBbB+72SLjBHKXDpcSV77fKa/mkUKRJdHgiUrF/CXl9nCMkGswSaaC/V/TgZmoAOiOcmSbNNSx/FeYebca87lG+P1PeqElIsCgM+8piAZO6eddRpgbIalojwv4L7fd1u2Z/V8IgwFNOMfTwh0mWuXbEiXRui69/HbcRgOSFFcAhBS2Ap/ehO4YMzJLsXIAgx5IAiYw7QMGRs4QqCScKAfhQCvkS3LNwd9gSAAeE9GnRz2I42n+vLm28OroHBA1ziGifthzRx2lEP+58WAiLwahhg1rYc5RAGVcMGyKXmxjSxhldX3oocjTRpTeyQwYFdA8XI7u78zhUUovwGHLQ75uG9GMpkEMmj3S2FZxcgTRg0ErQShGA6CXHOtj2UJaH1H2ZpRhTTmUklSdfIZZqm3QM5C3cOYmQ7rRsWyyNkX7KUKtnzyLqrRXQxSVGtM6ybSdZyg4JCcDq0NkhsOp8P1d/yWcm3LfELC115On3Nd4JDvAJiGQTk/T4N5liCkp6Rubggd1XHF9y+s/5+AcQI4iSrKiabpiWTaXRYQTFGMzklNS09AwWm8Pl8QVCUWZWtliSk5uXLy0oLJIVl5TKFcoyVbmahpaOnoGRiZmFlY2dg5OLW4VKVarV8PCqVaeej1+DRk2atWjVpl2HTgFBXbr16NWnX0jYgEFDho1EzRnsiHTEBE/LYOzI68pzQYSgMnAYNC7OALsQSahmMlj6Zpi0TSMbOndFhKCuOlviAkmCcnUuwqRdrWmb0MWykFCSol1lDqTzznsu8X51/UNbZcbdECGoDB4GhcMABpEElUGz8pnMNAwjGzp3R4Sgrjpb4gJJgnJ1LsKkXa1pm9DFspBQkqJdZQ68S8pfZCcVifsZ6/Pv/O+3jVGM6s//r5d3Q12B37LdxbfckeE4SUR9dyXt8rYjKadZmhMbrE4oYpcwv4zvPwYAAA==); } @font-face { font-family: Nunito; - src: url(data:font/woff2;base64,d09GMgABAAAAAAIsAA4AAAAABLQAAAHYAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cLgZgP1NUQVREAAQRCAoAKgsEAAE2AiQDBAQgBYQkByAb5wPILgps9xRFkFEihAtyRcm3sWFhmEeo5Dz8tx/rvpmPqESTBE0lkSBySERCJxSLhLR5U7Uk2jzt3GfnB66lLWNU8Qd04uTtzX70HcgYcA3E63iUZs1n9bQz7eUu8N8CjTixwAIOeKA/0MR/8IlNNx7oYzQf5NYwWddEjIfI+PDR3FGg0bAs9+b23pkrpIJSQKDRjCovPE/2jZqu6Di0XVEulttVWotfakj36YLLQQ0bl7KZpEiOueu9/Jf8839UqzEzzv0A8SF9YJxXCPUSunkwzXN3raIbN+dMdwjdfLKQYoILgYCoiV+AEKVoAwESscqBAvl55Pju68dV2/rv+py/wJu+4f2SMlM2UqnaudRKIPgl5Qwg9QWdJuKXJW6EE163fAIAZIEm97KoGvDi38iw4F8mrV7LbNNzvWJZY9CdqDWnXgiaTQYM2gtraOOVJkRwDlg4tn0SkYaxbEMck0ZwSaJRqNABxqZBYOkVojh71KwZ7AsSyrkLbERHXV9Tu92JA4cOLMs0w5N1BWPi0Fs3SZ8sz4GNN5Tea2tq6SLOqCTE+P1HKKCTCBAxxSAVoBxEkQqhDcdYQ4NCg1QMr04ALA0KABQmiQzYkKPBfpRLvBQqrwwDAA==); + src: url(data:font/woff2;base64,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); } @font-face { font-family: Nunito; - src: url(data:font/woff2;base64,d09GMgABAAAAAAIoAA4AAAAABLQAAAHVAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cLgZgP1NUQVREAAQRCAoAKgsEAAE2AiQDBAQgBYQkByAb5wMRFZQHZF8mb0PNXjkIbeHQ4UpbWDTlYMnK5cOfavAw/zzrESo5EbTf6+zdCyBIAqHiUlkJRMJHmIKskVWRFZ4Uelb50Iz7S0IKNNGB0oyDDbgkjnxA+VCvYpk1vog5la7RoxGwSoMFQHNIwf6bvMXbb7uB/zbQEScWUOABB/oDJf6DJ5YWB/oY5UFuDZN1TcR4iIwPH80dBd1mzcrh6sxZnRpoDQTd1qyp8Hzy6v/JPaP30LMHRmG53ZSD/CblWFLgqIbNBWE2y5SSY+mk9V/qr9Nr9rO2mFcC8rUMi6qITgWjClaVl+6tZxG4/ezyvYhiVKOKkiUQBNKW3wCR1gQCConGgYL6Vik5uYHBH+T6E3yc6OHLTplP/6g2k2hXQPgla1sH3lJf6DTJbxPEedV9bQIAqqDHcZWmC+/+j44tH3TR772uDr2oN6zbTDun2m3YKIReywFCxkEb6b7Skm4ghBglR9vyebxlKPLNt+27HjvxxGew/DGCDtQsGvyXTehdSPR6qVWpddg/nU/LMs3gtu7yCJFbt56xvjyH9E/ovVql2tAfnq0bv/9CILBNpk8584BQPeMxltJeuez6zONGyYS47AK4ke1Awmg5eZRnZSUd); + src: url(data:font/woff2;base64,d09GMgABAAAAADx0AA8AAAAAoXwAADwRAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoM+G7JeHIUOBmA/U1RBVEQAiHoRCAqBwQiBnV4LhlAAATYCJAONHAQgBYUgB6AYG3uLN8Tdd4kC3QEk3dNOBBSwYy+4HYBUpe0SRf2inNpn////WQtqyNAH5w5Ioka17TrhRUYZVKkIaL3G1ttOUyszSlVlQgnR0ZHhMqfptnTMmbZXlU5Tl0u4LMDfnc3ez/r5Hdq+2vP1bhEmbVj8iYtlc0LXz3zQjT4iXHDBBRccdMSCiNO+qrYwg/TeTzfNEOR+TNUgQwiF/sIM5VeRaSgh0FdMOxQ4ucJ/U7WrLmVHsSBX0P0+1Jx8rrZjasXp3y6wkiM09kkufE/7/c7c3e+I+JNMp3kjFCohkfGSvSazEv/8PD+3P+e+t7fHoCVSxzAQqTKD+Mr3E0aPKmHaG2P4mYIftDHAH4k22HwdJkZTZdRowREbDDI42Hb3caAxRhxTllmgo/h+vyd7zvuLwqwFDpJemzgA1HFRhI4so0XhImO3fNCl6g7Pz+n/KVUI5GruvSEQBwIxEqyE6I0QJEKEBPNgHqgYUFlXsZXayjbaaUfr88rUa+v7XSdO+1cqtvL/9Be7+5clYAxDqGkK3lmasxHk0o4oQ0ZtXij1FO33bOeeYEm2arUEEUP7gqGX238389RkumUUHysqgR/EUvxxQ2sTKltbJ1dKF/EXAyZnmPjLSl7boE6VWpaaT7IcZ+MC8HEPDAmXBnQ86eO88gvUcsIjYNCGsd7TpAiCi+BmgniEhEcnMGzIqIoUrW1MpCAvSc1JuDNF01ZHAQBuG+bP8Gsb+UcGAWTCsBW6vrJQ2Wn8ApPNpSnJgjRelYK0BW2NNhv1iG5gybxwcD6b+rUzWo0j6Uv/WSH2Z2wlfQAsqv+vw/HMrkar3bFWaFgrdoDkgL8cB/3+eVZxbiXbAZR9wOT4E0KZ+rgiKq+76ory6pahPJ6P9r/lt4fvoP9mKMGsjIm7CUzQDKHaDSkK/9/v92r/zgqr3AC5yEgan4lSMfLlvtD9JwCgXl4QS6hRVrgIXcLxlairXKeqwvkao8rD/19N3512wWUV+yfgaAXMi9aHRRIF1hmwNLKB/769zib/ZaiqFRUVY/c65EiUTIO+tKIQpimOL23ociUeoQxGA1Fj2u8dQkpnkDgGDS3t4Xn39s1zb2aqeydNxSchL1dEREIagp1Frdvy5f1+6/+o3HpV7rYBAjooKWPd+HxRiyJEsNk9hp75ge3/1QwgmNapDfSgxqhSheO0y1gG7bEu47bZ0ygIE0dMh1iIhwfp0YMMjYLMWELWbCA7jpATN8iTN+RrGjTDDGiWWdAcc6B5gqHFFkMhlkErxELxUqE0OyCJLOhn+dB+h6AjjkMnFUG/+gP6SzF0xhnonHPQRZehq65C112HbiqDbnkIPfIYeuoVVKUWqtcMtWqF3nkPffQZ+qob+uYb1EcNjcQCxkN9wAzRDGYRHyZIAnNKBfMqA+aXBjYtA2w2c9h89rDbgRQOfrElpOcSJVGQujFAl6tw1NlncCiY3p+kJTL6CRQlXw4agLV5C5/3+CctGQTvHZPB9kkzSTXNwpCjGso1AfngARIaPAyjQUL0K3hqiwdq518FWucQpHvVHZ836LVuA6N16UsYabraqjv5SNiCzv/Lkf7nKtnFbLMQ/LZsoXk9ovGDw7Ngmde0vT78IPvR8d4vsGe+qKjLXbrC2RbouaDGaZZbQs2lzRznmR2HkZ6bRlMB6cMyCqAPxYw44Dfbmz7Z6vPrrfS5FW6FSLxjmfAuAu3rFgXmUtSCOpHu065tVL9OzTT12UFgnxmyFlRuFns3tLZEZEy3+Uv/FvVubsmMMSiitwfAzHVpVe8l1xAcyjIkxdGIEBIR6auim1FKPpjN1CIw6jVPL/wDFNygDasXnPCNBONPEnZ4X2WRICEc2FPVlhB9eNbteQU+nNiJN2m0wEJgpypFBB/ugdx6Cm3MAYfhgGzwhhiA7mtnv7Co11AYEoqumT+0moCXNCxsrRuYj3tP+7/VvpvbbLkIiujtn2DKhVJLY7xBoYxy19p3oF1hqRbft76VMixYj1lYGwKjjNUsn2sioQl1r/DJ0wcPIHebiXIsVxTxRlbQ5G/8/WzdL682YPl5ZX2aj27P+zZOGkpfG8DZfhbpyVA1PWPoYoul3pbUc7LUj1CgMSZjfC60OC6c3eTN5jlToD8SZCRi5HkEZHu1uV2buXkt8FWhwH6rWcYcZTmTiXmzXY98Z0WBJhNSnyeAjM+4WgDtSE55p2Kcx4Axn3hn8Il3fS6c42IN559xBGvHkxyRPJIvuWdMd1+gNTOsOU0KtCRChIsQnoyzZCJTZtJTpUuXnnM4N703sweZRWaOR4WHyTqTNbLOSfxd4trwLmT/zKGCjkdKpMz5awUdiSiDiIiILLs0X7zPM2Wt4FNvhO/H2cCxEksHj6FRzNibwIkHT168n6f70QwLhFklWqItdpDKIveLPPkOOeyIAr/7U7FzSpS64rpydzxWpU4rpR6DQ1OBMufPmw92gMvl/aOdgLMbgr0FfgM6F8E9ivURlwFDJv96UwSLHFwaD9k7Kxq0P7tXNpa5Gc7a7vW8cq0Cd+l5w63ppTsH3FbDwVWuJ96MuDUeDvNv4cD9VIYMUvseTLSJw+aw9pLW5jNY+7bewPCxM+62X7ZXCa0XFWDC42PWeVbzKoz7/DHUAJypwqr0+aC3VDSsDQ4qok3jeoL2hvfb5oXMBnljbitxNfA1X6LWJQ0Z69S4IAfebIhuW0ilqZfCtthblqB4u66oDR52qKrDTa/SJdeQT6SBiwKgBM4B9ulq5wYyR3+Vmt1OkyEbrI0qyZ4kIZ0aBbpUaH/qS2nubIpS2+wUawtvWbCrlEqqTehKm7a97Fe9uqh0erXLqoP0dGj0sEfOKlZZWskNMMKPysjgVZU3778lvVWS/tKoD+lmcAxs/8fE6tPcxEq1h4HaNlipWn28yXTv2r3tv2n0qvDQ88Af9MXN7NKb/nok9qBVdft6FlQ+LTt4ita7DFMamO42ffcD4xvqS3K/Zsut9fV13UH09Y4zXm9wT8R3Kd0NFUP3YFbfZ7g+mu3X9INP3o02tFjXHbl7qWeaufUatxsXuWrPdDd978ZN7W6idzZ8yxoYvCq2O7hBVNbnOChcPDQ9+tiDhGz8EQJzJ+Cx25GfGZwPD3jLJwngKwimHZ8hRJiZIpT5LFR42U6riSVZ2yIQb8922mk5WnZern75kjIH3PJYgade+0ulWmfUa3XxkMA1bvC/7pdpPOAF9TTzUV3TGVTHg6IiZszmHQxSJhB+nYEDR5zIBY6b0Wc2iUosEVZXMztyiSQTEI4Y1TEoCIRRIjNBiDgiBAIFmeLZKUZ6hQEsRuhiLJMIZ+K80WrYMWFfxbfwzLBvILTo5B1T7xEdPoXw+WpMD6HFhD5xKpprfjsPBj3T72QOt5hOcTpFGTIPLtyWXEbL1O+37easIRswgANiBgWFpcaEeXM6XwDDXYihqNMhLP0oDLUXoUAz6jC62Ms8yaZDft1tZbd8Ot3GGj1sYGEgsohoyHfNdbQbzsFNRyszgwPvFKMCI6MwgyHksX4HQ8suUmdM2VCgTQdjnbtpXboZD0RsMog1xG6amgY7FggEE/QnRyVnhC3w4H3eAApGA1Z3sdsPp5q+f92ftWB+Htnw52e3lCu2ULWn9B3g10T2PCxwxFEFjjnuhJMKFanXoFGTZq3eU+rOoawWlp0mbbr0GTIyoZkzSICfiGtZxrbwaIFsGlo6egZGJnSYX0jWB0vn8VSiSrUateo1aNSkWYtW7330yVdKbdp16NSle5mbgF0iYgkSJYXkDRbcFNgAAAAAAABwV1xVVVVVVW2lP0mSJEmSJEmSWtm2bdu2bdu27dYAAAAAAAAAAKAFSZIkSZIkSZJstneky4MViekyhFQmmazhfr4OOOjQHRMvhq6/rp+EVCaZrOGRda6jChxz3AknFSpaJvQ5skL2PAK6Foj/wQruee6nTeH1r2A+vKOisDgtFP7QRd2b7n8npYL1uvIECxMPeU64Ss9PGGxruLlTknozgfFnsggDtK0yu6H5ohdtJo2T+AcPP1ERxl5pllnAmQmKKQNsxyPtMR5pl92RckwdLSuwnR27CT1M2Zd3j6Zps4vS79YZHIgWpZeJdNPTUcA2qNVowNSt05Ud+bHPeMyWTmVrEU+LuhZGXJkpRugXNQZ0lmYE9c0CEDQ0/GMQXEDYl5krxtY7HYrwULCv9vckmCLMRDx//IOHHsZYMtY58cUVP/P/BhKT3RwhzCVYK8t22kAS6Sb5iIpsILedPBPpPtS3Rbahx7eZ2BzipQkGHF2su7JNaH7qDpx8aev/T57vAgqzj4xTN7cd5CuTHQZ8MwCdm/KAFRTcazPAxJrZOPXUN1aEAPj7gVmMzZiikzZI9qDV+EXtHuyrL3a0TaR45+hd9L/mlhSDMVt57qkrstQK62y0xYQpx3yu0mdtusZmeCMZ+aRN1ngnMCWz5cyiaIqMDuXwV9KHfuQgN/kpSkkqUpXG3rLmzkWjJcrElusf1x8AKyipauoYmvzxjxYEVbnb1f+82rVuXfLxvhbdUNvAE3lSdTopiv06CnrTl+zkIh9FKEEFqlCnsLSyLby8eOl7/JX9QI0rGtr6xiWJC08fBdMA9F9Z/o653jziCCP84TM/xv55n27V5PF+FhU++G3Nv+H79a9m8HXB5zng85vPK59/2Suf14Gavbwoy9rfBT0kpEVboKetDPRMoN9UeJ62p5nHkf+KnnqtVr1GzVq988EnfYcQmlgPfxInddQA4pJJ13l3+qpZOJrRjlH/s9hWjPIXHacZushEqVEuM3KJuassXDPWPXZuEbhjgodGu83Zc06ecvWSixe81PBQaYZW0zTzU2+6FlPM8t4cn3w231cLtVlAaZF2wbr9qM9P+i2l8t0yGuubCyuMWNtsiA+CxBAJwdIibSnO5jhEsUkTy0hEklBe6XJK9XMpfinN7hT2pnaghY6kddSvWfu93H7L1poiQJ7ciYyZsVFmnkCdQoQbQvvba5M881FkC4DnDD3nRBUFHP/g+o+9cg7u8tdgqiYraeHdHEgKlRIuO5k9KW0tXmYJGP8aY1UATouB1c2Cwmhd+lQLZ6yEpeus3TTeA+Pcx6fg5hVvtTxVmaxRgA5Buiz2TagBYQZFUIuOATFFg7D5sKF5kBwmNZZtcW2PJz3KpmLtiE9Wkqwk8suQm8qhNPaX5WDZCtL5I3vHMziW3slMFWVWxM+nUikPL6cK5YoFlIVwaXsC1D8BpBsC/sH0GwDzvwMMPRe0HwmAQNY8FsuTQiOfTjwJtoBcVwwhEZMZ4mJxWdhipVZarLeyGtriSlEwupE1Im6rJP3bhLjM1CQhR2i0QLFaKG/Rwh7W5nS426WEja5nKy3KlUZWiRKQSDhWT1CwQHESypSiKEmK/ZqU2MZXvRKbLCtLyfxKZVijdqrd8ayrIMGAyacLu0Ja9CtLTZMzbA9ScXkOYdiJWQxhLBrDAfoKGAADGLw+a9kX1aIWwZGN++L1qN3vSEHeHoLmKYuYHt5Li3ZhFoIapJQzE5amAAwAYfEzxgzQX64GrDyYwe8CcDF0vSqC0WCe/TJWIwfGoMWyFHLIgxgDerzM5WUY4WPEaJ4jnXEvZ7IPk4N8VjjyI5eCEl6F8AWPyyMXJXWmbU52yaVob6g7foU/UatJ1GYEqwR6/dbEJGXAQTINM4e+SILsGw0wwYs5dsnBOHo+CyBBrS/W+7JiNsmNbxO/4b8UlUBoEFgQvwOdy1e5BoicphuGUgXlUPjc4I3z4hpK5VX4ZPQyV6sNraYNm6uebPFuOS88VnmWK6FSdW6e6sBCZhp5KuuWrsuV8JoU0SsnvWZaubrWSUoBdut+lQI7ogq5wdXpHZxD7VMuAmc5fxNV/YD9gClLFYCHmE5IW79hiHgRAu5YAJvOkYdyWOv0IhWq30V2ISx1ua2OqJJFOh4pR6obVs5KUkg8RHoDUbG8dtVxTE+EYJtUJkxXHF9GbKHg7XAkP7Z2oiMPLdfV9eGFalAF+8iV88gYfM7BF3XJ2uEzVvY8BglnkR23pZiNNdkdDJ9B5wI2rFzBURPwVcZxQyeqMnoBqUvqHBcvcTmP/MBhH26IgYvuEbVoetkZeritFPMXh4ULNuBpc3FRLK48Uj7H9SOvApKEH67oZAtBrUQfKQX9PMNV66I8UJQ9wpQAUKe8AgJYoXKYzRUgNWCpWE7NxnnwHW90PUCFWu9ajNbhUy9kDiEJO5M5TCntj+O3TaFMsEuJycHF0xgiuiWPxG3RcGYMJVzyMTwSHavTy+O0NTRrtdmXYdAOIGUKnEHud9N0fDPyg8glIMDXCQN6rngeOpyYJ/IyxgGaL10uw4fuut1F5JbxAn3pSdgAbYA35pXrvXPGVNFmzlcbTwQLYsBKsLACsCbUc449uqMtHK/hVRXQAWowRHLq81CRR2zDJAfGRfQhmGQ4dmyTgAHbRXV7rHGaWTgHaN/vLIglpgHTVd2m9mW4wHcdxMr+S5WymAreEMI7Ehklm1Zq5nEBLMq+sxrqGlsNpIscRGfYOMjhaSds1EPqQOvKas+wU5YScQTa6IkQM9KjLPBOACS1N8oBEg714hVgFC6Hs8DPuNlQPbwB0RFFSEhG3xpJP+vr+itPmO7WRXdCVcseZAIdmWk3nV9pveKw6TngUKSGUdk1VWQFJAlR9mS5DDQlmxOhOD33akelOH1L2gydyHDiA6gYgepBqiZQOyOQthhtKv0s0r4XODWp36XtBy8trc6ERj0RzMUm/06X3Rua9E6eAbpUlws1QdHf6pQVPAKLxvUyEU4h7JH29h5ZDyzggO5iqOGk+n5U8IkjHBxbznAyMTPIarFRGiZhEgXa9GA8miNmW0B7x6MC8qjciJtyfauu0mgbSqNwSelEqQp9j3gCC0+gNoTIeS8vSnF/pkjA8IIBS/bw3CHPL5VxHAXKVJ9poFOqsddvIOmCcnVbKeY4UMu4P+qCN8dk59xkjRCmc2FurW51agrJyL22bbWST6FmyYIKYFlZgmfdHBIdNoi3a6fwu4X8zJcFRDCiOy7FmxHeoBe2l0IoIYtlTkXQEzjWimn1Oe2Fiz7InFn9YGVO4i4tXk15v8Jh2RsNZXAZLLBZ9PwPQNtC1GgoKM98BuYt17tUgFk5ts/nWoSIFn7OOTeiW3NY01qUhcJmHHmQ8DuSrAIVwmYYsqq6ki7ZpJCLEY0Wj05M7WBCt3nMJJ0UCyeoYRa9KYe6hpY2DuM2hhxnLWyAzLzd16+ww/LIkESd2CLIG7ynTCfd9G+jk94REYS7ttU3/WfGtUOHGK/NtqGui3+F/VawPr8EMMc3t6lyHdpN2GS8ciPOeiRsh2kE1EAZBox1iytjOelkjPJu2GFe4akOrDbdAZwY2DmDjA0TogPj67s0cUJ5uh6e44Gk4dDktss5waawNpO6vCqXPa9CrJPeKZcwLpNHNxlfNv2m6d2pjpR26rlw4LmtJm+UFOvUpZDxG1Bls1+Up0ASqbGw8DL6/l7CK/H60+1vXeTxYMFu1TAW1sVbMc8pRu/KyAgNqV7GC8Hc4qOBj45sQfWH97fymYgwQsXFvbJyVBq+VeTRwm44cJfjyYa8Bme0bI1WfPGKjgdtxsVTmAZzKw4TTBbtWEoMmzGqhO1q59XHBmS6qKVpEpNXiTF5Z24Y/FTBbtpS2NGxIWMCvCMLJB7scqEdHxvSHE2YdBbaKIAYet/IfA1p1RZrpQJVLC5fzCzPUItUBp7O6axdQlXPU7TdRkE4mZbgDMTxHC/KrklYo6DKd/LsFm18KpiwxbaI4GpjuGTtQB7H8ESsdYHah7prtaAWYc+3Qncfuuvl4GDcUbcjV2Z/AsdLqfVFdx0uYv3jDGMGNUUeA07uch2qOVBkSa9+P2nOsCBfe1I3qFTOo2sRhx2AJm79IfLwcXW/GyKaVNqOb89s5JGBGNLExplgVUGtJ5rhu8YjWNnKNl1phjuxgSwhFly9H94SHboO29uqmFkfWHWNnCFSugwAhZABMZHwTh1zem3gEiEyDZDKWDJqSAFUkXpipO2Ttj/xbqXK3uIIR8LeczD5JhX0l5i/wRxsecSUwH27RGIWGr3axsoOqaYY6a2cPLwKBpauKrwr2EJQohZEhgcoEM5jmIblzlkjNwE8h26y3p82dcAkm/4kcEDhBO9dmxfXbYxE7aGG1b+5TNc2CT1Zj1ewfsSKRzzb+2ZmNUtFIHYcmLUphUBnvgasIuWExitlr94XmSNVV6IXy7EgATd0MVHVUhQb1r2rYMGX9zA1eJK4snZ8/2VJZDhGwHDt3KPHG60frUe+ULyOu10RUJxNu8ZIEymO+G/LxucpzaJc8k9C2oezVLQus0g9ISkl0TBiMDbgCs9Y585CY3Tj/yjpKz9dMUsq8QF8vtTB7QTriSpZZZNSnRafrF5WFV6UTNm2rVj1FYH0UFQVPXmcIZn0mq4Quq2K9TuxR3W0f1N/hUqGyEAgg7pyuuDmkSMI8sy2+AR1yfQo3rfKNnnw5YO2yVEPVLm7q6+lfk8XeFahnpTzI4/FN+zLq4qgb44q6EJu70rH+5NP8XAOg70gouen++Ytx375Gveym//mf9/MyFm6tHvJYvgjnEYxM77PoeXdDeJpKKbG7QGDRJuC0xhG4zJxr+hA1Ji9+fCGyp6yix2j1vnOLhBpOU7l8TJV6VhkdxQzhrEiiuWp8ldn5jVKM4o0psKAkQnlLfCV5lUO13d9af/AWaA1GApynB/knyws1Go0hdrCkyCHbd4ecD/T6ZWP+CsXq1zaDsHS+7tD/Kn7KR5K6WgxZg6XBDMXtxgdSh9bc3+CGxq6uLJLCOSW41SF//k+88rrx17yK1eVBUcUge3OTZY6AW0WNFrXjq0e2wTvbSr8ZUiDYTucmyEfjMY2i010YRrJYfY/0rD7HJY2Y8fufy9jQM56F6V5q5NHPVgEkuAEo6vSljYanbkNpowlZaXaRT1Gn6469q27W8Ai+YWI5cL81l3F/olur2zEV9mvAsfY7j3F7okun3wkWLlU5db38mdONQVmrbzwZJCd4Wo3Zi4uWbv8yWXKILJR9f9rUDOCmNDDqBmbBZ/4dlMvC8gYIkx2UoMEOUgxdjKoQZIYpDrJMEGGSdZOFhkCOxgyTP6x258oQtRoYVRj9azGS8cvHS5F40oUIyo0+NlfPJXQOPS+xJPjy8ZF53eSIfCkQuVnC74lLcaookHg97eVZsdxGFRkULnSVt6ba+B7axBlzoGvzc5Jv0wOEsQgeTlH4nEpjknzdJGPCklG5Mh+eAJiibWf5mUwg+b/YAsLaZ/OS48QkiEwYr6WaKTalmx6lhnDLSwgZfAAPshqxFHHcsZtHuP2ch2KF7MG8VwWKxfnENdPL46GmPLWf89YxuG5YBmDN7F6yQCKcA4dVLH5RCOLVUz0s3IRuPDQARUpYAXA5f9BUKT4v9NzqxZmzD9hu+6WxXHj9tWU+8EKtn5z0P1Mh1c+4qsMqwoSf8A1cS9GfVWDqvwie4Mpc0lwdGBzh73RmLG4ZGRwa2//UmwmVxPTPcMttcas0mZlwV5CcrC17PmN8WoM71re+l7JsDL8iAwRfYfdLtpkcpnch8FUVhlgOuJ/+fAF+6zei/+r5+iCHkO6dMoW08yqwMrLHMqEQmtWZbxG3yaYOhXOhVb8schLqdPyeWsSFb2mmBBeh1cX5ynEeeb0mjhQwqaVUMTJAdtV78mbRkRsttI5OQV6ZzXiRTEV7DDmG3K0bp2jqjpY9jQZJokwOeEzdy/PLitsl+V4NUZzxduQOE8hKUwzpAdqFcCNIcNk3mXMh2FeDMPNGGbBL+eRIdDO2lrEuXZxm30ZNUCQA9Ti1ppQVVVNqHVxCoiX87Iq44qlJpDD4L39F9vHOjlYUf2HDvFnBX1eFDM3fJTP/9hR58HJqoHLHfW9OKu3/6ySOJfaVwekDBGmzLo7gb1MLwYtefUzDvkZZ385gtIx79wJ6Myq2qFDFA24D2fMrf/t/ZgkJn7TflPDEzrZUUvf75p3Yy55S/qJQEerwUqTjjUbp3ZmC1axBhBnvSLuZacrt7C8T5+PBd6zaneSzJySWbEstk2pkTuCMWpeUk1q4jZucm/OTLbAinh+9Z2dN/nt8WI00eSVJPvoBWToLE/mRvYdN8aBv0fLouKNGWarK+pydSeLa4X//F1pIudyf6jIf1d+E5W25blbX4OSzfQkyc0pme3L2O3ybCGDqSTb+aaUNi0rS3jjqz+y7dv92ffZaxpzvkx18NvjggtnM+WoPVv5d1q8bVImNyULnVnzS90VRfEW+Kffl/+X/tQFIkil+PsKiHxWjLXODXJZusJ051CQbCJYg+S/3kC5T/QNhvx8et6ZSOk11bOMWxVGk6lam97ldGT0VGn9uVJjssiVE3SU0TKjRLh/OZYDDpvfqs/ucWr4ZTpjULBQ5GAtOOizTtd80O2iEla3YUap31WdR+lXfOCZTm84cKeABQhrrNZm9Dic6V3VWpOpwniLISAbCWKA7CEHgVxa2cRvlSZprsyYLOwKSKEIOBOzWThhPofxF+ah/YgKhlTIe9ZytJ9F9KPl1moUgWAEzXls0UQQTWTp5l8rTFLVC6rxQ2zCW1zuE3+DITOnOV9FplxTzSj0qCezri6trstRqO1uMVhVTv6SuOBCmI8Wawwx6Vz7pCzVLBO5M+aV+suK+DT0szXw46AUQNZavTCtrQBKpbxyXXq8/bhCYUoRuLLml/jL3X/7hWfudU9n7viAfMmlOLu1uk5noaY7ZAAOZZn15JoPRqxXLQdOuRBxrs1ua4s8X20y0jXajDZ7Fje4wSVUm6pM518JkgMEa4Dc1d3TPQjLjRJhYbrLUWqe8kQFGU5nmaDKOmLcZbv+oDX68NTUa9d3VjHhmBiY2dwbSzBGIn+rMJhMtZrMJlrN9e5181WmxbRfGXZC6MuA2I0o4gJqJtDXBwaLSjBri7U6RWZMFNqUdoePlpkSRFaV3e0D/QxrkOwhB1jEABkfY6/M1uUUpCT4TfNshLOXMsvEyTIWOs1/K5kGe+yPCGCBuNDgxem/FnCv4TCGQMKEvS/ytaZZQ+RGKkx+mNpINoPl43VxYcUco783uigP+eDAxl/ZGye2vBmztqa39m8q9k9O/Mex1KdA9/8bZX3p06dpNPMz3XV8Xy9xupLmHMVoXHGXDt8P4jDvy7qIc29PL8MwdfyVLz6SX7t0JYZG8I03vnkY8TrRd1JJU8eF4pdCNoEf2QJH0Hf77vqvpz8jifyyev9eFjZHuBwGW0Q8aqxG0j+R6MvJ0RdoPmES5QZ9li1F5KPnkYMsYpCMML6Rnk07rX+ajJ1W05k75TlkXJB8GPQVTrs1S9uXPv2lT7kws6QHCs6bm66XON0SYMHam3XZ3Q4Nv1xnKhZmnsEuR0W3GSNqVdMPpKlY3Jsz+KR09pKeceESMMiQcH5zOKIeBHT07BupsyMyTbBpni3X8CfZBG4o5KX40IER8f/RJxrsiDhrUBDnbCpHr+iNafJUOiDKljmJ2yfqLVc87587zc1sFsbOyipHjTEmbbqlxQlQNseZnOjS3DaiahhRocZ2coAgGsn2IUyFwGpsaDrrfAa2I2r5Zxhz7NzRAXC7WZP6LEW7jvP0sZnafBf9z+lX006ljGgiA6ezg1qm7+BvZL3nbMYdvjAZcyF6raNlPXvigORbz7Xi3w/+83clScuObrCcwd47B77LsCP929bXllWhiKF+9TLqiRU11QjaZVq7gry1rquEUURWVVu6/hyGnevbsFrBw9N3FFy7ARtlnebxxDdPVufU4Ihh1Z6VcU+v7K3CEEHOsge2bc73+zHJO8w7E986Bbrcrt7ftyOGrzoGkyRnUfSbmLk/RnFXxH5/Y6QSBA3jG5pfxtvIuYgQRgSICnE0BF+iutioWAQLEfChTFNLBs6PZl73fnizEFO4HDazrtCY54ZO23df/JPgojQqTvLA8uLmF768NqQzV8rUnhzzwqqWNDBmLGcWmwNsbG5w2P8PdssQHwRbYEymO1lxKrIZ8UKQF+lTMK1IUVVJEQmLYZjFxJQFp2JM/2ut+adsKKXqrUlVYWFSBvjzMCyEiz0iHqSAPSUiEYwgJR4RlwkjnmIRmM3mmCyGdW+3r039e846Z2BuCtc0kqgc0yYSBWnFpyYOJr4fB73GvDTybcrHo5PW9daWdJGoOCU7gdrBA6u2QX6kjvbNGQ6adre4EpbbyurVN+k6xA8hVqQ2YsrEvLFzTdYos/qjT2yE1FxqUAwV+xXDpUaz1ELEnXIzR+wvDD5uQ1MRtYgVtG2D79CZ77tapaOBkG5HT6BgPszrT37AQDJpdlnV/o+zfxcuTWZEoYm0aMXRE5uu7MxqYHo+umwjpHSZQS72psrN1Ienuh+OZr0w3STRxhQtL+d2Jj9gvPHi59R3jKyHv5ftl8oAzepL9cpuR6Gyq1Sn1/q0sTGvDkI0EzJB611e/CCGr8a9kB5WQUw1LJ+Nj2H4GB54ie3TfT8KeZiQB+qEaYhJw29/Jnme59QGbeXa5PtddGlLrKVgL4PvwoeSzVAak6mGTNFXED/SifhgW6f5McGQ9NYmLDkOqZnMNOgj7WJ8F1i6DfYjLXleM+a3mHYPB7xziArnBqjDqht4Y+P2Bu5O/6uvQHmTAsrhMiMtKIQEnX+2olYIMqNbex+uuVGbt6b6Wec+bkGsgMcaS4VKWsHbdUWphtVMiMba48c6Cy7DsB5dOMF1cfZhlmhbVoqdsF/o+c/fcPJ6B18XqLQYxf/zpi6EaSbTDA+9vrJD93N6N6SK37/lJtApBnkRVXah+r+Ghqf6bHw/Co4Pd7KYUwTR94KGijhifBzH1+JURKTiCTYDqi74/AYe/WPNjb/KuI5+VeCGGI7d82URFL4OLDFqhJEGeFn/PvipDqA8L+jX9zMVfLCY/vkWU2pZjSovtTou58NwI+iuO29hSYyPG6ZNe6BaJrMO2lK85V4JMWvv9SQPaUDgRgQ81y87HvNNUr7k7uoT6xbUZP65OClPsmDN8cZ8hb+AM3OOxawfy4986viiBc+VBq3KbnoKI58t/bZDo8jgYmMYNsYSlFT66kAtwwpTE0XkmoxGv+74zQbUgiAWtOHme2G69EZyTdEEFWIR1Q41sauyc2/9Mu+2zvLLL0k9Z1VN5VaAHQweYF3WeVABBAtQj7bnHeRfxXdUGEcm+n6GOFGsJqwld1HrRVI3ivVeXY84VY/ieSpIIJtHfmZyIlkBsIshQ9RmA8KHYT5i2E4OEkP2emVW5axc2lJwbyyWCGtWdYPKVvAZFSIcbpEqTZKUzjP9o3RzAgsBgqkJiHDYl/N2GAjrUj96+/2Nmj7Kyy55w4QKYEiA+pwE3Um7ZZ07EaZCUHytr+c3qzLKjLqsYEOqdUtgo5hHdWOICrH6VuU79SbaYSxYBWoZyP5FcOV79xR7uB2YBUHN2AtejynC/G6tvhat/bnflWE/2lT/93qvL814DuXzg7fCT/KyKlpUhZGY5Nynnc8fUngft6Xe+LIf+sNvi3z5BhXCR+j1hyIoy90mT3ieyLvTvGPtr0vNlQ0Zd0Krw78tpT/7CrdgmBn/D39k1oR/+XSpXO8a+vXS3ibD4DjDTY2/lCtypj6qOM3FN4riz4jFCKLC6Nz4arfiUXTMI2404s1dHdUwyhLxZyina5uVjOKcyQXBt8wcfymVG++qLeTVFbpAcAU1TlE7PzWv/Zh6IWjPH+/sOLArWKO+72nRh5aEGq4SL7/7HfUcC3+OorbhrG3jYKRtA46ALXdgHpPJhW8gLM6EkC9GqUkqsL1i+7dxFKyweoNin2LHPs9mv8gRNPCgA4Fz3VNPZsH94WXufeV1Gi8QOQ+bNb3lRfs6w6OwZDFgBnj3LV3TDyetb3hq2JttIA6zW9mOTd601a5588T7pCkTBj1bM9rx/tPZBH7oEbiepZy+SkBooj5lbBKJkH9hdGMi+HlRW12yuaV4XfG6FnNyXZtr6+ZXEeSdFcDaeGKza0trvYSuaKYl9a3pla44DPjGb0wVDQRVf2Lh2s7rnDXYJVWQt9n/CfR5D15645zvJtmref9OxTziNmYmJdmKuTHRp6/x3El2owQI7Dtv8QUzHQJh5YyAf6uKywtxuU087iCXGwY8e+dPfP5PDgEWeSGXfrH2+pydhcb7x1nOaF4TzYtyEOwNiP5ckXnnkJqiih/ewoirBdTF6KnPFY5nDvEpf/QtlLhewL4I5A77v9CN3BLGjQdxpMKtubR/6h3dyFxB3AtBDGk3pvwp3kBN4vgkRW0P220f91Ps0S42+3aO94dV9zyt+qYlof4b816y6aY8LuK9ErA1mc9l/gff5MczIcg4ZkGeA0p80QYKHKjYAXbAMdwUPPnbuq3SXfcScb0/tMQQKqMjVXX7Ka0cUkXSZYZnM9R/nXgJ2Bs8YLAVjSIms4KM9D7z7ZzknOpfbjewlLSQ3f5eCYvxJxjvSj9d2a9hOw0pE9JDOLE68nyY3iCdB6SCqX8tachkPiKJjzjv2unoGG6xLSkps5H7CIDWV7jYMPX2OvOfovWHtkBKzkU2+RFwu/gfwXtycBu1dr01ljw3OGf1OsV+jR37Apt6ERipWV1bma7LJH72S+YHHjY8HxAFVn/76CoPdezoNpjzIxodjy+4urKbYVZzIhmOrOiCp470RiXcFCT8A0wU6km5JN127tvb5/kvjd8JUDPdbXxd+fXU8qO72HXZSZLkOn3U4dNnla/TB4QL3TDACs75nse7sd8vLY3XDFnGfgOcgzxqnCLHKWqcRAo8Sy9g2uOb3iFVFB0Cb3/u7vfPBxPN3u8o4GbtxQrvAdyF7/DuwHeDjwG+1Yvghbc/zqZ2NQkaeNgAEUY09O+ed7VpdL1/aYs5rghEpEesrYkztxQvXd8/eHXebkDeHGRD8LDJq8ieHKph+J4oXrZvddM1qvIS9ooYEt0pyqNHKkL104nr5YvC6F1VvnVVe5NvmtgDbGpippkvY2kYKsKhFxmA82bWrhoOvcjXt/8tBHlrytu3iGbU7KroADOat1719Q+bpZ5d5Z0Vnbs8HT/D3v5XPwPfNS9NFQ2EVJewNbWddZ1h7JIq5EaMOz9QK7cybYabjE3vDxNbjckJife2EsPfL2fcNDBt5VZwy3lnBCS3SKRb3mvOA7xQMz33hQLjvSIGzU1jHIycui5/7r487tabo3gsL0/6x6boxfjLirh5F0u5BOTD+6dkUbvZ2o2IMR/f94ZNiPApafiRtefW92KsHbtJj4uYt8ZmyfnxzMcwwueadx1wszioQYGZ7rrdOIHPH7PVc19d63/1toCbhV8kSiqXQNITghv+3UD11wFOdisZjDJyAb3lJ1yT3P3tL6MshSqOCJ71YQvugfCK8A6tT5yuD1XQI3lFd0Rr5gcXrSemfYElllX5pt9RsE+1/6aemVtu0WorLDG5+pv7I78bJrbeS0y49ywx/B5wy30s+Tu5EK3CcCem4NO/gqLZqBBBBKgOSUURNQL20udX/mcb+01/8vyq/2zbL4BL1oty/Y+Di5Nte3j/WFLsrbkNjwNLkm0v8/62AEIv6pPo5SIRHMFHlke+AdLrIFYb+5UA/c7nMh/DwD737nIPmvy9jIfSOGZBpUKzMVEGShcN0/ew9a9uYSo5f5LUx7Gxn/Gw4TugOb5AQECrHJ0FX8r9zGch5SxigR3MurX0WzYgHUnzfytaZmU85lHJa7luelE4NT+UGL3BW6Ys1ud/7XoU2+syVgstZJm/JhLOZdmW+1lhfpqh4p5kFkY5LGIBT/D4hNR1TfT7rWM+87zE5ii3cwFy95mW+jxLNsTUcuWzYGbz5FPuLwsW8mfKWcQCO6SZE3k9zLM3s2lsozF3dAo1Vzkr4n8h9BLprUBDjS/F0sv5tzM2ynKav3UBZT/oUF6i+qWx5LteZT4llFfiVeVbk2l5ud8KWMhs7vZ/+TDutWMRLOAJHp+ReuO86Jmb9K14PCI8bEcV53MUM99LBGKhTTGLTKaNZQ4tzGU+9/kM+pgHJZSn4s2CW3GJy1+lwnxmUEKxybTL79fBQn9qzHGvxiJYwGNe6mA8QDyEHdE+nzMS5nGX7dFhn0fGXZR7MXncQzwJC+yQTvkc6cynfEIsQ3/6JAgTuI1CbqfIUnR2Itp+u5CSacJY0bJ74jEeE+qKjxuFF0uqZMq9j59WoBz9XyZhkyT0GnmLHY/bhEJup4hbuHlMqulsLwaE+sleG6O15yf1XyYrExjPHRSaSG98Jh7zmWfiet1aU15cPt2Wrk+3pyKl6t1I/D9+qNzXCUkjm19SDnIu7TER10v78vKm+kCzN8S25aXe5hJlOc2spEube7apqdy7C//KA/lUBzYDxF7o1SphNaCEwkqs3Ps4qWnWK56GyyQU3MYNjPQ7OWOsxu1QxC3c3NbKe1RkF25pTFNubKSPxvTR1acJP5pJfia3pWJulywTZTUkIsYIE5joM+qJ8TYlFKbizYJbcQmu/+xfxpR/pNUyowYoae1q37oRxWQZSm4liYVM4DbGcjtF3MRkplqaMlvRDgSM5zqLUo6PN5tCL7YuRhG3QpGlyuKj62YChZX4P9n5uP+qmdWh8/+Dj/be7v3u/EcpTvj4PUxGrdc97L3Z1LVFh/nmS7llqbPi10osy7Z/G7GzZxpqzzM91znCNqmXRIUMlWmdHX8eXAgupjxTGZSTBk7vIXcQ9Xh4FpMcg/BSzixeCspG/zpjtz8jqqYz5a1kcyyWgBLX0jwOeTb7j82NFv9QAUpbqEGMDot7NZPdLN7di+QCVboBqgxooyzJnqSyY/X/rkGqnI3dVRXhqfVGV5caP9YmnMNeQqylSSoUA+5748OwoTZqfPsMAmnpUryx5eh+qKO1MMyC2ZzQHI+hGbJ1raJHxKHSULWlAmLoX2fs2mcEEO2t9qeKmrG1JG2Jb2wVbSzfSLllJ4T/SlZTRZ1Xkx1SO0vcZwm0Fo+ttReCbB8cdNjwygbKxW2JLqrfoeIbDh8sbiHXYqm0TEv1hIL+RbGwCShNBbwV56nLOKOM03O21KGSmMwCsIsgBSSD2YA0FaBSfgEUe/BTSQ6gLUUlINuFy6A86dIXtDukRlqkQEpnsceZu9FXArLte9uN2q6Qa3EoxpBOxTAgyDvkuEQ9vp20UwLFtSAFUjqLj64vUF67w3g896/3ydBS/g0OhYVIi3qRYtni5Fn9TgWgR7ckijXA6qg7iva9ZDf5kmi17TOLlC/1yjVRZUTxbl+SKy17YHa5RFvC0WwMWnpe6mQpOKUWctJWC0f807eTRdyw9JSp7QugabtbayDaDk2h0QTqUhhfuzUFMlVDN3ckk9FkadLukDZ4pD8dkhhDSr2Yo1O+QLQk+NZHEYkxkJbUeCFut3GoY9z0fkt6uKMWHFC35y0o12xDe7n0igTn3LVRA+Rttwvt0QcUPjiIT5PLJiETWKFLqt9h6naak9FzN7mTm22nQ52aYxF8tPHTcBpuAGrt6BcH1VGCD23sFlWUvV0yUAFItRMWQwO8WFq3RBH0TWR8qIHChSe2n7/hLYvy0z1OyANOg/ExwMKI8c7sA2CTv+nnIe9An2QRmHVWMLI7w/xsLgSkdx5Xfd6EmAy1/7EU9SWAl0PPVQDwftmzj5bb/zSO3lGAJgIAgX/6aTQurLhM+kLyNaIPzeQ5V+IvcMyO/O1C1IWfCOLdpk7+q7A9cs/8lViVG7u1B8buLU7EyX+FbrNh6lxUH9YbhLgSlnjzcBTFtTXAu2AgDUtCtWGGgtyFq2B7ZdzZXhgQJ7cdToRaFay89fleUQTG/IJ7l9rNL9Ru30Pbf73J+Z+Jws6cltzVT3njqnaYM62hkHPduRt33lOSUanGsP+iJnKGWLy9W+UrOQUF9FXOOM+ALkyNXTwn1hB7JDk2k+75n8U5V2oFJFaHE/DocK86+JK3e9DkZrbgdj3rAee8NAWEkut+ksN1EQfylvJeXZCyeoXqr73Jw7doKmc9e+0FDGUWb3Ni+tFs8/U+l7UbV3PQ42Phxq0wh80zFyx/ZCz429e5ch57oxnrw1kWv7z04zVJOlNNY8fDFDyOPPmu4jGgg57ygDeJzidI1ebX+HsAmY4UQrvlCijXiSmj/Z4r0uPRE2p45E/SFObUxbXSeSq+0905I6GTUIZy/l6/1C3DH2ZlaAnT+CU3lMj5vkvfrsCSINCHrUZJwoFmLdEw5NwpvtOZRzzk3hm5x9+ZMMhkZ8o8z+10fGcOa6U7M1xl72zAV8jORgRcdzKmRxBHAJlDRDw7h5tijwc4liLJeskCiOL+E8URihBVHyN2rf6gaqRbdpMki22SjCp6Y/98820lkhYLTiQLtrtPlW4Kt7nphNIqaqqtT+eq3404iVylSBPDzRILBJcsfFns0oAaPmtpRb7ZFMn4vLjy5c7ztN+pFltisfmrsjBcqsagJtZ7m7bZYn5m/lwpUm17wmJb8+TOgze+0BWMsiiohnS2TREvinAyZ9vURS1lg/3zOXbUjBEXzd9kA1fC8VEDK0zB0hAlOtMs1NzlbpI7apqI/FSyDdn68CdGHwZseBRBCmnkIINcZFEH9hWFujDeMC0OoD4awIQgNAoJDQuPxTEiMip2sXGKKz5uvPgJOBlIkChxCSWaVFKSkkvhnDRZ8hSGcis1VWoupXEtnVsZZf5skkiO+xzecU/H42eU3EMWVrY8y2WXJ1+BQg5OLm5F35N5Rx9/Pv8XElSiVJnyfKtQ2YfWpm6dGrXq1GvIr0ZNQpq1aM2/Nu06dOrSrUevPv0GmtKgsCHDTWtRP+UmKxs7BycXdzpZ/crLl4VfQFBIWERUrP3iEtkaoZOUki5Xhl5PoTHY7Dg8gUiSlZP36cu3H6D8BkEIRhRwKFbgtLKKqlrnXdDQ1NLW0c3hqn5O1w2NcikzMTUzV+5O7wtxtx/dc98DD1V45LEnnrbUM8+98NIrr71RqUq1mn7zq069hsI0atKsRau33hXuvQ999DGNTz774itlEdq069CpS7eeor7p1ec7lX4DBg1R0xguboQWcCn3oDTdMC07FbL5DXZcLwciA/k0tAmMnoGRiZmFlY2dA3FycfPw8vELCAoJi4iKiUtISknLyMrJKygqKauoqqlraGqpqWtoamnr6OrpGxgaGZuYmplbWFpZ29ja2Ts4Ojm7uEISmUAUiFKhJnkUUSp09FdsPR9OMXpJscuGmv0fuMVE+bccaDCztV8wAC8rw4D0VkKbewp+zLcRy7HxZ/OF/z1Rc7INwYElvx2B0skUgeb/HUp1RmzSGDTgTQAyPhjNBC2ISWhlimJ6eQ2RKlguh1Yb9DKroQVapuOaRyQn90JpzZzQkbpWrgNYLn4rokNHIuXE+/mbroTeSbkdu+zydTtZ9frQMyoFoajpo5G10AOl99LPF3qBbgnK9VtPs2qgIcNQyxhpqNTM981QMChGx8u5YkKfUKPBuHngOC2JgUselsD9/GOVdctRYdIXvWVesqU5bicae07BYr2Yil5oWxia/xQjTNKJMj22seKw3MS30NeUUtrjLeOji8YGc9CBc558M41RGrdzROUDFu/TKnm5Hhcalul5KecxQ6SUffY6NksJPVi27VPixsZbVj5gZabpKNuVWQ5jdQ7UsDKypbIv4H4yupKw8gilwiyw6ctauQ30981shE5/OjqW0aqHUcBOfpcqI58+P2FXLUNPOxfxb/dxOjd/Yd/G+rL7kH+bSoATBRoIUR7BAREG4NGQRlDik9ejPEROg9A2ZeCdA2U+QZgKlK0NxIjw7cZ0IEw4ZQ6E8slToEZKNec1dmaMCSpGhFZPlQ8qR46ytNGwgrvT+59HDTP6JNDvUUVzhAcd6ZKuuK7ffDQUSo2a43zyZP7mE8r/dbdRBmskBVpvxW1joQjKqCJvZHD8D4/kN6jAb77PTSNwkAQpSiij5q9rCmLUkQ/DLR8Wn3IGRozw1D3HqKM5vIMX5KGMEDniU0zwUTr1fPRRRYi4oW4CBAkKEDvdVzPvyckmhFnsQmumbWiewwhJIAuJK7uCKFIYFA6vEAfGQ2JnHDpB8xRfkCBBP4iH/8F/yH+59zNk4Of3+ODyv2+K/OivhkZtmVa+I5L8baKn838nUrXPkcDUJU/iztViTrlT2lt/snQP3yJDbXGFG/kU3CHkPUXVWXw2aNn8V47lmFR7Ox651KEMc1L2xhH/1xBaRgNkr2QQeWZHPr99f/+Cax+FcHlnVq4JMmgJ3FtWkA65tjxLSl46t7PCSKDYyzEwdsSzxmyixINRuPSZ+xARtfhJcPALmHSiTJMmKKPiHD7GdD5plfyvJuxlY1teSMLzb4WaITlWdIB8yrQg0FJXCIKCnDpFqJEI5UU6SyFFmgQZNAljRRsJdZClUuLFhoWZRD0ECXWo5UXIKGFx1cKCOGnyvK2Fk0A/BqegLJWigjET//sz0iD9fwmZ5PfnlYwhCW8AAAA=); } @font-face { font-family: Nunito; - src: url(data:font/woff2;base64,d09GMgABAAAAAAIsAA4AAAAABLQAAAHXAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cLgZgP1NUQVREAAQRCAoAKgsEAAE2AiQDBAQgBYQkByAb5wPILgacMo33iNXw4rQ+nvxRQyQajY97hEpO8P1+7PfcdxGVaJKIKtmThcIQKqFYJCQypZO+JO2e/tu0qRygmchjGCYuED6gcn65sG8dyxhwDcTreH0G11fptDPt5S7w3wKNOLEs4YAH+gNN/Aef2Dge6GM0H+TWMFnXRIyHyPjw0TxRoFa/PLaydngJERnKEgRqTajzw/N074QN8V2QC3HA8jinpfglSLpPt8B2TRun8hmlSI45/JX/pfj5H3kxJoaxB4gvKYb5hVAtoZ0P43y3lzoxXP/NZiG0CyiEFCMAgYCoiF8AhChLTSBAIpYVFCieB7aWTjUt/64uih/woes7fJ67WFaVy3kiNwOVEgh+SQcAqsYYFRPxSxdDOBZ0IyAAQBaoc68QuQYv/o0MM/5l0uhNFlZ8tTPLCr0eRaUpzUpQbzRg0E5YQWuvNCKGI8jxxnVE8ckgOfaQNzbDhxsKg0ZHjkkuA0FrP4jw5pC6DYN9TSF4d5GL62kaauu2O3PsxLF1nWZ4vq+RbG/EbZinz7eX0NYvQe91tXX0cZd0Cm78/lMCMik+EG5OIjokeLgyHSFbnqmWFo2B6KR3TR+Qo0WDkMamUCEX8bS4j3KFn0Llq34AAA==); + src: url(data:font/woff2;base64,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); } diff --git a/packages/excalidraw/tests/search.test.tsx b/packages/excalidraw/tests/search.test.tsx index ae729b210..68ad65826 100644 --- a/packages/excalidraw/tests/search.test.tsx +++ b/packages/excalidraw/tests/search.test.tsx @@ -1,7 +1,7 @@ import React from "react"; import { act, render, waitFor } from "./test-utils"; import { Excalidraw } from "../index"; -import { CLASSES, SEARCH_SIDEBAR } from "../constants"; +import { CANVAS_SEARCH_TAB, CLASSES, DEFAULT_SIDEBAR } from "../constants"; import { Keyboard } from "./helpers/ui"; import { KEYS } from "../keys"; import { updateTextEditor } from "./queries/dom"; @@ -34,7 +34,8 @@ describe("search", () => { Keyboard.keyPress(KEYS.F); }); expect(h.app.state.openSidebar).not.toBeNull(); - expect(h.app.state.openSidebar?.name).toBe(SEARCH_SIDEBAR.name); + expect(h.app.state.openSidebar?.name).toBe(DEFAULT_SIDEBAR.name); + expect(h.app.state.openSidebar?.tab).toBe(CANVAS_SEARCH_TAB); const searchInput = await querySearchInput(); expect(searchInput.matches(":focus")).toBe(true); @@ -78,7 +79,8 @@ describe("search", () => { Keyboard.keyPress(KEYS.F); }); expect(h.app.state.openSidebar).not.toBeNull(); - expect(h.app.state.openSidebar?.name).toBe(SEARCH_SIDEBAR.name); + expect(h.app.state.openSidebar?.name).toBe(DEFAULT_SIDEBAR.name); + expect(h.app.state.openSidebar?.tab).toBe(CANVAS_SEARCH_TAB); const searchInput = await querySearchInput(); @@ -122,7 +124,8 @@ describe("search", () => { Keyboard.keyPress(KEYS.F); }); expect(h.app.state.openSidebar).not.toBeNull(); - expect(h.app.state.openSidebar?.name).toBe(SEARCH_SIDEBAR.name); + expect(h.app.state.openSidebar?.name).toBe(DEFAULT_SIDEBAR.name); + expect(h.app.state.openSidebar?.tab).toBe(CANVAS_SEARCH_TAB); const searchInput = await querySearchInput(); diff --git a/packages/excalidraw/types.ts b/packages/excalidraw/types.ts index 642ff0e73..c4ebd994e 100644 --- a/packages/excalidraw/types.ts +++ b/packages/excalidraw/types.ts @@ -851,3 +851,10 @@ export type GenerateDiagramToCode = (props: { frame: ExcalidrawMagicFrameElement; children: readonly ExcalidrawElement[]; }) => MaybePromise<{ html: string }>; + +export type Offsets = Partial<{ + top: number; + right: number; + bottom: number; + left: number; +}>; diff --git a/packages/excalidraw/visualdebug.ts b/packages/excalidraw/visualdebug.ts index 7181719f7..86f4d39a8 100644 --- a/packages/excalidraw/visualdebug.ts +++ b/packages/excalidraw/visualdebug.ts @@ -110,8 +110,8 @@ export const debugDrawBoundingBox = ( export const debugDrawBounds = ( box: Bounds | Bounds[], opts?: { - color: string; - permanent: boolean; + color?: string; + permanent?: boolean; }, ) => { (isBounds(box) ? [box] : box).forEach((bbox) => @@ -136,7 +136,7 @@ export const debugDrawBounds = ( ], { color: opts?.color ?? "green", - permanent: opts?.permanent, + permanent: !!opts?.permanent, }, ), ); diff --git a/packages/math/utils.ts b/packages/math/utils.ts index f4d90704f..bbdf61d8d 100644 --- a/packages/math/utils.ts +++ b/packages/math/utils.ts @@ -1,14 +1,27 @@ export const PRECISION = 10e-5; -export function clamp(value: number, min: number, max: number) { +export const clamp = (value: number, min: number, max: number) => { return Math.min(Math.max(value, min), max); -} +}; -export function round(value: number, precision: number) { +export const round = ( + value: number, + precision: number, + func: "round" | "floor" | "ceil" = "round", +) => { const multiplier = Math.pow(10, precision); - return Math.round((value + Number.EPSILON) * multiplier) / multiplier; -} + return Math[func]((value + Number.EPSILON) * multiplier) / multiplier; +}; + +export const roundToStep = ( + value: number, + step: number, + func: "round" | "floor" | "ceil" = "round", +): number => { + const factor = 1 / step; + return Math[func](value * factor) / factor; +}; export const average = (a: number, b: number) => (a + b) / 2; diff --git a/packages/utils/package.json b/packages/utils/package.json index 0e8650152..b739eddc7 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -68,7 +68,6 @@ "css-loader": "6.7.1", "file-loader": "6.2.0", "fonteditor-core": "2.4.0", - "node-fetch": "3.3.2", "sass-loader": "13.0.2", "ts-loader": "9.3.1", "typescript": "4.9.4", diff --git a/scripts/buildPackage.js b/scripts/buildPackage.js index 442afaf20..a1699e3d6 100644 --- a/scripts/buildPackage.js +++ b/scripts/buildPackage.js @@ -1,7 +1,6 @@ const { build } = require("esbuild"); const { sassPlugin } = require("esbuild-sass-plugin"); const { externalGlobalPlugin } = require("esbuild-plugin-external-global"); -const { woff2BrowserPlugin } = require("./woff2/woff2-esbuild-plugins"); // Will be used later for treeshaking //const fs = require("fs"); @@ -45,13 +44,15 @@ const browserConfig = { format: "esm", plugins: [ sassPlugin(), - woff2BrowserPlugin(), externalGlobalPlugin({ react: "React", "react-dom": "ReactDOM", }), ], splitting: true, + loader: { + ".woff2": "file", + }, }; const createESMBrowserBuild = async () => { // Development unminified build with source maps @@ -100,9 +101,10 @@ const rawConfig = { entryPoints: ["index.tsx"], bundle: true, format: "esm", - plugins: [sassPlugin(), woff2BrowserPlugin()], + plugins: [sassPlugin()], loader: { ".json": "copy", + ".woff2": "file", }, packages: "external", }; diff --git a/scripts/buildUtils.js b/scripts/buildUtils.js index 0250b6bc1..269119cbd 100644 --- a/scripts/buildUtils.js +++ b/scripts/buildUtils.js @@ -1,17 +1,17 @@ const fs = require("fs"); const { build } = require("esbuild"); const { sassPlugin } = require("esbuild-sass-plugin"); -const { - woff2BrowserPlugin, - woff2ServerPlugin, -} = require("./woff2/woff2-esbuild-plugins"); +const { woff2ServerPlugin } = require("./woff2/woff2-esbuild-plugins"); const browserConfig = { entryPoints: ["index.ts"], bundle: true, format: "esm", - plugins: [sassPlugin(), woff2BrowserPlugin()], + plugins: [sassPlugin()], assetNames: "assets/[name]", + loader: { + ".woff2": "file", + }, }; // Will be used later for treeshaking diff --git a/scripts/woff2/woff2-esbuild-plugins.js b/scripts/woff2/woff2-esbuild-plugins.js index b9b4338f6..d332edf30 100644 --- a/scripts/woff2/woff2-esbuild-plugins.js +++ b/scripts/woff2/woff2-esbuild-plugins.js @@ -2,45 +2,9 @@ const fs = require("fs"); const path = require("path"); const { execSync } = require("child_process"); const which = require("which"); -const fetch = require("node-fetch"); const wawoff = require("wawoff2"); const { Font } = require("fonteditor-core"); -/** - * Custom esbuild plugin to convert url woff2 imports into a text. - * Other woff2 imports are handled by a "file" loader. - * - * @returns {import("esbuild").Plugin} - */ -module.exports.woff2BrowserPlugin = () => { - return { - name: "woff2BrowserPlugin", - setup(build) { - build.initialOptions.loader = { - ".woff2": "file", - ...build.initialOptions.loader, - }; - - build.onResolve({ filter: /^https:\/\/.+?\.woff2$/ }, (args) => { - return { - path: args.path, - namespace: "woff2BrowserPlugin", - }; - }); - - build.onLoad( - { filter: /.*/, namespace: "woff2BrowserPlugin" }, - async (args) => { - return { - contents: args.path, - loader: "text", - }; - }, - ); - }, - }; -}; - /** * Custom esbuild plugin to: * 1. inline all woff2 (url and relative imports) as base64 for server-side use cases (no need for additional font fetch; works in both esm and commonjs) @@ -53,27 +17,6 @@ module.exports.woff2BrowserPlugin = () => { * @returns {import("esbuild").Plugin} */ module.exports.woff2ServerPlugin = (options = {}) => { - // google CDN fails time to time, so let's retry - async function fetchRetry(url, options = {}, retries = 0, delay = 1000) { - try { - const response = await fetch(url, options); - - if (!response.ok) { - throw new Error(`Status: ${response.status}, ${await response.json()}`); - } - - return response; - } catch (e) { - if (retries > 0) { - await new Promise((resolve) => setTimeout(resolve, delay)); - return fetchRetry(url, options, retries - 1, delay * 2); - } - - console.error(`Couldn't fetch: ${url}, error: ${e.message}`); - throw e; - } - } - return { name: "woff2ServerPlugin", setup(build) { @@ -82,9 +25,7 @@ module.exports.woff2ServerPlugin = (options = {}) => { const fonts = new Map(); build.onResolve({ filter: /\.woff2$/ }, (args) => { - const resolvedPath = args.path.startsWith("http") - ? args.path // url - : path.resolve(args.resolveDir, args.path); // absolute path + const resolvedPath = path.resolve(args.resolveDir, args.path); return { path: resolvedPath, @@ -101,9 +42,7 @@ module.exports.woff2ServerPlugin = (options = {}) => { // read local woff2 as a buffer (WARN: `readFileSync` does not work!) woff2Buffer = await fs.promises.readFile(args.path); } else { - // fetch remote woff2 as a buffer (i.e. from a cdn) - const response = await fetchRetry(args.path, {}, 3); - woff2Buffer = await response.buffer(); + throw new Error(`Font path has to be absolute! "${args.path}"`); } // google's brotli decompression into snft diff --git a/scripts/woff2/woff2-vite-plugins.js b/scripts/woff2/woff2-vite-plugins.js index f25488e86..48826b3ce 100644 --- a/scripts/woff2/woff2-vite-plugins.js +++ b/scripts/woff2/woff2-vite-plugins.js @@ -1,15 +1,13 @@ +// `EXCALIDRAW_ASSET_PATH` as a SSOT const OSS_FONTS_CDN = "https://excalidraw.nyc3.cdn.digitaloceanspaces.com/fonts/oss/"; /** - * Custom vite plugin to convert url woff2 imports into a text. - * Other woff2 imports are automatically served and resolved as a file uri. + * Custom vite plugin for auto-prefixing `EXCALIDRAW_ASSET_PATH` woff2 fonts in `excalidraw-app`. * * @returns {import("vite").PluginOption} */ module.exports.woff2BrowserPlugin = () => { - // for now limited to woff2 only, might be extended to any assets in the future - const regex = /^https:\/\/.+?\.woff2$/; let isDev; return { @@ -18,34 +16,9 @@ module.exports.woff2BrowserPlugin = () => { config(_, { command }) { isDev = command === "serve"; }, - resolveId(source) { - if (!regex.test(source)) { - return null; - } - - // getting the url to the dependency tree - return source; - }, - load(id) { - if (!regex.test(id)) { - return null; - } - - // loading the url as string - return `export default "${id}"`; - }, - // necessary for dev as vite / rollup does skips https imports in serve (~dev) mode - // aka dev mode equivalent of "export default x" above (resolveId + load) transform(code, id) { - // treat https woff2 imports as a text - if (isDev && id.endsWith("/excalidraw/fonts/index.ts")) { - return code.replaceAll( - /import\s+(\w+)\s+from\s+(["']https:\/\/.+?\.woff2["'])/g, - `const $1 = $2`, - ); - } - - // use CDN for Assistant + // using copy / replace as fonts defined in the `.css` don't have to be manually copied over (vite/rollup does this automatically), + // but at the same time can't be easily prefixed with the `EXCALIDRAW_ASSET_PATH` only for the `excalidraw-app` if (!isDev && id.endsWith("/excalidraw/fonts/assets/fonts.css")) { return `/* WARN: The following content is generated during excalidraw-app build */ @@ -90,7 +63,6 @@ module.exports.woff2BrowserPlugin = () => { }`; } - // using EXCALIDRAW_ASSET_PATH as a SSOT if (!isDev && id.endsWith("excalidraw-app/index.html")) { return code.replace( "", @@ -110,9 +82,10 @@ module.exports.woff2BrowserPlugin = () => { type="font/woff2" crossorigin="anonymous" /> + { type="font/woff2" crossorigin="anonymous" /> + `, ); } diff --git a/vitest.config.mts b/vitest.config.mts index 6702e6a61..99098eb91 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -1,14 +1,12 @@ import { defineConfig } from "vitest/config"; -import { woff2BrowserPlugin } from "./scripts/woff2/woff2-vite-plugins"; export default defineConfig({ //@ts-ignore - plugins: [woff2BrowserPlugin()], test: { // Since hooks are running in stack in v2, which means all hooks run serially whereas // we need to run them in parallel sequence: { - hooks: 'parallel', + hooks: "parallel", }, setupFiles: ["./setupTests.ts"], globals: true, @@ -19,10 +17,10 @@ export default defineConfig({ // Additionally the thresholds also needs to be updated slightly as a result of this change ignoreEmptyLines: false, thresholds: { - lines: 66, + lines: 60, branches: 70, functions: 63, - statements: 66, + statements: 60, }, }, }, diff --git a/yarn.lock b/yarn.lock index 9bc3c589e..6c022abe3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1519,11 +1519,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - "@esbuild/android-arm64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.10.tgz#ef31015416dd79398082409b77aaaa2ade4d531a" @@ -1539,11 +1534,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - "@esbuild/android-arm@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.10.tgz#1c23c7e75473aae9fb323be5d9db225142f47f52" @@ -1559,11 +1549,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - "@esbuild/android-x64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.10.tgz#df6a4e6d6eb8da5595cfce16d4e3f6bc24464707" @@ -1579,11 +1564,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - "@esbuild/darwin-arm64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.10.tgz#8462a55db07c1b2fad61c8244ce04469ef1043be" @@ -1599,11 +1579,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - "@esbuild/darwin-x64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.10.tgz#d1de20bfd41bb75b955ba86a6b1004539e8218c1" @@ -1619,11 +1594,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - "@esbuild/freebsd-arm64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.10.tgz#16904879e34c53a2e039d1284695d2db3e664d57" @@ -1639,11 +1609,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - "@esbuild/freebsd-x64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.10.tgz#8ad9e5ca9786ca3f1ef1411bfd10b08dcd9d4cef" @@ -1659,11 +1624,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - "@esbuild/linux-arm64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.10.tgz#d82cf2c590faece82d28bbf1cfbe36f22ae25bd2" @@ -1679,11 +1639,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - "@esbuild/linux-arm@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.10.tgz#477b8e7c7bcd34369717b04dd9ee6972c84f4029" @@ -1699,11 +1654,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - "@esbuild/linux-ia32@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.10.tgz#d55ff822cf5b0252a57112f86857ff23be6cab0e" @@ -1719,11 +1669,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - "@esbuild/linux-loong64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.10.tgz#a9ad057d7e48d6c9f62ff50f6f208e331c4543c7" @@ -1739,11 +1684,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - "@esbuild/linux-mips64el@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.10.tgz#b011a96924773d60ebab396fbd7a08de66668179" @@ -1759,11 +1699,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - "@esbuild/linux-ppc64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.10.tgz#5d8b59929c029811e473f2544790ea11d588d4dd" @@ -1779,11 +1714,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - "@esbuild/linux-riscv64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.10.tgz#292b06978375b271bd8bc0a554e0822957508d22" @@ -1799,11 +1729,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - "@esbuild/linux-s390x@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.10.tgz#d30af63530f8d4fa96930374c9dd0d62bf59e069" @@ -1819,11 +1744,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - "@esbuild/linux-x64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.10.tgz#898c72eeb74d9f2fb43acf316125b475548b75ce" @@ -1839,11 +1759,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - "@esbuild/netbsd-x64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.10.tgz#fd473a5ae261b43eab6dad4dbd5a3155906e6c91" @@ -1859,11 +1774,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - "@esbuild/openbsd-x64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.10.tgz#96eb8992e526717b5272321eaad3e21f3a608e46" @@ -1879,11 +1789,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - "@esbuild/sunos-x64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.10.tgz#c16ee1c167f903eaaa6acf7372bee42d5a89c9bc" @@ -1899,11 +1804,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - "@esbuild/win32-arm64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.10.tgz#7e417d1971dbc7e469b4eceb6a5d1d667b5e3dcc" @@ -1919,11 +1819,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - "@esbuild/win32-ia32@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.10.tgz#2b52dfec6cd061ecb36171c13bae554888b439e5" @@ -1939,11 +1834,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - "@esbuild/win32-x64@0.19.10": version "0.19.10" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.10.tgz#bd123a74f243d2f3a1f046447bb9b363ee25d072" @@ -1959,11 +1849,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -2856,161 +2741,81 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== -"@rollup/rollup-android-arm-eabi@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz#0412834dc423d1ff7be4cb1fc13a86a0cd262c11" - integrity sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg== - "@rollup/rollup-android-arm64@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== -"@rollup/rollup-android-arm64@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz#baf1a014b13654f3b9e835388df9caf8c35389cb" - integrity sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA== - "@rollup/rollup-darwin-arm64@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== -"@rollup/rollup-darwin-arm64@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz#0a2c364e775acdf1172fe3327662eec7c46e55b1" - integrity sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q== - "@rollup/rollup-darwin-x64@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== -"@rollup/rollup-darwin-x64@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz#a972db75890dfab8df0da228c28993220a468c42" - integrity sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w== - "@rollup/rollup-linux-arm-gnueabihf@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== -"@rollup/rollup-linux-arm-gnueabihf@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz#1609d0630ef61109dd19a278353e5176d92e30a1" - integrity sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w== - "@rollup/rollup-linux-arm-musleabihf@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== -"@rollup/rollup-linux-arm-musleabihf@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz#3c1dca5f160aa2e79e4b20ff6395eab21804f266" - integrity sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w== - "@rollup/rollup-linux-arm64-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== -"@rollup/rollup-linux-arm64-gnu@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz#c2fe376e8b04eafb52a286668a8df7c761470ac7" - integrity sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw== - "@rollup/rollup-linux-arm64-musl@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== -"@rollup/rollup-linux-arm64-musl@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz#e62a4235f01e0f66dbba587c087ca6db8008ec80" - integrity sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w== - "@rollup/rollup-linux-powerpc64le-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== -"@rollup/rollup-linux-powerpc64le-gnu@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz#24b3457e75ee9ae5b1c198bd39eea53222a74e54" - integrity sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ== - "@rollup/rollup-linux-riscv64-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== -"@rollup/rollup-linux-riscv64-gnu@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz#38edfba9620fe2ca8116c97e02bd9f2d606bde09" - integrity sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg== - "@rollup/rollup-linux-s390x-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== -"@rollup/rollup-linux-s390x-gnu@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz#a3bfb8bc5f1e802f8c76cff4a4be2e9f9ac36a18" - integrity sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ== - "@rollup/rollup-linux-x64-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== -"@rollup/rollup-linux-x64-gnu@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz#0dadf34be9199fcdda44b5985a086326344f30ad" - integrity sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw== - "@rollup/rollup-linux-x64-musl@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== -"@rollup/rollup-linux-x64-musl@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz#7b7deddce240400eb87f2406a445061b4fed99a8" - integrity sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg== - "@rollup/rollup-win32-arm64-msvc@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== -"@rollup/rollup-win32-arm64-msvc@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz#a0ca0c5149c2cfb26fab32e6ba3f16996fbdb504" - integrity sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ== - "@rollup/rollup-win32-ia32-msvc@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== -"@rollup/rollup-win32-ia32-msvc@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz#aae2886beec3024203dbb5569db3a137bc385f8e" - integrity sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw== - "@rollup/rollup-win32-x64-msvc@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== -"@rollup/rollup-win32-x64-msvc@4.21.2": - version "4.21.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz#e4291e3c1bc637083f87936c333cdbcad22af63b" - integrity sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA== - "@rushstack/eslint-patch@^1.1.0": version "1.10.3" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz#391d528054f758f81e53210f1a1eebcf1a8b1d20" @@ -5389,11 +5194,6 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -data-uri-to-buffer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" - integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== - data-urls@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" @@ -5999,35 +5799,6 @@ esbuild@^0.20.1: "@esbuild/win32-ia32" "0.20.2" "@esbuild/win32-x64" "0.20.2" -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" @@ -6486,14 +6257,6 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" -fetch-blob@^3.1.2, fetch-blob@^3.1.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" - integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== - dependencies: - node-domexception "^1.0.0" - web-streams-polyfill "^3.0.3" - fflate@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" @@ -6632,13 +6395,6 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -formdata-polyfill@^4.0.10: - version "4.0.10" - resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" - integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== - dependencies: - fetch-blob "^3.1.2" - fraction.js@^4.2.0: version "4.3.7" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" @@ -8480,11 +8236,6 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-domexception@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" - integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== - node-fetch@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" @@ -8497,15 +8248,6 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" -node-fetch@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" - integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== - dependencies: - data-uri-to-buffer "^4.0.0" - fetch-blob "^3.1.4" - formdata-polyfill "^4.0.10" - node-html-parser@^5.3.3: version "5.4.2" resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-5.4.2.tgz#93e004038c17af80226c942336990a0eaed8136a" @@ -8991,15 +8733,6 @@ postcss@^8.4.32, postcss@^8.4.38, postcss@^8.4.7: picocolors "^1.0.0" source-map-js "^1.2.0" -postcss@^8.4.41: - version "8.4.43" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.43.tgz#a5ddf22f4cc38e64c6ae030182b43e539d316419" - integrity sha512-gJAQVYbh5R3gYm33FijzCZj7CHyQ3hWMgJMprLUlIYqCwTeZhBQ19wp0e9mA25BUbEvY5+EXuuaAjqQsrBxQBQ== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -9475,31 +9208,6 @@ rollup@^4.13.0, rollup@^4.2.0: "@rollup/rollup-win32-x64-msvc" "4.18.0" fsevents "~2.3.2" -rollup@^4.20.0: - version "4.21.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.2.tgz#f41f277a448d6264e923dd1ea179f0a926aaf9b7" - integrity sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw== - dependencies: - "@types/estree" "1.0.5" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.21.2" - "@rollup/rollup-android-arm64" "4.21.2" - "@rollup/rollup-darwin-arm64" "4.21.2" - "@rollup/rollup-darwin-x64" "4.21.2" - "@rollup/rollup-linux-arm-gnueabihf" "4.21.2" - "@rollup/rollup-linux-arm-musleabihf" "4.21.2" - "@rollup/rollup-linux-arm64-gnu" "4.21.2" - "@rollup/rollup-linux-arm64-musl" "4.21.2" - "@rollup/rollup-linux-powerpc64le-gnu" "4.21.2" - "@rollup/rollup-linux-riscv64-gnu" "4.21.2" - "@rollup/rollup-linux-s390x-gnu" "4.21.2" - "@rollup/rollup-linux-x64-gnu" "4.21.2" - "@rollup/rollup-linux-x64-musl" "4.21.2" - "@rollup/rollup-win32-arm64-msvc" "4.21.2" - "@rollup/rollup-win32-ia32-msvc" "4.21.2" - "@rollup/rollup-win32-x64-msvc" "4.21.2" - fsevents "~2.3.2" - roughjs@4.6.4: version "4.6.4" resolved "https://registry.yarnpkg.com/roughjs/-/roughjs-4.6.4.tgz#b6f39b44645854a6e0a4a28b078368701eb7f939" @@ -10695,17 +10403,6 @@ vite@5.0.12: optionalDependencies: fsevents "~2.3.3" -vite@5.4.2: - version "5.4.2" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.2.tgz#8acb6ec4bfab823cdfc1cb2d6c53ed311bc4e47e" - integrity sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA== - dependencies: - esbuild "^0.21.3" - postcss "^8.4.41" - rollup "^4.20.0" - optionalDependencies: - fsevents "~2.3.3" - vite@^5.0.0: version "5.2.11" resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.11.tgz#726ec05555431735853417c3c0bfb36003ca0cbd" @@ -10815,11 +10512,6 @@ wawoff2@2.0.1: dependencies: argparse "^2.0.1" -web-streams-polyfill@^3.0.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" - integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== - web-worker@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.3.0.tgz#e5f2df5c7fe356755a5fb8f8410d4312627e6776"