diff --git a/assets/js/obs.js b/assets/js/obs.js index 7ce28c25..0e4f9ac3 100644 --- a/assets/js/obs.js +++ b/assets/js/obs.js @@ -62,3 +62,18 @@ function initSliders() { } } document.addEventListener('DOMContentLoaded', initSliders) + +////////////////////////////////////////////// + +function initTocHide() { + // Fix to hide TOC menu when clicking a link inside -- not easy with native HTML + // without making an ugly DOM. + + const main = document.getElementById('mobile-menu-main') + for (const item of Array.from(document.querySelectorAll('aside.toc a'))) { + item.addEventListener('click', () => { + main.checked = true + }) + } +} +document.addEventListener('DOMContentLoaded', initTocHide) diff --git a/assets/scss/_nav.scss b/assets/scss/_nav.scss deleted file mode 100644 index 2b7b87b9..00000000 --- a/assets/scss/_nav.scss +++ /dev/null @@ -1,421 +0,0 @@ -// -// Main navbar -// - -.td-navbar-cover { - @include media-breakpoint-up(md) { - background: transparent !important; - - .nav-link { - text-shadow: 1px 1px 2px $dark; - } - } - - &.navbar-bg-onscroll .nav-link { - text-shadow: none; - } -} - -.navbar-bg-onscroll { - background: $primary !important; - opacity: inherit; -} - -.td-navbar { - @extend .navbar; - - background: $primary; - min-height: 4rem; - margin: 0; - z-index: 32; - - .navbar-brand { - text-transform: none; - - &__name { - font-weight: $font-weight-bold; - } - - svg { - display: inline-block; - margin: 0 10px; - height: 30px; - } - } - - .navbar-nav { - padding-top: $spacer * 0.5; - white-space: nowrap; - } - - .nav-link { - text-transform: none; - font-weight: $font-weight-bold; - } - - // For .td-search__input styling, see _search.scss - - .dropdown { - min-width: 100px; - } - - @include media-breakpoint-up(md) { - position: fixed; - top: 0; - width: 100%; - - .nav-item { - padding-inline-end: $spacer * 0.5; - } - - .navbar-nav { - padding-top: 0 !important; - } - } - - @include media-breakpoint-down(lg) { - .td-navbar-nav-scroll { - max-width: 100%; - height: 2.5rem; - overflow: hidden; - font-size: 0.9rem; - } - - .navbar-brand { - margin-right: 0; - } - - .navbar-nav { - padding-bottom: 2rem; - overflow-x: auto; - } - } -} - -// Icons -#main_navbar { - li i { - padding-right: 0.5em; - - &:before { - display: inline-block; - text-align: center; - min-width: 1em; - } - } - .alert { - background-color: inherit; - padding: 0; - color: $secondary; - border: 0; - font-weight: inherit; - - &:before { - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - font-family: $font-awesome-font-name; - font-weight: 900; - content: "\f0d9"; - padding-left: 0.5em; - padding-right: 0.5em; - } - } -} - -// Foldable sidebar menu -nav.foldable-nav { - &#td-section-nav { - position: relative; - } - - &#td-section-nav label { - margin-bottom: 0; - width: 100%; - } - - .td-sidebar-nav__section, - .with-child ul { - list-style: none; - padding: 0; - margin: 0; - } - - .ul-1 > li { - padding-left: 1.5em; - } - - ul.foldable { - display: none; - } - - input:checked ~ ul.foldable { - display: block; - } - - input[type="checkbox"] { - display: none; - } - - .with-child, - .without-child { - position: relative; - padding-left: 1.5em; - } - - .ul-1 .with-child > label:before { - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - font-family: $font-awesome-font-name; - font-weight: 900; - content: "\f0da"; - position: absolute; - left: 0.1em; - padding-left: 0.4em; - padding-right: 0.4em; - font-size: 1em; - color: $gray-900; - transition: all 0.5s; - &:hover { - transform: rotate(90deg); - } - } - - .ul-1 .with-child > input:checked ~ label:before { - color: $primary; - transform: rotate(90deg); - transition: transform 0.5s; - } - - .with-child ul { - margin-top: 0.1em; - } -} - -@media (hover: hover) and (pointer: fine) { - nav.foldable-nav { - .ul-1 .with-child > label:hover:before { - color: $primary; - transition: color 0.3s; - } - - .ul-1 .with-child > input:checked ~ label:hover:before { - color: $primary; - transition: color 0.3s; - } - } -} - - -/* -This file was taken under apache license from https://github.com/SeleniumHQ/seleniumhq.github.io/commit/abbba6c20e14c27eb7003999a3e084b5a733fe71#diff-f6622ba22bb7f8310f9c41e73bdf83f441d53360b0b5cf100595cdcd3caa7850 -The initial commit was made without modifications - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2024 Software Freedom Conservancy (SFC) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - */ diff --git a/assets/scss/_styles_project.scss b/assets/scss/_styles_project.scss deleted file mode 100644 index 38865d99..00000000 --- a/assets/scss/_styles_project.scss +++ /dev/null @@ -1,632 +0,0 @@ -@import "./_variables_project.scss"; -@import "nav"; - - -body { - line-height: 1.7em; -} - -.award { - width: 250px; - transform: rotate(0deg) translate(0,-50pt); - align: left; -} -.td-content { - max-width: 60rem; -} - -.btn { - border-radius: 0.2rem; - - &-lg { - border-radius: 0.4rem; - } - - &-sm { - border-radius: 0.2rem; - } -} - -.btn-outline-light:hover { - background-color: #f1f1f6; - border-color: #f1f1f6; -} - -.youtube-video-wrapper { - display: block; - position: relative; - padding-bottom: 56.25%; - height: 0; - overflow: hidden; - width: 100%; - background: #000; - margin: 3rem 0; - - iframe { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 100; - background: transparent; - } - - img { - object-fit: cover; - display: block; - left: 0; - bottom: 0; - margin: 0 auto; - max-width: 100%; - width: 100%; - position: absolute; - right: 0; - top: 0; - border: none; - height: auto; - cursor: pointer; - -webkit-transition: 0.4s all; - -moz-transition: 0.4s all; - transition: 0.4s all; - } - - &:hover img { - -webkit-filter: brightness(75%); - } - - .play { - height: 72px; - width: 72px; - left: 50%; - top: 50%; - margin-left: -36px; - margin-top: -36px; - position: absolute; - background: url("../images/play.png") no-repeat; - z-index: 1; - cursor: pointer; - } - - .comment { - left: 50%; - top: 50%; - transform: translate(-50%, 50px); - position: absolute; - z-index: 1; - cursor: pointer; - color: white; - } -} - -.ideal-image-slider { - max-width: 60rem; - margin: 2rem 0; -} - -.slider.small { - max-width: 30rem; -} - -.print-only .noprint, -.noprint .print-only { - display: none; -} - -pre { - max-width: 100%; -} - - -@media print { - html, - body { - font-size: 10pt; - min-width: 0 !important; - } - - .noprint { - display: none; - } - - .td-main main { - max-width: 100% !important; - flex: 1 1 0; - } - - .td-content { - max-width: 100%; - // columns: 2; - column-gap: 4rem; - font-size: 1rem; - - p, ul, ol, .alert { - line-height: 1.7em; - font-size: 1em; - } - - > h1, - > h2, - > h3, - > p, - > ul, - > ol, - > .alert, - > .highlight, - > .lead, - > dl dd, - > pre, - .footnotes, - > blockquote { - // column-span: all; - max-width: 100%; - } - - li { - margin-bottom: 0 !important; - } - - h2 { - font-size: 1.6em; - column-span: all; - // page-break-before: always; - } - h3 { - font-size: 1.3em; - } - - .print-figures { - counter-reset: step-figure; - margin: 1rem 0; - display: grid; - grid-template-columns: 1fr 1fr; - gap: 0.5rem; - } - - figure, .card { - // display: block; - position: relative; - // width: calc(50% - 0.25rem - 2px); - vertical-align: top; - margin: 0; - padding: 0 !important; - border: 1px solid black; - border-radius: 2mm; - overflow: hidden; - - break-inside: avoid; - counter-increment: step-figure; - figcaption, .card-body { - position: relative; - margin: 0; - padding: 0.2rem 0.5rem !important; - border-top: inherit; - } - } - - // .card { - // padding: 0 !important; - // border: 1px solid black; - // border-radius: 2mm; - // break-inside: avoid; - // overflow: hidden; - // - // .card-body { - // - // } - // } - - .section-index, - // "Last changed" row - > .text-muted:last-child { - display: none; - } - - // Uncomment this to print without figures and images - // .card, .print-figures, img { - // display: none; - // } - - .alert { - border-width: 2px; - break-inside: avoid; - } - - > table { - margin: 1rem auto; - break-inside: avoid; - - td, thead th { - border: 1px solid black; - padding: 0.25rem 0.75rem; - } - } - } -} - -@media screen { - .print-only { - display: none; - } -} - -#td-cover-block-0 { - background-position: center; -} - -.container { - figure { - img { - max-width: 100%; - } - } -} - -.homepage-container { - font-size: 13pt; -} - -.lead { - font-weight: 500; -} - -.donations { - background: white; - color: #212730; - border: 1px solid #ddd; - border-radius: 4px; - padding: 1rem 2rem; - display: inline-block; - margin: 1rem auto; -} - -.accordion .card-header { - cursor: pointer; - transition: background 0.1s; - - &:hover { - background-color: #fff; - } -} - -.alert.alert-info, -.alert.alert-warning, -.alert.alert-success { - border: 0; - border-radius: 4px; - font-size: 1rem; - - .alert-heading { - font-size: 1.2rem; - } - - @media print { - border-width: 2px; - border-style: solid; - } -} - -.alert.alert-info { - background: #e1f5fe; - border-color: #1e88e5; - - .alert-heading { - color: #1e88e5; - } -} - -.alert.alert-warning { - background: #ffe7e4; - border-color: #ed6a5a; - - .alert-heading { - color: #ed6a5a; - } -} - -.alert.alert-success { - background: #ccefc6; - border-color: #199f67; - - .alert-heading { - color: #199f67; - } -} - - -.alert > ul:last-child, -.alert > p:last-child { - margin-bottom: 0; -} - -.dropdown-item { - padding-left: 1rem; - - &:active, - &.active { - background: none; - font-weight: bold; - } -} - -.td-content, -.content { - blockquote { - padding: 0.5rem 1.5rem; - margin-left: 1rem; - border-left: 4px solid #ddd; - color: #777; - } -} - -.td-sidebar-nav { - padding: 1rem; - font-family: "Open Sans"; - - ul { - list-style: none; - padding: 0; - margin: 0; - - ul ul { - padding-left: 1.5rem; - } - - li { - margin-bottom: 2px; - } - } - - & > ul > li { - margin-bottom: 1rem; - - & > a { - font-weight: 700; - text-transform: uppercase; - } - } - - a { - display: block; - color: inherit; - border-radius: 3px; - padding: 0.25rem 0.75rem; - - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - - &:hover { - color: inherit; - background: #f6f6f6; - } - - &.current-page { - font-weight: 700; - color: $link-color; - } - } -} - -@media (min-width: 768px) { - - .td-page-meta { - top: 4rem; - position: sticky; - } - .td-sidebar-nav { - // max-height: calc(100vh - 64px); - max-height: none; - overflow: initial; - } - - .td-sidebar__inner { - height: auto; - min-height: calc(100vh - 128px); - } - - .td-docs .td-main { - display: flex; - - .td-sidebar { - max-width: 20rem; - min-width: 15rem; - flex: 1 1 0; - margin-right: 2rem; - } - - .td-toc { - order:2; - .td-toc { - top: 4rem; - position: sticky; - border-left: solid; - border-left-width: 1pt; - border-left-color: rgb(222, 226, 230); - max-width: 20rem; - min-width: 12rem; - flex: 1 1 0; - margin-left: 2rem; - padding: 1rem; - line-height: 1.2; - - #TableOfContents a { - color: inherit; - &:hover { - color: #72A1E5; - } - } - - li ul { - margin-bottom: 0.5em; - } - - li li { - margin-left: 1.5em; - font-size: 0.9em; - list-style: inherit; - display: list-item; - } - li ul { - list-style: decimal; - } - } - } - - > main { - flex: 4 4 0; - } - } -} - -.feature-icon { - position: absolute; - left: 50%; - top: 50%; - transform: translate(-50%, -50%); - font-size: 200px; - opacity: 0.06; - pointer-events: none; -} - -.feature-cell { - display: flex; - flex-direction: column; -} - -address { - padding-left: 2rem; - font-size: 1.1em; - line-height: 1.5em; - font-weight: 100; -} - -footer { - background: $primary; - color: white; - font-size: 0.8rem; - min-height: 0; - flex: 0 0 auto; - padding: 1rem 0; -} - -.footer-copyright { - line-height: 1.5em; -} - - -.print-qr-link { - border: 1px solid black; - background: white; - - display: none; - @media print { - display: flex; - } - align-items: center; - overflow: hidden; - padding: 1mm; - padding-left: 4mm; - - img { - width: 3cm; - flex: 0 0 auto; - } - - p { - flex: 1 1 0; - margin: 0; - padding: 0; - font-size: 11pt; - overflow: hidden; - word-wrap: break-word; - } - - a { - color: inherit; - display: block; - text-decoration: inherit; - font-weight: bold; - font-family: $font-family-monospace; - white-space: wrap; - letter-spacing: -0.5pt; - } -} - -@page { - size: A4 portrait; - margin: 0.6in; -} - -.td-default main section.device-types-row { - background: #F8F8F8; - padding: 0; -} - -.device-type-cell { - text-align: center; - padding-block: 4rem; - display: flex; - flex-direction: column; - - .label { - order: -2; - height: 40px; - align-self: center; - display: flex; - justify-content: center; - align-items: center; - padding: 0 1.5rem; - border-radius: 1000px; - margin-bottom: 1rem; - background: #EEE; - text-transform: uppercase; - letter-spacing: 0.7pt; - font-weight: 700; - font-size: 80%; - } - - h4 { - order: -1; - } - - &.light { - background: #FFF; - } - - img { - margin-block: 1rem; - width: 70%; - height: 200px; - object-fit: contain; - align-self: center; - } - - h4 > span { - display: block; - font-size: 120%; - opacity: 0.5; - margin-top: 0.2rem; - } - - &.construction { - .label { - background: #ffd600; - } - img { - opacity: 0.3; - } - } - - &.recommended { - .label { - background: #0029a7; - color: white; - } - } - - ul { - text-align: left; - // align-self: center; - } -} diff --git a/assets/scss/baseline.scss b/assets/scss/baseline.scss new file mode 100644 index 00000000..d18be2b5 --- /dev/null +++ b/assets/scss/baseline.scss @@ -0,0 +1,193 @@ +* { + box-sizing: border-box; +} + +html, body { + line-height: 1.7; + font-family: $font-family-base; + padding: 0; + margin: 0; +} + +.content-grid { + --padding-inline: 1rem; + --content-max-width: 140ch; + + display: grid; + grid-template-columns: + [full-width-start] #{"minmax(var(--padding-inline), 1fr)"} + [content-start] + #{"repeat(12, [col-start] calc(min(100% - (var(--padding-inline) * 2), var(--content-max-width)) / 12 - var(--padding-inline)) [col-end] var(--padding-inline) )"} + [content-end] + #{"minmax(var(--padding-inline), 1fr) [full-width-end]"}; +} + +.content-grid > :not(.full-width), +.full-width > :not(.full-width) { + grid-column: content; +} + +.content-grid > .full-width { + grid-column: full-width; +} + +.content-grid .content-grid { + display: grid; + grid-template-columns: inherit; +} + +a { + text-decoration: none; + + &, &:visited { + color: $link-color; + } + + &:hover { + color: $link-color-light; + } +} + +h1, h2, h3, h4, h5, h6 { + font-weight: 500; + line-height: 1.2em; + + &:first-child { + margin-block-start: 0; + } +} + +h1 { + font-size: 2.3rem; +} + +h2 { + font-size: 1.9rem; +} + +h3 { + font-size: 1.5rem; +} + +h4, h5, h6 { + font-weight: 700; +} +h4 { + font-size: 1.3rem; +} + +h5 { + font-size: 1.15rem; +} + +h6 { + font-size: 1rem; +} + +section { + padding-block: 4rem; + min-width: 0; +} + +figure { + text-align: center; + > a > img { + max-width: 100%; + } +} + +section.arrow { + position: relative; +} + +section.arrow::after { + --width: 3rem; + --height: 2.5rem; + + left: 50%; + margin-left: #{"calc(-1 * var(--width))"}; + bottom: #{"calc(-1 * var(--height))"}; + border-style: solid; + border-width: var(--height) var(--width) 0; + border-color: $primary transparent transparent transparent; + z-index: 3; + position: absolute; + content: ""; +} + +.docs { + .docs-footer { + font-size: $font-size-small; + } +} + +pre { + max-width: 100%; +} + +blockquote { + padding: 0.5rem 1.5rem; + margin-left: 1rem; + border-left: 0.25rem solid #ddd; + color: #777; +} + +table { + border-collapse: collapse; + margin-block: 2rem; +} + +td, th { + padding: 0.25rem 0.5rem; + border: 1px solid $primary-1; + border-width: 1px 0; + vertical-align: top; +} + +th { + text-align: left; + border-width: 2px 0; +} +tr:last-child td { + border-bottom-width: 2px; +} + +.table-wide { + overflow: auto; + + table { + width: 100%; + min-width: 60ch; + } +} + +.breadcrumb { + list-style: none; + display: flex; + flex-wrap: wrap; + padding: 0; + font-size: $font-size-small; + + li { + display: inline-block; + + &.active { + font-weight: 500; + } + + &:not(:last-child)::after { + display: inline-block; + content: '/'; + scale: 1.2; + opacity: 0.5; + margin-inline: 0.5rem; + } + } +} + +address { + padding-left: 2rem; + font-size: 1.1em; + line-height: 1.5em; + font-weight: 100; +} diff --git a/assets/scss/dark.scss b/assets/scss/dark.scss new file mode 100644 index 00000000..f94f30a4 --- /dev/null +++ b/assets/scss/dark.scss @@ -0,0 +1,40 @@ +// Dark mode, as detected by the media query + +:root { + --border-color: rgba(0, 0, 0, 0.1); + --background: #FFFFFF; + --foreground: #101010; + --background-1: #f1f1f6; + --background-2: #e9e9e9; + + --dark-text: #101010; + + --faq-question-color: #c1ebfb; +} + +@media (prefers-color-scheme: dark) { + :root { + --border-color: rgba(255, 255, 255, 0.2); + --background: #101010; + --background-1: #303030; + --background-2: #505050; + --foreground: #FFFFFF; + --faq-question-color: #07445d; + color-scheme: dark; + color: var(--foreground); + background: var(--background); + } + + .alert-info { + background: adjust-color(blue, $alpha: -0.8); + } + + .alert-warning { + background: adjust-color(red, $alpha: -0.8); + } + + .alert-success { + background: adjust-color(green, $alpha: -0.8); + } + +} diff --git a/assets/scss/features.scss b/assets/scss/features.scss new file mode 100644 index 00000000..0a97241e --- /dev/null +++ b/assets/scss/features.scss @@ -0,0 +1,588 @@ +// Big intro text in a page or article + +.lead { + font-weight: 500; + font-size: 1.15rem; +} + +// Donations IBAN box + +.donations { + background: white; + color: #212730; + border: 1px solid #ddd; + border-radius: 0.25rem; + padding: 1rem 2rem; + display: inline-block; + margin: 1rem auto; +} + +// Feature boxes + +.feature-cell { + display: flex; + flex-direction: column; + position: relative; + + @media ($media-mobile) { + & + & { + margin-block-start: 2rem; + } + } + + .button { + margin-top: auto; + align-self: flex-start; + } + + h3 { + margin-block: 0; + } + + > .inline-svg { + position: absolute; + left: 50%; + top: 50%; + translate: -50% -50%; + width: 60%; + height: auto; + opacity: 0.06; + pointer-events: none; + } +} + +// Buttons + +.button { + background: var(--background-1); + box-shadow: $border-color 0 0.25rem; + border: 1px solid $border-color; + + &, &:visited, &:hover { + color: var(--foreground); + } + + &:hover { + background: var(--background); + } + + .primary &, .primary-1 &, .stage & { + background: rgba(255, 255, 255, 0.7); + box-shadow: rgba(0, 0, 0, 0.6) 0 0.25rem; + border: none; + + &, &:visited, &:hover { + color: var(--dark-text); + } + + &:hover { + background: white; + } + } + + text-decoration: none; + padding: 0.4em 1.25em 0.3em; + border-radius: 0.25rem; + font-weight: 500; + + @media (prefers-reduced-motion: no-preference) { + transition: all 0.25s ease-out; + + &:hover { + transform: translateY(-0.15rem); + } + } +} + +.action-buttons { + display: flex; + gap: 1em; + margin-block-start: 2rem; + flex-wrap: wrap; + align-items: center; + justify-content: center; +} + + +// Alerts + +.alert { + border: 0; + border-radius: 0.25rem; + font-size: 1rem; + padding: 1rem; + margin-block: 1rem; + + .alert-heading { + margin: 0; + margin-block-end: 0.5rem; + font-size: 1.15rem; + font-weight: 500; + } + + @media print { + border-width: 2px; + border-style: solid; + } +} + +.alert-info { + background: #e1f5fe; + border-color: #1e88e5; + + .alert-heading { + color: #1e88e5; + } +} + +.alert-warning { + background: #ffe7e4; + border-color: #ed6a5a; + + .alert-heading { + color: #ed6a5a; + } +} + +.alert-success { + background: #ccefc6; + border-color: #199f67; + + .alert-heading { + color: #199f67; + } +} + +.alert > ul:last-child, +.alert > p:last-child { + margin-bottom: 0; +} + +// Image slider + +.ideal-image-slider { + max-width: 60rem; + margin: 2rem 0; +} + +.slider.small { + max-width: 30rem; +} + +// Youtube video embed + +.youtube-video-wrapper { + display: block; + position: relative; + padding-bottom: 56.25%; + height: 0; + overflow: hidden; + width: 100%; + background: #000; + margin: 1rem 0; + + iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 100; + background: transparent; + } + + img { + object-fit: cover; + display: block; + left: 0; + bottom: 0; + margin: 0 auto; + max-width: 100%; + width: 100%; + position: absolute; + right: 0; + top: 0; + border: none; + height: auto; + cursor: pointer; + -webkit-transition: 0.4s all; + -moz-transition: 0.4s all; + transition: 0.4s all; + } + + &:hover img { + -webkit-filter: brightness(75%); + } + + .play { + height: 5rem; + width: 5rem; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + position: absolute; + background: url("../images/play.png") no-repeat; + background-size: 100%; + z-index: 1; + cursor: pointer; + } + + .comment { + left: 50%; + top: 50%; + transform: translate(-50%, 3rem); + position: absolute; + z-index: 1; + cursor: pointer; + color: white; + text-align: center; + text-shadow: 0 0 0.25rem black; + font-weight: 500; + } +} + +// Main stage on home page + +.stage { + position: relative; + overflow: clip; + + &::before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + background: $primary; + z-index: -1; + } + &::after { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + background: url('/featured-background.jpg'); + background-position: center; + background-size: cover; + z-index: -1; + filter: blur(3px); + scale: 1.01; + + @media (prefers-reduced-motion: no-preference) { + animation: stage-scroll-effect linear; + animation-duration: 1ms; + animation-timeline: view(); + animation-range: exit #{"-"}$menu-height; + } + } + + height: 66vh; + position: relative; + margin: 0; + + display: flex !important; + flex-direction: column; + align-items: center; + justify-content: center; + color: white; + gap: 1em; + text-align: center; + padding-inline: 1rem; + + > h2 { + font-size: #{"min(max(1.5rem, 4.5vw), 4rem)"}; + font-weight: 300; + margin: 0; + text-shadow: 0 0 1rem black; + + @media ($media-mobile) { + font-weight: 500; + } + } + + > p { + font-size: #{"min(max(1rem, 1.5vw), 1.5rem)"}; + font-weight: 500; + margin: 0; + text-shadow: 0 0 5px black; + } + + // Special banderole on the stage + .banderole { + display: block; + position: absolute; + left: 0; + top: 0; + z-index: 100; + width: #{"min(50vw, 25ch)"}; + padding: 0; + transform-origin: 33% 33%; + + @media (prefers-reduced-motion: no-preference) { + opacity: 0.8; + transition: all 0.5s; + + &:hover { + scale: 1.1; + opacity: 1; + } + } + + > img { + width: 100%; + margin: 0; + } + } +} + +@keyframes stage-scroll-effect { + from {} + to {opacity: 0; scale: 1.2; translate: 0 20%;} +} + +// Special device variants page + +.device-types-row { + background: #F8F8F8; + padding: 0; +} + +.device-type-cell { + text-align: center; + padding-block: 4rem; + display: flex; + flex-direction: column; + + .label { + order: -2; + height: 2rem; + align-self: center; + display: flex; + justify-content: center; + align-items: center; + padding: 0 1.5rem; + border-radius: 1000px; + margin-bottom: 1rem; + background: #EEE; + text-transform: uppercase; + letter-spacing: 0.7pt; + font-weight: 700; + font-size: 80%; + } + + h4 { + order: -1; + } + + &.light { + background: #FFF; + } + + img { + margin-block: 1rem; + width: 70%; + height: 8rem; + object-fit: contain; + align-self: center; + } + + h4 > span { + display: block; + font-size: 120%; + opacity: 0.5; + margin-top: 0.2rem; + } + + &.construction { + .label { + background: #ffd600; + } + img { + opacity: 0.3; + } + } + + &.recommended { + .label { + background: #0029a7; + color: white; + } + } + + ul { + text-align: left; + // align-self: center; + } + + .button { + margin-top: auto; + align-self: center; + } +} + +// Resistors + +.resistor { + font-size: $font-size-small; + text-align: center; + svg { + display: block; + margin: 0 auto 0.5rem; + } +} + +// Buttons on bottom of blog entry to move around + +.blog-pager { + margin-block-start: 4rem; + font-size: 0.8rem; + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; +} + +// Blog entry list + +ul.blog-posts, +ul.section-index { + list-style: none; + padding: 0; + + display: grid; + grid-template-columns: 1fr; + gap: 2rem; + + > li { + border: 1px solid $border-color; + border-radius: 0.25rem; + padding: 1rem; + min-width: 0; + overflow: hidden; + + h5 { + font-size: 1.2rem; + font-weight: bold; + margin-block-start: 0; + margin-block-end: 0; + } + } +} + +time { + font-weight: 700; +} + +@media ($media-desktop) { + ul.blog-posts, + ul.section-index { + grid-template-columns: 1fr 1fr; + } + +} + +ul.blog-posts > li > h5 > a { + color: inherit; +} + +.blog-post { + time + h1 { + margin-top: 0; + } +} + +// Icons + +.inline-svg { + display: inline-block; + height: 1rem; + aspect-ratio: 1; + translate: 0 15%; + + svg { + margin: 0; + padding: 0; + width: 100%; + height: 100%; + } +} + +// FAQ + +// @media ($media-desktop) { +// .faq-list { +// display: grid; +// gap: 4rem; +// grid-template-columns: 1fr 1fr; +// } +// } + +.faq-entry { + --size: 1rem; // triangle + + margin-block: 1rem; + + &.single { + margin-block: 4rem; + } + + .question { + background: var(--faq-question-color); + padding: 1rem 2rem; + border-radius: 1rem 1rem 1rem 0; + margin: 0; + margin-left: var(--size); + margin-right: #{"min(10%, 5rem)"}; + margin-block-end: 0.5rem; + font-size: inherit; + font-weight: 500; + color: inherit; + position: relative; + + a { + color: inherit; + } + + &::after { + position: absolute; + content: ""; + left: 0; + bottom: 0; + transform: translate(-100%, 0); + border-style: solid; + border-width: var(--size) var(--size) 0; + border-color: transparent var(--faq-question-color) transparent transparent; + z-index: 3; + } + } + + .response { + p, ul { + background: var(--background-1); + padding: 1rem 2rem; + border-radius: 1rem 1rem 0 1rem; + margin-left: #{"min(10%, 5rem)"}; + margin-right: var(--size); + margin-block: 0.25rem; + position: relative; + + &::after { + position: absolute; + content: ""; + right: 0; + bottom: 0; + transform: translate(100%, 0); + border-style: solid; + border-width: 0 var(--size) var(--size) 0; + border-color: transparent transparent var(--background-1) transparent; + z-index: 3; + } + } + ul { + padding-left: 4rem; + } + } +} diff --git a/assets/scss/layout.scss b/assets/scss/layout.scss new file mode 100644 index 00000000..6ddae528 --- /dev/null +++ b/assets/scss/layout.scss @@ -0,0 +1,382 @@ + +#header { + background: $primary; + color: white; + display: flex; + align-items: center; + height: $menu-height; + padding: 0 1rem; + position: sticky; + top: 0; + z-index: 10000; + + .site-title { + color: inherit; + white-space: nowrap; + text-decoration: none; + font-weight: 500; + font-size: 1.3rem; + // text-transform: uppercase; + } + + .site-icon { + margin-right: 1rem; + display: block; + padding: 0; + + svg { + width: 3rem; + height: 3rem; + margin: 0; + display: block; + align-self: center; + } + } + + nav.menu { + margin-inline-start: auto; + display: flex; + align-self: stretch; + align-items: stretch; + + > ul { + list-style: none; + display: flex; + align-items: stretch; + padding: 0; + margin: 0; + + > li { + position: relative; + display: flex; + align-items: stretch; + + > a, span { + font-weight: 500; + align-self: stretch; + display: flex; + align-items: center; + padding: 0 1rem; + text-decoration: none; + color: inherit; + font-weight: 500; + font-size: 1.15rem; + cursor: pointer; + } + + > ul { + display: none; + position: absolute; + right: 0; + top: 100%; + background: $primary-1; + margin: 0; + padding: 0.5rem 0; + + > li { + display: block; + white-space: nowrap; + + > a, > span { + color: inherit; + display: block; + text-decoration: none; + padding: 0.25rem 2rem 0.25rem 1rem; + + &:hover, &:focus-within { + background: $primary-2; + } + } + } + } + + &:focus-within, &:hover { + > ul { + display: block; + } + + > a, span { + background: $primary-1; + } + } + } + } + } +} + +nav.sidebar { + padding: 1rem; + font-family: "Open Sans"; + + ul { + list-style: none; + padding: 0; + margin: 0; + + ul ul { + padding-left: 1.5rem; + } + + li { + margin-bottom: 2px; + } + } + + & > ul > li { + margin-bottom: 1rem; + + & > a { + font-weight: 700; + text-transform: uppercase; + } + } + + a { + display: block; + color: inherit; + border-radius: 0.25rem; + padding: 0.25rem 0.75rem; + + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-decoration: none; + + &:hover { + color: inherit; + background: var(--background-1); // #f6f6f6; + } + + &.current-page { + font-weight: 700; + color: $link-color; + } + } +} + +aside.toc { + padding: 1rem; + + h6 { + margin: 0; + font-weight: 700; + text-transform: uppercase; + padding: 0.25rem 0.75rem; + line-height: inherit; + } + + ul { + padding-left: 3ch; + // margin: 0; + list-style: decimal; + } + + ul ul { + padding-left: 0; + list-style: decimal; + margin-bottom: 0.5em; + } + + li li { + margin-left: 1.5em; + font-size: 0.9em; + list-style: inherit; + display: list-item; + } +} + +@media screen { + footer { + background: $primary; + color: white; + font-size: $font-size-small; + min-height: 0; + flex: 0 0 auto; + padding: 1rem 0; + } +} + +footer { + ul { + list-style: none; + padding: 0; + margin: 0; + margin-top: auto; + } + + a { + &, &:visited, &:hover { + color: inherit; + } + &:hover { + text-decoration: underline; + } + } +} + +@media ($media-mobile) { + #header { + position: relative; + min-width: 0; + + > nav.menu > ul { + flex-wrap: wrap-reverse; + > li { + position: initial; + + > a, > span { + font-size: $font-size-small; + white-space: nowrap; + } + + > ul { + position: absolute; + top: 100%; + left: 0; + right: 0; + bottom: initial; + } + } + } + } + + .site-title { + display: none; + } + + #header nav.menu > ul > li:first-child { + display: none; + } + + .docs { + aside.toc, + aside.sidebar { + overflow: auto; + position: absolute; + width: 100%; + background: var(--background); + display: none; + z-index: 1; + + height: #{"calc(100vh - "} $menu-height #{" - "} $submenu-height #{")"}; + box-shadow: 0 1rem 1rem -0.5rem rgba(0, 0, 0, 0.1); + border-bottom: 1px solid $border-color; + } + + > main { + padding: 1rem; + min-width: 0; + } + } + + ul.blog-posts { + grid-template-columns: 1fr; + } +} + +@media ($media-desktop) { + .content-grid > section.narrow { + grid-column: col-start 3 / col-end 10; + } + + .docs { + display: grid; + grid-column: full-width; + grid-template-columns: 20rem 1fr 20rem; + grid-template-areas: "left center right"; + gap: 2rem; + position: relative; + + aside.sidebar { + grid-area: left; + } + + aside.toc { + grid-area: right; + } + + > main { + max-width: 100ch; + min-width: 0x; + padding-bottom: 4rem; + } + } + + + .columns-2 { + > :nth-child(2n + 1) { grid-column: col-start 1 / col-end 6; } + > :nth-child(2n + 2) { grid-column: col-start 7 / col-end 12; } + } + + .columns-3 { + > :nth-child(3n + 1) { grid-column: col-start 1 / col-end 4; } + > :nth-child(3n + 2) { grid-column: col-start 5 / col-end 8; } + > :nth-child(3n + 3) { grid-column: col-start 9 / col-end 12; } + } +} + +section.primary { + background: $primary; + color: white; +} + +section.primary-1 { + background: $primary-1; + color: white; +} + +// Sidebar and TOC on mobile + +input[name='mobile-menu'] { + display: none; +} + +.mobile-menu-toggles-row { + display: none; +} + +@media ($media-mobile) { + .mobile-menu-toggles-row { + background: var(--background-1); + + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + padding: 0 1rem; + height: $submenu-height; + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + + .inline-svg { height: 1rem; } + label { + flex: 1 1 auto; + white-space: nowrap; + overflow: hidden; + flex-shrink: 1; + text-overflow: ellipsis; + &[class^="toc-"] { + direction: rtl; + text-align: right; + + .docs:not(:has(aside.toc)) & { + display: none; + } + } + } + + .sidebar-show { display: none; } + .toc-show { display: none; } + } + + #mobile-menu-sidebar:checked ~ { + .mobile-menu-toggles-row .sidebar-show { display: block; } + .mobile-menu-toggles-row .sidebar-hide { display: none; } + aside.sidebar { display: block; } + } + + #mobile-menu-toc:checked ~ { + .mobile-menu-toggles-row .toc-show { display: block; } + .mobile-menu-toggles-row .toc-hide { display: none; } + aside.toc { display: block; } + } +} diff --git a/assets/scss/main.scss b/assets/scss/main.scss new file mode 100644 index 00000000..86505917 --- /dev/null +++ b/assets/scss/main.scss @@ -0,0 +1,7 @@ +@import "variables.scss"; +@import "baseline.scss"; +@import "layout.scss"; +@import "features.scss"; +@import "dark.scss"; +@import "print.scss"; +@import "slider.scss"; diff --git a/assets/scss/print.scss b/assets/scss/print.scss new file mode 100644 index 00000000..9d229de5 --- /dev/null +++ b/assets/scss/print.scss @@ -0,0 +1,153 @@ +@page { + size: A4 portrait; + margin: 0.6in; +} + +@media screen { + .print-only { + display: none; + } +} + +.print-only .noprint, +.noprint .print-only { + display: none; +} + + +@media print { + html, + body { + font-size: 9pt; + line-height: 1.4; + min-width: 0 !important; + } + + h1, h2 { + break-after: avoid; + } + + .noprint, + .mobile-sidebar-toggle-label, + .blog-pager, + .breadcrumb, + .section-index, + .docs-footer { + display: none !important; + } + + .docs { + display: block; + > aside { display: none; } + > main { max-width: none; } + } + + #header { + display: none !important; + } + + .content-grid { + display: block; + } + + .docs > main { + .print-figures { + counter-reset: step-figure; + margin: 1rem 0; + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 3mm; + align-items: flex-start; + } + + figure { + position: relative; + vertical-align: top; + margin: 0; + padding: 0 !important; + break-inside: avoid; + counter-increment: step-figure; + text-align: left; + + img { + width: 100%; + padding: 0; + margin: 0; + display: block; + aspect-ratio: 4/3; + object-fit: cover; + } + + figcaption { + position: relative; + margin: 0; + padding: 0.2rem 0.5rem !important; + border-top: inherit; + } + } + + // top-level imgproc, without slider + > figure { + max-width: 50%; + margin-inline: auto; + } + + + .alert { + border-width: 2px; + break-inside: avoid; + padding: 2mm; + background: none; + } + + table { + margin: 1rem auto; + break-inside: avoid; + + td, thead th { + border: 1px solid black; + padding: 0.25rem 0.75rem; + } + } + } +} + +.print-qr-link { + border: 1px solid black; + background: white; + display: none; + width: fit-content; + @media print { + display: flex; + } + align-items: center; + overflow: hidden; + padding: 1mm; + padding-left: 4mm; + margin-block: 1rem; + margin-inline: auto; + + img { + width: 3cm; + flex: 0 0 auto; + } + + p { + flex: 0 1 auto; + margin: 0; + padding: 0; + font-size: 11pt; + overflow: hidden; + word-wrap: break-word; + } + + a { + color: inherit; + display: block; + text-decoration: inherit; + font-weight: bold; + font-family: $font-family-monospace; + white-space: wrap; + letter-spacing: -0.5pt; + } +} diff --git a/assets/scss/rtl/_main.scss b/assets/scss/rtl/_main.scss deleted file mode 100644 index 4391c470..00000000 --- a/assets/scss/rtl/_main.scss +++ /dev/null @@ -1 +0,0 @@ -// Empty file to disable docsy's RTL styles which pull in a lot of remote resources. diff --git a/assets/scss/slider.scss b/assets/scss/slider.scss new file mode 100644 index 00000000..76e92836 --- /dev/null +++ b/assets/scss/slider.scss @@ -0,0 +1,62 @@ +html body { + .ideal-image-slider { + border-radius: 0.5rem; + } + + .iis-slide { + border-radius: 0.5rem; + } + + .iis-bullet-nav { + top: 1rem; + right: 1rem; + z-index: 15; + opacity: 1; + width: auto; + height: auto; + bottom: auto; + transition: all 0.1s; + } + + .iis-bullet-nav a { + display: inline-block; + width: 1.2rem; + height: 1.2rem; + border: none; + text-indent: 9999px; + margin-left: 0.5rem; + border-radius: 1000px; + cursor: pointer; + transition: all 0.1s; + background: var(--foreground); + } + + .iis-bullet-nav a:hover, + .iis-bullet-nav a.iis-bullet-active { + background: var(--background); + } + + .iis-bullet-nav a.iis-bullet-active { + transform: scale(1.4); + } + + .iis-caption { + left: 0; + bottom: 0; + right: 0; + margin: 0.25rem; + border-radius: 0.35rem; + font: inherit; + background: var(--background); + color: var(--foreground); + padding: 0.25rem 0.75rem; + } + .iis-has-bullet-nav .iis-caption { + max-width: none; + } + .iis-caption .iis-caption-content { + font-size: inherit; + line-height: inherit; + color: inherit; + } +} diff --git a/assets/scss/_variables_project.scss b/assets/scss/variables.scss similarity index 65% rename from assets/scss/_variables_project.scss rename to assets/scss/variables.scss index ff9ee783..e7e49392 100644 --- a/assets/scss/_variables_project.scss +++ b/assets/scss/variables.scss @@ -1,28 +1,30 @@ -/* +$gray-dark: #222222; +$border-color: var(--border-color); -Add styles or override variables from the theme here. +// $hue: 275deg; // lila +$hue: 197deg; // türkis +// $hue: 180deg; // blaugrün +// $hue: 0deg; // rot +// $hue: 320deg; // pink -*/ +$primary: hsl($hue, 56%, 37%); +$primary-1: hsl($hue, 65%, 50%); +$primary-2: hsl($hue, 65%, 63%); +$link-color: hsl($hue, 90%, 45%); +$link-color-light: hsl($hue, 100%, 60%); +$font-family-sans-serif: "Open Sans", Roboto, sans-serif; +$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default; +$font-family-base: $font-family-sans-serif !default; -$primary: #212730; -$primary-light: #3e4a5d; -$secondary: #f1f1f6; +$font-size-small: 0.85rem; +$font-size-base: 1rem; +$menu-height: 3.75rem; +$submenu-height: 2.5rem; -// $td-sidebar-bg-color: #e9f1ff; -// $td-sidebar-border-color: #d4e4ff; -$td-sidebar-bg-color: #FFFFFF; -$td-sidebar-border-color: #d4e4ff; - -$link-color: #3489DD; - -$td-enable-google-fonts: false; - -$font-family-sans-serif: "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - -// $font-size-base: 1.2rem; - -$enable-rounded: false; +$desktop-size: 1280px; +$media-mobile: screen and (max-width: ($desktop-size - 1px)); +$media-desktop: screen and (min-width: $desktop-size); // Source: https://google-webfonts-helper.herokuapp.com/fonts/open-sans?subsets=latin diff --git a/config.toml b/config.toml index 2432e58e..102ae861 100644 --- a/config.toml +++ b/config.toml @@ -1,14 +1,7 @@ baseURL = "/" title = "Goldydocs" - enableRobotsTXT = true - -# Hugo allows theme composition (and inheritance). The precedence is from left to right. -theme = ["github.com/google/docsy"] - timeout = 500000 # uh oh - -# Will give values to .Lastmod etc. enableGitInfo = true # Language settings @@ -143,8 +136,6 @@ github_branch = "main" [params.ui] # Enable to show the side bar menu in its compact state. sidebar_menu_compact = false -# Set to true to disable breadcrumb navigation. -breadcrumb_disable = false # Set to true to hide the sidebar search box (the top nav search box will still be displayed if search is enabled) sidebar_search_disable = false # Set to false if you don't want to display a logo (/assets/icons/logo.svg) in the top nav bar diff --git a/content/_index.de.html b/content/_index.de.html index ccc09302..4c1652b9 100644 --- a/content/_index.de.html +++ b/content/_index.de.html @@ -10,176 +10,97 @@ byline: "Erstellt August 2020" --- -{{< blocks/cover title="OpenBikeSensor" image_anchor="top" height="400" >}}
mastodon
-
- -

