initial import

this is what's currently published on https://nakamochi.io/ at the
time of this commit.
master
alex 1 year ago
commit 3fb35c0c0b

2
.gitignore vendored

@ -0,0 +1,2 @@
public
output

@ -0,0 +1,11 @@
Copyright (c) 2023 qeles AG
This website uses parts of Pico CSS framework (https://picocss.com) distributed
according to the MIT license.
Courier Prime monospace fonts (https://quoteunquoteapps.com/courierprime/) are
designed by Alan Dague-Greene and released under OFL license.
The rest of the work, except where otherwise noted, is released under
Creative Commons Attribution-ShareAlike 4.0 International License.
To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/.

@ -0,0 +1,41 @@
# https://www.getzola.org/documentation/getting-started/configuration/
base_url = "https://nakamochi.io"
# default page meta title and <title/> suffix
title = "nakamochi"
# appears in all pages metadata
description = "a simple to use bitcoin and lightning node for anyone and everyone"
default_language = "en"
output_dir = "output"
compile_sass = true
build_search_index = false
ignored_content = []
[markdown]
highlight_code = true
external_links_target_blank = false
external_links_no_follow = true
external_links_no_referrer = true
[link_checker]
skip_prefixes = []
skip_anchor_prefixes = []
internal_level = "error"
external_level = "error"
# custom variables accessible at config.extra in templates
[extra]
sitenav = [
{path = "@/source.md", en = "sources", it = "sorgenti"},
{path = "@/about.md", en = "about", it = "about"},
]
[translations]
not_found = "not found"
# language translations
[languages.de]
title = "nakamochi"
[languages.it]
title = "nakamochi"

@ -0,0 +1,127 @@
---
template: "home.html"
title: "nakamochi"
extra:
landing: true
tagline: "a device for complete privacy and financial independence leveraging bitcoin and lightning networks"
---
## Motivation
Nowadays, there are many web and mobile apps providing bitcoin and lightning wallets
functionality. They are mostly known as [SPV], Simplified Payment Verification clients
which connect to a [full node]. Likewise, [hardware wallets] also typically require
a companion app which in turn connects to a full node run by someone else.
Historically, bitcoin - and especially lightning - nodes have been run by
organizations and people with knowledge in cryptography, system networks and
software engineering.
Nakamochi takes on the challenge to make such nodes usable to a broader audience.
Just like a coffee maker or a microwave oven, we believe anyone should be able
to run a node at home and reach 100% privacy and independence. Running one's own
full node also helps the whole Bitcoin network to remain decentralized.
[SPV]: https://developer.bitcoin.org/devguide/operating_modes.html#simplified-payment-verification-spv
[full node]: https://bitcoin.org/en/full-node#what-is-a-full-node
[hardware wallets]: https://bitcoin.org/en/wallets/hardware/
## The name
The name "nakamochi" comes from putting together [Satoshi Nakamoto], the founder
of Bitcoin, and a
[famous Japanese handheld digital pet](https://en.wikipedia.org/wiki/Tamagotchi)
to emphasize personal, self-hosting.
[Satoshi Nakamoto]: https://en.bitcoin.it/wiki/Satoshi_Nakamoto
## Editions
The following editions are listed in an order of increasing ease of use.
It is always a trade-off between the costs and effort oneself has to put
in and the trust into the manufacturing companies and their supply chain.
<div class="text-media-card">
<div class="card-text">
All the editions have something in common: the touch screen user interface and
automated system updates. Even at a high level of distrust one can still benefit
from the open source software and, equally important, system updates.
</div>
<figure class="card-media screenshot">
<img src="/assets/ngui-screenshot.png" alt="nakamochi touchscreen GUI screenshot">
<figcaption>nakamochi touchscreen GUI screenshot</figcaption>
</figure>
</div>
### DIY
<div class="text-media-card">
<div class="card-text">
The [DIY version](https://git.qcode.ch/nakamochi/3d#diy-version-fff) is designed using
only off-the-shelf hardware components and 3D printed parts. It is a running system
and you can source and even replace the hardware. Everything is open source and freely
accessible for everyone. You can of course buy the whole kit from us to make things easier.
Enjoy checking out the source code, CAD designs and schematics. You can tinker here, just
be sure that the device still works after that.
</div>
<figure class="card-media bogen">
<img src="/assets/diy-assembly.png" alt="DIY version assembly">
<figcaption>DIY version assembly</figcaption>
</figure>
</div>
### DIY+
<div class="text-media-card">
<div class="card-text">
If you want to profit from some product engineering but still want to use
off-the-shelf components, we recommend the DIY+ version. As the name tells,
the "plus" in this version improves some characteristics of the device.
For example, the previous DIY version may suffer from overheating in certain
conditions. This edition improves heat dissipation while keeping the device
completely silent, fanless.
However, this edition still requires technical knowledge in CNC machining
and 3D printing.
</div>
<div class="card-media">
<figure class="bogen">
<img src="/assets/diyplus-assembly.png" alt="DIY+ version assembly">
<figcaption>DIY+ version assembly</figcaption>
</figure>
<figure>
<img src="/assets/ir1166.jpg" alt="DIY+ heat dissipation">
<figcaption>DIY+ heat dissipation during initial block download</figcaption>
</figure>
</div>
</div>
### PRO
<div class="text-media-card">
<div class="card-text">
If you are mostly interested in the freedom of the Bitcoin Standard, helping
the Bitcon network to remain decentralized, and want a device that just works
without a DIY-like technical knowledge in hardware design and software engineering,
the PRO edition is the one for you.
We are taking all the knowledge and learnings from the DIY versions and designing
most of the parts ourselves here: from mechanical parts and enclosure to PCBs for
an optimal device solution where hardware and software work very well together.
All of the work is open source.
The PRO edition is still work-in-progress.
</div>
<figure class="card-media bogen">
<img src="/assets/pro-question-mark.png" alt="PRO version in progress">
<figcaption>PRO version in progress</figcaption>
</figure>
</div>

@ -0,0 +1,21 @@
---
title: "who we are"
---
<figure class="qlogo"><img src="/assets/qeles-logo.png" alt="qeles AG logo"></figure>
We as [qeles AG] have many years of experience in manufacturing PCBs and
hardware assembly. We want to use this knowledge to start a bottom up
approach to a concept that has mainly moved in the software world. Designing
and manufacturing a secure device, starting at the hardware level, allows
us to keep a large part of the supply chain and the manufacturing as secure
as possible in an open source device.
Knowing the manufacturing processes, bringing a portfolio of products to the
market to cater for all freedom and contribution levels and assuring security,
we believe we can offer a product for many participants.
We value privacy and security. We will use our knowledge in this field to help
people in achieving complete financial sovereignty and independence.
[qeles AG]: https://qeles.ch/

@ -0,0 +1,56 @@
---
title: "design and code sources"
---
All the designs and software source code are located on our self-hosted
git repositories at [git.qcode.ch/nakamochi/](https://git.qcode.ch/nakamochi/).
We also mirror them on GitHub at [github.com/nakamochi/](https://github.com/nakamochi/)
for redundancy, broader awareness and to ease contributions.
Our self-hosted git repositories accept issues and code changes only from
existing accounts, and creating new accounts feature is disabled: we'd like
to avoid potential abuse. Nonetheless, we will happily take in any suggestions
on the GitHub mirrors.
The following are the main repositories where the development is done.
## NDG
Nakamochi daemon and GUI, the main software part. It is composed of two layers:
a background daemon and a touch-capable GUI interface.
- repository: [git.qcode.ch/nakamochi/ndg](https://git.qcode.ch/nakamochi/ndg)
- mirror: [github.com/nakamochi/ndg](https://github.com/nakamochi/ndg)
{{ screenshot(src="/assets/ngui-screenshot.png", caption="nakamochi touchscreen GUI screenshot") }}
## 3D
CAD designs of enclosures and other related mechanical parts.
- repository: [git.qcode.ch/nakamochi/3d](https://git.qcode.ch/nakamochi/3d)
- mirror: [github.com/nakamochi/3d](https://github.com/nakamochi/3d)
{{ screenshot(src="/assets/git-3d-screenshot.png", caption="nakamochi touchscreen GUI screenshot") }}
## sysupdates
Operating system tweaks and automated updates. All nodes fetch and install updates
from this repository.
- repository: [git.qcode.ch/nakamochi/sysupdates](https://git.qcode.ch/nakamochi/sysupdates)
- mirror: [github.com/nakamochi/sysupdates](https://github.com/nakamochi/sysupdates)
## PCB
<div class="text-media-card">
<div class="card-text">
PRO version custom board hardware designs. This is still upcoming. We will add links here
as soon as the repository is live.
</div>
<figure class="card-media">
<img src="/assets/pro-question-mark.png" alt="PRO version in progress">
</figure>
</div>

@ -0,0 +1,65 @@
// navy-grey
$grey-hue: 205 !default;
$grey-50: hsl($grey-hue, 20%, 94%) !default;
$grey-100: hsl($grey-hue, 18%, 86%) !default;
$grey-200: hsl($grey-hue, 16%, 77%) !default;
$grey-300: hsl($grey-hue, 14%, 68%) !default;
$grey-400: hsl($grey-hue, 12%, 59%) !default;
$grey-500: hsl($grey-hue, 10%, 50%) !default;
$grey-600: hsl($grey-hue, 15%, 41%) !default;
$grey-700: hsl($grey-hue, 20%, 32%) !default;
$grey-800: hsl($grey-hue, 25%, 23%) !default;
$grey-900: hsl($grey-hue, 30%, 15%) !default;
// light blue
$primary-hue: 195 !default;
$primary-50: hsl($primary-hue, 90%, 94%) !default;
$primary-100: hsl($primary-hue, 88%, 86%) !default;
$primary-200: hsl($primary-hue, 86%, 77%) !default;
$primary-300: hsl($primary-hue, 84%, 68%) !default;
$primary-400: hsl($primary-hue, 82%, 59%) !default;
$primary-500: hsl($primary-hue, 80%, 50%) !default;
$primary-600: hsl($primary-hue, 85%, 41%) !default;
$primary-700: hsl($primary-hue, 90%, 32%) !default;
$primary-800: hsl($primary-hue, 95%, 23%) !default;
$primary-900: hsl($primary-hue, 100%, 15%) !default;
// black & white
$black: #000 !default;
$white: #fff !default;
// amber
$amber-50: #fff8e1 !default;
$amber-100: #ffecb3 !default;
$amber-200: #ffe082 !default;
$amber-300: #ffd54f !default;
$amber-400: #ffca28 !default;
$amber-500: #ffc107 !default;
$amber-600: #ffb300 !default;
$amber-700: #ffa000 !default;
$amber-800: #ff8f00 !default;
$amber-900: #ff6f00 !default;
// green
$green-50: #e8f5e9 !default;
$green-100: #c8e6c9 !default;
$green-200: #a5d6a7 !default;
$green-300: #81c784 !default;
$green-400: #66bb6a !default;
$green-500: #4caf50 !default;
$green-600: #43a047 !default;
$green-700: #388e3c !default;
$green-800: #2e7d32 !default;
$green-900: #1b5e20 !default;
// red
$red-50: #ffebee !default;
$red-100: #ffcdd2 !default;
$red-200: #ef9a9a !default;
$red-300: #e57373 !default;
$red-400: #ef5350 !default;
$red-500: #f44336 !default;
$red-600: #e53935 !default;
$red-700: #d32f2f !default;
$red-800: #c62828 !default;
$red-900: #b71c1c !default;

@ -0,0 +1,188 @@
@import "_pico/variables"; // for $breakpoints
@import "colors";
@font-face {
font-family: "courier prime code";
src: url("/assets/courierprimecode.woff2") format('woff2'),
url("/assets/courierprimecode.woff") format('woff');
font-weight: normal;
font-style: normal;
}
@media (min-width: map-get($breakpoints, "md")) and (prefers-color-scheme: light) {
.bg-landing {
background-image: url("/assets/bg-landing-light.svg");
background-size: contain;
background-position: top;
}
}
@media (min-width: map-get($breakpoints, "md")) and (prefers-color-scheme: dark) {
.bg-landing {
background-image: url("/assets/bg-landing-dark.svg");
background-size: contain;
background-position: top;
}
}
/*****************************
* language translation picker
*/
.langpicker {
text-align: right;
}
ul.translist {
display: inline-block;
margin: 0;
padding: 0;
list-style: none;
}
ul.translist > li {
font-size: 0.75em;
color: var(--muted-color);
display: inline-block;
padding: var(--nav-element-spacing-vertical) var(--nav-element-spacing-horizontal);
}
/*************************
* main logo in the header
*/
.logonav {
align-items: flex-start;
}
ul.logonav > li {
padding-top: 0;
}
.logo img {
width: 64px;
min-width: 64px;
}
.logo.landing img {
width: 128px;
min-width: 128px;
}
@media (max-width: map-get($breakpoints, "sm")) {
.logo-name {
display: none;
}
}
.mainnav {
align-items: flex-start;
align-content: flex-start;
flex-flow: row wrap;
column-gap: 5px;
}
ul.mainnav > li {
padding-top: 0;
padding-bottom: 0;
}
/* other large-sized logos in the <main> content */
@media (min-width: map-get($breakpoints, "md")) {
.qlogo {
max-width: 500px;
}
}
/********************************************
* random styles used anywhere and everywhere
*/
.top {
padding-top: 0;
}
/* top corners rounded; typically applied to images to resemble a bit
* nakamochi enclosure shape */
.bogen {
border-radius: 10px 10px 0 0;
}
/* useful for notes in footer */
.muted {
color: var(--muted-color);
}
figure.screenshot > img, img.screenshot {
border: 1px solid $grey-700;
}
h1 {
line-height: 1;
}
/**********************************************************************
* media cards have text and images or videos on a side, left or right.
* on small screens, the flow is typically in a column.
* on larger screens, media is displayed on a side along the text.
*/
/* text first, media on the right or the opposite */
.text-media-card {
display: flex;
flex-flow: row wrap;
align-items: flex-start;
}
/* place media captions closer and smaller than usual */
.card-media figcaption {
font-size: 0.75em;
}
/* align in-text header with the image part of the card */
.card-text h2:first-child,
.card-text h3:first-child,
.card-text h4:first-child {
line-height: 1;
margin-bottom: 1rem;
}
/* breakpoint at which media is placed on a side along the text. */
@media (min-width: map-get($breakpoints, "md")) {
.text-media-card {
flex-flow: row nowrap;
column-gap: 10px;
}
.text-media-card > .card-text {
flex-grow: 1
}
.text-media-card > .card-media {
flex-grow: 0;
flex-shrink: 0;
width: 200px;
}
}
@media (min-width: map-get($breakpoints, "lg")) {
.text-media-card {
column-gap: 20px;
}
.text-media-card > .card-media {
width: 300px;
}
}
@media (min-width: map-get($breakpoints, "xl")) {
.text-media-card > .card-media {
width: 350px;
}
}
/*************************************
* footer and other end-of-page styles
*/
footer {
line-height: 1;
}
footer nav [role=icon] {
width: 32px;
}

@ -0,0 +1,57 @@
@import "_pico/variables";
@import "colors";
// commons styles
@import "picostyle";
// light theme by default; can be forced with data-theme="light"
@import "picolight";
// dark theme; automatically enabled if user has dark mode enabled
@import "picodark";
@media only screen and (prefers-color-scheme: dark) {
:root:not([data-theme]) {
@include dark;
}
}
// dark theme forced with with data-theme="dark"
[data-theme="dark"] {
@include dark;
}
// accent-color
progress,
[type="checkbox"],
[type="radio"],
[type="range"] {
accent-color: var(--primary);
}
@import "_pico/layout/document"; // html
@import "_pico/layout/sectioning"; // body, header, main, footer
@import "_pico/layout/container"; // .container, .container-fluid
@import "_pico/layout/section"; // section
@import "_pico/layout/grid"; // .grid
@import "_pico/layout/scroller"; // figure
@import "_pico/content/typography"; // a, headings, p, ul, blockquote, ...
@import "_pico/content/embedded"; // audio, canvas, iframe, img, svg, video
@import "_pico/content/button"; // button, a[role=button], type=button, type=submit ...
//@import "_pico/content/form"; // input, select, textarea, label, fieldset, legend
//@import "_pico/content/form-checkbox-radio"; // type=checkbox, type=radio, role=switch
//@import "_pico/content/form-alt-input-types"; // type=color, type=date, type=file, type=search, ...
@import "_pico/content/table"; // table, tr, td, ...
@import "_pico/content/code"; // pre, code, ...
@import "_pico/content/miscs"; // hr, template, [hidden], dialog, canvas
@import "_pico/components/accordion"; // details, summary
@import "_pico/components/card"; // article
//@import "_pico/components/modal"; // dialog
@import "_pico/components/nav"; // nav
//@import "_pico/components/progress"; // progress
//@import "_pico/components/dropdown"; // dropdown
@import "_pico/utilities/loading"; // aria-busy=true
@import "_pico/utilities/tooltip"; // data-tooltip
@import "_pico/utilities/accessibility"; // -ms-touch-action, aria-*
@import "_pico/utilities/reduce-motion"; // prefers-reduced-motion

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019-2023 Pico
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -0,0 +1,4 @@
// Output color in RGB format
@function to-rgb($color) {
@return unquote("rgb(#{red($color)}, #{green($color)}, #{blue($color)})");
}

@ -0,0 +1,69 @@
// Config
//
// Set the root element for $enable-semantic-container and $enable-responsive-spacings
$semantic-root-element: "body" !default;
// Enable <header>, <main>, <footer> inside $semantic-root-element as containers
$enable-semantic-container: false !default;
// Enable .container and .container-fluid
$enable-class-container: true !default;
// Enable a centered viewport for <header>, <main>, <footer> inside $enable-semantic-container
// Fluid layout if disabled
$enable-viewport: true !default;
// Enable responsive spacings for <header>, <main>, <footer>, <section>, <article>
// Fixed spacings if disabled
$enable-responsive-spacings: true !default;
// Enable responsive typography
// Fixed root element size if disabled
$enable-responsive-typography: true !default;
// Enable .classes
// .classless version if disabled
$enable-classes: true !default;
// Enable .grid class
$enable-grid: true !default;
// Enable transitions
$enable-transitions: true !default;
// Enable overriding with !important
$enable-important: true !default;
// Responsive
//
// xs: Extra small (portrait phones)
// sm: Small(landscape phones)
// md: Medium(tablets)
// lg: Large(desktops)
// xl: Extra large (large desktops)
// NOTE:
// To provide an easy and fine styling on each breakpoint
// we didn't use @each, @mixin or @include.
// That means you need to edit each CSS selector file to add a breakpoint
// Breakpoints
// 'null' disable the breakpoint
$breakpoints: (
xs: 0,
sm: 576px,
md: 768px,
lg: 992px,
xl: 1200px,
) !default;
// Viewports
$viewports: (
// 'null' disable the viewport on a breakpoint
sm: 510px,
md: 700px,
lg: 920px,
xl: 1130px
) !default;

@ -0,0 +1,116 @@
/**
* Accordion (<details>)
*/
details {
display: block;
margin-bottom: var(--spacing);
padding-bottom: var(--spacing);
border-bottom: var(--border-width) solid var(--accordion-border-color);
summary {
line-height: 1rem;
list-style-type: none;
cursor: pointer;
&:not([role]) {
color: var(--accordion-close-summary-color);
}
@if $enable-transitions {
transition: color var(--transition);
}
// Reset marker
&::-webkit-details-marker {
display: none;
}
&::marker {
display: none;
}
&::-moz-list-bullet {
list-style-type: none;
}
// Marker
&::after {
display: block;
width: 1rem;
height: 1rem;
margin-inline-start: calc(var(--spacing, 1rem) * 0.5);
float: right;
transform: rotate(-90deg);
background-image: var(--icon-chevron);
background-position: right center;
background-size: 1rem auto;
background-repeat: no-repeat;
content: "";
@if $enable-transitions {
transition: transform var(--transition);
}
}
&:focus {
outline: none;
&:not([role="button"]) {
color: var(--accordion-active-summary-color);
}
}
// Type button
&[role="button"] {
width: 100%;
text-align: left;
// Marker
&::after {
height: calc(1rem * var(--line-height, 1.5));
background-image: var(--icon-chevron-button);
}
@if $enable-classes {
// .contrast
&:not(.outline).contrast {
// Marker
&::after {
background-image: var(--icon-chevron-button-inverse);
}
}
}
}
}
// Open
&[open] {
> summary {
margin-bottom: calc(var(--spacing));
&:not([role]) {
&:not(:focus) {
color: var(--accordion-open-summary-color);
}
}
&::after {
transform: rotate(0);
}
}
}
}
[dir="rtl"] {
details {
summary {
text-align: right;
&::after {
float: left;
background-position: left center;
}
}
}
}

@ -0,0 +1,36 @@
/**
* Card (<article>)
*/
article {
margin: var(--block-spacing-vertical) 0;
padding: var(--block-spacing-vertical) var(--block-spacing-horizontal);
border-radius: var(--border-radius);
background: var(--card-background-color);
box-shadow: var(--card-box-shadow);
> header,
> footer {
margin-right: calc(var(--block-spacing-horizontal) * -1);
margin-left: calc(var(--block-spacing-horizontal) * -1);
padding: calc(var(--block-spacing-vertical) * 0.66)
var(--block-spacing-horizontal);
background-color: var(--card-sectionning-background-color);
}
> header {
margin-top: calc(var(--block-spacing-vertical) * -1);
margin-bottom: var(--block-spacing-vertical);
border-bottom: var(--border-width) solid var(--card-border-color);
border-top-right-radius: var(--border-radius);
border-top-left-radius: var(--border-radius);
}
> footer {
margin-top: var(--block-spacing-vertical);
margin-bottom: calc(var(--block-spacing-vertical) * -1);
border-top: var(--border-width) solid var(--card-border-color);
border-bottom-right-radius: var(--border-radius);
border-bottom-left-radius: var(--border-radius);
}
}

@ -0,0 +1,213 @@
/**
* Dropdown ([role="list"])
*/
// Menu
details[role="list"],
li[role="list"] {
position: relative;
}
details[role="list"] summary + ul,
li[role="list"] > ul {
display: flex;
z-index: 99;
position: absolute;
top: auto;
right: 0;
left: 0;
flex-direction: column;
margin: 0;
padding: 0;
border: var(--border-width) solid var(--dropdown-border-color);
border-radius: var(--border-radius);
border-top-right-radius: 0;
border-top-left-radius: 0;
background-color: var(--dropdown-background-color);
box-shadow: var(--card-box-shadow);
color: var(--dropdown-color);
white-space: nowrap;
li {
width: 100%;
margin-bottom: 0;
padding: calc(var(--form-element-spacing-vertical) * 0.5)
var(--form-element-spacing-horizontal);
list-style: none;
&:first-of-type {
margin-top: calc(var(--form-element-spacing-vertical) * 0.5);
}
&:last-of-type {
margin-bottom: calc(var(--form-element-spacing-vertical) * 0.5);
}
a {
display: block;
margin: calc(var(--form-element-spacing-vertical) * -0.5)
calc(var(--form-element-spacing-horizontal) * -1);
padding: calc(var(--form-element-spacing-vertical) * 0.5)
var(--form-element-spacing-horizontal);
overflow: hidden;
color: var(--dropdown-color);
text-decoration: none;
text-overflow: ellipsis;
&:hover {
background-color: var(--dropdown-hover-background-color);
}
}
}
}
// Marker
details[role="list"] summary,
li[role="list"] > a {
&::after {
display: block;
width: 1rem;
height: calc(1rem * var(--line-height, 1.5));
margin-inline-start: 0.5rem;
float: right;
transform: rotate(0deg);
background-position: right center;
background-size: 1rem auto;
background-repeat: no-repeat;
content: "";
}
}
// Global dropdown only
details[role="list"] {
padding: 0;
border-bottom: none;
// Style <summary> as <select>
summary {
margin-bottom: 0;
&:not([role]) {
height: calc(
1rem * var(--line-height) + var(--form-element-spacing-vertical) * 2 +
var(--border-width) * 2
);
padding: var(--form-element-spacing-vertical)
var(--form-element-spacing-horizontal);
border: var(--border-width) solid var(--form-element-border-color);
border-radius: var(--border-radius);
background-color: var(--form-element-background-color);
color: var(--form-element-placeholder-color);
line-height: inherit;
cursor: pointer;
@if $enable-transitions {
transition: background-color var(--transition),
border-color var(--transition), color var(--transition),
box-shadow var(--transition);
}
&:active,
&:focus {
border-color: var(--form-element-active-border-color);
background-color: var(--form-element-active-background-color);
}
&:focus {
box-shadow: 0 0 0 var(--outline-width) var(--form-element-focus-color);
}
}
}
// Close for details[role="list"]
&[open] summary {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
&::before {
display: block;
z-index: 1;
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: none;
content: "";
cursor: default;
}
}
}
// All Dropdowns inside <nav>
nav details[role="list"] summary,
nav li[role="list"] a {
display: flex;
direction: ltr;
}
nav details[role="list"] summary + ul,
nav li[role="list"] > ul {
min-width: fit-content;
border-radius: var(--border-radius);
li a {
border-radius: 0;
}
}
// Dropdowns inside <nav> as nested <details>
nav details[role="list"] {
summary,
summary:not([role]) {
height: auto;
padding: var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal);
}
&[open] summary {
border-radius: var(--border-radius);
}
summary + ul {
margin-top: var(--outline-width);
margin-inline-start: 0;
}
summary[role="link"] {
margin-bottom: calc(var(--nav-link-spacing-vertical) * -1);
line-height: var(--line-height);
+ ul {
margin-top: calc(var(--nav-link-spacing-vertical) + var(--outline-width));
margin-inline-start: calc(var(--nav-link-spacing-horizontal) * -1);
}
}
}
// Dropdowns inside a <nav> without using <details>
li[role="list"] {
// Open on hover (for mobile)
// or on active/focus (for keyboard navigation)
&:hover > ul,
a:active ~ ul,
a:focus ~ ul {
display: flex;
}
> ul {
display: none;
margin-top: calc(var(--nav-link-spacing-vertical) + var(--outline-width));
margin-inline-start: calc(
var(--nav-element-spacing-horizontal) - var(--nav-link-spacing-horizontal)
);
}
> a::after {
background-image: var(--icon-chevron);
}
}
label > details[role="list"] {
margin-top: calc(var(--spacing) * .25);
margin-bottom: var(--spacing);
}

@ -0,0 +1,169 @@
/**
* Modal (<dialog>)
*/
:root {
--scrollbar-width: 0px;
}
dialog {
display: flex;
z-index: 999;
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
align-items: center;
justify-content: center;
width: inherit;
min-width: 100%;
height: inherit;
min-height: 100%;
padding: var(--spacing);
border: 0;
backdrop-filter: var(--modal-overlay-backdrop-filter);
background-color: var(--modal-overlay-background-color);
color: var(--color);
// Content
article {
max-height: calc(100vh - var(--spacing) * 2);
overflow: auto;
@if map-get($breakpoints, "sm") {
@media (min-width: map-get($breakpoints, "sm")) {
max-width: map-get($viewports, "sm");
}
}
@if map-get($breakpoints, "md") {
@media (min-width: map-get($breakpoints, "md")) {
max-width: map-get($viewports, "md");
}
}
> header,
> footer {
padding: calc(var(--block-spacing-vertical) * 0.5)
var(--block-spacing-horizontal);
}
> header {
.close {
margin: 0;
margin-left: var(--spacing);
float: right;
}
}
> footer {
text-align: right;
[role="button"] {
margin-bottom: 0;
&:not(:first-of-type) {
margin-left: calc(var(--spacing) * 0.5);
}
}
}
p {
&:last-of-type {
margin: 0;
}
}
// Close icon
@if $enable-classes {
.close {
display: block;
width: 1rem;
height: 1rem;
margin-top: calc(var(--block-spacing-vertical) * -0.5);
margin-bottom: var(--typography-spacing-vertical);
margin-left: auto;
background-image: var(--icon-close);
background-position: center;
background-size: auto 1rem;
background-repeat: no-repeat;
opacity: 0.5;
@if $enable-transitions {
transition: opacity var(--transition);
}
&:is([aria-current], :hover, :active, :focus) {
opacity: 1;
}
}
}
}
// Closed state
&:not([open]),
&[open="false"] {
display: none;
}
}
// Utilities
@if $enable-classes {
.modal-is-open {
padding-right: var(--scrollbar-width, 0px);
overflow: hidden;
pointer-events: none;
touch-action: none;
dialog {
pointer-events: auto;
}
}
}
// Animations
@if ($enable-classes and $enable-transitions) {
$animation-duration: 0.2s;
:where(.modal-is-opening, .modal-is-closing) {
dialog,
dialog > article {
animation-duration: $animation-duration;
animation-timing-function: ease-in-out;
animation-fill-mode: both;
}
dialog {
animation-duration: ($animation-duration * 4);
animation-name: modal-overlay ;
> article {
animation-delay: $animation-duration;
animation-name: modal;
}
}
}
.modal-is-closing {
dialog,
dialog > article {
animation-delay: 0s;
animation-direction: reverse;
}
}
@keyframes modal-overlay {
from {
backdrop-filter: none;
background-color: transparent;
}
}
@keyframes modal {
from {
transform: translateY(-100%);
opacity: 0;
}
}
}

@ -0,0 +1,141 @@
/**
* Nav
*/
// Reboot based on :
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
// Prevent VoiceOver from ignoring list semantics in Safari (opinionated)
:where(nav li)::before {
float: left;
content: "\200B";
}
// Pico
//
// Horizontal Nav
nav,
nav ul {
display: flex;
}
nav {
justify-content: space-between;
ol,
ul {
align-items: center;
margin-bottom: 0;
padding: 0;
list-style: none;
&:first-of-type {
margin-left: calc(var(--nav-element-spacing-horizontal) * -1);
}
&:last-of-type {
margin-right: calc(var(--nav-element-spacing-horizontal) * -1);
}
}
li {
display: inline-block;
margin: 0;
padding: var(--nav-element-spacing-vertical)
var(--nav-element-spacing-horizontal);
// Minimal support for buttons and forms elements
> * {
--spacing: 0;
}
}
:where(a, [role="link"]) {
display: inline-block;
margin: calc(var(--nav-link-spacing-vertical) * -1)
calc(var(--nav-link-spacing-horizontal) * -1);
padding: var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal);
border-radius: var(--border-radius);
text-decoration: none;
&:is([aria-current], :hover, :active, :focus) {
text-decoration: none;
}
}
// Breadcrumb
&[aria-label="breadcrumb"] {
align-items: center;
justify-content: start;
& ul li {
&:not(:first-child) {
margin-inline-start: var(--nav-link-spacing-horizontal);
}
&:not(:last-child) {
::after {
position: absolute;
width: calc(var(--nav-link-spacing-horizontal) * 2);
margin-inline-start: calc(var(--nav-link-spacing-horizontal) / 2);
content: "/";
color: var(--muted-color);
text-align: center;
}
}
}
& a[aria-current] {
background-color: transparent;
color: inherit;
text-decoration: none;
pointer-events: none;
}
}
// Minimal support for role="button"
[role="button"] {
margin-right: inherit;
margin-left: inherit;
padding: var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal);
}
}
// Vertical Nav
aside {
nav,
ol,
ul,
li {
display: block;
}
li {
padding: calc(var(--nav-element-spacing-vertical) * 0.5)
var(--nav-element-spacing-horizontal);
a {
display: block;
}
// Minimal support for links as buttons
[role="button"] {
margin: inherit;
}
}
}
// Breadcrumb RTL
[dir="rtl"] {
nav {
&[aria-label="breadcrumb"] {
& ul li {
&:not(:last-child) {
::after {
content: "\\";
}
}
}
}
}
}

@ -0,0 +1,89 @@
/**
* Progress
*/
// Reboot based on :
// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
//
// 1. Add the correct display in Edge 18- and IE
// 2. Add the correct vertical alignment in Chrome, Edge, and Firefox
progress {
display: inline-block; // 1
vertical-align: baseline; // 2
}
// Pico
//
progress {
// Reset the default appearance
-webkit-appearance: none;
-moz-appearance: none;
// Styles
display: inline-block;
appearance: none;
width: 100%;
height: 0.5rem;
margin-bottom: calc(var(--spacing) * 0.5);
overflow: hidden;
// Remove Firefox and Opera border
border: 0;
border-radius: var(--border-radius);
background-color: var(--progress-background-color);
// IE10 uses `color` to set the bar background-color
color: var(--progress-color);
&::-webkit-progress-bar {
border-radius: var(--border-radius);
background: none;
}
&[value]::-webkit-progress-value {
background-color: var(--progress-color);
}
&::-moz-progress-bar {
background-color: var(--progress-color);
}
// Indeterminate state
@media (prefers-reduced-motion: no-preference) {
&:indeterminate {
background: var(--progress-background-color)
linear-gradient(
to right,
var(--progress-color) 30%,
var(--progress-background-color) 30%
)
top left / 150% 150% no-repeat;
animation: progress-indeterminate 1s linear infinite;
&[value]::-webkit-progress-value {
background-color: transparent;
}
&::-moz-progress-bar {
background-color: transparent;
}
}
}
}
[dir="rtl"] {
@media (prefers-reduced-motion: no-preference) {
progress:indeterminate {
animation-direction: reverse;
}
}
}
@keyframes progress-indeterminate {
0% {
background-position: 200% 0;
}
100% {
background-position: -200% 0;
}
}

@ -0,0 +1,183 @@
/**
* Button
*/
// Reboot based on :
// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
//
// 1. Change the font styles in all browsers
// 2. Remove the margin on controls in Safari
// 3. Show the overflow in Edge
button {
margin: 0; // 2
overflow: visible; // 3
font-family: inherit; // 1
text-transform: none; // 1
}
// Correct the inability to style buttons in iOS and Safari
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
// Pico
//
button {
display: block;
width: 100%;
margin-bottom: var(--spacing);
}
[role="button"] {
display: inline-block;
text-decoration: none;
}
button,
input[type="submit"],
input[type="button"],
input[type="reset"],
[role="button"] {
--background-color: var(--primary);
--border-color: var(--primary);
--color: var(--primary-inverse);
--box-shadow: var(--button-box-shadow, 0 0 0 rgba(0, 0, 0, 0));
padding: var(--form-element-spacing-vertical)
var(--form-element-spacing-horizontal);
border: var(--border-width) solid var(--border-color);
border-radius: var(--border-radius);
outline: none;
background-color: var(--background-color);
box-shadow: var(--box-shadow);
color: var(--color);
font-weight: var(--font-weight);
font-size: 1rem;
line-height: var(--line-height);
text-align: center;
cursor: pointer;
@if $enable-transitions {
transition: background-color var(--transition),
border-color var(--transition), color var(--transition),
box-shadow var(--transition);
}
&:is([aria-current], :hover, :active, :focus) {
--background-color: var(--primary-hover);
--border-color: var(--primary-hover);
--box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0));
--color: var(--primary-inverse);
}
&:focus {
--box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),
0 0 0 var(--outline-width) var(--primary-focus);
}
}
// .secondary, .contrast & .outline
@if $enable-classes {
// Secondary
:is(button, input[type="submit"], input[type="button"], [role="button"]).secondary,
input[type="reset"] {
--background-color: var(--secondary);
--border-color: var(--secondary);
--color: var(--secondary-inverse);
cursor: pointer;
&:is([aria-current], :hover, :active, :focus) {
--background-color: var(--secondary-hover);
--border-color: var(--secondary-hover);
--color: var(--secondary-inverse);
}
&:focus {
--box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),
0 0 0 var(--outline-width) var(--secondary-focus);
}
}
// Contrast
:is(button, input[type="submit"], input[type="button"], [role="button"]).contrast {
--background-color: var(--contrast);
--border-color: var(--contrast);
--color: var(--contrast-inverse);
&:is([aria-current], :hover, :active, :focus) {
--background-color: var(--contrast-hover);
--border-color: var(--contrast-hover);
--color: var(--contrast-inverse);
}
&:focus {
--box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),
0 0 0 var(--outline-width) var(--contrast-focus);
}
}
// Outline (primary)
:is(button, input[type="submit"], input[type="button"], [role="button"]).outline,
input[type="reset"].outline {
--background-color: transparent;
--color: var(--primary);
&:is([aria-current], :hover, :active, :focus) {
--background-color: transparent;
--color: var(--primary-hover);
}
}
// Outline (secondary)
:is(button, input[type="submit"], input[type="button"], [role="button"]).outline.secondary,
input[type="reset"].outline {
--color: var(--secondary);
&:is([aria-current], :hover, :active, :focus) {
--color: var(--secondary-hover);
}
}
// Outline (contrast)
:is(button, input[type="submit"], input[type="button"], [role="button"]).outline.contrast {
--color: var(--contrast);
&:is([aria-current], :hover, :active, :focus) {
--color: var(--contrast-hover);
}
}
}
@else {
// Secondary button without .class
input[type="reset"] {
--background-color: var(--secondary);
--border-color: var(--secondary);
--color: var(--secondary-inverse);
cursor: pointer;
&:is([aria-current], :hover, :active, :focus) {
--background-color: var(--secondary-hover);
--border-color: var(--secondary-hover);
}
&:focus {
--box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),
0 0 0 var(--outline-width) var(--secondary-focus);
}
}
}
// Button [disabled]
// Links without href are disabled by default
:where(button, [type="submit"], [type="button"], [type="reset"], [role="button"])[disabled],
:where(fieldset[disabled]) :is(button, [type="submit"], [type="button"], [type="reset"], [role="button"]),
a[role="button"]:not([href]) {
opacity: 0.5;
pointer-events: none;
}

@ -0,0 +1,91 @@
/**
* Code
*/
// Reboot based on :
// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
//
// 1. Correct the inheritance and scaling of font size in all browsers
// 2. Correct the odd `em` font sizing in all browsers
pre,
code,
kbd,
samp {
font-size: 0.875em; // 2
font-family: var(--font-family); // 1
}
// Prevent overflow of the container in all browsers (opinionated)
pre {
-ms-overflow-style: scrollbar;
overflow: auto;
}
// Pico
//
pre,
code,
kbd {
border-radius: var(--border-radius);
background: var(--code-background-color);
color: var(--code-color);
font-weight: var(--font-weight);
line-height: initial;
}
code,
kbd {
display: inline-block;
padding: 0.375rem 0.5rem;
}
pre {
display: block;
margin-bottom: var(--spacing);
overflow-x: auto;
> code {
display: block;
padding: var(--spacing);
background: none;
font-size: 14px;
line-height: var(--line-height);
}
}
// Code Syntax
code {
// Tags
b {
color: var(--code-tag-color);
font-weight: var(--font-weight);
}
// Properties
i {
color: var(--code-property-color);
font-style: normal;
}
// Values
u {
color: var(--code-value-color);
text-decoration: none;
}
// Comments
em {
color: var(--code-comment-color);
font-style: normal;
}
}
// kbd
kbd {
background-color: var(--code-kbd-background-color);
color: var(--code-kbd-color);
vertical-align: baseline;
}

@ -0,0 +1,48 @@
/**
* Embedded content
*/
// Reboot based on :
// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
//
// Change the alignment on media elements in all browsers (opinionated)
:where(audio, canvas, iframe, img, svg, video) {
vertical-align: middle;
}
// Add the correct display in IE 9-
audio,
video {
display: inline-block;
}
// Add the correct display in iOS 4-7
audio:not([controls]) {
display: none;
height: 0;
}
// Remove the border on iframes in all browsers (opinionated)
:where(iframe) {
border-style: none;
}
// 1. Remove the border on images inside links in IE 10.
// 2. Responsive by default
img {
max-width: 100%; // 2
height: auto; // 2
border-style: none; // 1
}
// Change the fill color to match the text color in all browsers (opinionated)
:where(svg:not([fill])) {
fill: currentColor;
}
// Hide the overflow in IE
svg:not(:root) {
overflow: hidden;
}

@ -0,0 +1,272 @@
/**
* Form elements
* Alternatives input types (Not Checkboxes & Radios)
*/
// Color
[type="color"] {
// Wrapper
@mixin color-wrapper {
padding: 0;
}
&::-webkit-color-swatch-wrapper {
@include color-wrapper;
}
&::-moz-focus-inner {
@include color-wrapper;
}
// Swatch
@mixin color-swatch {
border: 0;
border-radius: calc(var(--border-radius) * 0.5);
}
&::-webkit-color-swatch {
@include color-swatch;
}
&::-moz-color-swatch {
@include color-swatch;
}
}
// Date & Time
// :not() are needed to add Specificity and avoid !important on padding
input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]) {
&:is([type="date"], [type="datetime-local"], [type="month"], [type="time"], [type="week"]) {
--icon-position: 0.75rem;
--icon-width: 1rem;
padding-right: calc(var(--icon-width) + var(--icon-position));
background-image: var(--icon-date);
background-position: center right var(--icon-position);
background-size: var(--icon-width) auto;
background-repeat: no-repeat;
}
// Time
&[type="time"] {
background-image: var(--icon-time);
}
}
// Calendar picker
[type="date"],
[type="datetime-local"],
[type="month"],
[type="time"],
[type="week"] {
&::-webkit-calendar-picker-indicator {
width: var(--icon-width);
margin-right: calc(var(--icon-width) * -1);
margin-left: var(--icon-position);
opacity: 0;
}
}
[dir="rtl"]
:is([type="date"], [type="datetime-local"], [type="month"], [type="time"], [type="week"]) {
text-align: right;
}
// File
[type="file"] {
--color: var(--muted-color);
padding: calc(var(--form-element-spacing-vertical) * 0.5) 0;
border: 0;
border-radius: 0;
background: none;
@mixin file-selector-button {
--background-color: var(--secondary);
--border-color: var(--secondary);
--color: var(--secondary-inverse);
margin-right: calc(var(--spacing) / 2);
margin-left: 0;
margin-inline-start: 0;
margin-inline-end: calc(var(--spacing) / 2);
padding: calc(var(--form-element-spacing-vertical) * 0.5)
calc(var(--form-element-spacing-horizontal) * 0.5);
border: var(--border-width) solid var(--border-color);
border-radius: var(--border-radius);
outline: none;
background-color: var(--background-color);
box-shadow: var(--box-shadow);
color: var(--color);
font-weight: var(--font-weight);
font-size: 1rem;
line-height: var(--line-height);
text-align: center;
cursor: pointer;
@if $enable-transitions {
transition: background-color var(--transition),
border-color var(--transition), color var(--transition),
box-shadow var(--transition);
}
&:is(:hover, :active, :focus) {
--background-color: var(--secondary-hover);
--border-color: var(--secondary-hover);
}
}
&::file-selector-button {
@include file-selector-button;
}
&::-webkit-file-upload-button {
@include file-selector-button;
}
&::-ms-browse {
@include file-selector-button;
}
}
// Range
[type="range"] {
// Config
$height-track: 0.25rem;
$height-thumb: 1.25rem;
$border-thumb: 2px;
// Styles
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
width: 100%;
height: $height-thumb;
background: none;
// Slider Track
@mixin slider-track {
width: 100%;
height: $height-track;
border-radius: var(--border-radius);
background-color: var(--range-border-color);
@if $enable-transitions {
transition: background-color var(--transition),
box-shadow var(--transition);
}
}
&::-webkit-slider-runnable-track {
@include slider-track;
}
&::-moz-range-track {
@include slider-track;
}
&::-ms-track {
@include slider-track;
}
// Slider Thumb
@mixin slider-thumb {
-webkit-appearance: none;
width: $height-thumb;
height: $height-thumb;
margin-top: #{(-($height-thumb * 0.5) + ($height-track * 0.5))};
border: $border-thumb solid var(--range-thumb-border-color);
border-radius: 50%;
background-color: var(--range-thumb-color);
cursor: pointer;
@if $enable-transitions {
transition: background-color var(--transition),
transform var(--transition);
}
}
&::-webkit-slider-thumb {
@include slider-thumb;
}
&::-moz-range-thumb {
@include slider-thumb;
}
&::-ms-thumb {
@include slider-thumb;
}
&:hover,
&:focus {
--range-border-color: var(--range-active-border-color);
--range-thumb-color: var(--range-thumb-hover-color);
}
&:active {
--range-thumb-color: var(--range-thumb-active-color);
// Slider Thumb
&::-webkit-slider-thumb {
transform: scale(1.25);
}
&::-moz-range-thumb {
transform: scale(1.25);
}
&::-ms-thumb {
transform: scale(1.25);
}
}
}
// Search
// :not() are needed to add Specificity and avoid !important on padding
input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]) {
&[type="search"] {
padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem);
border-radius: 5rem;
background-image: var(--icon-search);
background-position: center left 1.125rem;
background-size: 1rem auto;
background-repeat: no-repeat;
&[aria-invalid] {
@if $enable-important {
padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem) !important;
}
@else {
padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem);
}
background-position: center left 1.125rem, center right 0.75rem;
}
&[aria-invalid="false"] {
background-image: var(--icon-search), var(--icon-valid);
}
&[aria-invalid="true"] {
background-image: var(--icon-search), var(--icon-invalid);
}
}
}
// Cancel button
[type="search"] {
&::-webkit-search-cancel-button {
-webkit-appearance: none;
display: none;
}
}
[dir="rtl"] {
:where(input) {
&:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]) {
&[type="search"] {
background-position: center right 1.125rem;
&[aria-invalid] {
background-position: center right 1.125rem, center left 0.75rem;
}
}
}
}
}

