diff --git a/_includes/header.html b/_includes/header.html deleted file mode 100644 index 3d7e25f..0000000 --- a/_includes/header.html +++ /dev/null @@ -1,19 +0,0 @@ -
-
- - - - - - - Moxxy - - - -
- - Blog - Developers - Source -
-
diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..fdea53c --- /dev/null +++ b/config.toml @@ -0,0 +1,82 @@ +base_url = "https://moxxy.org" +title = "Moxxy | A modern XMPP client" +description = "A modern XMPP client" + +compile_sass = false +build_search_index = false +generate_feed = true +feed_filename = "atom.xml" + +[extra] +heroText = "An experimental and modern XMPP client" +mainScreenshot = "img/screenshots/1.png" + +features = [ + "End-to-End encryption using OMEMO (0.8.3)", + "Stickers", + "Reactions", + "Retract messages", + "Voice messages", + "Swipe-to-quote", + "Chat background images", + "Optional privacy-preserving integration with phone contacts", + "Open-Source" +] + +screenshots = [ + "img/screenshots/1.png", + "img/screenshots/2.png", +] + +sourceUrl = "https://codeberg.org/moxxy/moxxy" +githubMirrorUrl = "https://github.com/PapaTutuWawa/moxxy" +generalMuc = "xmpp:moxxy@muc.moxxy.org?join" +developmentMuc = "xmpp:dev@muc.moxxy.org?join" + +[[extra.libraries]] +url = "https://codeberg.org/moxxy/moxxmpp" +name = "moxxmpp" +desc = "XMPP library written in Dart" +specific = false + +[[extra.libraries]] +url = "https://codeberg.org/moxxy/moxdns" +name = "moxdns" +desc = "DNS SRV resolver for Flutter" +specific = true + +[[extra.libraries]] +url = "https://codeberg.org/moxxy/moxlib" +name = "moxlib" +desc = "Shared functions for Moxxy-specific projects" +specific = true + +[[extra.libraries]] +url = "https://codeberg.org/moxxy/moxplatform" +name = "moxplatform" +desc = "Platform-specific code" +specific = true + +[[extra.libraries]] +url = "https://codeberg.org/PapaTutuWawa/omemo_dart" +name = "omemo_dart" +desc = "Implementation of the cryptography for OMEMO 0.8.3 with a high-level interface" +specific = false + +[[extra.customXeps]] +name = "Extensible File Thumbnails" +desc = "Provide an extensible way of specifying thumbnails that are neccessarily binary data" +url = "https://codeberg.org/moxxy/custom-xeps/src/branch/master/xep-xxxx-extensible-file-thumbnails.md" + +[[extra.customXeps]] +name = "File Upload Notification" +desc = "Allow communicating that an OOB file upload is currently running to improve the consistency of the conversation" +url = "https://codeberg.org/moxxy/custom-xeps/src/branch/master/xep-xxxx-file-upload-notification.md" + +[[extra.badges]] +url = "https://apt.izzysoft.de/fdroid/index/apk/org.moxxy.moxxyv2" +image = "img/badges/IzzyOnDroid.png" + +[[extra.badges]] +url = "https://codeberg.org/moxxy/moxxy/releases/latest" +image = "img/badges/codeberg.png" \ No newline at end of file diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..30d22b8 --- /dev/null +++ b/content/_index.md @@ -0,0 +1,5 @@ ++++ +template = "index.html" + +sort_by = "date" ++++ \ No newline at end of file diff --git a/_posts/2023-01-24-Moxxys-New-Website.md b/content/blog/2023-01-24-Moxxys-New-Website.md similarity index 69% rename from _posts/2023-01-24-Moxxys-New-Website.md rename to content/blog/2023-01-24-Moxxys-New-Website.md index f09fc61..943cbd0 100644 --- a/_posts/2023-01-24-Moxxys-New-Website.md +++ b/content/blog/2023-01-24-Moxxys-New-Website.md @@ -1,11 +1,16 @@ ---- -layout: post -title: Moxxy's New Website -author: PapaTutuWawa ---- ++++ +title = "Moxxy's New Website" +date = "2023-01-24" +template = "post.html" + +[extra] +author = "PapaTutuWawa" ++++ Hello everyone! Welcome on Moxxy's new website. It currently does not contain much but that may change in the future. + + The page is built using [Jekyll](https://jekyllrb.com/) and [TailwindCSS](https://tailwindcss.com/). You can find the page's source [here](https://codeberg.org/moxxy/website). diff --git a/_posts/2023-05-06-Groupchat-GSoC-Project.md b/content/blog/2023-05-06-Groupchat-GSoC-Project.md similarity index 92% rename from _posts/2023-05-06-Groupchat-GSoC-Project.md rename to content/blog/2023-05-06-Groupchat-GSoC-Project.md index 252a708..1fca82e 100644 --- a/_posts/2023-05-06-Groupchat-GSoC-Project.md +++ b/content/blog/2023-05-06-Groupchat-GSoC-Project.md @@ -1,13 +1,18 @@ ---- -layout: post -title: Moxxy's First GSoC Project! -author: Ikjot Singh Dhody ---- ++++ +title = "Moxxy's First GSoC Project!" +date = "2023-05-06" +template = "post.html" + +[extra] +author = "Ikjot Singh Dhody" ++++ Hello readers! As we know, Moxxy is an experimental IM for XMPP built using Flutter. While it does have a great set of features as described [here](https://moxxy.org/), it currently lacks support for group chats (or Multi-User-Chats). A great piece of news is that Google has accepted my proposal to add support for multi user chats in Moxxy. + + To implement multi user chats in Moxxy, the [XEP-0045](https://xmpp.org/extensions/xep-0045.html) standard will be followed and implemented. The project will run in two phases, since the major changes required will be in the [moxxmpp](https://codeberg.org/moxxy/moxxmpp) and [Moxxy](https://codeberg.org/moxxy/moxxy) codebases. First, XEP-0045 support will be added to moxxmpp with all the handlers, events and routines required to cleanly integrate the same with Moxxy. The second phase will be the UI changes in the Moxxy Flutter application, that builds upon the existing, reusable infrastructure. The usecases planned to be implemented are listed below (subject to changes before the coding period begins): diff --git a/_posts/2023-06-17-XEP-0045-In-Moxxmpp.md b/content/blog/2023-06-17-XEP-0045-In-Moxxmpp.md similarity index 98% rename from _posts/2023-06-17-XEP-0045-In-Moxxmpp.md rename to content/blog/2023-06-17-XEP-0045-In-Moxxmpp.md index ba03298..7644f9e 100644 --- a/_posts/2023-06-17-XEP-0045-In-Moxxmpp.md +++ b/content/blog/2023-06-17-XEP-0045-In-Moxxmpp.md @@ -1,13 +1,18 @@ ---- -layout: post -title: XEP-0045 implementation in Moxxmpp -author: Ikjot Singh Dhody ---- ++++ +title = "XEP-0045 implementation in Moxxmpp" +date = "2023-06-17" +template = "post.html" + +[extra] +author = "Ikjot Singh Dhody" ++++ Hello readers! Welcome back to the GSoC series of blogs. This one is about my implementation of the MUC XEP (XEP-0045) in Moxxmpp. + + ## Introduction Well, as you probably know, Moxxy is the frontend app that is being developed as a modern new XMPP client. diff --git a/_posts/2023-07-24-Join-MUC-With Moxxy.md b/content/blog/2023-07-24-Join-MUC-With Moxxy.md similarity index 97% rename from _posts/2023-07-24-Join-MUC-With Moxxy.md rename to content/blog/2023-07-24-Join-MUC-With Moxxy.md index 88c9ca2..9b0e267 100644 --- a/_posts/2023-07-24-Join-MUC-With Moxxy.md +++ b/content/blog/2023-07-24-Join-MUC-With Moxxy.md @@ -1,13 +1,18 @@ ---- -layout: post -title: Joining an MUC with Moxxy! -author: Ikjot Singh Dhody ---- ++++ +title = "Joining an MUC with Moxxy!" +date = "2023-07-24" +template = "post.html" + +[extra] +author = "Ikjot Singh Dhody" ++++ Greetings, readers! Welcome back to our series of blogs on the Google Summer of Code (GSoC) project. In this blog post, I'll be sharing the progress made in implementing Multi-User Chat (MUC) support in Moxxy, the frontend counterpart to my GSoC project. + + ## Introduction As you may recall, Moxxy is a frontend application developed as an innovative XMPP client. To enhance its functionality, my GSoC project focuses on adding MUC support. Before diving into the Moxxy implementation, it was crucial to establish the necessary MUC support in Moxxmpp, which is highlighted in [this](https://moxxy.org/posts/2023-06-17-XEP-0045-In-Moxxmpp.html) blog. diff --git a/_posts/2023-08-20-Moxxy-MUC-GSoC-Final-Report.md b/content/blog/2023-08-20-Moxxy-MUC-GSoC-Final-Report/index.md similarity index 98% rename from _posts/2023-08-20-Moxxy-MUC-GSoC-Final-Report.md rename to content/blog/2023-08-20-Moxxy-MUC-GSoC-Final-Report/index.md index f7a6874..6dde337 100644 --- a/_posts/2023-08-20-Moxxy-MUC-GSoC-Final-Report.md +++ b/content/blog/2023-08-20-Moxxy-MUC-GSoC-Final-Report/index.md @@ -1,8 +1,11 @@ ---- -layout: post -title: GSoC report - Moxxy MUC implementation -author: Ikjot Singh Dhody ---- ++++ +title = "GSoC report - Moxxy MUC implementation" +date = "2023-08-20" +template = "post.html" + +[extra] +author = "Ikjot Singh Dhody" ++++ # GSoC Final Report: XMPP Standards Foundation - Moxxy: Implement Group Chats @@ -36,7 +39,7 @@ This report presents the culmination of my work on the GSoC project "Moxxy: Impl ## The Project Before getting into the details of the actual project - here is a demo screencast for the implementation: -![](../assets/img/moxxy-muc-demo.gif) +![](moxxy-muc-demo.gif) I have outlined the features I implemented through the GSoC period below. ### PRs merged diff --git a/assets/img/moxxy-muc-demo.gif b/content/blog/2023-08-20-Moxxy-MUC-GSoC-Final-Report/moxxy-muc-demo.gif similarity index 100% rename from assets/img/moxxy-muc-demo.gif rename to content/blog/2023-08-20-Moxxy-MUC-GSoC-Final-Report/moxxy-muc-demo.gif diff --git a/content/blog/_index.md b/content/blog/_index.md new file mode 100644 index 0000000..b1dc633 --- /dev/null +++ b/content/blog/_index.md @@ -0,0 +1,6 @@ ++++ +title = "Blog Posts" +template = "blog.html" + +sort_by = "date" ++++ \ No newline at end of file diff --git a/content/developers.md b/content/developers.md new file mode 100644 index 0000000..ab13d56 --- /dev/null +++ b/content/developers.md @@ -0,0 +1,4 @@ ++++ +title = "Developer Information" +template = "developers.html" ++++ \ No newline at end of file diff --git a/developers.html b/developers.html deleted file mode 100644 index 0152ccd..0000000 --- a/developers.html +++ /dev/null @@ -1,75 +0,0 @@ ---- -layout: default -title: Developer Information ---- - -
-
- -
-
-

