├── templates ├── anchor-link.html ├── robots.txt ├── shortcodes │ ├── mermaid.html │ ├── katex.html │ ├── resize_image.html │ └── hint.html ├── 404.html ├── section.html ├── index.html ├── base.html ├── macros │ ├── common.html │ ├── folio.html │ └── header.html └── page.html ├── .gitattributes ├── assets ├── test.png └── favicon.ico ├── screenshot.png ├── content ├── test.png ├── _index.md ├── _index.ru.md ├── reference │ ├── _index.md │ ├── _index.ru.md │ ├── markdown-syntax.ru.md │ └── markdown-syntax.md ├── alert.toml └── header.toml ├── islands ├── setting-mermaid.ts ├── alert-close.ts ├── setting-katex.ts ├── mode-switch.ts └── search.ts ├── .stylelintrc.json ├── lefthook.yml ├── .swcrc ├── .gitignore ├── theme.toml ├── dist ├── build.sh ├── Containerfile ├── package.json └── package-lock.json ├── sass ├── _base.scss ├── elements │ ├── _footer.scss │ ├── _aside.scss │ ├── _alert.scss │ ├── _dropdown.scss │ ├── _search.scss │ ├── _toc.scss │ ├── _sidebar.scss │ └── _header.scss ├── 404.scss ├── page.scss ├── index.scss ├── section.scss ├── home.scss └── _article.scss ├── LICENSE ├── package.json ├── .woodpecker.yml ├── config.toml └── README.md /templates/anchor-link.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.toml linguist-detectable 2 | *.yml linguist-detectable 3 | -------------------------------------------------------------------------------- /assets/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kogeletey/karzok/HEAD/assets/test.png -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kogeletey/karzok/HEAD/screenshot.png -------------------------------------------------------------------------------- /templates/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Sitemap: {{config.base_url}}/sitemap.xml 3 | -------------------------------------------------------------------------------- /assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kogeletey/karzok/HEAD/assets/favicon.ico -------------------------------------------------------------------------------- /content/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kogeletey/karzok/HEAD/content/test.png -------------------------------------------------------------------------------- /templates/shortcodes/mermaid.html: -------------------------------------------------------------------------------- 1 |
2 | {{ body | safe }}
3 | 
4 | -------------------------------------------------------------------------------- /content/_index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Karzok" 3 | paginate_by = 5 4 | sort_by = "weight" 5 | +++ 6 | -------------------------------------------------------------------------------- /content/_index.ru.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Karzok" 3 | paginate_by = 5 4 | sort_by = "weight" 5 | 6 | #redirect_to = "/install" 7 | +++ 8 | -------------------------------------------------------------------------------- /templates/shortcodes/katex.html: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /content/reference/_index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Reference" 3 | 4 | sort_by = "weight" 5 | weight = 3 6 | insert_anchor_links = "left" 7 | +++ 8 | -------------------------------------------------------------------------------- /content/reference/_index.ru.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Спецификация" 3 | 4 | sort_by = "weight" 5 | weight = 3 6 | insert_anchor_links = "left" 7 | +++ 8 | 9 | -------------------------------------------------------------------------------- /islands/setting-mermaid.ts: -------------------------------------------------------------------------------- 1 | document.addEventListener("DOMContentLoaded", () => { 2 | // @ts-ignore 3 | mermaid.initialize({ startOnLoad: true }); 4 | }); 5 | -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "stylelint-config-standard-scss", 3 | "rules": { 4 | "no-descending-specificity": null, 5 | "rule-empty-line-before": null 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lefthook.yml: -------------------------------------------------------------------------------- 1 | pre-push: 2 | commands: 3 | stylelint: 4 | tags: frontend style 5 | files: git diff --cached 6 | glob: "sass/**/*.scss" 7 | run: pnpx stylelint {files} 8 | -------------------------------------------------------------------------------- /templates/shortcodes/resize_image.html: -------------------------------------------------------------------------------- 1 | {% set img = resize_image(path=path, width=width, height=height, op=op) %} 2 | 3 | 4 | {{ alt | default(value= 5 | 6 | -------------------------------------------------------------------------------- /.swcrc: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/swcrc", 3 | "minify": true, 4 | "jsc": { 5 | "parser": { 6 | "syntax": "typescript" 7 | }, 8 | "minify": { 9 | "compress": { 10 | "unused": true 11 | }, 12 | "mangle": false 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # node_moodules folder from styles and math rendering 2 | node_modules/ 3 | # public folder generation from zola 4 | public/ 5 | static/ 6 | 7 | # files for npm run pack 8 | dist/static 9 | dist/templates 10 | dist/theme.toml 11 | dist/config.toml 12 | 13 | # compiler js files 14 | .swc/ 15 | 16 | -------------------------------------------------------------------------------- /theme.toml: -------------------------------------------------------------------------------- 1 | name = "karzok" 2 | description = "The theme for launching fast documentation sites" 3 | license = "MIT" 4 | homepage = "https://github.com/kogeletey/karzok" 5 | min_version = "0.15.0" 6 | demo = "https://karzok.re128.org" 7 | 8 | [extra] 9 | show_word_count = true 10 | show_reading_time = true 11 | 12 | [author] 13 | name = "Konrad Geletey" 14 | -------------------------------------------------------------------------------- /dist/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | DIRECTORY="content templates static sass" 4 | FILE="config.toml" 5 | 6 | for i in "${DIRECTORY}"; do 7 | if [[ -d "$i" ]] || [[ -f "$FILE" ]]; then 8 | echo $i 9 | cp -rf $i $FILE /www 10 | fi 11 | done 12 | 13 | if [ $1 ]; then 14 | cd /www 15 | npm run build -- -u $1 16 | else 17 | cd /www 18 | npm run build 19 | fi 20 | -------------------------------------------------------------------------------- /dist/Containerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:edge 2 | 3 | COPY . /www 4 | 5 | RUN apk update 6 | 7 | RUN apk add --no-cache \ 8 | --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ \ 9 | npm 10 | 11 | WORKDIR /www 12 | 13 | RUN npm ci 14 | RUN mkdir -p themes/karzok && cp -r static templates theme.toml config.toml themes/karzok 15 | 16 | RUN find . -not -name "build.sh" -and -not -depth -path './themes/*' -print -delete 17 | -------------------------------------------------------------------------------- /sass/_base.scss: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | // Color system variables 4 | $dark3: #333 !default; 5 | $dark2: #555 !default; 6 | $dark1: #777 !default; 7 | $light4: #f9f9f9 !default; 8 | $red: #ff4136 !default; 9 | $orange: #ff851b !default; 10 | $yellow: #ffdc00 !default; 11 | $aqua: #7fdbff !default; 12 | $blue: #0074d9 !default; 13 | $purple: #b10dc9 !default; 14 | $brown: #85144b !default; 15 | $light2: var(--light2); 16 | $light3: var(--light3); 17 | -------------------------------------------------------------------------------- /islands/alert-close.ts: -------------------------------------------------------------------------------- 1 | function close_alert() { 2 | (document.querySelector('div[role="alert"]') as HTMLInputElement).remove(); 3 | localStorage.setItem("alert", "close"); 4 | } 5 | 6 | (document.querySelector('button[aria-label="close alert"]') as HTMLInputElement) 7 | .addEventListener("click", close_alert) 8 | 9 | if (localStorage.getItem("alert") == "close") { 10 | (document.querySelector('div[role="alert"]') as HTMLInputElement).remove() 11 | } 12 | -------------------------------------------------------------------------------- /content/alert.toml: -------------------------------------------------------------------------------- 1 | #text = "This a staging site, use production here " 2 | bg_color = "#ffdc00" 3 | text_color = "#111" 4 | 5 | #dismissable = true 6 | [[translations]] 7 | lang = "en" 8 | text = "This a staging site, use production here " 9 | 10 | [[translations]] 11 | lang = "ru" 12 | text = "Это промежуточный сайт, лучше используйте этот " 13 | -------------------------------------------------------------------------------- /islands/setting-katex.ts: -------------------------------------------------------------------------------- 1 | document.addEventListener("DOMContentLoaded", () => { 2 | // @ts-ignore 3 | renderMathInElement(document.body, { 4 | // customised options 5 | // • auto-render specific keys, e.g.: 6 | delimiters: [ 7 | { left: "$$", right: "$$", display: true }, 8 | { left: "$", right: "$", display: false }, 9 | ], 10 | // • rendering keys, e.g.: 11 | output: "html", 12 | throwOnError: false, 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /templates/404.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block styles %} {{macros::styles(file='404.css') }} {% endblock styles %} 3 | {% block htmltitle%} 404 Page Not Found {% endblock htmltitle %} 4 | {# set specifically so that there are no problems #} 5 | {% block header %} {{top_nav::header(current_url="/404")}} {% endblock header %} 6 | {% block content %} 7 |
8 |

404

9 |

Page Not Found

10 |

The requested page doesn't exist or you don't have access to it.