@ -0,0 +1,138 @@
/**
* Form elements
* Checkboxes & Radios
*/
[type="checkbox"],
[type="radio"] {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
width: 1.25em;
height: 1.25em;
margin-top: -0.125em;
margin-right: 0.375em;
margin-left: 0;
margin-inline-start: 0;
margin-inline-end: 0.375em;
border-width: var(--border-width);
font-size: inherit;
vertical-align: middle;
cursor: pointer;
&::-ms-check {
display: none; // unstyle IE checkboxes
}
&:checked,
&:checked:active,
&:checked:focus {
--background-color: var(--primary);
--border-color: var(--primary);
background-image: var(--icon-checkbox);
background-position: center;
background-size: 0.75em auto;
background-repeat: no-repeat;
}
& ~ label {
display: inline-block;
margin-right: 0.375em;
margin-bottom: 0;
cursor: pointer;
}
}
// Checkboxes
[type="checkbox"] {
&:indeterminate {
--background-color: var(--primary);
--border-color: var(--primary);
background-image: var(--icon-minus);
background-position: center;
background-size: 0.75em auto;
background-repeat: no-repeat;
}
}
// Radios
[type="radio"] {
border-radius: 50%;
&:checked,
&:checked:active,
&:checked:focus {
--background-color: var(--primary-inverse);
border-width: 0.35em;
background-image: none;
}
}
// Switchs
[type="checkbox"][role="switch"] {
--background-color: var(--switch-background-color);
--border-color: var(--switch-background-color);
--color: var(--switch-color);
// Config
$switch-height: 1.25em;
$switch-width: 2.25em;
$switch-transition: 0.1s ease-in-out;
// Styles
width: $switch-width;
height: $switch-height;
border: var(--border-width) solid var(--border-color);
border-radius: $switch-height;
background-color: var(--background-color);
line-height: $switch-height;
&:focus {
--background-color: var(--switch-background-color);
--border-color: var(--switch-background-color);
}
&:checked {
--background-color: var(--switch-checked-background-color);
--border-color: var(--switch-checked-background-color);
}
&:before {
display: block;
width: calc(#{$switch-height} - (var(--border-width) * 2));
height: 100%;
border-radius: 50%;
background-color: var(--color);
content: "";
@if $enable-transitions {
transition: margin $switch-transition;
}
}
&:checked {
background-image: none;
&::before {
margin-left: calc(#{$switch-width * 0.5} - var(--border-width));
margin-inline-start: calc(#{$switch-width * 0.5} - var(--border-width));
}
}
}
// Aria-invalid
[type="checkbox"],
[type="checkbox"]:checked,
[type="radio"],
[type="radio"]:checked,
[type="checkbox"][role="switch"],
[type="checkbox"][role="switch"]:checked {
&[aria-invalid="false"] {
--border-color: var(--form-element-valid-border-color);
}
&[aria-invalid="true"] {
--border-color: var(--form-element-invalid-border-color);
}
}

@ -0,0 +1,352 @@
/**
* Form elements
*/
// Reboot based on :
// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
//
// 1. Change the font styles in all browsers
// 2. Remove the margin in Firefox and Safari
input,
optgroup,
select,
textarea {
margin: 0; // 2
font-size: 1rem; // 1
line-height: var(--line-height); // 1
font-family: inherit; // 1
letter-spacing: inherit; // 2
}
// Show the overflow in IE.
input {
overflow: visible;
}
// Remove the inheritance of text transform in Edge, Firefox, and IE
select {
text-transform: none;
}
// 1. Correct the text wrapping in Edge and IE
// 2. Correct the color inheritance from `fieldset` elements in IE
// 3. Remove the padding so developers are not caught out when they zero out
// `fieldset` elements in all browsers
legend {
max-width: 100%; // 1
padding: 0; // 3
color: inherit; // 2
white-space: normal; // 1
}
// 1. Remove the default vertical scrollbar in IE
textarea {
overflow: auto; // 1
}
// Remove the padding in IE 10
[type="checkbox"],
[type="radio"] {
padding: 0;
}
// Correct the cursor style of increment and decrement buttons in Safari
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
height: auto;
}
// 1. Correct the odd appearance in Chrome and Safari
// 2. Correct the outline style in Safari
[type="search"] {
-webkit-appearance: textfield; // 1
outline-offset: -2px; // 2
}
// Remove the inner padding in Chrome and Safari on macOS
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
// 1. Correct the inability to style clickable types in iOS and Safari
// 2. Change font properties to `inherit` in Safari
::-webkit-file-upload-button {
-webkit-appearance: button; // 1
font: inherit; // 2
}
// Remove the inner border and padding of focus outlines in Firefox
::-moz-focus-inner {
padding: 0;
border-style: none;
}
// Remove the focus outline in Firefox
:-moz-focusring {
outline: none;
}
// Remove the additional :invalid styles in Firefox
:-moz-ui-invalid {
box-shadow: none;
}
// Change the inconsistent appearance in IE (opinionated)
::-ms-expand {
display: none;
}
// Remove the border and padding in all browsers (opinionated)
[type="file"],
[type="range"] {
padding: 0;
border-width: 0;
}
// Pico
//
// Force height for alternatives input types
input:not([type="checkbox"], [type="radio"], [type="range"]) {
height: calc(
(1rem * var(--line-height)) + (var(--form-element-spacing-vertical) * 2) +
(var(--border-width) * 2)
);
}
// Fieldset
fieldset {
margin: 0;
margin-bottom: var(--spacing);
padding: 0;
border: 0;
}
// Label & legend
label,
fieldset legend {
display: block;
margin-bottom: calc(var(--spacing) * 0.25);
font-weight: var(--form-label-font-weight, var(--font-weight));
}
// Blocks, 100%
input:not([type="checkbox"], [type="radio"]),
select,
textarea {
width: 100%;
}
// Reset appearance (Not Checkboxes, Radios, Range and File)
input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]),
select,
textarea {
appearance: none;
padding: var(--form-element-spacing-vertical)
var(--form-element-spacing-horizontal);
}
// Commons styles
input,
select,
textarea {
--background-color: var(--form-element-background-color);
--border-color: var(--form-element-border-color);
--color: var(--form-element-color);
--box-shadow: none;
border: var(--border-width) solid var(--border-color);
border-radius: var(--border-radius);
outline: none;
background-color: var(--background-color);
box-shadow: var(--box-shadow);
color: var(--color);
font-weight: var(--font-weight);
@if $enable-transitions {
transition: background-color var(--transition),
border-color var(--transition), color var(--transition),
box-shadow var(--transition);
}
}
// Active & Focus
input:not([type="submit"], [type="button"], [type="reset"], [type="checkbox"], [type="radio"], [readonly]),
:where(select, textarea) {
&:is(:active, :focus) {
--background-color: var(--form-element-active-background-color);
}
}
// Active & Focus
input:not([type="submit"], [type="button"], [type="reset"], [role="switch"], [readonly]),
:where(select, textarea) {
&:is(:active, :focus) {
--border-color: var(--form-element-active-border-color);
}
}
// Focus
input:not([type="submit"], [type="button"], [type="reset"], [type="range"], [type="file"], [readonly]),
select,
textarea {
&:focus {
--box-shadow: 0 0 0 var(--outline-width) var(--form-element-focus-color);
}
}
// Disabled
input:not([type="submit"], [type="button"], [type="reset"])[disabled],
select[disabled],
textarea[disabled],
:where(fieldset[disabled]) :is(input:not([type="submit"], [type="button"], [type="reset"]), select, textarea) {
--background-color: var(--form-element-disabled-background-color);
--border-color: var(--form-element-disabled-border-color);
opacity: var(--form-element-disabled-opacity);
pointer-events: none;
}
// Aria-invalid
:where(input, select, textarea) {
&:not([type="checkbox"], [type="radio"], [type="date"], [type="datetime-local"], [type="month"], [type="time"], [type="week"]) {
&[aria-invalid] {
@if $enable-important {
padding-right: calc(
var(--form-element-spacing-horizontal) + 1.5rem
) !important;
padding-left: var(--form-element-spacing-horizontal);
padding-inline-start: var(--form-element-spacing-horizontal) !important;
padding-inline-end: calc(
var(--form-element-spacing-horizontal) + 1.5rem
) !important;
}
@else {
padding-right: calc(var(--form-element-spacing-horizontal) + 1.5rem);
padding-left: var(--form-element-spacing-horizontal);
padding-inline-start: var(--form-element-spacing-horizontal);
padding-inline-end: calc(var(--form-element-spacing-horizontal) + 1.5rem);
}
background-position: center right 0.75rem;
background-size: 1rem auto;
background-repeat: no-repeat;
}
&[aria-invalid="false"] {
background-image: var(--icon-valid);
}
&[aria-invalid="true"] {
background-image: var(--icon-invalid);
}
}
&[aria-invalid="false"] {
--border-color: var(--form-element-valid-border-color);
&:is(:active, :focus) {
@if $enable-important {
--border-color: var(--form-element-valid-active-border-color) !important;
--box-shadow: 0 0 0 var(--outline-width) var(--form-element-valid-focus-color) !important;
}
@else {
--border-color: var(--form-element-valid-active-border-color);
--box-shadow: 0 0 0 var(--outline-width) var(--form-element-valid-focus-color);
}
}
}
&[aria-invalid="true"] {
--border-color: var(--form-element-invalid-border-color);
&:is(:active, :focus) {
@if $enable-important {
--border-color: var(--form-element-invalid-active-border-color) !important;
--box-shadow: 0 0 0 var(--outline-width) var(--form-element-invalid-focus-color) !important;
}
@else {
--border-color: var(--form-element-invalid-active-border-color);
--box-shadow: 0 0 0 var(--outline-width) var(--form-element-invalid-focus-color);
}
}
}
}
[dir="rtl"] {
:where(input, select, textarea) {
&:not([type="checkbox"], [type="radio"]) {
&:is([aria-invalid], [aria-invalid="true"], [aria-invalid="false"] ){
background-position: center left 0.75rem;
}
}
}
}
// Placeholder
input::placeholder,
input::-webkit-input-placeholder,
textarea::placeholder,
textarea::-webkit-input-placeholder,
select:invalid {
color: var(--form-element-placeholder-color);
opacity: 1;
}
// Margin bottom (Not Checkboxes and Radios)
input:not([type="checkbox"], [type="radio"]),
select,
textarea {
margin-bottom: var(--spacing);
}
// Select
select {
// Unstyle the caret on `<select>`s in IE10+.
&::-ms-expand {
border: 0;
background-color: transparent;
}
&:not([multiple], [size]) {
padding-right: calc(var(--form-element-spacing-horizontal) + 1.5rem);
padding-left: var(--form-element-spacing-horizontal);
padding-inline-start: var(--form-element-spacing-horizontal);
padding-inline-end: calc(var(--form-element-spacing-horizontal) + 1.5rem);
background-image: var(--icon-chevron);
background-position: center right 0.75rem;
background-size: 1rem auto;
background-repeat: no-repeat;
}
}
[dir="rtl"] {
select {
&:not([multiple], [size]) {
background-position: center left 0.75rem;
}
}
}
// Helper
$inputs: "input, select, textarea";
@if ($enable-classes and $enable-grid) {
$inputs: $inputs + ", .grid";
}
:where(#{$inputs}) {
+ small {
display: block;
width: 100%;
margin-top: calc(var(--spacing) * -0.75);
margin-bottom: var(--spacing);
color: var(--muted-color);
}
}
// Styles for Input inside a label
label {
> :where(input, select, textarea) {
margin-top: calc(var(--spacing) * 0.25);
}
}

