The response has been limited to 50k tokens of the smallest files in the repo. You can remove this limitation by removing the max tokens filter.
├── .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


--------------------------------------------------------------------------------