about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVika <vika@fireburn.ru>2025-01-02 13:52:19 +0300
committerVika <vika@fireburn.ru>2025-01-02 13:52:19 +0300
commit4432fbcee01a3e78fc3ff176077a8f784ae8317f (patch)
tree07ea9ab24c808c89392b80422ba1d3816393854b
parent95e00e79726f4c29230cf9e39c76ea15ad9adf46 (diff)
downloadkittybox-4432fbcee01a3e78fc3ff176077a8f784ae8317f.tar.zst
Vendor fonts into Kittybox
These fonts are licensed under OFL 1.1, which means I can freely
redistribute them. Ain't that nice?

Change-Id: Ide32286305680865652db17c8d482b5ac0f20a50
-rw-r--r--src/lib.rs4
-rw-r--r--templates/assets/fonts/LICENSE.Caveat.md108
-rw-r--r--templates/assets/fonts/LICENSE.Lato.md110
-rw-r--r--templates/assets/fonts/caveat-v18-cyrillic_cyrillic-ext_latin_latin-ext-500.woff2bin0 -> 106844 bytes
-rw-r--r--templates/assets/fonts/lato-v24-latin_latin-ext-700.woff2bin0 -> 24780 bytes
-rw-r--r--templates/assets/fonts/lato-v24-latin_latin-ext-700italic.woff2bin0 -> 26368 bytes
-rw-r--r--templates/assets/fonts/lato-v24-latin_latin-ext-italic.woff2bin0 -> 26328 bytes
-rw-r--r--templates/assets/fonts/lato-v24-latin_latin-ext-regular.woff2bin0 -> 25284 bytes
-rw-r--r--templates/assets/onboarding.css9
-rw-r--r--templates/assets/style.css85
-rw-r--r--templates/build.rs8
-rw-r--r--templates/javascript/src/onboarding.ts4
-rw-r--r--templates/src/mf2.rs2
-rw-r--r--templates/src/onboarding.rs14
14 files changed, 320 insertions, 24 deletions
diff --git a/src/lib.rs b/src/lib.rs
index fe5b800..3fb6845 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -296,7 +296,7 @@ St: Clone + Send + Sync + 'static
         .route("/.kittybox/health", get(health_check::<S>))
         .nest("/.kittybox/login", crate::login::router::<St, S>())
         .route(
-            "/.kittybox/static/{path}",
+            "/.kittybox/static/{*path}",
             axum::routing::get(crate::frontend::statics)
         )
         .route("/.kittybox/coffee", get(teapot_route))
@@ -311,7 +311,7 @@ St: Clone + Send + Sync + 'static
         .layer(tower_http::set_header::SetResponseHeaderLayer::appending(
             axum::http::header::CONTENT_SECURITY_POLICY,
             axum::http::HeaderValue::from_static(
-                "default-src https:; img-src https:; script-src 'self'; style-src 'self' fonts.googleapis.com; script-src-attr 'none'; base-uri 'none'"
+                "default-src https:; img-src https:; script-src 'self'; style-src 'self'; script-src-attr 'none'; base-uri 'none'"
             )
         ))
 }
