oof
1
.gitignore
vendored
@ -1,4 +1,5 @@
|
||||
node_modules/
|
||||
logs/
|
||||
config.json
|
||||
public/b/*
|
||||
public/t/*
|
||||
|
160
package-lock.json
generated
@ -4,19 +4,66 @@
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@types/geojson": {
|
||||
"version": "7946.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz",
|
||||
"integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ=="
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "13.9.8",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.8.tgz",
|
||||
"integrity": "sha512-1WgO8hsyHynlx7nhP1kr0OFzsgKz5XDQL+Lfc3b1Q3qIln/n8cKD4m09NJ0+P1Rq7Zgnc7N0+SsMnoD1rEb0kA=="
|
||||
},
|
||||
"amdefine": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
|
||||
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
|
||||
},
|
||||
"async": {
|
||||
"version": "0.2.10",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
|
||||
"integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E="
|
||||
},
|
||||
"camelcase": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
|
||||
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
|
||||
},
|
||||
"cuffeo": {
|
||||
"version": "git+https://gitfap.de/keinBot/cuffeo.git#d55586ce5520d4119fa0900ef15ce8736fc62364",
|
||||
"from": "git+https://gitfap.de/keinBot/cuffeo.git"
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cuffeo/-/cuffeo-1.0.6.tgz",
|
||||
"integrity": "sha512-TdrkkDM4uR/iTEtazfxbmLUXoNB3NLC/RMgpWVUQC8j2uOiaLl7U7agdLdxfJq4uEt56cJUftqH9Tb3BofslNg==",
|
||||
"requires": {
|
||||
"flumm-fetch-cookies": "^1.3.5"
|
||||
}
|
||||
},
|
||||
"decamelize": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
|
||||
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
|
||||
},
|
||||
"denque": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz",
|
||||
"integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
|
||||
},
|
||||
"flumm-fetch": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/flumm-fetch/-/flumm-fetch-1.0.1.tgz",
|
||||
"integrity": "sha512-pZ5U0hheCSW43vfGZQMunr03U7rUOX+iy2y13Tu4nc3iRL+E/Qfeo5nZ2B2JMYKOGIx1A1anUYOz+ulyhouyjg=="
|
||||
},
|
||||
"flumm-fetch-cookies": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/flumm-fetch-cookies/-/flumm-fetch-cookies-1.3.5.tgz",
|
||||
"integrity": "sha512-jFLVgwD2eV2jvlbil1E+2dPeR6s07BdXJ1xRRAoq9OU87fALXbKGBa3vZO0zaWyVXEukgE0z/cMoyFsNNZUdTQ==",
|
||||
"requires": {
|
||||
"flumm-fetch": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.24",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
||||
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
|
||||
"version": "0.5.1",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.1.tgz",
|
||||
"integrity": "sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q==",
|
||||
"requires": {
|
||||
"safer-buffer": ">= 2.1.2 < 3"
|
||||
}
|
||||
@ -27,19 +74,110 @@
|
||||
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
|
||||
},
|
||||
"mariadb": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/mariadb/-/mariadb-2.0.3.tgz",
|
||||
"integrity": "sha512-/0poOq++rcAWrSHdS+ozLDbK+/ZOpQ2XHYoVHXeZtMuhxEH/w7g/KfwryCqr3BCIC0JC/9UeJJG3v7vNNlshag==",
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/mariadb/-/mariadb-2.3.1.tgz",
|
||||
"integrity": "sha512-suv+ygoiS+tQSKmxgzJsGV9R+USN8g6Ql+GuMo9k7alD6FxOT/lwebLHy63/7yPZfVtlyAitK1tPd7ZoFhN/Sg==",
|
||||
"requires": {
|
||||
"denque": "^1.4.0",
|
||||
"iconv-lite": "^0.4.24",
|
||||
"long": "^4.0.0"
|
||||
"@types/geojson": "^7946.0.7",
|
||||
"@types/node": ">=8.0.0",
|
||||
"denque": "^1.4.1",
|
||||
"iconv-lite": "^0.5.1",
|
||||
"long": "^4.0.0",
|
||||
"moment-timezone": "^0.5.27"
|
||||
}
|
||||
},
|
||||
"minimist": {
|
||||
"version": "0.0.10",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
|
||||
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
|
||||
},
|
||||
"moment": {
|
||||
"version": "2.24.0",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
|
||||
"integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
|
||||
},
|
||||
"moment-timezone": {
|
||||
"version": "0.5.28",
|
||||
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.28.tgz",
|
||||
"integrity": "sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw==",
|
||||
"requires": {
|
||||
"moment": ">= 2.9.0"
|
||||
}
|
||||
},
|
||||
"optimist": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
|
||||
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
|
||||
"requires": {
|
||||
"minimist": "~0.0.1",
|
||||
"wordwrap": "~0.0.2"
|
||||
}
|
||||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||
},
|
||||
"source-map": {
|
||||
"version": "0.1.34",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz",
|
||||
"integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=",
|
||||
"requires": {
|
||||
"amdefine": ">=0.0.4"
|
||||
}
|
||||
},
|
||||
"swig": {
|
||||
"version": "1.4.2",
|
||||
"resolved": "https://registry.npmjs.org/swig/-/swig-1.4.2.tgz",
|
||||
"integrity": "sha1-QIXKBFM2kQS11IPihBs5t64aq6U=",
|
||||
"requires": {
|
||||
"optimist": "~0.6",
|
||||
"uglify-js": "~2.4"
|
||||
}
|
||||
},
|
||||
"uglify-js": {
|
||||
"version": "2.4.24",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz",
|
||||
"integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=",
|
||||
"requires": {
|
||||
"async": "~0.2.6",
|
||||
"source-map": "0.1.34",
|
||||
"uglify-to-browserify": "~1.0.0",
|
||||
"yargs": "~3.5.4"
|
||||
}
|
||||
},
|
||||
"uglify-to-browserify": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
|
||||
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc="
|
||||
},
|
||||
"window-size": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
|
||||
"integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
|
||||
},
|
||||
"wordwrap": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
|
||||
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
|
||||
},
|
||||
"yargs": {
|
||||
"version": "3.5.4",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz",
|
||||
"integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=",
|
||||
"requires": {
|
||||
"camelcase": "^1.0.2",
|
||||
"decamelize": "^1.0.0",
|
||||
"window-size": "0.1.0",
|
||||
"wordwrap": "0.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"wordwrap": {
|
||||
"version": "0.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
|
||||
"integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
10
package.json
@ -4,14 +4,14 @@
|
||||
"description": "f0ck, kennste?",
|
||||
"main": "index.mjs",
|
||||
"scripts": {
|
||||
"start": "npm run minify && node --experimental-modules src/",
|
||||
"debug": "cp public/js/f0ck.js public/js/f0ck.min.js && node --experimental-modules src/",
|
||||
"minify": "/usr/bin/uglifyjs public/js/f0ck.js -c -m --ecma 8 --warn -o public/js/f0ck.min.js"
|
||||
"start": "node --experimental-json-modules --harmony-optional-chaining src/index.mjs"
|
||||
},
|
||||
"author": "Flummi",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cuffeo": "git+https://gitfap.de/keinBot/cuffeo.git",
|
||||
"mariadb": "^2.0.3"
|
||||
"cuffeo": "^1.0.6-1",
|
||||
"flumm-fetch-cookies": "^1.3.5",
|
||||
"mariadb": "^2.3.1",
|
||||
"swig": "^1.4.2"
|
||||
}
|
||||
}
|
||||
|
@ -1,187 +0,0 @@
|
||||
@font-face {
|
||||
font-family: "Cyberfall";
|
||||
src:url(https://f0ck.it/uploads/Cyberfall.otf) format("opentype");
|
||||
src: url("/css/Cyberfall.woff2") format("woff")
|
||||
}
|
||||
|
||||
/*Theming*/
|
||||
:root {
|
||||
--primary-color: #302AE6;
|
||||
--secondary-color: #536390;
|
||||
--font-color: #424242;
|
||||
--bg-color: #090f13;
|
||||
--heading-color: #292922;
|
||||
}
|
||||
|
||||
[data-theme="light"] {
|
||||
--primary-color: #9A97F3;
|
||||
--secondary-color: #818cab;
|
||||
--font-color: #e1e1ff;
|
||||
--bg-color: black;
|
||||
--heading-color: #818cab;
|
||||
}
|
||||
/*End of Theming*/
|
||||
|
||||
html, body {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
background-color: var(--bg-color);
|
||||
color: var(--font-color);
|
||||
}
|
||||
div.pageWrapper {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
grid-template-rows: 0.2fr 2.6fr 0fr;
|
||||
}
|
||||
div#header, div#footer {
|
||||
z-index: 9999;
|
||||
background-color: #292922;
|
||||
}
|
||||
|
||||
#header {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 6fr 1fr;
|
||||
grid-gap: 0;
|
||||
}
|
||||
|
||||
#logoHead {
|
||||
margin: 6px 0 0 4px;
|
||||
padding: 0;
|
||||
font-size: 14px;
|
||||
}
|
||||
#logo {
|
||||
padding: 1px 4px 1px 4px;
|
||||
height: 48px;
|
||||
}
|
||||
#itemInfo {
|
||||
display: none;
|
||||
height: 61px;
|
||||
position: absolute;
|
||||
left: 200px;
|
||||
right: 270px;
|
||||
top: 4px;
|
||||
}
|
||||
#itemInfo div.infoText {
|
||||
margin-top: 3px;
|
||||
}
|
||||
#pagePosition, #itemPosition {
|
||||
position: absolute;
|
||||
right: 8px;
|
||||
top: 6px;
|
||||
padding: 0;
|
||||
color: #7d7b6a;
|
||||
background-color: #333;
|
||||
}
|
||||
#pagePosition span, #itemPosition span {
|
||||
color: #9d9b8a;
|
||||
}
|
||||
/*#pagePosition {
|
||||
display: block;
|
||||
}
|
||||
#itemPosition {
|
||||
display: none;
|
||||
}*/
|
||||
|
||||
div#content {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
div.wrapper {
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div#howtowrapper {
|
||||
overflow: hidden;
|
||||
background-color: rgba(0, 0, 0, 0.9);
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
#itemInfo {
|
||||
position: absolute;
|
||||
background: #191b1b;
|
||||
border-bottom-right-radius: 5px;
|
||||
color: aliceblue;
|
||||
padding: 5px;
|
||||
left: auto;
|
||||
right: auto;
|
||||
top: auto;
|
||||
border-right: 1px solid white;
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
|
||||
#logoHead {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
div#header, div#footer {
|
||||
z-index: 9999;
|
||||
background-color: #23232199;
|
||||
box-shadow: 2px 2px 2px black;
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
|
||||
#itemSource {
|
||||
|
||||
color: #04c33e;
|
||||
position: relative;
|
||||
top: -3px;
|
||||
text-shadow: 1px 1px 1px black;
|
||||
|
||||
}
|
||||
|
||||
#itemInfo {
|
||||
position: unset;
|
||||
background: #191b1b;
|
||||
color: aliceblue;
|
||||
padding: 5px;
|
||||
left: auto;
|
||||
right: auto;
|
||||
top: auto;
|
||||
grid-row-start: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
#itemPosition {
|
||||
display: block;
|
||||
grid-row-start: -1;
|
||||
position: absolute;
|
||||
color: lime;
|
||||
text-shadow: 1px 1px black;
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#itemInfo {
|
||||
position: unset;
|
||||
background: #191b1b;
|
||||
color: aliceblue;
|
||||
padding: 5px;
|
||||
left: auto;
|
||||
right: auto;
|
||||
top: auto;
|
||||
height: auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.infoText {
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
div#itemPosition {
|
||||
font-family: Cyberfall;
|
||||
font-size: 290%;
|
||||
background: transparent;
|
||||
text-align: right;
|
||||
padding-right: 5px;
|
||||
text-shadow: 0px 0px 8px #04c33e;
|
||||
}
|
@ -1,91 +0,0 @@
|
||||
div.close {
|
||||
position: fixed;
|
||||
cursor: pointer;
|
||||
height: 48px;
|
||||
width: 48px;
|
||||
opacity: .5;
|
||||
border-radius: 10px;
|
||||
z-index: 90;
|
||||
top: 80px;
|
||||
right: 10px;
|
||||
}
|
||||
div.close:hover {
|
||||
opacity: .9;
|
||||
box-shadow: 0px 0px 0px 2px #dac8d2;
|
||||
border-radius: 10px;
|
||||
transition: .1s ease-in;
|
||||
}
|
||||
div.close:before {
|
||||
content: '';
|
||||
clip-path: polygon(20% 0%, 0% 20%, 30% 50%, 0% 80%, 20% 100%, 50% 70%, 80% 100%, 100% 80%, 70% 50%, 100% 20%, 80% 0%, 50% 30%);
|
||||
position: absolute;
|
||||
top: 7%;
|
||||
right: 7%;
|
||||
height: 41px;
|
||||
width: 41px;
|
||||
background-color: rgba(255, 255, 255, .5);
|
||||
}
|
||||
|
||||
|
||||
div.arrow {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
height: 70px;
|
||||
width: 70px;
|
||||
background-color: #000;
|
||||
opacity: .5;
|
||||
border-radius: 10px;
|
||||
z-index: 90;
|
||||
}
|
||||
div.arrow:hover {
|
||||
opacity: .9;
|
||||
box-shadow: 0px 0px 0px 2px #dac8d2;
|
||||
border-radius: 10px;
|
||||
transition: .1s ease-in;
|
||||
}
|
||||
div.arrow:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 7%;
|
||||
left: 7%;
|
||||
height: 60px;
|
||||
width: 60px;
|
||||
background-color: rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
|
||||
div.top:before {
|
||||
clip-path: polygon(0% 77%, 50% 23%, 100% 77%);
|
||||
}
|
||||
div.bottom:before {
|
||||
clip-path: polygon(0% 23%, 100% 23%, 50% 77%);
|
||||
}
|
||||
div.left:before {
|
||||
clip-path: polygon(23% 50%, 77% 0%, 77% 100%);
|
||||
}
|
||||
div.right:before {
|
||||
clip-path: polygon(23% 0%, 77% 50%, 23% 100%);
|
||||
}
|
||||
|
||||
div.arrow.top {
|
||||
top: 10px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
div.arrow.bottom {
|
||||
bottom: 10px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
div.arrow.left {
|
||||
position: fixed !important;
|
||||
left: 10px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
div.arrow.right {
|
||||
position: fixed !important;
|
||||
right: 10px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
@ -1,31 +0,0 @@
|
||||
div#itemwrapper {
|
||||
overflow: hidden;
|
||||
background-color: rgba(0, 0, 0, 0.4);
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
div#i_items {
|
||||
width: 300%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
grid-template-rows: 1fr;
|
||||
grid-template-areas: ". . .";
|
||||
}
|
||||
div.i_item {
|
||||
overflow: hidden;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.item {
|
||||
max-height: 100%;
|
||||
max-width: 100%;
|
||||
}
|
||||
.item:hover {
|
||||
background-color: rgba(0, 0, 0, 0.8);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
div#pagewrapper {
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
div#p_items {
|
||||
overflow: hidden;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
div.p_item {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
|
||||
div.p_item > a {
|
||||
width: 128px;
|
||||
height: 128px;
|
||||
box-shadow: 2px 2px 6px 0px rgb(0, 0, 0);
|
||||
margin: 4px;
|
||||
float: left;
|
||||
outline: none;
|
||||
box-shadow: inset 0 0 10px #4c4a4a;
|
||||
}
|
||||
div.p_item > a > img.thumb {
|
||||
border: 2px solid black;
|
||||
transition: .1s ease-out;
|
||||
}
|
||||
div.p_item > a > img.thumb:hover {
|
||||
box-shadow: 0px 0px 0px 2px #dac8d2;
|
||||
border-radius: 5px;
|
||||
transition: .1s ease-in;
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
Shareware/ Font License
|
||||
|
||||
Pixel Sagas Freeware Fonts EULA (End User License Agreement) and Software Inclusion Agreement
|
||||
|
||||
"Purchaser" and "User" may be used interchangeably in this agreement.
|
||||
|
||||
"Pixel Sagas" and "Neale Davidson" may be used interchangeably in this agreement. These all refer to the intellectual and legal property of Neale Davidson.
|
||||
|
||||
Usage
|
||||
|
||||
Pixel Saga's Shareware Fonts are free to use for personal, non-commercial purposes. No payment is necessary to use Pixel Saga's Freeware Fonts for personal use, and there is no limit to the amount of prints, pages, or other medium to be produced using them. However, you cannot offer the font for commercial sale, or offer for direct download. The inclusion othe font name and/or site URL in the credits or documentation when it is used is appreciated, but this is not mandatory.
|
||||
|
||||
Payment
|
||||
|
||||
Payment is not required for the use of Pixel Saga's Shareware Fonts. Commercial use requires a modest fee which can be paid through the pixelsagas.com web site through Paypal.com's services. The transaction receipt for any shareware "commercial license" purchase will suffice as proof of license.
|
||||
|
||||
Support
|
||||
|
||||
Font installation help is available at http://www.pixelsagas.com. If you experience problems with any Pixel Saga's Freeware font (such as spacing issues or missing characters), please verify that you have the correct and current version of the fonts. In the case of Freeware fonts, downloading the font directly from the Pixel Sagas site will ensure that the font files have not been altered.
|
||||
|
||||
Software Inclusion Agreement
|
||||
|
||||
Pixel Saga's software products are protected by copyright laws and International copyright treaties, as well as other intellectual property laws and treaties. All Pixel Saga's software products are licensed, not sold.
|
||||
|
||||
1) GRANT OF LICENSE
|
||||
|
||||
This document grants the user the following rights:
|
||||
|
||||
Installation and Use. The user may install and use an unlimited number of copies of the software product. The user may not offer Pixel Sagas freeware fonts for direct download unless the user has received explicit, written permission from Neale Davidson. Otherwise please direct users to the http://www.pixelsagas.com website. Pixel Sagas freeware fonts may, however, be embedded for web, publication, or general software use.
|
||||
|
||||
2) WARRANTIES
|
||||
|
||||
None
|
||||
|
||||
Pixel Sagas expressly disclaims any warranty for the software product. The software product and any related documentation is provided "as is" without warranty of any kind, either express or implied, including, without limitation, the implied warranties or merchantability, fitness for a particular purpose, or non-infringement. The entire risk arising out of use or performance of the software product remains with the user.
|
||||
|
||||
No Liability For Consequential Damages.
|
||||
|
||||
In no event shall Neale Davidson or Pixel Sagas be liable for any damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or any other pecuniary loss) arising out of the use of or inability to use this product, even if Pixel Sagas has been advised of the possibility of such damages.
|
||||
|
||||
3) MISCELLANEOUS
|
||||
|
||||
Should the user have any questions concerning this document or you desire to contact Neale Davidson for any reason, please email jaynz@pixelsagas.com .
|
||||
|
||||
Governing Law
|
||||
|
||||
This agreement is governed by and subject to the laws of the United States of America.
|
Before Width: | Height: | Size: 594 KiB |
Before Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 331 KiB |
Before Width: | Height: | Size: 333 KiB |
@ -1,180 +0,0 @@
|
||||
import rt from "./rt.js";
|
||||
import lib from "./lib.js";
|
||||
|
||||
const events = {};
|
||||
events.wheel = async e => {
|
||||
if(rt.tmp.events.page) { // Pageevents
|
||||
if(rt.tmp.scroll)
|
||||
return;
|
||||
const deltaY = e.target.id === "up" ? -1 : e.deltaY < 0 ? -1: 1; // -1 up, 1 down
|
||||
|
||||
if((deltaY === -1 && rt.items.first === rt.items.newest) || (deltaY === 1 && rt.items.last === rt.items.oldest))
|
||||
return rt.tmp.scroll = false;
|
||||
rt.tmp.scroll = true;
|
||||
rt.items.eps = 0;
|
||||
await lib.getItems({
|
||||
el: rt.ct.wrapper.pages[deltaY === -1 ? 0 : 2],
|
||||
opt: deltaY === -1 ? `id=${rt.items.first}&order=asc` : `id=${rt.items.last}&order=desc`
|
||||
});
|
||||
rt.ct.wrapper.pages[deltaY === -1 ? 0 : 2].scrollIntoView({ block: rt.vars.block, behavior: "smooth" });
|
||||
await new Promise(resolve => setTimeout(resolve, rt.vars.cd));
|
||||
|
||||
document.querySelector("div#p_items").removeChild(rt.ct.wrapper.pages[deltaY === -1 ? 2 : 0]);
|
||||
const newdiv = document.createElement("div");
|
||||
newdiv.classList.add("p_item");
|
||||
document.querySelector("div#p_items").insertAdjacentElement((deltaY === -1 ? "afterbegin" : "beforeend"), newdiv);
|
||||
rt.ct.wrapper.pages = document.querySelectorAll("div.p_item");
|
||||
lib.calcItems();
|
||||
|
||||
lib.scrolltomiddle(rt.ct.wrapper.pages);
|
||||
rt.ct.wrapper.pages[0].innerHTML = "";
|
||||
rt.ct.wrapper.pages[2].innerHTML = "";
|
||||
|
||||
}
|
||||
if(rt.tmp.events.item) { // Itemevents
|
||||
if(rt.tmp.scroll)
|
||||
return;
|
||||
const deltaY = e.target.id === "left" ? -1 : e.deltaY < 0 ? -1: 1; // -1 left, 1 right
|
||||
if((deltaY === -1 && rt.items.act === rt.items.oldest) || (deltaY === 1 && rt.items.act === rt.items.newest))
|
||||
return;
|
||||
window.location = `${window.location.pathname}#${deltaY === -1 ? rt.items.next : rt.items.prev}`;
|
||||
}
|
||||
rt.tmp.scroll = false;
|
||||
};
|
||||
events.resize = async e => {
|
||||
e.preventDefault();
|
||||
clearTimeout(rt.tmp.resize);
|
||||
lib.calcItems();
|
||||
rt.tmp.resize = setTimeout(() => lib.getItems({
|
||||
el: rt.ct.wrapper.pages[1],
|
||||
opt: `id=${rt.items.first + 1}&order=desc`
|
||||
}), rt.vars.cd);
|
||||
lib.scrolltomiddle(rt.ct.wrapper.pages);
|
||||
|
||||
if(rt.tmp.events.item) {
|
||||
lib.scrolltomiddle(rt.ct.wrapper.items);
|
||||
}
|
||||
};
|
||||
events.volumechange = e => {
|
||||
localStorage.setItem("volume", e.target.volume);
|
||||
};
|
||||
events.hashchange = async e => {
|
||||
if(rt.tmp.scroll || !rt.tmp.hash)
|
||||
return rt.tmp.hash = true;
|
||||
rt.tmp.scroll = true;
|
||||
console.log("hashchange lol");
|
||||
|
||||
if(rt.tmp.layer !== "item")
|
||||
rt.ct.wrapper.items[1].innerHTML = "";
|
||||
|
||||
const itemid = parseInt((e.newURL?e.newURL:e.detail.newURL).split("#").slice(-1));
|
||||
if(!itemid || itemid <= 0) // failover oder so
|
||||
return lib.closeItemview();
|
||||
|
||||
const next = rt.items.act === null || rt.items.act === itemid ? 1 : rt.items.act > itemid ? 2 : 0;
|
||||
lib.showLayer("item", next === 1);
|
||||
|
||||
rt.ct.header.itempos.innerHTML = `${itemid}`;
|
||||
const item = await lib.getItem(itemid);
|
||||
item.dest = item.dest.replace(/^\./, "");
|
||||
|
||||
rt.ct.header.infos.source.href = item.src;
|
||||
rt.ct.header.infos.source.innerHTML = item.srchost;
|
||||
rt.ct.header.infos.channel.innerHTML = `${item.usernetwork} ${item.userchannel}`;
|
||||
rt.ct.header.infos.title.innerHTML = `${item.mime} (${item.size})`;
|
||||
rt.ct.header.infos.nick.innerHTML = item.username;
|
||||
|
||||
// <test>
|
||||
if(itemid > rt.items.first || itemid < rt.items.last) { // Scroll to next Page
|
||||
rt.items.eps = 0;
|
||||
await lib.getItems({
|
||||
el: rt.ct.wrapper.pages[1],
|
||||
opt: next === 0 ? `id=${itemid-1}&order=asc` : `id=${itemid+1}&order=desc`
|
||||
});
|
||||
|
||||
/*rt.tmp.scroll = false;
|
||||
events.wheel.page({
|
||||
target: {
|
||||
id: next === 0 ? "up" : "down"
|
||||
}
|
||||
});
|
||||
rt.tmp.scroll = true;*/
|
||||
}
|
||||
// </test>
|
||||
|
||||
rt.ct.wrapper.pages[1].querySelectorAll("a > img").forEach(f => {
|
||||
f.style.boxShadow = null;
|
||||
f.style.borderRadius = null;
|
||||
f.style.transition = ".1s ease-out";
|
||||
});
|
||||
setTimeout(() => {
|
||||
rt.ct.wrapper.pages[1].querySelector(`a[href='#${itemid}'] > img`).style.boxShadow = "0px 0px 0px 2px #dac8d2";
|
||||
rt.ct.wrapper.pages[1].querySelector(`a[href='#${itemid}'] > img`).style.borderRadius = "5px";
|
||||
rt.ct.wrapper.pages[1].querySelector(`a[href='#${itemid}'] > img`).style.transition = ".1s ease-in";
|
||||
}, 50);
|
||||
|
||||
let el;
|
||||
switch(item.mime) {
|
||||
case "audio/flac":
|
||||
case "audio/mpeg":
|
||||
case "audio/ogg":
|
||||
case "audio/x-flac": // audios
|
||||
el = document.createElement("audio");
|
||||
el.src = `${rt.url}${item.dest}`;
|
||||
el.type = item.mime;
|
||||
el.autoplay = true;
|
||||
el.controls = true;
|
||||
el.loop = true;
|
||||
el.volume = localStorage.getItem("volume") || 1;
|
||||
el.addEventListener("volumechange", ev => events.volumechange(ev));
|
||||
break;
|
||||
case "image/gif":
|
||||
case "image/jpeg":
|
||||
case "image/png": // images
|
||||
el = document.createElement("img");
|
||||
el.src = `${rt.url}${item.dest}`;
|
||||
break;
|
||||
case "video/mp4":
|
||||
case "video/quicktime":
|
||||
case "video/webm":
|
||||
case "video/ogv": // videos
|
||||
el = document.createElement("video");
|
||||
el.src = `${rt.url}${item.dest}`;
|
||||
el.type = item.mime;
|
||||
el.autoplay = true;
|
||||
el.controls = true;
|
||||
el.loop = true;
|
||||
el.volume = localStorage.getItem("volume") || 1;
|
||||
el.addEventListener("volumechange", ev => events.volumechange(ev));
|
||||
break;
|
||||
default:
|
||||
alert("lol hacker");
|
||||
break;
|
||||
}
|
||||
|
||||
el.classList.add("item");
|
||||
rt.ct.wrapper.items[next].insertAdjacentElement("afterbegin", el);
|
||||
rt.ct.wrapper.items[next].scrollIntoView({ block: rt.vars.block, behavior: "smooth" });
|
||||
|
||||
rt.items.prev = item.prev;
|
||||
rt.items.next = item.next;
|
||||
rt.items.act = item.id;
|
||||
|
||||
await new Promise(resolve => setTimeout(resolve, rt.vars.cd));
|
||||
|
||||
if(next !== 1) {
|
||||
document.querySelector("div#i_items").removeChild(rt.ct.wrapper.items[next === 0 ? 2 : 0]);
|
||||
const newdiv = document.createElement("div");
|
||||
newdiv.classList.add("i_item");
|
||||
document.querySelector("div#i_items").insertAdjacentElement((next === 0 ? "afterbegin" : "beforeend"), newdiv);
|
||||
rt.ct.wrapper.items = document.querySelectorAll("div.i_item");
|
||||
}
|
||||
|
||||
lib.scrolltomiddle(rt.ct.wrapper.items);
|
||||
rt.ct.wrapper.items[0].innerHTML = "";
|
||||
rt.ct.wrapper.items[2].innerHTML = "";
|
||||
|
||||
rt.tmp.scroll = false;
|
||||
};
|
||||
|
||||
export default events;
|
@ -1,41 +0,0 @@
|
||||
import rt from "./rt.js";
|
||||
import events from "./events.js";
|
||||
import lib from "./lib.js";
|
||||
|
||||
if(rt.debug) {
|
||||
window.d = {
|
||||
rt: rt,
|
||||
events: events,
|
||||
lib: lib
|
||||
};
|
||||
}
|
||||
|
||||
(async () => {
|
||||
lib.showLayer("page");
|
||||
window.addEventListener("hashchange", events.hashchange);
|
||||
document.addEventListener("wheel", events.wheel);
|
||||
window.addEventListener("resize", events.resize);
|
||||
[...rt.ct.arrows] // add pagebuttons
|
||||
.forEach(p => p.addEventListener("click", events.wheel));
|
||||
|
||||
const debug = document.querySelectorAll("span#debug > a");
|
||||
debug[0].addEventListener("click", async () => { // random
|
||||
const random = await (await fetch(`${rt.api}/random`)).json();
|
||||
window.location = `${window.location.pathname}#${random.id}`;
|
||||
});
|
||||
|
||||
setTimeout(() => {
|
||||
const pn = parseInt(document.location.pathname.split("/").splice(-1));
|
||||
const hash = document.location.hash;
|
||||
if(!hash) {
|
||||
lib.getItems({
|
||||
el: rt.ct.wrapper.pages[1],
|
||||
opt: pn > 0 ? `id=${pn + 1}&order=desc` : ""
|
||||
});
|
||||
lib.scrolltomiddle(rt.ct.wrapper.pages);
|
||||
}
|
||||
else
|
||||
window.dispatchEvent(new CustomEvent("hashchange", { detail: { newURL: hash } }));
|
||||
}, 300);
|
||||
|
||||
})();
|
1
public/js/f0ck.min.js
vendored
@ -1 +0,0 @@
|
||||
import rt from"./rt.js";import events from"./events.js";import lib from"./lib.js";rt.debug&&(window.d={rt,events,lib}),(async()=>{lib.showLayer("page"),window.addEventListener("hashchange",events.hashchange),document.addEventListener("wheel",events.wheel),window.addEventListener("resize",events.resize),[...rt.ct.arrows].forEach(e=>e.addEventListener("click",events.wheel)),document.querySelectorAll("span#debug > a")[0].addEventListener("click",async()=>{const e=await(await fetch(`${rt.api}/random`)).json();window.location=`${window.location.pathname}#${e.id}`}),setTimeout(()=>{const e=parseInt(document.location.pathname.split("/").splice(-1)),t=document.location.hash;t?window.dispatchEvent(new CustomEvent("hashchange",{detail:{newURL:t}})):(lib.getItems({el:rt.ct.wrapper.pages[1],opt:e>0?`id=${e+1}&order=desc`:""}),lib.scrolltomiddle(rt.ct.wrapper.pages))},300)})();
|
128
public/js/lib.js
@ -1,128 +0,0 @@
|
||||
import rt from "./rt.js";
|
||||
import events from "./events.js";
|
||||
|
||||
const calcItems = () => {
|
||||
const cs = window.getComputedStyle(rt.ct.content);
|
||||
const height = parseInt(cs.height.replace("px", ""));
|
||||
const width = parseInt(cs.width.replace("px", ""));
|
||||
const cols = ~~(width / ( rt.layout.itemsize + rt.layout.margin ));
|
||||
const rows = ~~(height / ( rt.layout.itemsize + rt.layout.margin ));
|
||||
|
||||
rt.ct.wrapper.pages.forEach(e => {
|
||||
e.style.marginLeft = Math.max((width - (cols * (rt.layout.itemsize + rt.layout.margin)) + rt.layout.margin) / rt.layout.min_rows, 0) * 1.5 + "px";
|
||||
e.style.paddingTop = Math.max((height - (rows * (rt.layout.itemsize + rt.layout.margin)) + rt.layout.margin) / rt.layout.min_rows, 0) * 3 + "px";
|
||||
});
|
||||
|
||||
return {
|
||||
rows: rows,
|
||||
cols: cols,
|
||||
eps: rows * cols,
|
||||
width: width,
|
||||
height: height
|
||||
};
|
||||
};
|
||||
|
||||
const getItems = async ({ el, opt = "" }) => {
|
||||
const tmp = calcItems();
|
||||
if(tmp.eps === rt.items.eps)
|
||||
return;
|
||||
rt.items.eps = tmp.eps;
|
||||
el.innerHTML = "";
|
||||
const i = await (await fetch(`${rt.api}/p?eps=${tmp.eps}&${opt}`)).json();
|
||||
|
||||
const items = i.items.sort((a, b) => b.id - a.id);
|
||||
items.forEach(item => {
|
||||
const _a = document.createElement("a");
|
||||
_a.title = item.mime;
|
||||
_a.href = `#${item.id}`;//`${rt.url}/${item.id}`;
|
||||
const _img = document.createElement("img");
|
||||
_img.classList.add("thumb");
|
||||
_img.src = `${rt.url}/t/${item.id}.png`;
|
||||
_a.insertAdjacentElement("afterbegin", _img);
|
||||
el.insertAdjacentElement("beforeend", _a);
|
||||
});
|
||||
rt.items.first = items[0].id;
|
||||
rt.items.last = items[items.length - 1].id;
|
||||
rt.items.oldest = i.oldest;
|
||||
rt.items.newest = i.newest;
|
||||
|
||||
rt.tmp.hash = false;
|
||||
window.history.pushState(rt.items.first, `f0ck.me! page ${rt.items.first}`, `/page/${rt.items.first}${(window.location.hash?window.location.hash:"")}`);
|
||||
rt.tmp.hash = true;
|
||||
|
||||
rt.ct.header.pagepos.innerHTML = `items ${rt.items.first} - ${rt.items.last}`;
|
||||
};
|
||||
|
||||
const getItem = async itemid => {
|
||||
return await (await fetch(`${rt.api}/item/${itemid}`)).json();
|
||||
};
|
||||
|
||||
const scrolltomiddle = el => {
|
||||
el[0].scrollIntoView({ block: rt.vars.block });
|
||||
el[2].scrollIntoView({ block: rt.vars.block });
|
||||
el[1].scrollIntoView({ block: rt.vars.block });
|
||||
};
|
||||
|
||||
const closeItemview = () => {
|
||||
rt.tmp.hash = false;
|
||||
window.location.hash = "";
|
||||
rt.ct.tabs.item.removeEventListener("click", closeItemview);
|
||||
rt.ct.wrapper.pages[1].querySelectorAll("a > img").forEach(f => {
|
||||
f.style.boxShadow = null;
|
||||
f.style.borderRadius = null;
|
||||
f.style.transition = ".1s ease-out";
|
||||
});
|
||||
rt.ct.wrapper.items[1].innerHTML = "";
|
||||
showLayer("page", true);
|
||||
};
|
||||
|
||||
const showLayer = (layer, scroll = true) => {
|
||||
// hide all pages
|
||||
console.log(layer, rt.tmp.layer);
|
||||
if(layer === rt.tmp.layer)
|
||||
return;
|
||||
rt.tmp.layer = layer;
|
||||
for(let e in rt.ct.tabs)
|
||||
rt.ct.tabs[e].style.display = "none";
|
||||
|
||||
rt.tmp.events.page = false;
|
||||
rt.tmp.events.item = false;
|
||||
|
||||
switch(layer) {
|
||||
case "page":
|
||||
rt.tmp.events.page = true;
|
||||
if(scroll)
|
||||
scrolltomiddle(rt.ct.wrapper.pages);
|
||||
|
||||
rt.ct.header.pagepos.style.display = "block";
|
||||
rt.ct.header.itempos.style.display = "none";
|
||||
rt.ct.header.iteminfo.style.display = "none";
|
||||
break;
|
||||
case "item":
|
||||
rt.ct.tabs.item.style.display = "block";
|
||||
rt.tmp.events.item = true;
|
||||
|
||||
rt.ct.tabs.item.addEventListener("click", closeItemview);
|
||||
|
||||
if(scroll)
|
||||
scrolltomiddle(rt.ct.wrapper.items);
|
||||
|
||||
rt.ct.header.pagepos.style.display = "none";
|
||||
rt.ct.header.itempos.style.display = "block";
|
||||
rt.ct.header.iteminfo.style.display = "block";
|
||||
break;
|
||||
case "howto":
|
||||
rt.ct.tabs.howto.style.display = "block";
|
||||
break;
|
||||
}
|
||||
rt.tmp.scroll = false;
|
||||
};
|
||||
|
||||
export default { // oof
|
||||
calcItems: calcItems,
|
||||
getItems: getItems,
|
||||
getItem: getItem,
|
||||
showLayer: showLayer,
|
||||
scrolltomiddle: scrolltomiddle,
|
||||
closeItemview: closeItemview
|
||||
};
|
@ -1,63 +0,0 @@
|
||||
export default {
|
||||
debug: true,
|
||||
layout: {
|
||||
margin: 6,
|
||||
min_cols: 3,
|
||||
min_rows: 4,
|
||||
itemsize: 130
|
||||
},
|
||||
url: "//f0ck.me",
|
||||
api: "//dev.f0ck.me/api",
|
||||
vars: {
|
||||
cd: 600,
|
||||
block: "center"
|
||||
},
|
||||
tmp: {
|
||||
layer: null,
|
||||
_scroll: false,
|
||||
get scroll() { console.log("get scroll"); return this._scroll; },
|
||||
set scroll(val) { console.log("set scroll: " + val); this._scroll = val; },
|
||||
events: {
|
||||
page: true,
|
||||
item: false
|
||||
},
|
||||
resize: null,
|
||||
_hash: true,
|
||||
get hash() { console.log("get hash"); return this._hash; },
|
||||
set hash(val) { console.log("set hash: " + val); this._hash = val; }
|
||||
},
|
||||
items: {
|
||||
first: null,
|
||||
last: null,
|
||||
newest: null,
|
||||
oldest: null,
|
||||
next: null,
|
||||
prev: null,
|
||||
act: null,
|
||||
eps: 0
|
||||
},
|
||||
ct: {
|
||||
content: document.querySelector("div#content"),
|
||||
wrapper: {
|
||||
pages: document.querySelectorAll("div.p_item"),
|
||||
items: document.querySelectorAll("div.i_item")
|
||||
},
|
||||
tabs: {
|
||||
item: document.querySelector("div#itemwrapper"),
|
||||
howto: document.querySelector("div#howtowrapper")
|
||||
},
|
||||
arrows: document.querySelectorAll("div.arrow"),
|
||||
header: {
|
||||
iteminfo: document.querySelector("div#itemInfo"),
|
||||
pagepos: document.querySelector("div#pagePosition"),
|
||||
itempos: document.querySelector("div#itemPosition"),
|
||||
infos: {
|
||||
title: document.querySelector("span#itemTitle"),
|
||||
source: document.querySelector("a#itemSource"),
|
||||
time: document.querySelector("span#itemTime"),
|
||||
nick: document.querySelector("span#itemNick"),
|
||||
channel: document.querySelector("span#itemChannel")
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
BIN
public/s/95.ttf
Normal file
10224
public/s/css/bootstrap.css
vendored
Normal file
10832
public/s/css/bulma.css
vendored
Normal file
23
public/s/css/classic.css
Normal file
@ -0,0 +1,23 @@
|
||||
/* This is the classic style f0ck */
|
||||
|
||||
.mudderfigg {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
}
|
||||
|
||||
span.id {
|
||||
background: unset;
|
||||
text-align: left;
|
||||
color: #ffffff;
|
||||
border: unset;
|
||||
}
|
||||
|
||||
.id > a {
|
||||
color: #9f0;
|
||||
}
|
||||
|
||||
.options {
|
||||
padding-left: 15px;
|
||||
margin-top: -5px;
|
||||
padding-bottom: 15px;
|
||||
}
|
178
public/s/css/coldblue.css
Normal file
@ -0,0 +1,178 @@
|
||||
@font-face {
|
||||
font-family: "Cyberfall";
|
||||
src: url(https://dr0p.it/Clgl.otf) format("opentype");
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0em auto 3em auto;
|
||||
background-color: #0B111D;
|
||||
color: #fff;
|
||||
font-family: "Cyberfall";
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #00ffed;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #00b4ef;
|
||||
}
|
||||
|
||||
.return {
|
||||
text-align: center;
|
||||
border-bottom: 2px solid #154d71;
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
background: #121323;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.controls {
|
||||
text-align: center;
|
||||
color: #00ffed;
|
||||
width: 888px;
|
||||
margin: 0 auto;
|
||||
background: #121323;
|
||||
padding-top: 0;
|
||||
margin-top: 35px;
|
||||
border: 2px solid #154d71;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
margin: 0 auto;
|
||||
width: 100%;
|
||||
border: 0;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
font-weight: bold;
|
||||
position: fixed;
|
||||
overflow: visible;
|
||||
z-index: 999;
|
||||
background-color: #0b111d;
|
||||
border-bottom: 2px solid #207ea4;
|
||||
text-align: center;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.medium, .thumbnail {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-top: 5px;
|
||||
background: #121323;
|
||||
border: 2px solid #154d71;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.panel {
|
||||
margin-bottom: 0;
|
||||
background-color: rgb(18, 19, 35);
|
||||
border: 2px solid #154D71;
|
||||
border-radius: 0px;
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
width: 25%;
|
||||
position: relative;
|
||||
min-height: 1px;
|
||||
}
|
||||
|
||||
input, select, textarea {
|
||||
border: 1px double #00edff;
|
||||
background: #282A2E;
|
||||
color: #f1e3ce;
|
||||
font-family: 'Hack', monospace, sans-serif;
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
.thumb {
|
||||
border: 2px solid #207ea4;
|
||||
}
|
||||
|
||||
.plyr--video .plyr__controls {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 2;
|
||||
padding: 0px 0px 0px;
|
||||
background: rgb(11, 17, 29);
|
||||
border-bottom-left-radius: inherit;
|
||||
border-bottom-right-radius: inherit;
|
||||
color: #00edff;
|
||||
transition: opacity .3s cubic-bezier(0.12, 0.63, 0.25, 1);
|
||||
}
|
||||
|
||||
.plyr--audio .plyr__controls button.tab-focus:focus, .plyr--audio .plyr__controls button:hover, .plyr__play-large {
|
||||
background: #0b111d;
|
||||
color: #00edff;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.plyr__progress--played, .plyr__volume--display {
|
||||
z-index: 1;
|
||||
color: #00edff;
|
||||
background: 0 0;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.plyr input[type=range]::-webkit-slider-thumb {
|
||||
-webkit-appearance: none;
|
||||
margin-top: -4px;
|
||||
position: relative;
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
background: #0b111d;
|
||||
border: 1px solid #00edff;
|
||||
border-radius: 100%;
|
||||
transition: background .2s ease,border .2s ease,transform .2s ease;
|
||||
box-shadow: 0 1px 1px rgba(0,0,0,.15), 0 0 0 1px rgba(0,0,0,.15);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.plyr input[type=range]:active::-webkit-slider-thumb {
|
||||
background: #0b111d;
|
||||
border-color: #00edff;
|
||||
transform: scale(1.25)
|
||||
}
|
||||
|
||||
/* Feuerfick */
|
||||
.plyr input[type="range"]::-moz-range-thumb {
|
||||
position: relative;
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
background: #0b111d;
|
||||
border: 2px solid #00edff;
|
||||
border-radius: 100%;
|
||||
transition: background .2s ease, border .2s ease, transform .2s ease;
|
||||
box-shadow: 0 1px 1px rgba(0, 0, 0, .15), 0 0 0 1px rgba(0, 0, 0, .15);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.plyr input[type=range]:active::-moz-range-thumb {
|
||||
background: #0b111d;
|
||||
border-color: #00edff;
|
||||
transform: scale(1.25)
|
||||
}
|
||||
|
||||
.plyr--video .plyr__controls button.tab-focus:focus, .plyr--video .plyr__controls button:hover {
|
||||
background: #154d71;
|
||||
color: #00edff;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.plyr--audio .plyr__controls {
|
||||
padding: 0;
|
||||
border-radius: inherit;
|
||||
background: rgb(11, 17, 29);
|
||||
border: 0;
|
||||
color: #00edff;
|
||||
width: 300px;
|
||||
padding-right: 5;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
.plyr--audio .plyr__controls button.tab-focus:focus, .plyr--audio .plyr__controls button:hover, .plyr__play-large {
|
||||
background: #154d71;
|
||||
color: #00edff;
|
||||
border-radius: 0;
|
||||
}
|
687
public/s/css/cyber.css
Normal file
@ -0,0 +1,687 @@
|
||||
@import url('https://fonts.googleapis.com/css?family=Oswald:700|Press+Start+2P');
|
||||
|
||||
body {
|
||||
margin: 1em auto 3em auto;
|
||||
background-color: rgb(10, 10, 10);
|
||||
color: #01ffbd;
|
||||
font-family: 'Oswald', sans-serif;
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #f300ff;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
input, select, textarea {
|
||||
border: 1px double #00ffc4;
|
||||
border-radius: 0;
|
||||
background: #9a0039;
|
||||
color: #04e8bd;
|
||||
font-size: 80%;
|
||||
font-family: 'Oswald', sans-serif;
|
||||
margin-top: 3px;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.return {
|
||||
text-align: center;
|
||||
font-family: 'Press Start 2P', cursive;
|
||||
font-size: 29px;
|
||||
text-decoration: none;
|
||||
animation: glitch2 2s steps(100) infinite;
|
||||
color: white;
|
||||
border-bottom: 2px solid #9a0039;
|
||||
background-color: #061412;
|
||||
margin-top: -60px;
|
||||
}
|
||||
|
||||
ul#posts {
|
||||
width: calc(100% - 210px);
|
||||
margin: 0;
|
||||
margin-left: 100px;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
display: -webkit-box;
|
||||
display: -webkit-flex;
|
||||
display: -moz-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-flex-flow: row wrap;
|
||||
flex-flow: row wrap;
|
||||
justify-content: flex-start;
|
||||
-webkit-justify-content: flex-start;
|
||||
padding-top: 1.5em;
|
||||
}
|
||||
|
||||
.controls {
|
||||
text-align: center;
|
||||
color: #01f4b5;
|
||||
font-weight: bold;
|
||||
width: 888px;
|
||||
margin: 0 auto;
|
||||
background: #061412;
|
||||
padding-top: 0;
|
||||
border: 2px solid #9a0039;
|
||||
margin-top: 60px;
|
||||
}
|
||||
|
||||
.medium, .thumbnail {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-top: 5px;
|
||||
background: #061412;
|
||||
border: 2px solid #9a0039;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.thumb {
|
||||
border: 2px solid rgb(4, 232, 189);
|
||||
}
|
||||
|
||||
/* Color the Controls */
|
||||
a#next {
|
||||
color: #01f4b5;
|
||||
}
|
||||
|
||||
a#next:hover {
|
||||
animation: glitch2 2s steps(100) infinite;
|
||||
}
|
||||
|
||||
a#random {
|
||||
color: #01f4b5;
|
||||
}
|
||||
|
||||
a#random:hover {
|
||||
animation: glitch2 2s steps(100) infinite;
|
||||
}
|
||||
|
||||
a#prev {
|
||||
color: #01f4b5;
|
||||
}
|
||||
|
||||
a#prev:hover {
|
||||
animation: glitch2 2s steps(100) infinite;
|
||||
}
|
||||
|
||||
a#holland {
|
||||
color: #01f4b5;
|
||||
}
|
||||
|
||||
a#holland:hover {
|
||||
color: #cc0ccb;
|
||||
animation: glitch2 2s steps(100) infinite;
|
||||
}
|
||||
|
||||
/* PANEL */
|
||||
.panel {
|
||||
background-color: rgba(4, 27, 23, 0.61);
|
||||
border: 2px solid #9a0039;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
text-align: center;
|
||||
margin-top: 7px;
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
border-bottom: 2px solid #9a0039;
|
||||
background: #061412;
|
||||
padding-bottom: 5px;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.plyr--audio .plyr__controls {
|
||||
padding: 0;
|
||||
border-radius: inherit;
|
||||
background: #0a0a0a;
|
||||
border: 0;
|
||||
color: #f300ff;
|
||||
width: 300px;
|
||||
padding-right: 5;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
.plyr input[type=range]::-webkit-slider-thumb {
|
||||
-webkit-appearance: none;
|
||||
margin-top: -4px;
|
||||
position: relative;
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
background: #061412;
|
||||
border: 1px solid #f300ff;
|
||||
border-radius: 100%;
|
||||
transition: background .2s ease,border .2s ease,transform .2s ease;
|
||||
box-shadow: 0 1px 1px rgba(0,0,0,.15), 0 0 0 1px rgba(0,0,0,.15);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.plyr__progress--played, .plyr__volume--display {
|
||||
z-index: 1;
|
||||
color: #00efb1;
|
||||
background: 0 0;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.plyr--audio .plyr__controls button.tab-focus:focus, .plyr--audio .plyr__controls button:hover, .plyr__play-large {
|
||||
background: #061412;
|
||||
color: #01f4b5;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.plyr--video .plyr__controls button.tab-focus:focus, .plyr--video .plyr__controls button:hover {
|
||||
background: #061412;
|
||||
color: #01f4b5;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.plyr input[type=range]:active::-webkit-slider-thumb {
|
||||
background: #061412;
|
||||
border-color: #01f4b5;
|
||||
transform: scale(1.25)
|
||||
}
|
||||
|
||||
.plyr--video .plyr__controls {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 2;
|
||||
padding: 0px 0px 0px;
|
||||
background: rgba(10, 10, 10, 0.73);
|
||||
border-bottom-left-radius: inherit;
|
||||
border-bottom-right-radius: inherit;
|
||||
color: #01f4b5;
|
||||
transition: opacity .3s cubic-bezier(0.12, 0.63, 0.25, 1);
|
||||
}
|
||||
|
||||
/* Feuerfick */
|
||||
.plyr input[type="range"]::-moz-range-thumb {
|
||||
position: relative;
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
background: #061412;
|
||||
border: 2px solid #01f4b5;
|
||||
border-radius: 100%;
|
||||
transition: background .2s ease, border .2s ease, transform .2s ease;
|
||||
box-shadow: 0 1px 1px rgba(0, 0, 0, .15), 0 0 0 1px rgba(0, 0, 0, .15);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.plyr input[type=range]:active::-moz-range-thumb {
|
||||
background: #061412;
|
||||
border-color: #01f4b5;
|
||||
transform: scale(1.25)
|
||||
}
|
||||
|
||||
@keyframes noise-anim {
|
||||
0% {
|
||||
clip: rect(2px, 9999px, 94px, 0);
|
||||
}
|
||||
5% {
|
||||
clip: rect(89px, 9999px, 60px, 0);
|
||||
}
|
||||
10% {
|
||||
clip: rect(66px, 9999px, 50px, 0);
|
||||
}
|
||||
15% {
|
||||
clip: rect(3px, 9999px, 54px, 0);
|
||||
}
|
||||
20% {
|
||||
clip: rect(26px, 9999px, 19px, 0);
|
||||
}
|
||||
25% {
|
||||
clip: rect(20px, 9999px, 66px, 0);
|
||||
}
|
||||
30% {
|
||||
clip: rect(18px, 9999px, 43px, 0);
|
||||
}
|
||||
35% {
|
||||
clip: rect(54px, 9999px, 48px, 0);
|
||||
}
|
||||
40% {
|
||||
clip: rect(33px, 9999px, 66px, 0);
|
||||
}
|
||||
45% {
|
||||
clip: rect(24px, 9999px, 61px, 0);
|
||||
}
|
||||
50% {
|
||||
clip: rect(30px, 9999px, 18px, 0);
|
||||
}
|
||||
55% {
|
||||
clip: rect(16px, 9999px, 96px, 0);
|
||||
}
|
||||
60% {
|
||||
clip: rect(2px, 9999px, 20px, 0);
|
||||
}
|
||||
65% {
|
||||
clip: rect(84px, 9999px, 19px, 0);
|
||||
}
|
||||
70% {
|
||||
clip: rect(50px, 9999px, 5px, 0);
|
||||
}
|
||||
75% {
|
||||
clip: rect(60px, 9999px, 80px, 0);
|
||||
}
|
||||
80% {
|
||||
clip: rect(26px, 9999px, 96px, 0);
|
||||
}
|
||||
85% {
|
||||
clip: rect(100px, 9999px, 74px, 0);
|
||||
}
|
||||
90% {
|
||||
clip: rect(82px, 9999px, 29px, 0);
|
||||
}
|
||||
95% {
|
||||
clip: rect(34px, 9999px, 97px, 0);
|
||||
}
|
||||
100% {
|
||||
clip: rect(91px, 9999px, 44px, 0);
|
||||
}
|
||||
}
|
||||
|
||||
.return:after {
|
||||
content: attr(class="return");
|
||||
position: absolute;
|
||||
left: 2px;
|
||||
text-shadow: -1px 0 red;
|
||||
top: 0;
|
||||
color: white;
|
||||
background: black;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 900px, 0, 0);
|
||||
animation: noise-anim 2s infinite linear alternate-reverse;
|
||||
}
|
||||
|
||||
@keyframes noise-anim-2 {
|
||||
0% {
|
||||
clip: rect(76px, 9999px, 52px, 0);
|
||||
}
|
||||
5% {
|
||||
clip: rect(5px, 9999px, 11px, 0);
|
||||
}
|
||||
10% {
|
||||
clip: rect(25px, 9999px, 9px, 0);
|
||||
}
|
||||
15% {
|
||||
clip: rect(56px, 9999px, 30px, 0);
|
||||
}
|
||||
20% {
|
||||
clip: rect(63px, 9999px, 93px, 0);
|
||||
}
|
||||
25% {
|
||||
clip: rect(84px, 9999px, 63px, 0);
|
||||
}
|
||||
30% {
|
||||
clip: rect(55px, 9999px, 54px, 0);
|
||||
}
|
||||
35% {
|
||||
clip: rect(53px, 9999px, 52px, 0);
|
||||
}
|
||||
40% {
|
||||
clip: rect(40px, 9999px, 66px, 0);
|
||||
}
|
||||
45% {
|
||||
clip: rect(50px, 9999px, 15px, 0);
|
||||
}
|
||||
50% {
|
||||
clip: rect(90px, 9999px, 31px, 0);
|
||||
}
|
||||
55% {
|
||||
clip: rect(33px, 9999px, 4px, 0);
|
||||
}
|
||||
60% {
|
||||
clip: rect(18px, 9999px, 57px, 0);
|
||||
}
|
||||
65% {
|
||||
clip: rect(2px, 9999px, 21px, 0);
|
||||
}
|
||||
70% {
|
||||
clip: rect(38px, 9999px, 93px, 0);
|
||||
}
|
||||
75% {
|
||||
clip: rect(61px, 9999px, 44px, 0);
|
||||
}
|
||||
80% {
|
||||
clip: rect(83px, 9999px, 27px, 0);
|
||||
}
|
||||
85% {
|
||||
clip: rect(80px, 9999px, 51px, 0);
|
||||
}
|
||||
90% {
|
||||
clip: rect(91px, 9999px, 39px, 0);
|
||||
}
|
||||
95% {
|
||||
clip: rect(59px, 9999px, 36px, 0);
|
||||
}
|
||||
100% {
|
||||
clip: rect(74px, 9999px, 80px, 0);
|
||||
}
|
||||
}
|
||||
.return:before {
|
||||
content: attr(data-text);
|
||||
position: absolute;
|
||||
left: -2px;
|
||||
text-shadow: 1px 0 blue;
|
||||
top: 0;
|
||||
color: white;
|
||||
background: transparent;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 900px, 0, 0);
|
||||
animation: noise-anim-2 3s infinite linear alternate-reverse;
|
||||
}
|
||||
|
||||
@keyframes glitch2 {
|
||||
0% {
|
||||
text-shadow: 1px 0 0 red, -1px 0 0 blue;
|
||||
}
|
||||
1% {
|
||||
text-shadow: 1px 0 0 red, -1px 0 0 blue;
|
||||
}
|
||||
2% {
|
||||
text-shadow: 1px 0 0 red, -1px 0 0 blue;
|
||||
}
|
||||
3% {
|
||||
text-shadow: 1px 0 0 red, -1px 0 0 blue;
|
||||
}
|
||||
4% {
|
||||
text-shadow: 1px 0 0 red, -1px 0 0 blue;
|
||||
}
|
||||
5% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
6% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
7% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
8% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
9% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
10% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
11% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
|
||||
}
|
||||
12% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
|
||||
}
|
||||
13% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
|
||||
}
|
||||
14% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
|
||||
}
|
||||
15% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
|
||||
}
|
||||
16% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 lime;
|
||||
}
|
||||
17% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 lime;
|
||||
}
|
||||
18% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 lime;
|
||||
}
|
||||
19% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 lime;
|
||||
}
|
||||
20% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 lime;
|
||||
}
|
||||
21% {
|
||||
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
|
||||
}
|
||||
22% {
|
||||
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
|
||||
}
|
||||
23% {
|
||||
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
|
||||
}
|
||||
24% {
|
||||
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
|
||||
}
|
||||
25% {
|
||||
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
|
||||
}
|
||||
26% {
|
||||
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
|
||||
}
|
||||
27% {
|
||||
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
|
||||
}
|
||||
28% {
|
||||
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
|
||||
}
|
||||
29% {
|
||||
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
|
||||
}
|
||||
30% {
|
||||
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
|
||||
}
|
||||
31% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
32% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
33% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
34% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
35% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
36% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
37% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
38% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
39% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
40% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
41% {
|
||||
text-shadow: 50px 0 0 blue, -50px 0 0 lime;
|
||||
}
|
||||
42% {
|
||||
text-shadow: 0 0 0 blue, 0 0 0 lime;
|
||||
}
|
||||
43% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
|
||||
}
|
||||
44% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
|
||||
}
|
||||
45% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
|
||||
}
|
||||
46% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
|
||||
}
|
||||
47% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 lime;
|
||||
}
|
||||
48% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 lime;
|
||||
}
|
||||
49% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 lime;
|
||||
}
|
||||
50% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 lime;
|
||||
}
|
||||
51% {
|
||||
text-shadow: 1px 0 0 red, -1px 0 0 blue;
|
||||
}
|
||||
52% {
|
||||
text-shadow: 1px 0 0 red, -1px 0 0 blue;
|
||||
}
|
||||
53% {
|
||||
text-shadow: 1px 0 0 red, -1px 0 0 blue;
|
||||
}
|
||||
54% {
|
||||
text-shadow: 1px 0 0 red, -1px 0 0 blue;
|
||||
}
|
||||
55% {
|
||||
text-shadow: 1px 0 0 red, -1px 0 0 blue;
|
||||
}
|
||||
56% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
57% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
58% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
59% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
60% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
61% {
|
||||
text-shadow: 30px 0 0 red, -30px 0 0 lime;
|
||||
}
|
||||
62% {
|
||||
text-shadow: 0 0 0 red, 0 0 0 lime;
|
||||
}
|
||||
63% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 blue;
|
||||
}
|
||||
64% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 blue;
|
||||
}
|
||||
65% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 blue;
|
||||
}
|
||||
66% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 blue;
|
||||
}
|
||||
67% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
68% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
69% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
70% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
71% {
|
||||
text-shadow: 70px 0 0 red, -70px 0 0 blue;
|
||||
}
|
||||
72% {
|
||||
text-shadow: 0 0 0 red, 0 0 0 blue;
|
||||
}
|
||||
73% {
|
||||
text-shadow: 1px 0 0 red, -1px 0 0 blue;
|
||||
}
|
||||
74% {
|
||||
text-shadow: 1px 0 0 red, -1px 0 0 blue;
|
||||
}
|
||||
75% {
|
||||
text-shadow: 1px 0 0 red, -1px 0 0 blue;
|
||||
}
|
||||
76% {
|
||||
text-shadow: 1px 0 0 red, -1px 0 0 blue;
|
||||
}
|
||||
77% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
78% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
79% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
80% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 blue;
|
||||
}
|
||||
81% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
|
||||
}
|
||||
82% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
|
||||
}
|
||||
83% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
|
||||
}
|
||||
84% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
|
||||
}
|
||||
85% {
|
||||
text-shadow: 0.5px 0 0 red, -0.5px 0 0 lime;
|
||||
}
|
||||
86% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 lime;
|
||||
}
|
||||
87% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 lime;
|
||||
}
|
||||
88% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 lime;
|
||||
}
|
||||
89% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 lime;
|
||||
}
|
||||
90% {
|
||||
text-shadow: -1px 0 0 red, 1px 0 0 lime;
|
||||
}
|
||||
91% {
|
||||
text-shadow: 60px 0 0 lime, -60px 0 0 blue;
|
||||
}
|
||||
92% {
|
||||
text-shadow: 0 0 0 lime, 0 0 0 blue;
|
||||
}
|
||||
92% {
|
||||
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
|
||||
}
|
||||
93% {
|
||||
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
|
||||
}
|
||||
94% {
|
||||
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
|
||||
}
|
||||
95% {
|
||||
text-shadow: 0.7px 0 0 blue, -0.7px 0 0 lime;
|
||||
}
|
||||
96% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
97% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
98% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
99% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
100% {
|
||||
text-shadow: -1px 0 0 blue, 1px 0 0 lime;
|
||||
}
|
||||
}
|
207
public/s/css/f0ck-custom.css
Normal file
@ -0,0 +1,207 @@
|
||||
/* written by sirx for f0ck.me */
|
||||
/* use whatever you like */
|
||||
ul#posts {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
|
||||
grid-gap: 1em;
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
background-color: #1b1b1b;
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: black;
|
||||
color: white;
|
||||
}
|
||||
|
||||
html {
|
||||
background-color: black;
|
||||
}
|
||||
|
||||
.container.is-fluid {
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
li.post {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
span.item-mime {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
color: #68da20;
|
||||
text-shadow: 1px 1px black;
|
||||
font-size: 11px;
|
||||
text-transform: uppercase;
|
||||
background: #000000b8;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
li.post:hover > span.item-mime {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
a.navbar-item:focus, a.navbar-item:focus-within, a.navbar-item:hover, a.navbar-item.is-active, .navbar-link:focus, .navbar-link:focus-within, .navbar-link:hover, .navbar-link.is-active {
|
||||
background-color: #000000;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
a#next, a#prev {
|
||||
position: relative;
|
||||
font-weight: normal;
|
||||
top: 0px;
|
||||
bottom: 932px;
|
||||
margin: unset;
|
||||
font-size: 30px;
|
||||
color: #99ff00;
|
||||
padding: 140px 40px 140px 40px;
|
||||
cursor: pointer;
|
||||
-webkit-transform: translateZ(0);
|
||||
align-content: inherit;
|
||||
align-self: center;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
a#next, a#prev {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.content {
|
||||
display: grid;
|
||||
justify-content: space-around;
|
||||
grid-template-columns: 0fr 1fr 0fr;
|
||||
}
|
||||
|
||||
.previous-post, .next-post {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
img#f0ck-image {
|
||||
max-width: 100%;
|
||||
max-height: 500px;
|
||||
}
|
||||
|
||||
.metadata {
|
||||
text-align: center;
|
||||
position: sticky;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #99ff00;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #99ff00;
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.navbar-item, .navbar-link {
|
||||
color: white;
|
||||
text-shadow: 1px 1px black;
|
||||
}
|
||||
|
||||
.media-object {
|
||||
text-align: center;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
a.id-link {
|
||||
padding-right: 5;
|
||||
}
|
||||
|
||||
div#my-video {
|
||||
max-height: unset;
|
||||
}
|
||||
|
||||
.box:not(:last-child), .content:not(:last-child), .notification:not(:last-child), .progress:not(:last-child), .table:not(:last-child), .table-container:not(:last-child), .title:not(:last-child), .subtitle:not(:last-child), .block:not(:last-child), .highlight:not(:last-child), .breadcrumb:not(:last-child), .level:not(:last-child), .list:not(:last-child), .message:not(:last-child), .pagination:not(:last-child), .tabs:not(:last-child) {
|
||||
margin-bottom: 0;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.video-container {
|
||||
position: relative;
|
||||
padding-bottom: 56.25%; /*16:9*/
|
||||
padding-top: 30px;
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.video-container video {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.irc {
|
||||
padding: 10px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
a#next:hover {
|
||||
box-shadow: -1px 0px #99ff001c;
|
||||
transition: all .2s;
|
||||
}
|
||||
|
||||
a#prev:hover {
|
||||
box-shadow: 1px 0px #99ff001c;
|
||||
transition: all .2s;
|
||||
}
|
||||
|
||||
.navbar-brand a.navbar-item:focus, .navbar-brand a.navbar-item:hover {
|
||||
background-color: black;
|
||||
}
|
||||
|
||||
.controls {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.content {
|
||||
min-height: 517px;
|
||||
}
|
||||
|
||||
#themeselector {
|
||||
color: #fff;
|
||||
background-color: #343a40;
|
||||
display: inline-block;
|
||||
font-weight: 600;
|
||||
line-height: 1;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
vertical-align: baseline;
|
||||
border-radius: 0.25rem;
|
||||
transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
||||
border: 0;
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
select {
|
||||
font-size: small;
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
a#next, a#prev {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.content {
|
||||
min-height: 0;
|
||||
}
|
||||
}
|
||||
|
||||
img#biohaz {
|
||||
width: 28px;
|
||||
}
|
389
public/s/css/f0ck95.css
Normal file
5
public/s/css/indexstyle.css
Normal file
@ -0,0 +1,5 @@
|
||||
* {
|
||||
-webkit-box-sizing: content-box;
|
||||
-moz-box-sizing: content-box;
|
||||
box-sizing: content-box;
|
||||
}
|
237
public/s/css/krautchan.css
Normal file
@ -0,0 +1,237 @@
|
||||
body {
|
||||
margin: 0em auto 3em auto;
|
||||
background-color: #eeeeee;
|
||||
color: #fff;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #3333cc;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #3d3dff;
|
||||
}
|
||||
|
||||
.thumb {
|
||||
border: 2px solid #313370;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
margin: 0 auto;
|
||||
width: 888px;
|
||||
}
|
||||
|
||||
|
||||
.navbar {
|
||||
margin-top: 7px;
|
||||
color: #313370;
|
||||
margin: 0 auto;
|
||||
width: 100%;
|
||||
border-bottom: 2px solid;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
font-weight: bold;
|
||||
background: #aaaacc;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
|
||||
input, select, textarea {
|
||||
border: 1px double #3333cc;
|
||||
background: #eeeeee;
|
||||
color: #3333cc;
|
||||
font-family: sans-serif;
|
||||
font-size: 80%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.panel {
|
||||
margin-bottom: 0;
|
||||
background-color: #aaaacc;
|
||||
border: 2px solid #313370;
|
||||
border-radius: 0px;
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
width: 25%;
|
||||
float: left;
|
||||
position: relative;
|
||||
min-height: 1px;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.contact {
|
||||
margin: 20px;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.irc {
|
||||
margin: 20px;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
code {
|
||||
color: #3d3dff;
|
||||
}
|
||||
|
||||
.return {
|
||||
text-align: center;
|
||||
border-bottom: 2px solid #313370;
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
background: #aaaacc;
|
||||
margin-bottom: 5px;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.controls {
|
||||
text-align: center;
|
||||
color: #3333cc;
|
||||
font-weight: bold;
|
||||
width: 888px;
|
||||
margin: 0 auto;
|
||||
background: #aaaacc;
|
||||
padding-top: 0;
|
||||
border: 2px solid #313370;
|
||||
margin-top: 35px;
|
||||
}
|
||||
|
||||
.medium, .thumbnail {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-top: 5px;
|
||||
background: #aaaacc;
|
||||
border: 2px solid #313370;
|
||||
}
|
||||
|
||||
.panel.info {
|
||||
margin: 0 auto;
|
||||
margin-top: 5px;
|
||||
float: none;
|
||||
width: 888px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.plyr--audio .plyr__controls button.tab-focus:focus, .plyr--audio .plyr__controls button:hover, .plyr__play-large {
|
||||
background: #eeeeee;
|
||||
color: #3535cb;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.plyr--video .plyr__controls {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 2;
|
||||
padding: 0px 0px 0px;
|
||||
background: rgb(238, 238, 238);
|
||||
border-bottom-left-radius: inherit;
|
||||
border-bottom-right-radius: inherit;
|
||||
color: #3535cb;
|
||||
transition: opacity .3s cubic-bezier(0.12, 0.63, 0.25, 1);
|
||||
}
|
||||
|
||||
span.plyr__time--current {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.plyr__progress--played, .plyr__volume--display {
|
||||
z-index: 1;
|
||||
color: #3535cb;
|
||||
background: 0 0;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.plyr--video .plyr__progress--buffer {
|
||||
color: rgb(49, 51, 112);
|
||||
}
|
||||
|
||||
.plyr--video .plyr__progress--buffer, .plyr--video .plyr__volume--display {
|
||||
background: rgb(170, 170, 204);
|
||||
}
|
||||
|
||||
.plyr--video .plyr__controls button.tab-focus:focus, .plyr--video .plyr__controls button:hover {
|
||||
background: #3535cb;
|
||||
color: #eeeeee;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.plyr input[type=range]::-webkit-slider-thumb {
|
||||
-webkit-appearance: none;
|
||||
margin-top: -4px;
|
||||
position: relative;
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
background: #eeeeee;
|
||||
border: 2px solid #3535cb;
|
||||
border-radius: 100%;
|
||||
transition: background .2s ease,border .2s ease,transform .2s ease;
|
||||
box-shadow: 0 1px 1px rgba(0,0,0,.15), 0 0 0 1px rgba(0,0,0,.15);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.plyr input[type=range]:active::-webkit-slider-thumb {
|
||||
background: #eeeeee;
|
||||
border-color: #3535cb;
|
||||
transform: scale(1.25)
|
||||
}
|
||||
|
||||
.plyr__controls button {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
-ms-flex-negative: 0;
|
||||
flex-shrink: 0;
|
||||
overflow: visible;
|
||||
vertical-align: middle;
|
||||
padding: 7px;
|
||||
border: 0;
|
||||
background: 0 0;
|
||||
border-radius: 0px;
|
||||
cursor: pointer;
|
||||
transition: background .3s ease,color .3s ease,opacity .3s ease;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
/* Feuerfick */
|
||||
.plyr input[type="range"]::-moz-range-thumb {
|
||||
position: relative;
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
background: #eeeeee;
|
||||
border: 2px solid #3535cb;
|
||||
border-radius: 100%;
|
||||
transition: background .2s ease, border .2s ease, transform .2s ease;
|
||||
box-shadow: 0 1px 1px rgba(0, 0, 0, .15), 0 0 0 1px rgba(0, 0, 0, .15);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.plyr input[type=range]:active::-moz-range-thumb {
|
||||
background: #eeeeee;
|
||||
border-color: #3535cb;
|
||||
transform: scale(1.25)
|
||||
}
|
||||
|
||||
/* Audio */
|
||||
.plyr--audio .plyr__controls {
|
||||
padding: 0;
|
||||
border-radius: inherit;
|
||||
background: #eeeeee;
|
||||
border: 0;
|
||||
color: #3333cc;
|
||||
width: 300px;
|
||||
padding-right: 5;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
.plyr--audio .plyr__controls button.tab-focus:focus, .plyr--audio .plyr__controls button:hover, .plyr__play-large {
|
||||
background: #3535cb;
|
||||
color: #eeeeee;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.plyr--audio .plyr__progress--buffer, .plyr--audio .plyr__volume--display {
|
||||
background: rgb(170, 170, 204);
|
||||
}
|
192
public/s/css/light.css
Normal file
187
public/s/css/master.css
Normal file
@ -0,0 +1,187 @@
|
||||
@import url('https://fonts.googleapis.com/css?family=Space+Mono');
|
||||
|
||||
body {
|
||||
font-family: 'Space Mono', monospace;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.mudderfigg {
|
||||
padding: 10px;
|
||||
border-radius: 5px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.id {
|
||||
text-align: center;
|
||||
background: #262626;
|
||||
padding: 5px;
|
||||
border-radius: 0;
|
||||
color: white;
|
||||
vertical-align: baseline;
|
||||
border: 1px solid #99ff00;
|
||||
}
|
||||
|
||||
.id > a {
|
||||
color: #99ff00;
|
||||
}
|
||||
|
||||
|
||||
.panel {
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
border-top: 2px dotted #99ff00;
|
||||
}
|
||||
|
||||
.panel.info {
|
||||
margin-top: 0px;
|
||||
width: 1200px;
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
margin: 0 auto;
|
||||
width: 1200px;
|
||||
border-left: 1px solid black;
|
||||
border-right: 1px solid black;
|
||||
}
|
||||
|
||||
.medium, .thumbnail {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-top: 0px;
|
||||
background: #484747;
|
||||
border: 0px solid #99ff00;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.controls {
|
||||
border-bottom: 1px solid;
|
||||
width: 1200px;
|
||||
margin-top: 35px;
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
a#next, a#prev {
|
||||
position: relative;
|
||||
font-weight: normal;
|
||||
top: 0px;
|
||||
bottom: 932px;
|
||||
margin: unset;
|
||||
font-size: 18px;
|
||||
color: #99ff00;
|
||||
padding: 140px 40px 140px 40px;
|
||||
cursor: pointer;
|
||||
-webkit-transform: translateZ(0);
|
||||
align-content: inherit;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
a#next, a#prev {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
img.van {
|
||||
width: 171px;
|
||||
height: 28px;
|
||||
background-image: url(/s/img/f0ck_small.png);
|
||||
background-position: 0px -1px;
|
||||
border: 1px solid transparent;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
|
||||
.van {
|
||||
border: 0;
|
||||
box-shadow: none;
|
||||
}
|
||||
.navbar {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.return {
|
||||
padding: 0;
|
||||
margin-top: -35px;
|
||||
top: inherit;
|
||||
}
|
||||
|
||||
.audiojs {
|
||||
height: 360px;
|
||||
width: 640px;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
input, select, textarea {
|
||||
border: unset;
|
||||
background: #262626;
|
||||
color: #f1e3ce;
|
||||
font-family: 'Space Mono', monospace;
|
||||
font-size: 99%;
|
||||
}
|
||||
|
||||
/* Blöde Box */
|
||||
/*body:after {
|
||||
content: "gemaked vong 1 spast, 1 nudelsuppe unt 1 hunt. hypfer isd doof.";
|
||||
position: fixed;
|
||||
background: #484747;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
color: #9f0;
|
||||
border-left: 1px solid black;
|
||||
border-top: 1px solid black;
|
||||
padding: 5px;
|
||||
}*/
|
||||
|
||||
.my-video-dimensions {
|
||||
width: 900px;
|
||||
height: auto;
|
||||
min-height: 500px;
|
||||
}
|
||||
|
||||
img#f0ck-image {
|
||||
max-width: 100%;
|
||||
max-height: 500px;
|
||||
}
|
||||
|
||||
.vjs-audio.vjs-has-started .vjs-poster {
|
||||
display: block;
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
.vjs-poster {
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
a#elfe {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-self: center;
|
||||
max-height: fit-content;
|
||||
max-height: -moz-fit-content;
|
||||
}
|
||||
|
||||
.return-how {
|
||||
position: unset;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.f0ckme {
|
||||
color: inherit;
|
||||
text-align: center;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
/* RIP TERRY */
|
||||
.thumb[src="./t/34449.png"] {
|
||||
transition-duration: 0.2s;
|
||||
-webkit-transition-duration: 0.2s;
|
||||
background-color: gold;
|
||||
border-width: medium;
|
||||
border-color: gold;
|
||||
font-size: 18px;
|
||||
font-style: italic;
|
||||
vertical-align: middle;
|
||||
height: 128px;
|
||||
}
|
197
public/s/css/n0xy.css
Normal file
@ -0,0 +1,197 @@
|
||||
body {
|
||||
background-color: #0b0b0e;
|
||||
font-family: monospace;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
ul#posts {
|
||||
padding-top: 3.2em;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
border-left: 0;
|
||||
border-right: 0;
|
||||
}
|
||||
|
||||
.thumb {
|
||||
border: 1px solid #1dadb04d;
|
||||
}
|
||||
|
||||
.id > a {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #1dadb0;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-shadow: 2px 1px 15px #1dadb0;
|
||||
color: #1dadb0;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a#next, a#prev {
|
||||
color: #1dadb0;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
|
||||
border-bottom-color: currentcolor;
|
||||
border-bottom-style: none;
|
||||
border-bottom-width: 0px;
|
||||
background-color: #121212;
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAYAAAA4GpVBAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90GBgMqHcZ0EYUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAF0lEQVQI12NgYGAwZsAECDEWBgYGBgYACpwAazfG694AAAAASUVORK5CYII=");
|
||||
color: #1dadb0;
|
||||
text-shadow: 0 1px 1px #000;
|
||||
overflow: auto;
|
||||
border-bottom: 1px solid;
|
||||
box-shadow: 0 0 5px rgb(0, 0, 0);
|
||||
|
||||
}
|
||||
|
||||
.return {
|
||||
border-bottom-color: currentcolor;
|
||||
border-bottom-style: none;
|
||||
border-bottom-width: 0px;
|
||||
background-color: #121212;
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAYAAAA4GpVBAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90GBgMqHcZ0EYUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAF0lEQVQI12NgYGAwZsAECDEWBgYGBgYACpwAazfG694AAAAASUVORK5CYII=");
|
||||
color: #1dadb0;
|
||||
text-shadow: 0 1px 1px #000;
|
||||
overflow: auto;
|
||||
border-bottom: 1px solid;
|
||||
box-shadow: 0 0 5px rgb(0, 0, 0);
|
||||
margin-top: -55px;
|
||||
}
|
||||
|
||||
.controls {
|
||||
border: 0;
|
||||
border-bottom-color: currentcolor;
|
||||
border-bottom-style: none;
|
||||
border-bottom-width: 0px;
|
||||
background-color: #121212;
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAYAAAA4GpVBAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90GBgMqHcZ0EYUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAF0lEQVQI12NgYGAwZsAECDEWBgYGBgYACpwAazfG694AAAAASUVORK5CYII=");
|
||||
color: #1dadb0;
|
||||
text-shadow: 0 1px 1px #000;
|
||||
overflow: auto;
|
||||
border-bottom: 1px solid;
|
||||
box-shadow: 0 0 5px rgb(0, 0, 0);
|
||||
margin-top: 55px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.medium {
|
||||
background-color: #121212;
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAYAAAA4GpVBAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90GBgMqHcZ0EYUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAF0lEQVQI12NgYGAwZsAECDEWBgYGBgYACpwAazfG694AAAAASUVORK5CYII=");
|
||||
color: #1dadb0;
|
||||
text-shadow: 0 1px 1px #000;
|
||||
overflow: auto;
|
||||
box-shadow: 0 0 5px rgb(0, 0, 0);
|
||||
padding-top: 15px;
|
||||
padding-bottom: 15px;
|
||||
border-bottom: 1px solid;
|
||||
}
|
||||
|
||||
.panel.info {
|
||||
border-bottom-color: currentcolor;
|
||||
border-bottom-style: none;
|
||||
border-bottom-width: 0px;
|
||||
background-color: #121212;
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAYAAAA4GpVBAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90GBgMqHcZ0EYUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAF0lEQVQI12NgYGAwZsAECDEWBgYGBgYACpwAazfG694AAAAASUVORK5CYII=");
|
||||
color: #1dadb0;
|
||||
text-shadow: 0 1px 1px #000;
|
||||
overflow: auto;
|
||||
box-shadow: 0 0 5px rgb(0, 0, 0);
|
||||
border: 0;
|
||||
margin-top: 10px;
|
||||
border-bottom: 1px solid;
|
||||
}
|
||||
|
||||
.id {
|
||||
background: #090909;
|
||||
background-image: none;
|
||||
color: #1dadb0;
|
||||
border: 0;
|
||||
align-self: center;
|
||||
font-size: 90%;
|
||||
border-radius: 5px;
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAYAAAA4GpVBAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90GBgMqHcZ0EYUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAF0lEQVQI12NgYGAwZsAECDEWBgYGBgYACpwAazfG694AAAAASUVORK5CYII=");
|
||||
box-shadow: 0 0 5px rgb(0, 0, 0);
|
||||
}
|
||||
|
||||
img {
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
input, select, textarea {
|
||||
border: 1px solid transparent;
|
||||
background: #090909;
|
||||
color: #1dadb0;
|
||||
font-family: 'Hack', monospace, sans-serif;
|
||||
font-size: 100%;
|
||||
}
|
||||
|
||||
code {
|
||||
color: #1dadb0;
|
||||
padding: 5px;
|
||||
background: black;
|
||||
border: 1px solid;
|
||||
}
|
||||
|
||||
img.van {
|
||||
width: 276px;
|
||||
height: 45px;
|
||||
background-image: url(/s/img/f0xy.png);
|
||||
background-position: 0px -1px;
|
||||
border: 1px solid transparent;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.return > a {
|
||||
display: inline-block;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
.video-js .vjs-control-bar {
|
||||
background-color: #161618 !important;
|
||||
color: #fff;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.video-js .vjs-big-play-button {
|
||||
background-color: #1dadb04d;
|
||||
}
|
||||
|
||||
.video-js:hover .vjs-big-play-button, .video-js .vjs-big-play-button:focus, .video-js .vjs-big-play-button:active {
|
||||
background-color: #1dadb0;
|
||||
}
|
||||
|
||||
.video-js .vjs-play-progress, .video-js .vjs-volume-level {
|
||||
background-color: #1dadb0;
|
||||
}
|
||||
|
||||
.video-js {
|
||||
background-color: #000;
|
||||
}
|
||||
|
||||
.video-js .vjs-control:focus::before, .video-js .vjs-control:hover::before {
|
||||
text-shadow: 0px 0px 0.2em #fff,0 0 0.2em #262626,0 0 0.2em #262626;
|
||||
}
|
||||
|
||||
.video-js .vjs-loading-spinner {
|
||||
border-color: #1dadb0;
|
||||
}
|
||||
|
||||
div#my-video {
|
||||
border-radius: 0px;
|
||||
box-shadow: none;
|
||||
margin-bottom: 15px;
|
||||
margin-top: 15px;
|
||||
border: 2px solid #161618;
|
||||
}
|
||||
|
||||
.navbar > a {
|
||||
display: inline-block;
|
||||
vertical-align: bottom;
|
||||
}
|
181
public/s/css/pink.css
Normal file
@ -0,0 +1,181 @@
|
||||
.thumb {
|
||||
border: 2px solid #ff008d;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0em auto 3em auto;
|
||||
background-color: #1b1a1a;
|
||||
color: #848484;
|
||||
font-family: Monospace;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
|
||||
a {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #ff008d;
|
||||
}
|
||||
|
||||
input, select, textarea {
|
||||
border: 1px double #ff008d;
|
||||
background: #2f2f2f;
|
||||
color: #ffffff;
|
||||
font-family: 'Hack', monospace, sans-serif;
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
.return {
|
||||
text-align: center;
|
||||
font-size: 25px;
|
||||
border-bottom: 2px solid #ff008d;
|
||||
margin-top: -55px;
|
||||
}
|
||||
|
||||
.controls {
|
||||
text-align: center;
|
||||
color: #ff008d;
|
||||
font-weight: bold;
|
||||
width: 888px;
|
||||
margin: 0 auto;
|
||||
background: #484747;
|
||||
padding-top: 0;
|
||||
margin-top: 55px;
|
||||
border: 2px solid #ff008d;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
margin: 0 auto;
|
||||
width: 100%;
|
||||
border: 0;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
font-weight: bold;
|
||||
position: fixed;
|
||||
overflow: visible;
|
||||
z-index: 999;
|
||||
background-color: #484747;
|
||||
border-bottom: 2px solid #ff008d;
|
||||
text-align: center;
|
||||
top: 0;
|
||||
color: #ff008d;
|
||||
}
|
||||
|
||||
.medium, .thumbnail {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-top: 5px;
|
||||
background: #484747;
|
||||
border: 2px solid #ff008d;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
span.id {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
a#holland {
|
||||
color: #ff008d;
|
||||
}
|
||||
|
||||
code {
|
||||
color: #ff008d;
|
||||
}
|
||||
|
||||
.panel {
|
||||
margin-bottom: 0;
|
||||
background-color: rgb(72, 71, 71);
|
||||
border: 2px solid #ff008d;
|
||||
border-radius: 0px;
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
width: 25%;
|
||||
float: left;
|
||||
position: relative;
|
||||
min-height: 1px;
|
||||
}
|
||||
|
||||
.plyr--audio .plyr__controls {
|
||||
padding: 0;
|
||||
border-radius: inherit;
|
||||
background: #1b1a1a;
|
||||
border: 0;
|
||||
color: #ff008d;
|
||||
width: 300px;
|
||||
padding-right: 5;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
.plyr input[type=range]::-webkit-slider-thumb {
|
||||
-webkit-appearance: none;
|
||||
margin-top: -4px;
|
||||
position: relative;
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
background: #262626;
|
||||
border: 1px solid #ff008d;
|
||||
border-radius: 100%;
|
||||
transition: background .2s ease,border .2s ease,transform .2s ease;
|
||||
box-shadow: 0 1px 1px rgba(0,0,0,.15), 0 0 0 1px rgba(0,0,0,.15);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.plyr__progress--played, .plyr__volume--display {
|
||||
z-index: 1;
|
||||
color: #ff008d;
|
||||
background: 0 0;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.plyr--audio .plyr__controls button.tab-focus:focus, .plyr--audio .plyr__controls button:hover, .plyr__play-large {
|
||||
background: #484747;
|
||||
color: #ff008d;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.plyr input[type=range]:active::-webkit-slider-thumb {
|
||||
background: #262626;
|
||||
border-color: #ff008d;
|
||||
transform: scale(1.25)
|
||||
}
|
||||
|
||||
.plyr--video .plyr__controls {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 2;
|
||||
padding: 0px 0px 0px;
|
||||
background: rgba(38, 38, 38, 0.97);
|
||||
border-bottom-left-radius: inherit;
|
||||
border-bottom-right-radius: inherit;
|
||||
color: #ff008d;
|
||||
transition: opacity .3s cubic-bezier(0.12, 0.63, 0.25, 1);
|
||||
}
|
||||
|
||||
/* Feuerfick */
|
||||
.plyr input[type="range"]::-moz-range-thumb {
|
||||
position: relative;
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
background: #ff008d;
|
||||
border: 2px solid #262626;
|
||||
border-radius: 100%;
|
||||
transition: background .2s ease, border .2s ease, transform .2s ease;
|
||||
box-shadow: 0 1px 1px rgba(0, 0, 0, .15), 0 0 0 1px rgba(0, 0, 0, .15);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.plyr input[type=range]:active::-moz-range-thumb {
|
||||
background: #ff008d;
|
||||
border-color: #262626;
|
||||
transform: scale(1.25)
|
||||
}
|
||||
|
||||
.plyr--video .plyr__controls button.tab-focus:focus, .plyr--video .plyr__controls button:hover {
|
||||
background: #484747;
|
||||
color: #ff008d;
|
||||
border-radius: 0;
|
||||
}
|
1
public/s/css/plyr.css
Normal file
323
public/s/css/style.css
Normal file
@ -0,0 +1,323 @@
|
||||
* {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html, body {
|
||||
max-height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
body {
|
||||
margin: 0em auto 3em auto;
|
||||
background-color: #262626;
|
||||
color: #fff;
|
||||
font-family: Monospace;
|
||||
font-size: 12px;
|
||||
line-height: 1.42857143;
|
||||
}
|
||||
|
||||
.contact {
|
||||
margin: 20px;
|
||||
}
|
||||
|
||||
input, select, textarea {
|
||||
border: 1px double #99ff00;
|
||||
background: #282A2E;
|
||||
color: #f1e3ce;
|
||||
font-family: 'Hack', monospace, sans-serif;
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
ul#posts {
|
||||
width: calc(100% - 210px);
|
||||
margin: 0;
|
||||
margin-left: 100px;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
display: -webkit-box;
|
||||
display: -webkit-flex;
|
||||
display: -moz-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-flex-flow: row wrap;
|
||||
flex-flow: row wrap;
|
||||
justify-content: flex-start;
|
||||
-webkit-justify-content: flex-start;
|
||||
padding-top: 2.2em;
|
||||
}
|
||||
li.post {
|
||||
padding: 5px;
|
||||
width: 128px;
|
||||
height: 128px;
|
||||
margin-top: 5px;
|
||||
line-height: 128px;
|
||||
-webkit-flex: 1 1 auto;
|
||||
ms-flex: 1 1 auto;
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
.thumb {
|
||||
border: 2px solid #4c4a4a;
|
||||
}
|
||||
.thumb:hover {
|
||||
opacity: 0.7;
|
||||
}
|
||||
.clear {
|
||||
clear: both;
|
||||
padding: 1em 0;
|
||||
}
|
||||
a {
|
||||
color: #9f0;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover {
|
||||
color: #74c100;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.medium, .thumbnail {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-top: 5px;
|
||||
background: #484747;
|
||||
border: 0px solid #99ff00;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.info {
|
||||
padding-top: 5px;
|
||||
}
|
||||
.id {
|
||||
text-align: center;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
.controls {
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
width: 888px;
|
||||
margin: 0 auto;
|
||||
padding-top: 0;
|
||||
margin-top: 35px;
|
||||
border: 0px solid #99ff00;
|
||||
color: #99ff00;
|
||||
background: #484747;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
margin: 0 auto;
|
||||
width: 100%;
|
||||
border: 0;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
font-weight: bold;
|
||||
position: fixed;
|
||||
overflow: visible;
|
||||
z-index: 999;
|
||||
background-color: #484747;
|
||||
border-bottom: 2px solid #99ff00;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.return {
|
||||
text-align: center;
|
||||
border: 0;
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
margin-bottom: 5px;
|
||||
margin-top: -35px;
|
||||
position: fixed;
|
||||
overflow: visible;
|
||||
z-index: 999;
|
||||
border-bottom: 1px solid #99ff00;
|
||||
padding: 5px;
|
||||
background: #484747;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.irc {
|
||||
margin: 20px;
|
||||
}
|
||||
code {
|
||||
color: #9df943;
|
||||
}
|
||||
|
||||
.panel {
|
||||
margin-bottom: 0;
|
||||
background-color: #484747;
|
||||
border: 0px solid #99ff00;
|
||||
border-radius: 0px;
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
width: 25%;
|
||||
float: left;
|
||||
position: relative;
|
||||
min-height: 1px;
|
||||
color: #ffffff;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.panel.info {
|
||||
margin: 0 auto;
|
||||
margin-top: 5px;
|
||||
float: none;
|
||||
width: 888px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
|
||||
img {
|
||||
vertical-align: middle;
|
||||
max-height: 770px;
|
||||
border: 1px solid black;
|
||||
box-shadow: 0 0 5px #000;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
margin: 0 auto;
|
||||
width: 888px;
|
||||
}
|
||||
|
||||
video#player {
|
||||
max-width: 100%;
|
||||
height: 50%;
|
||||
}
|
||||
|
||||
/* Plyr */
|
||||
.plyr--audio .plyr__controls {
|
||||
padding: 0;
|
||||
border-radius: inherit;
|
||||
background: #262626;
|
||||
border: 0;
|
||||
color: #99ff00;
|
||||
width: 300px;
|
||||
padding-right: 5;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
.plyr audio, .plyr video {
|
||||
width: 100%;
|
||||
height: auto!important;
|
||||
vertical-align: middle;
|
||||
border-radius: inherit;
|
||||
}
|
||||
|
||||
/* Video Player Style */
|
||||
.plyr--audio .plyr__controls button.tab-focus:focus, .plyr--audio .plyr__controls button:hover, .plyr__play-large {
|
||||
background: #484747;
|
||||
color: #9f0;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.plyr--video .plyr__controls {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 2;
|
||||
padding: 0px 0px 0px;
|
||||
background: rgba(38, 38, 38, 0.97);
|
||||
border-bottom-left-radius: inherit;
|
||||
border-bottom-right-radius: inherit;
|
||||
color: #91ee06;
|
||||
transition: opacity .3s cubic-bezier(0.12, 0.63, 0.25, 1);
|
||||
}
|
||||
|
||||
.plyr {
|
||||
position: relative;
|
||||
max-width: 100%;
|
||||
min-width: 200px;
|
||||
font-family: Avenir,'Avenir Next','Helvetica Neue','Segoe UI',Helvetica,Arial,sans-serif;
|
||||
direction: ltr;
|
||||
border: 1px solid #0c0d0c;
|
||||
box-shadow: 0 0 15px #000;
|
||||
}
|
||||
|
||||
.plyr--video .plyr__controls button.tab-focus:focus, .plyr--video .plyr__controls button:hover {
|
||||
background: #484747;
|
||||
color: #9f0;
|
||||
border-radius: 0;
|
||||
}
|
||||
.plyr__progress--played, .plyr__volume--display {
|
||||
z-index: 1;
|
||||
color: #99ff00;
|
||||
background: 0 0;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.plyr input[type=range]::-webkit-slider-thumb {
|
||||
-webkit-appearance: none;
|
||||
margin-top: -4px;
|
||||
position: relative;
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
background: #262626;
|
||||
border: 1px solid #99ff00;
|
||||
border-radius: 100%;
|
||||
transition: background .2s ease,border .2s ease,transform .2s ease;
|
||||
box-shadow: 0 1px 1px rgba(0,0,0,.15), 0 0 0 1px rgba(0,0,0,.15);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.plyr input[type=range]:active::-webkit-slider-thumb {
|
||||
background: #262626;
|
||||
border-color: #99ff00;
|
||||
transform: scale(1.25)
|
||||
}
|
||||
|
||||
.plyr--fullscreen-active video {
|
||||
height: 100%!important;
|
||||
max-width: 100%!important;
|
||||
}
|
||||
|
||||
.plyr--fullscreen-active {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
z-index: 10000000;
|
||||
background: #000;
|
||||
border-radius: 0!important;
|
||||
border: 0!important;
|
||||
}
|
||||
|
||||
/* Feuerfick */
|
||||
.plyr input[type="range"]::-moz-range-thumb {
|
||||
position: relative;
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
background: #9f0;
|
||||
border: 2px solid #262626;
|
||||
border-radius: 100%;
|
||||
transition: background .2s ease, border .2s ease, transform .2s ease;
|
||||
box-shadow: 0 1px 1px rgba(0, 0, 0, .15), 0 0 0 1px rgba(0, 0, 0, .15);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.plyr input[type=range]:active::-moz-range-thumb {
|
||||
background: #9f0;
|
||||
border-color: #262626;
|
||||
transform: scale(1.25)
|
||||
}
|
||||
|
||||
.savetheinternet {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
text-align: center;
|
||||
background: black;
|
||||
}
|
||||
|
||||
.f0ckme {
|
||||
color: inherit;
|
||||
text-align: center;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
pre {
|
||||
letter-spacing: 7px;
|
||||
}
|
277
public/s/css/term.css
Normal file
@ -0,0 +1,277 @@
|
||||
@import url('https://fonts.googleapis.com/css?family=VT323');
|
||||
|
||||
body {
|
||||
margin: 0em auto 3em auto;
|
||||
background-color: #040404;
|
||||
color: #fff;
|
||||
font-family: 'VT323', monospace;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
span.id {
|
||||
color: #00DF00;
|
||||
text-shadow: 0 0 20px #00DF00;
|
||||
background: #040404;
|
||||
box-shadow: 0 0 7px 0px #00df00;
|
||||
border-radius: 5px;
|
||||
border: unset;
|
||||
}
|
||||
|
||||
img.van {
|
||||
width: 171px;
|
||||
height: 28px;
|
||||
background-image: url(/s/img/term_f0ck_logo.png);
|
||||
background-position: 0px -1px;
|
||||
border: 1px solid transparent;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
|
||||
.id > a {
|
||||
color: rgba(255,0,247,1);
|
||||
}
|
||||
|
||||
span.src>a {
|
||||
color: #ff00f7;
|
||||
text-shadow: 0 0 20px #ff00f7;
|
||||
}
|
||||
|
||||
input, select, textarea {
|
||||
border: 1px double #ff00f7;
|
||||
background: #282A2E;
|
||||
color: #f1e3ce;
|
||||
font-family: 'VT323', 'Courier', monospace;
|
||||
font-size: 80%;
|
||||
-moz-box-shadow: 0px 0px 37px 5px rgba(43,255,0,1);
|
||||
-webkit-box-shadow: 0px 0px 10px 0px rgba(255,0,247,1);
|
||||
-moz-box-shadow: 0px 0px 10px 0px rgba(255,0,247,1);
|
||||
box-shadow: 0px 0px 10px 0px rgba(255,0,247,1);
|
||||
}
|
||||
|
||||
.return {
|
||||
text-align: center;
|
||||
font-size: 17px;
|
||||
color: #00DF00;
|
||||
text-shadow: 0 0 20px #00DF00;
|
||||
background: #0b0b0b;
|
||||
border-bottom: 2px solid #03dc03;
|
||||
margin-top: -35px;
|
||||
}
|
||||
|
||||
.controls {
|
||||
text-align: center;
|
||||
color: #00d500;
|
||||
font-weight: bold;
|
||||
margin: 0 auto;
|
||||
background: #0b0b0b;
|
||||
padding-top: 0;
|
||||
margin-top: 35px;
|
||||
border: 2px solid #03dc03;
|
||||
}
|
||||
|
||||
.medium, .thumbnail {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-top: 5px;
|
||||
background: #0b0b0b;
|
||||
border: 2px solid #03dc03;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
div#my-video {
|
||||
border-radius: 5px;
|
||||
box-shadow: 0 0 20px #000000;
|
||||
margin-bottom: 15px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
a#elfe {
|
||||
margin-bottom: 15px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
a#next {
|
||||
color: #00DF00;
|
||||
text-shadow: 0 0 20px #00DF00;
|
||||
}
|
||||
|
||||
a#random {
|
||||
color: #00DF00;
|
||||
text-shadow: 0 0 20px #00DF00;
|
||||
}
|
||||
|
||||
a#prev {
|
||||
color: #00DF00;
|
||||
text-shadow: 0 0 20px #00DF00;
|
||||
}
|
||||
|
||||
.panel {
|
||||
margin-bottom: 0;
|
||||
background-color: rgba(16, 16, 16, 0.61);
|
||||
border: 2px solid #0b842b;
|
||||
border-radius: 0px;
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
width: 25%;
|
||||
float: left;
|
||||
position: relative;
|
||||
min-height: 1px;
|
||||
}
|
||||
|
||||
.thumb:hover {
|
||||
opacity: 0.7;
|
||||
-webkit-box-shadow: 0px 0px 6px 0px rgba(0,255,30,1)
|
||||
-moz-box-shadow: 0px 0px 6px 0px rgba(0,255,30,1);
|
||||
box-shadow: 0px 0px 6px 0px rgba(0,255,30,1);
|
||||
}
|
||||
|
||||
.thumb {
|
||||
border: 2px solid #00df00;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
margin: 0 auto;
|
||||
width: 100%;
|
||||
border: 0;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
font-weight: bold;
|
||||
position: fixed;
|
||||
overflow: visible;
|
||||
z-index: 999;
|
||||
background-color: #0b0b0b;
|
||||
border-bottom: 2px solid #00df00;
|
||||
text-align: center;
|
||||
top: 0;
|
||||
color: #00df00;
|
||||
}
|
||||
|
||||
.navbar>a {
|
||||
color: rgba(43,255,0,1);
|
||||
text-shadow: 0 0 20px #00DF00;
|
||||
}
|
||||
|
||||
.navbar>a:hover {
|
||||
color: #00b700;
|
||||
}
|
||||
|
||||
.contact>a {
|
||||
color: rgba(43,255,0,1);
|
||||
text-shadow: 0 0 20px #00DF00;
|
||||
}
|
||||
|
||||
.contact>a:hover {
|
||||
color: #00b700;
|
||||
}
|
||||
|
||||
code {
|
||||
color: rgba(43,255,0,1);
|
||||
text-shadow: 0 0 20px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #00df00;
|
||||
text-shadow: 0 0 20px;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #00b700;
|
||||
}
|
||||
|
||||
.plyr__progress--played, .plyr__volume--display {
|
||||
z-index: 1;
|
||||
color: #00df00;
|
||||
background: 0 0;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
select#themeSelector {
|
||||
color: #00DF00;
|
||||
text-shadow: 0 0 20px #00DF00;
|
||||
background: #040404;
|
||||
border-radius: 0;
|
||||
border: unset;
|
||||
box-shadow: unset;
|
||||
padding-bottom: 3px;
|
||||
padding-top: 3px;
|
||||
}
|
||||
|
||||
input, select, textarea {
|
||||
border: #00df00;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
margin: 0 auto;
|
||||
border-left: 0px solid black;
|
||||
border-right: 0px solid black;
|
||||
}
|
||||
|
||||
img {
|
||||
vertical-align: middle;
|
||||
border: 0;
|
||||
box-shadow: 0px 0px 20px 0px black;
|
||||
}
|
||||
|
||||
.panel {
|
||||
border-top: 0px;
|
||||
}
|
||||
|
||||
.panel.info {
|
||||
border: 0;
|
||||
border-left: 2px solid #03dc03;
|
||||
border-right: 2px solid #03dc03;
|
||||
border-bottom: 2px solid #03dc03;
|
||||
}
|
||||
|
||||
.options {
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.video-js .vjs-loading-spinner {
|
||||
border-color: #03dc03;
|
||||
}
|
||||
|
||||
.video-js .vjs-control:focus:before, .video-js .vjs-control:hover:before {
|
||||
text-shadow: 0 0 0.8em #03dc03, 0 0 0.8em #03dc03, 0 0 0.8em #03dc03;
|
||||
}
|
||||
|
||||
.video-js .vjs-control:focus:before, .video-js .vjs-control:hover:before, .video-js .vjs-control:focus {
|
||||
text-shadow: 0 0 1em #03dc03;
|
||||
}
|
||||
|
||||
.video-js .vjs-control-bar {
|
||||
background-color: rgba(4, 4, 4, 0.82) !important;
|
||||
color: #ffffff;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.video-js .vjs-control-bar {
|
||||
background-color: rgba(4, 4, 4, 0.82) !important;
|
||||
color: #ffffff;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
i.fa.fa-cog {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.options {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.video-js .vjs-play-progress, .video-js .vjs-volume-level {
|
||||
background-color: #03dc03;
|
||||
box-shadow: 0 0 20px 0px #01de01;
|
||||
}
|
||||
|
||||
.video-js:hover .vjs-big-play-button, .video-js .vjs-big-play-button:focus, .video-js .vjs-big-play-button:active {
|
||||
background-color: #00df00;
|
||||
box-shadow: 0 0 10px 0px #00df00;
|
||||
}
|
||||
|
||||
.video-js.vjs-fullscreen, .video-js.vjs-fullscreen .vjs-tech {
|
||||
margin-bottom: 0 !important;
|
||||
margin-top: 0 !important;
|
||||
}
|
1
public/s/css/video-js.min.css
vendored
Normal file
276
public/s/css/vsg-skin.css
Normal file
@ -0,0 +1,276 @@
|
||||
.video-js .vjs-menu-button-inline.vjs-slider-active,.video-js .vjs-menu-button-inline:focus,.video-js .vjs-menu-button-inline:hover,.video-js.vjs-no-flex .vjs-menu-button-inline {
|
||||
width: 10em
|
||||
}
|
||||
|
||||
.video-js .vjs-controls-disabled .vjs-big-play-button {
|
||||
display: none!important
|
||||
}
|
||||
|
||||
.video-js .vjs-control {
|
||||
width: 3em
|
||||
}
|
||||
|
||||
.video-js .vjs-menu-button-inline:before {
|
||||
width: 1.5em
|
||||
}
|
||||
|
||||
.vjs-menu-button-inline .vjs-menu {
|
||||
left: 3em
|
||||
}
|
||||
|
||||
.vjs-paused.vjs-has-started.video-js .vjs-big-play-button,.video-js.vjs-ended .vjs-big-play-button,.video-js.vjs-paused .vjs-big-play-button {
|
||||
display: block
|
||||
}
|
||||
|
||||
.video-js .vjs-load-progress div,.vjs-seeking .vjs-big-play-button,.vjs-waiting .vjs-big-play-button {
|
||||
display: none!important
|
||||
}
|
||||
|
||||
.video-js .vjs-mouse-display:after,.video-js .vjs-play-progress:after {
|
||||
padding: 0 .4em .3em
|
||||
}
|
||||
|
||||
.video-js.vjs-ended .vjs-loading-spinner {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.video-js.vjs-ended .vjs-big-play-button {
|
||||
display: block !important;
|
||||
}
|
||||
|
||||
.video-js *,.video-js:after,.video-js:before {
|
||||
box-sizing: inherit;
|
||||
font-size: inherit;
|
||||
color: inherit;
|
||||
line-height: inherit
|
||||
}
|
||||
|
||||
.video-js.vjs-fullscreen,.video-js.vjs-fullscreen .vjs-tech {
|
||||
width: 100%!important;
|
||||
height: 100%!important
|
||||
}
|
||||
|
||||
.video-js {
|
||||
font-size: 14px;
|
||||
overflow: hidden
|
||||
}
|
||||
|
||||
.video-js .vjs-control {
|
||||
color: inherit
|
||||
}
|
||||
|
||||
.video-js .vjs-menu-button-inline:hover,.video-js.vjs-no-flex .vjs-menu-button-inline {
|
||||
width: 8.35em
|
||||
}
|
||||
|
||||
.video-js .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu .vjs-menu-content {
|
||||
height: 3em;
|
||||
width: 6.35em
|
||||
}
|
||||
|
||||
.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before {
|
||||
text-shadow: 0 0 1em #fff,0 0 1em #fff,0 0 1em #fff
|
||||
}
|
||||
|
||||
.video-js .vjs-spacer,.video-js .vjs-time-control {
|
||||
display: -webkit-box;
|
||||
display: -moz-box;
|
||||
display: -ms-flexbox;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
-webkit-box-flex: 1 1 auto;
|
||||
-moz-box-flex: 1 1 auto;
|
||||
-webkit-flex: 1 1 auto;
|
||||
-ms-flex: 1 1 auto;
|
||||
flex: 1 1 auto
|
||||
}
|
||||
|
||||
.video-js .vjs-time-control {
|
||||
-webkit-box-flex: 0 1 auto;
|
||||
-moz-box-flex: 0 1 auto;
|
||||
-webkit-flex: 0 1 auto;
|
||||
-ms-flex: 0 1 auto;
|
||||
flex: 0 1 auto;
|
||||
width: auto
|
||||
}
|
||||
|
||||
.video-js .vjs-time-control.vjs-time-divider {
|
||||
width: 14px
|
||||
}
|
||||
|
||||
.video-js .vjs-time-control.vjs-time-divider div {
|
||||
width: 100%;
|
||||
text-align: center
|
||||
}
|
||||
|
||||
.video-js .vjs-time-control.vjs-current-time {
|
||||
margin-left: 1em
|
||||
}
|
||||
|
||||
.video-js .vjs-time-control .vjs-current-time-display,.video-js .vjs-time-control .vjs-duration-display {
|
||||
width: 100%
|
||||
}
|
||||
|
||||
.video-js .vjs-time-control .vjs-current-time-display {
|
||||
text-align: right
|
||||
}
|
||||
|
||||
.video-js .vjs-time-control .vjs-duration-display {
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.video-js .vjs-play-progress:before,.video-js .vjs-progress-control .vjs-play-progress:before,.video-js .vjs-remaining-time,.video-js .vjs-volume-level:after,.video-js .vjs-volume-level:before,.video-js.vjs-live .vjs-time-control.vjs-current-time,.video-js.vjs-live .vjs-time-control.vjs-duration,.video-js.vjs-live .vjs-time-control.vjs-time-divider,.video-js.vjs-no-flex .vjs-time-control.vjs-remaining-time {
|
||||
display: none
|
||||
}
|
||||
|
||||
.video-js.vjs-no-flex .vjs-time-control {
|
||||
display: table-cell;
|
||||
width: 4em
|
||||
}
|
||||
|
||||
.video-js .vjs-progress-control {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
width: 100%;
|
||||
height: .5em;
|
||||
top: -.5em
|
||||
}
|
||||
|
||||
.video-js .vjs-progress-control .vjs-load-progress,.video-js .vjs-progress-control .vjs-play-progress,.video-js .vjs-progress-control .vjs-progress-holder {
|
||||
height: 100%
|
||||
}
|
||||
|
||||
.video-js .vjs-progress-control .vjs-progress-holder {
|
||||
margin: 0
|
||||
}
|
||||
|
||||
.video-js .vjs-progress-control:hover {
|
||||
height: 1.5em;
|
||||
top: -1.5em
|
||||
}
|
||||
|
||||
.video-js .vjs-control-bar {
|
||||
-webkit-transition: -webkit-transform .1s ease 0s;
|
||||
-moz-transition: -moz-transform .1s ease 0s;
|
||||
-ms-transition: -ms-transform .1s ease 0s;
|
||||
-o-transition: -o-transform .1s ease 0s;
|
||||
transition: transform .1s ease 0s
|
||||
}
|
||||
|
||||
.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-active .vjs-control-bar,.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-inactive .vjs-control-bar,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-active .vjs-control-bar,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-control-bar,.video-js.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-control-bar {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
-webkit-backface-visibility: hidden;
|
||||
-webkit-transform: translateY(3em);
|
||||
-moz-transform: translateY(3em);
|
||||
-ms-transform: translateY(3em);
|
||||
-o-transform: translateY(3em);
|
||||
transform: translateY(3em);
|
||||
-webkit-transition: -webkit-transform 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s ease 0s;
|
||||
-ms-transition: -ms-transform 1s ease 0s;
|
||||
-o-transition: -o-transform 1s ease 0s;
|
||||
transition: transform 1s ease 0s
|
||||
}
|
||||
|
||||
.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-active .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-inactive .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-active .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-progress-control,.video-js.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-progress-control {
|
||||
height: .25em;
|
||||
top: -.25em;
|
||||
pointer-events: none;
|
||||
-webkit-transition: height 1s,top 1s;
|
||||
-moz-transition: height 1s,top 1s;
|
||||
-ms-transition: height 1s,top 1s;
|
||||
-o-transition: height 1s,top 1s;
|
||||
transition: height 1s,top 1s
|
||||
}
|
||||
|
||||
.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-active.vjs-fullscreen .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-inactive.vjs-fullscreen .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-active.vjs-fullscreen .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-inactive.vjs-fullscreen .vjs-progress-control,.video-js.vjs-has-started.vjs-playing.vjs-user-inactive.vjs-fullscreen .vjs-progress-control {
|
||||
opacity: 0;
|
||||
-webkit-transition: opacity 1s ease 1s;
|
||||
-moz-transition: opacity 1s ease 1s;
|
||||
-ms-transition: opacity 1s ease 1s;
|
||||
-o-transition: opacity 1s ease 1s;
|
||||
transition: opacity 1s ease 1s
|
||||
}
|
||||
|
||||
.video-js.vjs-live .vjs-live-control {
|
||||
margin-left: 1em
|
||||
}
|
||||
|
||||
.video-js .vjs-big-play-button {
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
margin-left: -1em;
|
||||
margin-top: -1em;
|
||||
width: 2em;
|
||||
height: 2em;
|
||||
line-height: 2em;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
font-size: 3.5em;
|
||||
background-color: rgba(0,0,0,.45);
|
||||
color: #fff;
|
||||
-webkit-transition: border-color .4s,outline .4s,background-color .4s;
|
||||
-moz-transition: border-color .4s,outline .4s,background-color .4s;
|
||||
-ms-transition: border-color .4s,outline .4s,background-color .4s;
|
||||
-o-transition: border-color .4s,outline .4s,background-color .4s;
|
||||
transition: border-color .4s,outline .4s,background-color .4s
|
||||
}
|
||||
|
||||
.video-js .vjs-menu-button-popup .vjs-menu {
|
||||
left: -3em
|
||||
}
|
||||
|
||||
.video-js .vjs-menu-button-popup .vjs-menu .vjs-menu-content {
|
||||
background-color: transparent;
|
||||
width: 12em;
|
||||
left: -1.5em;
|
||||
padding-bottom: .5em
|
||||
}
|
||||
|
||||
.video-js .vjs-menu-button-popup .vjs-menu .vjs-menu-item,.video-js .vjs-menu-button-popup .vjs-menu .vjs-menu-title {
|
||||
background-color: #151b17;
|
||||
margin: .3em 0;
|
||||
padding: .5em;
|
||||
border-radius: .3em
|
||||
}
|
||||
|
||||
.video-js .vjs-menu-button-popup .vjs-menu .vjs-menu-item.vjs-selected {
|
||||
background-color: #2483d5
|
||||
}
|
||||
|
||||
.video-js .vjs-big-play-button {
|
||||
background-color: rgba(0,0,0,0.5);
|
||||
font-size: 2.5em;
|
||||
border-radius: 20%;
|
||||
height: 1.4em !important;
|
||||
line-height: 1.4em !important;
|
||||
margin-top: -0.7em !important
|
||||
}
|
||||
|
||||
.video-js:hover .vjs-big-play-button,.video-js .vjs-big-play-button:focus,.video-js .vjs-big-play-button:active {
|
||||
background-color: #99ff00
|
||||
}
|
||||
|
||||
.video-js .vjs-loading-spinner {
|
||||
border-color: #99ff00
|
||||
}
|
||||
|
||||
.video-js .vjs-control-bar2 {
|
||||
background-color: #262626
|
||||
}
|
||||
|
||||
.video-js .vjs-control-bar {
|
||||
background-color: #262626 !important;
|
||||
color: #ffffff;
|
||||
font-size: 12px
|
||||
}
|
||||
|
||||
.video-js .vjs-play-progress,.video-js .vjs-volume-level {
|
||||
background-color: #99ff00
|
||||
}
|
||||
|
||||
.video-js .vjs-load-progress {
|
||||
background: rgba(255,255,255,0.3);
|
||||
}
|
88
public/s/css/x34.css
Normal file
@ -0,0 +1,88 @@
|
||||
@import url('https://fonts.googleapis.com/css?family=Orbitron');
|
||||
|
||||
body {
|
||||
background: black;
|
||||
font-family: 'Orbitron', sans-serif;
|
||||
}
|
||||
|
||||
.navbar, .return {
|
||||
background-color: #000000;
|
||||
border-bottom: 2px solid #f50083;
|
||||
box-shadow: 0px -2px 20px #f600c1;
|
||||
}
|
||||
|
||||
img.van {
|
||||
width: 171px;
|
||||
height: 28px;
|
||||
background-image: url(/s/img/x34_f0ck_logo.png);
|
||||
background-position: 0px -1px;
|
||||
border: 1px solid transparent;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
a, a:hover {
|
||||
color: #f50083;
|
||||
text-shadow: 0px 0px 10px #f50083;
|
||||
}
|
||||
|
||||
.thumb {
|
||||
box-shadow: 0 0 10px #f50083;
|
||||
border: 2px solid #f50083;
|
||||
}
|
||||
|
||||
.return {
|
||||
margin-top: -50px;
|
||||
}
|
||||
|
||||
.controls {
|
||||
margin-top: 50px;
|
||||
background: #050505;
|
||||
border: 1px solid #f50083;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
border-left: 1px solid #f50083;
|
||||
border-right: 1px solid #f50083;
|
||||
}
|
||||
|
||||
.panel.info {
|
||||
border: 1px solid #f50083;
|
||||
}
|
||||
|
||||
.medium, .thumbnail {
|
||||
background: #050505;
|
||||
}
|
||||
|
||||
.panel {
|
||||
background-color: #050505;
|
||||
}
|
||||
|
||||
.id {
|
||||
background: #000000;
|
||||
border: 1px solid #f50083;
|
||||
}
|
||||
|
||||
a#next, a#prev {
|
||||
color: #f50083;
|
||||
}
|
||||
|
||||
.id > a {
|
||||
color: #f50083;
|
||||
}
|
||||
|
||||
input, select, textarea {
|
||||
background: #000000;
|
||||
font-family: 'Orbitron', sans-serif;
|
||||
}
|
||||
|
||||
.video-js .vjs-play-progress, .video-js .vjs-volume-level {
|
||||
background-color: #f50083;
|
||||
}
|
||||
|
||||
.video-js:hover .vjs-big-play-button, .video-js .vjs-big-play-button:focus, .video-js .vjs-big-play-button:active {
|
||||
background-color: #f50083;
|
||||
}
|
||||
|
||||
.video-js .vjs-control-bar {
|
||||
background-color: #000000 !important;
|
||||
}
|
2337
public/s/font-awesome-4.7.0/css/font-awesome.css
vendored
Normal file
4
public/s/font-awesome-4.7.0/css/font-awesome.min.css
vendored
Normal file
BIN
public/s/font-awesome-4.7.0/fonts/fontawesome-webfont.eot
Normal file
2671
public/s/font-awesome-4.7.0/fonts/fontawesome-webfont.svg
Normal file
After Width: | Height: | Size: 434 KiB |
BIN
public/s/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf
Normal file
BIN
public/s/font-awesome-4.7.0/fonts/fontawesome-webfont.woff
Normal file
BIN
public/s/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2
Normal file
BIN
public/s/img/200.gif
Normal file
After Width: | Height: | Size: 1.9 MiB |
BIN
public/s/img/95_buttons.png
Normal file
After Width: | Height: | Size: 261 B |
20
public/s/img/biohazard.svg
Normal file
After Width: | Height: | Size: 6.4 KiB |
BIN
public/s/img/contact_20px.png
Normal file
After Width: | Height: | Size: 953 B |
BIN
public/s/img/f0ck-lol.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
public/s/img/f0ck.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
public/s/img/f0ck_small.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
public/s/img/f0ckme.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
public/s/img/f0xy.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
BIN
public/s/img/favicon.gif
Normal file
After Width: | Height: | Size: 7.8 KiB |
BIN
public/s/img/favicon.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
public/s/img/how2f.png
Normal file
After Width: | Height: | Size: 376 B |
BIN
public/s/img/how_20px.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
public/s/img/mp3.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
public/s/img/pingu.gif
Normal file
After Width: | Height: | Size: 489 KiB |
1
public/s/img/plyr.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"><symbol id="plyr-captions-off" viewBox="0 0 18 18"><path d="M1 1c-.6 0-1 .4-1 1v11c0 .6.4 1 1 1h4.6l2.7 2.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3l2.7-2.7H17c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1H1zm4.52 10.15c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41C8.47 4.96 7.46 3.76 5.5 3.76c-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69zm7.57 0c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41c-.28-1.15-1.29-2.35-3.25-2.35-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69z" fill-rule="evenodd" fill-opacity=".5"/></symbol><symbol id="plyr-captions-on" viewBox="0 0 18 18"><path d="M1 1c-.6 0-1 .4-1 1v11c0 .6.4 1 1 1h4.6l2.7 2.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3l2.7-2.7H17c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1H1zm4.52 10.15c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41C8.47 4.96 7.46 3.76 5.5 3.76c-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69zm7.57 0c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41c-.28-1.15-1.29-2.35-3.25-2.35-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69z" fill-rule="evenodd"/></symbol><symbol id="plyr-enter-fullscreen" viewBox="0 0 18 18"><path d="M10 3h3.6l-4 4L11 8.4l4-4V8h2V1h-7zM7 9.6l-4 4V10H1v7h7v-2H4.4l4-4z"/></symbol><symbol id="plyr-exit-fullscreen" viewBox="0 0 18 18"><path d="M1 12h3.6l-4 4L2 17.4l4-4V17h2v-7H1zM16 .6l-4 4V1h-2v7h7V6h-3.6l4-4z"/></symbol><symbol id="plyr-fast-forward" viewBox="0 0 18 18"><path d="M7.875 7.171L0 1v16l7.875-6.171V17L18 9 7.875 1z"/></symbol><symbol id="plyr-muted" viewBox="0 0 18 18"><path d="M12.4 12.5l2.1-2.1 2.1 2.1 1.4-1.4L15.9 9 18 6.9l-1.4-1.4-2.1 2.1-2.1-2.1L11 6.9 13.1 9 11 11.1zM3.786 6.008H.714C.286 6.008 0 6.31 0 6.76v4.512c0 .452.286.752.714.752h3.072l4.071 3.858c.5.3 1.143 0 1.143-.602V2.752c0-.601-.643-.977-1.143-.601L3.786 6.008z"/></symbol><symbol id="plyr-pause" viewBox="0 0 18 18"><path d="M6 1H3c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h3c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1zM12 1c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h3c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1h-3z"/></symbol><symbol id="plyr-play" viewBox="0 0 18 18"><path d="M15.562 8.1L3.87.225C3.052-.337 2 .225 2 1.125v15.75c0 .9 1.052 1.462 1.87.9L15.563 9.9c.584-.45.584-1.35 0-1.8z"/></symbol><symbol id="plyr-restart" viewBox="0 0 18 18"><path d="M9.7 1.2l.7 6.4 2.1-2.1c1.9 1.9 1.9 5.1 0 7-.9 1-2.2 1.5-3.5 1.5-1.3 0-2.6-.5-3.5-1.5-1.9-1.9-1.9-5.1 0-7 .6-.6 1.4-1.1 2.3-1.3l-.6-1.9C6 2.6 4.9 3.2 4 4.1 1.3 6.8 1.3 11.2 4 14c1.3 1.3 3.1 2 4.9 2 1.9 0 3.6-.7 4.9-2 2.7-2.7 2.7-7.1 0-9.9L16 1.9l-6.3-.7z"/></symbol><symbol id="plyr-rewind" viewBox="0 0 18 18"><path d="M10.125 1L0 9l10.125 8v-6.171L18 17V1l-7.875 6.171z"/></symbol><symbol id="plyr-volume" viewBox="0 0 18 18"><path d="M15.6 3.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4C15.4 5.9 16 7.4 16 9c0 1.6-.6 3.1-1.8 4.3-.4.4-.4 1 0 1.4.2.2.5.3.7.3.3 0 .5-.1.7-.3C17.1 13.2 18 11.2 18 9s-.9-4.2-2.4-5.7z"/><path d="M11.282 5.282a.909.909 0 0 0 0 1.316c.735.735.995 1.458.995 2.402 0 .936-.425 1.917-.995 2.487a.909.909 0 0 0 0 1.316c.145.145.636.262 1.018.156a.725.725 0 0 0 .298-.156C13.773 11.733 14.13 10.16 14.13 9c0-.17-.002-.34-.011-.51-.053-.992-.319-2.005-1.522-3.208a.909.909 0 0 0-1.316 0zM3.786 6.008H.714C.286 6.008 0 6.31 0 6.76v4.512c0 .452.286.752.714.752h3.072l4.071 3.858c.5.3 1.143 0 1.143-.602V2.752c0-.601-.643-.977-1.143-.601L3.786 6.008z"/></symbol></svg>
|
After Width: | Height: | Size: 3.7 KiB |
BIN
public/s/img/rnd.png
Normal file
After Width: | Height: | Size: 359 B |
BIN
public/s/img/roll22.png
Normal file
After Width: | Height: | Size: 962 B |
BIN
public/s/img/term_f0ck_logo.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
public/s/img/trash_20px.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
public/s/img/win95Beam.png
Normal file
After Width: | Height: | Size: 154 B |
BIN
public/s/img/win95cursor.png
Normal file
After Width: | Height: | Size: 363 B |
BIN
public/s/img/win95pointer.png
Normal file
After Width: | Height: | Size: 211 B |
BIN
public/s/img/x34_f0ck_logo.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
7
public/s/js/bootstrap.min.js
vendored
Normal file
3772
public/s/js/plyr.js
Normal file
21
public/s/js/scroller.js
Normal file
@ -0,0 +1,21 @@
|
||||
let load = false;
|
||||
(() => {
|
||||
const posts = document.querySelector("#posts");
|
||||
document.addEventListener("wheel", e => {
|
||||
if((((document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop + window.innerHeight) + 310
|
||||
>= ((document.documentElement && document.documentElement.scrollHeight) || document.body.scrollHeight)) && !load) {
|
||||
load = true;
|
||||
fetch(`./api/p/${posts.dataset.last}`)
|
||||
.then(res => res.json())
|
||||
.then((msg, html = "") => {
|
||||
for(let i = 0; i < msg.items.length; i++)
|
||||
if(msg.items[i].id)
|
||||
html += `<li class="post"><a href="./${msg.items[i].id}" title="${msg.items[i].mime}"><img class="thumb" src="./t/${msg.items[i].id}.png" /></a></li>\n`;
|
||||
posts.insertAdjacentHTML("beforeend", html);
|
||||
posts.dataset.last = msg.last;
|
||||
load = false;
|
||||
})
|
||||
.catch(err => console.log(err));
|
||||
}
|
||||
});
|
||||
})();
|
25
public/s/js/shit.js
Normal file
@ -0,0 +1,25 @@
|
||||
const clickOnElementBinding = selector => () => (elem = document.querySelector(selector))?elem.click():null;
|
||||
|
||||
const keybindings = {
|
||||
"ArrowLeft": clickOnElementBinding("#next"),
|
||||
"ArrowRight": clickOnElementBinding("#prev"),
|
||||
"r": clickOnElementBinding("#random")
|
||||
};
|
||||
|
||||
(() => {
|
||||
document.addEventListener("keydown", e => {
|
||||
if(e.key in keybindings) {
|
||||
e.preventDefault();
|
||||
keybindings[e.key]();
|
||||
}
|
||||
});
|
||||
|
||||
const f0ckimage = document.querySelector("#f0ck-image");
|
||||
if(f0ckimage) {
|
||||
f0ckimage.addEventListener("click", e => {
|
||||
e.preventDefault();
|
||||
f0ckimage.hasAttribute("style")?f0ckimage.removeAttribute("style"):f0ckimage.setAttribute("style", "max-height: unset;");
|
||||
});
|
||||
}
|
||||
})();
|
||||
//sorry, jQuery ist dumm :--D sorry sirx, dass ich wonnes Kot auskommentiert habe
|
98
public/s/js/theme.js
Normal file
@ -0,0 +1,98 @@
|
||||
/* Thanks to StephenLynx, I modified his Theme Changer from the Penumbra Lynx Frontend for the Lynxchan Software https://gitgud.io/LynxChan/LynxChan and reused it to make f0ck a nicer place. */
|
||||
var themes = [ {
|
||||
file : 'f0ck95.css',
|
||||
label : 'f0ck95',
|
||||
id : 'f0ck95'
|
||||
}];
|
||||
|
||||
let interval = null;
|
||||
const clocklol = () => {
|
||||
const l = document.querySelector("body");
|
||||
if(localStorage.selectedTheme && localStorage.selectedTheme === "f0ck95")
|
||||
interval = setInterval((d = new Date()) => l.setAttribute("data-clock", d.toLocaleTimeString()), 1e3);
|
||||
else {
|
||||
clearInterval(interval);
|
||||
l.removeAttribute("data-clock");
|
||||
}
|
||||
};
|
||||
|
||||
const speaker = () => {
|
||||
const k = document.querySelector("body");
|
||||
if(localStorage.selectedTheme && localStorage.selectedTheme === "f0ck95")
|
||||
k.document.createElement("div");
|
||||
else {
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
var customCss;
|
||||
var addedTheme;
|
||||
function updateCss() {
|
||||
if (addedTheme) {
|
||||
addedTheme.parentNode.removeChild(addedTheme);
|
||||
addedTheme = null;
|
||||
}
|
||||
for (var i = 0; i < themes.length; i++) {
|
||||
var theme = themes[i];
|
||||
if (theme.id === localStorage.selectedTheme) {
|
||||
addedTheme = theme.element;
|
||||
document.head.insertBefore(theme.element, customCss);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (var i = 0; i < document.head.children.length; i++) {
|
||||
var element = document.head.children[i];
|
||||
if (element.rel === 'stylesheet' && element.href.indexOf('/css/custom.css') > -1) {
|
||||
customCss = element;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (var i = 0; i < themes.length; i++) {
|
||||
themes[i].element = document.createElement('link');
|
||||
themes[i].element.type = 'text/css';
|
||||
themes[i].element.rel = 'stylesheet';
|
||||
themes[i].element.href = './s/css/' + themes[i].file;
|
||||
}
|
||||
|
||||
clocklol();
|
||||
updateCss();
|
||||
var postingLink = document.getElementById('themes');
|
||||
if (postingLink) {
|
||||
var divider = document.createElement('span');
|
||||
divider.style = ('display: none;');
|
||||
divider.innerHTML = '';
|
||||
var referenceNode = postingLink.nextSibling;
|
||||
postingLink.parentNode.insertBefore(divider, referenceNode);
|
||||
var themeSelector = document.createElement('select');
|
||||
themeSelector.id = 'themeSelector';
|
||||
var vanillaOption = document.createElement('option');
|
||||
vanillaOption.innerHTML = 'Default';
|
||||
themeSelector.appendChild(vanillaOption);
|
||||
for (i = 0; i < themes.length; i++) {
|
||||
var theme = themes[i];
|
||||
var themeOption = document.createElement('option');
|
||||
themeOption.innerHTML = theme.label;
|
||||
if (theme.id === localStorage.selectedTheme) {
|
||||
themeOption.selected = true;
|
||||
}
|
||||
themeSelector.appendChild(themeOption);
|
||||
}
|
||||
themeSelector.onchange = function() {
|
||||
if (!themeSelector.selectedIndex) {
|
||||
if (localStorage.selectedTheme) {
|
||||
delete localStorage.selectedTheme;
|
||||
clocklol();
|
||||
updateCss();
|
||||
}
|
||||
return;
|
||||
}
|
||||
var selectedTheme = themes[themeSelector.selectedIndex - 1];
|
||||
if (selectedTheme.id === localStorage.selectedTheme) {
|
||||
return;
|
||||
}
|
||||
localStorage.selectedTheme = selectedTheme.id;
|
||||
clocklol();
|
||||
updateCss();
|
||||
};
|
||||
postingLink.parentNode.insertBefore(themeSelector, referenceNode);
|
||||
}
|
25
public/s/js/video.min.js
vendored
Normal file
123
public/s/js/videojs.persistvolume.js
Normal file
@ -0,0 +1,123 @@
|
||||
"use strict";
|
||||
(function(factory){
|
||||
/*!
|
||||
* Custom Universal Module Definition (UMD)
|
||||
*
|
||||
* Video.js will never be a non-browser lib so we can simplify UMD a bunch and
|
||||
* still support requirejs and browserify. This also needs to be closure
|
||||
* compiler compatible, so string keys are used.
|
||||
*/
|
||||
if (typeof define === 'function' && define['amd']) {
|
||||
define(['./video'], function(vjs){ factory(window, document, vjs) });
|
||||
// checking that module is an object too because of umdjs/umd#35
|
||||
} else if (typeof exports === 'object' && typeof module === 'object') {
|
||||
factory(window, document, require('video.js'));
|
||||
} else {
|
||||
factory(window, document, videojs);
|
||||
}
|
||||
|
||||
})(function(window, document, vjs) {
|
||||
//cookie functions from https://developer.mozilla.org/en-US/docs/DOM/document.cookie
|
||||
var
|
||||
getCookieItem = function(sKey) {
|
||||
if (!sKey || !hasCookieItem(sKey)) { return null; }
|
||||
var reg_ex = new RegExp(
|
||||
"(?:^|.*;\\s*)" +
|
||||
window.escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") +
|
||||
"\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*"
|
||||
);
|
||||
return window.unescape(document.cookie.replace(reg_ex,"$1"));
|
||||
},
|
||||
|
||||
setCookieItem = function(sKey, sValue, vEnd, sPath, sDomain, bSecure) {
|
||||
if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return; }
|
||||
var sExpires = "";
|
||||
if (vEnd) {
|
||||
switch (vEnd.constructor) {
|
||||
case Number:
|
||||
sExpires = vEnd === Infinity ? "; expires=Tue, 19 Jan 2038 03:14:07 GMT" : "; max-age=" + vEnd;
|
||||
break;
|
||||
case String:
|
||||
sExpires = "; expires=" + vEnd;
|
||||
break;
|
||||
case Date:
|
||||
sExpires = "; expires=" + vEnd.toGMTString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
document.cookie =
|
||||
window.escape(sKey) + "=" +
|
||||
window.escape(sValue) +
|
||||
sExpires +
|
||||
(sDomain ? "; domain=" + sDomain : "") +
|
||||
(sPath ? "; path=" + sPath : "") +
|
||||
(bSecure ? "; secure" : "");
|
||||
},
|
||||
|
||||
hasCookieItem = function(sKey) {
|
||||
return (new RegExp(
|
||||
"(?:^|;\\s*)" +
|
||||
window.escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") +
|
||||
"\\s*\\=")
|
||||
).test(document.cookie);
|
||||
},
|
||||
|
||||
hasLocalStorage = function() {
|
||||
try {
|
||||
window.localStorage.setItem('persistVolume', 'persistVolume');
|
||||
window.localStorage.removeItem('persistVolume');
|
||||
return true;
|
||||
} catch(e) {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
getStorageItem = function(key) {
|
||||
return hasLocalStorage() ? window.localStorage.getItem(key) : getCookieItem(key);
|
||||
},
|
||||
setStorageItem = function(key, value) {
|
||||
return hasLocalStorage() ? window.localStorage.setItem(key, value) : setCookieItem(key, value, Infinity, '/');
|
||||
},
|
||||
|
||||
extend = function(obj) {
|
||||
var arg, i, k;
|
||||
for (i = 1; i < arguments.length; i++) {
|
||||
arg = arguments[i];
|
||||
for (k in arg) {
|
||||
if (arg.hasOwnProperty(k)) {
|
||||
obj[k] = arg[k];
|
||||
}
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
},
|
||||
|
||||
defaults = {
|
||||
namespace: ""
|
||||
},
|
||||
|
||||
volumePersister = function(options) {
|
||||
var player = this;
|
||||
var settings = extend({}, defaults, options || {});
|
||||
|
||||
var key = settings.namespace + '-' + 'volume';
|
||||
var muteKey = settings.namespace + '-' + 'mute';
|
||||
|
||||
player.on("volumechange", function() {
|
||||
setStorageItem(key, player.volume());
|
||||
setStorageItem(muteKey, player.muted());
|
||||
});
|
||||
|
||||
var persistedVolume = getStorageItem(key);
|
||||
if(persistedVolume !== null){
|
||||
player.volume(persistedVolume);
|
||||
}
|
||||
|
||||
var persistedMute = getStorageItem(muteKey);
|
||||
if(persistedMute !== null){
|
||||
player.muted('true' === persistedMute);
|
||||
}
|
||||
};
|
||||
|
||||
vjs.plugin("persistvolume", volumePersister);
|
||||
|
||||
});
|
@ -1,44 +1,22 @@
|
||||
import sql from "./sql";
|
||||
import config from "../../config.json";
|
||||
|
||||
export let admins = [];
|
||||
|
||||
export const loadAdmins = async () => {
|
||||
const db = await sql;
|
||||
admins = [];
|
||||
try {
|
||||
const rows = await db.query("select id, prefix, account, level, network from user");
|
||||
rows.forEach(row => admins.push({
|
||||
id: row.id,
|
||||
prefix: row.prefix,
|
||||
account: row.account,
|
||||
network: row.network,
|
||||
level: row.level
|
||||
}));
|
||||
} catch(err) {
|
||||
console.log("keine Admins vorhanden", err);
|
||||
}
|
||||
};
|
||||
|
||||
(async () => {
|
||||
await loadAdmins();
|
||||
})();
|
||||
|
||||
export const getLevel = (network, user) => {
|
||||
export const getLevel = user => {
|
||||
let ret = {
|
||||
level: 0,
|
||||
verified: false
|
||||
};
|
||||
if (typeof user !== "object")
|
||||
return "user has to be an object!";
|
||||
if (!user.account || !user.prefix)
|
||||
if (!user.prefix)
|
||||
return ret;
|
||||
for(let admin of admins) {
|
||||
if (admin.account === user.account.toLowerCase() && admin.network === network.toLowerCase()) {
|
||||
ret = {
|
||||
level: admin.level,
|
||||
verified: user.prefix.toLowerCase() === admin.prefix
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
let admin;
|
||||
if(admin = config.admins.filter(e => e.prefix === user.prefix)[0]) {
|
||||
ret = {
|
||||
level: admin.level,
|
||||
verified: true
|
||||
};
|
||||
}
|
||||
|
||||
return ret;
|
||||
};
|
||||
};
|
||||
|
@ -1,10 +1,25 @@
|
||||
import logger from "../log.mjs";
|
||||
|
||||
const versions = [
|
||||
"AmIRC.1 (8 Bit) for Commodore Amiga 500",
|
||||
"HexChat 0.72 [x86] / Windows 95c [500MHz]"
|
||||
];
|
||||
|
||||
export default self => {
|
||||
self.bot.on("ctcp:version", e => {
|
||||
e.write(`notice ${e.user.nick} :\u0001VERSION ${versions[~~(Math.random() * versions.length)]}\u0001`);
|
||||
});
|
||||
};
|
||||
export default async bot => {
|
||||
|
||||
return [{
|
||||
name: "version",
|
||||
listener: "ctcp:version",
|
||||
f: e => {
|
||||
logger.info(`${e.network} -> ${e.channel} -> ${e.user.nick}: ctcp:version ${e.message}`);
|
||||
e.write(`notice ${e.user.nick} :\u0001VERSION ${versions[~~(Math.random() * versions.length)]}\u0001`);
|
||||
}
|
||||
}, {
|
||||
name: "ping",
|
||||
listener: "ctcp:ping",
|
||||
f: e => {
|
||||
logger.info(`${e.network} -> ${e.channel} -> ${e.user.nick}: ctcp:ping ${e.message}`);
|
||||
e.write(`notice ${e.user.nick} :${e.message}`);
|
||||
}
|
||||
}];
|
||||
};
|
||||
|
12
src/inc/events/error.mjs
Normal file
@ -0,0 +1,12 @@
|
||||
import logger from "../log.mjs";
|
||||
|
||||
export default async bot => {
|
||||
|
||||
return [{
|
||||
name: "error",
|
||||
listener: "error",
|
||||
f: e => {
|
||||
logger.error(e);
|
||||
}
|
||||
}];
|
||||
};
|
@ -1,6 +0,0 @@
|
||||
import ctcp from "./ctcp";
|
||||
import message from "./message";
|
||||
|
||||
export default [
|
||||
ctcp, message
|
||||
];
|
18
src/inc/events/info.mjs
Normal file
@ -0,0 +1,18 @@
|
||||
import logger from "../log.mjs";
|
||||
|
||||
export default async bot => {
|
||||
|
||||
return [{
|
||||
name: "info",
|
||||
listener: "info",
|
||||
f: e => {
|
||||
logger.debug(e);
|
||||
}
|
||||
}, {
|
||||
name: "debug",
|
||||
listener: "debug",
|
||||
f: e => {
|
||||
logger.debug(e);
|
||||
}
|
||||
}];
|
||||
};
|
@ -1,44 +1,42 @@
|
||||
import { getLevel } from "../admin";
|
||||
import logger from "../log.mjs";
|
||||
import { getLevel } from "../../inc/admin.mjs";
|
||||
|
||||
const parseArgs = msg => {
|
||||
let args = msg.trim().split(" ");
|
||||
let cmd = args.shift();
|
||||
let args = msg.trim().split(" ")
|
||||
, cmd = args.shift();
|
||||
return {
|
||||
cmd: cmd.replace(/^(\.|\/|\!)/, ""),
|
||||
args: args
|
||||
};
|
||||
};
|
||||
|
||||
export default self => {
|
||||
self.bot.on("message", e => {
|
||||
for (var [name, trigger] of self._trigger.entries()) {
|
||||
if (!trigger.call.exec(e.message))
|
||||
continue;
|
||||
if (!trigger.clients.includes(e.type))
|
||||
continue;
|
||||
export default async bot => {
|
||||
|
||||
/*let active = false;
|
||||
if (e.type === "irc" && cfg.trigger[e.network + e.channel]) {
|
||||
if (cfg.trigger[e.network + e.channel].val[trigger.name])
|
||||
active = true;
|
||||
}
|
||||
else
|
||||
active = trigger.active;*/
|
||||
return [{
|
||||
name: "message",
|
||||
listener: "message",
|
||||
f: e => {
|
||||
logger.info(`${e.network} -> ${e.channel} -> ${e.user.nick}: ${e.message}`);
|
||||
|
||||
//if (!active)
|
||||
// continue;
|
||||
const trigger = [...bot._trigger.entries()].filter(t =>
|
||||
t[1].call.exec(e.message) &&
|
||||
t[1].clients.includes(e.type) &&
|
||||
t[1].active &&
|
||||
t[1].level <= getLevel(e.network, e.user).level &&
|
||||
!((e.self.set !== "all" && e.self.set !== t[1].set) && t[1].set !== "all")
|
||||
);
|
||||
|
||||
if ((e.self.set !== "all" && e.self.set !== trigger.set) && trigger.set !== "all")
|
||||
continue;
|
||||
|
||||
if (trigger.level > getLevel(e.network, e.user)) {
|
||||
e.reply(`no permission, min level ${trigger.level} required`);
|
||||
break;
|
||||
}
|
||||
|
||||
e = Object.assign(e, parseArgs(e.message));
|
||||
trigger.f(e);
|
||||
trigger.forEach(async t => {
|
||||
try {
|
||||
await t[1].f({ ...e, ...parseArgs(e.message) });
|
||||
console.log(`triggered > ${t[0]}`);
|
||||
}
|
||||
catch(error) {
|
||||
e.reply(`${t[0]}: An error occured.`);
|
||||
logger.error(`${e.network} -> ${e.channel} -> ${e.user.nick}: ${error.toString ? error : JSON.stringify(error)}`);
|
||||
}
|
||||
});
|
||||
}
|
||||
console.info(`${e.network} -> ${e.channel} -> ${e.user.nick}: ${e.message}`);
|
||||
});
|
||||
};
|
||||
}];
|
||||
|
||||
};
|
||||
|
@ -1,35 +0,0 @@
|
||||
import http from "http";
|
||||
import https from "https";
|
||||
import url from "url";
|
||||
import querystring from "querystring";
|
||||
|
||||
const readdata = (res, mode, data = "") => new Promise((resolve, reject) => res
|
||||
.setEncoding("utf8")
|
||||
.on("data", chunk => data += chunk)
|
||||
.on("end", () => {
|
||||
switch(mode) {
|
||||
case "text": resolve(data); break;
|
||||
case "json": try { resolve(JSON.parse(data)); } catch(err) { reject("no json D:"); } break;
|
||||
case "buffer": resolve(new Buffer.from(data)); break;
|
||||
default: reject("lol no"); break;
|
||||
}
|
||||
}));
|
||||
|
||||
export default (a, options = {}, link = url.parse(a), body = "") => new Promise((resolve, reject) => {
|
||||
options = {...{ hostname: link.hostname, path: link.path, method: "GET" }, ...options};
|
||||
if(options.method === "POST") {
|
||||
body = querystring.stringify(options.body);
|
||||
delete options.body;
|
||||
options.headers = {
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
"Content-Length": Buffer.byteLength(body)
|
||||
};
|
||||
}
|
||||
(link.protocol === "https:"?https:http).request(options, res => resolve({
|
||||
body: res,
|
||||
headers: res.headers,
|
||||
text: () => readdata(res, "text"),
|
||||
json: () => readdata(res, "json"),
|
||||
buffer: () => readdata(res, "buffer")
|
||||
})).on("error", err => reject(err)).end(body);
|
||||
});
|
15
src/inc/log.mjs
Normal file
@ -0,0 +1,15 @@
|
||||
import fs from "fs";
|
||||
|
||||
const logger = ["debug", "info", "error"];
|
||||
const logfiles = logger.reduce((a, b) => ({...a, [b]: fs.createWriteStream(`./logs/${~~(Date.now() / 1000)}_${b}.log`)}), {});
|
||||
|
||||
export default new Proxy({}, {
|
||||
get: (_, prop) => (msg, timestamp = new Date().toLocaleString()) =>
|
||||
logger.includes(prop) &&
|
||||
logfiles[prop].write(JSON.stringify({
|
||||
level: prop,
|
||||
message: msg,
|
||||
timestamp: timestamp
|
||||
}) + "\n") &&
|
||||
console.log(timestamp, prop, msg)
|
||||
});
|
@ -1,4 +1,8 @@
|
||||
class Router {
|
||||
import { promises as fs } from "fs";
|
||||
import path from "path";
|
||||
|
||||
export default new class Router {
|
||||
#mimes;
|
||||
constructor() {
|
||||
this.routes = new Map();
|
||||
};
|
||||
@ -12,11 +16,32 @@ class Router {
|
||||
post() {
|
||||
this.route("POST", arguments);
|
||||
};
|
||||
async static({ dir = path.resolve() + "/public", route = /^\/public/ }) {
|
||||
if(!this.#mimes) {
|
||||
this.#mimes = new Map();
|
||||
(await fs.readFile("/etc/mime.types", "utf-8"))
|
||||
.split("\n")
|
||||
.filter(e => !e.startsWith("#") && e)
|
||||
.map(e => e.split(/\s{2,}/))
|
||||
.filter(e => e.length > 1)
|
||||
.forEach(m => m[1].split(" ").forEach(ext => this.#mimes.set(ext, m[0])));
|
||||
}
|
||||
this.get(route, async (req, res) => {
|
||||
try {
|
||||
return res.reply({
|
||||
type: this.#mimes.get(req.url.path.split(".").pop()).toLowerCase(),
|
||||
body: await fs.readFile(path.join(dir, req.url.path.replace(route, "")))
|
||||
});
|
||||
} catch {
|
||||
return res.reply({
|
||||
code: 404,
|
||||
body: "404 - file not found"
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
};
|
||||
const router = new Router();
|
||||
export default router;
|
||||
export const routes = router.routes;
|
||||
|
||||
Map.prototype.getRegex = function(path, method, tmp) {
|
||||
return (!(tmp = [...this.entries()].filter(r => r[0].exec(path) && r[1].method.includes(method))[0])) ? false : tmp[1].f;
|
||||
Map.prototype.getRoute = function(path, method, tmp) {
|
||||
return (!(tmp = [...this.entries()].filter(r => ( r[0] === path || r[0].exec?.(path) ) && r[1].method.includes(method) )[0])) ? false : tmp[1].f;
|
||||
};
|
||||
|
@ -1,16 +1,15 @@
|
||||
import router from "../router";
|
||||
import sql from "../sql";
|
||||
import router from "../router.mjs";
|
||||
import sql from "../sql.mjs";
|
||||
import { parse } from "url";
|
||||
import cfg from "../../../config.json";
|
||||
|
||||
import { mimes, queries } from "./inc/api";
|
||||
import { mimes, queries } from "./inc/api.mjs";
|
||||
|
||||
router.get(/^\/api$/, (req, res) => {
|
||||
router.get("/api", (req, res) => {
|
||||
res.end("api lol");
|
||||
});
|
||||
|
||||
router.get(/^\/api\/random(\/user\/.+|\/image|\/video|\/audio)?$/, async (req, res) => {
|
||||
const db = await sql.getConnection();
|
||||
const args = [];
|
||||
let q = queries.random.main;
|
||||
|
||||
@ -22,26 +21,24 @@ router.get(/^\/api\/random(\/user\/.+|\/image|\/video|\/audio)?$/, async (req, r
|
||||
q += queries.random.where(mimes[req.url.split[2]] ? mimes[req.url.split[2]].map(mime => `mime = "${mime}"`).join(" or ") : null);
|
||||
|
||||
try {
|
||||
const rows = await db.query(q, args);
|
||||
const rows = await sql.query(q, args);
|
||||
res
|
||||
.writeHead(200, { 'Content-Type': 'application/json' })
|
||||
.end(JSON.stringify(rows.length > 0 ? rows[0] : []), 'utf-8');
|
||||
.writeHead(200, { "Content-Type": "application/json" })
|
||||
.end(JSON.stringify(rows.length > 0 ? rows[0] : []), "utf-8");
|
||||
} catch(err) {
|
||||
res
|
||||
.writeHead(500)
|
||||
.end(JSON.stringify(err), 'utf-8');
|
||||
.end(JSON.stringify(err), "utf-8");
|
||||
}
|
||||
db.end();
|
||||
});
|
||||
|
||||
router.get(/^\/api\/p$/, async (req, res) => {
|
||||
const db = await sql.getConnection();
|
||||
router.get("/api/p", async (req, res) => {
|
||||
let id = parseInt(req.url.qs.id) || 99999999;
|
||||
const eps = Math.min(parseInt(req.url.qs.eps) || 100, 200);
|
||||
let [ order, trend ] = req.url.qs.order === "asc" ? [ "asc", ">" ] : [ "desc", "<" ];
|
||||
|
||||
try {
|
||||
const tmp = (await db.query("select min(id) as min, max(id) as max from items limit 1"))[0];
|
||||
const tmp = (await sql.query("select min(id) as min, max(id) as max from items limit 1"))[0];
|
||||
if((id - 1 + eps) > tmp.max) {
|
||||
id = tmp.max;
|
||||
[ order, trend ] = [ "desc", "<=" ];
|
||||
@ -51,7 +48,7 @@ router.get(/^\/api\/p$/, async (req, res) => {
|
||||
[ order, trend ] = [ "asc", ">=" ];
|
||||
}
|
||||
|
||||
const rows = await db.query(queries.p(trend, order), [ id, eps ]);
|
||||
const rows = await sql.query(queries.p(trend, order), [ id, eps ]);
|
||||
const items = {
|
||||
items: rows,
|
||||
first: rows[0].id,
|
||||
@ -60,21 +57,33 @@ router.get(/^\/api\/p$/, async (req, res) => {
|
||||
oldest: tmp.min
|
||||
};
|
||||
res
|
||||
.writeHead(200, { 'Content-Type': 'application/json' })
|
||||
.end(JSON.stringify(items), 'utf-8');
|
||||
.writeHead(200, { "Content-Type": "application/json" })
|
||||
.end(JSON.stringify(items), "utf-8");
|
||||
} catch(err) {
|
||||
console.error(err);
|
||||
res
|
||||
.writeHead(500)
|
||||
.end(JSON.stringify(err), 'utf-8');
|
||||
.end(JSON.stringify(err), "utf-8");
|
||||
}
|
||||
db.end();
|
||||
});
|
||||
|
||||
router.get(/^\/api\/p\/([0-9]+)/, async (req, res) => { // legacy
|
||||
let eps = 100;
|
||||
let id = +req.url.split[2];
|
||||
|
||||
const query = await sql.query("select * from items where id < ? order by id desc limit ?", [ id, eps ]);
|
||||
const items = {
|
||||
items: query,
|
||||
last: query[query.length - 1].id
|
||||
};
|
||||
|
||||
res.writeHead(200, { "Content-Type": "application/json" });
|
||||
res.end(JSON.stringify(items), "utf-8");
|
||||
});
|
||||
|
||||
router.get(/^\/api\/item\/[0-9]+$/, async (req, res) => {
|
||||
const db = await sql.getConnection();
|
||||
try {
|
||||
const rows = await db.query(queries.item, Array(3).fill(req.url.split[2]));
|
||||
const rows = await sql.query(queries.item, Array(3).fill(req.url.split[2]));
|
||||
const data = rows[0].length > 0 ? {
|
||||
...rows[0][0], ...{
|
||||
thumb: `${cfg.main.url}/t/${rows[0][0].id}.png`,
|
||||
@ -86,29 +95,27 @@ router.get(/^\/api\/item\/[0-9]+$/, async (req, res) => {
|
||||
error: true
|
||||
};
|
||||
res
|
||||
.writeHead(200, { 'Content-Type': 'application/json' })
|
||||
.end(JSON.stringify(data), 'utf-8');
|
||||
.writeHead(200, { "Content-Type": "application/json" })
|
||||
.end(JSON.stringify(data), "utf-8");
|
||||
} catch(err) {
|
||||
res
|
||||
.writeHead(500)
|
||||
.end(JSON.stringify(err), 'utf-8');
|
||||
.end(JSON.stringify(err), "utf-8");
|
||||
}
|
||||
db.end();
|
||||
});
|
||||
|
||||
router.get(/^\/api\/user\/.*(\/[0-9]+)?$/, async (req, res) => { // auf qs umstellen
|
||||
const db = await sql.getConnection();
|
||||
const user = req.url.split[2];
|
||||
const eps = Math.min(req.url.split[3] || 50, 50);
|
||||
try {
|
||||
const rows = await db.query(queries.user, [ user, eps ]);
|
||||
const rows = await sql.query(queries.user, [ user, eps ]);
|
||||
res
|
||||
.writeHead(200, { 'Content-Type': 'application/json' })
|
||||
.end(JSON.stringify(rows.length > 0 ? rows : []), 'utf-8');
|
||||
.writeHead(200, { "Content-Type": "application/json" })
|
||||
.end(JSON.stringify(rows.length > 0 ? rows : []), "utf-8");
|
||||
} catch(err) {
|
||||
res
|
||||
.writeHead(500)
|
||||
.end(JSON.stringify(err), 'utf-8');
|
||||
.end(JSON.stringify(err), "utf-8");
|
||||
}
|
||||
db.end();
|
||||
});
|
||||
|
@ -1,10 +1,104 @@
|
||||
import router from "../router";
|
||||
import router from "../router.mjs";
|
||||
import cfg from "../../../config.json";
|
||||
import fs from "fs";
|
||||
import sql from "../sql.mjs";
|
||||
import swig from "swig";
|
||||
import url from "url";
|
||||
|
||||
const tpl = fs.readFileSync("./views/index.html", "utf-8");
|
||||
const templates = {
|
||||
contact: fs.readFileSync("./views/contact.html", "utf-8"),
|
||||
help: fs.readFileSync("./views/help.html", "utf-8"),
|
||||
how: fs.readFileSync("./views/how.html", "utf-8"),
|
||||
index: fs.readFileSync("./views/index.html", "utf-8"),
|
||||
item: fs.readFileSync("./views/item.html", "utf-8")
|
||||
};
|
||||
|
||||
router.get(/^\/(page\/[0-9]+)?$/, async (req, res) => {
|
||||
res
|
||||
.writeHead(200, { 'Content-Type': 'text/html' })
|
||||
.end(tpl);
|
||||
router.get("/", async (req, res) => {
|
||||
const query = await sql.query("select id, mime from items order by id desc limit 300");
|
||||
const data = {
|
||||
items: query,
|
||||
last: query[0].id
|
||||
};
|
||||
|
||||
res.reply({
|
||||
body: swig.compile(templates.index)(data)
|
||||
});
|
||||
});
|
||||
|
||||
router.get(/^\/([0-9]+)$/, async (req, res) => {
|
||||
const q = "select * from items where id = ? limit 1; " // get item
|
||||
+ "select id from items where id = (select min(id) from items where id > ?); " // get previous item
|
||||
+ "select id from items where id = (select max(id) from items where id < ?)"; // get next item
|
||||
const query = await sql.query(q, [req.url.split[0], req.url.split[0], req.url.split[0]]);
|
||||
|
||||
const data = {
|
||||
id: '',
|
||||
username: '',
|
||||
item: '',
|
||||
src: '',
|
||||
dest: '',
|
||||
mime: '',
|
||||
size: '',
|
||||
userchannel: '',
|
||||
usernetwork: '',
|
||||
thumb: null,
|
||||
thumbnail: null,
|
||||
next: null,
|
||||
prev: null
|
||||
};
|
||||
|
||||
if(query[0][0]) {
|
||||
const e = query[0][0];
|
||||
switch(e.mime) {
|
||||
case "image/png":
|
||||
case "image/jpeg":
|
||||
case "image/gif":
|
||||
data.item = "image";
|
||||
break;
|
||||
case "video/webm":
|
||||
case "video/mp4":
|
||||
case "video/quicktime":
|
||||
data.item = "video";
|
||||
break;
|
||||
case "audio/mpeg":
|
||||
case "audio/ogg":
|
||||
case "audio/flac":
|
||||
case "audio/x-flac":
|
||||
data.item = "audio";
|
||||
break;
|
||||
}
|
||||
data.id = e.id;
|
||||
data.username = e.username;
|
||||
data.srcurl = e.src;
|
||||
data.src = url.parse(e.src).hostname;
|
||||
data.thumb = `${cfg.websrv.paths.thumbnails}/${e.id}.png`;
|
||||
data.dest = `${cfg.websrv.paths.images}/${e.dest}`;
|
||||
data.mime = e.mime;
|
||||
data.size = e.size;//lib.formatSize(e.size);
|
||||
data.userchannel = e.userchannel;
|
||||
data.usernetwork = e.usernetwork;
|
||||
data.timestamp = new Date(e.stamp * 1000).toISOString();
|
||||
if(query[1].length)
|
||||
data.next = query[1][0].id;
|
||||
if(query[2].length)
|
||||
data.prev = query[2][0].id;
|
||||
}
|
||||
res.reply({
|
||||
body: swig.compile(templates.item)(data)
|
||||
});
|
||||
});
|
||||
|
||||
router.get(/^\/(contact|help|how)$/, (req, res) => {
|
||||
res.reply({
|
||||
body: templates[req.url.split[0]]
|
||||
});
|
||||
});
|
||||
|
||||
router.get("/random", async (req, res) => {
|
||||
res
|
||||
.writeHead(301, {
|
||||
"Cache-Control": "no-cache, public",
|
||||
"Location": "/" + (await sql.query("select id from items order by rand() limit 1"))[0].id
|
||||
})
|
||||
.end();
|
||||
});
|
||||
|
17
src/inc/routes/static.mjs
Normal file
@ -0,0 +1,17 @@
|
||||
import path from "path";
|
||||
import router from "../router.mjs";
|
||||
|
||||
router.static({
|
||||
dir: path.resolve() + "/public/b",
|
||||
route: /^\/b\//
|
||||
});
|
||||
|
||||
router.static({
|
||||
dir: path.resolve() + "/public/s",
|
||||
route: /^\/s\//
|
||||
});
|
||||
|
||||
router.static({
|
||||
dir: path.resolve() + "/public/t",
|
||||
route: /^\/t\//
|
||||
});
|
@ -1,35 +1,51 @@
|
||||
import { admins } from "../admin";
|
||||
import { getLevel } from "../admin.mjs";
|
||||
import fetch from "flumm-fetch-cookies";
|
||||
|
||||
import vm from "vm";
|
||||
|
||||
const maxoutput = 1000;
|
||||
let maxoutput = 750;
|
||||
let context = vm.createContext({
|
||||
e: null,
|
||||
bot: null,
|
||||
admins: null,
|
||||
fetch: fetch
|
||||
});
|
||||
export default bot => bot._trigger.set("sandbox_debug", new bot.trigger({
|
||||
call: /^\!debug (.*)/i,
|
||||
level: 100,
|
||||
active: true,
|
||||
f: e => {
|
||||
const args = e.message.trim().substring(7);
|
||||
if(args === "true" || args === "false")
|
||||
return e.self.debug = !e.self.debug;
|
||||
try {
|
||||
context.admins = admins;
|
||||
context.e = e;
|
||||
context.bot = bot;
|
||||
let output = vm.runInContext(args, vm.createContext(context));
|
||||
if (typeof output !== undefined && output) {
|
||||
output = JSON.stringify(output);
|
||||
return r.reply(output.length > maxoutput ? `holy fuck, Ausgabe wäre viel zu lang! (${output.length} Zeichen :DDDDDD)` : output);
|
||||
}
|
||||
else
|
||||
e.reply("false lol");
|
||||
|
||||
export default async bot => {
|
||||
|
||||
return [{
|
||||
name: "level",
|
||||
call: /^!level (.*)/i,
|
||||
active: true,
|
||||
f: e => {
|
||||
const user = e.message.trim().substring(7);
|
||||
e.reply( JSON.stringify( getLevel( e.self.user.get(user) || {} ) ) );
|
||||
}
|
||||
catch (err) {
|
||||
e.reply(err.message);
|
||||
}, {
|
||||
name: "sandbox_debug",
|
||||
call: /^\!debug (.*)/i,
|
||||
active: true,
|
||||
level: 100,
|
||||
f: e => {
|
||||
const args = e.message.trim().substring(7);
|
||||
try {
|
||||
context.e = e;
|
||||
context.bot = bot;
|
||||
context.level = getLevel;
|
||||
let output = vm.runInContext(args, vm.createContext(context));
|
||||
if (typeof output !== undefined && output) {
|
||||
output = JSON.stringify(output);
|
||||
if (output.length > maxoutput)
|
||||
return e.reply(`holy fuck, Ausgabe wäre viel zu lang! (${output.length} Zeichen :DDDDDD)`);
|
||||
else
|
||||
e.reply(output);
|
||||
}
|
||||
else
|
||||
e.reply("false lol");
|
||||
}
|
||||
catch (err) {
|
||||
e.reply(err.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}));
|
||||
}];
|
||||
};
|
||||
|
@ -1,3 +0,0 @@
|
||||
import debug from "./debug";
|
||||
|
||||
export default [ debug ];
|
@ -1,28 +1,51 @@
|
||||
import cfg from "../config.json";
|
||||
import { cuffeo } from "cuffeo";
|
||||
import cuffeo from "cuffeo";
|
||||
import { promises as fs } from "fs";
|
||||
|
||||
import triggers from "./inc/trigger";
|
||||
import events from "./inc/events";
|
||||
|
||||
import "./websrv";
|
||||
import "./websrv.mjs";
|
||||
|
||||
(async () => {
|
||||
// Chatbots
|
||||
/*const self = {
|
||||
const self = {
|
||||
_trigger: new Map(),
|
||||
trigger: function trigger(args) {
|
||||
this.call = args.call;
|
||||
this.help = args.help || false;
|
||||
this.level = args.level || 0;
|
||||
this.active = args.hasOwnProperty("active") ? args.active : true;
|
||||
this.set = args.set || "all"; // uwe, nxy, f0ck, all
|
||||
this.clients = args.clients || ["irc", "tg"];
|
||||
this.clients = args.clients || [ "irc", "tg", "slack" ];
|
||||
this.f = args.f;
|
||||
},
|
||||
bot: new cuffeo(cfg.clients)
|
||||
bot: await new cuffeo(cfg.clients)
|
||||
};
|
||||
triggers.forEach(mod => mod(self));
|
||||
events.forEach(event => event(self));*/
|
||||
|
||||
//
|
||||
console.time("loading");
|
||||
const modules = {
|
||||
events: (await fs.readdir("./src/inc/events")).filter(f => f.endsWith(".mjs")),
|
||||
trigger: (await fs.readdir("./src/inc/trigger")).filter(f => f.endsWith(".mjs"))
|
||||
};
|
||||
|
||||
console.timeLog("loading", "directories");
|
||||
const blah = (await Promise.all(Object.entries(modules).map(async ([dir, mods]) => ({
|
||||
[dir]: (await Promise.all(mods.map(async mod => {
|
||||
const res = await Promise.race([
|
||||
(await import(`./inc/${dir}/${mod}`)).default(self),
|
||||
new Promise((_, rej) => setTimeout(() => rej(false), timeout))
|
||||
]);
|
||||
console.timeLog("loading", `${dir}/${mod}`);
|
||||
return res;
|
||||
}))).flat(2)
|
||||
})))).reduce((a, b) => ({...a, ...b}));
|
||||
|
||||
blah.events.forEach(event => {
|
||||
console.timeLog("loading", `registering event > ${event.name}`);
|
||||
self.bot.on(event.listener, event.f);
|
||||
});
|
||||
|
||||
blah.trigger.forEach(trigger => {
|
||||
console.timeLog("loading", `registering trigger > ${trigger.name}`);
|
||||
self._trigger.set(trigger.name, new self.trigger(trigger));
|
||||
});
|
||||
|
||||
console.timeEnd("loading");
|
||||
|
||||
})();
|
||||
|
@ -2,19 +2,30 @@ import http from "http";
|
||||
import url from "url";
|
||||
import querystring from "querystring";
|
||||
import cfg from "../config.json";
|
||||
import router from "./inc/router.mjs";
|
||||
|
||||
// routes
|
||||
import "./inc/routes/index";
|
||||
import "./inc/routes/api";
|
||||
import "./inc/routes/index.mjs";
|
||||
import "./inc/routes/api.mjs";
|
||||
import "./inc/routes/static.mjs";
|
||||
|
||||
import { routes } from "./inc/router";
|
||||
|
||||
http.createServer((req, res, r) => {
|
||||
http.createServer(async (req, res, r) => {
|
||||
req.url = url.parse(req.url.replace(/(?!^.)(\/+)?$/, ''));
|
||||
req.url.split = req.url.pathname.split("/").slice(1);
|
||||
req.url.qs = querystring.parse(req.url.query);
|
||||
|
||||
console.log(`[${(new Date()).toLocaleTimeString()}] ${req.method} ${req.url.pathname}`);
|
||||
req.post = new Promise((resolve, _, data = "") => req
|
||||
.on("data", d => void (data += d))
|
||||
.on("end", () => void resolve(Object.fromEntries(Object.entries(querystring.parse(data)).map(([k, v]) => [k, decodeURIComponent(v)])))));
|
||||
|
||||
!(r = routes.getRegex(req.url.pathname, req.method)) ? res.writeHead(404).end(`404 - ${req.url.pathname}`) : r(req, res);
|
||||
}).listen(cfg.websrv.port, () => console.log(`f0ck is listening on port ${cfg.websrv.port}.`));
|
||||
res.reply = ({
|
||||
code = 200,
|
||||
type = "text/html",
|
||||
body
|
||||
}) => res.writeHead(code, { "Content-Type": `${type}; charset=utf-8` }).end(body);
|
||||
|
||||
!(r = router.routes.getRoute(req.url.pathname, req.method)) ? res.writeHead(404).end(`404 - ${req.url.pathname}`) : await r(req, res);
|
||||
console.log(`[${(new Date()).toLocaleTimeString()}] ${res.statusCode} ${req.method}\t${req.url.pathname}`);
|
||||
}).listen(cfg.websrv.port, () => setTimeout(() => {
|
||||
console.log(`f0ck is listening on port ${cfg.websrv.port}.`);
|
||||
}, 500));
|
||||
|
35
views/contact.html
Normal file
@ -0,0 +1,35 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>f0ck! I need contact!</title>
|
||||
<link rel="icon" type="image/png" href="./s/img/favicon.png" />
|
||||
<link rel="stylesheet" type="text/css" href="./s/css/bootstrap.css">
|
||||
<link rel="stylesheet" type="text/css" href="./s/css/f0ck-custom.css">
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg">
|
||||
<a class="navbar-brand" href="/">
|
||||
<img id="biohaz" src="./s/img/biohazard.svg"> <img src="./s/img/f0ckme.png" width="112" height="28">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarNavDropdown">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link" href="/random">Random</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/how">Help</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/contact">Contact</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="container">
|
||||
<div class="contact">
|
||||
<p>Got a problem? We have the answer: <a href="mailto:admin@f0ck.space">admin@f0ck.space</a></p>
|
||||
<a href="/">return to main</a> <span id="themes"></span>
|
||||
</div>
|
||||
</div>
|
||||
<script src="./s/js/theme.js"></script>
|
||||
</body>
|
||||
</html>
|
61
views/help.html
Normal file
@ -0,0 +1,61 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>f0ck me! but how?</title>
|
||||
<link rel="stylesheet" type="text/css" href="./s/css/bulma.css">
|
||||
<link rel="stylesheet" type="text/css" href="./s/css/f0ck-custom.css">
|
||||
<link rel="icon" type="image/png" href="./s/img/favicon.png" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar" role="navigation" aria-label="main navigation">
|
||||
<div class="navbar-brand">
|
||||
<a class="navbar-item" href="/">
|
||||
<img id="biohaz" src="./s/img/biohazard.svg"> <img src="./s/img/f0ckme.png" width="112" height="28">
|
||||
</a>
|
||||
<a class="navbar-item" href="/random">
|
||||
Random
|
||||
</a>
|
||||
<a class="navbar-item" href="/help">
|
||||
Help
|
||||
</a>
|
||||
<a class="navbar-item" href="/contact">
|
||||
Contact
|
||||
</a>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="irc">
|
||||
<h4>irc.n0xy.net +6697 (ssl only) #f0ck</h4>
|
||||
<p>More information: <a href="https://n0xy.net">n0xy.net</a></p>
|
||||
<div class="page-header">
|
||||
<h4>IRC Rules</h4>
|
||||
</div>
|
||||
|
||||
<p>Constitution:</p>
|
||||
<ul>
|
||||
<li>§ 1 The dignity of the IRCd is inviolable.</li>
|
||||
|
||||
<li>§ 2 The distribution of Child Pornography is strictly prohibited in any of our networks and will lead to an immediate ban.</li>
|
||||
|
||||
<li>§ 3 Do not attack users in this network in any way, shape, or form.</li>
|
||||
|
||||
<li>§ 4 Do not transmit any personal/financial information without permission.</li>
|
||||
|
||||
<li>§ 5 Do not share any malware on this network.</li>
|
||||
</ul>
|
||||
|
||||
<p>f0ck specific rules:</p>
|
||||
<ul>
|
||||
<li>Animal cruelty is forbidden and will lead to an immediate ban</li>
|
||||
</ul>
|
||||
|
||||
<h4>What the f0ck is a f0ck?</h4>
|
||||
<p>A f0ck is basically giving a fuck about some internet bullshit, like stupid images, videos and so on, but also for great things like good music taste and shit, it's basically "a f0ck was given" and f0ck and it's users gave a lot of f0cks over the past years, it's not hard to finally start giving a damn f0ck about something, just f0ck.it dood!</p>
|
||||
|
||||
<h4>how the f0ck to f0ck, you ask?</h4>
|
||||
<p>f0ck will f0ck any media link posted in the channel ending with: jpg|gif|png|webm|mp3|mp4|ogg|flac</p>
|
||||
<p>If you don't want f0ck to f0ck it put !ignore behind your link. Example: https://retard-journal.com/stupidshit.png !ignore</a>
|
||||
<p>f0ck will only f0ck media links with the maximum size of 80MB</p>
|
||||
</div>
|
||||
<script src="./s/js/theme.js"></script>
|
||||
</body>
|
||||
</html>
|
67
views/how.html
Normal file
@ -0,0 +1,67 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>f0ck me! but how?</title>
|
||||
<link rel="stylesheet" type="text/css" href="./s/css/bootstrap.css">
|
||||
<link rel="stylesheet" type="text/css" href="./s/css/f0ck-custom.css">
|
||||
<link rel="icon" type="image/png" href="./s/img/favicon.png" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg">
|
||||
<a class="navbar-brand" href="/">
|
||||
<img id="biohaz" src="./s/img/biohazard.svg"> <img src="./s/img/f0ckme.png" width="112" height="28">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarNavDropdown">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link" href="/random">Random</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/how">Help</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/contact">Contact</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="container">
|
||||
<div class="irc">
|
||||
<h4>irc.n0xy.net +6697 (ssl only) #f0ck</h4>
|
||||
<p>More information: <a href="https://n0xy.net">n0xy.net</a></p>
|
||||
<div class="page-header">
|
||||
<h4>IRC Rules</h4>
|
||||
</div>
|
||||
|
||||
<p>Constitution:</p>
|
||||
<ul>
|
||||
<li>§ 1 The dignity of the IRCd is inviolable.</li>
|
||||
|
||||
<li>§ 2 The distribution of Child Pornography is strictly prohibited in any of our networks and will lead to an immediate ban.</li>
|
||||
|
||||
<li>§ 3 Do not attack users in this network in any way, shape, or form.</li>
|
||||
|
||||
<li>§ 4 Do not transmit any personal/financial information without permission.</li>
|
||||
|
||||
<li>§ 5 Do not share any malware on this network.</li>
|
||||
</ul>
|
||||
|
||||
<p>f0ck specific rules:</p>
|
||||
<ul>
|
||||
<li>Animal cruelty is forbidden and will lead to an immediate ban</li>
|
||||
</ul>
|
||||
|
||||
<h4>What the f0ck is a f0ck?</h4>
|
||||
<p>A f0ck is basically giving a fuck about some internet bullshit, like stupid images, videos and so on, but also for great things like good music taste and shit, it's basically "a f0ck was given" and f0ck and it's users gave a lot of f0cks over the past years, it's not hard to finally start giving a damn f0ck about something, just f0ck.it dood!</p>
|
||||
|
||||
|
||||
<h4>how the f0ck to f0ck, you ask?</h4>
|
||||
<p>f0ck will f0ck any media link posted in the channel ending with: jpg|gif|png|webm|mp3|mp4|ogg|flac</p>
|
||||
<p>If you don't want f0ck to f0ck it put !ignore behind your link. Example: https://retard-journal.com/stupidshit.png !ignore</a>
|
||||
<p>f0ck will only f0ck media links with the maximum size of 30MB for cool people 80MB</p>
|
||||
<p>YouTube Links are currently not working, if you really want to f0ck them, you gotta download it yourself and reupload somewhere until this is fixed</p>
|
||||
</div>
|
||||
</div>
|
||||
<script src="./s/js/theme.js"></script>
|
||||
</body>
|
||||
</html>
|
118
views/index.html
@ -1,85 +1,45 @@
|
||||
<!doctype blah>
|
||||
<html lang="en">
|
||||
<!DOCTYPE f0ck>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.7, shrink-to-fit=no, user-scalable=no">
|
||||
<meta name="description" content="f0ck you">
|
||||
<meta name="author" content="Abu Ottermann, Flummi Mc Doggerstein">
|
||||
<title>f0ck lol!</title>
|
||||
<link rel="stylesheet" href="/css/f0ck.css">
|
||||
<link rel="stylesheet" href="/css/icons.css">
|
||||
<link rel="stylesheet" href="/css/pageview.css">
|
||||
<link rel="stylesheet" href="/css/itemview.css">
|
||||
<title>f0ck!</title>
|
||||
<link rel="icon" type="image/png" href="./s/img/favicon.png" />
|
||||
<link rel="stylesheet" type="text/css" href="./s/css/bootstrap.css">
|
||||
<link rel="stylesheet" type="text/css" href="./s/css/f0ck-custom.css">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
</head>
|
||||
<body>
|
||||
<div class="pageWrapper">
|
||||
<div class="page" id="header">
|
||||
<h1 id="logoHead"><a href="/"><img id="logo" src="/img/f0ckv2_logo_test_v1.5.png"></a></h1>
|
||||
<div id="itemInfo">
|
||||
<div class="infoText">
|
||||
<span id="itemTitle">blah</span> //
|
||||
<a id="itemSource" href=""></a>
|
||||
</div>
|
||||
<div class="infoText">
|
||||
<span id="itemTime" time=""></span> by
|
||||
<span id="itemNick">blah</span> on
|
||||
<span id="itemChannel">#f0ck</span>
|
||||
</div>
|
||||
<span id="debug">
|
||||
<a>random</a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="itemNumber">
|
||||
<div id="pagePosition"></div>
|
||||
<div id="itemPosition">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="page" id="content">
|
||||
<div class="wrapper" id="pagewrapper">
|
||||
<div class="arrow top" id="up"></div>
|
||||
<div id="p_items">
|
||||
<div class="p_item">Seite 1</div>
|
||||
<div class="p_item">Seite 2</div>
|
||||
<div class="p_item">Seite 3</div>
|
||||
</div>
|
||||
<div class="arrow bottom" id="down"></div>
|
||||
</div>
|
||||
<div class="wrapper" id="itemwrapper">
|
||||
<div class="arrow left" id="left"></div>
|
||||
<div id="i_items">
|
||||
<div class="i_item">Item 1</div>
|
||||
<div class="i_item">Item 2</div>
|
||||
<div class="i_item">Item 3</div>
|
||||
</div>
|
||||
<div class="arrow right" id="right"></div>
|
||||
<div class="close"></div>
|
||||
</div>
|
||||
<div class="wrapper" id="howtowrapper">
|
||||
<h4>irc.n0xy.net +6697 (ssl only) #f0ck</h4>
|
||||
<p>More information: <a href="https://n0xy.net">n0xy.net</a></p>
|
||||
<div class="page-header"><h4>IRC Rules</h4></div>
|
||||
<p>Constitution:</p>
|
||||
<ul>
|
||||
<li>§ 1 The dignity of the IRCd is inviolable.</li>
|
||||
<li>§ 2 The distribution of Child Pornography is strictly prohibited in any of our networks and will lead to an immediate ban.</li>
|
||||
<li>§ 3 Do not attack users in this network in any way, shape, or form.</li>
|
||||
<li>§ 4 Do not transmit any personal/financial information without permission.</li>
|
||||
<li>§ 5 Do not share any malware on this network.</li>
|
||||
</ul>
|
||||
<p>f0ck specific rules:</p>
|
||||
<ul>
|
||||
<li>Animal cruelty is forbidden and will lead to an immediate ban</li>
|
||||
</ul>
|
||||
<h4>how the f0ck to f0ck, you ask?</h4>
|
||||
<p>f0ck will f0ck any media link posted in the channel ending with: jpg|gif|png|webm|mp3|mp4|ogg|flac</p>
|
||||
<p>If you don't want f0ck to f0ck it put !ignore behind your link. Example: https://retard-journal.com/stupidshit.png !ignore</a>
|
||||
<p>f0ck will only f0ck media links with the maximum size of 80MB</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="page" id="footer">Made with 666 souls in mind and 2 liters of fresh virgin blood
|
||||
</div>
|
||||
|
||||
<nav class="navbar navbar-expand-lg">
|
||||
<a class="navbar-brand" href="/">
|
||||
<img id="biohaz" src="./s/img/biohazard.svg"> <img src="./s/img/f0ckme.png" width="112" height="28">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarNavDropdown">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link" id="random" href="/random"><span class="rndtext">Random</span></a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/how">Help</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/contact">Contact</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<script src="/js/f0ck.js" type="module" defer></script>
|
||||
</nav>
|
||||
|
||||
<div class="container-fluid">
|
||||
<ul id="posts" data-last="{{ last }}">
|
||||
{% for item in items %}
|
||||
<li class="post"><a href="/{{ item.id }}" title="{{ item.mime }}">
|
||||
<img class="thumb" src="/t/{{ item.id }}.png" />
|
||||
<span class="item-mime">{{ item.mime }}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
<script src="./s/js/scroller.js"></script>
|
||||
<script src="./s/js/theme.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
144
views/item.html
Normal file
@ -0,0 +1,144 @@
|
||||
<!doctype f0ck>
|
||||
<html>
|
||||
<head>
|
||||
<title>{{ id }} - f0ck.me</title>
|
||||
<link rel="stylesheet" type="text/css" href="./s/css/video-js.min.css" />
|
||||
<link rel="stylesheet" type="text/css" href="./s/css/vsg-skin.css" />
|
||||
<link rel="stylesheet" type="text/css" href="./s/css/bootstrap.css">
|
||||
<link rel="stylesheet" type="text/css" href="./s/css/f0ck-custom.css">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="icon" type="image/png" href="./s/img/favicon.png" />
|
||||
<meta property="og:site_name" content="f0ck.me" />
|
||||
<meta property="og:description" content="f0cked by {{ username }}" />
|
||||
<meta name="Description" content="f0cked by {{ username }}" />
|
||||
<meta property="og:image" content="{{ thumbnail }}" />
|
||||
<meta charset="utf-8" />
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg">
|
||||
<a class="navbar-brand" href="/">
|
||||
<img id="biohaz" src="./s/img/biohazard.svg"> <img src="./s/img/f0ckme.png" width="112" height="28">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarNavDropdown">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link" id="random" href="/random"><span class="rndtext">Random</span></a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/how"><span class="hlptext">Help</span></a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/contact"><span class="cnttext">Contact</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="container">
|
||||
<div class="controls">
|
||||
<a id="rndbtn" href="/random">Random</a>
|
||||
</div>
|
||||
<div class="content">
|
||||
|
||||
<div class="next-post">
|
||||
{% if next != null %}
|
||||
<a id="next" href="/{{ next }}">«</a>
|
||||
{% else %}
|
||||
<a id="next" href="#" style="color: #ccc !important;">«</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="media-object">
|
||||
{% if item == "video" %}
|
||||
<div class="embed-responsive embed-responsive-16by9">
|
||||
<video id="my-video" class="video-js embed-responsive-item" width="640" height="360" src="{{ dest }}" preload="auto" autoplay controls loop data-setup="{}"></video>
|
||||
</div>
|
||||
{% elseif item == "audio" %}
|
||||
|
||||
{% if thumb != null %}
|
||||
<div>
|
||||
|
||||
<!-- <img src="{{ thumb }}" /><br /> -->
|
||||
|
||||
{% endif %}
|
||||
<div class="embed-responsive embed-responsive-16by9">
|
||||
<audio id="my-video" class="embed-responsive-item video-js audiojs" autoplay controls loop src="{{ dest }}" data-setup="{}" poster="{% if thumb !== null %}{{ thumb }}{% else %}/s/200.gif{% endif %}" type="audio/mp3" ></audio>
|
||||
</div>
|
||||
{% if thumb != null %}
|
||||
</div>
|
||||
|
||||
{% endif %}
|
||||
{% elseif item == "image" %}
|
||||
<a href="{{ dest }}" id="elfe" target="_blank"><img id="f0ck-image" src="{{ dest }}" /></a>
|
||||
{% else %}
|
||||
|
||||
<h1>404 - Not f0cked</h1>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="previous-post">
|
||||
{% if prev != null %}
|
||||
<a id="prev" href="/{{ prev }}">»</a>
|
||||
{% else %}
|
||||
<a id="prev" href="#" style="color: #ccc !important;">»</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="metadata">
|
||||
<span class="badge badge-dark"><a href="/{{ id }}" class="id-link">{{ id }} </a> by {{ username }}</span>
|
||||
<span class="badge badge-dark">{{ usernetwork }} / {{ userchannel }}</span>
|
||||
<span class="badge badge-dark"><a id="post_source" href="{{ srcurl }}" target="_blank">{{ src }}</a></span>
|
||||
<span class="badge badge-dark">{{ size }}</span>
|
||||
<span class="badge badge-dark"><time class="timeago" title="{{ timestamp }}" datetime="{{ timestamp }}"> </time></span>
|
||||
<span class="badge badge-dark" id="themes"></span>
|
||||
</div>
|
||||
</div>
|
||||
<script src="./s/js/shit.js"></script>
|
||||
<script src="./s/js/theme.js"></script>
|
||||
<script src="./s/js/video.min.js"></script>
|
||||
<script src="./s/js/videojs.persistvolume.js"></script>
|
||||
<script>
|
||||
(function() {
|
||||
let video = document.querySelector(".video-js");
|
||||
if(!video)
|
||||
return;
|
||||
var vid1 = videojs(video);
|
||||
vid1.persistvolume({
|
||||
namespace: "f0ck"
|
||||
});
|
||||
if(vid1.autoplay() && !vid1.paused() && vid1.hasClass('vjs-paused')) {
|
||||
vid1.pause();
|
||||
vid1.play();
|
||||
}
|
||||
})();
|
||||
const epochs = [
|
||||
["year", 31536000],
|
||||
["month", 2592000],
|
||||
["day", 86400],
|
||||
["hour", 3600],
|
||||
["minute", 60],
|
||||
["second", 1]
|
||||
];
|
||||
const getDuration = timeAgoInSeconds => {
|
||||
for(let [name, seconds] of epochs) {
|
||||
const interval = ~~(timeAgoInSeconds / seconds);
|
||||
if (interval >= 1) {
|
||||
return {
|
||||
interval: interval,
|
||||
epoch: name
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
const timeAgo = date => {
|
||||
const timeAgoInSeconds = ~~((new Date() - new Date(date)) / 1000);
|
||||
const {interval, epoch} = getDuration(timeAgoInSeconds);
|
||||
const suffix = interval === 1 ? "" : "s";
|
||||
return `${interval} ${epoch}${suffix} ago`;
|
||||
};
|
||||
(() => {
|
||||
document.querySelectorAll("time.timeago").forEach(e => e.innerHTML = timeAgo(e.title));
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|