@ -0,0 +1,33 @@
/**
* Miscs
*/
// Reboot based on :
// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
//
// 1. Correct the inheritance of border color in Firefox
// 2. Add the correct box sizing in Firefox
hr {
height: 0; // 2
border: 0;
border-top: 1px solid var(--muted-border-color);
color: inherit; // 1
}
// Add the correct display in IE 10+
[hidden],
template {
@if $enable-important {
display: none !important;
}
@else {
display: none;
}
}
// Add the correct display in IE 9-
canvas {
display: inline-block;
}

@ -0,0 +1,50 @@
/**
* Table
*/
// Reboot based on :
// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
//
// 1. Collapse border spacing in all browsers (opinionated)
// 2. Remove text indentation from table contents in Chrome, Edge, and Safari
:where(table) {
width: 100%;
border-collapse: collapse; // 1
border-spacing: 0;
text-indent: 0; // 2
}
// Pico
//
// Cells
th,
td {
padding: calc(var(--spacing) / 2) var(--spacing);
border-bottom: var(--border-width) solid var(--table-border-color);
color: var(--color);
font-weight: var(--font-weight);
font-size: var(--font-size);
text-align: left;
text-align: start;
}
// Footer
tfoot {
th,
td {
border-top: var(--border-width) solid var(--table-border-color);
border-bottom: 0;
}
}
// Striped
table {
&[role="grid"] {
tbody tr:nth-child(odd) {
background-color: var(--table-row-stripped-background-color);
}
}
}

