diff --git a/apps/cli/THIRD_PARTY_NOTICES b/apps/cli/THIRD_PARTY_NOTICES
index 42b388d5..0d85a5e3 100644
--- a/apps/cli/THIRD_PARTY_NOTICES
+++ b/apps/cli/THIRD_PARTY_NOTICES
@@ -70,6 +70,7 @@ Excalifont
-----------
Copyright (c) 2024 by Excalidraw. All rights reserved.
+Trademark: Excalifont is a trademark of Excalidraw.
Manufacturer and designer: Your Own Font Foundry (Virgil); Jan Filipek /
DizajnDesign (Excalifont, modifications)
diff --git a/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 b/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2
new file mode 100644
index 00000000..3c81f0ba
Binary files /dev/null and b/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 differ
diff --git a/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 b/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2
new file mode 100644
index 00000000..1e9c460b
Binary files /dev/null and b/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 differ
diff --git a/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 b/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2
new file mode 100644
index 00000000..507c11df
Binary files /dev/null and b/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 differ
diff --git a/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 b/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2
new file mode 100644
index 00000000..aa49c360
Binary files /dev/null and b/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 differ
diff --git a/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 b/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2
new file mode 100644
index 00000000..98b9616a
Binary files /dev/null and b/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 differ
diff --git a/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 b/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2
new file mode 100644
index 00000000..58e960cf
Binary files /dev/null and b/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 differ
diff --git a/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 b/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2
new file mode 100644
index 00000000..b413197a
Binary files /dev/null and b/apps/eval-harness/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 differ
diff --git a/apps/eval-harness/public/fonts/Excalifont/LICENSE b/apps/eval-harness/public/fonts/Excalifont/LICENSE
new file mode 100644
index 00000000..251ad8fd
--- /dev/null
+++ b/apps/eval-harness/public/fonts/Excalifont/LICENSE
@@ -0,0 +1,100 @@
+Excalifont
+==========
+
+Copyright (c) 2024 by Excalidraw. All rights reserved.
+
+Trademark: Excalifont is a trademark of Excalidraw.
+Manufacturer and designer: Your Own Font Foundry (Virgil);
+Jan Filipek / DizajnDesign (Excalifont, modifications) - https://dizajndesign.sk
+Source: https://github.com/excalidraw/excalidraw/tree/master/packages/excalidraw/fonts/Excalifont
+
+The seven woff2 files beside this notice are cn-font-split subsets of
+Excalifont Regular, redistributed byte-for-byte unmodified.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership with
+others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The fonts,
+including any derivative works, can be bundled, embedded, redistributed
+and/or sold with any software provided that any reserved names are not used
+by derivative works. The fonts and derivatives, however, cannot be released
+under any other type of license. The requirement for fonts to remain under
+this license does not apply to any document created using the fonts or their
+derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may include
+source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting, or
+substituting -- in part or in whole -- any of the components of the Original
+Version, by changing formats or by porting the Font Software to a new
+environment.
+
+"Author" refers to any designer, engineer, programmer, technical writer or
+other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the Font Software, to use, study, copy, merge, embed, modify, redistribute,
+and sell modified and unmodified copies of the Font Software, subject to the
+following conditions:
+
+1) Neither the Font Software nor any of its individual components, in
+Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy contains
+the above copyright notice and this license. These can be included either as
+stand-alone text files, human-readable headers or in the appropriate
+machine-readable metadata fields within text or binary files as long as those
+fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font Name(s)
+unless explicit written permission is granted by the corresponding Copyright
+Holder. This restriction only applies to the primary font name as presented
+to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any Modified
+Version, except to acknowledge the contribution(s) of the Copyright Holder(s)
+and the Author(s) or with their explicit written permission.
+
+5) The Font Software, modified or unmodified, in part or in whole, must be
+distributed entirely under this license, and must not be distributed under
+any other license. The requirement for fonts to remain under this license
+does not apply to any document created using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are not
+met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL,
+INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE
+THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/apps/eval-harness/src/routes/__root.tsx b/apps/eval-harness/src/routes/__root.tsx
index 62ade5bf..73c6930d 100644
--- a/apps/eval-harness/src/routes/__root.tsx
+++ b/apps/eval-harness/src/routes/__root.tsx
@@ -35,7 +35,7 @@ export const Route = createRootRoute({
},
{
rel: "stylesheet",
- href: "https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600..800&family=Dancing+Script:wght@600;700&family=Hanken+Grotesk:wght@400..700&family=IBM+Plex+Mono:wght@400;500;600&display=swap",
+ href: "https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600..800&family=Hanken+Grotesk:wght@400..700&family=IBM+Plex+Mono:wght@400;500;600&display=swap",
},
{ rel: "stylesheet", href: appStyles },
],
diff --git a/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 b/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2
new file mode 100644
index 00000000..3c81f0ba
Binary files /dev/null and b/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 differ
diff --git a/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 b/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2
new file mode 100644
index 00000000..1e9c460b
Binary files /dev/null and b/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 differ
diff --git a/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 b/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2
new file mode 100644
index 00000000..507c11df
Binary files /dev/null and b/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 differ
diff --git a/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 b/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2
new file mode 100644
index 00000000..aa49c360
Binary files /dev/null and b/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 differ
diff --git a/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 b/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2
new file mode 100644
index 00000000..98b9616a
Binary files /dev/null and b/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 differ
diff --git a/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 b/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2
new file mode 100644
index 00000000..58e960cf
Binary files /dev/null and b/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 differ
diff --git a/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 b/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2
new file mode 100644
index 00000000..b413197a
Binary files /dev/null and b/apps/excalidraw/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 differ
diff --git a/apps/excalidraw/public/fonts/Excalifont/LICENSE b/apps/excalidraw/public/fonts/Excalifont/LICENSE
new file mode 100644
index 00000000..251ad8fd
--- /dev/null
+++ b/apps/excalidraw/public/fonts/Excalifont/LICENSE
@@ -0,0 +1,100 @@
+Excalifont
+==========
+
+Copyright (c) 2024 by Excalidraw. All rights reserved.
+
+Trademark: Excalifont is a trademark of Excalidraw.
+Manufacturer and designer: Your Own Font Foundry (Virgil);
+Jan Filipek / DizajnDesign (Excalifont, modifications) - https://dizajndesign.sk
+Source: https://github.com/excalidraw/excalidraw/tree/master/packages/excalidraw/fonts/Excalifont
+
+The seven woff2 files beside this notice are cn-font-split subsets of
+Excalifont Regular, redistributed byte-for-byte unmodified.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership with
+others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The fonts,
+including any derivative works, can be bundled, embedded, redistributed
+and/or sold with any software provided that any reserved names are not used
+by derivative works. The fonts and derivatives, however, cannot be released
+under any other type of license. The requirement for fonts to remain under
+this license does not apply to any document created using the fonts or their
+derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may include
+source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting, or
+substituting -- in part or in whole -- any of the components of the Original
+Version, by changing formats or by porting the Font Software to a new
+environment.
+
+"Author" refers to any designer, engineer, programmer, technical writer or
+other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the Font Software, to use, study, copy, merge, embed, modify, redistribute,
+and sell modified and unmodified copies of the Font Software, subject to the
+following conditions:
+
+1) Neither the Font Software nor any of its individual components, in
+Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy contains
+the above copyright notice and this license. These can be included either as
+stand-alone text files, human-readable headers or in the appropriate
+machine-readable metadata fields within text or binary files as long as those
+fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font Name(s)
+unless explicit written permission is granted by the corresponding Copyright
+Holder. This restriction only applies to the primary font name as presented
+to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any Modified
+Version, except to acknowledge the contribution(s) of the Copyright Holder(s)
+and the Author(s) or with their explicit written permission.
+
+5) The Font Software, modified or unmodified, in part or in whole, must be
+distributed entirely under this license, and must not be distributed under
+any other license. The requirement for fonts to remain under this license
+does not apply to any document created using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are not
+met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL,
+INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE
+THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/apps/icons/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 b/apps/icons/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2
new file mode 100644
index 00000000..3c81f0ba
Binary files /dev/null and b/apps/icons/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 differ
diff --git a/apps/icons/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 b/apps/icons/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2
new file mode 100644
index 00000000..1e9c460b
Binary files /dev/null and b/apps/icons/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 differ
diff --git a/apps/icons/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 b/apps/icons/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2
new file mode 100644
index 00000000..507c11df
Binary files /dev/null and b/apps/icons/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 differ
diff --git a/apps/icons/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 b/apps/icons/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2
new file mode 100644
index 00000000..aa49c360
Binary files /dev/null and b/apps/icons/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 differ
diff --git a/apps/icons/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 b/apps/icons/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2
new file mode 100644
index 00000000..98b9616a
Binary files /dev/null and b/apps/icons/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 differ
diff --git a/apps/icons/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 b/apps/icons/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2
new file mode 100644
index 00000000..58e960cf
Binary files /dev/null and b/apps/icons/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 differ
diff --git a/apps/icons/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 b/apps/icons/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2
new file mode 100644
index 00000000..b413197a
Binary files /dev/null and b/apps/icons/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 differ
diff --git a/apps/icons/public/fonts/Excalifont/LICENSE b/apps/icons/public/fonts/Excalifont/LICENSE
new file mode 100644
index 00000000..251ad8fd
--- /dev/null
+++ b/apps/icons/public/fonts/Excalifont/LICENSE
@@ -0,0 +1,100 @@
+Excalifont
+==========
+
+Copyright (c) 2024 by Excalidraw. All rights reserved.
+
+Trademark: Excalifont is a trademark of Excalidraw.
+Manufacturer and designer: Your Own Font Foundry (Virgil);
+Jan Filipek / DizajnDesign (Excalifont, modifications) - https://dizajndesign.sk
+Source: https://github.com/excalidraw/excalidraw/tree/master/packages/excalidraw/fonts/Excalifont
+
+The seven woff2 files beside this notice are cn-font-split subsets of
+Excalifont Regular, redistributed byte-for-byte unmodified.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership with
+others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The fonts,
+including any derivative works, can be bundled, embedded, redistributed
+and/or sold with any software provided that any reserved names are not used
+by derivative works. The fonts and derivatives, however, cannot be released
+under any other type of license. The requirement for fonts to remain under
+this license does not apply to any document created using the fonts or their
+derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may include
+source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting, or
+substituting -- in part or in whole -- any of the components of the Original
+Version, by changing formats or by porting the Font Software to a new
+environment.
+
+"Author" refers to any designer, engineer, programmer, technical writer or
+other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the Font Software, to use, study, copy, merge, embed, modify, redistribute,
+and sell modified and unmodified copies of the Font Software, subject to the
+following conditions:
+
+1) Neither the Font Software nor any of its individual components, in
+Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy contains
+the above copyright notice and this license. These can be included either as
+stand-alone text files, human-readable headers or in the appropriate
+machine-readable metadata fields within text or binary files as long as those
+fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font Name(s)
+unless explicit written permission is granted by the corresponding Copyright
+Holder. This restriction only applies to the primary font name as presented
+to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any Modified
+Version, except to acknowledge the contribution(s) of the Copyright Holder(s)
+and the Author(s) or with their explicit written permission.
+
+5) The Font Software, modified or unmodified, in part or in whole, must be
+distributed entirely under this license, and must not be distributed under
+any other license. The requirement for fonts to remain under this license
+does not apply to any document created using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are not
+met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL,
+INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE
+THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/apps/icons/src/components/icon-library/icon-library.test.tsx b/apps/icons/src/components/icon-library/icon-library.test.tsx
index 913876bc..d7d4549e 100644
--- a/apps/icons/src/components/icon-library/icon-library.test.tsx
+++ b/apps/icons/src/components/icon-library/icon-library.test.tsx
@@ -86,7 +86,14 @@ describe("IconLibrary", () => {
expect(styles).toMatch(
/\.icons-brand \.sk-wordmark\s*\{[^}]*font-family:\s*var\(--font-script\)/u,
);
- expect(rootRoute).toContain("family=Dancing+Script");
+ // The script font is Excalifont, self-hosted from this surface's own
+ // public/ rather than fetched from Google, so the wordmark renders in the
+ // same face the diagrams do. Preloading the Latin subset is what keeps it
+ // from painting the fallback first.
+ expect(rootRoute).not.toContain("family=Dancing+Script");
+ expect(rootRoute).toContain(
+ "/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2",
+ );
});
it("calls the agent entry point llms.txt everywhere it appears", () => {
diff --git a/apps/icons/src/routes/__root.tsx b/apps/icons/src/routes/__root.tsx
index dcdff1ce..a8c9933c 100644
--- a/apps/icons/src/routes/__root.tsx
+++ b/apps/icons/src/routes/__root.tsx
@@ -25,6 +25,16 @@ export const Route = createRootRoute({
],
links: [
{ rel: "icon", href: "/icon.svg", type: "image/svg+xml" },
+ // Excalifont's Latin subset backs the wordmark; preload it so the
+ // lockup paints in the product's own hand instead of reflowing
+ // through the sans fallback.
+ {
+ rel: "preload",
+ as: "font",
+ type: "font/woff2",
+ href: "/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2",
+ crossOrigin: "anonymous",
+ },
{ rel: "preconnect", href: "https://fonts.googleapis.com" },
{
rel: "preconnect",
@@ -33,7 +43,7 @@ export const Route = createRootRoute({
},
{
rel: "stylesheet",
- href: "https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600..800&family=Dancing+Script:wght@600;700&family=Hanken+Grotesk:wght@400..700&family=IBM+Plex+Mono:wght@400;500;600&display=swap",
+ href: "https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600..800&family=Hanken+Grotesk:wght@400..700&family=IBM+Plex+Mono:wght@400;500;600&display=swap",
},
{ rel: "stylesheet", href: appStyles },
],
diff --git a/apps/icons/src/styles/app.css b/apps/icons/src/styles/app.css
index a5c4d88a..9908b4f9 100644
--- a/apps/icons/src/styles/app.css
+++ b/apps/icons/src/styles/app.css
@@ -872,7 +872,7 @@ select:focus-visible {
display: inline-flex;
font-family: var(--font-script);
font-size: 26px;
- font-weight: 700;
+ font-weight: 400;
gap: 9px;
text-decoration: none;
}
diff --git a/apps/playground/public/fonts/Excalifont/LICENSE b/apps/playground/public/fonts/Excalifont/LICENSE
new file mode 100644
index 00000000..251ad8fd
--- /dev/null
+++ b/apps/playground/public/fonts/Excalifont/LICENSE
@@ -0,0 +1,100 @@
+Excalifont
+==========
+
+Copyright (c) 2024 by Excalidraw. All rights reserved.
+
+Trademark: Excalifont is a trademark of Excalidraw.
+Manufacturer and designer: Your Own Font Foundry (Virgil);
+Jan Filipek / DizajnDesign (Excalifont, modifications) - https://dizajndesign.sk
+Source: https://github.com/excalidraw/excalidraw/tree/master/packages/excalidraw/fonts/Excalifont
+
+The seven woff2 files beside this notice are cn-font-split subsets of
+Excalifont Regular, redistributed byte-for-byte unmodified.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership with
+others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The fonts,
+including any derivative works, can be bundled, embedded, redistributed
+and/or sold with any software provided that any reserved names are not used
+by derivative works. The fonts and derivatives, however, cannot be released
+under any other type of license. The requirement for fonts to remain under
+this license does not apply to any document created using the fonts or their
+derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may include
+source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting, or
+substituting -- in part or in whole -- any of the components of the Original
+Version, by changing formats or by porting the Font Software to a new
+environment.
+
+"Author" refers to any designer, engineer, programmer, technical writer or
+other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the Font Software, to use, study, copy, merge, embed, modify, redistribute,
+and sell modified and unmodified copies of the Font Software, subject to the
+following conditions:
+
+1) Neither the Font Software nor any of its individual components, in
+Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy contains
+the above copyright notice and this license. These can be included either as
+stand-alone text files, human-readable headers or in the appropriate
+machine-readable metadata fields within text or binary files as long as those
+fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font Name(s)
+unless explicit written permission is granted by the corresponding Copyright
+Holder. This restriction only applies to the primary font name as presented
+to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any Modified
+Version, except to acknowledge the contribution(s) of the Copyright Holder(s)
+and the Author(s) or with their explicit written permission.
+
+5) The Font Software, modified or unmodified, in part or in whole, must be
+distributed entirely under this license, and must not be distributed under
+any other license. The requirement for fonts to remain under this license
+does not apply to any document created using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are not
+met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL,
+INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE
+THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/apps/playground/src/routes/__root.tsx b/apps/playground/src/routes/__root.tsx
index 6089d09e..8d875da4 100644
--- a/apps/playground/src/routes/__root.tsx
+++ b/apps/playground/src/routes/__root.tsx
@@ -26,6 +26,16 @@ export const Route = createRootRoute({
],
links: [
{ rel: "icon", href: "/icon.svg", type: "image/svg+xml" },
+ // Excalifont's Latin subset backs the wordmark; preload it so the
+ // lockup paints in the product's own hand instead of reflowing
+ // through the sans fallback.
+ {
+ rel: "preload",
+ as: "font",
+ type: "font/woff2",
+ href: "/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2",
+ crossOrigin: "anonymous",
+ },
{ rel: "preconnect", href: "https://fonts.googleapis.com" },
{
rel: "preconnect",
@@ -34,7 +44,7 @@ export const Route = createRootRoute({
},
{
rel: "stylesheet",
- href: "https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600..800&family=Dancing+Script:wght@600;700&family=Hanken+Grotesk:wght@400..700&family=IBM+Plex+Mono:wght@400;500;600&display=swap",
+ href: "https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600..800&family=Hanken+Grotesk:wght@400..700&family=IBM+Plex+Mono:wght@400;500;600&display=swap",
},
{ rel: "stylesheet", href: appStyles },
],
diff --git a/apps/playground/src/styles/app.css b/apps/playground/src/styles/app.css
index 74b5870b..7894e85f 100644
--- a/apps/playground/src/styles/app.css
+++ b/apps/playground/src/styles/app.css
@@ -63,7 +63,7 @@
--font-sans: "Hanken Grotesk", ui-sans-serif, system-ui, sans-serif;
--font-mono: "IBM Plex Mono", ui-monospace, monospace;
--font-display: "Bricolage Grotesque", ui-sans-serif, system-ui, sans-serif;
- --font-script: "Dancing Script", cursive;
+ --font-script: "Excalifont", cursive;
}
@layer base {
@@ -179,7 +179,7 @@ body {
.studio-brand__wordmark {
font-family: var(--font-script);
font-size: 28px;
- font-weight: 700;
+ font-weight: 400;
line-height: 1;
}
diff --git a/apps/web/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 b/apps/web/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2
new file mode 100644
index 00000000..3c81f0ba
Binary files /dev/null and b/apps/web/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 differ
diff --git a/apps/web/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 b/apps/web/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2
new file mode 100644
index 00000000..1e9c460b
Binary files /dev/null and b/apps/web/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 differ
diff --git a/apps/web/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 b/apps/web/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2
new file mode 100644
index 00000000..507c11df
Binary files /dev/null and b/apps/web/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 differ
diff --git a/apps/web/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 b/apps/web/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2
new file mode 100644
index 00000000..aa49c360
Binary files /dev/null and b/apps/web/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 differ
diff --git a/apps/web/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 b/apps/web/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2
new file mode 100644
index 00000000..98b9616a
Binary files /dev/null and b/apps/web/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 differ
diff --git a/apps/web/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 b/apps/web/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2
new file mode 100644
index 00000000..58e960cf
Binary files /dev/null and b/apps/web/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 differ
diff --git a/apps/web/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 b/apps/web/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2
new file mode 100644
index 00000000..b413197a
Binary files /dev/null and b/apps/web/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 differ
diff --git a/apps/web/public/fonts/Excalifont/LICENSE b/apps/web/public/fonts/Excalifont/LICENSE
new file mode 100644
index 00000000..251ad8fd
--- /dev/null
+++ b/apps/web/public/fonts/Excalifont/LICENSE
@@ -0,0 +1,100 @@
+Excalifont
+==========
+
+Copyright (c) 2024 by Excalidraw. All rights reserved.
+
+Trademark: Excalifont is a trademark of Excalidraw.
+Manufacturer and designer: Your Own Font Foundry (Virgil);
+Jan Filipek / DizajnDesign (Excalifont, modifications) - https://dizajndesign.sk
+Source: https://github.com/excalidraw/excalidraw/tree/master/packages/excalidraw/fonts/Excalifont
+
+The seven woff2 files beside this notice are cn-font-split subsets of
+Excalifont Regular, redistributed byte-for-byte unmodified.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership with
+others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The fonts,
+including any derivative works, can be bundled, embedded, redistributed
+and/or sold with any software provided that any reserved names are not used
+by derivative works. The fonts and derivatives, however, cannot be released
+under any other type of license. The requirement for fonts to remain under
+this license does not apply to any document created using the fonts or their
+derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may include
+source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting, or
+substituting -- in part or in whole -- any of the components of the Original
+Version, by changing formats or by porting the Font Software to a new
+environment.
+
+"Author" refers to any designer, engineer, programmer, technical writer or
+other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the Font Software, to use, study, copy, merge, embed, modify, redistribute,
+and sell modified and unmodified copies of the Font Software, subject to the
+following conditions:
+
+1) Neither the Font Software nor any of its individual components, in
+Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy contains
+the above copyright notice and this license. These can be included either as
+stand-alone text files, human-readable headers or in the appropriate
+machine-readable metadata fields within text or binary files as long as those
+fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font Name(s)
+unless explicit written permission is granted by the corresponding Copyright
+Holder. This restriction only applies to the primary font name as presented
+to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any Modified
+Version, except to acknowledge the contribution(s) of the Copyright Holder(s)
+and the Author(s) or with their explicit written permission.
+
+5) The Font Software, modified or unmodified, in part or in whole, must be
+distributed entirely under this license, and must not be distributed under
+any other license. The requirement for fonts to remain under this license
+does not apply to any document created using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are not
+met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL,
+INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE
+THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/apps/web/public/media/sketchi-og-card.png b/apps/web/public/media/sketchi-og-card.png
index a7ca0637..596d35fa 100644
Binary files a/apps/web/public/media/sketchi-og-card.png and b/apps/web/public/media/sketchi-og-card.png differ
diff --git a/apps/web/public/media/sketchi-og-card.svg b/apps/web/public/media/sketchi-og-card.svg
index c2b0156e..09404499 100644
--- a/apps/web/public/media/sketchi-og-card.svg
+++ b/apps/web/public/media/sketchi-og-card.svg
@@ -30,7 +30,7 @@
- Sketchi
+
@@ -66,8 +66,8 @@
- yes
- no
+
+
@@ -93,4 +93,10 @@
ship
+
+
diff --git a/apps/web/src/routes/__root.tsx b/apps/web/src/routes/__root.tsx
index d737699a..71a9640c 100644
--- a/apps/web/src/routes/__root.tsx
+++ b/apps/web/src/routes/__root.tsx
@@ -30,6 +30,16 @@ export const Route = createRootRoute({
],
links: [
{ rel: "icon", href: "/icon.svg", type: "image/svg+xml" },
+ // Excalifont's Latin subset backs the wordmark; preload it so the
+ // lockup paints in the product's own hand instead of reflowing
+ // through the sans fallback.
+ {
+ rel: "preload",
+ as: "font",
+ type: "font/woff2",
+ href: "/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2",
+ crossOrigin: "anonymous",
+ },
{ rel: "preconnect", href: "https://fonts.googleapis.com" },
{
rel: "preconnect",
@@ -38,7 +48,7 @@ export const Route = createRootRoute({
},
{
rel: "stylesheet",
- href: "https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600..800&family=Dancing+Script:wght@600;700&family=Hanken+Grotesk:wght@400..700&family=IBM+Plex+Mono:wght@400;500;600&display=swap",
+ href: "https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600..800&family=Hanken+Grotesk:wght@400..700&family=IBM+Plex+Mono:wght@400;500;600&display=swap",
},
{ rel: "stylesheet", href: appStyles },
],
diff --git a/apps/web/src/styles/app.css b/apps/web/src/styles/app.css
index c266c8f0..1fab3a99 100644
--- a/apps/web/src/styles/app.css
+++ b/apps/web/src/styles/app.css
@@ -1531,7 +1531,7 @@
display: inline-flex;
font-family: var(--font-script);
font-size: 26px;
- font-weight: 700;
+ font-weight: 400;
gap: 9px;
}
diff --git a/packages/diagram/ui/.storybook/main.ts b/packages/diagram/ui/.storybook/main.ts
index 7f015557..b47f2ca7 100644
--- a/packages/diagram/ui/.storybook/main.ts
+++ b/packages/diagram/ui/.storybook/main.ts
@@ -3,6 +3,10 @@ import type { StorybookConfig } from "@storybook/react-vite";
const config: StorybookConfig = {
stories: ["../src/**/*.stories.@(ts|tsx)"],
addons: ["@storybook/addon-vitest", "@storybook/addon-mcp"],
+ // theme.css declares Excalifont at absolute /fonts/Excalifont/... — the face
+ // the scene canvas draws text in and the wordmark is written in. Without this
+ // the stories request it and get a 404, so every preview silently falls back.
+ staticDirs: ["../public"],
framework: {
name: "@storybook/react-vite",
options: {},
diff --git a/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 b/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2
new file mode 100644
index 00000000..3c81f0ba
Binary files /dev/null and b/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 differ
diff --git a/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 b/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2
new file mode 100644
index 00000000..1e9c460b
Binary files /dev/null and b/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 differ
diff --git a/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 b/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2
new file mode 100644
index 00000000..507c11df
Binary files /dev/null and b/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 differ
diff --git a/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 b/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2
new file mode 100644
index 00000000..aa49c360
Binary files /dev/null and b/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 differ
diff --git a/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 b/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2
new file mode 100644
index 00000000..98b9616a
Binary files /dev/null and b/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 differ
diff --git a/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 b/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2
new file mode 100644
index 00000000..58e960cf
Binary files /dev/null and b/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 differ
diff --git a/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 b/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2
new file mode 100644
index 00000000..b413197a
Binary files /dev/null and b/packages/diagram/ui/public/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 differ
diff --git a/packages/diagram/ui/public/fonts/Excalifont/LICENSE b/packages/diagram/ui/public/fonts/Excalifont/LICENSE
new file mode 100644
index 00000000..251ad8fd
--- /dev/null
+++ b/packages/diagram/ui/public/fonts/Excalifont/LICENSE
@@ -0,0 +1,100 @@
+Excalifont
+==========
+
+Copyright (c) 2024 by Excalidraw. All rights reserved.
+
+Trademark: Excalifont is a trademark of Excalidraw.
+Manufacturer and designer: Your Own Font Foundry (Virgil);
+Jan Filipek / DizajnDesign (Excalifont, modifications) - https://dizajndesign.sk
+Source: https://github.com/excalidraw/excalidraw/tree/master/packages/excalidraw/fonts/Excalifont
+
+The seven woff2 files beside this notice are cn-font-split subsets of
+Excalifont Regular, redistributed byte-for-byte unmodified.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership with
+others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The fonts,
+including any derivative works, can be bundled, embedded, redistributed
+and/or sold with any software provided that any reserved names are not used
+by derivative works. The fonts and derivatives, however, cannot be released
+under any other type of license. The requirement for fonts to remain under
+this license does not apply to any document created using the fonts or their
+derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may include
+source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting, or
+substituting -- in part or in whole -- any of the components of the Original
+Version, by changing formats or by porting the Font Software to a new
+environment.
+
+"Author" refers to any designer, engineer, programmer, technical writer or
+other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the Font Software, to use, study, copy, merge, embed, modify, redistribute,
+and sell modified and unmodified copies of the Font Software, subject to the
+following conditions:
+
+1) Neither the Font Software nor any of its individual components, in
+Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy contains
+the above copyright notice and this license. These can be included either as
+stand-alone text files, human-readable headers or in the appropriate
+machine-readable metadata fields within text or binary files as long as those
+fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font Name(s)
+unless explicit written permission is granted by the corresponding Copyright
+Holder. This restriction only applies to the primary font name as presented
+to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any Modified
+Version, except to acknowledge the contribution(s) of the Copyright Holder(s)
+and the Author(s) or with their explicit written permission.
+
+5) The Font Software, modified or unmodified, in part or in whole, must be
+distributed entirely under this license, and must not be distributed under
+any other license. The requirement for fonts to remain under this license
+does not apply to any document created using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are not
+met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL,
+INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE
+THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/packages/diagram/ui/src/theme.css b/packages/diagram/ui/src/theme.css
index 623c00b3..79416f57 100644
--- a/packages/diagram/ui/src/theme.css
+++ b/packages/diagram/ui/src/theme.css
@@ -5,11 +5,108 @@
Imported by each app's app.css and by diagram-ui styles.css.
===================================================================== */
+/* ---------------------------------------------------------------------
+ Excalifont — the typeface every Sketchi diagram renders in, and now the
+ wordmark too, so the name is written in the same hand the product draws.
+
+ Vendored (unmodified) from @excalidraw/excalidraw under the SIL Open Font
+ License 1.1; see the LICENSE beside the woff2 files in each surface's
+ public/fonts/Excalifont. "Excalifont is a trademark of Excalidraw" — we
+ use the letterforms, never the name, as Sketchi branding.
+
+ These seven files are cn-font-split subsets of one face, not seven faces:
+ declaring only the Latin one leaves every other codepoint silently falling
+ back, so all seven ship with their upstream unicode-range. Only Regular
+ exists, so weights are pinned to 400 — any bolder wordmark would be a
+ synthetic smear of a hand-drawn face. Surfaces that render the wordmark
+ preload the U+20-7e subset so the lockup never reflows through a fallback.
+ --------------------------------------------------------------------- */
+@font-face {
+ font-family: "Excalifont";
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url("/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2")
+ format("woff2");
+ unicode-range:
+ U+20-7e, U+a0-a3, U+a5-a6, U+a8-ab, U+ad-b1, U+b4, U+b6-b8, U+ba-ff, U+131,
+ U+152-153, U+2bc, U+2c6, U+2da, U+2dc, U+304, U+308, U+2013-2014,
+ U+2018-201a, U+201c-201e, U+2020, U+2022, U+2024-2026, U+2030, U+2039-203a,
+ U+20ac, U+2122, U+2212;
+}
+
+@font-face {
+ font-family: "Excalifont";
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url("/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2")
+ format("woff2");
+ unicode-range:
+ U+100-130, U+132-137, U+139-149, U+14c-151, U+154-17e, U+192, U+1fc-1ff,
+ U+218-21b, U+237, U+1e80-1e85, U+1ef2-1ef3, U+2113;
+}
+
+@font-face {
+ font-family: "Excalifont";
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url("/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2")
+ format("woff2");
+ unicode-range: U+400-45f, U+490-491, U+2116;
+}
+
+@font-face {
+ font-family: "Excalifont";
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url("/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2")
+ format("woff2");
+ unicode-range:
+ U+37e, U+384-38a, U+38c, U+38e-393, U+395-3a1, U+3a3-3a8, U+3aa-3cf, U+3d7;
+}
+
+@font-face {
+ font-family: "Excalifont";
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url("/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2")
+ format("woff2");
+ unicode-range:
+ U+2c7, U+2d8-2d9, U+2db, U+2dd, U+302, U+306-307, U+30a-30c, U+326-328,
+ U+212e, U+2211, U+fb01-fb02;
+}
+
+@font-face {
+ font-family: "Excalifont";
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url("/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2")
+ format("woff2");
+ unicode-range:
+ U+462-463, U+472-475, U+4d8-4d9, U+4e2-4e3, U+4e6-4e9, U+4ee-4ef;
+}
+
+@font-face {
+ font-family: "Excalifont";
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url("/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2")
+ format("woff2");
+ unicode-range: U+300-301, U+303;
+}
+
:root {
- --font-display: "Bricolage Grotesque", "Hanken Grotesk", system-ui, sans-serif;
+ --font-display:
+ "Bricolage Grotesque", "Hanken Grotesk", system-ui, sans-serif;
--font-body: "Hanken Grotesk", ui-sans-serif, system-ui, sans-serif;
--font-mono: "IBM Plex Mono", ui-monospace, "SFMono-Regular", monospace;
- --font-script: "Dancing Script", "Bricolage Grotesque", cursive;
+ --font-script: "Excalifont", "Bricolage Grotesque", cursive;
/* surfaces */
--paper: #f6f1e7;
@@ -53,16 +150,20 @@
--grid-dot: rgba(26, 23, 18, 0.06);
- --shadow-sm: 0 1px 2px rgba(40, 31, 12, 0.06), 0 2px 6px rgba(40, 31, 12, 0.05);
- --shadow-md: 0 6px 18px rgba(40, 31, 12, 0.08), 0 2px 6px rgba(40, 31, 12, 0.05);
- --shadow-lg: 0 24px 60px rgba(40, 31, 12, 0.16), 0 6px 18px rgba(40, 31, 12, 0.08);
+ --shadow-sm:
+ 0 1px 2px rgba(40, 31, 12, 0.06), 0 2px 6px rgba(40, 31, 12, 0.05);
+ --shadow-md:
+ 0 6px 18px rgba(40, 31, 12, 0.08), 0 2px 6px rgba(40, 31, 12, 0.05);
+ --shadow-lg:
+ 0 24px 60px rgba(40, 31, 12, 0.16), 0 6px 18px rgba(40, 31, 12, 0.08);
--r-sm: 8px;
--r-md: 12px;
--r-lg: 18px;
--shell: 1180px;
--ease: cubic-bezier(0.2, 0.7, 0.2, 1);
- --checker: linear-gradient(45deg, var(--line) 25%, transparent 25%),
+ --checker:
+ linear-gradient(45deg, var(--line) 25%, transparent 25%),
linear-gradient(-45deg, var(--line) 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, var(--line) 75%),
linear-gradient(-45deg, transparent 75%, var(--line) 75%);
@@ -83,10 +184,18 @@ body {
body {
background-color: var(--paper);
background-image:
- radial-gradient(52rem 28rem at 85% -12%, rgba(143, 112, 127, 0.1), transparent 60%),
+ radial-gradient(
+ 52rem 28rem at 85% -12%,
+ rgba(143, 112, 127, 0.1),
+ transparent 60%
+ ),
radial-gradient(var(--grid-dot) 1px, transparent 1px);
- background-size: auto, 24px 24px;
- background-position: 0 0, -1px -1px;
+ background-size:
+ auto,
+ 24px 24px;
+ background-position:
+ 0 0,
+ -1px -1px;
color: var(--ink);
font-family: var(--font-body);
font-size: 16px;
@@ -164,10 +273,13 @@ img {
display: block;
}
+/* 400, not 700: Excalifont has a single Regular, so anything bolder is a
+ synthetic smear that thickens the strokes without widening the letters and
+ closes up the counters in "e" and "c". Regular is the real hand. */
.sk-wordmark {
font-family: var(--font-script);
font-size: 28px;
- font-weight: 700;
+ font-weight: 400;
line-height: 1;
}
diff --git a/tools/vendored-excalifont.test.ts b/tools/vendored-excalifont.test.ts
new file mode 100644
index 00000000..0130d4c7
--- /dev/null
+++ b/tools/vendored-excalifont.test.ts
@@ -0,0 +1,173 @@
+import { createHash } from "node:crypto";
+import { readdirSync, readFileSync } from "node:fs";
+import { join } from "node:path";
+import { fileURLToPath } from "node:url";
+
+import { describe, expect, it } from "vitest";
+
+/**
+ * Excalifont is the typeface Sketchi diagrams render in and, since the wordmark
+ * moved off Dancing Script, the brand mark too. Each Worker serves assets from
+ * its own `public/`, so the vendored subsets exist once per surface. Copies of a
+ * binary drift silently: one surface gets re-vendored, the others keep an older
+ * face, and the wordmark stops matching the diagrams it is supposed to be an
+ * instance of. These tests pin the copies together.
+ *
+ * The @font-face declarations live in the shared theme, so the obligation is
+ * every theme consumer, not just the ones that draw a wordmark today. A surface
+ * that imports the theme without shipping the files requests them and gets a
+ * 404, which leaves an errored face in a family the diagram canvas also uses.
+ * `themeConsumers()` therefore derives the list from the imports rather than
+ * hardcoding it, so a new surface fails here instead of in production.
+ *
+ * diagram-ui declares the face, so it holds the reference copy and serves it to
+ * Storybook through `staticDirs`; every surface must match that copy byte for
+ * byte.
+ *
+ * The files are also redistributed under the SIL Open Font License 1.1, whose
+ * clause 2 requires the copyright notice and licence to travel with every copy.
+ * That obligation is a per-copy fact, not a repo-root one, so it is asserted
+ * per copy here.
+ */
+const THEME_PACKAGE = "packages/diagram/ui";
+
+const THEME_CSS = `${THEME_PACKAGE}/src/theme.css`;
+
+const FONT_DIRECTORY = "public/fonts/Excalifont";
+
+/** cn-font-split emits one file per unicode subset, not one file per face. */
+const EXPECTED_SUBSET_COUNT = 7;
+
+const repoRoot = fileURLToPath(new URL("../", import.meta.url));
+
+const themeCss = readFileSync(join(repoRoot, THEME_CSS), "utf8");
+
+/** Every app whose stylesheet pulls in the theme that declares the font. */
+function themeConsumers(): string[] {
+ return readdirSync(join(repoRoot, "apps"), { withFileTypes: true })
+ .filter((entry) => entry.isDirectory())
+ .map((entry) => entry.name)
+ .filter((app) => {
+ let appCss: string;
+
+ try {
+ appCss = readFileSync(
+ join(repoRoot, "apps", app, "src/styles/app.css"),
+ "utf8",
+ );
+ } catch {
+ return false;
+ }
+
+ return appCss.includes("diagram/ui/src/theme.css");
+ })
+ .map((app) => `apps/${app}`)
+ .sort();
+}
+
+const SURFACES = themeConsumers();
+
+/** The reference copy plus every copy that must match it. */
+const COPIES = [THEME_PACKAGE, ...SURFACES];
+
+function fontDirectory(surface: string): string {
+ return join(repoRoot, surface, FONT_DIRECTORY);
+}
+
+function subsetDigests(surface: string): Record {
+ const directory = fontDirectory(surface);
+ const files = readdirSync(directory)
+ .filter((name) => name.endsWith(".woff2"))
+ .sort();
+
+ return Object.fromEntries(
+ files.map((name) => [
+ name,
+ createHash("sha256")
+ .update(readFileSync(join(directory, name)))
+ .digest("hex"),
+ ]),
+ );
+}
+
+describe("vendored Excalifont", () => {
+ const referenceDigests = subsetDigests(THEME_PACKAGE);
+
+ it("vendors every subset, because one alone silently falls back", () => {
+ expect(Object.keys(referenceDigests)).toHaveLength(EXPECTED_SUBSET_COUNT);
+ });
+
+ it("knows every surface that inherits the font declarations", () => {
+ // Listed as well as derived: a new theme consumer should fail here with
+ // "vendor the font too", not ship a surface that 404s its own brand face.
+ expect(SURFACES).toEqual([
+ "apps/eval-harness",
+ "apps/excalidraw",
+ "apps/icons",
+ "apps/playground",
+ "apps/web",
+ ]);
+ });
+
+ it.each(SURFACES)("serves byte-identical subsets from %s", (surface) => {
+ expect(subsetDigests(surface)).toEqual(referenceDigests);
+ });
+
+ it.each(COPIES)("ships the OFL notice beside the fonts in %s", (surface) => {
+ const licence = readFileSync(
+ join(fontDirectory(surface), "LICENSE"),
+ "utf8",
+ );
+
+ expect(licence).toContain("Copyright (c) 2024 by Excalidraw");
+ expect(licence).toContain("SIL Open Font License, Version 1.1");
+ expect(licence).toContain("Excalifont is a trademark of Excalidraw");
+ });
+
+ it("serves the reference copy to Storybook", () => {
+ const storybookConfig = readFileSync(
+ join(repoRoot, THEME_PACKAGE, ".storybook/main.ts"),
+ "utf8",
+ );
+
+ expect(storybookConfig).toMatch(/staticDirs:\s*\["\.\.\/public"\]/u);
+ });
+
+ it("keeps the social card wordmark off the retired face", () => {
+ // The card is a static PNG, so a token swap cannot reach it. Its wordmark
+ // is Excalifont outlines; the one thing that must never come back is a
+ // element naming a font the renderer may not have.
+ const card = readFileSync(
+ join(repoRoot, "apps/web/public/media/sketchi-og-card.svg"),
+ "utf8",
+ );
+
+ expect(card).not.toContain("Dancing Script");
+ expect(card).not.toContain("NaN");
+ });
+
+ it("declares an @font-face for every vendored subset", () => {
+ for (const name of Object.keys(referenceDigests)) {
+ expect(themeCss).toContain(`/fonts/Excalifont/${name}`);
+ }
+ });
+
+ it("never asks the browser to synthesise a weight the face lacks", () => {
+ // Excalifont ships Regular only. A bolder wordmark is a faux-bold smear,
+ // so no @font-face may claim a weight the file cannot deliver.
+ const declaredWeights = [...themeCss.matchAll(/font-weight:\s*(\d+)/gu)]
+ .map((match) => match[1])
+ .filter((weight, index, all) => all.indexOf(weight) === index);
+
+ expect(declaredWeights).toContain("400");
+
+ const scriptRule = /\.sk-wordmark\s*\{[^}]*\}/u.exec(themeCss)?.[0] ?? "";
+ expect(scriptRule).toContain("var(--font-script)");
+ expect(scriptRule).toMatch(/font-weight:\s*400/u);
+ });
+
+ it("keeps the script token on Excalifont rather than a Google default", () => {
+ expect(themeCss).toMatch(/--font-script:\s*"Excalifont"/u);
+ expect(themeCss).not.toContain("Dancing Script");
+ });
+});