feat: add single card template for PNG/SVG output

- Create templates/single-card.typ for individual card rendering
- Includes local copy of create-colored-numeral function
- Supports transparent backgrounds and exact card dimensions
- Used by PNG/SVG generation to avoid PDF intermediate

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Thomas Hallock 2025-09-09 17:01:50 -05:00
parent 1adbd1a5ff
commit 33153108a2
23 changed files with 1898 additions and 126 deletions

View File

@ -7,19 +7,19 @@ A vector-based PDF flashcard generator for learning soroban (Japanese abacus) nu
<table>
<tr>
<td align="center">
<img src="docs/images/basic-123-front.png" width="200" alt="Soroban showing 123"><br>
<img src="docs/images/svg/basic-123_front.svg" width="200" alt="Soroban showing 123"><br>
<b>Soroban (Front)</b>
</td>
<td align="center">
<img src="docs/images/basic-123-back.png" width="200" alt="Numeral 123"><br>
<img src="docs/images/svg/basic-123_back.svg" width="200" alt="Numeral 123"><br>
<b>Numeral (Back)</b>
</td>
<td align="center">
<img src="docs/images/place-value-456-front.png" width="200" alt="Place-value colored 456"><br>
<img src="docs/images/svg/place-value-456_front.svg" width="200" alt="Place-value colored 456"><br>
<b>Place-Value Colors</b>
</td>
<td align="center">
<img src="docs/images/place-value-456-back.png" width="200" alt="Colored numeral 456"><br>
<img src="docs/images/svg/place-value-456_back.svg" width="200" alt="Colored numeral 456"><br>
<b>Colored Numerals</b>
</td>
</tr>
@ -30,15 +30,15 @@ A vector-based PDF flashcard generator for learning soroban (Japanese abacus) nu
<table>
<tr>
<td align="center">
<img src="docs/images/diamond-25-front.png" width="200" alt="Diamond beads"><br>
<img src="docs/images/svg/diamond-25_front.svg" width="200" alt="Diamond beads"><br>
<b>Diamond (Realistic)</b>
</td>
<td align="center">
<img src="docs/images/circle-25-front.png" width="200" alt="Circle beads"><br>
<img src="docs/images/svg/circle-25_front.svg" width="200" alt="Circle beads"><br>
<b>Circle (Traditional)</b>
</td>
<td align="center">
<img src="docs/images/square-25-front.png" width="200" alt="Square beads"><br>
<img src="docs/images/svg/square-25_front.svg" width="200" alt="Square beads"><br>
<b>Square</b>
</td>
</tr>
@ -63,7 +63,7 @@ A vector-based PDF flashcard generator for learning soroban (Japanese abacus) nu
<b>Skip Counting by 5s</b>
</td>
<td align="center">
<img src="docs/images/minimal-42-front.png" width="300" alt="Hidden inactive beads"><br>
<img src="docs/images/svg/minimal-42_front.svg" width="300" alt="Hidden inactive beads"><br>
<b>Hidden Inactive Beads</b>
</td>
</tr>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