@ -0,0 +1,265 @@
/**
* Typography
*/
// Reboot based on :
// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
//
// Add the correct font weight in Chrome, Edge, and Safari
b,
strong {
font-weight: bolder;
}
// Prevent `sub` and `sup` elements from affecting the line height in all browsers
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
// Pico
//
address,
blockquote,
dl,
figure,
form,
ol,
p,
pre,
table,
ul {
margin-top: 0;
margin-bottom: var(--typography-spacing-vertical);
color: var(--color);
font-style: normal;
font-weight: var(--font-weight);
font-size: var(--font-size);
}
// Links
// 1. Remove the gray background on active links in IE 10
a,
[role="link"] {
--color: var(--primary);
--background-color: transparent;
outline: none;
background-color: var(--background-color); // 1
color: var(--color);
text-decoration: var(--text-decoration);
@if $enable-transitions {
transition: background-color var(--transition), color var(--transition),
text-decoration var(--transition), box-shadow var(--transition);
}
&:is([aria-current], :hover, :active, :focus) {
--color: var(--primary-hover);
--text-decoration: underline;
}
&:focus {
--background-color: var(--primary-focus);
}
@if $enable-classes {
// Secondary
&.secondary {
--color: var(--secondary);
&:is([aria-current], :hover, :active, :focus) {
--color: var(--secondary-hover);
}
&:focus {
--background-color: var(--secondary-focus);
}
}
// Contrast
&.contrast {
--color: var(--contrast);
&:is([aria-current], :hover, :active, :focus) {
--color: var(--contrast-hover);
}
&:focus {
--background-color: var(--contrast-focus);
}
}
}
}
// Headings
h1,
h2,
h3,
h4,
h5,
h6 {
margin-top: 0;
//margin-bottom: var(--typography-spacing-vertical);
margin-bottom: calc(var(--typography-spacing-vertical) * 0.7);
color: var(--color);
font-weight: var(--font-weight);
font-size: var(--font-size);
font-family: var(--font-family);
}
h1 {
--color: var(--h1-color);
}
h2 {
--color: var(--h2-color);
}
h3 {
--color: var(--h3-color);
}
h4 {
--color: var(--h4-color);
}
h5 {
--color: var(--h5-color);
}
h6 {
--color: var(--h6-color);
}
// Margin-top for headings after a typography block
:where(address, blockquote, dl, figure, form, ol, p, pre, table, ul) {
~ :is(h1, h2, h3, h4, h5, h6) {
margin-top: var(--typography-spacing-vertical);
}
}
// Heading group
@if $enable-classes == false {
hgroup {
margin-bottom: var(--typography-spacing-vertical);
> * {
margin-bottom: 0;
}
> *:last-child {
--color: var(--muted-color);
--font-weight: unset;
font-size: 1rem;
font-family: unset;
}
}
}
@if $enable-classes {
hgroup,
.headings {
margin-bottom: var(--typography-spacing-vertical);
> * {
margin-bottom: 0;
}
> *:last-child {
--color: var(--muted-color);
--font-weight: unset;
font-size: 1rem;
font-family: unset;
}
}
}
// Paragraphs
p {
margin-bottom: var(--typography-spacing-vertical);
}
// Small
small {
font-size: var(--font-size);
}
// Lists
:where(dl, ol, ul) {
padding-right: 0;
padding-left: var(--spacing);
padding-inline-start: var(--spacing);
padding-inline-end: 0;
li {
margin-bottom: calc(var(--typography-spacing-vertical) * 0.25);
}
}
// Margin-top for nested lists
// 1. Remove the margin on nested lists in Chrome, Edge, IE, and Safari
:where(dl, ol, ul) {
:is(dl, ol, ul) {
margin: 0; // 1
margin-top: calc(var(--typography-spacing-vertical) * 0.25);
}
}
ul li {
list-style: square;
}
// Highlighted text
mark {
padding: 0.125rem 0.25rem;
background-color: var(--mark-background-color);
color: var(--mark-color);
vertical-align: baseline;
}
// Blockquote
blockquote {
display: block;
margin: var(--typography-spacing-vertical) 0;
padding: var(--spacing);
border-right: none;
border-left: 0.25rem solid var(--blockquote-border-color);
border-inline-start: 0.25rem solid var(--blockquote-border-color);
border-inline-end: none;
footer {
margin-top: calc(var(--typography-spacing-vertical) * 0.5);
color: var(--blockquote-footer-color);
}
}
// Abbreviations
// 1. Remove underline decoration in Chrome, Edge, IE, Opera, and Safari
abbr[title] {
border-bottom: 1px dotted;
text-decoration: none; // 1
cursor: help;
}
// Ins
ins {
color: var(--ins-color);
text-decoration: none;
}
// del
del {
color: var(--del-color);
}
// selection
::selection {
background-color: var(--primary-focus);
}

@ -0,0 +1,42 @@
@if ($enable-class-container and $enable-classes) {
/**
* Container
*/
.container,
.container-fluid {
width: 100%;
margin-right: auto;
margin-left: auto;
padding-right: var(--spacing);
padding-left: var(--spacing);
}
.container {
@if map-get($breakpoints, "sm") {
@media (min-width: map-get($breakpoints, "sm")) {
max-width: map-get($viewports, "sm");
padding-right: 0;
padding-left: 0;
}
}
@if map-get($breakpoints, "md") {
@media (min-width: map-get($breakpoints, "md")) {
max-width: map-get($viewports, "md");
}
}
@if map-get($breakpoints, "lg") {
@media (min-width: map-get($breakpoints, "lg")) {
max-width: map-get($viewports, "lg");
}
}
@if map-get($breakpoints, "xl") {
@media (min-width: map-get($breakpoints, "xl")) {
max-width: map-get($viewports, "xl");
}
}
}
}

@ -0,0 +1,48 @@
/**
* Document
* Content-box & Responsive typography
*/
// Reboot based on :
// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
//
// 1. Add border box sizing in all browsers (opinionated)
// 2. Backgrounds do not repeat by default (opinionated)
*,
*::before,
*::after {
box-sizing: border-box; // 1
background-repeat: no-repeat; // 2
}
// 1. Add text decoration inheritance in all browsers (opinionated)
// 2. Add vertical alignment inheritance in all browsers (opinionated)
::before,
::after {
text-decoration: inherit; // 1
vertical-align: inherit; // 2
}
// 1. Use the default cursor in all browsers (opinionated)
// 2. Change the line height in all browsers (opinionated)
// 3. Breaks words to prevent overflow in all browsers (opinionated)
// 4. Use a 4-space tab width in all browsers (opinionated)
// 5. Remove the grey highlight on links in iOS (opinionated)
// 6. Prevent adjustments of font size after orientation changes in iOS
:where(:root) {
-webkit-tap-highlight-color: transparent; // 5
-webkit-text-size-adjust: 100%; // 6
text-size-adjust: 100%; // 6
background-color: var(--background-color);
color: var(--color);
font-weight: var(--font-weight);
font-size: var(--font-size);
line-height: var(--line-height); // 2
font-family: var(--font-family);
text-rendering: optimizeLegibility;
overflow-wrap: break-word; // 3
cursor: default; // 1
tab-size: 4; // 4
}

@ -0,0 +1,24 @@
@if ($enable-classes and $enable-grid) {
/**
* Grid
* Minimal grid system with auto-layout columns
*/
.grid {
grid-column-gap: var(--grid-spacing-horizontal);
grid-row-gap: var(--grid-spacing-vertical);
display: grid;
grid-template-columns: 1fr;
margin: 0;
@if map-get($breakpoints, "lg") {
@media (min-width: map-get($breakpoints, "lg")) {
grid-template-columns: repeat(auto-fit, minmax(0%, 1fr));
}
}
& > * {
min-width: 0; // HACK for childs in overflow
}
}
}

@ -0,0 +1,16 @@
/**
* Horizontal scroller (<figure>)
*/
// Wrapper to make any content responsive across all viewports
figure {
display: block;
margin: 0;
padding: 0;
overflow-x: auto;
figcaption {
padding: calc(var(--spacing) * 0.5) 0;
color: var(--muted-color);
}
}

@ -0,0 +1,8 @@
/**
* Section
* Responsive spacings for section
*/
section {
margin-bottom: var(--block-spacing-vertical);
}

@ -0,0 +1,70 @@
/**
* Sectioning
* Container and responsive spacings for header, main, footer
*/
// Reboot based on :
// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
//
// Render the `main` element consistently in IE
main {
display: block;
}
// Pico
//
// 1. Remove the margin in all browsers (opinionated)
#{$semantic-root-element} {
width: 100%;
margin: 0; // 1
> header,
> main,
> footer {
width: 100%;
margin-right: auto;
margin-left: auto;
// Semantic container
@if $enable-semantic-container {
padding: var(--block-spacing-vertical) var(--block-spacing-horizontal);
// Centered viewport
@if $enable-viewport {
@if map-get($breakpoints, "sm") and $enable-viewport {
@media (min-width: map-get($breakpoints, "sm")) {
max-width: map-get($viewports, "sm");
padding-right: 0;
padding-left: 0;
}
}
@if map-get($breakpoints, "md") and $enable-viewport {
@media (min-width: map-get($breakpoints, "md")) {
max-width: map-get($viewports, "md");
}
}
@if map-get($breakpoints, "lg") and $enable-viewport {
@media (min-width: map-get($breakpoints, "lg")) {
max-width: map-get($viewports, "lg");
}
}
@if map-get($breakpoints, "xl") and $enable-viewport {
@media (min-width: map-get($breakpoints, "xl")) {
max-width: map-get($viewports, "xl");
}
}
}
}
// Semantic container
@else {
padding: var(--block-spacing-vertical) 0;
}
}
}

