diff --git a/.github/workflows/docs.yml b/.github/workflows/website.yml similarity index 90% rename from .github/workflows/docs.yml rename to .github/workflows/website.yml index d717c75f8..caa8a0a71 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/website.yml @@ -16,21 +16,21 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout uutils.github.io Repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: uutils/uutils.github.io path: './uutils.github.io' fetch-depth: 0 - name: Checkout Coreutils Repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: uutils/coreutils path: './coreutils' fetch-depth: 0 - name: Checkout Findutils Repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: uutils/findutils path: './findutils' @@ -39,9 +39,9 @@ jobs: - name: Install `rust` toolchain uses: dtolnay/rust-toolchain@stable - - name: Install `libacl` + - name: Install system deps run: | - sudo apt install libacl1-dev + sudo apt install libacl1-dev libselinux1-dev - name: Download tldr archive run: | @@ -64,9 +64,9 @@ jobs: cd findutils cd docs mdbook build - + - name: Run Zola - uses: shalzz/zola-deploy-action@v0.18.0 + uses: shalzz/zola-deploy-action@v0.21.0 env: BUILD_DIR: uutils.github.io BUILD_ONLY: true @@ -83,7 +83,7 @@ jobs: path: ./public - name: Upload artifact for pages - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v4 with: path: ./public @@ -158,6 +158,7 @@ jobs: url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest needs: build + if: (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'schedule' steps: - name: Deploy to GitHub Pages id: deployment diff --git a/.gitignore b/.gitignore index 15ce475e7..d90d7f863 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -/public/ \ No newline at end of file +/public/ +/static/syntax-* diff --git a/README.md b/README.md index 2baf0d1c4..f67b8508e 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,10 @@ This repository generates the user and dev documentations of https://github.com/ ## User documentation It is available on: -https://uutils.github.io/user/ +https://uutils.github.io/coreutils/docs/ Can be generated with: -``` +```bash cargo run --bin uudoc --all-features cd docs mdbook build @@ -20,7 +20,7 @@ It is available on: https://uutils.github.io/dev/coreutils/ Can be generated with: -``` +```bash cargo doc --no-deps --all-features --workspace ``` diff --git a/config.toml b/config.toml index be03294fa..35730ecbb 100644 --- a/config.toml +++ b/config.toml @@ -7,10 +7,13 @@ description = "" default_language = "en" -paginate_by = 10 - -generate_feed = true +generate_feeds = true [markdown] highlight_code = true -highlight_theme = "OneHalfLight" +highlight_theme = "css" + +highlight_themes_css = [ + { theme = "OneHalfDark", filename = "syntax-theme-dark.css" }, + { theme = "OneHalfLight", filename = "syntax-theme-light.css" }, +] diff --git a/content/_index.md b/content/_index.md index f25cb1b4b..d5781f237 100644 --- a/content/_index.md +++ b/content/_index.md @@ -4,21 +4,26 @@ template = "index.html" +++
- -
uutils
+ + + + +
uutils
The uutils project reimplements ubiquitous command line utilities in Rust. Our goal is to modernize the utils, while retaining full compatibility with the existing utilities. +We are planning to replace all essential Linux tools. + # Projects

coreutils

- The commands you use everyday: ls, cp, etc. + The commands you use everyday: ls, cp, etc. Production ready!

diff --git a/content/blog/2024-02-extending.md b/content/blog/2024-02-extending.md deleted file mode 100644 index 74b05dab8..000000000 --- a/content/blog/2024-02-extending.md +++ /dev/null @@ -1,75 +0,0 @@ -+++ -title = "Extending the Coreutils project - Rewriting base tools in Rust " -draft = true -date = 2024-03-26 -authors = ["Sylvestre Ledru", "Terts Diepraam"] -+++ - -Over the last 4 years, we have been working at reimplementing some of the key Linux tools in Rust. We started with the [Coreutils](https://github.com/uutils/coreutils) and [findutils](https://github.com/uutils/findutils). - -As we approach feature parity with the GNU Coreutils implementation, and as its adoption in production environments continues to expand, we have been thinking about what is next. - -Given the overwhelming positive feedback around this initiative, we are going to extend our efforts to rewrite other parts of the modern Linux/Unix/Mac stack in Rust (still with Windows support in mind when relevant). -We also noticed a lot of contributions on these projects coming from a lot of different hackers (475 different contributors on Coreutils!). -With the growing enthusiasm for Rust and the eagerness to learn it, now is the best time to push this project. We think that rewriting in Rust will help with the longer term maintenance of the ecosystem, ensuring it stays robust, safe and welcoming for new generations of contributors. - -For the next projects, we are using the same approach: dropped-in replacement of the GNU C implementation. -For now, we are going to focus on: -* [diffutils](https://github.com/uutils/diffutils) (transferred by Michael Howell) - [Good first issues](https://github.com/uutils/diffutils/labels/good%20first%20issue) - Almost ready -* [procps](https://github.com/uutils/procps) - [Good first issues](https://github.com/uutils/procps/labels/good%20first%20issue) - 5 programs started -* [acl](https://github.com/uutils/acl) - [Good first issues](https://github.com/uutils/acl/labels/good%20first%20issue) - The 3 started -* [util-linux](https://github.com/uutils/util-linux) - [Good first issues](https://github.com/uutils/util-linux/labels/good%20first%20issue) - A couple programs started -* [bsdutils](https://github.com/uutils/bsdutils) - [Good first issues](https://github.com/uutils/bsdutils/labels/good%20first%20issue) - One program started -* [login](https://github.com/uutils/login/) - [Good first issues](https://github.com/uutils/login/labels/good%20first%20issue) - Just the skeleton -* [hostname](https://github.com/uutils/hostname/) - [Good first issues](https://github.com/uutils/hostname/labels/good%20first%20issue) - Almost empty - - -These packages are part of the essential list on Debian & Ubuntu. - - -Sylvestre Ledru, Terts Diepraam and Daniel Hofstetter - -FAQ -### - -How long is it going to take? ------------------------------ - -Some programs like diff, acl or hostname should be completed quickly. -Others will take years to be completed. - -Do you hate the GNU project? ----------------------------- - -Not at all: we often contribute to the upstream implementations when we identify issues, add missing tests, etc. - - -Why the MIT License? --------------------- - -For consistency purposes and not interested by a license debate, we are going to use the MIT license just like the Coreutils. - - -The binaries are too big? -------------------------- - -Does it really matter? Yes, Rust binaries are usually bigger than GNU but we don't think it is a blocker, even for embedded devices. - - -Is it really safer? -------------------- - -While Rust is clearly a better language than C/C++ for security, these programs are often very safe. It isn't a key argument for us for -this rewrite. - -What about performances? ------------------------- - -Although we haven't entered the optimization phase, Rust's modern design inherently facilitates some straightforward performance improvements. diff --git a/content/blog/2025-02-extending.md b/content/blog/2025-02-extending.md new file mode 100644 index 000000000..b1a66784a --- /dev/null +++ b/content/blog/2025-02-extending.md @@ -0,0 +1,90 @@ ++++ +title = "Extending the Coreutils project - Rewriting base tools in Rust" +date = 2025-02-01 +page_template = "post.html" +authors = ["Sylvestre Ledru"] ++++ + +As I [just presented at FOSDEM](https://sylvestre.ledru.info/coreutils-fosdem-2025/), we are moving into the next phase of the uutils project. + +Over the last five years, we have been working on reimplementing some of the key Linux tools in Rust. We started with the [Coreutils](https://github.com/uutils/coreutils) and [findutils](https://github.com/uutils/findutils). + +As we approach feature parity with the GNU Coreutils implementation, and as its adoption in production environments continues to expand, we have been thinking about what is next. + +Given the very positive feedback around this initiative, we are going to extend our efforts to rewrite other parts of the modern Linux/Unix/Mac stack in Rust (still with Windows support in mind when relevant). These efforts will be managed under the [uutils umbrella](https://github.com/uutils/), which will allow us to maintain a cohesive and unified approach across various utilities. + +We also noticed a lot of contributions on these projects coming from a diverse group of hackers (530 different contributors on Coreutils alone!). With the growing enthusiasm for Rust and the eagerness to learn it, now is the best time to push this project forward. Rewriting in Rust will help with the long-term maintenance of the ecosystem, ensuring it stays robust, safe, and welcoming for new generations of contributors. + +### Vision for the Future + +As we expand the scope of the project, we are working on a future where Rust becomes the backbone of essential Linux, Unix, and potentially macOS system tools. Our focus will be on improving security, ensuring long-term maintainability, and optimizing performance for both modern and legacy systems. Through the uutils umbrella, we aim to create a more secure, efficient, and scalable alternative to the traditional tools, replacing software developed in older, less secure programming languages like C. + +This project is also an investment for the future. C is becoming less popular with the next generation of developers. Just like how the Linux kernel continues to evolve and includes Rust, it is our responsibility to upgrade the core utilities of the system to a modern, safer programming language. By doing so, we ensure that the essential tools used in Linux/Unix systems remain relevant, maintainable, and accessible to future contributors. + +### Specific Benefits of Rust + +Rust offers several advantages over C/C++, particularly in terms of memory safety, concurrency, and performance. By eliminating common security issues such as null pointer dereferences and buffer overflows, Rust allows us to build tools that are inherently safer. Its modern compiler tooling also enables us to optimize performance without sacrificing code safety, ensuring that our utilities can handle the demands of modern computing environments while remaining easy to maintain. + +### Challenges and Opportunities + +As with any large-scale reimplementation, there are challenges to overcome. Porting complex utilities from C to Rust requires careful consideration of edge cases and platform-specific behaviors. Additionally, ensuring full compatibility across Linux, Unix, and macOS environments presents unique challenges. However, these challenges also offer opportunities for growth and innovation, allowing us to extend and refine core system utilities for modern needs. Rust's modern design gives us the chance to improve both security and performance while maintaining cross-platform compatibility. + +### Next Steps + +For the next phase of the project, we are adopting the same approach: a drop-in replacement of the C implementations. Here's what's coming next: + +| Name | Description | Status | +|----------------------------------------------------|----------------------------------------------------|-----------------------------| +| [acl](https://github.com/uutils/acl) | Access control list utilities | | +| [bsdutils](https://github.com/uutils/bsdutils) | Basic utilities for BSD compatibility | | +| [coreutils](https://github.com/uutils/coreutils) | Basic utilities for the system | Production level | +| [diffutils](https://github.com/uutils/diffutils) | File comparison utilities | Almost ready | +| [findutils](https://github.com/uutils/findutils) | Utilities for finding files | Getting close to completion | +| [hostname](https://github.com/uutils/hostname) | Utility to show or set system hostname | | +| [login](https://github.com/uutils/login) | User login management utilities | | +| [procps](https://github.com/uutils/procps) | Utilities for monitoring and controlling processes | | +| [util-linux](https://github.com/uutils/util-linux) | Utilities essential for Linux systems | | + +These packages are part of the essential list for Debian and Ubuntu, and we're excited to push their Rust reimplementation further. + +### GSoC 2024 Participation + +In 2024, we had the pleasure of mentoring three students during Google Summer of Code (GSoC): + +1. **Sreehari Prasad** worked on improving the support of Rust CCoreutils. His focus was on making uutils compatible with the GNU coreutils test suite. Sreehari resolved most of the failing tests for the `cp`, `mv`, and `ls` utilities and significantly enhanced compatibility. + +2. **Hanbings** tackled the implementation of key GNU `findutils` utilities like `xargs` and `find` in Rust. His work focused on improving compatibility with the GNU suite while enhancing performance, resulting in major progress on missing features and test code. + +3. **Krysztal Huang** worked on implementing the `procps` suite, which includes utilities like `slabtop`, `top`, `pgrep`, `pidof`, `ps`, `pidwait`, and `snice`. This project involved implementing some of these commands. + +### Call to Action for Contributors + +Contributors who are passionate about system-level programming and Rust are always welcome. Whether you're experienced with GNU utilities or just learning Rust, your contributions will be invaluable to this +project. You can get involved by picking up good-first issues, reviewing code, or even helping us test new features across various platforms. The [uutils GitHub organization](https://github.com/uutils) has all the information you need to get started. +You can also sponsor the project through [GitHub Sponsors](https://github.com/sponsors/uutils). + +### FAQ + +**How long is it going to take?** + +Some programs, like `diff`, `acl`, or `hostname`, could be completed quickly, while others will take years to finish. + +**Do you hate the GNU project?** + +Not at all. We often contribute to the upstream implementations when we identify issues, add missing tests, and so on. + +**Why the MIT License?** + +For consistency purposes. We're not interested in a license debate and will continue to use the MIT license, as we did with Coreutils. + +**The binaries are too big. Does it really matter?** + +Yes, Rust binaries are generally bigger than GNU's, but we don't think it's a blocker, even for embedded devices. + +**Is it really safer?** + +While Rust is better than C/C++ for security, these programs are often already very safe. Security is not the key argument for us in this rewrite even if Rust provides some automatic improvements. + +**What about performance?** + +Although we haven't started optimizing yet, Rust's design facilitates performance improvements naturally. We are confident that, in time, these tools will match or exceed the performance of their GNU counterparts. diff --git a/content/blog/_index.md b/content/blog/_index.md index f784a32f4..e16b5390b 100644 --- a/content/blog/_index.md +++ b/content/blog/_index.md @@ -5,4 +5,4 @@ page_template = "post.html" title = "Blog" +++ -You can subscribe to this blog with this [atom feed](/atom.xml). \ No newline at end of file +You can subscribe to this blog with this [atom feed](/atom.xml). diff --git a/content/gsoc.md b/content/gsoc.md index de386e3d5..77ba7b010 100644 --- a/content/gsoc.md +++ b/content/gsoc.md @@ -65,8 +65,8 @@ However, a bunch of work remains on the color side for a full GNU compat. Other We have 12 remaining failing tests. To get the list of failing tests, run: -``` -$ ./util/remaining-gnu-error.py |grep "/ls/" +```bash +$ ./util/remaining-gnu-error.py | grep "/ls/" ``` - Difficulty: Medium @@ -82,8 +82,8 @@ Most of the features in `cp` have been implemented by now. However, some corner cases needs to be implemented. We have 16 remaining failing tests. To get the list of failing tests, run: -``` -$ ./util/remaining-gnu-error.py |grep "/cp/" +```bash +$ ./util/remaining-gnu-error.py | grep "/cp/" ``` - Difficulty: Medium @@ -99,8 +99,8 @@ Most of the features in `mv` have been implemented by now. However, some corner cases needs to be implemented. We have 10 remaining failing tests. To get the list of failing tests, run: -``` -$ ./util/remaining-gnu-error.py |grep "/mv/" +```bash +$ ./util/remaining-gnu-error.py | grep "/mv/" ``` - Difficulty: Medium diff --git a/static/logo-dark.svg b/static/logo-dark.svg new file mode 100644 index 000000000..dee38a04f --- /dev/null +++ b/static/logo-dark.svg @@ -0,0 +1,61 @@ + diff --git a/static/style.css b/static/style.css index 135b7fb4e..1214b0641 100644 --- a/static/style.css +++ b/static/style.css @@ -1,20 +1,50 @@ :root { + /* Light theme colors (default) */ + + --accent-color: #c04828; + --dark-fg-color: #fff; --light-fg-color: #141414; --light-bg-color: var(--dark-fg-color); --dark-bg-color: var(--light-fg-color); --fg-color: var(--light-fg-color); --bg-color: var(--light-bg-color); - --light-link-color: #c04828; - --dark-link-color: #c04828; - --link-color: var(--light-link-color); + --link-color: var(--accent-color); --light-highlight-bg-color: #ededed; --light-highlight-fg-color: #595959; --dark-highlight-bg-color: #27272a; --dark-highlight-fg-color: #ededed; --highlight-fg-color: var(--light-highlight-fg-color); --highlight-bg-color: var(--light-highlight-bg-color); + --link-text-color: var(--accent-color); + --header-border-color: #ddd; + --post-bg-color: #e5e5e5; --font-face: "Fira Sans", sans-serif; + + --github-icon: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E"); + --github-icon-black: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='000' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E"); +} + +@media (prefers-color-scheme: dark) { + :root { + --fg-color: #e1e1e1; + --bg-color: #222222; + --link-color: var(--accent-color); + --light-highlight-bg-color: #2d2d2d; + --light-highlight-fg-color: #ffffff; + --dark-highlight-bg-color: #27272a; + --dark-highlight-fg-color: #ededed; + --highlight-fg-color: var(--light-highlight-fg-color); + --highlight-bg-color: var(--light-highlight-bg-color); + --link-text-color: var(--accent-color); + --header-border-color: #404040; + --post-bg-color: #2d2d2d; + } +} + +body { + background-color: var(--bg-color); + color: var(--fg-color); } *, @@ -89,7 +119,7 @@ header { justify-items: center; padding: 0.5rem 2rem; width: 100%; - border-bottom: 1px solid #ddd; + border-bottom: 1px solid var(--header-border-color); font-size: 1.2rem; } @@ -111,13 +141,12 @@ header .home svg { } header a { - color: black; + color: var(--fg-color); border-bottom: 2px solid transparent; } header a:hover:not(.home) { - color: black; - border-bottom: 2px solid #c04828; + border-bottom: 2px solid var(--link-text-color); } .navigation-block { @@ -149,13 +178,13 @@ header .icon { #mobile-open-navigation button div { margin: 0.5em 0; width: 2em; - border-bottom: 0.25em solid black; + border-bottom: 0.25em solid var(--fg-color); } header { grid-template-columns: max-content 1fr; } - + .spacer { display: none; } @@ -165,7 +194,7 @@ header .icon { grid-column: auto / span 2; justify-self: left; } - + header:not(.open) .spacer, header:not(.open) .navigation-block { display: none; @@ -273,8 +302,8 @@ ul { /* FOOTER */ footer { align-items: center; - background-color: var(--fg-color); - color: var(--bg-color); + background-color: var(--light-fg-color); + color: var(--light-bg-color); display: flex; flex-grow: 0; flex-shrink: 1; @@ -286,17 +315,23 @@ footer { } .github-icon { - background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E"); + background-image: var(--github-icon); height: 1.25rem; width: 1.25rem; } .github-icon-black { - background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='000' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E"); + background-image: var(--github-icon-black); height: 1em; width: 1em; } +@media (prefers-color-scheme: dark) { + .github-icon-black { + background-image: var(--github-icon); + } +} + .projects { display: flex; flex-direction: column; @@ -325,13 +360,13 @@ footer { margin-bottom: 0; } -.project>span { +.project > span { color: transparent; transition: color 0.3s; } -.project:hover>span { - color: black; +.project:hover > span { + color: var(--fg-color); } .project:hover { @@ -342,6 +377,7 @@ footer { font-size: 3em; font-weight: 900; margin-bottom: 0.5em; + text-transform: capitalize; } @media (min-width: 640px) { @@ -353,21 +389,21 @@ footer { .details { margin-bottom: 1.5em; - color: #333; + color: var(--fg-color); } .post-thingy { display: block; padding: 1em; - color: black; - background: #e5e5e5; + color: var(--fg-color); + background: var(--post-bg-color); border-radius: 0.3em; - border: 0.2em solid #e5e5e5; + border: 0.2em solid var(--post-bg-color); margin-bottom: 0.5em; } .post-thingy:hover { - border-color: #c04828; + border-color: var(--link-text-color); background: transparent; } @@ -382,6 +418,7 @@ blockquote { .links { display: flex; + flex-wrap: wrap; justify-content: stretch; gap: 1em; margin-bottom: 2em; @@ -390,8 +427,14 @@ blockquote { .links > a { padding: 0.2em 1em; - color: #c04828; + color: var(--link-text-color); border: 2px solid #c04828; flex: 1; text-align: center; } + +.links > a:hover { + color: var(--dark-fg-color); + background-color: #c04828; + border-color: #c04828; +} diff --git a/templates/base.html b/templates/base.html index 61e9395ab..c6d86070d 100644 --- a/templates/base.html +++ b/templates/base.html @@ -10,6 +10,8 @@ + + @@ -23,13 +25,13 @@