Überholabstandsmessung für Radfahrende

-

Open Innovation, Open Source, Open Data, Open Science

-
- - Forum - - - - Matrix logo Matrix - - - - GitHub - - - }}"> - Dokumentation - - - - Unterstützen - - - - Mastodon - -
-
-{{< /blocks/cover >}} - -{{% blocks/section color="primary" %}} - -
-
-{{% blocks/feature icon="fab fa-discourse" title="Fragen und Diskutieren" url="https://forum.openbikesensor.org" url_text="Zum Forum" %}} -Komm in unser Discourse-Forum, und diskutiere mit den anderen Interessierten -und Aktiven. Hier findet fast alles einen Platz: Unterstützung bei Problemen, -Lokalgruppen, Forschungs­projekte, Events, Entwicklungsthemen, und vieles mehr. -{{% /blocks/feature %}} - -{{% blocks/feature icon="fas fa-biking" title="Bauen & Daten sammeln" url="/bauanleitung" url_text="Zur Bauanleitung" %}} -Bau Dir Deinen eigenen Überholabstandsmesser. Wir unterstützen Dich dabei. Am -besten schließt Du Dich einer der Sammelbestellungen und einem unserer -Regio-Teams an. -{{% /blocks/feature %}} - -{{% blocks/feature icon="fab fa-github" title="Weiterentwickeln" url="https://github.com/openbikesensor" url_text="Zu den GitHub-Repositories" %}} -Was wir erstellen ist quelloffen, auf GitHub veröffentlichen wir den kompletten -Code. Hier findest Du auch alle Pläne und Anleitungen sowie die Software zur -Visualisierung der gesammelten Daten. -{{% /blocks/feature %}} -
-
- -{{% /blocks/section %}} - - - -{{% blocks/section color="#fff" %}} -
- -