@ -0,0 +1,23 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(95.868 104.21279999999999)">
<g class="typst-text" transform="scale(1, -1)">
<use xlink:href="#gA8B086524B604384343EE41E3350A9CD" x="0" fill="#000000" fill-rule="nonzero"/>
<use xlink:href="#g19480BF3572030D7913B87D66E55C45B" x="20.088000000000005" fill="#000000" fill-rule="nonzero"/>
<use xlink:href="#g1BE2FD2BC12AB488A636D0F2EA2BCD50" x="40.17600000000001" fill="#000000" fill-rule="nonzero"/>
</g>
</g>
</g>
<defs id="glyph">
<symbol id="gA8B086524B604384343EE41E3350A9CD" overflow="visible">
<path d="M 12.441601 5.2704 L 12.441601 20.260801 C 12.441601 22.8528 12.4848 25.488 12.5712 26.0496 C 12.5712 26.2656 12.4848 26.2656 12.312 26.2656 C 9.936 24.7968 7.6464 23.7168 3.8448 21.9456 C 3.9312 21.4704 4.104 21.0384 4.4928 20.7792 C 6.48 21.6 7.4304004 21.859201 8.251201 21.859201 C 8.9856 21.859201 9.1152 20.822401 9.1152 19.3536 L 9.1152 5.2704 C 9.1152 1.6848 7.9488 1.4688001 4.9248 1.3392 C 4.6656003 1.08 4.6656003 0.1728 4.9248 -0.0864 C 7.0416 -0.0432 8.5968 0 10.929601 0 C 13.003201 0 14.04 -0.0432 16.2 -0.0864 C 16.4592 0.1728 16.4592 1.08 16.2 1.3392 C 13.176001 1.4688001 12.441601 1.6848 12.441601 5.2704 Z "/>
</symbol>
<symbol id="g19480BF3572030D7913B87D66E55C45B" overflow="visible">
<path d="M 2.6352 20.2176 C 2.6352 19.3104 3.456 18.5328 4.3632 18.5328 C 5.0976 18.5328 6.3936 19.3104 6.3936 20.260801 C 6.3936 20.606401 6.3072 20.8656 6.2208004 21.168001 C 6.1344004 21.4704 5.8752003 21.859201 5.8752003 22.2048 C 5.8752003 23.284801 6.9984 24.84 10.152 24.84 C 11.7072 24.84 13.9104 23.76 13.9104 19.6128 C 13.9104 16.848 12.9168005 14.601601 10.368 12.009601 L 7.1712003 8.856 C 2.9376001 4.5360003 2.2464 2.4624 2.2464 -0.0864 C 2.2464 -0.0864 4.4496 0 5.8320003 0 L 13.392 0 C 14.774401 0 16.7616 -0.0864 16.7616 -0.0864 C 17.3232 2.2032 17.755201 5.4432 17.7984 6.7392 C 17.5392 6.9552 16.9776 7.0416 16.5456 6.9552 C 15.8112 3.888 15.0768 2.808 13.521601 2.808 L 5.8320003 2.808 C 5.8320003 4.8816 8.8128 7.8192 9.0288 8.0352 L 13.392 12.2256 C 15.854401 14.601601 17.712 16.502401 17.712 19.7856 C 17.712 24.4512 13.9104 26.352001 10.411201 26.352001 C 5.616 26.352001 2.6352 22.8096 2.6352 20.2176 Z "/>
</symbol>
<symbol id="g1BE2FD2BC12AB488A636D0F2EA2BCD50" overflow="visible">
<path d="M 9.288 24.84 C 11.1456 24.84 12.8736 23.7168 12.8736 20.952 C 12.8736 18.792 10.368 15.4656 6.0912004 14.860801 L 6.3072 13.4784 C 7.0416 13.5648 7.8192 13.5648 8.3808 13.5648 C 10.843201 13.5648 14.04 12.8736 14.04 7.992 C 14.04 2.2464 10.1952 1.08 8.6832 1.08 C 6.48 1.08 6.0912004 2.0736 5.5728 2.8512 C 5.1408 3.456 4.5792003 3.9744 3.7152002 3.9744 C 2.808 3.9744 1.9008 3.1536 1.9008 2.4624 C 1.9008 0.73440003 5.5296 -0.432 8.1216 -0.432 C 13.262401 -0.432 17.8416 2.8944001 17.8416 8.5968 C 17.8416 13.3056 14.2992 14.9904 11.750401 15.4224 L 11.7072 15.5088005 C 15.2496 17.1936 16.2432 18.9648 16.2432 21.2544 C 16.2432 22.5504 15.940801 23.5872 14.904 24.6672 C 13.9536 25.617601 12.441601 26.352001 10.1952 26.352001 C 3.8448 26.352001 2.0304 22.2048 2.0304 20.7792 C 2.0304 20.1744 2.4624 19.3104 3.4992 19.3104 C 5.0112 19.3104 5.184 20.736 5.184 21.5568 C 5.184 24.3216 8.164801 24.84 9.288 24.84 Z "/>
</symbol>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -0,0 +1,176 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(12.600000000000005 12.600000000000005)">
<g class="typst-group">
<g>
<g transform="translate(75.89999999999999 22.399999999999995)">
<g class="typst-group">
<g transform="matrix(0.9 0 0 0.9 3.75 5.5)">
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(11 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(4.1000000000000005 5)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 24)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 57)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 73)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 89)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(36 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(29.099999999999998 5)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 24)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 40)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 73)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 89)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(61 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(54.1 5)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(54.1 24)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(54.1 40)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(54.1 56)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(54.1 89)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(0 20)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 75 2 L 75 0 Z "/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,15 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(115.956 104.21279999999999)">
<g class="typst-text" transform="scale(1, -1)">
<use xlink:href="#gE527A8F526438E4E6CB0061AC2EAAA13" x="0" fill="#000000" fill-rule="nonzero"/>
</g>
</g>
</g>
<defs id="glyph">
<symbol id="gE527A8F526438E4E6CB0061AC2EAAA13" overflow="visible">
<path d="M 7.3440003 23.112001 L 15.0768 23.112001 C 11.7072 14.7312 8.2944 6.3072 5.3568 -0.2592 L 5.7024 -0.5616 L 8.64 -0.432 C 11.1024 6.912 13.4784 14.0832 18.316801 25.8768 L 17.6256 26.3952 C 16.891201 26.179201 15.940801 25.92 14.2992 25.92 L 5.4 25.92 C 3.9312 25.92 4.0176 26.352001 3.24 26.524801 C 3.1104002 26.524801 3.0672002 26.524801 3.0672002 26.3952 C 3.0240002 24.3216 2.5488 21.7296 2.2032 19.4832 C 2.6784 19.3536 3.1104002 19.3104 3.5856001 19.3536 C 4.5360003 22.8096 5.9616003 23.112001 7.3440003 23.112001 Z "/>
</symbol>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,80 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(12.600000000000005 12.600000000000005)">
<g class="typst-group">
<g>
<g transform="translate(100.89999999999999 22.399999999999995)">
<g class="typst-group">
<g transform="matrix(0.9 0 0 0.9 1.25 5.5)">
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(11 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(4.1000000000000005 6)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 24)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 40)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 73)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 89)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(0 20)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 25 2 L 25 0 Z "/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -0,0 +1,23 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(95.868 104.21279999999999)">
<g class="typst-text" transform="scale(1, -1)">
<use xlink:href="#gA8B086524B604384343EE41E3350A9CD" x="0" fill="#000000" fill-rule="nonzero"/>
<use xlink:href="#g19480BF3572030D7913B87D66E55C45B" x="20.088000000000005" fill="#000000" fill-rule="nonzero"/>
<use xlink:href="#g1BE2FD2BC12AB488A636D0F2EA2BCD50" x="40.17600000000001" fill="#000000" fill-rule="nonzero"/>
</g>
</g>
</g>
<defs id="glyph">
<symbol id="gA8B086524B604384343EE41E3350A9CD" overflow="visible">
<path d="M 12.441601 5.2704 L 12.441601 20.260801 C 12.441601 22.8528 12.4848 25.488 12.5712 26.0496 C 12.5712 26.2656 12.4848 26.2656 12.312 26.2656 C 9.936 24.7968 7.6464 23.7168 3.8448 21.9456 C 3.9312 21.4704 4.104 21.0384 4.4928 20.7792 C 6.48 21.6 7.4304004 21.859201 8.251201 21.859201 C 8.9856 21.859201 9.1152 20.822401 9.1152 19.3536 L 9.1152 5.2704 C 9.1152 1.6848 7.9488 1.4688001 4.9248 1.3392 C 4.6656003 1.08 4.6656003 0.1728 4.9248 -0.0864 C 7.0416 -0.0432 8.5968 0 10.929601 0 C 13.003201 0 14.04 -0.0432 16.2 -0.0864 C 16.4592 0.1728 16.4592 1.08 16.2 1.3392 C 13.176001 1.4688001 12.441601 1.6848 12.441601 5.2704 Z "/>
</symbol>
<symbol id="g19480BF3572030D7913B87D66E55C45B" overflow="visible">
<path d="M 2.6352 20.2176 C 2.6352 19.3104 3.456 18.5328 4.3632 18.5328 C 5.0976 18.5328 6.3936 19.3104 6.3936 20.260801 C 6.3936 20.606401 6.3072 20.8656 6.2208004 21.168001 C 6.1344004 21.4704 5.8752003 21.859201 5.8752003 22.2048 C 5.8752003 23.284801 6.9984 24.84 10.152 24.84 C 11.7072 24.84 13.9104 23.76 13.9104 19.6128 C 13.9104 16.848 12.9168005 14.601601 10.368 12.009601 L 7.1712003 8.856 C 2.9376001 4.5360003 2.2464 2.4624 2.2464 -0.0864 C 2.2464 -0.0864 4.4496 0 5.8320003 0 L 13.392 0 C 14.774401 0 16.7616 -0.0864 16.7616 -0.0864 C 17.3232 2.2032 17.755201 5.4432 17.7984 6.7392 C 17.5392 6.9552 16.9776 7.0416 16.5456 6.9552 C 15.8112 3.888 15.0768 2.808 13.521601 2.808 L 5.8320003 2.808 C 5.8320003 4.8816 8.8128 7.8192 9.0288 8.0352 L 13.392 12.2256 C 15.854401 14.601601 17.712 16.502401 17.712 19.7856 C 17.712 24.4512 13.9104 26.352001 10.411201 26.352001 C 5.616 26.352001 2.6352 22.8096 2.6352 20.2176 Z "/>
</symbol>
<symbol id="g1BE2FD2BC12AB488A636D0F2EA2BCD50" overflow="visible">
<path d="M 9.288 24.84 C 11.1456 24.84 12.8736 23.7168 12.8736 20.952 C 12.8736 18.792 10.368 15.4656 6.0912004 14.860801 L 6.3072 13.4784 C 7.0416 13.5648 7.8192 13.5648 8.3808 13.5648 C 10.843201 13.5648 14.04 12.8736 14.04 7.992 C 14.04 2.2464 10.1952 1.08 8.6832 1.08 C 6.48 1.08 6.0912004 2.0736 5.5728 2.8512 C 5.1408 3.456 4.5792003 3.9744 3.7152002 3.9744 C 2.808 3.9744 1.9008 3.1536 1.9008 2.4624 C 1.9008 0.73440003 5.5296 -0.432 8.1216 -0.432 C 13.262401 -0.432 17.8416 2.8944001 17.8416 8.5968 C 17.8416 13.3056 14.2992 14.9904 11.750401 15.4224 L 11.7072 15.5088005 C 15.2496 17.1936 16.2432 18.9648 16.2432 21.2544 C 16.2432 22.5504 15.940801 23.5872 14.904 24.6672 C 13.9536 25.617601 12.441601 26.352001 10.1952 26.352001 C 3.8448 26.352001 2.0304 22.2048 2.0304 20.7792 C 2.0304 20.1744 2.4624 19.3104 3.4992 19.3104 C 5.0112 19.3104 5.184 20.736 5.184 21.5568 C 5.184 24.3216 8.164801 24.84 9.288 24.84 Z "/>
</symbol>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -0,0 +1,176 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(12.600000000000005 12.600000000000005)">
<g class="typst-group">
<g>
<g transform="translate(75.89999999999999 22.399999999999995)">
<g class="typst-group">
<g transform="matrix(0.9 0 0 0.9 3.75 5.5)">
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(11 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(4.1000000000000005 5)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 24)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 57)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 73)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 89)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(36 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(29.099999999999998 5)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 24)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 40)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 73)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 89)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(61 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(54.1 5)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(54.1 24)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(54.1 40)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(54.1 56)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(54.1 89)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(0 20)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 75 2 L 75 0 Z "/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,19 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(105.912 104.21279999999999)">
<g class="typst-text" transform="scale(1, -1)">
<use xlink:href="#g19480BF3572030D7913B87D66E55C45B" x="0" fill="#000000" fill-rule="nonzero"/>
<use xlink:href="#gAF20C5EEFD02749CFBCC5373D1A63396" x="20.088000000000005" fill="#000000" fill-rule="nonzero"/>
</g>
</g>
</g>
<defs id="glyph">
<symbol id="g19480BF3572030D7913B87D66E55C45B" overflow="visible">
<path d="M 2.6352 20.2176 C 2.6352 19.3104 3.456 18.5328 4.3632 18.5328 C 5.0976 18.5328 6.3936 19.3104 6.3936 20.260801 C 6.3936 20.606401 6.3072 20.8656 6.2208004 21.168001 C 6.1344004 21.4704 5.8752003 21.859201 5.8752003 22.2048 C 5.8752003 23.284801 6.9984 24.84 10.152 24.84 C 11.7072 24.84 13.9104 23.76 13.9104 19.6128 C 13.9104 16.848 12.9168005 14.601601 10.368 12.009601 L 7.1712003 8.856 C 2.9376001 4.5360003 2.2464 2.4624 2.2464 -0.0864 C 2.2464 -0.0864 4.4496 0 5.8320003 0 L 13.392 0 C 14.774401 0 16.7616 -0.0864 16.7616 -0.0864 C 17.3232 2.2032 17.755201 5.4432 17.7984 6.7392 C 17.5392 6.9552 16.9776 7.0416 16.5456 6.9552 C 15.8112 3.888 15.0768 2.808 13.521601 2.808 L 5.8320003 2.808 C 5.8320003 4.8816 8.8128 7.8192 9.0288 8.0352 L 13.392 12.2256 C 15.854401 14.601601 17.712 16.502401 17.712 19.7856 C 17.712 24.4512 13.9104 26.352001 10.411201 26.352001 C 5.616 26.352001 2.6352 22.8096 2.6352 20.2176 Z "/>
</symbol>
<symbol id="gAF20C5EEFD02749CFBCC5373D1A63396" overflow="visible">
<path d="M 13.780801 8.164801 C 13.780801 4.0608 11.6208 1.0368 9.0288 1.0368 C 7.3872004 1.0368 6.8256 2.1168 6.1776004 2.9808002 C 5.616 3.7152002 4.8816 4.3632 3.9744 4.3632 C 3.1536 4.3632 2.3328001 3.6288002 2.3328001 2.7648 C 2.3328001 0.9936 6.0048003 -0.4752 8.4672 -0.4752 C 13.824 -0.4752 17.6256 3.4992 17.6256 8.9424 C 17.6256 13.1328 14.7312 16.891201 9.8928 16.891201 C 8.0352 16.891201 6.4368 16.502401 5.6592 16.2 L 6.5232 23.4144 C 8.1216 23.2416 9.504001 23.0256 11.5776005 23.0256 C 12.8736 23.0256 14.342401 23.112001 16.1136 23.284801 L 16.8048 26.2224 L 16.502401 26.3952 C 14.04 26.136002 11.7072 25.92 9.417601 25.92 C 7.8192 25.92 6.264 26.006401 4.7520003 26.136002 L 3.2832 13.694401 C 5.5728 14.5584 7.2144003 14.7312 8.7696 14.7312 C 11.5776005 14.7312 13.780801 12.8736 13.780801 8.164801 Z "/>
</symbol>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,128 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(12.600000000000005 12.600000000000005)">
<g class="typst-group">
<g>
<g transform="translate(88.39999999999999 22.399999999999995)">
<g class="typst-group">
<g transform="matrix(0.9 0 0 0.9 2.5 5.5)">
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(11 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(6.5 5)">
<g class="typst-group">
<g>
<g transform="translate(-0 -0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
</g>
</g>
</g>
</g>
<g transform="translate(6.5 24)">
<g class="typst-group">
<g>
<g transform="translate(-0 -0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
</g>
</g>
</g>
</g>
<g transform="translate(6.5 40)">
<g class="typst-group">
<g>
<g transform="translate(-0 -0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
</g>
</g>
</g>
</g>
<g transform="translate(6.5 73)">
<g class="typst-group">
<g>
<g transform="translate(-0 -0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
</g>
</g>
</g>
</g>
<g transform="translate(6.5 89)">
<g class="typst-group">
<g>
<g transform="translate(-0 -0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
</g>
</g>
</g>
</g>
<g transform="translate(36 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(31.5 6)">
<g class="typst-group">
<g>
<g transform="translate(-0 -0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
</g>
</g>
</g>
</g>
<g transform="translate(31.5 41)">
<g class="typst-group">
<g>
<g transform="translate(-0 -0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
</g>
</g>
</g>
</g>
<g transform="translate(31.5 57)">
<g class="typst-group">
<g>
<g transform="translate(-0 -0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
</g>
</g>
</g>
</g>
<g transform="translate(31.5 73)">
<g class="typst-group">
<g>
<g transform="translate(-0 -0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
</g>
</g>
</g>
</g>
<g transform="translate(31.5 89)">
<g class="typst-group">
<g>
<g transform="translate(-0 -0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 6 C 0 2.689296 2.689296 0 6 0 C 9.310704 0 12 2.689296 12 6 C 12 9.310704 9.310704 12 6 12 C 2.689296 12 0 9.310704 0 6 "/>
</g>
</g>
</g>
</g>
<g transform="translate(0 20)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 50 2 L 50 0 Z "/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,19 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(105.912 104.21279999999999)">
<g class="typst-text" transform="scale(1, -1)">
<use xlink:href="#g19480BF3572030D7913B87D66E55C45B" x="0" fill="#000000" fill-rule="nonzero"/>
<use xlink:href="#gAF20C5EEFD02749CFBCC5373D1A63396" x="20.088000000000005" fill="#000000" fill-rule="nonzero"/>
</g>
</g>
</g>
<defs id="glyph">
<symbol id="g19480BF3572030D7913B87D66E55C45B" overflow="visible">
<path d="M 2.6352 20.2176 C 2.6352 19.3104 3.456 18.5328 4.3632 18.5328 C 5.0976 18.5328 6.3936 19.3104 6.3936 20.260801 C 6.3936 20.606401 6.3072 20.8656 6.2208004 21.168001 C 6.1344004 21.4704 5.8752003 21.859201 5.8752003 22.2048 C 5.8752003 23.284801 6.9984 24.84 10.152 24.84 C 11.7072 24.84 13.9104 23.76 13.9104 19.6128 C 13.9104 16.848 12.9168005 14.601601 10.368 12.009601 L 7.1712003 8.856 C 2.9376001 4.5360003 2.2464 2.4624 2.2464 -0.0864 C 2.2464 -0.0864 4.4496 0 5.8320003 0 L 13.392 0 C 14.774401 0 16.7616 -0.0864 16.7616 -0.0864 C 17.3232 2.2032 17.755201 5.4432 17.7984 6.7392 C 17.5392 6.9552 16.9776 7.0416 16.5456 6.9552 C 15.8112 3.888 15.0768 2.808 13.521601 2.808 L 5.8320003 2.808 C 5.8320003 4.8816 8.8128 7.8192 9.0288 8.0352 L 13.392 12.2256 C 15.854401 14.601601 17.712 16.502401 17.712 19.7856 C 17.712 24.4512 13.9104 26.352001 10.411201 26.352001 C 5.616 26.352001 2.6352 22.8096 2.6352 20.2176 Z "/>
</symbol>
<symbol id="gAF20C5EEFD02749CFBCC5373D1A63396" overflow="visible">
<path d="M 13.780801 8.164801 C 13.780801 4.0608 11.6208 1.0368 9.0288 1.0368 C 7.3872004 1.0368 6.8256 2.1168 6.1776004 2.9808002 C 5.616 3.7152002 4.8816 4.3632 3.9744 4.3632 C 3.1536 4.3632 2.3328001 3.6288002 2.3328001 2.7648 C 2.3328001 0.9936 6.0048003 -0.4752 8.4672 -0.4752 C 13.824 -0.4752 17.6256 3.4992 17.6256 8.9424 C 17.6256 13.1328 14.7312 16.891201 9.8928 16.891201 C 8.0352 16.891201 6.4368 16.502401 5.6592 16.2 L 6.5232 23.4144 C 8.1216 23.2416 9.504001 23.0256 11.5776005 23.0256 C 12.8736 23.0256 14.342401 23.112001 16.1136 23.284801 L 16.8048 26.2224 L 16.502401 26.3952 C 14.04 26.136002 11.7072 25.92 9.417601 25.92 C 7.8192 25.92 6.264 26.006401 4.7520003 26.136002 L 3.2832 13.694401 C 5.5728 14.5584 7.2144003 14.7312 8.7696 14.7312 C 11.5776005 14.7312 13.780801 12.8736 13.780801 8.164801 Z "/>
</symbol>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,128 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(12.600000000000005 12.600000000000005)">
<g class="typst-group">
<g>
<g transform="translate(88.39999999999999 22.399999999999995)">
<g class="typst-group">
<g transform="matrix(0.9 0 0 0.9 2.5 5.5)">
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(11 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(4.1000000000000005 5)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 24)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 40)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 73)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 89)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(36 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(29.099999999999998 6)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 41)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 57)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 73)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 89)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(0 20)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 50 2 L 50 0 Z "/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,19 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(105.912 104.21279999999999)">
<g class="typst-text" transform="scale(1, -1)">
<use xlink:href="#gE527A8F526438E4E6CB0061AC2EAAA13" x="0" fill="#f18f01" fill-rule="nonzero"/>
<use xlink:href="#g456746B19EB22F2A61BF01BD62096D58" x="20.088000000000005" fill="#f18f01" fill-rule="nonzero"/>
</g>
</g>
</g>
<defs id="glyph">
<symbol id="gE527A8F526438E4E6CB0061AC2EAAA13" overflow="visible">
<path d="M 7.3440003 23.112001 L 15.0768 23.112001 C 11.7072 14.7312 8.2944 6.3072 5.3568 -0.2592 L 5.7024 -0.5616 L 8.64 -0.432 C 11.1024 6.912 13.4784 14.0832 18.316801 25.8768 L 17.6256 26.3952 C 16.891201 26.179201 15.940801 25.92 14.2992 25.92 L 5.4 25.92 C 3.9312 25.92 4.0176 26.352001 3.24 26.524801 C 3.1104002 26.524801 3.0672002 26.524801 3.0672002 26.3952 C 3.0240002 24.3216 2.5488 21.7296 2.2032 19.4832 C 2.6784 19.3536 3.1104002 19.3104 3.5856001 19.3536 C 4.5360003 22.8096 5.9616003 23.112001 7.3440003 23.112001 Z "/>
</symbol>
<symbol id="g456746B19EB22F2A61BF01BD62096D58" overflow="visible">
<path d="M 16.9776 20.952 C 16.9776 24.0624 14.5584 26.352001 10.3248005 26.352001 C 5.9184003 26.352001 3.0672002 23.7168 3.0672002 20.3904 C 3.0672002 17.9712 4.2336 16.2 6.8688 14.5584 L 7.992 13.8672 C 6.7392 13.2192 5.5728 12.441601 4.4928 11.4912 C 2.7216 9.936 1.9872 7.992 1.9872 6.3072 C 1.9872 1.9008 5.0976 -0.432 9.6768 -0.432 C 15.336 -0.432 18.1008 3.7152002 18.1008 6.9984 C 18.1008 9.504001 17.0208 11.7072 14.7312 13.089601 L 11.6640005 14.947201 C 13.694401 15.940801 16.9776 18.1872 16.9776 20.952 Z M 9.7632 1.08 C 7.8192 1.08 4.8816 2.4192 4.8816 6.3072 C 4.8816 7.6032 5.4432 10.6272 9.158401 13.089601 L 11.1888 11.88 C 13.8672 10.2384 14.947201 8.208 14.947201 6.1344004 C 14.947201 1.8144001 11.7072 1.08 9.7632 1.08 Z M 10.1088 24.84 C 12.9168005 24.84 13.9536 22.9824 13.9536 20.995201 C 13.9536 18.662401 11.6640005 16.718401 10.497601 15.854401 L 9.158401 16.6752 C 6.4368 18.4464 6.1344004 19.872 6.1344004 21.2112 C 6.1344004 23.1984 7.5168004 24.84 10.1088 24.84 Z "/>
</symbol>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,128 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(12.600000000000005 12.600000000000005)">
<g class="typst-group">
<g>
<g transform="translate(88.39999999999999 22.399999999999995)">
<g class="typst-group">
<g transform="matrix(0.9 0 0 0.9 2.5 5.5)">
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(11 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(4.1000000000000005 6)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#f18f01" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 24)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#2e86ab" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 40)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#2e86ab" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 73)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 89)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(36 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(29.099999999999998 6)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#f18f01" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 24)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#2e86ab" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 40)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#2e86ab" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 56)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#2e86ab" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 89)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(0 20)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 50 2 L 50 0 Z "/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,19 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(105.912 104.21279999999999)">
<g class="typst-text" transform="scale(1, -1)">
<use xlink:href="#g695ECEB1DA88E26092A3CA94420E001D" x="0" fill="#000000" fill-rule="nonzero"/>
<use xlink:href="#g19480BF3572030D7913B87D66E55C45B" x="20.088000000000005" fill="#000000" fill-rule="nonzero"/>
</g>
</g>
</g>
<defs id="glyph">
<symbol id="g695ECEB1DA88E26092A3CA94420E001D" overflow="visible">
<path d="M 18.576 9.4608 L 14.9904 9.4608 L 14.9904 22.075201 C 14.9904 24.2352 14.9904 25.92 15.0768 26.2656 L 14.9904 26.352001 L 13.608001 26.352001 C 13.3056 26.352001 13.089601 26.0928 12.9168005 25.8768 C 10.1952 22.5504 5.184 15.4224 1.2096 9.244801 C 1.3392 8.5968 1.5984 7.4304004 2.8944001 7.4304004 L 11.7072 7.4304004 L 11.7072 3.456 C 11.7072 1.4688001 10.0656 1.4688001 8.208 1.3392 C 7.9488 1.08 7.9488 0.1728 8.208 -0.0864 C 9.590401 -0.0432 11.3184 0 13.3056 0 C 14.9904 0 16.632 -0.0432 18.0144 -0.0864 C 18.2736 0.1728 18.2736 1.08 18.0144 1.3392 C 15.8976 1.5120001 14.9904 1.4256 14.9904 3.456 L 14.9904 7.4304004 L 17.9712 7.4304004 C 18.576 7.4304004 19.224 8.251201 19.224 8.7696 C 19.224 9.2016 19.0512 9.4608 18.576 9.4608 Z M 11.7072 21.902401 L 11.7072 9.4608 L 3.456 9.4608 C 5.6592 13.003201 8.7264 17.8416 11.7072 21.902401 Z "/>
</symbol>
<symbol id="g19480BF3572030D7913B87D66E55C45B" overflow="visible">
<path d="M 2.6352 20.2176 C 2.6352 19.3104 3.456 18.5328 4.3632 18.5328 C 5.0976 18.5328 6.3936 19.3104 6.3936 20.260801 C 6.3936 20.606401 6.3072 20.8656 6.2208004 21.168001 C 6.1344004 21.4704 5.8752003 21.859201 5.8752003 22.2048 C 5.8752003 23.284801 6.9984 24.84 10.152 24.84 C 11.7072 24.84 13.9104 23.76 13.9104 19.6128 C 13.9104 16.848 12.9168005 14.601601 10.368 12.009601 L 7.1712003 8.856 C 2.9376001 4.5360003 2.2464 2.4624 2.2464 -0.0864 C 2.2464 -0.0864 4.4496 0 5.8320003 0 L 13.392 0 C 14.774401 0 16.7616 -0.0864 16.7616 -0.0864 C 17.3232 2.2032 17.755201 5.4432 17.7984 6.7392 C 17.5392 6.9552 16.9776 7.0416 16.5456 6.9552 C 15.8112 3.888 15.0768 2.808 13.521601 2.808 L 5.8320003 2.808 C 5.8320003 4.8816 8.8128 7.8192 9.0288 8.0352 L 13.392 12.2256 C 15.854401 14.601601 17.712 16.502401 17.712 19.7856 C 17.712 24.4512 13.9104 26.352001 10.411201 26.352001 C 5.616 26.352001 2.6352 22.8096 2.6352 20.2176 Z "/>
</symbol>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,92 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(12.600000000000005 12.600000000000005)">
<g class="typst-group">
<g>
<g transform="translate(88.39999999999999 22.399999999999995)">
<g class="typst-group">
<g transform="matrix(0.9 0 0 0.9 2.5 5.5)">
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(11 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(4.1000000000000005 24)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 40)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 56)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 72)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(36 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(29.099999999999998 24)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 40)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(0 20)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 50 2 L 50 0 Z "/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@ -0,0 +1,31 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(95.868 104.21279999999999)">
<g class="typst-text" transform="scale(1, -1)">
<use xlink:href="#g695ECEB1DA88E26092A3CA94420E001D" x="0" fill="#f18f01" fill-rule="nonzero"/>
</g>
</g>
<g transform="translate(115.956 104.21279999999999)">
<g class="typst-text" transform="scale(1, -1)">
<use xlink:href="#gAF20C5EEFD02749CFBCC5373D1A63396" x="0" fill="#a23b72" fill-rule="nonzero"/>
</g>
</g>
<g transform="translate(136.044 104.21279999999999)">
<g class="typst-text" transform="scale(1, -1)">
<use xlink:href="#gC1E16492C95BF657C4E2F003E39B6B87" x="0" fill="#2e86ab" fill-rule="nonzero"/>
</g>
</g>
</g>
<defs id="glyph">
<symbol id="g695ECEB1DA88E26092A3CA94420E001D" overflow="visible">
<path d="M 18.576 9.4608 L 14.9904 9.4608 L 14.9904 22.075201 C 14.9904 24.2352 14.9904 25.92 15.0768 26.2656 L 14.9904 26.352001 L 13.608001 26.352001 C 13.3056 26.352001 13.089601 26.0928 12.9168005 25.8768 C 10.1952 22.5504 5.184 15.4224 1.2096 9.244801 C 1.3392 8.5968 1.5984 7.4304004 2.8944001 7.4304004 L 11.7072 7.4304004 L 11.7072 3.456 C 11.7072 1.4688001 10.0656 1.4688001 8.208 1.3392 C 7.9488 1.08 7.9488 0.1728 8.208 -0.0864 C 9.590401 -0.0432 11.3184 0 13.3056 0 C 14.9904 0 16.632 -0.0432 18.0144 -0.0864 C 18.2736 0.1728 18.2736 1.08 18.0144 1.3392 C 15.8976 1.5120001 14.9904 1.4256 14.9904 3.456 L 14.9904 7.4304004 L 17.9712 7.4304004 C 18.576 7.4304004 19.224 8.251201 19.224 8.7696 C 19.224 9.2016 19.0512 9.4608 18.576 9.4608 Z M 11.7072 21.902401 L 11.7072 9.4608 L 3.456 9.4608 C 5.6592 13.003201 8.7264 17.8416 11.7072 21.902401 Z "/>
</symbol>
<symbol id="gAF20C5EEFD02749CFBCC5373D1A63396" overflow="visible">
<path d="M 13.780801 8.164801 C 13.780801 4.0608 11.6208 1.0368 9.0288 1.0368 C 7.3872004 1.0368 6.8256 2.1168 6.1776004 2.9808002 C 5.616 3.7152002 4.8816 4.3632 3.9744 4.3632 C 3.1536 4.3632 2.3328001 3.6288002 2.3328001 2.7648 C 2.3328001 0.9936 6.0048003 -0.4752 8.4672 -0.4752 C 13.824 -0.4752 17.6256 3.4992 17.6256 8.9424 C 17.6256 13.1328 14.7312 16.891201 9.8928 16.891201 C 8.0352 16.891201 6.4368 16.502401 5.6592 16.2 L 6.5232 23.4144 C 8.1216 23.2416 9.504001 23.0256 11.5776005 23.0256 C 12.8736 23.0256 14.342401 23.112001 16.1136 23.284801 L 16.8048 26.2224 L 16.502401 26.3952 C 14.04 26.136002 11.7072 25.92 9.417601 25.92 C 7.8192 25.92 6.264 26.006401 4.7520003 26.136002 L 3.2832 13.694401 C 5.5728 14.5584 7.2144003 14.7312 8.7696 14.7312 C 11.5776005 14.7312 13.780801 12.8736 13.780801 8.164801 Z "/>
</symbol>
<symbol id="gC1E16492C95BF657C4E2F003E39B6B87" overflow="visible">
<path d="M 6.2208004 14.8176 C 7.3872004 18.7488 10.152 23.112001 15.8976 25.272001 C 15.8976 25.790401 15.7248 26.179201 15.3792 26.3952 C 11.016001 25.099201 8.3376 23.284801 5.9184003 20.4768 C 3.24 17.3664 1.9008 13.435201 1.9008 10.0224 C 1.9008 1.2528 6.8688 -0.4752 10.1952 -0.4752 C 15.854401 -0.4752 18.1872 5.0112 18.1872 8.7264 C 18.1872 12.441601 16.2 15.768001 10.3248005 15.768001 C 9.2016 15.768001 7.5168004 15.4224 6.2208004 14.8176 Z M 5.8320003 13.262401 C 7.2576003 14.2128 8.6832 14.2560005 9.417601 14.2560005 C 13.6512 14.2560005 14.601601 10.1088 14.601601 7.9488 C 14.601601 3.1968 12.7872 1.0368 10.670401 1.0368 C 7.9488 1.0368 5.4864 2.5056 5.4864 9.8928 C 5.4864 10.8864 5.5728 12.009601 5.8320003 13.262401 Z "/>
</symbol>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,176 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(12.600000000000005 12.600000000000005)">
<g class="typst-group">
<g>
<g transform="translate(75.89999999999999 22.399999999999995)">
<g class="typst-group">
<g transform="matrix(0.9 0 0 0.9 3.75 5.5)">
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(11 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(4.1000000000000005 5)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 24)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#f18f01" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 40)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#f18f01" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 56)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#f18f01" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(4.1000000000000005 72)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#f18f01" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(36 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(29.099999999999998 6)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#a23b72" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 41)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 57)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 73)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(29.099999999999998 89)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(61 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(54.1 6)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#2e86ab" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(54.1 24)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#2e86ab" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(54.1 57)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(54.1 73)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(54.1 89)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 8.4 0 L 16.8 6 L 8.4 12 L 0 6 Z "/>
</g>
</g>
</g>
</g>
<g transform="translate(0 20)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 75 2 L 75 0 Z "/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,19 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(105.912 104.21279999999999)">
<g class="typst-text" transform="scale(1, -1)">
<use xlink:href="#g19480BF3572030D7913B87D66E55C45B" x="0" fill="#000000" fill-rule="nonzero"/>
<use xlink:href="#gAF20C5EEFD02749CFBCC5373D1A63396" x="20.088000000000005" fill="#000000" fill-rule="nonzero"/>
</g>
</g>
</g>
<defs id="glyph">
<symbol id="g19480BF3572030D7913B87D66E55C45B" overflow="visible">
<path d="M 2.6352 20.2176 C 2.6352 19.3104 3.456 18.5328 4.3632 18.5328 C 5.0976 18.5328 6.3936 19.3104 6.3936 20.260801 C 6.3936 20.606401 6.3072 20.8656 6.2208004 21.168001 C 6.1344004 21.4704 5.8752003 21.859201 5.8752003 22.2048 C 5.8752003 23.284801 6.9984 24.84 10.152 24.84 C 11.7072 24.84 13.9104 23.76 13.9104 19.6128 C 13.9104 16.848 12.9168005 14.601601 10.368 12.009601 L 7.1712003 8.856 C 2.9376001 4.5360003 2.2464 2.4624 2.2464 -0.0864 C 2.2464 -0.0864 4.4496 0 5.8320003 0 L 13.392 0 C 14.774401 0 16.7616 -0.0864 16.7616 -0.0864 C 17.3232 2.2032 17.755201 5.4432 17.7984 6.7392 C 17.5392 6.9552 16.9776 7.0416 16.5456 6.9552 C 15.8112 3.888 15.0768 2.808 13.521601 2.808 L 5.8320003 2.808 C 5.8320003 4.8816 8.8128 7.8192 9.0288 8.0352 L 13.392 12.2256 C 15.854401 14.601601 17.712 16.502401 17.712 19.7856 C 17.712 24.4512 13.9104 26.352001 10.411201 26.352001 C 5.616 26.352001 2.6352 22.8096 2.6352 20.2176 Z "/>
</symbol>
<symbol id="gAF20C5EEFD02749CFBCC5373D1A63396" overflow="visible">
<path d="M 13.780801 8.164801 C 13.780801 4.0608 11.6208 1.0368 9.0288 1.0368 C 7.3872004 1.0368 6.8256 2.1168 6.1776004 2.9808002 C 5.616 3.7152002 4.8816 4.3632 3.9744 4.3632 C 3.1536 4.3632 2.3328001 3.6288002 2.3328001 2.7648 C 2.3328001 0.9936 6.0048003 -0.4752 8.4672 -0.4752 C 13.824 -0.4752 17.6256 3.4992 17.6256 8.9424 C 17.6256 13.1328 14.7312 16.891201 9.8928 16.891201 C 8.0352 16.891201 6.4368 16.502401 5.6592 16.2 L 6.5232 23.4144 C 8.1216 23.2416 9.504001 23.0256 11.5776005 23.0256 C 12.8736 23.0256 14.342401 23.112001 16.1136 23.284801 L 16.8048 26.2224 L 16.502401 26.3952 C 14.04 26.136002 11.7072 25.92 9.417601 25.92 C 7.8192 25.92 6.264 26.006401 4.7520003 26.136002 L 3.2832 13.694401 C 5.5728 14.5584 7.2144003 14.7312 8.7696 14.7312 C 11.5776005 14.7312 13.780801 12.8736 13.780801 8.164801 Z "/>
</symbol>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,98 @@
<svg class="typst-doc" viewBox="0 0 252 180" width="252pt" height="180pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml">
<path class="typst-shape" fill="#ffffff" fill-rule="nonzero" d="M 0 0 L 0 180 L 252 180 L 252 0 Z "/>
<g>
<g transform="translate(12.600000000000005 12.600000000000005)">
<g class="typst-group">
<g>
<g transform="translate(88.39999999999999 22.399999999999995)">
<g class="typst-group">
<g transform="matrix(0.9 0 0 0.9 2.5 5.5)">
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(0 0)">
<g class="typst-group">
<g>
<g transform="translate(11 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(6.5 5)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
</g>
<g transform="translate(6.5 5)">
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
</g>
<g transform="translate(6.5 24)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
</g>
<g transform="translate(6.5 24)">
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
</g>
<g transform="translate(6.5 40)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
</g>
<g transform="translate(6.5 40)">
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
</g>
<g transform="translate(6.5 73)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
</g>
<g transform="translate(6.5 73)">
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
</g>
<g transform="translate(6.5 89)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
</g>
<g transform="translate(6.5 89)">
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
</g>
<g transform="translate(36 0)">
<path class="typst-shape" fill="#eeeeee" fill-rule="nonzero" d="M 0 0 L 0 110 L 3 110 L 3 0 Z "/>
</g>
<g transform="translate(31.5 6)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
</g>
<g transform="translate(31.5 6)">
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
</g>
<g transform="translate(31.5 41)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
</g>
<g transform="translate(31.5 41)">
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
</g>
<g transform="translate(31.5 57)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
</g>
<g transform="translate(31.5 57)">
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
</g>
<g transform="translate(31.5 73)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
</g>
<g transform="translate(31.5 73)">
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
</g>
<g transform="translate(31.5 89)">
<path class="typst-shape" fill="#e6e6e6" fill-rule="nonzero" d="M 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 Z "/>
</g>
<g transform="translate(31.5 89)">
<path class="typst-shape" fill="none" stroke="#000000" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0.75 0 L 11.25 0 C 11.664213 0 12 0.33578643 12 0.75 L 12 11.25 C 12 11.664213 11.664213 12 11.25 12 L 0.75 12 C 0.33578643 12 0 11.664213 0 11.25 L 0 0.75 C 0 0.33578643 0.33578643 0 0.75 0 "/>
</g>
<g transform="translate(0 20)">
<path class="typst-shape" fill="#000000" fill-rule="nonzero" d="M 0 0 L 0 2 L 50 2 L 50 0 Z "/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -7,6 +7,8 @@ import random
import subprocess
import sys
import os
import tempfile
import shutil
from pathlib import Path
def load_config(config_path):
@ -45,6 +47,157 @@ def parse_range(range_str, step=1):
numbers = [int(range_str)]
return numbers
def generate_single_card_typst(number, side, config, output_path, project_root):
"""Generate Typst file for a single card"""
# Use relative path to single-card.typ (we'll copy templates to temp dir)
typst_content = f'''
#import "single-card.typ": generate-single-card
#generate-single-card(
{number},
side: "{side}",
bead-shape: "{config.get('bead_shape', 'diamond')}",
color-scheme: "{config.get('color_scheme', 'monochrome')}",
colored-numerals: {str(config.get('colored_numerals', False)).lower()},
hide-inactive-beads: {str(config.get('hide_inactive_beads', False)).lower()},
show-empty-columns: {str(config.get('show_empty_columns', False)).lower()},
columns: {config.get('columns', 'auto')},
transparent: {str(config.get('transparent', False)).lower()},
width: {config.get('card_width', '3.5in')},
height: {config.get('card_height', '2.5in')},
font-size: {config.get('font_size', '48pt')},
font-family: "{config.get('font_family', 'DejaVu Sans')}",
scale-factor: {config.get('scale_factor', 1.0)}
)
'''
with open(output_path, 'w') as f:
f.write(typst_content)
def typst_to_image(typst_file, output_file, format='png', dpi=300, tmpdir_path=None):
"""Convert Typst file directly to PNG or SVG"""
# Use relative paths from tmpdir
if tmpdir_path:
rel_input = typst_file.name # Just filename since we're running from tmpdir
abs_output = output_file.resolve() # Absolute path for output
else:
rel_input = str(typst_file)
abs_output = str(output_file)
# Typst can export directly to PNG or SVG
cmd = [
'typst', 'compile',
'--format', format,
rel_input,
str(abs_output)
]
# Add DPI for PNG only
if format == 'png':
cmd.insert(-2, '--ppi')
cmd.insert(-2, str(dpi))
# Add font path from tmpdir if fonts were copied there
if tmpdir_path:
fonts_path = tmpdir_path / 'fonts'
if fonts_path.exists():
cmd.extend(['--font-path', str(fonts_path)])
# Run from tmpdir where templates are copied
cwd = tmpdir_path if tmpdir_path else None
result = subprocess.run(cmd, capture_output=True, text=True, cwd=cwd)
if result.returncode != 0:
print(f"Error generating {format.upper()}: {result.stderr}")
return False
return True
def generate_cards_direct(numbers, config, output_dir, format='png', dpi=300, separate_fronts_backs=True):
"""Generate PNG/SVG cards directly from Typst without PDF intermediate"""
# Create output directory
output_dir = Path(output_dir)
output_dir.mkdir(parents=True, exist_ok=True)
# Get project root
project_root = Path(__file__).parent.parent
# Apply shuffle if configured
if config.get('shuffle', False):
if 'seed' in config:
random.seed(config['seed'])
random.shuffle(numbers)
if format == 'png':
print(f"Generating {len(numbers)} cards directly to PNG at {dpi} DPI...")
else:
print(f"Generating {len(numbers)} cards directly to SVG...")
# Create subdirectories if separating
if separate_fronts_backs:
fronts_dir = output_dir / 'fronts'
backs_dir = output_dir / 'backs'
fronts_dir.mkdir(exist_ok=True)
backs_dir.mkdir(exist_ok=True)
generated_files = []
# Use temp directory for Typst files
with tempfile.TemporaryDirectory() as tmpdir:
tmpdir_path = Path(tmpdir)
# Copy template files to temp directory so imports work
templates_dir = project_root / 'templates'
shutil.copy2(templates_dir / 'single-card.typ', tmpdir_path)
shutil.copy2(templates_dir / 'flashcards.typ', tmpdir_path)
# Copy fonts directory if it exists
fonts_dir = project_root / 'fonts'
if fonts_dir.exists():
shutil.copytree(fonts_dir, tmpdir_path / 'fonts')
for i, num in enumerate(numbers):
# Generate front (soroban)
front_typst = tmpdir_path / f'card_{i}_front.typ'
generate_single_card_typst(num, 'front', config, front_typst, project_root)
if separate_fronts_backs:
front_file = fronts_dir / f'card_{i:03d}.{format}'
else:
front_file = output_dir / f'card_{i:03d}_front.{format}'
# Ensure parent directory exists
front_file.parent.mkdir(parents=True, exist_ok=True)
if typst_to_image(front_typst, front_file, format, dpi, tmpdir_path):
generated_files.append(front_file)
print(f" ✓ Card {i:03d} front: {num}")
else:
print(f" ✗ Failed card {i:03d} front: {num}")
# Generate back (numeral)
back_typst = tmpdir_path / f'card_{i}_back.typ'
generate_single_card_typst(num, 'back', config, back_typst, project_root)
if separate_fronts_backs:
back_file = backs_dir / f'card_{i:03d}.{format}'
else:
back_file = output_dir / f'card_{i:03d}_back.{format}'
# Ensure parent directory exists
back_file.parent.mkdir(parents=True, exist_ok=True)
if typst_to_image(back_typst, back_file, format, dpi, tmpdir_path):
generated_files.append(back_file)
print(f" ✓ Card {i:03d} back: {num}")
else:
print(f" ✗ Failed card {i:03d} back: {num}")
return generated_files
def generate_typst_file(numbers, config, output_path):
"""Generate a Typst file with the specified configuration."""
@ -108,8 +261,22 @@ def main():
parser.add_argument('--color-scheme', type=str, choices=['monochrome', 'place-value', 'heaven-earth', 'alternating'], default='monochrome', help='Color scheme (default: monochrome)')
parser.add_argument('--colored-numerals', action='store_true', help='Color the numerals to match the bead color scheme')
parser.add_argument('--scale-factor', type=float, default=0.9, help='Manual scale adjustment (0.1 to 1.0, default: 0.9)')
parser.add_argument('--output', '-o', type=str, default='out/flashcards.pdf', help='Output PDF path')
# Output format options
parser.add_argument('--format', '-f', choices=['pdf', 'png', 'svg'], default='pdf', help='Output format (default: pdf)')
parser.add_argument('--output', '-o', type=str, help='Output path (default: out/flashcards.FORMAT or out/FORMAT)')
# PDF-specific options
parser.add_argument('--linearize', action='store_true', default=True, help='Create linearized PDF (default: True)')
# PNG/SVG-specific options
parser.add_argument('--dpi', type=int, default=300, help='DPI for PNG output (default: 300)')
parser.add_argument('--transparent', action='store_true', help='Use transparent background for PNG/SVG')
parser.add_argument('--separate', action='store_true', default=True, help='Separate fronts and backs into subdirectories (PNG/SVG only)')
parser.add_argument('--no-separate', dest='separate', action='store_false', help='Keep fronts and backs in same directory (PNG/SVG only)')
parser.add_argument('--card-width', type=str, default='3.5in', help='Card width for PNG/SVG (default: 3.5in)')
parser.add_argument('--card-height', type=str, default='2.5in', help='Card height for PNG/SVG (default: 2.5in)')
parser.add_argument('--font-path', type=str, help='Path to fonts directory')
args = parser.parse_args()
@ -154,6 +321,12 @@ def main():
'color_scheme': args.color_scheme if args.color_scheme != 'monochrome' else config.get('color_scheme', 'monochrome'),
'colored_numerals': args.colored_numerals or config.get('colored_numerals', False),
'scale_factor': args.scale_factor if args.scale_factor != 0.9 else config.get('scale_factor', 0.9),
# PNG/SVG specific options
'transparent': args.transparent or config.get('transparent', False),
'card_width': args.card_width or config.get('card_width', '3.5in'),
'card_height': args.card_height or config.get('card_height', '2.5in'),
'shuffle': args.shuffle or config.get('shuffle', False),
'seed': args.seed or config.get('seed'),
}
# Handle margins
@ -185,87 +358,127 @@ def main():
else:
final_config['columns'] = config.get('columns', 'auto')
# Determine output path based on format
if args.output:
output_path = Path(args.output)
elif args.format == 'pdf':
output_path = Path('out/flashcards.pdf')
else:
# For PNG/SVG, use directory instead of file
output_path = Path(f'out/{args.format}')
# Create output directory
output_path = Path(args.output)
output_path.parent.mkdir(parents=True, exist_ok=True)
if args.format == 'pdf':
output_path.parent.mkdir(parents=True, exist_ok=True)
else:
output_path.mkdir(parents=True, exist_ok=True)
# Generate temporary Typst file in project root
project_root = Path(__file__).parent.parent
temp_typst = project_root / 'temp_flashcards.typ'
generate_typst_file(numbers, final_config, temp_typst)
# Set up font path if provided
font_args = []
if args.font_path:
font_args = ['--font-path', args.font_path]
elif os.path.exists('fonts'):
font_args = ['--font-path', 'fonts']
# Compile with Typst
print(f"Generating flashcards for {len(numbers)} numbers...")
try:
# Run typst from project root directory
# Generate based on format
if args.format == 'pdf':
# Generate PDF (original functionality)
project_root = Path(__file__).parent.parent
result = subprocess.run(
['typst', 'compile'] + font_args + [str(temp_typst), str(output_path)],
capture_output=True,
text=True,
cwd=str(project_root)
)
temp_typst = project_root / 'temp_flashcards.typ'
generate_typst_file(numbers, final_config, temp_typst)
if result.returncode != 0:
print(f"Error compiling Typst document:", file=sys.stderr)
print(result.stderr, file=sys.stderr)
sys.exit(1)
# Set up font path if provided
font_args = []
if args.font_path:
font_args = ['--font-path', args.font_path]
elif os.path.exists('fonts'):
font_args = ['--font-path', 'fonts']
print(f"Generated: {output_path}")
# Clean up temp file
temp_typst.unlink()
# Add duplex printing hints and linearize if requested
if args.linearize:
linearized_path = output_path.parent / f"{output_path.stem}_linear{output_path.suffix}"
print(f"Linearizing PDF with duplex hints...")
# Use qpdf to add duplex hints and linearize
# Note: --pages option preserves page order for duplex
# Compile with Typst
print(f"Generating PDF flashcards for {len(numbers)} numbers...")
try:
# Run typst from project root directory
result = subprocess.run(
['qpdf', '--linearize',
'--object-streams=preserve',
str(output_path), str(linearized_path)],
['typst', 'compile'] + font_args + [str(temp_typst), str(output_path)],
capture_output=True,
text=True,
cwd=str(project_root)
)
if result.returncode != 0:
print(f"Error compiling Typst document:", file=sys.stderr)
print(result.stderr, file=sys.stderr)
sys.exit(1)
print(f"Generated: {output_path}")
# Clean up temp file
temp_typst.unlink()
# Add duplex printing hints and linearize if requested
if args.linearize:
linearized_path = output_path.parent / f"{output_path.stem}_linear{output_path.suffix}"
print(f"Linearizing PDF with duplex hints...")
# Use qpdf to add duplex hints and linearize
result = subprocess.run(
['qpdf', '--linearize',
'--object-streams=preserve',
str(output_path), str(linearized_path)],
capture_output=True,
text=True
)
if result.returncode == 0:
print(f"Linearized: {linearized_path}")
else:
print(f"Warning: Failed to linearize PDF: {result.stderr}", file=sys.stderr)
# Run basic PDF validation
print("Validating PDF...")
result = subprocess.run(
['qpdf', '--check', str(output_path)],
capture_output=True,
text=True
)
if result.returncode == 0:
print(f"Linearized: {linearized_path}")
print("PDF validation passed")
else:
print(f"Warning: Failed to linearize PDF: {result.stderr}", file=sys.stderr)
# Run basic PDF validation
print("Validating PDF...")
result = subprocess.run(
['qpdf', '--check', str(output_path)],
capture_output=True,
text=True
)
if result.returncode == 0:
print("PDF validation passed")
else:
print(f"Warning: PDF validation issues: {result.stderr}", file=sys.stderr)
print(f"Warning: PDF validation issues: {result.stderr}", file=sys.stderr)
except FileNotFoundError as e:
if 'typst' in str(e):
print("Error: typst command not found. Please install Typst first.", file=sys.stderr)
print("Visit: https://github.com/typst/typst", file=sys.stderr)
elif 'qpdf' in str(e):
print("Warning: qpdf command not found. Skipping linearization and validation.", file=sys.stderr)
print("Install with: brew install qpdf", file=sys.stderr)
else:
raise
sys.exit(1)
else:
# Generate PNG/SVG (individual cards)
try:
generated_files = generate_cards_direct(
numbers,
final_config,
output_path,
format=args.format,
dpi=args.dpi,
separate_fronts_backs=args.separate
)
except FileNotFoundError as e:
if 'typst' in str(e):
print("Error: typst command not found. Please install Typst first.", file=sys.stderr)
print("Visit: https://github.com/typst/typst", file=sys.stderr)
elif 'qpdf' in str(e):
print("Warning: qpdf command not found. Skipping linearization and validation.", file=sys.stderr)
print("Install with: brew install qpdf", file=sys.stderr)
else:
raise
sys.exit(1)
if generated_files:
print(f"\n✓ Generated {len(generated_files)} {args.format.upper()} files in {output_path}")
if args.separate:
print(f" - Fronts in: {output_path}/fronts/")
print(f" - Backs in: {output_path}/backs/")
else:
print(f"\n✗ Failed to generate {args.format.upper()} cards")
sys.exit(1)
except FileNotFoundError as e:
if 'typst' in str(e):
print("Error: typst command not found. Please install Typst first.", file=sys.stderr)
print("Visit: https://github.com/typst/typst", file=sys.stderr)
else:
raise
sys.exit(1)
if __name__ == '__main__':
main()

