parent
							
								
									33094f897d
								
							
						
					
					
						commit
						114dc25235
					
				| 
						 | 
					@ -119,6 +119,28 @@ ul {
 | 
				
			||||||
a {
 | 
					a {
 | 
				
			||||||
    color: unset;
 | 
					    color: unset;
 | 
				
			||||||
    text-decoration: unset;
 | 
					    text-decoration: unset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    &:not(:has(time)):is([href^="http"], [href^="mailto"]) {
 | 
				
			||||||
 | 
					        padding-inline-end: 0.9em;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        &::after {
 | 
				
			||||||
 | 
					            transition: all 0.3s ease;
 | 
				
			||||||
 | 
					            position: absolute;
 | 
				
			||||||
 | 
					            content: '';
 | 
				
			||||||
 | 
					            display: inline-block;
 | 
				
			||||||
 | 
					            width: 1em;
 | 
				
			||||||
 | 
					            height: 1em;
 | 
				
			||||||
 | 
					            margin-inline-start: -0.05em;
 | 
				
			||||||
 | 
					            background-size: 100%;
 | 
				
			||||||
 | 
					            transform: scale(0.8);
 | 
				
			||||||
 | 
					            background-image: url("/assets/images/external.svg");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        &:is(:hover, :active, :focus-visible)::after {
 | 
				
			||||||
 | 
					            filter: invert(100%);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
form {
 | 
					form {
 | 
				
			||||||
| 
						 | 
					@ -135,7 +157,7 @@ input {
 | 
				
			||||||
    margin: 0;
 | 
					    margin: 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input:is([type="text"], [type="password"], [type="search"]) {
 | 
					input:is([type="text"], [type="password"], [type="search"], [type="email"], ) {
 | 
				
			||||||
    padding: 0.5ch 1ch;
 | 
					    padding: 0.5ch 1ch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    &:focus,
 | 
					    &:focus,
 | 
				
			||||||
| 
						 | 
					@ -347,7 +369,60 @@ header {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					footer {
 | 
				
			||||||
 | 
					    border-block-start: var(--border);
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    min-block-size: calc(var(--header-size) * 2.5);
 | 
				
			||||||
 | 
					    padding: 1rem;
 | 
				
			||||||
 | 
					    gap: 2rem;
 | 
				
			||||||
 | 
					    flex-direction: column;
 | 
				
			||||||
 | 
					    align-items: start;
 | 
				
			||||||
 | 
					    justify-content: start;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    &>* {
 | 
				
			||||||
 | 
					        max-inline-size: 100%;
 | 
				
			||||||
 | 
					        display: flex;
 | 
				
			||||||
 | 
					        flex-direction: column;
 | 
				
			||||||
 | 
					        justify-content: start;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    line-height: 1.6em;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    form {
 | 
				
			||||||
 | 
					        display: flex;
 | 
				
			||||||
 | 
					        flex-direction: column;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        & div {
 | 
				
			||||||
 | 
					            display: flex;
 | 
				
			||||||
 | 
					            max-inline-size: 100%;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            &>* {
 | 
				
			||||||
 | 
					                min-inline-size: 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            input[type="submit"] {
 | 
				
			||||||
 | 
					                min-inline-size: min-content;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    h1,
 | 
				
			||||||
 | 
					    ul {
 | 
				
			||||||
 | 
					        margin-block: 0 1rem;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    p,
 | 
				
			||||||
 | 
					    li,
 | 
				
			||||||
 | 
					    input {
 | 
				
			||||||
 | 
					        margin-block: 0.3rem;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
main {
 | 
					main {
 | 
				
			||||||
 | 
					    min-block-size: 100svb;
 | 
				
			||||||
    margin-block: var(--default-padding) 40svb;
 | 
					    margin-block: var(--default-padding) 40svb;
 | 
				
			||||||
    margin-inline: auto;
 | 
					    margin-inline: auto;
 | 
				
			||||||
    max-inline-size: min(60ch, 80%);
 | 
					    max-inline-size: min(60ch, 80%);
 | 
				
			||||||
| 
						 | 
					@ -422,6 +497,15 @@ main {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    footer {
 | 
				
			||||||
 | 
					        flex-direction: row;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        &>* {
 | 
				
			||||||
 | 
					            max-inline-size: 40ch;
 | 
				
			||||||
 | 
					            min-inline-size: 30ch;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    main {
 | 
					    main {
 | 
				
			||||||
        margin-block: var(--default-padding);
 | 
					        margin-block: var(--default-padding);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
 | 
				
			||||||
 | 
					<svg fill="#000000" width="800px" height="800px" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><path d="M 5 5 L 5 27 L 27 27 L 27 5 Z M 7 7 L 25 7 L 25 25 L 7 25 Z M 13 10 L 13 12 L 18.5625 12 L 9.28125 21.28125 L 10.71875 22.71875 L 20 13.4375 L 20 19 L 22 19 L 22 10 Z"/></svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 407 B  | 
| 
						 | 
					@ -72,6 +72,12 @@ where
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    Ok(())
 | 
					                    Ok(())
 | 
				
			||||||
                }),
 | 
					                }),
 | 
				
			||||||
 | 
					                element!("site-footer", |site_footer| {
 | 
				
			||||||
 | 
					                    if settings.site_footer {
 | 
				
			||||||
 | 
					                        site_footer.replace(template!("site-footer"), ContentType::Html);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    Ok(())
 | 
				
			||||||
 | 
					                }),
 | 
				
			||||||
                element!("br", |br| {
 | 
					                element!("br", |br| {
 | 
				
			||||||
                    br.remove();
 | 
					                    br.remove();
 | 
				
			||||||
                    Ok(())
 | 
					                    Ok(())
 | 
				
			||||||
| 
						 | 
					@ -187,7 +193,7 @@ where
 | 
				
			||||||
    .unwrap_or_default();
 | 
					    .unwrap_or_default();
 | 
				
			||||||
    make_page(
 | 
					    make_page(
 | 
				
			||||||
        html,
 | 
					        html,
 | 
				
			||||||
        PageSettings::new("Editor", Some(vec!["/assets/css/editor.css"]), true),
 | 
					        PageSettings::new("Editor", Some(vec!["/assets/css/editor.css"]), true, false),
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -229,7 +235,7 @@ pub(crate) fn login_status(next: &str, success: bool) -> String {
 | 
				
			||||||
    .unwrap_or_default();
 | 
					    .unwrap_or_default();
 | 
				
			||||||
    make_page(
 | 
					    make_page(
 | 
				
			||||||
        html,
 | 
					        html,
 | 
				
			||||||
        PageSettings::new("Login", Some(vec!["/assets/css/login.css"]), false),
 | 
					        PageSettings::new("Login", Some(vec!["/assets/css/login.css"]), false, false),
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -237,7 +243,7 @@ pub(crate) async fn admin_page(session_id: i64, db: &BlogDb) -> String {
 | 
				
			||||||
    let content = admin_widgets(template!("admin"), session_id, db).await;
 | 
					    let content = admin_widgets(template!("admin"), session_id, db).await;
 | 
				
			||||||
    make_page(
 | 
					    make_page(
 | 
				
			||||||
        &content,
 | 
					        &content,
 | 
				
			||||||
        PageSettings::new("Admin", Some(vec!["/assets/css/admin.css"]), true),
 | 
					        PageSettings::new("Admin", Some(vec!["/assets/css/admin.css"]), true, false),
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -558,7 +564,7 @@ pub(crate) async fn blog_roll(db: &BlogDb) -> String {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    make_page(
 | 
					    make_page(
 | 
				
			||||||
        blog_roll_html,
 | 
					        blog_roll_html,
 | 
				
			||||||
        PageSettings::new("Blog", Some(vec!["/assets/css/blog.css"]), true),
 | 
					        PageSettings::new("Blog", Some(vec!["/assets/css/blog.css"]), true, true),
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -653,6 +659,7 @@ pub(crate) async fn search_page(
 | 
				
			||||||
            ["Results for “", &query, "”"].concat(),
 | 
					            ["Results for “", &query, "”"].concat(),
 | 
				
			||||||
            Some(vec!["/assets/css/blog.css"]),
 | 
					            Some(vec!["/assets/css/blog.css"]),
 | 
				
			||||||
            true,
 | 
					            true,
 | 
				
			||||||
 | 
					            true,
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -694,6 +701,7 @@ pub(crate) struct PageSettings {
 | 
				
			||||||
    title: String,
 | 
					    title: String,
 | 
				
			||||||
    stylesheets: Option<Vec<String>>,
 | 
					    stylesheets: Option<Vec<String>>,
 | 
				
			||||||
    site_header: bool,
 | 
					    site_header: bool,
 | 
				
			||||||
 | 
					    site_footer: bool,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl PageSettings {
 | 
					impl PageSettings {
 | 
				
			||||||
| 
						 | 
					@ -705,9 +713,15 @@ impl PageSettings {
 | 
				
			||||||
            title: title.to_string(),
 | 
					            title: title.to_string(),
 | 
				
			||||||
            stylesheets: None,
 | 
					            stylesheets: None,
 | 
				
			||||||
            site_header: true,
 | 
					            site_header: true,
 | 
				
			||||||
 | 
					            site_footer: true,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    pub(crate) fn new<S, T>(title: S, stylesheets: Option<Vec<T>>, site_header: bool) -> Self
 | 
					    pub(crate) fn new<S, T>(
 | 
				
			||||||
 | 
					        title: S,
 | 
				
			||||||
 | 
					        stylesheets: Option<Vec<T>>,
 | 
				
			||||||
 | 
					        site_header: bool,
 | 
				
			||||||
 | 
					        site_footer: bool,
 | 
				
			||||||
 | 
					    ) -> Self
 | 
				
			||||||
    where
 | 
					    where
 | 
				
			||||||
        S: ToString,
 | 
					        S: ToString,
 | 
				
			||||||
        T: ToString,
 | 
					        T: ToString,
 | 
				
			||||||
| 
						 | 
					@ -718,6 +732,7 @@ impl PageSettings {
 | 
				
			||||||
            title: title.to_string(),
 | 
					            title: title.to_string(),
 | 
				
			||||||
            stylesheets,
 | 
					            stylesheets,
 | 
				
			||||||
            site_header,
 | 
					            site_header,
 | 
				
			||||||
 | 
					            site_footer,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -754,6 +769,12 @@ where
 | 
				
			||||||
    .unwrap_or_default()
 | 
					    .unwrap_or_default()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// fn footer<S>(input: S) -> String
 | 
				
			||||||
 | 
					// where
 | 
				
			||||||
 | 
					//     S: AsRef<str>,
 | 
				
			||||||
 | 
					// {
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub(crate) fn sanitize<S: AsRef<str>>(input: S) -> String {
 | 
					pub(crate) fn sanitize<S: AsRef<str>>(input: S) -> String {
 | 
				
			||||||
    rewrite_str(
 | 
					    rewrite_str(
 | 
				
			||||||
        input.as_ref(),
 | 
					        input.as_ref(),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,6 +11,7 @@
 | 
				
			||||||
    <site-header></site-header>
 | 
					    <site-header></site-header>
 | 
				
			||||||
    <main>
 | 
					    <main>
 | 
				
			||||||
    </main>
 | 
					    </main>
 | 
				
			||||||
 | 
					    <site-footer></site-footer>
 | 
				
			||||||
</body>
 | 
					</body>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</html>
 | 
					</html>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,53 @@
 | 
				
			||||||
 | 
					<footer>
 | 
				
			||||||
 | 
					    <div>
 | 
				
			||||||
 | 
					        <h1>keep in touch</h1>
 | 
				
			||||||
 | 
					        <div>
 | 
				
			||||||
 | 
					            <form action="https://buttondown.com/api/emails/embed-subscribe/eviewrites" method="post"
 | 
				
			||||||
 | 
					                target="popupwindow" onsubmit="window.open('https://buttondown.com/eviewrites', 'popupwindow')"
 | 
				
			||||||
 | 
					                class="embeddable-buttondown-form">
 | 
				
			||||||
 | 
					                <label for="bd-email">
 | 
				
			||||||
 | 
					                    <p>Subscribe to my newsletter for updates <3</p>
 | 
				
			||||||
 | 
					                </label>
 | 
				
			||||||
 | 
					                <div>
 | 
				
			||||||
 | 
					                    <input type="email" name="email" id="bd-email" required />
 | 
				
			||||||
 | 
					                    <input type="submit" value="Subscribe" style="border-inline-start: none;" />
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </form>
 | 
				
			||||||
 | 
					            <p>Or subscribe to my <a class="animated-link-underline" href="/feed.xml">RSS feed</a>! RSS rules, you can
 | 
				
			||||||
 | 
					                learn more
 | 
				
			||||||
 | 
					                about
 | 
				
			||||||
 | 
					                it <a href="https://guides.library.yale.edu/keepingup/basics" class="animated-link-underline"
 | 
				
			||||||
 | 
					                    target="_blank" rel="noreferrer">here</a>.</p>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div>
 | 
				
			||||||
 | 
					        <h1>credits</h1>
 | 
				
			||||||
 | 
					        <div>
 | 
				
			||||||
 | 
					            <p><a href="https://augustkline.com" class="animated-link-underline" target="_blank" rel="noreferrer">august
 | 
				
			||||||
 | 
					                    kline</a>
 | 
				
			||||||
 | 
					                made this website. she is the coolest in the whole world.</p>
 | 
				
			||||||
 | 
					            <p><a href="https://www.redaction.us/" class="animated-link-underline" target="_blank"
 | 
				
			||||||
 | 
					                    rel="noreferrer">redaction</a> and <a href="https://www.brailleinstitute.org/freefont/"
 | 
				
			||||||
 | 
					                    class="animated-link-underline" target="_blank" rel="noreferrer">atkinson hyperlegible</a> are used
 | 
				
			||||||
 | 
					                as display and text typefaces,
 | 
				
			||||||
 | 
					                respectively.</p>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div>
 | 
				
			||||||
 | 
					        <h1>elsewhere</h1>
 | 
				
			||||||
 | 
					        <nav>
 | 
				
			||||||
 | 
					            <ul>
 | 
				
			||||||
 | 
					                <li>
 | 
				
			||||||
 | 
					                    <ul>
 | 
				
			||||||
 | 
					                        <li>
 | 
				
			||||||
 | 
					                            <a href="https://www.instagram.com/evie.evergreen.docx/" class="animated-link">insta</a>
 | 
				
			||||||
 | 
					                        </li>
 | 
				
			||||||
 | 
					                        <li>
 | 
				
			||||||
 | 
					                            <a href="mailto:evieippolito@duck.com" class="animated-link">email</a>
 | 
				
			||||||
 | 
					                        </li>
 | 
				
			||||||
 | 
					                    </ul>
 | 
				
			||||||
 | 
					                </li>
 | 
				
			||||||
 | 
					            </ul>
 | 
				
			||||||
 | 
					        </nav>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</footer>
 | 
				
			||||||
		Loading…
	
		Reference in New Issue