@ -0,0 +1,105 @@
{
"name": "@picocss/pico",
"version": "1.5.9",
"description": "Minimal CSS Framework for semantic HTML",
"author": "Lucas Larroche",
"main": "css/pico.min.css",
"homepage": "https://picocss.com",
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/picocss/pico.git"
},
"keywords": [
"css",
"css-framework",
"dark-mode",
"dark-theme",
"lightweight",
"minimal",
"minimalist",
"minimalistic",
"native-html",
"scss-framework",
"semantic"
],
"bugs": {
"url": "https://github.com/picocss/pico/issues"
},
"scripts": {
"watch": "npm-run-all --parallel watch:pico watch:docs:scss watch:docs:html watch:docs:js --silent",
"build": "npm-run-all scss:sorter:pico build:pico scss:sorter:docs build:docs:css build:docs:js build:docs:html --silent",
"build:docs": "npm-run-all --parallel build:docs:css build:docs:js build:docs:html --silent",
"build:docs:css": "npm-run-all css:compile:docs css:prefix:docs css:minify:docs --silent",
"build:docs:html": "npm-run-all htmlincludes:docs --silent",
"build:docs:js": "npm-run-all js:bundle:docs:commons js:bundle:docs:customization js:babel:docs:commons js:babel:docs:customization js:babel:docs:grid js:babel:docs:modal js:minify:docs:commons js:minify:docs:customization js:minify:docs:grid js:minify:docs:modal --silent",
"build:pico": "npm-run-all css:compile:pico css:prefix:pico css:minify:pico --silent",
"css:compile:docs": "sass --style expanded --source-map --embed-sources --no-error-css docs/scss/:docs/css/",
"css:compile:pico": "sass --style expanded --source-map --embed-sources --no-error-css scss/:css/",
"css:minify:docs": "cleancss -O1 --with-rebase --source-map --source-map-inline-sources --batch --batch-suffix .min docs/css/*.css !docs/css/*.min.css",
"css:minify:pico": "cleancss -O1 --with-rebase --source-map --source-map-inline-sources --batch --batch-suffix .min css/*.css css/*/*.css !css/*.min.css !css/*/*.min.css",
"css:prefix:docs": "postcss --config css --replace docs/css/*.css !docs/css/*.min.css",
"css:prefix:pico": "postcss --config css --replace css/*.css css/*/*.css !css/*.min.css",
"htmlincludes:docs": "html-includes --src docs/src --dest docs --minify minifyJS=true --quiet",
"js:babel:docs:commons": "babel docs/js/commons.min.js --out-dir docs/js/ --presets=@babel/preset-env --quiet",
"js:babel:docs:customization": "babel docs/js/customization.min.js --out-dir docs/js/ --presets=@babel/preset-env --quiet",
"js:babel:docs:grid": "babel docs/js/grid.js --out-file docs/js/grid.min.js --presets=@babel/preset-env --quiet",
"js:babel:docs:modal": "babel docs/js/modal.js --out-file docs/js/modal.min.js --presets=@babel/preset-env --quiet",
"js:bundle:docs:commons": "rollup docs/js/commons.js --file docs/js/commons.min.js --format iife --silent",
"js:bundle:docs:customization": "rollup docs/js/customization.js --file docs/js/customization.min.js --format iife --silent",
"js:minify:docs:commons": "uglifyjs docs/js/commons.min.js --compress --mangle --output docs/js/commons.min.js",
"js:minify:docs:customization": "uglifyjs docs/js/customization.min.js --compress --mangle --output docs/js/customization.min.js",
"js:minify:docs:grid": "uglifyjs docs/js/grid.min.js --compress --mangle --output docs/js/grid.min.js",
"js:minify:docs:modal": "uglifyjs docs/js/modal.min.js --compress --mangle --output docs/js/modal.min.js",
"scss:sorter:docs": "postcss --config scss ./docs/scss/**/*.scss --replace",
"scss:sorter:pico": "postcss --config scss ./scss/**/*.scss --replace",
"prebuild:docs:html": "echo '[@picocss/pico] Create documentation pages'",
"prebuild:docs:js": "echo '[@picocss/pico] Bundle and minify documentation .js files'",
"precss:compile:docs": "echo '[@picocss/pico] Compile documentation .css file'",
"precss:compile:pico": "echo '[@picocss/pico] Compile Pico .css files'",
"precss:minify:docs": "echo '[@picocss/pico] Minify documentation .css file'",
"precss:minify:pico": "echo '[@picocss/pico] Minify Pico .css files'",
"prescss:sorter:docs": "echo '[@picocss/pico] Order documentation .scss properties'",
"prescss:sorter:pico": "echo '[@picocss/pico] Order Pico .scss properties'",
"postbuild:docs:css": "echo '\\033[32m[@picocss/pico] Documentation .css build done\\033[0m'",
"postbuild:docs:html": "echo '\\033[32m[@picocss/pico] Documentation pages done\\033[0m'",
"postbuild:docs:js": "echo '\\033[32m[@picocss/pico] Documentation .js build done\\033[0m'",
"postbuild:pico": "echo '\\033[32m[@picocss/pico] Pico library build done\\033[0m'",
"watch:docs:html": "nodemon --watch docs/src/ --ext html --exec 'npm run build:docs:html'",
"watch:docs:js": "nodemon --watch docs/js/ --ext js --ignore *.min.js --exec 'npm run build:docs:js'",
"watch:docs:scss": "nodemon --watch docs/scss/ --ext scss --exec 'npm run build:docs:css'",
"watch:pico": "nodemon --watch scss/ --ext scss --exec 'npm run build:pico'"
},
"devDependencies": {
"@babel/cli": "^7.21.0",
"@babel/core": "^7.21.4",
"@babel/preset-env": "^7.21.4",
"autoprefixer": "^10.4.14",
"caniuse-lite": "1.0.30001476",
"clean-css-cli": "^5.6.2",
"css-declaration-sorter": "^6.4.0",
"html-includes": "^4.4.1",
"nodemon": "^2.0.22",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.21",
"postcss-cli": "^10.1.0",
"postcss-scss": "^4.0.6",
"rollup": "^3.20.2",
"sass": "^1.61.0",
"uglify-js": "^3.17.4"
},
"browserslist": [
">= 0.5%",
"last 2 major versions",
"not dead",
"not ie > 0"
]
}

@ -0,0 +1,52 @@
/**
* Accessibility & User interaction
*/
// Based on :
// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
//
// Accessibility
// Change the cursor on control elements in all browsers (opinionated)
[aria-controls] {
cursor: pointer;
}
// Change the cursor on disabled, not-editable, or otherwise inoperable elements in all browsers (opinionated)
[aria-disabled="true"],
[disabled] {
cursor: not-allowed;
}
// Change the display on visually hidden accessible elements in all browsers (opinionated)
[aria-hidden="false"][hidden] {
display: initial;
}
[aria-hidden="false"][hidden]:not(:focus) {
clip: rect(0, 0, 0, 0);
position: absolute;
}
// User interaction
// Remove the tapping delay in IE 10
a,
area,
button,
input,
label,
select,
summary,
textarea,
[tabindex] {
-ms-touch-action: manipulation;
}
// Pico
//
[dir="rtl"] {
direction: rtl;
}

@ -0,0 +1,58 @@
/**
* Loading ([aria-busy=true])
*/
// Cursor
[aria-busy="true"] {
cursor: progress;
}
// Everyting except form elements
[aria-busy="true"]:not(input, select, textarea) {
&::before {
display: inline-block;
width: 1em;
height: 1em;
border: 0.1875em solid currentColor;
border-radius: 1em;
border-right-color: transparent;
content: "";
vertical-align: text-bottom;
vertical-align: -.125em; // Visual alignment
animation: spinner 0.75s linear infinite;
opacity: var(--loading-spinner-opacity);
}
&:not(:empty) {
&::before {
margin-right: calc(var(--spacing) * 0.5);
margin-left: 0;
margin-inline-start: 0;
margin-inline-end: calc(var(--spacing) * 0.5);
}
}
&:empty {
text-align: center;
}
}
// Buttons and links
button,
input[type="submit"],
input[type="button"],
input[type="reset"],
a {
&[aria-busy="true"] {
pointer-events: none;
}
}
// Animation: rotate
@keyframes spinner {
to {
transform: rotate(360deg);
}
}

@ -0,0 +1,27 @@
@if $enable-transitions and $enable-important {
/**
* Reduce Motion Features
*/
// Based on :
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
//
// 1. Remove animations when motion is reduced (opinionated)
// 2. Remove fixed background attachments when motion is reduced (opinionated)
// 3. Remove timed scrolling behaviors when motion is reduced (opinionated)
// 4. Remove transitions when motion is reduced (opinionated)
@media (prefers-reduced-motion: reduce) {
*:not([aria-busy="true"]),
:not([aria-busy="true"])::before,
:not([aria-busy="true"])::after {
background-attachment: initial !important; // 2
animation-duration: 1ms !important; // 1
animation-delay: -1ms !important; // 1
animation-iteration-count: 1 !important; // 1
scroll-behavior: auto !important; // 3
transition-delay: 0s !important; // 4
transition-duration: 0s !important; // 4
}
}
}

@ -0,0 +1,278 @@
/**
* Tooltip ([data-tooltip])
*/
[data-tooltip] {
position: relative;
&:not(a, button, input) {
border-bottom: 1px dotted;
text-decoration: none;
cursor: help;
}
&[data-placement="top"]::before,
&[data-placement="top"]::after,
&::before,
&::after {
display: block;
z-index: 99;
position: absolute;
bottom: 100%;
left: 50%;
padding: .25rem .5rem;
overflow: hidden;
transform: translate(-50%, -.25rem);
border-radius: var(--border-radius);
background: var(--tooltip-background-color);
content: attr(data-tooltip);
color: var(--tooltip-color);
font-style: normal;
font-weight: var(--font-weight);
font-size: .875rem;
text-decoration: none;
text-overflow: ellipsis;
white-space: nowrap;
opacity: 0;
pointer-events: none;
}
// Caret
&[data-placement="top"]::after,
&::after {
padding: 0;
transform: translate(-50%, 0rem);
border-top: .3rem solid;
border-right: .3rem solid transparent;
border-left: .3rem solid transparent;
border-radius: 0;
background-color: transparent;
content: "";
color: var(--tooltip-background-color);
}
&[data-placement="bottom"] {
&::before,
&::after {
top: 100%;
bottom: auto;
transform: translate(-50%, .25rem);
}
&:after{
transform: translate(-50%, -.3rem);
border: .3rem solid transparent;
border-bottom: .3rem solid;
}
}
&[data-placement="left"] {
&::before,
&::after {
top: 50%;
right: 100%;
bottom: auto;
left: auto;
transform: translate(-.25rem, -50%);
}
&:after{
transform: translate(.3rem, -50%);
border: .3rem solid transparent;
border-left: .3rem solid;
}
}
&[data-placement="right"] {
&::before,
&::after {
top: 50%;
right: auto;
bottom: auto;
left: 100%;
transform: translate(.25rem, -50%);
}
&:after{
transform: translate(-.3rem, -50%);
border: .3rem solid transparent;
border-right: .3rem solid;
}
}
// Display
&:focus,
&:hover {
&::before,
&::after {
opacity: 1;
}
}
@if $enable-transitions {
// Animations, excluding touch devices
@media (hover: hover) and (pointer: fine) {
&[data-placement="bottom"]:focus,
&[data-placement="bottom"]:hover
&:focus,
&:hover {
&::before,
&::after {
animation-duration: .2s;
animation-name: tooltip-slide-top;
}
&::after {
animation-name: tooltip-caret-slide-top;
}
}
&[data-placement="bottom"] {
&:focus,
&:hover {
&::before,
&::after {
animation-duration: .2s;
animation-name: tooltip-slide-bottom;
}
&::after {
animation-name: tooltip-caret-slide-bottom;
}
}
}
&[data-placement="left"] {
&:focus,
&:hover {
&::before,
&::after {
animation-duration: .2s;
animation-name: tooltip-slide-left;
}
&::after {
animation-name: tooltip-caret-slide-left;
}
}
}
&[data-placement="right"] {
&:focus,
&:hover {
&::before,
&::after {
animation-duration: .2s;
animation-name: tooltip-slide-right;
}
&::after {
animation-name: tooltip-caret-slide-right;
}
}
}
}
@keyframes tooltip-slide-top {
from {
transform: translate(-50%, .75rem);
opacity: 0;
}
to {
transform: translate(-50%, -.25rem);
opacity: 1;
}
}
@keyframes tooltip-caret-slide-top {
from {
opacity: 0;
}
50% {
transform: translate(-50%, -.25rem);
opacity: 0;
}
to {
transform: translate(-50%, 0rem);
opacity: 1;
}
}
@keyframes tooltip-slide-bottom {
from {
transform: translate(-50%, -.75rem);
opacity: 0;
}
to {
transform: translate(-50%, .25rem);
opacity: 1;
}
}
@keyframes tooltip-caret-slide-bottom {
from {
opacity: 0;
}
50% {
transform: translate(-50%, -.5rem);
opacity: 0;
}
to {
transform: translate(-50%, -.3rem);
opacity: 1;
}
}
@keyframes tooltip-slide-left {
from {
transform: translate(.75rem, -50%);
opacity: 0;
}
to {
transform: translate(-.25rem, -50%);
opacity: 1;
}
}
@keyframes tooltip-caret-slide-left {
from {
opacity: 0;
}
50% {
transform: translate(.05rem, -50%);
opacity: 0;
}
to {
transform: translate(.3rem, -50%);
opacity: 1;
}
}
@keyframes tooltip-slide-right {
from {
transform: translate(-.75rem, -50%);
opacity: 0;
}
to {
transform: translate(.25rem, -50%);
opacity: 1;
}
}
@keyframes tooltip-caret-slide-right {
from {
opacity: 0;
}
50% {
transform: translate(-.05rem, -50%);
opacity: 0;
}
to {
transform: translate(-.3rem, -50%);
opacity: 1;
}
}
}
}

@ -0,0 +1,158 @@
@import "_pico/functions";
@mixin dark {
--background-color: #{mix($black, $grey-900, 37.5%)};
// texts colors
--color: #{$grey-200};
--h1-color: #{$grey-50};
--h2-color: #{mix($grey-100, $grey-50)};
--h3-color: #{$grey-100};
--h4-color: #{mix($grey-200, $grey-100)};
--h5-color: #{$grey-200};
--h6-color: #{mix($grey-300, $grey-200)};
// muted colors
--muted-color: #{$grey-500};
--muted-border-color: #{mix($grey-900, $grey-800, 75%)};
// primary colors
--primary: #{$primary-600};
--primary-hover: #{$primary-500};
--primary-focus: #{rgba($primary-600, 0.25)};
--primary-inverse: #{$white};
// secondary colors
--secondary: #{$grey-600};
--secondary-hover: #{$grey-500};
--secondary-focus: #{rgba($grey-500, 0.25)};
--secondary-inverse: #{$white};
// contrast colors
--contrast: #{$grey-50};
--contrast-hover: #{$white};
--contrast-focus: #{rgba($grey-500, 0.25)};
--contrast-inverse: #{$black};
// highlighted text (<mark>)
--mark-background-color: #{mix($grey-300, $amber-300)};
--mark-color: #{mix($black, $grey-900, 37.5%)};
// inserted (<ins>) and deleted (<ins>)
--ins-color: #{$green-700};
--del-color: #{$red-800};
// blockquote
--blockquote-border-color: var(--muted-border-color);
--blockquote-footer-color: var(--muted-color);
// button
// to disable box-shadow, remove the var or set to '0 0 0 rgba(0, 0, 0, 0)'
// don't use, 'none, 'false, 'null', '0', etc.
--button-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
--button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
// form elements
--form-element-background-color: #{mix($black, $grey-900, 37.5%)};
--form-element-border-color: #{mix($grey-800, $grey-700)};
--form-element-color: var(--color);
--form-element-placeholder-color: var(--muted-color);
--form-element-active-background-color: var(--form-element-background-color);
--form-element-active-border-color: var(--primary);
--form-element-focus-color: var(--primary-focus);
--form-element-disabled-background-color: #{$grey-800};
--form-element-disabled-border-color: #{$grey-700};
--form-element-disabled-opacity: 0.5;
--form-element-invalid-border-color: #{$red-900};
--form-element-invalid-active-border-color: #{$red-800};
--form-element-invalid-focus-color: #{rgba($red-800, 0.25)};
--form-element-valid-border-color: #{$green-800};
--form-element-valid-active-border-color: #{$green-700};
--form-element-valid-focus-color: #{rgba($green-700, 0.25)};
// switch (input[type="checkbox"][role="switch"])
--switch-background-color: #{mix($grey-800, $grey-700)};
--switch-color: var(--primary-inverse);
--switch-checked-background-color: var(--primary);
// range (input[type="range"])
--range-border-color: #{mix($grey-900, $grey-800)};
--range-active-border-color: #{$grey-800};
--range-thumb-border-color: var(--background-color);
--range-thumb-color: var(--secondary);
--range-thumb-hover-color: var(--secondary-hover);
--range-thumb-active-color: var(--primary);
// table
--table-border-color: var(--muted-border-color);
--table-row-stripped-background-color: #{rgba($grey-500, 0.05)};
// code
--code-background-color: #{mix($black, $grey-900, 12.5%)};
--code-color: var(--muted-color);
--code-kbd-background-color: var(--contrast);
--code-kbd-color: var(--contrast-inverse);
--code-tag-color: #{hsl(330, 30%, 50%)};
--code-property-color: #{hsl(185, 30%, 50%)};
--code-value-color: #{hsl(40, 10%, 50%)};
--code-comment-color: #{mix($grey-700, $grey-600)};
// accordion (<details>)
--accordion-border-color: var(--muted-border-color);
--accordion-active-summary-color: var(--primary);
--accordion-close-summary-color: var(--color);
--accordion-open-summary-color: var(--muted-color);
// card (<article>)
$box-shadow-elevation: 1rem;
$box-shadow-blur-strengh: 6rem;
$box-shadow-opacity: 0.06;
--card-background-color: #{mix($black, $grey-900, 25%)};
--card-border-color: var(--card-background-color);
--card-box-shadow:
#{($box-shadow-elevation * 0.5 * 0.029)} #{($box-shadow-elevation * 0.029)} #{($box-shadow-blur-strengh * 0.029)} #{rgba($black, ($box-shadow-opacity * 0.283))},
#{($box-shadow-elevation * 0.5 * 0.067)} #{($box-shadow-elevation * 0.067)} #{($box-shadow-blur-strengh * 0.067)} #{rgba($black, ($box-shadow-opacity * 0.4))},
#{($box-shadow-elevation * 0.5 * 0.125)} #{($box-shadow-elevation * 0.125)} #{($box-shadow-blur-strengh * 0.125)} #{rgba($black, ($box-shadow-opacity * 0.5))},
#{($box-shadow-elevation * 0.5 * 0.225)} #{($box-shadow-elevation * 0.225)} #{($box-shadow-blur-strengh * 0.225)} #{rgba($black, ($box-shadow-opacity * 0.6))},
#{($box-shadow-elevation * 0.5 * 0.417)} #{($box-shadow-elevation * 0.417)} #{($box-shadow-blur-strengh * 0.417)} #{rgba($black, ($box-shadow-opacity * 0.717))},
#{($box-shadow-elevation * 0.5)} #{$box-shadow-elevation} #{$box-shadow-blur-strengh} #{rgba($black, $box-shadow-opacity)},
0 0 0 0.0625rem #{rgba($black, ($box-shadow-opacity * 0.25) )};
--card-sectionning-background-color: #{mix($black, $grey-900, 12.5%)};
// dropdown (<details role="list">)
--dropdown-background-color: #{$grey-900};
--dropdown-border-color: #{mix($grey-900, $grey-800)};
--dropdown-box-shadow: var(--card-box-shadow);
--dropdown-color: var(--color);
--dropdown-hover-background-color: #{rgba(mix($grey-900, $grey-800), 0.75)};
// modal (<dialog>)
--modal-overlay-background-color: #{rgba(mix($grey-900, $grey-800), 0.8)};
// progress
--progress-background-color: #{mix($grey-900, $grey-800)};
--progress-color: var(--primary);
// loading ([aria-busy=true])
--loading-spinner-opacity: 0.5;
// tooltip ([data-tooltip])
--tooltip-background-color: var(--contrast);
--tooltip-color: var(--contrast-inverse);
// icons
--icon-checkbox: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
--icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-300)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
--icon-chevron-button: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
--icon-chevron-button-inverse: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($black)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
--icon-close: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-500)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");
--icon-date: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-300)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");
--icon-invalid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($red-900)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");
--icon-minus: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");
--icon-search: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-300)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");
--icon-time: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-300)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");
--icon-valid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($green-800)}' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
// document
color-scheme: dark;
}

