From 58a0d92820c6bd4a31887e7f7309f1147f75595f Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Fri, 2 May 2025 22:27:45 +0000 Subject: [PATCH] Update some docs. Remove legacy docs CoC (the new one is in the root). Remove legacy assets. (fixes #34) Signed-off-by: Jason Volk --- CONTRIBUTING.md | 37 +- docs/README.md | 1 + docs/SUMMARY.md | 2 +- docs/appservices.md | 10 +- docs/assets/conduwuit_logo.svg | 36 -- docs/assets/gay dog anarchists.png | Bin 11533 -> 0 bytes docs/conduwuit_coc.md | 93 ----- docs/configuration.md | 26 +- docs/configuration/examples.md | 6 +- docs/deploying.md | 2 +- docs/troubleshooting.md | 38 +- theme/css/chrome.css | 608 ----------------------------- theme/css/general.css | 234 ----------- theme/css/variables.css | 279 ------------- theme/favicon.png | Bin 29856 -> 0 bytes 15 files changed, 44 insertions(+), 1328 deletions(-) create mode 120000 docs/README.md delete mode 100644 docs/assets/conduwuit_logo.svg delete mode 100644 docs/assets/gay dog anarchists.png delete mode 100644 docs/conduwuit_coc.md delete mode 100644 theme/css/chrome.css delete mode 100644 theme/css/general.css delete mode 100644 theme/css/variables.css delete mode 100644 theme/favicon.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 13714c91..838d68ad 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,40 +23,7 @@ suggestion, allow the lint and mention that in a comment. ### Running CI tests locally -conduwuit's CI for tests, linting, formatting, audit, etc use -[`engage`][engage]. engage can be installed from nixpkgs or `cargo install -engage`. conduwuit's Nix flake devshell has the nixpkgs engage with `direnv`. -Use `engage --help` for more usage details. - -To test, format, lint, etc that CI would do, install engage, allow the `.envrc` -file using `direnv allow`, and run `engage`. - -All of the tasks are defined at the [engage.toml][engage.toml] file. You can -view all of them neatly by running `engage list` - -If you would like to run only a specific engage task group, use `just`: - -- `engage just ` -- Example: `engage just lints` - -If you would like to run a specific engage task in a specific group, use `just - [TASK]`: `engage just lints cargo-fmt` - -The following binaries are used in [`engage.toml`][engage.toml]: - -- [`engage`][engage] -- `nix` -- [`direnv`][direnv] -- `rustc` -- `cargo` -- `cargo-fmt` -- `rustdoc` -- `cargo-clippy` -- [`cargo-audit`][cargo-audit] -- [`cargo-deb`][cargo-deb] -- [`lychee`][lychee] -- [`markdownlint-cli`][markdownlint-cli] -- `dpkg` +TODO: docker bake matrix ### Matrix tests @@ -148,8 +115,6 @@ policy. [issues]: https://github.com/matrix-construct/tuwunel/issues [tuwunel-chat]: https://matrix.to/#/#tuwunel:tuwunel.chat [complement]: https://github.com/matrix-org/complement/ -[engage.toml]: https://github.com/matrix-construct/tuwunel/blob/main/engage.toml -[engage]: https://charles.page.computer.surgery/engage/ [sytest]: https://github.com/matrix-org/sytest/ [cargo-deb]: https://github.com/kornelski/cargo-deb [lychee]: https://github.com/lycheeverse/lychee diff --git a/docs/README.md b/docs/README.md new file mode 120000 index 00000000..0fbb5a86 --- /dev/null +++ b/docs/README.md @@ -0,0 +1 @@ +SUMMARY.md \ No newline at end of file diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index ad0f8135..1c4a5e34 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -19,4 +19,4 @@ - [Contributing](contributing.md) - [Testing](development/testing.md) - [Hot Reloading ("Live" Development)](development/hot_reload.md) -- [conduwuit Community Code of Conduct](conduwuit_coc.md) +- [Tuwunel Community Code of Conduct](../CODE_OF_CONDUCT.md) diff --git a/docs/appservices.md b/docs/appservices.md index 28ea9717..52097cf4 100644 --- a/docs/appservices.md +++ b/docs/appservices.md @@ -3,8 +3,8 @@ ## Getting help If you run into any problems while setting up an Appservice: ask us in -[#conduwuit:puppygock.gay](https://matrix.to/#/#conduwuit:puppygock.gay) or -[open an issue on GitHub](https://github.com/girlbossceo/conduwuit/issues/new). +[#tuwunel:tuwunel.chat](https://matrix.to/#/#tuwunel:tuwunel.chat) or +[open an issue on GitHub](https://github.com/matrix-construct/tuwunel/issues/new). ## Set up the appservice - general instructions @@ -14,7 +14,7 @@ later starting it. At some point the appservice guide should ask you to add a registration yaml file to the homeserver. In Synapse you would do this by adding the path to the -homeserver.yaml, but in conduwuit you can do this from within Matrix: +homeserver.yaml, but in tuwunel you can do this from within Matrix: First, go into the `#admins` room of your homeserver. The first person that registered on the homeserver automatically joins it. Then send a message into @@ -37,9 +37,9 @@ You can confirm it worked by sending a message like this: The server bot should answer with `Appservices (1): your-bridge` -Then you are done. conduwuit will send messages to the appservices and the +Then you are done. Tuwunel will send messages to the appservices and the appservice can send requests to the homeserver. You don't need to restart -conduwuit, but if it doesn't work, restarting while the appservice is running +tuwunel, but if it doesn't work, restarting while the appservice is running could help. ## Appservice-specific instructions diff --git a/docs/assets/conduwuit_logo.svg b/docs/assets/conduwuit_logo.svg deleted file mode 100644 index 9be5b453..00000000 --- a/docs/assets/conduwuit_logo.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - diff --git a/docs/assets/gay dog anarchists.png b/docs/assets/gay dog anarchists.png deleted file mode 100644 index 871cf302a8f27d6ed02c983241c7c5ca6029ce99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11533 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 ``` @@ -52,13 +52,13 @@ This commandline argument can be paired with the `--option` flag. All of the settings that are found in the config file can be specified by using environment variables. The environment variable names should be all caps and -prefixed with `CONDUWUIT_`. +prefixed with `TUWUNEL_`. For example, if the setting you are changing is `max_request_size`, then the -environment variable to set is `CONDUWUIT_MAX_REQUEST_SIZE`. +environment variable to set is `TUWUNEL_MAX_REQUEST_SIZE`. To modify config options not in the `[global]` context such as -`[global.well_known]`, use the `__` suffix split: `CONDUWUIT_WELL_KNOWN__SERVER` +`[global.well_known]`, use the `__` suffix split: `TUWUNEL_WELL_KNOWN__SERVER` -Conduit's environment variables are supported for backwards compatibility (e.g. -`CONDUIT_SERVER_NAME`). +Conduit and conduwuit's environment variables are supported for backwards +compatibility (e.g. `CONDUIT_SERVER_NAME` or `CONDUWUIT_SERVER_NAME`). diff --git a/docs/configuration/examples.md b/docs/configuration/examples.md index 54aa8bd7..53679fbb 100644 --- a/docs/configuration/examples.md +++ b/docs/configuration/examples.md @@ -4,7 +4,7 @@ Example configuration ```toml -{{#include ../../conduwuit-example.toml}} +{{#include ../../tuwunel-example.toml}} ``` @@ -15,7 +15,7 @@ Debian systemd unit file ``` -{{#include ../../debian/conduwuit.service}} +{{#include ../../debian/tuwunel.service}} ``` @@ -26,7 +26,7 @@ Arch Linux systemd unit file ``` -{{#include ../../arch/conduwuit.service}} +{{#include ../../arch/tuwunel.service}} ``` diff --git a/docs/deploying.md b/docs/deploying.md index 86277aba..b58c9e6b 100644 --- a/docs/deploying.md +++ b/docs/deploying.md @@ -1,3 +1,3 @@ # Deploying -This chapter describes various ways to deploy conduwuit. +This chapter describes various ways to deploy Tuwunel. diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index d25c9762..00035528 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -1,9 +1,9 @@ -# Troubleshooting conduwuit +# Troubleshooting Tuwunel > ## Docker users ⚠️ > > Docker is extremely UX unfriendly. Because of this, a ton of issues or support -> is actually Docker support, not conduwuit support. We also cannot document the +> is actually Docker support, not tuwunel support. We also cannot document the > ever-growing list of Docker issues here. > > If you intend on asking for support and you are using Docker, **PLEASE** @@ -13,14 +13,14 @@ > If there are things like Compose file issues or Dockerhub image issues, those > can still be mentioned as long as they're something we can fix. -## conduwuit and Matrix issues +## Tuwunel and Matrix issues #### Lost access to admin room You can reinvite yourself to the admin room through the following methods: -- Use the `--execute "users make_user_admin "` conduwuit binary +- Use the `--execute "users make_user_admin "` Tuwunel binary argument once to invite yourslf to the admin room on startup -- Use the conduwuit console/CLI to run the `users make_user_admin` command +- Use the Tuwunel console/CLI to run the `users make_user_admin` command - Or specify the `emergency_password` config option to allow you to temporarily log into the server account (`@conduit`) from a web client @@ -29,12 +29,12 @@ log into the server account (`@conduit`) from a web client #### Potential DNS issues when using Docker Docker has issues with its default DNS setup that may cause DNS to not be -properly functional when running conduwuit, resulting in federation issues. The +properly functional when running Tuwunel, resulting in federation issues. The symptoms of this have shown in excessively long room joins (30+ minutes) from very long DNS timeouts, log entries of "mismatching responding nameservers", and/or partial or non-functional inbound/outbound federation. -This is **not** a conduwuit issue, and is purely a Docker issue. It is not +This is **not** a Tuwunel issue, and is purely a Docker issue. It is not sustainable for heavy DNS activity which is normal for Matrix federation. The workarounds for this are: - Use DNS over TCP via the config option `query_over_tcp_only = true` @@ -64,7 +64,7 @@ very computationally expensive, and is extremely susceptible to denial of service, especially on Matrix. Many servers also strangely have broken DNSSEC setups and will result in non-functional federation. -conduwuit cannot provide a "works-for-everyone" Unbound DNS setup guide, but +Tuwunel cannot provide a "works-for-everyone" Unbound DNS setup guide, but the [official Unbound tuning guide][unbound-tuning] and the [Unbound Arch Linux wiki page][unbound-arch] may be of interest. Disabling DNSSEC on Unbound is commenting out trust-anchors config options and removing the `validator` module. @@ -75,9 +75,9 @@ high load, and we have identified its DNS caching to not be very effective. dnsmasq can possibly work, but it does **not** support TCP fallback which can be problematic when receiving large DNS responses such as from large SRV records. If you still want to use dnsmasq, make sure you **disable** `dns_tcp_fallback` -in conduwuit config. +in Tuwunel config. -Raising `dns_cache_entries` in conduwuit config from the default can also assist +Raising `dns_cache_entries` in Tuwunel config from the default can also assist in DNS caching, but a full-fledged external caching resolver is better and more reliable. @@ -97,7 +97,7 @@ If your database is corrupted *and* is failing to start (e.g. checksum mismatch), it may be recoverable but careful steps must be taken, and there is no guarantee it may be recoverable. -The first thing that can be done is launching conduwuit with the +The first thing that can be done is launching Tuwunel with the `rocksdb_repair` config option set to true. This will tell RocksDB to attempt to repair itself at launch. If this does not work, disable the option and continue reading. @@ -109,7 +109,7 @@ RocksDB has the following recovery modes: - `PointInTime` - `SkipAnyCorruptedRecord` -By default, conduwuit uses `TolerateCorruptedTailRecords` as generally these may +By default, Tuwunel uses `TolerateCorruptedTailRecords` as generally these may be due to bad federation and we can re-fetch the correct data over federation. The RocksDB default is `PointInTime` which will attempt to restore a "snapshot" of the data when it was last known to be good. This data can be either a few @@ -126,12 +126,12 @@ if `PointInTime` does not work as a last ditch effort. With this in mind: -- First start conduwuit with the `PointInTime` recovery method. See the [example +- First start Tuwunel with the `PointInTime` recovery method. See the [example config](configuration/examples.md) for how to do this using `rocksdb_recovery_mode` - If your database successfully opens, clients are recommended to clear their client cache to account for the rollback -- Leave your conduwuit running in `PointInTime` for at least 30-60 minutes so as +- Leave your Tuwunel running in `PointInTime` for at least 30-60 minutes so as much possible corruption is restored - If all goes will, you should be able to restore back to using `TolerateCorruptedTailRecords` and you have successfully recovered your database @@ -144,14 +144,14 @@ Various debug commands can be found in `!admin debug`. #### Debug/Trace log level -conduwuit builds without debug or trace log levels at compile time by default +Tuwunel builds without debug or trace log levels at compile time by default for substantial performance gains in CPU usage and improved compile times. If you need to access debug/trace log levels, you will need to build without the `release_max_log_level` feature or use our provided static debug binaries. #### Changing log level dynamically -conduwuit supports changing the tracing log environment filter on-the-fly using +Tuwunel supports changing the tracing log environment filter on-the-fly using the admin command `!admin debug change-log-level `. This accepts a string **without quotes** the same format as the `log` config option. @@ -168,7 +168,7 @@ load, simply pass the `--reset` flag. #### Pinging servers -conduwuit can ping other servers using `!admin debug ping `. This takes +Tuwunel can ping other servers using `!admin debug ping `. This takes a server name and goes through the server discovery process and queries `/_matrix/federation/v1/version`. Errors are outputted. @@ -180,12 +180,12 @@ bandwidth and computationally. #### Allocator memory stats When using jemalloc with jemallocator's `stats` feature (`--enable-stats`), you -can see conduwuit's high-level allocator stats by using +can see Tuwunel's high-level allocator stats by using `!admin server memory-usage` at the bottom. If you are a developer, you can also view the raw jemalloc statistics with `!admin debug memory-stats`. Please note that this output is extremely large -which may only be visible in the conduwuit console CLI due to PDU size limits, +which may only be visible in the Tuwunel console CLI due to PDU size limits, and is not easy for non-developers to understand. [unbound-tuning]: https://unbound.docs.nlnetlabs.nl/en/latest/topics/core/performance.html diff --git a/theme/css/chrome.css b/theme/css/chrome.css deleted file mode 100644 index 52b35c2c..00000000 --- a/theme/css/chrome.css +++ /dev/null @@ -1,608 +0,0 @@ -/* CSS for UI elements (a.k.a. chrome) */ - -@import 'variables.css'; - -html { - scrollbar-color: var(--scrollbar) var(--bg); -} -#searchresults a, -.content a:link, -a:visited, -a > .hljs { - color: var(--links); -} - -/* - body-container is necessary because mobile browsers don't seem to like - overflow-x on the body tag when there is a tag. -*/ -#body-container { - /* - This is used when the sidebar pushes the body content off the side of - the screen on small screens. Without it, dragging on mobile Safari - will want to reposition the viewport in a weird way. - */ - overflow-x: clip; -} - -/* Menu Bar */ - -#menu-bar, -#menu-bar-hover-placeholder { - z-index: 101; - margin: auto calc(0px - var(--page-padding)); -} -#menu-bar { - position: relative; - display: flex; - flex-wrap: wrap; - background-color: var(--bg); - border-block-end-color: var(--bg); - border-block-end-width: 1px; - border-block-end-style: solid; -} -#menu-bar.sticky, -.js #menu-bar-hover-placeholder:hover + #menu-bar, -.js #menu-bar:hover, -.js.sidebar-visible #menu-bar { - position: -webkit-sticky; - position: sticky; - top: 0 !important; -} -#menu-bar-hover-placeholder { - position: sticky; - position: -webkit-sticky; - top: 0; - height: var(--menu-bar-height); -} -#menu-bar.bordered { - border-block-end-color: var(--table-border-color); -} -#menu-bar i, #menu-bar .icon-button { - position: relative; - padding: 0 8px; - z-index: 10; - line-height: var(--menu-bar-height); - cursor: pointer; - transition: color 0.5s; -} -@media only screen and (max-width: 420px) { - #menu-bar i, #menu-bar .icon-button { - padding: 0 5px; - } -} - -.icon-button { - border: none; - background: none; - padding: 0; - color: inherit; -} -.icon-button i { - margin: 0; -} - -.right-buttons { - margin: 0 15px; -} -.right-buttons a { - text-decoration: none; -} - -.left-buttons { - display: flex; - margin: 0 5px; -} -.no-js .left-buttons button { - display: none; -} - -.menu-title { - display: inline-block; - font-weight: 400; - font-size: 2.4rem; - line-height: var(--menu-bar-height); - text-align: center; - margin: 0; - flex: 1; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - color: #bb7fb2; -} -.js .menu-title { - cursor: pointer; -} - -.menu-bar, -.menu-bar:visited, -.nav-chapters, -.nav-chapters:visited, -.mobile-nav-chapters, -.mobile-nav-chapters:visited, -.menu-bar .icon-button, -.menu-bar a i { - color: var(--icons); -} - -.menu-bar i:hover, -.menu-bar .icon-button:hover, -.nav-chapters:hover, -.mobile-nav-chapters i:hover { - color: var(--icons-hover); -} - -/* Nav Icons */ - -.nav-chapters { - font-size: 2.5em; - text-align: center; - text-decoration: none; - - position: fixed; - top: 0; - bottom: 0; - margin: 0; - max-width: 150px; - min-width: 90px; - - display: flex; - justify-content: center; - align-content: center; - flex-direction: column; - - transition: color 0.5s, background-color 0.5s; -} - -.nav-chapters:hover { - text-decoration: none; - background-color: var(--theme-hover); - transition: background-color 0.15s, color 0.15s; -} - -.nav-wrapper { - margin-block-start: 50px; - display: none; -} - -.mobile-nav-chapters { - font-size: 2.5em; - text-align: center; - text-decoration: none; - width: 90px; - border-radius: 5px; - background-color: var(--sidebar-bg); -} - -/* Only Firefox supports flow-relative values */ -.previous { float: left; } -[dir=rtl] .previous { float: right; } - -/* Only Firefox supports flow-relative values */ -.next { - float: right; - right: var(--page-padding); -} -[dir=rtl] .next { - float: left; - right: unset; - left: var(--page-padding); -} - -/* Use the correct buttons for RTL layouts*/ -[dir=rtl] .previous i.fa-angle-left:before {content:"\f105";} -[dir=rtl] .next i.fa-angle-right:before { content:"\f104"; } - -@media only screen and (max-width: 1080px) { - .nav-wide-wrapper { display: none; } - .nav-wrapper { display: block; } -} - -/* sidebar-visible */ -@media only screen and (max-width: 1380px) { - #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wide-wrapper { display: none; } - #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wrapper { display: block; } -} - -/* Inline code */ - -:not(pre) > .hljs { - display: inline; - padding: 0.1em 0.3em; - border-radius: 3px; -} - -:not(pre):not(a) > .hljs { - color: var(--inline-code-color); - overflow-x: initial; -} - -a:hover > .hljs { - text-decoration: underline; -} - -pre { - position: relative; -} -pre > .buttons { - position: absolute; - z-index: 100; - right: 0px; - top: 2px; - margin: 0px; - padding: 2px 0px; - - color: var(--sidebar-fg); - cursor: pointer; - visibility: hidden; - opacity: 0; - transition: visibility 0.1s linear, opacity 0.1s linear; -} -pre:hover > .buttons { - visibility: visible; - opacity: 1 -} -pre > .buttons :hover { - color: var(--sidebar-active); - border-color: var(--icons-hover); - background-color: var(--theme-hover); -} -pre > .buttons i { - margin-inline-start: 8px; -} -pre > .buttons button { - cursor: inherit; - margin: 0px 5px; - padding: 3px 5px; - font-size: 14px; - - border-style: solid; - border-width: 1px; - border-radius: 4px; - border-color: var(--icons); - background-color: var(--theme-popup-bg); - transition: 100ms; - transition-property: color,border-color,background-color; - color: var(--icons); -} -@media (pointer: coarse) { - pre > .buttons button { - /* On mobile, make it easier to tap buttons. */ - padding: 0.3rem 1rem; - } - - .sidebar-resize-indicator { - /* Hide resize indicator on devices with limited accuracy */ - display: none; - } -} -pre > code { - display: block; - padding: 1rem; -} - -/* FIXME: ACE editors overlap their buttons because ACE does absolute - positioning within the code block which breaks padding. The only solution I - can think of is to move the padding to the outer pre tag (or insert a div - wrapper), but that would require fixing a whole bunch of CSS rules. -*/ -.hljs.ace_editor { - padding: 0rem 0rem; -} - -pre > .result { - margin-block-start: 10px; -} - -/* Search */ - -#searchresults a { - text-decoration: none; -} - -mark { - border-radius: 2px; - padding-block-start: 0; - padding-block-end: 1px; - padding-inline-start: 3px; - padding-inline-end: 3px; - margin-block-start: 0; - margin-block-end: -1px; - margin-inline-start: -3px; - margin-inline-end: -3px; - background-color: var(--search-mark-bg); - transition: background-color 300ms linear; - cursor: pointer; -} - -mark.fade-out { - background-color: rgba(0,0,0,0) !important; - cursor: auto; -} - -.searchbar-outer { - margin-inline-start: auto; - margin-inline-end: auto; - max-width: var(--content-max-width); -} - -#searchbar { - width: 100%; - margin-block-start: 5px; - margin-block-end: 0; - margin-inline-start: auto; - margin-inline-end: auto; - padding: 10px 16px; - transition: box-shadow 300ms ease-in-out; - border: 1px solid var(--searchbar-border-color); - border-radius: 3px; - background-color: var(--searchbar-bg); - color: var(--searchbar-fg); -} -#searchbar:focus, -#searchbar.active { - box-shadow: 0 0 3px var(--searchbar-shadow-color); -} - -.searchresults-header { - font-weight: bold; - font-size: 1em; - padding-block-start: 18px; - padding-block-end: 0; - padding-inline-start: 5px; - padding-inline-end: 0; - color: var(--searchresults-header-fg); -} - -.searchresults-outer { - margin-inline-start: auto; - margin-inline-end: auto; - max-width: var(--content-max-width); - border-block-end: 1px dashed var(--searchresults-border-color); -} - -ul#searchresults { - list-style: none; - padding-inline-start: 20px; -} -ul#searchresults li { - margin: 10px 0px; - padding: 2px; - border-radius: 2px; -} -ul#searchresults li.focus { - background-color: var(--searchresults-li-bg); -} -ul#searchresults span.teaser { - display: block; - clear: both; - margin-block-start: 5px; - margin-block-end: 0; - margin-inline-start: 20px; - margin-inline-end: 0; - font-size: 0.8em; -} -ul#searchresults span.teaser em { - font-weight: bold; - font-style: normal; -} - -/* Sidebar */ - -.sidebar { - position: fixed; - left: 0; - top: 0; - bottom: 0; - width: var(--sidebar-width); - font-size: 0.875em; - box-sizing: border-box; - -webkit-overflow-scrolling: touch; - overscroll-behavior-y: contain; - background-color: var(--sidebar-bg); - color: var(--sidebar-fg); -} -[dir=rtl] .sidebar { left: unset; right: 0; } -.sidebar-resizing { - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} -.no-js .sidebar, -.js:not(.sidebar-resizing) .sidebar { - transition: transform 0.3s; /* Animation: slide away */ -} -.sidebar code { - line-height: 2em; -} -.sidebar .sidebar-scrollbox { - overflow-y: auto; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - padding: 10px 10px; -} -.sidebar .sidebar-resize-handle { - position: absolute; - cursor: col-resize; - width: 0; - right: calc(var(--sidebar-resize-indicator-width) * -1); - top: 0; - bottom: 0; - display: flex; - align-items: center; -} - -.sidebar-resize-handle .sidebar-resize-indicator { - width: 100%; - height: 12px; - background-color: var(--icons); - margin-inline-start: var(--sidebar-resize-indicator-space); -} - -[dir=rtl] .sidebar .sidebar-resize-handle { - left: calc(var(--sidebar-resize-indicator-width) * -1); - right: unset; -} -.js .sidebar .sidebar-resize-handle { - cursor: col-resize; - width: calc(var(--sidebar-resize-indicator-width) - var(--sidebar-resize-indicator-space)); -} -/* sidebar-hidden */ -#sidebar-toggle-anchor:not(:checked) ~ .sidebar { - transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); - z-index: -1; -} -[dir=rtl] #sidebar-toggle-anchor:not(:checked) ~ .sidebar { - transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); -} -.sidebar::-webkit-scrollbar { - background: var(--sidebar-bg); -} -.sidebar::-webkit-scrollbar-thumb { - background: var(--scrollbar); -} - -/* sidebar-visible */ -#sidebar-toggle-anchor:checked ~ .page-wrapper { - transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); -} -[dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { - transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); -} -@media only screen and (min-width: 620px) { - #sidebar-toggle-anchor:checked ~ .page-wrapper { - transform: none; - margin-inline-start: calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)); - } - [dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { - transform: none; - } -} - -.chapter { - list-style: none outside none; - padding-inline-start: 0; - line-height: 2.2em; -} - -.chapter ol { - width: 100%; -} - -.chapter li { - display: flex; - color: var(--sidebar-non-existant); -} -.chapter li a { - display: block; - padding: 0; - text-decoration: none; - color: var(--sidebar-fg); -} - -.chapter li a:hover { - color: var(--sidebar-active); -} - -.chapter li a.active { - color: var(--sidebar-active); -} - -.chapter li > a.toggle { - cursor: pointer; - display: block; - margin-inline-start: auto; - padding: 0 10px; - user-select: none; - opacity: 0.68; -} - -.chapter li > a.toggle div { - transition: transform 0.5s; -} - -/* collapse the section */ -.chapter li:not(.expanded) + li > ol { - display: none; -} - -.chapter li.chapter-item { - line-height: 1.5em; - margin-block-start: 0.6em; -} - -.chapter li.expanded > a.toggle div { - transform: rotate(90deg); -} - -.spacer { - width: 100%; - height: 3px; - margin: 5px 0px; -} -.chapter .spacer { - background-color: var(--sidebar-spacer); -} - -@media (-moz-touch-enabled: 1), (pointer: coarse) { - .chapter li a { padding: 5px 0; } - .spacer { margin: 10px 0; } -} - -.section { - list-style: none outside none; - padding-inline-start: 20px; - line-height: 1.9em; -} - -/* Theme Menu Popup */ - -.theme-popup { - position: absolute; - left: 10px; - top: var(--menu-bar-height); - z-index: 1000; - border-radius: 4px; - font-size: 0.7em; - color: var(--fg); - background: var(--theme-popup-bg); - border: 1px solid var(--theme-popup-border); - margin: 0; - padding: 0; - list-style: none; - display: none; - /* Don't let the children's background extend past the rounded corners. */ - overflow: hidden; -} -[dir=rtl] .theme-popup { left: unset; right: 10px; } -.theme-popup .default { - color: var(--icons); -} -.theme-popup .theme { - width: 100%; - border: 0; - margin: 0; - padding: 2px 20px; - line-height: 25px; - white-space: nowrap; - text-align: start; - cursor: pointer; - color: inherit; - background: inherit; - font-size: inherit; -} -.theme-popup .theme:hover { - background-color: var(--theme-hover); -} - -.theme-selected::before { - display: inline-block; - content: "✓"; - margin-inline-start: -14px; - width: 14px; -} - diff --git a/theme/css/general.css b/theme/css/general.css deleted file mode 100644 index e7d20da7..00000000 --- a/theme/css/general.css +++ /dev/null @@ -1,234 +0,0 @@ -/* Base styles and content styles */ - -@import 'variables.css'; - -:root { - /* Browser default font-size is 16px, this way 1 rem = 10px */ - font-size: 62.5%; - color-scheme: var(--color-scheme); -} - -html { - font-family: "Open Sans", sans-serif; - color: var(--fg); - background-color: var(--bg); - text-size-adjust: none; - -webkit-text-size-adjust: none; -} - -body { - margin: 0; - font-size: 1.6rem; - overflow-x: hidden; -} - -code { - font-family: var(--mono-font) !important; - font-size: var(--code-font-size); - direction: ltr !important; -} - -/* make long words/inline code not x overflow */ -main { - overflow-wrap: break-word; -} - -/* make wide tables scroll if they overflow */ -.table-wrapper { - overflow-x: auto; -} - -/* Don't change font size in headers. */ -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - font-size: unset; -} - -.left { float: left; } -.right { float: right; } -.boring { opacity: 0.6; } -.hide-boring .boring { display: none; } -.hidden { display: none !important; } - -h2, h3 { margin-block-start: 2.5em; } -h4, h5 { margin-block-start: 2em; } - -.header + .header h3, -.header + .header h4, -.header + .header h5 { - margin-block-start: 1em; -} - -h1:target::before, -h2:target::before, -h3:target::before, -h4:target::before, -h5:target::before, -h6:target::before { - display: inline-block; - content: "»"; - margin-inline-start: -30px; - width: 30px; -} - -/* This is broken on Safari as of version 14, but is fixed - in Safari Technology Preview 117 which I think will be Safari 14.2. - https://bugs.webkit.org/show_bug.cgi?id=218076 -*/ -:target { - /* Safari does not support logical properties */ - scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); -} - -.page { - outline: 0; - padding: 0 var(--page-padding); - margin-block-start: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ -} -.page-wrapper { - box-sizing: border-box; - background-color: var(--bg); -} -.no-js .page-wrapper, -.js:not(.sidebar-resizing) .page-wrapper { - transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ -} -[dir=rtl] .js:not(.sidebar-resizing) .page-wrapper { - transition: margin-right 0.3s ease, transform 0.3s ease; /* Animation: slide away */ -} - -.content { - overflow-y: auto; - padding: 0 5px 50px 5px; -} -.content main { - margin-inline-start: auto; - margin-inline-end: auto; - max-width: var(--content-max-width); -} -.content p { line-height: 1.45em; } -.content ol { line-height: 1.45em; } -.content ul { line-height: 1.45em; } -.content a { text-decoration: none; } -.content a:hover { text-decoration: underline; } -.content img, .content video { max-width: 100%; } -.content .header:link, -.content .header:visited { - color: var(--fg); -} -.content .header:link, -.content .header:visited:hover { - text-decoration: none; -} - -table { - margin: 0 auto; - border-collapse: collapse; -} -table td { - padding: 3px 20px; - border: 1px var(--table-border-color) solid; -} -table thead { - background: var(--table-header-bg); -} -table thead td { - font-weight: 700; - border: none; -} -table thead th { - padding: 3px 20px; -} -table thead tr { - border: 1px var(--table-header-bg) solid; -} -/* Alternate background colors for rows */ -table tbody tr:nth-child(2n) { - background: var(--table-alternate-bg); -} - - -blockquote { - margin: 20px 0; - padding: 0 20px; - color: var(--fg); - background-color: var(--quote-bg); - border-block-start: .1em solid var(--quote-border); - border-block-end: .1em solid var(--quote-border); -} - -.warning { - margin: 20px; - padding: 0 20px; - border-inline-start: 2px solid var(--warning-border); -} - -.warning:before { - position: absolute; - width: 3rem; - height: 3rem; - margin-inline-start: calc(-1.5rem - 21px); - content: "ⓘ"; - text-align: center; - background-color: var(--bg); - color: var(--warning-border); - font-weight: bold; - font-size: 2rem; -} - -blockquote .warning:before { - background-color: var(--quote-bg); -} - -kbd { - background-color: var(--table-border-color); - border-radius: 4px; - border: solid 1px var(--theme-popup-border); - box-shadow: inset 0 -1px 0 var(--theme-hover); - display: inline-block; - font-size: var(--code-font-size); - font-family: var(--mono-font); - line-height: 10px; - padding: 4px 5px; - vertical-align: middle; -} - -:not(.footnote-definition) + .footnote-definition, -.footnote-definition + :not(.footnote-definition) { - margin-block-start: 2em; -} -.footnote-definition { - font-size: 0.9em; - margin: 0.5em 0; -} -.footnote-definition p { - display: inline; -} - -.tooltiptext { - position: absolute; - visibility: hidden; - color: #fff; - background-color: #333; - transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ - left: -8px; /* Half of the width of the icon */ - top: -35px; - font-size: 0.8em; - text-align: center; - border-radius: 6px; - padding: 5px 8px; - margin: 5px; - z-index: 1000; -} -.tooltipped .tooltiptext { - visibility: visible; -} - -.chapter li.part-title { - color: var(--sidebar-fg); - margin: 5px 0px; - font-weight: bold; -} - -.result-no-output { - font-style: italic; -} diff --git a/theme/css/variables.css b/theme/css/variables.css deleted file mode 100644 index e7feed98..00000000 --- a/theme/css/variables.css +++ /dev/null @@ -1,279 +0,0 @@ -/* Globals */ - -:root { - --sidebar-width: 300px; - --sidebar-resize-indicator-width: 8px; - --sidebar-resize-indicator-space: 2px; - --page-padding: 15px; - --content-max-width: 750px; - --menu-bar-height: 50px; - --mono-font: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace; - --code-font-size: 0.875em - /* please adjust the ace font size accordingly in editor.js */ -} - -/* Themes */ - -.ayu { - --bg: hsl(210, 25%, 8%); - --fg: #c5c5c5; - - --sidebar-bg: #14191f; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #5c6773; - --sidebar-active: #ffb454; - --sidebar-spacer: #2d334f; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #b7b9cc; - - --links: #0096cf; - - --inline-code-color: #ffb454; - - --theme-popup-bg: #14191f; - --theme-popup-border: #5c6773; - --theme-hover: #191f26; - - --quote-bg: hsl(226, 15%, 17%); - --quote-border: hsl(226, 15%, 22%); - - --warning-border: #ff8e00; - - --table-border-color: hsl(210, 25%, 13%); - --table-header-bg: hsl(210, 25%, 28%); - --table-alternate-bg: hsl(210, 25%, 11%); - - --searchbar-border-color: #848484; - --searchbar-bg: #424242; - --searchbar-fg: #fff; - --searchbar-shadow-color: #d4c89f; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #252932; - --search-mark-bg: #e3b171; - - --color-scheme: dark; -} - -.coal { - --bg: hsl(200, 7%, 8%); - --fg: #98a3ad; - - --sidebar-bg: #292c2f; - --sidebar-fg: #a1adb8; - --sidebar-non-existant: #505254; - --sidebar-active: #3473ad; - --sidebar-spacer: #393939; - - --scrollbar: var(--sidebar-fg); - - --icons: #43484d; - --icons-hover: #b3c0cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #141617; - --theme-popup-border: #43484d; - --theme-hover: #1f2124; - - --quote-bg: hsl(234, 21%, 18%); - --quote-border: hsl(234, 21%, 23%); - - --warning-border: #ff8e00; - - --table-border-color: hsl(200, 7%, 13%); - --table-header-bg: hsl(200, 7%, 28%); - --table-alternate-bg: hsl(200, 7%, 11%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #b7b7b7; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #98a3ad; - --searchresults-li-bg: #2b2b2f; - --search-mark-bg: #355c7d; - - --color-scheme: dark; -} - -.light { - --bg: hsl(0, 0%, 100%); - --fg: hsl(0, 0%, 0%); - - --sidebar-bg: #fafafa; - --sidebar-fg: #AE518E; - --sidebar-non-existant: #aaaaaa; - --sidebar-active: #2F7E86; - --sidebar-spacer: #f4f4f4; - - --scrollbar: #8F8F8F; - - --icons: #747474; - --icons-hover: #000000; - - --links: #429EC2; - - --inline-code-color: #9d579d; - - --theme-popup-bg: #fafafa; - --theme-popup-border: #cccccc; - --theme-hover: #e6e6e6; - - --quote-bg: hsl(197, 37%, 96%); - --quote-border: hsl(197, 37%, 91%); - - --warning-border: #ff8e00; - - --table-border-color: hsl(0, 0%, 95%); - --table-header-bg: hsl(0, 0%, 80%); - --table-alternate-bg: hsl(0, 0%, 97%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #fafafa; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #e4f2fe; - --search-mark-bg: #a2cff5; - - --color-scheme: light; -} - -.navy { - --bg: hsl(226, 23%, 11%); - --fg: #dfd3db; - - --sidebar-bg: #282d3f; - --sidebar-fg: #fdcbec; - --sidebar-non-existant: #505274; - --sidebar-active: #5BCEFA; - --sidebar-spacer: #2d334f; - - --scrollbar: var(--sidebar-fg); - - --icons: #fdcbec; - --icons-hover: #5BCEFA; - - --links: #5BCEFA; - - --inline-code-color: #bd66bc; - - --theme-popup-bg: #161923; - --theme-popup-border: #737480; - --theme-hover: #282e40; - - --quote-bg: hsl(226, 15%, 17%); - --quote-border: hsl(226, 15%, 22%); - - --warning-border: #ff8e00; - - --table-border-color: hsl(226, 23%, 16%); - --table-header-bg: hsl(226, 23%, 31%); - --table-alternate-bg: hsl(226, 23%, 14%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #aeaec6; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #5f5f71; - --searchresults-border-color: #5c5c68; - --searchresults-li-bg: #242430; - --search-mark-bg: #a2cff5; - - --color-scheme: dark; -} - -.rust { - --bg: hsl(60, 9%, 87%); - --fg: #262625; - - --sidebar-bg: #3b2e2a; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #505254; - --sidebar-active: #e69f67; - --sidebar-spacer: #45373a; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #262625; - - --links: #2b79a2; - - --inline-code-color: #6e6b5e; - - --theme-popup-bg: #e1e1db; - --theme-popup-border: #b38f6b; - --theme-hover: #99908a; - - --quote-bg: hsl(60, 5%, 75%); - --quote-border: hsl(60, 5%, 70%); - - --warning-border: #ff8e00; - - --table-border-color: hsl(60, 9%, 82%); - --table-header-bg: #b3a497; - --table-alternate-bg: hsl(60, 9%, 84%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #fafafa; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #dec2a2; - --search-mark-bg: #e69f67; - - --color-scheme: light; -} - -@media (prefers-color-scheme: dark) { - .light.no-js { - --bg: hsl(200, 7%, 8%); - --fg: #98a3ad; - - --sidebar-bg: #292c2f; - --sidebar-fg: #a1adb8; - --sidebar-non-existant: #505254; - --sidebar-active: #3473ad; - --sidebar-spacer: #393939; - - --scrollbar: var(--sidebar-fg); - - --icons: #43484d; - --icons-hover: #b3c0cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #141617; - --theme-popup-border: #43484d; - --theme-hover: #1f2124; - - --quote-bg: hsl(234, 21%, 18%); - --quote-border: hsl(234, 21%, 23%); - - --warning-border: #ff8e00; - - --table-border-color: hsl(200, 7%, 13%); - --table-header-bg: hsl(200, 7%, 28%); - --table-alternate-bg: hsl(200, 7%, 11%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #b7b7b7; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #98a3ad; - --searchresults-li-bg: #2b2b2f; - --search-mark-bg: #355c7d; - } -} diff --git a/theme/favicon.png b/theme/favicon.png deleted file mode 100644 index 150aea82ca57c59833b5364c0a883c2ae2b11469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29856 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