- Moxxy is fully open source. You can find the source code on Codeberg. Additionally, the code is - mirrored on GitHub. -

- -

- Feel free to join the general chat or the developer chat with your favourite XMPP client. -

-
-

Libraries

- -

- Moxxy is built from various smaller libraries that are custom-made for this purpose. Some of them are for general usage, some are specific to the use case of building Moxxy. -

- - - - - - - - - - - {% for library in site.developers.libraries %} - - - - - - {% endfor %} - -
LibraryDescriptionMoxxy specific
- {{ library.name }} - {{ library.desc }}{% if library.specific %}Yes{% else %}No{% endif %}
-
- -
-

Custom XEPs

- -

- Moxxy currently implements some custom XMPP protocols to provide additional functionality. These are experimental and are intended to be upstreamed at some point. -

- - - - - - - - - - {% for xep in site.developers.customXeps %} - - - - - {% endfor %} - -
NameDescription
- {{ xep.name }} - {{ xep.desc }}
-
-
-
diff --git a/flake.lock b/flake.lock index d207065..9edbcf2 100644 --- a/flake.lock +++ b/flake.lock @@ -17,11 +17,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1674236650, - "narHash": "sha256-B4GKL1YdJnII6DQNNJ4wDW1ySJVx2suB1h/v4Ql8J0Q=", + "lastModified": 1704842529, + "narHash": "sha256-OTeQA+F8d/Evad33JMfuXC89VMetQbsU4qcaePchGr4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "cfb43ad7b941d9c3606fb35d91228da7ebddbfc5", + "rev": "eabe8d3eface69f5bb16c18f8662a702f50c20d5", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 32655c8..cbc77fe 100644 --- a/flake.nix +++ b/flake.nix @@ -10,9 +10,6 @@ inherit system; }; - jekyllPackages = with pkgs; [ - rubyPackages.jekyll-feed rubyPackages.jekyll-seo-tag - ]; tailwindWithTypography = (pkgs.nodePackages.tailwindcss.overrideAttrs (old: { plugins = [ pkgs.nodePackages."@tailwindcss/typography" @@ -23,15 +20,9 @@ devShell = pkgs.mkShell { buildInputs = with pkgs; [ tailwindWithTypography - jekyll + zola imagemagick - ] ++ jekyllPackages; - }; - - packages = { - website = pkgs.callPackage ./pkgs/website.nix { - inherit tailwindWithTypography jekyllPackages; - }; + ]; }; }); } diff --git a/index.html b/index.html deleted file mode 100644 index b8cc0a1..0000000 --- a/index.html +++ /dev/null @@ -1,57 +0,0 @@ ---- -layout: default -title: A modern XMPP client ---- - -
-
-
- {{ site.index.heroText }} -
-
- -
-
-
- -
-
-
- - - - - - - -
-
-
- -
-
-
-

