space->space-old, homepage written with picocss
This commit is contained in:
parent
b1769ade0c
commit
fa88138bc2
37 changed files with 544 additions and 48 deletions
165
space-old/fontawesome/LICENSE.txt
Normal file
165
space-old/fontawesome/LICENSE.txt
Normal file
|
@ -0,0 +1,165 @@
|
|||
Fonticons, Inc. (https://fontawesome.com)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Font Awesome Free License
|
||||
|
||||
Font Awesome Free is free, open source, and GPL friendly. You can use it for
|
||||
commercial projects, open source projects, or really almost whatever you want.
|
||||
Full Font Awesome Free license: https://fontawesome.com/license/free.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)
|
||||
|
||||
The Font Awesome Free download is licensed under a Creative Commons
|
||||
Attribution 4.0 International License and applies to all icons packaged
|
||||
as SVG and JS file types.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
# Fonts: SIL OFL 1.1 License
|
||||
|
||||
In the Font Awesome Free download, the SIL OFL license applies to all icons
|
||||
packaged as web and desktop font files.
|
||||
|
||||
Copyright (c) 2022 Fonticons, Inc. (https://fontawesome.com)
|
||||
with Reserved Font Name: "Font Awesome".
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
SIL OPEN FONT LICENSE
|
||||
Version 1.1 - 26 February 2007
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting — in part or in whole — any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
# Code: MIT License (https://opensource.org/licenses/MIT)
|
||||
|
||||
In the Font Awesome Free download, the MIT license applies to all non-font and
|
||||
non-icon files.
|
||||
|
||||
Copyright 2022 Fonticons, Inc.
|
||||
|
||||
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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
# Attribution
|
||||
|
||||
Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font
|
||||
Awesome Free files already contain embedded comments with sufficient
|
||||
attribution, so you shouldn't need to do anything additional when using these
|
||||
files normally.
|
||||
|
||||
We've kept attribution comments terse, so we ask that you do not actively work
|
||||
to remove them from files, especially code. They're a great way for folks to
|
||||
learn about Font Awesome.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
# Brand Icons
|
||||
|
||||
All brand icons are trademarks of their respective owners. The use of these
|
||||
trademarks does not indicate endorsement of the trademark holder by Font
|
||||
Awesome, nor vice versa. **Please do not use brand logos for any purpose except
|
||||
to represent the company, product, or service to which they refer.**
|
6
space-old/fontawesome/css/brands.min.css
vendored
Normal file
6
space-old/fontawesome/css/brands.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
6
space-old/fontawesome/css/fontawesome.min.css
vendored
Normal file
6
space-old/fontawesome/css/fontawesome.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
6
space-old/fontawesome/css/regular.min.css
vendored
Normal file
6
space-old/fontawesome/css/regular.min.css
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
/*!
|
||||
* Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2022 Fonticons, Inc.
|
||||
*/
|
||||
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}
|
6
space-old/fontawesome/css/solid.min.css
vendored
Normal file
6
space-old/fontawesome/css/solid.min.css
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
/*!
|
||||
* Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2022 Fonticons, Inc.
|
||||
*/
|
||||
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}
|
BIN
space-old/fontawesome/webfonts/fa-brands-400.ttf
Normal file
BIN
space-old/fontawesome/webfonts/fa-brands-400.ttf
Normal file
Binary file not shown.
BIN
space-old/fontawesome/webfonts/fa-brands-400.woff2
Normal file
BIN
space-old/fontawesome/webfonts/fa-brands-400.woff2
Normal file
Binary file not shown.
BIN
space-old/fontawesome/webfonts/fa-regular-400.ttf
Normal file
BIN
space-old/fontawesome/webfonts/fa-regular-400.ttf
Normal file
Binary file not shown.
BIN
space-old/fontawesome/webfonts/fa-regular-400.woff2
Normal file
BIN
space-old/fontawesome/webfonts/fa-regular-400.woff2
Normal file
Binary file not shown.
BIN
space-old/fontawesome/webfonts/fa-solid-900.ttf
Normal file
BIN
space-old/fontawesome/webfonts/fa-solid-900.ttf
Normal file
Binary file not shown.
BIN
space-old/fontawesome/webfonts/fa-solid-900.woff2
Normal file
BIN
space-old/fontawesome/webfonts/fa-solid-900.woff2
Normal file
Binary file not shown.
BIN
space-old/img/earth.gif
Normal file
BIN
space-old/img/earth.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 365 KiB |
BIN
space-old/img/mars.gif
Normal file
BIN
space-old/img/mars.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 259 KiB |
BIN
space-old/img/moon.gif
Normal file
BIN
space-old/img/moon.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 475 KiB |
BIN
space-old/img/sun.gif
Normal file
BIN
space-old/img/sun.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 319 KiB |
215
space-old/index.hbs
Normal file
215
space-old/index.hbs
Normal file
|
@ -0,0 +1,215 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>DarkCat09's Web Site</title>
|
||||
<link rel="stylesheet/less" type="text/css" href="styles.less" />
|
||||
<link rel="stylesheet" href="https://brick.freetls.fastly.net/Montserrat:400,400i,500,500i,600,600i,700,700i">
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/shakrmedia/tuesday@v1.1.0/build/tuesday.min.css" />
|
||||
<link rel="stylesheet" href="fontawesome/css/fontawesome.min.css" />
|
||||
<link rel="stylesheet" href="fontawesome/css/solid.min.css" />
|
||||
<link rel="stylesheet" href="fontawesome/css/regular.min.css" />
|
||||
<link rel="stylesheet" href="fontawesome/css/brands.min.css" />
|
||||
<script src="https://cdn.jsdelivr.net/npm/less"></script>
|
||||
</head>
|
||||
<body onload="init()">
|
||||
<!-- The Universe -->
|
||||
<div class="space-wrapper">
|
||||
<div class="space">
|
||||
<canvas id="stars"></canvas>
|
||||
<img id="space-obj" src="img/earth.gif" alt="Unable to load image" />
|
||||
</div>
|
||||
</div>
|
||||
<!-- About Menu -->
|
||||
<div class="menu about-menu">
|
||||
<div class="top-menu">
|
||||
<ul class="section">
|
||||
{{#each menu}}
|
||||
<li>
|
||||
<input type="radio" name="section-input" id="{{this.id}}-section">
|
||||
<label for="{{this.id}}-section">
|
||||
<a href="#{{this.id}}">
|
||||
<i class="{{this.icon}}"></i>
|
||||
</a>
|
||||
</label>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
<div class="row-fill"></div>
|
||||
<ul class="section">
|
||||
<li id="move">
|
||||
<label>
|
||||
<a href="javascript:void(0)">
|
||||
<i class="fa-solid fa-arrows-up-down-left-right"></i>
|
||||
</a>
|
||||
</label>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="hidden" id="about">
|
||||
<div class="card about-card">
|
||||
<div class="title">
|
||||
Hi! I'm Andrew.
|
||||
</div>
|
||||
{{#each about}}
|
||||
<div>
|
||||
<div class="icon">
|
||||
<i class="{{this.icon}}"></i>
|
||||
</div>
|
||||
<div class="content">
|
||||
{{{this.content}}}
|
||||
{{#if this.expand}}
|
||||
<div class="expand-wrapper">
|
||||
<input type="checkbox" id="expand-{{this.id}}">
|
||||
<label class="expand link" for="expand-{{this.id}}">
|
||||
<i class="fa-solid fa-angle-down"></i>
|
||||
Details
|
||||
</label>
|
||||
<div class="hidden" id="details-{{this.id}}">
|
||||
{{this.code}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
<div class="card profiles">
|
||||
{{#each profiles}}
|
||||
<div>
|
||||
<div class="icon">
|
||||
<i class="{{this.icon}}"></i>
|
||||
</div>
|
||||
<div class="content">
|
||||
<a class="name" target="_blank" href="{{this.url}}">
|
||||
{{this.name}}: {{this.user}}
|
||||
</a>
|
||||
<div class="copylink">
|
||||
<span class="link profile-link" data-link="{{#if this.copy}}{{this.copy}}{{else}}{{this.url}}{{/if}}">
|
||||
<i class="fa-solid fa-copy"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="copied inline-popup right">
|
||||
Copied
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="hidden" id="code">
|
||||
<div class="card">
|
||||
{{#each langs}}
|
||||
<div>
|
||||
<div class="icon">
|
||||
{{#if this.svg}}
|
||||
<span>
|
||||
<img src="{{this.icon}}">
|
||||
</span>
|
||||
{{else}}
|
||||
<i class="{{this.icon}}"></i>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="content">
|
||||
<div class="lang-name">{{this.name}}</div>
|
||||
<div class="details">
|
||||
<div class="expand-wrapper">
|
||||
<input type="checkbox" id="expand-{{this.id1}}">
|
||||
<label class="expand link" for="expand-{{this.id1}}">
|
||||
<i class="fa-solid fa-angle-down"></i>
|
||||
Details
|
||||
</label>
|
||||
<div class="hidden" id="{{this.id2}}">
|
||||
<div class="lang-wrapper">
|
||||
<div class="lang-skills">
|
||||
<div class="caption">
|
||||
I know:
|
||||
</div>
|
||||
<ol>
|
||||
{{#each this.skills}}
|
||||
<li>{{{this}}}</li>
|
||||
{{/each}}
|
||||
</ol>
|
||||
</div>
|
||||
<div class="projects">
|
||||
{{#each this.projects}}
|
||||
<div class="repo">
|
||||
<a target="_blank" href="{{this.url}}">
|
||||
{{this.name}}
|
||||
</a>
|
||||
<div class="stars-icon">
|
||||
<i class="fa-regular fa-star"></i>
|
||||
</div>
|
||||
<div class="stars-num">{{this.stars}}</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="hidden" id="selfhosted">
|
||||
<div class="card">
|
||||
<div>{{vps}}</div>
|
||||
{{#each selfhosted}}
|
||||
<div>
|
||||
<div class="icon">
|
||||
<i class="{{this.icon}}"></i>
|
||||
</div>
|
||||
<div class="content">
|
||||
<a href="https://{{this.domain}}" target="_blank">
|
||||
{{this.domain}}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Context Menu -->
|
||||
<div class="menu context-menu">
|
||||
<ul>
|
||||
{{#each spaceobj}}
|
||||
<li class="change-img">
|
||||
<span class="li-wrapper" data-img="{{this.img}}">
|
||||
<span class="icon">
|
||||
<i class="{{this.icon}}"></i>
|
||||
</span>
|
||||
{{this.name}}
|
||||
</span>
|
||||
</li>
|
||||
{{/each}}
|
||||
<li class="change-speed">
|
||||
<span class="li-wrapper">
|
||||
<span class="icon">
|
||||
<i class="fas fa-wrench"></i>
|
||||
</span>
|
||||
Speed:
|
||||
<input type="range" min="0" max="1170" step="30" value="720" />
|
||||
</span>
|
||||
</li>
|
||||
<li class="land-to">
|
||||
<span class="li-wrapper">
|
||||
<span class="icon">
|
||||
<i class="fa-solid fa-rocket"></i>
|
||||
</span>
|
||||
Land to Earth
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- JavaScript -->
|
||||
<script src="js/anim.js"></script>
|
||||
<script src="js/script.js"></script>
|
||||
<script src="js/init.js"></script>
|
||||
<script src="js/menu.js"></script>
|
||||
<script src="js/control.js"></script>
|
||||
<script src="js/handlers.js"></script>
|
||||
</body>
|
||||
</html>
|
459
space-old/index.json
Normal file
459
space-old/index.json
Normal file
|
@ -0,0 +1,459 @@
|
|||
{
|
||||
"spaceobj": [
|
||||
{
|
||||
"img": "img/earth.gif",
|
||||
"icon": "fas fa-globe-americas",
|
||||
"name": "Earth"
|
||||
},
|
||||
{
|
||||
"img": "img/moon.gif",
|
||||
"icon": "fas fa-moon",
|
||||
"name": "Moon"
|
||||
},
|
||||
{
|
||||
"img": "img/sun.gif",
|
||||
"icon": "fas fa-sun",
|
||||
"name": "Sun"
|
||||
},
|
||||
{
|
||||
"img": "img/mars.gif",
|
||||
"icon": "fa-solid fa-earth-europe",
|
||||
"name": "Mars"
|
||||
},
|
||||
{
|
||||
"img": "data:image/gif;base64,R0lGODlhAQABAIABAAAAAP///yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",
|
||||
"icon": "fa-regular fa-circle-xmark",
|
||||
"name": "Space"
|
||||
}
|
||||
],
|
||||
"menu": [
|
||||
{
|
||||
"id": "about",
|
||||
"icon": "fa-solid fa-user"
|
||||
},
|
||||
{
|
||||
"id": "code",
|
||||
"icon": "fa-solid fa-code"
|
||||
},
|
||||
{
|
||||
"id": "selfhosted",
|
||||
"icon": "fa-solid fa-cube"
|
||||
}
|
||||
],
|
||||
"about": [
|
||||
{
|
||||
"icon": "fa-solid fa-calendar-days",
|
||||
"content": "Birthday: July, 2009 (<span id=\"age-js\"></span>)"
|
||||
},
|
||||
{
|
||||
"icon": "fa-solid fa-location-dot",
|
||||
"content": "Russia, Ulyanovsk"
|
||||
},
|
||||
{
|
||||
"icon": "fa-solid fa-headphones",
|
||||
"content": "One Direction<br>Linkin Park<br>Imagine Dragons<br>Pizza"
|
||||
},
|
||||
{
|
||||
"icon": "fa-solid fa-desktop",
|
||||
"content": "Manjaro KDE",
|
||||
"expand": {
|
||||
"id": 1,
|
||||
"code": "<pre id=\"inxi\"></pre>"
|
||||
}
|
||||
}
|
||||
],
|
||||
"profiles": [
|
||||
{
|
||||
"icon": "fa-brands fa-github",
|
||||
"url": "https://github.com/DarkCat09",
|
||||
"name": "GitHub",
|
||||
"user": "DarkCat09"
|
||||
},
|
||||
{
|
||||
"icon": "fa-brands fa-git-alt",
|
||||
"url": "https://codeberg.org/DarkCat09",
|
||||
"name": "Codeberg",
|
||||
"user": "DarkCat09"
|
||||
},
|
||||
{
|
||||
"icon": "fa-solid fa-envelope",
|
||||
"url": "mailto:a.chehckenev@yandex.ru",
|
||||
"name": "E-mail",
|
||||
"user": "a.chechkenev",
|
||||
"copy": "a.chechkenev@yandex.ru"
|
||||
},
|
||||
{
|
||||
"icon": "fa-brands fa-telegram",
|
||||
"url": "https://t.me/darkcat09",
|
||||
"name": "Telegram",
|
||||
"user": "@darkcat09"
|
||||
},
|
||||
{
|
||||
"icon": "fa-solid fa-4",
|
||||
"url": "https://4pda.to/forum/index.php?showuser=8898436",
|
||||
"name": "4PDA",
|
||||
"user": "8898436"
|
||||
},
|
||||
{
|
||||
"icon": "fa-brands fa-discord",
|
||||
"url": "https://discord.com/app",
|
||||
"name": "Discord",
|
||||
"user": "DarkCat09#5587",
|
||||
"copy": "DarkCat09#5587"
|
||||
}
|
||||
],
|
||||
"langs": [
|
||||
{
|
||||
"icon": "fa-brands fa-python",
|
||||
"name": "Python",
|
||||
"id1": "py",
|
||||
"id2": "python",
|
||||
"skills": [
|
||||
"Basics",
|
||||
"OOP",
|
||||
"PEP8, MyPy",
|
||||
"Unpacking, filter/map",
|
||||
"List/dict comprehension",
|
||||
"Flask",
|
||||
"PyPI packaging",
|
||||
"Unittests",
|
||||
"MkDocs",
|
||||
"Lots of modules"
|
||||
],
|
||||
"projects": [
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/python-aternos",
|
||||
"name": "python-aternos",
|
||||
"stars": 51
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/python-scripts",
|
||||
"name": "python-scripts",
|
||||
"stars": 5
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/showdialog",
|
||||
"name": "showdialog",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/randomus",
|
||||
"name": "randomus",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/knigavuhe",
|
||||
"name": "knigavuhe",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://gist.github.com/DarkCat09/1e2d1c79d038392adab5280d79626eab",
|
||||
"name": "discord bots",
|
||||
"stars": 1
|
||||
},
|
||||
{
|
||||
"url": "https://gist.github.com/DarkCat09/b53a72d94786aed696372e889a3b7885",
|
||||
"name": "bb pixel art",
|
||||
"stars": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"icon": "fa-brands fa-html5",
|
||||
"name": "HTML & CSS",
|
||||
"id1": "css",
|
||||
"id2": "css",
|
||||
"skills": [
|
||||
"<img src=\"https://lesscss.org/public/img/less_logo.png\" alt=\"{less}\">",
|
||||
"Handlebars",
|
||||
"HTML, CSS basics",
|
||||
"Forms, inputs",
|
||||
"Animations",
|
||||
"Flexboxes",
|
||||
"Grid (learning)"
|
||||
],
|
||||
"projects": [
|
||||
{
|
||||
"url": "https://codeberg.org/DarkCat09/pages-src",
|
||||
"name": "this page",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/cmdsminew",
|
||||
"name": "cmdsmine",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/monolight",
|
||||
"name": "monolight",
|
||||
"stars": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"icon": "fa-brands fa-square-js",
|
||||
"name": "JavaScript",
|
||||
"id1": "js",
|
||||
"id2": "js",
|
||||
"skills": [
|
||||
"Basics",
|
||||
"Loops, conditions",
|
||||
"Sort, filter, etc.",
|
||||
"Arrow expresions",
|
||||
"Destructuring",
|
||||
"Promises, async/await",
|
||||
"DOM, Event Handlers",
|
||||
"2D Canvas",
|
||||
"Handlebars",
|
||||
"OOP (learning)",
|
||||
"NodeJS & NPM (learning)"
|
||||
],
|
||||
"projects": [
|
||||
{
|
||||
"url": "https://codeberg.org/DarkCat09/pages-src",
|
||||
"name": "this page",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://codeberg.org/DarkCat09/pages-src/src/branch/main/dc09.js",
|
||||
"name": "build script (nodejs)",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/monolight",
|
||||
"name": "monolight",
|
||||
"stars": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"svg": true,
|
||||
"icon": "svg/kotlin.svg",
|
||||
"name": "Kotlin",
|
||||
"id1": "kt",
|
||||
"id2": "kotlin",
|
||||
"skills": [
|
||||
"(currently learning)",
|
||||
"Basics",
|
||||
"If, when",
|
||||
"Loops, ranges",
|
||||
"Lists, Maps",
|
||||
"OOP, data classes",
|
||||
"Lambdas, Vararg",
|
||||
"Null safety operators",
|
||||
"Android development"
|
||||
],
|
||||
"projects": [
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/helloapp",
|
||||
"name": "helloapp",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/replace-input",
|
||||
"name": "replace-input",
|
||||
"stars": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"icon": "fa-solid fa-hashtag",
|
||||
"name": "CSharp",
|
||||
"id1": "cs",
|
||||
"id2": "csharp",
|
||||
"skills": [
|
||||
"Syntax",
|
||||
"Loops, conditions",
|
||||
"WinForms",
|
||||
"MySql.Data",
|
||||
"Tuples, destructuring",
|
||||
"Null safety operators"
|
||||
],
|
||||
"projects": [
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/dumptool",
|
||||
"name": "windows dump tool",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/AchSmartHome",
|
||||
"name": "AchSmartHome",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/RecurseWinFormsTest",
|
||||
"name": "recursion example",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/Tariffs",
|
||||
"name": "tariffs",
|
||||
"stars": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"icon": "fa-brands fa-windows",
|
||||
"name": "VBScript",
|
||||
"id1": "vbs",
|
||||
"id2": "vbs",
|
||||
"skills": [
|
||||
"Syntax",
|
||||
"Arrays",
|
||||
"Loops, conditions",
|
||||
"Message boxes",
|
||||
"WScript.Shell",
|
||||
"FileSystemObject",
|
||||
"Registry Editing"
|
||||
],
|
||||
"projects": [
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/vbscripting",
|
||||
"name": "vbscripting",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/vbs-season-wallpaper",
|
||||
"name": "season-wallpaper",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://gist.github.com/DarkCat09/6b7226dc5afea2f4b5c8f6407e323a65",
|
||||
"name": "add-to-startup",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://gist.github.com/DarkCat09/5f12095cbef4d299f2b8124410ca3e48",
|
||||
"name": "winrestart",
|
||||
"stars": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"icon": "fa-solid fa-terminal",
|
||||
"name": "Bash",
|
||||
"id1": "bash",
|
||||
"id2": "bash",
|
||||
"skills": [
|
||||
"Basics",
|
||||
"Loops and conditions",
|
||||
"Functions",
|
||||
"Crontab",
|
||||
"Some escape codes",
|
||||
"Arrays (learning)"
|
||||
],
|
||||
"projects": [
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/saveyoureyes",
|
||||
"name": "save-your-eyes",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://gist.github.com/DarkCat09/cba140c921a5bed7f042e157b2319808",
|
||||
"name": "1compiler api",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://gist.github.com/DarkCat09/29e4628664dc53666f0b6242395aeab8",
|
||||
"name": "bashrc",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://gist.github.com/DarkCat09/eb40c544a4a722bb3a62d23e8ad418cb",
|
||||
"name": "floating window",
|
||||
"stars": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"icon": "fa-brands fa-java",
|
||||
"name": "Java",
|
||||
"id1": "java",
|
||||
"id2": "java",
|
||||
"skills": [
|
||||
"Syntax",
|
||||
"Loops, conditions",
|
||||
"Lists, HashMap",
|
||||
"JavaFX + SceneBuilder",
|
||||
"Android development"
|
||||
],
|
||||
"projects": [
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/blockapp",
|
||||
"name": "blockapp",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://gist.github.com/DarkCat09/ce7286f7acca79177b440bae9251e819",
|
||||
"name": "magic substring",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/mtkfwtools",
|
||||
"name": "mtkfwtools",
|
||||
"stars": 0
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/virustotal-gui-fx",
|
||||
"name": "virustotal-gui-fx",
|
||||
"stars": 0
|
||||
}
|
||||
]
|
||||
},{
|
||||
"icon": "fa-brands fa-php",
|
||||
"name": "PHP",
|
||||
"id1": "php",
|
||||
"id2": "php",
|
||||
"skills": [
|
||||
"Variables",
|
||||
"Arrays",
|
||||
"Conditions, loops",
|
||||
"Headers",
|
||||
"Drawing images",
|
||||
"MySQLi",
|
||||
"Bcrypt"
|
||||
],
|
||||
"projects": [
|
||||
{
|
||||
"url": "https://github.com/DarkCat09/englearn",
|
||||
"name": "englearn",
|
||||
"stars": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"icon": "fa-brands fa-android",
|
||||
"name": "Smali",
|
||||
"id1": "smali",
|
||||
"id2": "smali",
|
||||
"skills": [
|
||||
"Main syntax",
|
||||
"Can read non-obfuscated code",
|
||||
"Can change simple code"
|
||||
],
|
||||
"projects": []
|
||||
}
|
||||
],
|
||||
"selfhosted": [
|
||||
{
|
||||
"icon": "fa-solid fa-house",
|
||||
"domain": "dc09.ru"
|
||||
},
|
||||
{
|
||||
"icon": "fa-brands fa-git-alt",
|
||||
"domain": "git.dc09.ru"
|
||||
},
|
||||
{
|
||||
"icon": "fa-solid fa-link",
|
||||
"domain": "url.dc09.ru"
|
||||
},
|
||||
{
|
||||
"icon": "fa-solid fa-address-book",
|
||||
"domain": "sync.dc09.ru"
|
||||
},
|
||||
{
|
||||
"icon": "fa-brands fa-wikipedia-w",
|
||||
"domain": "wt.dc09.ru"
|
||||
}
|
||||
]
|
||||
}
|
56
space-old/inxi.txt
Normal file
56
space-old/inxi.txt
Normal file
|
@ -0,0 +1,56 @@
|
|||
System:
|
||||
Kernel: 6.1.12-1-MANJARO arch: x86_64 bits: 64 compiler: gcc v: 12.2.1
|
||||
Desktop: KDE Plasma v: 5.26.5 Distro: Manjaro Linux base: Arch Linux
|
||||
Machine:
|
||||
Type: Desktop System: ASUS product: N/A v: N/A serial: N/A
|
||||
Mobo: ASUSTeK model: PRIME H510M-A v: Rev 1.xx serial: <filter>
|
||||
UEFI: American Megatrends v: 1203 date: 10/25/2021
|
||||
CPU:
|
||||
Info: 6-core model: Intel Core i5-10400 bits: 64 type: MT MCP
|
||||
arch: Comet Lake rev: 3 cache: L1: 384 KiB L2: 1.5 MiB L3: 12 MiB
|
||||
Speed (MHz): avg: 2200 high: 2900 min/max: 800/4300 cores: 1: 2900 2: 2900
|
||||
3: 800 4: 800 5: 2900 6: 800 7: 2900 8: 800 9: 2900 10: 2900 11: 2900
|
||||
12: 2900 bogomips: 69629
|
||||
Flags: avx avx2 ht lm nx pae sse sse2 sse3 sse4_1 sse4_2 ssse3 vmx
|
||||
Graphics:
|
||||
Device-1: Intel CometLake-S GT2 [UHD Graphics 630] vendor: ASUSTeK
|
||||
driver: i915 v: kernel arch: Gen-9.5 bus-ID: 00:02.0
|
||||
Display: x11 server: X.Org v: 21.1.7 driver: X: loaded: modesetting
|
||||
dri: iris gpu: i915 resolution: 1920x1080
|
||||
API: OpenGL v: 4.6 Mesa 22.3.5 renderer: Mesa Intel UHD Graphics 630 (CML
|
||||
GT2) direct-render: Yes
|
||||
Audio:
|
||||
Device-1: Intel vendor: ASUSTeK driver: snd_hda_intel v: kernel
|
||||
bus-ID: 00:1f.3
|
||||
Sound API: ALSA v: k6.1.12-1-MANJARO running: yes
|
||||
Sound Server-1: JACK v: 1.9.22 running: no
|
||||
Sound Server-2: PulseAudio v: 16.1 running: yes
|
||||
Sound Server-3: PipeWire v: 0.3.65 running: yes
|
||||
Network:
|
||||
Device-1: Intel Ethernet I219-V vendor: ASUSTeK driver: e1000e v: kernel
|
||||
port: N/A bus-ID: 00:1f.6
|
||||
IF: eno1 state: up speed: 100 Mbps duplex: full mac: <filter>
|
||||
Device-2: Realtek RTL8188EE Wireless Network Adapter driver: rtl8188ee
|
||||
v: kernel port: 3000 bus-ID: 02:00.0
|
||||
IF: wlp2s0 state: down mac: <filter>
|
||||
Drives:
|
||||
Local Storage: total: 1.36 TiB used: 176.14 GiB (12.6%)
|
||||
ID-1: /dev/nvme0n1 vendor: Western Digital model: WD Blue SN570 500GB
|
||||
size: 465.76 GiB temp: 33.9 C
|
||||
ID-2: /dev/sda vendor: Western Digital model: WD10EZEX-00BBHA0
|
||||
size: 931.51 GiB
|
||||
Partition:
|
||||
ID-1: / size: 423.37 GiB used: 176.14 GiB (41.6%) fs: ext4
|
||||
dev: /dev/nvme0n1p2
|
||||
ID-2: /boot/efi size: 299.4 MiB used: 288 KiB (0.1%) fs: vfat
|
||||
dev: /dev/nvme0n1p1
|
||||
Swap:
|
||||
ID-1: swap-1 type: partition size: 34.26 GiB used: 0 KiB (0.0%)
|
||||
dev: /dev/nvme0n1p3
|
||||
Sensors:
|
||||
System Temperatures: cpu: 26.0 C mobo: N/A
|
||||
Fan Speeds (RPM): N/A
|
||||
Info:
|
||||
Processes: 279 Uptime: 2h 12m Memory: 30.21 GiB used: 4.4 GiB (14.6%)
|
||||
Init: systemd Compilers: gcc: 12.2.1 clang: 15.0.7 Packages: 1642 Shell: Zsh
|
||||
v: 5.9 inxi: 3.3.25
|
22
space-old/js/anim.js
Normal file
22
space-old/js/anim.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
const fadeAnimIn = [
|
||||
'show',
|
||||
'animated',
|
||||
'tdFadeIn',
|
||||
]
|
||||
|
||||
const fadeAnimOut = [
|
||||
'animated',
|
||||
'tdFadeOut',
|
||||
]
|
||||
|
||||
|
||||
const bounceAnimIn = [
|
||||
'show',
|
||||
'animated',
|
||||
'tdExpandInBounce',
|
||||
]
|
||||
|
||||
const bounceAnimOut = [
|
||||
'animated',
|
||||
'tdShrinkOutBounce',
|
||||
]
|
19
space-old/js/control.js
Normal file
19
space-old/js/control.js
Normal file
|
@ -0,0 +1,19 @@
|
|||
/** @type {HTMLImageElement} */
|
||||
const spaceObj = document.querySelector('#space-obj')
|
||||
|
||||
/** @type {HTMLDivElement} */
|
||||
const space = document.querySelector('.space')
|
||||
|
||||
|
||||
function changePicture(/** @type {Event} */ ev) {
|
||||
spaceObj.src = ev.target.dataset.img || 'img/earth.gif'
|
||||
hideContextMenu()
|
||||
}
|
||||
|
||||
function changeSpeed(/** @type {Event} */ ev) {
|
||||
spaceObj.style.animationDuration = `${1200 - ev.target.value}s`
|
||||
}
|
||||
|
||||
function landToEarth() {
|
||||
hideContextMenu()
|
||||
}
|
23
space-old/js/handlers.js
Normal file
23
space-old/js/handlers.js
Normal file
|
@ -0,0 +1,23 @@
|
|||
context.addEventListener('mousedown', ev => ev.stopPropagation())
|
||||
|
||||
space.addEventListener('mousedown', ev => ev.preventDefault())
|
||||
space.addEventListener('contextmenu', contextMenu)
|
||||
|
||||
document.querySelectorAll('.copylink>.profile-link').forEach(
|
||||
elem => elem.addEventListener('click', copyLink)
|
||||
)
|
||||
|
||||
document.querySelectorAll('li.change-img>.li-wrapper').forEach(
|
||||
elem => elem.addEventListener('click', changePicture)
|
||||
)
|
||||
|
||||
document.querySelector('li.change-speed input').addEventListener('input', changeSpeed)
|
||||
document.querySelector('li.change-speed input').addEventListener('mousedown', ev => ev.stopPropagation())
|
||||
document.querySelector('li.land-to').addEventListener('click', landToEarth)
|
||||
|
||||
move.addEventListener('mousedown', moveMenu)
|
||||
move.addEventListener('mouseup', moveMenu)
|
||||
move.addEventListener('mousemove', moveMenu)
|
||||
body.addEventListener('mousemove', moveMenu)
|
||||
body.addEventListener('mouseup', moveMenu)
|
||||
body.addEventListener('mousedown', hideContextMenu)
|
86
space-old/js/init.js
Normal file
86
space-old/js/init.js
Normal file
|
@ -0,0 +1,86 @@
|
|||
function init() {
|
||||
initStars()
|
||||
computeAge()
|
||||
insertSystemInfo()
|
||||
}
|
||||
|
||||
function initStars() {
|
||||
|
||||
const colors = [
|
||||
'#999','#9999ac','#ac9999','#acac99',
|
||||
'#bbb','#bbbbcf','#cfbbbb','#cfcfbb',
|
||||
'#eee','#e5e5ff','#ffe5e5','#ffffe5',
|
||||
'#fff'
|
||||
]
|
||||
const len = colors.length
|
||||
|
||||
const canvas = document.getElementById('stars')
|
||||
const css = getComputedStyle(canvas)
|
||||
|
||||
const w = canvas.width = styleValue(css.getPropertyValue('width'))
|
||||
const h = canvas.height = styleValue(css.getPropertyValue('height'))
|
||||
|
||||
// if CSS hasn't been loaded yet
|
||||
// (w and h contains NaN)
|
||||
const err = [w,h].some(n => isNaN(n))
|
||||
if (err) {
|
||||
setTimeout(init, 200)
|
||||
return
|
||||
}
|
||||
|
||||
const ctx = canvas.getContext('2d')
|
||||
const radius = 3
|
||||
const circle = 2 * Math.PI
|
||||
|
||||
ctx.clearRect(0, 0, w, h)
|
||||
for (let star = 0; star < 200; star++) {
|
||||
|
||||
let color = Math.floor(Math.random() * len)
|
||||
ctx.fillStyle = colors[color]
|
||||
|
||||
ctx.beginPath()
|
||||
ctx.arc(
|
||||
Math.round(Math.random() * w),
|
||||
Math.round(Math.random() * h),
|
||||
radius, 0, circle, false
|
||||
)
|
||||
ctx.fill()
|
||||
}
|
||||
}
|
||||
|
||||
function computeAge() {
|
||||
|
||||
const birthday = new Date(2009, 7, 13, 12, 30)
|
||||
const timedelta = Date.now() - birthday.getTime()
|
||||
|
||||
/*
|
||||
The line below is equivalent to:
|
||||
const age = timedelta / 1000 / 60 / 60 / 24 / 365.25
|
||||
where:
|
||||
1000: convert milliseconds -> seconds
|
||||
60: secs -> minutes
|
||||
60: minutes -> hours
|
||||
24: hours -> days
|
||||
365.25: average count of days in a year:
|
||||
(366 + (365 * 3)) / 4 = 365.25
|
||||
*/
|
||||
const age = timedelta / (1000 * 60 * 60 * 24 * 365.25)
|
||||
|
||||
document.getElementById('age-js').textContent = Math.floor(age)
|
||||
}
|
||||
|
||||
function insertSystemInfo() {
|
||||
|
||||
const inxi = document.getElementById('inxi')
|
||||
|
||||
let xhr = new XMLHttpRequest()
|
||||
xhr.open('GET', '/space/inxi.txt')
|
||||
|
||||
xhr.onreadystatechange = () => {
|
||||
if (xhr.readyState != xhr.DONE) return
|
||||
if (xhr.status != 200) return
|
||||
inxi.textContent = xhr.response
|
||||
}
|
||||
|
||||
xhr.send()
|
||||
}
|
76
space-old/js/menu.js
Normal file
76
space-old/js/menu.js
Normal file
|
@ -0,0 +1,76 @@
|
|||
/** @type {HTMLDivElement} */
|
||||
const menu = document.querySelector('.about-menu')
|
||||
|
||||
/** @type {HTMLLIElement} */
|
||||
const move = document.querySelector('.about-menu li#move')
|
||||
|
||||
/** @type {HTMLDivElement} */
|
||||
const context = document.querySelector('.context-menu')
|
||||
|
||||
|
||||
var contextShown = false
|
||||
var contextTimeout
|
||||
|
||||
var menuDragging = false
|
||||
var mousePos = {x: 0, y: 0}
|
||||
|
||||
|
||||
function moveMenu(/** @type {MouseEvent} */ ev) {
|
||||
switch (ev.type) {
|
||||
|
||||
case 'mousedown':
|
||||
menuDragging = true
|
||||
mousePos.y = ev.clientY - styleValue(menu.style.top)
|
||||
mousePos.x = ev.clientX - styleValue(menu.style.left)
|
||||
menu.classList.add('dragging')
|
||||
ev.preventDefault()
|
||||
break
|
||||
|
||||
case 'mouseup':
|
||||
menuDragging = false
|
||||
menu.classList.remove('dragging')
|
||||
break
|
||||
|
||||
case 'mousemove':
|
||||
if (menuDragging) {
|
||||
let top = ev.clientY - mousePos.y
|
||||
let left = ev.clientX - mousePos.x
|
||||
menu.style.top = `${top}px`
|
||||
menu.style.left = `${left}px`
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
function contextMenu(/** @type {MouseEvent} */ ev) {
|
||||
|
||||
clearTimeout(contextTimeout)
|
||||
context.classList.remove(...bounceAnimOut)
|
||||
|
||||
context.style.top = `${ev.clientY + 5}px`
|
||||
context.style.left = `${ev.clientX + 5}px`
|
||||
|
||||
context.classList.add(...bounceAnimIn)
|
||||
contextShown = true
|
||||
|
||||
ev.preventDefault()
|
||||
return false
|
||||
}
|
||||
|
||||
function hideContextMenu(/** @type {MouseEvent} */ ev) {
|
||||
|
||||
if (!contextShown) return
|
||||
if (ev && ev.button != 0) return
|
||||
|
||||
context.classList.remove(...bounceAnimIn)
|
||||
|
||||
context.classList.add('show')
|
||||
context.classList.add(...bounceAnimOut)
|
||||
contextShown = false
|
||||
|
||||
// animation-duration: 0.6s;
|
||||
contextTimeout = setTimeout(() => {
|
||||
context.classList.remove('show')
|
||||
context.classList.remove(...bounceAnimOut)
|
||||
}, 600)
|
||||
}
|
32
space-old/js/script.js
Normal file
32
space-old/js/script.js
Normal file
|
@ -0,0 +1,32 @@
|
|||
const body = document.body
|
||||
|
||||
function copyLink(/** @type {Event} */ ev) {
|
||||
|
||||
/** @type {HTMLSpanElement} */
|
||||
let elem = ev.currentTarget
|
||||
|
||||
navigator.clipboard.writeText(elem.dataset.link)
|
||||
|
||||
let wrapper = elem.parentElement.parentElement.parentElement
|
||||
let msg = wrapper.querySelector('.copied')
|
||||
|
||||
msg.classList.add(...fadeAnimIn)
|
||||
|
||||
setTimeout(() => {
|
||||
|
||||
msg.classList.remove(...fadeAnimIn)
|
||||
|
||||
msg.classList.add('show')
|
||||
msg.classList.add(...fadeAnimOut)
|
||||
|
||||
setTimeout(() => {
|
||||
msg.classList.remove(...fadeAnimOut)
|
||||
msg.classList.remove(...fadeAnimIn)
|
||||
}, 600)
|
||||
|
||||
}, 1500)
|
||||
}
|
||||
|
||||
function styleValue(/** @type {string} */ prop) {
|
||||
return prop.replace('px', '') * 1
|
||||
}
|
494
space-old/styles.less
Normal file
494
space-old/styles.less
Normal file
|
@ -0,0 +1,494 @@
|
|||
@spacebg: #000015;
|
||||
@menubg: rgba(0,0,0,0.65);
|
||||
@menuhl: lighten(@menubg, 14%);
|
||||
@menusel: lighten(@menubg, 30%);
|
||||
@textfg: #fff;
|
||||
@linkfg: #fff;
|
||||
@linkhl: #b0bfff;
|
||||
@popup: #223;
|
||||
|
||||
body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: @spacebg;
|
||||
color: @textfg;
|
||||
font-family: 'Montserrat', sans-serif;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: @linkfg;
|
||||
}
|
||||
|
||||
.link:hover {
|
||||
cursor: pointer;
|
||||
color: @linkhl;
|
||||
}
|
||||
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
&:target {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.separator {
|
||||
width: 100%;
|
||||
height: 0;
|
||||
border-top: 1px solid #aaa;
|
||||
}
|
||||
|
||||
.row-fill {
|
||||
flex-grow: 1;
|
||||
background: @menubg;
|
||||
}
|
||||
|
||||
|
||||
.menu {
|
||||
|
||||
position: absolute;
|
||||
z-index: 999;
|
||||
border-radius: 5px;
|
||||
|
||||
ul {
|
||||
background-color: @menubg;
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
li, li label {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.top-menu {
|
||||
border-radius: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.about-menu {
|
||||
|
||||
top: 15px;
|
||||
left: 15px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
z-index: 998;
|
||||
|
||||
transition: opacity 0.32s ease 0s;
|
||||
&.dragging {
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.top-menu {
|
||||
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
|
||||
ul {
|
||||
&:nth-child(1) {
|
||||
border-top-left-radius: 5px;
|
||||
border-bottom-left-radius: 5px;
|
||||
}
|
||||
&:nth-last-child(1) {
|
||||
border-top-right-radius: 5px;
|
||||
border-bottom-right-radius: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ul.section {
|
||||
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
li {
|
||||
display: block;
|
||||
label {
|
||||
display: block;
|
||||
border-radius: 5px;
|
||||
a {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 10px;
|
||||
width: 1.3rem;
|
||||
font-size: 1.2rem;
|
||||
border-radius: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#move, #move label, #move a {
|
||||
cursor: move !important;
|
||||
}
|
||||
|
||||
input[type=radio] {
|
||||
display: none;
|
||||
}
|
||||
input[type=radio]:checked ~ label {
|
||||
background-color: @menusel;
|
||||
}
|
||||
|
||||
label:hover {
|
||||
background-color: @menuhl;
|
||||
}
|
||||
}
|
||||
|
||||
.card {
|
||||
|
||||
background-color: @menubg;
|
||||
border-radius: 5px;
|
||||
margin-top: 5px;
|
||||
padding: 5px;
|
||||
|
||||
.title {
|
||||
font-size: 1.8rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
&.profiles {
|
||||
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
& > div {
|
||||
|
||||
position: relative;
|
||||
|
||||
align-items: center;
|
||||
border-radius: 5px;
|
||||
padding: 5px;
|
||||
|
||||
&:hover {
|
||||
background-color: @menuhl;
|
||||
}
|
||||
|
||||
.content {
|
||||
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
a.name {
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.copylink {
|
||||
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-left: 6px;
|
||||
|
||||
.link {
|
||||
display: block;
|
||||
padding: 4px;
|
||||
padding-right: 5px;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.icon {
|
||||
width: 1.5rem !important;
|
||||
font-size: 1.25rem !important;
|
||||
}
|
||||
|
||||
.inline-popup {
|
||||
|
||||
display: none;
|
||||
|
||||
position: absolute;
|
||||
left: 100%;
|
||||
margin-left: 10px;
|
||||
|
||||
cursor: default;
|
||||
font-size: 0.85rem;
|
||||
padding: 3px 6px;
|
||||
background: @popup;
|
||||
border-radius: 5px;
|
||||
|
||||
box-shadow: 0 0 15px #000;
|
||||
|
||||
animation-duration: 0.6s;
|
||||
|
||||
&.show {
|
||||
display: flex !important;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
&.right::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
width: 0.5rem;
|
||||
height: 0.5rem;
|
||||
rotate: z 45deg;
|
||||
left: -0.25rem;
|
||||
background: @popup;
|
||||
z-index: -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
& > div:not(.title) {
|
||||
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-top: 5px;
|
||||
gap: 10px;
|
||||
|
||||
.content {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
&.about-card {
|
||||
.icon {
|
||||
margin-left: 2px;
|
||||
}
|
||||
}
|
||||
|
||||
.icon {
|
||||
|
||||
width: 1.1rem;
|
||||
margin-top: 1px;
|
||||
font-size: 1rem;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
|
||||
i {
|
||||
width: 1.1rem;
|
||||
text-align: center;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
img {
|
||||
width: 1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#code {
|
||||
|
||||
.card {
|
||||
|
||||
& > div {
|
||||
margin-top: 0;
|
||||
padding: 4px 3px;
|
||||
}
|
||||
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
gap: 15px;
|
||||
}
|
||||
|
||||
.details {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.lang-wrapper {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.lang-skills {
|
||||
|
||||
ol {
|
||||
|
||||
list-style: disc;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
img {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: block;
|
||||
height: 1.16rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.projects:not(:empty) {
|
||||
|
||||
border: 2px solid shade(@linkhl, 40%);
|
||||
border-radius: 5px;
|
||||
|
||||
.repo {
|
||||
|
||||
display: grid;
|
||||
grid-template-columns: 6fr repeat(2, 1fr);
|
||||
grid-column-gap: 5px;
|
||||
|
||||
border-radius: 5px;
|
||||
padding: 5px;
|
||||
|
||||
&:hover {
|
||||
background-color: @menuhl;
|
||||
}
|
||||
|
||||
a {
|
||||
padding-right: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#selfhosted {
|
||||
|
||||
.card {
|
||||
|
||||
& > div {
|
||||
|
||||
margin-top: 0;
|
||||
padding: 5px;
|
||||
border-radius: 5px;
|
||||
|
||||
a {
|
||||
display: block;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: @menuhl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.context-menu {
|
||||
|
||||
display: none;
|
||||
animation-duration: 0.6s;
|
||||
|
||||
&.show {
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
ul {
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
li {
|
||||
|
||||
padding: 7px;
|
||||
border-radius: 5px;
|
||||
|
||||
&:hover {
|
||||
background-color: @menuhl;
|
||||
}
|
||||
|
||||
.li-wrapper {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.icon {
|
||||
|
||||
width: 1.2rem;
|
||||
margin-top: 1px;
|
||||
font-size: 1.1rem;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
|
||||
i {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.expand-wrapper {
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: end;
|
||||
|
||||
.expand {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
input[type=checkbox] {
|
||||
|
||||
display: none;
|
||||
|
||||
&:checked ~ .hidden {
|
||||
display: block;
|
||||
}
|
||||
|
||||
& ~ label > i {
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
&:checked ~ label > i {
|
||||
rotate: z 180deg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.space {
|
||||
|
||||
position: fixed;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 997;
|
||||
|
||||
#stars {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: -1;
|
||||
filter: blur(2px);
|
||||
}
|
||||
|
||||
img {
|
||||
width: auto;
|
||||
max-width: 100%;
|
||||
z-index: 0;
|
||||
animation: rotate 480s linear 0s infinite normal;
|
||||
user-select: none;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes rotate {
|
||||
0% { transform: rotate(0deg); }
|
||||
100% { transform: rotate(360deg); }
|
||||
}
|
11
space-old/svg/kotlin.svg
Normal file
11
space-old/svg/kotlin.svg
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.1.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 500 500" style="enable-background:new 0 0 500 500;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#FFFFFF;}
|
||||
</style>
|
||||
<g id="Logotypes">
|
||||
<polygon class="st0" points="500,500 0,500 0,0 500,0 250,250 "/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 501 B |
18
space-old/webpage.json
Normal file
18
space-old/webpage.json
Normal file
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"html": [],
|
||||
"hb": ["index.hbs"],
|
||||
"less": ["styles.less"],
|
||||
"css": [],
|
||||
"js": [
|
||||
"js/anim.js",
|
||||
"js/script.js",
|
||||
"js/init.js",
|
||||
"js/menu.js",
|
||||
"js/control.js",
|
||||
"js/handlers.js"
|
||||
],
|
||||
"other": [
|
||||
"img/", "svg/", "fontawesome/",
|
||||
"inxi.txt"
|
||||
]
|
||||
}
|
Loading…
Add table
Reference in a new issue