View File

@ -9,82 +9,102 @@ import os
from pathlib import Path
import tempfile
def generate_example_pdfs():
"""Generate various example PDFs to convert to PNG"""
def generate_examples():
"""Generate various example images (SVG for single cards, PNG for grids)"""
examples = [
# Basic examples
# Single card examples - use SVG
{
'name': 'basic-7',
'args': ['--range', '7-7', '--cards-per-page', '1'],
'format': 'svg',
'args': ['--range', '7-7', '--format', 'svg', '--no-separate'],
'desc': 'Number 7 on soroban'
},
{
'name': 'basic-123',
'args': ['--range', '123-123', '--cards-per-page', '1'],
'format': 'svg',
'args': ['--range', '123-123', '--format', 'svg', '--no-separate'],
'desc': 'Number 123 on soroban'
},
# Color schemes
# Color schemes - use SVG
{
'name': 'place-value-456',
'args': ['--range', '456-456', '--cards-per-page', '1', '--color-scheme', 'place-value', '--colored-numerals'],
'format': 'svg',
'args': ['--range', '456-456', '--format', 'svg', '--color-scheme', 'place-value', '--colored-numerals', '--no-separate'],
'desc': 'Place-value coloring'
},
{
'name': 'heaven-earth-78',
'args': ['--range', '78-78', '--cards-per-page', '1', '--color-scheme', 'heaven-earth', '--colored-numerals'],
'format': 'svg',
'args': ['--range', '78-78', '--format', 'svg', '--color-scheme', 'heaven-earth', '--colored-numerals', '--no-separate'],
'desc': 'Heaven-earth coloring'
},
# Bead shapes
# Bead shapes - use SVG
{
'name': 'diamond-25',
'args': ['--range', '25-25', '--cards-per-page', '1', '--bead-shape', 'diamond'],
'format': 'svg',
'args': ['--range', '25-25', '--format', 'svg', '--bead-shape', 'diamond', '--no-separate'],
'desc': 'Diamond beads (realistic)'
},
{
'name': 'circle-25',
'args': ['--range', '25-25', '--cards-per-page', '1', '--bead-shape', 'circle'],
'format': 'svg',
'args': ['--range', '25-25', '--format', 'svg', '--bead-shape', 'circle', '--no-separate'],
'desc': 'Circle beads'
},
{
'name': 'square-25',
'args': ['--range', '25-25', '--cards-per-page', '1', '--bead-shape', 'square'],
'format': 'svg',
'args': ['--range', '25-25', '--format', 'svg', '--bead-shape', 'square', '--no-separate'],
'desc': 'Square beads'
},
# Grid layouts
# Hide inactive - use SVG
{
'name': 'minimal-42',
'format': 'svg',
'args': ['--range', '42-42', '--format', 'svg', '--hide-inactive-beads', '--no-separate'],
'desc': 'Hidden inactive beads'
},
# Grid layouts - use PDF→PNG
{
'name': 'grid-6',
'format': 'pdf',
'args': ['--range', '0-5', '--cards-per-page', '6'],
'desc': '6 cards per page'
},
{
'name': 'grid-12',
'format': 'pdf',
'args': ['--range', '0-11', '--cards-per-page', '12'],
'desc': '12 cards per page'
},
# Skip counting
# Skip counting - use PDF→PNG
{
'name': 'skip-5s',
'format': 'pdf',
'args': ['--range', '0-30', '--step', '5', '--cards-per-page', '6'],
'desc': 'Counting by 5s'
},
# Hide inactive
{
'name': 'minimal-42',
'args': ['--range', '42-42', '--cards-per-page', '1', '--hide-inactive-beads'],
'desc': 'Hidden inactive beads'
},
# Cutting guides
# Cutting guides - use PDF→PNG
{
'name': 'cutting-guides',
'format': 'pdf',
'args': ['--range', '10-15', '--cards-per-page', '6', '--cut-marks'],
'desc': 'With cutting guides'
},
# Additional cutting example
{
'name': 'cutting-registration',
'format': 'pdf',
'args': ['--range', '10-15', '--cards-per-page', '6', '--cut-marks', '--registration'],
'desc': 'With cutting guides and registration marks'
},
]
return examples
@ -170,6 +190,36 @@ def pdf_to_png(pdf_path, png_path, dpi=150, page=1):
return False
def copy_svg_files(svg_dir, output_dir, example_name):
"""Copy SVG files from the generated directory to examples"""
svg_dir = Path(svg_dir)
output_dir = Path(output_dir)
output_dir.mkdir(parents=True, exist_ok=True)
copied_files = []
# Look for front and back SVG files
front_file = svg_dir / f'card_000_front.svg'
back_file = svg_dir / f'card_000_back.svg'
if front_file.exists():
dest = output_dir / f'{example_name}_front.svg'
import shutil
shutil.copy2(front_file, dest)
copied_files.append(dest)
print(f" ✓ Generated {dest.name}")
if back_file.exists():
dest = output_dir / f'{example_name}_back.svg'
import shutil
shutil.copy2(back_file, dest)
copied_files.append(dest)
print(f" ✓ Generated {dest.name}")
return copied_files
def main():
"""Generate example images for README"""
@ -181,7 +231,11 @@ def main():
temp_dir = project_root / 'out' / 'examples'
temp_dir.mkdir(parents=True, exist_ok=True)
examples = generate_example_pdfs()
# Create SVG output directory
svg_dir = images_dir / 'svg'
svg_dir.mkdir(parents=True, exist_ok=True)
examples = generate_examples()
# Check if we have a PDF to PNG converter available
converters = []
@ -205,33 +259,56 @@ def main():
for example in examples:
print(f" - {example['name']}: {example['desc']}")
# Generate PDF
pdf_path = temp_dir / f"{example['name']}.pdf"
cmd = [
'python3',
str(project_root / 'src' / 'generate.py'),
'--output', str(pdf_path)
] + example['args']
result = subprocess.run(cmd, capture_output=True, text=True, cwd=str(project_root))
if result.returncode != 0:
print(f" ERROR generating PDF: {result.stderr}")
continue
# Convert front page to PNG
front_png = images_dir / f"{example['name']}-front.png"
if pdf_to_png(str(pdf_path), str(front_png), dpi=150, page=1):
print(f" ✓ Generated {front_png.name}")
if example['format'] == 'svg':
# Generate SVG directly
svg_temp_dir = temp_dir / f"{example['name']}_svg"
cmd = [
'python3',
str(project_root / 'src' / 'generate.py'),
'--output', str(svg_temp_dir)
] + example['args']
result = subprocess.run(cmd, capture_output=True, text=True, cwd=str(project_root))
if result.returncode != 0:
print(f" ERROR generating SVG: {result.stderr}")
failed.append(example['name'])
continue
# Copy SVG files to final destination
copied = copy_svg_files(svg_temp_dir, svg_dir, example['name'])
if not copied:
print(f" ✗ No SVG files found")
failed.append(example['name'])
else:
print(f" ✗ Failed to convert {front_png.name}")
failed.append(example['name'])
# For single cards, also generate back page
if '--cards-per-page' in example['args'] and example['args'][example['args'].index('--cards-per-page') + 1] == '1':
back_png = images_dir / f"{example['name']}-back.png"
if pdf_to_png(str(pdf_path), str(back_png), dpi=150, page=2):
print(f" ✓ Generated {back_png.name}")
# Generate PDF and convert to PNG
pdf_path = temp_dir / f"{example['name']}.pdf"
cmd = [
'python3',
str(project_root / 'src' / 'generate.py'),
'--output', str(pdf_path)
] + example['args']
result = subprocess.run(cmd, capture_output=True, text=True, cwd=str(project_root))
if result.returncode != 0:
print(f" ERROR generating PDF: {result.stderr}")
continue
# Convert front page to PNG
front_png = images_dir / f"{example['name']}-front.png"
if pdf_to_png(str(pdf_path), str(front_png), dpi=150, page=1):
print(f" ✓ Generated {front_png.name}")
else:
print(f" ✗ Failed to convert {front_png.name}")
failed.append(example['name'])
# For single cards, also generate back page
if '--cards-per-page' in example['args'] and example['args'][example['args'].index('--cards-per-page') + 1] == '1':
back_png = images_dir / f"{example['name']}-back.png"
if pdf_to_png(str(pdf_path), str(back_png), dpi=150, page=2):
print(f" ✓ Generated {back_png.name}")
if failed:
print(f"\n✗ Failed to generate {len(failed)} images: {', '.join(failed)}")