diff --git a/templates/assets/fonts/LICENSE.Caveat.md b/templates/assets/fonts/LICENSE.Caveat.md
new file mode 100644
index 0000000..c61da21
--- /dev/null
+++ b/templates/assets/fonts/LICENSE.Caveat.md
@@ -0,0 +1,108 @@
+Copyright 2014 The Caveat Project Authors (https://github.com/googlefonts/caveat) 
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.  
+This license is copied below, and is also available with a FAQ at:  
+https\://openfontlicense.org  
+&nbsp;
+
+\----------------------------------------------------------------------
+
+#### SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+
+\----------------------------------------------------------------------
+
+&nbsp;
+
+PREAMBLE
+-----------
+
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+-----------
+
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+-----------
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+-----------
+
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+-----------
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
diff --git a/templates/assets/fonts/LICENSE.Lato.md b/templates/assets/fonts/LICENSE.Lato.md
new file mode 100644
index 0000000..56bf71a
--- /dev/null
+++ b/templates/assets/fonts/LICENSE.Lato.md
@@ -0,0 +1,110 @@
+Copyright (c) 2010-2011 by tyPoland Lukasz Dziedzic (team@latofonts.com) with
+Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version
+1.1.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.  
+This license is copied below, and is also available with a FAQ at:  
+https\://openfontlicense.org  
+&nbsp;
+
+\----------------------------------------------------------------------
+
+#### SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+
+\----------------------------------------------------------------------
+
+&nbsp;
+
+PREAMBLE
+-----------
+
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+-----------
+
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+-----------
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+-----------
+
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+-----------
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
diff --git a/templates/assets/fonts/caveat-v18-cyrillic_cyrillic-ext_latin_latin-ext-500.woff2 b/templates/assets/fonts/caveat-v18-cyrillic_cyrillic-ext_latin_latin-ext-500.woff2
new file mode 100644
index 0000000..f3b3fd3
--- /dev/null
+++ b/templates/assets/fonts/caveat-v18-cyrillic_cyrillic-ext_latin_latin-ext-500.woff2
Binary files differdiff --git a/templates/assets/fonts/lato-v24-latin_latin-ext-700.woff2 b/templates/assets/fonts/lato-v24-latin_latin-ext-700.woff2
new file mode 100644
index 0000000..b10c152
--- /dev/null
+++ b/templates/assets/fonts/lato-v24-latin_latin-ext-700.woff2
Binary files differdiff --git a/templates/assets/fonts/lato-v24-latin_latin-ext-700italic.woff2 b/templates/assets/fonts/lato-v24-latin_latin-ext-700italic.woff2
new file mode 100644
index 0000000..e480a20
--- /dev/null
+++ b/templates/assets/fonts/lato-v24-latin_latin-ext-700italic.woff2
Binary files differdiff --git a/templates/assets/fonts/lato-v24-latin_latin-ext-italic.woff2 b/templates/assets/fonts/lato-v24-latin_latin-ext-italic.woff2
new file mode 100644
index 0000000..d28c025
--- /dev/null
+++ b/templates/assets/fonts/lato-v24-latin_latin-ext-italic.woff2
Binary files differdiff --git a/templates/assets/fonts/lato-v24-latin_latin-ext-regular.woff2 b/templates/assets/fonts/lato-v24-latin_latin-ext-regular.woff2
new file mode 100644
index 0000000..1d46153
--- /dev/null
+++ b/templates/assets/fonts/lato-v24-latin_latin-ext-regular.woff2
Binary files differdiff --git a/templates/assets/onboarding.css b/templates/assets/onboarding.css
index bf770af..f5e0161 100644
--- a/templates/assets/onboarding.css
+++ b/templates/assets/onboarding.css
@@ -34,3 +34,12 @@ form.onboarding textarea {
     width: 100%;
     resize: vertical;
 }
+form.onboarding > fieldset.inactive {
+    display: none;
+}
+form.onboarding textarea#first_post_content {
+    height: 8em;
+}
+h1#onboarding_greet {
+    text-align: center;
+}
diff --git a/templates/assets/style.css b/templates/assets/style.css
index 98cb3a9..a06bf23 100644
--- a/templates/assets/style.css
+++ b/templates/assets/style.css
@@ -1,4 +1,47 @@
-@import url('https://fonts.googleapis.com/css2?family=Caveat:wght@500&family=Lato&display=swap');
+/* lato-regular - latin_latin-ext */
+@font-face {
+  font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+  font-family: 'Lato';
+  font-style: normal;
+  font-weight: 400;
+  src: url('./fonts/lato-v24-latin_latin-ext-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* lato-italic - latin_latin-ext */
+@font-face {
+  font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+  font-family: 'Lato';
+  font-style: italic;
+  font-weight: 400;
+  src: url('./fonts/lato-v24-latin_latin-ext-italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* lato-700 - latin_latin-ext */
+@font-face {
+  font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+  font-family: 'Lato';
+  font-style: normal;
+  font-weight: 700;
+  src: url('./fonts/lato-v24-latin_latin-ext-700.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* lato-700italic - latin_latin-ext */
+@font-face {
+  font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+  font-family: 'Lato';
+  font-style: italic;
+  font-weight: 700;
+  src: url('./fonts/lato-v24-latin_latin-ext-700italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
+
+/* caveat-500 - cyrillic_cyrillic-ext_latin_latin-ext */
+@font-face {
+  font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+  font-family: 'Caveat';
+  font-style: normal;
+  font-weight: 500;
+  src: url('./fonts/caveat-v18-cyrillic_cyrillic-ext_latin_latin-ext-500.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+}
 
 :root {
     font-family: var(--font-normal);
@@ -19,19 +62,31 @@ h1, h2, h3, h4, h5, h6 {
     font-family: var(--font-accent);
 }
 .titanic {
-    font-size: 3.815rem
+    font-size: calc(1rem * pow(var(--type-scale), 6));
 }
 h1, .xxxlarge {
     margin-top: 0;
     margin-bottom: 0;
-    font-size: 3.052rem;
-}
-h2, .xxlarge {font-size: 2.441rem;}
-h3, .xlarge {font-size: 1.953rem;}
-h4, .larger {font-size: 1.563rem;}
-h5, .large {font-size: 1.25rem;}
-h6, .normal {font-size: 1rem;}
-small, .small { font-size: 0.8em; }
+    font-size: calc(1rem * pow(var(--type-scale), 5));
+}
+h2, .xxlarge {
+    font-size: calc(1rem * pow(var(--type-scale), 4));
+}
+h3, .xlarge {
+    font-size: calc(1rem * pow(var(--type-scale), 3));
+}
+h4, .larger {
+    font-size: calc(1rem * pow(var(--type-scale), 2));
+}
+h5, .large {
+    font-size: calc(1rem * var(--type-scale));
+}
+h6, .normal {
+    font-size: 1rem;
+}
+small, .small {
+    font-size: calc(1rem * pow(var(--type-scale, -1)));
+}
 
 nav#headerbar {
     background: var(--primary-accent);
@@ -235,3 +290,13 @@ body > a#skip-to-content:focus {
     width: auto; height: auto; clip: auto;
     z-index: 999;
 }
+
+.screen-reader-only:not(:focus):not(:active) {
+  clip: rect(0 0 0 0); 
+  clip-path: inset(50%);
+  height: 1px;
+  overflow: hidden;
+  position: absolute;
+  white-space: nowrap; 
+  width: 1px;
+}
diff --git a/templates/build.rs b/templates/build.rs
index ac77059..5a62855 100644
--- a/templates/build.rs
+++ b/templates/build.rs
@@ -25,14 +25,18 @@ fn main() -> Result<(), std::io::Error> {
     let mut assets = WalkDir::new(assets_path)
         .into_iter();
     while let Some(Ok(entry)) = assets.next() {
+        eprintln!("Processing {}", entry.path().display());
+        let out_path = out_dir.join(entry.path().strip_prefix(assets_path).unwrap());
         if entry.file_type().is_dir() {
-            if let Err(err) = std::fs::create_dir(&out_dir.join(entry.path())) {
+            eprintln!("Creating directory {}", &out_path.display());
+            if let Err(err) = std::fs::create_dir(&out_path) {
                 if err.kind() != std::io::ErrorKind::AlreadyExists {
                     return Err(err)
                 }
             }
         } else {
-            std::fs::copy(entry.path(), &out_dir.join(entry.path().strip_prefix(assets_path).unwrap()))?;
+            eprintln!("Copying {} to {}", entry.path().display(), out_path.display());
+            std::fs::copy(entry.path(), &out_path)?;
         }
     }
 
diff --git a/templates/javascript/src/onboarding.ts b/templates/javascript/src/onboarding.ts
index 14c1185..436671e 100644
--- a/templates/javascript/src/onboarding.ts
+++ b/templates/javascript/src/onboarding.ts
@@ -4,9 +4,9 @@ function switchOnboardingCard(card: string) {
   (Array.from(document.querySelectorAll("form.onboarding > fieldset")) as HTMLElement[])
     .map((node: HTMLElement) => {
       if (node.id == card) {
-        node.style.display = "block";
+        node.classList.remove("inactive")
       } else {
-        node.style.display = "none";
+        node.classList.add("inactive")
       }
     });
 
diff --git a/templates/src/mf2.rs b/templates/src/mf2.rs
index 643db15..787d3ed 100644
--- a/templates/src/mf2.rs
+++ b/templates/src/mf2.rs
@@ -438,7 +438,7 @@ markup::define! {
     }
     WebInteractions<'a>(post: &'a serde_json::Value, from_feed: bool) {
         footer.webinteractions {
-            p[style="display: none", "aria-hidden"="false"] {
+            p."screen-reader-only" {
                 "Webmention counters:"
             }
             ul.counters {
diff --git a/templates/src/onboarding.rs b/templates/src/onboarding.rs
index 6ee90bf..65132b5 100644
--- a/templates/src/onboarding.rs
+++ b/templates/src/onboarding.rs
@@ -1,6 +1,6 @@
 markup::define! {
     OnboardingPage {
-        h1[style="text-align: center"] {
+        h1 #onboarding_greet {
             "Welcome to Kittybox"
         }
         script[type="module", src="/.kittybox/static/onboarding.js"] {}
@@ -73,13 +73,13 @@ markup::define! {
                     "."
                 }
             }
-            ul #progressbar[style="display: none"] {
+            ul.hidden #progressbar {
                 li #intro { "Introduction" }
                 li #hcard { "Your profile" }
                 li #settings { "Your website" }
                 li #firstpost { "Your first post" }
             }
-            fieldset #intro[style="display: none"] {
+            fieldset.inactive #intro {
                 legend { "Introduction" }
                 p {
                     "Kittybox is a CMS that can act as a member of the IndieWeb. "
@@ -94,7 +94,7 @@ markup::define! {
                 }
             }
 
-            fieldset #hcard[style="display: none"] {
+            fieldset.inactive #hcard {
                 legend { "Your profile" }
                 p { "An h-card is an IndieWeb social profile, and we're gonna make you one!" }
                 p { "Thanks to some clever markup, it will be readable by both humans and machines looking at your homepage."}
@@ -156,7 +156,7 @@ markup::define! {
                 }
             }
 
-            fieldset #settings[style="display: none"] {
+            fieldset.inactive #settings {
                 legend { "Your website" }
                 p { "Ok, it's nice to know you more. Tell me about what you'll be writing and how you want to name your blog." }
                 // TODO: site-name, saved to settings
@@ -210,7 +210,7 @@ markup::define! {
                 }
             }
 
-            fieldset #firstpost[style="display: none"] {
+            fieldset.inactive #firstpost {
                 legend { "Your first post" }
                 p { "Maybe you should start writing your first posts now. How about a short note?" }
                 p { "A note is a short-form post (not unlike a tweet - but without the actual character limit) that doesn't bear a title." }
@@ -222,7 +222,7 @@ markup::define! {
                     " here to spice up your note!)"
                 }
 
-                textarea #first_post_content[style="width: 100%; height: 8em", placeholder="Hello! I am really excited about #IndieWeb"] {}
+                textarea #first_post_content[placeholder="Hello! I am really excited about #IndieWeb"] {}
 
                 div.switch_card_buttons {
                     button.switch_card.prev_card[type="button", "data-card"="settings"] { "Previous" }