Update project configuration and documentation: set version in package.json, enhance spec.md with canvas feature details, add credits URL in zola.toml, and improve footer layout in base.html. Remove unused static files including 404.html, index.html, main.css, robots.txt, site.webmanifest, and sitemap.xml.

This commit is contained in:
Hananoshika Yomaru 2026-05-18 22:33:20 -07:00
parent b3c4332a06
commit 9db231b18e
60 changed files with 986 additions and 895 deletions

21
LICENSE Normal file
View file

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

4
content/credits.md Normal file
View file

@ -0,0 +1,4 @@
+++
title = "Credits"
template = "credits.html"
+++

82
data/credits.json Normal file
View file

@ -0,0 +1,82 @@
{
"intro": "Open Free Books uses the open source libraries below (in alphabetical order—we try!).",
"contributors_note": "Textbook authors and maintainers are listed on the homepage.",
"project": {
"name": "Open Free Books",
"version": "0.0.1",
"license": "MIT",
"license_url": "https://github.com/hananoshikayomaru/openfreebooks/blob/main/LICENSE",
"copyright": "Copyright (c) 2026 Open Free Books contributors",
"url": "https://openfreebooks.org"
},
"libraries": [
{
"name": "Bun",
"version": "1.3.10",
"license": "MIT",
"license_url": "https://github.com/oven-sh/bun/blob/main/LICENSE.md",
"copyright": "Copyright (c) Oven-sh",
"url": "https://bun.sh"
},
{
"name": "Sass",
"version": "1.89.x",
"license": "MIT",
"license_url": "https://github.com/sass/dart-sass/blob/main/LICENSE",
"copyright": "Copyright (c) Google Inc. and contributors",
"url": "https://sass-lang.com"
},
{
"name": "Solid.js",
"version": "1.9.13",
"license": "MIT",
"license_url": "https://github.com/solidjs/solid/blob/main/LICENSE",
"copyright": "Copyright (c) 2016-2025 Ryan Carniato",
"url": "https://www.solidjs.com"
},
{
"name": "TypeScript",
"version": "5.9.3",
"license": "Apache License 2.0",
"license_url": "https://github.com/microsoft/TypeScript/blob/main/LICENSE.txt",
"copyright": "Copyright (c) Microsoft Corporation",
"url": "https://www.typescriptlang.org"
},
{
"name": "Vite",
"version": "6.4.2",
"license": "MIT",
"license_url": "https://github.com/vitejs/vite/blob/main/LICENSE",
"copyright": "Copyright (c) 2019-present VoidZero Inc. and Vite contributors",
"url": "https://vite.dev"
},
{
"name": "vite-plugin-solid",
"version": "2.11.12",
"license": "MIT",
"license_url": "https://github.com/solidjs/vite-plugin-solid/blob/main/LICENSE",
"copyright": "Copyright (c) 2021-present SolidJS contributors",
"url": "https://github.com/solidjs/vite-plugin-solid"
},
{
"name": "Zola",
"version": "0.22.1",
"license": "MIT",
"license_url": "https://github.com/getzola/zola/blob/master/LICENSE",
"copyright": "Copyright (c) 2017-present Vincent Prouillet and contributors",
"url": "https://www.getzola.org"
}
],
"hosting": [
{
"name": "Cloudflare",
"url": "https://www.cloudflare.com",
"note": "Static site hosting, CDN, and deploy (Workers & Wrangler)"
},
{
"name": "GitHub",
"url": "https://github.com/hananoshikayomaru/openfreebooks",
"note": "Code hosting"
}
]
}

34
data/credits.types.ts Normal file
View file

@ -0,0 +1,34 @@
/** Credits page data (`data/credits.json`). */
export interface CreditProject {
name: string;
version: string;
license: string;
license_url: string;
copyright: string;
url?: string;
}
export interface CreditLibrary {
name: string;
version: string;
license: string;
license_url?: string;
copyright: string;
url: string;
}
export interface CreditHosting {
name: string;
version?: string;
url: string;
note: string;
}
export interface CreditsFile {
intro: string;
contributors_note: string;
project: CreditProject;
libraries: CreditLibrary[];
hosting: CreditHosting[];
}

View file