Features

- -
    - {% for feature in site.index.features %} -
  • {{ feature }}
  • - {% endfor %} -
-
-
-
- -
-
-
-

Screenshots

- -
- {% for screenshot in site.index.screenshots %} - - {% endfor %} -
-
-
-
diff --git a/pkgs/website.nix b/pkgs/website.nix deleted file mode 100644 index 8ce43bd..0000000 --- a/pkgs/website.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ - jekyll, jekyllPackages, tailwindWithTypography -, stdenv -}: - -stdenv.mkDerivation { - pname = "moxxyv2-website"; - version = "20230827"; - src = ./../.; - - buildInputs = [ - jekyll jekyllPackages tailwindWithTypography - ]; - - buildPhase = '' - ${jekyll}/bin/jekyll build --future - cp -r ./assets _site/assets - ${tailwindWithTypography}/bin/tailwindcss --input ./input.css --output ./_site/assets/css/index.css - ''; - - installPhase = '' - mkdir -p $out/srv/www/ - mv _site/ $out/srv/www/website - ''; -} diff --git a/posts.html b/posts.html deleted file mode 100644 index d45600a..0000000 --- a/posts.html +++ /dev/null @@ -1,34 +0,0 @@ ---- -layout: default -title: Blog Posts ---- - -
-
-
-

Blog posts

- - - - - - -
- -
- {% for post in site.posts %} -
- {{ post.title }} - -
- By {{ post.author }} -
- -

- {{ post.excerpt | markdownify | strip_html | truncatewords: 100 }} -