@ -0,0 +1,158 @@
@import "_pico/functions";
[data-theme="light"],
:root:not([data-theme="dark"]) {
--background-color: #{$white};
// texts colors
--color: #{$grey-700};
--h1-color: #{$grey-900};
--h2-color: #{mix($grey-900, $grey-800)};
--h3-color: #{$grey-800};
--h4-color: #{mix($grey-800, $grey-700)};
--h5-color: #{$grey-700};
--h6-color: #{mix($grey-700, $grey-600)};
// muted colors
--muted-color: #{$grey-500};
--muted-border-color: #{$grey-50};
// primary colors
--primary: #{$primary-600};
--primary-hover: #{$primary-700};
--primary-focus: #{rgba($primary-600, 0.125)};
--primary-inverse: #{$white};
// secondary colors
--secondary: #{$grey-600};
--secondary-hover: #{$grey-700};
--secondary-focus: #{rgba($grey-600, 0.125)};
--secondary-inverse: #{$white};
// contrast colors
--contrast: #{$grey-900};
--contrast-hover: #{$black};
--contrast-focus: #{rgba($grey-600, 0.125)};
--contrast-inverse: #{$white};
// highlighted text (<mark>)
--mark-background-color: #{mix($amber-100, $amber-50)};
--mark-color: #{mix($grey-900, $amber-900, 75%)};
// inserted (<ins>) and deleted (<ins>)
--ins-color: #{$green-700};
--del-color: #{$red-800};
// blockquote
--blockquote-border-color: var(--muted-border-color);
--blockquote-footer-color: var(--muted-color);
// button
// to disable box-shadow, remove the var or set to '0 0 0 rgba(0, 0, 0, 0)'
// don't use, 'none, 'false, 'null', '0', etc.
--button-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
--button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
// form elements
--form-element-background-color: transparent;
--form-element-border-color: #{$grey-300};
--form-element-color: var(--color);
--form-element-placeholder-color: var(--muted-color);
--form-element-active-background-color: transparent;
--form-element-active-border-color: var(--primary);
--form-element-focus-color: var(--primary-focus);
--form-element-disabled-background-color: #{$grey-100};
--form-element-disabled-border-color: #{$grey-300};
--form-element-disabled-opacity: 0.5;
--form-element-invalid-border-color: #{$red-800};
--form-element-invalid-active-border-color: #{$red-700};
--form-element-invalid-focus-color: #{rgba($red-700, 0.125)};
--form-element-valid-border-color: #{$green-700};
--form-element-valid-active-border-color: #{$green-600};
--form-element-valid-focus-color: #{rgba($green-600, 0.125)};
// switch (input[type="checkbox"][role="switch"])
--switch-background-color: #{$grey-200};
--switch-color: var(--primary-inverse);
--switch-checked-background-color: var(--primary);
// range (input[type="range"])
--range-border-color: #{$grey-100};
--range-active-border-color: #{$grey-200};
--range-thumb-border-color: var(--background-color);
--range-thumb-color: var(--secondary);
--range-thumb-hover-color: var(--secondary-hover);
--range-thumb-active-color: var(--primary);
// table
--table-border-color: var(--muted-border-color);
--table-row-stripped-background-color: #{mix($grey-50, $white)};
// code
--code-background-color: #{$grey-50};
--code-color: var(--muted-color);
--code-kbd-background-color: var(--contrast);
--code-kbd-color: var(--contrast-inverse);
--code-tag-color: #{hsl(330, 40%, 50%)};
--code-property-color: #{hsl(185, 40%, 40%)};
--code-value-color: #{hsl(40, 20%, 50%)};
--code-comment-color: #{$grey-300};
// accordion (<details>)
--accordion-border-color: var(--muted-border-color);
--accordion-close-summary-color: var(--color);
--accordion-open-summary-color: var(--muted-color);
// card (<article>)
$box-shadow-elevation: 1rem;
$box-shadow-blur-strengh: 6rem;
$box-shadow-opacity: 0.06;
--card-background-color: var(--background-color);
--card-border-color: var(--muted-border-color);
--card-box-shadow:
#{($box-shadow-elevation * 0.5 * 0.029)} #{($box-shadow-elevation * 0.029)} #{($box-shadow-blur-strengh * 0.029)} #{rgba($grey-900, ($box-shadow-opacity * 0.283))},
#{($box-shadow-elevation * 0.5 * 0.067)} #{($box-shadow-elevation * 0.067)} #{($box-shadow-blur-strengh * 0.067)} #{rgba($grey-900, ($box-shadow-opacity * 0.4))},
#{($box-shadow-elevation * 0.5 * 0.125)} #{($box-shadow-elevation * 0.125)} #{($box-shadow-blur-strengh * 0.125)} #{rgba($grey-900, ($box-shadow-opacity * 0.5))},
#{($box-shadow-elevation * 0.5 * 0.225)} #{($box-shadow-elevation * 0.225)} #{($box-shadow-blur-strengh * 0.225)} #{rgba($grey-900, ($box-shadow-opacity * 0.6))},
#{($box-shadow-elevation * 0.5 * 0.417)} #{($box-shadow-elevation * 0.417)} #{($box-shadow-blur-strengh * 0.417)} #{rgba($grey-900, ($box-shadow-opacity * 0.717))},
#{($box-shadow-elevation * 0.5)} #{$box-shadow-elevation} #{$box-shadow-blur-strengh} #{rgba($grey-900, $box-shadow-opacity)},
0 0 0 0.0625rem #{rgba($grey-900, ($box-shadow-opacity * 0.25) )};
--card-sectionning-background-color: #{mix($grey-50, $white, 25%)};
// dropdown (<details role="list">)
--dropdown-background-color: #{mix($grey-50, $white, 25%)};
--dropdown-border-color: #{mix($grey-100, $grey-50)};
--dropdown-box-shadow: var(--card-box-shadow);
--dropdown-color: var(--color);
--dropdown-hover-background-color: #{$grey-50};
// modal (<dialog>)
--modal-overlay-background-color: #{rgba($grey-100, 0.7)};
// progress
--progress-background-color: #{$grey-100};
--progress-color: var(--primary);
// loading ([aria-busy=true])
--loading-spinner-opacity: 0.5;
// tooltip ([data-tooltip])
--tooltip-background-color: var(--contrast);
--tooltip-color: var(--contrast-inverse);
// icons
--icon-checkbox: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
--icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-700)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
--icon-chevron-button: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
--icon-chevron-button-inverse: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
--icon-close: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-500)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");
--icon-date: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-700)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");
--icon-invalid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($red-800)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");
--icon-minus: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");
--icon-search: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-700)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");
--icon-time: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-700)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");
--icon-valid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($green-700)}' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
// document
color-scheme: light;
}

@ -0,0 +1,251 @@
// common pico theme styles
:root {
// font face defined in custom.scss
--font-family: "courier prime code", sans-serif;
// pico default theme:
//--font-family: system-ui, -apple-system, "Segoe UI", "Roboto", "Ubuntu",
// "Cantarell", "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
// "Segoe UI Symbol", "Noto Color Emoji";
--line-height: 1.5;
--font-weight: 400;
--font-size: 20px;
// responsive typography
@if $enable-responsive-typography {
@if map-get($breakpoints, "sm") {
@media (min-width: map-get($breakpoints, "sm")) {
--font-size: 20px;
}
}
@if map-get($breakpoints, "md") {
@media (min-width: map-get($breakpoints, "md")) {
--font-size: 21px;
--line-height: 1.4;
}
}
@if map-get($breakpoints, "lg") {
@media (min-width: map-get($breakpoints, "lg")) {
--font-size: 22px;
}
}
//@if map-get($breakpoints, "xl") {
// @media (min-width: map-get($breakpoints, "xl")) {
// --font-size: 22px;
// }
//}
}
// borders
--border-radius: 0.25rem;
--border-width: 1px;
--outline-width: 3px;
// spacings
--spacing: 1rem;
// spacings for typography elements
--typography-spacing-vertical: 1.5rem;
// spacings for body > header, body > main, body > footer, section, article
--block-spacing-vertical: calc(var(--spacing) * 2);
--block-spacing-horizontal: var(--spacing);
@if ($enable-classes and $enable-grid) {
--grid-spacing-vertical: 0;
--grid-spacing-horizontal: var(--spacing);
}
// spacings for form elements and button
--form-element-spacing-vertical: 0.75rem;
--form-element-spacing-horizontal: 1rem;
// spacings for nav component
--nav-element-spacing-vertical: 1rem;
--nav-element-spacing-horizontal: 0.5rem;
--nav-link-spacing-vertical: 0.5rem;
--nav-link-spacing-horizontal: 0.5rem;
// font weight for form labels & fieldsets legend
--form-label-font-weight: var(--font-weight);
// transitions
--transition: 0.2s ease-in-out;
// modal (<dialog>)
--modal-overlay-backdrop-filter: blur(0.25rem);
}
// responsives spacings
@if $enable-responsive-spacings {
// Sectioning
#{$semantic-root-element} > header,
#{$semantic-root-element} > main,
#{$semantic-root-element} > footer,
section {
@if map-get($breakpoints, "sm") {
@media (min-width: map-get($breakpoints, "sm")) {
--block-spacing-vertical: calc(var(--spacing) * 2.5);
}
}
@if map-get($breakpoints, "md") {
@media (min-width: map-get($breakpoints, "md")) {
--block-spacing-vertical: calc(var(--spacing) * 3);
}
}
@if map-get($breakpoints, "lg") {
@media (min-width: map-get($breakpoints, "lg")) {
--block-spacing-vertical: calc(var(--spacing) * 3.5);
}
}
@if map-get($breakpoints, "xl") {
@media (min-width: map-get($breakpoints, "xl")) {
--block-spacing-vertical: calc(var(--spacing) * 4);
}
}
}
// card (<article>)
article {
@if map-get($breakpoints, "sm") {
@media (min-width: map-get($breakpoints, "sm")) {
--block-spacing-horizontal: calc(var(--spacing) * 1.25);
}
}
@if map-get($breakpoints, "md") {
@media (min-width: map-get($breakpoints, "md")) {
--block-spacing-horizontal: calc(var(--spacing) * 1.5);
}
}
@if map-get($breakpoints, "lg") {
@media (min-width: map-get($breakpoints, "lg")) {
--block-spacing-horizontal: calc(var(--spacing) * 1.75);
}
}
@if map-get($breakpoints, "xl") {
@media (min-width: map-get($breakpoints, "xl")) {
--block-spacing-horizontal: calc(var(--spacing) * 2);
}
}
}
// modal
dialog > article {
--block-spacing-vertical: calc(var(--spacing) * 2);
--block-spacing-horizontal: var(--spacing);
@if map-get($breakpoints, "sm") {
@media (min-width: map-get($breakpoints, "sm")) {
--block-spacing-vertical: calc(var(--spacing) * 2.5);
--block-spacing-horizontal: calc(var(--spacing) * 1.25);
}
}
@if map-get($breakpoints, "md") {
@media (min-width: map-get($breakpoints, "md")) {
--block-spacing-vertical: calc(var(--spacing) * 3);
--block-spacing-horizontal: calc(var(--spacing) * 1.5);
}
}
}
}
// link
a {
--text-decoration: none;
// Secondary & Contrast
@if $enable-classes {
&.secondary,
&.contrast {
--text-decoration: underline;
}
}
}
// small
small {
--font-size: 0.875em;
}
// headings
h1,
h2,
h3,
h4,
h5,
h6 {
--font-weight: 700;
}
h1 {
--font-size: 2rem;
--typography-spacing-vertical: 3rem;
}
h2 {
--font-size: 1.75rem;
--typography-spacing-vertical: 2.625rem;
}
h3 {
--font-size: 1.5rem;
--typography-spacing-vertical: 2.25rem;
}
h4 {
--font-size: 1.25rem;
--typography-spacing-vertical: 1.874rem;
}
h5 {
--font-size: 1.125rem;
--typography-spacing-vertical: 1.6875rem;
}
// forms elements
[type="checkbox"],
[type="radio"] {
--border-width: 2px;
}
[type="checkbox"][role="switch"] {
--border-width: 3px;
}
// table
thead,
tfoot {
th,
td {
--border-width: 3px;
}
}
:not(thead, tfoot) > * > td {
--font-size: 0.875em;
}
// code
pre,
code,
kbd,
samp {
// font face defined in custom.scss
--font-family: "courier prime code", "Menlo", "Consolas", "Roboto Mono", "Noto Mono",
"Liberation Mono", monospace;
// pico default theme:
//--font-family: "Menlo", "Consolas", "Roboto Mono", "Ubuntu Monospace",
// "Noto Mono", "Oxygen Mono", "Liberation Mono", monospace,
// "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
}
kbd {
--font-weight: bolder;
}