@ -1,5 +1,6 @@
{ {
"name": "openfreebooks", "name": "openfreebooks",
"version": "0.0.1",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {

View file

@ -4,4 +4,6 @@ this project is free internet textbooks for elementary schools to university stu
this project is build using zola. interactivity by solid js. deployed to cloudflare. this project is build using zola. interactivity by solid js. deployed to cloudflare.
canvas feature use jsoncanvas standard by Obsidian. canvas feature use [jsoncanvas](https://jsoncanvas.org/spec/1.0/) standard by Obsidian. Viewer is [JSON canvas viewer](https://github.com/Hesprs/JSON-Canvas-Viewer).
not markdown, html based. but in every page, we should have a copy as md button using [defuddle](https://github.com/kepano/defuddle).

View file

@ -0,0 +1,3 @@
Social icons are from [Tabler Icons](https://tabler.io/icons) ([MIT License](https://github.com/tabler/tabler-icons/blob/master/LICENSE)).
Source: https://github.com/tabler/tabler-icons/tree/main/icons/outline

View file

@ -0,0 +1,19 @@
<!--
tags: [decentralized, network, protocol, innovative, communication, new-wave, future, tech, connectivity, open]
category: Brand
version: "2.45"
unicode: "fd75"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M6.335 5.144c-1.654 -1.199 -4.335 -2.127 -4.335 .826c0 .59 .35 4.953 .556 5.661c.713 2.463 3.13 2.75 5.444 2.369c-4.045 .665 -4.889 3.208 -2.667 5.41c1.03 1.018 1.913 1.59 2.667 1.59c2 0 3.134 -2.769 3.5 -3.5c.333 -.667 .5 -1.167 .5 -1.5c0 .333 .167 .833 .5 1.5c.366 .731 1.5 3.5 3.5 3.5c.754 0 1.637 -.571 2.667 -1.59c2.222 -2.203 1.378 -4.746 -2.667 -5.41c2.314 .38 4.73 .094 5.444 -2.369c.206 -.708 .556 -5.072 .556 -5.661c0 -2.953 -2.68 -2.025 -4.335 -.826c-2.293 1.662 -4.76 5.048 -5.665 6.856c-.905 -1.808 -3.372 -5.194 -5.665 -6.856" />
</svg>

After

Width:  |  Height:  |  Size: 932 B

View file

@ -0,0 +1,22 @@
<!--
tags: [app, application, logo, communication, talks, gamers, freeware, platform, brand, discord]
category: Brand
version: "1.21"
unicode: "ece3"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M8 12a1 1 0 1 0 2 0a1 1 0 0 0 -2 0" />
<path d="M14 12a1 1 0 1 0 2 0a1 1 0 0 0 -2 0" />
<path d="M15.5 17c0 1 1.5 3 2 3c1.5 0 2.833 -1.667 3.5 -3c.667 -1.667 .5 -5.833 -1.5 -11.5c-1.457 -1.015 -3 -1.34 -4.5 -1.5l-.972 1.923a11.913 11.913 0 0 0 -4.053 0l-.975 -1.923c-1.5 .16 -3.043 .485 -4.5 1.5c-2 5.667 -2.167 9.833 -1.5 11.5c.667 1.333 2 3 3.5 3c.5 0 2 -2 2 -3" />
<path d="M7 16.5c3.5 1 6.5 1 10 0" />
</svg>

After

Width:  |  Height:  |  Size: 785 B

View file

@ -0,0 +1,20 @@
<!--
tags: [inbox, gmail, email, envelope, message, mail, contact, conversation, letter, post]
category: Communication
version: "1.0"
unicode: "eae5"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M3 7a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-10" />
<path d="M3 7l9 6l9 -6" />
</svg>

After

Width:  |  Height:  |  Size: 485 B

View file

@ -0,0 +1,19 @@
<!--
tags: [logo, app, application, community, social, communication, website, user, post, images, photos, comment, feedback, fb]
category: Brand
version: "1.18"
unicode: "ec1a"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M7 10v4h3v7h4v-7h3l1 -4h-4v-2a1 1 0 0 1 1 -1h3v-4h-3a5 5 0 0 0 -5 5v2h-3" />
</svg>

After

Width:  |  Height:  |  Size: 478 B

View file

@ -0,0 +1,19 @@
<!--
tags: [logo, website, hosting, project, programming, software, development, brand, github, company]
category: Brand
version: "1.18"
unicode: "ec1c"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" />
</svg>

After

Width:  |  Height:  |  Size: 673 B

View file

@ -0,0 +1,19 @@
<!--
tags: [logo, website, software, code, programming, programmers, brand, gitlab, company, trademark]
category: Brand
version: "1.9"
unicode: "ec1d"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M21 14l-9 7l-9 -7l3 -11l3 7h6l3 -7l3 11" />
</svg>

After

Width:  |  Height:  |  Size: 418 B

View file

@ -0,0 +1,21 @@
<!--
tags: [logo, app, application, images, photos, videos, post, stories, online, community]
category: Brand
version: "1.9"
unicode: "ec20"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M4 8a4 4 0 0 1 4 -4h8a4 4 0 0 1 4 4v8a4 4 0 0 1 -4 4h-8a4 4 0 0 1 -4 -4l0 -8" />
<path d="M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0" />
<path d="M16.5 7.5v.01" />
</svg>

After

Width:  |  Height:  |  Size: 524 B

View file

@ -0,0 +1,23 @@
<!--
tags: [logo, website, corporation, work, business, internet, brand, linkedin, company, trademark]
category: Brand
version: "1.15"
unicode: "ec8c"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M8 11v5" />
<path d="M8 8v.01" />
<path d="M12 16v-5" />
<path d="M16 16v-3a2 2 0 1 0 -4 0" />
<path d="M3 7a4 4 0 0 1 4 -4h10a4 4 0 0 1 4 4v10a4 4 0 0 1 -4 4h-10a4 4 0 0 1 -4 -4l0 -10" />
</svg>

After

Width:  |  Height:  |  Size: 571 B

View file

@ -0,0 +1,20 @@
<!--
tags: [web, app, social, nodes, network, brand, mastodon, logo, company, trademark]
category: Brand
version: "1.75"
unicode: "f250"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M18.648 15.254c-1.816 1.763 -6.648 1.626 -6.648 1.626a18.262 18.262 0 0 1 -3.288 -.256c1.127 1.985 4.12 2.81 8.982 2.475c-1.945 2.013 -13.598 5.257 -13.668 -7.636l-.026 -1.154c0 -3.036 .023 -4.115 1.352 -5.633c1.671 -1.91 6.648 -1.666 6.648 -1.666s4.977 -.243 6.648 1.667c1.329 1.518 1.352 2.597 1.352 5.633s-.456 4.074 -1.352 4.944" />
<path d="M12 11.204v-2.926c0 -1.258 -.895 -2.278 -2 -2.278s-2 1.02 -2 2.278v4.722m4 -4.722c0 -1.258 .895 -2.278 2 -2.278s2 1.02 2 2.278v4.722" />
</svg>

After

Width:  |  Height:  |  Size: 845 B

View file

@ -0,0 +1,24 @@
<!--
tags: [logo, website, brand, wordmark, design, medium, company, trademark, identity, corporate]
category: Brand
version: "1.13"
unicode: "ec70"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M4 6a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2l0 -12" />
<path d="M8 9h1l3 3l3 -3h1" />
<path d="M8 15l2 0" />
<path d="M14 15l2 0" />
<path d="M9 9l0 6" />
<path d="M15 9l0 6" />
</svg>

After

Width:  |  Height:  |  Size: 590 B

View file

@ -0,0 +1,19 @@
<!--
tags: [software, code, developer, public, licence, technology, brand, open, source, logo]
category: Brand
version: "1.36"
unicode: "edd0"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12 3a9 9 0 0 1 3.618 17.243l-2.193 -5.602a3 3 0 1 0 -2.849 0l-2.193 5.603a9 9 0 0 1 3.617 -17.244" />
</svg>

After

Width:  |  Height:  |  Size: 469 B

View file

@ -0,0 +1,21 @@
<!--
category: Communication
tags: [feed, subscribe, rss, design]
version: "1.0"
unicode: "eb19"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M4 19a1 1 0 1 0 2 0a1 1 0 1 0 -2 0" />
<path d="M4 4a16 16 0 0 1 16 16" />
<path d="M4 11a9 9 0 0 1 9 9" />
</svg>

After

Width:  |  Height:  |  Size: 432 B

View file

@ -0,0 +1,20 @@
<!--
category: Map
tags: [students, class, teachers, professors, doctors, hall, classroom, subject, science, break, lesson]
version: "1.22"
unicode: "ecf7"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M22 9l-10 -4l-10 4l10 4l10 -4v6" />
<path d="M6 10.6v5.4a6 3 0 0 0 12 0v-5.4" />
</svg>

After

Width:  |  Height:  |  Size: 462 B

View file

@ -0,0 +1,22 @@
<!--
tags: [newspaper, article, news, file, paper, text, record, information]
category: Document
version: "1.0"
unicode: "eafd"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M16 6h3a1 1 0 0 1 1 1v11a2 2 0 0 1 -4 0v-13a1 1 0 0 0 -1 -1h-10a1 1 0 0 0 -1 1v12a3 3 0 0 0 3 3h11" />
<path d="M8 8l4 0" />
<path d="M8 12l4 0" />
<path d="M8 16l4 0" />
</svg>

After

Width:  |  Height:  |  Size: 528 B

View file

@ -0,0 +1,19 @@
<!--
tags: [textile, discussion, conversation, needlework, clothing, forum, dialogue, social, sewing, fabric]
category: Brand
version: "2.25"
unicode: "fb02"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M19 7.5c-1.333 -3 -3.667 -4.5 -7 -4.5c-5 0 -8 2.5 -8 9s3.5 9 8 9s7 -3 7 -5s-1 -5 -7 -5c-2.5 0 -3 1.25 -3 2.5c0 1.5 1 2.5 2.5 2.5c2.5 0 3.5 -1.5 3.5 -5s-2 -4 -3 -4s-1.833 .333 -2.5 1" />
</svg>

After

Width:  |  Height:  |  Size: 567 B

View file

@ -0,0 +1,19 @@
<!--
tags: [logo, app, application, mobile, video, music, brand, tiktok, company, trademark]
category: Brand
version: "1.13"
unicode: "ec73"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M21 7.917v4.034a9.948 9.948 0 0 1 -5 -1.951v4.5a6.5 6.5 0 1 1 -8 -6.326v4.326a2.5 2.5 0 1 0 4 2v-11.5h4.083a6.005 6.005 0 0 0 4.917 4.917" />
</svg>

After

Width:  |  Height:  |  Size: 506 B

View file

@ -0,0 +1,23 @@
<!--
tags: [earth, globe, global, language, union, world, location, navigation, geography, place]
category: Map
version: "1.0"
unicode: "eb54"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0" />
<path d="M3.6 9h16.8" />
<path d="M3.6 15h16.8" />
<path d="M11.5 3a17 17 0 0 0 0 18" />
<path d="M12.5 3a17 17 0 0 1 0 18" />
</svg>

After

Width:  |  Height:  |  Size: 542 B

20
static/icons/social/x.svg Normal file
View file

@ -0,0 +1,20 @@
<!--
tags: [twitter, brand, logo, company, trademark, identity, corporate, business, x]
category: Brand
version: "2.29"
unicode: "fc0f"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M4 4l11.733 16h4.267l-11.733 -16l-4.267 0" />
<path d="M4 20l6.768 -6.768m2.46 -2.46l6.772 -6.772" />
</svg>

After

Width:  |  Height:  |  Size: 463 B

View file

@ -0,0 +1,20 @@
<!--
tags: [logo, platform, channel, film, video, youtuber, maker, comments, stream, streamer]
category: Brand
version: "1.15"
unicode: "ec90"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M2 8a4 4 0 0 1 4 -4h12a4 4 0 0 1 4 4v8a4 4 0 0 1 -4 4h-12a4 4 0 0 1 -4 -4v-8" />
<path d="M10 9l5 3l-5 3l0 -6" />
</svg>

After

Width:  |  Height:  |  Size: 482 B

View file

@ -0,0 +1,86 @@
.credits-page {
padding: 54px 0 72px;
border-top: 1px solid var(--line);
}
.credits-prose {
max-width: var(--prose-width);
}
.credits-lead,
.credits-contributors-note,
.credits-section-intro {
margin: 0 0 1rem;
color: var(--soft-ink);
font-size: 1.05rem;
line-height: 1.72;
}
.credits-contributors-note a,
.credits-entry-name a,
.credits-entry-license a {
color: var(--accent);
font-weight: 600;
text-decoration: none;
}
.credits-contributors-note a:hover,
.credits-contributors-note a:focus-visible,
.credits-entry-name a:hover,
.credits-entry-name a:focus-visible,
.credits-entry-license a:hover,
.credits-entry-license a:focus-visible {
text-decoration: underline;
text-underline-offset: 3px;
}
.credits-block {
margin-top: 40px;
}
.credits-section-title {
margin: 0 0 16px;
font-family: var(--font-heading);
font-size: clamp(1.35rem, 2.2vw, 1.85rem);
font-weight: 400;
line-height: 1.2;
}
.credits-entry {
margin: 0 0 28px;
padding-bottom: 28px;
border-bottom: 1px solid var(--line);
}
.credits-block .credits-entry:last-child {
margin-bottom: 0;
padding-bottom: 0;
border-bottom: none;
}
.credits-entry-name {
margin: 0 0 8px;
font-family: var(--font-heading);
font-size: 1.25rem;
font-weight: 400;
line-height: 1.25;
}
.credits-entry-name a {
color: var(--ink);
}
.credits-entry-version,
.credits-entry-license,
.credits-entry-copyright,
.credits-entry-note {
margin: 0 0 6px;
color: var(--soft-ink);
font-size: 0.98rem;
line-height: 1.6;
}
.credits-entry-copyright:last-child,
.credits-entry-note:last-child {
margin-bottom: 0;
}

View file

@ -49,9 +49,21 @@ section.hero {
.footer-inner { .footer-inner {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: space-between;
align-items: baseline; align-items: baseline;
gap: 12px 20px; gap: 12px 24px;
}
.footer-copy {
flex: 1 1 16rem;
min-width: min(100%, 16rem);
}
.footer-links {
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 12px 24px;
flex-shrink: 0;
} }
.footer-link { .footer-link {

View file

@ -4,3 +4,4 @@
@import "components"; @import "components";
@import "why-sections"; @import "why-sections";
@import "contributors"; @import "contributors";
@import "credits";

View file

@ -1,65 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Page not found | Open Free Books</title>
<meta name="description" content="Free, open-source textbooks for every learner — elementary through university." />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="icon" type="image/x-icon" href="https://openfreebooks.org/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="https://openfreebooks.org/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="32x32" href="https://openfreebooks.org/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="https://openfreebooks.org/favicon-16x16.png" />
<link rel="manifest" href="https://openfreebooks.org/site.webmanifest" />
<link
href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;700&family=Instrument+Serif:ital@0;1&family=Inter:wght@300;400;500;600;700&display=swap"
rel="stylesheet"
/>
<link rel="stylesheet" href="https://openfreebooks.org/main.css" />
</head>
<body>
<script id="site-config" type="application/json">
{
"brand": "Open Free Books",
"homeUrl": "https://openfreebooks.org",
"browseUrl": "/browse/",
"aboutUrl": "/about/",
"githubUrl": "https://github.com/hananoshikayomaru/openfreebooks"
}
</script>
<div id="site-header"></div>
<main>
<section class="hero">
<div class="container">
<div class="hero-content">
<h1>Page not found</h1>
<p class="hero-lead">That page is not in the catalog yet. Try the homepage or browse when books are published.</p>
<div class="hero-actions">
<a class="button button-primary" href="https://openfreebooks.org">Back home</a>
<a class="button button-secondary" href="https://github.com/hananoshikayomaru/openfreebooks">GitHub</a>
</div>
</div>
</div>
</section>
</main>
<footer class="footer">
<div class="container footer-inner">
<span>© <span id="footer-year"></span> Open Free Books — Free, open textbooks for every learner</span>
<a class="footer-link" href="https://github.com/hananoshikayomaru/openfreebooks">GitHub</a>
</div>
</footer>
<script src="https://openfreebooks.org/js/bundle.js" defer></script>
</body>
</html>

View file

@ -1,755 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Open Free Books</title>
<meta name="description" content="Free, open-source textbooks for every learner — elementary through university. Read the full book online at no cost, or contribute on GitHub." />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="icon" type="image/x-icon" href="https://openfreebooks.org/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="https://openfreebooks.org/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="32x32" href="https://openfreebooks.org/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="https://openfreebooks.org/favicon-16x16.png" />
<link rel="manifest" href="https://openfreebooks.org/site.webmanifest" />
<link
href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;700&family=Instrument+Serif:ital@0;1&family=Inter:wght@300;400;500;600;700&display=swap"
rel="stylesheet"
/>
<link rel="stylesheet" href="https://openfreebooks.org/main.css" />
</head>
<body>
<script id="site-config" type="application/json">
{
"brand": "Open Free Books",
"homeUrl": "https://openfreebooks.org",
"browseUrl": "/browse/",
"aboutUrl": "/about/",
"githubUrl": "https://github.com/hananoshikayomaru/openfreebooks"
}
</script>
<div id="site-header"></div>
<main>
<section class="hero">
<div class="container">
<div class="hero-content">
<h1>Open textbooks. Free to read. Open to improve.</h1>
<p class="hero-lead">
High-quality learning materials for elementary school through university — on the web, at no cost.
</p>
<ul class="hero-points">
<li><strong>Free</strong> means the whole book, for everyone — read it all online without paywalls.</li>
<li><strong>Open</strong> means open source — anyone can fix a typo, add a chapter, or fork a book on GitHub.</li>
</ul>
<div class="hero-actions">
<a class="button button-primary" href="/browse/">Browse books</a>
<a class="button button-secondary" href="https://github.com/hananoshikayomaru/openfreebooks">View on GitHub</a>
</div>
</div>
</div>
</section>
<div id="marquee"></div>
<section class="why-section" id="why-textbook-costs">
<div class="container why-row">
<div class="why-art" data-scroll-reveal-card>
<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true">
<title>Stack of textbooks and cost</title>
<rect x="48" y="118" width="104" height="12" rx="2" fill="var(--accent)" opacity="0.25"/>
<path d="M52 118 L52 72 L88 64 L88 118 Z" fill="none" stroke="var(--ink)" stroke-width="1.5" stroke-linejoin="round"/>
<path d="M88 118 L88 64 L124 72 L124 118 Z" fill="none" stroke="var(--ink)" stroke-width="1.5" stroke-linejoin="round"/>
<path d="M124 118 L124 76 L160 84 L160 118 Z" fill="var(--accent)" fill-opacity="0.12" stroke="var(--accent)" stroke-width="1.5" stroke-linejoin="round"/>
<path d="M56 72 L88 64 L88 68 L56 76 Z" fill="var(--accent)" fill-opacity="0.35" stroke="none"/>
<circle cx="148" cy="52" r="28" fill="none" stroke="var(--accent)" stroke-width="1.5"/>
<text x="148" y="58" text-anchor="middle" font-family="var(--mono)" font-size="18" fill="var(--accent)">$</text>
<path d="M36 148 L164 148" stroke="var(--ink)" stroke-width="1" stroke-dasharray="4 4" opacity="0.4"/>
<path d="M72 40 L72 28 M68 34 L76 34" stroke="var(--soft-ink)" stroke-width="1.2" stroke-linecap="round"/>
</svg>
</div>
<div class="why-copy" data-scroll-reveal-card>
<p class="section-kicker">The problem</p>
<h2 class="section-title">Textbook fees hit families hard</h2>
<p>
In many countries, families pay hundreds of dollars per child each year for printed textbooks —
on top of tuition, devices, and supplies. When money is tight, students share worn copies, skip
buying books, or fall behind before the term begins.
</p>
<p>
That cost is not a small inconvenience. It is a barrier to showing up prepared. Open Free Books
exists so <strong>every learner can start the year with complete materials</strong>, not a receipt.
</p>
</div>
</div>
</section>
<section class="why-section" id="why-html">
<div class="container why-row why-row--art-end">
<div class="why-art" data-scroll-reveal-card>
<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true">
<title>Paper and PDF versus interactive HTML</title>
<rect x="24" y="48" width="56" height="72" rx="2" fill="none" stroke="var(--ink)" stroke-width="1.5"/>
<path d="M32 60 L72 60 M32 72 L68 72 M32 84 L64 84" stroke="var(--soft-ink)" stroke-width="1" stroke-linecap="round"/>
<text x="52" y="108" text-anchor="middle" font-family="var(--mono)" font-size="9" fill="var(--muted)">PDF</text>
<rect x="88" y="48" width="56" height="72" rx="2" fill="none" stroke="var(--ink)" stroke-width="1.5" stroke-dasharray="3 3" opacity="0.5"/>
<path d="M96 60 L136 60 M96 72 L132 72" stroke="var(--soft-ink)" stroke-width="1" stroke-linecap="round" opacity="0.5"/>
<path d="M148 56 L148 160" stroke="var(--accent)" stroke-width="2" stroke-linecap="round"/>
<path d="M140 72 L156 72 L152 88 L144 88 Z" fill="var(--accent)" fill-opacity="0.2" stroke="var(--accent)" stroke-width="1.2" stroke-linejoin="round"/>
<rect x="156" y="56" width="36" height="104" rx="4" fill="var(--card-bg)" stroke="var(--accent)" stroke-width="1.5"/>
<path d="M164 72 L184 72 M164 84 L180 84 M164 96 L182 96" stroke="var(--accent)" stroke-width="1.2" stroke-linecap="round"/>
<circle cx="174" cy="118" r="8" fill="none" stroke="var(--accent)" stroke-width="1.2"/>
<path d="M171 118 L173 120 L177 114" fill="none" stroke="var(--accent)" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
<text x="174" y="140" text-anchor="middle" font-family="var(--mono)" font-size="8" fill="var(--accent)">&lt;/&gt;</text>
</svg>
</div>
<div class="why-copy" data-scroll-reveal-card>
<p class="section-kicker">The medium</p>
<h2 class="section-title">Long live the web — not the PDF</h2>
<p>
Paper textbooks are fixed: one layout, one edition, no room to fix a typo until the next print run.
Most “digital” versions are the same pages exported to PDF — still static, still hard to search,
still impossible to embed a simulation or a live diagram.
</p>
<p>
<strong>HTML on the open web</strong> is different. Chapters can link to sources, resize for any screen,
include interactive figures, and improve over time. The book becomes something you use — not something
you only carry.
</p>
</div>
</div>
</section>
<section class="why-section" id="why-teachers">
<div class="container why-row">
<div class="why-art" data-scroll-reveal-card>
<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true">
<title>Teacher guiding, open textbook</title>
<circle cx="72" cy="56" r="18" fill="none" stroke="var(--ink)" stroke-width="1.5"/>
<path d="M48 108 C48 88 60 78 72 78 C84 78 96 88 96 108 L96 130 L48 130 Z" fill="none" stroke="var(--ink)" stroke-width="1.5" stroke-linejoin="round"/>
<path d="M56 98 L88 98" stroke="var(--accent)" stroke-width="1.2" stroke-linecap="round"/>
<path d="M108 72 L108 148 L168 148 L168 88 L148 72 Z" fill="var(--accent)" fill-opacity="0.1" stroke="var(--accent)" stroke-width="1.5" stroke-linejoin="round"/>
<path d="M116 92 L160 92 M116 108 L152 108 M116 124 L156 124" stroke="var(--ink)" stroke-width="1" stroke-linecap="round" opacity="0.6"/>
<path d="M72 130 L72 160 M60 160 L84 160" stroke="var(--ink)" stroke-width="1.5" stroke-linecap="round"/>
<path d="M100 56 L132 72" stroke="var(--accent)" stroke-width="1.5" stroke-linecap="round" stroke-dasharray="2 3"/>
</svg>
</div>
<div class="why-copy" data-scroll-reveal-card>
<p class="section-kicker">People &amp; books</p>
<h2 class="section-title">Replace textbooks, not teachers</h2>
<p>
A great teacher — whether in person or, someday, assisted by thoughtful tools — still sets pace,
asks hard questions, and notices when a student is stuck. That relationship is not what we are
trying to automate.
</p>
<p>
Textbooks are different. They are reference and structure: explanations, exercises, diagrams.
Those can be <strong>free, forkable, and kept current on the web</strong> so teachers spend less
time hunting permissions and more time teaching.
</p>
</div>
</div>
</section>
<section class="why-section" id="why-learning">
<div class="container why-row why-row--art-end">
<div class="why-art" data-scroll-reveal-card>
<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true">
<title>Student thinking with a textbook</title>
<circle cx="100" cy="52" r="20" fill="none" stroke="var(--ink)" stroke-width="1.5"/>
<path d="M68 108 C68 86 82 74 100 74 C118 74 132 86 132 108 L132 132 L68 132 Z" fill="none" stroke="var(--ink)" stroke-width="1.5" stroke-linejoin="round"/>
<rect x="88" y="136" width="24" height="32" rx="2" fill="var(--accent)" fill-opacity="0.15" stroke="var(--accent)" stroke-width="1.5"/>
<path d="M94 148 L106 148 M94 156 L106 156" stroke="var(--accent)" stroke-width="1" stroke-linecap="round"/>
<path d="M44 64 Q28 48 36 32" fill="none" stroke="var(--soft-ink)" stroke-width="1.2" stroke-linecap="round"/>
<path d="M40 36 L36 28 M44 34 L48 26" stroke="var(--soft-ink)" stroke-width="1" stroke-linecap="round"/>
<text x="32" y="56" font-family="var(--font-heading)" font-size="14" fill="var(--accent)" font-style="italic">?</text>
<path d="M156 72 L168 60 M160 88 L176 88" stroke="var(--muted)" stroke-width="1" stroke-linecap="round" opacity="0.5"/>
</svg>
</div>
<div class="why-copy" data-scroll-reveal-card>
<p class="section-kicker">Agency</p>
<h2 class="section-title">Do not outsource your learning</h2>
<p>
Finishing a chapter is not the same as understanding it. Skimming for answers, copying worked
solutions, or rushing to the end leaves gaps that show up on the next test — and in the years after.
</p>
<p>
Read slowly. Try the problems before you peek at hints. Sit with confusion long enough to name what
you do not get. <strong>The textbook is a guide; the thinking still has to be yours.</strong> That habit
is what school is really training, whether the subject is algebra or history.
</p>
</div>
</div>
</section>
<section class="why-section" id="why-not-ai">
<div class="container why-row">
<div class="why-art" data-scroll-reveal-card>
<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true">
<title>Open textbook and the earth</title>
<circle cx="100" cy="100" r="44" fill="none" stroke="var(--ink)" stroke-width="1.5"/>
<path d="M56 100 C56 72 76 56 100 56 C124 56 144 72 144 100 C144 128 124 144 100 144 C76 144 56 128 56 100 Z" fill="var(--accent)" fill-opacity="0.08" stroke="none"/>
<path d="M56 92 C80 88 88 108 100 108 C112 108 120 88 144 92" fill="none" stroke="var(--accent)" stroke-width="1.2"/>
<path d="M64 112 C88 118 96 98 108 98 C120 98 128 118 136 112" fill="none" stroke="var(--soft-ink)" stroke-width="1"/>
<rect x="128" y="36" width="48" height="40" rx="6" fill="none" stroke="var(--muted)" stroke-width="1.2" stroke-dasharray="4 3" opacity="0.55"/>
<path d="M136 52 L168 52 M136 60 L160 60" stroke="var(--muted)" stroke-width="1" stroke-linecap="round" opacity="0.5"/>
<path d="M120 36 L128 28" stroke="var(--accent)" stroke-width="1.5" stroke-linecap="round"/>
<rect x="72" y="118" width="56" height="40" rx="2" fill="var(--card-bg)" stroke="var(--accent)" stroke-width="1.5"/>
<path d="M80 132 L120 132 M80 142 L112 142" stroke="var(--ink)" stroke-width="1" stroke-linecap="round" opacity="0.5"/>
<text x="100" y="154" text-anchor="middle" font-family="var(--mono)" font-size="7" fill="var(--accent)">OPEN</text>
</svg>
</div>
<div class="why-copy" data-scroll-reveal-card>
<p class="section-kicker">Planet</p>
<h2 class="section-title">Open textbooks are gentler on the Earth</h2>
<p>
Core curriculum changes slowly. Newton’s laws, the structure of a cell, and how fractions work do not
need a new AI run every September. Regenerating the same chapter thousands of times burns electricity
in data centers — for text that could have been written once and shared openly.
</p>
<p>
<strong>One carefully reviewed book</strong>, published on the web for everyone, means less redundant
compute, less e-waste from disposable PDFs, and fewer trucks moving heavy print runs. Students get
stable material they can trust; the environment gets less waste from doing the same work over and over.
</p>
</div>
</div>
</section>
<section class="why-section why-section--craft" id="why-craft">
<div class="container why-row why-row--art-end">
<div class="why-art" data-scroll-reveal-card>
<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true">
<title>Scholars and institutions worldwide</title>
<circle cx="100" cy="92" r="46" fill="none" stroke="var(--ink)" stroke-width="1.5"/>
<path d="M54 92 C54 68 74 52 100 52 C126 52 146 68 146 92" fill="var(--accent)" fill-opacity="0.08" stroke="none"/>
<path d="M54 92 C72 108 88 112 100 112 C112 112 128 108 146 92" fill="none" stroke="var(--accent)" stroke-width="1.2"/>
<path d="M54 92 C68 76 84 68 100 68 C116 68 132 76 146 92" fill="none" stroke="var(--soft-ink)" stroke-width="1" opacity="0.5"/>
<circle cx="72" cy="148" r="10" fill="none" stroke="var(--ink)" stroke-width="1.2"/>
<path d="M66 158 C66 150 69 146 72 146 C75 146 78 150 78 158 L78 168 L66 168 Z" fill="none" stroke="var(--ink)" stroke-width="1.2" stroke-linejoin="round"/>
<circle cx="100" cy="152" r="10" fill="none" stroke="var(--accent)" stroke-width="1.2"/>
<path d="M94 162 C94 154 97 150 100 150 C103 150 106 154 106 162 L106 172 L94 172 Z" fill="var(--accent)" fill-opacity="0.12" stroke="var(--accent)" stroke-width="1.2" stroke-linejoin="round"/>
<circle cx="128" cy="148" r="10" fill="none" stroke="var(--ink)" stroke-width="1.2"/>
<path d="M122 158 C122 150 125 146 128 146 C131 146 134 150 134 158 L134 168 L122 168 Z" fill="none" stroke="var(--ink)" stroke-width="1.2" stroke-linejoin="round"/>
<path d="M82 48 L88 36 M100 44 L100 32 M118 48 L112 36" stroke="var(--accent)" stroke-width="1" stroke-linecap="round" opacity="0.6"/>
</svg>
</div>
<div class="why-copy" data-scroll-reveal-card>
<p class="section-kicker">Craft</p>
<h2 class="section-title">Carefully crafted by brilliant people on Earth</h2>
<p>
A textbook is not a bulk download. It is years of lectures distilled, diagrams redrawn until they
click, exercises tested in real classrooms, and arguments tightened by reviewers who care about
getting it right.
</p>
<p>
Open Free Books gathers that work from educators and researchers at institutions around the world —
people who have already spent their careers making hard ideas legible. We publish their care
<strong>openly</strong> so the next student inherits the best version, not a disposable draft.
</p>
</div>
</div>
<div class="container why-craft-logos-wrap" data-scroll-reveal-card>
<p class="university-logos-label">Contributors and partners from leading universities include</p>
<div class="university-carousel" role="region" aria-label="Universities represented among contributors">
<div class="university-carousel-row university-carousel-row--forward">
<div class="university-carousel-track">
<ul class="university-carousel-group" role="list">
<li class="university-logo university-logo--mit">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="MIT">
<text x="60" y="34" text-anchor="middle" font-family="var(--mono)" font-size="22" font-weight="700" letter-spacing="0.12em" fill="currentColor">MIT</text>
</svg>
</li>
<li class="university-logo university-logo--harvard">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Harvard University">
<text x="60" y="22" text-anchor="middle" font-family="var(--font-heading)" font-size="15" fill="currentColor">Harvard</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="8" letter-spacing="0.2em" fill="currentColor" opacity="0.75">UNIVERSITY</text>
</svg>
</li>
<li class="university-logo university-logo--stanford">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Stanford University">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="17" fill="currentColor">Stanford</text>
</svg>
</li>
<li class="university-logo university-logo--berkeley">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="UC Berkeley">
<text x="60" y="22" text-anchor="middle" font-family="var(--mono)" font-size="16" font-weight="700" fill="currentColor">Berkeley</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.1em" fill="currentColor" opacity="0.7">UNIVERSITY OF CALIFORNIA</text>
</svg>
</li>
<li class="university-logo university-logo--caltech">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Caltech">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="18" font-weight="700" fill="currentColor">Caltech</text>
</svg>
</li>
<li class="university-logo university-logo--princeton">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Princeton University">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="16" fill="currentColor">Princeton</text>
</svg>
</li>
<li class="university-logo university-logo--yale">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Yale University">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="17" fill="currentColor">Yale</text>
</svg>
</li>
<li class="university-logo university-logo--columbia">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Columbia University">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="15" fill="currentColor">Columbia</text>
</svg>
</li>
<li class="university-logo university-logo--cornell">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Cornell University">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="16" fill="currentColor">Cornell</text>
</svg>
</li>
</ul>
<ul class="university-carousel-group" role="list" aria-hidden="true">
<li class="university-logo university-logo--mit">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="MIT">
<text x="60" y="34" text-anchor="middle" font-family="var(--mono)" font-size="22" font-weight="700" letter-spacing="0.12em" fill="currentColor">MIT</text>
</svg>
</li>
<li class="university-logo university-logo--harvard">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Harvard University">
<text x="60" y="22" text-anchor="middle" font-family="var(--font-heading)" font-size="15" fill="currentColor">Harvard</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="8" letter-spacing="0.2em" fill="currentColor" opacity="0.75">UNIVERSITY</text>
</svg>
</li>
<li class="university-logo university-logo--stanford">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Stanford University">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="17" fill="currentColor">Stanford</text>
</svg>
</li>
<li class="university-logo university-logo--berkeley">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="UC Berkeley">
<text x="60" y="22" text-anchor="middle" font-family="var(--mono)" font-size="16" font-weight="700" fill="currentColor">Berkeley</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.1em" fill="currentColor" opacity="0.7">UNIVERSITY OF CALIFORNIA</text>
</svg>
</li>
<li class="university-logo university-logo--caltech">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Caltech">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="18" font-weight="700" fill="currentColor">Caltech</text>
</svg>
</li>
<li class="university-logo university-logo--princeton">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Princeton University">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="16" fill="currentColor">Princeton</text>
</svg>
</li>
<li class="university-logo university-logo--yale">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Yale University">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="17" fill="currentColor">Yale</text>
</svg>
</li>
<li class="university-logo university-logo--columbia">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Columbia University">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="15" fill="currentColor">Columbia</text>
</svg>
</li>
<li class="university-logo university-logo--cornell">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Cornell University">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="16" fill="currentColor">Cornell</text>
</svg>
</li>
</ul>
</div>
</div>
<div class="university-carousel-row university-carousel-row--reverse">
<div class="university-carousel-track">
<ul class="university-carousel-group" role="list">
<li class="university-logo university-logo--cmu">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Carnegie Mellon University">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="18" font-weight="700" fill="currentColor">CMU</text>
</svg>
</li>
<li class="university-logo university-logo--oxford">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="University of Oxford">
<text x="60" y="22" text-anchor="middle" font-family="var(--font-heading)" font-size="16" font-style="italic" fill="currentColor">Oxford</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.14em" fill="currentColor" opacity="0.7">UNIVERSITY</text>
</svg>
</li>
<li class="university-logo university-logo--cambridge">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="University of Cambridge">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="15" fill="currentColor">Cambridge</text>
</svg>
</li>
<li class="university-logo university-logo--imperial">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Imperial College London">
<text x="60" y="22" text-anchor="middle" font-family="var(--mono)" font-size="13" font-weight="700" fill="currentColor">Imperial</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.08em" fill="currentColor" opacity="0.7">COLLEGE LONDON</text>
</svg>
</li>
<li class="university-logo university-logo--lse">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="London School of Economics">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="20" font-weight="700" fill="currentColor">LSE</text>
</svg>
</li>
<li class="university-logo university-logo--eth">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="ETH Zurich">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="18" font-weight="700" fill="currentColor">ETH</text>
</svg>
</li>
<li class="university-logo university-logo--toronto">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="University of Toronto">
<text x="60" y="22" text-anchor="middle" font-family="var(--font-heading)" font-size="15" fill="currentColor">Toronto</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.1em" fill="currentColor" opacity="0.7">UNIVERSITY OF</text>
</svg>
</li>
<li class="university-logo university-logo--mcgill">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="McGill University">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="16" fill="currentColor">McGill</text>
</svg>
</li>
<li class="university-logo university-logo--hku">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="The University of Hong Kong">
<text x="60" y="22" text-anchor="middle" font-family="var(--mono)" font-size="20" font-weight="700" fill="currentColor">HKU</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.08em" fill="currentColor" opacity="0.7">THE UNIVERSITY OF HONG KONG</text>
</svg>
</li>
</ul>
<ul class="university-carousel-group" role="list" aria-hidden="true">
<li class="university-logo university-logo--cmu">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Carnegie Mellon University">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="18" font-weight="700" fill="currentColor">CMU</text>
</svg>
</li>
<li class="university-logo university-logo--oxford">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="University of Oxford">
<text x="60" y="22" text-anchor="middle" font-family="var(--font-heading)" font-size="16" font-style="italic" fill="currentColor">Oxford</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.14em" fill="currentColor" opacity="0.7">UNIVERSITY</text>
</svg>
</li>
<li class="university-logo university-logo--cambridge">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="University of Cambridge">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="15" fill="currentColor">Cambridge</text>
</svg>
</li>
<li class="university-logo university-logo--imperial">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Imperial College London">
<text x="60" y="22" text-anchor="middle" font-family="var(--mono)" font-size="13" font-weight="700" fill="currentColor">Imperial</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.08em" fill="currentColor" opacity="0.7">COLLEGE LONDON</text>
</svg>
</li>
<li class="university-logo university-logo--lse">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="London School of Economics">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="20" font-weight="700" fill="currentColor">LSE</text>
</svg>
</li>
<li class="university-logo university-logo--eth">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="ETH Zurich">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="18" font-weight="700" fill="currentColor">ETH</text>
</svg>
</li>
<li class="university-logo university-logo--toronto">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="University of Toronto">
<text x="60" y="22" text-anchor="middle" font-family="var(--font-heading)" font-size="15" fill="currentColor">Toronto</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.1em" fill="currentColor" opacity="0.7">UNIVERSITY OF</text>
</svg>
</li>
<li class="university-logo university-logo--mcgill">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="McGill University">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="16" fill="currentColor">McGill</text>
</svg>
</li>
<li class="university-logo university-logo--hku">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="The University of Hong Kong">
<text x="60" y="22" text-anchor="middle" font-family="var(--mono)" font-size="20" font-weight="700" fill="currentColor">HKU</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.08em" fill="currentColor" opacity="0.7">THE UNIVERSITY OF HONG KONG</text>
</svg>
</li>
</ul>
</div>
</div>
<div class="university-carousel-row university-carousel-row--forward university-carousel-row--slow">
<div class="university-carousel-track">
<ul class="university-carousel-group" role="list">
<li class="university-logo university-logo--hkust">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Hong Kong University of Science and Technology">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="17" font-weight="700" letter-spacing="0.06em" fill="currentColor">HKUST</text>
</svg>
</li>
<li class="university-logo university-logo--cuhk">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="The Chinese University of Hong Kong">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="18" font-weight="700" fill="currentColor">CUHK</text>
</svg>
</li>
<li class="university-logo university-logo--nus">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="National University of Singapore">
<text x="60" y="22" text-anchor="middle" font-family="var(--mono)" font-size="20" font-weight="700" fill="currentColor">NUS</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.06em" fill="currentColor" opacity="0.7">NATIONAL UNIVERSITY OF SINGAPORE</text>
</svg>
</li>
<li class="university-logo university-logo--tsinghua">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Tsinghua University">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="15" fill="currentColor">Tsinghua</text>
</svg>
</li>
<li class="university-logo university-logo--pku">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Peking University">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="20" font-weight="700" fill="currentColor">PKU</text>
</svg>
</li>
<li class="university-logo university-logo--utokyo">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="The University of Tokyo">
<text x="60" y="22" text-anchor="middle" font-family="var(--font-heading)" font-size="14" fill="currentColor">Tokyo</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.1em" fill="currentColor" opacity="0.7">UNIVERSITY OF</text>
</svg>
</li>
<li class="university-logo university-logo--anu">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Australian National University">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="20" font-weight="700" fill="currentColor">ANU</text>
</svg>
</li>
<li class="university-logo university-logo--melbourne">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="University of Melbourne">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="15" fill="currentColor">Melbourne</text>
</svg>
</li>
<li class="university-logo university-logo--iitb">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Indian Institute of Technology Bombay">
<text x="60" y="22" text-anchor="middle" font-family="var(--mono)" font-size="18" font-weight="700" fill="currentColor">IIT</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.08em" fill="currentColor" opacity="0.7">BOMBAY</text>
</svg>
</li>
</ul>
<ul class="university-carousel-group" role="list" aria-hidden="true">
<li class="university-logo university-logo--hkust">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Hong Kong University of Science and Technology">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="17" font-weight="700" letter-spacing="0.06em" fill="currentColor">HKUST</text>
</svg>
</li>
<li class="university-logo university-logo--cuhk">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="The Chinese University of Hong Kong">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="18" font-weight="700" fill="currentColor">CUHK</text>
</svg>
</li>
<li class="university-logo university-logo--nus">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="National University of Singapore">
<text x="60" y="22" text-anchor="middle" font-family="var(--mono)" font-size="20" font-weight="700" fill="currentColor">NUS</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.06em" fill="currentColor" opacity="0.7">NATIONAL UNIVERSITY OF SINGAPORE</text>
</svg>
</li>
<li class="university-logo university-logo--tsinghua">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Tsinghua University">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="15" fill="currentColor">Tsinghua</text>
</svg>
</li>
<li class="university-logo university-logo--pku">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Peking University">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="20" font-weight="700" fill="currentColor">PKU</text>
</svg>
</li>
<li class="university-logo university-logo--utokyo">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="The University of Tokyo">
<text x="60" y="22" text-anchor="middle" font-family="var(--font-heading)" font-size="14" fill="currentColor">Tokyo</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.1em" fill="currentColor" opacity="0.7">UNIVERSITY OF</text>
</svg>
</li>
<li class="university-logo university-logo--anu">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Australian National University">
<text x="60" y="30" text-anchor="middle" font-family="var(--mono)" font-size="20" font-weight="700" fill="currentColor">ANU</text>
</svg>
</li>
<li class="university-logo university-logo--melbourne">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="University of Melbourne">
<text x="60" y="30" text-anchor="middle" font-family="var(--font-heading)" font-size="15" fill="currentColor">Melbourne</text>
</svg>
</li>
<li class="university-logo university-logo--iitb">
<svg viewBox="0 0 120 48" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Indian Institute of Technology Bombay">
<text x="60" y="22" text-anchor="middle" font-family="var(--mono)" font-size="18" font-weight="700" fill="currentColor">IIT</text>
<text x="60" y="38" text-anchor="middle" font-family="var(--mono)" font-size="7" letter-spacing="0.08em" fill="currentColor" opacity="0.7">BOMBAY</text>
</svg>
</li>
</ul>
</div>
</div>
</div>
</div>
</section>
<section id="browse-by-subject">
<div class="container">
<p class="section-kicker">Catalog</p>
<h2 class="section-title">Browse by subject</h2>
<div class="work-grid" data-scroll-reveal>
<article class="work-card" data-scroll-reveal-card>
<h3>Mathematics</h3>
<p class="card-subtitle">Coming soon</p>
<p>Algebra, calculus, statistics, and more — structured for self-study and classrooms.</p>
</article>
<article class="work-card" data-scroll-reveal-card>
<h3>Science</h3>
<p class="card-subtitle">Coming soon</p>
<p>Physics, chemistry, biology, and earth science from introductory to advanced levels.</p>
</article>
<article class="work-card" data-scroll-reveal-card>
<h3>Humanities</h3>
<p class="card-subtitle">Coming soon</p>
<p>History, literature, philosophy, and languages — readable, citable, and free to share.</p>
</article>
<article class="work-card" data-scroll-reveal-card>
<h3>Computing</h3>
<p class="card-subtitle">Coming soon</p>
<p>Programming, computer science fundamentals, and practical skills for students and teachers.</p>
</article>
</div>
<p class="section-note">Subject pages and full catalogs are on the roadmap. Contribute a book on GitHub.</p>
</div>
</section>
<section id="featured-books">
<div class="container">
<p class="section-kicker">Featured</p>
<h2 class="section-title">Featured books</h2>
<div class="work-grid" data-scroll-reveal>
<article class="work-card" data-scroll-reveal-card>
<h3>Your textbook here</h3>
<p class="card-subtitle">Placeholder</p>
<p>We are building the first open catalog. The first published books will appear in this grid.</p>
</article>
<article class="work-card" data-scroll-reveal-card>
<h3>Community contributions</h3>
<p class="card-subtitle">Open source</p>
<p>Every book is a repository you can fork, translate, or adapt for your classroom.</p>
</article>
</div>
<p class="section-note">Want to list a book? Open a pull request or start a discussion on GitHub.</p>
</div>
</section>
<section id="contributors" class="contributors-section">
<div class="container">
<p class="section-kicker">People</p>
<h2 class="section-title">Contributors</h2>
<p class="contributors-intro">
Open Free Books is written and maintained in the open. These are the people building and reviewing the textbooks.
</p>
<ul class="contributors-avatar-grid" role="list">
<li class="contributors-avatar-item" data-scroll-reveal-card>
<button
type="button"
class="contributor-avatar-btn"
data-contributor-dialog="contributor-dialog-man-lung-yeung"
aria-label="View contributions by Man Lung Yeung"
aria-haspopup="dialog"
>
<img
class="contributor-avatar-img"
src="https://openfreebooks.org/contributors/manlung.png"
alt=""
width="48"
height="48"
loading="lazy"
decoding="async"
/>
</button>
</li>
</ul>
<dialog id="contributor-dialog-man-lung-yeung" class="contributor-dialog">
<form method="dialog" class="contributor-dialog-panel">
<button type="submit" class="contributor-dialog-close" aria-label="Close">×</button>
<div class="contributor-dialog-header">
<img
class="contributor-dialog-avatar"
src="https://openfreebooks.org/contributors/manlung.png"
alt=""
width="80"
height="80"
decoding="async"
/>
<div class="contributor-dialog-identity">
<h3 class="contributor-dialog-name">Man Lung Yeung</h3>
<p class="contributor-dialog-job">EdTech specialist &#x2F; software engineer</p>
</div>
</div>
<p class="contributor-dialog-meta">
<span class="contributor-meta-label">Education</span>
BEng in Computer Science (HKUST) + BBA (HKUST)
</p>
<div class="contributor-dialog-contributions">
<span class="contributor-meta-label">Contributes</span>
<ul class="contributor-contribution-list" role="list">
<li>Founder</li>
<li>Math textbook</li>
<li>Physics textbook</li>
<li>Chemistry textbook</li>
</ul>
</div>
<div class="contributor-dialog-links">
<a class="contributor-link" href="mailto:manlung.yeung@outlook.com">manlung.yeung@outlook.com</a>
<a class="contributor-link contributor-link--external" href="https://manlung.work" rel="noopener noreferrer">Website</a>
</div>
</form>
</dialog>
<p class="section-note">
Want to contribute? Open a pull request on <a href="https://github.com/hananoshikayomaru/openfreebooks">GitHub</a>.
</p>
</div>
</section>
</main>
<footer class="footer">
<div class="container footer-inner">
<span>© <span id="footer-year"></span> Open Free Books — Free, open textbooks for every learner</span>
<a class="footer-link" href="https://github.com/hananoshikayomaru/openfreebooks">GitHub</a>
</div>
</footer>
<script src="https://openfreebooks.org/js/bundle.js" defer></script>
</body>
</html>

File diff suppressed because one or more lines are too long

View file

@ -1,4 +0,0 @@
User-agent: *
Disallow:
Allow: /
Sitemap: https://openfreebooks.org/sitemap.xml

View file

@ -1,19 +0,0 @@
{
"name": "Open Free Books",
"short_name": "OpenFreeBooks",
"icons": [
{
"src": "/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#9a6b2e",
"background_color": "#f5f4f1",
"display": "standalone"
}

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://openfreebooks.org/</loc>
</url>
</urlset>

View file

@ -41,8 +41,11 @@
<footer class="footer"> <footer class="footer">
<div class="container footer-inner"> <div class="container footer-inner">
<span>© <span id="footer-year"></span> {{ config.extra.site_title }} — Free, open textbooks for every learner</span> <span class="footer-copy">© <span id="footer-year"></span> {{ config.extra.site_title }} — Free, open textbooks for every learner</span>
<a class="footer-link" href="{{ config.extra.github_url | safe }}">GitHub</a> <nav class="footer-links" aria-label="Footer links">
<a class="footer-link" href="{{ config.extra.credits_url | safe }}">Credits</a>
<a class="footer-link" href="{{ config.extra.github_url | safe }}">GitHub</a>
</nav>
</div> </div>
</footer> </footer>

View file

@ -0,0 +1,16 @@
{% extends "base.html" %}
{% block title %}Credits | {{ config.extra.site_title }}{% endblock title %}
{% block meta_description %}
<meta name="description" content="Technology credits and open source acknowledgements for {{ config.extra.site_title }}." />
{% endblock meta_description %}
{% block content %}
<section class="credits-page">
<div class="container">
<p class="section-kicker">Acknowledgements</p>
<h1 class="section-title">{{ page.title }}</h1>
{% include "partials/credits-content.html" %}
</div>
</section>
{% endblock content %}

View file

@ -26,66 +26,47 @@
{% endmacro %} {% endmacro %}
{% macro social_icon(kind) %} {% macro social_icon(kind) %}
<svg class="contributor-social-icon" viewBox="0 0 24 24" width="20" height="20" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round">
{% if kind == "email" %} {% if kind == "email" %}
<rect x="3" y="5" width="18" height="14" rx="2"/> {% include "partials/icons/social/email.html" %}
<path d="M3 7l9 6 9-6"/>
{% elif kind == "github" %} {% elif kind == "github" %}
<path d="M9 19c-4.3 1.4-4.3-2.5-6-3m12 5v-3.5c0-1 .1-1.4-.3-2 2.4-.3 5-1.2 5-5.4.9-1.5-.3-3.2 0-4.8-.9-.3-2.9.4-4.5 0-1.3-.4-2.7-.4-4 0-1.6-.4-3.6.3-4.5 0 .3 1.6.3 3.6 0 4.8 0 4.2 2.6 5.1 5 5.4-.4 1-.4 1.3-.4 2.3V20" fill="currentColor" stroke="none"/> {% include "partials/icons/social/github.html" %}
{% elif kind == "gitlab" %} {% elif kind == "gitlab" %}
<path d="M4 20l4-12 4 8 4-8 4 12H4z" fill="currentColor" stroke="none"/> {% include "partials/icons/social/gitlab.html" %}
{% elif kind == "x" %} {% elif kind == "x" %}
<path d="M4 4l7.5 8.5L4 20h2.5l5-5.7L15.5 20H20l-7.8-9L20 4h-2.5l-4.6 5.2L8.5 4H4z" fill="currentColor" stroke="none"/> {% include "partials/icons/social/x.html" %}
{% elif kind == "youtube" %} {% elif kind == "youtube" %}
<rect x="3" y="6" width="18" height="12" rx="3"/> {% include "partials/icons/social/youtube.html" %}
<path d="M11 10l5 2-5 2v-4z" fill="currentColor" stroke="none"/>
{% elif kind == "bluesky" %} {% elif kind == "bluesky" %}
<path d="M6.5 5.5c3.2 2.4 6.8 2.4 10 0 0 5.6-2.5 11-5 11s-5-5.4-5-11z" fill="currentColor" stroke="none"/> {% include "partials/icons/social/bluesky.html" %}
{% elif kind == "linkedin" %} {% elif kind == "linkedin" %}
<rect x="4" y="4" width="4" height="16"/> {% include "partials/icons/social/linkedin.html" %}
<rect x="10" y="10" width="4" height="10"/>
<circle cx="6" cy="7" r="2" fill="currentColor" stroke="none"/>
<path d="M14 8c2.2 0 4 1.8 4 4v8"/>
{% elif kind == "mastodon" %} {% elif kind == "mastodon" %}
<rect x="4" y="6" width="16" height="12" rx="3"/> {% include "partials/icons/social/mastodon.html" %}
<path d="M8 10v4M12 10v4M16 10v4"/>
{% elif kind == "instagram" %} {% elif kind == "instagram" %}
<rect x="4" y="4" width="16" height="16" rx="5"/> {% include "partials/icons/social/instagram.html" %}
<circle cx="12" cy="12" r="3.5"/>
<circle cx="17" cy="7" r="1" fill="currentColor" stroke="none"/>
{% elif kind == "facebook" %} {% elif kind == "facebook" %}
<path d="M14 8h3V5h-3c-2.8 0-5 2.2-5 5v2H7v3h3v8h4v-8h3l1-3h-4V9c0-.6.4-1 1-1z" fill="currentColor" stroke="none"/> {% include "partials/icons/social/facebook.html" %}
{% elif kind == "threads" %} {% elif kind == "threads" %}
<path d="M12 4c3.5 0 6 2.2 6 5.5 0 3.8-3.2 6.5-7 6.5-2.2 0-4-.9-4-2.5S8.8 11 12 11s4-.4 4-1.5S14 7 12 7s-3 .8-3 2" fill="currentColor" stroke="none"/> {% include "partials/icons/social/threads.html" %}
{% elif kind == "tiktok" %} {% elif kind == "tiktok" %}
<path d="M10 6v9.5a3.5 3.5 0 11-2-3.2V9.5M14 6v5.5c1.2 0 2.2-.6 2.8-1.5V6h3v4.5c0 3.3-2.7 6-6 6s-6-2.7-6-6 2.7-6 6-6" fill="currentColor" stroke="none"/> {% include "partials/icons/social/tiktok.html" %}
{% elif kind == "discord" %} {% elif kind == "discord" %}
<path d="M8 8c1.5-1 4.5-1 6 0M7 16c2-1 8-1 10 0M9 10v1M15 10v1" fill="currentColor" stroke="none"/> {% include "partials/icons/social/discord.html" %}
<path d="M6 7c-1 2-1.5 5-1 9 1.5 1 4 1.5 7 1.5s5.5-.5 7-1.5c.5-4 .5-7-1-9-2-1.5-10-1.5-12 0z"/>
{% elif kind == "orcid" %} {% elif kind == "orcid" %}
<circle cx="12" cy="12" r="8"/> {% include "partials/icons/social/orcid.html" %}
<path d="M9 10v6M12 10v6M15 10c0 2-1 3-1 3v3"/>
{% elif kind == "scholar" %} {% elif kind == "scholar" %}
<path d="M12 4L4 8v2c0 5 3.5 8.5 8 10 4.5-1.5 8-5 8-10V8l-8-4z"/> {% include "partials/icons/social/scholar.html" %}
<path d="M12 12v6"/>
{% elif kind == "medium" %} {% elif kind == "medium" %}
<circle cx="8" cy="12" r="4" fill="currentColor" stroke="none"/> {% include "partials/icons/social/medium.html" %}
<circle cx="16" cy="12" r="4" fill="currentColor" stroke="none"/>
<circle cx="12" cy="12" r="4" fill="currentColor" stroke="none"/>
{% elif kind == "substack" %} {% elif kind == "substack" %}
<path d="M5 6h14v3H5zM5 11h14v2l-7 5-7-5v-2z" fill="currentColor" stroke="none"/> {% include "partials/icons/social/substack.html" %}
{% elif kind == "rss" %} {% elif kind == "rss" %}
<path d="M5 5v14M5 15a7 7 0 017 7M5 11a3 3 0 013 3"/> {% include "partials/icons/social/rss.html" %}
{% else %} {% else %}
<path d="M10 13a5 5 0 007.5 4M14 6.5l2-2 2 2M10 10l-2 2 2 2"/> {% include "partials/icons/social/website.html" %}
<circle cx="12" cy="12" r="9"/>
{% endif %} {% endif %}
</svg>
{% endmacro %} {% endmacro %}
{% macro website_icon() %} {% macro website_icon() %}
<svg class="contributor-social-icon" viewBox="0 0 24 24" width="20" height="20" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"> {% include "partials/icons/social/website.html" %}
<circle cx="12" cy="12" r="9"/>
<path d="M3 12h18M12 3c2.5 2.8 4 6 4 9s-1.5 6.2-4 9M12 3c-2.5 2.8-4 6-4 9s1.5 6.2 4 9"/>
</svg>
{% endmacro %} {% endmacro %}

View file

@ -1,4 +1,4 @@
{% set contributors_data = load_data(path="contributors.json", format="json") %} {% set contributors_data = load_data(path="data/contributors.json", format="json") %}
<div class="community-contributors" id="contributors"> <div class="community-contributors" id="contributors">
<div class="container"> <div class="container">

View file

@ -0,0 +1,68 @@
{% set credits = load_data(path="data/credits.json", format="json") %}
{% set libraries = credits.libraries | sort(attribute="name") %}
<div class="credits-prose">
<p class="credits-lead">{{ credits.intro }}</p>
<p class="credits-contributors-note">
{{ credits.contributors_note }}
<a href="{{ get_url(path='/') | safe }}#contributors">View contributors</a>.
</p>
<section class="credits-block" aria-labelledby="credits-project-heading">
<h2 id="credits-project-heading" class="credits-section-title">This project</h2>
<article class="credits-entry">
<h3 class="credits-entry-name">
{% if credits.project.url %}
<a href="{{ credits.project.url | safe }}">{{ credits.project.name }}</a>
{% else %}
{{ credits.project.name }}
{% endif %}
</h3>
<p class="credits-entry-version">Version {{ credits.project.version }}</p>
<p class="credits-entry-license">
<a href="{{ credits.project.license_url | safe }}">{{ credits.project.license }} License</a>
</p>
<p class="credits-entry-copyright">{{ credits.project.copyright }}</p>
</article>
</section>
<section class="credits-block" aria-labelledby="credits-libraries-heading">
<h2 id="credits-libraries-heading" class="credits-section-title">Third party acknowledgements</h2>
<p class="credits-section-intro">
{{ credits.project.name }} uses the open source libraries below (in alphabetical order):
</p>
{% for lib in libraries %}
<article class="credits-entry">
<h3 class="credits-entry-name">
<a href="{{ lib.url | safe }}" rel="noopener noreferrer">{{ lib.name }}</a>
</h3>
<p class="credits-entry-version">Version {{ lib.version }}</p>
<p class="credits-entry-license">
{% if lib.license_url %}
<a href="{{ lib.license_url | safe }}" rel="noopener noreferrer">{{ lib.license }}</a>
{% else %}
{{ lib.license }}
{% endif %}
</p>
<p class="credits-entry-copyright">{{ lib.copyright }}</p>
</article>
{% endfor %}
</section>
{% if credits.hosting %}
<section class="credits-block" aria-labelledby="credits-hosting-heading">
<h2 id="credits-hosting-heading" class="credits-section-title">Hosting &amp; deploy</h2>
{% for item in credits.hosting %}
<article class="credits-entry">
<h3 class="credits-entry-name">
<a href="{{ item.url | safe }}" rel="noopener noreferrer">{{ item.name }}</a>
</h3>
{% if item.version %}
<p class="credits-entry-version">Version {{ item.version }}</p>
{% endif %}
<p class="credits-entry-note">{{ item.note }}</p>
</article>
{% endfor %}
</section>
{% endif %}
</div>

View file

@ -0,0 +1,11 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M6.335 5.144c-1.654 -1.199 -4.335 -2.127 -4.335 .826c0 .59 .35 4.953 .556 5.661c.713 2.463 3.13 2.75 5.444 2.369c-4.045 .665 -4.889 3.208 -2.667 5.41c1.03 1.018 1.913 1.59 2.667 1.59c2 0 3.134 -2.769 3.5 -3.5c.333 -.667 .5 -1.167 .5 -1.5c0 .333 .167 .833 .5 1.5c.366 .731 1.5 3.5 3.5 3.5c.754 0 1.637 -.571 2.667 -1.59c2.222 -2.203 1.378 -4.746 -2.667 -5.41c2.314 .38 4.73 .094 5.444 -2.369c.206 -.708 .556 -5.072 .556 -5.661c0 -2.953 -2.68 -2.025 -4.335 -.826c-2.293 1.662 -4.76 5.048 -5.665 6.856c-.905 -1.808 -3.372 -5.194 -5.665 -6.856" />
</svg>

After

Width:  |  Height:  |  Size: 813 B

View file

@ -0,0 +1,14 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M8 12a1 1 0 1 0 2 0a1 1 0 0 0 -2 0" />
<path d="M14 12a1 1 0 1 0 2 0a1 1 0 0 0 -2 0" />
<path d="M15.5 17c0 1 1.5 3 2 3c1.5 0 2.833 -1.667 3.5 -3c.667 -1.667 .5 -5.833 -1.5 -11.5c-1.457 -1.015 -3 -1.34 -4.5 -1.5l-.972 1.923a11.913 11.913 0 0 0 -4.053 0l-.975 -1.923c-1.5 .16 -3.043 .485 -4.5 1.5c-2 5.667 -2.167 9.833 -1.5 11.5c.667 1.333 2 3 3.5 3c.5 0 2 -2 2 -3" />
<path d="M7 16.5c3.5 1 6.5 1 10 0" />
</svg>

After

Width:  |  Height:  |  Size: 681 B

View file

@ -0,0 +1,12 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M3 7a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-10" />
<path d="M3 7l9 6l9 -6" />
</svg>

After

Width:  |  Height:  |  Size: 381 B

View file

@ -0,0 +1,11 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M7 10v4h3v7h4v-7h3l1 -4h-4v-2a1 1 0 0 1 1 -1h3v-4h-3a5 5 0 0 0 -5 5v2h-3" />
</svg>

After

Width:  |  Height:  |  Size: 346 B

View file

@ -0,0 +1,11 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" />
</svg>

After

Width:  |  Height:  |  Size: 566 B

View file

@ -0,0 +1,11 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M21 14l-9 7l-9 -7l3 -11l3 7h6l3 -7l3 11" />
</svg>

After

Width:  |  Height:  |  Size: 313 B

View file

@ -0,0 +1,13 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M4 8a4 4 0 0 1 4 -4h8a4 4 0 0 1 4 4v8a4 4 0 0 1 -4 4h-8a4 4 0 0 1 -4 -4l0 -8" />
<path d="M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0" />
<path d="M16.5 7.5v.01" />
</svg>

After

Width:  |  Height:  |  Size: 429 B

View file

@ -0,0 +1,15 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M8 11v5" />
<path d="M8 8v.01" />
<path d="M12 16v-5" />
<path d="M16 16v-3a2 2 0 1 0 -4 0" />
<path d="M3 7a4 4 0 0 1 4 -4h10a4 4 0 0 1 4 4v10a4 4 0 0 1 -4 4h-10a4 4 0 0 1 -4 -4l0 -10" />
</svg>

After

Width:  |  Height:  |  Size: 466 B

View file

@ -0,0 +1,12 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M18.648 15.254c-1.816 1.763 -6.648 1.626 -6.648 1.626a18.262 18.262 0 0 1 -3.288 -.256c1.127 1.985 4.12 2.81 8.982 2.475c-1.945 2.013 -13.598 5.257 -13.668 -7.636l-.026 -1.154c0 -3.036 .023 -4.115 1.352 -5.633c1.671 -1.91 6.648 -1.666 6.648 -1.666s4.977 -.243 6.648 1.667c1.329 1.518 1.352 2.597 1.352 5.633s-.456 4.074 -1.352 4.944" />
<path d="M12 11.204v-2.926c0 -1.258 -.895 -2.278 -2 -2.278s-2 1.02 -2 2.278v4.722m4 -4.722c0 -1.258 .895 -2.278 2 -2.278s2 1.02 2 2.278v4.722" />
</svg>

After

Width:  |  Height:  |  Size: 754 B

View file

@ -0,0 +1,16 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M4 6a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2l0 -12" />
<path d="M8 9h1l3 3l3 -3h1" />
<path d="M8 15l2 0" />
<path d="M14 15l2 0" />
<path d="M9 9l0 6" />
<path d="M15 9l0 6" />
</svg>

After

Width:  |  Height:  |  Size: 487 B

View file

@ -0,0 +1,11 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12 3a9 9 0 0 1 3.618 17.243l-2.193 -5.602a3 3 0 1 0 -2.849 0l-2.193 5.603a9 9 0 0 1 3.617 -17.244" />
</svg>

After

Width:  |  Height:  |  Size: 372 B

View file

@ -0,0 +1,13 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M4 19a1 1 0 1 0 2 0a1 1 0 1 0 -2 0" />
<path d="M4 4a16 16 0 0 1 16 16" />
<path d="M4 11a9 9 0 0 1 9 9" />
</svg>

After

Width:  |  Height:  |  Size: 381 B

View file

@ -0,0 +1,12 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M22 9l-10 -4l-10 4l10 4l10 -4v6" />
<path d="M6 10.6v5.4a6 3 0 0 0 12 0v-5.4" />
</svg>

After

Width:  |  Height:  |  Size: 352 B

View file

@ -0,0 +1,14 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M16 6h3a1 1 0 0 1 1 1v11a2 2 0 0 1 -4 0v-13a1 1 0 0 0 -1 -1h-10a1 1 0 0 0 -1 1v12a3 3 0 0 0 3 3h11" />
<path d="M8 8l4 0" />
<path d="M8 12l4 0" />
<path d="M8 16l4 0" />
</svg>

After

Width:  |  Height:  |  Size: 446 B

View file

@ -0,0 +1,11 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M19 7.5c-1.333 -3 -3.667 -4.5 -7 -4.5c-5 0 -8 2.5 -8 9s3.5 9 8 9s7 -3 7 -5s-1 -5 -7 -5c-2.5 0 -3 1.25 -3 2.5c0 1.5 1 2.5 2.5 2.5c2.5 0 3.5 -1.5 3.5 -5s-2 -4 -3 -4s-1.833 .333 -2.5 1" />
</svg>

After

Width:  |  Height:  |  Size: 455 B

View file

@ -0,0 +1,11 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M21 7.917v4.034a9.948 9.948 0 0 1 -5 -1.951v4.5a6.5 6.5 0 1 1 -8 -6.326v4.326a2.5 2.5 0 1 0 4 2v-11.5h4.083a6.005 6.005 0 0 0 4.917 4.917" />
</svg>

After

Width:  |  Height:  |  Size: 411 B

View file

@ -0,0 +1,15 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0" />
<path d="M3.6 9h16.8" />
<path d="M3.6 15h16.8" />
<path d="M11.5 3a17 17 0 0 0 0 18" />
<path d="M12.5 3a17 17 0 0 1 0 18" />
</svg>

After

Width:  |  Height:  |  Size: 445 B

View file

@ -0,0 +1,12 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M4 4l11.733 16h4.267l-11.733 -16l-4.267 0" />
<path d="M4 20l6.768 -6.768m2.46 -2.46l6.772 -6.772" />
</svg>

After

Width:  |  Height:  |  Size: 373 B

View file

@ -0,0 +1,12 @@
<svg class="contributor-social-icon" aria-hidden="true" width="20" height="20"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.75"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M2 8a4 4 0 0 1 4 -4h12a4 4 0 0 1 4 4v8a4 4 0 0 1 -4 4h-12a4 4 0 0 1 -4 -4v-8" />
<path d="M10 9l5 3l-5 3l0 -6" />
</svg>

After

Width:  |  Height:  |  Size: 385 B

View file

@ -21,3 +21,4 @@ site_title = "Open Free Books"
github_url = "https://github.com/hananoshikayomaru/openfreebooks" github_url = "https://github.com/hananoshikayomaru/openfreebooks"
browse_url = "/browse/" browse_url = "/browse/"
about_url = "/about/" about_url = "/about/"
credits_url = "/credits/"