OpenBikeSensor – OpenCitizenScience

- -Wir sind eine Gruppe von aktiven Alltagsradler:innen und möchten Radfahren sicherer und populärer machen. Überall! - -Wie oft passiert es uns, dass uns ein Auto beinahe vom Sattel holt? Was wir alle kennen, überprüfen wir nun wissenschaftlich. Dazu haben wir einen Sensor entwickelt, der den Abstand misst und Überholmanöver Geodaten zuordnet. Wo ist es sicher? Wo nicht? Welche Uhrzeit? Welche Strecken? Der Sensor soll helfen, das zu erkennen und zu belegen. - +
+ + +

Der OpenBikeSensor ist ein offenes System für die

+

Überholabstands­messung am Fahrrad

+ + +
+ +
+

Bürger:innenforschung für Verkehrssicherheit

+ +

Wir sind aktive Alltagsradler:innen, die Radfahren überall +sicherer und populärer machen möchten. Dazu forschen wir zu Überholabständen.

+ +

Eine der bedrohlichsten Situationen für Radfahrende im Straßenverkehr ist das +enge Überholen durch Kraftfahrzeuge. Seit 2020 gibt es zwar den gesetzlich +vorgeschriebenen Mindestabstand von 1,5 m (außerorts 2 m) beim +Überholen von Fahrrädern, doch oft wird dieser nicht eingehalten.