@ -0,0 +1,2 @@
@import "../custom";
@import "../pico";

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -0,0 +1,233 @@
<svg width="297mm" height="210mm" version="1.1" viewBox="0 0 297 210" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<style>.measure-arrow
{
}
.measure-label
{
}
.measure-line
{
}</style>
<defs>
<filter id="filter23020" x="-.0065432" y="-.010843" width="1.0154" height="1.0218" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation="0.091856593"/>
</filter>
</defs>
<g fill-rule="evenodd" filter="url(#filter23020)" font-family="'Sans Serif'" font-size="31.75px" font-weight="400" opacity=".6" stroke="#000" stroke-linejoin="bevel">
<g fill-opacity="0" stroke-linecap="square">
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m689.09-345.54-46.372 400.65-1.035 6.9362-1.5 6.9198-1.967 6.8932-2.437 6.8563-2.906 6.8089-3.377 6.7509-3.846 6.6819-4.315 6.603-4.78 6.513-5.243 6.412-5.701 6.3-6.154 6.178-6.603 6.044-7.043 5.9-802.44 551.37-3.157 1.954-3.405 1.696-3.608 1.415-3.765 1.116-3.873 0.801-3.932 0.477-3.94 0.145-3.896-0.188-3.803-0.518-3.66-0.842-3.469-1.155-3.236-1.451-2.96-1.729-2.647-1.985-436.27-370.23c-2.385-2.025-3.916-4.491-4.461-7.166l-85.575-421.04-0.16-1.347 0.059-1.376 0.278-1.395 0.495-1.407 0.708-1.409 0.916-1.401 1.117-1.384 1.311-1.358 1.495-1.325 1.671-1.281 1.834-1.231 1.986-1.172 2.125-1.106 2.249-1.032 861.89-371.28 48.004-15.222 52.718-11.28 56.097-7.145 58.133-2.889 58.815 1.424 58.127 5.732 56.046 9.967 52.549 14.056 47.614 17.916 41.234 21.449 33.432 24.54 24.272 27.068 13.886 28.891 2.487 29.875" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m628.94-263.86 7.59-5.29 7.1-5.413 6.603-5.525 6.1-5.628 5.593-5.722 5.081-5.805 4.567-5.879 4.05-5.943 3.532-5.998 3.016-6.042 2.499-6.078 1.983-6.104 1.472-6.121 0.963-6.128-2.487-29.875-13.886-28.891-24.272-27.068-33.432-24.54-41.234-21.449-47.614-17.916-52.549-14.056-56.046-9.967-58.127-5.732-58.815-1.424-58.133 2.889-56.097 7.145-52.718 11.28-48.004 15.222-861.89 371.28-2.249 1.032-2.125 1.106-1.986 1.172-1.834 1.231-1.671 1.281-1.495 1.325-1.311 1.358-1.117 1.384-0.916 1.401-0.708 1.409-0.495 1.407-0.278 1.395-0.059 1.376 0.16 1.347c0.491 2.4092 2.077 4.6251 4.62 6.4381l473.32 337.17 2.926 1.837 3.283 1.597 3.597 1.336 3.867 1.058 4.086 0.766 4.252 0.462 4.364 0.154 4.419-0.158 4.417-0.467 4.356-0.77 4.24-1.062 4.069-1.342 3.846-1.601 3.573-1.842 888-507.02" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m64.623-468.78-804.13 348.92-2.205 1.019-2.082 1.091-1.945 1.156-1.797 1.213-1.635 1.263-1.465 1.306-1.285 1.339-1.095 1.365-0.898 1.382-0.696 1.391-0.488 1.39-0.278 1.381-0.064 1.362 0.151 1.335c0.487 2.4917 2.135 4.7859 4.794 6.6524l6.509 4.5673 436.99 306.64 2.897 1.792 3.249 1.558 3.559 1.303 3.824 1.031 4.04 0.746 4.203 0.45 4.312 0.148 4.366-0.156 4.362-0.457 4.302-0.753 4.187-1.039 4.017-1.31 3.795-1.565 3.525-1.799 826.36-467.19 1.117-0.632c1.962-1.115 3.533-2.391 4.645-3.77 1.098-1.383 1.735-2.865 1.887-4.383l0.023-1.025-0.124-1.03-0.271-1.03-0.415-1.026-0.559-1.017-0.698-1.003-0.835-0.984-0.967-0.961-1.095-0.933-1.217-0.901-1.333-0.865-1.443-0.825-1.547-0.781-1.643-0.734-466.62-196.01-2.26-0.845-2.4705-0.729-2.6498-0.603-2.7965-0.47-2.9083-0.33-2.9845-0.188-3.0238-0.043-3.026 0.102-2.9909 0.247-2.919 0.388-2.8113 0.525-2.6687 0.655-2.4931 0.777-2.2865 0.89" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m568.68-263.8 6.264 2.646-853.5 480.13-468.64-326.25 9.316-4.06 802.61-349.85 18.101-7.89 20.135 8.507 465.71 196.78" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-216.63 698.28 802.44-551.37 43.13-410.77-888 507.02 42.423 455.12" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m452.34-277.6 0.476-0.256-378.25-163.29-742.7 328.7 361.08 243.27 759.39-408.43" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m452.34-277.6-377.77-163.13-742.48 328.44 360.86 243.12 759.39-408.43" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-702.25 327.78 436.27 370.23-48.367-454.82-473.32-337.17 85.416 421.77" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-265.98 698.01 2.647 1.985 2.96 1.729 3.236 1.451 3.469 1.155 3.66 0.842 3.803 0.518 3.896 0.188 3.94-0.145 3.932-0.477 3.873-0.801 3.765-1.116 3.608-1.415 3.405-1.696 3.157-1.954-42.423-455.12-3.573 1.842-3.846 1.601-4.069 1.342-4.24 1.062-4.356 0.77-4.417 0.467-4.419 0.158-4.364-0.154-4.252-0.462-4.086-0.766-3.867-1.058-3.597-1.336-3.283-1.597-2.926-1.837 48.367 454.82" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m585.82 146.9 43.13-410.77 7.59-5.29 7.1-5.413 6.603-5.525 6.1-5.628 5.593-5.722 5.081-5.805 4.567-5.879 4.05-5.943 3.532-5.998 3.016-6.042 2.499-6.078 1.983-6.104 1.472-6.121 0.963-6.128-46.372 400.65-1.035 6.9362-1.5 6.9198-1.967 6.8932-2.437 6.8563-2.906 6.8089-3.377 6.7509-3.846 6.6819-4.315 6.603-4.78 6.513-5.243 6.412-5.701 6.3-6.154 6.178-6.603 6.044-7.043 5.9" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m574.94-261.16-0.928 9.912-826.36 467.19-3.525 1.799-3.795 1.565-4.017 1.31-4.187 1.039-4.302 0.753-4.362 0.457-4.366 0.156-4.312-0.148-4.203-0.45-4.04-0.746-3.824-1.031-3.559-1.303-3.249-1.558-2.897-1.792-436.99-306.64-3.213-16.64 468.64 326.25 0.389 3.99-0.389-3.99 853.5-480.13" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-737.88-111.34 802.61-349.85-0.1061-7.58-804.13 348.92 1.624 8.513" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m102.96-460.58 465.71 196.78 0.861-9.342-466.62-196.01 0.053 8.573" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-706.72 320.62c0.545 2.675 2.076 5.141 4.461 7.166l-85.416-421.77c-2.543-1.813-4.129-4.0289-4.62-6.4381l85.575 421.04" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m74.568-441.15 5e-3 0.418-742.71 328.28 742.7-328.7" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m64.729-461.2 18.101-7.89 20.135 8.507-0.053-8.573-2.26-0.845-2.4705-0.729-2.6498-0.603-2.7965-0.47-2.9083-0.33-2.9845-0.188-3.0238-0.043-3.026 0.102-2.9909 0.247-2.919 0.388-2.8113 0.525-2.6687 0.655-2.4931 0.777-2.2865 0.89 0.1061 7.58" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-747.19-107.28 9.316-4.06-1.624-8.513-2.205 1.019-2.082 1.091-1.945 1.156-1.797 1.213-1.635 1.263-1.465 1.306-1.285 1.339-1.095 1.365-0.898 1.382-0.696 1.391-0.488 1.39-0.278 1.381-0.064 1.362 0.151 1.335c0.487 2.4917 2.135 4.7859 4.794 6.6524l6.509 4.5673-3.213-16.64" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m452.34-277.6 0.476-0.256-378.24-163.08 377.77 163.34" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m568.68-263.8 6.264 2.646-0.928 9.912 1.117-0.632c1.962-1.115 3.533-2.391 4.645-3.77 1.098-1.383 1.735-2.865 1.887-4.383l0.023-1.025-0.124-1.03-0.271-1.03-0.415-1.026-0.559-1.017-0.698-1.003-0.835-0.984-0.967-0.961-1.095-0.933-1.217-0.901-1.333-0.865-1.443-0.825-1.547-0.781-1.643-0.734-0.861 9.342" fill-rule="evenodd" stroke="#000" vector-effect="non-scaling-stroke"/>
</g>
</g>
<g fill="none" stroke-linecap="round">
<g stroke-width="7">
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m64.623-468.78-804.13 348.92" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m64.623-468.78 2.2865-0.89 2.4931-0.777 2.6687-0.655 2.8113-0.525 2.919-0.388 2.9909-0.247 3.026-0.102 3.0238 0.043 2.9845 0.188 2.9083 0.33 2.7965 0.47 2.6498 0.603 2.4705 0.729 2.26 0.845" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-739.5-119.86-2.205 1.019-2.082 1.091-1.945 1.156-1.797 1.213-1.635 1.263-1.465 1.306-1.285 1.339-1.095 1.365-0.898 1.382-0.696 1.391-0.488 1.39-0.278 1.381-0.064 1.362 0.151 1.335" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-755.28-101.86c0.487 2.4917 2.135 4.7859 4.794 6.6524" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m569.54-273.14-466.62-196.01" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-750.49-95.21 443.5 311.2" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m575.13-251.88c1.962-1.115 3.533-2.391 4.645-3.77 1.098-1.383 1.735-2.865 1.887-4.383" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m581.66-260.03 0.023-1.025-0.124-1.03-0.271-1.03-0.415-1.026-0.559-1.017-0.698-1.003-0.835-0.984-0.967-0.961-1.095-0.933-1.217-0.901-1.333-0.865-1.443-0.825-1.547-0.781-1.643-0.734" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-306.99 215.99 2.897 1.792 3.249 1.558 3.559 1.303 3.824 1.031 4.04 0.746 4.203 0.45 4.312 0.148 4.366-0.156 4.362-0.457 4.302-0.753 4.187-1.039 4.017-1.31 3.795-1.565 3.525-1.799" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-252.35 215.94 827.48-467.82" fill-rule="evenodd" stroke="#000"/>
</g>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="16.735">
<path d="m85.68-489.92-861.89 371.28" fill-rule="evenodd" stroke="#000" stroke-width="16.735"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="16.735">
<path d="m-776.21-118.65-2.249 1.032-2.125 1.106-1.986 1.172-1.834 1.231-1.671 1.281-1.495 1.325-1.311 1.358-1.117 1.384-0.916 1.401-0.708 1.409-0.495 1.407-0.278 1.395-0.059 1.376 0.16 1.347" fill-rule="evenodd" stroke="#000" stroke-width="16.735"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="7">
<path d="m-792.29-100.42c0.491 2.4092 2.077 4.6251 4.62 6.4381" fill-rule="evenodd" stroke="#000"/>
</g>
<g>
<g stroke-width="23.642">
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-787.67-93.985 473.32 337.17" fill-rule="evenodd" stroke="#000" stroke-width="23.642"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-314.35 243.19 2.926 1.837 3.283 1.597 3.597 1.336 3.867 1.058 4.086 0.766 4.252 0.462 4.364 0.154 4.419-0.158 4.417-0.467 4.356-0.77 4.24-1.062 4.069-1.342 3.846-1.601 3.573-1.842" fill-rule="evenodd" stroke="#000" stroke-width="23.642"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-259.05 243.16 888-507.02" fill-rule="evenodd" stroke="#000" stroke-width="23.642"/>
</g>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="16.735">
<path d="m628.94-263.86 7.59-5.29 7.1-5.413 6.603-5.525 6.1-5.628 5.593-5.722 5.081-5.805 4.567-5.879 4.05-5.943 3.532-5.998 3.016-6.042 2.499-6.078 1.983-6.104 1.472-6.121 0.963-6.128" fill-rule="evenodd" stroke="#000" stroke-width="16.735"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="23.642">
<path d="m689.09-345.54c1.0337-28.608-10.861-56.249-31.613-75.813-38.017-39.631-90.98-60.852-142.52-77.03-123.47-34.737-256.26-37.263-380.85-6.6241-16.358 4.3132-32.202 10.316-48.423 15.085" fill-rule="evenodd" stroke="#000" stroke-width="23.642"/>
</g>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="7">
<path d="m-706.72 320.62c0.545 2.675 2.076 5.141 4.461 7.166" fill-rule="evenodd" stroke="#000"/>
</g>
<g stroke-width="23.642">
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m585.82 146.9 7.043-5.9 6.603-6.044 6.154-6.178 5.701-6.3 5.243-6.412 4.78-6.513 4.315-6.603 3.846-6.6819 3.377-6.7509 2.906-6.8089 2.437-6.8563 1.967-6.8932 1.5-6.9198 1.035-6.9362" fill-rule="evenodd" stroke="#000" stroke-width="23.642"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-702.25 327.78 436.27 370.23" fill-rule="evenodd" stroke="#000" stroke-width="23.642"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-216.63 698.28 802.44-551.37" fill-rule="evenodd" stroke="#000" stroke-width="23.642"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-265.98 698.01 2.647 1.985 2.96 1.729 3.236 1.451 3.469 1.155 3.66 0.842 3.803 0.518 3.896 0.188 3.94-0.145 3.932-0.477 3.873-0.801 3.765-1.116 3.608-1.415 3.405-1.696 3.157-1.954" fill-rule="evenodd" stroke="#000" stroke-width="23.642"/>
</g>
</g>
<g stroke-width="7">
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m585.82 146.9 43.13-410.77" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m574.94-261.16-853.5 480.13" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m574.94-261.16-0.928 9.912" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-278.56 218.97 0.389 3.99" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-278.56 218.97-468.64-326.25" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-747.19-107.28 830.02-361.8" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m82.83-469.08 492.11 207.93" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-668.36-112.6 361.31 243.42" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-307.05 130.83 759.87-408.69" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m452.82-277.86-378.25-163.29" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m74.568-441.15-742.93 328.55" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-747.19-107.28 3.213 16.64" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m74.568-441.15 5e-3 0.418" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m74.574-440.73-742.48 328.44" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m452.34-277.6-377.77-163.13" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-706.72 320.62-85.575-421.04" fill-rule="evenodd" stroke="#000"/>
</g>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="23.642">
<path d="m689.09-345.54-46.372 400.65" fill-rule="evenodd" stroke="#000" stroke-width="23.642"/>
</g>
<g stroke-width="7">
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m64.729-461.2-0.1061-7.58" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-737.88-111.34-1.624-8.513" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m102.96-460.58-0.053-8.573" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m568.68-263.8 0.861-9.342" fill-rule="evenodd" stroke="#000"/>
</g>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="23.642">
<path d="m-702.25 327.78-85.416-421.77" fill-rule="evenodd" stroke="#000" stroke-width="23.642"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="7">
<path d="m-265.98 698.01-48.367-454.82" fill-rule="evenodd" stroke="#000"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="7">
<path d="m-216.63 698.28-42.423-455.12" fill-rule="evenodd" stroke="#000"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