113
templates/single-card.typ Normal file
View File

@ -0,0 +1,113 @@
// Single card template for PNG export
// Renders one card at a time with optional transparent background
#import "flashcards.typ": draw-soroban
// Local definition of create-colored-numeral since it's not exported
#let create-colored-numeral(num, scheme, use-colors, font-size) = {
// Use the exact same colors as the beads
let place-value-colors = (
rgb("#2E86AB"), // ones - blue (same as beads)
rgb("#A23B72"), // tens - magenta (same as beads)
rgb("#F18F01"), // hundreds - orange (same as beads)
rgb("#6A994E"), // thousands - green (same as beads)
rgb("#BC4B51"), // ten-thousands - red (same as beads)
)
if not use-colors or scheme == "monochrome" {
// Plain black text
text(size: font-size)[#num]
} else if scheme == "place-value" {
// Color each digit according to its place value
let digits = str(num).clusters()
let num-digits = digits.len()
let colored-digits = ()
for (idx, digit) in digits.enumerate() {
let place-idx = num-digits - idx - 1 // 0 = ones, 1 = tens, etc.
let color-idx = calc.rem(place-idx, place-value-colors.len())
let digit-color = place-value-colors.at(color-idx)
colored-digits += (text(fill: digit-color, size: font-size)[#digit],)
}
colored-digits.join()
} else if scheme == "heaven-earth" {
// For heaven-earth, use orange (heaven bead color)
text(size: font-size, fill: rgb("#F18F01"))[#num]
} else if scheme == "alternating" {
// For alternating, we could alternate digit colors
let digits = str(num).clusters()
let colored-digits = ()
for (idx, digit) in digits.enumerate() {
let digit-color = if calc.rem(idx, 2) == 0 { rgb("#1E88E5") } else { rgb("#43A047") }
colored-digits += (text(fill: digit-color, size: font-size)[#digit],)
}
colored-digits.join()
} else {
// Fallback to plain text
text(size: font-size)[#num]
}
}
#let generate-single-card(
number,
side: "front", // "front" or "back"
bead-shape: "diamond",
color-scheme: "monochrome",
colored-numerals: false,
hide-inactive-beads: false,
show-empty-columns: false,
columns: auto,
transparent: false,
width: 3.5in,
height: 2.5in,
font-size: 48pt,
font-family: "DejaVu Sans",
scale-factor: 1.0,
) = {
// Set page size to exact card dimensions
set page(
width: width,
height: height,
margin: 0pt,
fill: if transparent { none } else { white }
)
// Set font
set text(font: font-family, size: font-size, fallback: true)
// Calculate padding for content
let padding = width * 0.05
// Render the appropriate side
if side == "front" {
// Soroban side
align(center + horizon)[
#box(
width: width - 2 * padding,
height: height - 2 * padding
)[
#align(center + horizon)[
#scale(x: scale-factor * 100%, y: scale-factor * 100%)[
#draw-soroban(
number,
columns: columns,
show-empty: show-empty-columns,
hide-inactive: hide-inactive-beads,
bead-shape: bead-shape,
color-scheme: color-scheme,
base-size: 1.0
)
]
]
]
]
} else {
// Numeral side
align(center + horizon)[
#create-colored-numeral(number, color-scheme, colored-numerals, font-size * scale-factor)
]
}
}