11 |
12 | {% endblock content %} 13 | -------------------------------------------------------------------------------- /sass/elements/_footer.scss: -------------------------------------------------------------------------------- 1 | footer { 2 | width: 100%; 3 | min-height: 10px; 4 | padding-top: 0.25rem; 5 | padding-bottom: 0.25rem; 6 | background-color: var(--background); 7 | border-top: 1px solid; 8 | border-color: $dark1; 9 | font-size: 16px; 10 | color: var(--foreground); 11 | 12 | ul { 13 | display: flex; 14 | flex-wrap: wrap; 15 | flex: 0 0 auto; 16 | } 17 | 18 | li { 19 | margin-right: 33%; 20 | } 21 | 22 | span { 23 | padding-left: 1em; 24 | font-size: 16px; 25 | } 26 | 27 | a { 28 | color: var(--foreground); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /sass/404.scss: -------------------------------------------------------------------------------- 1 | .error { 2 | display: grid; 3 | color: var(--foreground); 4 | grid-template-rows: 0.1fr 0.1fr 0.1fr; 5 | grid-template-columns: inherit; 6 | grid-gap: inherit; 7 | grid-auto-rows: inherit; 8 | justify-items: center; 9 | font-weight: 400; 10 | margin-bottom: 2em; 11 | 12 | h1 { 13 | font-size: 250px; 14 | } 15 | 16 | h2 { 17 | font-size: 100px; 18 | } 19 | 20 | h3 { 21 | font-size: 50px; 22 | } 23 | } 24 | 25 | @media (max-width: 1000px) { 26 | .error { 27 | h1 { 28 | font-size: 80px !important; 29 | } 30 | 31 | h2 { 32 | font-size: 40px !important; 33 | } 34 | 35 | h3 { 36 | font-size: 20px !important; 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /sass/elements/_aside.scss: -------------------------------------------------------------------------------- 1 | aside, 2 | div#toc { 3 | position: sticky; 4 | top: 2rem; 5 | height: calc(110vh - 2rem); 6 | overflow-y: auto; 7 | overflow-x: hidden; 8 | background: var(--background); 9 | color: var(--foreground); 10 | a.close { 11 | display: none; 12 | } 13 | } 14 | 15 | @media (max-width: 1000px) { 16 | aside, 17 | div#toc { 18 | position: fixed; 19 | top: 0; 20 | border: none; 21 | background: var(--background); 22 | width: 50%; 23 | height: 100%; 24 | overflow-x: hidden; 25 | overflow-y: auto; 26 | transition: transform 0.25s ease; 27 | 28 | a.close { 29 | display: inline-block; 30 | margin-right: 1.25rem; 31 | padding: inherit; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /sass/elements/_alert.scss: -------------------------------------------------------------------------------- 1 | div[role="alert"] { 2 | display: grid; 3 | grid-template-columns: 98% 2%; 4 | align-items: center; 5 | justify-items: center; 6 | width: 100%; 7 | height: 30px; 8 | border-bottom: 1px solid $dark1; 9 | color: var(--foreground); 10 | background: var(--background); 11 | background-blend-mode: lighten; 12 | font-weight: 700; 13 | 14 | button { 15 | display: inline-grid; 16 | margin-right: 1rem; 17 | justify-self: end; 18 | cursor: pointer; 19 | color: var(--foreground); 20 | 21 | &:hover { 22 | color: var(--green); 23 | } 24 | } 25 | 26 | a { 27 | color: inherit; 28 | 29 | &:hover { 30 | color: var(--green); 31 | border-bottom: 1px solid var(--green); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /dist/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "karzok", 3 | "repository": "https://git.sr.ht/~kogeletey/karzok", 4 | "version": "0.2.9", 5 | "author": "kogeletey", 6 | "scripts": { 7 | "link": "cp -r node_modules/@fontsource node_modules/katex node_modules/modern-normalize node_modules/mermaid static", 8 | "build": "zola-bin build", 9 | "build:local": "npm run link && zola-bin build", 10 | "watch": "zola-bin serve -O -f" 11 | }, 12 | "files": [ 13 | "static/*", 14 | "templates/**/*", 15 | "theme.toml", 16 | "package.json" 17 | ], 18 | "dependencies": { 19 | "@fontsource/inter": "^4.5.15", 20 | "@fontsource/jetbrains-mono": "^4.5.12", 21 | "katex": "^0.16.4", 22 | "mermaid": "^9.3.0", 23 | "modern-normalize": "^1.1.0" 24 | }, 25 | "devDependencies": { 26 | "zola-bin": "^0.3.5" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /templates/section.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block styles %} {{macros::styles(file='section.css') }} {% endblock styles %} 3 | {% block htmltitle%} {{ macros::title_or_last(component=section) }} - {{ config.title }} {%endblock htmltitle %} 4 | {% block title %} {{macros::title_or_last(component=section) }} {% endblock title %} 5 | {% block math%} {{ macros::math() }} {% endblock math %} 6 | {% block content %} 7 |
8 | {% for page in section.pages %} 9 | 10 | {{ macros::title_or_last(component=page, offset=0) }} 11 |
12 | {% if page.date %} 13 | 14 | {% endif %} {% if page.description %} 15 |

{{ page.description }}

16 | {% endif %} 17 |
18 |
19 | {% endfor %} 20 |
21 | {% endblock content %} 22 | -------------------------------------------------------------------------------- /sass/page.scss: -------------------------------------------------------------------------------- 1 | @import "base"; 2 | @import "article"; 3 | @import "elements/sidebar"; 4 | @import "elements/toc"; 5 | 6 | header { 7 | border-bottom: 0.1rem solid $dark1; 8 | } 9 | 10 | main { 11 | // grid-template-rows: 1fr; 12 | display: grid; 13 | grid-template-columns: 0.25fr 1fr 0.25fr; 14 | } 15 | 16 | .mheader { 17 | display: none; 18 | } 19 | 20 | @media (max-width: 1000px) { 21 | main { 22 | margin-top: 0; 23 | grid-template-columns: 1fr; 24 | overflow-x: hidden; 25 | } 26 | 27 | div.mheader { 28 | position: sticky; 29 | display: inline-grid; 30 | top: 0; 31 | grid-template-rows: 1fr; 32 | grid-template-columns: repeat(2, 1fr); 33 | justify-content: space-around; 34 | background: var(--background); 35 | color: var(--foreground); 36 | width: 100%; 37 | z-index: 5; 38 | border-bottom: 1px solid $dark1; 39 | 40 | a { 41 | padding-left: 0.5rem; 42 | 43 | &:last-child { 44 | justify-self: end; 45 | } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /sass/elements/_dropdown.scss: -------------------------------------------------------------------------------- 1 | header li.separator { 2 | display: inline-flex; 3 | /* stylelint-disable-next-line rule-empty-line-before */ 4 | button:hover ul.dropdown, 5 | div.dropdown:hover ul.dropdown { 6 | opacity: 1; 7 | } 8 | } 9 | 10 | header ul.dropdown { 11 | position: absolute; 12 | display: block; 13 | top: 2.8rem; 14 | right: 1rem; 15 | background: var(--background); 16 | border: 1px solid $dark1; 17 | max-width: 8rem; 18 | overflow-y: auto; 19 | /* stylelint-disable-next-line */ 20 | box-shadow: -1px 10px 3px -3px rgba(0, 0, 0, 0.07); 21 | z-index: 7; 22 | opacity: 0; 23 | transition: opacity 0.5s; 24 | 25 | & li { 26 | padding: 24px; 27 | margin-right: inherit; 28 | } 29 | 30 | & span { 31 | font-size: 17px; 32 | } 33 | 34 | & a { 35 | padding: 0 20px; 36 | } 37 | 38 | & span:hover { 39 | border: inherit; 40 | } 41 | 42 | & a:hover, 43 | a[aria-selected="true"] { 44 | background: $dark3; 45 | width: 100%; 46 | } 47 | } 48 | 49 | @media (max-width: 1000px) { 50 | header div.dropdown { 51 | display: none; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Konrad Geletey. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /islands/mode-switch.ts: -------------------------------------------------------------------------------- 1 | function set_theme(mode: string) { 2 | if (mode != "light" && mode != "black" && mode != "auto") { 3 | mode = "auto"; 4 | console.log(`invalid theme mode: ${mode}`); 5 | } 6 | document.body.dataset.theme = mode; 7 | localStorage.setItem("theme", mode); 8 | // console.log(`change to ${mode} mode`) 9 | } 10 | 11 | function get_theme() { 12 | const current_theme = localStorage.getItem("theme") || "auto"; 13 | const prefers_dark = window.matchMedia( 14 | "(prefers-color-scheme: dark)" 15 | ).matches; 16 | 17 | if (prefers_dark) { 18 | if (current_theme == "auto") { 19 | set_theme("light"); 20 | } else if (current_theme == "light") { 21 | set_theme("black"); 22 | } else { 23 | set_theme("auto"); 24 | } 25 | } else { 26 | if (current_theme == "auto") { 27 | set_theme("black"); 28 | } else if (current_theme == "black") { 29 | set_theme("light"); 30 | } else { 31 | set_theme("auto"); 32 | } 33 | } 34 | } 35 | 36 | const btn = document.getElementsByClassName("toggle"); 37 | Array.from(btn).forEach((button) => { 38 | button.addEventListener("click", get_theme); 39 | }); 40 | -------------------------------------------------------------------------------- /sass/index.scss: -------------------------------------------------------------------------------- 1 | @import "base"; 2 | @import "elements/header"; 3 | @import "elements/footer"; 4 | @import "elements/search"; 5 | 6 | :root { 7 | --black: #111; 8 | --white: #fff; 9 | --light2: #bbb; 10 | --light3: #ddd; 11 | --green: #2ecc40; 12 | } 13 | 14 | * { 15 | padding: 0; 16 | border: 0; 17 | } 18 | 19 | html { 20 | font-family: Inter, sans-serif; 21 | font-size: 16px; 22 | } 23 | 24 | a { 25 | text-decoration: none; 26 | color: var(--foreground); 27 | 28 | &:hover { 29 | color: var(--green); 30 | } 31 | } 32 | 33 | ul { 34 | list-style: none; 35 | } 36 | 37 | img { 38 | max-width: 100%; 39 | } 40 | 41 | body { 42 | --foreground: var(--black); 43 | --background: var(--white); 44 | 45 | background: var(--background); 46 | min-height: 100vh; 47 | } 48 | 49 | body[data-theme="black"] { 50 | --background: var(--black); 51 | --foreground: var(--white); 52 | } 53 | 54 | body[data-theme="light"] { 55 | --foreground: var(--black); 56 | --background: var(--white); 57 | } 58 | 59 | @media (prefers-color-scheme: dark) { 60 | body:not([data-theme="light"]) { 61 | --background: var(--black); 62 | --foreground: var(--white); 63 | } 64 | } 65 | 66 | button { 67 | background: transparent; 68 | } 69 | -------------------------------------------------------------------------------- /sass/elements/_search.scss: -------------------------------------------------------------------------------- 1 | main.full-screen { 2 | grid-template-columns: 1fr; 3 | grid-template-rows: 0.1fr 1fr; 4 | min-height: 100vh; 5 | align-content: center; 6 | justify-items: center; 7 | grid-gap: 20px 0; 8 | 9 | button { 10 | justify-self: end; 11 | margin: 2rem 2rem 0; 12 | border: none; 13 | background: none; 14 | color: var(--foreground); 15 | 16 | &:hover { 17 | border: 1px solid $dark1; 18 | } 19 | } 20 | 21 | & div.items { 22 | & a { 23 | display: inline-grid; 24 | grid-template-rows: 0.5fr 1fr; 25 | justify-items: start; 26 | padding: 0.75rem; 27 | } 28 | 29 | & span { 30 | width: 37rem; 31 | font-size: 15px; 32 | margin-top: 0.5rem; 33 | } 34 | 35 | & span:first-child { 36 | font-size: 20px; 37 | } 38 | } 39 | } 40 | 41 | @media (max-width: 1000px) { 42 | main.full-screen { 43 | gap: 5px 0; 44 | 45 | button { 46 | margin: 3rem 1rem 1rem 0; 47 | } 48 | 49 | div.items { 50 | span { 51 | max-width: 15rem; 52 | margin-top: 0.2rem; 53 | font-size: 12px; 54 | } 55 | 56 | span:first-child { 57 | font-size: 18px; 58 | } 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "license": "MIT", 4 | "scripts": { 5 | "compile:js": "swc islands --only -d static", 6 | "link": "rsync -va node_modules/@fontsource node_modules/katex node_modules/modern-normalize node_modules/mermaid static && pnpm run link:assets |:", 7 | "link:assets": "mkdir -p static && cp -r assets static || :", 8 | "lint": "stylelint sass", 9 | "build": "pnpm run compile:js && zola-bin build", 10 | "build:local": "pnpm run link && pnpm run compile:js && zola-bin build", 11 | "dist": "rm -rf dist/templates && mkdirp dist/static && pnpm run build && cp -r templates theme.toml config.toml dist && cp -r static/*.js public/*.css dist/static", 12 | "watch": "swc islands --only -d static --watch & zola-bin serve -O -f" 13 | }, 14 | "dependencies": { 15 | "@fontsource/inter": "^4.5.15", 16 | "@fontsource/jetbrains-mono": "^4.5.12", 17 | "katex": "^0.16.10", 18 | "mermaid": "^9.4.3", 19 | "modern-normalize": "^1.1.0", 20 | "postcss": "^8.4.31", 21 | "zola-bin": "^0.3.7" 22 | }, 23 | "devDependencies": { 24 | "@evilmartians/lefthook": "^1.3.12", 25 | "@swc/cli": "^0.1.62", 26 | "@swc/core": "^1.3.56", 27 | "chokidar": "^3.5.3", 28 | "mkdirp": "^2.1.6", 29 | "stylelint": "^14.16.1", 30 | "stylelint-config-standard-scss": "^6.1.0" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /content/header.toml: -------------------------------------------------------------------------------- 1 | name = "Karzok" 2 | 3 | [[left]] 4 | lang = "en" 5 | text = "Reference" 6 | link = "@/reference" 7 | 8 | [[left]] 9 | lang = "ru" 10 | text = "Спецификация" 11 | link = "@/reference" 12 | 13 | [[right]] 14 | link = "https://github.com/kogeletey/karzok" 15 | svg = '' 16 | 17 | [[right]] 18 | link = "https://sr.ht/~kogeletey/karzok" 19 | svg = '' 20 | 21 | [[right]] 22 | lang = "ru" 23 | text = "Внешняя ссылка" 24 | link = "https://karzok.re128.org" 25 | target = "_blank" 26 | 27 | [[right]] 28 | lang = "en" 29 | text = "External Link" 30 | link = "https://karzok.re128.org" 31 | target = "_blank" 32 | -------------------------------------------------------------------------------- /sass/elements/_toc.scss: -------------------------------------------------------------------------------- 1 | @import "aside"; 2 | 3 | div#toc { 4 | padding-top: 1rem; 5 | 6 | span { 7 | color: var(--foreground); 8 | font-weight: bold; 9 | font-size: 17px; 10 | } 11 | 12 | ul { 13 | position: sticky; 14 | border-left: 1px solid; 15 | border-color: $dark1; 16 | padding-left: 0; 17 | max-width: 100%; 18 | } 19 | 20 | li { 21 | display: grid; 22 | position: relative; 23 | margin-top: 0.345rem; 24 | padding-top: 0.345rem; 25 | 26 | &.children { 27 | a { 28 | margin-left: 2.5rem; 29 | } 30 | } 31 | 32 | &.edit-page { 33 | svg { 34 | margin-right: 0.5rem; 35 | } 36 | } 37 | } 38 | 39 | a { 40 | display: inline-block; 41 | letter-spacing: normal; 42 | margin-left: 24px; 43 | padding: 8px 0; 44 | font-size: 15px; 45 | line-height: 16px; 46 | } 47 | 48 | li:hover::before, 49 | .active::before { 50 | position: absolute; 51 | left: -2px; 52 | height: 100%; 53 | content: ""; 54 | border-left: 2px solid; 55 | border-color: var(--green); 56 | } 57 | } 58 | 59 | @media (max-width: 1000px) { 60 | aside { 61 | display: none; 62 | 63 | span { 64 | margin-left: 1rem; 65 | } 66 | 67 | ul { 68 | border: none; 69 | } 70 | } 71 | 72 | #toc { 73 | display: inline-grid; 74 | transform: translateX(200%); 75 | padding-top: 0; 76 | z-index: 6; 77 | 78 | &:target { 79 | transform: translateX(100%); 80 | } 81 | 82 | a.close { 83 | justify-self: end; 84 | margin-bottom: -2rem; 85 | } 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /sass/section.scss: -------------------------------------------------------------------------------- 1 | @import "base"; 2 | 3 | body[data-theme="black"] > section.cards a { 4 | border: 1px solid $light4; 5 | } 6 | 7 | body:not([data-theme="dark"]) > section.cards a { 8 | border: 1px solid $dark2; 9 | } 10 | 11 | section.cards { 12 | padding-top: 0.25rem; 13 | padding-bottom: 3rem; 14 | margin-left: 0.5rem; 15 | display: grid; 16 | position: relative; 17 | grid-template-columns: repeat(auto-fit, minmax(33%, 1fr)); 18 | grid-auto-rows: 25rem; 19 | min-height: 100vh; 20 | grid-gap: 2rem; 21 | a { 22 | display: block; 23 | position: relative; 24 | color: var(--foreground); 25 | background-size: cover; 26 | background-color: var(--background); 27 | text-decoration: none; 28 | padding-top: 1em; 29 | padding-left: 1em; 30 | overflow: hidden; 31 | 32 | & span { 33 | display: block; 34 | position: relative; 35 | font-size: 20px; 36 | margin-bottom: 10px; 37 | color: var(--foreground); 38 | } 39 | 40 | & div { 41 | opacity: 0; 42 | transform: translateY(40px); 43 | transition: transform 0.4s, opacity 0.4s; 44 | color: var(--foreground); 45 | } 46 | 47 | &:hover div { 48 | opacity: 1; 49 | transform: translateY(0); 50 | } 51 | 52 | & time, 53 | p { 54 | display: block; 55 | position: relative; 56 | opacity: 0.8; 57 | } 58 | } 59 | 60 | & a:hover { 61 | outline: 1px solid var(--green); 62 | transform: scale(1, 1); 63 | } 64 | } 65 | 66 | @media (max-width: 1000px) { 67 | section { 68 | grid-template-columns: 1fr; 69 | overflow-x: hidden; 70 | padding-top: 2.6rem; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /templates/shortcodes/hint.html: -------------------------------------------------------------------------------- 1 | {% set style = style | default(value="note") %} 2 |
3 | {% if style == "warning" %} 4 | 5 | {% elif style == "critical" %} 6 | 7 | {% else %} 8 | 9 | {% endif %} 10 |

{{ body | safe }}

11 |
12 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block styles %} 4 | {{ macros::styles(file='home.css')}} 5 | {{ macros::styles(file='section.css') }} 6 | {% endblock styles %} 7 | 8 | 9 | {% block body %} 10 | {% block content %} 11 |
12 |
13 |

A theme for fast sites

14 | {% if config.description %} 15 |

16 | {{ config.description }} 17 |

18 | {% elif config.languages %} 19 |

20 | {{ trans(key="description", lang=lang) }} 21 |

22 | {% endif %} 23 |
24 |
25 |
26 | Install 27 | {# {% set shell_script = "git clone --depth=1 --branch v0.2.9 https://git.sr.ht/~kogeletey/karzok themes/karzok" %} #} 28 | {% set shell_script = "curl https://karzok.re128.org/install.sh | sh " %} 29 | {{ shell_script }} 30 | 31 | view source 32 | 33 |
34 | 51 |
52 |
53 | {% endblock content %} 54 | {% endblock body %} 55 | 56 | -------------------------------------------------------------------------------- /.woodpecker.yml: -------------------------------------------------------------------------------- 1 | # https://github.com/woodpecker-ci/woodpecker/blob/master/.woodpecker/docker.yml 2 | # https://woodpecker-ci.org/plugins/Docker%20Buildx 3 | pipeline: 4 | build: 5 | image: node:19-alpine 6 | commands: 7 | - corepack enable 8 | - corepack prepare pnpm@latest-7 --activate 9 | # - pnpm config set store-dir .pnpm-store 10 | - pnpm install --frozen-lockfile 11 | - pnpm run lint 12 | # FIXME: remove for newer zola-bin 13 | # - chmod +x /woodpecker/src/codeberg.org/kogeletey/karzok/node_modules/.pnpm/zola-bin@0.3.7/node_modules/zola-bin-linux/bin/zola 14 | - apk add zola 15 | - ZOLA_BINARY_PATH=/usr/bin/zola pnpm run dist 16 | push-rls: 17 | image: woodpeckerci/plugin-docker-buildx 18 | settings: 19 | repo: codeberg.org/${CI_REPO} 20 | dockerfile: dist/Containerfile 21 | dry_run: true 22 | mirror: ghcr.io 23 | tag: rls 24 | logins: 25 | - registry: https://codeberg.org 26 | username: ${CI_REPO_OWNER} 27 | password: 28 | from_secret: cb_password 29 | - registry: https://ghcr.io 30 | username: ${CI_REPO_OWNER} 31 | password: 32 | from_secret: gh_password 33 | when: 34 | branch: ${CI_REPO_DEFAULT_BRANCH} 35 | event: push 36 | push-stable: 37 | image: woodpeckerci/plugin-docker-buildx 38 | settings: 39 | repo: codeberg.org/${CI_REPO} 40 | dockerfile: dist/Containerfile 41 | dry_run: true 42 | mirror: ghcr.io 43 | auto_tag: true 44 | # tags: ${CI_COMMIT_TAG}, latest 45 | logins: 46 | - registry: https://codeberg.org 47 | username: ${CI_REPO_OWNER} 48 | password: 49 | from_secret: cb_password 50 | - registry: https://ghcr.io 51 | username: ${CI_REPO_OWNER} 52 | password: 53 | from_secret: gh_password 54 | when: 55 | branch: ${CI_REPO_DEFAULT_BRANCH} 56 | event: tag 57 | -------------------------------------------------------------------------------- /sass/home.scss: -------------------------------------------------------------------------------- 1 | @import "base"; 2 | 3 | section.intro { 4 | color: var(--foreground); 5 | display: grid; 6 | grid-template-columns: repeat(2, 1fr); 7 | align-content: center; 8 | justify-items: center; 9 | min-height: 100vh; 10 | margin: 0; 11 | div.started { 12 | width: 50%; 13 | margin-left: 2rem; 14 | h1 { 15 | font-size: 70px; 16 | } 17 | p:nth-child(2) { 18 | font-size: 30px; 19 | } 20 | } 21 | div[role="install"] { 22 | display: grid; 23 | grid-template-rows: repeat(2, 1fr); 24 | margin-top: 4rem; 25 | grid-row-gap: 10rem; 26 | div { 27 | display: inline-grid; 28 | grid-template-rows: 0.1fr 0.2fr 0.1fr; 29 | grid-row-gap: 15px; 30 | span { 31 | font-weight: bold; 32 | font-size: 25px; 33 | &.lite { 34 | font-weight: normal; 35 | } 36 | } 37 | code { 38 | padding: 10px 20px; 39 | border: 1px solid var(--green); 40 | background-color: var(--background); 41 | } 42 | a span { 43 | display: inline-block; 44 | color: var(--foreground); 45 | font-size: 17px; 46 | opacity: 0.85; 47 | } 48 | } 49 | a[type="button"] { 50 | color: var(--background); 51 | display: inline-block; 52 | background-color: var(--green); 53 | line-height: 25px; 54 | padding: 0 10px; 55 | width: 10rem; 56 | span { 57 | color: var(--background); 58 | font-size: 20px; 59 | } 60 | } 61 | div.text { 62 | display: inline-grid; 63 | grid-template-rows: 0.6fr 0.4fr; 64 | } 65 | } 66 | } 67 | 68 | @media (max-width: 1000px) { 69 | section.intro { 70 | grid-template-columns: 1fr; 71 | margin-top: -6rem; 72 | margin-right: 10px; 73 | margin-left: 10px; 74 | justify-content: center; 75 | div.started { 76 | display: inline-grid; 77 | width: unset; 78 | margin: 0; 79 | justify-items: center; 80 | h1 { 81 | font-size: 50px; 82 | } 83 | p:nth-child(2) { 84 | font-size: 20px; 85 | } 86 | } 87 | div[role="install"] { 88 | grid-row-gap: 3rem; 89 | div.text { 90 | grid-template-rows: 0.5fr 0.2fr; 91 | } 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /sass/elements/_sidebar.scss: -------------------------------------------------------------------------------- 1 | @import "aside"; 2 | 3 | aside#sidebar { 4 | padding-left: 0; 5 | max-height: 100vh; 6 | border-right: 1px solid $dark1; 7 | li { 8 | margin-left: 0.5rem; 9 | margin-top: 1em; 10 | 11 | a { 12 | margin-top: 1em; 13 | } 14 | } 15 | 16 | li.subsection { 17 | margin-left: 0.5rem; 18 | 19 | svg { 20 | position: relative; 21 | cursor: pointer; 22 | top: 0.15rem; 23 | left: -0.15rem; 24 | } 25 | 26 | input[type="checkbox"] { 27 | position: absolute; 28 | opacity: 0; 29 | overflow: hidden; 30 | cursor: pointer; 31 | z-index: 2; 32 | } 33 | 34 | input[type="checkbox"] ~ ul.subsection { 35 | display: none; 36 | } 37 | 38 | input[type="checkbox"]:checked ~ ul.subsection { 39 | display: block; 40 | } 41 | 42 | input[type="checkbox"] ~ nav > li > svg { 43 | transform: rotate(0deg); 44 | transition: 0.2s ease-in-out; 45 | } 46 | 47 | input[type="checkbox"]:checked ~ svg { 48 | transform: rotate(90deg); 49 | transition: 0.2s ease-in-out; 50 | } 51 | 52 | &:hover { 53 | color: var(--foreground); 54 | border-right: none; 55 | } 56 | } 57 | 58 | ul.subsection { 59 | padding-left: 0.5em; 60 | margin-top: 1em; 61 | color: $dark3; 62 | 63 | li { 64 | display: flex; 65 | text-align: left; 66 | 67 | a { 68 | margin-top: 0; 69 | } 70 | 71 | &::before { 72 | content: ""; 73 | padding-left: 1.5rem; 74 | } 75 | } 76 | } 77 | 78 | li.active, 79 | li:hover { 80 | color: var(--green); 81 | border-right: 1px solid var(--green); 82 | } 83 | 84 | a.active { 85 | color: var(--green); 86 | } 87 | } 88 | 89 | @media (max-width: 1000px) { 90 | main > nav { 91 | display: none; 92 | 93 | .active, 94 | li:hover, 95 | a:hover { 96 | color: var(--green); 97 | border: none; 98 | } 99 | } 100 | 101 | #sidebar { 102 | display: inline-block; 103 | transform: translateX(-100%); 104 | 105 | &:target { 106 | transform: translateX(0); 107 | z-index: 6; 108 | } 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /config.toml: -------------------------------------------------------------------------------- 1 | # Change to you title 2 | title = "Re128 | Karzok" 3 | 4 | description = "It will help speed up the development of a website and docs for your product" 5 | 6 | base_url = "http://localhost:8080" 7 | 8 | 9 | default_language = "en" 10 | 11 | build_search_index = true 12 | 13 | minify_html = true 14 | 15 | compile_sass = true 16 | 17 | #generate_feed = true 18 | 19 | #feed_filename = "rss.xml" 20 | 21 | [search] 22 | # Whether to include the title of the page/section in the index 23 | include_title = true 24 | # Whether to include the description of the page/section in the index 25 | include_description = false 26 | # Whether to include the rendered content of the page/section in the index 27 | include_content = true 28 | 29 | [slugify] 30 | paths = "safe" 31 | anchors = "on" 32 | 33 | [markdown] 34 | highlight_code = true 35 | highlight_theme = "base16-ocean-dark" 36 | 37 | render_emoji = true 38 | 39 | 40 | [languages.en] 41 | build_search_index = true 42 | 43 | [languages.en.translations] 44 | description = "It will help speed up the development of a website and docs for your product" 45 | toc_etp = "Edit this page" 46 | toc_ita = "In this article" 47 | date = "Date" 48 | authors = "Authors" 49 | updated = "Updated" 50 | words = "words" 51 | 52 | [languages.ru] 53 | build_search_index = false 54 | 55 | [languages.ru.translations] 56 | description = "Тема для запуска быстрых сайтов документации" 57 | 58 | toc_etp = "Редактировать страницу" 59 | toc_ita = "В этой статье" 60 | date = "Дата" 61 | authors = "Aвторы" 62 | updated = "Последнее обновление" 63 | words = "слова" 64 | 65 | [extra] 66 | # favicon 67 | favicon = "assets/favicon.ico" 68 | 69 | languages = ["en","ru"] 70 | 71 | header_file = "content/header.toml" 72 | 73 | #localcdn = true 74 | 75 | show_word_count = true 76 | show_reading_time = true 77 | relative_path = true 78 | 79 | repo = "https://github.com/kogeletey/karzok" 80 | repo_branch = "develop" 81 | 82 | announcement_file = "content/alert.toml" 83 | 84 | [[extra.footer]] 85 | lang = "en" 86 | text = "powered by karzok" 87 | 88 | [[extra.footer]] 89 | lang = "ru" 90 | text = "запущен с помощью karzok" 91 | 92 | #[[extra.footer]] 93 | #version = "https://api.github.com/repos/kogeletey/karzok/releases/latest" 94 | -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | {% import 'macros/common.html' as macros -%} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | {% if config.description %} 13 | 14 | {% elif config.languages %} 15 | 16 | {% endif %} 17 | {% if not config.extra.localcdn %} 18 | 19 | {% endif %} 20 | {% if config.extra.assets_url %} 21 | 22 | {% endif %} 23 | 24 | 25 | {% block math %} 26 | {{ macros::math() }} 27 | {% endblock math %} 28 | {{ macros::styles(file='index.css') }} 29 | {% block styles %} 30 | {% endblock styles %} 31 | {% block htmltitle %} {{ config.title }}{% endblock htmltitle %} 32 | {% for files in ["modern-normalize/modern-normalize.css","@fontsource/inter/400.css","@fontsource/inter/700.css","@fontsource/jetbrains-mono/400.css"] %} 33 | {{ macros::styles(file=files,usecdn=true) }} 34 | {% endfor %} 35 | {% if config.generate_rss %} 36 | 37 | {% endif %} 38 | 39 | 40 | 43 | {% block header%} 44 | {{ top_nav::header(current_url=current_url) }} 45 | {% endblock header%} 46 | {% block content %} 47 | {% endblock content %} 48 | {% block footer %} 49 | {{ macros::footer() }} 50 | {% endblock footer%} 51 | {{ macros::scripts(file="mode-switch.js")}} 52 | {% if config.build_search_index or lang.build_search_index %} 53 | {{ macros::scripts(file="elasticlunr.min.js") }} 54 | 55 | {{ macros::scripts(file="search.js")}} 56 | {% endif %} 57 | {% block diagrams %} 58 | {{ macros::diagrams() }} 59 | {% endblock diagrams %} 60 | 61 | 62 | -------------------------------------------------------------------------------- /templates/macros/common.html: -------------------------------------------------------------------------------- 1 | {% import 'macros/folio.html' as page -%} 2 | {% import 'macros/header.html' as top_nav -%} 3 | 4 | {# footer in the page #} 5 | {% macro footer() %} 6 | {% if config.extra.footer%} 7 | 27 | {% endif %} 28 | {% endmacro %} 29 | 30 | {% macro title_or_last(component, offset=2) %} 31 | {% set length = component.components | length %} 32 | {% set last = component.components | last %} 33 | {{ component.title | default(value=name) }} 34 | {% endmacro title_or_last %} 35 | {# math library - katex enable #} 36 | {% macro math() %} 37 | {% if page.extra.math or section.extra.math or config.extra.math %} 38 | {{ macros::styles(file="katex/dist/katex.min.css",usecdn=true) }} 39 | {% for files in ["katex/dist/katex.min.js","katex/dist/contrib/auto-render.min.js","katex/dist/contrib/mathtex-script-type.min.js"] %} 40 | {{ macros::scripts(file=files,type="defer",usecdn=true) }} 41 | {% endfor %} 42 | {{ macros::scripts(file="setting-katex.js") }} 43 | {% endif %} 44 | {% endmacro %} 45 | 46 | {% macro diagrams() %} 47 | {% if page.extra.diagrams or section.extra.diagrams or config.extra.diagrams %} 48 | {{ macros::scripts(file="setting-mermaid.js") }} 49 | {{ macros::scripts(file="mermaid/dist/mermaid.min.js",usecdn=true) }} 50 | {% endif %} 51 | {% endmacro %} 52 | 53 | {% macro styles(file,usecdn=false) %} 54 | {% if config.extra.localcdn or usecdn == false %} 55 | 56 | {% elif usecdn == true %} 57 | {% set cdnurl = config.extra.cdnurl | default(value="https://cdn.jsdelivr.net/npm") %} 58 | 59 | {% elif config.extra.assets_url %} 60 | 61 | {% endif %} 62 | {% endmacro %} 63 | 64 | {% macro scripts(file, usecdn=false, type="") %} 65 | {% if config.extra.localcdn or usecdn == false %} 66 | 67 | {% elif usecdn == true %} 68 | {% set cdnurl = config.extra.cdnurl | default(value="https://cdn.jsdelivr.net/npm") %} 69 | 70 | {% elif config.extra.assets_url %} 71 | 72 | {% endif %} 73 | {% endmacro %} 74 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | status-badge 3 | license a repository, MIT 4 | latest release as a repository 5 |

6 |

7 | Documentation 8 |

9 | 10 | # Karzok 11 | 12 | - classless and frameworkless 13 | - Jinja-like templates 14 | - javascript is optional, needed only for search,math,alerts and dark mode 15 | - no roundings and other strange design trends 16 | 17 | ![screenshot](./screenshot.png) 18 | 19 | ## Get Started 20 | 21 | - [find out more](https://karzok.re128.org/install/) 22 | 23 | ### Requirements 24 | 25 | - [Node.js](https://nodejs.org/) 26 | 27 | ### 1. Create a new zola site 28 | 29 | ```sh 30 | zola init zola_site 31 | ``` 32 | 33 | ### 2. Download this theme to you themes directory: 34 | 35 | ```sh 36 | git clone https://codeberg.org/kogeletey/karzok zola_site/themes 37 | ``` 38 | 39 | or install as submodule: 40 | 41 | ```sh 42 | cd zola_site 43 | git init # if your project is a git repository already, ignore this command 44 | git submodule add https://codeberg.org/kogeletey/karzok zola_site/themes 45 | ``` 46 | 47 | ### 3. Configuration. Open in favorite editor `config.toml` 48 | 49 | ```toml 50 | base_url = "https://karzok.example.net" # set-up for production 51 | theme = "karzok" 52 | ``` 53 | 54 | See more in [configuration](https://karzok.re128.org/configure/) 55 | 56 | ### 4. Added new content 57 | 58 | ```zsh 59 | cp ./themes/content/_index.md content/_index.md 60 | ``` 61 | 62 | how you can give freedom to your creativity 63 | 64 | ### 5. Run the project 65 | 66 | i. development enviroment 67 | 68 | 1. Install node dependencies needed to work 69 | 70 | ```zsh 71 | pnpm ci 72 | pnpm run build 73 | ``` 74 | 75 | 2. Just run `zola serve` in the root path of the project 76 | 77 | ```zsh 78 | zola serve 79 | ``` 80 | 81 | Open in favorite browser [http://127.0.0.1:1111](http://127.0.0.1:1111). Saved 82 | changes live reolad. 83 | 84 | ii. production enviroment 85 | 86 | - with conainers 87 | 88 | 1. Write file for container 89 | 90 | ```Dockerfile 91 | FROM ghcr.io/kogeletey/karzok:latest AS build-stage 92 | # or your path to image 93 | ADD . /www 94 | WORKDIR /www 95 | RUN sh /www/build.sh 96 | 97 | FROM nginx:stable-alpine 98 | 99 | COPY --from=build-stage /www/public /usr/share/nginx/html 100 | 101 | EXPOSE 80 102 | ``` 103 | 104 | 2. Run the your container 105 | ```zsh 106 | docker build -t . &&\ 107 | docker run -d -p 8080:8080 108 | ``` 109 | - using gitlab-ci and gitlab-pages 110 | 111 | ```yml 112 | image: ghcr.io/kogeletey/karzok:latest # or change use your registry 113 | 114 | pages: 115 | script: 116 | - sh /www/build.sh 117 | - mv /www/public public 118 | artifacts: 119 | paths: 120 | - public/ 121 | ``` 122 | 123 | Open in favorite browser [https://localhost:8080](http://localhost:8080) 124 | 125 | ## License 126 | 127 | This program is Free Software: You can use, study share and improve it at your 128 | will. Specifically you can redistribute and/or modify it under the terms of the 129 | [MIT](https://mit-license.org/) 130 | 131 | ## Contribute 132 | 133 | Make sure to read the [Code of Conduct](https://karzok.re128.org/reference/code_of_conduct/) 134 | 135 | ### Find bugs and come up with features 136 | 137 | On the [codeberg issues](https://codeberg.org/kogeletey/karzok/issues) or 138 | [github issues](https://github.com/kogeletey/karzok/issues) 139 | -------------------------------------------------------------------------------- /templates/page.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {# import styles for page #} 3 | {% block styles %} {{ macros::styles(file='page.css')}} {% endblock styles %} 4 | {# page title #} 5 | {% block htmltitle %} {{ page.title }} {% endblock htmltitle %} 6 | {% block content %} 7 | 40 |
41 | {{ page::sidebar(current_url=current_url) }} 42 |
43 |

{{ page.title }}

44 | {% block sections %} 45 |
    46 | {{ page::relative_path() }} 47 | {{ page::word_count(type=page) }} 48 | {{ page::reading_time() }} 49 | {{ page::date(type=page) }} 50 | {{ page::updated(type=page) }} 51 | {{ page::taxonomies_authors() }} 52 |
53 | {% endblock sections %} 54 | {{ page.content | safe }} 55 | {%- if page.heavier or page.lighter %} 56 | 70 | {% endif -%} 71 | {# page sorting by date #} 72 | {%- if page.earlier or page.later %} 73 | 87 | {% endif -%} 88 |
89 | {{ page::toc(page=page) }} 90 |
91 | {% endblock content %} 92 | -------------------------------------------------------------------------------- /sass/elements/_header.scss: -------------------------------------------------------------------------------- 1 | @import "dropdown"; 2 | @import "alert"; 3 | 4 | header nav ul li.separator { 5 | button { 6 | margin-left: 0.75rem; 7 | } 8 | 9 | svg { 10 | margin: 3px; 11 | } 12 | } 13 | 14 | body[data-theme="black"] header nav ul li button.toggle { 15 | svg:not(.toggle-light) { 16 | display: none; 17 | } 18 | 19 | svg.toggle-light { 20 | color: var(--foreground); 21 | display: block; 22 | } 23 | } 24 | 25 | body:not([data-theme="black"]) header nav { 26 | & ul > li > button.toggle { 27 | svg:not(.toggle-black) { 28 | display: none; 29 | } 30 | 31 | svg.toggle-black { 32 | color: var(--foreground); 33 | display: block; 34 | } 35 | } 36 | } 37 | 38 | @media (prefers-color-scheme: light) { 39 | body:not([data-theme="black"]) header form div.items { 40 | a:hover { 41 | background-color: $light3; 42 | } 43 | } 44 | } 45 | 46 | body[data-theme="light"] header form div.items { 47 | a:hover { 48 | background-color: $light3; 49 | } 50 | } 51 | 52 | header { 53 | position: sticky; 54 | height: 42px; 55 | top: 0; 56 | width: 100%; 57 | color: var(--foreground); 58 | background: var(--background); 59 | z-index: 6; 60 | .logotype { 61 | max-height: 2rem; 62 | min-height: 1.25rem; 63 | padding-top: 0.15em; 64 | a { 65 | padding-bottom: 0%; 66 | } 67 | } 68 | nav { 69 | font-size: 16px; 70 | font-weight: 400; 71 | margin-left: 10px; 72 | align-items: center; 73 | height: 100%; 74 | display: flex; 75 | justify-content: space-between; 76 | li { 77 | padding: 1em 0 1.25em; 78 | margin-right: 1rem; 79 | } 80 | ul { 81 | display: flex; 82 | align-items: center; 83 | span:hover, 84 | .active { 85 | padding-bottom: 10px; 86 | border-bottom: 2px solid; 87 | border-color: var(--green); 88 | } 89 | 90 | a:hover svg { 91 | color: var(--foreground); 92 | } 93 | } 94 | .vector { 95 | display: inline-flex; 96 | margin-top: 0.2em; 97 | border: 1px solid $dark1; 98 | 99 | &:hover { 100 | color: var(--foreground); 101 | background: var(--background); 102 | } 103 | 104 | span:hover { 105 | color: var(--foreground); 106 | background: var(--background); 107 | padding-bottom: inherit; 108 | border-color: inherit; 109 | border-bottom: inherit; 110 | } 111 | 112 | span.svg:hover { 113 | filter: invert(100%); 114 | } 115 | } 116 | } 117 | 118 | a { 119 | span { 120 | color: var(--foreground); 121 | } 122 | 123 | span.svg { 124 | display: inline-flex; 125 | padding: 3px; 126 | } 127 | 128 | span:hover { 129 | color: var(--green); 130 | } 131 | 132 | &[target="_blank"] { 133 | svg { 134 | display: inline-block; 135 | margin-bottom: -3px; 136 | } 137 | } 138 | } 139 | 140 | li.separator { 141 | button.search { 142 | display: none; 143 | } 144 | } 145 | 146 | li.separator::before { 147 | content: ""; 148 | border-left: 1px solid $dark1; 149 | } 150 | 151 | form { 152 | display: flex; 153 | border: 1px solid; 154 | border-color: var(--foreground); 155 | 156 | button.clear { 157 | display: none; 158 | color: var(--foreground); 159 | 160 | &:hover { 161 | color: var(--green); 162 | } 163 | } 164 | 165 | input { 166 | color: var(--foreground); 167 | background: var(--background); 168 | padding: 4px; 169 | border: none; 170 | } 171 | 172 | & input:focus, 173 | & input:hover { 174 | width: 34rem; 175 | } 176 | 177 | div.items { 178 | position: absolute; 179 | margin-top: 2.1rem; 180 | width: 34rem; 181 | z-index: 2; 182 | background-color: var(--background); 183 | 184 | & a { 185 | padding: 0.75rem; 186 | display: grid; 187 | grid-template-columns: 1fr; 188 | grid-template-rows: 0.2fr 1fr; 189 | gap: 1px; 190 | align-content: center; 191 | } 192 | 193 | & div { 194 | border: 1px solid var(--foreground); 195 | } 196 | } 197 | } 198 | } 199 | 200 | div.items { 201 | overflow-x: hidden; 202 | overflow-y: auto; 203 | 204 | & span:first-child { 205 | font-weight: 700; 206 | font-size: 18px; 207 | } 208 | 209 | & span:nth-child(2) { 210 | width: 20rem; 211 | } 212 | 213 | & a:hover { 214 | background-color: $dark3; 215 | 216 | span { 217 | color: var(--foreground); 218 | } 219 | } 220 | } 221 | 222 | @media (max-width: 1000px) { 223 | header { 224 | overflow-x: scroll; 225 | overflow-y: hidden; 226 | form { 227 | display: none; 228 | width: 98%; 229 | 230 | input { 231 | width: 98%; 232 | } 233 | } 234 | 235 | div.items { 236 | display: none !important; 237 | } 238 | 239 | li.separator { 240 | button.search { 241 | display: block; 242 | color: var(--foreground); 243 | } 244 | } 245 | } 246 | } 247 | -------------------------------------------------------------------------------- /sass/_article.scss: -------------------------------------------------------------------------------- 1 | body[data-theme="light"] { 2 | article pre { 3 | background-color: #f6f7f6 !important; 4 | } 5 | 6 | article code { 7 | background-color: invert($dark3); 8 | } 9 | } 10 | 11 | @media (prefers-color-scheme: light) { 12 | body:not([data-theme="black"]) { 13 | article pre { 14 | background-color: #f6f7f6 !important; 15 | } 16 | 17 | article code { 18 | background-color: invert($dark3); 19 | } 20 | } 21 | } 22 | 23 | article { 24 | display: inline-grid; 25 | padding: 1.5rem; 26 | overflow-x: auto; 27 | color: var(--foreground); 28 | background: var(--background); 29 | line-height: 1.4; 30 | justify-content: center; 31 | 32 | .title { 33 | margin: 0 0 1rem; 34 | font-size: 2.5rem; 35 | font-weight: 700; 36 | } 37 | 38 | h1, 39 | h2 { 40 | margin-top: 1.25rem; 41 | margin-bottom: 1.25rem; 42 | 43 | &:hover { 44 | a.anchors::before { 45 | content: "#"; 46 | margin-right: 0.25rem; 47 | color: var(--green); 48 | } 49 | } 50 | } 51 | 52 | h3, 53 | h4, 54 | h5, 55 | h6, 56 | p { 57 | margin-top: 0.5rem; 58 | margin-bottom: 0.5rem; 59 | } 60 | 61 | p { 62 | font-size: 1rem; 63 | } 64 | 65 | a { 66 | color: var(--green); 67 | 68 | &:hover { 69 | color: var(--foreground); 70 | border-bottom: var(--foreground) solid 1px; 71 | } 72 | } 73 | 74 | blockquote { 75 | margin-left: 0; 76 | margin-right: 0; 77 | color: $dark1; 78 | padding-left: 10px; 79 | border-left: 3px solid $dark1; 80 | 81 | sup { 82 | padding-left: 0.25rem; 83 | } 84 | 85 | a { 86 | border-bottom: 1px solid var(--green); 87 | } 88 | } 89 | 90 | .footnote-definition { 91 | margin-top: 0.5rem; 92 | border-top: 1px solid $dark1; 93 | 94 | sup { 95 | padding-top: 1rem; 96 | display: inline-block; 97 | font-size: 0.75rem; 98 | padding-right: 0.5rem; 99 | 100 | &::after { 101 | content: "."; 102 | } 103 | } 104 | 105 | p { 106 | display: inline; 107 | margin-top: 0; 108 | } 109 | } 110 | 111 | table { 112 | margin-top: 1rem; 113 | width: 100%; 114 | border-collapse: collapse; 115 | overflow-x: auto; 116 | 117 | td, 118 | th { 119 | border: 1px solid $dark1; 120 | background-color: var(--background); 121 | padding: 5px 14px; 122 | } 123 | } 124 | 125 | pre { 126 | margin-top: 1rem; 127 | box-shadow: 2px solid; 128 | padding: 12px; 129 | overflow-x: auto; 130 | 131 | code { 132 | padding: 0; 133 | background-color: transparent !important; 134 | } 135 | } 136 | 137 | code { 138 | font-family: "JetBrains Mono", monospace; 139 | color: var(--foreground); 140 | font-size: 85%; 141 | padding: 2px; 142 | background-color: $dark3; 143 | } 144 | 145 | ol { 146 | list-style-type: decimal; 147 | margin: 0.5rem 0 0.5rem 0.8rem; 148 | } 149 | 150 | ul { 151 | list-style-type: square; 152 | margin-left: 0.8rem; 153 | 154 | ol { 155 | padding-left: 15px; 156 | } 157 | 158 | li { 159 | margin-top: 0.5rem; 160 | } 161 | } 162 | 163 | kbd { 164 | display: inline-block; 165 | padding: 4px 5px; 166 | font-size: 1.125rem; 167 | box-shadow: inset $light2 0 -1px 0; 168 | vertical-align: middle; 169 | border-radius: 2px; 170 | } 171 | 172 | img { 173 | height: auto; 174 | } 175 | 176 | blockquote.hint { 177 | display: grid; 178 | grid-template-columns: 0.1fr 1fr; 179 | max-width: 100%; 180 | padding: 15px; 181 | overflow: hidden; 182 | border: none; 183 | 184 | svg { 185 | width: 25px; 186 | height: 25px; 187 | } 188 | 189 | p { 190 | text-align: center; 191 | opacity: 0.85; 192 | font-weight: inherit; 193 | font-size: 16px; 194 | } 195 | } 196 | 197 | blockquote.warning { 198 | background: $yellow; 199 | color: var(--black); 200 | } 201 | 202 | blockquote.note { 203 | background: $blue; 204 | color: var(--white); 205 | } 206 | 207 | blockquote.critical { 208 | background: $red; 209 | color: var(--white); 210 | } 211 | } 212 | 213 | .sections { 214 | display: flex; 215 | flex-wrap: wrap; 216 | 217 | ul { 218 | display: inline-grid; 219 | } 220 | 221 | li { 222 | display: flex; 223 | list-style: none; 224 | padding-right: 1em; 225 | } 226 | 227 | &-no-padding { 228 | padding-right: 0 !important; 229 | } 230 | 231 | &-string { 232 | padding-top: 1em; 233 | } 234 | 235 | time { 236 | color: var(--foreground); 237 | } 238 | } 239 | 240 | // navigation on this article 241 | div.navigation { 242 | display: flex; 243 | flex-direction: row; 244 | justify-content: space-between; 245 | border-top: 1px solid $dark1; 246 | margin-top: 0.75rem; 247 | padding-top: 1.5rem; 248 | border-right: none; 249 | 250 | a { 251 | display: inline-block; 252 | color: var(--foreground); 253 | 254 | &:hover { 255 | color: var(--green); 256 | border: none; 257 | } 258 | 259 | & span:hover { 260 | border-bottom: 1px solid $dark1; 261 | } 262 | 263 | & svg { 264 | position: relative; 265 | bottom: -4px; 266 | margin-left: 0.25rem; 267 | margin-right: 0.25rem; 268 | } 269 | 270 | &:nth-child(2) { 271 | margin-left: 0.75rem; 272 | } 273 | } 274 | } 275 | 276 | @media (max-width: 1000px) { 277 | div.navigation { 278 | min-width: 100%; 279 | } 280 | } 281 | -------------------------------------------------------------------------------- /content/reference/markdown-syntax.ru.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Гайд по markdown" 3 | date = "2019-03-11" 4 | updated = "2022-08-18" 5 | description= "Пример статьи показывающий синтаксис markdown и то как он будет выглядеть" 6 | weight = 2 7 | 8 | [extra] 9 | math = true 10 | diagrams = true 11 | authors = ["Konrad Geletey","Hugo Authors"] 12 | +++ 13 | 14 | This article offers a sample of basic Markdown syntax that can be used in Hugo 15 | content files, also it shows whether basic HTML elements are decorated with CSS 16 | in a Hugo theme. 17 | 18 | 19 | 20 | # Headings 21 | 22 | The following HTML `

`—`

` elements represent six levels of section 23 | headings. `

` is the highest section level while `

` is the lowest. 24 | 25 | # H1 26 | 27 | ## H2 28 | 29 | ### H3 30 | 31 | #### H4 32 | 33 | ##### H5 34 | 35 | ###### H6 36 | 37 | ## Paragraph 38 | 39 | Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, 40 | voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma 41 | dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as 42 | cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin 43 | porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? 44 | Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit 45 | ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda 46 | veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore 47 | eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata 48 | tiustia prat. 49 | 50 | Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne 51 | sapicia is sinveli squiatum, core et que aut hariosam ex eat. 52 | 53 | # Blockquotes 54 | 55 | The blockquote element represents content that is quoted from another source, 56 | optionally with a citation which must be within a `footer` or `cite` element, 57 | and optionally with in-line changes such as annotations and abbreviations. 58 | 59 | #### Blockquote without attribution 60 | 61 | > Tiam, ad mint andaepu dandae nostion secatur sequo quae. **Note** that you can 62 | > use _Markdown syntax_ within a blockquote. 63 | 64 | #### Blockquote with attribution 65 | 66 | > Don't communicate by sharing memory, share memory by communicating.

— 67 | > Rob Pike[^1] 68 | 69 | # Tables 70 | 71 | Tables aren't part of the core Markdown spec, but Hugo supports supports them 72 | out-of-the-box. 73 | 74 | | Name | Age | 75 | | ----- | --- | 76 | | Bob | 27 | 77 | | Alice | 23 | 78 | 79 | #### Inline Markdown within tables 80 | 81 | | Inline    | Markdown    | In    | Table | 82 | | ------------------------ | -------------------------- | ----------------------------------- | ------ | 83 | | _italics_ | **bold** | ~~strikethrough~~    | `code` | 84 | 85 | # Code Blocks 86 | 87 | #### Code block with backticks 88 | 89 | ```html 90 | 91 | 92 | 93 | 94 | Example HTML5 Document 95 | 96 | 97 |

Test

98 | 99 | 100 | ``` 101 | 102 | #### Code block indented with four spaces 103 | 104 | 105 | 106 | 107 | 108 | Example HTML5 Document 109 | 110 | 111 |

Test

112 | 113 | 114 | 115 | # List Types 116 | 117 | #### Ordered List 118 | 119 | 1. First item 120 | 2. Second item 121 | 3. Third item 122 | 123 | #### Unordered List 124 | 125 | - List item 126 | - Another item 127 | - And another item 128 | 129 | #### Nested list 130 | 131 | - Item 132 | 1. First Sub-item 133 | 2. Second Sub-item 134 | 135 | # Other Elements — abbr, sub, sup, kbd, mark 136 | 137 | GIF is a bitmap image format. 138 | 139 | H2O 140 | 141 | Xn + Yn = Zn 142 | 143 | Press CTRL+ALT+Delete to end the session. 144 | 145 | Most salamanders are nocturnal, and hunt for insects, worms, and 146 | other small creatures. 147 | 148 | # Katex 149 | 150 | $$ 151 | f(x) = \int\_{-\infty}^\infty\hat f(\xi)\,e^{2 \pi i \xi x}\,d\xi 152 | $$ 153 | 154 | $$ 155 | x_1 \\ 156 | x_2 \\ 157 | x_3 158 | \% 159 | $$ 160 | 161 | {% katex(block=true) %} 162 | 1\% \\ x 163 | {%end %} 164 | 165 | # Media 166 | 167 | ## Images 168 | 169 | ![Image Backgorund](/test.png) 170 | ![Another Media]() 171 | 172 | 173 | 174 | {{ resize_image(path="/test.png", width=150, height=100, op="scale",alt="Background image") }} 175 | 176 | ## Hints 177 | 178 | {% hint(style="warning") %} 179 | 123 180 | {% end %} 181 | 182 | {% hint() %} 183 | You can use the underscore operator in any position in the variables list to infer a type argument. 184 | {% end %} 185 | 186 | {% hint(style="critical") %} 187 | This feature might require plugin developers to take migration steps for their existing plugins. 188 | 189 | Learn how to prepare your plugin for the update in this YouTrack issue. 190 | {% end %} 191 | 192 | # Mermaid 193 | ``` 194 | flowchart TD 195 | Start --> Stop 196 | ``` 197 | 198 | {% mermaid() %} 199 | flowchart TD 200 | Start --> Stop 201 | {% end %} 202 | 203 | [^1]: 204 | The above quote is excerpted from Rob Pike's 205 | [talk](https://www.youtube.com/watch?v=PAAkCSZUG1c) during Gopherfest, 206 | November 18, 2015. 207 | -------------------------------------------------------------------------------- /content/reference/markdown-syntax.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Markdown Syntax Guide" 3 | date = "2019-03-11" 4 | description= "Sample article showcasing basic Markdown syntax and formatting for HTML elements." 5 | updated = "2022-08-18" 6 | weight = 2 7 | 8 | [extra] 9 | math = true 10 | diagrams = true 11 | authors = ["Konrad Geletey","Hugo Authors"] 12 | +++ 13 | 14 | This article offers a sample of basic Markdown syntax that can be used in Hugo 15 | content files, also it shows whether basic HTML elements are decorated with CSS 16 | in a Hugo theme. 17 | 18 | 19 | 20 | # Headings 21 | 22 | The following HTML `

`—`

` elements represent six levels of section 23 | headings. `

` is the highest section level while `

` is the lowest. 24 | 25 | # H1 26 | 27 | ## H2 28 | 29 | ### H3 30 | 31 | #### H4 32 | 33 | ##### H5 34 | 35 | ###### H6 36 | 37 | ## Paragraph 38 | 39 | Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, 40 | voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma 41 | dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as 42 | cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin 43 | porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? 44 | Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit 45 | ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda 46 | veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore 47 | eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata 48 | tiustia prat. 49 | 50 | Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne 51 | sapicia is sinveli squiatum, core et que aut hariosam ex eat. 52 | 53 | # Blockquotes 54 | 55 | The blockquote element represents content that is quoted from another source, 56 | optionally with a citation which must be within a `footer` or `cite` element, 57 | and optionally with in-line changes such as annotations and abbreviations. 58 | 59 | #### Blockquote without attribution 60 | 61 | > Tiam, ad mint andaepu dandae nostion secatur sequo quae. **Note** that you can 62 | > use _Markdown syntax_ within a blockquote. 63 | 64 | #### Blockquote with attribution 65 | 66 | > Don't communicate by sharing memory, share memory by communicating.

— 67 | > Rob Pike[^1] 68 | 69 | # Tables 70 | 71 | Tables aren't part of the core Markdown spec, but Hugo supports supports them 72 | out-of-the-box. 73 | 74 | | Name | Age | 75 | | ----- | --- | 76 | | Bob | 27 | 77 | | Alice | 23 | 78 | 79 | #### Inline Markdown within tables 80 | 81 | | Inline    | Markdown    | In    | Table | 82 | | ------------------------ | -------------------------- | ----------------------------------- | ------ | 83 | | _italics_ | **bold** | ~~strikethrough~~    | `code` | 84 | 85 | # Code Blocks 86 | 87 | #### Code block with backticks 88 | 89 | ```html 90 | 91 | 92 | 93 | 94 | Example HTML5 Document 95 | 96 | 97 |

Test

98 | 99 | 100 | ``` 101 | 102 | #### Code block indented with four spaces 103 | 104 | 105 | 106 | 107 | 108 | Example HTML5 Document 109 | 110 | 111 |

Test

112 | 113 | 114 | 115 | # List Types 116 | 117 | #### Ordered List 118 | 119 | 1. First item 120 | 2. Second item 121 | 3. Third item 122 | 123 | #### Unordered List 124 | 125 | - List item 126 | - Another item 127 | - And another item 128 | 129 | #### Nested list 130 | 131 | - Item 132 | 1. First Sub-item 133 | 2. Second Sub-item 134 | 135 | # Other Elements — abbr, sub, sup, kbd, mark 136 | 137 | GIF is a bitmap image format. 138 | 139 | H2O 140 | 141 | Xn + Yn = Zn 142 | 143 | Press CTRL+ALT+Delete to end the session. 144 | 145 | Most salamanders are nocturnal, and hunt for insects, worms, and 146 | other small creatures. 147 | 148 | # Katex 149 | 150 | $$ 151 | f(x) = \int\_{-\infty}^\infty\hat f(\xi)\,e^{2 \pi i \xi x}\,d\xi 152 | $$ 153 | 154 | $$ 155 | x_1 \\ 156 | x_2 \\ 157 | x_3 158 | \% 159 | $$ 160 | 161 | {% katex(block=true) %} 162 | 1\% \\ x 163 | {%end %} 164 | 165 | # Media 166 | 167 | ## Images 168 | 169 | ![Image Backgorund](/test.png) 170 | ![Another Media]() 171 | 172 | 173 | 174 | {{ resize_image(path="/test.png", width=150, height=100, op="scale",alt="Background image") }} 175 | 176 | ## Hints 177 | 178 | {% hint(style="warning") %} 179 | 123 180 | {% end %} 181 | 182 | {% hint() %} 183 | You can use the underscore operator in any position in the variables list to infer a type argument. 184 | {% end %} 185 | 186 | {% hint(style="critical") %} 187 | This feature might require plugin developers to take migration steps for their existing plugins. 188 | 189 | Learn how to prepare your plugin for the update in this YouTrack issue. 190 | {% end %} 191 | 192 | # Mermaid 193 | 194 | ``` 195 | flowchart TD 196 | Start --> Stop 197 | ``` 198 | 199 | {% mermaid() %} 200 | flowchart TD 201 | Start --> Stop 202 | {% end %} 203 | 204 | [^1]: 205 | 206 | The above quote is excerpted from Rob Pike's 207 | [talk](https://www.youtube.com/watch?v=PAAkCSZUG1c) during Gopherfest, 208 | November 18, 2015. 209 | -------------------------------------------------------------------------------- /templates/macros/folio.html: -------------------------------------------------------------------------------- 1 | {# table of content #} 2 | {% macro toc(page) %} 3 |
4 | 5 | 6 | 7 | {% if config.extra.repo and config.extra.repo_branch %} 8 | 20 | {% endif %} 21 | {% if config.languages %} 22 | {{ trans(key="toc_ita", lang=lang) }}: 23 | {% else %} 24 | In this article: 25 | {% endif %} 26 |
    27 | {% for h1 in page.toc %} 28 |
  • 29 | {{ h1.title }} 30 |
  • 31 | {% if not page.extra.disable_children %} 32 | {% for h2 in h1.children %} 33 |
  • 34 | {{ h2.title }} 35 |
  • 36 | {% endfor %} 37 | {% endif %} 38 | {% endfor %} 39 |
40 |
41 | {% endmacro %} 42 | 43 | {# sidebar #} 44 | {% macro sidebar(current_url) %} 45 | {% if config.default_language != lang %} 46 | {% set index = get_section(path="_index." ~ lang ~ ".md") %} 47 | {% else %} 48 | {% if config.extra.doc_section %} 49 | {% set index = get_section(path=doc_section ~ "_index.md") %} 50 | {% else %} 51 | {% set index = get_section(path="_index.md") %} 52 | {% endif %} 53 | {% endif %} 54 | 55 | 96 | {% endmacro %} 97 | 98 | {% macro relative_path() %} 99 | {% if config.extra.relative_path or page.extra.relative_path %} 100 | {% for parent in page.ancestors %} 101 | {% set s = get_section(path=parent, include_pages=false) %} 102 |
  • 103 | /{{s.title | lower }} 104 |
  • 105 | {% endfor %} 106 |
  • /{{ page.slug }}
  • 107 | {% endif %} 108 | {% endmacro %} 109 | 110 | {% macro taxonomies_authors() %} 111 | {% if page.extra.authors %} 112 |
  • 113 | {% if config.languages %} 114 | {{ trans(key="authors", lang=lang) }}: 115 | {% else %} 116 | Authors: 117 | {% endif %} 118 | {% for author in page.extra.authors %} 119 |
  • 120 | {# #} 121 | {{ author }} 122 | {# #} 123 |
  • 124 | {% endfor %} 125 | 126 | {% endif %} 127 | {% endmacro %} 128 | 129 | {% macro date(type) %} 130 | {% if type.date %} 131 |
  • 132 | 140 |
  • 141 | {% endif %} 142 | {% endmacro %} 143 | 144 | {% macro updated(type) %} 145 | {% if type.updated %} 146 |
  • 147 | 155 |
  • 156 | {% endif %} 157 | {% endmacro %} 158 | 159 | {% macro word_count(type) %} 160 | {% if config.extra.show_word_count %} 161 |
  • 162 | 163 | {{ type.word_count }} 164 | {% if config.languages %} 165 | {{ trans(key = "words", lang=lang) }} 166 | {% else %} 167 | words 168 | {% endif %} 169 |
  • 170 | {% endif %} 171 | {% endmacro %} 172 | 173 | {% macro reading_time() %} 174 | {% if config.extra.show_reading_time %} 175 |
  • 176 | 177 | {% if page.reading_time > 1 %} {{ page.reading_time}} minutes {% elif page.reading_time == 0 %} less minute {% else %} {{ page.reading_time}} minute {% endif %} to read 178 | 179 |
  • 180 | {% endif %} 181 | {% endmacro %} 182 | 183 | -------------------------------------------------------------------------------- /templates/macros/header.html: -------------------------------------------------------------------------------- 1 | {# header component #} 2 | {% macro header(current_url) %} 3 | {% if config.extra.announcement_file %} 4 | {{ top_nav::alert(file=config.extra.announcement_file) }} 5 | {% endif %} 6 | {% set current_link = current_url | safe | trim_end_matches(pat="/") %} 7 | {% if config.extra.header_file %} 8 | {% set h = load_data(path=config.extra.header_file | safe) %} 9 | {% endif %} 10 |
    11 | 91 |
    92 | {% endmacro %} 93 | 94 | {% macro alert(file) %} 95 | {% set alert = load_data(path=file | safe) %} 96 |
    111 | {% if alert.translations %} 112 | {% for trs in alert.translations %} 113 | {% if trs.lang == lang %} 114 | {{ trs.text | safe }} 115 | {% endif %} 116 | {% endfor %} 117 | {% else %} 118 | {{ alert.text | safe }} 119 | {% endif %} 120 | {% if alert.dismissable %} 121 | 124 | {% endif %} 125 |
    126 | {% if alert.dismissable %} 127 | {{ macros::scripts(file="alert-close.js") }} 128 | {% endif %} 129 | {% endmacro %} 130 | 131 | {% macro links(item,current_url) %} 132 | {% set item_link = item.link | replace(from = "@", to=config.base_url) %} 133 | {% if item.lang and lang != config.default_language %} 134 | {% set item_link = item.link | replace(from="@", to=config.base_url ~ "/" ~ lang) %} 135 | {% endif %} 136 | {% set item_target = item.target | default(value="_self") %} 137 |
  • 138 | {% if item.svg %} 139 | 146 | {% endif %} 147 | 164 |
  • 165 | {% endmacro %} 166 | -------------------------------------------------------------------------------- /islands/search.ts: -------------------------------------------------------------------------------- 1 | let suggestions: HTMLElement = document.querySelector("div.items"); 2 | let body: HTMLElement = 3 | document.querySelector("main") || document.querySelector("section"); 4 | let userinput = document.querySelector("input.search"); 5 | 6 | const btn_clear = document.querySelector("form button.clear"); 7 | 8 | function clear_search() { 9 | userinput.value = ""; 10 | for (let i of [suggestions, btn_clear]) { 11 | i.style.display = "none"; 12 | } 13 | userinput.blur(); 14 | if (window.matchMedia("(max-width: 1000px)").matches) { 15 | document.querySelector("header nav form").style.display = "none"; 16 | document.querySelectorAll("header ul").forEach((p) => { 17 | p.style.display = "inherit"; 18 | }); 19 | } 20 | } 21 | 22 | btn_clear.addEventListener("click", clear_search); 23 | 24 | // in page results when press enter or click search icon from search box 25 | function close_search() { 26 | document.getElementById("close-search")!.onclick = function () { 27 | location.reload(); 28 | }; 29 | } 30 | 31 | function mobile_open_search() { 32 | document.querySelectorAll("header ul").forEach((p) => { 33 | p.style.display = "none"; 34 | }); 35 | document.querySelector("header nav form")!.style.display = "flex"; 36 | userinput.focus(); 37 | } 38 | 39 | document 40 | .querySelector("button.search") 41 | .addEventListener("click", mobile_open_search); 42 | 43 | function search() { 44 | let results_clone = suggestions.cloneNode(true); 45 | 46 | let main: HTMLElement = document.createElement("main"); 47 | main.classList.add("full-screen"); 48 | 49 | const close_button: string = 50 | ''; 51 | 52 | let button = document.createElement("button"); 53 | button.id = "close-search"; 54 | 55 | button.innerHTML = close_button; 56 | 57 | let n = new Set([button, results_clone]); 58 | 59 | for (let i of n) { 60 | main.appendChild(i); 61 | } 62 | 63 | if (!document.querySelector("main")) { 64 | if (document.querySelector("div.welcome")) { 65 | document.querySelector("div.welcome").remove(); 66 | } 67 | document.querySelector("section").replaceWith(main); 68 | } else { 69 | document.querySelector("main").replaceWith(main); 70 | } 71 | 72 | suggestions.innerHTML = ""; 73 | close_search(); 74 | return false; 75 | } 76 | 77 | window.onload = function () { 78 | document.body.contains(document.go_search) && 79 | (document.go_search.onsubmit = function () { 80 | return search(); 81 | }); 82 | }; 83 | 84 | function inputFocus(e) { 85 | if (e.key === "/" && document.activeElement.tagName != "input") { 86 | e.preventDefault(); 87 | userinput.focus(); 88 | } else if (e.key == "Escape") { 89 | clear_search(); 90 | } 91 | btn_clear.style.display = "block"; 92 | } 93 | 94 | function suggestionFocus(e) { 95 | const focusableSuggestions = suggestions.querySelectorAll("a"); 96 | if (focusableSuggestions.length == 0 || userinput.style.display == "none") { 97 | return; 98 | } 99 | 100 | const focusable = [...focusableSuggestions]; 101 | const index = focusable.indexOf(document.activeElement); 102 | 103 | let nextIndex = 0; 104 | 105 | if (e.keyCode === 38) { 106 | e.preventDefault(); 107 | nextIndex = index > 0 ? index - 1 : 0; 108 | focusableSuggestions[nextIndex].focus(); 109 | } else if (e.keyCode === 40) { 110 | e.preventDefault(); 111 | nextIndex = index + 1 < focusable.length ? index + 1 : index; 112 | focusableSuggestions[nextIndex].focus(); 113 | } 114 | } 115 | 116 | document.addEventListener("keydown", inputFocus); 117 | document.addEventListener("keydown", suggestionFocus); 118 | 119 | // Get substring by bytes 120 | // If using JavaScript inline substring method, it will return error codes 121 | // Source: https://www.52pojie.cn/thread-1059814-1-1.html 122 | function substringByByte(str, maxLength) { 123 | let result = ""; 124 | let flag = false; 125 | let len = 0; 126 | let length = 0; 127 | let length2 = 0; 128 | for (let i = 0; i < str.length; i++) { 129 | let code = str.codePointAt(i).toString(16); 130 | if (code.length > 4) { 131 | i++; 132 | if (i + 1 < str.length) { 133 | flag = str.codePointAt(i + 1).toString(16) == "200d"; 134 | } 135 | } 136 | if (flag) { 137 | len += getByteByHex(code); 138 | if (i == str.length - 1) { 139 | length += len; 140 | if (length <= maxLength) { 141 | result += str.substr(length2, i - length2 + 1); 142 | } else { 143 | break; 144 | } 145 | } 146 | } else { 147 | if (len != 0) { 148 | length += len; 149 | length += getByteByHex(code); 150 | if (length <= maxLength) { 151 | result += str.substr(length2, i - length2 + 1); 152 | length2 = i + 1; 153 | } else { 154 | break; 155 | } 156 | len = 0; 157 | continue; 158 | } 159 | length += getByteByHex(code); 160 | if (length <= maxLength) { 161 | if (code.length <= 4) { 162 | result += str[i]; 163 | } else { 164 | result += str[i - 1] + str[i]; 165 | } 166 | length2 = i + 1; 167 | } else { 168 | break; 169 | } 170 | } 171 | } 172 | return result; 173 | } 174 | 175 | // Get the string bytes from binary 176 | function getByteByBinary(binaryCode) { 177 | // Binary system, starts with `0b` in ES6 178 | // Octal number system, starts with `0` in ES5 and starts with `0o` in ES6 179 | // Hexadecimal, starts with `0x` in both ES5 and ES6 180 | let byteLengthDatas = [0, 1, 2, 3, 4]; 181 | let len = byteLengthDatas[Math.ceil(binaryCode.length / 8)]; 182 | return len; 183 | } 184 | 185 | // Get the string bytes from hexadecimal 186 | function getByteByHex(hexCode) { 187 | return getByteByBinary(parseInt(hexCode, 16).toString(2)); 188 | } 189 | 190 | /* 191 | Source: 192 | - https://github.com/nextapps-de/flexsearch#index-documents-field-search 193 | - https://raw.githack.com/nextapps-de/flexsearch/master/demo/autocomplete.html 194 | - http://elasticlunr.com/ 195 | - https://github.com/getzola/zola/blob/master/docs/static/search.js 196 | - https://github.com/aaranxu/adidoks/blob/main/static/js/search.js 197 | */ 198 | (function () { 199 | let index = elasticlunr.Index.load(window.searchIndex); 200 | userinput.addEventListener("input", show_results, true); 201 | suggestions.addEventListener("click", accept_suggestion, true); 202 | // if (userinput.value != '') { 203 | //} 204 | 205 | function show_results() { 206 | let value = this.value.trim(); 207 | let options = { 208 | bool: "OR", 209 | fields: { 210 | title: { boost: 2 }, 211 | body: { boost: 1 }, 212 | }, 213 | }; 214 | let results = index.search(value, options); 215 | 216 | let entry, 217 | childs = suggestions.childNodes; 218 | let i = 0, 219 | len = results.length; 220 | let items = value.split(/\s+/); 221 | suggestions.style.display = "block"; 222 | 223 | results.forEach(function (page) { 224 | if (page.doc.body !== "") { 225 | entry = document.createElement("div"); 226 | 227 | entry.innerHTML = ""; 228 | 229 | (a = entry.querySelector("a")), 230 | (t = entry.querySelector("span:first-child")), 231 | (d = entry.querySelector("span:nth-child(2)")); 232 | a.href = page.ref; 233 | t.textContent = page.doc.title; 234 | d.innerHTML = makeTeaser(page.doc.body, items); 235 | 236 | suggestions.appendChild(entry); 237 | } 238 | }); 239 | 240 | while (childs.length > len) { 241 | suggestions.removeChild(childs[i]); 242 | } 243 | } 244 | 245 | function accept_suggestion() { 246 | while (suggestions.lastChild) { 247 | suggestions.removeChild(suggestions.lastChild); 248 | } 249 | 250 | return false; 251 | } 252 | 253 | // Taken from mdbook 254 | // The strategy is as follows: 255 | // First, assign a value to each word in the document: 256 | // Words that correspond to search terms (stemmer aware): 40 257 | // Normal words: 2 258 | // First word in a sentence: 8 259 | // Then use a sliding window with a constant number of words and count the 260 | // sum of the values of the words within the window. Then use the window that got the 261 | // maximum sum. If there are multiple maximas, then get the last one. 262 | // Enclose the terms in . 263 | function makeTeaser(body, terms) { 264 | let TERM_WEIGHT = 40; 265 | let NORMAL_WORD_WEIGHT = 2; 266 | let FIRST_WORD_WEIGHT = 8; 267 | let TEASER_MAX_WORDS = 30; 268 | 269 | let stemmedTerms = terms.map(function (w) { 270 | return elasticlunr.stemmer(w.toLowerCase()); 271 | }); 272 | let termFound = false; 273 | let index = 0; 274 | let weighted = []; // contains elements of ["word", weight, index_in_document] 275 | 276 | // split in sentences, then words 277 | let sentences = body.toLowerCase().split(". "); 278 | for (let i in sentences) { 279 | let words = sentences[i].split(/[\s\n]/); 280 | let value = FIRST_WORD_WEIGHT; 281 | for (let j in words) { 282 | let word = words[j]; 283 | 284 | if (word.length > 0) { 285 | for (let k in stemmedTerms) { 286 | if (elasticlunr.stemmer(word).startsWith(stemmedTerms[k])) { 287 | value = TERM_WEIGHT; 288 | termFound = true; 289 | } 290 | } 291 | weighted.push([word, value, index]); 292 | value = NORMAL_WORD_WEIGHT; 293 | } 294 | 295 | index += word.length; 296 | index += 1; // ' ' or '.' if last word in sentence 297 | } 298 | 299 | index += 1; // because we split at a two-char boundary '. ' 300 | } 301 | 302 | if (weighted.length === 0) { 303 | if (body.length !== undefined && body.length > TEASER_MAX_WORDS * 10) { 304 | return body.substring(0, TEASER_MAX_WORDS * 10) + "..."; 305 | } else { 306 | return body; 307 | } 308 | } 309 | 310 | let windowWeights = []; 311 | let windowSize = Math.min(weighted.length, TEASER_MAX_WORDS); 312 | // We add a window with all the weights first 313 | let curSum = 0; 314 | for (let i = 0; i < windowSize; i++) { 315 | curSum += weighted[i][1]; 316 | } 317 | windowWeights.push(curSum); 318 | 319 | for (let i = 0; i < weighted.length - windowSize; i++) { 320 | curSum -= weighted[i][1]; 321 | curSum += weighted[i + windowSize][1]; 322 | windowWeights.push(curSum); 323 | } 324 | 325 | // If we didn't find the term, just pick the first window 326 | let maxSumIndex = 0; 327 | if (termFound) { 328 | let maxFound = 0; 329 | // backwards 330 | for (let i = windowWeights.length - 1; i >= 0; i--) { 331 | if (windowWeights[i] > maxFound) { 332 | maxFound = windowWeights[i]; 333 | maxSumIndex = i; 334 | } 335 | } 336 | } 337 | 338 | let teaser = []; 339 | let startIndex = weighted[maxSumIndex][2]; 340 | for (let i = maxSumIndex; i < maxSumIndex + windowSize; i++) { 341 | let word = weighted[i]; 342 | if (startIndex < word[2]) { 343 | // missing text from index to start of `word` 344 | teaser.push(body.substring(startIndex, word[2])); 345 | startIndex = word[2]; 346 | } 347 | 348 | // add around search terms 349 | if (word[1] === TERM_WEIGHT) { 350 | teaser.push(""); 351 | } 352 | 353 | startIndex = word[2] + word[0].length; 354 | // Check the string is ascii characters or not 355 | let re = /^[\x00-\xff]+$/; 356 | if ( 357 | word[1] !== TERM_WEIGHT && 358 | word[0].length >= 12 && 359 | !re.test(word[0]) 360 | ) { 361 | // If the string's length is too long, it maybe a Chinese/Japance/Korean article 362 | // if using substring method directly, it may occur error codes on emoji chars 363 | let strBefor = body.substring(word[2], startIndex); 364 | let strAfter = substringByByte(strBefor, 12); 365 | teaser.push(strAfter); 366 | } else { 367 | teaser.push(body.substring(word[2], startIndex)); 368 | } 369 | 370 | if (word[1] === TERM_WEIGHT) { 371 | teaser.push(""); 372 | } 373 | } 374 | teaser.push("…"); 375 | return teaser.join(""); 376 | } 377 | document.body.contains(document.go_search) && 378 | (document.go_search.onsubmit = function () { 379 | return search(); 380 | }); 381 | })(); 382 | -------------------------------------------------------------------------------- /dist/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "karzok", 3 | "version": "0.2.9", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "karzok", 9 | "version": "0.2.9", 10 | "dependencies": { 11 | "@fontsource/inter": "^4.5.15", 12 | "@fontsource/jetbrains-mono": "^4.5.12", 13 | "katex": "^0.16.4", 14 | "mermaid": "^9.3.0", 15 | "modern-normalize": "^1.1.0" 16 | }, 17 | "devDependencies": { 18 | "zola-bin": "^0.3.5" 19 | } 20 | }, 21 | "node_modules/@braintree/sanitize-url": { 22 | "version": "6.0.0", 23 | "license": "MIT" 24 | }, 25 | "node_modules/@fontsource/inter": { 26 | "version": "4.5.15", 27 | "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.15.tgz", 28 | "integrity": "sha512-FzleM9AxZQK2nqsTDtBiY0PMEVWvnKnuu2i09+p6DHvrHsuucoV2j0tmw+kAT3L4hvsLdAIDv6MdGehsPIdT+Q==" 29 | }, 30 | "node_modules/@fontsource/jetbrains-mono": { 31 | "version": "4.5.12", 32 | "resolved": "https://registry.npmjs.org/@fontsource/jetbrains-mono/-/jetbrains-mono-4.5.12.tgz", 33 | "integrity": "sha512-LJF1ala1/u+wXZmESFqIk08FA9yGX4/uAAleCHmXUMgEjvNAYFHUQQ7eK5hQQoBOwh99cU5suTrqYqEkgzwzPA==" 34 | }, 35 | "node_modules/commander": { 36 | "version": "8.3.0", 37 | "license": "MIT", 38 | "engines": { 39 | "node": ">= 12" 40 | } 41 | }, 42 | "node_modules/d3": { 43 | "version": "7.8.2", 44 | "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.2.tgz", 45 | "integrity": "sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==", 46 | "dependencies": { 47 | "d3-array": "3", 48 | "d3-axis": "3", 49 | "d3-brush": "3", 50 | "d3-chord": "3", 51 | "d3-color": "3", 52 | "d3-contour": "4", 53 | "d3-delaunay": "6", 54 | "d3-dispatch": "3", 55 | "d3-drag": "3", 56 | "d3-dsv": "3", 57 | "d3-ease": "3", 58 | "d3-fetch": "3", 59 | "d3-force": "3", 60 | "d3-format": "3", 61 | "d3-geo": "3", 62 | "d3-hierarchy": "3", 63 | "d3-interpolate": "3", 64 | "d3-path": "3", 65 | "d3-polygon": "3", 66 | "d3-quadtree": "3", 67 | "d3-random": "3", 68 | "d3-scale": "4", 69 | "d3-scale-chromatic": "3", 70 | "d3-selection": "3", 71 | "d3-shape": "3", 72 | "d3-time": "3", 73 | "d3-time-format": "4", 74 | "d3-timer": "3", 75 | "d3-transition": "3", 76 | "d3-zoom": "3" 77 | }, 78 | "engines": { 79 | "node": ">=12" 80 | } 81 | }, 82 | "node_modules/d3-array": { 83 | "version": "3.2.0", 84 | "license": "ISC", 85 | "dependencies": { 86 | "internmap": "1 - 2" 87 | }, 88 | "engines": { 89 | "node": ">=12" 90 | } 91 | }, 92 | "node_modules/d3-axis": { 93 | "version": "3.0.0", 94 | "license": "ISC", 95 | "engines": { 96 | "node": ">=12" 97 | } 98 | }, 99 | "node_modules/d3-brush": { 100 | "version": "3.0.0", 101 | "license": "ISC", 102 | "dependencies": { 103 | "d3-dispatch": "1 - 3", 104 | "d3-drag": "2 - 3", 105 | "d3-interpolate": "1 - 3", 106 | "d3-selection": "3", 107 | "d3-transition": "3" 108 | }, 109 | "engines": { 110 | "node": ">=12" 111 | } 112 | }, 113 | "node_modules/d3-chord": { 114 | "version": "3.0.1", 115 | "license": "ISC", 116 | "dependencies": { 117 | "d3-path": "1 - 3" 118 | }, 119 | "engines": { 120 | "node": ">=12" 121 | } 122 | }, 123 | "node_modules/d3-color": { 124 | "version": "3.1.0", 125 | "license": "ISC", 126 | "engines": { 127 | "node": ">=12" 128 | } 129 | }, 130 | "node_modules/d3-contour": { 131 | "version": "4.0.0", 132 | "license": "ISC", 133 | "dependencies": { 134 | "d3-array": "^3.2.0" 135 | }, 136 | "engines": { 137 | "node": ">=12" 138 | } 139 | }, 140 | "node_modules/d3-delaunay": { 141 | "version": "6.0.2", 142 | "license": "ISC", 143 | "dependencies": { 144 | "delaunator": "5" 145 | }, 146 | "engines": { 147 | "node": ">=12" 148 | } 149 | }, 150 | "node_modules/d3-dispatch": { 151 | "version": "3.0.1", 152 | "license": "ISC", 153 | "engines": { 154 | "node": ">=12" 155 | } 156 | }, 157 | "node_modules/d3-drag": { 158 | "version": "3.0.0", 159 | "license": "ISC", 160 | "dependencies": { 161 | "d3-dispatch": "1 - 3", 162 | "d3-selection": "3" 163 | }, 164 | "engines": { 165 | "node": ">=12" 166 | } 167 | }, 168 | "node_modules/d3-dsv": { 169 | "version": "3.0.1", 170 | "license": "ISC", 171 | "dependencies": { 172 | "commander": "7", 173 | "iconv-lite": "0.6", 174 | "rw": "1" 175 | }, 176 | "bin": { 177 | "csv2json": "bin/dsv2json.js", 178 | "csv2tsv": "bin/dsv2dsv.js", 179 | "dsv2dsv": "bin/dsv2dsv.js", 180 | "dsv2json": "bin/dsv2json.js", 181 | "json2csv": "bin/json2dsv.js", 182 | "json2dsv": "bin/json2dsv.js", 183 | "json2tsv": "bin/json2dsv.js", 184 | "tsv2csv": "bin/dsv2dsv.js", 185 | "tsv2json": "bin/dsv2json.js" 186 | }, 187 | "engines": { 188 | "node": ">=12" 189 | } 190 | }, 191 | "node_modules/d3-dsv/node_modules/commander": { 192 | "version": "7.2.0", 193 | "license": "MIT", 194 | "engines": { 195 | "node": ">= 10" 196 | } 197 | }, 198 | "node_modules/d3-ease": { 199 | "version": "3.0.1", 200 | "license": "BSD-3-Clause", 201 | "engines": { 202 | "node": ">=12" 203 | } 204 | }, 205 | "node_modules/d3-fetch": { 206 | "version": "3.0.1", 207 | "license": "ISC", 208 | "dependencies": { 209 | "d3-dsv": "1 - 3" 210 | }, 211 | "engines": { 212 | "node": ">=12" 213 | } 214 | }, 215 | "node_modules/d3-force": { 216 | "version": "3.0.0", 217 | "license": "ISC", 218 | "dependencies": { 219 | "d3-dispatch": "1 - 3", 220 | "d3-quadtree": "1 - 3", 221 | "d3-timer": "1 - 3" 222 | }, 223 | "engines": { 224 | "node": ">=12" 225 | } 226 | }, 227 | "node_modules/d3-format": { 228 | "version": "3.1.0", 229 | "license": "ISC", 230 | "engines": { 231 | "node": ">=12" 232 | } 233 | }, 234 | "node_modules/d3-geo": { 235 | "version": "3.0.1", 236 | "license": "ISC", 237 | "dependencies": { 238 | "d3-array": "2.5.0 - 3" 239 | }, 240 | "engines": { 241 | "node": ">=12" 242 | } 243 | }, 244 | "node_modules/d3-hierarchy": { 245 | "version": "3.1.2", 246 | "license": "ISC", 247 | "engines": { 248 | "node": ">=12" 249 | } 250 | }, 251 | "node_modules/d3-interpolate": { 252 | "version": "3.0.1", 253 | "license": "ISC", 254 | "dependencies": { 255 | "d3-color": "1 - 3" 256 | }, 257 | "engines": { 258 | "node": ">=12" 259 | } 260 | }, 261 | "node_modules/d3-path": { 262 | "version": "3.0.1", 263 | "license": "ISC", 264 | "engines": { 265 | "node": ">=12" 266 | } 267 | }, 268 | "node_modules/d3-polygon": { 269 | "version": "3.0.1", 270 | "license": "ISC", 271 | "engines": { 272 | "node": ">=12" 273 | } 274 | }, 275 | "node_modules/d3-quadtree": { 276 | "version": "3.0.1", 277 | "license": "ISC", 278 | "engines": { 279 | "node": ">=12" 280 | } 281 | }, 282 | "node_modules/d3-random": { 283 | "version": "3.0.1", 284 | "license": "ISC", 285 | "engines": { 286 | "node": ">=12" 287 | } 288 | }, 289 | "node_modules/d3-scale": { 290 | "version": "4.0.2", 291 | "license": "ISC", 292 | "dependencies": { 293 | "d3-array": "2.10.0 - 3", 294 | "d3-format": "1 - 3", 295 | "d3-interpolate": "1.2.0 - 3", 296 | "d3-time": "2.1.1 - 3", 297 | "d3-time-format": "2 - 4" 298 | }, 299 | "engines": { 300 | "node": ">=12" 301 | } 302 | }, 303 | "node_modules/d3-scale-chromatic": { 304 | "version": "3.0.0", 305 | "license": "ISC", 306 | "dependencies": { 307 | "d3-color": "1 - 3", 308 | "d3-interpolate": "1 - 3" 309 | }, 310 | "engines": { 311 | "node": ">=12" 312 | } 313 | }, 314 | "node_modules/d3-selection": { 315 | "version": "3.0.0", 316 | "license": "ISC", 317 | "engines": { 318 | "node": ">=12" 319 | } 320 | }, 321 | "node_modules/d3-shape": { 322 | "version": "3.1.0", 323 | "license": "ISC", 324 | "dependencies": { 325 | "d3-path": "1 - 3" 326 | }, 327 | "engines": { 328 | "node": ">=12" 329 | } 330 | }, 331 | "node_modules/d3-time": { 332 | "version": "3.0.0", 333 | "license": "ISC", 334 | "dependencies": { 335 | "d3-array": "2 - 3" 336 | }, 337 | "engines": { 338 | "node": ">=12" 339 | } 340 | }, 341 | "node_modules/d3-time-format": { 342 | "version": "4.1.0", 343 | "license": "ISC", 344 | "dependencies": { 345 | "d3-time": "1 - 3" 346 | }, 347 | "engines": { 348 | "node": ">=12" 349 | } 350 | }, 351 | "node_modules/d3-timer": { 352 | "version": "3.0.1", 353 | "license": "ISC", 354 | "engines": { 355 | "node": ">=12" 356 | } 357 | }, 358 | "node_modules/d3-transition": { 359 | "version": "3.0.1", 360 | "license": "ISC", 361 | "dependencies": { 362 | "d3-color": "1 - 3", 363 | "d3-dispatch": "1 - 3", 364 | "d3-ease": "1 - 3", 365 | "d3-interpolate": "1 - 3", 366 | "d3-timer": "1 - 3" 367 | }, 368 | "engines": { 369 | "node": ">=12" 370 | }, 371 | "peerDependencies": { 372 | "d3-selection": "2 - 3" 373 | } 374 | }, 375 | "node_modules/d3-zoom": { 376 | "version": "3.0.0", 377 | "license": "ISC", 378 | "dependencies": { 379 | "d3-dispatch": "1 - 3", 380 | "d3-drag": "2 - 3", 381 | "d3-interpolate": "1 - 3", 382 | "d3-selection": "2 - 3", 383 | "d3-transition": "2 - 3" 384 | }, 385 | "engines": { 386 | "node": ">=12" 387 | } 388 | }, 389 | "node_modules/dagre-d3-es": { 390 | "version": "7.0.6", 391 | "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.6.tgz", 392 | "integrity": "sha512-CaaE/nZh205ix+Up4xsnlGmpog5GGm81Upi2+/SBHxwNwrccBb3K51LzjZ1U6hgvOlAEUsVWf1xSTzCyKpJ6+Q==", 393 | "dependencies": { 394 | "d3": "^7.7.0", 395 | "lodash-es": "^4.17.21" 396 | } 397 | }, 398 | "node_modules/delaunator": { 399 | "version": "5.0.0", 400 | "license": "ISC", 401 | "dependencies": { 402 | "robust-predicates": "^3.0.0" 403 | } 404 | }, 405 | "node_modules/dompurify": { 406 | "version": "2.4.1", 407 | "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", 408 | "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==" 409 | }, 410 | "node_modules/dotenv": { 411 | "version": "16.0.1", 412 | "dev": true, 413 | "license": "BSD-2-Clause", 414 | "engines": { 415 | "node": ">=12" 416 | } 417 | }, 418 | "node_modules/iconv-lite": { 419 | "version": "0.6.3", 420 | "license": "MIT", 421 | "dependencies": { 422 | "safer-buffer": ">= 2.1.2 < 3.0.0" 423 | }, 424 | "engines": { 425 | "node": ">=0.10.0" 426 | } 427 | }, 428 | "node_modules/internmap": { 429 | "version": "2.0.3", 430 | "license": "ISC", 431 | "engines": { 432 | "node": ">=12" 433 | } 434 | }, 435 | "node_modules/katex": { 436 | "version": "0.16.4", 437 | "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.4.tgz", 438 | "integrity": "sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw==", 439 | "funding": [ 440 | "https://opencollective.com/katex", 441 | "https://github.com/sponsors/katex" 442 | ], 443 | "dependencies": { 444 | "commander": "^8.0.0" 445 | }, 446 | "bin": { 447 | "katex": "cli.js" 448 | } 449 | }, 450 | "node_modules/khroma": { 451 | "version": "2.0.0" 452 | }, 453 | "node_modules/lodash-es": { 454 | "version": "4.17.21", 455 | "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", 456 | "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" 457 | }, 458 | "node_modules/mermaid": { 459 | "version": "9.3.0", 460 | "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.3.0.tgz", 461 | "integrity": "sha512-mGl0BM19TD/HbU/LmlaZbjBi//tojelg8P/mxD6pPZTAYaI+VawcyBdqRsoUHSc7j71PrMdJ3HBadoQNdvP5cg==", 462 | "dependencies": { 463 | "@braintree/sanitize-url": "^6.0.0", 464 | "d3": "^7.0.0", 465 | "dagre-d3-es": "7.0.6", 466 | "dompurify": "2.4.1", 467 | "khroma": "^2.0.0", 468 | "lodash-es": "^4.17.21", 469 | "moment-mini": "^2.24.0", 470 | "non-layered-tidy-tree-layout": "^2.0.2", 471 | "stylis": "^4.1.2", 472 | "uuid": "^9.0.0" 473 | } 474 | }, 475 | "node_modules/modern-normalize": { 476 | "version": "1.1.0", 477 | "license": "MIT", 478 | "engines": { 479 | "node": ">=6" 480 | }, 481 | "funding": { 482 | "url": "https://github.com/sponsors/sindresorhus" 483 | } 484 | }, 485 | "node_modules/moment-mini": { 486 | "version": "2.24.0", 487 | "license": "MIT" 488 | }, 489 | "node_modules/non-layered-tidy-tree-layout": { 490 | "version": "2.0.2", 491 | "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", 492 | "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" 493 | }, 494 | "node_modules/robust-predicates": { 495 | "version": "3.0.1", 496 | "license": "Unlicense" 497 | }, 498 | "node_modules/rw": { 499 | "version": "1.3.3", 500 | "license": "BSD-3-Clause" 501 | }, 502 | "node_modules/safer-buffer": { 503 | "version": "2.1.2", 504 | "license": "MIT" 505 | }, 506 | "node_modules/stylis": { 507 | "version": "4.1.3", 508 | "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", 509 | "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" 510 | }, 511 | "node_modules/uuid": { 512 | "version": "9.0.0", 513 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", 514 | "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", 515 | "bin": { 516 | "uuid": "dist/bin/uuid" 517 | } 518 | }, 519 | "node_modules/zola-bin": { 520 | "version": "0.3.5", 521 | "dev": true, 522 | "license": "MIT", 523 | "dependencies": { 524 | "dotenv": "16.0.1" 525 | }, 526 | "bin": { 527 | "zola-bin": "bin/zola.js" 528 | }, 529 | "engines": { 530 | "node": ">=14.0.0" 531 | }, 532 | "optionalDependencies": { 533 | "zola-bin-darwin": "^0.16.2", 534 | "zola-bin-linux": "^0.16.2", 535 | "zola-bin-win32": "^0.16.2" 536 | } 537 | }, 538 | "node_modules/zola-bin-linux": { 539 | "version": "0.16.2", 540 | "dev": true, 541 | "license": "MIT", 542 | "optional": true, 543 | "os": [ 544 | "linux" 545 | ] 546 | }, 547 | "node_modules/zola-bin/node_modules/zola-bin-darwin": { 548 | "version": "0.16.2", 549 | "resolved": "https://registry.npmjs.org/zola-bin-darwin/-/zola-bin-darwin-0.16.2.tgz", 550 | "integrity": "sha512-r3UX4xG7KLZfy8ta9I6MIlPVi60yBJx2z0xdWHJNEUatbRsnSShp2WoJFce/SMTxqxOjbt9gmCJDcAPybNpaYg==", 551 | "dev": true, 552 | "optional": true, 553 | "os": [ 554 | "darwin" 555 | ] 556 | }, 557 | "node_modules/zola-bin/node_modules/zola-bin-win32": { 558 | "version": "0.16.2", 559 | "resolved": "https://registry.npmjs.org/zola-bin-win32/-/zola-bin-win32-0.16.2.tgz", 560 | "integrity": "sha512-UVvpJllZoWZc/dmVfsI6eGG2R8G5Yqchgfa95RYi/I18ePN4Cz/0Wg3pInqCc37qL0DymYg8czODjQ5eLftYBQ==", 561 | "dev": true, 562 | "optional": true, 563 | "os": [ 564 | "win32" 565 | ] 566 | } 567 | }, 568 | "dependencies": { 569 | "@braintree/sanitize-url": { 570 | "version": "6.0.0" 571 | }, 572 | "@fontsource/inter": { 573 | "version": "4.5.15", 574 | "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-4.5.15.tgz", 575 | "integrity": "sha512-FzleM9AxZQK2nqsTDtBiY0PMEVWvnKnuu2i09+p6DHvrHsuucoV2j0tmw+kAT3L4hvsLdAIDv6MdGehsPIdT+Q==" 576 | }, 577 | "@fontsource/jetbrains-mono": { 578 | "version": "4.5.12", 579 | "resolved": "https://registry.npmjs.org/@fontsource/jetbrains-mono/-/jetbrains-mono-4.5.12.tgz", 580 | "integrity": "sha512-LJF1ala1/u+wXZmESFqIk08FA9yGX4/uAAleCHmXUMgEjvNAYFHUQQ7eK5hQQoBOwh99cU5suTrqYqEkgzwzPA==" 581 | }, 582 | "commander": { 583 | "version": "8.3.0" 584 | }, 585 | "d3": { 586 | "version": "7.8.2", 587 | "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.2.tgz", 588 | "integrity": "sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==", 589 | "requires": { 590 | "d3-array": "3", 591 | "d3-axis": "3", 592 | "d3-brush": "3", 593 | "d3-chord": "3", 594 | "d3-color": "3", 595 | "d3-contour": "4", 596 | "d3-delaunay": "6", 597 | "d3-dispatch": "3", 598 | "d3-drag": "3", 599 | "d3-dsv": "3", 600 | "d3-ease": "3", 601 | "d3-fetch": "3", 602 | "d3-force": "3", 603 | "d3-format": "3", 604 | "d3-geo": "3", 605 | "d3-hierarchy": "3", 606 | "d3-interpolate": "3", 607 | "d3-path": "3", 608 | "d3-polygon": "3", 609 | "d3-quadtree": "3", 610 | "d3-random": "3", 611 | "d3-scale": "4", 612 | "d3-scale-chromatic": "3", 613 | "d3-selection": "3", 614 | "d3-shape": "3", 615 | "d3-time": "3", 616 | "d3-time-format": "4", 617 | "d3-timer": "3", 618 | "d3-transition": "3", 619 | "d3-zoom": "3" 620 | } 621 | }, 622 | "d3-array": { 623 | "version": "3.2.0", 624 | "requires": { 625 | "internmap": "1 - 2" 626 | } 627 | }, 628 | "d3-axis": { 629 | "version": "3.0.0" 630 | }, 631 | "d3-brush": { 632 | "version": "3.0.0", 633 | "requires": { 634 | "d3-dispatch": "1 - 3", 635 | "d3-drag": "2 - 3", 636 | "d3-interpolate": "1 - 3", 637 | "d3-selection": "3", 638 | "d3-transition": "3" 639 | } 640 | }, 641 | "d3-chord": { 642 | "version": "3.0.1", 643 | "requires": { 644 | "d3-path": "1 - 3" 645 | } 646 | }, 647 | "d3-color": { 648 | "version": "3.1.0" 649 | }, 650 | "d3-contour": { 651 | "version": "4.0.0", 652 | "requires": { 653 | "d3-array": "^3.2.0" 654 | } 655 | }, 656 | "d3-delaunay": { 657 | "version": "6.0.2", 658 | "requires": { 659 | "delaunator": "5" 660 | } 661 | }, 662 | "d3-dispatch": { 663 | "version": "3.0.1" 664 | }, 665 | "d3-drag": { 666 | "version": "3.0.0", 667 | "requires": { 668 | "d3-dispatch": "1 - 3", 669 | "d3-selection": "3" 670 | } 671 | }, 672 | "d3-dsv": { 673 | "version": "3.0.1", 674 | "requires": { 675 | "commander": "7", 676 | "iconv-lite": "0.6", 677 | "rw": "1" 678 | }, 679 | "dependencies": { 680 | "commander": { 681 | "version": "7.2.0" 682 | } 683 | } 684 | }, 685 | "d3-ease": { 686 | "version": "3.0.1" 687 | }, 688 | "d3-fetch": { 689 | "version": "3.0.1", 690 | "requires": { 691 | "d3-dsv": "1 - 3" 692 | } 693 | }, 694 | "d3-force": { 695 | "version": "3.0.0", 696 | "requires": { 697 | "d3-dispatch": "1 - 3", 698 | "d3-quadtree": "1 - 3", 699 | "d3-timer": "1 - 3" 700 | } 701 | }, 702 | "d3-format": { 703 | "version": "3.1.0" 704 | }, 705 | "d3-geo": { 706 | "version": "3.0.1", 707 | "requires": { 708 | "d3-array": "2.5.0 - 3" 709 | } 710 | }, 711 | "d3-hierarchy": { 712 | "version": "3.1.2" 713 | }, 714 | "d3-interpolate": { 715 | "version": "3.0.1", 716 | "requires": { 717 | "d3-color": "1 - 3" 718 | } 719 | }, 720 | "d3-path": { 721 | "version": "3.0.1" 722 | }, 723 | "d3-polygon": { 724 | "version": "3.0.1" 725 | }, 726 | "d3-quadtree": { 727 | "version": "3.0.1" 728 | }, 729 | "d3-random": { 730 | "version": "3.0.1" 731 | }, 732 | "d3-scale": { 733 | "version": "4.0.2", 734 | "requires": { 735 | "d3-array": "2.10.0 - 3", 736 | "d3-format": "1 - 3", 737 | "d3-interpolate": "1.2.0 - 3", 738 | "d3-time": "2.1.1 - 3", 739 | "d3-time-format": "2 - 4" 740 | } 741 | }, 742 | "d3-scale-chromatic": { 743 | "version": "3.0.0", 744 | "requires": { 745 | "d3-color": "1 - 3", 746 | "d3-interpolate": "1 - 3" 747 | } 748 | }, 749 | "d3-selection": { 750 | "version": "3.0.0" 751 | }, 752 | "d3-shape": { 753 | "version": "3.1.0", 754 | "requires": { 755 | "d3-path": "1 - 3" 756 | } 757 | }, 758 | "d3-time": { 759 | "version": "3.0.0", 760 | "requires": { 761 | "d3-array": "2 - 3" 762 | } 763 | }, 764 | "d3-time-format": { 765 | "version": "4.1.0", 766 | "requires": { 767 | "d3-time": "1 - 3" 768 | } 769 | }, 770 | "d3-timer": { 771 | "version": "3.0.1" 772 | }, 773 | "d3-transition": { 774 | "version": "3.0.1", 775 | "requires": { 776 | "d3-color": "1 - 3", 777 | "d3-dispatch": "1 - 3", 778 | "d3-ease": "1 - 3", 779 | "d3-interpolate": "1 - 3", 780 | "d3-timer": "1 - 3" 781 | } 782 | }, 783 | "d3-zoom": { 784 | "version": "3.0.0", 785 | "requires": { 786 | "d3-dispatch": "1 - 3", 787 | "d3-drag": "2 - 3", 788 | "d3-interpolate": "1 - 3", 789 | "d3-selection": "2 - 3", 790 | "d3-transition": "2 - 3" 791 | } 792 | }, 793 | "dagre-d3-es": { 794 | "version": "7.0.6", 795 | "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.6.tgz", 796 | "integrity": "sha512-CaaE/nZh205ix+Up4xsnlGmpog5GGm81Upi2+/SBHxwNwrccBb3K51LzjZ1U6hgvOlAEUsVWf1xSTzCyKpJ6+Q==", 797 | "requires": { 798 | "d3": "^7.7.0", 799 | "lodash-es": "^4.17.21" 800 | } 801 | }, 802 | "delaunator": { 803 | "version": "5.0.0", 804 | "requires": { 805 | "robust-predicates": "^3.0.0" 806 | } 807 | }, 808 | "dompurify": { 809 | "version": "2.4.1", 810 | "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", 811 | "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==" 812 | }, 813 | "dotenv": { 814 | "version": "16.0.1", 815 | "dev": true 816 | }, 817 | "iconv-lite": { 818 | "version": "0.6.3", 819 | "requires": { 820 | "safer-buffer": ">= 2.1.2 < 3.0.0" 821 | } 822 | }, 823 | "internmap": { 824 | "version": "2.0.3" 825 | }, 826 | "katex": { 827 | "version": "0.16.4", 828 | "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.4.tgz", 829 | "integrity": "sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw==", 830 | "requires": { 831 | "commander": "^8.0.0" 832 | } 833 | }, 834 | "khroma": { 835 | "version": "2.0.0" 836 | }, 837 | "lodash-es": { 838 | "version": "4.17.21", 839 | "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", 840 | "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" 841 | }, 842 | "mermaid": { 843 | "version": "9.3.0", 844 | "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.3.0.tgz", 845 | "integrity": "sha512-mGl0BM19TD/HbU/LmlaZbjBi//tojelg8P/mxD6pPZTAYaI+VawcyBdqRsoUHSc7j71PrMdJ3HBadoQNdvP5cg==", 846 | "requires": { 847 | "@braintree/sanitize-url": "^6.0.0", 848 | "d3": "^7.0.0", 849 | "dagre-d3-es": "7.0.6", 850 | "dompurify": "2.4.1", 851 | "khroma": "^2.0.0", 852 | "lodash-es": "^4.17.21", 853 | "moment-mini": "^2.24.0", 854 | "non-layered-tidy-tree-layout": "^2.0.2", 855 | "stylis": "^4.1.2", 856 | "uuid": "^9.0.0" 857 | } 858 | }, 859 | "modern-normalize": { 860 | "version": "1.1.0" 861 | }, 862 | "moment-mini": { 863 | "version": "2.24.0" 864 | }, 865 | "non-layered-tidy-tree-layout": { 866 | "version": "2.0.2", 867 | "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", 868 | "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" 869 | }, 870 | "robust-predicates": { 871 | "version": "3.0.1" 872 | }, 873 | "rw": { 874 | "version": "1.3.3" 875 | }, 876 | "safer-buffer": { 877 | "version": "2.1.2" 878 | }, 879 | "stylis": { 880 | "version": "4.1.3", 881 | "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", 882 | "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" 883 | }, 884 | "uuid": { 885 | "version": "9.0.0", 886 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", 887 | "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" 888 | }, 889 | "zola-bin": { 890 | "version": "0.3.5", 891 | "dev": true, 892 | "requires": { 893 | "dotenv": "16.0.1", 894 | "zola-bin-darwin": "^0.16.2", 895 | "zola-bin-linux": "^0.16.2", 896 | "zola-bin-win32": "^0.16.2" 897 | }, 898 | "dependencies": { 899 | "zola-bin-darwin": { 900 | "version": "0.16.2", 901 | "resolved": "https://registry.npmjs.org/zola-bin-darwin/-/zola-bin-darwin-0.16.2.tgz", 902 | "integrity": "sha512-r3UX4xG7KLZfy8ta9I6MIlPVi60yBJx2z0xdWHJNEUatbRsnSShp2WoJFce/SMTxqxOjbt9gmCJDcAPybNpaYg==", 903 | "dev": true, 904 | "optional": true 905 | }, 906 | "zola-bin-win32": { 907 | "version": "0.16.2", 908 | "resolved": "https://registry.npmjs.org/zola-bin-win32/-/zola-bin-win32-0.16.2.tgz", 909 | "integrity": "sha512-UVvpJllZoWZc/dmVfsI6eGG2R8G5Yqchgfa95RYi/I18ePN4Cz/0Wg3pInqCc37qL0DymYg8czODjQ5eLftYBQ==", 910 | "dev": true, 911 | "optional": true 912 | } 913 | } 914 | }, 915 | "zola-bin-linux": { 916 | "version": "0.16.2", 917 | "dev": true, 918 | "optional": true 919 | } 920 | } 921 | } 922 | --------------------------------------------------------------------------------