@ -0,0 +1,233 @@
<svg width="297mm" height="210mm" version="1.1" viewBox="0 0 297 210" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<style>.measure-arrow
{
}
.measure-label
{
}
.measure-line
{
}</style>
<defs>
<filter id="filter23020" x="-.0065432" y="-.010843" width="1.0154" height="1.0218" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation="0.091856593"/>
</filter>
</defs>
<g fill-rule="evenodd" filter="url(#filter23020)" font-family="'Sans Serif'" font-size="31.75px" font-weight="400" opacity=".6" stroke="#f0f0f0" stroke-linejoin="bevel">
<g fill-opacity="0" stroke-linecap="square">
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m689.09-345.54-46.372 400.65-1.035 6.9362-1.5 6.9198-1.967 6.8932-2.437 6.8563-2.906 6.8089-3.377 6.7509-3.846 6.6819-4.315 6.603-4.78 6.513-5.243 6.412-5.701 6.3-6.154 6.178-6.603 6.044-7.043 5.9-802.44 551.37-3.157 1.954-3.405 1.696-3.608 1.415-3.765 1.116-3.873 0.801-3.932 0.477-3.94 0.145-3.896-0.188-3.803-0.518-3.66-0.842-3.469-1.155-3.236-1.451-2.96-1.729-2.647-1.985-436.27-370.23c-2.385-2.025-3.916-4.491-4.461-7.166l-85.575-421.04-0.16-1.347 0.059-1.376 0.278-1.395 0.495-1.407 0.708-1.409 0.916-1.401 1.117-1.384 1.311-1.358 1.495-1.325 1.671-1.281 1.834-1.231 1.986-1.172 2.125-1.106 2.249-1.032 861.89-371.28 48.004-15.222 52.718-11.28 56.097-7.145 58.133-2.889 58.815 1.424 58.127 5.732 56.046 9.967 52.549 14.056 47.614 17.916 41.234 21.449 33.432 24.54 24.272 27.068 13.886 28.891 2.487 29.875" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m628.94-263.86 7.59-5.29 7.1-5.413 6.603-5.525 6.1-5.628 5.593-5.722 5.081-5.805 4.567-5.879 4.05-5.943 3.532-5.998 3.016-6.042 2.499-6.078 1.983-6.104 1.472-6.121 0.963-6.128-2.487-29.875-13.886-28.891-24.272-27.068-33.432-24.54-41.234-21.449-47.614-17.916-52.549-14.056-56.046-9.967-58.127-5.732-58.815-1.424-58.133 2.889-56.097 7.145-52.718 11.28-48.004 15.222-861.89 371.28-2.249 1.032-2.125 1.106-1.986 1.172-1.834 1.231-1.671 1.281-1.495 1.325-1.311 1.358-1.117 1.384-0.916 1.401-0.708 1.409-0.495 1.407-0.278 1.395-0.059 1.376 0.16 1.347c0.491 2.4092 2.077 4.6251 4.62 6.4381l473.32 337.17 2.926 1.837 3.283 1.597 3.597 1.336 3.867 1.058 4.086 0.766 4.252 0.462 4.364 0.154 4.419-0.158 4.417-0.467 4.356-0.77 4.24-1.062 4.069-1.342 3.846-1.601 3.573-1.842 888-507.02" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m64.623-468.78-804.13 348.92-2.205 1.019-2.082 1.091-1.945 1.156-1.797 1.213-1.635 1.263-1.465 1.306-1.285 1.339-1.095 1.365-0.898 1.382-0.696 1.391-0.488 1.39-0.278 1.381-0.064 1.362 0.151 1.335c0.487 2.4917 2.135 4.7859 4.794 6.6524l6.509 4.5673 436.99 306.64 2.897 1.792 3.249 1.558 3.559 1.303 3.824 1.031 4.04 0.746 4.203 0.45 4.312 0.148 4.366-0.156 4.362-0.457 4.302-0.753 4.187-1.039 4.017-1.31 3.795-1.565 3.525-1.799 826.36-467.19 1.117-0.632c1.962-1.115 3.533-2.391 4.645-3.77 1.098-1.383 1.735-2.865 1.887-4.383l0.023-1.025-0.124-1.03-0.271-1.03-0.415-1.026-0.559-1.017-0.698-1.003-0.835-0.984-0.967-0.961-1.095-0.933-1.217-0.901-1.333-0.865-1.443-0.825-1.547-0.781-1.643-0.734-466.62-196.01-2.26-0.845-2.4705-0.729-2.6498-0.603-2.7965-0.47-2.9083-0.33-2.9845-0.188-3.0238-0.043-3.026 0.102-2.9909 0.247-2.919 0.388-2.8113 0.525-2.6687 0.655-2.4931 0.777-2.2865 0.89" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m568.68-263.8 6.264 2.646-853.5 480.13-468.64-326.25 9.316-4.06 802.61-349.85 18.101-7.89 20.135 8.507 465.71 196.78" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-216.63 698.28 802.44-551.37 43.13-410.77-888 507.02 42.423 455.12" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m452.34-277.6 0.476-0.256-378.25-163.29-742.7 328.7 361.08 243.27 759.39-408.43" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m452.34-277.6-377.77-163.13-742.48 328.44 360.86 243.12 759.39-408.43" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-702.25 327.78 436.27 370.23-48.367-454.82-473.32-337.17 85.416 421.77" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-265.98 698.01 2.647 1.985 2.96 1.729 3.236 1.451 3.469 1.155 3.66 0.842 3.803 0.518 3.896 0.188 3.94-0.145 3.932-0.477 3.873-0.801 3.765-1.116 3.608-1.415 3.405-1.696 3.157-1.954-42.423-455.12-3.573 1.842-3.846 1.601-4.069 1.342-4.24 1.062-4.356 0.77-4.417 0.467-4.419 0.158-4.364-0.154-4.252-0.462-4.086-0.766-3.867-1.058-3.597-1.336-3.283-1.597-2.926-1.837 48.367 454.82" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m585.82 146.9 43.13-410.77 7.59-5.29 7.1-5.413 6.603-5.525 6.1-5.628 5.593-5.722 5.081-5.805 4.567-5.879 4.05-5.943 3.532-5.998 3.016-6.042 2.499-6.078 1.983-6.104 1.472-6.121 0.963-6.128-46.372 400.65-1.035 6.9362-1.5 6.9198-1.967 6.8932-2.437 6.8563-2.906 6.8089-3.377 6.7509-3.846 6.6819-4.315 6.603-4.78 6.513-5.243 6.412-5.701 6.3-6.154 6.178-6.603 6.044-7.043 5.9" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m574.94-261.16-0.928 9.912-826.36 467.19-3.525 1.799-3.795 1.565-4.017 1.31-4.187 1.039-4.302 0.753-4.362 0.457-4.366 0.156-4.312-0.148-4.203-0.45-4.04-0.746-3.824-1.031-3.559-1.303-3.249-1.558-2.897-1.792-436.99-306.64-3.213-16.64 468.64 326.25 0.389 3.99-0.389-3.99 853.5-480.13" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-737.88-111.34 802.61-349.85-0.1061-7.58-804.13 348.92 1.624 8.513" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m102.96-460.58 465.71 196.78 0.861-9.342-466.62-196.01 0.053 8.573" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-706.72 320.62c0.545 2.675 2.076 5.141 4.461 7.166l-85.416-421.77c-2.543-1.813-4.129-4.0289-4.62-6.4381l85.575 421.04" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m74.568-441.15 5e-3 0.418-742.71 328.28 742.7-328.7" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m64.729-461.2 18.101-7.89 20.135 8.507-0.053-8.573-2.26-0.845-2.4705-0.729-2.6498-0.603-2.7965-0.47-2.9083-0.33-2.9845-0.188-3.0238-0.043-3.026 0.102-2.9909 0.247-2.919 0.388-2.8113 0.525-2.6687 0.655-2.4931 0.777-2.2865 0.89 0.1061 7.58" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-747.19-107.28 9.316-4.06-1.624-8.513-2.205 1.019-2.082 1.091-1.945 1.156-1.797 1.213-1.635 1.263-1.465 1.306-1.285 1.339-1.095 1.365-0.898 1.382-0.696 1.391-0.488 1.39-0.278 1.381-0.064 1.362 0.151 1.335c0.487 2.4917 2.135 4.7859 4.794 6.6524l6.509 4.5673-3.213-16.64" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m452.34-277.6 0.476-0.256-378.24-163.08 377.77 163.34" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m568.68-263.8 6.264 2.646-0.928 9.912 1.117-0.632c1.962-1.115 3.533-2.391 4.645-3.77 1.098-1.383 1.735-2.865 1.887-4.383l0.023-1.025-0.124-1.03-0.271-1.03-0.415-1.026-0.559-1.017-0.698-1.003-0.835-0.984-0.967-0.961-1.095-0.933-1.217-0.901-1.333-0.865-1.443-0.825-1.547-0.781-1.643-0.734-0.861 9.342" fill-rule="evenodd" stroke="#f0f0f0" vector-effect="non-scaling-stroke"/>
</g>
</g>
<g fill="none" stroke-linecap="round">
<g stroke-width="7">
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m64.623-468.78-804.13 348.92" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m64.623-468.78 2.2865-0.89 2.4931-0.777 2.6687-0.655 2.8113-0.525 2.919-0.388 2.9909-0.247 3.026-0.102 3.0238 0.043 2.9845 0.188 2.9083 0.33 2.7965 0.47 2.6498 0.603 2.4705 0.729 2.26 0.845" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-739.5-119.86-2.205 1.019-2.082 1.091-1.945 1.156-1.797 1.213-1.635 1.263-1.465 1.306-1.285 1.339-1.095 1.365-0.898 1.382-0.696 1.391-0.488 1.39-0.278 1.381-0.064 1.362 0.151 1.335" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-755.28-101.86c0.487 2.4917 2.135 4.7859 4.794 6.6524" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m569.54-273.14-466.62-196.01" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-750.49-95.21 443.5 311.2" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m575.13-251.88c1.962-1.115 3.533-2.391 4.645-3.77 1.098-1.383 1.735-2.865 1.887-4.383" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m581.66-260.03 0.023-1.025-0.124-1.03-0.271-1.03-0.415-1.026-0.559-1.017-0.698-1.003-0.835-0.984-0.967-0.961-1.095-0.933-1.217-0.901-1.333-0.865-1.443-0.825-1.547-0.781-1.643-0.734" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-306.99 215.99 2.897 1.792 3.249 1.558 3.559 1.303 3.824 1.031 4.04 0.746 4.203 0.45 4.312 0.148 4.366-0.156 4.362-0.457 4.302-0.753 4.187-1.039 4.017-1.31 3.795-1.565 3.525-1.799" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-252.35 215.94 827.48-467.82" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="16.735">
<path d="m85.68-489.92-861.89 371.28" fill-rule="evenodd" stroke="#f0f0f0" stroke-width="16.735"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="16.735">
<path d="m-776.21-118.65-2.249 1.032-2.125 1.106-1.986 1.172-1.834 1.231-1.671 1.281-1.495 1.325-1.311 1.358-1.117 1.384-0.916 1.401-0.708 1.409-0.495 1.407-0.278 1.395-0.059 1.376 0.16 1.347" fill-rule="evenodd" stroke="#f0f0f0" stroke-width="16.735"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="7">
<path d="m-792.29-100.42c0.491 2.4092 2.077 4.6251 4.62 6.4381" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g>
<g stroke-width="23.642">
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-787.67-93.985 473.32 337.17" fill-rule="evenodd" stroke="#f0f0f0" stroke-width="23.642"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-314.35 243.19 2.926 1.837 3.283 1.597 3.597 1.336 3.867 1.058 4.086 0.766 4.252 0.462 4.364 0.154 4.419-0.158 4.417-0.467 4.356-0.77 4.24-1.062 4.069-1.342 3.846-1.601 3.573-1.842" fill-rule="evenodd" stroke="#f0f0f0" stroke-width="23.642"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-259.05 243.16 888-507.02" fill-rule="evenodd" stroke="#f0f0f0" stroke-width="23.642"/>
</g>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="16.735">
<path d="m628.94-263.86 7.59-5.29 7.1-5.413 6.603-5.525 6.1-5.628 5.593-5.722 5.081-5.805 4.567-5.879 4.05-5.943 3.532-5.998 3.016-6.042 2.499-6.078 1.983-6.104 1.472-6.121 0.963-6.128" fill-rule="evenodd" stroke="#f0f0f0" stroke-width="16.735"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="23.642">
<path d="m689.09-345.54c1.0337-28.608-10.861-56.249-31.613-75.813-38.017-39.631-90.98-60.852-142.52-77.03-123.47-34.737-256.26-37.263-380.85-6.6241-16.358 4.3132-32.202 10.316-48.423 15.085" fill-rule="evenodd" stroke="#f0f0f0" stroke-width="23.642"/>
</g>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="7">
<path d="m-706.72 320.62c0.545 2.675 2.076 5.141 4.461 7.166" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g stroke-width="23.642">
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m585.82 146.9 7.043-5.9 6.603-6.044 6.154-6.178 5.701-6.3 5.243-6.412 4.78-6.513 4.315-6.603 3.846-6.6819 3.377-6.7509 2.906-6.8089 2.437-6.8563 1.967-6.8932 1.5-6.9198 1.035-6.9362" fill-rule="evenodd" stroke="#f0f0f0" stroke-width="23.642"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-702.25 327.78 436.27 370.23" fill-rule="evenodd" stroke="#f0f0f0" stroke-width="23.642"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-216.63 698.28 802.44-551.37" fill-rule="evenodd" stroke="#f0f0f0" stroke-width="23.642"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-265.98 698.01 2.647 1.985 2.96 1.729 3.236 1.451 3.469 1.155 3.66 0.842 3.803 0.518 3.896 0.188 3.94-0.145 3.932-0.477 3.873-0.801 3.765-1.116 3.608-1.415 3.405-1.696 3.157-1.954" fill-rule="evenodd" stroke="#f0f0f0" stroke-width="23.642"/>
</g>
</g>
<g stroke-width="7">
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m585.82 146.9 43.13-410.77" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m574.94-261.16-853.5 480.13" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m574.94-261.16-0.928 9.912" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-278.56 218.97 0.389 3.99" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-278.56 218.97-468.64-326.25" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-747.19-107.28 830.02-361.8" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m82.83-469.08 492.11 207.93" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-668.36-112.6 361.31 243.42" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-307.05 130.83 759.87-408.69" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m452.82-277.86-378.25-163.29" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m74.568-441.15-742.93 328.55" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-747.19-107.28 3.213 16.64" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m74.568-441.15 5e-3 0.418" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m74.574-440.73-742.48 328.44" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m452.34-277.6-377.77-163.13" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-706.72 320.62-85.575-421.04" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="23.642">
<path d="m689.09-345.54-46.372 400.65" fill-rule="evenodd" stroke="#f0f0f0" stroke-width="23.642"/>
</g>
<g stroke-width="7">
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m64.729-461.2-0.1061-7.58" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m-737.88-111.34-1.624-8.513" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m102.96-460.58-0.053-8.573" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)">
<path d="m568.68-263.8 0.861-9.342" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="23.642">
<path d="m-702.25 327.78-85.416-421.77" fill-rule="evenodd" stroke="#f0f0f0" stroke-width="23.642"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="7">
<path d="m-265.98 698.01-48.367-454.82" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
<g transform="matrix(.16521 0 0 .13265 151.49 93.253)" stroke-width="7">
<path d="m-216.63 698.28-42.423-455.12" fill-rule="evenodd" stroke="#f0f0f0"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

@ -0,0 +1 @@
<svg width="612" height="612" version="1.1" viewBox="0 0 612 612" xmlns="http://www.w3.org/2000/svg"><title>nakamochi logo</title><rect x="25.614" y="25.614" width="560.77" height="560.77" fill="#f7931a" stroke="#f7931a" stroke-width="51.229"/><path d="m391.05 274.39v147.62h-36.238c-0.10955-45.856 0.22212-91.719-0.17054-137.57-0.63333-13.457-3.7204-27.441-11.263-38.726-5.7502-7.9783-13.757-14.306-23.321-16.921-11.544-2.9368-24.175-2.4527-35.071 2.6744-8.1663 3.832-14.622 10.959-19.255 18.61-10.667 20.901-8.1825 44.791-8.4971 67.465v104.47h-36.238v-147.62c-0.67305-37.646 27.262-73.024 63.777-81.735 35.897-9.787 76.841 7.2086 95.011 39.728 7.3788 12.684 11.295 27.334 11.265 42.006" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 709 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 602 B

@ -0,0 +1,22 @@
{%- extends "layout.html" %}
{%- set_global landing = true -%}
{%- set_global current_url = "/404" -%}
{%- block meta_title %}{{ trans(key="not_found") ~ " | " ~ config.title }}{% endblock meta_title %}
{%- block multilang %}{{ nav_macro::lang_picker(transarr=[]) }}{% endblock multilang %}
{%- block header %}
<nav>
<ul class="logonav">
<li class="logo">
<a href="{{get_url(path='/', lang=lang)}}"><img src="/assets/nakamochi-bogen.svg" alt="nakamochi logo"></a>
</li>
<li class="logo-name">nakamochi</li>
</ul>
{{- nav_macro::main_nav() }}
</nav>
<h1>{{ trans(key="not_found") }}</h1>
{%- endblock header %}
{%- block main %}
<img src="/assets/pro-question-mark.png">
{%- endblock main %}

@ -0,0 +1,20 @@
{%- extends "layout.html" %}
{%- block meta_title %}{{ section.title }}{% endblock meta_title %}
{%- block multilang %}{{ nav_macro::lang_picker(transarr=section.translations) }}{% endblock multilang %}
{%- block header %}
<nav>
<ul class="logonav">
<li class="logo landing"><img src="/assets/nakamochi-bogen.svg" alt="nakamochi logo"></li>
</ul>
{{- nav_macro::main_nav() }}
</nav>
<hgroup>
<h1>{{ section.title }}</h1>
<h2>{{ section.extra.tagline }}</h2>
</hgroup>
{%- endblock header %}
{%- block main %}
{{ section.content | safe }}
{%- endblock main %}

@ -0,0 +1,55 @@
{%- import "nav.html" as nav_macro -%}
<!DOCTYPE html>
<html lang="{{lang}}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="{{ config.description }}">
<title>{% block meta_title %}{{ config.title }}{% endblock %}</title>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
{%- if current_url is defined -%}
<link rel="canonical" href="{{current_url|safe}}">
{%- endif -%}
<link rel="stylesheet" href="/css/bundle.css">
</head>
{%- set landing = false %}
{%- if section.extra.landing is defined %}{% set landing = section.extra.landing %}
{%- elif page.extra.landing is defined %}{% set landing = page.extra.landing %}
{%- endif %}
<body {%- if landing %} class="bg-landing"{% endif %}>
<div class="container langpicker">
{%- block multilang %}{% endblock multilang -%}
</div>
<header class="container top">
{%- block header %}{%- endblock header %}
</header>
<main class="container top">
{%- block main %}{% endblock main -%}
</main>
<footer class="container">
<hr/>
<nav>
<ul>
<li>
<a href="https://git.qcode.ch/nakamochi/" target="_blank">
<svg role="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>sources</title><path d="M23.546 10.93L13.067.452c-.604-.603-1.582-.603-2.188 0L8.708 2.627l2.76 2.76c.645-.215 1.379-.07 1.889.441.516.515.658 1.258.438 1.9l2.658 2.66c.645-.223 1.387-.078 1.9.435.721.72.721 1.884 0 2.604-.719.719-1.881.719-2.6 0-.539-.541-.674-1.337-.404-1.996L12.86 8.955v6.525c.176.086.342.203.488.348.713.721.713 1.883 0 2.6-.719.721-1.889.721-2.609 0-.719-.719-.719-1.879 0-2.598.182-.18.387-.316.605-.406V8.835c-.217-.091-.424-.222-.6-.401-.545-.545-.676-1.342-.396-2.009L7.636 3.7.45 10.881c-.6.605-.6 1.584 0 2.189l10.48 10.477c.604.604 1.582.604 2.186 0l10.43-10.43c.605-.603.605-1.582 0-2.187"/></svg>
</a>
</li>
<li>
<a href="https://github.com/nakamochi/" target="_blank" rel="noreferrer noopener">
<svg role="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub mirrors</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>
</a>
</li>
</ul>
</nav>
<p><small class="muted">
<a href="https://qeles.ch" target="_blank">qeles AG</a> &bull;
except where otherwise noted, content on this site is licensed under a
<a href="https://creativecommons.org/licenses/by/4.0/" rel="license noreferrer noopener">CC BY 4.0</a> license.
</small></p>
</footer>
</body>
</html>

@ -0,0 +1,37 @@
{%- macro main_nav() %}
<ul class="mainnav">
{%- for item in config.extra.sitenav -%}
{%- set url = get_url(path=item.path, lang=lang) -%}
{%- set is_curr_url = false -%}
{%- if current_url is defined -%}
{%- set is_curr_url = url == current_url -%}
{%- endif -%}
{%- if is_curr_url %}
<li class="muted">{{item[lang]}}</li>
{%- else %}
<li><a href="{{url|safe}}">{{item[lang]}}</a></li>
{%- endif %}
{%- endfor %}
</ul>
{%- endmacro -%}
{%- macro lang_picker(transarr) -%}
{%- set currlang = lang -%}
{%- set translations = [] -%}
{%- for t in transarr -%}
{%- if t.title -%}
{%- set_global translations = translations | concat(with=t) -%}
{%- endif -%}
{%- endfor -%}
<ul class="translist">
{%- for t in translations -%}
{%- if t.lang != currlang -%}
<li><a href="{{t.permalink|safe}}" hreflang="{{t.lang}}" title="{{t.title}}">{{t.lang|upper}}</a></li>
{%- else -%}
<li>{{t.lang|upper}}</li>
{%- endif -%}
{%- else -%}
<!-- no translations -->
{%- endfor -%}
</ul>
{%- endmacro -%}

@ -0,0 +1,20 @@
{%- extends "layout.html" %}
{%- block meta_title %}{{ page.title ~ " | " ~ config.title }}{% endblock meta_title %}
{%- block multilang %}{{ nav_macro::lang_picker(transarr=page.translations) }}{% endblock multilang %}
{%- block header %}
<nav>
<ul class="logonav">
<li class="logo">
<a href="{{get_url(path='/', lang=lang)}}"><img src="/assets/nakamochi-bogen.svg" alt="nakamochi logo"></a>
</li>
<li class="logo-name">nakamochi</li>
</ul>
{{- nav_macro::main_nav() }}
</nav>
<h1>{{ page.title }}</h1>
{%- endblock header %}
{%- block main %}
{{ page.content | safe }}
{%- endblock main %}

@ -0,0 +1,4 @@
<figure class="screenshot">
<img src="{{src|safe}}" alt="{{caption}}">
<figcaption>{{caption}}</figcaption>
</figure>
Loading…
Cancel
Save