-
- {% endfor %} -
-
-
diff --git a/assets/css/.gitkeep b/static/css/.gitkeep similarity index 100% rename from assets/css/.gitkeep rename to static/css/.gitkeep diff --git a/static/css/index.css b/static/css/index.css new file mode 100644 index 0000000..62c05bc --- /dev/null +++ b/static/css/index.css @@ -0,0 +1,1725 @@ +/* +! tailwindcss v3.2.4 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +article > p > a { + --tw-text-opacity: 1 !important; + color: rgb(56 189 248 / var(--tw-text-opacity)) !important; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.prose { + color: var(--tw-prose-body); + max-width: 65ch; +} + +.prose :where(p):not(:where([class~="not-prose"] *)) { + margin-top: 1.25em; + margin-bottom: 1.25em; +} + +.prose :where([class~="lead"]):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-lead); + font-size: 1.25em; + line-height: 1.6; + margin-top: 1.2em; + margin-bottom: 1.2em; +} + +.prose :where(a):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-links); + text-decoration: underline; + font-weight: 500; +} + +.prose :where(strong):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-bold); + font-weight: 600; +} + +.prose :where(a strong):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(blockquote strong):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(thead th strong):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(ol):not(:where([class~="not-prose"] *)) { + list-style-type: decimal; + margin-top: 1.25em; + margin-bottom: 1.25em; + padding-left: 1.625em; +} + +.prose :where(ol[type="A"]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-alpha; +} + +.prose :where(ol[type="a"]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-alpha; +} + +.prose :where(ol[type="A" s]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-alpha; +} + +.prose :where(ol[type="a" s]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-alpha; +} + +.prose :where(ol[type="I"]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-roman; +} + +.prose :where(ol[type="i"]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-roman; +} + +.prose :where(ol[type="I" s]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-roman; +} + +.prose :where(ol[type="i" s]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-roman; +} + +.prose :where(ol[type="1"]):not(:where([class~="not-prose"] *)) { + list-style-type: decimal; +} + +.prose :where(ul):not(:where([class~="not-prose"] *)) { + list-style-type: disc; + margin-top: 1.25em; + margin-bottom: 1.25em; + padding-left: 1.625em; +} + +.prose :where(ol > li):not(:where([class~="not-prose"] *))::marker { + font-weight: 400; + color: var(--tw-prose-counters); +} + +.prose :where(ul > li):not(:where([class~="not-prose"] *))::marker { + color: var(--tw-prose-bullets); +} + +.prose :where(hr):not(:where([class~="not-prose"] *)) { + border-color: var(--tw-prose-hr); + border-top-width: 1px; + margin-top: 3em; + margin-bottom: 3em; +} + +.prose :where(blockquote):not(:where([class~="not-prose"] *)) { + font-weight: 500; + font-style: italic; + color: var(--tw-prose-quotes); + border-left-width: 0.25rem; + border-left-color: var(--tw-prose-quote-borders); + quotes: "\201C""\201D""\2018""\2019"; + margin-top: 1.6em; + margin-bottom: 1.6em; + padding-left: 1em; +} + +.prose :where(blockquote p:first-of-type):not(:where([class~="not-prose"] *))::before { + content: open-quote; +} + +.prose :where(blockquote p:last-of-type):not(:where([class~="not-prose"] *))::after { + content: close-quote; +} + +.prose :where(h1):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 800; + font-size: 2.25em; + margin-top: 0; + margin-bottom: 0.8888889em; + line-height: 1.1111111; +} + +.prose :where(h1 strong):not(:where([class~="not-prose"] *)) { + font-weight: 900; + color: inherit; +} + +.prose :where(h2):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 700; + font-size: 1.5em; + margin-top: 2em; + margin-bottom: 1em; + line-height: 1.3333333; +} + +.prose :where(h2 strong):not(:where([class~="not-prose"] *)) { + font-weight: 800; + color: inherit; +} + +.prose :where(h3):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + font-size: 1.25em; + margin-top: 1.6em; + margin-bottom: 0.6em; + line-height: 1.6; +} + +.prose :where(h3 strong):not(:where([class~="not-prose"] *)) { + font-weight: 700; + color: inherit; +} + +.prose :where(h4):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + margin-top: 1.5em; + margin-bottom: 0.5em; + line-height: 1.5; +} + +.prose :where(h4 strong):not(:where([class~="not-prose"] *)) { + font-weight: 700; + color: inherit; +} + +.prose :where(img):not(:where([class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(figure > *):not(:where([class~="not-prose"] *)) { + margin-top: 0; + margin-bottom: 0; +} + +.prose :where(figcaption):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-captions); + font-size: 0.875em; + line-height: 1.4285714; + margin-top: 0.8571429em; +} + +.prose :where(code):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-code); + font-weight: 600; + font-size: 0.875em; +} + +.prose :where(code):not(:where([class~="not-prose"] *))::before { + content: "`"; +} + +.prose :where(code):not(:where([class~="not-prose"] *))::after { + content: "`"; +} + +.prose :where(a code):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(h1 code):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(h2 code):not(:where([class~="not-prose"] *)) { + color: inherit; + font-size: 0.875em; +} + +.prose :where(h3 code):not(:where([class~="not-prose"] *)) { + color: inherit; + font-size: 0.9em; +} + +.prose :where(h4 code):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(blockquote code):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(thead th code):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(pre):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-pre-code); + background-color: var(--tw-prose-pre-bg); + overflow-x: auto; + font-weight: 400; + font-size: 0.875em; + line-height: 1.7142857; + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; + border-radius: 0.375rem; + padding-top: 0.8571429em; + padding-right: 1.1428571em; + padding-bottom: 0.8571429em; + padding-left: 1.1428571em; +} + +.prose :where(pre code):not(:where([class~="not-prose"] *)) { + background-color: transparent; + border-width: 0; + border-radius: 0; + padding: 0; + font-weight: inherit; + color: inherit; + font-size: inherit; + font-family: inherit; + line-height: inherit; +} + +.prose :where(pre code):not(:where([class~="not-prose"] *))::before { + content: none; +} + +.prose :where(pre code):not(:where([class~="not-prose"] *))::after { + content: none; +} + +.prose :where(table):not(:where([class~="not-prose"] *)) { + width: 100%; + table-layout: auto; + text-align: left; + margin-top: 2em; + margin-bottom: 2em; + font-size: 0.875em; + line-height: 1.7142857; +} + +.prose :where(thead):not(:where([class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-th-borders); +} + +.prose :where(thead th):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + vertical-align: bottom; + padding-right: 0.5714286em; + padding-bottom: 0.5714286em; + padding-left: 0.5714286em; +} + +.prose :where(tbody tr):not(:where([class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-td-borders); +} + +.prose :where(tbody tr:last-child):not(:where([class~="not-prose"] *)) { + border-bottom-width: 0; +} + +.prose :where(tbody td):not(:where([class~="not-prose"] *)) { + vertical-align: baseline; +} + +.prose :where(tfoot):not(:where([class~="not-prose"] *)) { + border-top-width: 1px; + border-top-color: var(--tw-prose-th-borders); +} + +.prose :where(tfoot td):not(:where([class~="not-prose"] *)) { + vertical-align: top; +} + +.prose { + --tw-prose-body: #374151; + --tw-prose-headings: #111827; + --tw-prose-lead: #4b5563; + --tw-prose-links: #111827; + --tw-prose-bold: #111827; + --tw-prose-counters: #6b7280; + --tw-prose-bullets: #d1d5db; + --tw-prose-hr: #e5e7eb; + --tw-prose-quotes: #111827; + --tw-prose-quote-borders: #e5e7eb; + --tw-prose-captions: #6b7280; + --tw-prose-code: #111827; + --tw-prose-pre-code: #e5e7eb; + --tw-prose-pre-bg: #1f2937; + --tw-prose-th-borders: #d1d5db; + --tw-prose-td-borders: #e5e7eb; + --tw-prose-invert-body: #d1d5db; + --tw-prose-invert-headings: #fff; + --tw-prose-invert-lead: #9ca3af; + --tw-prose-invert-links: #fff; + --tw-prose-invert-bold: #fff; + --tw-prose-invert-counters: #9ca3af; + --tw-prose-invert-bullets: #4b5563; + --tw-prose-invert-hr: #374151; + --tw-prose-invert-quotes: #f3f4f6; + --tw-prose-invert-quote-borders: #374151; + --tw-prose-invert-captions: #9ca3af; + --tw-prose-invert-code: #fff; + --tw-prose-invert-pre-code: #d1d5db; + --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%); + --tw-prose-invert-th-borders: #4b5563; + --tw-prose-invert-td-borders: #374151; + font-size: 1rem; + line-height: 1.75; +} + +.prose :where(video):not(:where([class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(figure):not(:where([class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(li):not(:where([class~="not-prose"] *)) { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +.prose :where(ol > li):not(:where([class~="not-prose"] *)) { + padding-left: 0.375em; +} + +.prose :where(ul > li):not(:where([class~="not-prose"] *)) { + padding-left: 0.375em; +} + +.prose :where(.prose > ul > li p):not(:where([class~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose :where(.prose > ul > li > *:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 1.25em; +} + +.prose :where(.prose > ul > li > *:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 1.25em; +} + +.prose :where(.prose > ol > li > *:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 1.25em; +} + +.prose :where(.prose > ol > li > *:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 1.25em; +} + +.prose :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose :where(hr + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h2 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h3 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h4 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(thead th:first-child):not(:where([class~="not-prose"] *)) { + padding-left: 0; +} + +.prose :where(thead th:last-child):not(:where([class~="not-prose"] *)) { + padding-right: 0; +} + +.prose :where(tbody td, tfoot td):not(:where([class~="not-prose"] *)) { + padding-top: 0.5714286em; + padding-right: 0.5714286em; + padding-bottom: 0.5714286em; + padding-left: 0.5714286em; +} + +.prose :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"] *)) { + padding-left: 0; +} + +.prose :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"] *)) { + padding-right: 0; +} + +.prose :where(.prose > :first-child):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(.prose > :last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 0; +} + +.prose-lg { + font-size: 1.125rem; + line-height: 1.7777778; +} + +.prose-lg :where(p):not(:where([class~="not-prose"] *)) { + margin-top: 1.3333333em; + margin-bottom: 1.3333333em; +} + +.prose-lg :where([class~="lead"]):not(:where([class~="not-prose"] *)) { + font-size: 1.2222222em; + line-height: 1.4545455; + margin-top: 1.0909091em; + margin-bottom: 1.0909091em; +} + +.prose-lg :where(blockquote):not(:where([class~="not-prose"] *)) { + margin-top: 1.6666667em; + margin-bottom: 1.6666667em; + padding-left: 1em; +} + +.prose-lg :where(h1):not(:where([class~="not-prose"] *)) { + font-size: 2.6666667em; + margin-top: 0; + margin-bottom: 0.8333333em; + line-height: 1; +} + +.prose-lg :where(h2):not(:where([class~="not-prose"] *)) { + font-size: 1.6666667em; + margin-top: 1.8666667em; + margin-bottom: 1.0666667em; + line-height: 1.3333333; +} + +.prose-lg :where(h3):not(:where([class~="not-prose"] *)) { + font-size: 1.3333333em; + margin-top: 1.6666667em; + margin-bottom: 0.6666667em; + line-height: 1.5; +} + +.prose-lg :where(h4):not(:where([class~="not-prose"] *)) { + margin-top: 1.7777778em; + margin-bottom: 0.4444444em; + line-height: 1.5555556; +} + +.prose-lg :where(img):not(:where([class~="not-prose"] *)) { + margin-top: 1.7777778em; + margin-bottom: 1.7777778em; +} + +.prose-lg :where(video):not(:where([class~="not-prose"] *)) { + margin-top: 1.7777778em; + margin-bottom: 1.7777778em; +} + +.prose-lg :where(figure):not(:where([class~="not-prose"] *)) { + margin-top: 1.7777778em; + margin-bottom: 1.7777778em; +} + +.prose-lg :where(figure > *):not(:where([class~="not-prose"] *)) { + margin-top: 0; + margin-bottom: 0; +} + +.prose-lg :where(figcaption):not(:where([class~="not-prose"] *)) { + font-size: 0.8888889em; + line-height: 1.5; + margin-top: 1em; +} + +.prose-lg :where(code):not(:where([class~="not-prose"] *)) { + font-size: 0.8888889em; +} + +.prose-lg :where(h2 code):not(:where([class~="not-prose"] *)) { + font-size: 0.8666667em; +} + +.prose-lg :where(h3 code):not(:where([class~="not-prose"] *)) { + font-size: 0.875em; +} + +.prose-lg :where(pre):not(:where([class~="not-prose"] *)) { + font-size: 0.8888889em; + line-height: 1.75; + margin-top: 2em; + margin-bottom: 2em; + border-radius: 0.375rem; + padding-top: 1em; + padding-right: 1.5em; + padding-bottom: 1em; + padding-left: 1.5em; +} + +.prose-lg :where(ol):not(:where([class~="not-prose"] *)) { + margin-top: 1.3333333em; + margin-bottom: 1.3333333em; + padding-left: 1.5555556em; +} + +.prose-lg :where(ul):not(:where([class~="not-prose"] *)) { + margin-top: 1.3333333em; + margin-bottom: 1.3333333em; + padding-left: 1.5555556em; +} + +.prose-lg :where(li):not(:where([class~="not-prose"] *)) { + margin-top: 0.6666667em; + margin-bottom: 0.6666667em; +} + +.prose-lg :where(ol > li):not(:where([class~="not-prose"] *)) { + padding-left: 0.4444444em; +} + +.prose-lg :where(ul > li):not(:where([class~="not-prose"] *)) { + padding-left: 0.4444444em; +} + +.prose-lg :where(.prose-lg > ul > li p):not(:where([class~="not-prose"] *)) { + margin-top: 0.8888889em; + margin-bottom: 0.8888889em; +} + +.prose-lg :where(.prose-lg > ul > li > *:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 1.3333333em; +} + +.prose-lg :where(.prose-lg > ul > li > *:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 1.3333333em; +} + +.prose-lg :where(.prose-lg > ol > li > *:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 1.3333333em; +} + +.prose-lg :where(.prose-lg > ol > li > *:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 1.3333333em; +} + +.prose-lg :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"] *)) { + margin-top: 0.8888889em; + margin-bottom: 0.8888889em; +} + +.prose-lg :where(hr):not(:where([class~="not-prose"] *)) { + margin-top: 3.1111111em; + margin-bottom: 3.1111111em; +} + +.prose-lg :where(hr + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose-lg :where(h2 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose-lg :where(h3 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose-lg :where(h4 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose-lg :where(table):not(:where([class~="not-prose"] *)) { + font-size: 0.8888889em; + line-height: 1.5; +} + +.prose-lg :where(thead th):not(:where([class~="not-prose"] *)) { + padding-right: 0.75em; + padding-bottom: 0.75em; + padding-left: 0.75em; +} + +.prose-lg :where(thead th:first-child):not(:where([class~="not-prose"] *)) { + padding-left: 0; +} + +.prose-lg :where(thead th:last-child):not(:where([class~="not-prose"] *)) { + padding-right: 0; +} + +.prose-lg :where(tbody td, tfoot td):not(:where([class~="not-prose"] *)) { + padding-top: 0.75em; + padding-right: 0.75em; + padding-bottom: 0.75em; + padding-left: 0.75em; +} + +.prose-lg :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"] *)) { + padding-left: 0; +} + +.prose-lg :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"] *)) { + padding-right: 0; +} + +.prose-lg :where(.prose-lg > :first-child):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose-lg :where(.prose-lg > :last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 0; +} + +.relative { + position: relative; +} + +.inset-x-0 { + left: 0px; + right: 0px; +} + +.inset-y-0 { + top: 0px; + bottom: 0px; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-5 { + margin-top: 1.25rem; +} + +.block { + display: block; +} + +.flex { + display: flex; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.h-8 { + height: 2rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-16 { + height: 4rem; +} + +.h-12 { + height: 3rem; +} + +.h-fit { + height: -moz-fit-content; + height: fit-content; +} + +.h-64 { + height: 16rem; +} + +.h-24 { + height: 6rem; +} + +.h-96 { + height: 24rem; +} + +.w-full { + width: 100%; +} + +.w-6 { + width: 1.5rem; +} + +.w-12 { + width: 3rem; +} + +.grow { + flex-grow: 1; +} + +.table-fixed { + table-layout: fixed; +} + +.list-disc { + list-style-type: disc; +} + +.grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); +} + +.grid-rows-1 { + grid-template-rows: repeat(1, minmax(0, 1fr)); +} + +.flex-row { + flex-direction: row; +} + +.flex-col { + flex-direction: column; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.flex-nowrap { + flex-wrap: nowrap; +} + +.place-items-center { + place-items: center; +} + +.items-start { + align-items: flex-start; +} + +.items-center { + align-items: center; +} + +.justify-center { + justify-content: center; +} + +.gap-4 { + gap: 1rem; +} + +.gap-8 { + gap: 2rem; +} + +.gap-x-3 { + -moz-column-gap: 0.75rem; + column-gap: 0.75rem; +} + +.divide-y > :not([hidden]) ~ :not([hidden]) { + --tw-divide-y-reverse: 0; + border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); + border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); +} + +.divide-blue-200 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(191 219 254 / var(--tw-divide-opacity)); +} + +.place-self-start { + place-self: start; +} + +.overflow-scroll { + overflow: scroll; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} + +.bg-moxxy-purple { + --tw-bg-opacity: 1; + background-color: rgb(207 74 255 / var(--tw-bg-opacity)); +} + +.p-8 { + padding: 2rem; +} + +.p-2 { + padding: 0.5rem; +} + +.px-8 { + padding-left: 2rem; + padding-right: 2rem; +} + +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.pt-4 { + padding-top: 1rem; +} + +.pt-1 { + padding-top: 0.25rem; +} + +.pb-4 { + padding-bottom: 1rem; +} + +.pr-4 { + padding-right: 1rem; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.font-bold { + font-weight: 700; +} + +.italic { + font-style: italic; +} + +.text-sky-400 { + --tw-text-opacity: 1; + color: rgb(56 189 248 / var(--tw-text-opacity)); +} + +.text-indigo-400 { + --tw-text-opacity: 1; + color: rgb(129 140 248 / var(--tw-text-opacity)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-neutral-100 { + --tw-text-opacity: 1; + color: rgb(245 245 245 / var(--tw-text-opacity)); +} + +.shadow-md { + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +@media (min-width: 768px) { + .md\:h-16 { + height: 4rem; + } + + .md\:max-w-prose { + max-width: 65ch; + } +} + +@media (min-width: 1024px) { + .lg\:h-96 { + height: 24rem; + } + + .lg\:w-1\/2 { + width: 50%; + } + + .lg\:prose-lg { + font-size: 1.125rem; + line-height: 1.7777778; + } + + .lg\:prose-lg :where(p):not(:where([class~="not-prose"] *)) { + margin-top: 1.3333333em; + margin-bottom: 1.3333333em; + } + + .lg\:prose-lg :where([class~="lead"]):not(:where([class~="not-prose"] *)) { + font-size: 1.2222222em; + line-height: 1.4545455; + margin-top: 1.0909091em; + margin-bottom: 1.0909091em; + } + + .lg\:prose-lg :where(blockquote):not(:where([class~="not-prose"] *)) { + margin-top: 1.6666667em; + margin-bottom: 1.6666667em; + padding-left: 1em; + } + + .lg\:prose-lg :where(h1):not(:where([class~="not-prose"] *)) { + font-size: 2.6666667em; + margin-top: 0; + margin-bottom: 0.8333333em; + line-height: 1; + } + + .lg\:prose-lg :where(h2):not(:where([class~="not-prose"] *)) { + font-size: 1.6666667em; + margin-top: 1.8666667em; + margin-bottom: 1.0666667em; + line-height: 1.3333333; + } + + .lg\:prose-lg :where(h3):not(:where([class~="not-prose"] *)) { + font-size: 1.3333333em; + margin-top: 1.6666667em; + margin-bottom: 0.6666667em; + line-height: 1.5; + } + + .lg\:prose-lg :where(h4):not(:where([class~="not-prose"] *)) { + margin-top: 1.7777778em; + margin-bottom: 0.4444444em; + line-height: 1.5555556; + } + + .lg\:prose-lg :where(img):not(:where([class~="not-prose"] *)) { + margin-top: 1.7777778em; + margin-bottom: 1.7777778em; + } + + .lg\:prose-lg :where(video):not(:where([class~="not-prose"] *)) { + margin-top: 1.7777778em; + margin-bottom: 1.7777778em; + } + + .lg\:prose-lg :where(figure):not(:where([class~="not-prose"] *)) { + margin-top: 1.7777778em; + margin-bottom: 1.7777778em; + } + + .lg\:prose-lg :where(figure > *):not(:where([class~="not-prose"] *)) { + margin-top: 0; + margin-bottom: 0; + } + + .lg\:prose-lg :where(figcaption):not(:where([class~="not-prose"] *)) { + font-size: 0.8888889em; + line-height: 1.5; + margin-top: 1em; + } + + .lg\:prose-lg :where(code):not(:where([class~="not-prose"] *)) { + font-size: 0.8888889em; + } + + .lg\:prose-lg :where(h2 code):not(:where([class~="not-prose"] *)) { + font-size: 0.8666667em; + } + + .lg\:prose-lg :where(h3 code):not(:where([class~="not-prose"] *)) { + font-size: 0.875em; + } + + .lg\:prose-lg :where(pre):not(:where([class~="not-prose"] *)) { + font-size: 0.8888889em; + line-height: 1.75; + margin-top: 2em; + margin-bottom: 2em; + border-radius: 0.375rem; + padding-top: 1em; + padding-right: 1.5em; + padding-bottom: 1em; + padding-left: 1.5em; + } + + .lg\:prose-lg :where(ol):not(:where([class~="not-prose"] *)) { + margin-top: 1.3333333em; + margin-bottom: 1.3333333em; + padding-left: 1.5555556em; + } + + .lg\:prose-lg :where(ul):not(:where([class~="not-prose"] *)) { + margin-top: 1.3333333em; + margin-bottom: 1.3333333em; + padding-left: 1.5555556em; + } + + .lg\:prose-lg :where(li):not(:where([class~="not-prose"] *)) { + margin-top: 0.6666667em; + margin-bottom: 0.6666667em; + } + + .lg\:prose-lg :where(ol > li):not(:where([class~="not-prose"] *)) { + padding-left: 0.4444444em; + } + + .lg\:prose-lg :where(ul > li):not(:where([class~="not-prose"] *)) { + padding-left: 0.4444444em; + } + + .lg\:prose-lg :where(.lg\:prose-lg > ul > li p):not(:where([class~="not-prose"] *)) { + margin-top: 0.8888889em; + margin-bottom: 0.8888889em; + } + + .lg\:prose-lg :where(.lg\:prose-lg > ul > li > *:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 1.3333333em; + } + + .lg\:prose-lg :where(.lg\:prose-lg > ul > li > *:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 1.3333333em; + } + + .lg\:prose-lg :where(.lg\:prose-lg > ol > li > *:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 1.3333333em; + } + + .lg\:prose-lg :where(.lg\:prose-lg > ol > li > *:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 1.3333333em; + } + + .lg\:prose-lg :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"] *)) { + margin-top: 0.8888889em; + margin-bottom: 0.8888889em; + } + + .lg\:prose-lg :where(hr):not(:where([class~="not-prose"] *)) { + margin-top: 3.1111111em; + margin-bottom: 3.1111111em; + } + + .lg\:prose-lg :where(hr + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; + } + + .lg\:prose-lg :where(h2 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; + } + + .lg\:prose-lg :where(h3 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; + } + + .lg\:prose-lg :where(h4 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; + } + + .lg\:prose-lg :where(table):not(:where([class~="not-prose"] *)) { + font-size: 0.8888889em; + line-height: 1.5; + } + + .lg\:prose-lg :where(thead th):not(:where([class~="not-prose"] *)) { + padding-right: 0.75em; + padding-bottom: 0.75em; + padding-left: 0.75em; + } + + .lg\:prose-lg :where(thead th:first-child):not(:where([class~="not-prose"] *)) { + padding-left: 0; + } + + .lg\:prose-lg :where(thead th:last-child):not(:where([class~="not-prose"] *)) { + padding-right: 0; + } + + .lg\:prose-lg :where(tbody td, tfoot td):not(:where([class~="not-prose"] *)) { + padding-top: 0.75em; + padding-right: 0.75em; + padding-bottom: 0.75em; + padding-left: 0.75em; + } + + .lg\:prose-lg :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"] *)) { + padding-left: 0; + } + + .lg\:prose-lg :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"] *)) { + padding-right: 0; + } + + .lg\:prose-lg :where(.lg\:prose-lg > :first-child):not(:where([class~="not-prose"] *)) { + margin-top: 0; + } + + .lg\:prose-lg :where(.lg\:prose-lg > :last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 0; + } +} diff --git a/assets/img/badges/IzzyOnDroid.png b/static/img/badges/IzzyOnDroid.png similarity index 100% rename from assets/img/badges/IzzyOnDroid.png rename to static/img/badges/IzzyOnDroid.png diff --git a/assets/img/badges/codeberg.png b/static/img/badges/codeberg.png similarity index 100% rename from assets/img/badges/codeberg.png rename to static/img/badges/codeberg.png diff --git a/assets/img/favicon.ico b/static/img/favicon.ico similarity index 100% rename from assets/img/favicon.ico rename to static/img/favicon.ico diff --git a/assets/img/logo.png b/static/img/logo.png similarity index 100% rename from assets/img/logo.png rename to static/img/logo.png diff --git a/assets/img/screenshots/1.png b/static/img/screenshots/1.png similarity index 100% rename from assets/img/screenshots/1.png rename to static/img/screenshots/1.png diff --git a/assets/img/screenshots/2.png b/static/img/screenshots/2.png similarity index 100% rename from assets/img/screenshots/2.png rename to static/img/screenshots/2.png diff --git a/tailwind.config.js b/tailwind.config.js index d1c57b8..2253b89 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,17 +1,13 @@ module.exports = { content: [ - "./_layouts/*.html", - "./_includes/*.html", - "./index.html", - "./developers.html", - "./posts.html", + "./templates/*.html" ], theme: { - extend: { - colors: { - 'moxxy-purple': '#cf4aff', - }, - }, + extend: { + colors: { + 'moxxy-purple': '#cf4aff', + }, + }, }, plugins: [ require('@tailwindcss/typography'), diff --git a/_layouts/default.html b/templates/base.html similarity index 50% rename from _layouts/default.html rename to templates/base.html index c90eb96..568459a 100644 --- a/_layouts/default.html +++ b/templates/base.html @@ -3,17 +3,25 @@ - - - + + + - {% seo %} + {% if page %} + + + {{ page.title }} + {% else %} + + + {{ config.title }} + {% endif %}
- {% include header.html %} + {% include "header.html" %} - {{ content }} + {% block content %}{% endblock %}