Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
209 commits
Select commit Hold shift + click to select a range
b660478
fix: prevent translation of excalidraw container (#10389)
dwelle Nov 22, 2025
d7e63e6
fix: rounded left and top clipped image export to SVG (#10387)
zsviczian Nov 24, 2025
c141960
feat: Non-elbow arrow snapping and behavior changes (#9670)
mtolmacs Nov 25, 2025
019ce4c
fix: Corner jumping & hints (#10403)
mtolmacs Nov 26, 2025
210dc85
fix: do not finalize multi-point lines if binding not enabled (#10410)
dwelle Nov 26, 2025
7497a08
fix: Frame and Frame Element binding highlight offset (#10423)
zsviczian Dec 1, 2025
51ad895
chore: Update translations from Crowdin (#10316)
excalibot Dec 1, 2025
06f01e1
style: remove blue lines (#10425)
eolesinski Dec 1, 2025
451bcac
fix: Ctrl/Alt elbow arrow jumps (#10432)
mtolmacs Dec 1, 2025
d080833
chore: bump typescript@5.9.3 (#10431)
dwelle Dec 1, 2025
8d18078
fix: Box selection of arrows (#10451)
mtolmacs Dec 3, 2025
bf4c65f
fix: Turn into inside bind when angle locked (#10479)
mtolmacs Dec 9, 2025
f06484c
fix: Angle snapping around bindable objects incorrectly resolves (#10…
mtolmacs Dec 15, 2025
becaabf
chore: bump node@20 in ci workflows (#10531)
dwelle Dec 16, 2025
859207b
fix: Broken bindings during collab (#10537)
mtolmacs Dec 17, 2025
071b17a
fix: Embeddables lost stroke color option in element properties after…
zsviczian Dec 19, 2025
7cc31ac
fix: Context menu paste adding image twice #10542 (#10543)
s1lverfish Dec 20, 2025
d87620b
fix: Circular reference (#10544)
mtolmacs Dec 21, 2025
e95222e
fix: add constants and side methods to packages (#10418)
ryan-di Dec 28, 2025
0586fc1
feat: add qr code to live session share dialog. (#10588)
Kiizon Jan 2, 2026
6c90855
fix: reconciliation of server updates & refactor restore (#10597)
dwelle Jan 4, 2026
b5fc873
chore: Update translations from Crowdin (#10453)
excalibot Jan 4, 2026
63e1148
feat: stop using CSS filters for dark mode (static canvas) (#10578)
dwelle Jan 4, 2026
c158187
fix: grid color in dark mode (#10600)
dwelle Jan 4, 2026
87faa5d
fix: sentry CI worfklow (#10610)
dwelle Jan 6, 2026
cc6c29c
fix: update wysiwyg color on theme change (#10618)
dwelle Jan 7, 2026
b9a2554
refactor: update SCSS syntax & remove open-color dep (#10633)
dwelle Jan 10, 2026
da59205
fix: Curve endpoint intersection (#10640)
mtolmacs Jan 12, 2026
3b97f5a
feat: move visualdebug to utils and introduce volume bindable visuali…
mtolmacs Jan 12, 2026
6ebf522
fix: Elbow end point disconnect (#10646)
mtolmacs Jan 15, 2026
a0b98a9
feat: TextToDiagram v2 (#10530)
tamas-excalidraw Jan 15, 2026
24a6941
fix: retries and related UX fixes (#10657)
dwelle Jan 16, 2026
5a73b9a
refactor: change TTD persistence to iDB (#10662)
dwelle Jan 16, 2026
0443511
fix: tweak error display in ttd (#10668)
dwelle Jan 17, 2026
9d76033
feat: reduce max tablet MQ size (#10669)
dwelle Jan 18, 2026
1f47d61
chore: bump node in tests.yml (#10670)
dwelle Jan 19, 2026
0988ecf
fix: Angle-locked line history (#10677)
mtolmacs Jan 20, 2026
60ab14c
fix: fail gracefully during restore (#10673)
dwelle Jan 20, 2026
9ba0f5d
fix: Arrow drag start in bindable area jumps across bindable (#10676)
mtolmacs Jan 20, 2026
3c8e893
fix: keep input focus during generation (#10679)
dwelle Jan 20, 2026
84a309d
fix: ttd 429 error handling (#10680)
dwelle Jan 21, 2026
acf54c6
fix: dropdownMenu item badge position (#10682)
dwelle Jan 21, 2026
6135548
fix: rerender TTD preview on message remove (#10681)
dwelle Jan 21, 2026
d5e37cd
fix: set link icon opacity based on element opacity (#10693)
zsviczian Jan 24, 2026
60759d3
fix: Regression - invert SVGs in Dark Mode (#10695)
zsviczian Jan 24, 2026
28691e1
fix: Bound arrow elements for distribute and wyswig updates (#10702)
cTangonan123 Jan 26, 2026
dfdd994
perf: Cache hits in collision detection (#10648)
mtolmacs Jan 26, 2026
54fa0c9
fix: Increase iteration on curve intersection calc (#10707)
mtolmacs Jan 26, 2026
6a89136
fix: Arrow endpoint offset (#10706)
mtolmacs Jan 26, 2026
f5cf81c
feat: prevent pasting excalidraw into textarea & paste element text i…
dwelle Jan 28, 2026
802cde3
feat: support customizing TTD welcome screen (#10719)
dwelle Jan 30, 2026
216afc3
fix: Coherent stats binding (#10718)
mtolmacs Jan 30, 2026
b552c60
feat: Focus indicator (#10613)
mtolmacs Jan 31, 2026
dfa1ce5
fix: SVG Inversion on Safari (#10712)
zsviczian Jan 31, 2026
94364af
fix: Clarify welcome screen message about browser storage limitations…
Yashh56 Jan 31, 2026
f7b537a
feat(packages/excalidraw): export CommandPalette (#10724)
dwelle Jan 31, 2026
f12ae80
chore: Update translations from Crowdin (#10598)
excalibot Jan 31, 2026
b57f3e0
fix(editor): image positioning in crop editor (#10726)
dwelle Feb 1, 2026
d29fd62
fix(editor): crop editor cursor drift (#10727)
dwelle Feb 1, 2026
54a9826
fix(editor): copying to clipboard with no ClipboardEvent (#10729)
dwelle Feb 1, 2026
f39ac4a
fix(editor): On focus drag only update other binding if it's orbit (#…
mtolmacs Feb 2, 2026
83d3943
feat(editor): reduce binding gap (#10739)
dwelle Feb 5, 2026
b43260d
fix: Other binding converted from fixed to orbit unconditionally (#10…
mtolmacs Feb 6, 2026
063533a
feat(packages/excalidraw): support nested dropdown menu (#10749)
dwelle Feb 8, 2026
3a5ef40
feat(app): add preferences to main menu (#10760)
dwelle Feb 8, 2026
1c8e8bb
fix: Arrow update when cloned (#10747)
mtolmacs Feb 9, 2026
a70417f
feat(editor): visualize binding midpoints + support for simple arrows…
mtolmacs Feb 11, 2026
8b3e149
fix: hex8 regression #10578 (#10773)
zsviczian Feb 12, 2026
89a9bad
fix: update arrowhead property defaultValue handling (#10778)
cTangonan123 Feb 13, 2026
46ddd60
feat(editor): support embedding google drive videos (#10788)
dwelle Feb 16, 2026
ffcb67b
fix: Inside-inside bound arrow endpoint drag trigger focus point edit…
mtolmacs Feb 16, 2026
c1e00c4
fix: convert ArrowheadNoneIcon to component matching arrowhead icon p…
cTangonan123 Feb 17, 2026
5852d0d
fix: Arrow overlap arrow behavior (#10732)
mtolmacs Feb 17, 2026
4c3d037
feat(editor): allow clicking on links and embeds with laser tool (#10…
dwelle Feb 19, 2026
eb95912
feat(editor): allow laser-pointing in view mode (#10802)
dwelle Feb 20, 2026
b0404b1
chore(debug): add debug.logChanged() and make easy to import (#10828)
dwelle Feb 23, 2026
7ea3229
fix(editor): Hardened fixed point and bound element parsing in restor…
mtolmacs Feb 23, 2026
0b3a5e7
fix: Multi-point arrow bound point update (#10831)
mtolmacs Feb 24, 2026
2874f9e
fix(editor): simplify and fix midpoint highlighting (#10832)
dwelle Feb 24, 2026
cae9d2b
fix: "hand" tool active after exiting view mode if laser point was us…
zsviczian Feb 26, 2026
60b2758
feat(editor): support radar chart and multiple series for other chart…
dwelle Feb 26, 2026
437595f
feat: Arrow binding is a preference (#10839)
mtolmacs Mar 3, 2026
d1cff91
fix: spacing in the left menu (#10880)
heinrich26 Mar 3, 2026
47c2542
fix(editor): disable snap-to-midpoint menu item when arrow-binding di…
dwelle Mar 4, 2026
c1dbbdf
feat(editor): mermaid code editor & improve parsing (#10897)
dwelle Mar 5, 2026
499e9d6
fix: dropdownMenu item badge position (#10895)
heinrich26 Mar 6, 2026
a0e93b6
feat(editor): sync export theme with ui theme (#10903)
dwelle Mar 6, 2026
757dfeb
fix(editor): call throttleRAF with lastArgs and remove trailing (#10905)
dwelle Mar 6, 2026
3d8c12f
fix(editor): do not conditionally disable midpoint snapping menu pref…
dwelle Mar 6, 2026
fa1f7d9
feat(packages/excalidraw): export throttleRAF (#10912)
dwelle Mar 7, 2026
21dd1cf
feat(packages/excalidraw): state tracking, api hook, and others (#10870)
dwelle Mar 8, 2026
e73a5b0
docs(packages/excalidraw): improve readme (#10932)
dwelle Mar 11, 2026
92d2544
feat(packages/excalidraw): tweak and expose more API around state and…
dwelle Mar 11, 2026
816c81c
feat(editor): ERD arrowheads and diagrams (#10940)
dwelle Mar 11, 2026
b4ce7c7
fix(editor): arrowhead picker overflowing viewport (#10943)
dwelle Mar 12, 2026
c9ba7f8
chore(editor): bump @excalidraw/mermaid-to-excalidraw@2.1.1 (#10944)
dwelle Mar 12, 2026
2b0e4c9
fix(editor): remove leftover debug code path (#10954)
dwelle Mar 14, 2026
e8b4620
feat(editor): put caret at pointer coords when clicking on selected t…
dwelle Mar 18, 2026
81ab857
feat(editor): various text related improvements (#10979)
dwelle Mar 19, 2026
987173b
fix: Arrow point index Out-of-Bounds (#10922)
mtolmacs Mar 21, 2026
a9ca16e
chore(packages/excalidraw): export Fonts helper class (#11008)
dwelle Mar 21, 2026
75789f6
fix: Other endpoint is not immediately updated on midpoint snap (#10933)
mtolmacs Mar 23, 2026
d6f0f34
fix: Rotated rounded arrow center point (#10962)
mtolmacs Mar 23, 2026
1c292e4
fix(math): correctly validate second point in isLineSegment (#11007)
Kundan-CR7 Mar 24, 2026
c108292
feat(editor): support mermaid staate diagrams (#11031)
dwelle Mar 24, 2026
c09e170
feat(editor): deselect on esc (#11035)
dwelle Mar 25, 2026
4a5c9e9
fix(editor): ensure font picker font names are not quoted (#11036)
dwelle Mar 25, 2026
4be4cc0
fix: pin 9 actions to commit SHA (#11075)
dagecko Mar 30, 2026
d9e8a33
feat(editor): implement overlap box selection (#11053)
dwelle Apr 1, 2026
e18c1dd
Fix typo in Discord badge URL parameter (#11096)
NANDGOPALSHARMA-29 Apr 2, 2026
1caec99
docs: change twitter label by X (#11158)
VoluteTech Apr 13, 2026
b1c6bfc
chore(docker): bump node (#11208)
dwelle Apr 20, 2026
2e1a529
fix(editor): remove extremely large arrows on restore (#11235)
mtolmacs Apr 25, 2026
43fa4b5
fix: frame selection and membership (#11250)
dwelle Apr 28, 2026
278cd35
feat(editor): scale video embeddables based on zoom (#11251)
dwelle Apr 28, 2026
3f5fdec
fix: group defragmenting (#11269)
dwelle May 2, 2026
2dfcc6f
chore: Remove startBoundElement from state (#11264)
mtolmacs May 2, 2026
3004c64
fix: Fractional index validation (#11258)
mtolmacs May 4, 2026
d255747
fix(editor): fix target element index when creating/adding elements t…
dwelle May 5, 2026
974b338
fix: Group selection (#11234)
mtolmacs May 6, 2026
7f56cc0
fix: Speculative fixes for arrow invariant failures (#11241)
mtolmacs May 6, 2026
c59fb8d
fix: LocalStorage is empty object on node@25 which breaks tests (#11240)
mtolmacs May 6, 2026
97274a7
ci(repo): enforce scopes (#11292)
dwelle May 6, 2026
091b905
fix(editor): enabled ctrl+y redo shortcut on linux and mac (#11179)
sznmelvin May 6, 2026
d992c10
fix(app): resolve app-jotai import path in LocalData (#11290)
alechulkin May 6, 2026
b2b2815
fix(editor): prevent duplicate lasso toolbar item (#11286)
praneethhere May 6, 2026
0457ac9
fix(editor): handle invalid points on restore (#11321)
dwelle May 12, 2026
f6d85bc
feat(packages/excalidraw): expose image size config and optimize resi…
dwelle May 14, 2026
b42b1a1
fix(editor): excessive battery usage (#11377)
mtolmacs May 24, 2026
c08be69
ci(docker): fix docker dep bundling and pin remaining actions (#11398)
dwelle May 25, 2026
3372149
feat(packages/excalidraw): export applyDarkModeFilter and simplify (#…
dwelle Jun 1, 2026
b6d80e4
fix(packages/excalidraw): consolidate bounds checks (#11275)
mtolmacs Jun 4, 2026
647a264
feat(packages/excalidraw): consolidate theme state handling (#11453)
dwelle Jun 6, 2026
61fe15a
fix(editor): cardinal direction arrows with label are invisible in ex…
krishhna24 Jun 7, 2026
0cf56b1
test(editor): add unit tests for BinaryHeap (#11419)
krishhna24 Jun 10, 2026
a83ac48
fix(editor): recalculate roundness type when switching shape types (#…
augustocbx Jun 11, 2026
b324a85
fix(editor): elements duplicated when moving frame children (#11485)
dwelle Jun 13, 2026
0699826
fix(editor): update `element.frameId` on frame change (#11490)
dwelle Jun 13, 2026
1cb9fff
fix(editor): Double history (#11445)
mtolmacs Jun 15, 2026
28a9b17
test(repo): less noisy test output (#11505)
dwelle Jun 15, 2026
0642e72
fix(editor): Arrows with text are rendered blurry in PNG export with …
zsviczian Jun 22, 2026
cd514d7
feat(editor): LaserPointer based freedraw (#11507)
mtolmacs Jun 24, 2026
070df27
fix(editor): Modern TS require imports from rootDir (#11552)
mtolmacs Jun 24, 2026
2a82821
fix(editor): tweak freedraw settings and tablet UI/UX (#11551)
dwelle Jun 24, 2026
20f694d
fix(editor): prevent freeze from extremely large line elements (#11556)
minato32 Jun 25, 2026
e4c70cb
feat(editor): AnimationController for scrollToContent (#11553)
mtolmacs Jun 26, 2026
c070c8f
fix(editor): improve scroll animation interpolation (#11562)
dwelle Jun 26, 2026
4ce70b8
fix(editor): ensure canvas is cleared when background color is invali…
Danyccsf Jun 26, 2026
cce5001
fix(editor): keep eraser shortcut consistent with tool switch rules (…
anviik Jun 29, 2026
51ca8ab
feat(packages/excalidraw): viewport locking (#11554)
mtolmacs Jul 3, 2026
5b0f5a4
fix(editor): revert viewport animation back to 500ms (#11600)
dwelle Jul 5, 2026
9357f98
fix(editor): optimize UI rendering during animation (#11604)
dwelle Jul 5, 2026
aaa14e9
feat(editor): show cursor hint when switching arrow types (#11608)
dwelle Jul 7, 2026
b2a729c
feat(editor): dblclick to toggle arrowhead (#11615)
dwelle Jul 7, 2026
dd8296a
fix(editor): narrow `NonDeleted` type to `isDeleted: false` (#11470)
augustocbx Jul 7, 2026
ba0387d
chore(editor): Update translations from Crowdin (#10731)
excalibot Jul 7, 2026
8462bb8
fix(editor): Very small bindables can blow up fixedPoint -> position …
mtolmacs Jul 8, 2026
fbff832
fix(editor): Fix binding.test.ts type mismatch (#11633)
mtolmacs Jul 8, 2026
063e025
fix(editor): arrow label rendering fixes and perf improvements (#11637)
dwelle Jul 8, 2026
f790bf7
feat(editor): tweak sidebar promo style (#11181)
dwelle Jul 9, 2026
adf9631
fix(editor): keep multi-line bound text and container centered during…
cTangonan123 Jul 9, 2026
3b9e1c0
fix(editor): Dragged arrow endpoint ignore grid and angle locks (#10972)
mtolmacs Jul 10, 2026
ed7c0c1
chore(editor): Refactor Actions for clarity (#11632)
mtolmacs Jul 11, 2026
339d3c3
feat(editor): toolbar / active tool rewrites (#11649)
dwelle Jul 12, 2026
d331bb4
fix(editor): avoid overlap of flowchart children (#11532)
minato32 Jul 13, 2026
082b2ee
fix(editor): Hit cache soundness (#11630)
mtolmacs Jul 13, 2026
e9c856d
chore(editor): streamline getSelectedElementsByGroup (#11636)
cTangonan123 Jul 13, 2026
5776e1c
fix(editor): should not select deleted bound text (#11660)
mtolmacs Jul 14, 2026
2423819
feat(packages/excalidraw): interaction and UI control (#11605)
dwelle Jul 14, 2026
acb48c3
fix(editor): make embeddable ignore higher-z-index non-framelike elem…
dwelle Jul 14, 2026
5ca0834
feat(packages/excalidraw): add `props.activeTool` and related (#11665)
dwelle Jul 15, 2026
3747163
fix(editor): improve UX around locked animations (#11671)
dwelle Jul 16, 2026
344878b
ci(repo): skip docs & example deployments in CI (#11674)
dwelle Jul 16, 2026
93dd510
feat(packages/excalidraw): add `props.ui.enabled.zoom/scrollBackToCo…
dwelle Jul 16, 2026
65aa577
fix(editor): fix AnimationController scheduling race conds (#11678)
dwelle Jul 16, 2026
a1d9b16
fix(editor): show scroll-back-to-content button on mobile (#11680)
dwelle Jul 17, 2026
5cf5476
fix(editor): make Help button tooltip consistent with toolbar (#11681)
Sam721166 Jul 17, 2026
53732f0
fix(editor): prevent eyedropper preview from overflowing viewport (#…
Sam721166 Jul 21, 2026
a3b9089
fix(editor): Lost focus point on transition to inside-inside (#10964)
mtolmacs Jul 22, 2026
91b7890
fix(editor): Dangling deleted bound text (#11733)
mtolmacs Jul 22, 2026
e6ae6bf
fix(editor): Diamond hit test shortcut (#11631)
mtolmacs Jul 22, 2026
f179f7f
feat(editor): draw to shape (auto-detection) (#9313)
mbkrafft Jul 23, 2026
b2e81e3
feat(editor): `autoshape` text + line improvements (#11752)
dwelle Jul 24, 2026
7c0b329
fix(editor): increase autoresize handle threshold until it hides (#11…
dwelle Jul 27, 2026
1acf66e
feat(editor): bind text to hovered arrow endpoint (#11777)
dwelle Jul 28, 2026
69d4c34
fix(editor): prevent esc from exiting fullscreen on macos when modal …
abobich675 Jul 30, 2026
786ab26
feat(editor): Error message for invalid hex color input (#11782)
cyforkk Jul 30, 2026
39103bd
chore(editor): Update translations from Crowdin (#11813)
excalibot Aug 3, 2026
f1aa8f8
feat(editor): disable arrowhead toggle via dblclick (#11822)
dwelle Aug 4, 2026
792ea3a
feat(editor): bucket fill (#11799)
dwelle Aug 4, 2026
ab0255f
fix(editor): prevent crash when editing arrow with bound text (#11814)
nihaarsirikonda Aug 4, 2026
1da120e
fix(editor): include custom tools in pointer capture (#11826)
dwelle Aug 4, 2026
c9c96f6
fix(editor): normalize container + bound text order on restore (#11827)
dwelle Aug 4, 2026
46c42a6
fix(editor): initialize selectedLinearElement after pasting arrows (#…
yanrin13 Aug 4, 2026
85270fc
feat(packages/excalidraw): ViewportStatusFrame & factor out user-foll…
dwelle Aug 4, 2026
5e375b4
fix(editor): do not flicker bbox when drag-creating line midpoint (#1…
dwelle Aug 5, 2026
e33a1c0
feat(packages/excalidraw): do not dedupe collaborators (#11835)
dwelle Aug 5, 2026
7478958
feat(packages/excalidraw): support ViewportStatusFrame label onClick …
dwelle Aug 5, 2026
1e22618
fix(packages/excalidraw): viewportStatusFrame label offset on mobile …
dwelle Aug 5, 2026
e4ab626
feat(packages/excalidraw): add `props.className` (#11839)
dwelle Aug 5, 2026
219571a
fix(editor): viewportportStatusFrame UI fixes (#11841)
dwelle Aug 6, 2026
ea74787
fix(app): remove ViewportStatusFrame debug (#11848)
dwelle Aug 7, 2026
4872083
feat(editor): bucketfill cursor + eyedropper support (#11849)
dwelle Aug 7, 2026
cf212b2
feat(editor): eyedropper fixes and improvements (#11859)
dwelle Aug 8, 2026
c5a50d2
fix(editor): respect boxSelectionMode ('contain' vs 'overlap') in las…
JayeshRajbhar Aug 10, 2026
abeeaeb
feat(editor): customizing color top picks (#11872)
dwelle Aug 11, 2026
884225b
fix(app): localize hardcoded "Sign up"/"Sign in" menu labels (#11893)
vishrk Aug 16, 2026
e160ff7
chore(editor): Update translations from Crowdin (#11815)
excalibot Aug 16, 2026
ed021de
fix(editor): no-op zoom-to-selection on empty scene
cursoragent Aug 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .codesandbox/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM node:18-bullseye
FROM node:24-bullseye

# Vite wants to open the browser using `open`, so we
# need to install those utils.
Expand Down
4 changes: 2 additions & 2 deletions .env.development
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ VITE_APP_WS_SERVER_URL=http://localhost:3002
VITE_APP_PLUS_LP=https://plus.excalidraw.com
VITE_APP_PLUS_APP=http://localhost:3000

VITE_APP_AI_BACKEND=http://localhost:3015
VITE_APP_AI_BACKEND=http://localhost:3016

VITE_APP_FIREBASE_CONFIG='{"apiKey":"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8","authDomain":"excalidraw-oss-dev.firebaseapp.com","projectId":"excalidraw-oss-dev","storageBucket":"excalidraw-oss-dev.appspot.com","messagingSenderId":"664559512677","appId":"1:664559512677:web:a385181f2928d328a7aa8c"}'

Expand All @@ -27,7 +27,7 @@ VITE_APP_ENABLE_TRACKING=true
FAST_REFRESH=false

# The port the run the dev server
VITE_APP_PORT=3000
VITE_APP_PORT=3001

#Debug flags

Expand Down
7 changes: 7 additions & 0 deletions .env.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# VITE_DEBUG_DOM
# When "true", testing-library failures (waitFor / getBy*) include the full
# serialized DOM in the error message. It's off by default because it's noisy.
#
# Flip it to "true" (or use `VITE_DEBUG_DOM=true yarn test`) when you need to
# inspect the DOM of a failing test.
VITE_DEBUG_DOM=false
23 changes: 22 additions & 1 deletion .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,26 @@
"allowReferrer": true
}
]
}
},
"overrides": [
{
"files": ["packages/excalidraw/**/*.{ts,tsx}"],
"excludedFiles": ["packages/excalidraw/**/*.test.{ts,tsx}", "packages/excalidraw/**/*.test.*.{ts,tsx}"],
"rules": {
"@typescript-eslint/no-restricted-imports": [
"error",
{
"patterns": [
{
"group": ["@excalidraw/excalidraw"],
"message": "Do not import from the barrel 'index.tsx' files. Use direct relative imports to the specific module instead.",
"allowTypeImports": true
}
],
"paths": [".", "..", "../..", "../../..", "../../../..", "../../../../..", "../index", "../../index", "../../../index", "../../../../index"]
}
]
}
}
]
}
8 changes: 4 additions & 4 deletions .github/workflows/autorelease-excalidraw.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
fetch-depth: 2
- name: Setup Node.js 18.x
uses: actions/setup-node@v2
- name: Setup Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 18.x
node-version: 20.x
- name: Set up publish access
run: |
npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ jobs:
build-docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- run: docker build -t excalidraw .
2 changes: 1 addition & 1 deletion .github/workflows/cancel.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 3
steps:
- uses: styfle/cancel-workflow-action@0.6.0
- uses: styfle/cancel-workflow-action@ce177499ccf9fd2aded3b0426c97e5434c2e8a73 # 0.6.0
with:
workflow_id: 400555, 400556, 905313, 1451724, 1710116, 3185001, 3438604
access_token: ${{ secrets.GITHUB_TOKEN }}
8 changes: 4 additions & 4 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

- name: Setup Node.js 18.x
uses: actions/setup-node@v2
- name: Setup Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 18.x
node-version: 20.x

- name: Install and lint
run: |
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/locales-coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
token: ${{ secrets.PUSH_TRANSLATIONS_COVERAGE_PAT }}

- name: Setup Node.js 18.x
uses: actions/setup-node@v2
- name: Setup Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 18.x
node-version: 20.x

- name: Create report file
run: |
Expand All @@ -40,8 +40,8 @@ jobs:
echo ::set-output name=body::$body

- name: Update description with coverage
uses: kt3k/update-pr-description@v1.0.1
uses: kt3k/update-pr-description@1b35a6dcd84d81aa0bc1889610efdcde7f37b0c0 # v1.0.1
with:
pr_body: ${{ steps.getCommentBody.outputs.body }}
pr_title: "chore: Update translations from Crowdin"
pr_title: "chore(editor): Update translations from Crowdin"
github_token: ${{ secrets.PUSH_TRANSLATIONS_COVERAGE_PAT }}
10 changes: 5 additions & 5 deletions .github/workflows/publish-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,18 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Login to DockerHub
uses: docker/login-action@v2
uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
- name: Build and push
uses: docker/build-push-action@v5
uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5
with:
context: .
push: true
Expand Down
100 changes: 99 additions & 1 deletion .github/workflows/semantic-pr-title.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,109 @@ on:
- opened
- edited
- synchronize
- labeled
- unlabeled

jobs:
semantic:
runs-on: ubuntu-latest
permissions:
pull-requests: read
steps:
- uses: amannn/action-semantic-pull-request@v5
- uses: amannn/action-semantic-pull-request@e32d7e603df1aa1ba07e981f2a23455dee596825 # v5
with:
types: |
feat
fix
docs
style
refactor
perf
test
build
ci
chore
revert
requireScope: true
scopes: |
app
editor
packages/excalidraw
packages/utils
docker
repo
ignoreLabels: |
skip-semantic-title
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

label-scope:
needs: semantic
if: github.event.pull_request.head.repo.full_name == github.repository
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- name: Label scoped PR
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}
PR_TITLE: ${{ github.event.pull_request.title }}
REPOSITORY: ${{ github.repository }}
run: |
set -euo pipefail

scope_labels=(s-app s-editor s-package)

readarray -t desired_labels < <(
node <<'NODE'
const title = process.env.PR_TITLE;
const match = title.match(/^[a-z]+(?:\(([^)]+)\))?!?:/i);
const scopes = match?.[1]?.split(",").map((scope) => scope.trim()) ?? [];
const labels = new Set();

for (const scope of scopes) {
if (scope === "app") {
labels.add("s-app");
} else if (scope === "editor") {
labels.add("s-editor");
} else if (scope.startsWith("packages/")) {
labels.add("s-package");
}
}

process.stdout.write([...labels].join("\n"));
NODE
)

should_apply_label() {
local label="$1"

for desired_label in "${desired_labels[@]}"; do
if [[ "$desired_label" == "$label" ]]; then
return 0
fi
done

return 1
}

for label in "${scope_labels[@]}"; do
if ! should_apply_label "$label"; then
gh api \
--method DELETE \
"repos/${REPOSITORY}/issues/${PR_NUMBER}/labels/${label}" \
--silent 2>/dev/null || true
fi
done

for label in "${desired_labels[@]}"; do
if ! gh api \
--method POST \
"repos/${REPOSITORY}/issues/${PR_NUMBER}/labels" \
--field "labels[]=${label}" \
--silent; then
echo "::warning::Could not apply ${label}. The workflow token likely does not have issues:write permission for this PR."
fi
done
10 changes: 5 additions & 5 deletions .github/workflows/sentry-production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ jobs:
sentry:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup Node.js 18.x
uses: actions/setup-node@v2
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Setup Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 18.x
node-version: 20.x
- name: Install and build
run: |
yarn --frozen-lockfile
Expand All @@ -28,7 +28,7 @@ jobs:
export SENTRY_RELEASE=$(sentry-cli releases propose-version)
sentry-cli releases new $SENTRY_RELEASE --project $SENTRY_PROJECT
sentry-cli releases set-commits --auto $SENTRY_RELEASE
sentry-cli releases files $SENTRY_RELEASE upload-sourcemaps --no-rewrite ./build/static/js/ --url-prefix "~/static/js"
sentry-cli sourcemaps upload --release $SENTRY_RELEASE --no-rewrite ./build/static/js/ --url-prefix "~/static/js"
sentry-cli releases finalize $SENTRY_RELEASE
sentry-cli releases deploys $SENTRY_RELEASE new -e production
env:
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/size-limit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,17 @@ jobs:
CI_JOB_NUMBER: 1
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Node.js 18.x
uses: actions/setup-node@v3
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Setup Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 18.x
node-version: 20.x
- name: Install in packages/excalidraw
run: yarn
working-directory: packages/excalidraw
env:
CI: true
- uses: andresz1/size-limit-action@v1
- uses: andresz1/size-limit-action@e7493a72a44b113341c0cf6186ab49c17c4b65c1 # v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
build_script: build:esm
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/test-coverage-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,17 @@ jobs:
pull-requests: write

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: "Install Node"
uses: actions/setup-node@v2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: "18.x"
node-version: "20.x"
- name: "Install Deps"
run: yarn install
- name: "Test Coverage"
run: yarn test:coverage
- name: "Report Coverage"
if: always() # Also generate the report if tests are failing
uses: davelosert/vitest-coverage-report-action@v2
uses: davelosert/vitest-coverage-report-action@2500dafcee7dd64f85ab689c0b83798a8359770e # v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
8 changes: 4 additions & 4 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js 18.x
uses: actions/setup-node@v4
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Setup Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 18.x
node-version: 20.x
- name: Install and test
run: |
yarn install
Expand Down
6 changes: 3 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM --platform=${BUILDPLATFORM} node:18 AS build
FROM --platform=${BUILDPLATFORM} node:24@sha256:8530f76a96d88820d288761f022e318970dda93d01536919fbc16076b7983e63 AS build

WORKDIR /opt/node_app

Expand All @@ -7,13 +7,13 @@ COPY . .
# do not ignore optional dependencies:
# Error: Cannot find module @rollup/rollup-linux-x64-gnu
RUN --mount=type=cache,target=/root/.cache/yarn \
npm_config_target_arch=${TARGETARCH} yarn --network-timeout 600000
npm_config_target_arch=${TARGETARCH} yarn --frozen-lockfile --network-timeout 600000

ARG NODE_ENV=production

RUN npm_config_target_arch=${TARGETARCH} yarn build:app:docker

FROM --platform=${TARGETPLATFORM} nginx:1.27-alpine
FROM nginx:stable-alpine-slim@sha256:2c605dbeab79a6b2a63340474fe58119d0ef95bdc4b1f41df0aa689659b3d13b

COPY --from=build /opt/node_app/excalidraw-app/build /usr/share/nginx/html

Expand Down
Loading
Loading