├── .codesandbox
├── Dockerfile
└── tasks.json
├── .dockerignore
├── .editorconfig
├── .env.development
├── .env.production
├── .eslintignore
├── .eslintrc.json
├── .gitattributes
├── .github
├── FUNDING.yml
├── assets
│ ├── crowdin.svg
│ ├── sentry.svg
│ └── vercel.svg
├── copilot-instructions.md
└── workflows
│ ├── autorelease-excalidraw.yml
│ ├── build-docker.yml
│ ├── cancel.yml
│ ├── lint.yml
│ ├── locales-coverage.yml
│ ├── publish-docker.yml
│ ├── semantic-pr-title.yml
│ ├── sentry-production.yml
│ ├── size-limit.yml
│ ├── test-coverage-pr.yml
│ └── test.yml
├── .gitignore
├── .husky
└── pre-commit
├── .lintstagedrc.js
├── .npmrc
├── .prettierignore
├── .watchmanconfig
├── CLAUDE.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── crowdin.yml
├── dev-docs
├── .gitignore
├── README.md
├── babel.config.js
├── docs
│ ├── @excalidraw
│ │ ├── excalidraw
│ │ │ ├── api
│ │ │ │ ├── api-intro.mdx
│ │ │ │ ├── children-components
│ │ │ │ │ ├── children-components-intro.mdx
│ │ │ │ │ ├── footer.mdx
│ │ │ │ │ ├── live-collaboration-trigger.mdx
│ │ │ │ │ ├── main-menu.mdx
│ │ │ │ │ ├── sidebar.mdx
│ │ │ │ │ └── welcome-screen.mdx
│ │ │ │ ├── constants.mdx
│ │ │ │ ├── excalidraw-element-skeleton.mdx
│ │ │ │ ├── props
│ │ │ │ │ ├── excalidraw-api.mdx
│ │ │ │ │ ├── initialdata.mdx
│ │ │ │ │ ├── props.mdx
│ │ │ │ │ ├── render-props.mdx
│ │ │ │ │ └── ui-options.mdx
│ │ │ │ └── utils
│ │ │ │ │ ├── export.mdx
│ │ │ │ │ ├── restore.mdx
│ │ │ │ │ └── utils-intro.md
│ │ │ ├── customizing-styles.mdx
│ │ │ ├── development.mdx
│ │ │ ├── faq.mdx
│ │ │ ├── installation.mdx
│ │ │ └── integration.mdx
│ │ └── mermaid-to-excalidraw
│ │ │ ├── api.mdx
│ │ │ ├── codebase
│ │ │ ├── codebase.mdx
│ │ │ ├── new-diagram-type.mdx
│ │ │ └── parser
│ │ │ │ ├── flowchart.mdx
│ │ │ │ └── parser.mdx
│ │ │ ├── development.mdx
│ │ │ └── installation.mdx
│ ├── assets
│ │ ├── aggressive-block-fingerprint.png
│ │ ├── block-fingerprint.png
│ │ ├── brave-shield.png
│ │ └── nerd-stats.png
│ ├── codebase
│ │ ├── frames.mdx
│ │ └── json-schema.mdx
│ └── introduction
│ │ ├── contributing.mdx
│ │ ├── development.mdx
│ │ └── get-started.mdx
├── docusaurus.config.js
├── package.json
├── sidebars.js
├── src
│ ├── components
│ │ ├── Highlight.js
│ │ └── Homepage
│ │ │ ├── index.js
│ │ │ ├── index.tsx
│ │ │ └── styles.module.css
│ ├── css
│ │ └── custom.scss
│ ├── initialData.js
│ ├── pages
│ │ ├── index.module.css
│ │ ├── index.tsx
│ │ └── markdown-page.md
│ └── theme
│ │ ├── MDXComponents.js
│ │ └── ReactLiveScope
│ │ └── index.js
├── static
│ ├── .nojekyll
│ └── img
│ │ ├── docusaurus.png
│ │ ├── doremon.png
│ │ ├── favicon.ico
│ │ ├── favicon.png
│ │ ├── logo.svg
│ │ ├── og-image-2.png
│ │ ├── og-image.png
│ │ ├── pika.jpeg
│ │ ├── undraw_add_files.svg
│ │ ├── undraw_blank_canvas.svg
│ │ ├── undraw_innovative.svg
│ │ └── welcome-screen-overview.png
├── tsconfig.json
├── vercel.json
└── yarn.lock
├── docker-compose.yml
├── examples
├── with-nextjs
│ ├── .gitignore
│ ├── README.md
│ ├── next.config.js
│ ├── package.json
│ ├── public
│ │ └── images
│ │ │ ├── doremon.png
│ │ │ ├── excalibot.png
│ │ │ ├── pika.jpeg
│ │ │ └── rocket.jpeg
│ ├── src
│ │ ├── app
│ │ │ ├── favicon.ico
│ │ │ ├── layout.tsx
│ │ │ └── page.tsx
│ │ ├── common.scss
│ │ ├── excalidrawWrapper.tsx
│ │ └── pages
│ │ │ └── excalidraw-in-pages.tsx
│ ├── tsconfig.json
│ ├── vercel.json
│ └── yarn.lock
└── with-script-in-browser
│ ├── .codesandbox
│ ├── Dockerfile
│ └── tasks.json
│ ├── .gitignore
│ ├── components
│ ├── CustomFooter.tsx
│ ├── ExampleApp.scss
│ ├── ExampleApp.tsx
│ ├── MobileFooter.tsx
│ └── sidebar
│ │ ├── ExampleSidebar.scss
│ │ └── ExampleSidebar.tsx
│ ├── index.html
│ ├── index.tsx
│ ├── initialData.tsx
│ ├── package.json
│ ├── public
│ └── images
│ │ ├── doremon.png
│ │ ├── excalibot.png
│ │ ├── pika.jpeg
│ │ └── rocket.jpeg
│ ├── tsconfig.json
│ ├── utils.ts
│ ├── vercel.json
│ └── vite.config.mts
├── excalidraw-app
├── App.tsx
├── CustomStats.tsx
├── ExcalidrawPlusIframeExport.tsx
├── app-jotai.ts
├── app-language
│ ├── LanguageList.tsx
│ ├── language-detector.ts
│ └── language-state.ts
├── app_constants.ts
├── bug-issue-template.js
├── collab
│ ├── Collab.tsx
│ ├── CollabError.scss
│ ├── CollabError.tsx
│ └── Portal.tsx
├── components
│ ├── AI.tsx
│ ├── AppFooter.tsx
│ ├── AppMainMenu.tsx
│ ├── AppSidebar.scss
│ ├── AppSidebar.tsx
│ ├── AppWelcomeScreen.tsx
│ ├── DebugCanvas.tsx
│ ├── EncryptedIcon.tsx
│ ├── ExcalidrawPlusPromoBanner.tsx
│ ├── ExportToExcalidrawPlus.tsx
│ ├── GitHubCorner.tsx
│ └── TopErrorBoundary.tsx
├── data
│ ├── FileManager.ts
│ ├── LocalData.ts
│ ├── Locker.ts
│ ├── firebase.ts
│ ├── index.ts
│ ├── localStorage.ts
│ └── tabSync.ts
├── debug.ts
├── global.d.ts
├── index.html
├── index.scss
├── index.tsx
├── package.json
├── sentry.ts
├── share
│ ├── ShareDialog.scss
│ └── ShareDialog.tsx
├── tests
│ ├── LanguageList.test.tsx
│ ├── MobileMenu.test.tsx
│ ├── __snapshots__
│ │ └── MobileMenu.test.tsx.snap
│ └── collab.test.tsx
├── useHandleAppTheme.ts
├── vite-env.d.ts
└── vite.config.mts
├── firebase-project
├── .firebaserc
├── .gitignore
├── firebase.json
├── firestore.indexes.json
├── firestore.rules
└── storage.rules
├── package.json
├── packages
├── common
│ ├── .eslintrc.json
│ ├── README.md
│ ├── global.d.ts
│ ├── package.json
│ ├── src
│ │ ├── binary-heap.ts
│ │ ├── colors.ts
│ │ ├── constants.ts
│ │ ├── editorInterface.ts
│ │ ├── emitter.ts
│ │ ├── font-metadata.ts
│ │ ├── index.ts
│ │ ├── keys.ts
│ │ ├── points.ts
│ │ ├── promise-pool.ts
│ │ ├── queue.ts
│ │ ├── random.ts
│ │ ├── url.ts
│ │ ├── utility-types.ts
│ │ ├── utils.test.ts
│ │ └── utils.ts
│ ├── tests
│ │ ├── keys.test.ts
│ │ ├── queue.test.ts
│ │ └── url.test.tsx
│ └── tsconfig.json
├── element
│ ├── .eslintrc.json
│ ├── README.md
│ ├── global.d.ts
│ ├── package.json
│ ├── src
│ │ ├── Scene.ts
│ │ ├── align.ts
│ │ ├── binding.ts
│ │ ├── bounds.ts
│ │ ├── collision.ts
│ │ ├── comparisons.ts
│ │ ├── containerCache.ts
│ │ ├── cropElement.ts
│ │ ├── delta.ts
│ │ ├── distance.ts
│ │ ├── distribute.ts
│ │ ├── dragElements.ts
│ │ ├── duplicate.ts
│ │ ├── elbowArrow.ts
│ │ ├── elementLink.ts
│ │ ├── embeddable.ts
│ │ ├── flowchart.ts
│ │ ├── fractionalIndex.ts
│ │ ├── frame.ts
│ │ ├── groups.ts
│ │ ├── heading.ts
│ │ ├── image.ts
│ │ ├── index.ts
│ │ ├── linearElementEditor.ts
│ │ ├── mutateElement.ts
│ │ ├── newElement.ts
│ │ ├── positionElementsOnGrid.ts
│ │ ├── renderElement.ts
│ │ ├── resizeElements.ts
│ │ ├── resizeTest.ts
│ │ ├── selection.ts
│ │ ├── shape.ts
│ │ ├── showSelectedShapeActions.ts
│ │ ├── sizeHelpers.ts
│ │ ├── sortElements.ts
│ │ ├── store.ts
│ │ ├── textElement.ts
│ │ ├── textMeasurements.ts
│ │ ├── textWrapping.ts
│ │ ├── transformHandles.ts
│ │ ├── typeChecks.ts
│ │ ├── types.ts
│ │ ├── utils.ts
│ │ └── zindex.ts
│ ├── tests
│ │ ├── __snapshots__
│ │ │ └── linearElementEditor.test.tsx.snap
│ │ ├── align.test.tsx
│ │ ├── binding.test.tsx
│ │ ├── bounds.test.ts
│ │ ├── collision.test.tsx
│ │ ├── cropElement.test.tsx
│ │ ├── delta.test.tsx
│ │ ├── distribute.test.tsx
│ │ ├── duplicate.test.tsx
│ │ ├── elbowArrow.test.tsx
│ │ ├── embeddable.test.ts
│ │ ├── flowchart.test.tsx
│ │ ├── fractionalIndex.test.ts
│ │ ├── frame.test.tsx
│ │ ├── linearElementEditor.test.tsx
│ │ ├── resize.test.tsx
│ │ ├── selection.test.ts
│ │ ├── sizeHelpers.test.ts
│ │ ├── sortElements.test.ts
│ │ ├── textElement.test.ts
│ │ ├── textWrapping.test.ts
│ │ ├── typeChecks.test.ts
│ │ └── zindex.test.tsx
│ └── tsconfig.json
├── eslintrc.base.json
├── excalidraw
│ ├── .gitignore
│ ├── .size-limit.json
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── actions
│ │ ├── actionAddToLibrary.ts
│ │ ├── actionAlign.tsx
│ │ ├── actionBoundText.tsx
│ │ ├── actionCanvas.tsx
│ │ ├── actionClipboard.tsx
│ │ ├── actionCropEditor.tsx
│ │ ├── actionDeleteSelected.test.tsx
│ │ ├── actionDeleteSelected.tsx
│ │ ├── actionDistribute.tsx
│ │ ├── actionDuplicateSelection.test.tsx
│ │ ├── actionDuplicateSelection.tsx
│ │ ├── actionElementLink.ts
│ │ ├── actionElementLock.test.tsx
│ │ ├── actionElementLock.ts
│ │ ├── actionEmbeddable.ts
│ │ ├── actionExport.tsx
│ │ ├── actionFinalize.tsx
│ │ ├── actionFlip.test.tsx
│ │ ├── actionFlip.ts
│ │ ├── actionFrame.ts
│ │ ├── actionGroup.tsx
│ │ ├── actionHistory.tsx
│ │ ├── actionLinearEditor.tsx
│ │ ├── actionLink.tsx
│ │ ├── actionMenu.tsx
│ │ ├── actionNavigate.tsx
│ │ ├── actionProperties.test.tsx
│ │ ├── actionProperties.tsx
│ │ ├── actionSelectAll.ts
│ │ ├── actionStyles.ts
│ │ ├── actionTextAutoResize.ts
│ │ ├── actionToggleGridMode.tsx
│ │ ├── actionToggleObjectsSnapMode.tsx
│ │ ├── actionToggleSearchMenu.ts
│ │ ├── actionToggleShapeSwitch.tsx
│ │ ├── actionToggleStats.tsx
│ │ ├── actionToggleViewMode.tsx
│ │ ├── actionToggleZenMode.tsx
│ │ ├── actionZindex.tsx
│ │ ├── index.ts
│ │ ├── manager.tsx
│ │ ├── register.ts
│ │ ├── shortcuts.ts
│ │ └── types.ts
│ ├── analytics.ts
│ ├── animated-trail.ts
│ ├── animation-frame-handler.ts
│ ├── appState.ts
│ ├── charts.test.ts
│ ├── charts.ts
│ ├── clients.ts
│ ├── clipboard.test.ts
│ ├── clipboard.ts
│ ├── components
│ │ ├── Actions.scss
│ │ ├── Actions.tsx
│ │ ├── ActiveConfirmDialog.tsx
│ │ ├── App.tsx
│ │ ├── Avatar.scss
│ │ ├── Avatar.tsx
│ │ ├── BraveMeasureTextError.tsx
│ │ ├── Button.scss
│ │ ├── Button.tsx
│ │ ├── ButtonIcon.scss
│ │ ├── ButtonIcon.tsx
│ │ ├── ButtonIconCycle.tsx
│ │ ├── ButtonSeparator.tsx
│ │ ├── Card.scss
│ │ ├── Card.tsx
│ │ ├── CheckboxItem.scss
│ │ ├── CheckboxItem.tsx
│ │ ├── ColorPicker
│ │ │ ├── ColorInput.tsx
│ │ │ ├── ColorPicker.scss
│ │ │ ├── ColorPicker.tsx
│ │ │ ├── CustomColorList.tsx
│ │ │ ├── HotkeyLabel.tsx
│ │ │ ├── Picker.tsx
│ │ │ ├── PickerColorList.tsx
│ │ │ ├── PickerHeading.tsx
│ │ │ ├── ShadeList.tsx
│ │ │ ├── TopPicks.tsx
│ │ │ ├── colorPickerUtils.ts
│ │ │ └── keyboardNavHandlers.ts
│ │ ├── CommandPalette
│ │ │ ├── CommandPalette.scss
│ │ │ ├── CommandPalette.tsx
│ │ │ ├── defaultCommandPaletteItems.ts
│ │ │ └── types.ts
│ │ ├── ConfirmDialog.scss
│ │ ├── ConfirmDialog.tsx
│ │ ├── ContextMenu.scss
│ │ ├── ContextMenu.tsx
│ │ ├── ConvertElementTypePopup.scss
│ │ ├── ConvertElementTypePopup.tsx
│ │ ├── DarkModeToggle.tsx
│ │ ├── DefaultSidebar.test.tsx
│ │ ├── DefaultSidebar.tsx
│ │ ├── DiagramToCodePlugin
│ │ │ └── DiagramToCodePlugin.tsx
│ │ ├── Dialog.scss
│ │ ├── Dialog.tsx
│ │ ├── DialogActionButton.scss
│ │ ├── DialogActionButton.tsx
│ │ ├── ElementCanvasButtons.scss
│ │ ├── ElementCanvasButtons.tsx
│ │ ├── ElementLinkDialog.scss
│ │ ├── ElementLinkDialog.tsx
│ │ ├── Ellipsify.tsx
│ │ ├── ErrorDialog.tsx
│ │ ├── ExcalidrawLogo.scss
│ │ ├── ExcalidrawLogo.tsx
│ │ ├── ExportDialog.scss
│ │ ├── EyeDropper.scss
│ │ ├── EyeDropper.tsx
│ │ ├── FilledButton.scss
│ │ ├── FilledButton.tsx
│ │ ├── FixedSideContainer.scss
│ │ ├── FixedSideContainer.tsx
│ │ ├── FollowMode
│ │ │ ├── FollowMode.scss
│ │ │ └── FollowMode.tsx
│ │ ├── FontPicker
│ │ │ ├── FontPicker.scss
│ │ │ ├── FontPicker.tsx
│ │ │ ├── FontPickerList.tsx
│ │ │ ├── FontPickerTrigger.tsx
│ │ │ └── keyboardNavHandlers.ts
│ │ ├── HandButton.tsx
│ │ ├── HelpButton.tsx
│ │ ├── HelpDialog.scss
│ │ ├── HelpDialog.tsx
│ │ ├── HintViewer.scss
│ │ ├── HintViewer.tsx
│ │ ├── IconPicker.scss
│ │ ├── IconPicker.tsx
│ │ ├── ImageExportDialog.scss
│ │ ├── ImageExportDialog.tsx
│ │ ├── InitializeApp.tsx
│ │ ├── InlineIcon.tsx
│ │ ├── Island.scss
│ │ ├── Island.tsx
│ │ ├── JSONExportDialog.tsx
│ │ ├── LaserPointerButton.tsx
│ │ ├── LayerUI.scss
│ │ ├── LayerUI.tsx
│ │ ├── LibraryMenu.scss
│ │ ├── LibraryMenu.tsx
│ │ ├── LibraryMenuBrowseButton.tsx
│ │ ├── LibraryMenuControlButtons.tsx
│ │ ├── LibraryMenuHeaderContent.tsx
│ │ ├── LibraryMenuItems.scss
│ │ ├── LibraryMenuItems.tsx
│ │ ├── LibraryMenuSection.tsx
│ │ ├── LibraryUnit.scss
│ │ ├── LibraryUnit.tsx
│ │ ├── LinkButton.tsx
│ │ ├── LoadingMessage.tsx
│ │ ├── LockButton.tsx
│ │ ├── MagicButton.tsx
│ │ ├── MobileMenu.tsx
│ │ ├── MobileToolBar.scss
│ │ ├── MobileToolBar.tsx
│ │ ├── Modal.scss
│ │ ├── Modal.tsx
│ │ ├── OverwriteConfirm
│ │ │ ├── OverwriteConfirm.scss
│ │ │ ├── OverwriteConfirm.tsx
│ │ │ ├── OverwriteConfirmActions.tsx
│ │ │ └── OverwriteConfirmState.ts
│ │ ├── Paragraph.tsx
│ │ ├── PasteChartDialog.scss
│ │ ├── PasteChartDialog.tsx
│ │ ├── PenModeButton.tsx
│ │ ├── Popover.scss
│ │ ├── Popover.tsx
│ │ ├── ProjectName.scss
│ │ ├── ProjectName.tsx
│ │ ├── PropertiesPopover.tsx
│ │ ├── PublishLibrary.scss
│ │ ├── PublishLibrary.tsx
│ │ ├── QuickSearch.scss
│ │ ├── QuickSearch.tsx
│ │ ├── RadioGroup.scss
│ │ ├── RadioGroup.tsx
│ │ ├── RadioSelection.tsx
│ │ ├── Range.scss
│ │ ├── Range.tsx
│ │ ├── SVGLayer.scss
│ │ ├── SVGLayer.tsx
│ │ ├── ScrollableList.scss
│ │ ├── ScrollableList.tsx
│ │ ├── SearchMenu.scss
│ │ ├── SearchMenu.tsx
│ │ ├── Section.tsx
│ │ ├── ShareableLinkDialog.scss
│ │ ├── ShareableLinkDialog.tsx
│ │ ├── Sidebar
│ │ │ ├── Sidebar.scss
│ │ │ ├── Sidebar.test.tsx
│ │ │ ├── Sidebar.tsx
│ │ │ ├── SidebarHeader.tsx
│ │ │ ├── SidebarTab.tsx
│ │ │ ├── SidebarTabTrigger.tsx
│ │ │ ├── SidebarTabTriggers.tsx
│ │ │ ├── SidebarTabs.tsx
│ │ │ ├── SidebarTrigger.scss
│ │ │ ├── SidebarTrigger.tsx
│ │ │ ├── common.ts
│ │ │ └── siderbar.test.helpers.tsx
│ │ ├── Spinner.scss
│ │ ├── Spinner.tsx
│ │ ├── Stack.scss
│ │ ├── Stack.tsx
│ │ ├── Stats
│ │ │ ├── Angle.tsx
│ │ │ ├── CanvasGrid.tsx
│ │ │ ├── Collapsible.tsx
│ │ │ ├── Dimension.tsx
│ │ │ ├── DragInput.scss
│ │ │ ├── DragInput.tsx
│ │ │ ├── FontSize.tsx
│ │ │ ├── MultiAngle.tsx
│ │ │ ├── MultiDimension.tsx
│ │ │ ├── MultiFontSize.tsx
│ │ │ ├── MultiPosition.tsx
│ │ │ ├── Position.tsx
│ │ │ ├── Stats.scss
│ │ │ ├── index.tsx
│ │ │ ├── stats.test.tsx
│ │ │ └── utils.ts
│ │ ├── Switch.scss
│ │ ├── Switch.tsx
│ │ ├── TTDDialog
│ │ │ ├── MermaidToExcalidraw.scss
│ │ │ ├── MermaidToExcalidraw.tsx
│ │ │ ├── TTDDialog.scss
│ │ │ ├── TTDDialog.tsx
│ │ │ ├── TTDDialogInput.tsx
│ │ │ ├── TTDDialogOutput.tsx
│ │ │ ├── TTDDialogPanel.tsx
│ │ │ ├── TTDDialogPanels.tsx
│ │ │ ├── TTDDialogSubmitShortcut.tsx
│ │ │ ├── TTDDialogTab.tsx
│ │ │ ├── TTDDialogTabTrigger.tsx
│ │ │ ├── TTDDialogTabTriggers.tsx
│ │ │ ├── TTDDialogTabs.tsx
│ │ │ ├── TTDDialogTrigger.tsx
│ │ │ └── common.ts
│ │ ├── TextField.scss
│ │ ├── TextField.tsx
│ │ ├── TextInput.scss
│ │ ├── Toast.scss
│ │ ├── Toast.tsx
│ │ ├── ToolButton.tsx
│ │ ├── ToolIcon.scss
│ │ ├── ToolPopover.scss
│ │ ├── ToolPopover.tsx
│ │ ├── Toolbar.scss
│ │ ├── Tooltip.scss
│ │ ├── Tooltip.tsx
│ │ ├── Trans.test.tsx
│ │ ├── Trans.tsx
│ │ ├── UnlockPopup.scss
│ │ ├── UnlockPopup.tsx
│ │ ├── UserList.scss
│ │ ├── UserList.tsx
│ │ ├── __snapshots__
│ │ │ └── App.test.tsx.snap
│ │ ├── canvases
│ │ │ ├── InteractiveCanvas.tsx
│ │ │ ├── NewElementCanvas.tsx
│ │ │ ├── StaticCanvas.tsx
│ │ │ └── index.tsx
│ │ ├── dropdownMenu
│ │ │ ├── DropdownMenu.scss
│ │ │ ├── DropdownMenu.test.tsx
│ │ │ ├── DropdownMenu.tsx
│ │ │ ├── DropdownMenuContent.tsx
│ │ │ ├── DropdownMenuGroup.tsx
│ │ │ ├── DropdownMenuItem.tsx
│ │ │ ├── DropdownMenuItemContent.tsx
│ │ │ ├── DropdownMenuItemContentRadio.tsx
│ │ │ ├── DropdownMenuItemCustom.tsx
│ │ │ ├── DropdownMenuItemLink.tsx
│ │ │ ├── DropdownMenuSeparator.tsx
│ │ │ ├── DropdownMenuTrigger.tsx
│ │ │ ├── common.ts
│ │ │ └── dropdownMenuUtils.ts
│ │ ├── footer
│ │ │ ├── Footer.tsx
│ │ │ ├── FooterCenter.scss
│ │ │ └── FooterCenter.tsx
│ │ ├── hoc
│ │ │ ├── withInternalFallback.test.tsx
│ │ │ └── withInternalFallback.tsx
│ │ ├── hyperlink
│ │ │ ├── Hyperlink.scss
│ │ │ ├── Hyperlink.tsx
│ │ │ └── helpers.ts
│ │ ├── icons.tsx
│ │ ├── live-collaboration
│ │ │ ├── LiveCollaborationTrigger.scss
│ │ │ └── LiveCollaborationTrigger.tsx
│ │ ├── main-menu
│ │ │ ├── DefaultItems.scss
│ │ │ ├── DefaultItems.tsx
│ │ │ └── MainMenu.tsx
│ │ ├── shapes.tsx
│ │ └── welcome-screen
│ │ │ ├── WelcomeScreen.Center.tsx
│ │ │ ├── WelcomeScreen.Hints.tsx
│ │ │ ├── WelcomeScreen.scss
│ │ │ └── WelcomeScreen.tsx
│ ├── context
│ │ ├── tunnels.ts
│ │ └── ui-appState.ts
│ ├── css.d.ts
│ ├── css
│ │ ├── app.scss
│ │ ├── styles.scss
│ │ ├── theme.scss
│ │ └── variables.module.scss
│ ├── cursor.ts
│ ├── data
│ │ ├── EditorLocalStorage.ts
│ │ ├── __snapshots__
│ │ │ └── transform.test.ts.snap
│ │ ├── ai
│ │ │ └── types.ts
│ │ ├── blob.ts
│ │ ├── encode.ts
│ │ ├── encryption.ts
│ │ ├── filesystem.ts
│ │ ├── image.ts
│ │ ├── index.ts
│ │ ├── json.ts
│ │ ├── library.test.ts
│ │ ├── library.ts
│ │ ├── reconcile.ts
│ │ ├── resave.ts
│ │ ├── restore.ts
│ │ ├── transform.test.ts
│ │ ├── transform.ts
│ │ └── types.ts
│ ├── deburr.ts
│ ├── editor-jotai.ts
│ ├── env.cjs
│ ├── eraser
│ │ └── index.ts
│ ├── errors.ts
│ ├── fonts
│ │ ├── Assistant
│ │ │ ├── Assistant-Bold.woff2
│ │ │ ├── Assistant-Medium.woff2
│ │ │ ├── Assistant-Regular.woff2
│ │ │ └── Assistant-SemiBold.woff2
│ │ ├── Cascadia
│ │ │ ├── CascadiaCode-Regular.woff2
│ │ │ └── index.ts
│ │ ├── ComicShanns
│ │ │ ├── ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2
│ │ │ ├── ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2
│ │ │ ├── ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2
│ │ │ ├── ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2
│ │ │ ├── ComicShanns-Regular.sfd
│ │ │ └── index.ts
│ │ ├── Emoji
│ │ │ └── index.ts
│ │ ├── ExcalidrawFontFace.ts
│ │ ├── Excalifont
│ │ │ ├── Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2
│ │ │ ├── Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2
│ │ │ ├── Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2
│ │ │ ├── Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2
│ │ │ ├── Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2
│ │ │ ├── Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2
│ │ │ ├── Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2
│ │ │ └── index.ts
│ │ ├── Fonts.ts
│ │ ├── Helvetica
│ │ │ └── index.ts
│ │ ├── Liberation
│ │ │ ├── LiberationSans-Regular.woff2
│ │ │ └── index.ts
│ │ ├── Lilita
│ │ │ ├── Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2
│ │ │ ├── Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2
│ │ │ └── index.ts
│ │ ├── Nunito
│ │ │ ├── Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2
│ │ │ ├── Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2
│ │ │ ├── Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2
│ │ │ ├── Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2
│ │ │ ├── Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2
│ │ │ └── index.ts
│ │ ├── Virgil
│ │ │ ├── Virgil-Regular.woff2
│ │ │ └── index.ts
│ │ ├── Xiaolai
│ │ │ ├── Xiaolai-Regular-019d66dcad46dc156b162d267f981c20.woff2
│ │ │ ├── Xiaolai-Regular-04b718e5623574919c8b0dea5f301444.woff2
│ │ │ ├── Xiaolai-Regular-069e77aac84590e2e991d0a0176d34f2.woff2
│ │ │ ├── Xiaolai-Regular-06c77b8c66e51ed6c63ccb502dd8b8af.woff2
│ │ │ ├── Xiaolai-Regular-08e0dc436ad0ad61ba5558db0674d762.woff2
│ │ │ ├── Xiaolai-Regular-093b9ef39a46ceae95a1df18a0a3a326.woff2
│ │ │ ├── Xiaolai-Regular-095c169f3314805276f603a362766abd.woff2
│ │ │ ├── Xiaolai-Regular-09850c4077f3fffe707905872e0e2460.woff2
│ │ │ ├── Xiaolai-Regular-0986d134c05864f5025962eef9f994a0.woff2
│ │ │ ├── Xiaolai-Regular-0b5d723fdc4e249c140f0909e87d03b4.woff2
│ │ │ ├── Xiaolai-Regular-0f626226ba1272e832aea87bafd9720e.woff2
│ │ │ ├── Xiaolai-Regular-0f7fb1e0d5015bb1371343153ecf7ce3.woff2
│ │ │ ├── Xiaolai-Regular-0fa55a080fcd0f9dc2e0b0058b793df8.woff2
│ │ │ ├── Xiaolai-Regular-0facdf1ea213ba40261022f5d5ed4493.woff2
│ │ │ ├── Xiaolai-Regular-10a7ae9a371830a80c3d844acf1c02d7.woff2
│ │ │ ├── Xiaolai-Regular-112c051027b2d766c19a519f6ee1f4f7.woff2
│ │ │ ├── Xiaolai-Regular-11c345711937f0ba4b8f7b6b919c8440.woff2
│ │ │ ├── Xiaolai-Regular-12b52b58eb3df36804b9a654ec9ee194.woff2
│ │ │ ├── Xiaolai-Regular-13ae07ed2e272d26d59bc0691cd7117a.woff2
│ │ │ ├── Xiaolai-Regular-13d2887ec8ee73c43acdabc52a05af7b.woff2
│ │ │ ├── Xiaolai-Regular-145aa02cdd91946e67dc934e1acffe75.woff2
│ │ │ ├── Xiaolai-Regular-15dc6d811c9cd078f9086a740d5a1038.woff2
│ │ │ ├── Xiaolai-Regular-173945821411c09f70c95f98d590e697.woff2
│ │ │ ├── Xiaolai-Regular-1b611157cd46bb184d4fa4dae2d6a2b8.woff2
│ │ │ ├── Xiaolai-Regular-1e6fd68f1f3902ce48ce8c69df385622.woff2
│ │ │ ├── Xiaolai-Regular-1ee544f0f1dac422545c505baa788992.woff2
│ │ │ ├── Xiaolai-Regular-1fdc0c67ed57263a80fd108c1f6ccf24.woff2
│ │ │ ├── Xiaolai-Regular-203b0e569e3b14aac86a003dc3fa523e.woff2
│ │ │ ├── Xiaolai-Regular-20cc1bbf50e7efb442756cb605672c1f.woff2
│ │ │ ├── Xiaolai-Regular-20e7bf72fa05de9adf7dbcc7bf51dde6.woff2
│ │ │ ├── Xiaolai-Regular-21430ee05a1248901da8d0de08744d47.woff2
│ │ │ ├── Xiaolai-Regular-23686f7f29da6e8008c36dd3a80c83d6.woff2
│ │ │ ├── Xiaolai-Regular-23ad2d71b280f00b1363b95b7bea94eb.woff2
│ │ │ ├── Xiaolai-Regular-23f228f3999c01983860012330e4be08.woff2
│ │ │ ├── Xiaolai-Regular-24476a126f129212beb33f66853ea151.woff2
│ │ │ ├── Xiaolai-Regular-24a21c1e4449222e8d1898d69ff3a404.woff2
│ │ │ ├── Xiaolai-Regular-25b7f38e18f035f96cb5e547bd2bd08c.woff2
│ │ │ ├── Xiaolai-Regular-29cec36cd205b211da97acabaa62f055.woff2
│ │ │ ├── Xiaolai-Regular-2a26d20a23b00898ce82f09d2ee47c3f.woff2
│ │ │ ├── Xiaolai-Regular-2adbc89c11e65905393d3dfc468b9d5b.woff2
│ │ │ ├── Xiaolai-Regular-2b7441d46298788ac94e610ffcc709b6.woff2
│ │ │ ├── Xiaolai-Regular-2b77e8ebfb2367ab2662396a60e7d320.woff2
│ │ │ ├── Xiaolai-Regular-2cf96d082d35ea3d8106851223ad0d16.woff2
│ │ │ ├── Xiaolai-Regular-2d43040e86ff03ba677f6f9c04cd0805.woff2
│ │ │ ├── Xiaolai-Regular-2e33e8dc771ef5e1d9127d60a6b73679.woff2
│ │ │ ├── Xiaolai-Regular-33432927cd87d40cfe393c7482bf221f.woff2
│ │ │ ├── Xiaolai-Regular-353f33792a8f60dc69323ddf635a269e.woff2
│ │ │ ├── Xiaolai-Regular-36925dfe329a45086cbb7fc5c20d45ac.woff2
│ │ │ ├── Xiaolai-Regular-3717077e38f98d89eae729b6c14e56dc.woff2
│ │ │ ├── Xiaolai-Regular-3756e81d3e149cf6099163ee79944fec.woff2
│ │ │ ├── Xiaolai-Regular-395c35dd584b56b0789f58a0559beaf1.woff2
│ │ │ ├── Xiaolai-Regular-3c9de2ae0ea4bc91a510942dfa4be8d2.woff2
│ │ │ ├── Xiaolai-Regular-3cc70dbb64df5b21f1326cc24dee2195.woff2
│ │ │ ├── Xiaolai-Regular-3e1f8f654357353bf0e04ba5c34b5f7f.woff2
│ │ │ ├── Xiaolai-Regular-3e63ed8162808a9e425ed80a8bc79114.woff2
│ │ │ ├── Xiaolai-Regular-3eaa538115d76932653c21d8dc28f207.woff2
│ │ │ ├── Xiaolai-Regular-4095eb84ef3874e2600247bee0b04026.woff2
│ │ │ ├── Xiaolai-Regular-41521fade99856108931b4768b1b2648.woff2
│ │ │ ├── Xiaolai-Regular-450da755d5bcb70906e1295e559b9602.woff2
│ │ │ ├── Xiaolai-Regular-452225341522a7942f0f6aab1a5c91a3.woff2
│ │ │ ├── Xiaolai-Regular-4535823663ad81405188a528d8f2b1a2.woff2
│ │ │ ├── Xiaolai-Regular-4806e761d750087c2d734fc64596eaff.woff2
│ │ │ ├── Xiaolai-Regular-4a0fdb40036e87b40aa08dd30584cb85.woff2
│ │ │ ├── Xiaolai-Regular-4a38cc3e9cf104e69ba246d37f8cf135.woff2
│ │ │ ├── Xiaolai-Regular-4aca6a43e59aceee2166b0c7e4e85ef1.woff2
│ │ │ ├── Xiaolai-Regular-4bfaa8ffa64c5ee560aa2daba7c9cbd3.woff2
│ │ │ ├── Xiaolai-Regular-4dc6d5f188d5c96d44815cd1e81aa885.woff2
│ │ │ ├── Xiaolai-Regular-4ddc14ed3eb0c3e46364317dfc0144a3.woff2
│ │ │ ├── Xiaolai-Regular-4ee10ae43505e2e0bc62656ced49c0fa.woff2
│ │ │ ├── Xiaolai-Regular-4f50e5136e136527280bc902c5817561.woff2
│ │ │ ├── Xiaolai-Regular-51502f1206be09c565f1547c406e9558.woff2
│ │ │ ├── Xiaolai-Regular-51a0e808bbc8361236ac521a119758a3.woff2
│ │ │ ├── Xiaolai-Regular-52a84a22fd1369bffeaf21da2d6158dc.woff2
│ │ │ ├── Xiaolai-Regular-5330a2119a716e4e7224ed108b085dac.woff2
│ │ │ ├── Xiaolai-Regular-543fa46ace099a7099dad69123399400.woff2
│ │ │ ├── Xiaolai-Regular-544fc28abe2c5c30e62383fd4dac255f.woff2
│ │ │ ├── Xiaolai-Regular-54acdfc2166ad7fcbd074f75fd4a56ba.woff2
│ │ │ ├── Xiaolai-Regular-5572b3513ba8df57a3d5d7303ee6b11b.woff2
│ │ │ ├── Xiaolai-Regular-56467a5c8840c4d23a60b2f935114848.woff2
│ │ │ ├── Xiaolai-Regular-56a32a7689abd0326e57c10c6c069bb4.woff2
│ │ │ ├── Xiaolai-Regular-57862b464a55b18c7bf234ce22907d73.woff2
│ │ │ ├── Xiaolai-Regular-583d166e56ba0de4b77eabb47ef67839.woff2
│ │ │ ├── Xiaolai-Regular-5882ffa04f32584d26109137e2da4352.woff2
│ │ │ ├── Xiaolai-Regular-58fd02350d0bc52cf1ca3bb32ce9766e.woff2
│ │ │ ├── Xiaolai-Regular-5935a5775af3d5c6307ac667bd9ae74e.woff2
│ │ │ ├── Xiaolai-Regular-59e9ff77b0efaf684bc09274fb6908c9.woff2
│ │ │ ├── Xiaolai-Regular-5a1ce3117cfe90c48e8fb4a9a00f694d.woff2
│ │ │ ├── Xiaolai-Regular-5a45d991244d4c7140217e1e5f5ca4f4.woff2
│ │ │ ├── Xiaolai-Regular-5a7fac4b8b23a6e4e5ba0c9bf1756c91.woff2
│ │ │ ├── Xiaolai-Regular-5b0ed6971aaab9c8ad563230bd5471a7.woff2
│ │ │ ├── Xiaolai-Regular-5d2898fbc097a7e24c6f38d80587621e.woff2
│ │ │ ├── Xiaolai-Regular-603aefd23e350ba7eb124273e3c9bcf1.woff2
│ │ │ ├── Xiaolai-Regular-60a3089806700d379f11827ee9843b6b.woff2
│ │ │ ├── Xiaolai-Regular-60a41c7e1c68f22424e6d22df544bc82.woff2
│ │ │ ├── Xiaolai-Regular-642b26e2e5f5fb780b51b593dbc8c851.woff2
│ │ │ ├── Xiaolai-Regular-66493ba5a8367f2928812f446f47b56a.woff2
│ │ │ ├── Xiaolai-Regular-670ba603758d94268e8606f240a42e12.woff2
│ │ │ ├── Xiaolai-Regular-671a2c20b1eb9e4ef8a192833940e319.woff2
│ │ │ ├── Xiaolai-Regular-684d65f1793cac449dde5d59cb3c47fb.woff2
│ │ │ ├── Xiaolai-Regular-69c09cc5fa3e55c74fc4821f76909cc3.woff2
│ │ │ ├── Xiaolai-Regular-6ae5b42180ad70b971c91e7eefb8eba2.woff2
│ │ │ ├── Xiaolai-Regular-6e092f71c1e634059ada0e52abadce67.woff2
│ │ │ ├── Xiaolai-Regular-6f3256af8454371776bc46670d33cc65.woff2
│ │ │ ├── Xiaolai-Regular-6fe5c5973cc06f74b2387a631ea36b88.woff2
│ │ │ ├── Xiaolai-Regular-70c2eb8d64e71a42a834eb857ea9df51.woff2
│ │ │ ├── Xiaolai-Regular-70e811fd7994e61f408c923de6ddd078.woff2
│ │ │ ├── Xiaolai-Regular-7197d6fda6cba7c3874c53d6381ca239.woff2
│ │ │ ├── Xiaolai-Regular-72252d73220fa3cd856677888cee1635.woff2
│ │ │ ├── Xiaolai-Regular-72536a3d71b694a0d53dd90ddceae41e.woff2
│ │ │ ├── Xiaolai-Regular-726303e0774b4e678bff8c2deb6ca603.woff2
│ │ │ ├── Xiaolai-Regular-733171b4ffcd17ea1fe1c0ba627173bf.woff2
│ │ │ ├── Xiaolai-Regular-739bc1a567439c7cffcd1614644593d2.woff2
│ │ │ ├── Xiaolai-Regular-73e309718fd16cea44b4d54a33581811.woff2
│ │ │ ├── Xiaolai-Regular-7494dc504ae00ee9cd0505f990f88c5d.woff2
│ │ │ ├── Xiaolai-Regular-74e2263a91439c25b91d5132ce9f4d62.woff2
│ │ │ ├── Xiaolai-Regular-761d05e3cd968cf574166867998ef06a.woff2
│ │ │ ├── Xiaolai-Regular-7718fe60986d8b42b1be9c5ace5ccf25.woff2
│ │ │ ├── Xiaolai-Regular-774d4f764a1299da5d28ec2f2ffe0d69.woff2
│ │ │ ├── Xiaolai-Regular-79d494361ae093b69e74ee9dbe65bfd4.woff2
│ │ │ ├── Xiaolai-Regular-79f007c1c6d07557120982951ea67998.woff2
│ │ │ ├── Xiaolai-Regular-7a07ddc0f0c0f5f4a9bad6ee3dda66b5.woff2
│ │ │ ├── Xiaolai-Regular-7ab2bed91166a9dca83a5ebfbe2a7f38.woff2
│ │ │ ├── Xiaolai-Regular-7ccce86603f80a099ddb0cb21d4ae3e3.woff2
│ │ │ ├── Xiaolai-Regular-7e4bde7e9c7f84cd34d8a845e384c746.woff2
│ │ │ ├── Xiaolai-Regular-7e929f262f30c8ee78bf398150b1a7cd.woff2
│ │ │ ├── Xiaolai-Regular-7eb9fffd1aa890d07d0f88cc82e6cfe4.woff2
│ │ │ ├── Xiaolai-Regular-7f855356ab893b0d2b9c1c83b8116f0e.woff2
│ │ │ ├── Xiaolai-Regular-829615148e6357d826b9242eb7fbbd1e.woff2
│ │ │ ├── Xiaolai-Regular-866fa7613df6b3fd272bcfd4530c0bb9.woff2
│ │ │ ├── Xiaolai-Regular-87599f94b6cc129d505b375798d0d751.woff2
│ │ │ ├── Xiaolai-Regular-8c2f33cee3993174f7e87c28e4bf42ee.woff2
│ │ │ ├── Xiaolai-Regular-8d3bcabb847b56243b16afe62adaaf21.woff2
│ │ │ ├── Xiaolai-Regular-8de5b863cb50dfefdd07cb11c774d579.woff2
│ │ │ ├── Xiaolai-Regular-8e9f97f01034820170065b2921b4fb5e.woff2
│ │ │ ├── Xiaolai-Regular-8f476c4c99813d57cbe6eca4727388ad.woff2
│ │ │ ├── Xiaolai-Regular-903bb6865f3452e2fda42e3a25547bc5.woff2
│ │ │ ├── Xiaolai-Regular-91ddb2969bf2d31ba02ad82998d1314c.woff2
│ │ │ ├── Xiaolai-Regular-938d90c10ff8c20386af7f242c05d6b0.woff2
│ │ │ ├── Xiaolai-Regular-93fc8f28a33234bcadf1527cafabd502.woff2
│ │ │ ├── Xiaolai-Regular-95429962233afd82db1c27df1500a28c.woff2
│ │ │ ├── Xiaolai-Regular-9544732d2e62d1a429674f8ee41b5d3a.woff2
│ │ │ ├── Xiaolai-Regular-9592bfc861f07bcb8d75c196b370e548.woff2
│ │ │ ├── Xiaolai-Regular-95bfd249da4902577b4b7d76ebdd0b44.woff2
│ │ │ ├── Xiaolai-Regular-968cffdc8ee679da094e77ebf50f58ef.woff2
│ │ │ ├── Xiaolai-Regular-97f7f48ce90c9429bf32ae51469db74d.woff2
│ │ │ ├── Xiaolai-Regular-982b630266d87db93d2539affb1275c6.woff2
│ │ │ ├── Xiaolai-Regular-98f2ad84457de7f3740d9920b8fa8667.woff2
│ │ │ ├── Xiaolai-Regular-99a16ef6a64934d5781933dbd9c46b2e.woff2
│ │ │ ├── Xiaolai-Regular-9cfb2a77a4e45025105ad29a1748b90d.woff2
│ │ │ ├── Xiaolai-Regular-9d81066dd2b337c938df6e90380a00dc.woff2
│ │ │ ├── Xiaolai-Regular-9eb5a99df4e76ac3363453ac9ca288b1.woff2
│ │ │ ├── Xiaolai-Regular-a004ddfcb26e67bd6e678c8ed19e25ce.woff2
│ │ │ ├── Xiaolai-Regular-a0ca5df4258213d7fc9fce80f65ce760.woff2
│ │ │ ├── Xiaolai-Regular-a1f916d6039285c4ffb900cd654e418f.woff2
│ │ │ ├── Xiaolai-Regular-a203b91dad570bf05a58c3c3ddb529bf.woff2
│ │ │ ├── Xiaolai-Regular-a365e82ed54697a52f27adcea1315fe8.woff2
│ │ │ ├── Xiaolai-Regular-a4c34be6d42152e64b0df90bc4607f64.woff2
│ │ │ ├── Xiaolai-Regular-a7accba310e821da5505f71c03b76bdb.woff2
│ │ │ ├── Xiaolai-Regular-aa0d470430e6391eca720c7cfa44446f.woff2
│ │ │ ├── Xiaolai-Regular-aa5c9ca6cf4fba00433b7aa3fa10671a.woff2
│ │ │ ├── Xiaolai-Regular-ac9ceb44437becc3e9c4dbfebab7fc2d.woff2
│ │ │ ├── Xiaolai-Regular-b1220a3c61f85cc0408deedb4c5f57a2.woff2
│ │ │ ├── Xiaolai-Regular-b358f7a51ece39a3247942b1feabdb29.woff2
│ │ │ ├── Xiaolai-Regular-b57aaedfd8ebdf3931f25119dc6a5eb2.woff2
│ │ │ ├── Xiaolai-Regular-b5c1596551c256e0e9cf02028595b092.woff2
│ │ │ ├── Xiaolai-Regular-b6d128682ee29e471486354d486a1b90.woff2
│ │ │ ├── Xiaolai-Regular-b6fd38ca30869792244804b04bc058da.woff2
│ │ │ ├── Xiaolai-Regular-b7d203b051eff504ff59ddca7576b6a9.woff2
│ │ │ ├── Xiaolai-Regular-b96d9226ce77ec94ceca043d712182e6.woff2
│ │ │ ├── Xiaolai-Regular-ba3de316d63c7e339987b16f41a0b879.woff2
│ │ │ ├── Xiaolai-Regular-bafff7a14c27403dcc6cf1432e8ea836.woff2
│ │ │ ├── Xiaolai-Regular-bd77e3c7f9e0b072d96af37f73d1aa32.woff2
│ │ │ ├── Xiaolai-Regular-be549ab72f0719d606a5c01e2c0219b6.woff2
│ │ │ ├── Xiaolai-Regular-c16ed9740b85badf16e86ea782a3062f.woff2
│ │ │ ├── Xiaolai-Regular-c1f94158256bb1f3bf665b053d895af9.woff2
│ │ │ ├── Xiaolai-Regular-c40533fdf4cc57177b12803598af7e59.woff2
│ │ │ ├── Xiaolai-Regular-c4a687ac4f0c2766eefc9f77ed99cddf.woff2
│ │ │ ├── Xiaolai-Regular-c69f61a4ab18d0488c8d1fc12e7028e8.woff2
│ │ │ ├── Xiaolai-Regular-c8b71798409ccc126ee264a00aadcf21.woff2
│ │ │ ├── Xiaolai-Regular-c99eda15fc26a2941579560f76c3a5cf.woff2
│ │ │ ├── Xiaolai-Regular-cb17fc3db95f6d139afc9d31a8e93293.woff2
│ │ │ ├── Xiaolai-Regular-cbaaefaaf326668277aa24dfa93c4d28.woff2
│ │ │ ├── Xiaolai-Regular-cd145ce4a0ea18469358df53c207bc1b.woff2
│ │ │ ├── Xiaolai-Regular-cdbce89e82cc1ab53a2decbf5819278f.woff2
│ │ │ ├── Xiaolai-Regular-ce4884f96f11589608b76b726a755803.woff2
│ │ │ ├── Xiaolai-Regular-cf2cc71752631e579e35b0e423bf2638.woff2
│ │ │ ├── Xiaolai-Regular-cf6ff4e0f491ca0cf3038187a997b9b4.woff2
│ │ │ ├── Xiaolai-Regular-cfb211578629b7e8153b37240de6a9d5.woff2
│ │ │ ├── Xiaolai-Regular-d0cf73942fea1c74edbdf0b3011f4656.woff2
│ │ │ ├── Xiaolai-Regular-d2666cbed13462c5dc36fa2f15c202ca.woff2
│ │ │ ├── Xiaolai-Regular-d3716376641d615e2995605b29bca7b6.woff2
│ │ │ ├── Xiaolai-Regular-dac48066b5883d8b4551fc584f0c2a3e.woff2
│ │ │ ├── Xiaolai-Regular-dbea1af6dcd9860be40c3d18254338f5.woff2
│ │ │ ├── Xiaolai-Regular-e11567fd2accf9957cd0d3c2be937d87.woff2
│ │ │ ├── Xiaolai-Regular-e2ead7ea7da0437f085f42ffc05f8d13.woff2
│ │ │ ├── Xiaolai-Regular-e3fcf5180fd466c8915c4e8069491054.woff2
│ │ │ ├── Xiaolai-Regular-e480d9c614742d05f0e78f274f1e69e6.woff2
│ │ │ ├── Xiaolai-Regular-e4bca6cfa53e499cae0a6be4894a90e9.woff2
│ │ │ ├── Xiaolai-Regular-e51ef413167c6e14e0c0fdcc585f2fc9.woff2
│ │ │ ├── Xiaolai-Regular-e5f453bb04da18eed01675eeebd88bf8.woff2
│ │ │ ├── Xiaolai-Regular-e656f091b9dc4709722c9f4b84d3c797.woff2
│ │ │ ├── Xiaolai-Regular-ec181b795ac1fb5a50d700b6e996d745.woff2
│ │ │ ├── Xiaolai-Regular-ee8bae97908d5147b423f77ad0d3c1bb.woff2
│ │ │ ├── Xiaolai-Regular-f0f13b5c60e0af5553bd359f5513be1b.woff2
│ │ │ ├── Xiaolai-Regular-f2b54d4e7be0eaefe1c2c56836fa5368.woff2
│ │ │ ├── Xiaolai-Regular-f56414bf9bced67990def8660e306759.woff2
│ │ │ ├── Xiaolai-Regular-f5d079153c99a25b9be5b8583c4cc8a7.woff2
│ │ │ ├── Xiaolai-Regular-f6032fc06eb20480f096199713f70885.woff2
│ │ │ ├── Xiaolai-Regular-f8ee5d36068a42b51d0e4a1116cfcec1.woff2
│ │ │ └── index.ts
│ │ ├── fonts.css
│ │ └── index.ts
│ ├── gesture.ts
│ ├── global.d.ts
│ ├── history.ts
│ ├── hooks
│ │ ├── useCallbackRefState.ts
│ │ ├── useCopiedIndicator.ts
│ │ ├── useCreatePortalContainer.ts
│ │ ├── useEmitter.ts
│ │ ├── useLibraryItemSvg.ts
│ │ ├── useOutsideClick.ts
│ │ ├── useScrollPosition.ts
│ │ ├── useStable.ts
│ │ ├── useStableCallback.ts
│ │ ├── useTextEditorFocus.ts
│ │ └── useTransition.ts
│ ├── i18n.ts
│ ├── index-node.ts
│ ├── index.tsx
│ ├── laser-trails.ts
│ ├── lasso
│ │ ├── index.ts
│ │ └── utils.ts
│ ├── locales
│ │ ├── README.md
│ │ ├── ar-SA.json
│ │ ├── az-AZ.json
│ │ ├── bg-BG.json
│ │ ├── bn-BD.json
│ │ ├── bn-IN.json
│ │ ├── ca-ES.json
│ │ ├── cs-CZ.json
│ │ ├── da-DK.json
│ │ ├── de-CH.json
│ │ ├── de-DE.json
│ │ ├── el-GR.json
│ │ ├── en.json
│ │ ├── es-ES.json
│ │ ├── eu-ES.json
│ │ ├── fa-IR.json
│ │ ├── fi-FI.json
│ │ ├── fr-FR.json
│ │ ├── gl-ES.json
│ │ ├── he-IL.json
│ │ ├── hi-IN.json
│ │ ├── hu-HU.json
│ │ ├── id-ID.json
│ │ ├── it-IT.json
│ │ ├── ja-JP.json
│ │ ├── kaa.json
│ │ ├── kab-KAB.json
│ │ ├── kk-KZ.json
│ │ ├── km-KH.json
│ │ ├── ko-KR.json
│ │ ├── ku-TR.json
│ │ ├── lt-LT.json
│ │ ├── lv-LV.json
│ │ ├── mr-IN.json
│ │ ├── my-MM.json
│ │ ├── nb-NO.json
│ │ ├── nl-NL.json
│ │ ├── nn-NO.json
│ │ ├── oc-FR.json
│ │ ├── pa-IN.json
│ │ ├── percentages.json
│ │ ├── pl-PL.json
│ │ ├── pt-BR.json
│ │ ├── pt-PT.json
│ │ ├── ro-RO.json
│ │ ├── ru-RU.json
│ │ ├── si-LK.json
│ │ ├── sk-SK.json
│ │ ├── sl-SI.json
│ │ ├── sv-SE.json
│ │ ├── ta-IN.json
│ │ ├── th-TH.json
│ │ ├── tr-TR.json
│ │ ├── uk-UA.json
│ │ ├── uz-UZ.json
│ │ ├── vi-VN.json
│ │ ├── zh-CN.json
│ │ ├── zh-HK.json
│ │ └── zh-TW.json
│ ├── mermaid.test.ts
│ ├── mermaid.ts
│ ├── package.json
│ ├── polyfill.ts
│ ├── pwacompat.d.ts
│ ├── react-app-env.d.ts
│ ├── reactUtils.ts
│ ├── renderer
│ │ ├── helpers.ts
│ │ ├── interactiveScene.ts
│ │ ├── renderNewElementScene.ts
│ │ ├── renderSnaps.ts
│ │ ├── roundRect.ts
│ │ ├── staticScene.ts
│ │ └── staticSvgScene.ts
│ ├── scene
│ │ ├── Renderer.ts
│ │ ├── export.ts
│ │ ├── index.ts
│ │ ├── normalize.ts
│ │ ├── scroll.ts
│ │ ├── scrollbars.ts
│ │ ├── types.ts
│ │ └── zoom.ts
│ ├── shortcut.ts
│ ├── snapping.ts
│ ├── subset
│ │ ├── harfbuzz
│ │ │ ├── harfbuzz-bindings.ts
│ │ │ ├── harfbuzz-loader.ts
│ │ │ └── harfbuzz-wasm.ts
│ │ ├── subset-main.ts
│ │ ├── subset-shared.chunk.ts
│ │ ├── subset-worker.chunk.ts
│ │ └── woff2
│ │ │ ├── woff2-bindings.ts
│ │ │ ├── woff2-loader.ts
│ │ │ └── woff2-wasm.ts
│ ├── tests
│ │ ├── App.test.tsx
│ │ ├── MermaidToExcalidraw.test.tsx
│ │ ├── __snapshots__
│ │ │ ├── App.test.tsx.snap
│ │ │ ├── MermaidToExcalidraw.test.tsx.snap
│ │ │ ├── MobileMenu.test.tsx.snap
│ │ │ ├── charts.test.tsx.snap
│ │ │ ├── contextmenu.test.tsx.snap
│ │ │ ├── dragCreate.test.tsx.snap
│ │ │ ├── excalidraw.test.tsx.snap
│ │ │ ├── export.test.tsx.snap
│ │ │ ├── history.test.tsx.snap
│ │ │ ├── move.test.tsx.snap
│ │ │ ├── multiPointCreate.test.tsx.snap
│ │ │ ├── regressionTests.test.tsx.snap
│ │ │ └── selection.test.tsx.snap
│ │ ├── actionStyles.test.tsx
│ │ ├── appState.test.tsx
│ │ ├── charts.test.tsx
│ │ ├── clients.test.ts
│ │ ├── clipboard.test.tsx
│ │ ├── contextmenu.test.tsx
│ │ ├── data
│ │ │ ├── __snapshots__
│ │ │ │ └── restore.test.ts.snap
│ │ │ ├── reconcile.test.ts
│ │ │ └── restore.test.ts
│ │ ├── dragCreate.test.tsx
│ │ ├── elementLocking.test.tsx
│ │ ├── excalidraw.test.tsx
│ │ ├── export.test.tsx
│ │ ├── fitToContent.test.tsx
│ │ ├── fixtures
│ │ │ ├── constants.ts
│ │ │ ├── deer.png
│ │ │ ├── diagramFixture.ts
│ │ │ ├── elementFixture.ts
│ │ │ ├── fixture_library.excalidrawlib
│ │ │ ├── smiley.png
│ │ │ ├── smiley_embedded_v2.png
│ │ │ ├── smiley_embedded_v2.svg
│ │ │ ├── svg-image-exporting-reference.svg
│ │ │ ├── test_embedded_v1.png
│ │ │ └── test_embedded_v1.svg
│ │ ├── flip.test.tsx
│ │ ├── helpers
│ │ │ ├── api.ts
│ │ │ ├── colorize.ts
│ │ │ ├── constants.ts
│ │ │ ├── mocks.ts
│ │ │ ├── polyfills.ts
│ │ │ └── ui.ts
│ │ ├── history.test.tsx
│ │ ├── image.test.tsx
│ │ ├── lasso.test.tsx
│ │ ├── library.test.tsx
│ │ ├── move.test.tsx
│ │ ├── multiPointCreate.test.tsx
│ │ ├── packages
│ │ │ ├── __snapshots__
│ │ │ │ ├── excalidraw.test.tsx.snap
│ │ │ │ └── utils.test.ts.snap
│ │ │ └── events.test.tsx
│ │ ├── queries
│ │ │ ├── dom.ts
│ │ │ └── toolQueries.ts
│ │ ├── regressionTests.test.tsx
│ │ ├── rotate.test.tsx
│ │ ├── scene
│ │ │ ├── __snapshots__
│ │ │ │ └── export.test.ts.snap
│ │ │ └── export.test.ts
│ │ ├── scroll.test.tsx
│ │ ├── search.test.tsx
│ │ ├── selection.test.tsx
│ │ ├── shortcuts.test.tsx
│ │ ├── test-utils.ts
│ │ ├── tool.test.tsx
│ │ └── viewMode.test.tsx
│ ├── tsconfig.json
│ ├── types.ts
│ ├── vite-env.d.ts
│ ├── workers.ts
│ └── wysiwyg
│ │ ├── textWysiwyg.test.tsx
│ │ └── textWysiwyg.tsx
├── math
│ ├── README.md
│ ├── global.d.ts
│ ├── package.json
│ ├── src
│ │ ├── angle.ts
│ │ ├── constants.ts
│ │ ├── curve.ts
│ │ ├── ellipse.ts
│ │ ├── index.ts
│ │ ├── line.ts
│ │ ├── point.ts
│ │ ├── polygon.ts
│ │ ├── range.ts
│ │ ├── rectangle.ts
│ │ ├── segment.ts
│ │ ├── triangle.ts
│ │ ├── types.ts
│ │ ├── utils.ts
│ │ └── vector.ts
│ ├── tests
│ │ ├── curve.test.ts
│ │ ├── ellipse.test.ts
│ │ ├── line.test.ts
│ │ ├── point.test.ts
│ │ ├── range.test.ts
│ │ ├── segment.test.ts
│ │ └── vector.test.ts
│ └── tsconfig.json
├── tsconfig.base.json
└── utils
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── global.d.ts
│ ├── package.json
│ ├── src
│ ├── bbox.ts
│ ├── export.ts
│ ├── index.ts
│ ├── shape.ts
│ ├── test-utils.ts
│ ├── visualdebug.ts
│ └── withinBounds.ts
│ ├── tests
│ ├── __snapshots__
│ │ ├── export.test.ts.snap
│ │ └── utils.test.ts.snap
│ ├── export.test.ts
│ ├── geometry.test.ts
│ ├── utils.unmocked.test.ts
│ └── withinBounds.test.ts
│ └── tsconfig.json
├── public
├── Assistant-Regular.woff2
├── Cascadia.woff2
├── Virgil.woff2
├── _headers
├── android-chrome-192x192.png
├── android-chrome-512x512.png
├── apple-touch-icon.png
├── favicon-16x16.png
├── favicon-32x32.png
├── favicon.ico
├── favicon.svg
├── maskable_icon_x192.png
├── maskable_icon_x512.png
├── og-image-3.png
├── oss_promo_comments_dark.jpg
├── oss_promo_comments_light.jpg
├── oss_promo_presentations_dark.svg
├── oss_promo_presentations_light.svg
├── robots.txt
├── screenshots
│ ├── collaboration.png
│ ├── export.png
│ ├── illustration.png
│ ├── shapes.png
│ ├── virtual-whiteboard.png
│ └── wireframe.png
└── service-worker.js
├── scripts
├── build-locales-coverage.js
├── build-node.js
├── build-version.js
├── buildBase.js
├── buildDocs.js
├── buildPackage.js
├── buildUtils.js
├── buildWasm.js
├── locales-coverage-description.js
├── release.js
├── updateChangelog.js
├── wasm
│ ├── hb-subset.wasm
│ └── woff2.wasm
└── woff2
│ ├── assets
│ ├── LiberationSans-Regular-2048.ttf
│ ├── LiberationSans-Regular.ttf
│ ├── NotoEmoji-Regular-2048.ttf
│ ├── NotoEmoji-Regular.ttf
│ └── Xiaolai-Regular.ttf
│ ├── woff2-esbuild-plugins.js
│ └── woff2-vite-plugins.js
├── setupTests.ts
├── tsconfig.json
├── vercel.json
├── vitest.config.mts
└── yarn.lock
/.codesandbox/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:18-bullseye
2 |
3 | # Vite wants to open the browser using `open`, so we
4 | # need to install those utils.
5 | RUN apt update -y && apt install -y xdg-utils
6 |
--------------------------------------------------------------------------------
/.dockerignore:
--------------------------------------------------------------------------------
1 | *
2 | !.env.development
3 | !.env.production
4 | !.eslintrc.json
5 | !.npmrc
6 | !.prettierrc
7 | !excalidraw-app/
8 | !package.json
9 | !public/
10 | !packages/
11 | !scripts/
12 | !tsconfig.json
13 | !yarn.lock
14 |
15 | # keep (sub)sub directories at the end to exclude from explicit included
16 | # e.g. ./packages/excalidraw/{dist,node_modules}
17 | **/build
18 | **/dist
19 | **/node_modules
20 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://EditorConfig.org
2 |
3 | # top-level EditorConfig file
4 | root = true
5 |
6 | [*]
7 | charset = utf-8
8 | end_of_line = lf
9 | indent_size = 2
10 | indent_style = space
11 | insert_final_newline = true
12 | trim_trailing_whitespace = true
13 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | build/
3 | package-lock.json
4 | .vscode/
5 | firebase/
6 | dist/
7 | public/workbox
8 | packages/excalidraw/types
9 | examples/**/public
10 | dev-dist
11 | coverage
12 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto eol=lf
2 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | open_collective: excalidraw
2 |
--------------------------------------------------------------------------------
/.github/workflows/autorelease-excalidraw.yml:
--------------------------------------------------------------------------------
1 | name: Auto release excalidraw next
2 | on:
3 | push:
4 | branches:
5 | - release
6 |
7 | jobs:
8 | Auto-release-excalidraw-next:
9 | runs-on: ubuntu-latest
10 |
11 | steps:
12 | - uses: actions/checkout@v2
13 | with:
14 | fetch-depth: 2
15 | - name: Setup Node.js 18.x
16 | uses: actions/setup-node@v2
17 | with:
18 | node-version: 18.x
19 | - name: Set up publish access
20 | run: |
21 | npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN}
22 | env:
23 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
24 | - name: Auto release
25 | run: |
26 | yarn add @actions/core -W
27 | yarn release --tag=next --non-interactive
28 |
--------------------------------------------------------------------------------
/.github/workflows/build-docker.yml:
--------------------------------------------------------------------------------
1 | name: Build Docker image
2 |
3 | on:
4 | push:
5 | branches:
6 | - release
7 |
8 | jobs:
9 | build-docker:
10 | runs-on: ubuntu-latest
11 | steps:
12 | - uses: actions/checkout@v2
13 | - run: docker build -t excalidraw .
14 |
--------------------------------------------------------------------------------
/.github/workflows/cancel.yml:
--------------------------------------------------------------------------------
1 | name: Cancel previous runs
2 |
3 | on:
4 | push:
5 | branches:
6 | - release
7 | pull_request:
8 |
9 | jobs:
10 | cancel:
11 | runs-on: ubuntu-latest
12 | timeout-minutes: 3
13 | steps:
14 | - uses: styfle/cancel-workflow-action@0.6.0
15 | with:
16 | workflow_id: 400555, 400556, 905313, 1451724, 1710116, 3185001, 3438604
17 | access_token: ${{ secrets.GITHUB_TOKEN }}
18 |
--------------------------------------------------------------------------------
/.github/workflows/lint.yml:
--------------------------------------------------------------------------------
1 | name: Lint
2 |
3 | on: pull_request
4 |
5 | jobs:
6 | lint:
7 | runs-on: ubuntu-latest
8 |
9 | steps:
10 | - uses: actions/checkout@v2
11 |
12 | - name: Setup Node.js 18.x
13 | uses: actions/setup-node@v2
14 | with:
15 | node-version: 18.x
16 |
17 | - name: Install and lint
18 | run: |
19 | yarn install
20 | yarn test:other
21 | yarn test:code
22 | yarn test:typecheck
23 |
--------------------------------------------------------------------------------
/.github/workflows/publish-docker.yml:
--------------------------------------------------------------------------------
1 | name: Publish Docker
2 |
3 | on:
4 | push:
5 | branches:
6 | - release
7 |
8 | jobs:
9 | publish-docker:
10 | runs-on: ubuntu-latest
11 |
12 | steps:
13 | - name: Checkout repository
14 | uses: actions/checkout@v3
15 | - name: Login to DockerHub
16 | uses: docker/login-action@v2
17 | with:
18 | username: ${{ secrets.DOCKER_USERNAME }}
19 | password: ${{ secrets.DOCKER_PASSWORD }}
20 | - name: Set up QEMU
21 | uses: docker/setup-qemu-action@v3
22 | - name: Set up Docker Buildx
23 | uses: docker/setup-buildx-action@v3
24 | - name: Build and push
25 | uses: docker/build-push-action@v5
26 | with:
27 | context: .
28 | push: true
29 | tags: excalidraw/excalidraw:latest
30 | platforms: linux/amd64, linux/arm64, linux/arm/v7
31 |
--------------------------------------------------------------------------------
/.github/workflows/semantic-pr-title.yml:
--------------------------------------------------------------------------------
1 | name: Semantic PR title
2 |
3 | on:
4 | pull_request:
5 | types:
6 | - opened
7 | - edited
8 | - synchronize
9 |
10 | jobs:
11 | semantic:
12 | runs-on: ubuntu-latest
13 | steps:
14 | - uses: amannn/action-semantic-pull-request@v5
15 | env:
16 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
17 |
--------------------------------------------------------------------------------
/.github/workflows/size-limit.yml:
--------------------------------------------------------------------------------
1 | name: "Bundle Size check @excalidraw/excalidraw"
2 | on:
3 | pull_request:
4 | branches:
5 | - master
6 | jobs:
7 | size:
8 | runs-on: ubuntu-latest
9 | env:
10 | CI_JOB_NUMBER: 1
11 | steps:
12 | - name: Checkout repository
13 | uses: actions/checkout@v3
14 | - name: Setup Node.js 18.x
15 | uses: actions/setup-node@v3
16 | with:
17 | node-version: 18.x
18 | - name: Install in packages/excalidraw
19 | run: yarn
20 | working-directory: packages/excalidraw
21 | env:
22 | CI: true
23 | - uses: andresz1/size-limit-action@v1
24 | with:
25 | github_token: ${{ secrets.GITHUB_TOKEN }}
26 | build_script: build:esm
27 | skip_step: install
28 | directory: packages/excalidraw
29 |
--------------------------------------------------------------------------------
/.github/workflows/test-coverage-pr.yml:
--------------------------------------------------------------------------------
1 | name: Test Coverage PR
2 | on:
3 | pull_request:
4 |
5 | jobs:
6 | coverage:
7 | runs-on: ubuntu-latest
8 | permissions:
9 | contents: read
10 | pull-requests: write
11 |
12 | steps:
13 | - uses: actions/checkout@v2
14 | - name: "Install Node"
15 | uses: actions/setup-node@v2
16 | with:
17 | node-version: "18.x"
18 | - name: "Install Deps"
19 | run: yarn install
20 | - name: "Test Coverage"
21 | run: yarn test:coverage
22 | - name: "Report Coverage"
23 | if: always() # Also generate the report if tests are failing
24 | uses: davelosert/vitest-coverage-report-action@v2
25 | with:
26 | github-token: ${{ secrets.GITHUB_TOKEN }}
27 |
--------------------------------------------------------------------------------
/.github/workflows/test.yml:
--------------------------------------------------------------------------------
1 | name: Tests
2 |
3 | on:
4 | push:
5 | branches: master
6 |
7 | jobs:
8 | test:
9 | runs-on: ubuntu-latest
10 | steps:
11 | - uses: actions/checkout@v4
12 | - name: Setup Node.js 18.x
13 | uses: actions/setup-node@v4
14 | with:
15 | node-version: 18.x
16 | - name: Install and test
17 | run: |
18 | yarn install
19 | yarn test:app
20 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .env.development.local
3 | .env.local
4 | .env.production.local
5 | .env.test.local
6 | .envrc
7 | .eslintcache
8 | .history
9 | .idea
10 | .vercel
11 | .vscode
12 | .yarn
13 | *.log
14 | *.tgz
15 | build
16 | dist
17 | firebase
18 | logs
19 | node_modules
20 | npm-debug.log*
21 | package-lock.json
22 | yarn-debug.log*
23 | yarn-error.log*
24 | packages/excalidraw/types
25 | coverage
26 | dev-dist
27 | html
28 | meta*.json
29 | .claude
30 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | # yarn lint-staged
3 |
--------------------------------------------------------------------------------
/.lintstagedrc.js:
--------------------------------------------------------------------------------
1 | const { CLIEngine } = require("eslint");
2 |
3 | // see https://github.com/okonet/lint-staged#how-can-i-ignore-files-from-eslintignore-
4 | // for explanation
5 | const cli = new CLIEngine({});
6 |
7 | module.exports = {
8 | "*.{js,ts,tsx}": files => {
9 | return (
10 | "eslint --max-warnings=0 --fix " + files.filter(file => !cli.isPathIgnored(file)).join(" ")
11 | );
12 | },
13 | "*.{css,scss,json,md,html,yml}": ["prettier --write"],
14 | };
15 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | save-exact=true
2 | legacy-peer-deps=true
3 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/.prettierignore
--------------------------------------------------------------------------------
/.watchmanconfig:
--------------------------------------------------------------------------------
1 | {}
2 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | Head over to the [docs](https://docs.excalidraw.com/docs/introduction/contributing)
4 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM --platform=${BUILDPLATFORM} node:18 AS build
2 |
3 | WORKDIR /opt/node_app
4 |
5 | COPY . .
6 |
7 | # do not ignore optional dependencies:
8 | # Error: Cannot find module @rollup/rollup-linux-x64-gnu
9 | RUN --mount=type=cache,target=/root/.cache/yarn \
10 | npm_config_target_arch=${TARGETARCH} yarn --network-timeout 600000
11 |
12 | ARG NODE_ENV=production
13 |
14 | RUN npm_config_target_arch=${TARGETARCH} yarn build:app:docker
15 |
16 | FROM --platform=${TARGETPLATFORM} nginx:1.27-alpine
17 |
18 | COPY --from=build /opt/node_app/excalidraw-app/build /usr/share/nginx/html
19 |
20 | HEALTHCHECK CMD wget -q -O /dev/null http://localhost || exit 1
21 |
--------------------------------------------------------------------------------
/crowdin.yml:
--------------------------------------------------------------------------------
1 | files:
2 | - source: /packages/excalidraw/locales/en.json
3 | translation: /packages/excalidraw/locales/%locale%.json
4 |
--------------------------------------------------------------------------------
/dev-docs/.gitignore:
--------------------------------------------------------------------------------
1 | # Dependencies
2 | /node_modules
3 |
4 | # Production
5 | /build
6 |
7 | # Generated files
8 | .docusaurus
9 | .cache-loader
10 |
11 | # Misc
12 | .DS_Store
13 | .env.local
14 | .env.development.local
15 | .env.test.local
16 | .env.production.local
17 |
18 | npm-debug.log*
19 | yarn-debug.log*
20 | yarn-error.log*
21 |
--------------------------------------------------------------------------------
/dev-docs/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [require.resolve("@docusaurus/core/lib/babel/preset")],
3 | };
4 |
--------------------------------------------------------------------------------
/dev-docs/docs/@excalidraw/excalidraw/api/api-intro.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | slug: /@excalidraw/excalidraw/api
3 | ---
4 |
5 | # API
6 |
7 | Currently the **API** is divided into 3 broad categories 👇
8 |
9 | - [Props](/docs/@excalidraw/excalidraw/api/props) - The `props` you can pass to the `Excalidraw` component.
10 | - [Children components](/docs/@excalidraw/excalidraw/api/children-components) - Official components you can use to customize the UI.
11 | - [Utils](/docs/@excalidraw/excalidraw/api/utils) - Utilities and helpers you can use to export, restore and more.
12 |
--------------------------------------------------------------------------------
/dev-docs/docs/@excalidraw/mermaid-to-excalidraw/codebase/codebase.mdx:
--------------------------------------------------------------------------------
1 | # Codebase
2 |
3 | The Codebase is divided into 2 Sections
4 |
5 | * [How Parser Works under the hood](/docs/@excalidraw/mermaid-to-excalidraw/codebase/parser) - If you are interested in understanding and deep diving into inner workings of the Parser, then make sure to checkout this section.
6 |
7 | * [Adding a new diagram type](/docs/@excalidraw/mermaid-to-excalidraw/codebase/new-diagram-type) - If you want to help us make the mermaid to Excalidraw Parser more powerful, you will find all information in this section to do so.
8 |
--------------------------------------------------------------------------------
/dev-docs/docs/assets/aggressive-block-fingerprint.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/dev-docs/docs/assets/aggressive-block-fingerprint.png
--------------------------------------------------------------------------------
/dev-docs/docs/assets/block-fingerprint.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/dev-docs/docs/assets/block-fingerprint.png
--------------------------------------------------------------------------------
/dev-docs/docs/assets/brave-shield.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/dev-docs/docs/assets/brave-shield.png
--------------------------------------------------------------------------------
/dev-docs/docs/assets/nerd-stats.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/dev-docs/docs/assets/nerd-stats.png
--------------------------------------------------------------------------------
/dev-docs/docs/codebase/frames.mdx:
--------------------------------------------------------------------------------
1 | # Frames
2 |
3 | ## Ordering
4 |
5 | Frames should be ordered where frame children come first, followed by the frame element itself:
6 |
7 | ```
8 | [
9 | other_element,
10 | frame1_child1,
11 | frame1_child2,
12 | frame1,
13 | other_element,
14 | frame2_child1,
15 | frame2_child2,
16 | frame2,
17 | other_element,
18 | ...
19 | ]
20 | ```
21 |
22 | If not ordered correctly, the editor will still function, but the elements may not be rendered and clipped correctly. Further, the renderer relies on this ordering for performance optimizations.
23 |
--------------------------------------------------------------------------------
/dev-docs/docs/introduction/get-started.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Introduction
3 | slug: ../
4 | ---
5 |
6 | ## Try now
7 |
8 | Go to [excalidraw.com](https://excalidraw.com) to start sketching.
9 |
10 | ## How are these docs structured
11 |
12 | These docs are focused on developers, and structured in the following way:
13 |
14 | - [Introduction](/docs/) — development setup and introduction.
15 | - [@excalidraw/excalidraw](/docs/@excalidraw/excalidraw/installation) — docs for the npm package to help you integrate Excalidraw into your own app.
16 | - Editor — IN PROGRESS. Docs describing the internals of the Excalidraw editor to help in contributing to the codebase.
17 | - [@excalidraw/mermaid-to-excalidraw](/docs/@excalidraw/mermaid-to-excalidraw/installation) - Docs for the mermaid to excalidraw parser
18 |
--------------------------------------------------------------------------------
/dev-docs/src/components/Highlight.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | export default function Highlight({ children }) {
3 | return (
4 | <span
5 | style={{
6 | backgroundColor: "#7874e8",
7 | borderRadius: "2px",
8 | color: "#fff",
9 | padding: "0.2rem",
10 | }}
11 | >
12 | {children}
13 | </span>
14 | );
15 | }
16 |
--------------------------------------------------------------------------------
/dev-docs/src/components/Homepage/styles.module.css:
--------------------------------------------------------------------------------
1 | .features {
2 | display: flex;
3 | align-items: center;
4 | padding: 2rem 0;
5 | width: 100%;
6 | }
7 |
8 | .featureSvg {
9 | height: 200px;
10 | width: 200px;
11 | }
12 |
--------------------------------------------------------------------------------
/dev-docs/src/pages/index.module.css:
--------------------------------------------------------------------------------
1 | /**
2 | * CSS files with the .module.css suffix will be treated as CSS modules
3 | * and scoped locally.
4 | */
5 |
6 | .heroBanner {
7 | padding: 4rem 0;
8 | text-align: center;
9 | position: relative;
10 | overflow: hidden;
11 | }
12 |
13 | [data-theme="dark"] .heroBanner {
14 | color: #fff;
15 | }
16 |
17 | @media screen and (max-width: 996px) {
18 | .heroBanner {
19 | padding: 2rem;
20 | }
21 | }
22 |
23 | .buttons {
24 | display: flex;
25 | align-items: center;
26 | justify-content: center;
27 | }
28 |
--------------------------------------------------------------------------------
/dev-docs/src/pages/markdown-page.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Markdown page example
3 | ---
4 |
5 | # Markdown page example
6 |
7 | You don't need React to write simple standalone pages.
8 |
--------------------------------------------------------------------------------
/dev-docs/src/theme/MDXComponents.js:
--------------------------------------------------------------------------------
1 | // Import the original mapper
2 | import Highlight from "@site/src/components/Highlight";
3 | import MDXComponents from "@theme-original/MDXComponents";
4 |
5 | export default {
6 | // Re-use the default mapping
7 | ...MDXComponents,
8 | // Map the "highlight" tag to our <Highlight /> component!
9 | // `Highlight` will receive all props that were passed to `highlight` in MDX
10 | highlight: Highlight,
11 | };
12 |
--------------------------------------------------------------------------------
/dev-docs/static/.nojekyll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/dev-docs/static/.nojekyll
--------------------------------------------------------------------------------
/dev-docs/static/img/docusaurus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/dev-docs/static/img/docusaurus.png
--------------------------------------------------------------------------------
/dev-docs/static/img/doremon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/dev-docs/static/img/doremon.png
--------------------------------------------------------------------------------
/dev-docs/static/img/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/dev-docs/static/img/favicon.ico
--------------------------------------------------------------------------------
/dev-docs/static/img/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/dev-docs/static/img/favicon.png
--------------------------------------------------------------------------------
/dev-docs/static/img/og-image-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/dev-docs/static/img/og-image-2.png
--------------------------------------------------------------------------------
/dev-docs/static/img/og-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/dev-docs/static/img/og-image.png
--------------------------------------------------------------------------------
/dev-docs/static/img/pika.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/dev-docs/static/img/pika.jpeg
--------------------------------------------------------------------------------
/dev-docs/static/img/welcome-screen-overview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/dev-docs/static/img/welcome-screen-overview.png
--------------------------------------------------------------------------------
/dev-docs/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | // This file is not used in compilation. It is here just for a nice editor experience.
3 | "extends": "@tsconfig/docusaurus/tsconfig.json",
4 | "compilerOptions": {
5 | "baseUrl": "."
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/dev-docs/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "outputDirectory": "build",
3 | "installCommand": "yarn install"
4 | }
5 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | services:
2 | excalidraw:
3 | build:
4 | context: .
5 | args:
6 | - NODE_ENV=development
7 | container_name: excalidraw
8 | ports:
9 | - "3000:80"
10 | restart: on-failure
11 | stdin_open: true
12 | healthcheck:
13 | disable: true
14 | environment:
15 | - NODE_ENV=development
16 | volumes:
17 | - ./:/opt/node_app/app:delegated
18 | - ./package.json:/opt/node_app/package.json
19 | - ./yarn.lock:/opt/node_app/yarn.lock
20 | - notused:/opt/node_app/app/node_modules
21 |
22 | volumes:
23 | notused:
24 |
--------------------------------------------------------------------------------
/examples/with-nextjs/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 | .yarn/install-state.gz
8 |
9 | # testing
10 | /coverage
11 |
12 | # next.js
13 | /.next/
14 | /out/
15 |
16 | # production
17 | /build
18 |
19 | # misc
20 | .DS_Store
21 | *.pem
22 |
23 | # debug
24 | npm-debug.log*
25 | yarn-debug.log*
26 | yarn-error.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
34 | # typescript
35 | *.tsbuildinfo
36 | next-env.d.ts
37 |
38 | # copied assets
39 | public/**/*.woff2
--------------------------------------------------------------------------------
/examples/with-nextjs/next.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 | distDir: "build",
4 | typescript: {
5 | // The ts config doesn't work with `jsx: preserve" and if updated to `react-jsx` it gets ovewritten by next js throwing ts errors hence I am ignoring build errors until this is fixed.
6 | ignoreBuildErrors: true,
7 | },
8 | // This is needed as in pages router the code for importing types throws error as its outside next js app
9 | transpilePackages: ["../"],
10 | };
11 |
12 | module.exports = nextConfig;
13 |
--------------------------------------------------------------------------------
/examples/with-nextjs/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "with-nextjs",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "build:packages": "yarn --cwd ../../ build:packages",
7 | "build:workspace": "yarn build:packages && yarn copy:assets",
8 | "copy:assets": "cp -r ../../packages/excalidraw/dist/prod/fonts ./public",
9 | "dev": "yarn build:workspace && next dev -p 3005",
10 | "build": "yarn build:workspace && next build",
11 | "start": "next start -p 3006",
12 | "lint": "next lint"
13 | },
14 | "dependencies": {
15 | "next": "14.1",
16 | "react": "19.0.0",
17 | "react-dom": "19.0.0"
18 | },
19 | "devDependencies": {
20 | "@types/node": "^20",
21 | "@types/react": "19.0.10",
22 | "@types/react-dom": "19.0.4",
23 | "path2d-polyfill": "2.0.1",
24 | "typescript": "^5"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/examples/with-nextjs/public/images/doremon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/examples/with-nextjs/public/images/doremon.png
--------------------------------------------------------------------------------
/examples/with-nextjs/public/images/excalibot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/examples/with-nextjs/public/images/excalibot.png
--------------------------------------------------------------------------------
/examples/with-nextjs/public/images/pika.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/examples/with-nextjs/public/images/pika.jpeg
--------------------------------------------------------------------------------
/examples/with-nextjs/public/images/rocket.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/examples/with-nextjs/public/images/rocket.jpeg
--------------------------------------------------------------------------------
/examples/with-nextjs/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/examples/with-nextjs/src/app/favicon.ico
--------------------------------------------------------------------------------
/examples/with-nextjs/src/app/layout.tsx:
--------------------------------------------------------------------------------
1 | export default function RootLayout({
2 | children,
3 | }: {
4 | children: React.ReactNode;
5 | }) {
6 | return (
7 | <html lang="en">
8 | <body>{children}</body>
9 | </html>
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/examples/with-nextjs/src/app/page.tsx:
--------------------------------------------------------------------------------
1 | import dynamic from "next/dynamic";
2 | import Script from "next/script";
3 |
4 | import "../common.scss";
5 |
6 | // Since client components get prerenderd on server as well hence importing the excalidraw stuff dynamically
7 | // with ssr false
8 | const ExcalidrawWithClientOnly = dynamic(
9 | async () => (await import("../excalidrawWrapper")).default,
10 | {
11 | ssr: false,
12 | },
13 | );
14 |
15 | export default function Page() {
16 | return (
17 | <>
18 | <a href="/excalidraw-in-pages">Switch to Pages router</a>
19 | <h1 className="page-title">App Router</h1>
20 | <Script id="load-env-variables" strategy="beforeInteractive">
21 | {`window["EXCALIDRAW_ASSET_PATH"] = window.origin;`}
22 | </Script>
23 | {/* @ts-expect-error - https://github.com/vercel/next.js/issues/42292 */}
24 | <ExcalidrawWithClientOnly />
25 | </>
26 | );
27 | }
28 |
--------------------------------------------------------------------------------
/examples/with-nextjs/src/common.scss:
--------------------------------------------------------------------------------
1 | * {
2 | box-sizing: border-box;
3 | font-family: sans-serif;
4 | }
5 |
6 | a {
7 | color: #1c7ed6;
8 | font-size: 20px;
9 | text-decoration: none;
10 | font-weight: 500;
11 | }
12 |
13 | .page-title {
14 | text-align: center;
15 | }
16 |
--------------------------------------------------------------------------------
/examples/with-nextjs/src/excalidrawWrapper.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import * as excalidrawLib from "@excalidraw/excalidraw";
3 | import { Excalidraw } from "@excalidraw/excalidraw";
4 |
5 | import "@excalidraw/excalidraw/index.css";
6 |
7 | import App from "../../with-script-in-browser/components/ExampleApp";
8 |
9 | const ExcalidrawWrapper: React.FC = () => {
10 | return (
11 | <>
12 | <App
13 | appTitle={"Excalidraw with Nextjs Example"}
14 | useCustom={(api: any, args?: any[]) => {}}
15 | excalidrawLib={excalidrawLib}
16 | >
17 | <Excalidraw />
18 | </App>
19 | </>
20 | );
21 | };
22 |
23 | export default ExcalidrawWrapper;
24 |
--------------------------------------------------------------------------------
/examples/with-nextjs/src/pages/excalidraw-in-pages.tsx:
--------------------------------------------------------------------------------
1 | import dynamic from "next/dynamic";
2 |
3 | import "../common.scss";
4 |
5 | // Since client components get prerenderd on server as well hence importing the excalidraw stuff dynamically
6 | // with ssr false
7 | const Excalidraw = dynamic(
8 | async () => (await import("../excalidrawWrapper")).default,
9 | {
10 | ssr: false,
11 | },
12 | );
13 |
14 | export default function Page() {
15 | return (
16 | <>
17 | <a href="/">Switch to App router</a>
18 | <h1 className="page-title">Pages Router</h1>
19 | {/* @ts-expect-error - https://github.com/vercel/next.js/issues/42292 */}
20 | <Excalidraw />
21 | </>
22 | );
23 | }
24 |
--------------------------------------------------------------------------------
/examples/with-nextjs/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "noEmit": true,
9 | "esModuleInterop": true,
10 | "module": "esnext",
11 | "moduleResolution": "node",
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "jsx": "preserve",
15 | "incremental": true,
16 | "plugins": [
17 | {
18 | "name": "next"
19 | }
20 | ],
21 | "paths": {
22 | "@/*": ["./src/*"]
23 | },
24 | "forceConsistentCasingInFileNames": true
25 | },
26 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "build/types/**/*.ts"],
27 | "exclude": ["node_modules"]
28 | }
29 |
--------------------------------------------------------------------------------
/examples/with-nextjs/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "outputDirectory": "build"
3 | }
4 |
--------------------------------------------------------------------------------
/examples/with-script-in-browser/.codesandbox/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:18-bullseye
2 |
3 | # Vite wants to open the browser using `open`, so we
4 | # need to install those utils.
5 | RUN apt update -y && apt install -y xdg-utils
6 |
--------------------------------------------------------------------------------
/examples/with-script-in-browser/.gitignore:
--------------------------------------------------------------------------------
1 | # copied assets
2 | public/**/*.woff2
--------------------------------------------------------------------------------
/examples/with-script-in-browser/components/MobileFooter.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | import type * as TExcalidraw from "@excalidraw/excalidraw";
4 | import type { ExcalidrawImperativeAPI } from "@excalidraw/excalidraw/types";
5 |
6 | import CustomFooter from "./CustomFooter";
7 |
8 | const MobileFooter = ({
9 | excalidrawAPI,
10 | excalidrawLib,
11 | }: {
12 | excalidrawAPI: ExcalidrawImperativeAPI;
13 | excalidrawLib: typeof TExcalidraw;
14 | }) => {
15 | const { useEditorInterface, Footer } = excalidrawLib;
16 |
17 | const editorInterface = useEditorInterface();
18 | if (editorInterface.formFactor === "phone") {
19 | return (
20 | <Footer>
21 | <CustomFooter
22 | excalidrawAPI={excalidrawAPI}
23 | excalidrawLib={excalidrawLib}
24 | />
25 | </Footer>
26 | );
27 | }
28 | return null;
29 | };
30 | export default MobileFooter;
31 |
--------------------------------------------------------------------------------
/examples/with-script-in-browser/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { StrictMode } from "react";
2 | import { createRoot } from "react-dom/client";
3 |
4 | import "@excalidraw/excalidraw/index.css";
5 |
6 | import type * as TExcalidraw from "@excalidraw/excalidraw";
7 |
8 | import App from "./components/ExampleApp";
9 |
10 | declare global {
11 | interface Window {
12 | ExcalidrawLib: typeof TExcalidraw;
13 | }
14 | }
15 |
16 | const rootElement = document.getElementById("root")!;
17 | const root = createRoot(rootElement);
18 | const { Excalidraw } = window.ExcalidrawLib;
19 | root.render(
20 | <StrictMode>
21 | <App
22 | appTitle={"Excalidraw Example"}
23 | useCustom={(api: any, args?: any[]) => {}}
24 | excalidrawLib={window.ExcalidrawLib}
25 | >
26 | <Excalidraw />
27 | </App>
28 | </StrictMode>,
29 | );
30 |
--------------------------------------------------------------------------------
/examples/with-script-in-browser/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "with-script-in-browser",
3 | "version": "1.0.0",
4 | "private": true,
5 | "dependencies": {
6 | "react": "19.0.0",
7 | "react-dom": "19.0.0",
8 | "@excalidraw/excalidraw": "*",
9 | "browser-fs-access": "0.29.1"
10 | },
11 | "devDependencies": {
12 | "vite": "5.0.12",
13 | "typescript": "^5"
14 | },
15 | "scripts": {
16 | "start": "vite",
17 | "build": "vite build",
18 | "preview": "vite preview --port 5002",
19 | "build:preview": "yarn build && yarn preview",
20 | "build:packages": "yarn --cwd ../../ build:packages"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/examples/with-script-in-browser/public/images/doremon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/examples/with-script-in-browser/public/images/doremon.png
--------------------------------------------------------------------------------
/examples/with-script-in-browser/public/images/excalibot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/examples/with-script-in-browser/public/images/excalibot.png
--------------------------------------------------------------------------------
/examples/with-script-in-browser/public/images/pika.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/examples/with-script-in-browser/public/images/pika.jpeg
--------------------------------------------------------------------------------
/examples/with-script-in-browser/public/images/rocket.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/examples/with-script-in-browser/public/images/rocket.jpeg
--------------------------------------------------------------------------------
/examples/with-script-in-browser/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "ES2022",
4 | "moduleResolution": "Bundler",
5 | "lib": ["ESNext", "DOM", "DOM.Iterable"],
6 | "jsx": "react-jsx",
7 | "skipLibCheck": true
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/examples/with-script-in-browser/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "outputDirectory": "dist",
3 | "installCommand": "yarn install",
4 | "buildCommand": "yarn build:packages && yarn build"
5 | }
6 |
--------------------------------------------------------------------------------
/examples/with-script-in-browser/vite.config.mts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vite";
2 |
3 | // https://vitejs.dev/config/
4 | export default defineConfig({
5 | server: {
6 | port: 3001,
7 | // open the browser
8 | open: true,
9 | },
10 | publicDir: "public",
11 | optimizeDeps: {
12 | esbuildOptions: {
13 | // Bumping to 2022 due to "Arbitrary module namespace identifier names" not being
14 | // supported in Vite's default browser target https://github.com/vitejs/vite/issues/13556
15 | target: "es2022",
16 | treeShaking: true,
17 | },
18 | },
19 | });
20 |
--------------------------------------------------------------------------------
/excalidraw-app/app-language/LanguageList.tsx:
--------------------------------------------------------------------------------
1 | import { useI18n, languages } from "@excalidraw/excalidraw/i18n";
2 | import React from "react";
3 |
4 | import { useSetAtom } from "../app-jotai";
5 |
6 | import { appLangCodeAtom } from "./language-state";
7 |
8 | export const LanguageList = ({ style }: { style?: React.CSSProperties }) => {
9 | const { t, langCode } = useI18n();
10 | const setLangCode = useSetAtom(appLangCodeAtom);
11 |
12 | return (
13 | <select
14 | className="dropdown-select dropdown-select__language"
15 | onChange={({ target }) => setLangCode(target.value)}
16 | value={langCode}
17 | aria-label={t("buttons.selectLanguage")}
18 | style={style}
19 | >
20 | {languages.map((lang) => (
21 | <option key={lang.code} value={lang.code}>
22 | {lang.label}
23 | </option>
24 | ))}
25 | </select>
26 | );
27 | };
28 |
--------------------------------------------------------------------------------
/excalidraw-app/app-language/language-detector.ts:
--------------------------------------------------------------------------------
1 | import { defaultLang, languages } from "@excalidraw/excalidraw";
2 | import LanguageDetector from "i18next-browser-languagedetector";
3 |
4 | export const languageDetector = new LanguageDetector();
5 |
6 | languageDetector.init({
7 | languageUtils: {},
8 | });
9 |
10 | export const getPreferredLanguage = () => {
11 | const detectedLanguages = languageDetector.detect();
12 |
13 | const detectedLanguage = Array.isArray(detectedLanguages)
14 | ? detectedLanguages[0]
15 | : detectedLanguages;
16 |
17 | const initialLanguage =
18 | (detectedLanguage
19 | ? // region code may not be defined if user uses generic preferred language
20 | // (e.g. chinese vs instead of chinese-simplified)
21 | languages.find((lang) => lang.code.startsWith(detectedLanguage))?.code
22 | : null) || defaultLang.code;
23 |
24 | return initialLanguage;
25 | };
26 |
--------------------------------------------------------------------------------
/excalidraw-app/app-language/language-state.ts:
--------------------------------------------------------------------------------
1 | import { useEffect } from "react";
2 |
3 | import { atom, useAtom } from "../app-jotai";
4 |
5 | import { getPreferredLanguage, languageDetector } from "./language-detector";
6 |
7 | export const appLangCodeAtom = atom(getPreferredLanguage());
8 |
9 | export const useAppLangCode = () => {
10 | const [langCode, setLangCode] = useAtom(appLangCodeAtom);
11 |
12 | useEffect(() => {
13 | languageDetector.cacheUserLanguage(langCode);
14 | }, [langCode]);
15 |
16 | return [langCode, setLangCode] as const;
17 | };
18 |
--------------------------------------------------------------------------------
/excalidraw-app/bug-issue-template.js:
--------------------------------------------------------------------------------
1 | export default (sentryErrorId) => `
2 | ### Scene content
3 |
4 | \`\`\`
5 | Paste scene content here
6 | \`\`\`
7 |
8 | ### Sentry Error ID
9 |
10 | ${sentryErrorId}
11 | `;
12 |
--------------------------------------------------------------------------------
/excalidraw-app/collab/CollabError.scss:
--------------------------------------------------------------------------------
1 | @import "../../packages/excalidraw/css/variables.module.scss";
2 |
3 | .excalidraw {
4 | .collab-errors-button {
5 | width: 26px;
6 | height: 26px;
7 | margin-inline-end: 1rem;
8 |
9 | color: var(--color-danger);
10 |
11 | flex-shrink: 0;
12 | }
13 |
14 | .collab-errors-button-shake {
15 | animation: strong-shake 0.15s 6;
16 | }
17 |
18 | @keyframes strong-shake {
19 | 0% {
20 | transform: rotate(0deg);
21 | }
22 | 25% {
23 | transform: rotate(10deg);
24 | }
25 | 50% {
26 | transform: rotate(0deg);
27 | }
28 | 75% {
29 | transform: rotate(-10deg);
30 | }
31 | 100% {
32 | transform: rotate(0deg);
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/excalidraw-app/components/AppFooter.tsx:
--------------------------------------------------------------------------------
1 | import { Footer } from "@excalidraw/excalidraw/index";
2 | import React from "react";
3 |
4 | import { isExcalidrawPlusSignedUser } from "../app_constants";
5 |
6 | import { DebugFooter, isVisualDebuggerEnabled } from "./DebugCanvas";
7 | import { EncryptedIcon } from "./EncryptedIcon";
8 |
9 | export const AppFooter = React.memo(
10 | ({ onChange }: { onChange: () => void }) => {
11 | return (
12 | <Footer>
13 | <div
14 | style={{
15 | display: "flex",
16 | gap: ".5rem",
17 | alignItems: "center",
18 | }}
19 | >
20 | {isVisualDebuggerEnabled() && <DebugFooter onChange={onChange} />}
21 | {!isExcalidrawPlusSignedUser && <EncryptedIcon />}
22 | </div>
23 | </Footer>
24 | );
25 | },
26 | );
27 |
--------------------------------------------------------------------------------
/excalidraw-app/components/AppSidebar.scss:
--------------------------------------------------------------------------------
1 | .excalidraw {
2 | .app-sidebar-promo-container {
3 | padding: 0.75rem;
4 | display: flex;
5 | flex-direction: column;
6 | text-align: center;
7 | gap: 1rem;
8 | flex: 1 1 auto;
9 | }
10 |
11 | .app-sidebar-promo-image {
12 | margin: 1rem 0;
13 |
14 | height: 16.25rem;
15 | background-size: contain;
16 | background-position: center;
17 | background-repeat: no-repeat;
18 |
19 | background-image: radial-gradient(
20 | circle,
21 | transparent 60%,
22 | var(--sidebar-bg-color) 100%
23 | ),
24 | var(--image-source);
25 |
26 | display: flex;
27 | }
28 |
29 | .app-sidebar-promo-text {
30 | padding: 0 2rem;
31 | }
32 |
33 | .link-button {
34 | margin: 0 auto;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/excalidraw-app/components/EncryptedIcon.tsx:
--------------------------------------------------------------------------------
1 | import { Tooltip } from "@excalidraw/excalidraw/components/Tooltip";
2 | import { shield } from "@excalidraw/excalidraw/components/icons";
3 | import { useI18n } from "@excalidraw/excalidraw/i18n";
4 |
5 | export const EncryptedIcon = () => {
6 | const { t } = useI18n();
7 |
8 | return (
9 | <a
10 | className="encrypted-icon tooltip"
11 | href="https://plus.excalidraw.com/blog/end-to-end-encryption"
12 | target="_blank"
13 | rel="noopener"
14 | aria-label={t("encrypted.link")}
15 | >
16 | <Tooltip label={t("encrypted.tooltip")} long={true}>
17 | {shield}
18 | </Tooltip>
19 | </a>
20 | );
21 | };
22 |
--------------------------------------------------------------------------------
/excalidraw-app/components/ExcalidrawPlusPromoBanner.tsx:
--------------------------------------------------------------------------------
1 | export const ExcalidrawPlusPromoBanner = ({
2 | isSignedIn,
3 | }: {
4 | isSignedIn: boolean;
5 | }) => {
6 | return (
7 | <a
8 | href={`${
9 | isSignedIn
10 | ? import.meta.env.VITE_APP_PLUS_LP
11 | : import.meta.env.VITE_APP_PLUS_APP
12 | }/plus?utm_source=excalidraw&utm_medium=app&utm_content=${
13 | isSignedIn ? "signedInBanner" : "guestBanner"
14 | }#excalidraw-redirect`}
15 | target="_blank"
16 | rel="noopener"
17 | className="plus-banner"
18 | >
19 | Excalidraw+
20 | </a>
21 | );
22 | };
23 |
--------------------------------------------------------------------------------
/excalidraw-app/data/Locker.ts:
--------------------------------------------------------------------------------
1 | export class Locker<T extends string> {
2 | private locks = new Map<T, true>();
3 |
4 | lock = (lockType: T) => {
5 | this.locks.set(lockType, true);
6 | };
7 |
8 | /** @returns whether no locks remaining */
9 | unlock = (lockType: T) => {
10 | this.locks.delete(lockType);
11 | return !this.isLocked();
12 | };
13 |
14 | /** @returns whether some (or specific) locks are present */
15 | isLocked(lockType?: T) {
16 | return lockType ? this.locks.has(lockType) : !!this.locks.size;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/excalidraw-app/global.d.ts:
--------------------------------------------------------------------------------
1 | import "@excalidraw/excalidraw/global";
2 | import "@excalidraw/excalidraw/css";
3 |
4 | interface Window {
5 | __EXCALIDRAW_SHA__: string | undefined;
6 | }
7 |
--------------------------------------------------------------------------------
/excalidraw-app/index.tsx:
--------------------------------------------------------------------------------
1 | import { StrictMode } from "react";
2 | import { createRoot } from "react-dom/client";
3 | import { registerSW } from "virtual:pwa-register";
4 |
5 | import "../excalidraw-app/sentry";
6 |
7 | import ExcalidrawApp from "./App";
8 |
9 | window.__EXCALIDRAW_SHA__ = import.meta.env.VITE_APP_GIT_SHA;
10 | const rootElement = document.getElementById("root")!;
11 | const root = createRoot(rootElement);
12 | registerSW();
13 | root.render(
14 | <StrictMode>
15 | <ExcalidrawApp />
16 | </StrictMode>,
17 | );
18 |
--------------------------------------------------------------------------------
/firebase-project/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "default": "excalidraw-room-persistence"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/firebase-project/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "firestore": {
3 | "rules": "firestore.rules",
4 | "indexes": "firestore.indexes.json"
5 | },
6 | "storage": {
7 | "rules": "storage.rules"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/firebase-project/firestore.indexes.json:
--------------------------------------------------------------------------------
1 | {
2 | "indexes": [],
3 | "fieldOverrides": []
4 | }
5 |
--------------------------------------------------------------------------------
/firebase-project/firestore.rules:
--------------------------------------------------------------------------------
1 | rules_version = '2';
2 | service cloud.firestore {
3 | match /databases/{database}/documents {
4 | match /{document=**} {
5 | allow get, write: if true;
6 | // never set this to true, otherwise anyone can delete anyone else's drawing.
7 | allow list: if false;
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/firebase-project/storage.rules:
--------------------------------------------------------------------------------
1 | rules_version = '2';
2 | service firebase.storage {
3 | match /b/{bucket}/o {
4 | match /{files}/rooms/{room}/{file} {
5 | allow get, write: if true;
6 | }
7 | match /{files}/shareLinks/{shareLink}/{file} {
8 | allow get, write: if true;
9 | }
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/packages/common/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["../eslintrc.base.json"]
3 | }
4 |
--------------------------------------------------------------------------------
/packages/common/README.md:
--------------------------------------------------------------------------------
1 | # @excalidraw/common
2 |
3 | ## Install
4 |
5 | ```bash
6 | npm install @excalidraw/common
7 | ```
8 |
9 | If you prefer Yarn over npm, use this command to install the Excalidraw utils package:
10 |
11 | ```bash
12 | yarn add @excalidraw/common
13 | ```
14 |
15 | With PNPM, similarly install the package with this command:
16 |
17 | ```bash
18 | pnpm add @excalidraw/common
19 | ```
20 |
--------------------------------------------------------------------------------
/packages/common/global.d.ts:
--------------------------------------------------------------------------------
1 | /// <reference types="vite/client" />
2 | import "@excalidraw/excalidraw/global";
3 | import "@excalidraw/excalidraw/css";
4 |
--------------------------------------------------------------------------------
/packages/common/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./binary-heap";
2 | export * from "./colors";
3 | export * from "./constants";
4 | export * from "./font-metadata";
5 | export * from "./queue";
6 | export * from "./keys";
7 | export * from "./points";
8 | export * from "./promise-pool";
9 | export * from "./random";
10 | export * from "./url";
11 | export * from "./utils";
12 | export * from "./emitter";
13 | export * from "./editorInterface";
14 |
--------------------------------------------------------------------------------
/packages/common/src/random.ts:
--------------------------------------------------------------------------------
1 | import { nanoid } from "nanoid";
2 | import { Random } from "roughjs/bin/math";
3 |
4 | import { isTestEnv } from "./utils";
5 |
6 | let random = new Random(Date.now());
7 | let testIdBase = 0;
8 |
9 | export const randomInteger = () => Math.floor(random.next() * 2 ** 31);
10 |
11 | export const reseed = (seed: number) => {
12 | random = new Random(seed);
13 | testIdBase = 0;
14 | };
15 |
16 | export const randomId = () => (isTestEnv() ? `id${testIdBase++}` : nanoid());
17 |
--------------------------------------------------------------------------------
/packages/common/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.base.json",
3 | "compilerOptions": {
4 | "outDir": "./dist/types"
5 | },
6 | "include": ["src/**/*", "global.d.ts"],
7 | "exclude": ["**/*.test.*", "tests", "types", "examples", "dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/element/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["../eslintrc.base.json"]
3 | }
4 |
--------------------------------------------------------------------------------
/packages/element/README.md:
--------------------------------------------------------------------------------
1 | # @excalidraw/element
2 |
3 | ## Install
4 |
5 | ```bash
6 | npm install @excalidraw/element
7 | ```
8 |
9 | If you prefer Yarn over npm, use this command to install the Excalidraw utils package:
10 |
11 | ```bash
12 | yarn add @excalidraw/element
13 | ```
14 |
15 | With PNPM, similarly install the package with this command:
16 |
17 | ```bash
18 | pnpm add @excalidraw/element
19 | ```
20 |
--------------------------------------------------------------------------------
/packages/element/global.d.ts:
--------------------------------------------------------------------------------
1 | /// <reference types="vite/client" />
2 | import "@excalidraw/excalidraw/global";
3 | import "@excalidraw/excalidraw/css";
4 |
--------------------------------------------------------------------------------
/packages/element/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.base.json",
3 | "compilerOptions": {
4 | "outDir": "./dist/types"
5 | },
6 | "include": ["src/**/*", "global.d.ts"],
7 | "exclude": ["**/*.test.*", "tests", "types", "examples", "dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/eslintrc.base.json:
--------------------------------------------------------------------------------
1 | {
2 | "overrides": [
3 | {
4 | "files": ["src/**/*.{ts,tsx}"],
5 | "rules": {
6 | "@typescript-eslint/no-restricted-imports": [
7 | "error",
8 | {
9 | "patterns": [
10 | {
11 | "group": ["../../excalidraw", "../../../packages/excalidraw", "@excalidraw/excalidraw"],
12 | "message": "Do not import from '@excalidraw/excalidraw' package anything but types, as this package must be independent.",
13 | "allowTypeImports": true
14 | }
15 | ]
16 | }
17 | ]
18 | }
19 | }
20 | ]
21 | }
22 |
--------------------------------------------------------------------------------
/packages/excalidraw/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | types
3 |
--------------------------------------------------------------------------------
/packages/excalidraw/.size-limit.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "path": "dist/excalidraw.production.min.js",
4 | "limit": "340 kB"
5 | },
6 | {
7 | "path": "dist/excalidraw-assets/locales",
8 | "name": "dist/excalidraw-assets/locales",
9 | "limit": "290 kB"
10 | },
11 | {
12 | "path": "dist/excalidraw-assets/vendor-*.js",
13 | "name": "dist/excalidraw-assets/vendor*.js",
14 | "limit": "900 kB"
15 | }
16 | ]
17 |
--------------------------------------------------------------------------------
/packages/excalidraw/actions/register.ts:
--------------------------------------------------------------------------------
1 | import type { Action } from "./types";
2 |
3 | export let actions: readonly Action[] = [];
4 |
5 | export const register = <T extends Action>(action: T) => {
6 | actions = actions.concat(action);
7 | return action as T & {
8 | keyTest?: unknown extends T["keyTest"] ? never : T["keyTest"];
9 | };
10 | };
11 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Avatar.scss:
--------------------------------------------------------------------------------
1 | @import "../css/variables.module.scss";
2 |
3 | .excalidraw {
4 | .Avatar {
5 | @include avatarStyles;
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Button.scss:
--------------------------------------------------------------------------------
1 | @import "../css/theme";
2 |
3 | .excalidraw {
4 | .excalidraw-button {
5 | @include outlineButtonStyles;
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/ButtonIcon.scss:
--------------------------------------------------------------------------------
1 | @import "../css/theme";
2 |
3 | .excalidraw {
4 | button.standalone {
5 | @include outlineButtonIconStyles;
6 |
7 | & > * {
8 | // dissalow pointer events on children, so we always have event.target on the button itself
9 | pointer-events: none;
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/ButtonIconCycle.tsx:
--------------------------------------------------------------------------------
1 | import clsx from "clsx";
2 |
3 | import type { JSX } from "react";
4 |
5 | export const ButtonIconCycle = <T extends any>({
6 | options,
7 | value,
8 | onChange,
9 | group,
10 | }: {
11 | options: { value: T; text: string; icon: JSX.Element }[];
12 | value: T | null;
13 | onChange: (value: T) => void;
14 | group: string;
15 | }) => {
16 | const current = options.find((op) => op.value === value);
17 |
18 | const cycle = () => {
19 | const index = options.indexOf(current!);
20 | const next = (index + 1) % options.length;
21 | onChange(options[next].value);
22 | };
23 |
24 | return (
25 | <label key={group} className={clsx({ active: current!.value !== null })}>
26 | <input type="button" name={group} onClick={cycle} />
27 | {current!.icon}
28 | </label>
29 | );
30 | };
31 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/ButtonSeparator.tsx:
--------------------------------------------------------------------------------
1 | export const ButtonSeparator = () => (
2 | <div
3 | style={{
4 | width: 1,
5 | height: "1rem",
6 | backgroundColor: "var(--default-border-color)",
7 | margin: "0 auto",
8 | }}
9 | />
10 | );
11 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Card.tsx:
--------------------------------------------------------------------------------
1 | import OpenColor from "open-color";
2 |
3 | import "./Card.scss";
4 |
5 | export const Card: React.FC<{
6 | color: keyof OpenColor | "primary";
7 | children?: React.ReactNode;
8 | }> = ({ children, color }) => {
9 | return (
10 | <div
11 | className="Card"
12 | style={{
13 | ["--card-color" as any]:
14 | color === "primary" ? "var(--color-primary)" : OpenColor[color][7],
15 | ["--card-color-darker" as any]:
16 | color === "primary"
17 | ? "var(--color-primary-darker)"
18 | : OpenColor[color][8],
19 | ["--card-color-darkest" as any]:
20 | color === "primary"
21 | ? "var(--color-primary-darkest)"
22 | : OpenColor[color][9],
23 | }}
24 | >
25 | {children}
26 | </div>
27 | );
28 | };
29 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/ColorPicker/HotkeyLabel.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | import { isColorDark } from "./colorPickerUtils";
4 |
5 | interface HotkeyLabelProps {
6 | color: string;
7 | keyLabel: string | number;
8 | isShade?: boolean;
9 | }
10 | const HotkeyLabel = ({
11 | color,
12 | keyLabel,
13 | isShade = false,
14 | }: HotkeyLabelProps) => {
15 | return (
16 | <div
17 | className="color-picker__button__hotkey-label"
18 | style={{
19 | color: isColorDark(color) ? "#fff" : "#000",
20 | }}
21 | >
22 | {isShade && "⇧"}
23 | {keyLabel}
24 | </div>
25 | );
26 | };
27 |
28 | export default HotkeyLabel;
29 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/ColorPicker/PickerHeading.tsx:
--------------------------------------------------------------------------------
1 | import type { ReactNode } from "react";
2 |
3 | const PickerHeading = ({ children }: { children: ReactNode }) => (
4 | <div className="color-picker__heading">{children}</div>
5 | );
6 |
7 | export default PickerHeading;
8 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/CommandPalette/defaultCommandPaletteItems.ts:
--------------------------------------------------------------------------------
1 | import { actionToggleTheme } from "../../actions";
2 |
3 | import type { CommandPaletteItem } from "./types";
4 |
5 | export const toggleTheme: CommandPaletteItem = {
6 | ...actionToggleTheme,
7 | category: "App",
8 | label: "Toggle theme",
9 | perform: ({ actionManager }) => {
10 | actionManager.executeAction(actionToggleTheme, "commandPalette");
11 | },
12 | };
13 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/ConfirmDialog.scss:
--------------------------------------------------------------------------------
1 | @import "../css/variables.module.scss";
2 |
3 | .excalidraw {
4 | .confirm-dialog {
5 | &-buttons {
6 | display: flex;
7 | column-gap: 0.5rem;
8 | justify-content: flex-end;
9 | }
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/ConvertElementTypePopup.scss:
--------------------------------------------------------------------------------
1 | @import "../css//variables.module.scss";
2 |
3 | .excalidraw {
4 | .ConvertElementTypePopup {
5 | display: flex;
6 | flex-wrap: wrap;
7 | justify-content: center;
8 | gap: 0.2rem;
9 | border-radius: 0.5rem;
10 | background: var(--island-bg-color);
11 | box-shadow: var(--shadow-island);
12 | padding: 0.5rem;
13 |
14 | &:focus {
15 | outline: none;
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/DiagramToCodePlugin/DiagramToCodePlugin.tsx:
--------------------------------------------------------------------------------
1 | import { useLayoutEffect } from "react";
2 |
3 | import { useApp } from "../App";
4 |
5 | import type { GenerateDiagramToCode } from "../../types";
6 |
7 | export const DiagramToCodePlugin = (props: {
8 | generate: GenerateDiagramToCode;
9 | }) => {
10 | const app = useApp();
11 |
12 | useLayoutEffect(() => {
13 | app.setPlugins({
14 | diagramToCode: { generate: props.generate },
15 | });
16 | }, [app, props.generate]);
17 |
18 | return null;
19 | };
20 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/ElementCanvasButtons.scss:
--------------------------------------------------------------------------------
1 | .excalidraw {
2 | .excalidraw-canvas-buttons {
3 | position: absolute;
4 |
5 | box-shadow: 0px 2px 4px 0 rgb(0 0 0 / 30%);
6 | z-index: var(--zIndex-canvasButtons);
7 | background: var(--island-bg-color);
8 | border-radius: var(--border-radius-lg);
9 |
10 | display: flex;
11 | flex-direction: column;
12 | gap: 0.375rem;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Ellipsify.tsx:
--------------------------------------------------------------------------------
1 | export const Ellipsify = ({
2 | children,
3 | ...rest
4 | }: { children: React.ReactNode } & React.HTMLAttributes<HTMLSpanElement>) => {
5 | return (
6 | <span
7 | {...rest}
8 | style={{
9 | textOverflow: "ellipsis",
10 | overflow: "hidden",
11 | whiteSpace: "nowrap",
12 | ...rest.style,
13 | }}
14 | >
15 | {children}
16 | </span>
17 | );
18 | };
19 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/FixedSideContainer.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import clsx from "clsx";
3 |
4 | import "./FixedSideContainer.scss";
5 |
6 | type FixedSideContainerProps = {
7 | children: React.ReactNode;
8 | side: "top" | "left" | "right";
9 | className?: string;
10 | };
11 |
12 | export const FixedSideContainer = ({
13 | children,
14 | side,
15 | className,
16 | }: FixedSideContainerProps) => (
17 | <div
18 | className={clsx(
19 | "FixedSideContainer",
20 | `FixedSideContainer_side_${side}`,
21 | className,
22 | )}
23 | >
24 | {children}
25 | </div>
26 | );
27 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/FontPicker/FontPicker.scss:
--------------------------------------------------------------------------------
1 | @import "../../css/variables.module.scss";
2 |
3 | .excalidraw {
4 | .FontPicker__container {
5 | display: grid;
6 | grid-template-columns: calc(1rem + 3 * var(--default-button-size)) 1rem 1fr; // calc ~ 2 gaps + 4 buttons
7 | align-items: center;
8 |
9 | @include isMobile {
10 | max-width: calc(
11 | 2rem + 4 * var(--default-button-size)
12 | ); // 4 gaps + 4 buttons
13 | }
14 |
15 | &--compact {
16 | display: block;
17 | grid-template-columns: none;
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/HelpButton.tsx:
--------------------------------------------------------------------------------
1 | import { t } from "../i18n";
2 |
3 | import { HelpIcon } from "./icons";
4 |
5 | type HelpButtonProps = {
6 | name?: string;
7 | id?: string;
8 | onClick?(): void;
9 | };
10 |
11 | export const HelpButton = (props: HelpButtonProps) => (
12 | <button
13 | className="help-icon"
14 | onClick={props.onClick}
15 | type="button"
16 | title={`${t("helpDialog.title")} — ?`}
17 | aria-label={t("helpDialog.title")}
18 | >
19 | {HelpIcon}
20 | </button>
21 | );
22 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/InlineIcon.tsx:
--------------------------------------------------------------------------------
1 | export const InlineIcon = ({
2 | className,
3 | icon,
4 | size = "1em",
5 | }: {
6 | className?: string;
7 | icon: React.ReactNode;
8 | size?: string;
9 | }) => {
10 | return (
11 | <span
12 | className={className}
13 | style={{
14 | width: size,
15 | height: "100%",
16 | margin: "0 0.5ex 0 0.5ex",
17 | display: "inline-flex",
18 | lineHeight: 0,
19 | verticalAlign: "middle",
20 | flex: "0 0 auto",
21 | }}
22 | >
23 | {icon}
24 | </span>
25 | );
26 | };
27 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Island.scss:
--------------------------------------------------------------------------------
1 | .excalidraw {
2 | .Island {
3 | --padding: 0;
4 | box-sizing: border-box;
5 | background-color: var(--island-bg-color);
6 | box-shadow: var(--shadow-island);
7 | border-radius: var(--border-radius-lg);
8 | padding: calc(var(--padding) * var(--space-factor));
9 | position: relative;
10 | transition: box-shadow 0.5s ease-in-out;
11 |
12 | &.zen-mode {
13 | box-shadow: none;
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Island.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import clsx from "clsx";
3 |
4 | import "./Island.scss";
5 |
6 | type IslandProps = {
7 | children: React.ReactNode;
8 | padding?: number;
9 | className?: string | boolean;
10 | style?: object;
11 | };
12 |
13 | export const Island = React.forwardRef<HTMLDivElement, IslandProps>(
14 | ({ children, padding, className, style }, ref) => (
15 | <div
16 | className={clsx("Island", className)}
17 | style={{ "--padding": padding, ...style }}
18 | ref={ref}
19 | >
20 | {children}
21 | </div>
22 | ),
23 | );
24 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/LibraryMenuControlButtons.tsx:
--------------------------------------------------------------------------------
1 | import clsx from "clsx";
2 |
3 | import LibraryMenuBrowseButton from "./LibraryMenuBrowseButton";
4 |
5 | import type { ExcalidrawProps, UIAppState } from "../types";
6 |
7 | export const LibraryMenuControlButtons = ({
8 | libraryReturnUrl,
9 | theme,
10 | id,
11 | style,
12 | children,
13 | className,
14 | }: {
15 | libraryReturnUrl: ExcalidrawProps["libraryReturnUrl"];
16 | theme: UIAppState["theme"];
17 | id: string;
18 | style: React.CSSProperties;
19 | children?: React.ReactNode;
20 | className?: string;
21 | }) => {
22 | return (
23 | <div
24 | className={clsx("library-menu-control-buttons", className)}
25 | style={style}
26 | >
27 | <LibraryMenuBrowseButton
28 | id={id}
29 | libraryReturnUrl={libraryReturnUrl}
30 | theme={theme}
31 | />
32 | {children}
33 | </div>
34 | );
35 | };
36 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/LinkButton.tsx:
--------------------------------------------------------------------------------
1 | import { FilledButton } from "./FilledButton";
2 |
3 | export const LinkButton = ({
4 | children,
5 | href,
6 | }: {
7 | href: string;
8 | children: React.ReactNode;
9 | }) => {
10 | return (
11 | <a href={href} target="_blank" rel="noopener" className="link-button">
12 | <FilledButton>{children}</FilledButton>
13 | </a>
14 | );
15 | };
16 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Paragraph.tsx:
--------------------------------------------------------------------------------
1 | export const Paragraph = (props: {
2 | children: React.ReactNode;
3 | style?: React.CSSProperties;
4 | }) => {
5 | return (
6 | <p className="excalidraw__paragraph" style={props.style}>
7 | {props.children}
8 | </p>
9 | );
10 | };
11 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Popover.scss:
--------------------------------------------------------------------------------
1 | .excalidraw {
2 | .popover {
3 | position: absolute;
4 | z-index: 10;
5 | padding: 5px 0 5px;
6 | outline: none;
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/ProjectName.scss:
--------------------------------------------------------------------------------
1 | .ProjectName {
2 | margin: auto;
3 | display: flex;
4 | align-items: center;
5 |
6 | .TextInput {
7 | height: calc(1rem - 3px);
8 | width: 200px;
9 | overflow: hidden;
10 | text-align: center;
11 | margin-left: 8px;
12 | text-overflow: ellipsis;
13 |
14 | &--readonly {
15 | background: none;
16 | border: none;
17 | &:hover {
18 | background: none;
19 | }
20 | width: auto;
21 | max-width: 200px;
22 | padding-left: 2px;
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/QuickSearch.tsx:
--------------------------------------------------------------------------------
1 | import clsx from "clsx";
2 | import React from "react";
3 |
4 | import { searchIcon } from "./icons";
5 |
6 | import "./QuickSearch.scss";
7 |
8 | interface QuickSearchProps {
9 | className?: string;
10 | placeholder: string;
11 | onChange: (term: string) => void;
12 | }
13 |
14 | export const QuickSearch = React.forwardRef<HTMLInputElement, QuickSearchProps>(
15 | ({ className, placeholder, onChange }, ref) => {
16 | return (
17 | <div className={clsx("QuickSearch__wrapper", className)}>
18 | {searchIcon}
19 | <input
20 | ref={ref}
21 | className="QuickSearch__input"
22 | type="text"
23 | placeholder={placeholder}
24 | onChange={(e) => onChange(e.target.value.trim().toLowerCase())}
25 | />
26 | </div>
27 | );
28 | },
29 | );
30 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/SVGLayer.scss:
--------------------------------------------------------------------------------
1 | @import "../css/variables.module.scss";
2 |
3 | .excalidraw {
4 | .SVGLayer {
5 | pointer-events: none;
6 | width: 100vw;
7 | height: 100vh;
8 | position: fixed;
9 | top: 0;
10 | left: 0;
11 |
12 | z-index: var(--zIndex-svgLayer);
13 |
14 | & svg {
15 | image-rendering: auto;
16 | overflow: visible;
17 | position: absolute;
18 | width: 100%;
19 | height: 100%;
20 | top: 0;
21 | left: 0;
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/SVGLayer.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useRef } from "react";
2 |
3 | import "./SVGLayer.scss";
4 |
5 | import type { Trail } from "../animated-trail";
6 |
7 | type SVGLayerProps = {
8 | trails: Trail[];
9 | };
10 |
11 | export const SVGLayer = ({ trails }: SVGLayerProps) => {
12 | const svgRef = useRef<SVGSVGElement | null>(null);
13 |
14 | useEffect(() => {
15 | if (svgRef.current) {
16 | for (const trail of trails) {
17 | trail.start(svgRef.current);
18 | }
19 | }
20 |
21 | return () => {
22 | for (const trail of trails) {
23 | trail.stop();
24 | }
25 | };
26 | // eslint-disable-next-line react-hooks/exhaustive-deps
27 | }, trails);
28 |
29 | return (
30 | <div className="SVGLayer">
31 | <svg ref={svgRef} />
32 | </div>
33 | );
34 | };
35 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/ScrollableList.scss:
--------------------------------------------------------------------------------
1 | .excalidraw {
2 | .ScrollableList__wrapper {
3 | position: static !important;
4 | border: none;
5 | font-size: 0.875rem;
6 | overflow-y: auto;
7 |
8 | & > .empty,
9 | & > .hint {
10 | display: flex;
11 | justify-content: center;
12 | align-items: center;
13 | padding: 0.5rem;
14 | font-size: 0.75rem;
15 | color: var(--color-gray-60);
16 | overflow: hidden;
17 | text-align: center;
18 | line-height: 150%;
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/ScrollableList.tsx:
--------------------------------------------------------------------------------
1 | import clsx from "clsx";
2 | import { Children } from "react";
3 |
4 | import "./ScrollableList.scss";
5 |
6 | interface ScrollableListProps {
7 | className?: string;
8 | placeholder: string;
9 | children: React.ReactNode;
10 | }
11 |
12 | export const ScrollableList = ({
13 | className,
14 | placeholder,
15 | children,
16 | }: ScrollableListProps) => {
17 | const isEmpty = !Children.count(children);
18 |
19 | return (
20 | <div className={clsx("ScrollableList__wrapper", className)} role="menu">
21 | {isEmpty ? <div className="empty">{placeholder}</div> : children}
22 | </div>
23 | );
24 | };
25 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Section.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | import { t } from "../i18n";
4 |
5 | import { useExcalidrawContainer } from "./App";
6 |
7 | export const Section: React.FC<{
8 | heading: "canvasActions" | "selectedShapeActions" | "shapes";
9 | children?: React.ReactNode | ((heading: React.ReactNode) => React.ReactNode);
10 | className?: string;
11 | }> = ({ heading, children, ...props }) => {
12 | const { id } = useExcalidrawContainer();
13 | const header = (
14 | <h2 className="visually-hidden" id={`${id}-${heading}-title`}>
15 | {t(`headings.${heading}`)}
16 | </h2>
17 | );
18 | return (
19 | <section {...props} aria-labelledby={`${id}-${heading}-title`}>
20 | {typeof children === "function" ? (
21 | children(header)
22 | ) : (
23 | <>
24 | {header}
25 | {children}
26 | </>
27 | )}
28 | </section>
29 | );
30 | };
31 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Sidebar/SidebarTab.tsx:
--------------------------------------------------------------------------------
1 | import * as RadixTabs from "@radix-ui/react-tabs";
2 |
3 | import type { SidebarTabName } from "../../types";
4 |
5 | export const SidebarTab = ({
6 | tab,
7 | children,
8 | ...rest
9 | }: {
10 | tab: SidebarTabName;
11 | children: React.ReactNode;
12 | } & React.HTMLAttributes<HTMLDivElement>) => {
13 | return (
14 | <RadixTabs.Content {...rest} value={tab} data-testid={tab}>
15 | {children}
16 | </RadixTabs.Content>
17 | );
18 | };
19 | SidebarTab.displayName = "SidebarTab";
20 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Sidebar/SidebarTabTrigger.tsx:
--------------------------------------------------------------------------------
1 | import * as RadixTabs from "@radix-ui/react-tabs";
2 |
3 | import type { SidebarTabName } from "../../types";
4 |
5 | export const SidebarTabTrigger = ({
6 | children,
7 | tab,
8 | onSelect,
9 | ...rest
10 | }: {
11 | children: React.ReactNode;
12 | tab: SidebarTabName;
13 | onSelect?: React.ReactEventHandler<HTMLButtonElement> | undefined;
14 | } & Omit<React.HTMLAttributes<HTMLButtonElement>, "onSelect">) => {
15 | return (
16 | <RadixTabs.Trigger value={tab} asChild onSelect={onSelect}>
17 | <button
18 | type={"button"}
19 | className={`excalidraw-button sidebar-tab-trigger`}
20 | {...rest}
21 | >
22 | {children}
23 | </button>
24 | </RadixTabs.Trigger>
25 | );
26 | };
27 | SidebarTabTrigger.displayName = "SidebarTabTrigger";
28 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Sidebar/SidebarTabTriggers.tsx:
--------------------------------------------------------------------------------
1 | import * as RadixTabs from "@radix-ui/react-tabs";
2 |
3 | export const SidebarTabTriggers = ({
4 | children,
5 | ...rest
6 | }: { children: React.ReactNode } & Omit<
7 | React.RefAttributes<HTMLDivElement>,
8 | "onSelect"
9 | >) => {
10 | return (
11 | <RadixTabs.List className="sidebar-triggers" {...rest}>
12 | {children}
13 | </RadixTabs.List>
14 | );
15 | };
16 | SidebarTabTriggers.displayName = "SidebarTabTriggers";
17 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Sidebar/SidebarTrigger.scss:
--------------------------------------------------------------------------------
1 | @import "../../css/variables.module.scss";
2 |
3 | .excalidraw {
4 | .sidebar-trigger {
5 | @include outlineButtonStyles;
6 | @include filledButtonOnCanvas;
7 |
8 | width: auto;
9 | height: var(--lg-button-size);
10 |
11 | display: flex;
12 | align-items: center;
13 | gap: 0.5rem;
14 |
15 | line-height: 0;
16 |
17 | font-size: 0.75rem;
18 | letter-spacing: 0.4px;
19 |
20 | svg {
21 | width: var(--lg-icon-size);
22 | height: var(--lg-icon-size);
23 | }
24 |
25 | &__label-element {
26 | align-self: flex-start;
27 | }
28 | }
29 |
30 | .default-sidebar-trigger .sidebar-trigger__label {
31 | display: block;
32 | white-space: nowrap;
33 | }
34 |
35 | &.excalidraw--mobile .default-sidebar-trigger .sidebar-trigger__label {
36 | display: none;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Stack.scss:
--------------------------------------------------------------------------------
1 | .excalidraw {
2 | .Stack {
3 | --gap: 0;
4 | display: grid;
5 | gap: calc(var(--space-factor) * var(--gap));
6 | }
7 |
8 | .Stack_vertical {
9 | grid-template-columns: auto;
10 | grid-auto-flow: row;
11 | grid-auto-rows: min-content;
12 | }
13 |
14 | .Stack_horizontal {
15 | grid-template-rows: auto;
16 | grid-auto-flow: column;
17 | grid-auto-columns: min-content;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/Switch.tsx:
--------------------------------------------------------------------------------
1 | import clsx from "clsx";
2 |
3 | import "./Switch.scss";
4 |
5 | export type SwitchProps = {
6 | name: string;
7 | checked: boolean;
8 | title?: string;
9 | onChange: (value: boolean) => void;
10 | disabled?: boolean;
11 | };
12 |
13 | export const Switch = ({
14 | title,
15 | name,
16 | checked,
17 | onChange,
18 | disabled = false,
19 | }: SwitchProps) => {
20 | return (
21 | <div className={clsx("Switch", { toggled: checked, disabled })}>
22 | <input
23 | name={name}
24 | id={name}
25 | title={title}
26 | type="checkbox"
27 | checked={checked}
28 | disabled={disabled}
29 | onChange={() => onChange(!checked)}
30 | onKeyDown={(event) => {
31 | if (event.key === " ") {
32 | onChange(!checked);
33 | }
34 | }}
35 | />
36 | </div>
37 | );
38 | };
39 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/TTDDialog/MermaidToExcalidraw.scss:
--------------------------------------------------------------------------------
1 | .excalidraw {
2 | .dialog-mermaid {
3 | &-title {
4 | margin-block: 0.25rem;
5 | font-size: 1.25rem;
6 | font-weight: 700;
7 | padding-inline: 2.5rem;
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/TTDDialog/TTDDialogPanels.tsx:
--------------------------------------------------------------------------------
1 | import type { ReactNode } from "react";
2 |
3 | export const TTDDialogPanels = ({ children }: { children: ReactNode }) => {
4 | return <div className="ttd-dialog-panels">{children}</div>;
5 | };
6 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/TTDDialog/TTDDialogSubmitShortcut.tsx:
--------------------------------------------------------------------------------
1 | import { getShortcutKey } from "@excalidraw/excalidraw/shortcut";
2 |
3 | export const TTDDialogSubmitShortcut = () => {
4 | return (
5 | <div className="ttd-dialog-submit-shortcut">
6 | <div className="ttd-dialog-submit-shortcut__key">
7 | {getShortcutKey("CtrlOrCmd")}
8 | </div>
9 | <div className="ttd-dialog-submit-shortcut__key">
10 | {getShortcutKey("Enter")}
11 | </div>
12 | </div>
13 | );
14 | };
15 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/TTDDialog/TTDDialogTab.tsx:
--------------------------------------------------------------------------------
1 | import * as RadixTabs from "@radix-ui/react-tabs";
2 |
3 | export const TTDDialogTab = ({
4 | tab,
5 | children,
6 | ...rest
7 | }: {
8 | tab: string;
9 | children: React.ReactNode;
10 | } & React.HTMLAttributes<HTMLDivElement>) => {
11 | return (
12 | <RadixTabs.Content {...rest} value={tab}>
13 | {children}
14 | </RadixTabs.Content>
15 | );
16 | };
17 | TTDDialogTab.displayName = "TTDDialogTab";
18 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/TTDDialog/TTDDialogTabTrigger.tsx:
--------------------------------------------------------------------------------
1 | import * as RadixTabs from "@radix-ui/react-tabs";
2 |
3 | export const TTDDialogTabTrigger = ({
4 | children,
5 | tab,
6 | onSelect,
7 | ...rest
8 | }: {
9 | children: React.ReactNode;
10 | tab: string;
11 | onSelect?: React.ReactEventHandler<HTMLButtonElement> | undefined;
12 | } & Omit<React.HTMLAttributes<HTMLButtonElement>, "onSelect">) => {
13 | return (
14 | <RadixTabs.Trigger value={tab} asChild onSelect={onSelect}>
15 | <button type="button" className="ttd-dialog-tab-trigger" {...rest}>
16 | {children}
17 | </button>
18 | </RadixTabs.Trigger>
19 | );
20 | };
21 | TTDDialogTabTrigger.displayName = "TTDDialogTabTrigger";
22 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/TTDDialog/TTDDialogTabTriggers.tsx:
--------------------------------------------------------------------------------
1 | import * as RadixTabs from "@radix-ui/react-tabs";
2 |
3 | export const TTDDialogTabTriggers = ({
4 | children,
5 | ...rest
6 | }: { children: React.ReactNode } & React.HTMLAttributes<HTMLDivElement>) => {
7 | return (
8 | <RadixTabs.List className="ttd-dialog-triggers" {...rest}>
9 | {children}
10 | </RadixTabs.List>
11 | );
12 | };
13 | TTDDialogTabTriggers.displayName = "TTDDialogTabTriggers";
14 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/TextInput.scss:
--------------------------------------------------------------------------------
1 | @import "../css/variables.module.scss";
2 |
3 | .excalidraw {
4 | .TextInput {
5 | display: inline-block;
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/ToolPopover.scss:
--------------------------------------------------------------------------------
1 | @import "../css/variables.module.scss";
2 |
3 | .excalidraw {
4 | .tool-popover-content {
5 | display: flex;
6 | flex-direction: row;
7 | gap: 0.25rem;
8 | border-radius: 0.5rem;
9 | background: var(--island-bg-color);
10 | box-shadow: var(--shadow-island);
11 | padding: 0.5rem;
12 | z-index: var(--zIndex-layerUI);
13 | }
14 |
15 | &:focus {
16 | outline: none;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/UnlockPopup.scss:
--------------------------------------------------------------------------------
1 | @import "../css/variables.module.scss";
2 |
3 | .excalidraw {
4 | .UnlockPopup {
5 | position: absolute;
6 | z-index: var(--zIndex-interactiveCanvas);
7 | display: flex;
8 | justify-content: center;
9 | align-items: center;
10 | gap: 0.5rem;
11 | border-radius: 0.5rem;
12 | background: var(--island-bg-color);
13 | box-shadow: var(--shadow-island);
14 | padding: 0.8rem;
15 | cursor: pointer;
16 | color: var(--color-gray-60);
17 |
18 | &:focus {
19 | outline: none;
20 | }
21 |
22 | svg {
23 | display: block;
24 | width: 1.25rem;
25 | height: 1.25rem;
26 | color: var(--color-gray-60);
27 | }
28 |
29 | &:hover {
30 | svg {
31 | color: var(--color-primary);
32 | }
33 | }
34 | &:active {
35 | svg {
36 | transform: scale(0.95);
37 | }
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/canvases/index.tsx:
--------------------------------------------------------------------------------
1 | import InteractiveCanvas from "./InteractiveCanvas";
2 | import StaticCanvas from "./StaticCanvas";
3 |
4 | export { InteractiveCanvas, StaticCanvas };
5 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/dropdownMenu/DropdownMenu.test.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | import { KEYS } from "@excalidraw/common";
4 |
5 | import { Excalidraw } from "../../index";
6 | import { Keyboard } from "../../tests/helpers/ui";
7 | import {
8 | render,
9 | waitFor,
10 | getByTestId,
11 | fireEvent,
12 | } from "../../tests/test-utils";
13 |
14 | describe("Test <DropdownMenu/>", () => {
15 | it("should", async () => {
16 | const { container } = await render(<Excalidraw />);
17 |
18 | expect(window.h.state.openMenu).toBe(null);
19 |
20 | fireEvent.click(getByTestId(container, "main-menu-trigger"));
21 | expect(window.h.state.openMenu).toBe("canvas");
22 |
23 | await waitFor(() => {
24 | Keyboard.keyDown(KEYS.ESCAPE);
25 | expect(window.h.state.openMenu).toBe(null);
26 | });
27 | });
28 | });
29 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/dropdownMenu/DropdownMenuGroup.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | const MenuGroup = ({
4 | children,
5 | className = "",
6 | style,
7 | title,
8 | }: {
9 | children: React.ReactNode;
10 | className?: string;
11 | style?: React.CSSProperties;
12 | title?: string;
13 | }) => {
14 | return (
15 | <div className={`dropdown-menu-group ${className}`} style={style}>
16 | {title && <p className="dropdown-menu-group-title">{title}</p>}
17 | {children}
18 | </div>
19 | );
20 | };
21 |
22 | export default MenuGroup;
23 | MenuGroup.displayName = "DropdownMenuGroup";
24 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/dropdownMenu/DropdownMenuItemCustom.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | const DropdownMenuItemCustom = ({
4 | children,
5 | className = "",
6 | selected,
7 | ...rest
8 | }: {
9 | children: React.ReactNode;
10 | className?: string;
11 | selected?: boolean;
12 | } & React.HTMLAttributes<HTMLDivElement>) => {
13 | return (
14 | <div
15 | {...rest}
16 | className={`dropdown-menu-item-base dropdown-menu-item-custom ${className} ${
17 | selected ? `dropdown-menu-item--selected` : ``
18 | }`.trim()}
19 | >
20 | {children}
21 | </div>
22 | );
23 | };
24 |
25 | export default DropdownMenuItemCustom;
26 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/dropdownMenu/DropdownMenuSeparator.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | const MenuSeparator = () => (
4 | <div
5 | style={{
6 | height: "1px",
7 | backgroundColor: "var(--default-border-color)",
8 | margin: ".5rem 0",
9 | flex: "0 0 auto",
10 | }}
11 | />
12 | );
13 |
14 | export default MenuSeparator;
15 | MenuSeparator.displayName = "DropdownMenuSeparator";
16 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/footer/FooterCenter.scss:
--------------------------------------------------------------------------------
1 | .footer-center {
2 | pointer-events: none;
3 | & > * {
4 | pointer-events: var(--ui-pointerEvents);
5 | }
6 |
7 | display: flex;
8 | width: 100%;
9 | justify-content: flex-start;
10 | margin-inline-end: 0.6rem;
11 | }
12 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/footer/FooterCenter.tsx:
--------------------------------------------------------------------------------
1 | import clsx from "clsx";
2 |
3 | import { useTunnels } from "../../context/tunnels";
4 | import { useUIAppState } from "../../context/ui-appState";
5 |
6 | import "./FooterCenter.scss";
7 |
8 | const FooterCenter = ({ children }: { children?: React.ReactNode }) => {
9 | const { FooterCenterTunnel } = useTunnels();
10 | const appState = useUIAppState();
11 | return (
12 | <FooterCenterTunnel.In>
13 | <div
14 | className={clsx("footer-center zen-mode-transition", {
15 | "layer-ui__wrapper__footer-left--transition-bottom":
16 | appState.zenModeEnabled,
17 | })}
18 | >
19 | {children}
20 | </div>
21 | </FooterCenterTunnel.In>
22 | );
23 | };
24 |
25 | export default FooterCenter;
26 | FooterCenter.displayName = "FooterCenter";
27 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/main-menu/DefaultItems.scss:
--------------------------------------------------------------------------------
1 | .excalidraw {
2 | .ActiveFile {
3 | .ActiveFile__fileName {
4 | display: flex;
5 | align-items: center;
6 |
7 | span {
8 | text-overflow: ellipsis;
9 | overflow: hidden;
10 | white-space: nowrap;
11 | width: 9.3em;
12 | }
13 |
14 | svg {
15 | width: 1.15em;
16 | margin-inline-end: 0.3em;
17 | transform: scaleY(0.9);
18 | }
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/packages/excalidraw/components/welcome-screen/WelcomeScreen.tsx:
--------------------------------------------------------------------------------
1 | import { Center } from "./WelcomeScreen.Center";
2 | import { MenuHint, ToolbarHint, HelpHint } from "./WelcomeScreen.Hints";
3 |
4 | import "./WelcomeScreen.scss";
5 |
6 | const WelcomeScreen = (props: { children?: React.ReactNode }) => {
7 | return (
8 | <>
9 | {props.children || (
10 | <>
11 | <Center />
12 | <MenuHint />
13 | <ToolbarHint />
14 | <HelpHint />
15 | </>
16 | )}
17 | </>
18 | );
19 | };
20 |
21 | WelcomeScreen.displayName = "WelcomeScreen";
22 |
23 | WelcomeScreen.Center = Center;
24 | WelcomeScreen.Hints = { MenuHint, ToolbarHint, HelpHint };
25 |
26 | export default WelcomeScreen;
27 |
--------------------------------------------------------------------------------
/packages/excalidraw/context/ui-appState.ts:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | import type { UIAppState } from "../types";
4 |
5 | export const UIAppStateContext = React.createContext<UIAppState>(null!);
6 | export const useUIAppState = () => React.useContext(UIAppStateContext);
7 |
--------------------------------------------------------------------------------
/packages/excalidraw/css.d.ts:
--------------------------------------------------------------------------------
1 | import "csstype";
2 |
3 | declare module "csstype" {
4 | interface Properties {
5 | "--max-width"?: number | string;
6 | "--swatch-color"?: string;
7 | "--gap"?: number | string;
8 | "--padding"?: number | string;
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/packages/excalidraw/css/app.scss:
--------------------------------------------------------------------------------
1 | @import "open-color/open-color.scss";
2 |
3 | .visually-hidden {
4 | position: absolute !important;
5 | height: 1px;
6 | width: 1px;
7 | overflow: hidden;
8 | clip: rect(1px, 1px, 1px, 1px);
9 | white-space: nowrap; /* added line */
10 | user-select: none;
11 | }
12 |
13 | .LoadingMessage {
14 | position: absolute;
15 | top: 0;
16 | right: 0;
17 | bottom: 0;
18 | left: 0;
19 | z-index: 999;
20 | display: flex;
21 | flex-direction: column;
22 | align-items: center;
23 | justify-content: center;
24 | pointer-events: none;
25 |
26 | .Spinner {
27 | font-size: 2.8em;
28 | }
29 |
30 | .LoadingMessage-text {
31 | margin-top: 1em;
32 | font-size: 0.8em;
33 | }
34 | }
35 |
36 | .LoadingMessage--dark {
37 | background-color: #121212;
38 | color: #ced4da;
39 | }
40 |
--------------------------------------------------------------------------------
/packages/excalidraw/editor-jotai.ts:
--------------------------------------------------------------------------------
1 | // eslint-disable-next-line no-restricted-imports
2 | import {
3 | atom,
4 | createStore,
5 | type PrimitiveAtom,
6 | type WritableAtom,
7 | } from "jotai";
8 | import { createIsolation } from "jotai-scope";
9 |
10 | const jotai = createIsolation();
11 |
12 | export { atom, PrimitiveAtom, WritableAtom };
13 | export const { useAtom, useSetAtom, useAtomValue, useStore } = jotai;
14 | export const EditorJotaiProvider: ReturnType<
15 | typeof createIsolation
16 | >["Provider"] = jotai.Provider;
17 |
18 | export const editorJotaiStore: ReturnType<typeof createStore> = createStore();
19 |
--------------------------------------------------------------------------------
/packages/excalidraw/env.cjs:
--------------------------------------------------------------------------------
1 | const dotenv = require("dotenv");
2 | const { readFileSync } = require("fs");
3 | const pkg = require("./package.json");
4 | const parseEnvVariables = (filepath) => {
5 | const envVars = Object.entries(dotenv.parse(readFileSync(filepath))).reduce(
6 | (env, [key, value]) => {
7 | env[key] = value;
8 | return env;
9 | },
10 | {},
11 | );
12 |
13 | envVars.PKG_NAME = pkg.name;
14 | envVars.PKG_VERSION = pkg.version;
15 |
16 | return envVars;
17 | };
18 |
19 | module.exports = { parseEnvVariables };
20 |
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Assistant/Assistant-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Assistant/Assistant-Bold.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Assistant/Assistant-Medium.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Assistant/Assistant-Medium.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Assistant/Assistant-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Assistant/Assistant-Regular.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Assistant/Assistant-SemiBold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Assistant/Assistant-SemiBold.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Cascadia/CascadiaCode-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Cascadia/CascadiaCode-Regular.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Cascadia/index.ts:
--------------------------------------------------------------------------------
1 | import { type ExcalidrawFontFaceDescriptor } from "../Fonts";
2 |
3 | import CascadiaCodeRegular from "./CascadiaCode-Regular.woff2";
4 |
5 | export const CascadiaFontFaces: ExcalidrawFontFaceDescriptor[] = [
6 | {
7 | uri: CascadiaCodeRegular,
8 | },
9 | ];
10 |
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Emoji/index.ts:
--------------------------------------------------------------------------------
1 | import { LOCAL_FONT_PROTOCOL } from "@excalidraw/common";
2 |
3 | import { type ExcalidrawFontFaceDescriptor } from "../Fonts";
4 |
5 | export const EmojiFontFaces: ExcalidrawFontFaceDescriptor[] = [
6 | {
7 | uri: LOCAL_FONT_PROTOCOL,
8 | },
9 | ];
10 |
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Helvetica/index.ts:
--------------------------------------------------------------------------------
1 | import { LOCAL_FONT_PROTOCOL } from "@excalidraw/common";
2 |
3 | import { type ExcalidrawFontFaceDescriptor } from "../Fonts";
4 |
5 | export const HelveticaFontFaces: ExcalidrawFontFaceDescriptor[] = [
6 | {
7 | uri: LOCAL_FONT_PROTOCOL,
8 | },
9 | ];
10 |
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Liberation/LiberationSans-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Liberation/LiberationSans-Regular.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Liberation/index.ts:
--------------------------------------------------------------------------------
1 | import { type ExcalidrawFontFaceDescriptor } from "../Fonts";
2 |
3 | import LiberationSansRegular from "./LiberationSans-Regular.woff2";
4 |
5 | export const LiberationFontFaces: ExcalidrawFontFaceDescriptor[] = [
6 | {
7 | uri: LiberationSansRegular,
8 | },
9 | ];
10 |
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Lilita/index.ts:
--------------------------------------------------------------------------------
1 | import { GOOGLE_FONTS_RANGES } from "@excalidraw/common";
2 |
3 | import { type ExcalidrawFontFaceDescriptor } from "../Fonts";
4 |
5 | import LilitaLatinExt from "./Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2";
6 | import LilitaLatin from "./Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2";
7 |
8 | export const LilitaFontFaces: ExcalidrawFontFaceDescriptor[] = [
9 | {
10 | uri: LilitaLatinExt,
11 | descriptors: { unicodeRange: GOOGLE_FONTS_RANGES.LATIN_EXT },
12 | },
13 | {
14 | uri: LilitaLatin,
15 | descriptors: { unicodeRange: GOOGLE_FONTS_RANGES.LATIN },
16 | },
17 | ];
18 |
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Virgil/Virgil-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Virgil/Virgil-Regular.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Virgil/index.ts:
--------------------------------------------------------------------------------
1 | import { type ExcalidrawFontFaceDescriptor } from "../Fonts";
2 |
3 | import Virgil from "./Virgil-Regular.woff2";
4 |
5 | export const VirgilFontFaces: ExcalidrawFontFaceDescriptor[] = [
6 | {
7 | uri: Virgil,
8 | },
9 | ];
10 |
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-019d66dcad46dc156b162d267f981c20.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-019d66dcad46dc156b162d267f981c20.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-04b718e5623574919c8b0dea5f301444.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-04b718e5623574919c8b0dea5f301444.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-069e77aac84590e2e991d0a0176d34f2.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-069e77aac84590e2e991d0a0176d34f2.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-06c77b8c66e51ed6c63ccb502dd8b8af.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-06c77b8c66e51ed6c63ccb502dd8b8af.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-08e0dc436ad0ad61ba5558db0674d762.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-08e0dc436ad0ad61ba5558db0674d762.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-093b9ef39a46ceae95a1df18a0a3a326.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-093b9ef39a46ceae95a1df18a0a3a326.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-095c169f3314805276f603a362766abd.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-095c169f3314805276f603a362766abd.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-09850c4077f3fffe707905872e0e2460.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-09850c4077f3fffe707905872e0e2460.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0986d134c05864f5025962eef9f994a0.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0986d134c05864f5025962eef9f994a0.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0b5d723fdc4e249c140f0909e87d03b4.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0b5d723fdc4e249c140f0909e87d03b4.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0f626226ba1272e832aea87bafd9720e.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0f626226ba1272e832aea87bafd9720e.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0f7fb1e0d5015bb1371343153ecf7ce3.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0f7fb1e0d5015bb1371343153ecf7ce3.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0fa55a080fcd0f9dc2e0b0058b793df8.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0fa55a080fcd0f9dc2e0b0058b793df8.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0facdf1ea213ba40261022f5d5ed4493.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-0facdf1ea213ba40261022f5d5ed4493.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-10a7ae9a371830a80c3d844acf1c02d7.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-10a7ae9a371830a80c3d844acf1c02d7.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-112c051027b2d766c19a519f6ee1f4f7.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-112c051027b2d766c19a519f6ee1f4f7.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-11c345711937f0ba4b8f7b6b919c8440.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-11c345711937f0ba4b8f7b6b919c8440.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-12b52b58eb3df36804b9a654ec9ee194.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-12b52b58eb3df36804b9a654ec9ee194.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-13ae07ed2e272d26d59bc0691cd7117a.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-13ae07ed2e272d26d59bc0691cd7117a.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-13d2887ec8ee73c43acdabc52a05af7b.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-13d2887ec8ee73c43acdabc52a05af7b.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-145aa02cdd91946e67dc934e1acffe75.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-145aa02cdd91946e67dc934e1acffe75.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-15dc6d811c9cd078f9086a740d5a1038.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-15dc6d811c9cd078f9086a740d5a1038.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-173945821411c09f70c95f98d590e697.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-173945821411c09f70c95f98d590e697.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-1b611157cd46bb184d4fa4dae2d6a2b8.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-1b611157cd46bb184d4fa4dae2d6a2b8.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-1e6fd68f1f3902ce48ce8c69df385622.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-1e6fd68f1f3902ce48ce8c69df385622.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-1ee544f0f1dac422545c505baa788992.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-1ee544f0f1dac422545c505baa788992.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-1fdc0c67ed57263a80fd108c1f6ccf24.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-1fdc0c67ed57263a80fd108c1f6ccf24.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-203b0e569e3b14aac86a003dc3fa523e.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-203b0e569e3b14aac86a003dc3fa523e.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-20cc1bbf50e7efb442756cb605672c1f.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-20cc1bbf50e7efb442756cb605672c1f.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-20e7bf72fa05de9adf7dbcc7bf51dde6.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-20e7bf72fa05de9adf7dbcc7bf51dde6.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-21430ee05a1248901da8d0de08744d47.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-21430ee05a1248901da8d0de08744d47.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-23686f7f29da6e8008c36dd3a80c83d6.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-23686f7f29da6e8008c36dd3a80c83d6.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-23ad2d71b280f00b1363b95b7bea94eb.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-23ad2d71b280f00b1363b95b7bea94eb.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-23f228f3999c01983860012330e4be08.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-23f228f3999c01983860012330e4be08.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-24476a126f129212beb33f66853ea151.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-24476a126f129212beb33f66853ea151.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-24a21c1e4449222e8d1898d69ff3a404.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-24a21c1e4449222e8d1898d69ff3a404.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-25b7f38e18f035f96cb5e547bd2bd08c.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-25b7f38e18f035f96cb5e547bd2bd08c.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-29cec36cd205b211da97acabaa62f055.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-29cec36cd205b211da97acabaa62f055.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2a26d20a23b00898ce82f09d2ee47c3f.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2a26d20a23b00898ce82f09d2ee47c3f.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2adbc89c11e65905393d3dfc468b9d5b.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2adbc89c11e65905393d3dfc468b9d5b.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2b7441d46298788ac94e610ffcc709b6.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2b7441d46298788ac94e610ffcc709b6.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2b77e8ebfb2367ab2662396a60e7d320.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2b77e8ebfb2367ab2662396a60e7d320.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2cf96d082d35ea3d8106851223ad0d16.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2cf96d082d35ea3d8106851223ad0d16.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2d43040e86ff03ba677f6f9c04cd0805.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2d43040e86ff03ba677f6f9c04cd0805.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2e33e8dc771ef5e1d9127d60a6b73679.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-2e33e8dc771ef5e1d9127d60a6b73679.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-33432927cd87d40cfe393c7482bf221f.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-33432927cd87d40cfe393c7482bf221f.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-353f33792a8f60dc69323ddf635a269e.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-353f33792a8f60dc69323ddf635a269e.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-36925dfe329a45086cbb7fc5c20d45ac.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-36925dfe329a45086cbb7fc5c20d45ac.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3717077e38f98d89eae729b6c14e56dc.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3717077e38f98d89eae729b6c14e56dc.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3756e81d3e149cf6099163ee79944fec.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3756e81d3e149cf6099163ee79944fec.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-395c35dd584b56b0789f58a0559beaf1.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-395c35dd584b56b0789f58a0559beaf1.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3c9de2ae0ea4bc91a510942dfa4be8d2.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3c9de2ae0ea4bc91a510942dfa4be8d2.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3cc70dbb64df5b21f1326cc24dee2195.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3cc70dbb64df5b21f1326cc24dee2195.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3e1f8f654357353bf0e04ba5c34b5f7f.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3e1f8f654357353bf0e04ba5c34b5f7f.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3e63ed8162808a9e425ed80a8bc79114.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3e63ed8162808a9e425ed80a8bc79114.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3eaa538115d76932653c21d8dc28f207.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-3eaa538115d76932653c21d8dc28f207.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4095eb84ef3874e2600247bee0b04026.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4095eb84ef3874e2600247bee0b04026.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-41521fade99856108931b4768b1b2648.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-41521fade99856108931b4768b1b2648.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-450da755d5bcb70906e1295e559b9602.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-450da755d5bcb70906e1295e559b9602.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-452225341522a7942f0f6aab1a5c91a3.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-452225341522a7942f0f6aab1a5c91a3.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4535823663ad81405188a528d8f2b1a2.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4535823663ad81405188a528d8f2b1a2.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4806e761d750087c2d734fc64596eaff.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4806e761d750087c2d734fc64596eaff.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4a0fdb40036e87b40aa08dd30584cb85.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4a0fdb40036e87b40aa08dd30584cb85.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4a38cc3e9cf104e69ba246d37f8cf135.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4a38cc3e9cf104e69ba246d37f8cf135.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4aca6a43e59aceee2166b0c7e4e85ef1.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4aca6a43e59aceee2166b0c7e4e85ef1.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4bfaa8ffa64c5ee560aa2daba7c9cbd3.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4bfaa8ffa64c5ee560aa2daba7c9cbd3.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4dc6d5f188d5c96d44815cd1e81aa885.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4dc6d5f188d5c96d44815cd1e81aa885.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4ddc14ed3eb0c3e46364317dfc0144a3.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4ddc14ed3eb0c3e46364317dfc0144a3.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4ee10ae43505e2e0bc62656ced49c0fa.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4ee10ae43505e2e0bc62656ced49c0fa.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4f50e5136e136527280bc902c5817561.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-4f50e5136e136527280bc902c5817561.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-51502f1206be09c565f1547c406e9558.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-51502f1206be09c565f1547c406e9558.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-51a0e808bbc8361236ac521a119758a3.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-51a0e808bbc8361236ac521a119758a3.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-52a84a22fd1369bffeaf21da2d6158dc.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-52a84a22fd1369bffeaf21da2d6158dc.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5330a2119a716e4e7224ed108b085dac.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5330a2119a716e4e7224ed108b085dac.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-543fa46ace099a7099dad69123399400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-543fa46ace099a7099dad69123399400.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-544fc28abe2c5c30e62383fd4dac255f.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-544fc28abe2c5c30e62383fd4dac255f.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-54acdfc2166ad7fcbd074f75fd4a56ba.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-54acdfc2166ad7fcbd074f75fd4a56ba.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5572b3513ba8df57a3d5d7303ee6b11b.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5572b3513ba8df57a3d5d7303ee6b11b.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-56467a5c8840c4d23a60b2f935114848.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-56467a5c8840c4d23a60b2f935114848.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-56a32a7689abd0326e57c10c6c069bb4.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-56a32a7689abd0326e57c10c6c069bb4.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-57862b464a55b18c7bf234ce22907d73.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-57862b464a55b18c7bf234ce22907d73.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-583d166e56ba0de4b77eabb47ef67839.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-583d166e56ba0de4b77eabb47ef67839.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5882ffa04f32584d26109137e2da4352.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5882ffa04f32584d26109137e2da4352.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-58fd02350d0bc52cf1ca3bb32ce9766e.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-58fd02350d0bc52cf1ca3bb32ce9766e.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5935a5775af3d5c6307ac667bd9ae74e.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5935a5775af3d5c6307ac667bd9ae74e.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-59e9ff77b0efaf684bc09274fb6908c9.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-59e9ff77b0efaf684bc09274fb6908c9.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5a1ce3117cfe90c48e8fb4a9a00f694d.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5a1ce3117cfe90c48e8fb4a9a00f694d.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5a45d991244d4c7140217e1e5f5ca4f4.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5a45d991244d4c7140217e1e5f5ca4f4.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5a7fac4b8b23a6e4e5ba0c9bf1756c91.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5a7fac4b8b23a6e4e5ba0c9bf1756c91.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5b0ed6971aaab9c8ad563230bd5471a7.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5b0ed6971aaab9c8ad563230bd5471a7.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5d2898fbc097a7e24c6f38d80587621e.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-5d2898fbc097a7e24c6f38d80587621e.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-603aefd23e350ba7eb124273e3c9bcf1.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-603aefd23e350ba7eb124273e3c9bcf1.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-60a3089806700d379f11827ee9843b6b.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-60a3089806700d379f11827ee9843b6b.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-60a41c7e1c68f22424e6d22df544bc82.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-60a41c7e1c68f22424e6d22df544bc82.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-642b26e2e5f5fb780b51b593dbc8c851.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-642b26e2e5f5fb780b51b593dbc8c851.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-66493ba5a8367f2928812f446f47b56a.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-66493ba5a8367f2928812f446f47b56a.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-670ba603758d94268e8606f240a42e12.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-670ba603758d94268e8606f240a42e12.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-671a2c20b1eb9e4ef8a192833940e319.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-671a2c20b1eb9e4ef8a192833940e319.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-684d65f1793cac449dde5d59cb3c47fb.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-684d65f1793cac449dde5d59cb3c47fb.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-69c09cc5fa3e55c74fc4821f76909cc3.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-69c09cc5fa3e55c74fc4821f76909cc3.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-6ae5b42180ad70b971c91e7eefb8eba2.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-6ae5b42180ad70b971c91e7eefb8eba2.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-6e092f71c1e634059ada0e52abadce67.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-6e092f71c1e634059ada0e52abadce67.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-6f3256af8454371776bc46670d33cc65.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-6f3256af8454371776bc46670d33cc65.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-6fe5c5973cc06f74b2387a631ea36b88.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-6fe5c5973cc06f74b2387a631ea36b88.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-70c2eb8d64e71a42a834eb857ea9df51.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-70c2eb8d64e71a42a834eb857ea9df51.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-70e811fd7994e61f408c923de6ddd078.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-70e811fd7994e61f408c923de6ddd078.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7197d6fda6cba7c3874c53d6381ca239.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7197d6fda6cba7c3874c53d6381ca239.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-72252d73220fa3cd856677888cee1635.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-72252d73220fa3cd856677888cee1635.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-72536a3d71b694a0d53dd90ddceae41e.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-72536a3d71b694a0d53dd90ddceae41e.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-726303e0774b4e678bff8c2deb6ca603.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-726303e0774b4e678bff8c2deb6ca603.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-733171b4ffcd17ea1fe1c0ba627173bf.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-733171b4ffcd17ea1fe1c0ba627173bf.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-739bc1a567439c7cffcd1614644593d2.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-739bc1a567439c7cffcd1614644593d2.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-73e309718fd16cea44b4d54a33581811.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-73e309718fd16cea44b4d54a33581811.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7494dc504ae00ee9cd0505f990f88c5d.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7494dc504ae00ee9cd0505f990f88c5d.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-74e2263a91439c25b91d5132ce9f4d62.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-74e2263a91439c25b91d5132ce9f4d62.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-761d05e3cd968cf574166867998ef06a.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-761d05e3cd968cf574166867998ef06a.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7718fe60986d8b42b1be9c5ace5ccf25.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7718fe60986d8b42b1be9c5ace5ccf25.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-774d4f764a1299da5d28ec2f2ffe0d69.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-774d4f764a1299da5d28ec2f2ffe0d69.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-79d494361ae093b69e74ee9dbe65bfd4.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-79d494361ae093b69e74ee9dbe65bfd4.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-79f007c1c6d07557120982951ea67998.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-79f007c1c6d07557120982951ea67998.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7a07ddc0f0c0f5f4a9bad6ee3dda66b5.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7a07ddc0f0c0f5f4a9bad6ee3dda66b5.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7ab2bed91166a9dca83a5ebfbe2a7f38.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7ab2bed91166a9dca83a5ebfbe2a7f38.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7ccce86603f80a099ddb0cb21d4ae3e3.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7ccce86603f80a099ddb0cb21d4ae3e3.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7e4bde7e9c7f84cd34d8a845e384c746.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7e4bde7e9c7f84cd34d8a845e384c746.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7e929f262f30c8ee78bf398150b1a7cd.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7e929f262f30c8ee78bf398150b1a7cd.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7eb9fffd1aa890d07d0f88cc82e6cfe4.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7eb9fffd1aa890d07d0f88cc82e6cfe4.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7f855356ab893b0d2b9c1c83b8116f0e.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-7f855356ab893b0d2b9c1c83b8116f0e.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-829615148e6357d826b9242eb7fbbd1e.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-829615148e6357d826b9242eb7fbbd1e.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-866fa7613df6b3fd272bcfd4530c0bb9.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-866fa7613df6b3fd272bcfd4530c0bb9.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-87599f94b6cc129d505b375798d0d751.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-87599f94b6cc129d505b375798d0d751.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8c2f33cee3993174f7e87c28e4bf42ee.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8c2f33cee3993174f7e87c28e4bf42ee.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8d3bcabb847b56243b16afe62adaaf21.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8d3bcabb847b56243b16afe62adaaf21.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8de5b863cb50dfefdd07cb11c774d579.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8de5b863cb50dfefdd07cb11c774d579.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8e9f97f01034820170065b2921b4fb5e.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8e9f97f01034820170065b2921b4fb5e.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8f476c4c99813d57cbe6eca4727388ad.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-8f476c4c99813d57cbe6eca4727388ad.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-903bb6865f3452e2fda42e3a25547bc5.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-903bb6865f3452e2fda42e3a25547bc5.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-91ddb2969bf2d31ba02ad82998d1314c.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-91ddb2969bf2d31ba02ad82998d1314c.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-938d90c10ff8c20386af7f242c05d6b0.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-938d90c10ff8c20386af7f242c05d6b0.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-93fc8f28a33234bcadf1527cafabd502.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-93fc8f28a33234bcadf1527cafabd502.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-95429962233afd82db1c27df1500a28c.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-95429962233afd82db1c27df1500a28c.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9544732d2e62d1a429674f8ee41b5d3a.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9544732d2e62d1a429674f8ee41b5d3a.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9592bfc861f07bcb8d75c196b370e548.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9592bfc861f07bcb8d75c196b370e548.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-95bfd249da4902577b4b7d76ebdd0b44.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-95bfd249da4902577b4b7d76ebdd0b44.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-968cffdc8ee679da094e77ebf50f58ef.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-968cffdc8ee679da094e77ebf50f58ef.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-97f7f48ce90c9429bf32ae51469db74d.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-97f7f48ce90c9429bf32ae51469db74d.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-982b630266d87db93d2539affb1275c6.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-982b630266d87db93d2539affb1275c6.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-98f2ad84457de7f3740d9920b8fa8667.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-98f2ad84457de7f3740d9920b8fa8667.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-99a16ef6a64934d5781933dbd9c46b2e.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-99a16ef6a64934d5781933dbd9c46b2e.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9cfb2a77a4e45025105ad29a1748b90d.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9cfb2a77a4e45025105ad29a1748b90d.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9d81066dd2b337c938df6e90380a00dc.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9d81066dd2b337c938df6e90380a00dc.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9eb5a99df4e76ac3363453ac9ca288b1.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-9eb5a99df4e76ac3363453ac9ca288b1.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a004ddfcb26e67bd6e678c8ed19e25ce.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a004ddfcb26e67bd6e678c8ed19e25ce.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a0ca5df4258213d7fc9fce80f65ce760.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a0ca5df4258213d7fc9fce80f65ce760.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a1f916d6039285c4ffb900cd654e418f.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a1f916d6039285c4ffb900cd654e418f.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a203b91dad570bf05a58c3c3ddb529bf.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a203b91dad570bf05a58c3c3ddb529bf.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a365e82ed54697a52f27adcea1315fe8.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a365e82ed54697a52f27adcea1315fe8.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a4c34be6d42152e64b0df90bc4607f64.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a4c34be6d42152e64b0df90bc4607f64.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a7accba310e821da5505f71c03b76bdb.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-a7accba310e821da5505f71c03b76bdb.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-aa0d470430e6391eca720c7cfa44446f.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-aa0d470430e6391eca720c7cfa44446f.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-aa5c9ca6cf4fba00433b7aa3fa10671a.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-aa5c9ca6cf4fba00433b7aa3fa10671a.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ac9ceb44437becc3e9c4dbfebab7fc2d.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ac9ceb44437becc3e9c4dbfebab7fc2d.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b1220a3c61f85cc0408deedb4c5f57a2.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b1220a3c61f85cc0408deedb4c5f57a2.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b358f7a51ece39a3247942b1feabdb29.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b358f7a51ece39a3247942b1feabdb29.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b57aaedfd8ebdf3931f25119dc6a5eb2.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b57aaedfd8ebdf3931f25119dc6a5eb2.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b5c1596551c256e0e9cf02028595b092.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b5c1596551c256e0e9cf02028595b092.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b6d128682ee29e471486354d486a1b90.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b6d128682ee29e471486354d486a1b90.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b6fd38ca30869792244804b04bc058da.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b6fd38ca30869792244804b04bc058da.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b7d203b051eff504ff59ddca7576b6a9.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b7d203b051eff504ff59ddca7576b6a9.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b96d9226ce77ec94ceca043d712182e6.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-b96d9226ce77ec94ceca043d712182e6.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ba3de316d63c7e339987b16f41a0b879.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ba3de316d63c7e339987b16f41a0b879.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-bafff7a14c27403dcc6cf1432e8ea836.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-bafff7a14c27403dcc6cf1432e8ea836.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-bd77e3c7f9e0b072d96af37f73d1aa32.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-bd77e3c7f9e0b072d96af37f73d1aa32.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-be549ab72f0719d606a5c01e2c0219b6.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-be549ab72f0719d606a5c01e2c0219b6.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c16ed9740b85badf16e86ea782a3062f.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c16ed9740b85badf16e86ea782a3062f.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c1f94158256bb1f3bf665b053d895af9.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c1f94158256bb1f3bf665b053d895af9.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c40533fdf4cc57177b12803598af7e59.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c40533fdf4cc57177b12803598af7e59.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c4a687ac4f0c2766eefc9f77ed99cddf.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c4a687ac4f0c2766eefc9f77ed99cddf.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c69f61a4ab18d0488c8d1fc12e7028e8.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c69f61a4ab18d0488c8d1fc12e7028e8.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c8b71798409ccc126ee264a00aadcf21.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c8b71798409ccc126ee264a00aadcf21.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c99eda15fc26a2941579560f76c3a5cf.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-c99eda15fc26a2941579560f76c3a5cf.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cb17fc3db95f6d139afc9d31a8e93293.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cb17fc3db95f6d139afc9d31a8e93293.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cbaaefaaf326668277aa24dfa93c4d28.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cbaaefaaf326668277aa24dfa93c4d28.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cd145ce4a0ea18469358df53c207bc1b.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cd145ce4a0ea18469358df53c207bc1b.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cdbce89e82cc1ab53a2decbf5819278f.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cdbce89e82cc1ab53a2decbf5819278f.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ce4884f96f11589608b76b726a755803.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ce4884f96f11589608b76b726a755803.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cf2cc71752631e579e35b0e423bf2638.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cf2cc71752631e579e35b0e423bf2638.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cf6ff4e0f491ca0cf3038187a997b9b4.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cf6ff4e0f491ca0cf3038187a997b9b4.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cfb211578629b7e8153b37240de6a9d5.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-cfb211578629b7e8153b37240de6a9d5.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-d0cf73942fea1c74edbdf0b3011f4656.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-d0cf73942fea1c74edbdf0b3011f4656.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-d2666cbed13462c5dc36fa2f15c202ca.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-d2666cbed13462c5dc36fa2f15c202ca.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-d3716376641d615e2995605b29bca7b6.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-d3716376641d615e2995605b29bca7b6.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-dac48066b5883d8b4551fc584f0c2a3e.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-dac48066b5883d8b4551fc584f0c2a3e.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-dbea1af6dcd9860be40c3d18254338f5.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-dbea1af6dcd9860be40c3d18254338f5.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e11567fd2accf9957cd0d3c2be937d87.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e11567fd2accf9957cd0d3c2be937d87.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e2ead7ea7da0437f085f42ffc05f8d13.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e2ead7ea7da0437f085f42ffc05f8d13.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e3fcf5180fd466c8915c4e8069491054.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e3fcf5180fd466c8915c4e8069491054.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e480d9c614742d05f0e78f274f1e69e6.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e480d9c614742d05f0e78f274f1e69e6.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e4bca6cfa53e499cae0a6be4894a90e9.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e4bca6cfa53e499cae0a6be4894a90e9.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e51ef413167c6e14e0c0fdcc585f2fc9.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e51ef413167c6e14e0c0fdcc585f2fc9.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e5f453bb04da18eed01675eeebd88bf8.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e5f453bb04da18eed01675eeebd88bf8.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e656f091b9dc4709722c9f4b84d3c797.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-e656f091b9dc4709722c9f4b84d3c797.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ec181b795ac1fb5a50d700b6e996d745.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ec181b795ac1fb5a50d700b6e996d745.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ee8bae97908d5147b423f77ad0d3c1bb.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-ee8bae97908d5147b423f77ad0d3c1bb.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f0f13b5c60e0af5553bd359f5513be1b.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f0f13b5c60e0af5553bd359f5513be1b.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f2b54d4e7be0eaefe1c2c56836fa5368.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f2b54d4e7be0eaefe1c2c56836fa5368.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f56414bf9bced67990def8660e306759.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f56414bf9bced67990def8660e306759.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f5d079153c99a25b9be5b8583c4cc8a7.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f5d079153c99a25b9be5b8583c4cc8a7.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f6032fc06eb20480f096199713f70885.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f6032fc06eb20480f096199713f70885.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f8ee5d36068a42b51d0e4a1116cfcec1.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/fonts/Xiaolai/Xiaolai-Regular-f8ee5d36068a42b51d0e4a1116cfcec1.woff2
--------------------------------------------------------------------------------
/packages/excalidraw/fonts/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./Fonts";
2 |
--------------------------------------------------------------------------------
/packages/excalidraw/gesture.ts:
--------------------------------------------------------------------------------
1 | import type { PointerCoords } from "./types";
2 |
3 | export const getCenter = (pointers: Map<number, PointerCoords>) => {
4 | const allCoords = Array.from(pointers.values());
5 | return {
6 | x: sum(allCoords, (coords) => coords.x) / allCoords.length,
7 | y: sum(allCoords, (coords) => coords.y) / allCoords.length,
8 | };
9 | };
10 |
11 | export const getDistance = ([a, b]: readonly PointerCoords[]) =>
12 | Math.hypot(a.x - b.x, a.y - b.y);
13 |
14 | const sum = <T>(array: readonly T[], mapper: (item: T) => number): number =>
15 | array.reduce((acc, item) => acc + mapper(item), 0);
16 |
--------------------------------------------------------------------------------
/packages/excalidraw/hooks/useCallbackRefState.ts:
--------------------------------------------------------------------------------
1 | import { useCallback, useState } from "react";
2 |
3 | export const useCallbackRefState = <T>() => {
4 | const [refValue, setRefValue] = useState<T | null>(null);
5 | const refCallback = useCallback((value: T | null) => setRefValue(value), []);
6 | return [refValue, refCallback] as const;
7 | };
8 |
--------------------------------------------------------------------------------
/packages/excalidraw/hooks/useCopiedIndicator.ts:
--------------------------------------------------------------------------------
1 | import { useCallback, useRef, useState } from "react";
2 |
3 | const TIMEOUT = 2000;
4 |
5 | export const useCopyStatus = () => {
6 | const [copyStatus, setCopyStatus] = useState<"success" | null>(null);
7 | const timeoutRef = useRef<number>(0);
8 |
9 | const onCopy = () => {
10 | clearTimeout(timeoutRef.current);
11 | setCopyStatus("success");
12 |
13 | timeoutRef.current = window.setTimeout(() => {
14 | setCopyStatus(null);
15 | }, TIMEOUT);
16 | };
17 |
18 | const resetCopyStatus = useCallback(() => {
19 | setCopyStatus(null);
20 | }, []);
21 |
22 | return {
23 | copyStatus,
24 | resetCopyStatus,
25 | onCopy,
26 | };
27 | };
28 |
--------------------------------------------------------------------------------
/packages/excalidraw/hooks/useEmitter.ts:
--------------------------------------------------------------------------------
1 | import { useEffect, useState } from "react";
2 |
3 | import type { Emitter } from "@excalidraw/common";
4 |
5 | export const useEmitter = <TEvent extends unknown>(
6 | emitter: Emitter<[TEvent]>,
7 | initialState: TEvent,
8 | ) => {
9 | const [event, setEvent] = useState<TEvent>(initialState);
10 |
11 | useEffect(() => {
12 | const unsubscribe = emitter.on((event) => {
13 | setEvent(event);
14 | });
15 |
16 | return () => {
17 | unsubscribe();
18 | };
19 | }, [emitter]);
20 |
21 | return event;
22 | };
23 |
--------------------------------------------------------------------------------
/packages/excalidraw/hooks/useStable.ts:
--------------------------------------------------------------------------------
1 | import { useRef } from "react";
2 |
3 | export const useStable = <T extends Record<string, any>>(value: T) => {
4 | const ref = useRef<T>(value);
5 | Object.assign(ref.current, value);
6 | return ref.current;
7 | };
8 |
--------------------------------------------------------------------------------
/packages/excalidraw/hooks/useStableCallback.ts:
--------------------------------------------------------------------------------
1 | import { useRef } from "react";
2 |
3 | /**
4 | * Returns a stable function of the same type.
5 | */
6 | export const useStableCallback = <T extends (...args: any[]) => any>(
7 | userFn: T,
8 | ) => {
9 | const stableRef = useRef<{ userFn: T; stableFn?: T }>({ userFn });
10 | stableRef.current.userFn = userFn;
11 |
12 | if (!stableRef.current.stableFn) {
13 | stableRef.current.stableFn = ((...args: any[]) =>
14 | stableRef.current.userFn(...args)) as T;
15 | }
16 |
17 | return stableRef.current.stableFn as T;
18 | };
19 |
--------------------------------------------------------------------------------
/packages/excalidraw/hooks/useTransition.ts:
--------------------------------------------------------------------------------
1 | import React, { useCallback } from "react";
2 |
3 | /** noop polyfill for v17. Subset of API available */
4 | function useTransitionPolyfill() {
5 | const startTransition = useCallback((callback: () => void) => callback(), []);
6 | return [false, startTransition] as const;
7 | }
8 |
9 | export const useTransition = React.useTransition || useTransitionPolyfill;
10 |
--------------------------------------------------------------------------------
/packages/excalidraw/locales/README.md:
--------------------------------------------------------------------------------
1 | ## How to contribute
2 |
3 | Please do not contribute changes directly to these files, as we manage them with Crowdin. Instead:
4 |
5 | - to request a new translation, [open an issue](https://github.com/excalidraw/excalidraw/issues/new/choose).
6 | - to update existing translations, [edit them on Crowdin](https://crowdin.com/translate/excalidraw/10) and we should have them included in the app soon!
7 |
8 | ## Completion of translation
9 |
10 | [percentages.json](./percentages.json) holds a percentage of completion for each language. We generate these automatically [on build time](./../../.github/workflows/locales-coverage.yml) when a new translation PR appears.
11 |
12 | We only make a language available on the app if it exceeds a certain threshold of completion.
13 |
--------------------------------------------------------------------------------
/packages/excalidraw/mermaid.test.ts:
--------------------------------------------------------------------------------
1 | import { isMaybeMermaidDefinition } from "./mermaid";
2 |
3 | describe("isMaybeMermaidDefinition", () => {
4 | it("should return true for a valid mermaid definition", () => {
5 | expect(isMaybeMermaidDefinition("flowchart")).toBe(true);
6 | expect(isMaybeMermaidDefinition("flowchart LR")).toBe(true);
7 | expect(isMaybeMermaidDefinition("flowchart LR\nola")).toBe(true);
8 | expect(isMaybeMermaidDefinition("%%{}%%flowchart")).toBe(true);
9 | expect(isMaybeMermaidDefinition("%%{}%% flowchart")).toBe(true);
10 |
11 | expect(isMaybeMermaidDefinition("graphs")).toBe(false);
12 | expect(isMaybeMermaidDefinition("this flowchart")).toBe(false);
13 | expect(isMaybeMermaidDefinition("this\nflowchart")).toBe(false);
14 | });
15 | });
16 |
--------------------------------------------------------------------------------
/packages/excalidraw/mermaid.ts:
--------------------------------------------------------------------------------
1 | /** heuristically checks whether the text may be a mermaid diagram definition */
2 | export const isMaybeMermaidDefinition = (text: string) => {
3 | const chartTypes = [
4 | "flowchart",
5 | "graph",
6 | "sequenceDiagram",
7 | "classDiagram",
8 | "stateDiagram",
9 | "stateDiagram-v2",
10 | "erDiagram",
11 | "journey",
12 | "gantt",
13 | "pie",
14 | "quadrantChart",
15 | "requirementDiagram",
16 | "gitGraph",
17 | "C4Context",
18 | "mindmap",
19 | "timeline",
20 | "zenuml",
21 | "sankey",
22 | "xychart",
23 | "block",
24 | ];
25 |
26 | const re = new RegExp(
27 | `^(?:%%{.*?}%%[\\s\\n]*)?\\b(?:${chartTypes
28 | .map((x) => `\\s*${x}(-beta)?`)
29 | .join("|")})\\b`,
30 | );
31 |
32 | return re.test(text.trim());
33 | };
34 |
--------------------------------------------------------------------------------
/packages/excalidraw/pwacompat.d.ts:
--------------------------------------------------------------------------------
1 | declare module "pwacompat";
2 |
--------------------------------------------------------------------------------
/packages/excalidraw/react-app-env.d.ts:
--------------------------------------------------------------------------------
1 | /// <reference types="react-scripts" />
2 |
--------------------------------------------------------------------------------
/packages/excalidraw/scene/index.ts:
--------------------------------------------------------------------------------
1 | export {
2 | isSomeElementSelected,
3 | getElementsWithinSelection,
4 | getSelectedElements,
5 | getTargetElements,
6 | } from "@excalidraw/element";
7 | export { calculateScrollCenter } from "./scroll";
8 | export {
9 | hasBackground,
10 | hasStrokeWidth,
11 | hasStrokeStyle,
12 | canHaveArrowheads,
13 | canChangeRoundness,
14 | } from "@excalidraw/element";
15 | export {
16 | getNormalizedZoom,
17 | getNormalizedGridSize,
18 | getNormalizedGridStep,
19 | } from "./normalize";
20 |
--------------------------------------------------------------------------------
/packages/excalidraw/scene/normalize.ts:
--------------------------------------------------------------------------------
1 | import { MAX_ZOOM, MIN_ZOOM } from "@excalidraw/common";
2 |
3 | import { clamp, round } from "@excalidraw/math";
4 |
5 | import type { NormalizedZoomValue } from "../types";
6 |
7 | export const getNormalizedZoom = (zoom: number): NormalizedZoomValue => {
8 | return clamp(round(zoom, 6), MIN_ZOOM, MAX_ZOOM) as NormalizedZoomValue;
9 | };
10 |
11 | export const getNormalizedGridSize = (gridStep: number) => {
12 | return clamp(Math.round(gridStep), 1, 100);
13 | };
14 |
15 | export const getNormalizedGridStep = (gridStep: number) => {
16 | return clamp(Math.round(gridStep), 1, 100);
17 | };
18 |
--------------------------------------------------------------------------------
/packages/excalidraw/shortcut.ts:
--------------------------------------------------------------------------------
1 | import { isDarwin } from "@excalidraw/common";
2 |
3 | import { t } from "./i18n";
4 |
5 | export const getShortcutKey = (shortcut: string): string =>
6 | shortcut
7 | .replace(
8 | /\b(Opt(?:ion)?|Alt)\b/i,
9 | isDarwin ? t("keys.option") : t("keys.alt"),
10 | )
11 | .replace(/\bShift\b/i, t("keys.shift"))
12 | .replace(/\b(Enter|Return)\b/i, t("keys.enter"))
13 | .replace(
14 | /\b(Ctrl|Cmd|Command|CtrlOrCmd)\b/gi,
15 | isDarwin ? t("keys.cmd") : t("keys.ctrl"),
16 | )
17 | .replace(/\b(Esc(?:ape)?)\b/i, t("keys.escape"))
18 | .replace(/\b(Space(?:bar)?)\b/i, t("keys.spacebar"))
19 | .replace(/\b(Del(?:ete)?)\b/i, t("keys.delete"));
20 |
--------------------------------------------------------------------------------
/packages/excalidraw/tests/__snapshots__/charts.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[`tryParseSpreadsheet > works for numbers with comma in them 1`] = `
4 | {
5 | "spreadsheet": {
6 | "labels": [
7 | "Week 1",
8 | "Week 2",
9 | "Week 3",
10 | ],
11 | "title": "Users",
12 | "values": [
13 | 814,
14 | 10301,
15 | 4264,
16 | ],
17 | },
18 | "type": "VALID_SPREADSHEET",
19 | }
20 | `;
21 |
--------------------------------------------------------------------------------
/packages/excalidraw/tests/charts.test.tsx:
--------------------------------------------------------------------------------
1 | import { tryParseSpreadsheet } from "../charts";
2 |
3 | describe("tryParseSpreadsheet", () => {
4 | it("works for numbers with comma in them", () => {
5 | const result = tryParseSpreadsheet(
6 | `Week Index${"\t"}Users
7 | Week 1${"\t"}814
8 | Week 2${"\t"}10,301
9 | Week 3${"\t"}4,264`,
10 | );
11 | expect(result).toMatchSnapshot();
12 | });
13 | });
14 |
--------------------------------------------------------------------------------
/packages/excalidraw/tests/fixtures/constants.ts:
--------------------------------------------------------------------------------
1 | export const DEER_IMAGE_DIMENSIONS = {
2 | width: 318,
3 | height: 335,
4 | };
5 |
6 | export const SMILEY_IMAGE_DIMENSIONS = {
7 | width: 56,
8 | height: 77,
9 | };
10 |
--------------------------------------------------------------------------------
/packages/excalidraw/tests/fixtures/deer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/tests/fixtures/deer.png
--------------------------------------------------------------------------------
/packages/excalidraw/tests/fixtures/diagramFixture.ts:
--------------------------------------------------------------------------------
1 | import { VERSIONS } from "@excalidraw/common";
2 |
3 | import {
4 | diamondFixture,
5 | ellipseFixture,
6 | rectangleFixture,
7 | } from "./elementFixture";
8 |
9 | export const diagramFixture = {
10 | type: "excalidraw",
11 | version: VERSIONS.excalidraw,
12 | source: "https://excalidraw.com",
13 | elements: [diamondFixture, ellipseFixture, rectangleFixture],
14 | appState: {
15 | viewBackgroundColor: "#ffffff",
16 | gridModeEnabled: false,
17 | },
18 | files: {},
19 | };
20 |
21 | export const diagramFactory = ({
22 | overrides = {},
23 | elementOverrides = {},
24 | } = {}) => ({
25 | ...diagramFixture,
26 | elements: [
27 | { ...diamondFixture, ...elementOverrides },
28 | { ...ellipseFixture, ...elementOverrides },
29 | { ...rectangleFixture, ...elementOverrides },
30 | ],
31 | ...overrides,
32 | });
33 |
34 | export default diagramFixture;
35 |
--------------------------------------------------------------------------------
/packages/excalidraw/tests/fixtures/fixture_library.excalidrawlib:
--------------------------------------------------------------------------------
1 | {
2 | "type": "excalidrawlib",
3 | "version": 1,
4 | "library": [
5 | [
6 | {
7 | "type": "rectangle",
8 | "version": 38,
9 | "versionNonce": 1046419680,
10 | "isDeleted": false,
11 | "id": "A",
12 | "fillStyle": "hachure",
13 | "strokeWidth": 1,
14 | "strokeStyle": "solid",
15 | "roughness": 1,
16 | "opacity": 100,
17 | "angle": 0,
18 | "x": 21801,
19 | "y": 719.5,
20 | "strokeColor": "#c92a2a",
21 | "backgroundColor": "#e64980",
22 | "width": 50,
23 | "height": 30,
24 | "seed": 117297479,
25 | "groupIds": [],
26 | "strokeSharpness": "sharp",
27 | "boundElementIds": []
28 | }
29 | ]
30 | ]
31 | }
32 |
--------------------------------------------------------------------------------
/packages/excalidraw/tests/fixtures/smiley.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/tests/fixtures/smiley.png
--------------------------------------------------------------------------------
/packages/excalidraw/tests/fixtures/smiley_embedded_v2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/tests/fixtures/smiley_embedded_v2.png
--------------------------------------------------------------------------------
/packages/excalidraw/tests/fixtures/test_embedded_v1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/packages/excalidraw/tests/fixtures/test_embedded_v1.png
--------------------------------------------------------------------------------
/packages/excalidraw/tests/helpers/colorize.ts:
--------------------------------------------------------------------------------
1 | export const yellow = (str: string) => `\u001b[33m${str}\u001b[0m`;
2 | export const red = (str: string) => `\u001b[31m${str}\u001b[0m`;
3 |
--------------------------------------------------------------------------------
/packages/excalidraw/tests/helpers/constants.ts:
--------------------------------------------------------------------------------
1 | export const INITIALIZED_IMAGE_PROPS = {
2 | type: "image",
3 | fileId: expect.any(String),
4 | x: expect.toBeNonNaNNumber(),
5 | y: expect.toBeNonNaNNumber(),
6 | };
7 |
--------------------------------------------------------------------------------
/packages/excalidraw/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.base.json",
3 | "compilerOptions": {
4 | "outDir": "./dist/types"
5 | },
6 | "include": ["**/*"],
7 | "exclude": ["**/*.test.*", "tests", "types", "examples", "dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/math/README.md:
--------------------------------------------------------------------------------
1 | # @excalidraw/math
2 |
3 | ## Install
4 |
5 | ```bash
6 | npm install @excalidraw/math
7 | ```
8 |
9 | If you prefer Yarn over npm, use this command to install the Excalidraw utils package:
10 |
11 | ```bash
12 | yarn add @excalidraw/math
13 | ```
14 |
15 | With PNPM, similarly install the package with this command:
16 |
17 | ```bash
18 | pnpm add @excalidraw/math
19 | ```
20 |
--------------------------------------------------------------------------------
/packages/math/global.d.ts:
--------------------------------------------------------------------------------
1 | /// <reference types="vite/client" />
2 | import "@excalidraw/excalidraw/global";
3 | import "@excalidraw/excalidraw/css";
4 |
--------------------------------------------------------------------------------
/packages/math/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./angle";
2 | export * from "./curve";
3 | export * from "./ellipse";
4 | export * from "./line";
5 | export * from "./point";
6 | export * from "./polygon";
7 | export * from "./range";
8 | export * from "./rectangle";
9 | export * from "./segment";
10 | export * from "./triangle";
11 | export * from "./types";
12 | export * from "./vector";
13 | export * from "./utils";
14 |
--------------------------------------------------------------------------------
/packages/math/tests/point.test.ts:
--------------------------------------------------------------------------------
1 | import { pointFrom, pointRotateRads } from "../src/point";
2 |
3 | import type { Radians } from "../src/types";
4 |
5 | describe("rotate", () => {
6 | it("should rotate over (x2, y2) and return the rotated coordinates for (x1, y1)", () => {
7 | const x1 = 10;
8 | const y1 = 20;
9 | const x2 = 20;
10 | const y2 = 30;
11 | const angle = (Math.PI / 2) as Radians;
12 | const [rotatedX, rotatedY] = pointRotateRads(
13 | pointFrom(x1, y1),
14 | pointFrom(x2, y2),
15 | angle,
16 | );
17 | expect([rotatedX, rotatedY]).toEqual([30, 20]);
18 | const res2 = pointRotateRads(
19 | pointFrom(rotatedX, rotatedY),
20 | pointFrom(x2, y2),
21 | -angle as Radians,
22 | );
23 | expect(res2).toEqual([x1, x2]);
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/packages/math/tests/segment.test.ts:
--------------------------------------------------------------------------------
1 | import { pointFrom } from "../src/point";
2 | import { lineSegment, lineSegmentIntersectionPoints } from "../src/segment";
3 |
4 | describe("line-segment intersections", () => {
5 | it("should correctly detect intersection", () => {
6 | expect(
7 | lineSegmentIntersectionPoints(
8 | lineSegment(pointFrom(0, 0), pointFrom(5, 0)),
9 | lineSegment(pointFrom(2, -2), pointFrom(3, 2)),
10 | ),
11 | ).toEqual(pointFrom(2.5, 0));
12 | });
13 | it("should correctly detect non-intersection", () => {
14 | expect(
15 | lineSegmentIntersectionPoints(
16 | lineSegment(pointFrom(0, 0), pointFrom(5, 0)),
17 | lineSegment(pointFrom(3, 1), pointFrom(4, 4)),
18 | ),
19 | ).toEqual(null);
20 | });
21 | });
22 |
--------------------------------------------------------------------------------
/packages/math/tests/vector.test.ts:
--------------------------------------------------------------------------------
1 | import { isVector } from "../src/vector";
2 |
3 | describe("Vector", () => {
4 | test("isVector", () => {
5 | expect(isVector([5, 5])).toBe(true);
6 | expect(isVector([-5, -5])).toBe(true);
7 | expect(isVector([5, 0.5])).toBe(true);
8 | expect(isVector(null)).toBe(false);
9 | expect(isVector(undefined)).toBe(false);
10 | expect(isVector([5, NaN])).toBe(false);
11 | });
12 | });
13 |
--------------------------------------------------------------------------------
/packages/math/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.base.json",
3 | "compilerOptions": {
4 | "outDir": "./dist/types"
5 | },
6 | "include": ["src/**/*", "global.d.ts"],
7 | "exclude": ["**/*.test.*", "tests", "types", "examples", "dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/packages/utils/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | ## [Unreleased]
4 |
5 | First release of `@excalidraw/utils` to provide utilities functions.
6 |
7 | - Added `exportToBlob` and `exportToSvg` to export an Excalidraw diagram definition, respectively, to a [Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob) and to a [SVGElement](https://developer.mozilla.org/en-US/docs/Web/API/SVGElement) ([#2246](https://github.com/excalidraw/excalidraw/pull/2246))
8 |
9 | ### Features
10 |
11 | - Flip single elements horizontally or vertically [#2520](https://github.com/excalidraw/excalidraw/pull/2520)
12 |
--------------------------------------------------------------------------------
/packages/utils/global.d.ts:
--------------------------------------------------------------------------------
1 | /// <reference types="vite/client" />
2 | import "@excalidraw/excalidraw/global";
3 | import "@excalidraw/excalidraw/css";
4 |
--------------------------------------------------------------------------------
/packages/utils/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./export";
2 | export * from "./withinBounds";
3 | export * from "./bbox";
4 | export { getCommonBounds } from "@excalidraw/element";
5 |
--------------------------------------------------------------------------------
/packages/utils/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.base.json",
3 | "compilerOptions": {
4 | "outDir": "./dist/types"
5 | },
6 | "include": ["src/**/*", "global.d.ts"],
7 | "exclude": ["**/*.test.*", "tests", "types", "examples", "dist"]
8 | }
9 |
--------------------------------------------------------------------------------
/public/Assistant-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/Assistant-Regular.woff2
--------------------------------------------------------------------------------
/public/Cascadia.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/Cascadia.woff2
--------------------------------------------------------------------------------
/public/Virgil.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/Virgil.woff2
--------------------------------------------------------------------------------
/public/_headers:
--------------------------------------------------------------------------------
1 | /*
2 | Access-Control-Allow-Origin: *
3 |
--------------------------------------------------------------------------------
/public/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/android-chrome-192x192.png
--------------------------------------------------------------------------------
/public/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/android-chrome-512x512.png
--------------------------------------------------------------------------------
/public/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/apple-touch-icon.png
--------------------------------------------------------------------------------
/public/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/favicon-16x16.png
--------------------------------------------------------------------------------
/public/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/favicon-32x32.png
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/favicon.ico
--------------------------------------------------------------------------------
/public/maskable_icon_x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/maskable_icon_x192.png
--------------------------------------------------------------------------------
/public/maskable_icon_x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/maskable_icon_x512.png
--------------------------------------------------------------------------------
/public/og-image-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/og-image-3.png
--------------------------------------------------------------------------------
/public/oss_promo_comments_dark.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/oss_promo_comments_dark.jpg
--------------------------------------------------------------------------------
/public/oss_promo_comments_light.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/oss_promo_comments_light.jpg
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: Twitterbot
2 | Disallow:
3 |
4 | User-agent: facebookexternalhit
5 | Disallow:
6 |
7 | User-agent: *
8 | Allow: /$
9 | Allow: /
10 | Allow: /sitemap.xml
11 | Disallow: /
12 |
13 | Sitemap: https://excalidraw.com/sitemap.xml
14 |
--------------------------------------------------------------------------------
/public/screenshots/collaboration.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/screenshots/collaboration.png
--------------------------------------------------------------------------------
/public/screenshots/export.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/screenshots/export.png
--------------------------------------------------------------------------------
/public/screenshots/illustration.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/screenshots/illustration.png
--------------------------------------------------------------------------------
/public/screenshots/shapes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/screenshots/shapes.png
--------------------------------------------------------------------------------
/public/screenshots/virtual-whiteboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/screenshots/virtual-whiteboard.png
--------------------------------------------------------------------------------
/public/screenshots/wireframe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/public/screenshots/wireframe.png
--------------------------------------------------------------------------------
/public/service-worker.js:
--------------------------------------------------------------------------------
1 | // Since we migrated to Vite, the service worker strategy changed, in CRA it was a custom service worker named service-worker.js and in Vite its sw.js handled by vite-plugin-pwa
2 | // Due to this the existing CRA users were not able to migrate to Vite or any new changes post Vite unless browser is hard refreshed
3 | // Hence adding a self destroying worker so all CRA service workers are destroyed and migrated to Vite
4 | // We should remove this code after sometime when we are confident that
5 | // all users have migrated to Vite
6 |
7 | self.addEventListener("install", () => {
8 | self.skipWaiting();
9 | });
10 |
11 | self.addEventListener("activate", () => {
12 | self.registration
13 | .unregister()
14 | .then(() => {
15 | return self.clients.matchAll();
16 | })
17 | .then((clients) => {
18 | clients.forEach((client) => client.navigate(client.url));
19 | });
20 | });
21 |
--------------------------------------------------------------------------------
/scripts/buildDocs.js:
--------------------------------------------------------------------------------
1 | const { exec } = require("child_process");
2 |
3 | // get files changed between prev and head commit
4 | exec(`git diff --name-only HEAD^ HEAD`, async (error, stdout, stderr) => {
5 | if (error || stderr) {
6 | console.error(error);
7 | process.exit(1);
8 | }
9 | const changedFiles = stdout.trim().split("\n");
10 |
11 | const docFiles = changedFiles.filter((file) => {
12 | return file.indexOf("docs") >= 0;
13 | });
14 |
15 | if (!docFiles.length) {
16 | console.info("Skipping building docs as no valid diff found");
17 | process.exit(0);
18 | }
19 | // Exit code 1 to build the docs in ignoredBuildStep
20 | process.exit(1);
21 | });
22 |
--------------------------------------------------------------------------------
/scripts/wasm/hb-subset.wasm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/scripts/wasm/hb-subset.wasm
--------------------------------------------------------------------------------
/scripts/wasm/woff2.wasm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/scripts/wasm/woff2.wasm
--------------------------------------------------------------------------------
/scripts/woff2/assets/LiberationSans-Regular-2048.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/scripts/woff2/assets/LiberationSans-Regular-2048.ttf
--------------------------------------------------------------------------------
/scripts/woff2/assets/LiberationSans-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/scripts/woff2/assets/LiberationSans-Regular.ttf
--------------------------------------------------------------------------------
/scripts/woff2/assets/NotoEmoji-Regular-2048.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/scripts/woff2/assets/NotoEmoji-Regular-2048.ttf
--------------------------------------------------------------------------------
/scripts/woff2/assets/NotoEmoji-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/scripts/woff2/assets/NotoEmoji-Regular.ttf
--------------------------------------------------------------------------------
/scripts/woff2/assets/Xiaolai-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/excalidraw/excalidraw/f2600fe3e835bad81b3c6eb9aeae58e7974ccea1/scripts/woff2/assets/Xiaolai-Regular.ttf
--------------------------------------------------------------------------------