parent
910d50f11e
commit
f932c43411
8 changed files with 1217 additions and 5 deletions
@ -0,0 +1,16 @@ |
|||||||
|
clean: |
||||||
|
@echo Cleaning...
|
||||||
|
@-rm -rf ./build
|
||||||
|
|
||||||
|
site: |
||||||
|
@mkdir -p ./build
|
||||||
|
@mkdir -p ./build/css
|
||||||
|
@mkdir -p ./build/gfx
|
||||||
|
@mkdir -p ./build/images
|
||||||
|
python ./build.py
|
||||||
|
cp assets/css/* build/css/
|
||||||
|
cp assets/gfx/* build/gfx/
|
||||||
|
cp assets/images/* build/images/
|
||||||
|
cp assets/scripts/* build/scripts/
|
||||||
|
# @cp -r ../../Reticulum/docs/manual/* build/reticulum_manual/
|
||||||
|
# @cp -r ../../Reticulum/docs/Reticulum\ Manual.pdf build/reticulum_manual/
|
After Width: | Height: | Size: 33 KiB |
@ -0,0 +1,994 @@ |
|||||||
|
:root { |
||||||
|
--background-body: #2a2a2f; |
||||||
|
--background: #161f27; |
||||||
|
--background-alt: #1a242f; |
||||||
|
--selection: #1c76c5; |
||||||
|
--text-main: #c0c6cc; |
||||||
|
--text-bright: #dbe0e3; |
||||||
|
/*--text-bright: #fff;*/ |
||||||
|
--text-muted: #a9b1ba; |
||||||
|
--links: #7eb7e1; |
||||||
|
--focus: #0096bfab; |
||||||
|
--border: #526980; |
||||||
|
--code: #ffbe85; |
||||||
|
--animation-duration: 0.1s; |
||||||
|
--button-base: #0c151c; |
||||||
|
--button-hover: #040a0f; |
||||||
|
--scrollbar-thumb: var(--button-hover); |
||||||
|
--scrollbar-thumb-hover: rgb(0, 0, 0); |
||||||
|
--form-placeholder: #a9a9a9; |
||||||
|
--form-text: #fff; |
||||||
|
--variable: #d941e2; |
||||||
|
--highlight: #efdb43; |
||||||
|
--select-arrow: url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E"); |
||||||
|
} |
||||||
|
|
||||||
|
@font-face { |
||||||
|
font-family: yond; |
||||||
|
src: url(yond.woff2); |
||||||
|
} |
||||||
|
|
||||||
|
body button { |
||||||
|
margin-bottom: 0.8em; |
||||||
|
margin-left: 0.2em; |
||||||
|
margin-left: 0.2em; |
||||||
|
} |
||||||
|
|
||||||
|
body li { |
||||||
|
margin-top: 0.4em; |
||||||
|
margin-bottom: 0.4em; |
||||||
|
} |
||||||
|
|
||||||
|
span.menu a { |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
|
||||||
|
body .logo { |
||||||
|
font-family: "yond", "monospace"; |
||||||
|
font-size: 5em; |
||||||
|
text-align: center; |
||||||
|
width: 100%; |
||||||
|
display: block; |
||||||
|
line-height: 0.75em; |
||||||
|
color: #fff; |
||||||
|
color: var(--text-bright); |
||||||
|
} |
||||||
|
|
||||||
|
body a.topic_link { |
||||||
|
color: #dbdbdb; |
||||||
|
color: var(--text-main); |
||||||
|
} |
||||||
|
|
||||||
|
body .article_date { |
||||||
|
font-family: "yond", "monospace"; |
||||||
|
font-size: 1.75em; |
||||||
|
text-align: right; |
||||||
|
line-height: 0.5em; |
||||||
|
margin-right: -0.33em; |
||||||
|
margin-bottom: -0.35em; |
||||||
|
} |
||||||
|
|
||||||
|
body .article_photo { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
body .topic { |
||||||
|
display: inline-block; |
||||||
|
vertical-align: top; |
||||||
|
width: 48%; |
||||||
|
margin-bottom: 2.5em; |
||||||
|
} |
||||||
|
|
||||||
|
body .topic:nth-child(even) {margin-left: 2%} |
||||||
|
body .topic:nth-child(odd) {margin-right: 2%} |
||||||
|
|
||||||
|
body .topic .topic_image { |
||||||
|
display: block; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
/*body .topic .topic_image { border: 1px solid #666; }*/ |
||||||
|
|
||||||
|
body .topic .topic_title { |
||||||
|
display: block; |
||||||
|
font-weight: 600; |
||||||
|
font-size: 1.2em; |
||||||
|
margin-top: 0.35em; |
||||||
|
margin-bottom: 0.2em; |
||||||
|
} |
||||||
|
|
||||||
|
body .topic .topic_date { |
||||||
|
display: block; |
||||||
|
font-size: 0.85em; |
||||||
|
font-weight: 400; |
||||||
|
font-style: oblique; |
||||||
|
text-align: left; |
||||||
|
margin-bottom: 1em; |
||||||
|
} |
||||||
|
|
||||||
|
table#loracalc { |
||||||
|
/*border: 1px solid #888;*/ |
||||||
|
min-width: 50%; |
||||||
|
width: auto; |
||||||
|
} |
||||||
|
|
||||||
|
table#loracalc tbody tr td { |
||||||
|
vertical-align: middle; |
||||||
|
font-weight: bold; |
||||||
|
} |
||||||
|
|
||||||
|
table#loracalc tbody tr td.lcfield { |
||||||
|
padding-left: 5em; |
||||||
|
} |
||||||
|
|
||||||
|
table#loracalc tbody tr:nth-child(2n) { |
||||||
|
background-color: transparent; |
||||||
|
} |
||||||
|
|
||||||
|
table#loracalc input { |
||||||
|
display: inline-block; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
html { |
||||||
|
scrollbar-color: #040a0f #202b38; |
||||||
|
scrollbar-color: var(--scrollbar-thumb) var(--background-body); |
||||||
|
scrollbar-width: thin; |
||||||
|
} |
||||||
|
|
||||||
|
body { |
||||||
|
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 'Segoe UI Emoji', 'Apple Color Emoji', 'Noto Color Emoji', sans-serif; |
||||||
|
line-height: 1.4; |
||||||
|
max-width: 800px; |
||||||
|
margin: 20px auto; |
||||||
|
padding: 0 10px; |
||||||
|
word-wrap: break-word; |
||||||
|
color: #dbdbdb; |
||||||
|
color: var(--text-main); |
||||||
|
background: #202b38; |
||||||
|
background: var(--background-body); |
||||||
|
text-rendering: optimizeLegibility; |
||||||
|
} |
||||||
|
|
||||||
|
button { |
||||||
|
transition: |
||||||
|
background-color 0.1s linear, |
||||||
|
border-color 0.1s linear, |
||||||
|
color 0.1s linear, |
||||||
|
box-shadow 0.1s linear, |
||||||
|
transform 0.1s ease; |
||||||
|
transition: |
||||||
|
background-color var(--animation-duration) linear, |
||||||
|
border-color var(--animation-duration) linear, |
||||||
|
color var(--animation-duration) linear, |
||||||
|
box-shadow var(--animation-duration) linear, |
||||||
|
transform var(--animation-duration) ease; |
||||||
|
} |
||||||
|
|
||||||
|
input { |
||||||
|
transition: |
||||||
|
background-color 0.1s linear, |
||||||
|
border-color 0.1s linear, |
||||||
|
color 0.1s linear, |
||||||
|
box-shadow 0.1s linear, |
||||||
|
transform 0.1s ease; |
||||||
|
transition: |
||||||
|
background-color var(--animation-duration) linear, |
||||||
|
border-color var(--animation-duration) linear, |
||||||
|
color var(--animation-duration) linear, |
||||||
|
box-shadow var(--animation-duration) linear, |
||||||
|
transform var(--animation-duration) ease; |
||||||
|
} |
||||||
|
|
||||||
|
textarea { |
||||||
|
transition: |
||||||
|
background-color 0.1s linear, |
||||||
|
border-color 0.1s linear, |
||||||
|
color 0.1s linear, |
||||||
|
box-shadow 0.1s linear, |
||||||
|
transform 0.1s ease; |
||||||
|
transition: |
||||||
|
background-color var(--animation-duration) linear, |
||||||
|
border-color var(--animation-duration) linear, |
||||||
|
color var(--animation-duration) linear, |
||||||
|
box-shadow var(--animation-duration) linear, |
||||||
|
transform var(--animation-duration) ease; |
||||||
|
} |
||||||
|
|
||||||
|
h1 { |
||||||
|
font-size: 2.2em; |
||||||
|
margin-top: 0; |
||||||
|
} |
||||||
|
|
||||||
|
h1, |
||||||
|
h2, |
||||||
|
h3, |
||||||
|
h4, |
||||||
|
h5, |
||||||
|
h6 { |
||||||
|
margin-bottom: 12px; |
||||||
|
margin-top: 24px; |
||||||
|
} |
||||||
|
|
||||||
|
h1 { |
||||||
|
color: #fff; |
||||||
|
color: var(--text-bright); |
||||||
|
} |
||||||
|
|
||||||
|
h2 { |
||||||
|
color: #fff; |
||||||
|
color: var(--text-bright); |
||||||
|
} |
||||||
|
|
||||||
|
h3 { |
||||||
|
color: #fff; |
||||||
|
color: var(--text-bright); |
||||||
|
} |
||||||
|
|
||||||
|
h4 { |
||||||
|
color: #fff; |
||||||
|
color: var(--text-bright); |
||||||
|
} |
||||||
|
|
||||||
|
h5 { |
||||||
|
color: #fff; |
||||||
|
color: var(--text-bright); |
||||||
|
} |
||||||
|
|
||||||
|
h6 { |
||||||
|
color: #fff; |
||||||
|
color: var(--text-bright); |
||||||
|
} |
||||||
|
|
||||||
|
strong { |
||||||
|
color: #fff; |
||||||
|
color: var(--text-bright); |
||||||
|
} |
||||||
|
|
||||||
|
h1, |
||||||
|
h2, |
||||||
|
h3, |
||||||
|
h4, |
||||||
|
h5, |
||||||
|
h6, |
||||||
|
b, |
||||||
|
strong, |
||||||
|
th { |
||||||
|
font-weight: 600; |
||||||
|
} |
||||||
|
|
||||||
|
q::before { |
||||||
|
content: none; |
||||||
|
} |
||||||
|
|
||||||
|
q::after { |
||||||
|
content: none; |
||||||
|
} |
||||||
|
|
||||||
|
blockquote { |
||||||
|
border-left: 4px solid #0096bfab; |
||||||
|
border-left: 4px solid var(--focus); |
||||||
|
margin: 1.5em 0; |
||||||
|
padding: 0.5em 1em; |
||||||
|
font-style: italic; |
||||||
|
} |
||||||
|
|
||||||
|
q { |
||||||
|
border-left: 4px solid #0096bfab; |
||||||
|
border-left: 4px solid var(--focus); |
||||||
|
margin: 1.5em 0; |
||||||
|
padding: 0.5em 1em; |
||||||
|
font-style: italic; |
||||||
|
} |
||||||
|
|
||||||
|
blockquote > footer { |
||||||
|
font-style: normal; |
||||||
|
border: 0; |
||||||
|
} |
||||||
|
|
||||||
|
blockquote cite { |
||||||
|
font-style: normal; |
||||||
|
} |
||||||
|
|
||||||
|
address { |
||||||
|
font-style: normal; |
||||||
|
} |
||||||
|
|
||||||
|
a[href^='mailto\:']::before { |
||||||
|
content: '📧 '; |
||||||
|
} |
||||||
|
|
||||||
|
a[href^='tel\:']::before { |
||||||
|
content: '📞 '; |
||||||
|
} |
||||||
|
|
||||||
|
a[href^='sms\:']::before { |
||||||
|
content: '💬 '; |
||||||
|
} |
||||||
|
|
||||||
|
mark { |
||||||
|
background-color: #efdb43; |
||||||
|
background-color: var(--highlight); |
||||||
|
border-radius: 2px; |
||||||
|
padding: 0 2px 0 2px; |
||||||
|
color: #000; |
||||||
|
} |
||||||
|
|
||||||
|
a > code, |
||||||
|
a > strong { |
||||||
|
color: inherit; |
||||||
|
} |
||||||
|
|
||||||
|
button, |
||||||
|
select, |
||||||
|
input[type='submit'], |
||||||
|
input[type='reset'], |
||||||
|
input[type='button'], |
||||||
|
input[type='checkbox'], |
||||||
|
input[type='range'], |
||||||
|
input[type='radio'] { |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
input, |
||||||
|
select { |
||||||
|
display: block; |
||||||
|
} |
||||||
|
|
||||||
|
[type='checkbox'], |
||||||
|
[type='radio'] { |
||||||
|
display: initial; |
||||||
|
} |
||||||
|
|
||||||
|
input { |
||||||
|
color: #fff; |
||||||
|
color: var(--form-text); |
||||||
|
background-color: #161f27; |
||||||
|
background-color: var(--background); |
||||||
|
font-family: inherit; |
||||||
|
font-size: inherit; |
||||||
|
margin-right: 6px; |
||||||
|
margin-bottom: 6px; |
||||||
|
padding: 10px; |
||||||
|
border: none; |
||||||
|
border-radius: 6px; |
||||||
|
outline: none; |
||||||
|
} |
||||||
|
|
||||||
|
button { |
||||||
|
color: #fff; |
||||||
|
color: var(--form-text); |
||||||
|
background-color: #161f27; |
||||||
|
background-color: var(--background); |
||||||
|
font-family: inherit; |
||||||
|
font-size: inherit; |
||||||
|
margin-right: 6px; |
||||||
|
margin-bottom: 6px; |
||||||
|
padding: 10px; |
||||||
|
border: none; |
||||||
|
border-radius: 6px; |
||||||
|
outline: none; |
||||||
|
} |
||||||
|
|
||||||
|
textarea { |
||||||
|
color: #fff; |
||||||
|
color: var(--form-text); |
||||||
|
background-color: #161f27; |
||||||
|
background-color: var(--background); |
||||||
|
font-family: inherit; |
||||||
|
font-size: inherit; |
||||||
|
margin-right: 6px; |
||||||
|
margin-bottom: 6px; |
||||||
|
padding: 10px; |
||||||
|
border: none; |
||||||
|
border-radius: 6px; |
||||||
|
outline: none; |
||||||
|
} |
||||||
|
|
||||||
|
select { |
||||||
|
color: #fff; |
||||||
|
color: var(--form-text); |
||||||
|
background-color: #161f27; |
||||||
|
background-color: var(--background); |
||||||
|
font-family: inherit; |
||||||
|
font-size: inherit; |
||||||
|
margin-right: 6px; |
||||||
|
margin-bottom: 6px; |
||||||
|
padding: 10px; |
||||||
|
border: none; |
||||||
|
border-radius: 6px; |
||||||
|
outline: none; |
||||||
|
} |
||||||
|
|
||||||
|
button { |
||||||
|
background-color: #0c151c; |
||||||
|
background-color: var(--button-base); |
||||||
|
padding-right: 30px; |
||||||
|
padding-left: 30px; |
||||||
|
} |
||||||
|
|
||||||
|
input[type='submit'] { |
||||||
|
background-color: #0c151c; |
||||||
|
background-color: var(--button-base); |
||||||
|
padding-right: 30px; |
||||||
|
padding-left: 30px; |
||||||
|
} |
||||||
|
|
||||||
|
input[type='reset'] { |
||||||
|
background-color: #0c151c; |
||||||
|
background-color: var(--button-base); |
||||||
|
padding-right: 30px; |
||||||
|
padding-left: 30px; |
||||||
|
} |
||||||
|
|
||||||
|
input[type='button'] { |
||||||
|
background-color: #0c151c; |
||||||
|
background-color: var(--button-base); |
||||||
|
padding-right: 30px; |
||||||
|
padding-left: 30px; |
||||||
|
} |
||||||
|
|
||||||
|
button:hover { |
||||||
|
background: #040a0f; |
||||||
|
background: var(--button-hover); |
||||||
|
} |
||||||
|
|
||||||
|
input[type='submit']:hover { |
||||||
|
background: #040a0f; |
||||||
|
background: var(--button-hover); |
||||||
|
} |
||||||
|
|
||||||
|
input[type='reset']:hover { |
||||||
|
background: #040a0f; |
||||||
|
background: var(--button-hover); |
||||||
|
} |
||||||
|
|
||||||
|
input[type='button']:hover { |
||||||
|
background: #040a0f; |
||||||
|
background: var(--button-hover); |
||||||
|
} |
||||||
|
|
||||||
|
input[type='color'] { |
||||||
|
min-height: 2rem; |
||||||
|
padding: 8px; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
input[type='checkbox'], |
||||||
|
input[type='radio'] { |
||||||
|
height: 1em; |
||||||
|
width: 1em; |
||||||
|
} |
||||||
|
|
||||||
|
input[type='radio'] { |
||||||
|
border-radius: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
input { |
||||||
|
vertical-align: top; |
||||||
|
} |
||||||
|
|
||||||
|
label { |
||||||
|
vertical-align: middle; |
||||||
|
margin-bottom: 4px; |
||||||
|
display: inline-block; |
||||||
|
} |
||||||
|
|
||||||
|
input:not([type='checkbox']):not([type='radio']), |
||||||
|
input[type='range'], |
||||||
|
select, |
||||||
|
button, |
||||||
|
textarea { |
||||||
|
-webkit-appearance: none; |
||||||
|
} |
||||||
|
|
||||||
|
textarea { |
||||||
|
display: block; |
||||||
|
margin-right: 0; |
||||||
|
box-sizing: border-box; |
||||||
|
resize: vertical; |
||||||
|
} |
||||||
|
|
||||||
|
textarea:not([cols]) { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
textarea:not([rows]) { |
||||||
|
min-height: 40px; |
||||||
|
height: 140px; |
||||||
|
} |
||||||
|
|
||||||
|
select { |
||||||
|
background: #161f27 url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E") calc(100% - 12px) 50% / 12px no-repeat; |
||||||
|
background: var(--background) var(--select-arrow) calc(100% - 12px) 50% / 12px no-repeat; |
||||||
|
padding-right: 35px; |
||||||
|
} |
||||||
|
|
||||||
|
select::-ms-expand { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
select[multiple] { |
||||||
|
padding-right: 10px; |
||||||
|
background-image: none; |
||||||
|
overflow-y: auto; |
||||||
|
} |
||||||
|
|
||||||
|
input:focus { |
||||||
|
box-shadow: 0 0 0 2px #0096bfab; |
||||||
|
box-shadow: 0 0 0 2px var(--focus); |
||||||
|
} |
||||||
|
|
||||||
|
select:focus { |
||||||
|
box-shadow: 0 0 0 2px #0096bfab; |
||||||
|
box-shadow: 0 0 0 2px var(--focus); |
||||||
|
} |
||||||
|
|
||||||
|
button:focus { |
||||||
|
box-shadow: 0 0 0 2px #0096bfab; |
||||||
|
box-shadow: 0 0 0 2px var(--focus); |
||||||
|
} |
||||||
|
|
||||||
|
textarea:focus { |
||||||
|
box-shadow: 0 0 0 2px #0096bfab; |
||||||
|
box-shadow: 0 0 0 2px var(--focus); |
||||||
|
} |
||||||
|
|
||||||
|
input[type='checkbox']:active, |
||||||
|
input[type='radio']:active, |
||||||
|
input[type='submit']:active, |
||||||
|
input[type='reset']:active, |
||||||
|
input[type='button']:active, |
||||||
|
input[type='range']:active, |
||||||
|
button:active { |
||||||
|
transform: translateY(2px); |
||||||
|
} |
||||||
|
|
||||||
|
input:disabled, |
||||||
|
select:disabled, |
||||||
|
button:disabled, |
||||||
|
textarea:disabled { |
||||||
|
cursor: not-allowed; |
||||||
|
opacity: 0.5; |
||||||
|
} |
||||||
|
|
||||||
|
::-moz-placeholder { |
||||||
|
color: #a9a9a9; |
||||||
|
color: var(--form-placeholder); |
||||||
|
} |
||||||
|
|
||||||
|
:-ms-input-placeholder { |
||||||
|
color: #a9a9a9; |
||||||
|
color: var(--form-placeholder); |
||||||
|
} |
||||||
|
|
||||||
|
::-ms-input-placeholder { |
||||||
|
color: #a9a9a9; |
||||||
|
color: var(--form-placeholder); |
||||||
|
} |
||||||
|
|
||||||
|
::placeholder { |
||||||
|
color: #a9a9a9; |
||||||
|
color: var(--form-placeholder); |
||||||
|
} |
||||||
|
|
||||||
|
fieldset { |
||||||
|
border: 1px #0096bfab solid; |
||||||
|
border: 1px var(--focus) solid; |
||||||
|
border-radius: 6px; |
||||||
|
margin: 0; |
||||||
|
margin-bottom: 12px; |
||||||
|
padding: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
legend { |
||||||
|
font-size: 0.9em; |
||||||
|
font-weight: 600; |
||||||
|
} |
||||||
|
|
||||||
|
input[type='range'] { |
||||||
|
margin: 10px 0; |
||||||
|
padding: 10px 0; |
||||||
|
background: transparent; |
||||||
|
} |
||||||
|
|
||||||
|
input[type='range']:focus { |
||||||
|
outline: none; |
||||||
|
} |
||||||
|
|
||||||
|
input[type='range']::-webkit-slider-runnable-track { |
||||||
|
width: 100%; |
||||||
|
height: 9.5px; |
||||||
|
-webkit-transition: 0.2s; |
||||||
|
transition: 0.2s; |
||||||
|
background: #161f27; |
||||||
|
background: var(--background); |
||||||
|
border-radius: 3px; |
||||||
|
} |
||||||
|
|
||||||
|
input[type='range']::-webkit-slider-thumb { |
||||||
|
box-shadow: 0 1px 1px #000, 0 0 1px #0d0d0d; |
||||||
|
height: 20px; |
||||||
|
width: 20px; |
||||||
|
border-radius: 50%; |
||||||
|
background: #526980; |
||||||
|
background: var(--border); |
||||||
|
-webkit-appearance: none; |
||||||
|
margin-top: -7px; |
||||||
|
} |
||||||
|
|
||||||
|
input[type='range']:focus::-webkit-slider-runnable-track { |
||||||
|
background: #161f27; |
||||||
|
background: var(--background); |
||||||
|
} |
||||||
|
|
||||||
|
input[type='range']::-moz-range-track { |
||||||
|
width: 100%; |
||||||
|
height: 9.5px; |
||||||
|
-moz-transition: 0.2s; |
||||||
|
transition: 0.2s; |
||||||
|
background: #161f27; |
||||||
|
background: var(--background); |
||||||
|
border-radius: 3px; |
||||||
|
} |
||||||
|
|
||||||
|
input[type='range']::-moz-range-thumb { |
||||||
|
box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; |
||||||
|
height: 20px; |
||||||
|
width: 20px; |
||||||
|
border-radius: 50%; |
||||||
|
background: #526980; |
||||||
|
background: var(--border); |
||||||
|
} |
||||||
|
|
||||||
|
input[type='range']::-ms-track { |
||||||
|
width: 100%; |
||||||
|
height: 9.5px; |
||||||
|
background: transparent; |
||||||
|
border-color: transparent; |
||||||
|
border-width: 16px 0; |
||||||
|
color: transparent; |
||||||
|
} |
||||||
|
|
||||||
|
input[type='range']::-ms-fill-lower { |
||||||
|
background: #161f27; |
||||||
|
background: var(--background); |
||||||
|
border: 0.2px solid #010101; |
||||||
|
border-radius: 3px; |
||||||
|
box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; |
||||||
|
} |
||||||
|
|
||||||
|
input[type='range']::-ms-fill-upper { |
||||||
|
background: #161f27; |
||||||
|
background: var(--background); |
||||||
|
border: 0.2px solid #010101; |
||||||
|
border-radius: 3px; |
||||||
|
box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; |
||||||
|
} |
||||||
|
|
||||||
|
input[type='range']::-ms-thumb { |
||||||
|
box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; |
||||||
|
border: 1px solid #000; |
||||||
|
height: 20px; |
||||||
|
width: 20px; |
||||||
|
border-radius: 50%; |
||||||
|
background: #526980; |
||||||
|
background: var(--border); |
||||||
|
} |
||||||
|
|
||||||
|
input[type='range']:focus::-ms-fill-lower { |
||||||
|
background: #161f27; |
||||||
|
background: var(--background); |
||||||
|
} |
||||||
|
|
||||||
|
input[type='range']:focus::-ms-fill-upper { |
||||||
|
background: #161f27; |
||||||
|
background: var(--background); |
||||||
|
} |
||||||
|
|
||||||
|
a { |
||||||
|
text-decoration: underline; |
||||||
|
color: #41adff; |
||||||
|
color: var(--links); |
||||||
|
} |
||||||
|
|
||||||
|
a:hover { |
||||||
|
text-decoration: underline; |
||||||
|
} |
||||||
|
|
||||||
|
code { |
||||||
|
background: #161f27; |
||||||
|
background: var(--background); |
||||||
|
color: #ffbe85; |
||||||
|
color: var(--code); |
||||||
|
padding: 2.5px 5px; |
||||||
|
border-radius: 6px; |
||||||
|
font-size: 1em; |
||||||
|
} |
||||||
|
|
||||||
|
samp { |
||||||
|
background: #161f27; |
||||||
|
background: var(--background); |
||||||
|
color: #ffbe85; |
||||||
|
color: var(--code); |
||||||
|
padding: 2.5px 5px; |
||||||
|
border-radius: 6px; |
||||||
|
font-size: 1em; |
||||||
|
} |
||||||
|
|
||||||
|
time { |
||||||
|
background: #161f27; |
||||||
|
background: var(--background); |
||||||
|
color: #ffbe85; |
||||||
|
color: var(--code); |
||||||
|
padding: 2.5px 5px; |
||||||
|
border-radius: 6px; |
||||||
|
font-size: 1em; |
||||||
|
} |
||||||
|
|
||||||
|
pre > code { |
||||||
|
padding: 10px; |
||||||
|
display: block; |
||||||
|
overflow-x: auto; |
||||||
|
} |
||||||
|
|
||||||
|
var { |
||||||
|
color: #d941e2; |
||||||
|
color: var(--variable); |
||||||
|
font-style: normal; |
||||||
|
font-family: monospace; |
||||||
|
} |
||||||
|
|
||||||
|
kbd { |
||||||
|
background: #161f27; |
||||||
|
background: var(--background); |
||||||
|
border: 1px solid #526980; |
||||||
|
border: 1px solid var(--border); |
||||||
|
border-radius: 2px; |
||||||
|
color: #dbdbdb; |
||||||
|
color: var(--text-main); |
||||||
|
padding: 2px 4px 2px 4px; |
||||||
|
} |
||||||
|
|
||||||
|
img, |
||||||
|
video { |
||||||
|
max-width: 100%; |
||||||
|
height: auto; |
||||||
|
} |
||||||
|
|
||||||
|
hr { |
||||||
|
border: none; |
||||||
|
border-top: 1px solid #526980; |
||||||
|
border-top: 1px solid var(--border); |
||||||
|
} |
||||||
|
|
||||||
|
table { |
||||||
|
border-collapse: collapse; |
||||||
|
margin-bottom: 10px; |
||||||
|
width: 100%; |
||||||
|
table-layout: fixed; |
||||||
|
} |
||||||
|
|
||||||
|
table caption { |
||||||
|
text-align: left; |
||||||
|
} |
||||||
|
|
||||||
|
td, |
||||||
|
th { |
||||||
|
padding: 6px; |
||||||
|
text-align: left; |
||||||
|
vertical-align: top; |
||||||
|
word-wrap: break-word; |
||||||
|
} |
||||||
|
|
||||||
|
thead { |
||||||
|
border-bottom: 1px solid #526980; |
||||||
|
border-bottom: 1px solid var(--border); |
||||||
|
} |
||||||
|
|
||||||
|
tfoot { |
||||||
|
border-top: 1px solid #526980; |
||||||
|
border-top: 1px solid var(--border); |
||||||
|
} |
||||||
|
|
||||||
|
tbody tr:nth-child(even) { |
||||||
|
background-color: #161f27; |
||||||
|
background-color: var(--background); |
||||||
|
} |
||||||
|
|
||||||
|
tbody tr:nth-child(even) button { |
||||||
|
background-color: #1a242f; |
||||||
|
background-color: var(--background-alt); |
||||||
|
} |
||||||
|
|
||||||
|
tbody tr:nth-child(even) button:hover { |
||||||
|
background-color: #202b38; |
||||||
|
background-color: var(--background-body); |
||||||
|
} |
||||||
|
|
||||||
|
::-webkit-scrollbar { |
||||||
|
height: 10px; |
||||||
|
width: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
::-webkit-scrollbar-track { |
||||||
|
background: #161f27; |
||||||
|
background: var(--background); |
||||||
|
border-radius: 6px; |
||||||
|
} |
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb { |
||||||
|
background: #040a0f; |
||||||
|
background: var(--scrollbar-thumb); |
||||||
|
border-radius: 6px; |
||||||
|
} |
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb:hover { |
||||||
|
background: rgb(0, 0, 0); |
||||||
|
background: var(--scrollbar-thumb-hover); |
||||||
|
} |
||||||
|
|
||||||
|
::-moz-selection { |
||||||
|
background-color: #1c76c5; |
||||||
|
background-color: var(--selection); |
||||||
|
color: #fff; |
||||||
|
color: var(--text-bright); |
||||||
|
} |
||||||
|
|
||||||
|
::selection { |
||||||
|
background-color: #1c76c5; |
||||||
|
background-color: var(--selection); |
||||||
|
color: #fff; |
||||||
|
color: var(--text-bright); |
||||||
|
} |
||||||
|
|
||||||
|
details { |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
align-items: flex-start; |
||||||
|
background-color: #1a242f; |
||||||
|
background-color: var(--background-alt); |
||||||
|
padding: 10px 10px 0; |
||||||
|
margin: 1em 0; |
||||||
|
border-radius: 6px; |
||||||
|
overflow: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
details[open] { |
||||||
|
padding: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
details > :last-child { |
||||||
|
margin-bottom: 0; |
||||||
|
} |
||||||
|
|
||||||
|
details[open] summary { |
||||||
|
margin-bottom: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
summary { |
||||||
|
display: list-item; |
||||||
|
background-color: #161f27; |
||||||
|
background-color: var(--background); |
||||||
|
padding: 10px; |
||||||
|
margin: -10px -10px 0; |
||||||
|
cursor: pointer; |
||||||
|
outline: none; |
||||||
|
} |
||||||
|
|
||||||
|
summary:hover, |
||||||
|
summary:focus { |
||||||
|
text-decoration: underline; |
||||||
|
} |
||||||
|
|
||||||
|
details > :not(summary) { |
||||||
|
margin-top: 0; |
||||||
|
} |
||||||
|
|
||||||
|
summary::-webkit-details-marker { |
||||||
|
color: #dbdbdb; |
||||||
|
color: var(--text-main); |
||||||
|
} |
||||||
|
|
||||||
|
dialog { |
||||||
|
background-color: #1a242f; |
||||||
|
background-color: var(--background-alt); |
||||||
|
color: #dbdbdb; |
||||||
|
color: var(--text-main); |
||||||
|
border: none; |
||||||
|
border-radius: 6px; |
||||||
|
border-color: #526980; |
||||||
|
border-color: var(--border); |
||||||
|
padding: 10px 30px; |
||||||
|
} |
||||||
|
|
||||||
|
dialog > header:first-child { |
||||||
|
background-color: #161f27; |
||||||
|
background-color: var(--background); |
||||||
|
border-radius: 6px 6px 0 0; |
||||||
|
margin: -10px -30px 10px; |
||||||
|
padding: 10px; |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
|
||||||
|
dialog::-webkit-backdrop { |
||||||
|
background: #0000009c; |
||||||
|
-webkit-backdrop-filter: blur(4px); |
||||||
|
backdrop-filter: blur(4px); |
||||||
|
} |
||||||
|
|
||||||
|
dialog::backdrop { |
||||||
|
background: #0000009c; |
||||||
|
-webkit-backdrop-filter: blur(4px); |
||||||
|
backdrop-filter: blur(4px); |
||||||
|
} |
||||||
|
|
||||||
|
footer { |
||||||
|
border-top: 1px solid #526980; |
||||||
|
border-top: 1px solid var(--border); |
||||||
|
padding-top: 10px; |
||||||
|
color: #a9b1ba; |
||||||
|
color: var(--text-muted); |
||||||
|
} |
||||||
|
|
||||||
|
body > footer { |
||||||
|
margin-top: 40px; |
||||||
|
} |
||||||
|
|
||||||
|
@media print { |
||||||
|
body, |
||||||
|
pre, |
||||||
|
code, |
||||||
|
summary, |
||||||
|
details, |
||||||
|
button, |
||||||
|
input, |
||||||
|
textarea { |
||||||
|
background-color: #fff; |
||||||
|
} |
||||||
|
|
||||||
|
button, |
||||||
|
input, |
||||||
|
textarea { |
||||||
|
border: 1px solid #000; |
||||||
|
} |
||||||
|
|
||||||
|
body, |
||||||
|
h1, |
||||||
|
h2, |
||||||
|
h3, |
||||||
|
h4, |
||||||
|
h5, |
||||||
|
h6, |
||||||
|
pre, |
||||||
|
code, |
||||||
|
button, |
||||||
|
input, |
||||||
|
textarea, |
||||||
|
footer, |
||||||
|
summary, |
||||||
|
strong { |
||||||
|
color: #000; |
||||||
|
} |
||||||
|
|
||||||
|
summary::marker { |
||||||
|
color: #000; |
||||||
|
} |
||||||
|
|
||||||
|
summary::-webkit-details-marker { |
||||||
|
color: #000; |
||||||
|
} |
||||||
|
|
||||||
|
tbody tr:nth-child(even) { |
||||||
|
background-color: #f2f2f2; |
||||||
|
} |
||||||
|
|
||||||
|
a { |
||||||
|
color: #00f; |
||||||
|
text-decoration: underline; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#load_overlay { |
||||||
|
display: none; |
||||||
|
} |
Binary file not shown.
@ -0,0 +1,162 @@ |
|||||||
|
import markdown |
||||||
|
import os |
||||||
|
|
||||||
|
DEFAULT_TITLE = "RNode Bootstrap Console" |
||||||
|
SOURCES_PATH="./source" |
||||||
|
BUILD_PATH="./build" |
||||||
|
INPUT_ENCODING="utf-8" |
||||||
|
OUTPUT_ENCODING="utf-8" |
||||||
|
|
||||||
|
LXMF_ADDRESS = "8dd57a738226809646089335a6b03695" |
||||||
|
|
||||||
|
document_start = """ |
||||||
|
<!doctype html> |
||||||
|
<html> |
||||||
|
<head> |
||||||
|
<link rel="stylesheet" href="water.css?v=5"> |
||||||
|
<link rel="shortcut icon" type="image/x-icon" href="{ASSET_PATH}gfx/icon.png"> |
||||||
|
<meta charset="utf-8"/> |
||||||
|
<title>{PAGE_TITLE}</title> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<div id="load_overlay" style="background-color:#2a2a2f; position:absolute; top:0px; left:0px; width:100%; height:100%; z-index:2000;"></div> |
||||||
|
<span class="logo">RNode Console</span> |
||||||
|
{MENU}<hr>""" |
||||||
|
|
||||||
|
document_end = """</body></html>""" |
||||||
|
|
||||||
|
menu_md = """<center><span class="menu">[Start]({CONTENT_PATH}index.html) | [Replicate]({CONTENT_PATH}replicate.html) | [Guides]({CONTENT_PATH}guides.html) | [Software]({CONTENT_PATH}software/index.html)| [Help](help.html) | [Contribute]({CONTENT_PATH}contribute.html)</span></center>""" |
||||||
|
|
||||||
|
url_maps = [ |
||||||
|
# { "path": "", "target": "/.md"}, |
||||||
|
] |
||||||
|
|
||||||
|
def scan_pages(base_path): |
||||||
|
files = [file for file in os.listdir(base_path) if os.path.isfile(os.path.join(base_path, file)) and file[:1] != "."] |
||||||
|
directories = [file for file in os.listdir(base_path) if os.path.isdir(os.path.join(base_path, file)) and file[:1] != "."] |
||||||
|
|
||||||
|
page_sources = [] |
||||||
|
|
||||||
|
for file in files: |
||||||
|
if file.endswith(".md"): |
||||||
|
page_sources.append(base_path+"/"+file) |
||||||
|
|
||||||
|
for directory in directories: |
||||||
|
page_sources.extend(scan_pages(base_path+"/"+directory)) |
||||||
|
|
||||||
|
return page_sources |
||||||
|
|
||||||
|
def get_prop(md, prop): |
||||||
|
try: |
||||||
|
pt = "["+prop+"]: <> (" |
||||||
|
pp = md.find(pt) |
||||||
|
if pp != -1: |
||||||
|
ps = pp+len(pt) |
||||||
|
pe = md.find(")", ps) |
||||||
|
return md[ps:pe] |
||||||
|
else: |
||||||
|
return None |
||||||
|
|
||||||
|
except Exception as e: |
||||||
|
print("Error while extracting topic property: "+str(e)) |
||||||
|
return None |
||||||
|
|
||||||
|
def list_topic(topic): |
||||||
|
base_path = SOURCES_PATH+"/"+topic |
||||||
|
files = [file for file in os.listdir(base_path) if os.path.isfile(os.path.join(base_path, file)) and file[:1] != "." and file != "index.md"] |
||||||
|
|
||||||
|
topic_entries = [] |
||||||
|
for file in files: |
||||||
|
if file.endswith(".md"): |
||||||
|
fp = base_path+"/"+file |
||||||
|
f = open(fp, "rb") |
||||||
|
link_path = fp.replace(SOURCES_PATH, ".").replace(".md", ".html") |
||||||
|
|
||||||
|
md = f.read().decode(INPUT_ENCODING) |
||||||
|
topic_entries.append({ |
||||||
|
"title": get_prop(md, "title"), |
||||||
|
"image": get_prop(md, "image"), |
||||||
|
"date": get_prop(md, "date"), |
||||||
|
"excerpt": get_prop(md, "excerpt"), |
||||||
|
"md": md, |
||||||
|
"file": link_path |
||||||
|
}) |
||||||
|
|
||||||
|
topic_entries.sort(key=lambda e: e["date"], reverse=True) |
||||||
|
return topic_entries |
||||||
|
|
||||||
|
def render_topic(topic_entries): |
||||||
|
md = "" |
||||||
|
for topic in topic_entries: |
||||||
|
md += "<a class=\"topic_link\" href=\""+str(topic["file"])+"\">" |
||||||
|
md += "<span class=\"topic\">" |
||||||
|
md += "<img class=\"topic_image\" src=\""+str(topic["image"])+"\"/>" |
||||||
|
md += "<span class=\"topic_title\">"+str(topic["title"])+"</span>" |
||||||
|
md += "<span class=\"topic_date\">"+str(topic["date"])+"</span>" |
||||||
|
md += "<span class=\"topic_excerpt\">"+str(topic["excerpt"])+"</span>" |
||||||
|
md += "</span>" |
||||||
|
md += "</a>" |
||||||
|
|
||||||
|
|
||||||
|
return md |
||||||
|
|
||||||
|
def generate_html(f, root_path): |
||||||
|
md = f.read().decode(INPUT_ENCODING) |
||||||
|
|
||||||
|
page_title = get_prop(md, "title") |
||||||
|
if page_title == None: |
||||||
|
page_title = DEFAULT_TITLE |
||||||
|
else: |
||||||
|
page_title += " | "+DEFAULT_TITLE |
||||||
|
|
||||||
|
tt = "{TOPIC:" |
||||||
|
tp = md.find(tt) |
||||||
|
if tp != -1: |
||||||
|
ts = tp+len(tt) |
||||||
|
te = md.find("}", ts) |
||||||
|
topic = md[ts:te] |
||||||
|
|
||||||
|
rt = tt+topic+"}" |
||||||
|
tl = render_topic(list_topic(topic)) |
||||||
|
print("Found topic: "+str(topic)+", rt "+str(rt)) |
||||||
|
md = md.replace(rt, tl) |
||||||
|
|
||||||
|
menu_html = markdown.markdown(menu_md.replace("{CONTENT_PATH}", root_path), extensions=["markdown.extensions.fenced_code"]).replace("<p></p>", "") |
||||||
|
page_html = markdown.markdown(md, extensions=["markdown.extensions.fenced_code"]).replace("{ASSET_PATH}", root_path) |
||||||
|
page_html = page_html.replace("{LXMF_ADDRESS}", LXMF_ADDRESS) |
||||||
|
page_date = get_prop(md, "date") |
||||||
|
if page_date != None: |
||||||
|
page_html = page_html.replace("{DATE}", page_date) |
||||||
|
|
||||||
|
return document_start.replace("{ASSET_PATH}", root_path).replace("{MENU}", menu_html).replace("{PAGE_TITLE}", page_title) + page_html + document_end |
||||||
|
|
||||||
|
source_files = scan_pages(SOURCES_PATH) |
||||||
|
|
||||||
|
for um in url_maps: |
||||||
|
with open(SOURCES_PATH+"/"+um["target"], "rb") as f: |
||||||
|
of = BUILD_PATH+um["target"].replace(SOURCES_PATH, "").replace(".md", ".html") |
||||||
|
root_path = "../" |
||||||
|
html = generate_html(f, root_path) |
||||||
|
|
||||||
|
print("Map path : "+str(um["path"])) |
||||||
|
print("Map target : "+str(um["target"])) |
||||||
|
print("Mapped root path: "+str(root_path)) |
||||||
|
|
||||||
|
if not os.path.isdir(BUILD_PATH+"/"+um["path"]): |
||||||
|
os.makedirs(BUILD_PATH+"/"+um["path"], exist_ok=True) |
||||||
|
|
||||||
|
with open(BUILD_PATH+"/"+um["path"]+"/index.html", "wb") as wf: |
||||||
|
wf.write(html.encode(OUTPUT_ENCODING)) |
||||||
|
|
||||||
|
for mdf in source_files: |
||||||
|
with open(mdf, "rb") as f: |
||||||
|
of = BUILD_PATH+mdf.replace(SOURCES_PATH, "").replace(".md", ".html") |
||||||
|
root_path = "../"*(len(of.replace(BUILD_PATH+"/", "").split("/"))-1) |
||||||
|
html = generate_html(f, root_path) |
||||||
|
|
||||||
|
if not os.path.isdir(os.path.dirname(of)): |
||||||
|
os.makedirs(os.path.dirname(of), exist_ok=True) |
||||||
|
|
||||||
|
with open(of, "wb") as wf: |
||||||
|
wf.write(html.encode(OUTPUT_ENCODING)) |
@ -0,0 +1,18 @@ |
|||||||
|
|
||||||
|
<div id="load_overlay" style="background-color:#2a2a2f; position:absolute; top:0px; left:0px; width:100%; height:100%; z-index:2000;"></div> |
||||||
|
<span class="logo">unsigned.io</span> |
||||||
|
<p></p><center><span class="menu"><a href="index.html">Home</a> | <a href="guides.html">Guides</a> | <a href="software/index.html">Software</a> | <a href="hardware/index.html">Hardware</a> | <a href="https://github.com/markqvist/Reticulum/discussions">Discussions</a> | <a href="https://unsigned.io/shop">Shop</a> | <a href="contact.html">Contact Me</a> | <a href="donate.html">Donate</a></span></center><p></p><hr><h2>Support My Work</h2> |
||||||
|
<p>You can help support the continued development of open, free and private communications systems by donating via one of the following channels:</p> |
||||||
|
<ul> |
||||||
|
<li>Monero<br> |
||||||
|
<code>84FpY1QbxHcgdseePYNmhTHcrgMX4nFfBYtz2GKYToqHVVhJp8Eaw1Z1EedRnKD19b3B8NiLCGVxzKV17UMmmeEsCrPyA5w</code> |
||||||
|
<br><br></li> |
||||||
|
<li>Ethereum<br> |
||||||
|
<code>0x81F7B979fEa6134bA9FD5c701b3501A2e61E897a</code> |
||||||
|
<br><br></li> |
||||||
|
<li>Bitcoin<br> |
||||||
|
<code>3CPmacGm34qYvR6XWLVEJmi2aNe3PZqUuq</code> |
||||||
|
<br><br></li> |
||||||
|
<li>Ko-Fi<br> |
||||||
|
<a href="https://ko-fi.com/markqvist"><code>https://ko-fi.com/markqvist</code></a></li> |
||||||
|
</ul> |
File diff suppressed because one or more lines are too long
Binary file not shown.
Loading…
Reference in new issue