+ +

Grund dafür sind nicht überwiegend einzelnes Fehlverhalten der +Autofahrenden, obwohl es nach wie vor an Bewusstsein für und auch Bekanntheit +der neuen Regeln mangelt. Viel öfter sind die Platzverhältnisse und +Vekehrsführung Auslöser für Regelverstöße, sodass hier vonseiten der +Kommunen und Länder nachgebessert werden muss.

+ +

Für eine gelungene Verkehrswende brauchen wir dringend Fahrradinfrastruktur, +die sich sicher anfühlt, und auch nachweislich sicherer ist. Darum haben wir es +uns zum Auftrag gemacht, Infrastruktur, die enges Überholen ermöglicht oder +begünstigt zu identifizieren und zu überprüfen. Dazu haben wir einen Sensor und +ein Portal entwickelt, mit denen wir Überholabstände messen und die Daten +einsammeln und auf einer Karte darstellen. Nur durch Messung können wir +die Überholabstände wissenschaftlich untersuchbar machen.

+ +

Überall in }}">Deutschland und darüber +hinaus gibt es Wissenschaftler, Initiativen und Gruppen, die OpenBikeSensoren bauen +und betreiben und mit den entstandenen Daten forschen. Mit ihren Ergebnissen +können sie auf Politik und Verwaltung zugehen und Verbesserungen erwirken. +Im Kleinen für konkrete lokale Infrastrukturen, im Großen durch Forschungsergebnisse +für die Verkehrsplanung der Zukunft. +

+
+ +
{{< yt id=Ym3BeUaSrWo thumbnail="/thumbnails/Ym3BeUaSrWo.jpg" >}} - -
-{{% /blocks/section %}} - -{{% blocks/section color="secondary" %}} -
-{{% md %}} - -## Teil der Lösung - -Unser Ziel ist, Schwachstellen und Verbesserungspotenzial in der Verkehrsinfrastruktur aufzuzeigen und diese in Kooperation mit Stadtplaner:innen zu beheben. Zudem wollen wir die gesellschaftliche Wirkung von Kampagnen wie beispielsweise #AnderthalbMeter (in Städten) messen. Um statistisch verlässliche Open Data zu erhalten, ist es wichtig, dass möglichst viele Alltagsradler:innen mit unseren Sensoren offene Daten erfassen. Mit den von allen gesammelten Daten wiederum lassen sich individuelle Auswertungen vornehmen; von Initiativen, Kommunen und von Euch (Open Citizen Science). - -Zentrales Hilfsmittel und Namensgeber des OpenBikeSensors ist unser Überholabstandsmesser, ein kleines technisches Gerät am Fahrrad. Während der Fahrt misst es den Abstand nach links und rechts (minus Lenkerbreite) und zeichnet die Fahrt via GPS auf. Überholmanöver kann die:der Radler:in per Taste am Lenker bestätigen. Nicht aufgezeichnet werden Fahrzeug- oder Personendaten der Überholenden. Uns geht es hauptsächlich um die Seitenabstände zu anderen Verkehrsteilnehmer:innen. - -Wir wünschen uns, dass unser Sensor von vielen genutzt und weiterentwickelt wird. Die }}">Anleitung zum Selberbauen und Montieren ist für alle als Open Source verfügbar – hier auf unserer Website und quelloffen via GitHub. Wir entwickeln für die offenen Daten zudem }}">Visualisierungskonzepte (inklusive Visualisierungssoftware) und werten die Ergebnisse gemeinsam mit Forschungspartner:innen aus. - -Uns geht es jedoch nicht nur um die Technik. Ergänzend entwickeln wir gemeinsam mit zivilgesellschaftlichen Organisationen und Kommunen regionale Aktionen, Kampagnen und Verkehrskonzepte. Wir gestalten Gesellschaft und leisten so einen Beitrag für mehr Lebensqualität in den Städten und auf dem Land. - - -Es wäre toll, wenn schon bald viele mitmachen, und wir so zusammen Bewegung in die Sache bringen. - -Klingt interessant? }}">Hier kannst Du Teil der Community werden. -{{% /md %}} - - -
-{{% /blocks/section %}} - - - -{{% blocks/section color="#000" %}} -
- -

Visualisierung

-{{% md %}} -Ein wichtiger Bestandteil des Projektes ist die Auswertbarkeit der gesammelten Daten. Daher arbeiten wir fleißig daran, die in den jeweiligen "Tracks" gespeicherten Werte zu extrahieren und visuell aufzubereiten. - -Hier zeigen wir nur ein Beispiel einer Auswertung von einigen Überholvorgängen in Stuttgart. Es handelt sich dabei um einen erfahrenen Radfahrer, der routiniert und selbstbewusst im Straßenverkehr unterwegs ist. Natürlich wurde auch er sehr oft mit weniger als 1,5 m Abstand überholt. Der Überholabstandsmesser erfasste sogar Messwerte unter 50 cm. - -{{< imgproc visualisierung Resize "800x" />}} - -Ein anderes Beispiel zeigt einen einzelnen Überholvorgang, von dem auch eine Videoaufzeichnung vorhanden war. Wir blenden dazu einige GPS-Informationen ein, sowie den gemessenen Seitenabstand im jeweiligen Moment des Videos. Die Gefahrensituation für den:die Radfahrer:in wird dadurch nachempfindbar. - {{< yt id=izUD16ffs_Q thumbnail="/thumbnails/izUD16ffs_Q.jpg" >}} - -Wer noch Ideen zur Visualisierung, Automatisierung, Programmierung, Auswertung, etc. hat oder einfach am Projekt interessiert ist und mitgestalten will, ist herzlich }}">in die Community eingeladen. - -{{% /md %}}
-{{% /blocks/section %}} - - - -{{% blocks/section color="primary" %}} -
-

Sei treibende Kraft

- -{{% md %}} - -Es gibt viele Arten, wie Du das OpenCitizenScience-Projekt OpenBikeSensor unterstützen kannst, auch wenn Du nicht selbst aktiv werden möchtest. - -### Weitersagen heißt Unterstützen - -Erzähle Freund:innen, Verwandten, Kolleg:innen und Geschäftspartner:innen von uns. - -Folge uns via Twitter @OpenBikeSensor und werde Teil unserer Twitterei. - -### Spenden – jeder Beitrag zählt - -Die Arbeit rund um den OpenBikeSensor ist sehr zeitaufwändig und kostspielig. -Der [OpenBikeSensor e. V.]({{< relref "verein" >}}) nimmt gern Spenden -entgegen, die in die Arbeit der Community fließen und künftige Projekte -unterstützen. - -Bis 200 € reicht der Kontoauszug, um Spenden steuerlich absetzen zu können. -Dafür unbedingt den Verwendungszweck so ausfüllen - -
-IBAN: DE40 4306 0967 1294 8595 00 (GLS)
-Kontoinhaber: OpenBikeSensor e. V.
-Verwendungszweck: Spende OpenBikeSensor
-
- -Hier ein paar Beispiele, was wir mit Euren Spenden alles erreichen können: - -- Wir kaufen mit Mengenrabatt und reduzierten Versandkosten neue Hardware und Bauteile ein. Diese bringen wir Euch dann zu Workshops mit, welche wir veranstalten. -- Wir stellen Bausätze zusammen, damit Interessierte keine 6-8 Wochen auf Teile aus China warten müssen, sondern zügig loslegen können. -- Wir bauen Geräte, die wir für Aktionszeiträume an Engagierte ausleihen. Die Koordination übernehmen unsere Regio-Teams. -- Unsere Entwickler:innen können Hardware für Verbesserungen und Erweiterungen bestellen, ohne das Geld selbst vorschießen zu müssen. -- Wir finanzieren die IT-Infrastruktur für Ko-Kreation und Kollaboration unseres Netzwerks. - -Die Ausgaben des Vereins werden transparent gegenüber der Community kommuniziert und mit allen abgestimmt. Mehr dazu findest Du -auf den Unterseiten [des Vereins]({{< relref "verein" >}}). - -{{% /md %}} -
-{{% /blocks/section %}} +
+

Sei auch du dabei!

+ +

Deine Hilfe wird gebraucht. Egal, ob du an der Weiterentwicklung der Technik oder an der Verbreitung in deiner Stadt oder Kommune +arbeiten möchtest, mit vielen Freiwilligen kommen wir voran! Hier sind einige Vorschläge, wie du dich einbringen kannst:

+
+ +
+ {{% blocks/feature icon="discourse" title="Fragen und Diskutieren" url="/community" url_text="Zur Community" %}} + Komm in unsere Community und vernetze dich mit Gleichgesinnten. Hier + findest du Radler:innen, Techniker:innen, Forschende und Menschen, die in + Lokalpolitik aktiv sind oder sein wollen. So bringen sich alle im Projekt ein. + {{% /blocks/feature %}} + + {{% blocks/feature icon="person-biking" title="Bauen & Daten sammeln" url="/bauanleitung" url_text="Zur Bauanleitung" %}} + Bau Dir Deinen eigenen OpenBikeSensor. Wir unterstützen Dich dabei. Am + besten schließt Du Dich einer der Sammelbestellungen und einem unserer + Regio-Teams an. + {{% /blocks/feature %}} + + {{% blocks/feature icon="github" title="Weiterentwickeln" url="https://github.com/openbikesensor" url_text="Zu den GitHub-Repositories" %}} + Was wir erstellen ist quelloffen, auf GitHub veröffentlichen wir den kompletten + Code. Hier findest Du auch alle Pläne und Anleitungen sowie die Software zur + Visualisierung der gesammelten Daten. + {{% /blocks/feature %}} +
diff --git a/content/blog/2024-02-01-nachruf-natenom/index.de.md b/content/blog/2024-02-01-nachruf-natenom/index.de.md index d2d6e930..8ff9a345 100644 --- a/content/blog/2024-02-01-nachruf-natenom/index.de.md +++ b/content/blog/2024-02-01-nachruf-natenom/index.de.md @@ -4,6 +4,7 @@ date: '2024-02-01' linkTitle: Nachruf Natenom description: > Wir trauern um Natenom, den engagierten Fahrradaktivisten aus Pforzheim +resources: --- diff --git a/content/community/_index.de.md b/content/community/_index.de.md index eb2f3542..8d584090 100644 --- a/content/community/_index.de.md +++ b/content/community/_index.de.md @@ -10,10 +10,7 @@ aliases: - /project --- -
-
-
- +
# Werde Teil der OpenBikeSensor-Community @@ -21,40 +18,33 @@ Der OpenBikeSensor ist ein offenes Projekt an dem alle teilnehmen können. Hilf mit, den Sensor weiterzuentwickeln, auszuprobieren, Daten zu sammeln und auszuwerten. So kannst du mitmachen: - -
-
-{{% blocks/section color="dark" %}} -
-
+
-{{% blocks/feature icon="fab fa-discourse" title="Fragen und Diskutieren" url="https://forum.openbikesensor.org" url_text="Zum Forum" %}} +{{% blocks/feature icon="discourse" title="Fragen und Diskutieren" url="https://forum.openbikesensor.org" url_text="Zum Forum" %}} Komm in unser Discourse-Forum, und diskutiere mit den anderen Interessierten und Aktiven. Hier findet fast alles einen Platz: Unterstützung bei Problemen, Lokalgruppen, Forschungs­projekte, Events, Entwicklungsthemen, und vieles mehr. {{% /blocks/feature %}} -{{% blocks/feature icon="fab fa-github" title="Weiterentwickeln" url="https://github.com/openbikesensor" url_text="Zu den GitHub-Repositories" %}} +{{% blocks/feature icon="github" title="Weiterentwickeln" url="https://github.com/openbikesensor" url_text="Zu den GitHub-Repositories" %}} Was wir erstellen ist quelloffen, auf GitHub veröffentlichen wir den kompletten Code. Hier findest Du auch alle Pläne und Anleitungen sowie die Software zur Visualisierung der gesammelten Daten. {{% /blocks/feature %}} -{{% blocks/feature icon="fa fa-video" title="Austauschen" url="#treffen" url_text="So nimmst du teil" %}} +{{% blocks/feature icon="video" title="Austauschen" url="#treffen" url_text="So nimmst du teil" %}} Fast wöchentlich tauschen wir uns zu aktuellen Themen und zum Fortschritt der Entwicklung aus. Neulinge und Interessierte sind hier herzlich willkommen, so können wir einander gut kennen lernen und gemeinsam das Projekt voranbringen. {{% /blocks/feature %}} -
-
-{{% /blocks/section %}} + -
-
-
+
+ +
### Offene Treffen per Videochat {#treffen} @@ -70,7 +60,7 @@ Auch wenn sich das aufgrund der Sicherheitsmaßnahmen nicht so anfühlt -- du bist herzlich zu diesen Treffen eingeladen, Neulinge sind immer willkommen!
-
+
### Das Forum @@ -79,7 +69,7 @@ Für langlebige Kommunikation verwenden wir in der Community noch gut zu finden, und Besucher können auch ohne Anmeldung mitlesen. ### Matrix -Echtzeitkommunikation findet [in unserem Matrix-Space](https://matrix.to/#/#openbikesensor:matrix.org) statt - Das ist ein föderiertes Netzwerk, +Echtzeitkommunikation findet [in unserem Matrix-Space](https://matrix.to/#/#openbikesensor:matrix.org) statt - Das ist ein föderiertes Netzwerk, das sehr nutzerfreundliche Chatclients bietet - wenn du Slack und Konsorten bedienen kannst, kannst auch einen Matrix Client bedienen. @@ -88,5 +78,4 @@ blättern willst, kannst du uns im Forum ansprechen - noch kann man dort 'rein schauen.
-
-
+ diff --git a/content/device.de.md b/content/device.de.md index 1d152508..e721a563 100644 --- a/content/device.de.md +++ b/content/device.de.md @@ -6,10 +6,7 @@ menu: parent: device --- -
-
- -
+
# Das Messgerät @@ -18,34 +15,30 @@ aufzeichnet. Dieses Gerät haben wir als quelloffenes Design entwickelt, sodass du, wenn du magst, dir selbst eines bauen kannst und darfst! Hier siehst du alle Varianten. -
-
-
-
-
+
-{{% device-type-cell - variant="Lite" - image_file="images/obs-lite.svg" - class="construction" - label="In Entwicklung" - link_text="Entwicklung verfolgen" +{{% device-type-cell + variant="Lite" + image_file="images/obs-lite.svg" + class="construction" + label="In Entwicklung" + link_text="Entwicklung verfolgen" link="#" %}} - klein und leicht - minimaler Bauaufwand -- wird mit Android-Handy und App kombiniert +- wird mit Android-Handy und App kombiniert - sehr kostengünstig - wetterfest {{% /device-type-cell %}} -{{% device-type-cell - variant="Classic" - image_file="images/obs-classic.svg" - class="light recommended" - label="Jetzt verfügbar" - link_text="Zur Bauanleitung" +{{% device-type-cell + variant="Classic" + image_file="images/obs-classic.svg" + class="light recommended" + label="Jetzt verfügbar" + link_text="Zur Bauanleitung" link="/bauanleitung" %}} - robust und erprobt - voller Funktionsumfang ohne Handy @@ -54,19 +47,17 @@ Varianten. - erweiterbar {{% /device-type-cell %}} -{{% device-type-cell - variant="Pro" +{{% device-type-cell + variant="Pro" image_file="images/obs-pro.svg" - class="construction" - label="In Entwicklung" - link_text="Entwicklung verfolgen" + class="construction" + label="In Entwicklung" + link_text="Entwicklung verfolgen" link="https://forum.openbikesensor.org/t/automatisiert-bestueckbare-hardware/1263" %}} - voller Funktionsumfang ohne Handy - bestückt bestellbar - wetterfest {{% /device-type-cell %}} -
-
diff --git a/content/docs/classic/about/_index.de.md b/content/docs/classic/about/_index.de.md index b07986b3..c1814b42 100644 --- a/content/docs/classic/about/_index.de.md +++ b/content/docs/classic/about/_index.de.md @@ -24,12 +24,12 @@ zum Gehäuse und Hilfen beim Beschaffen der Teile. * [Die Hauptplatine]({{< relref "pcb" >}}) wurde speziell für den OpenBikeSensor entworfen und kann als Spezialanfertigung bei einem Platinenhersteller anhand der bereitgestellten Designdateien bestellt - werden. + werden. * [Die Bauanleitung]({{< relref "../build-instructions" >}}) beschreibt, wie die Bauteile auf der Hauptplatine installiert und das ganze ins Gehäuse eingesetzt werden. - -### Muss ich den OpenBikeSensor selbst bauen? + +## Muss ich den OpenBikeSensor selbst bauen? Ja! Es gibt den OpenBikeSensor nicht als fertiges Gerät zu kaufen. Stattdessen baust du ihn dir selbst zusammen. @@ -38,7 +38,7 @@ Du brauchst auch keine Angst zu haben, damit loszulegen -- selbst wenn nicht immer sofort offensichtlich ist, wie alles funktioniert, so ist es trotzdem auch für Anfänger:innen möglich, erfolgreich einen Sensor anhand dieser Anleitungen zu bauen. Und wenn das mal nicht klappt, gibt es genug Leute, die -dir gern weiterhelfen, und ihr Wissen teilen. +dir gern weiterhelfen, und ihr Wissen teilen. Vielleicht kannst du dich auch mit einigen Anderen in deiner Gegend zusammentun. Schau in [der Community]({{< relref "community" >}}) vorbei oder @@ -54,13 +54,13 @@ der [Community]({{< relref "/community" >}}) organsiert. {{< imgproc construction-kit Resize 600x >}} OpenBikeSensor Classic Bausatz (alte Version) {{< /imgproc >}} - -### Hinweis für den Bau großer Stückzahlen + +## Hinweis für den Bau großer Stückzahlen Leider hatten wir in der Vergangenheit immer wieder Probleme damit, dass die aus China gelieferten fertigen Module nicht, oder nur teilweise den Spezifikationen entsprachen. Auch die Abmaße von Teilen ändern sich manchmal, z.B. bekamen wir -vom Lieferanten plötzlich größere Displays als üblich. +vom Lieferanten plötzlich größere Displays als üblich. Wenn du mehrere Geräte vom Typ *OpenBikeSensor Classic* herstellen möchtest, empfiehlt es sich daher, zunächst einen Probelauf zu machen. So stellst du @@ -75,7 +75,7 @@ einfache Änderung am Gehäuse, um auch mit den neuen Teilen kompatibel zu werden. Der:die nächste freut sich! -### Alternativen +## Alternativen Aufgrund der Vielfalt in dem Projekt und der unterschiedlichen Anforderungen der Beteiligten gibt es auch eine Vielzahl Varianten für fast jedes Teil. Der diff --git a/content/docs/classic/build-instructions/_index.de.md b/content/docs/classic/build-instructions/_index.de.md index 644b6532..e588d41b 100644 --- a/content/docs/classic/build-instructions/_index.de.md +++ b/content/docs/classic/build-instructions/_index.de.md @@ -9,7 +9,7 @@ aliases: description: > Sobald der Bausatz für den OpenBikeSensor Classic zusammengestellt ist, kann anhand dieser Anleitung der Bau begonnen werden. Der Zusammenbau - besteht aus einer Menge Lötarbeit, sowie dem Test der Elektronik und + besteht aus einer Menge Lötarbeit, sowie dem Test der Elektronik und dem Einbau in das Gehäuse. --- @@ -149,7 +149,7 @@ passieren. alt="Lötzinn erhitzen, und das Modul positionieren." >}} {{< slider-image src="v1.0.0/spannungswandler3.jpg" - alt="Wenn fertig positioniert restliche Pins verlööten." >}} + alt="Wenn fertig positioniert restliche Pins verlöten." >}} {{< slider-image src="v1.0.0/spannungswandler4.jpg" alt="Verlötet" @@ -209,12 +209,16 @@ sich mit 1.0.0 geändert haben. Ordne zunächst alle Widerstände richtig zu, indem du die Farbcodes abliest oder mit einem Multimeter misst: +
+ | Bauteil | Wert | Farbcode 4 Ringe | Farbcode 5 Ringe | SMD Code | -| ----------- | -------------: | :------------------------------------------- | :---------------------------------------------- | ------ | -| **R1, R2** | 1,2 kΩ | {{< resistor "brown,red,red,gold" >}} | {{< resistor "brown,red,black,brown,brown" >}} | 122 / 1201 | -| **R3** | 10 kΩ | {{< resistor "brown,black,orange,gold" >}} | {{< resistor "brown,black,black,red,brown" >}} | 103 / 1002 | -| **R4** | 150 kΩ | {{< resistor "brown,green,yellow,gold" >}} | {{< resistor "brown,green,black,orange,brown" >}} | 154 / 1503 | -| **R5** | 300 kΩ | {{< resistor "orange,black,yellow,gold" >}} | {{< resistor "orange,black,black,orange,brown" >}} | 304 / 3003 | +| ----------- | -------------: | :------------------------------------------: | :------------------------------------------------: | ------ | +| **R1, R2** | 1,2 kΩ | {{< resistor "brown,red,red,gold" >}} | {{< resistor "brown,red,black,brown,brown" >}} | 122 / 1201 | +| **R3** | 10 kΩ | {{< resistor "brown,black,orange,gold" >}} | {{< resistor "brown,black,black,red,brown" >}} | 103 / 1002 | +| **R4** | 150 kΩ | {{< resistor "brown,green,yellow,gold" >}} | {{< resistor "brown,green,black,orange,brown" >}} | 154 / 1503 | +| **R5** | 300 kΩ | {{< resistor "orange,black,yellow,gold" >}} | {{< resistor "orange,black,black,orange,brown" >}} | 304 / 3003 | + +
Nachdem du alle Widerstände zugeordnet hast, platziere sie an den dafür vorgesehenen Stellen auf der Vorderseite der Hautplatine. Stecke die Beinchen @@ -315,7 +319,6 @@ Finde heraus, wie herum dein Stecker auf die Platine (bei J1 bzw. "Battery") gelötet werden muss, damit die Farbzuordnung mit der Platinenbedruckung übereinstimmt. Löse dann das Kabel vom Stecker. - {{< imgproc "battery-connector-orientations.png" Fit "500x500">}} Zwei unterschiedliche Ausrichtungen des Batteriesteckers. Die korrekte Ausrichtung ist vom gelieferten Stecker und Kabel abhängig. @@ -464,14 +467,18 @@ Nach den Sensorboards kann das Adafruit Spannungsreglermodul verbaut werden. - Kürze die mitgelieferte Pinleiste auf drei Pins. - Stecke die Pinleiste von der Bestückungsseite auf das Board des Spannungsreglers. - Stecke den Spannungsregler von unten auf die OpenBikeSensor Platine, so dass - folgende Verbindungen entstehen (keine Sorge: das Ada board liefert auch 3.3v, hatte aber nicht genug Platz für die Nachkommastelle): - - | 3V3 Ada | OBS | - |---------|-------| - | VIN | VDC | - | 3V | 3.3V | - | GND | GND | - + folgende Verbindungen entstehen (keine Sorge: das Adafruit-Modul liefert auch 3.3V, hatte aber nicht genug Platz für die Nachkommastelle): + +
+ +| Adafruit-Board | | OpenBikeSensor Platine | +| ---------------: | - | :----------------------- | +| VIN | = | VDC | +| 3V | = | 3.3V | +| GND | = | GND | + +
+ - Klebe etwas Isolierband über die Lötstellen des Ultraschall boards unter das 3.3V board - Verlöte die Pins auf beiden Seiten, wie immer erst einen Pin, Orientierung nachjustieren @@ -538,8 +545,6 @@ Verlöte erst dann die restlichen Pins und kürze sie. des Moduls zeigt in Richtung der Buchsenleiste für den ESP32. {{}} ---- - {{% alert title="Glückwunsch!" color="success" %}} Mit diesem Schritt ist die Hauptplatine des OpenBikeSensors fertig bestückt. @@ -580,7 +585,7 @@ Insbesondere der mittlere Pin ist hierbei kritisch, er muss dieselbe Länge wie wird aber bei zu hoher Temperatur herausgedrückt. Verdrille nun beide Kabel auf voller Länge zu einem und führe dann die zwei Crimps in -das Steckergehäuse ein. Die Verdrillung wird sich wieder ein wenig lockern, +das Steckergehäuse ein. Die Verdrillung wird sich wieder ein wenig lockern, aber sollte wie ein Kabel wirken und keine große Schlaufe mehr bilden. {{< imgproc "v00.03.12/12_Switch/DSC08041.JPG" Fit "500x500" >}} @@ -728,17 +733,17 @@ sicher, dass die Magneten einander anziehen. Sollten die Magnete nicht von selbst in ihrem Loch stecken bleiben, kannst du sie auch mit etwas Sekunden- oder Alleskleber fixieren. -{{< imgproc "v00.03.12/15_Prepare_Case/DSC08072.JPG" Fit "500x500" >}} - Einpressgewinde in Displaygehäuse einschmelzen -{{< /imgproc >}} - -{{< imgproc "v00.03.12/15_Prepare_Case/DSC08074.JPG" Fit "500x500" >}} - Hauptgehäuse mit Einpressgewinde (ältere Version mit zwei Muttern für GPS) -{{< /imgproc >}} - -{{< imgproc "v00.03.12/15_Prepare_Case/DSC08075.JPG" Fit "500x500" >}} - USB-Abdeckung mit Magneten -{{< /imgproc >}} +{{< slider >}} + {{< slider-image + src="v00.03.12/15_Prepare_Case/DSC08072.JPG" + alt="Einpressgewinde in Displaygehäuse einschmelzen" >}} + {{< slider-image + src="v00.03.12/15_Prepare_Case/DSC08074.JPG" + alt="Hauptgehäuse mit Einpressgewinde (ältere Version mit zwei Muttern für GPS)" >}} + {{< slider-image + src="v00.03.12/15_Prepare_Case/DSC08075.JPG" + alt="USB-Abdeckung mit Magneten" >}} +{{< /slider >}} ## Displayeinheit @@ -997,7 +1002,7 @@ hilft dir vielleicht eine der Anleitung auf der [Fehlersuche-Seite]({{< relref - Bei Bedarf Unreinheiten des Gehäuses (vom 3D-Druck) entfernen, wenn das PCB daran hängen bleibt. - Mit 3 Stück M3x6 oder M3x8 im Gehäuse verschrauben. - - Nun kann der ESP wieder aufgesteckt werden. Dabei die Richtung der + - Nun kann der ESP wieder aufgesteckt werden. Dabei die Richtung der USB-Markierung mit Mikro-USB-Buchse dem ESP32 abgleichen, und sicherstellen, dass die Pins nicht um ein oder zwei Löcher verrutscht eingesteckt werden. diff --git a/content/docs/classic/parts/_index.de.md b/content/docs/classic/parts/_index.de.md index 9f4cec9b..20565098 100644 --- a/content/docs/classic/parts/_index.de.md +++ b/content/docs/classic/parts/_index.de.md @@ -1,13 +1,14 @@ --- title: Bauteile weight: 20 +notoc: true aliases: - /bauteile - /bauteile/v00.03.12 - /docs/hardware/v00.03.12/parts description: > Diese Seite listet alle Bauteile auf, die bestellt oder hergestellt werden - müssen, um einen OpenBikeSensor Classic zusammenzubauen. + müssen, um einen OpenBikeSensor Classic zusammenzubauen. --- @@ -21,6 +22,7 @@ Wenn du gerade bestellst, kannst du `@gluap` im Forum kontaktieren, um bei der T ## Bauteile +
@@ -68,7 +70,7 @@ Wenn du gerade bestellst, kannst du `@gluap` im Forum kontaktieren, um bei der T @@ -96,7 +98,7 @@ Wenn du gerade bestellst, kannst du `@gluap` im Forum kontaktieren, um bei der T @@ -108,7 +110,7 @@ Wenn du gerade bestellst, kannst du `@gluap` im Forum kontaktieren, um bei der T aliexpress.com 2
aliexpress.com 3 -
+
aliexpress.com 4 @@ -377,6 +379,7 @@ Wenn du gerade bestellst, kannst du `@gluap` im Forum kontaktieren, um bei der T
1 Alternative A "Rotes Modul" Buck-Boost Modul for LiPo, 3.3V (Spannungsregler). Eines der verlinkten Module reicht. - Derzeit ist kein zuverlässiger Händler für dieses Modul bekannt. Module mit Beschriftung `A1731i` auf dem sechsbeinigen Bauteil **funktionieren NICHT**. + Derzeit ist kein zuverlässiger Händler für dieses Modul bekannt. Module mit Beschriftung `A1731i` auf dem sechsbeinigen Bauteil **funktionieren NICHT**.
amazon.de
- google Suche + google Suche
+
{{< include-markdown-partial "parts-tools.md" >}} diff --git a/content/docs/classic/pcb/_index.de.md b/content/docs/classic/pcb/_index.de.md index 4a2d4c1f..3a4c6bfe 100644 --- a/content/docs/classic/pcb/_index.de.md +++ b/content/docs/classic/pcb/_index.de.md @@ -5,7 +5,7 @@ aliases: - /docs/hardware/general/pcb description: > Die Hauptplatine des OpenBikeSensor Classic verbindet alle Module - und elektronisch Einzelbauteile miteinander. Hier beschreiben wir, + und elektronischen Einzelbauteile miteinander. Hier beschreiben wir, wie du eine solche Platine bekommst. --- @@ -13,26 +13,42 @@ description: > Ein sehr wichtiger Bestandteil des Gerätes ist die Platine, auch „PCB” (englisch _printed circuit board_) genannt. Der schwierige Teil hieran ist das „printed” -- ein PCB ist ein professionell -hergestelltes Bauteil, das schwierig selbst zu erstellen ist. Hier sind deine -Optionen: +hergestelltes Bauteil, das schwierig selbst zu erstellen ist. So bekommst du +deine eigene Platine zum Bau des OpenBikeSensor Classic: -* Das PCB anhand der Designdateien von einem Platinenhersteller [anfertigen - lassen.](#gerber-dateien) -* Finde heraus, ob jemensch anders schon Platinen anhand der gleichen Dateien - hat herstellen lassen. Eventuell hat er:sie noch Exemplare übrig, frag am - besten [in der Community]({{< ref "/community" >}}) nach. +## Kleinstmengen -Die Gängigen PCB-Hersteller können unsere Platine herstellen, wir haben z.B. -gute Erfahrungen mit [Aisler](aisler.de) (deutscher Hersteller) oder -[jlcpcb](jlcpcb.com) gemacht. +Falls du nur eine oder wenige Platinen brauchst, lohnt es sich meist, in der +Community herumzufragen. Viele haben noch ein paar Platinen übrig und schicken +sie dir gern zum Selbstkostenpreis plus Porto zu. -## Gerber-Dateien +## Sammelbestellungen -Um deine Platine herstellen zu lassen benötigst du bei den meisten Herstellern -sogenannte Gerber Dateien bei manchen kannst du aber auch die kicad Dateien -hochladen und bestellen. Du lädst die Datei hoch und der Hersteller rechnet -für dich aus was es kostet. Meist ein paar Euro pro Platine, bei großen Mengen -auch weniger als einen Euro. +Wenn du einen Bausatz aus einer Sammelbestellung erhältst, ist in der Regel +auch die Platine schon dabei. Falls du mehrere Platinen brauchst, um selbst +Bausätze zusammenzustellen, frag trotzdem gern in der Community nach, ob sich +auch hier ein Zusammenschluss mit anderen Sammelbestellungen lohnt. So sparen +alle am Versand und den Stückpreisen. + +## Herstellung beauftragen + +Die Platine kannst du anhand der Designdateien, auch Gerberdateien genannt, von +einem Platinenhersteller anfertigen lassen. Wir veröffentlichen diese Dateien +[auf GitHub](https://github.com/openbikesensor/OpenBikeSensor_PCB_Board), von +wo du sie herunterladen kannst. Auf der verlinkten Seite im Abschnitt +*„Bestellung bei Platinenherstellern”* findest du auch Hinweise, +welche Dateien du brauchst und wie du die Platinen bestellst. + +Alle gängigen Platinenhersteller können unsere Platine herstellen, das Design +ist nicht besonders anspruchsvoll. Wir haben z.B. gute Erfahrungen mit +[Aisler](https://aisler.de) (deutscher Hersteller) oder +[JLCPCB](https://jlcpcb.com) (aus China) gemacht. + +Inländische Hersteller sind in der Regel etwas langsamer in der Herstellung und +verlangen höhere Preise, bei kleinen Mengen macht das aber keinen großen +Unterschied, da der Versand wesentlich günstiger, schneller und zuverlässiger +ist. Erst bei großen Bestellungen (ab ~20 Stück) lohnt sich oft die Herstellung +im Ausland. Rechne mit Stückkosten (ohne Versand) um 1 € in China und um +3-5 € in Europa. Du bekommst in der Regel ein verbindliches Angebot über +die Webseite des Herstellers, nachdem du die Designdateien hochgeladen hast. -Die aktuellen Gerber-Dateien findest du im Unterverzeichnis ``generated`` der -jeiweiligen PCB-Version, die auf der Teileliste verlinkt ist. diff --git a/content/docs/firmware/_index.de.md b/content/docs/firmware/_index.de.md index 51d6c22c..24f707ef 100644 --- a/content/docs/firmware/_index.de.md +++ b/content/docs/firmware/_index.de.md @@ -52,12 +52,16 @@ GGF musst du zunächst das "Flashtool" (über die OpenBikeSensor Oberfläche) in Danach kannst du, wenn dein OpenBikeSensor in einem internetfähigen WLAN eingebucht ist über das Wlan-Menü deines OpenBikeSensors Firmwareupdates anstoßen. -## Bauen und Flashen der Firmware aus dem GitHub-Repository +## Firmware aus Quelltext kompilieren -### mit VisualStudio Code und PlatformIO +Du kannst die Firmware auch selbst bauen und flashen, wenn du dir den Quelltext +aus dem GitHub-Repository herunterlädst. -Zunächst [VS Code](https://code.visualstudio.com/) und darin die Erweiterung [PlatformIO](https://platformio.org/) -installieren. - -Danach den gewünschten Stand der OBS-Firmware aus dem [github-Repository](https://github.com/openbikesensor/OpenBikeSensorFirmware) klonen und das Verzeichnis in VS Code öffnen. Dann mit dem Upload-Befehl (Pfeil nach rechts in der Fußzeile von VS Code) oder per `pio run -t upload` in der PlatformIO CLI auf den ESP32 flashen. +Zunächst musst du [VS Code](https://code.visualstudio.com/) und darin die +Erweiterung [PlatformIO](https://platformio.org/) installieren. Clone dann den +gewünschten Stand der OBS-Firmware aus dem +[github-Repository](https://github.com/openbikesensor/OpenBikeSensorFirmware) +und öffne das Verzeichnis in VS Code. Dann kannst du mit dem Upload-Befehl +(Pfeil nach rechts in der Fußzeile von VS Code) oder per `pio run -t upload` in +der PlatformIO CLI die Firmware kompilieren und auf den ESP32 flashen. diff --git a/content/docs/firmware/flash-python.md b/content/docs/firmware/flash-python.md index 57d696b7..0e989d32 100644 --- a/content/docs/firmware/flash-python.md +++ b/content/docs/firmware/flash-python.md @@ -1,6 +1,8 @@ --- title: Flashen mit platformio weight: 10 +description: > + xx --- Hast du `git` und `python3` installiert, kannst du mit folgenden Kommandos die OpenBikeSensor Firmware bauen und flashen. diff --git a/content/docs/user-guide/mounting/index.de.md b/content/docs/user-guide/mounting/index.de.md index f67c2b32..9ca30844 100644 --- a/content/docs/user-guide/mounting/index.de.md +++ b/content/docs/user-guide/mounting/index.de.md @@ -4,6 +4,9 @@ title: Montage des Sensors am Fahrrad weight: 15 aliases: - /montage +description: > + Es gibt einige Optionen den OpenBikeSensor am Fahrrad anzubringen. Hier + erfährst du, wie sie aussehen, und worauf du achten solltest. --- {{% alert title="Hinweis" color="info" %}} diff --git a/content/docs/user-guide/quickstart.de.md b/content/docs/user-guide/quickstart.de.md index fda7f4c0..af31d528 100644 --- a/content/docs/user-guide/quickstart.de.md +++ b/content/docs/user-guide/quickstart.de.md @@ -4,9 +4,11 @@ linkTitle: Schnellstart weight: 10 aliases: - /start +description: > + So bereitest du deinen neuen OpenBikeSensor auf die erste Fahrt vor. --- -Diese Anleitung geht davon aus, dass du einen funktionierenden +Diese Anleitung geht davon aus, dass du einen funktionierenden [OpenBikeSensor Classic]({{< ref "/docs/classic" >}}) hast. Sobald du einen OpenBikeSensor hast, solltest du ein paar Dinge damit tun: @@ -40,8 +42,8 @@ Um sicherzugehen, dass dein Gerät voll funktionsfähig ist, führe vor der ersten Montage und danach regelmäßig (z.B. jedes Mal nach dem Aufladen des Akkus oder wöchentlich) folgenden Test durch: -Halte dein Gerät im Freien eingeschaltet mit der linken Seite zum Himmel und -der rechten Seite nach unten in die Luft. Nachdem die Haltezeit für den +Halte dein Gerät im Freien eingeschaltet mit der linken Seite zum Himmel und +der rechten Seite nach unten in die Luft. Nachdem die Haltezeit für den linksseitigen Messwert abgelaufen ist, sollte kein Messwert mehr angezeigt. Hast du noch keinen GPS-Empfang und möchtest nicht warten, bis das GPS Empfang hat, kannst du durch kurzes Drücken auf den Knopf am Display in die Messansicht diff --git a/content/faq/build/how-much-does-one-sensor-cost.de.md b/content/faq/build/how-much-does-one-sensor-cost.de.md index c8aecbf4..46c0bfd1 100644 --- a/content/faq/build/how-much-does-one-sensor-cost.de.md +++ b/content/faq/build/how-much-does-one-sensor-cost.de.md @@ -1,7 +1,10 @@ --- title: > - Was kostet ein Überholabstandsmesser? -slug: was-kostet-ein-ueberholabstandsmesser + Was kostet ein OpenBikeSensor? +slug: was-kostet-ein-openbikesensor +alias: + - /faq/build/was-kostet-ein-ueberholabstandsmesser/ +weight: 3 --- Die Teile für einen Bausatz können einzeln oder in größeren Mengen gekauft diff --git a/content/faq/build/i-am-a-beginner-can-i-build-one.de.md b/content/faq/build/i-am-a-beginner-can-i-build-one.de.md index 68cefb84..8031b77c 100644 --- a/content/faq/build/i-am-a-beginner-can-i-build-one.de.md +++ b/content/faq/build/i-am-a-beginner-can-i-build-one.de.md @@ -1,8 +1,9 @@ --- title: > Ich bin kein:e Profi-Bastler:in, kann ich trotzdem einen - Überholabstandsmesser bauen? + OpenBikeSensor bauen? slug: ich-bin-neuling +weight: 2 --- Ja! Natürlich hilft es, so etwas schon einmal gemacht zu haben. Aber mit diff --git a/content/faq/build/where-do-i-get-a-pcb.de.md b/content/faq/build/where-do-i-get-a-pcb.de.md index 1dd54a83..19c4893a 100644 --- a/content/faq/build/where-do-i-get-a-pcb.de.md +++ b/content/faq/build/where-do-i-get-a-pcb.de.md @@ -2,18 +2,12 @@ title: > Ich brauche eine Platine (PCB), woher bekomme ich die? slug: woher-bekomme-ich-eine-platine +weight: 10 --- -Wir veröffentlichen [auf -GitHub](https://github.com/openbikesensor/OpenBikeSensor_PCB_Board) die -CAD-Zeichnungen für die Platinen. Du kannst dir von dort die benötigten Dateien -herunterladen und bei einem Platinenhersteller deiner Wahl bestellen. +Du kannst die Platine selbst anhand unserer Designdateien +[bei einem Hersteller deiner Wahl bestellen]({{< relref "/docs/classic/pcb" >}}) +oder dich mit Anderen [in der Community]({{< relref "/community" >}}) +zusammentun. Vielleicht hat auch jemand noch Platinen übrig, für kleine Mengen +lohnt sich das Nachfragen! -Platinen sind aber auch immer Bestandteil unserer Sammelbestellungen, denn -solche Spezialanfertigungen sind natürlich in Menge gefertigt wesentlich -günstiger. Unser Hersteller in China bietet uns die fertigen PCBs in Menge für -etwa 0,50 € pro Stück an. In Deutschland gefertigt und damit schneller und -umweltschonender geliefert kosten Platinen 3 bis 5 € pro Stück, dies ist für -mittelgroße Bestellungen natürlich auch eine gute Option. - -[» Dokumentation zum PCB (Englisch)]({{< ref path="/docs/classic/pcb" >}}) diff --git a/content/faq/build/where-do-i-get-a-sensor.de.md b/content/faq/build/where-do-i-get-a-sensor.de.md index 03cc869b..ee4a914b 100644 --- a/content/faq/build/where-do-i-get-a-sensor.de.md +++ b/content/faq/build/where-do-i-get-a-sensor.de.md @@ -1,7 +1,10 @@ --- title: > - Woher bekomme ich den Überholabstandsmesser? -slug: woher-bekomme-ich-den-ueberholabstandsmesser + Woher bekomme ich einen OpenBikeSensor? +slug: woher-bekomme-ich-einen-openbikesensor +alias: + - /faq/build/woher-bekomme-ich-den-ueberholabstandsmesser/ +weight: 1 --- Wir entwickeln in ehrenamtlicher Arbeit dieses Gerät, aber wir verkaufen es diff --git a/content/faq/data/how-do-privacy-zones-work.de.md b/content/faq/data/how-do-privacy-zones-work.de.md index 32f4e754..f1e17045 100644 --- a/content/faq/data/how-do-privacy-zones-work.de.md +++ b/content/faq/data/how-do-privacy-zones-work.de.md @@ -9,7 +9,7 @@ Diese Zonen erlauben das Anonymisieren deiner Aufzeichnungen innerhalb bestimmter geografischer Bereiche, zum Beispiel damit nicht öffentlich ist, wo du wohnst. -Du kannst sie im Überholabstandsmesser konfigurieren und auswählen, wie sich +Du kannst sie im OpenBikeSensor konfigurieren und auswählen, wie sich das Gerät innerhalb dieser Zonen verhalten soll. In Zukunft wird es auch möglich sein, im Portal solche Zonen zu verwalten und die Anonymisierung dort durchführen zu lassen. diff --git a/content/faq/data/how-is-collected-data-evaluated.de.md b/content/faq/data/how-is-collected-data-evaluated.de.md deleted file mode 100644 index e2202c76..00000000 --- a/content/faq/data/how-is-collected-data-evaluated.de.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: > - Wie werden die Daten ausgewertet? -slug: wie-werden-die-daten-ausgewertet -weight: 50 ---- - -Noch nicht automatisch. - -Es gibt eine [Sammlung von -Skripten](https://github.com/openbikesensor/OpenBikeSensor-Scripts), die die -Auswertung ermöglichen. Diese ordnen die Messwerte Straßenabschnitten aus -OpenStreetMap zu und erlauben eine Visualisierung. - -Diese Art der Auswertung muss momentan noch manuell gemacht werden. Eine -Integration in das [Portal](https://github.com/openbikesensor/portal) ist -geplant und in Arbeit, aber noch nicht verfügbar. diff --git a/content/faq/data/how-is-data-processed.de.md b/content/faq/data/how-is-data-processed.de.md index 4121fea6..14928e11 100644 --- a/content/faq/data/how-is-data-processed.de.md +++ b/content/faq/data/how-is-data-processed.de.md @@ -5,7 +5,7 @@ slug: wie-werden-die-daten-verarbeitet weight: 20 --- -Der Überholabstandsmesser lädt ganze Fahrten als einzelne Dateien ins Portal +Der OpenBikeSensor lädt ganze Fahrten als einzelne Dateien ins Portal hoch. Diese werden importiert, jedoch nur zur Einzelanzeige der jeweiligen Fahrt. diff --git a/content/faq/data/what-data-is-recorded.de.md b/content/faq/data/what-data-is-recorded.de.md index 86738ce7..3df8aa8c 100644 --- a/content/faq/data/what-data-is-recorded.de.md +++ b/content/faq/data/what-data-is-recorded.de.md @@ -5,8 +5,8 @@ slug: welche-daten-werden-aufgezeichnet weight: 10 --- -Der Überholabstandsmesser ermittelt eine ganze Menge Daten, die in der Datei zu -jeder Fahrt gespeichert werden: +Der OpenBikeSensor ermittelt eine ganze Menge Daten, die in der Datei zu jeder +Fahrt gespeichert werden: * Datum und Uhrzeiten * GPS-Koordinaten @@ -17,6 +17,7 @@ jeder Fahrt gespeichert werden: * Batteriezustand * ID des Gerätes, Firmwareversion, sowie einige Einstellungen und Eigenschaften des Gerätes -Die veränderlichen Werte werden etwa im Sekundentakt aufgezeichnet, auch wenn -gerade nichts gemessen oder kein Überholvorgang bestätigt wird. Dies erlaubt -die spätere Auswertung und Weiterentwicklung der Auswertungsalgorithmen. +Die veränderlichen Werte werden etwa im Sekundentakt aufgezeichnet, die +Abstandsmessungen noch viel öfter, und das auch wenn gerade nichts gemessen +oder kein Überholvorgang bestätigt wird. Dies erlaubt die spätere Auswertung +und Weiterentwicklung der Auswertungsalgorithmen. diff --git a/content/faq/data/why-decentralize.de.md b/content/faq/data/why-decentralize.de.md index dec9d9fc..50968ab3 100644 --- a/content/faq/data/why-decentralize.de.md +++ b/content/faq/data/why-decentralize.de.md @@ -1,8 +1,10 @@ --- title: > - Warum sollte es mehrere Portale geben? -slug: warum-sollte-es-mehrere-portale-geben + Warum gibt es mehrere Portale? +slug: warum-gibt-es-mehrere-portale weight: 100 +alias: + - /faq/data/warum-sollte-es-mehrere-portale-geben/ --- Wir wollen Dezentralität der gemessenen Daten ermöglichen. Auf die Portale @@ -11,13 +13,7 @@ damit der Betreiber:in, können alle Nutzer:innen selbst entscheiden, wem sie diese Daten anvertrauen möchten. In der Portalsoftware wird dann aus den sensiblen Daten ein öffentlicher -Datenpool abgeleitet. Dieser wird durch das Portal veröffentlicht und fließt in -die globale Datenbank ein. - -Die Betreiber:innen einzelner Portale können außerdem Nebenabsprachen mit ihren -Nutzenden treffen, welche über das beschriebene Vorgehen zur Nutzung der -hochgeladenen Daten hinausgehen. Dies ist zum Beispiel bei einigen -Forschungsprojekten der Fall. - -**Hinweis:** Dies alles ist Konzeption und Zukunftsmusik. Auf dem Weg der -Umsetzung sind noch viele Schritte zu tun. +Datenpool abgeleitet. Die Betreiber:innen einzelner Portale können außerdem +Nebenabsprachen mit ihren Nutzenden treffen, welche über die allgemeine Nutzung +der hochgeladenen Daten hinausgehen. Dies ist zum Beispiel bei einigen +Forschungsprojekten der Fall. Diese Projekte betreiben dann ihr eigenes Portal. diff --git a/content/featured-background.jpg b/content/featured-background.jpg deleted file mode 100644 index 65db539a..00000000 Binary files a/content/featured-background.jpg and /dev/null differ diff --git a/content/map.de.md b/content/map.de.md deleted file mode 100644 index 0f5fe91b..00000000 --- a/content/map.de.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Karte der Initiativen -menu: - main: - parent: project - weight: 40 -aliases: -- /map ---- - -
- -
- -# Karte - -
- -
- -In vielen Regionen gibt es schon OpenBikeSensoren! Suchst du Gleichgesinnte oder Ansprechpartner in deiner Gegend? Die Karte hilft dir dabei. Möchtest du selbst oder deine Initiative noch auf der Karte auftauchen? [Im Forum](https://forum.openbikesensor.org/t/karte-der-lokalinitiativen-und-nutzer/389) erfährst du, wie! - -
- -
- -
diff --git a/content/map.md b/content/map.md new file mode 100644 index 00000000..12f5aa51 --- /dev/null +++ b/content/map.md @@ -0,0 +1,22 @@ +--- +title: Karte der Initiativen +menu: + main: + parent: project + weight: 40 +aliases: +- /map +--- + +# Karte + +In vielen Regionen gibt es schon OpenBikeSensoren! Suchst du Gleichgesinnte +oder Ansprechpartner in deiner Gegend? Die Karte hilft dir dabei. Möchtest du +selbst oder deine Initiative noch auf der Karte auftauchen? [Im +Forum](https://forum.openbikesensor.org/t/karte-der-lokalinitiativen-und-nutzer/389) +erfährst du, wie! + +
+ +
diff --git a/content/verein.de.md b/content/verein.de.md index bcef7577..0de305e8 100644 --- a/content/verein.de.md +++ b/content/verein.de.md @@ -8,17 +8,11 @@ aliases: - /ev --- -
-
+
# OpenBikeSensor e. V. -
-
- -
- -Im Dezember 2021 haben wir gemeinsam einen Verein gegründet, um uns künftig die +Im Dezember 2021 haben wir gemeinsam einen Verein gegründet, um uns die Arbeit zu erleichtern. Der Verein trägt den Namen *OpenBikeSensor e. V.* und ist beim Amtsgericht Stuttgart im Vereinsregister eingetragen. @@ -28,14 +22,14 @@ Verantwortlichkeiten für unsere Online-Präsenz und eine gewisse zivilrechtlich Haftbarkeit. Eine Auswirkung auf die Weiterentwicklung und den Einsatz der Technologie durch die Community soll dies nicht haben. -Mit der erhofften Anerkennung der Gemeinnützigkeit werden sich uns weitere -finanzielle Möglichkeiten eröffnen. Insbesondere werden wir prüfen, ob und wie -wir Sammelbestellungen über den Verein abwickeln oder sogar Bausätze verkaufen -können, um vor allem Einzelpersonen leichter mit Sensoren ausstatten zu können. -Möglicherweise kann der Verein auch Fördergelder beantragen bzw. erhalten und -für den Vereinszweck aufwenden. +Mit der Anerkennung der Gemeinnützigkeit eröffnen sich uns weitere +finanzielle Möglichkeiten. Insbesondere können wir Sammelbestellungen über den +Verein abwickeln oder in der Zukunft eventuell sogar Bausätze verkaufen, +um vor allem Einzelpersonen leichter mit Sensoren ausstatten zu können. Als +Verein können wir auch Fördergelder beantragen bzw. erhalten und für den +Vereinszweck aufwenden. -### Vereinszweck +## Vereinszweck Der Vereinszweck ist in der [Satzung](/docs/Satzung.pdf) festgelegt und lautet: @@ -51,7 +45,7 @@ Der Vereinszweck ist in der [Satzung](/docs/Satzung.pdf) festgelegt und lautet: > > -- *Quelle: [Gründungssatzung des Vereins OpenBikeSensor](/docs/Satzung.pdf)* -### Mitgliedschaft +## Mitgliedschaft Eine Mitgliedschaft im Verein ist ausdrücklich **keine Voraussetzung für die Mitarbeit** am Projekt. Die Community besteht nach wie vor unabhängig vom Verein @@ -73,4 +67,44 @@ für Mitglieder sind auf dem Beitrittsformular (siehe oben) beschrieben. Zur Kontaktaufnahme mit dem Vorstand kann die E-Mail-Adresse aus dem [Impressum]({{< relref "contact" >}}) genutzt werden. + + +## Spenden + +Die Arbeit rund um den OpenBikeSensor ist sehr zeitaufwändig und kostspielig. +Der OpenBikeSensor e. V. nimmt gern Spenden entgegen, die in die Arbeit der +Community fließen und künftige Projekte unterstützen. + +Bis 200 € reicht der Kontoauszug, um Spenden steuerlich absetzen zu +können. Dafür unbedingt den Verwendungszweck so ausfüllen. + +
+IBAN: DE40 4306 0967 1294 8595 00 (GLS)
+Kontoinhaber: OpenBikeSensor e. V.
+Verwendungszweck: Spende OpenBikeSensor
+
+ +Hier ein paar Beispiele, was wir mit Euren Spenden alles erreichen können: + +- Wir kaufen mit Mengenrabatt und reduzierten Versandkosten neue Hardware und + Bauteile ein. Diese bringen wir Euch dann zu Workshops mit, welche wir + veranstalten. +- Wir stellen Bausätze zusammen, damit Interessierte keine 6-8 Wochen auf Teile + aus China warten müssen, sondern zügig loslegen können. +- Wir bauen Geräte, die wir für Aktionszeiträume an Engagierte ausleihen. Die + Koordination übernehmen unsere Regio-Teams. +- Unsere Entwickler:innen können Hardware für Verbesserungen und Erweiterungen + bestellen, ohne das Geld selbst vorschießen zu müssen. +- Wir finanzieren die IT-Infrastruktur für Ko-Kreation und Kollaboration + unseres Netzwerks. +- Wir beauftragen Arbeiten für die Weiterentwicklung der Technik, für die sich + keine Ehrenamtlichen Entwickler:innen finden lassen. Dies kann bei bestimmten + erforderlichen Know-How oder Aufwand notwendig sein, um das Projekt + voranbringen zu können. Die Ergebnisse (Software oder Designs) werden + natürlich weiterhin frei lizensiert. + +Die Ausgaben des Vereins werden natürlich transparent gegenüber den +Vereinsmitgliedern kommuniziert und mit allen anderen in der Community +abgestimmt. +
diff --git a/fontawesome-download.sh b/fontawesome-download.sh new file mode 100755 index 00000000..cf27c0c0 --- /dev/null +++ b/fontawesome-download.sh @@ -0,0 +1,12 @@ +#!/bin/sh +set -ex +icons="brands/discourse brands/github brands/mastodon solid/video solid/person-biking solid/arrow-right solid/arrow-left solid/lightbulb solid/bars solid/xmark" + +dest=fontawesome +url=https://raw.githubusercontent.com/FortAwesome/Font-Awesome/6.x/svgs + +mkdir -p "${dest}" +for path in $icons; do + name=$(basename ${path}) + wget -O "${dest}/${name}.svg" "${url}/${path}.svg" +done diff --git a/fontawesome/arrow-left.svg b/fontawesome/arrow-left.svg new file mode 100644 index 00000000..c6233a44 --- /dev/null +++ b/fontawesome/arrow-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fontawesome/arrow-right.svg b/fontawesome/arrow-right.svg new file mode 100644 index 00000000..947f2a3a --- /dev/null +++ b/fontawesome/arrow-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fontawesome/bars.svg b/fontawesome/bars.svg new file mode 100644 index 00000000..02dd6bcf --- /dev/null +++ b/fontawesome/bars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fontawesome/discourse.svg b/fontawesome/discourse.svg new file mode 100644 index 00000000..c41b1083 --- /dev/null +++ b/fontawesome/discourse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fontawesome/github.svg b/fontawesome/github.svg new file mode 100644 index 00000000..eda7c3f4 --- /dev/null +++ b/fontawesome/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fontawesome/lightbulb.svg b/fontawesome/lightbulb.svg new file mode 100644 index 00000000..696fa4e0 --- /dev/null +++ b/fontawesome/lightbulb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fontawesome/mastodon.svg b/fontawesome/mastodon.svg new file mode 100644 index 00000000..bb36bf3c --- /dev/null +++ b/fontawesome/mastodon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fontawesome/person-biking.svg b/fontawesome/person-biking.svg new file mode 100644 index 00000000..c7c493c3 --- /dev/null +++ b/fontawesome/person-biking.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fontawesome/video.svg b/fontawesome/video.svg new file mode 100644 index 00000000..b1a6c1fa --- /dev/null +++ b/fontawesome/video.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fontawesome/xmark.svg b/fontawesome/xmark.svg new file mode 100644 index 00000000..a1c48211 --- /dev/null +++ b/fontawesome/xmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/go.mod b/go.mod index 3f271ef7..a86a9b9f 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,3 @@ module github.com/openbikesensor/openbikesensor.github.io go 1.21 - -require github.com/google/docsy v0.8.0 // indirect diff --git a/go.sum b/go.sum index e3bb394d..e69de29b 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +0,0 @@ -github.com/FortAwesome/Font-Awesome v0.0.0-20230327165841-0698449d50f2/go.mod h1:IUgezN/MFpCDIlFezw3L8j83oeiIuYoj28Miwr/KUYo= -github.com/google/docsy v0.8.0 h1:RgHyKRTo8YwScMThrf01Ky2yCGpUS1hpkspwNv6szT4= -github.com/google/docsy v0.8.0/go.mod h1:FqTNN2T7pWEGW8dc+v5hQ5VF29W5uaL00PQ1LdVw5F8= -github.com/twbs/bootstrap v5.2.3+incompatible/go.mod h1:fZTSrkpSf0/HkL0IIJzvVspTt1r9zuf7XlZau8kpcY0= diff --git a/i18n/de.toml b/i18n/de.toml index 9aa6abcc..8646e747 100644 --- a/i18n/de.toml +++ b/i18n/de.toml @@ -1,8 +1,5 @@ [page_not_translated] other = "Diese Seite gibt es noch nicht auf Deutsch, aber vielleicht sprichst Du ja..." -[footer_all_rights_reserved] -other = "– veröffentlicht unter LGPL-3.0" - [print_entire_section] other = "Kapitel drucken" diff --git a/i18n/en.toml b/i18n/en.toml index dace4648..932b4806 100644 --- a/i18n/en.toml +++ b/i18n/en.toml @@ -1,6 +1,2 @@ [page_not_translated] other = "This page is not yet available in English. You might be able to read it in..." - - -[footer_all_rights_reserved] -other = "– published under terms of LGPL-3.0" diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html new file mode 100644 index 00000000..8270014d --- /dev/null +++ b/layouts/_default/baseof.html @@ -0,0 +1,14 @@ + + + + {{ partial "head.html" . }} + + + {{ partial "navbar.html" . }} + + {{ block "main" . }}{{ end }} + {{ partial "footer.html" . }} + + {{ partial "scripts.html" . }} + + diff --git a/layouts/_default/single.html b/layouts/_default/single.html new file mode 100644 index 00000000..8362338e --- /dev/null +++ b/layouts/_default/single.html @@ -0,0 +1,3 @@ +{{ define "main" -}} +{{ .Content -}} +{{ end }} diff --git a/layouts/blog/baseof.html b/layouts/blog/baseof.html new file mode 100644 index 00000000..8270014d --- /dev/null +++ b/layouts/blog/baseof.html @@ -0,0 +1,14 @@ + + + + {{ partial "head.html" . }} + + + {{ partial "navbar.html" . }} + + {{ block "main" . }}{{ end }} + {{ partial "footer.html" . }} + + {{ partial "scripts.html" . }} + + diff --git a/layouts/blog/list.html b/layouts/blog/list.html new file mode 100644 index 00000000..5f53e38b --- /dev/null +++ b/layouts/blog/list.html @@ -0,0 +1,21 @@ +{{ define "main" }} + +
+

Blog

+ +
    +{{ range .Pages -}} +
  • + +
    + {{ .Title }} +
    + +

    {{ .Summary }}

    + Weiterlesen +
  • +{{ end -}} +
+
+ +{{ end -}} diff --git a/layouts/blog/single.html b/layouts/blog/single.html new file mode 100644 index 00000000..c3777b8c --- /dev/null +++ b/layouts/blog/single.html @@ -0,0 +1,14 @@ +{{ define "main" }} + +
+ +

{{ .Title }}

+ + {{ with .Params.description }}
{{ . | markdownify }}
{{ end }} + + {{ .Content }} + + {{ partial "pager.html" . }} +
+ +{{ end }} diff --git a/layouts/docs/baseof.html b/layouts/docs/baseof.html index 5403cd85..6e70e4b3 100644 --- a/layouts/docs/baseof.html +++ b/layouts/docs/baseof.html @@ -3,27 +3,33 @@ {{ partial "head.html" . }} - -
- {{ partial "navbar.html" . }} -
-
-
-
- {{ partial "sidebar.html" . }} -
-
- {{ partial "page-meta-links.html" . }} - {{ partial "toc.html" . }} -
-
- {{ partial "version-banner.html" . }} - {{ if not .Site.Params.ui.breadcrumb_disable }}{{ partial "breadcrumb.html" . }}{{ end }} - {{ block "main" . }}{{ end }} -
+ + {{ partial "navbar.html" . }} + +
+ + + + +
+ + + +
- {{ partial "footer.html" . }} + + + {{ partial "toc.html" . }} + +
+ {{ partial "breadcrumb.html" . }} + {{ block "main" . }}{{ end }} +
+ {{ partial "footer.html" . }} + {{ partial "scripts.html" . }} diff --git a/layouts/docs/list.html b/layouts/docs/list.html index 3cf49f4d..0c60432d 100644 --- a/layouts/docs/list.html +++ b/layouts/docs/list.html @@ -1,25 +1,12 @@ {{ define "main" }} -
-

{{ .Title }}

- - {{ with .Params.description }}
{{ . | markdownify }}
{{ end }} - {{ .Content }} - - {{ partial "section-index.html" . }} +

{{ .Title }}

-
- {{ partial "page-meta-lastmod.html" . }} +{{ with .Params.description }}
{{ . | markdownify }}
{{ end }} -
+{{ .Content }} - Du möchtest etwas zu dieser Seite beitragen? Eine Anleitung findest du im Forum. +{{ partial "section-index.html" . }} -
- - {{ with .CurrentSection.AlternativeOutputFormats.Get "print" }} - Druckansicht dieses Kapitels - {{ end }} -
-
+{{ partial "docs-footer.html" . }} {{ end }} diff --git a/layouts/docs/parts.html b/layouts/docs/parts.html deleted file mode 100644 index d0c42550..00000000 --- a/layouts/docs/parts.html +++ /dev/null @@ -1,25 +0,0 @@ -{{ define "main" }} - -{{ partial "parts-notes.md" . | markdownify }} - -{{ .Render "content" }} - -
-

{{ .Title }}

- {{ with .Params.description }}
{{ . | markdownify }}
{{ end }} - {{ if (and (not .Params.hide_readingtime) (.Site.Params.ui.readingtime.enable)) }} - {{ partial "reading-time.html" . }} - {{ end }} - {{ .Content }} - {{ if (and (not .Params.hide_feedback) (.Site.Params.ui.feedback.enable) (.Site.GoogleAnalytics)) }} - {{ partial "feedback.html" .Site.Params.ui.feedback }} -
- {{ end }} - {{ if (.Site.Params.DisqusShortname) }} -
- {{ partial "disqus-comment.html" . }} - {{ end }} -
{{ partial "page-meta-lastmod.html" . }}
-
- -{{ end }} diff --git a/layouts/docs/single.html b/layouts/docs/single.html new file mode 100644 index 00000000..0c60432d --- /dev/null +++ b/layouts/docs/single.html @@ -0,0 +1,12 @@ +{{ define "main" }} + +

{{ .Title }}

+ +{{ with .Params.description }}
{{ . | markdownify }}
{{ end }} + +{{ .Content }} + +{{ partial "section-index.html" . }} + +{{ partial "docs-footer.html" . }} +{{ end }} diff --git a/layouts/faq/li.html b/layouts/faq/li.html index d9ccc39b..3e142eec 100644 --- a/layouts/faq/li.html +++ b/layouts/faq/li.html @@ -1,22 +1,17 @@ {{ if .IsNode }} -

{{ .Title }}

+

{{ .Title }}

{{ .Content }} -
- {{ range .Pages }} - {{ .Render "li" }} - {{ end }} +
+ {{ range .Pages }} + {{ .Render "li" }} + {{ end }}
{{ else }} - -
- -

- {{ .Title }} -

-
- - {{ .Content }} +
+

{{ .Title }}

+
+ {{ .Content }} +
- {{ end }} diff --git a/layouts/faq/list.html b/layouts/faq/list.html index 2aa998a9..d91830af 100644 --- a/layouts/faq/list.html +++ b/layouts/faq/list.html @@ -1,8 +1,6 @@ {{ define "main" }} -
- -
+
{{ .Content }} @@ -10,5 +8,6 @@ {{ .Render "li" }} {{ end }} -
+ + {{ end }} diff --git a/layouts/faq/single.html b/layouts/faq/single.html index efcbfb69..1abed121 100644 --- a/layouts/faq/single.html +++ b/layouts/faq/single.html @@ -1,23 +1,21 @@ {{ define "main" }} -
+
-
- -

+

- + {{ partial "fa.html" "arrow-left" }} Zurück zur FAQ

-

- {{ .Title }} -

+
+

{{ .Title }}

+
+ {{ .Content }} +
+
-
- {{ .Content }} -
+
-
{{ end }} diff --git a/layouts/home.html b/layouts/home.html new file mode 100644 index 00000000..9569b16b --- /dev/null +++ b/layouts/home.html @@ -0,0 +1,5 @@ +{{ define "main" }} +{{ with .Content }} +{{ . }} +{{ end }} +{{ end }} diff --git a/layouts/partials/breadcrumb.html b/layouts/partials/breadcrumb.html new file mode 100644 index 00000000..92e00791 --- /dev/null +++ b/layouts/partials/breadcrumb.html @@ -0,0 +1,28 @@ +{{ $isSingle := true -}} +{{ with .Parent -}} + {{ $isSingle = .IsHome -}} +{{ end -}} + + +{{- define "breadcrumbnav" -}} + {{ if .p1.Parent -}} + {{ if not .p1.Parent.IsHome -}} + {{ template "breadcrumbnav" (dict "p1" .p1.Parent "p2" .p2 ) -}} + {{ end -}} + {{ else if not .p1.IsHome -}} + {{ template "breadcrumbnav" (dict "p1" .p1.Site.Home "p2" .p2 ) -}} + {{ end -}} + {{ $isActive := eq .p1 .p2 }} + +{{- end -}} diff --git a/layouts/partials/community_links.html b/layouts/partials/community_links.html new file mode 100644 index 00000000..e69de29b diff --git a/layouts/partials/docs-footer.html b/layouts/partials/docs-footer.html new file mode 100644 index 00000000..d2577563 --- /dev/null +++ b/layouts/partials/docs-footer.html @@ -0,0 +1,15 @@ +{{ if and .GitInfo .Site.Params.github_repo -}} + +{{ end -}} diff --git a/layouts/partials/fa.html b/layouts/partials/fa.html new file mode 100644 index 00000000..879eb377 --- /dev/null +++ b/layouts/partials/fa.html @@ -0,0 +1,6 @@ + +{{- $fname:=print "fontawesome/" . ".svg" -}} +{{- $path:=" diff --git a/layouts/partials/favicons.html b/layouts/partials/favicons.html new file mode 100644 index 00000000..69e7f053 --- /dev/null +++ b/layouts/partials/favicons.html @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html index 1cfdaf52..35d6f004 100644 --- a/layouts/partials/footer.html +++ b/layouts/partials/footer.html @@ -1,16 +1,6 @@ -