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