Compare commits
No commits in common. "master" and "blog-generator" have entirely different histories.
master
...
blog-gener
19
LICENSE.txt
@ -1,19 +0,0 @@
|
|||||||
Copyright 2023 Evert "Diamond" Prants <evert@lunasqu.ee>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
@ -333,48 +333,6 @@
|
|||||||
"css": "archive",
|
"css": "archive",
|
||||||
"code": 59415,
|
"code": 59415,
|
||||||
"src": "entypo"
|
"src": "entypo"
|
||||||
},
|
|
||||||
{
|
|
||||||
"uid": "44d7da736a0c6aa588f9151ebcf9e80e",
|
|
||||||
"css": "gitea",
|
|
||||||
"code": 59416,
|
|
||||||
"src": "custom_icons",
|
|
||||||
"selected": true,
|
|
||||||
"svg": {
|
|
||||||
"path": "M181.1 223.5C171 223.5 159.6 224.4 146.7 227.2 133.1 230 94.4 238.7 62.7 269.2-7.7 331.9 10.3 431.6 12.5 446.6 15.2 464.8 23.3 515.6 62 559.8 133.6 647.5 287.6 645.5 287.6 645.5S306.6 690.6 335.5 732.2C374.5 783.9 414.7 824.2 453.7 829.1 552.2 829.1 748.9 828.9 748.9 828.9S767.7 829.1 793.1 812.8C815 799.5 834.5 776.2 834.5 776.2S854.7 754.7 882.8 705.5C891.4 690.3 898.6 675.6 904.8 661.7 904.8 661.7 991.1 478.7 991.1 300.6 989.4 246.7 976.1 237.2 973 234.1 966.6 227.6 958 227.8 958 227.8S774.8 238.1 680 240.3C659.2 240.8 638.6 241.2 618.1 241.4V424.5C609.5 420.5 600.8 416.2 592.2 412.2 592.2 355.3 592 241.6 592 241.6 546.7 242.2 452.6 238.1 452.6 238.1S231.7 227 207.6 224.8C200 224.4 191.2 223.5 181.1 223.5ZM200.2 298.6S211.2 391.4 224.7 445.8C235.9 491.4 263.4 567.2 263.4 567.2S222.7 562.3 196.2 553C155.8 539.7 138.6 523.7 138.6 523.7S108.7 502.8 93.7 461.6C68 392.5 91.6 350.3 91.6 350.3S104.7 315.1 151.7 303.4C173.3 297.6 200.2 298.6 200.2 298.6ZM534.1 403.1C545.5 402.4 557.3 408.3 557.3 408.3L592.9 425.5C585.7 440.1 578.4 454.9 571.2 469.5 560.8 469.4 551.1 475 546.1 484.2 540.8 494.1 541.9 506.2 549.1 515.1L510.6 593.9C497.8 594.1 486.6 603 483.6 615.5S486.7 640.9 497.8 646.7C509.8 653 525.2 649.5 533.3 638.3 541.2 627.2 540 611.9 530.5 602.2L568 525.5C570.3 525.6 573.7 525.8 577.7 524.7 584.1 523.3 588.7 519.1 588.7 519.1 595.3 521.9 602.2 525 609.4 528.6 616.9 532.3 623.9 536.2 630.3 540 631.7 540.8 633.1 541.7 634.7 543 637.2 545 640 547.8 642 551.6 645 560.1 639.1 574.8 639.1 574.8 635.5 586.7 610.3 638.3 610.3 638.3 597.7 638 586.4 646.1 582.7 657.8 578.6 670.5 584.4 684.8 596.6 691.1S623.7 693.7 631.7 682.8C639.5 672.2 638.9 657.3 630 647.5 633 641.7 635.8 635.9 638.7 629.8 646.6 613.6 659.8 582.3 659.8 582.3 661.2 579.7 668.7 566.2 664.1 549.1 660.2 531.2 644.4 523 644.4 523 625.3 510.6 598.7 499.2 598.7 499.2S598.7 492.8 597 488.1C595.3 483.3 592.7 480.1 590.9 478.3 598 463.7 605 449.3 612.1 434.8L730.3 492.2S750 501.1 754.2 517.5C757.2 529.1 753.4 539.4 751.4 544.4 741.6 568.4 665.5 721.1 665.5 721.1S655.9 743.7 634.8 745.1C625.8 745.8 618.7 743.3 618.7 743.3S618.3 743.1 610.5 740L434.1 654.1S417 645.1 414.1 629.7C410.6 617 418.3 601.4 418.3 601.4L503.1 426.6S510.6 411.4 522.2 406.2C523.1 405.8 525.8 404.7 529.2 403.9 530.8 403.5 532.4 403.2 534.1 403.1Z",
|
|
||||||
"width": 1000
|
|
||||||
},
|
|
||||||
"search": [
|
|
||||||
"gitea"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"uid": "500734103bca0e24380fc0a3f138aed5",
|
|
||||||
"css": "svelte-logo",
|
|
||||||
"code": 59433,
|
|
||||||
"src": "custom_icons",
|
|
||||||
"selected": true,
|
|
||||||
"svg": {
|
|
||||||
"path": "M779.5 132.1L779.5 132.1C686.6-0.9 502.7-40.2 370.5 44.6L137.5 192.9C74.1 233 30.4 298.2 17 371.4 6.3 433 15.2 496.4 44.6 551.8 25 582.1 10.7 616.1 4.5 651.8-8.9 727.7 8.9 805.4 52.7 867.9 145.5 1000.9 328.6 1040.2 461.6 955.4L694.6 807.1C758 767 801.8 701.8 815.2 628.6 825.9 567 817 503.6 787.5 448.2 807.1 417.9 821.4 383.9 827.7 348.2 841.1 272.3 823.2 194.6 779.5 132.1ZM712.5 323.2C710.7 330.4 708.9 337.5 707.1 344.6L702.7 358 691.1 349.1C663.4 328.6 633 313.4 600 303.6L591.1 300.9 592 292C592.9 279.5 589.3 267.9 582.1 257.1 568.8 237.5 544.6 229.5 522.3 234.8 517 236.6 512.5 238.4 508 241.1L275 390.2C263.4 397.3 255.4 408.9 253.6 422.3 250.9 435.7 254.5 450 262.5 461.6 275.9 481.3 300 489.3 322.3 483.9 327.7 482.1 332.1 480.4 336.6 477.7L425.9 421.4C440.2 412.5 456.3 405.4 473.2 400.9 548.2 381.3 627.7 410.7 671.4 474.1 698.2 511.6 708.9 558 700.9 603.6 692.9 648.2 667 687.5 628.6 711.6L394.6 859.8C380.4 868.8 364.3 875.9 347.3 880.4H347.3C272.3 900 192.9 870.5 149.1 807.1 122.3 769.6 111.6 723.2 119.6 677.7 121.4 670.5 123.2 663.4 125 656.2L129.5 642.9 141.1 651.8C168.8 672.3 199.1 687.5 232.1 697.3L241.1 700 240.2 708.9C239.3 721.4 242.9 733.9 250 743.7 263.4 763.4 287.5 771.4 309.8 766.1 315.2 764.3 319.6 762.5 324.1 759.8L557.1 611.6C568.8 604.5 576.8 592.9 579.5 579.5 582.1 566.1 578.6 551.8 570.5 540.2 557.1 520.5 533 512.5 510.7 517.9 505.4 519.6 500.9 521.4 496.4 524.1L407.1 580.4C392.9 589.3 376.8 596.4 359.8 600.9 284.8 619.6 205.4 590.2 160.7 525.9 133.9 488.4 123.2 442 131.3 396.4 139.3 351.8 165.2 312.5 203.6 288.4L437.5 140.2C451.8 131.3 467.9 124.1 484.8 119.6 559.8 100 639.3 129.5 683 192.9 709.8 231.3 720.5 277.7 712.5 323.2Z",
|
|
||||||
"width": 832
|
|
||||||
},
|
|
||||||
"search": [
|
|
||||||
"svelte-logo"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"uid": "2d331dd3833bcc6101280b31f52f912e",
|
|
||||||
"css": "bluesky",
|
|
||||||
"code": 59434,
|
|
||||||
"src": "custom_icons",
|
|
||||||
"selected": true,
|
|
||||||
"svg": {
|
|
||||||
"path": "M256.1 83.1C381.5 177.3 516.5 368.2 566 470.7 615.6 368.3 750.5 177.3 876 83.1 966.5 15.1 1113.2-37.5 1113.2 129.9 1113.2 163.3 1094 410.6 1082.8 450.7 1043.7 590.3 901.4 625.9 774.8 604.4 996.1 642.1 1052.4 766.8 930.8 891.6 699.9 1128.6 598.9 832.1 573 756.2 568.3 742.3 566.1 735.8 566 741.3 566 735.8 563.8 742.3 559 756.2 533.2 832.1 432.2 1128.6 201.2 891.6 79.7 766.8 136 642.1 357.3 604.4 230.7 625.9 88.3 590.3 49.3 450.7 38 410.6 18.9 163.3 18.9 129.9 18.9-37.5 165.5 15.1 256.1 83.1Z",
|
|
||||||
"width": 1132
|
|
||||||
},
|
|
||||||
"search": [
|
|
||||||
"bluesky"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -23,9 +23,6 @@
|
|||||||
.icon-search:before { content: '\e815'; } /* '' */
|
.icon-search:before { content: '\e815'; } /* '' */
|
||||||
.icon-share:before { content: '\e816'; } /* '' */
|
.icon-share:before { content: '\e816'; } /* '' */
|
||||||
.icon-archive:before { content: '\e817'; } /* '' */
|
.icon-archive:before { content: '\e817'; } /* '' */
|
||||||
.icon-gitea:before { content: '\e818'; } /* '' */
|
|
||||||
.icon-svelte-logo:before { content: '\e829'; } /* '' */
|
|
||||||
.icon-bluesky:before { content: '\e82a'; } /* '' */
|
|
||||||
.icon-github-circled:before { content: '\f09b'; } /* '' */
|
.icon-github-circled:before { content: '\f09b'; } /* '' */
|
||||||
.icon-rss:before { content: '\f09e'; } /* '' */
|
.icon-rss:before { content: '\f09e'; } /* '' */
|
||||||
.icon-html5:before { content: '\f13b'; } /* '' */
|
.icon-html5:before { content: '\f13b'; } /* '' */
|
||||||
|
@ -23,9 +23,6 @@
|
|||||||
.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||||
.icon-share { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
.icon-share { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||||
.icon-archive { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
.icon-archive { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||||
.icon-gitea { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
|
||||||
.icon-svelte-logo { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
|
||||||
.icon-bluesky { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
|
||||||
.icon-github-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
.icon-github-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||||
.icon-rss { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
.icon-rss { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||||
.icon-html5 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
.icon-html5 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||||
|
@ -34,9 +34,6 @@
|
|||||||
.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||||
.icon-share { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
.icon-share { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||||
.icon-archive { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
.icon-archive { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||||
.icon-gitea { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
|
||||||
.icon-svelte-logo { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
|
||||||
.icon-bluesky { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
|
||||||
.icon-github-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
.icon-github-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||||
.icon-rss { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
.icon-rss { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||||
.icon-html5 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
.icon-html5 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'lunasquee-site';
|
font-family: 'lunasquee-site';
|
||||||
src: url('../font/lunasquee-site.eot?37371257');
|
src: url('../font/lunasquee-site.eot?93518691');
|
||||||
src: url('../font/lunasquee-site.eot?37371257#iefix') format('embedded-opentype'),
|
src: url('../font/lunasquee-site.eot?93518691#iefix') format('embedded-opentype'),
|
||||||
url('../font/lunasquee-site.woff2?37371257') format('woff2'),
|
url('../font/lunasquee-site.woff2?93518691') format('woff2'),
|
||||||
url('../font/lunasquee-site.woff?37371257') format('woff'),
|
url('../font/lunasquee-site.woff?93518691') format('woff'),
|
||||||
url('../font/lunasquee-site.ttf?37371257') format('truetype'),
|
url('../font/lunasquee-site.ttf?93518691') format('truetype'),
|
||||||
url('../font/lunasquee-site.svg?37371257#lunasquee-site') format('svg');
|
url('../font/lunasquee-site.svg?93518691#lunasquee-site') format('svg');
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
@ -15,7 +15,7 @@
|
|||||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'lunasquee-site';
|
font-family: 'lunasquee-site';
|
||||||
src: url('../font/lunasquee-site.svg?37371257#lunasquee-site') format('svg');
|
src: url('../font/lunasquee-site.svg?93518691#lunasquee-site') format('svg');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
@ -78,9 +78,6 @@
|
|||||||
.icon-search:before { content: '\e815'; } /* '' */
|
.icon-search:before { content: '\e815'; } /* '' */
|
||||||
.icon-share:before { content: '\e816'; } /* '' */
|
.icon-share:before { content: '\e816'; } /* '' */
|
||||||
.icon-archive:before { content: '\e817'; } /* '' */
|
.icon-archive:before { content: '\e817'; } /* '' */
|
||||||
.icon-gitea:before { content: '\e818'; } /* '' */
|
|
||||||
.icon-svelte-logo:before { content: '\e829'; } /* '' */
|
|
||||||
.icon-bluesky:before { content: '\e82a'; } /* '' */
|
|
||||||
.icon-github-circled:before { content: '\f09b'; } /* '' */
|
.icon-github-circled:before { content: '\f09b'; } /* '' */
|
||||||
.icon-rss:before { content: '\f09e'; } /* '' */
|
.icon-rss:before { content: '\f09e'; } /* '' */
|
||||||
.icon-html5:before { content: '\f13b'; } /* '' */
|
.icon-html5:before { content: '\f13b'; } /* '' */
|
||||||
|
@ -146,11 +146,11 @@
|
|||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'lunasquee-site';
|
font-family: 'lunasquee-site';
|
||||||
src: url('./font/lunasquee-site.eot?29636102');
|
src: url('./font/lunasquee-site.eot?14312899');
|
||||||
src: url('./font/lunasquee-site.eot?29636102#iefix') format('embedded-opentype'),
|
src: url('./font/lunasquee-site.eot?14312899#iefix') format('embedded-opentype'),
|
||||||
url('./font/lunasquee-site.woff?29636102') format('woff'),
|
url('./font/lunasquee-site.woff?14312899') format('woff'),
|
||||||
url('./font/lunasquee-site.ttf?29636102') format('truetype'),
|
url('./font/lunasquee-site.ttf?14312899') format('truetype'),
|
||||||
url('./font/lunasquee-site.svg?29636102#lunasquee-site') format('svg');
|
url('./font/lunasquee-site.svg?14312899#lunasquee-site') format('svg');
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
@ -295,20 +295,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="span3" title="Code: 0xe818">
|
|
||||||
<i class="demo-icon icon-gitea"></i> <span class="i-name">icon-gitea</span><span class="i-code">0xe818</span>
|
|
||||||
</div>
|
|
||||||
<div class="span3" title="Code: 0xe829">
|
|
||||||
<i class="demo-icon icon-svelte-logo"></i> <span class="i-name">icon-svelte-logo</span><span class="i-code">0xe829</span>
|
|
||||||
</div>
|
|
||||||
<div class="span3" title="Code: 0xe82a">
|
|
||||||
<i class="demo-icon icon-bluesky"></i> <span class="i-name">icon-bluesky</span><span class="i-code">0xe82a</span>
|
|
||||||
</div>
|
|
||||||
<div class="span3" title="Code: 0xf09b">
|
<div class="span3" title="Code: 0xf09b">
|
||||||
<i class="demo-icon icon-github-circled"></i> <span class="i-name">icon-github-circled</span><span class="i-code">0xf09b</span>
|
<i class="demo-icon icon-github-circled"></i> <span class="i-name">icon-github-circled</span><span class="i-code">0xf09b</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="span3" title="Code: 0xf09e">
|
<div class="span3" title="Code: 0xf09e">
|
||||||
<i class="demo-icon icon-rss"></i> <span class="i-name">icon-rss</span><span class="i-code">0xf09e</span>
|
<i class="demo-icon icon-rss"></i> <span class="i-name">icon-rss</span><span class="i-code">0xf09e</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg">
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
<metadata>Copyright (C) 2024 by original authors @ fontello.com</metadata>
|
<metadata>Copyright (C) 2022 by original authors @ fontello.com</metadata>
|
||||||
<defs>
|
<defs>
|
||||||
<font id="lunasquee-site" horiz-adv-x="1000" >
|
<font id="lunasquee-site" horiz-adv-x="1000" >
|
||||||
<font-face font-family="lunasquee-site" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
|
<font-face font-family="lunasquee-site" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
|
||||||
@ -54,12 +54,6 @@
|
|||||||
|
|
||||||
<glyph glyph-name="archive" unicode="" d="M840 600l0-50-696 0 0 50q0 22 13 35t25 15l608 0q6 0 14-1t22-14 14-35z m-148 150q6 0 14-1t22-14 14-35l-498 0q0 22 13 35t25 15l410 0z m248-200q34-32 38-46 6-18 0-54l-76-450q-4-22-20-35t-28-15l-710 0q-52 0-60 50-6 26-39 223t-39 227q-10 22-3 44t10 26 21 20l10 10 30 30 0-80 836 0 0 80z m-248-270l0 100-70 0 0-80-260 0 0 80-68 0 0-100q0-50 48-50l300 0q22 0 35 12t13 24z" horiz-adv-x="981" />
|
<glyph glyph-name="archive" unicode="" d="M840 600l0-50-696 0 0 50q0 22 13 35t25 15l608 0q6 0 14-1t22-14 14-35z m-148 150q6 0 14-1t22-14 14-35l-498 0q0 22 13 35t25 15l410 0z m248-200q34-32 38-46 6-18 0-54l-76-450q-4-22-20-35t-28-15l-710 0q-52 0-60 50-6 26-39 223t-39 227q-10 22-3 44t10 26 21 20l10 10 30 30 0-80 836 0 0 80z m-248-270l0 100-70 0 0-80-260 0 0 80-68 0 0-100q0-50 48-50l300 0q22 0 35 12t13 24z" horiz-adv-x="981" />
|
||||||
|
|
||||||
<glyph glyph-name="gitea" unicode="" d="M181 627c-10 0-21-1-34-4-14-3-53-12-84-42-71-63-53-163-50-178 2-18 10-69 49-113 72-87 226-85 226-85s19-46 48-87c39-52 79-92 118-97 98 0 295 0 295 0s19 0 44 16c22 14 42 37 42 37s20 21 48 71c8 15 16 29 22 43 0 0 86 183 86 361-2 54-15 64-18 67-6 6-15 6-15 6s-183-10-278-12c-21-1-41-1-62-1v-183c-8 4-17 8-26 12 0 57 0 170 0 170-45 0-139 4-139 4s-221 11-245 13c-8 1-17 2-27 2z m19-76s11-92 25-147c11-45 38-121 38-121s-40 5-67 14c-40 13-57 29-57 29s-30 21-45 62c-26 70-2 112-2 112s13 35 60 47c21 5 48 4 48 4z m334-104c12 1 23-5 23-5l36-17c-7-15-15-30-22-44-10 0-20-6-25-15-5-10-4-22 3-31l-38-79c-13 0-24-9-27-21s3-26 14-32c12-6 27-2 35 9 8 11 7 26-2 36l37 77c2-1 6-1 10 0 6 2 11 6 11 6 6-3 13-6 20-10 8-3 15-7 21-11 2-1 3-2 5-3 2-2 5-5 7-9 3-8-3-23-3-23-3-12-29-63-29-63-12 0-24-8-27-20-4-12 1-27 14-33s27-3 35 8c8 11 7 26-2 36 3 5 6 11 9 17 8 16 21 48 21 48 1 2 9 16 4 33-4 18-20 26-20 26-19 12-45 24-45 24s0 6-2 11c-2 5-4 8-6 10 7 14 14 29 21 43l118-57s20-9 24-25c3-12-1-22-3-27-9-24-85-177-85-177s-10-23-31-24c-9-1-16 2-16 2s-1 0-8 3l-177 86s-17 9-20 24c-3 13 4 29 4 29l85 174s8 16 19 21c1 0 4 1 7 2 2 1 3 1 5 1z" horiz-adv-x="1000" />
|
|
||||||
|
|
||||||
<glyph glyph-name="svelte-logo" unicode="" d="M780 718l0 0c-93 133-277 172-409 87l-233-148c-64-40-108-105-121-178-11-62-2-125 28-181-20-30-34-64-40-100-14-76 4-153 48-216 93-133 276-172 409-87l233 148c63 40 107 105 120 178 11 62 2 125-27 181 19 30 33 64 40 100 13 76-5 153-48 216z m-67-191c-2-7-4-14-6-22l-4-13-12 9c-28 20-58 36-91 45l-9 3 1 9c1 13-3 24-10 35-13 20-37 28-60 22-5-2-9-3-14-6l-233-149c-12-7-20-19-21-32-3-14 1-28 9-40 13-19 37-27 59-22 6 2 10 4 15 6l89 57c14 9 30 16 47 20 75 20 155-10 198-73 27-38 38-84 30-130-8-44-34-83-72-108l-234-148c-15-9-31-16-48-20h0c-75-20-154 9-198 73-27 37-37 84-29 129 1 8 3 15 5 22l5 13 11-9c28-20 58-35 91-45l9-3-1-9c-1-12 3-25 10-35 13-19 38-27 60-22 5 2 10 4 14 6l233 148c12 8 20 19 23 33 2 13-1 27-9 39-14 20-38 28-60 22-6-2-10-3-15-6l-89-56c-14-9-30-16-47-21-75-19-155 11-199 75-27 38-38 84-30 130 8 44 34 84 73 108l234 148c14 9 30 16 47 20 75 20 154-9 198-73 27-38 38-85 30-130z" horiz-adv-x="832" />
|
|
||||||
|
|
||||||
<glyph glyph-name="bluesky" unicode="" d="M256 767c126-94 261-285 310-388 50 103 185 294 310 388 91 68 237 121 237-47 0-33-19-281-30-321-39-139-182-175-308-153 221-38 277-163 156-288-231-237-332 60-358 136-5 14-7 20-7 15 0 5-2-1-7-15-26-76-127-373-358-136-121 125-65 250 156 288-126-22-269 14-308 153-11 40-30 288-30 321 0 168 147 115 237 47z" horiz-adv-x="1132" />
|
|
||||||
|
|
||||||
<glyph glyph-name="github-circled" unicode="" d="M429 779q116 0 215-58t156-156 57-215q0-140-82-252t-211-155q-15-3-22 4t-7 17q0 1 0 43t0 75q0 54-29 79 32 3 57 10t53 22 45 37 30 58 11 84q0 67-44 115 21 51-4 114-16 5-46-6t-51-25l-21-13q-52 15-107 15t-108-15q-8 6-23 15t-47 22-47 7q-25-63-5-114-44-48-44-115 0-47 12-83t29-59 45-37 52-22 57-10q-21-20-27-58-12-5-25-8t-32-3-36 12-31 35q-11 18-27 29t-28 14l-11 1q-12 0-16-2t-3-7 5-8 7-6l4-3q12-6 24-21t18-29l6-13q7-21 24-34t37-17 39-3 31 1l13 3q0-22 0-50t1-30q0-10-8-17t-22-4q-129 43-211 155t-82 252q0 117 58 215t155 156 216 58z m-267-616q2 4-3 7-6 1-8-1-1-4 4-7 5-3 7 1z m18-19q4 3-1 9-6 5-9 2-4-3 1-9 5-6 9-2z m16-25q6 4 0 11-4 7-9 3-5-3 0-10t9-4z m24-23q4 4-2 10-7 7-11 2-5-5 2-11 6-6 11-1z m32-14q1 6-8 9-8 2-10-4t7-9q8-3 11 4z m35-3q0 7-10 6-9 0-9-6 0-7 10-6 9 0 9 6z m32 5q-1 7-10 5-9-1-8-8t10-4 8 7z" horiz-adv-x="857.1" />
|
<glyph glyph-name="github-circled" unicode="" d="M429 779q116 0 215-58t156-156 57-215q0-140-82-252t-211-155q-15-3-22 4t-7 17q0 1 0 43t0 75q0 54-29 79 32 3 57 10t53 22 45 37 30 58 11 84q0 67-44 115 21 51-4 114-16 5-46-6t-51-25l-21-13q-52 15-107 15t-108-15q-8 6-23 15t-47 22-47 7q-25-63-5-114-44-48-44-115 0-47 12-83t29-59 45-37 52-22 57-10q-21-20-27-58-12-5-25-8t-32-3-36 12-31 35q-11 18-27 29t-28 14l-11 1q-12 0-16-2t-3-7 5-8 7-6l4-3q12-6 24-21t18-29l6-13q7-21 24-34t37-17 39-3 31 1l13 3q0-22 0-50t1-30q0-10-8-17t-22-4q-129 43-211 155t-82 252q0 117 58 215t155 156 216 58z m-267-616q2 4-3 7-6 1-8-1-1-4 4-7 5-3 7 1z m18-19q4 3-1 9-6 5-9 2-4-3 1-9 5-6 9-2z m16-25q6 4 0 11-4 7-9 3-5-3 0-10t9-4z m24-23q4 4-2 10-7 7-11 2-5-5 2-11 6-6 11-1z m32-14q1 6-8 9-8 2-10-4t7-9q8-3 11 4z m35-3q0 7-10 6-9 0-9-6 0-7 10-6 9 0 9 6z m32 5q-1 7-10 5-9-1-8-8t10-4 8 7z" horiz-adv-x="857.1" />
|
||||||
|
|
||||||
<glyph glyph-name="rss" unicode="" d="M214 100q0-45-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m286-69q1-15-9-26-10-12-27-12h-75q-14 0-24 9t-11 23q-12 128-103 219t-219 103q-14 1-23 11t-9 24v75q0 16 12 26 9 10 24 10h3q89-7 170-45t145-101q63-63 101-145t45-171z m286-1q1-15-10-26-10-11-26-11h-80q-14 0-25 10t-10 23q-7 120-57 228t-129 188-188 129-227 57q-14 1-24 11t-10 24v80q0 16 11 26 10 10 25 10h1q147-8 280-67t238-164q104-104 164-238t67-280z" horiz-adv-x="785.7" />
|
<glyph glyph-name="rss" unicode="" d="M214 100q0-45-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m286-69q1-15-9-26-10-12-27-12h-75q-14 0-24 9t-11 23q-12 128-103 219t-219 103q-14 1-23 11t-9 24v75q0 16 12 26 9 10 24 10h3q89-7 170-45t145-101q63-63 101-145t45-171z m286-1q1-15-10-26-10-11-26-11h-80q-14 0-25 10t-10 23q-7 120-57 228t-129 188-188 129-227 57q-14 1-24 11t-10 24v80q0 16 11 26 10 10 25 10h1q147-8 280-67t238-164q104-104 164-238t67-280z" horiz-adv-x="785.7" />
|
||||||
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 20 KiB |
1
assets/iconfont/icons/angular.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M12,2.5L20.84,5.65L19.5,17.35L12,21.5L4.5,17.35L3.16,5.65L12,2.5M12,4.6L6.47,17H8.53L9.64,14.22H14.34L15.45,17H17.5L12,4.6M13.62,12.5H10.39L12,8.63L13.62,12.5Z" /></svg>
|
After Width: | Height: | Size: 454 B |
1
assets/iconfont/icons/controller-classic.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M6,7H18C20.76,7 23,9.24 23,12C23,14.76 20.76,17 18,17C16.36,17 14.91,16.21 14,15H10C9.09,16.21 7.64,17 6,17C3.24,17 1,14.76 1,12C1,9.24 3.24,7 6,7M19.75,9.5C19.06,9.5 18.5,10.06 18.5,10.75C18.5,11.44 19.06,12 19.75,12C20.44,12 21,11.44 21,10.75C21,10.06 20.44,9.5 19.75,9.5M17.25,12C16.56,12 16,12.56 16,13.25C16,13.94 16.56,14.5 17.25,14.5C17.94,14.5 18.5,13.94 18.5,13.25C18.5,12.56 17.94,12 17.25,12M5,9V11H3V13H5V15H7V13H9V11H7V9H5Z" /></svg>
|
After Width: | Height: | Size: 731 B |
4
assets/iconfont/icons/flutter.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m14.283 23.137c-0.06051-0.0258-1.4899-1.4294-3.1765-3.1192-3.021-3.0266-3.0665-3.0755-3.0665-3.2906 0-0.2152 0.04472-0.26305 3.122-3.3404l3.122-3.122h3.1521c2.1527 0 3.1873 0.01883 3.2631 0.05944 0.16929 0.0906 0.27862 0.39644 0.20886 0.58424-0.03145 0.08464-1.3308 1.4287-2.8874 2.9868l-2.8302 2.8329 2.8107 2.805c1.5618 1.5586 2.8444 2.8824 2.8865 2.9791 0.05813 0.13345 0.06188 0.21406 0.01607 0.34545-0.11803 0.33859-0.06389 0.3334-3.4416 0.32956-1.6881-0.0018-3.1187-0.02459-3.1792-0.05039zm4.9229-0.97746c-1.4e-5 -0.06232-4.6421-4.6891-4.7046-4.6891-0.02983 0-0.56122 0.50743-1.1809 1.1276l-1.1266 1.1276 2.4733 2.4752h2.2694c1.2482 0 2.2694-0.01857 2.2694-0.04125zm-2.2679-10.892-2.2683-0.01438-2.7098 2.7094c-1.4904 1.4902-2.7098 2.734-2.7098 2.7641 0 0.03009 0.50108 0.55625 1.1135 1.1692l1.1135 1.1145 7.7291-7.7285zm-12.25 2.3266c-1.5949-1.5923-1.6233-1.6245-1.6233-1.8439 0-0.2228 0.010819-0.23408 5.3479-5.5712l5.3479-5.348 3.1206-0.015091c2.327-0.011248 3.161 0.00165 3.2795 0.050729 0.23025 0.095369 0.33707 0.37398 0.23413 0.61067-0.04622 0.10627-2.8295 2.9281-6.8631 6.9581-6.7223 6.7163-6.7874 6.7793-7.0029 6.7793-0.21179 0-0.26082-0.04317-1.8409-1.6206zm7.9518-5.6523c3.3391-3.3345 6.0712-6.082 6.0712-6.1055 0-0.023493-1.0211-0.04272-2.269-0.04272h-2.269l-9.955 9.9554 1.1268 1.1278c0.61973 0.62028 1.1486 1.1278 1.1754 1.1278 0.026719 0 2.7806-2.7283 6.1198-6.0628z" stroke-width=".055"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
1
assets/iconfont/icons/gitlab.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M21.94,13.11L20.89,9.89C20.89,9.86 20.88,9.83 20.87,9.8L18.76,3.32C18.65,3 18.33,2.75 17.96,2.75C17.6,2.75 17.28,3 17.17,3.33L15.17,9.5H8.84L6.83,3.33C6.72,3 6.4,2.75 6.04,2.75H6.04C5.67,2.75 5.35,3 5.24,3.33L3.13,9.82C3.13,9.82 3.13,9.83 3.13,9.83L2.06,13.11C1.9,13.61 2.07,14.15 2.5,14.45L11.72,21.16C11.89,21.28 12.11,21.28 12.28,21.15L21.5,14.45C21.93,14.15 22.1,13.61 21.94,13.11M8.15,10.45L10.72,18.36L4.55,10.45M13.28,18.37L15.75,10.78L15.85,10.45H19.46L13.87,17.61M17.97,3.94L19.78,9.5H16.16M14.86,10.45L13.07,15.96L12,19.24L9.14,10.45M6.03,3.94L7.84,9.5H4.23M3.05,13.69C2.96,13.62 2.92,13.5 2.96,13.4L3.75,10.97L9.57,18.42M20.95,13.69L14.44,18.42L14.46,18.39L20.25,10.97L21.04,13.4C21.08,13.5 21.04,13.62 20.95,13.69" /></svg>
|
After Width: | Height: | Size: 1020 B |
4
assets/iconfont/icons/icynet.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m20.313 0.75486-9.048 1.3574h-9.1522v0.59195l-0.59036 0.035804 0.050921 0.82587-0.81951 0.12332 1.3589 9.0504v9.1498h0.59116l0.036599 0.59036 0.82587-0.05092 0.12253 0.81792 9.0464-1.3574h9.153v-0.59116l0.59036-0.0358-0.05092-0.82746 0.81792-0.12253-1.3574-9.048v-9.1522h-0.59116l-0.0358-0.59036-0.82587 0.050921-0.12332-0.81951zm-9.6511 3.204c0.42646 0 0.83542 0.047738 1.2277 0.14321 0.39225 0.095476 0.76938 0.2371 1.1298 0.42487v1.5801a4.2964 4.2964 0 0 0-1.0797-0.5474c-0.35485-0.11616-0.72801-0.17504-1.1203-0.17504-0.70255 0-1.2547 0.22517-1.6573 0.67629s-0.60468 1.0709-0.60468 1.8618 0.2013 1.4067 0.60468 1.857 0.95476 0.67629 1.6573 0.67629c0.39225 0 0.7654-0.05808 1.1203-0.17504 0.35485-0.11696 0.71448-0.29836 1.0797-0.5474v1.5801a5.0284 5.0284 0 0 1-1.1306 0.42408c-0.39225 0.09548-0.80121 0.14322-1.2277 0.14322-1.273 0-2.2795-0.35485-3.0234-1.0638-0.74392-0.70891-1.1139-1.6772-1.1139-2.8961s0.37156-2.1864 1.1139-2.8961 1.7504-1.0693 3.0234-1.0693zm-7.5959 0.13844h1.9692v7.6365h-1.9676v-7.6373zm10.522 0h2.153l1.7393 2.7211 1.7393-2.7211h2.1586l-2.9104 4.4198v3.2176h-1.9692v-3.2176zm2.1084 10.743h1.2587v1.1187h1.2969v0.89907h-1.2969v1.6708c0 0.183 0.0366 0.30712 0.109 0.37395 0.0724 0.06683 0.21721 0.09548 0.43283 0.09548h0.64685v0.89907h-1.0797c-0.49727 0-0.84974-0.10343-1.0582-0.3103-0.20846-0.20686-0.3103-0.56172-0.3103-1.0582v-1.6708h-0.62617v-0.89907h0.62617v-1.1195zm-7.557 1.0232c0.4551 0 0.79882 0.13924 1.0343 0.4185 0.23551 0.27927 0.35485 0.68425 0.35485 1.2173v2.3981h-1.2651v-1.8355l-0.023869-0.70334c-0.014321-0.12889-0.039782-0.22437-0.077177-0.28484-0.04933-0.08195-0.11616-0.1456-0.2005-0.19095-0.084338-0.04535-0.1822-0.07002-0.28961-0.07002a0.72403 0.72403 0 0 0-0.61901 0.30552c-0.15117 0.2013-0.22517 0.48216-0.22517 0.84099v1.9374h-1.2595v-3.9384h1.2587v0.57684c0.19095-0.23074 0.39225-0.39782 0.60468-0.50682s0.44874-0.16549 0.70653-0.16549zm4.4452 0c0.619 0 1.1139 0.18618 1.4839 0.55933 0.36997 0.37315 0.55933 0.87122 0.55933 1.4942v0.35804h-2.9439c0.03023 0.29439 0.13685 0.51716 0.31985 0.66515 0.183 0.14799 0.4376 0.22278 0.76699 0.22278 0.26495 0 0.53546-0.03978 0.81155-0.11616 0.27609-0.07638 0.55695-0.19891 0.8577-0.35804v0.97068c-0.29757 0.11139-0.59673 0.19652-0.8935 0.25301-0.29677 0.05649-0.59514 0.08752-0.8927 0.08752-0.71289 0-1.2674-0.18061-1.6629-0.54103-0.39543-0.36042-0.59116-0.87202-0.59116-1.526 0-0.64208 0.19334-1.1473 0.58082-1.5157 0.38748-0.36838 0.92294-0.55217 1.6032-0.55217zm-8e-3 0.83701c-0.24346 0-0.44237 0.06922-0.59434 0.20687-0.15197 0.13764-0.24665 0.33258-0.28484 0.59116h1.635c0-0.23869-0.07002-0.43124-0.21084-0.57684-0.14083-0.1456-0.31985-0.22119-0.54501-0.22119z" fill="#000" stroke-width=".79564"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.8 KiB |
1
assets/iconfont/icons/key-variant.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M22,18V22H18V19H15V16H12L9.74,13.74C9.19,13.91 8.61,14 8,14C4.69,14 2,11.31 2,8C2,4.69 4.69,2 8,2C11.31,2 14,4.69 14,8C14,8.61 13.91,9.19 13.74,9.74L22,18M7,5C5.9,5 5,5.9 5,7C5,8.1 5.9,9 7,9C8.1,9 9,8.1 9,7C9,5.9 8.1,5 7,5Z" /></svg>
|
After Width: | Height: | Size: 518 B |
1
assets/iconfont/icons/language-java.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M16.5,6.08C16.5,6.08 9.66,7.79 12.94,11.56C13.91,12.67 12.69,13.67 12.69,13.67C12.69,13.67 15.14,12.42 14,10.82C12.94,9.35 12.14,8.62 16.5,6.08M12.03,7.28C16.08,4.08 14,2 14,2C14.84,5.3 11.04,6.3 9.67,8.36C8.73,9.76 10.13,11.27 12,13C11.29,11.3 8.78,9.84 12.03,7.28M9.37,17.47C6.29,18.33 11.25,20.1 15.16,18.43C14.78,18.28 14.41,18.1 14.06,17.89C12.7,18.2 11.3,18.26 9.92,18.07C8.61,17.91 9.37,17.47 9.37,17.47M14.69,15.79C12.94,16.17 11.13,16.26 9.35,16.05C8.04,15.92 8.9,15.28 8.9,15.28C5.5,16.41 10.78,17.68 15.5,16.3C15.21,16.19 14.93,16 14.69,15.79M18.11,19.09C18.11,19.09 18.68,19.56 17.5,19.92C15.22,20.6 8.07,20.81 6.09,19.95C5.38,19.64 6.72,19.21 7.14,19.12C7.37,19.06 7.6,19.04 7.83,19.04C7.04,18.5 2.7,20.14 5.64,20.6C13.61,21.9 20.18,20 18.11,19.09M15.37,14.23C15.66,14.04 15.97,13.88 16.29,13.74C16.29,13.74 14.78,14 13.27,14.14C11.67,14.3 10.06,14.32 8.46,14.2C6.11,13.89 9.75,13 9.75,13C8.65,13 7.57,13.26 6.59,13.75C4.54,14.75 11.69,15.2 15.37,14.23M16.27,16.65C16.25,16.69 16.23,16.72 16.19,16.75C21.2,15.44 19.36,12.11 16.96,12.94C16.83,13 16.72,13.08 16.65,13.19C16.79,13.14 16.93,13.1 17.08,13.07C18.28,12.83 20,14.7 16.27,16.65M16.4,21.26C13.39,21.78 10.31,21.82 7.28,21.4C7.28,21.4 7.74,21.78 10.09,21.93C13.69,22.16 19.22,21.8 19.35,20.1C19.38,20.11 19.12,20.75 16.4,21.26Z" /></svg>
|
After Width: | Height: | Size: 1.6 KiB |
1
assets/iconfont/icons/language-javascript.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M3,3H21V21H3V3M7.73,18.04C8.13,18.89 8.92,19.59 10.27,19.59C11.77,19.59 12.8,18.79 12.8,17.04V11.26H11.1V17C11.1,17.86 10.75,18.08 10.2,18.08C9.62,18.08 9.38,17.68 9.11,17.21L7.73,18.04M13.71,17.86C14.21,18.84 15.22,19.59 16.8,19.59C18.4,19.59 19.6,18.76 19.6,17.23C19.6,15.82 18.79,15.19 17.35,14.57L16.93,14.39C16.2,14.08 15.89,13.87 15.89,13.37C15.89,12.96 16.2,12.64 16.7,12.64C17.18,12.64 17.5,12.85 17.79,13.37L19.1,12.5C18.55,11.54 17.77,11.17 16.7,11.17C15.19,11.17 14.22,12.13 14.22,13.4C14.22,14.78 15.03,15.43 16.25,15.95L16.67,16.13C17.45,16.47 17.91,16.68 17.91,17.26C17.91,17.74 17.46,18.09 16.76,18.09C15.93,18.09 15.45,17.66 15.09,17.06L13.71,17.86Z" /></svg>
|
After Width: | Height: | Size: 960 B |
4
assets/iconfont/icons/language-lua-variant.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m23.012 3.4776a2.4962 2.4962 0 0 1-2.4962 2.4962 2.4962 2.4962 0 0 1-2.4962-2.4962 2.4962 2.4962 0 0 1 2.4962-2.4962 2.4962 2.4962 0 0 1 2.4962 2.4962zm-11.018 8e-7a8.522 8.522 0 0 0-8.522 8.522 8.522 8.522 0 0 0 8.522 8.522 8.522 8.522 0 0 0 8.522-8.522 8.522 8.522 0 0 0-8.522-8.522zm3.5301 2.496a2.496 2.496 0 0 1 2.496 2.4962 2.496 2.496 0 0 1-2.496 2.496 2.496 2.496 0 0 1-2.4962-2.496 2.496 2.496 0 0 1 2.4962-2.4962zm-3.2026-5.1159-0.0072 0.25558c0.35025 0.010025 0.70004 0.037049 1.0477 0.0809l0.032-0.25365c-0.35585-0.044887-0.7139-0.072568-1.0724-0.08283zm-1.0753 0.020747c-0.3578 0.024157-0.71446 0.065465-1.0683 0.12396l0.0417 0.25224c0.3457-0.057142 0.69423-0.097479 1.0439-0.12109zm3.207 0.24802-0.05635 0.24937c0.34178 0.077198 0.67987 0.17102 1.0125 0.28106l0.08027-0.24275c-0.34054-0.11266-0.68657-0.20866-1.0364-0.28769zm-5.3267 0.1018c-0.34659 0.092097-0.68881 0.20082-1.025 0.32595l0.089188 0.23962c0.32836-0.12223 0.66271-0.22849 1.0014-0.31849zm7.3667 0.57256-0.10332 0.23389c0.32049 0.14158 0.63408 0.29885 0.93947 0.47075l0.12542-0.22279c-0.3125-0.1759-0.63347-0.33691-0.96157-0.48185zm-9.3805 0.17655c-0.32254 0.15687-0.63746 0.32939-0.94328 0.51683l0.1336 0.21799c0.29873-0.1831 0.60644-0.35169 0.92154-0.50495zm-1.832 1.1226c-0.28628 0.21611-0.56201 0.44617-0.82594 0.68901l0.17311 0.18818c0.25786-0.23725 0.52723-0.46201 0.80686-0.67311zm-1.5815 1.4543c-0.23942 0.26694-0.46617 0.54529-0.679 0.83397l0.20579 0.15174c0.20793-0.28205 0.42956-0.55409 0.66357-0.81499zm-1.2749 1.7293c-0.18411 0.30782-0.35327 0.62455-0.50662 0.9488l0.23113 0.10931c0.1498-0.31674 0.31503-0.6262 0.49489-0.92691zm19.501 0.65596-0.22784 0.11609c0.1591 0.31231 0.30343 0.63208 0.43182 0.95808l0.2379-0.093671c-0.13144-0.33374-0.27912-0.66101-0.44188-0.9805zm-20.42 1.2863c-0.12128 0.33755-0.22614 0.68104-0.31406 1.0288l0.24786 0.062656c0.085894-0.33969 0.18834-0.67521 0.30682-1.0049zm21.207 0.71262-0.24583 0.070423c0.0965 0.33682 0.17662 0.67837 0.23988 1.023l0.25146-0.046137c-0.06476-0.35279-0.14673-0.70245-0.24552-1.0473zm-21.734 1.3703c-0.054051 0.35453-0.091095 0.71171-0.11072 1.0698l0.25531 0.01397c0.019171-0.34987 0.055345-0.69886 0.10816-1.0453zm22.123 0.74296-0.25474 0.02169c0.02975 0.3491 0.04241 0.69969 0.03821 1.0501l0.25568 0.0031c0.0042-0.35861-0.0086-0.71744-0.03915-1.0748zm-21.985 1.3918-0.25547 0.01048c0.014762 0.35831 0.04671 0.71591 0.095912 1.0712l0.25328-0.03509c-0.048065-0.34707-0.079297-0.69649-0.093723-1.0466zm21.706 0.72899c-0.03782 0.34834-0.09259 0.6949-0.16378 1.038l0.25036 0.05192c0.07285-0.35113 0.12893-0.70575 0.16764-1.0623zm-21.418 1.3505-0.24875 0.05921c0.083086 0.34886 0.18294 0.69377 0.29941 1.033l0.24187-0.08299c-0.11377-0.33136-0.21134-0.66836-0.29253-1.0093zm20.992 0.70506c-0.1037 0.33469-0.22362 0.66439-0.3591 0.98758l0.23577 0.09883c0.13864-0.33074 0.26144-0.66818 0.3676-1.0108zm-20.31 1.2805-0.23269 0.10592c0.1486 0.32646 0.31311 0.64565 0.49275 0.9561l0.22133-0.12807c-0.17548-0.30327-0.33623-0.61506-0.48139-0.93395zm19.499 0.65549c-0.16589 0.30863-0.34681 0.6092-0.54185 0.90027l0.21242 0.14236c0.19966-0.29796 0.38481-0.60567 0.55462-0.92159zm-18.448 1.1616-0.20793 0.14872c0.20865 0.29173 0.43143 0.57328 0.66711 0.84356l0.19271-0.168c-0.23033-0.26414-0.44806-0.53927-0.65189-0.82427zm17.28 0.5823c-0.22227 0.27086-0.45777 0.53094-0.70527 0.77898l0.18098 0.18056c0.25334-0.25389 0.49436-0.52005 0.7219-0.79732zm-15.9 1.0004-0.17587 0.18562c0.26033 0.24668 0.53261 0.48084 0.81562 0.7012l0.15706-0.20178c-0.27645-0.21526-0.54244-0.44402-0.7968-0.68504zm14.417 0.48561c-0.27027 0.22304-0.5513 0.43311-0.84174 0.62922l0.14304 0.21189c0.2972-0.20068 0.58483-0.41559 0.86144-0.64386zm-12.761 0.80436-0.13694 0.21591c0.30293 0.19208 0.61527 0.36935 0.93541 0.53106l0.11525-0.22821c-0.31275-0.15798-0.61783-0.33114-0.91372-0.51876zm11.022 0.37088c-0.30782 0.16747-0.62371 0.32008-0.94625 0.45694l0.09987 0.2354c0.3302-0.14011 0.65353-0.29634 0.96856-0.46773zm-9.1482 0.57584-0.092733 0.23827c0.33422 0.13007 0.67475 0.24404 1.02 0.34122l0.069273-0.24614c-0.33728-0.094929-0.66999-0.20626-0.99655-0.33335zm7.2159 0.24432c-0.33428 0.10502-0.67368 0.19378-1.0166 0.26585l0.05254 0.2502c0.35101-0.07376 0.69846-0.16465 1.0406-0.27215zm-5.1953 0.32506-0.04535 0.25161c0.35292 0.06362 0.70893 0.11034 1.0664 0.1397l0.0209-0.25485c-0.34921-0.02868-0.69706-0.0743-1.042-0.13646zm3.141 0.10701c-0.34822 0.03873-0.69837 0.06045-1.0488 0.06537l0.0037 0.25563c0.35858-0.0051 0.71699-0.02729 1.0735-0.06693z" stroke-width=".024127"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.5 KiB |
1
assets/iconfont/icons/language-lua.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M10.5,5C5.81,5 2,8.81 2,13.5C2,18.19 5.81,22 10.5,22C15.19,22 19,18.19 19,13.5C19,8.81 15.19,5 10.5,5M13.5,13C12.12,13 11,11.88 11,10.5C11,9.12 12.12,8 13.5,8C14.88,8 16,9.12 16,10.5C16,11.88 14.88,13 13.5,13M19.5,2C18.12,2 17,3.12 17,4.5C17,5.88 18.12,7 19.5,7C20.88,7 22,5.88 22,4.5C22,3.12 20.88,2 19.5,2" /></svg>
|
After Width: | Height: | Size: 602 B |
1
assets/iconfont/icons/language-python.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M19.14,7.5C20.72,7.5 22,8.78 22,10.36V14.14C22,15.72 20.72,17 19.14,17H12C12,17.39 12.32,17.96 12.71,17.96H17V19.64C17,21.22 15.72,22.5 14.14,22.5H9.86C8.28,22.5 7,21.22 7,19.64V15.89C7,14.31 8.28,13.04 9.86,13.04H15.11C16.69,13.04 17.96,11.76 17.96,10.18V7.5H19.14M14.86,19.29C14.46,19.29 14.14,19.59 14.14,20.18C14.14,20.77 14.46,20.89 14.86,20.89C15.25,20.89 15.57,20.57 15.57,20.18C15.57,19.59 15.25,19.29 14.86,19.29M4.86,17.5C3.28,17.5 2,16.22 2,14.64V10.86C2,9.28 3.28,8 4.86,8H12C12,7.61 11.68,7.04 11.29,7.04H7V5.36C7,3.78 8.28,2.5 9.86,2.5H14.14C15.72,2.5 17,3.78 17,5.36V9.11C17,10.69 15.72,11.96 14.14,11.96H8.89C7.31,11.96 6.04,13.24 6.04,14.82V17.5H4.86M9.14,5.71C9.54,5.71 9.86,5.41 9.86,4.82C9.86,4.23 9.54,4.11 9.14,4.11C8.75,4.11 8.43,4.23 8.43,4.82C8.43,5.41 8.75,5.71 9.14,5.71Z" /></svg>
|
After Width: | Height: | Size: 1.1 KiB |
1
assets/iconfont/icons/language-typescript.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M3,3H21V21H3V3M13.71,17.86C14.21,18.84 15.22,19.59 16.8,19.59C18.4,19.59 19.6,18.76 19.6,17.23C19.6,15.82 18.79,15.19 17.35,14.57L16.93,14.39C16.2,14.08 15.89,13.87 15.89,13.37C15.89,12.96 16.2,12.64 16.7,12.64C17.18,12.64 17.5,12.85 17.79,13.37L19.1,12.5C18.55,11.54 17.77,11.17 16.7,11.17C15.19,11.17 14.22,12.13 14.22,13.4C14.22,14.78 15.03,15.43 16.25,15.95L16.67,16.13C17.45,16.47 17.91,16.68 17.91,17.26C17.91,17.74 17.46,18.09 16.76,18.09C15.93,18.09 15.45,17.66 15.09,17.06L13.71,17.86M13,11.25H8V12.75H9.5V20H11.25V12.75H13V11.25Z" /></svg>
|
After Width: | Height: | Size: 834 B |
6
assets/iconfont/icons/nestjs.svg
Normal file
After Width: | Height: | Size: 18 KiB |
1
assets/iconfont/icons/nodejs.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M12,1.85C11.73,1.85 11.45,1.92 11.22,2.05L3.78,6.35C3.3,6.63 3,7.15 3,7.71V16.29C3,16.85 3.3,17.37 3.78,17.65L5.73,18.77C6.68,19.23 7,19.24 7.44,19.24C8.84,19.24 9.65,18.39 9.65,16.91V8.44C9.65,8.32 9.55,8.22 9.43,8.22H8.5C8.37,8.22 8.27,8.32 8.27,8.44V16.91C8.27,17.57 7.59,18.22 6.5,17.67L4.45,16.5C4.38,16.45 4.34,16.37 4.34,16.29V7.71C4.34,7.62 4.38,7.54 4.45,7.5L11.89,3.21C11.95,3.17 12.05,3.17 12.11,3.21L19.55,7.5C19.62,7.54 19.66,7.62 19.66,7.71V16.29C19.66,16.37 19.62,16.45 19.55,16.5L12.11,20.79C12.05,20.83 11.95,20.83 11.88,20.79L10,19.65C9.92,19.62 9.84,19.61 9.79,19.64C9.26,19.94 9.16,20 8.67,20.15C8.55,20.19 8.36,20.26 8.74,20.47L11.22,21.94C11.46,22.08 11.72,22.15 12,22.15C12.28,22.15 12.54,22.08 12.78,21.94L20.22,17.65C20.7,17.37 21,16.85 21,16.29V7.71C21,7.15 20.7,6.63 20.22,6.35L12.78,2.05C12.55,1.92 12.28,1.85 12,1.85M14,8C11.88,8 10.61,8.89 10.61,10.39C10.61,12 11.87,12.47 13.91,12.67C16.34,12.91 16.53,13.27 16.53,13.75C16.53,14.58 15.86,14.93 14.3,14.93C12.32,14.93 11.9,14.44 11.75,13.46C11.73,13.36 11.64,13.28 11.53,13.28H10.57C10.45,13.28 10.36,13.37 10.36,13.5C10.36,14.74 11.04,16.24 14.3,16.24C16.65,16.24 18,15.31 18,13.69C18,12.08 16.92,11.66 14.63,11.35C12.32,11.05 12.09,10.89 12.09,10.35C12.09,9.9 12.29,9.3 14,9.3C15.5,9.3 16.09,9.63 16.32,10.66C16.34,10.76 16.43,10.83 16.53,10.83H17.5C17.55,10.83 17.61,10.81 17.65,10.76C17.69,10.72 17.72,10.66 17.7,10.6C17.56,8.82 16.38,8 14,8Z" /></svg>
|
After Width: | Height: | Size: 1.7 KiB |
6
assets/iconfont/icons/nuxt.svg
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg class="h-8" fill="none" version="1.1" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g>
|
||||||
|
<path d="m40.536 20.38c1.4685-2.4962 5.1397-2.4962 6.6081 0l16.004 27.205c1.4685 2.4961-0.36705 5.6165-3.304 5.6165h-32.008c-2.937 0-4.7725-3.1203-3.304-5.6165zm-12.253-7.2936c-1.7744-3.0509-6.2104-3.0509-7.9848 0l-19.338 33.25c-1.7744 3.051 0.4436 6.8646 3.9924 6.8646h15.096c-1.5164-1.3252-2.078-3.6179-0.93043-5.5849l14.646-25.105z" fill="#000" stroke-width=".94116"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 530 B |
6
assets/iconfont/icons/pleroma.svg
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(.087803 0 0 .087803 -10.522 -10.478)">
|
||||||
|
<path d="m272.62 322.07v65.281h45.618a20.449 20.449 0 0 0 20.449-20.449v-44.831zm0-197.42v131.35h45.618a20.449 20.449 0 0 0 20.449-20.449v-110.9zm-77.865 0a20.449 20.449 0 0 0-20.449 20.449v242.25h65.281v-262.7z" stroke-width="0"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 422 B |
1
assets/iconfont/icons/react.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M418.2 177.2c-5.4-1.8-10.8-3.5-16.2-5.1.9-3.7 1.7-7.4 2.5-11.1 12.3-59.6 4.2-107.5-23.1-123.3-26.3-15.1-69.2.6-112.6 38.4-4.3 3.7-8.5 7.6-12.5 11.5-2.7-2.6-5.5-5.2-8.3-7.7-45.5-40.4-91.1-57.4-118.4-41.5-26.2 15.2-34 60.3-23 116.7 1.1 5.6 2.3 11.1 3.7 16.7-6.4 1.8-12.7 3.8-18.6 5.9C38.3 196.2 0 225.4 0 255.6c0 31.2 40.8 62.5 96.3 81.5 4.5 1.5 9 3 13.6 4.3-1.5 6-2.8 11.9-4 18-10.5 55.5-2.3 99.5 23.9 114.6 27 15.6 72.4-.4 116.6-39.1 3.5-3.1 7-6.3 10.5-9.7 4.4 4.3 9 8.4 13.6 12.4 42.8 36.8 85.1 51.7 111.2 36.6 27-15.6 35.8-62.9 24.4-120.5-.9-4.4-1.9-8.9-3-13.5 3.2-.9 6.3-1.9 9.4-2.9 57.7-19.1 99.5-50 99.5-81.7 0-30.3-39.4-59.7-93.8-78.4zM282.9 92.3c37.2-32.4 71.9-45.1 87.7-36 16.9 9.7 23.4 48.9 12.8 100.4-.7 3.4-1.4 6.7-2.3 10-22.2-5-44.7-8.6-67.3-10.6-13-18.6-27.2-36.4-42.6-53.1 3.9-3.7 7.7-7.2 11.7-10.7zM167.2 307.5c5.1 8.7 10.3 17.4 15.8 25.9-15.6-1.7-31.1-4.2-46.4-7.5 4.4-14.4 9.9-29.3 16.3-44.5 4.6 8.8 9.3 17.5 14.3 26.1zm-30.3-120.3c14.4-3.2 29.7-5.8 45.6-7.8-5.3 8.3-10.5 16.8-15.4 25.4-4.9 8.5-9.7 17.2-14.2 26-6.3-14.9-11.6-29.5-16-43.6zm27.4 68.9c6.6-13.8 13.8-27.3 21.4-40.6s15.8-26.2 24.4-38.9c15-1.1 30.3-1.7 45.9-1.7s31 .6 45.9 1.7c8.5 12.6 16.6 25.5 24.3 38.7s14.9 26.7 21.7 40.4c-6.7 13.8-13.9 27.4-21.6 40.8-7.6 13.3-15.7 26.2-24.2 39-14.9 1.1-30.4 1.6-46.1 1.6s-30.9-.5-45.6-1.4c-8.7-12.7-16.9-25.7-24.6-39s-14.8-26.8-21.5-40.6zm180.6 51.2c5.1-8.8 9.9-17.7 14.6-26.7 6.4 14.5 12 29.2 16.9 44.3-15.5 3.5-31.2 6.2-47 8 5.4-8.4 10.5-17 15.5-25.6zm14.4-76.5c-4.7-8.8-9.5-17.6-14.5-26.2-4.9-8.5-10-16.9-15.3-25.2 16.1 2 31.5 4.7 45.9 8-4.6 14.8-10 29.2-16.1 43.4zM256.2 118.3c10.5 11.4 20.4 23.4 29.6 35.8-19.8-.9-39.7-.9-59.5 0 9.8-12.9 19.9-24.9 29.9-35.8zM140.2 57c16.8-9.8 54.1 4.2 93.4 39 2.5 2.2 5 4.6 7.6 7-15.5 16.7-29.8 34.5-42.9 53.1-22.6 2-45 5.5-67.2 10.4-1.3-5.1-2.4-10.3-3.5-15.5-9.4-48.4-3.2-84.9 12.6-94zm-24.5 263.6c-4.2-1.2-8.3-2.5-12.4-3.9-21.3-6.7-45.5-17.3-63-31.2-10.1-7-16.9-17.8-18.8-29.9 0-18.3 31.6-41.7 77.2-57.6 5.7-2 11.5-3.8 17.3-5.5 6.8 21.7 15 43 24.5 63.6-9.6 20.9-17.9 42.5-24.8 64.5zm116.6 98c-16.5 15.1-35.6 27.1-56.4 35.3-11.1 5.3-23.9 5.8-35.3 1.3-15.9-9.2-22.5-44.5-13.5-92 1.1-5.6 2.3-11.2 3.7-16.7 22.4 4.8 45 8.1 67.9 9.8 13.2 18.7 27.7 36.6 43.2 53.4-3.2 3.1-6.4 6.1-9.6 8.9zm24.5-24.3c-10.2-11-20.4-23.2-30.3-36.3 9.6.4 19.5.6 29.5.6 10.3 0 20.4-.2 30.4-.7-9.2 12.7-19.1 24.8-29.6 36.4zm130.7 30c-.9 12.2-6.9 23.6-16.5 31.3-15.9 9.2-49.8-2.8-86.4-34.2-4.2-3.6-8.4-7.5-12.7-11.5 15.3-16.9 29.4-34.8 42.2-53.6 22.9-1.9 45.7-5.4 68.2-10.5 1 4.1 1.9 8.2 2.7 12.2 4.9 21.6 5.7 44.1 2.5 66.3zm18.2-107.5c-2.8.9-5.6 1.8-8.5 2.6-7-21.8-15.6-43.1-25.5-63.8 9.6-20.4 17.7-41.4 24.5-62.9 5.2 1.5 10.2 3.1 15 4.7 46.6 16 79.3 39.8 79.3 58 0 19.6-34.9 44.9-84.8 61.4zm-149.7-15c25.3 0 45.8-20.5 45.8-45.8s-20.5-45.8-45.8-45.8c-25.3 0-45.8 20.5-45.8 45.8s20.5 45.8 45.8 45.8z"/></svg>
|
After Width: | Height: | Size: 3.0 KiB |
1
assets/iconfont/icons/rss-box.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M5,3H19C20.1,3 21,3.9 21,5V19C21,20.1 20.1,21 19,21H5C3.9,21 3,20.1 3,19V5C3,3.9 3.9,3 5,3M7.5,15C6.67,15 6,15.67 6,16.5C6,17.33 6.67,18 7.5,18C8.33,18 9,17.33 9,16.5C9,15.67 8.33,15 7.5,15M6,10V12C9.31,12 12,14.69 12,18H14C14,13.58 10.42,10 6,10M6,6V8C11.52,8 16,12.48 16,18H18C18,11.37 12.63,6 6,6Z" /></svg>
|
After Width: | Height: | Size: 595 B |
1
assets/iconfont/icons/vuejs.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M356.9 64.3H280l-56 88.6-48-88.6H0L224 448 448 64.3h-91.1zm-301.2 32h53.8L224 294.5 338.4 96.3h53.8L224 384.5 55.7 96.3z"/></svg>
|
After Width: | Height: | Size: 368 B |
1
assets/iconfont/icons/web.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M16.36,14C16.44,13.34 16.5,12.68 16.5,12C16.5,11.32 16.44,10.66 16.36,10H19.74C19.9,10.64 20,11.31 20,12C20,12.69 19.9,13.36 19.74,14M14.59,19.56C15.19,18.45 15.65,17.25 15.97,16H18.92C17.96,17.65 16.43,18.93 14.59,19.56M14.34,14H9.66C9.56,13.34 9.5,12.68 9.5,12C9.5,11.32 9.56,10.65 9.66,10H14.34C14.43,10.65 14.5,11.32 14.5,12C14.5,12.68 14.43,13.34 14.34,14M12,19.96C11.17,18.76 10.5,17.43 10.09,16H13.91C13.5,17.43 12.83,18.76 12,19.96M8,8H5.08C6.03,6.34 7.57,5.06 9.4,4.44C8.8,5.55 8.35,6.75 8,8M5.08,16H8C8.35,17.25 8.8,18.45 9.4,19.56C7.57,18.93 6.03,17.65 5.08,16M4.26,14C4.1,13.36 4,12.69 4,12C4,11.31 4.1,10.64 4.26,10H7.64C7.56,10.66 7.5,11.32 7.5,12C7.5,12.68 7.56,13.34 7.64,14M12,4.03C12.83,5.23 13.5,6.57 13.91,8H10.09C10.5,6.57 11.17,5.23 12,4.03M18.92,8H15.97C15.65,6.75 15.19,5.55 14.59,4.44C16.43,5.07 17.96,6.34 18.92,8M12,2C6.47,2 2,6.5 2,12C2,17.52 6.48,22 12,22C17.52,22 22,17.52 22,12C22,6.48 17.52,2 12,2Z" /></svg>
|
After Width: | Height: | Size: 1.2 KiB |
@ -1,17 +1,10 @@
|
|||||||
.blog {
|
.blog {
|
||||||
--blog-background: #eeeeee;
|
|
||||||
--blog-section-title-color: #4f4f4f;
|
|
||||||
--blog-text-color: #555555;
|
|
||||||
--blog-link-color: #195f7a;
|
|
||||||
--blog-sidebar-link-color: #006891;
|
|
||||||
--blog-title-color: #000000;
|
|
||||||
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
background-color: var(--blog-background);
|
background-color: #eee;
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: var(--blog-link-color);
|
color: #258fb8;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__header {
|
&__header {
|
||||||
@ -40,7 +33,7 @@
|
|||||||
|
|
||||||
a {
|
a {
|
||||||
padding: 1rem 1.2rem;
|
padding: 1rem 1.2rem;
|
||||||
color: var(--blog-sidebar-link-color);
|
color: #006891;
|
||||||
|
|
||||||
@media all and (max-width: 768px) {
|
@media all and (max-width: 768px) {
|
||||||
padding: 0.8rem 1rem;
|
padding: 0.8rem 1rem;
|
||||||
@ -86,16 +79,15 @@
|
|||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
color: var(--blog-title-color);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: var(--blog-title-color);
|
color: #000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&__content {
|
&__content {
|
||||||
color: var(--blog-text-color);
|
color: #555;
|
||||||
padding: 0 20px;
|
padding: 0 20px;
|
||||||
|
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
@ -173,15 +165,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&__continue {
|
|
||||||
margin: 0 0 20px 20px;
|
|
||||||
display: inline-block;
|
|
||||||
background-color: #efefef;
|
|
||||||
padding: 0.5rem 1.5rem;
|
|
||||||
border-radius: 8px;
|
|
||||||
color: #000 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__inner {
|
&__inner {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
@ -189,13 +172,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
&__meta {
|
&__meta {
|
||||||
margin-bottom: 0.6rem;
|
margin-bottom: 1em;
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
|
||||||
a {
|
a {
|
||||||
letter-spacing: 2px;
|
letter-spacing: 2px;
|
||||||
color: var(--blog-section-title-color);
|
color: #999;
|
||||||
line-height: 1em;
|
line-height: 1em;
|
||||||
text-shadow: 0 1px #fff;
|
text-shadow: 0 1px #fff;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@ -215,38 +198,7 @@
|
|||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
|
|
||||||
.blog-post__tag {
|
.blog-post__tag {
|
||||||
color: var(--blog-section-title-color);
|
color: #999;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&__page {
|
|
||||||
display: flex;
|
|
||||||
margin-top: 1.2rem;
|
|
||||||
justify-content: space-between;
|
|
||||||
|
|
||||||
&-link {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
|
|
||||||
&--newer {
|
|
||||||
margin-left: auto;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
text-decoration: none;
|
|
||||||
|
|
||||||
.blog-post__page-name {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-title {
|
|
||||||
color: var(--blog-section-title-color);
|
|
||||||
line-height: 1em;
|
|
||||||
text-shadow: 0 1px #fff;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -261,7 +213,7 @@
|
|||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 2px;
|
letter-spacing: 2px;
|
||||||
color: var(--blog-section-title-color);
|
color: #999;
|
||||||
margin-bottom: 1em;
|
margin-bottom: 1em;
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
line-height: 1em;
|
line-height: 1em;
|
||||||
@ -283,7 +235,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: var(--blog-sidebar-link-color);
|
color: #006891;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul {
|
ul {
|
||||||
@ -311,7 +263,7 @@
|
|||||||
line-height: 1em;
|
line-height: 1em;
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: var(--blog-section-title-color);
|
color: #999;
|
||||||
text-shadow: 0 1px #fff;
|
text-shadow: 0 1px #fff;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
@ -328,7 +280,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
&__time {
|
&__time {
|
||||||
color: var(--blog-section-title-color);
|
color: #999 !important;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-size: 0.85em;
|
font-size: 0.85em;
|
||||||
line-height: 1em;
|
line-height: 1em;
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
color: #eee;
|
color: #eee;
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
background-color: #313131;
|
|
||||||
|
|
||||||
.section-expand {
|
.section-expand {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
|
@ -21,14 +21,14 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { BlogPost } from '~~/lib/types/post';
|
import { BlogPost } from '~~/lib/types/post';
|
||||||
|
|
||||||
interface Archive {
|
interface Archive {
|
||||||
year: number;
|
year: number;
|
||||||
posts: BlogPost[];
|
posts: BlogPost[];
|
||||||
}
|
}
|
||||||
|
|
||||||
const props = defineProps<{ posts: BlogPost[] | null }>();
|
const props = defineProps<{ posts: BlogPost[] }>();
|
||||||
|
|
||||||
const monthNames = [
|
const monthNames = [
|
||||||
'Jan',
|
'Jan',
|
||||||
@ -49,10 +49,10 @@ const yearGroup = computed<Archive[]>(() => {
|
|||||||
const groups: Archive[] = [];
|
const groups: Archive[] = [];
|
||||||
|
|
||||||
props.posts
|
props.posts
|
||||||
?.sort((a, b) =>
|
.sort((a, b) =>
|
||||||
new Date(b.date)
|
new Date(b.date)
|
||||||
.toISOString()
|
.toISOString()
|
||||||
.localeCompare(new Date(a.date).toISOString(), 'en', { numeric: true }),
|
.localeCompare(new Date(a.date).toISOString(), 'en', { numeric: true })
|
||||||
)
|
)
|
||||||
.forEach((post) => {
|
.forEach((post) => {
|
||||||
const date = new Date(post.date);
|
const date = new Date(post.date);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<article class="blog-post" v-if="post">
|
<article class="blog-post">
|
||||||
<div class="blog-post__meta">
|
<div class="blog-post__meta">
|
||||||
<NuxtLink :to="'/blog/' + post.fullSlug">
|
<NuxtLink :to="'/blog/' + post.fullSlug">
|
||||||
<time :datetime="new Date(post.date).toISOString()">
|
<time :datetime="new Date(post.date).toISOString()">
|
||||||
@ -18,15 +18,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</h1>
|
</h1>
|
||||||
</header>
|
</header>
|
||||||
<template v-if="detail">
|
|
||||||
<div class="blog-post__content" v-html="post.html"></div>
|
<div class="blog-post__content" v-html="post.html"></div>
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
<div class="blog-post__content" v-html="post.summary"></div>
|
|
||||||
<NuxtLink :to="'/blog/' + post.fullSlug" class="blog-post__continue"
|
|
||||||
>Continue reading...</NuxtLink
|
|
||||||
>
|
|
||||||
</template>
|
|
||||||
<div class="blog-post__footer">
|
<div class="blog-post__footer">
|
||||||
<div class="blog-post__tags">
|
<div class="blog-post__tags">
|
||||||
<NuxtLink
|
<NuxtLink
|
||||||
@ -38,31 +30,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="detail" class="blog-post__page">
|
|
||||||
<NuxtLink
|
|
||||||
v-if="post.prev"
|
|
||||||
:to="'/blog/' + post.prev.fullSlug"
|
|
||||||
class="blog-post__page-link blog-post__page-link--older"
|
|
||||||
>
|
|
||||||
<span class="blog-post__page-title">Older</span>
|
|
||||||
<span class="blog-post__page-name">{{ post.prev.title }}</span>
|
|
||||||
</NuxtLink>
|
|
||||||
|
|
||||||
<NuxtLink
|
|
||||||
v-if="post.next"
|
|
||||||
:to="'/blog/' + post.next.fullSlug"
|
|
||||||
class="blog-post__page-link blog-post__page-link--newer"
|
|
||||||
>
|
|
||||||
<span class="blog-post__page-title">Newer</span>
|
|
||||||
<span class="blog-post__page-name">{{ post.next.title }}</span>
|
|
||||||
</NuxtLink>
|
|
||||||
</div>
|
|
||||||
</article>
|
</article>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { BlogPost } from '~~/lib/types/post';
|
import { BlogPost } from '~~/lib/types/post';
|
||||||
|
|
||||||
defineProps<{ post: BlogPost | null; detail?: boolean }>();
|
defineProps<{ post: BlogPost; detail?: boolean }>();
|
||||||
</script>
|
</script>
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
v-for="item in langList"
|
v-for="item in langList"
|
||||||
:title="item.title"
|
:title="item.title"
|
||||||
:class="item.icon"
|
:class="item.icon"
|
||||||
:aria-label="item.title"
|
|
||||||
></span>
|
></span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -21,7 +20,6 @@ const langList: LangListItem[] = [
|
|||||||
{ icon: 'icon-language-typescript', title: 'TypeScript' },
|
{ icon: 'icon-language-typescript', title: 'TypeScript' },
|
||||||
{ icon: 'icon-nodejs', title: 'Node.js' },
|
{ icon: 'icon-nodejs', title: 'Node.js' },
|
||||||
{ icon: 'icon-nestjs', title: 'Nest.js' },
|
{ icon: 'icon-nestjs', title: 'Nest.js' },
|
||||||
{ icon: 'icon-svelte-logo', title: 'Svelte' },
|
|
||||||
{ icon: 'icon-angular', title: 'Angular' },
|
{ icon: 'icon-angular', title: 'Angular' },
|
||||||
{ icon: 'icon-vuejs', title: 'Vue.js (version 3+)' },
|
{ icon: 'icon-vuejs', title: 'Vue.js (version 3+)' },
|
||||||
{ icon: 'icon-react', title: 'React' },
|
{ icon: 'icon-react', title: 'React' },
|
||||||
|
@ -9,7 +9,7 @@ date: 2018-02-03 12:43:10
|
|||||||
---
|
---
|
||||||
|
|
||||||
Hello!
|
Hello!
|
||||||
In the past week, I’ve been working on a simple 3D game using [Godot Engine 3.0](https://godotengine.org/) (_go-doh_). In this article, I will show off some of the features and discuss how it all works.<!-- more --> Here’s a quick demo of the gameplay:
|
In the past week, I’ve been working on a simple 3D game using [Godot Engine 3.0](https://godotengine.org/) (_go-doh_). In this article, I will show off some of the features and discuss how it all works. Here’s a quick demo of the gameplay:
|
||||||
|
|
||||||
# Mechanics
|
# Mechanics
|
||||||
|
|
||||||
|
@ -7,7 +7,6 @@ date: 2018-03-15 17:21:22
|
|||||||
---
|
---
|
||||||
|
|
||||||
Today I’m going to instruct you through the steps of installing your own Arch Linux system.
|
Today I’m going to instruct you through the steps of installing your own Arch Linux system.
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
## Download the ISO
|
## Download the ISO
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@ date: 2019-02-23 23:17:18
|
|||||||
---
|
---
|
||||||
|
|
||||||
Today I will be describing to you my experiences with self-hosting and how you can get started as well.
|
Today I will be describing to you my experiences with self-hosting and how you can get started as well.
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
I’m not going to go into detail in this article about how to install and configure anything, but the websites for respective pieces of software have great documentation and you can always look for more information online. Followup blog posts may come in the future describing setups that I’ve created.
|
I’m not going to go into detail in this article about how to install and configure anything, but the websites for respective pieces of software have great documentation and you can always look for more information online. Followup blog posts may come in the future describing setups that I’ve created.
|
||||||
|
|
||||||
|
@ -10,8 +10,6 @@ date: 2018-01-26 12:00:00
|
|||||||
So, I’ve decided to start a new blog using [Hexo](https://hexo.io/).
|
So, I’ve decided to start a new blog using [Hexo](https://hexo.io/).
|
||||||
I’ll probably be using this to share my projects and write some tutorials.
|
I’ll probably be using this to share my projects and write some tutorials.
|
||||||
|
|
||||||
<!-- more -->
|
|
||||||
|
|
||||||
## Current projects
|
## Current projects
|
||||||
|
|
||||||
I’m currently taking a break from writing code due to personal reasons, but I’m mainly working on my network, [Icy Network](https://icynet.eu). The main project in the works is [Episodes.Community](https://github.com/IcyNet/Episodes.Community), which is basically a site where people can watch and share links to their favorite TV shows and cartoons.
|
I’m currently taking a break from writing code due to personal reasons, but I’m mainly working on my network, [Icy Network](https://icynet.eu). The main project in the works is [Episodes.Community](https://github.com/IcyNet/Episodes.Community), which is basically a site where people can watch and share links to their favorite TV shows and cartoons.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<main class="blog">
|
<div class="blog">
|
||||||
<Head>
|
<Head>
|
||||||
<Meta property="og:type" content="website" />
|
<Meta property="og:type" content="website" />
|
||||||
<Meta property="og:title" content="Evert's Blog" />
|
<Meta property="og:title" content="Evert's Blog" />
|
||||||
@ -45,10 +45,8 @@
|
|||||||
<div class="blog__sidebar">
|
<div class="blog__sidebar">
|
||||||
<BlogSidebar title="Tags">
|
<BlogSidebar title="Tags">
|
||||||
<ul>
|
<ul>
|
||||||
<li v-for="postTag of tags">
|
<li v-for="tag of tags">
|
||||||
<NuxtLink :to="'/blog/tags/' + postTag.name">{{
|
<NuxtLink :to="'/blog/tags/' + tag.name">{{ tag.name }}</NuxtLink>
|
||||||
postTag.name
|
|
||||||
}}</NuxtLink>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</BlogSidebar>
|
</BlogSidebar>
|
||||||
@ -56,10 +54,10 @@
|
|||||||
<BlogSidebar title="Tag cloud">
|
<BlogSidebar title="Tag cloud">
|
||||||
<div class="tag-cloud">
|
<div class="tag-cloud">
|
||||||
<NuxtLink
|
<NuxtLink
|
||||||
v-for="postTag of tags"
|
v-for="tag of tags"
|
||||||
:to="'/blog/tags/' + postTag.name"
|
:to="'/blog/tags/' + tag.name"
|
||||||
:style="{ fontSize: getFontSize(postTag) }"
|
:style="{ fontSize: getFontSize(tag) }"
|
||||||
>{{ postTag.name }}</NuxtLink
|
>{{ tag.name }}</NuxtLink
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</BlogSidebar>
|
</BlogSidebar>
|
||||||
@ -83,15 +81,15 @@
|
|||||||
</BlogSidebar>
|
</BlogSidebar>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { ArchiveDto, BlogPost, BlogPostTag } from '~~/lib/types/post';
|
import { BlogPostTag } from '~~/lib/types/post';
|
||||||
|
|
||||||
const { data: tags } = await useFetch<BlogPostTag[]>('/api/blog/tags');
|
const { data: tags } = await useFetch('/api/blog/tags');
|
||||||
const { data: archive } = await useFetch<ArchiveDto>('/api/blog/archive');
|
const { data: archive } = await useFetch('/api/blog/archive');
|
||||||
const { data: recents } = await useFetch<BlogPost[]>('/api/blog', {
|
const { data: recents } = await useFetch('/api/blog', {
|
||||||
key: 'recents',
|
key: 'recents',
|
||||||
params: { limit: 6, render: false },
|
params: { limit: 6, render: false },
|
||||||
});
|
});
|
||||||
@ -114,11 +112,10 @@ const monthNames = [
|
|||||||
const monthList = computed(() => {
|
const monthList = computed(() => {
|
||||||
let links = [];
|
let links = [];
|
||||||
const res = archive.value;
|
const res = archive.value;
|
||||||
if (!res) return [];
|
|
||||||
|
|
||||||
for (const year of Object.keys(res).sort((a, b) => Number(b) - Number(a))) {
|
for (const year of Object.keys(res).sort((a, b) => Number(b) - Number(a))) {
|
||||||
for (const month of Object.keys(res[year]).sort(
|
for (const month of Object.keys(res[year]).sort(
|
||||||
(a, b) => Number(b) - Number(a),
|
(a, b) => Number(b) - Number(a)
|
||||||
)) {
|
)) {
|
||||||
const monthName = monthNames[new Date(`${year}-${month}-01`).getMonth()];
|
const monthName = monthNames[new Date(`${year}-${month}-01`).getMonth()];
|
||||||
|
|
||||||
@ -133,30 +130,24 @@ const monthList = computed(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const minTag = computed(() =>
|
const minTag = computed(() =>
|
||||||
tags.value?.reduce<number>(
|
tags.value.reduce<number>(
|
||||||
(min, current) => (min > current.count ? current.count : min),
|
(min, current) => (min > current.count ? current.count : min),
|
||||||
1000,
|
1000
|
||||||
),
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
const maxTag = computed(() =>
|
const maxTag = computed(() =>
|
||||||
tags.value?.reduce<number>(
|
tags.value.reduce<number>(
|
||||||
(max, current) => (max < current.count ? current.count : max),
|
(max, current) => (max < current.count ? current.count : max),
|
||||||
0,
|
0
|
||||||
),
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
function convertRange(value: number, r1: number[], r2: number[]) {
|
function convertRange(value: number, r1: number[], r2: number[]) {
|
||||||
return ((value - r1[0]) * (r2[1] - r2[0])) / (r1[1] - r1[0]) + r2[0];
|
return ((value - r1[0]) * (r2[1] - r2[0])) / (r1[1] - r1[0]) + r2[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
const getFontSize = (postTag: BlogPostTag): string => {
|
const getFontSize = (tag: BlogPostTag): string => {
|
||||||
return (
|
return convertRange(tag.count, [minTag.value, maxTag.value], [10, 20]) + 'px';
|
||||||
convertRange(
|
|
||||||
postTag.count,
|
|
||||||
[minTag.value ?? 0, maxTag.value ?? 0],
|
|
||||||
[10, 20],
|
|
||||||
) + 'px'
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
<template>
|
|
||||||
<main>
|
|
||||||
<slot></slot>
|
|
||||||
|
|
||||||
<footer>
|
|
||||||
<p>
|
|
||||||
There are no cookies. There is no data collection.
|
|
||||||
<a href="https://git.icynet.eu/evert/lunasqu.ee-nuxt" target="_blank"
|
|
||||||
>Source code</a
|
|
||||||
>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<img
|
|
||||||
src="/images/mail.gif"
|
|
||||||
style="user-select: none; margin: auto; display: block; border: 0"
|
|
||||||
alt="evert at sign luna squ dot ee"
|
|
||||||
/>
|
|
||||||
</p>
|
|
||||||
<p>© 2018 - {{ currentYear }} Evert Prants</p>
|
|
||||||
</footer>
|
|
||||||
</main>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
const currentYear = computed(() => new Date().getFullYear());
|
|
||||||
</script>
|
|
@ -4,45 +4,57 @@ import yaml from 'yaml';
|
|||||||
import { marked } from 'marked';
|
import { marked } from 'marked';
|
||||||
import hljs from 'highlight.js';
|
import hljs from 'highlight.js';
|
||||||
import { getDateObject } from '../utils/date-object';
|
import { getDateObject } from '../utils/date-object';
|
||||||
import type { ArchiveDto, BlogPost, BlogPostTag } from '../types/post';
|
import { BlogPost, BlogPostTag } from '../types/post';
|
||||||
|
|
||||||
const dir = join('content', 'blog');
|
const dir = join('content', 'blog');
|
||||||
|
|
||||||
marked.use({
|
marked.use({
|
||||||
renderer: {
|
renderer: {
|
||||||
code: ({ text, lang }): string => {
|
code: (code, info, escaped): string => {
|
||||||
const language = lang || 'plaintext';
|
const language = hljs.getLanguage(info) ? info : 'plaintext';
|
||||||
const created = hljs.highlight(text, { language }).value;
|
const created = hljs.highlight(code, { language }).value;
|
||||||
return `<div class="codeblock"><pre><code class="hljs language-${language}">${created}</code></pre></div>`;
|
return `<div class="codeblock"><pre><code class="hljs language-${language}">${created}</code></pre></div>`;
|
||||||
},
|
},
|
||||||
link: ({ href, title, text }): string =>
|
link: (href: string, title: string, text: string): string => {
|
||||||
`<a href="${href}" rel="nofollow" target="_blank"${
|
return `<a href="${href}" rel="nofollow" target="_blank"${
|
||||||
title ? ` title="${title}"` : ''
|
title ? ` title="${title}"` : ''
|
||||||
}>${text}</a>`,
|
}>${text}</a>`;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
async function readBlogPosts() {
|
export async function readBlogPosts(
|
||||||
|
condition?: (body: BlogPost) => boolean,
|
||||||
|
render = true,
|
||||||
|
includeContent = true
|
||||||
|
) {
|
||||||
const files = await fs.readdir(dir);
|
const files = await fs.readdir(dir);
|
||||||
const readMD = files.filter((file) => file.endsWith('.md'));
|
const readMD = files.filter((file) => file.endsWith('.md'));
|
||||||
const readFiles: BlogPost[] = [];
|
const readFiles = [];
|
||||||
|
|
||||||
for (const file of readMD) {
|
for (const file of readMD) {
|
||||||
const post = await readBlogPost(file.replace('.md', ''));
|
const post = await readBlogPost(
|
||||||
|
file.replace('.md', ''),
|
||||||
|
condition,
|
||||||
|
render,
|
||||||
|
includeContent
|
||||||
|
);
|
||||||
if (!post) continue;
|
if (!post) continue;
|
||||||
readFiles.push(post);
|
readFiles.push(post);
|
||||||
}
|
}
|
||||||
|
|
||||||
readFiles.sort((a, b) =>
|
readFiles.sort((a, b) =>
|
||||||
new Date(b.date)
|
new Date(b.date)
|
||||||
.toISOString()
|
.toISOString()
|
||||||
.localeCompare(new Date(a.date).toISOString(), 'en', { numeric: true }),
|
.localeCompare(new Date(a.date).toISOString(), 'en', { numeric: true })
|
||||||
);
|
);
|
||||||
|
|
||||||
return readFiles;
|
return readFiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function readBlogPost(slug: string): Promise<BlogPost> {
|
export async function readBlogPost(
|
||||||
|
slug: string,
|
||||||
|
condition?: (body: BlogPost) => boolean,
|
||||||
|
render = true,
|
||||||
|
includeContent = true
|
||||||
|
): Promise<BlogPost[]> {
|
||||||
const decoded = decodeURIComponent(slug);
|
const decoded = decodeURIComponent(slug);
|
||||||
if (!slug || decoded.includes('/') || decoded.includes('.'))
|
if (!slug || decoded.includes('/') || decoded.includes('.'))
|
||||||
throw new Error('Invalid post slug');
|
throw new Error('Invalid post slug');
|
||||||
@ -52,77 +64,30 @@ async function readBlogPost(slug: string): Promise<BlogPost> {
|
|||||||
const read = await fs.readFile(mdpath, { encoding: 'utf-8' });
|
const read = await fs.readFile(mdpath, { encoding: 'utf-8' });
|
||||||
|
|
||||||
const { header: parsedHeader, length: headerLength } = await readHeader(read);
|
const { header: parsedHeader, length: headerLength } = await readHeader(read);
|
||||||
const renderedMd = await marked(read.substring(headerLength), {
|
const renderedMd = render
|
||||||
async: true,
|
? await marked(read.substring(headerLength), { async: true })
|
||||||
});
|
: undefined;
|
||||||
|
|
||||||
const boundary = renderedMd.indexOf('<!-- more -->');
|
|
||||||
|
|
||||||
const { year, month, day } = getDateObject(parsedHeader);
|
const { year, month, day } = getDateObject(parsedHeader);
|
||||||
const content = {
|
const content = {
|
||||||
...parsedHeader,
|
...parsedHeader,
|
||||||
file,
|
file,
|
||||||
slug,
|
slug,
|
||||||
summary: renderedMd.substring(0, boundary > -1 ? boundary : 240),
|
|
||||||
fullSlug: `${year}/${month}/${day}/${slug}`,
|
fullSlug: `${year}/${month}/${day}/${slug}`,
|
||||||
markdown: read.substring(headerLength),
|
markdown: includeContent ? read.substring(headerLength) : undefined,
|
||||||
html: renderedMd.replace('<!-- more -->', ''),
|
html: renderedMd,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (condition) {
|
||||||
|
if (!condition(content)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|
||||||
let blogPostCache: BlogPost[] = [];
|
|
||||||
export const blogPostList = async () => {
|
|
||||||
if (!blogPostCache.length) {
|
|
||||||
blogPostCache = await readBlogPosts();
|
|
||||||
}
|
|
||||||
return blogPostCache;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getFilteredBlogPosts = async (
|
|
||||||
condition?: (body: BlogPost) => boolean,
|
|
||||||
htmlContent = true,
|
|
||||||
includeMarkdown = true,
|
|
||||||
): Promise<BlogPost[]> => {
|
|
||||||
const posts = await blogPostList();
|
|
||||||
return posts
|
|
||||||
.filter((item) => (condition ? condition(item) : true))
|
|
||||||
.map((item) => ({
|
|
||||||
...item,
|
|
||||||
html: htmlContent ? item.html : undefined,
|
|
||||||
markdown: includeMarkdown ? item.markdown : undefined,
|
|
||||||
}));
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getBlogPost = async (
|
|
||||||
slug: string,
|
|
||||||
htmlContent = true,
|
|
||||||
includeMarkdown = true,
|
|
||||||
): Promise<BlogPost | undefined> => {
|
|
||||||
const posts = await blogPostList();
|
|
||||||
const item = posts.find((item) => item.slug === slug);
|
|
||||||
if (!item) return;
|
|
||||||
|
|
||||||
const index = posts.indexOf(item);
|
|
||||||
const next = index > 0 ? posts[index - 1] : undefined;
|
|
||||||
const prev = posts[index + 1];
|
|
||||||
|
|
||||||
return {
|
|
||||||
...item,
|
|
||||||
html: htmlContent ? item.html : undefined,
|
|
||||||
markdown: includeMarkdown ? item.markdown : undefined,
|
|
||||||
next: next
|
|
||||||
? { title: next.title, slug: next.slug, fullSlug: next.fullSlug }
|
|
||||||
: undefined,
|
|
||||||
prev: prev
|
|
||||||
? { title: prev.title, slug: prev.slug, fullSlug: prev.fullSlug }
|
|
||||||
: undefined,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export async function getTags(): Promise<BlogPostTag[]> {
|
export async function getTags(): Promise<BlogPostTag[]> {
|
||||||
const posts = await getFilteredBlogPosts(undefined, false, false);
|
const posts = await readBlogPosts(undefined, false, false);
|
||||||
const obj: BlogPostTag[] = [];
|
const obj: BlogPostTag[] = [];
|
||||||
|
|
||||||
for (const post of posts) {
|
for (const post of posts) {
|
||||||
@ -148,8 +113,8 @@ export async function getTags(): Promise<BlogPostTag[]> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function getArchiveTree(condition?: (body: BlogPost) => boolean) {
|
export async function getArchiveTree(condition?: (body: BlogPost) => boolean) {
|
||||||
const posts = await getFilteredBlogPosts(condition, false, false);
|
const posts = await readBlogPosts(condition, false, false);
|
||||||
const obj: ArchiveDto = {};
|
const obj = {};
|
||||||
|
|
||||||
for (const post of posts) {
|
for (const post of posts) {
|
||||||
const { year, month, day } = getDateObject(post);
|
const { year, month, day } = getDateObject(post);
|
||||||
|
@ -5,11 +5,8 @@ export interface BlogPost {
|
|||||||
file: string;
|
file: string;
|
||||||
slug: string;
|
slug: string;
|
||||||
fullSlug: string;
|
fullSlug: string;
|
||||||
markdown?: string;
|
markdown: string;
|
||||||
summary: string;
|
html: string;
|
||||||
html?: string;
|
|
||||||
next?: Partial<BlogPost>;
|
|
||||||
prev?: Partial<BlogPost>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface BlogPostTag {
|
export interface BlogPostTag {
|
||||||
@ -17,8 +14,3 @@ export interface BlogPostTag {
|
|||||||
count: number;
|
count: number;
|
||||||
posts: string[];
|
posts: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ArchiveDto = Record<
|
|
||||||
string,
|
|
||||||
Record<string, Record<string, string[]>>
|
|
||||||
>;
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import type { BlogPost } from '../types/post';
|
import { BlogPost } from '../types/post';
|
||||||
|
|
||||||
export function getDateObject(post: BlogPost) {
|
export function getDateObject(post: BlogPost) {
|
||||||
const date = new Date(post.date);
|
const date = new Date(post.date);
|
||||||
|
@ -3,7 +3,6 @@ import { generatePaths } from './lib/blog/read-posts';
|
|||||||
// https://v3.nuxtjs.org/api/configuration/nuxt.config
|
// https://v3.nuxtjs.org/api/configuration/nuxt.config
|
||||||
export default defineNuxtConfig({
|
export default defineNuxtConfig({
|
||||||
css: ['@/assets/styles/index.scss'],
|
css: ['@/assets/styles/index.scss'],
|
||||||
|
|
||||||
vite: {
|
vite: {
|
||||||
css: {
|
css: {
|
||||||
preprocessorOptions: {
|
preprocessorOptions: {
|
||||||
@ -13,7 +12,6 @@ export default defineNuxtConfig({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
app: {
|
app: {
|
||||||
head: {
|
head: {
|
||||||
htmlAttrs: {
|
htmlAttrs: {
|
||||||
@ -33,17 +31,13 @@ export default defineNuxtConfig({
|
|||||||
link: [
|
link: [
|
||||||
{ rel: 'me', href: 'https://social.lunasqu.ee/diamond' },
|
{ rel: 'me', href: 'https://social.lunasqu.ee/diamond' },
|
||||||
{ rel: 'me', href: 'https://fosstodon.org/@evertprants' },
|
{ rel: 'me', href: 'https://fosstodon.org/@evertprants' },
|
||||||
{ rel: 'me', href: 'https://bsky.app/profile/lunasqu.ee' },
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
hooks: {
|
hooks: {
|
||||||
async 'nitro:config'(config) {
|
async 'nitro:config'(config) {
|
||||||
const routes = await generatePaths('/blog/');
|
const routes = await generatePaths('/blog/');
|
||||||
config.prerender?.routes?.push(...routes, '/blog/atom.xml');
|
config.prerender.routes.push(...routes, '/blog/atom.xml');
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
compatibilityDate: '2024-11-11',
|
|
||||||
});
|
});
|
||||||
|
17346
package-lock.json
generated
14
package.json
@ -8,15 +8,15 @@
|
|||||||
"postinstall": "nuxt prepare"
|
"postinstall": "nuxt prepare"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/marked": "^6.0.0",
|
"@types/marked": "^4.0.7",
|
||||||
"marked": "^15.0.0",
|
"marked": "^4.1.1",
|
||||||
"nuxt": "^3.14.159",
|
"nuxt": "3.0.0-rc.11",
|
||||||
"prettier": "^3.3.3",
|
"prettier": "^2.7.1",
|
||||||
"yaml": "^2.6.0"
|
"yaml": "^2.1.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"feed": "^4.2.2",
|
"feed": "^4.2.2",
|
||||||
"highlight.js": "^11.10.0",
|
"highlight.js": "^11.6.0",
|
||||||
"sass": "^1.80.6"
|
"sass": "^1.55.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,10 @@
|
|||||||
<Head>
|
<Head>
|
||||||
<Meta name="description" :content="preview" />
|
<Meta name="description" :content="preview" />
|
||||||
<Meta property="og:type" content="article" />
|
<Meta property="og:type" content="article" />
|
||||||
<Meta property="og:title" :content="post?.title || ''" />
|
<Meta property="og:title" content="Self-hosting, Part 1" />
|
||||||
<Meta
|
<Meta
|
||||||
property="og:url"
|
property="og:url"
|
||||||
:content="'https://lunasqu.ee/blog/' + post?.fullSlug || ''"
|
:content="'https://lunasqu.ee/blog/' + post.fullSlug"
|
||||||
/>
|
/>
|
||||||
<Meta property="og:site_name" content="Evert's Blog" />
|
<Meta property="og:site_name" content="Evert's Blog" />
|
||||||
<Meta property="og:description" :content="preview" />
|
<Meta property="og:description" :content="preview" />
|
||||||
@ -14,13 +14,9 @@
|
|||||||
<Meta property="article:published_time" :content="isostamp" />
|
<Meta property="article:published_time" :content="isostamp" />
|
||||||
<Meta property="article:modified_time" :content="isostamp" />
|
<Meta property="article:modified_time" :content="isostamp" />
|
||||||
<Meta property="article:author" content="Evert Prants" />
|
<Meta property="article:author" content="Evert Prants" />
|
||||||
<Meta
|
<Meta v-for="tag in post.tags" property="article:tag" :content="tag" />
|
||||||
v-for="tag in post?.tags || []"
|
|
||||||
property="article:tag"
|
|
||||||
:content="tag"
|
|
||||||
/>
|
|
||||||
<Meta name="twitter:card" content="summary" />
|
<Meta name="twitter:card" content="summary" />
|
||||||
<Title>{{ post?.title }} | Evert's Blog | lunasqu.ee</Title>
|
<Title>{{ post.title }} | Evert's Blog | lunasqu.ee</Title>
|
||||||
</Head>
|
</Head>
|
||||||
|
|
||||||
<BlogPost :post="post" :detail="true" />
|
<BlogPost :post="post" :detail="true" />
|
||||||
@ -38,14 +34,11 @@ const { data: post } = await useFetch<BlogPost>(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
const isostamp = computed(() =>
|
const isostamp = computed(() => new Date(post.value.date).toISOString());
|
||||||
post.value ? new Date(post.value.date).toISOString() : ''
|
|
||||||
);
|
|
||||||
|
|
||||||
const preview = computed(() =>
|
const preview = computed(() =>
|
||||||
post.value?.summary
|
post.value.html
|
||||||
.replace(/<[^>]*>?/gm, '')
|
.replace(/<[^>]*>?/gm, '')
|
||||||
.replace('\n', ' ')
|
.replace('\n', ' ')
|
||||||
.substring(0, 240)
|
.substring(0, 120)
|
||||||
);
|
);
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<template>
|
<template>
|
||||||
<div style="display: contents">
|
|
||||||
<NuxtLayout name="blog">
|
<NuxtLayout name="blog">
|
||||||
<Head>
|
<Head>
|
||||||
<Title
|
<Title
|
||||||
@ -11,7 +10,6 @@
|
|||||||
</Head>
|
</Head>
|
||||||
<BlogArchive :posts="posts" />
|
<BlogArchive :posts="posts" />
|
||||||
</NuxtLayout>
|
</NuxtLayout>
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<template>
|
<template>
|
||||||
<div style="display: contents">
|
|
||||||
<NuxtLayout name="blog">
|
<NuxtLayout name="blog">
|
||||||
<Head>
|
<Head>
|
||||||
<Title
|
<Title
|
||||||
@ -9,7 +8,6 @@
|
|||||||
</Head>
|
</Head>
|
||||||
<BlogArchive :posts="posts" />
|
<BlogArchive :posts="posts" />
|
||||||
</NuxtLayout>
|
</NuxtLayout>
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<template>
|
<template>
|
||||||
<div style="display: contents">
|
|
||||||
<NuxtLayout name="blog">
|
<NuxtLayout name="blog">
|
||||||
<Head>
|
<Head>
|
||||||
<Title
|
<Title
|
||||||
@ -8,7 +7,6 @@
|
|||||||
</Head>
|
</Head>
|
||||||
<BlogArchive :posts="posts" />
|
<BlogArchive :posts="posts" />
|
||||||
</NuxtLayout>
|
</NuxtLayout>
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div style="display: contents">
|
|
||||||
<NuxtLayout name="blog">
|
<NuxtLayout name="blog">
|
||||||
<Head>
|
<Head>
|
||||||
<Title>Archive | Evert's Blog | lunasqu.ee</Title>
|
<Title>Archive | Evert's Blog | lunasqu.ee</Title>
|
||||||
</Head>
|
</Head>
|
||||||
<BlogArchive :posts="posts" />
|
<BlogArchive :posts="posts" />
|
||||||
</NuxtLayout>
|
</NuxtLayout>
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
@ -1,18 +1,14 @@
|
|||||||
<template>
|
<template>
|
||||||
<div style="display: contents">
|
|
||||||
<NuxtLayout name="blog">
|
<NuxtLayout name="blog">
|
||||||
<template v-for="post of posts">
|
<template v-for="post of posts">
|
||||||
<BlogPost :post="post" :detail="false" />
|
<BlogPost :post="post" :detail="false" />
|
||||||
</template>
|
</template>
|
||||||
</NuxtLayout>
|
</NuxtLayout>
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { BlogPost } from '~~/lib/types/post';
|
const { data: posts } = await useFetch('/api/blog', {
|
||||||
|
|
||||||
const { data: posts } = await useFetch<BlogPost[]>('/api/blog', {
|
|
||||||
key: 'frontpage',
|
key: 'frontpage',
|
||||||
params: { limit: 16, render: false },
|
params: { limit: 16 },
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
146
pages/index.vue
@ -1,6 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div style="display: contents">
|
<main>
|
||||||
<NuxtLayout name="main">
|
|
||||||
<Section>
|
<Section>
|
||||||
<template v-slot:header>
|
<template v-slot:header>
|
||||||
<h1>About me</h1>
|
<h1>About me</h1>
|
||||||
@ -9,19 +8,19 @@
|
|||||||
<div class="section-content">
|
<div class="section-content">
|
||||||
<div class="introduction">
|
<div class="introduction">
|
||||||
<p>
|
<p>
|
||||||
Hello, my name is Evert Prants. I am a
|
Hello, my name is Evert <q>Diamond</q> Prants. I am a
|
||||||
{{ evertAge }}-year-old self-taught Web Developer and Systems
|
{{ evertAge }}-year-old self-taught Web Developer and Systems
|
||||||
Administrator from Estonia. I am generally a very curious person
|
Administrator from Estonia. I am generally a very curious person and
|
||||||
and thus I am interested in a very large variety of subjects,
|
thus I am interested in a very large variety of subjects, including,
|
||||||
including, but not limited to, space exploration, electronics,
|
but not limited to, space exploration, electronics, computers,
|
||||||
computers, networks, programming, aviation, ships, cars and other
|
networks, programming, aviation, ships, cars and other scientific
|
||||||
scientific fields. I like to tell everyone that I use Arch Linux -
|
fields. I like to tell everyone that I use Arch Linux - sorry not
|
||||||
sorry not sorry.
|
sorry.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
I can pretty much code in any language and use any library with
|
I can pretty much code in any language and use any library with the
|
||||||
the help of documentation and instructional materials, so the
|
help of documentation and instructional materials, so the
|
||||||
<q>Programming</q> list is not entirely comprehensive.
|
<q>Programming</q> list is not very comprehensive.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -33,8 +32,102 @@
|
|||||||
<LanguageList />
|
<LanguageList />
|
||||||
</div>
|
</div>
|
||||||
</Section>
|
</Section>
|
||||||
</NuxtLayout>
|
|
||||||
</div>
|
<Section>
|
||||||
|
<template v-slot:header>
|
||||||
|
<h1>Featured projects</h1>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<FeaturedProject
|
||||||
|
variant="left"
|
||||||
|
title="Icy Network"
|
||||||
|
image="/images/projects/icy_network_portal.png"
|
||||||
|
href="https://icynet.eu"
|
||||||
|
>
|
||||||
|
<p>
|
||||||
|
<b>Icy Network</b> is a single-sign-on (SSO) provider for projects
|
||||||
|
created by me and my friends.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The Icy Network website provides authorization using the
|
||||||
|
industry-standard OAuth 2.0 protocol.
|
||||||
|
</p>
|
||||||
|
<h3>Features</h3>
|
||||||
|
<ul>
|
||||||
|
<li>User accounts with display names and avatars</li>
|
||||||
|
<li>
|
||||||
|
Administration panel created using Vue.js for managing users and
|
||||||
|
OAuth clients
|
||||||
|
</li>
|
||||||
|
<li>A news outlet</li>
|
||||||
|
</ul>
|
||||||
|
</FeaturedProject>
|
||||||
|
|
||||||
|
<FeaturedProject
|
||||||
|
variant="right"
|
||||||
|
title="Various web-based games"
|
||||||
|
image="/images/projects/games.png"
|
||||||
|
href="/apps"
|
||||||
|
>
|
||||||
|
<p>
|
||||||
|
I have also created various experimental web-based games in order to
|
||||||
|
learn Canvas APIs.
|
||||||
|
</p>
|
||||||
|
<h3>Games include..</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Battleship</li>
|
||||||
|
<li>Connect Four</li>
|
||||||
|
<li>Tower Defense</li>
|
||||||
|
<li>Minesweeper</li>
|
||||||
|
<li>Hook Miner</li>
|
||||||
|
<li>Tile-based modifyable world</li>
|
||||||
|
</ul>
|
||||||
|
</FeaturedProject>
|
||||||
|
|
||||||
|
<FeaturedProject
|
||||||
|
variant="left"
|
||||||
|
title="Icy Network TV"
|
||||||
|
image="/images/projects/icytv.png"
|
||||||
|
href="https://tv.icynet.eu"
|
||||||
|
>
|
||||||
|
<p>
|
||||||
|
<b>Icy Network TV</b> is a livestreaming platform for Icy Network
|
||||||
|
affiliates.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
This project uses
|
||||||
|
<a href="https://github.com/arut/nginx-rtmp-module" target="_blank"
|
||||||
|
>nginx-rtmp-module</a
|
||||||
|
>
|
||||||
|
as the livestream server and channels are created for select Icy
|
||||||
|
Network users only.
|
||||||
|
</p>
|
||||||
|
<h3>Features</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Integrated video player</li>
|
||||||
|
<li>Video dashboard</li>
|
||||||
|
<li>HLS video output</li>
|
||||||
|
</ul>
|
||||||
|
</FeaturedProject>
|
||||||
|
</Section>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p>
|
||||||
|
There are no cookies. There is no data collection.
|
||||||
|
<a href="https://gitlab.icynet.eu/evert/lunasqu.ee-nuxt" target="_blank"
|
||||||
|
>Source code</a
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<img
|
||||||
|
src="/images/mail.gif"
|
||||||
|
style="user-select: none; margin: auto; display: block; border: 0"
|
||||||
|
alt="evert at sign luna squ dot ee"
|
||||||
|
/>
|
||||||
|
</p>
|
||||||
|
<p>© 2018 - {{ currentYear }} Evert Prants</p>
|
||||||
|
</footer>
|
||||||
|
</main>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
@ -65,28 +158,29 @@ const linksList = [
|
|||||||
|
|
||||||
const socialLinks = [
|
const socialLinks = [
|
||||||
{
|
{
|
||||||
href: 'https://git.icynet.eu/evert',
|
href: 'https://gitlab.icynet.eu/evert',
|
||||||
icon: 'icon-gitea',
|
icon: 'icon-gitlab',
|
||||||
name: 'Gitea (personal projects)',
|
name: 'GitLab',
|
||||||
},
|
|
||||||
{
|
|
||||||
href: 'https://bsky.app/profile/lunasqu.ee',
|
|
||||||
icon: 'icon-bluesky',
|
|
||||||
name: 'Bluesky',
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
href: 'https://social.lunasqu.ee/diamond',
|
href: 'https://social.lunasqu.ee/diamond',
|
||||||
icon: 'icon-pleroma',
|
icon: 'icon-pleroma',
|
||||||
name: 'Akkoma (aka Mastodon)',
|
name: 'Pleroma',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: 'https://reddit.com/user/LunaSquee',
|
||||||
|
icon: 'icon-reddit-alien',
|
||||||
|
name: 'Reddit',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
href: 'https://github.com/LunaSquee',
|
href: 'https://github.com/LunaSquee',
|
||||||
icon: 'icon-github-circled',
|
icon: 'icon-github-circled',
|
||||||
name: 'GitHub (contributions only)',
|
name: 'GitHub (old stuff)',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const evertAge = computed(() => {
|
const currentYear = new Date().getFullYear();
|
||||||
|
const evertAge = (() => {
|
||||||
const today = new Date();
|
const today = new Date();
|
||||||
const birthDate = new Date('2000-04-18');
|
const birthDate = new Date('2000-04-18');
|
||||||
let age = today.getFullYear() - birthDate.getFullYear();
|
let age = today.getFullYear() - birthDate.getFullYear();
|
||||||
@ -95,5 +189,5 @@ const evertAge = computed(() => {
|
|||||||
age--;
|
age--;
|
||||||
}
|
}
|
||||||
return age;
|
return age;
|
||||||
});
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
import { defineNuxtPlugin } from '#imports';
|
|
||||||
|
|
||||||
export default defineNuxtPlugin((nuxtApp) => {
|
|
||||||
nuxtApp.$router.options.scrollBehavior = async (to, from, savedPosition) => {
|
|
||||||
let goTo;
|
|
||||||
|
|
||||||
if (to.hash) {
|
|
||||||
goTo = {
|
|
||||||
el: to.hash,
|
|
||||||
behavior: 'smooth',
|
|
||||||
top: 64,
|
|
||||||
};
|
|
||||||
} else if (savedPosition) {
|
|
||||||
goTo = savedPosition;
|
|
||||||
} else {
|
|
||||||
goTo = { top: 0 };
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
setTimeout(() => {
|
|
||||||
resolve(goTo);
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
});
|
|
@ -1,9 +1,10 @@
|
|||||||
import { getBlogPost } from '~~/lib/blog/read-posts';
|
import { H3Error } from 'h3';
|
||||||
|
import { readBlogPost } from '~~/lib/blog/read-posts';
|
||||||
|
|
||||||
export default defineEventHandler(async (event) => {
|
export default defineEventHandler(async (event) => {
|
||||||
const slug = getRouterParam(event, 'slug');
|
const slug = getRouterParam(event, 'slug');
|
||||||
try {
|
try {
|
||||||
const post = await getBlogPost(slug as string);
|
const post = await readBlogPost(slug);
|
||||||
return post;
|
return post;
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
});
|
});
|
||||||
|
@ -1,15 +1,10 @@
|
|||||||
import { getArchiveTree } from '~~/lib/blog/read-posts';
|
import { getArchiveTree } from '~~/lib/blog/read-posts';
|
||||||
import type { BlogPost } from '~~/lib/types/post';
|
|
||||||
|
|
||||||
export default defineEventHandler(async (event) => {
|
export default defineEventHandler(async (event) => {
|
||||||
const query = getQuery(event);
|
const query = getQuery(event);
|
||||||
const include = (content: BlogPost) => {
|
const include = (content) => {
|
||||||
if (query.tag) {
|
if (query.tag) {
|
||||||
const tags = Array.isArray(query.tag) ? query.tag : [query.tag];
|
if (!content.tags?.length || !content.tags.includes(query.tag)) {
|
||||||
if (
|
|
||||||
!content.tags?.length ||
|
|
||||||
!tags.every((tag) => content.tags.includes(tag))
|
|
||||||
) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
import { getFilteredBlogPosts } from '~~/lib/blog/read-posts';
|
import { readBlogPosts } from '~~/lib/blog/read-posts';
|
||||||
import type { BlogPost } from '~~/lib/types/post';
|
|
||||||
|
|
||||||
export default defineEventHandler(async (event) => {
|
export default defineEventHandler(async (event) => {
|
||||||
const query = getQuery(event);
|
const query = getQuery(event);
|
||||||
const include = (content: BlogPost) => {
|
const include = (content) => {
|
||||||
const dateObj = new Date(content.date);
|
const dateObj = new Date(content.date);
|
||||||
|
|
||||||
if (query.year) {
|
if (query.year) {
|
||||||
@ -25,11 +24,7 @@ export default defineEventHandler(async (event) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (query.tag) {
|
if (query.tag) {
|
||||||
const tags = Array.isArray(query.tag) ? query.tag : [query.tag];
|
if (!content.tags?.length || !content.tags.includes(query.tag)) {
|
||||||
if (
|
|
||||||
!content.tags?.length ||
|
|
||||||
!tags.every((tag) => content.tags.includes(tag))
|
|
||||||
) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -37,10 +32,10 @@ export default defineEventHandler(async (event) => {
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
const posts = await getFilteredBlogPosts(
|
const posts = await readBlogPosts(
|
||||||
include,
|
include,
|
||||||
query.render !== 'false',
|
query.render !== 'false',
|
||||||
query.body === 'true',
|
query.body === 'true'
|
||||||
);
|
);
|
||||||
|
|
||||||
const limit = Number(query.limit) || 10;
|
const limit = Number(query.limit) || 10;
|
||||||
|
@ -1,26 +1,26 @@
|
|||||||
import { Feed } from 'feed';
|
import { Feed } from 'feed';
|
||||||
import { getFilteredBlogPosts } from '~~/lib/blog/read-posts';
|
import { readBlogPosts } from '~~/lib/blog/read-posts';
|
||||||
|
|
||||||
const BASE_URL = 'https://lunasqu.ee/blog';
|
const BASE_URL = 'https://lunasqu.ee/blog';
|
||||||
|
|
||||||
export default defineEventHandler(async (event) => {
|
export default defineEventHandler(async (event) => {
|
||||||
const posts = await getFilteredBlogPosts(undefined, true, false);
|
const posts = await readBlogPosts(undefined, true, false);
|
||||||
const feed = new Feed({
|
const feed = new Feed({
|
||||||
title: "Evert's Blog",
|
title: "Evert's Blog",
|
||||||
description: 'Projects and Tutorials',
|
description: 'Projects and Tutorials',
|
||||||
id: BASE_URL,
|
id: BASE_URL,
|
||||||
link: BASE_URL,
|
link: BASE_URL,
|
||||||
copyright: 'Evert "Diamond" Prants 2024',
|
copyright: 'Evert "Diamond" Prants 2022',
|
||||||
language: 'en',
|
language: 'en',
|
||||||
updated: new Date(posts[0].date),
|
updated: new Date(posts[0].date),
|
||||||
generator: 'https://git.icynet.eu/evert/lunasqu.ee-nuxt',
|
generator: 'https://gitlab.icynet.eu/evert/lunasqu.ee-nuxt',
|
||||||
feedLinks: {
|
feedLinks: {
|
||||||
atom: `${BASE_URL}/atom.xml`,
|
atom: `${BASE_URL}/atom.xml`,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
posts.forEach((post) => {
|
posts.forEach((post) => {
|
||||||
const description = post.summary
|
const description = post.html
|
||||||
.replace(/<[^>]*>?/gm, '')
|
.replace(/<[^>]*>?/gm, '')
|
||||||
.replace('\n', ' ')
|
.replace('\n', ' ')
|
||||||
.substring(0, 240);
|
.substring(0, 240);
|
||||||
|