diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-10-22 16:34:51 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-10-22 16:34:51 +0000 |
commit | 70cab146df6483df7685cd5b579de9ef4fbe36b5 (patch) | |
tree | 61f57e5f371293b9dfc5e46cf8eb2e06ea981a6a | |
parent | Releasing debian version 0.46-1. (diff) | |
download | jinjax-70cab146df6483df7685cd5b579de9ef4fbe36b5.tar.xz jinjax-70cab146df6483df7685cd5b579de9ef4fbe36b5.zip |
Merging upstream version 0.47+dfsg.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
127 files changed, 325 insertions, 8395 deletions
diff --git a/docs/components/Copyright.jinja b/docs/components/Copyright.jinja deleted file mode 100644 index 473b66b..0000000 --- a/docs/components/Copyright.jinja +++ /dev/null @@ -1,4 +0,0 @@ -<div {{ attrs.render(class="copy") }}> - <p>Website © <a href="https://jpscaletti.com">Juan-Pablo Scaletti</a>.</p> - <p>JinjaX and the documentation text licensed under the MIT license.</p> -</div>
\ No newline at end of file diff --git a/docs/components/Home.jinja b/docs/components/Home.jinja deleted file mode 100644 index 045150b..0000000 --- a/docs/components/Home.jinja +++ /dev/null @@ -1,154 +0,0 @@ -<div class="homepage"> - <section class="hero"> - <h1>JinjaX</h1> - <h2> - Super - <span class="g1">components powers</span> - for your - <span class="g2">Jinja templates</span> - </h2> - </section> - - <section class="code"> - <div class="stack"> - <div class="panel"> - <h2>Before: chaos!</h2> -{% filter markdown %}{% raw %} -```html+jinja -{% extends "layout.html" %} -{% block title %}My title{% endblock %} - -{% from "bunch_of_macros.html" - import card_macro, another_macro %} - -{% block content -%} - <div> - <h2>Hello {{ mistery or "World?" }}</h2> - <div> - {% call card_macro(div="So verbose") %} - {% for product in products %} - {{ another_macro(product) }} - {% endfor %} - {% endcall %} - </div> - </div> - {% with items=products %} - {% include "snippets/pagination.html" %} - {% endwith %} -{%- endblock %} -``` -{% endraw %}{% endfilter %} - </div> - - <div class="panel"> - <h2>After: ✨ clarity ✨</h2> -{% filter markdown %}{% raw %} -```html+jinja -{#def products, msg="World!" #} - -<Layout title="My title"> - <div> - <h2>Hello, {{ msg }}</h2> - <div> - <Card div="So clean"> - {% for product in products %} - <Product product={{ product }} /> - {% endfor %} - </Card> - </div> - </div> - <Paginator items={{ products }} /> -</Layout> -``` -{% endraw %}{% endfilter %} - </div> - </div> - </section> - - <section class="features"> - <h2> - Better than <code>include</code> and <code>macros</code> - </h2> - <div class="cd-cards"> - <article class="card"> - <div class="header"> - <h3>Encapsulated</h3> - <img src="/static/img/encapsulated.svg" width="32" height="32"> - </div> - <div class="body prose prose-zinc"> - <div> - Link to their own <code>css</code> and/or <code>js</code> files - and can be copy/pasted to other projects without modifications. - </div> - </div> - </article> - - <article class="card"> - <div class="header"> - <h3>Simple</h3> - <img src="/static/img/simple.svg" width="32" height="32"> - </div> - <div class="body prose prose-zinc"> - <div> - Just regular Jinja files and no need to import them. - Easier to use and easier to read. - </div> - </div> - </article> - - <article class="card"> - <div class="header"> - <h3>Modern</h3> - <img src="/static/img/modern.svg" width="32" height="32"> - </div> - <div class="body prose prose-zinc"> - <div> - Components works great with - <a href="https://htmx.org/" target="_blank">htmx</a>, - <a href="https://tailwindcss.com/" target="_blank">TailwindCSS</a>, - or <a href="https://hotwired.dev/" target="_blank">Hotwire</a> - </div> - </div> - </article> - - <article class="card"> - <div class="header"> - <h3>Composable</h3> - <img src="/static/img/composable.svg" width="32" height="32"> - </div> - <div class="body prose prose-zinc"> - <div> - Can wrap content (HTML, other components, etc.) in a natural way. - </div> - </div> - </article> - </div> - </section> - - <section class="spaghetti"> - <div class="wrapper"> - <h2> - Say goodbye to spaghetti templates - </h2> - - <div class="text"> - <img src="/static/img/spaghetti_code.png" alt="Spaguetti code"> - - <p>Your Python code should be easy to understand and test.</p> - <p><b>Template code, however, often fails even basic code standards</b>: long methods, deep conditional nesting,and mystery variables everywhere. - </p> - <p><b>But when it's built with components, you see</b> where everything is, understand what are the possible statesof every piece of UI, and know exactly what data need to have. - </p> - <p>You can replace <b>all</b> your templates with components, or start with one section.</p> - </div> - </div> - </section> - - <section class="engage" data-md-skip> - <div class="wrapper"> - <h3>Ready to get going? Engage!</h3> - <a href="./guide/">Get started <i>→</i></a> - <div class="hint">Millions of people clicked a button in the last week alone!</div> - </div> - </section> -</div>
\ No newline at end of file diff --git a/docs/components/Logo.jinja b/docs/components/Logo.jinja deleted file mode 100644 index 3dd9ecd..0000000 --- a/docs/components/Logo.jinja +++ /dev/null @@ -1,7 +0,0 @@ -{#def base_url="/" #} - -<a - {{ attrs.render(class="Logo", href=base_url, title="Back home") }}> - <img class="light" src="/static/img/jinjax-logo.svg" width="140" aria-hidden> - <img class="dark" src="/static/img/jinjax-logo-w.svg" width="140" aria-hidden> -</a> diff --git a/docs/components/NavExtra.jinja b/docs/components/NavExtra.jinja deleted file mode 100644 index e6bb984..0000000 --- a/docs/components/NavExtra.jinja +++ /dev/null @@ -1 +0,0 @@ -<Source title="Go to repo" url="https://github.com/jpsca/jinjax" />
\ No newline at end of file diff --git a/docs/components/NavLinks.jinja b/docs/components/NavLinks.jinja deleted file mode 100644 index fd2e693..0000000 --- a/docs/components/NavLinks.jinja +++ /dev/null @@ -1,2 +0,0 @@ -<a href="/guide/">Documentation</a> -<a href="/ui/">UI components</a> diff --git a/docs/components/SocialCardIndex.jinja b/docs/components/SocialCardIndex.jinja deleted file mode 100644 index 54da150..0000000 --- a/docs/components/SocialCardIndex.jinja +++ /dev/null @@ -1,66 +0,0 @@ -{#def page #} -<Layout - title={{ page.title }} - description={{ page.description }} -> - <style> - body { - background-color: black; - } - .sc1 { - width: 1200px; - height: 630px; - margin: 0; - font-family: SF Pro Display, system-ui, sans-serif; - color: black; - background-color: white - } - .sc1 > * { - position: absolute; - left: 100px; - width: 900px; - text-align: center; - overflow: hidden; - } - .sc1__logo { - top: 100px; - } - .sc1__logo img { - display: inline-block; - height: 200px; - width: auto; - margin: 0 auto; - } - .sc1__description { - top: 350px; - font-weight: bold; - font-size: 60px; - line-height: 1.2; - letter-spacing: -0.05em; - text-align: center; - } - .sc1__description .g1 { - background-image: linear-gradient(to bottom right, #fbbf24, #fb923c); - background-clip: text; - color: transparent; - } - - .sc1__description .g2 { - background-image: linear-gradient(to bottom right, #34d399, #3b82f6); - background-clip: text; - color: transparent; - } - </style> - - <article class="sc1"> - <div class="sc1__logo"> - <img src="/static/img/jinjax-logo.png" /> - </div> - <div class="sc1__description"> - Super - <span class="g1">components powers</span> - for your - <span class="g2">Jinja templates</span> - </div> - </article> -</Layout> diff --git a/docs/components/guide/slots/CompArchive.jinja b/docs/components/guide/slots/CompArchive.jinja deleted file mode 100644 index dc242fe..0000000 --- a/docs/components/guide/slots/CompArchive.jinja +++ /dev/null @@ -1,10 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -{#def posts #} -<Layout title="Archive"> - {% for post in posts %} - <Post post={post} /> - {% endfor %} -</Layout> -``` -{% endraw %}{% endfilter %}
\ No newline at end of file diff --git a/docs/components/guide/slots/CompLayout.jinja b/docs/components/guide/slots/CompLayout.jinja deleted file mode 100644 index 86c482e..0000000 --- a/docs/components/guide/slots/CompLayout.jinja +++ /dev/null @@ -1,14 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -{#def title #} -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="utf-8"> - <title>{{ title }}</title> -</head> -<body> - {{ content }} -</body> -``` -{% endraw %}{% endfilter %}
\ No newline at end of file diff --git a/docs/components/guide/slots/Modal.jinja b/docs/components/guide/slots/Modal.jinja deleted file mode 100644 index c2a9f66..0000000 --- a/docs/components/guide/slots/Modal.jinja +++ /dev/null @@ -1,7 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -<dialog class="modal"> - {{ content }} -</dialog> -``` -{% endraw %}{% endfilter %}
\ No newline at end of file diff --git a/docs/components/guide/slots/ModalBody.jinja b/docs/components/guide/slots/ModalBody.jinja deleted file mode 100644 index 66794ce..0000000 --- a/docs/components/guide/slots/ModalBody.jinja +++ /dev/null @@ -1,7 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -<div class="modal-body"> - {{ content }} -</div> -``` -{% endraw %}{% endfilter %}
\ No newline at end of file diff --git a/docs/components/guide/slots/ModalFooter.jinja b/docs/components/guide/slots/ModalFooter.jinja deleted file mode 100644 index e4eac26..0000000 --- a/docs/components/guide/slots/ModalFooter.jinja +++ /dev/null @@ -1,7 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -<footer class="modal-footer"> - {{ content }} -</footer> -``` -{% endraw %}{% endfilter %}
\ No newline at end of file diff --git a/docs/components/guide/slots/ModalHeader.jinja b/docs/components/guide/slots/ModalHeader.jinja deleted file mode 100644 index 6f5bc52..0000000 --- a/docs/components/guide/slots/ModalHeader.jinja +++ /dev/null @@ -1,10 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -<header class="modal-header> - <h2 class="modal-title"> - {{ content }} - </h2> - <CloseButton /> -</header> -``` -{% endraw %}{% endfilter %}
\ No newline at end of file diff --git a/docs/components/ui/Accordion/Accordion.css b/docs/components/ui/Accordion/Accordion.css deleted file mode 100644 index e39911b..0000000 --- a/docs/components/ui/Accordion/Accordion.css +++ /dev/null @@ -1,67 +0,0 @@ -@scope (#accordion-demo) { - :scope { - position: relative; - display: block; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 4rem 0.5rem 0; - height: 360px; - margin: 0 auto; - } - @media (min-width: 38rem) { - :scope { - width: 36rem; - } - } - - details { - margin: 0; - border-width: 1px; - border-color: rgb(212 212 212); - background-color: rgb(245 245 245); - padding: 0; - overflow: hidden; - height: 3.5rem; - transition: all 0.15s ease-in-out; - } - details[open] { - height: 10rem; - } - details:focus-within { - box-shadow: 0 1px 2px 0 #2563eb; - } - details:first-of-type { - margin-top: 0px; - border-top-left-radius: 0.375rem; - border-top-right-radius: 0.375rem; - } - details:last-of-type { - margin-bottom: 0px; - border-bottom-left-radius: 0.375rem; - border-bottom-right-radius: 0.375rem; - } - - summary { - position: relative; - height: 3.5rem; - border-bottom-width: 1px; - border-color: transparent; - background-color: rgb(255, 255, 255); - padding: 1rem 1.25rem; - color: rgb(0, 0, 0); - cursor: default; - } - details[open] > summary { - border-color: rgb(229 229 229); - } - - .panel { - color: rgb(82 82 82); - padding: 0 1.25rem; - padding: 0.75rem 1.25rem; - } - .panel code { - font-weight: bold; - } -}
\ No newline at end of file diff --git a/docs/components/ui/Accordion/DemoCSS.jinja b/docs/components/ui/Accordion/DemoCSS.jinja deleted file mode 100644 index d256041..0000000 --- a/docs/components/ui/Accordion/DemoCSS.jinja +++ /dev/null @@ -1,51 +0,0 @@ -{% filter markdown %}{% raw %} -```css -@scope (#accordion-demo) { - details { - margin: 0; - border-width: 1px; - border-color: rgb(212 212 212); - background-color: rgb(245 245 245); - padding: 0; - overflow: hidden; - height: 3.5rem; - width: 36rem; - transition: all 0.15s ease-in-out; - } - details[open] { - height: 10rem; - } - details:focus-within { - box-shadow: 0 1px 2px 0 #2563eb; - } - details:first-of-type { - margin-top: 0px; - border-top-left-radius: 0.375rem; - border-top-right-radius: 0.375rem; - } - details:last-of-type { - margin-bottom: 0px; - border-bottom-left-radius: 0.375rem; - border-bottom-right-radius: 0.375rem; - } - summary { - position: relative; - height: 3.5rem; - border-bottom-width: 1px; - border-color: transparent; - background-color: rgb(255, 255, 255); - padding: 1rem 1.25rem; - color: rgb(0, 0, 0); - cursor: default; - } - details[open] > summary { - border-color: rgb(229 229 229); - } - .panel { - color: rgb(82 82 82); - padding: 0 1.25rem; - padding: 0.75rem 1.25rem; - } -} -``` -{% endraw %}{% endfilter %}
\ No newline at end of file diff --git a/docs/components/ui/Accordion/DemoHTML.jinja b/docs/components/ui/Accordion/DemoHTML.jinja deleted file mode 100644 index 1e28d29..0000000 --- a/docs/components/ui/Accordion/DemoHTML.jinja +++ /dev/null @@ -1,29 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -<Accordion> - <details> - <summary>Is it accessible?</summary> - <div class="panel"> - Yes, more than any custom accordion you'll find on the web, because it's made - with native elements. - </div> - </details> - - <details> - <summary>Is it unstyled?</summary> - <div class="panel"> - Yes. The Accordion doesn't need any styles, you are free to style your - <code><details></code> elements however you need. - </div> - </details> - - <details> - <summary>Can it be animated?</summary> - <div class="panel"> - The <code><details></code> elements can be animated (with some restrictions) - using CSS animations, or with JS. - </div> - </details> -</Accordion> -``` -{% endraw %}{% endfilter %} diff --git a/docs/components/ui/Accordion/DemoResult.jinja b/docs/components/ui/Accordion/DemoResult.jinja deleted file mode 100644 index 8666e2d..0000000 --- a/docs/components/ui/Accordion/DemoResult.jinja +++ /dev/null @@ -1,32 +0,0 @@ -{#css ui/Accordion/Accordion.css #} - -<div class="bg-cover" - style="background-image:linear-gradient(to right, rgba(252,211,77, 0.9), rgba(251,146,60, 0.9))" - data-md-skip -></div> - -<Accordion id="accordion-demo" data-md-skip> - <details> - <summary>Is it accessible?</summary> - <div class="panel"> - Yes, more than any custom accordion you'll find on the web, because it's made - with native elements. - </div> - </details> - - <details> - <summary>Is it unstyled?</summary> - <div class="panel"> - Yes. The Accordion doesn't need any styles, you are free to style your - <code><details></code> elements however you need. - </div> - </details> - - <details> - <summary>Can it be animated?</summary> - <div class="panel"> - The <code><details></code> elements can be animated (with some restrictions) - using CSS animations, or with JS. - </div> - </details> -</Accordion>
\ No newline at end of file diff --git a/docs/components/ui/Dialog/DemoCode.jinja b/docs/components/ui/Dialog/DemoCode.jinja deleted file mode 100644 index 36ecb76..0000000 --- a/docs/components/ui/Dialog/DemoCode.jinja +++ /dev/null @@ -1,6 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -{# Style classes and some content removed for clarity #} - -``` -{% endraw %}{% endfilter %} diff --git a/docs/components/ui/Dialog/DemoPreview.jinja b/docs/components/ui/Dialog/DemoPreview.jinja deleted file mode 100644 index e69de29..0000000 --- a/docs/components/ui/Dialog/DemoPreview.jinja +++ /dev/null diff --git a/docs/components/ui/LinkedList/DemoCSS.jinja b/docs/components/ui/LinkedList/DemoCSS.jinja deleted file mode 100644 index 0927d4e..0000000 --- a/docs/components/ui/LinkedList/DemoCSS.jinja +++ /dev/null @@ -1,83 +0,0 @@ -{% filter markdown %}{% raw %} -```css -.ui-linkedlist { - padding: 0px; - background-color: rgb(255 255 255); - overscroll-behavior: contain; - overflow-y: scroll; - list-style-type: none; - height: 16rem; - margin: 0px; - border: 1px solid rgb(128 128 128); - border-radius: 0.25rem; - font-size: 0.85rem; -} -.ui-linkedlist li { - cursor: pointer; - display: flex; - padding: 0.25rem 1rem; - align-items: center; -} -.ui-linkedlist li[disabled] { - color: rgb(156 156 156); - cursor: default; -} -.ui-linkedlist li:hover { - background-color: rgb(243 244 246); -} -.ui-linkedlist input[type="checkbox"] { - margin-right: 0.5rem; -} -label { - display: inline-block; - font-weight: bold; - background-color: white; - padding: 0.25rem 2rem; - border: 1px solid rgb(128 128 128); - border-radius: 0.25rem 0.25rem 0 0; - font-size: 0.7rem; - margin-bottom: -1px; -} - -button { - margin-top: 0.5rem; - display: inline-flex; - cursor: pointer; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - align-items: center; - justify-content: center; -} -button > :not([hidden]) ~ :not([hidden]) { - margin-left: 0.25rem; -} -button { - white-space: nowrap; - border-radius: 0.25rem; - border: 1px solid transparent; - background-color: rgb(229 231 235); - padding: 0.5rem 0.75rem; - text-align: center; - font-size: 0.75rem; - line-height: 1rem; -} -button:hover { - border-color: rgb(219 234 254); - background-color: rgb(243 244 246); -} -button:focus { - background-color: rgb(229 231 235); - outline-offset: 1px; - outline-color: #3b82f6; -} -@media (min-width: 640px) { - button { - padding: 0.25rem 0.5rem; - } -} -button.select-all { - float: right; -} -``` -{% endraw %}{% endfilter %}
\ No newline at end of file diff --git a/docs/components/ui/LinkedList/DemoHTML.jinja b/docs/components/ui/LinkedList/DemoHTML.jinja deleted file mode 100644 index 375ddd7..0000000 --- a/docs/components/ui/LinkedList/DemoHTML.jinja +++ /dev/null @@ -1,35 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -<div> - <label>Known Mutants</label> - <LinkedList id="linkedlist-demo-list1" linked_to="linkedlist-demo-list2"> - <li><input type="checkbox" name="users" value="1" /> - Alexander Summers</li> - <!-- ... etc ... --> - <li><input type="checkbox" name="users" value="27" /> - Warren Worthington III</li> - </LinkedList> - - <button - type="button" - class="select-all" - onclick="document.getElementById('linkedlist-demo-list1').dispatchEvent(new CustomEvent('jxui:linked:sendall'));" - > - Select all » - </button> -</div> -<div> - <label>X-Men</label> - <LinkedList id="linkedlist-demo-list2" linked_to="linkedlist-demo-list1" active> - </LinkedList> - - <button - type="button" - class="remove-all" - onclick="document.getElementById('linkedlist-demo-list2').dispatchEvent(new CustomEvent('jxui:linked:sendall'));" - > - « Remove all - </button> -</div> -``` -{% endraw %}{% endfilter %}
\ No newline at end of file diff --git a/docs/components/ui/LinkedList/DemoResult.jinja b/docs/components/ui/LinkedList/DemoResult.jinja deleted file mode 100644 index e3d9631..0000000 --- a/docs/components/ui/LinkedList/DemoResult.jinja +++ /dev/null @@ -1,89 +0,0 @@ -{#css ui/LinkedList/LinkedList.css #} - -<div class="bg-cover" - style="background-image:linear-gradient(to right, rgba(132,204,22,0.7), rgba(22,163,74,0.7))" - data-md-skip -></div> - -<div id="linkedlist-demo" data-md-skip> - <div> - <label>Known Mutants</label> - <LinkedList id="linkedlist-demo-list1" linked_to="linkedlist-demo-list2"> - <li><input type="checkbox" name="users" value="1" /> - Alexander Summers</li> - <li><input type="checkbox" name="users" value="2" /> - Alison Blaire</li> - <li><input type="checkbox" name="users" value="3" /> - Anna Marie LeBeau</li> - <li><input type="checkbox" name="users" value="4" /> - Charles Francis Xavier</li> - <li><input type="checkbox" name="users" value="5" /> - Elizabeth Braddock</li> - <li><input type="checkbox" name="users" value="6" /> - Emma Grace Frost</li> - <li disabled><input type="checkbox" name="users" value="7" disabled /> - Erik Magnus Lehnsherr</li> - <li><input type="checkbox" name="users" value="8" /> - Henry Philip McCoy</li> - <li><input type="checkbox" name="users" value="9" /> - James Howlett</li> - <li><input type="checkbox" name="users" value="10" /> - Jean Elaine Grey</li> - <li><input type="checkbox" name="users" value="11" /> - John Proudstar</li> - <li><input type="checkbox" name="users" value="12" /> - Jubilation Lee</li> - <li><input type="checkbox" name="users" value="13" /> - Katherine Anne Pryde</li> - <li><input type="checkbox" name="users" value="14" /> - Kurt Wagner</li> - <li><input type="checkbox" name="users" value="15" /> - Lucas Bishop</li> - <li><input type="checkbox" name="users" value="16" /> - Nathan Summers</li> - <li><input type="checkbox" name="users" value="17" /> - Ororo Munroe</li> - <li><input type="checkbox" name="users" value="18" /> - Piotr Nikolaievitch Rasputin</li> - <li><input type="checkbox" name="users" value="19 - Rachel Anne Summers</li> - <li><input type="checkbox" name="users" value="20" /> - Raven Darkhölme</li> - <li><input type="checkbox" name="users" value="21" /> - Remy Etienne LeBeau</li> - <li><input type="checkbox" name="users" value="22" /> - Robert Louis Drake</li> - <li><input type="checkbox" name="users" value="23" /> - Roberto da Costa</li> - <li><input type="checkbox" name="users" value="24" /> - Scott Summers</li> - <li><input type="checkbox" name="users" value="25" /> - Sean Cassidy</li> - <li><input type="checkbox" name="users" value="26" /> - Shiro Yoshida</li> - <li><input type="checkbox" name="users" value="27" /> - Warren Worthington III</li> - </LinkedList> - - <button - type="button" - class="select-all" - onclick="document.getElementById('linkedlist-demo-list1').dispatchEvent(new CustomEvent('jxui:linked:sendall'));" - > - Select all » - </button> - </div> - <div> - <label>X-Men</label> - <LinkedList id="linkedlist-demo-list2" linked_to="linkedlist-demo-list1" active> - </LinkedList> - - <button - type="button" - class="remove-all" - onclick="document.getElementById('linkedlist-demo-list2').dispatchEvent(new CustomEvent('jxui:linked:sendall'));" - > - « Remove all - </button> - </div> -</div>
\ No newline at end of file diff --git a/docs/components/ui/LinkedList/LinkedList.css b/docs/components/ui/LinkedList/LinkedList.css deleted file mode 100644 index fd69adc..0000000 --- a/docs/components/ui/LinkedList/LinkedList.css +++ /dev/null @@ -1,96 +0,0 @@ -@scope (#linkedlist-demo) { - :scope { - position: relative; - display: block; - display: flex; - align-items: center; - justify-content: center; - padding: 0.5rem; - height: 360px; - margin: 0 auto; - } - :scope > div { - width: 100%; - margin: 0 1rem; - } - - .ui-linkedlist { - padding: 0px; - background-color: rgb(255 255 255); - overscroll-behavior: contain; - overflow-y: scroll; - list-style-type: none; - height: 16rem; - margin: 0px; - border: 1px solid rgb(128 128 128); - border-radius: 0.25rem; - font-size: 0.85rem; - } - .ui-linkedlist li { - cursor: pointer; - display: flex; - padding: 0.25rem 1rem; - align-items: center; - } - .ui-linkedlist li[disabled] { - color: rgb(156 156 156); - cursor: default; - } - .ui-linkedlist li:hover { - background-color: rgb(243 244 246); - } - .ui-linkedlist input[type="checkbox"] { - margin-right: 0.5rem; - } - label { - display: inline-block; - font-weight: bold; - background-color: white; - padding: 0.25rem 2rem; - border: 1px solid rgb(128 128 128); - border-radius: 0.25rem 0.25rem 0 0; - font-size: 0.7rem; - margin-bottom: -1px; - } - - button { - margin-top: 0.5rem; - display: inline-flex; - cursor: pointer; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - align-items: center; - justify-content: center; - } - button > :not([hidden]) ~ :not([hidden]) { - margin-left: 0.25rem; - } - button { - white-space: nowrap; - border-radius: 0.25rem; - border: 1px solid transparent; - background-color: rgb(229 231 235); - padding: 0.5rem 0.75rem; - text-align: center; - font-size: 0.75rem; - line-height: 1rem; - } - button:hover { - border-color: rgb(219 234 254); - background-color: rgb(243 244 246); - } - button:focus { - background-color: rgb(229 231 235); - outline-offset: 1px; - outline-color: #3b82f6; - } - @media (min-width: 640px) { - button { - padding: 0.25rem 0.5rem; - } - } - button.select-all { - float: right; - } -}
\ No newline at end of file diff --git a/docs/components/ui/Menu/DemoCSS.jinja b/docs/components/ui/Menu/DemoCSS.jinja deleted file mode 100644 index d726800..0000000 --- a/docs/components/ui/Menu/DemoCSS.jinja +++ /dev/null @@ -1,131 +0,0 @@ -{% filter markdown %}{% raw %} -```css -@scope (#menu-demo) { - :scope { - position: relative; - display: block; - padding: 2rem 0.5rem 0; - height: 300px; - margin: 0 auto; - } - - .ui-menubutton { - border-radius: 0.25rem; - border-width: 1px; - background-color: rgb(0 0 0 / 0.1); - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 1rem; - padding-right: 1rem; - font-weight: 600; - color: white; - display: flex; - align-items: center; - justify-content: center; - box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), - 0 4px 6px -4px rgb(0 0 0 / 0.1); - width: fit-content; - margin: 0 auto; - } - .ui-menubutton:hover { - background-color: rgb(0 0 0 / 0.2); - } - .ui-menubutton .icon { - margin-left: 0.25rem; - } - - .group:not([hidden]) ~ .group:not([hidden]) { - border-top: 1px solid #d1d5db; - } - .ui-menu { - margin-top: 4px; - padding: 8px 0; - border-radius: 8px; - width: 400px; - background-color: #ffffff; - box-shadow: 0 1px 3px 4px rgba(0, 0, 0, 0.2); - overflow: visible; - font-size: 0.9rem; - font-weight: 400; - transition: all 0.2s allow-discrete; - /* Final state of the exit animation */ - opacity: 0; - transform: translateY(-1rem); - } - .ui-menu:popover-open { - opacity: 1; - transform: translateY(0); - } - /* Needs to be after the previous .ui-menu:popover-open rule - to take effect, as the specificity is the same */ - @starting-style { - .ui-menu:popover-open { - opacity: 0; - transform: translateY(-1rem); - } - } - .ui-menu:focus { - outline: none; - } - .ui-menu .ui-menu { - position: absolute; - margin: 0 0 0 -4px; - width: 300px; - z-index: 1; - transition: opacity 0.2s allow-discrete; - } - .ui-menu * { - user-select: none; - } - - .ui-menuitem { - display: flex; - height: 40px; - padding-left: 24px; - padding-right: 24px; - align-items: center; - justify-items: flex-start; - line-height: 40px; - color: #000000; - background-color: #ffffff; - cursor: default; - user-select: none; - position: relative; - text-align: left; - } - .ui-menuitem.ui-selected { - background-color: #f2e7e4; - } - .ui-menuitem.ui-disabled { - color: #5f6368; - } - .ui-menuitem > .icon { - font-size: 1rem; - width: 24px; - text-align: left; - } - .ui-menuitem.ui-disabled > .icon { - color: #aca6a7; - } - .ui-menuitem > a { - flex-grow: 1; - } - .ui-menuitem > kbd { - visibility: hidden; - margin-left: auto; - font-size: 0.9rem; - font-family: inherit; - text-align: right; - color: #524f50; - } - .ui-menuitem:not(.ui-disabled):hover > kbd { - visibility: visible; - } - .ui-menuitem > .arrow { - margin-left: auto; - font-size: 0.7rem; - text-align: right; - } -} -``` -{% endraw %}{% endfilter %} diff --git a/docs/components/ui/Menu/DemoHTML.jinja b/docs/components/ui/Menu/DemoHTML.jinja deleted file mode 100644 index 60c126a..0000000 --- a/docs/components/ui/Menu/DemoHTML.jinja +++ /dev/null @@ -1,89 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -<MenuButton id="menu-demo-btn" target="menu-demo-menu"> - Menu <i class="icon">keyboard_arrow_down</i> -</MenuButton> - -<Menu id="menu-demo-menu" anchor="menu-demo-btn" anchor-to="bottom end"> - <div class="group"> - <MenuItem> - <i class="icon">tab</i> - <a>New tab</a> - <kbd>Ctrl+T</kbd> - </MenuItem> - <MenuItem> - <i class="icon">new_window</i> - <a>New window</a> - <kbd>Ctrl+N</kbd> - </MenuItem> - <MenuItem disabled> - <i class="icon">fingerprint_off</i> - <a>Disabled item</a> - <kbd>Ctrl+Shift+N</kbd> - </MenuItem> - </div> - <div class="group"> - <MenuItem> - <i class="icon">download</i> - <a>Downloads</a> - <kbd>Ctrl+J</kbd> - </MenuItem> - <MenuItemSub id="bookmarks-item"> - <i class="icon">bookmarks</i> - <a>Bookmarks and lists</a> - <span class="icon arrow">keyboard_arrow_right</span> - - <Menu anchor="bookmarks-item" anchor_to="right start"> - <div class="group"> - <MenuItem> - <i class="icon">bookmark_add</i> - <a>Bookmark this tab...</a> - <kbd>Ctrl+D</kbd> - </MenuItem> - <MenuItem> - <i class="icon">bookmarks</i> - <a>Bookmark all tabs...</a> - <kbd>Ctrl+Shift+D</kbd> - </MenuItem> - </div> - <div class="group"> - <MenuItem> - <i class="icon">toolbar</i> - <a>Hide bookmarks bar</a> - <kbd>Ctrl+Shift+B</kbd> - </MenuItem> - <MenuItem> - <i class="icon">bookmarks</i> - <a>Show all bookmarks</a> - </MenuItem> - <MenuItem> - <i class="icon">bookmark_manager</i> - <a>Bookmark manager</a> - <kbd>Ctrl+Shift+O</kbd> - </MenuItem> - </div> - </Menu> - </MenuItemSub> - </div> - <div class="group"> - <MenuItem> - <i class="icon">print</i> - <a>Print...</a> - <kbd>Ctrl+P</kbd> - </MenuItem> - <MenuItem> - <i class="icon">help</i> - <a>Help</a> - </MenuItem> - <MenuItem> - <i class="icon">settings</i> - <a>Settings</a> - </MenuItem> - <MenuItem> - <i class="icon">exit_to_app</i> - <a>Exit</a> - </MenuItem> - </div> -</Menu> -``` -{% endraw %}{% endfilter %} diff --git a/docs/components/ui/Menu/DemoResult.jinja b/docs/components/ui/Menu/DemoResult.jinja deleted file mode 100644 index b62226c..0000000 --- a/docs/components/ui/Menu/DemoResult.jinja +++ /dev/null @@ -1,94 +0,0 @@ -{#css ui/Menu/Menu.css #} - -<div class="bg-cover" - style="background-image:linear-gradient(to right, rgba(244,114,182, 0.9), rgba(219,39,119, 0.9))" - data-md-skip -></div> - -<div id="menu-demo" data-md-skip> - <MenuButton id="menu-demo-btn" target="menu-demo-menu"> - Menu <i class="icon">keyboard_arrow_down</i> - </MenuButton> - - <Menu id="menu-demo-menu" anchor="menu-demo-btn" anchor-to="bottom end"> - <div class="group"> - <MenuItem> - <i class="icon">tab</i> - <a>New tab</a> - <kbd>Ctrl+T</kbd> - </MenuItem> - <MenuItem> - <i class="icon">new_window</i> - <a>New window</a> - <kbd>Ctrl+N</kbd> - </MenuItem> - <MenuItem disabled> - <i class="icon">fingerprint_off</i> - <a>Disabled item</a> - <kbd>Ctrl+Shift+N</kbd> - </MenuItem> - </div> - <div class="group"> - <MenuItem> - <i class="icon">download</i> - <a>Downloads</a> - <kbd>Ctrl+J</kbd> - </MenuItem> - <MenuItemSub id="bookmarks-item"> - <i class="icon">bookmarks</i> - <a>Bookmarks and lists</a> - <span class="icon arrow">keyboard_arrow_right</span> - - <Menu anchor="bookmarks-item" anchor_to="right start"> - <div class="group"> - <MenuItem> - <i class="icon">bookmark_add</i> - <a>Bookmark this tab...</a> - <kbd>Ctrl+D</kbd> - </MenuItem> - <MenuItem> - <i class="icon">bookmarks</i> - <a>Bookmark all tabs...</a> - <kbd>Ctrl+Shift+D</kbd> - </MenuItem> - </div> - <div class="group"> - <MenuItem> - <i class="icon">toolbar</i> - <a>Hide bookmarks bar</a> - <kbd>Ctrl+Shift+B</kbd> - </MenuItem> - <MenuItem> - <i class="icon">bookmarks</i> - <a>Show all bookmarks</a> - </MenuItem> - <MenuItem> - <i class="icon">bookmark_manager</i> - <a>Bookmark manager</a> - <kbd>Ctrl+Shift+O</kbd> - </MenuItem> - </div> - </Menu> - </MenuItemSub> - </div> - <div class="group"> - <MenuItem> - <i class="icon">print</i> - <a>Print...</a> - <kbd>Ctrl+P</kbd> - </MenuItem> - <MenuItem> - <i class="icon">help</i> - <a>Help</a> - </MenuItem> - <MenuItem> - <i class="icon">settings</i> - <a>Settings</a> - </MenuItem> - <MenuItem> - <i class="icon">exit_to_app</i> - <a>Exit</a> - </MenuItem> - </div> - </Menu> -</div> diff --git a/docs/components/ui/Menu/Menu.css b/docs/components/ui/Menu/Menu.css deleted file mode 100644 index a93313d..0000000 --- a/docs/components/ui/Menu/Menu.css +++ /dev/null @@ -1,127 +0,0 @@ -@scope (#menu-demo) { - :scope { - position: relative; - display: block; - padding: 2rem 0.5rem 0; - height: 200px; - margin: 0 auto; - } - - .ui-menubutton { - border-radius: 0.25rem; - border-width: 1px; - background-color: rgb(0 0 0 / 0.1); - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 1rem; - padding-right: 1rem; - font-weight: 600; - color: white; - display: flex; - align-items: center; - justify-content: center; - box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), - 0 4px 6px -4px rgb(0 0 0 / 0.1); - width: fit-content; - margin: 0 auto; - } - .ui-menubutton:hover { - background-color: rgb(0 0 0 / 0.2); - } - .ui-menubutton .icon { - margin-left: 0.25rem; - } - - .group:not([hidden]) ~ .group:not([hidden]) { - border-top: 1px solid #d1d5db; - } - .ui-menu { - margin-top: 4px; - padding: 8px 0; - border-radius: 8px; - width: 400px; - background-color: #ffffff; - box-shadow: 0 1px 3px 4px rgba(0, 0, 0, 0.2); - overflow: visible; - font-size: 0.9rem; - font-weight: 400; - transition: all 0.2s allow-discrete; - /* Final state of the exit animation */ - opacity: 0; - transform: translateY(-1rem); - } - .ui-menu:popover-open { - opacity: 1; - transform: translateY(0); - } - /* Needs to be after the previous .ui-menu:popover-open rule - to take effect, as the specificity is the same */ - @starting-style { - .ui-menu:popover-open { - opacity: 0; - transform: translateY(-1rem); - } - } - .ui-menu:focus { - outline: none; - } - .ui-menu .ui-menu { - position: absolute; - margin: 0 0 0 -4px; - width: 300px; - z-index: 1; - transition: opacity 0.2s allow-discrete; - } - .ui-menu * { - user-select: none; - } - - .ui-menuitem { - display: flex; - height: 40px; - padding-left: 24px; - padding-right: 24px; - align-items: center; - justify-items: flex-start; - line-height: 40px; - color: #000000; - background-color: #ffffff; - cursor: default; - user-select: none; - position: relative; - text-align: left; - } - .ui-menuitem.ui-selected { - background-color: #f2e7e4; - } - .ui-menuitem.ui-disabled { - color: #5f6368; - } - .ui-menuitem > .icon { - font-size: 1rem; - width: 24px; - text-align: left; - } - .ui-menuitem.ui-disabled > .icon { - color: #aca6a7; - } - .ui-menuitem > a { - flex-grow: 1; - } - .ui-menuitem > kbd { - visibility: hidden; - margin-left: auto; - font-size: 0.9rem; - font-family: inherit; - text-align: right; - color: #524f50; - } - .ui-menuitem:not(.ui-disabled):hover > kbd { - visibility: visible; - } - .ui-menuitem > .arrow { - margin-left: auto; - font-size: 0.7rem; - text-align: right; - } -}
\ No newline at end of file diff --git a/docs/components/ui/Popover/DemoCSS.jinja b/docs/components/ui/Popover/DemoCSS.jinja deleted file mode 100644 index 83418c9..0000000 --- a/docs/components/ui/Popover/DemoCSS.jinja +++ /dev/null @@ -1,96 +0,0 @@ -{% filter markdown %}{% raw %} -```css -.ui-popbutton { - border-radius: 0.25rem; - border-width: 1px; - background-color: rgb(0 0 0 / 0.1); - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 1rem; - padding-right: 1rem; - font-weight: 600; - color: white; - box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), - 0 4px 6px -4px rgb(0 0 0 / 0.1); -} -.ui-popbutton:hover { - background-color: rgb(0 0 0 / 0.2); -} - -[popover] { - background-color: Canvas; - border-radius: 0.25rem; - border: 1px solid #666; - color: CanvasText; - height: fit-content; - margin: 0.75rem auto 0; - padding: 1rem; - width: 15rem; - overflow: visible; - transition: all 0.2s allow-discrete; - /* Final state of the exit animation */ - opacity: 0; - transform: translateY(-3rem); -} -[popover]:popover-open { - opacity: 1; - transform: translateY(0); -} -/* Needs to be after the previous [popover]:popover-open rule -to take effect, as the specificity is the same */ -@starting-style { - [popover]:popover-open { - opacity: 0; - transform: translateY(-3rem); - } -} - -/* Transition for the popover's backdrop */ -[popover]::backdrop { - transition: all 0.2s allow-discrete; - /* Final state of the exit animation */ - background-color: rgb(0 0 0 / 0%); -} -[popover]:popover-open::backdrop { - background-color: rgb(0 0 0 / 15%); -} -/* The nesting selector (&) cannot represent pseudo-elements -so this starting-style rule cannot be nested */ -@starting-style { - [popover]:popover-open::backdrop { - background-color: rgb(0 0 0 / 0%); - } -} - -[popover] h1 { - font-weight: bold; - margin-bottom: 0.75rem; -} -[popover] label { - display: flex; - align-items: center; - justify-content: space-between; - font-size: 0.75rem; - line-height: 1rem; -} -[popover] input { - margin-left: auto; - width: 66.666667%; - border-radius: 0.25rem; - border-width: 1px; - padding: 0.25rem; - font-size: 0.75rem; - line-height: 1rem; -} -[popover] svg.arrow { - position: absolute; - top: -4px; - left: 50%; - z-index: 10; - display: block; - transform: rotate(180deg); - border-color: rgb(255 255 255); - fill: white; -} -``` -{% endraw %}{% endfilter %} diff --git a/docs/components/ui/Popover/DemoHTML.jinja b/docs/components/ui/Popover/DemoHTML.jinja deleted file mode 100644 index b40ddfb..0000000 --- a/docs/components/ui/Popover/DemoHTML.jinja +++ /dev/null @@ -1,23 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -<PopButton id="pop-demo-btn" target="pop-demo-pop">Open popover</PopButton> - -<Popover id="pop-demo-pop" anchor="pop-demo-btn" anchor-to="bottom"> - <h1>Edit Dimensions</h1> - <fieldset class="space-y-2"> - <label> - <span>Width</span> - <input type="text" name="width" value="340px"> - </label> - <label> - <span>Height</span> - <input type="text" name="height" value="25px"> - </label> - </fieldset> - - <svg class="arrow" width="10" height="5" viewBox="0 0 30 10" aria-hidden="true"> - <polygon points="0,0 30,0 15,10"></polygon> - </svg> -</Popover> -``` -{% endraw %}{% endfilter %} diff --git a/docs/components/ui/Popover/DemoResult.jinja b/docs/components/ui/Popover/DemoResult.jinja deleted file mode 100644 index a0b73e8..0000000 --- a/docs/components/ui/Popover/DemoResult.jinja +++ /dev/null @@ -1,27 +0,0 @@ -{#css ui/Popover/Popover.css #} - -<div class="bg-cover" - style="background-image:linear-gradient(to right, rgba(217,70,239, 0.9), rgba(147,51,234, 0.9))" - data-md-skip -></div> - -<div id="pop-demo" data-md-skip> - <PopButton id="pop-demo-btn" target="pop-demo-pop">Open popover</PopButton> - - <Popover id="pop-demo-pop" anchor="pop-demo-btn" anchor-to="bottom"> - <h1 data-outline-skip=>Edit Dimensions</h1> - <fieldset class="space-y-2"> - <label> - <span>Width</span> - <input type="text" name="width" value="340px"> - </label> - <label> - <span>Height</span> - <input type="text" name="height" value="25px"> - </label> - </fieldset> - <svg class="arrow" width="10" height="5" viewBox="0 0 30 10" aria-hidden="true"> - <polygon points="0,0 30,0 15,10"></polygon> - </svg> - </Popover> -</div> diff --git a/docs/components/ui/Popover/Popover.css b/docs/components/ui/Popover/Popover.css deleted file mode 100644 index 724547f..0000000 --- a/docs/components/ui/Popover/Popover.css +++ /dev/null @@ -1,101 +0,0 @@ -@scope (#pop-demo) { - :scope { - position: relative; - display: block; - padding: 2rem 0.5rem 0; - height: 300px; - margin: 0 auto; - text-align: center; - } - - .ui-popbutton { - border-radius: 0.25rem; - border-width: 1px; - background-color: rgb(0 0 0 / 0.1); - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 1rem; - padding-right: 1rem; - font-weight: 600; - color: white; - box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), - 0 4px 6px -4px rgb(0 0 0 / 0.1); - } - .ui-popbutton:hover { - background-color: rgb(0 0 0 / 0.2); - } - - [popover] { - background-color: Canvas; - border-radius: 0.25rem; - border: 1px solid #666; - color: CanvasText; - height: fit-content; - margin: 0.75rem auto 0; - padding: 1rem; - width: 15rem; - overflow: visible; - transition: all 0.2s allow-discrete; - /* Final state of the exit animation */ - opacity: 0; - transform: translateY(-3rem); - } - [popover]:popover-open { - opacity: 1; - transform: translateY(0); - } - /* Needs to be after the previous [popover]:popover-open rule - to take effect, as the specificity is the same */ - @starting-style { - [popover]:popover-open { - opacity: 0; - transform: translateY(-3rem); - } - } - - /* Transition for the popover's backdrop */ - [popover]::backdrop { - /* Final state of the exit animation */ - background-color: rgb(0 0 0 / 0%); - transition: all 0.2s allow-discrete; - } - [popover]:popover-open::backdrop { - background-color: rgb(0 0 0 / 15%); - } - @starting-style { - [popover]:popover-open::backdrop { - background-color: rgb(0 0 0 / 0%); - } - } - - [popover] h1 { - font-weight: bold; - margin-bottom: 0.75rem; - } - [popover] label { - display: flex; - align-items: center; - justify-content: space-between; - font-size: 0.75rem; - line-height: 1rem; - } - [popover] input { - margin-left: auto; - width: 66.666667%; - border-radius: 0.25rem; - border-width: 1px; - padding: 0.25rem; - font-size: 0.75rem; - line-height: 1rem; - } - [popover] svg.arrow { - position: absolute; - top: -4px; - left: 50%; - z-index: 10; - display: block; - transform: rotate(180deg); - border-color: rgb(255 255 255); - fill: white; - } -}
\ No newline at end of file diff --git a/docs/components/ui/Tabs/DemoCSS.jinja b/docs/components/ui/Tabs/DemoCSS.jinja deleted file mode 100644 index 07db8f0..0000000 --- a/docs/components/ui/Tabs/DemoCSS.jinja +++ /dev/null @@ -1,59 +0,0 @@ -{% filter markdown %}{% raw %} -```css -.ui-tablist { - display: flex; -} -.ui-tablist > :not([hidden]) ~ :not([hidden]) { - margin-left: 0.25rem ; -} -.ui-tablist { - border-radius: 1rem; - background-color: rgb(30 58 138 / 0.6); - padding: 0.5rem; - color: #111; -} -.ui-tablist > .ui-tab:not([hidden]) ~ .ui-tab:not([hidden]) { - margin-left: 0.5rem; -} -.ui-tab { - width: 100%; - border-radius: 0.5rem; - color: #222; - background-color: rgb(255 255 255 / 0.7); - padding: 0.75rem 0.25rem; - font-size: 0.875rem; - font-weight: 500; - line-height: 1.25rem; -} -.ui-tab:focus { - outline: 2px solid rgb(59 130 246 / 0.8); - outline-offset: 2px; -} -.ui-tab.ui-selected { - background-color: white; - color: black; -} -.ui-tab:hover:not(.ui-selected, .ui-disabled), -.ui-tab:focus:not(.ui-selected, .ui-disabled) { - background-color: rgb(255 255 255 / 0.8); -} -.ui-tabpanel { - margin-top: 0.5rem; - border-radius: 0.75rem; - background-color: rgb(254 254 254); - border: 2px solid rgb(59 130 246 / 0.8); - padding: 0.1rem; - min-height: 8rem; - display: flex; - align-items: center; - justify-content: center; -} -.ui-tabpanel:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} -.ui-tabpanel.ui-hidden { - display: none; -} -``` -{% endraw %}{% endfilter %}
\ No newline at end of file diff --git a/docs/components/ui/Tabs/DemoHTML.jinja b/docs/components/ui/Tabs/DemoHTML.jinja deleted file mode 100644 index e267335..0000000 --- a/docs/components/ui/Tabs/DemoHTML.jinja +++ /dev/null @@ -1,23 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -<TabGroup> - <TabList> - <Tab target="demo-recent" selected>Recent</Tab> - <Tab target="demo-popular">Popular</Tab> - <Tab target="demo-trending">Trending</Tab> - </TabList> - - <TabPanel id> - <p>This is the tab panel for <b>"Recent"</b>.</p> - </TabPanel> - - <TabPanel id="demo-popular" hidden> - <p>This is the tab panel for <b>"Popular"</b>.</p> - </TabPanel> - - <TabPanel id="demo-trending" hidden> - <p>This is the tab panel for <b>"Trending"</b>.</p> - </TabPanel> -</TabGroup> -``` -{% endraw %}{% endfilter %} diff --git a/docs/components/ui/Tabs/DemoResult.jinja b/docs/components/ui/Tabs/DemoResult.jinja deleted file mode 100644 index 3306eac..0000000 --- a/docs/components/ui/Tabs/DemoResult.jinja +++ /dev/null @@ -1,28 +0,0 @@ -{#css ui/Tabs/Tabs.css #} - -<div class="bg-cover" - style="background-image:linear-gradient(to right, rgba(56,189,248, 0.9), rgba(37,99,235, 0.9))" - data-md-skip -></div> - -<div class="horizontal-tabs" data-md-skip> - <TabGroup> - <TabList> - <Tab target="demo-recent" selected>Recent</Tab> - <Tab target="demo-popular">Popular</Tab> - <Tab target="demo-trending">Trending</Tab> - </TabList> - - <TabPanel id="demo-recent"> - <p>This is the tab panel for <b>"Recent"</b>.</p> - </TabPanel> - - <TabPanel id="demo-popular" hidden> - <p>This is the tab panel for <b>"Popular"</b>.</p> - </TabPanel> - - <TabPanel id="demo-trending" hidden> - <p>This is the tab panel for <b>"Trending"</b>.</p> - </TabPanel> - </TabGroup> -</div> diff --git a/docs/components/ui/Tabs/ManualHTML.jinja b/docs/components/ui/Tabs/ManualHTML.jinja deleted file mode 100644 index 1a39f35..0000000 --- a/docs/components/ui/Tabs/ManualHTML.jinja +++ /dev/null @@ -1,28 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -<TabGroup> - <TabList manual> - <Tab target="manual-recent" selected>Recent</Tab> - <Tab target="manual-popular">Popular</Tab> - <Tab target="manual-disabled" disabled>Disabled</Tab> - <Tab target="manual-trending">Trending</Tab> - </TabList> - - <TabPanel id="manual-recent"> - <p>This is the tab panel for <b>"Recent"</b>.</p> - </TabPanel> - - <TabPanel id="manual-popular" hidden> - <p>This is the tab panel for <b>"Popular"</b>.</p> - </TabPanel> - - <TabPanel id="manual-disabled" hidden> - <p>This is the tab panel for "Disabled".</p> - </TabPanel> - - <TabPanel id="manual-trending" hidden> - <p>This is the tab panel for <b>"Trending"</b>.</p> - </TabPanel> -</TabGroup> -``` -{% endraw %}{% endfilter %} diff --git a/docs/components/ui/Tabs/ManualResult.jinja b/docs/components/ui/Tabs/ManualResult.jinja deleted file mode 100644 index 2a067bd..0000000 --- a/docs/components/ui/Tabs/ManualResult.jinja +++ /dev/null @@ -1,33 +0,0 @@ -{#css ui/Tabs/Tabs.css #} - -<div class="bg-cover" - style="background-image:linear-gradient(to right, rgba(56,189,248, 0.3), rgba(37,99,235, 0.3))" - data-md-skip -></div> - -<div class="horizontal-tabs" data-md-skip> - <TabGroup> - <TabList manual> - <Tab target="manual-recent" selected>Recent</Tab> - <Tab target="manual-popular">Popular</Tab> - <Tab target="manual-disabled" disabled>Disabled</Tab> - <Tab target="manual-trending">Trending</Tab> - </TabList> - - <TabPanel id="manual-recent"> - <p>This is the tab panel for <b>"Recent"</b>.</p> - </TabPanel> - - <TabPanel id="manual-popular" hidden> - <p>This is the tab panel for <b>"Popular"</b>.</p> - </TabPanel> - - <TabPanel id="manual-disabled" hidden> - <p>This is the tab panel for "Disabled".</p> - </TabPanel> - - <TabPanel id="manual-trending" hidden> - <p>This is the tab panel for <b>"Trending"</b>.</p> - </TabPanel> - </TabGroup> -</div> diff --git a/docs/components/ui/Tabs/SelectHTML.jinja b/docs/components/ui/Tabs/SelectHTML.jinja deleted file mode 100644 index 7651bb8..0000000 --- a/docs/components/ui/Tabs/SelectHTML.jinja +++ /dev/null @@ -1,35 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -<TabGroup> - <TabSelect> - <TabOption target="select-recent">Recent</TabOption> - <TabOption target="select-popular">Popular</TabOption> - <TabOption target="select-disabled" disabled>Disabled</TabOption> - <TabOption target="select-trending">Trending</TabOption> - </TabSelect> - - <TabList> - <Tab target="select-recent">Recent</Tab> - <Tab target="select-popular" selected>Popular</Tab> - <Tab target="select-disabled" disabled>Disabled</Tab> - <Tab target="select-trending">Trending</Tab> - </TabList> - - <TabPanel id="select-recent"> - <p>This is the tab panel for <b>"Recent"</b>.</p> - </TabPanel> - - <TabPanel id="select-popular" hidden> - <p>This is the tab panel for <b>"Popular"</b>.</p> - </TabPanel> - - <TabPanel id="select-disabled" hidden> - <p>This is the tab panel for "Disabled".</p> - </TabPanel> - - <TabPanel id="select-trending" hidden> - <p>This is the tab panel for <b>"Trending"</b>.</p> - </TabPanel> -</TabGroup> -``` -{% endraw %}{% endfilter %} diff --git a/docs/components/ui/Tabs/SelectResult.jinja b/docs/components/ui/Tabs/SelectResult.jinja deleted file mode 100644 index ffdf0ea..0000000 --- a/docs/components/ui/Tabs/SelectResult.jinja +++ /dev/null @@ -1,40 +0,0 @@ -{#css ui/Tabs/Tabs.css #} - -<div class="bg-cover" - style="background-image:linear-gradient(to right, rgba(56,189,248, 0.3), rgba(37,99,235, 0.3))" - data-md-skip -></div> - -<div class="horizontal-tabs" data-md-skip> - <TabGroup> - <TabSelect> - <TabOption target="select-recent">Recent</TabOption> - <TabOption target="select-popular">Popular</TabOption> - <TabOption target="select-disabled" disabled>Disabled</TabOption> - <TabOption target="select-trending">Trending</TabOption> - </TabSelect> - - <TabList> - <Tab target="select-recent">Recent</Tab> - <Tab target="select-popular" selected>Popular</Tab> - <Tab target="select-disabled" disabled>Disabled</Tab> - <Tab target="select-trending">Trending</Tab> - </TabList> - - <TabPanel id="select-recent"> - <p>This is the tab panel for <b>"Recent"</b>.</p> - </TabPanel> - - <TabPanel id="select-popular" hidden> - <p>This is the tab panel for <b>"Popular"</b>.</p> - </TabPanel> - - <TabPanel id="select-disabled" hidden> - <p>This is the tab panel for "Disabled".</p> - </TabPanel> - - <TabPanel id="select-trending" hidden> - <p>This is the tab panel for <b>"Trending"</b>.</p> - </TabPanel> - </TabGroup> -</div> diff --git a/docs/components/ui/Tabs/Tabs.css b/docs/components/ui/Tabs/Tabs.css deleted file mode 100644 index ddbef0e..0000000 --- a/docs/components/ui/Tabs/Tabs.css +++ /dev/null @@ -1,126 +0,0 @@ -@scope(.horizontal-tabs,.vertical-tabs) { - :scope { - width: 100%; - max-width: 36rem; - margin: 10% auto; - padding: 0.5rem; - } - - .ui-tablist { - display: flex; - border-radius: 1rem; - background-color: #6383dd; - padding: 0.5rem; - color: #111; - } - .ui-tablist > .ui-tab:not([hidden]) ~ .ui-tab:not([hidden]) { - margin-left: 0.5rem; - } - .ui-tab { - width: 100%; - border-radius: 0.5rem; - color: #222; - background-color: rgb(255 255 255 / 0.7); - padding: 0.75rem 0.25rem; - font-size: 0.875rem; - font-weight: 500; - line-height: 1.25rem; - } - .ui-tab:focus { - outline: 2px solid rgb(255 255 255 / 0.8); - outline-offset: 2px; - } - .ui-tab.ui-selected { - background-color: white; - color: black; - } - .ui-tab.ui-disabled { - background-color: rgb(255 255 255 / 0.5); - color: #666; - cursor: default; - } - .ui-tab:hover:not(.ui-selected, .ui-disabled), - .ui-tab:focus:not(.ui-selected, .ui-disabled) { - background-color: rgb(255 255 255 / 0.8); - } - .ui-tabpanel { - margin-top: 0.5rem; - border-radius: 1rem; - background-color: rgb(254 254 254); - border: 2px solid rgb(59 130 246 / 0.8); - padding: 0.1rem; - min-height: 8rem; - display: flex; - align-items: center; - justify-content: center; - } - .ui-tabpanel:focus { - outline: 2px solid transparent; - outline-offset: 2px; - } - .ui-tabpanel.ui-hidden { - display: none; - } - .ui-tabpanel b { - font-weight: bold; - } - - .ui-tabselect { - display: block; - width: 100%; - border-radius: 0.5rem; - border-width: 1px; - border-color: rgb(209 213 219); - background-color: rgb(249 250 251); - padding: 0.5rem; - font-size: 1rem; - line-height: 1.25rem; - color: rgb(17 24 39); - margin-bottom: 0.5rem; - } - .ui-tabselect:focus { - border-color: rgb(59 130 246); - } - .ui-tabselect:is(.dark *) { - border-color: rgb(75 85 99); - background-color: rgb(55 65 81); - color: rgb(255 255 255); - } - .ui-tabselect:is(.dark *)::-moz-placeholder { - color: rgb(156 163 175); - } - .ui-tabselect:is(.dark *):-ms-input-placeholder { - color: rgb(156 163 175); - } - .ui-tabselect:is(.dark *)::placeholder { - color: rgb(156 163 175); - } - .ui-tabselect:is(.dark *):focus { - border-color: rgb(59 130 246); - } -} - -@scope(.vertical-tabs) { - .ui-tabgroup { - display: flex; - } - .ui-tablist { - flex-direction: column; - width: 10rem; - border-radius: 1rem 0 0 1rem; - padding-right: 0; - } - .ui-tablist > .ui-tab:not([hidden]) ~ .ui-tab:not([hidden]) { - margin: 0.5rem 0 0 0; - } - .ui-tab { - border-radius: 0.5rem 0 0 0.5rem; - padding: 1rem; - } - .ui-tabpanel { - margin: 0; - border-radius: 0 1rem 1rem 0; - padding: 2rem; - min-width: 24rem; - } -}
\ No newline at end of file diff --git a/docs/components/ui/Tabs/VerticalHTML.jinja b/docs/components/ui/Tabs/VerticalHTML.jinja deleted file mode 100644 index 1dd7123..0000000 --- a/docs/components/ui/Tabs/VerticalHTML.jinja +++ /dev/null @@ -1,28 +0,0 @@ -{% filter markdown %}{% raw %} -```html+jinja -<TabGroup> - <TabList vertical> - <Tab target="vertical-recent" selected>Recent</Tab> - <Tab target="vertical-popular">Popular</Tab> - <Tab target="vertical-disabled" disabled>Disabled</Tab> - <Tab target="vertical-trending">Trending</Tab> - </TabList> - - <TabPanel id="vertical-recent"> - <p>This is the tab panel for <b>"Recent"</b>.</p> - </TabPanel> - - <TabPanel id="vertical-popular" hidden> - <p>This is the tab panel for <b>"Popular"</b>.</p> - </TabPanel> - - <TabPanel id="vertical-disabled" hidden> - <p>This is the tab panel for "Disabled".</p> - </TabPanel> - - <TabPanel id="vertical-trending" hidden> - <p>This is the tab panel for <b>"Trending"</b>.</p> - </TabPanel> -</TabGroup> -``` -{% endraw %}{% endfilter %} diff --git a/docs/components/ui/Tabs/VerticalResult.jinja b/docs/components/ui/Tabs/VerticalResult.jinja deleted file mode 100644 index b83204a..0000000 --- a/docs/components/ui/Tabs/VerticalResult.jinja +++ /dev/null @@ -1,33 +0,0 @@ -{#css ui/Tabs/Tabs.css #} - -<div class="bg-cover" - style="background-image:linear-gradient(to right, rgba(56,189,248, 0.3), rgba(37,99,235, 0.3))" - data-md-skip -></div> - -<div class="vertical-tabs" data-md-skip> - <TabGroup> - <TabList vertical> - <Tab target="vertical-recent" selected>Recent</Tab> - <Tab target="vertical-popular">Popular</Tab> - <Tab target="vertical-disabled" disabled>Disabled</Tab> - <Tab target="vertical-trending">Trending</Tab> - </TabList> - - <TabPanel id="vertical-recent"> - <p>This is the tab panel for <b>"Recent"</b>.</p> - </TabPanel> - - <TabPanel id="vertical-popular" hidden> - <p>This is the tab panel for <b>"Popular"</b>.</p> - </TabPanel> - - <TabPanel id="vertical-disabled" hidden> - <p>This is the tab panel for "Disabled".</p> - </TabPanel> - - <TabPanel id="vertical-trending" hidden> - <p>This is the tab panel for <b>"Trending"</b>.</p> - </TabPanel> - </TabGroup> -</div> diff --git a/docs/content/api.md b/docs/content/api.md deleted file mode 100644 index b2eaf50..0000000 --- a/docs/content/api.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "API reference" ---- - -<Header title="API reference" section={{ None }}> -</Header> - -<Autodoc name="jinjax.Catalog" /> - ----- - -<Autodoc name="jinjax.LazyString" members={{ False }} /> - -<Autodoc name="jinjax.HTMLAttrs" /> - ----- - -## Exceptions - -<Autodoc name="jinjax.ComponentNotFound" level={{ 3 }} members={{ False }} /> - -<Autodoc name="jinjax.MissingRequiredArgument" level={{ 3 }} members={{ False }} /> - -<Autodoc name="jinjax.DuplicateDefDeclaration" level={{ 3 }} members={{ False }} /> - -<Autodoc name="jinjax.InvalidArgument" level={{ 3 }} members={{ False }} /> - diff --git a/docs/content/guide/components.md b/docs/content/guide/components.md deleted file mode 100644 index ac8a77f..0000000 --- a/docs/content/guide/components.md +++ /dev/null @@ -1,348 +0,0 @@ ---- -title: Components -description: Declaring and using components. ---- - -<Header title="Components"> -</Header> - -## Declaring and Using Components - -The components are simple text files that look like regular Jinja templates, with three requirements: - -**First**, components must be placed inside a folder registered in the catalog or a subfolder of it. - -```python -catalog.add_folder("myapp/components") -``` - -You can call that folder whatever you want, not just "components". You can also add more than one folder: - -```python -catalog.add_folder("myapp/layouts") -catalog.add_folder("myapp/components") -``` - -If you end up having more than one component with the same name, the one in the first folder will take priority. - -**Second**, they must have a ".jinja" extension. This also helps code editors automatically select the correct language syntax to highlight. However, you can configure it in the catalog. - -**Third**, the component name must start with an uppercase letter. Why? This is how JinjaX differentiates a component from a regular HTML tag when using it. I recommend using PascalCase names, like Python classes. - -The name of the file (minus the extension) is also how you call the component. For example, if the file is "components/PersonForm.jinja": - -``` -└ myapp/ - ├── app.py - ├── components/ - └─ PersonForm.jinja -``` - -The name of the component is "PersonForm" and can be called like this: - -From Python code or a non-component template: - -- `catalog.render("PersonForm")` - -From another component: - -- `<PersonForm> some content </PersonForm>`, or -- `<PersonForm />` - -If the component is in a subfolder, the name of that folder becomes part of its name too: - -``` -└ myapp/ - ├── app.py - ├── components/ - └─ person - └─ PersonForm.jinja -``` - -A "components/person/PersonForm.jinja" component is named "person.PersonForm", meaning the name of the subfolder and the name of the file separated by a dot. This is the full name you use to call it: - -From Python code or a non-component template: - -- `catalog.render("person.PersonForm")` - -From another component: - -- `<person.PersonForm> some content </person.PersonForm>`, or -- `<person.PersonForm />` - -Notice how the folder name doesn't need to start with an uppercase if you don't want it to. - -<a href="/static/img/anatomy-en.png" target="_blank"> - <img src="/static/img/anatomy-en.png" style="margin:0 auto;width:90%;max-width:35rem;"> -</a> - -## Taking Arguments - -More often than not, a component takes one or more arguments to render. Every argument must be declared at the beginning of the component with `{#def arg1, arg2, ... #}`. - -```html+jinja -{#def action, method="post", multipart=False #} - -<form method="{{ method }}" action="{{ action }}" - {%- if multipart %} enctype="multipart/form-data"{% endif %} -> - {{ content }} -</form> -``` - -In this example, the component takes three arguments: "action", "method", and "multipart". The last two have default values, so they are optional, but the first one doesn't. That means it must be passed a value when rendering the component. - -The syntax is exactly like how you declare the arguments of a Python function (in fact, it's parsed by the same code), so it can even include type comments, although they are not used by JinjaX (yet!). - -```python -{#def - data: dict[str, str], - method: str = "post", - multipart: bool = False -#} -... -``` - -## Passing Arguments - -There are two types of arguments: strings and expressions. - -### String - -Strings are passed like regular HTML attributes: - -```html+jinja -<Form action="/new" method="PATCH"> ... </Form> - -<Alert message="Profile updated" /> - -<Card title="Hello world" type="big"> ... </Card> -``` - -### Expressions - -There are two different but equivalent ways to pass non-string arguments: - -"Jinja-like", where you use double curly braces instead of quotes: - -```html+jinja title="Jinja-like" -<Example - columns={{ 2 }} - tabbed={{ False }} - panels={{ {'one': 'lorem', 'two': 'ipsum'} }} - class={{ 'bg-' + color }} -/> -``` - -... and "Vue-like", where you keep using quotes, but prefix the name of the attribute with a colon: - -```html+jinja title="Vue-like" -<Example - :columns="2" - :tabbed="False" - :panels="{'one': 'lorem', 'two': 'ipsum'}" - :class="'bg-' + color" -/> -``` - -<Callout type="note"> - For `True` values, you can just use the name, like in HTML: - <br> - ```html+jinja - <Example class="green" hidden /> - ``` -</Callout> - -<Callout type="note"> - You can also use dashes when passing an argument, but they will be translated to underscores: - <br> - ```html+jinja - <Example aria-label="Hi" /> - ``` - <br> - ```html+jinja title="Example.jinja" - {#def aria_label = "" #} - ... - ``` -</Callout> - -## With Content - -There is always an extra implicit argument: **the content** inside the component. Read more about it in the [next](/guide/slots) section. - -## Extra Arguments - -If you pass arguments not declared in a component, those are not discarded but rather collected in an `attrs` object. - -You then call `attrs.render()` to render the received arguments as HTML attributes. - -For example, this component: - -```html+jinja title="Card.jinja" -{#def title #} -<div {{ attrs.render() }}> - <h1>{{ title }}</h1> - {{ content }} -</div> -``` - -Called as: - -```html -<Card title="Products" class="mb-10" open>bla</Card> -``` - -Will be rendered as: - -```html -<div class="mb-10" open> - <h1>Products</h1> - bla -</div> -``` - -You can add or remove arguments before rendering them using the other methods of the `attrs` object. For example: - -```html+jinja -{#def title #} -{% do attrs.set(id="mycard") -%} - -<div {{ attrs.render() }}> - <h1>{{ title }}</h1> - {{ content }} -</div> -``` - -Or directly in the `attrs.render()` call: - -```html+jinja -{#def title #} - -<div {{ attrs.render(id="mycard") }}> - <h1>{{ title }}</h1> - {{ content }} -</div> -``` - -<Callout type="info"> -The string values passed into components as attrs are not cast to `str` until the string representation is **actually** needed, for example when `attrs.render()` is invoked. -</Callout> - -### `attrs` Methods - -#### `.render(name=value, ...)` - -Renders the attributes and properties as a string. - -Any arguments you use with this function are merged with the existing -attibutes/properties by the same rules as the `HTMLAttrs.set()` function: - -- Pass a name and a value to set an attribute (e.g. `type="text"`) -- Use `True` as a value to set a property (e.g. `disabled`) -- Use `False` to remove an attribute or property -- The existing attribute/property is overwritten **except** if it is `class`. - The new classes are appended to the old ones instead of replacing them. -- The underscores in the names will be translated automatically to dashes, - so `aria_selected` becomes the attribute `aria-selected`. - -To provide consistent output, the attributes and properties -are sorted by name and rendered like this: -`<sorted attributes> + <sorted properties>`. - -```html+jinja -<Example class="ipsum" width="42" data-good /> -``` -```html+jinja -<div {{ attrs.render() }}> -<!-- <div class="ipsum" width="42" data-good> --> - -<div {{ attrs.render(class="abc", data_good=False, tabindex=0) }}> -<!-- <div class="abc ipsum" width="42" tabindex="0"> --> -``` - -<Callout type="warning"> -Using `<Component {{ attrs.render() }}>` to pass the extra arguments to other components **WILL NOT WORK**. That is because the components are translated to macros before the page render. - -You must pass them as the special argument `_attrs`. - -```html+jinja -{#--- WRONG 😵 ---#} -<MyButton {{ attrs.render() }} /> - -{#--- GOOD 👍 ---#} -<MyButton _attrs={{ attrs }} /> -<MyButton :_attrs="attrs" /> -``` -</Callout> - -#### `.set(name=value, ...)` - -Sets an attribute or property - -- Pass a name and a value to set an attribute (e.g. `type="text"`) -- Use `True` as a value to set a property (e.g. `disabled`) -- Use `False` to remove an attribute or property -- If the attribute is "class", the new classes are appended to - the old ones (if not repeated) instead of replacing them. -- The underscores in the names will be translated automatically to dashes, - so `aria_selected` becomes the attribute `aria-selected`. - -```html+jinja title="Adding attributes/properties" -{% do attrs.set( - id="loremipsum", - disabled=True, - data_test="foobar", - class="m-2 p-4", -) %} -``` - -```html+jinja title="Removing attributes/properties" -{% do attrs.set( - title=False, - disabled=False, - data_test=False, - class=False, -) %} -``` - -#### `.setdefault(name=value, ...)` - -Adds an attribute, but only if it's not already present. - -The underscores in the names will be translated automatically to dashes, so `aria_selected` -becomes the attribute `aria-selected`. - -```html+jinja -{% do attrs.setdefault( - aria_label="Products" -) %} -``` - -#### `.add_class(name1, name2, ...)` - -Adds one or more classes to the list of classes, if not already present. - -```html+jinja -{% do attrs.add_class("hidden") %} -{% do attrs.add_class("active", "animated") %} -``` - -#### `.remove_class(name1, name2, ...)` - -Removes one or more classes from the list of classes. - -```html+jinja -{% do attrs.remove_class("hidden") %} -{% do attrs.remove_class("active", "animated") %} -``` - -#### `.get(name, default=None)` - -Returns the value of the attribute or property, -or the default value if it doesn't exist. - -```html+jinja -{%- set role = attrs.get("role", "tab") %} -``` - -...
\ No newline at end of file diff --git a/docs/content/guide/css_and_js.md b/docs/content/guide/css_and_js.md deleted file mode 100644 index 8e296e2..0000000 --- a/docs/content/guide/css_and_js.md +++ /dev/null @@ -1,230 +0,0 @@ ---- -title: Adding CSS and JS -description: Your components might need custom styles or custom JavaScript for many reasons. ---- - -<Header title="Adding CSS and JS"> -Your components might need custom styles or custom JavaScript for many reasons. -</Header> -Instead of using global stylesheet or script files, writing assets for each individual component has several advantages: - -- **Portability**: You can copy a component from one project to another, knowing it will keep working as expected. -- **Performance**: Only load the CSS and JS that you need on each page. Additionally, the browser will have already cached the assets of the components for other pages that use them. -- **Simple testing**: You can test the JS of a component independently from others. - -## Auto-loading assets - -JinjaX searches for `.css` and `.js` files with the same name as your component in the same folder and automatically adds them to the list of assets included on the page. For example, if your component is `components/common/Form.jinja`, both `components/common/Form.css` and `components/common/Form.js` will be added to the list, but only if those files exist. - -## Manually declaring assets - -In addition to auto-loading assets, the CSS and/or JS of a component can be declared in the metadata header with `{#css ... #}` and `{#js ... #}`. - -```html -{#css lorem.css, ipsum.css #} -{#js foo.js, bar.js #} -``` - -- The file paths must be relative to the root of your components catalog (e.g., `components/form.js`) or absolute (e.g., `http://example.com/styles.css`). -- Multiple assets must be separated by commas. -- Only **one** `{#css ... #}` and **one** `{#js ... #}` tag is allowed per component at most, but both are optional. - -### Global assets - -The best practice is to store both CSS and JS files of the component within the same folder. Doing this has several advantages, including easier component reuse in other projects, improved code readability, and simplified debugging. - -However, there are instances when you may need to rely on global CSS or JS files, such as third-party libraries. In such cases, you can specify these dependencies in the component's metadata using URLs that start with either "/", "http://," or "https://." - -When you do this, JinjaX will render them as is, instead of prepending them with the component's prefix like it normally does. - -For example, this code: - -```html+jinja -{#css foo.css, bar.css, /static/bootstrap.min.css #} -{#js http://example.com/cdn/moment.js, bar.js #} - -{{ catalog.render_assets() }} -``` - -will be rendered as this HTML output: - -```html -<link rel="stylesheet" href="/static/components/foo.css"> -<link rel="stylesheet" href="/static/components/bar.css"> -<link rel="stylesheet" href="/static/bootstrap.min.css"> -<script type="module" src="http://example.com/cdn/moment.js"></script> -<script type="module" src="/static/components/bar.js"></script> -``` - -## Including assets in your pages - -The catalog will collect all CSS and JS file paths from the components used on a "page" render on the `catalog.collected_css` and `catalog.collected_js` lists. - -For example, after rendering this component: - -```html+jinja title="components/MyPage.jinja" -{#css mypage.css #} -{#js mypage.js #} - -<Layout title="My page"> - <Card> - <CardBody> - <h1>Lizard</h1> - <p>The Iguana is a type of lizard</p> - </CardBody> - <CardActions> - <Button size="small">Share</Button> - </CardActions> - </Card> -</Layout> -``` - -Assuming the `Card` and `Button` components declare CSS assets, this will be the state of the `collected_css` list: - -```py -catalog.collected_css -['mypage.css', 'card.css', 'button.css'] -``` - -You can add the `<link>` and `<script>` tags to your page automatically by calling `catalog.render_assets()` like this: - -```html+jinja title="components/Layout.jinja" hl_lines="8" -{#def title #} - -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="utf-8"> - <title>{{ title }}</title> - {{ catalog.render_assets() }} -</head> -<body> - {{ content }} -</body> -</html> -``` - -The variable will be rendered as: - -```html -<link rel="stylesheet" href="/static/components/mypage.css"> -<link rel="stylesheet" href="/static/components/card.css"> -<link rel="stylesheet" href="/static/components/button.css"> -<script type="module" src="/static/components/mypage.js"></script> -<script type="module" src="/static/components/card.js"></script> -<script type="module" src="/static/components/button.js"></script> -``` - -## Middleware - -The tags above will not work if your application can't return the content of those files. Currently, it can't. - -For that reason, JinjaX includes WSGI middleware that will process those URLs if you add it to your application. - -```py -from flask import Flask -from jinjax import Catalog - -app = Flask(__name__) - -# Here we add the Flask Jinja globals, filters, etc., like `url_for()` -catalog = jinjax.Catalog(jinja_env=app.jinja_env) - -catalog.add_folder("myapp/components") - -app.wsgi_app = catalog.get_middleware( - app.wsgi_app, - autorefresh=app.debug, -) -``` - -The middleware uses the battle-tested [Whitenoise library](http://whitenoise.evans.io/) and will only respond to the *.css* and *.js* files inside the component(s) folder(s). You can configure it to also return files with other extensions. For example: - -```python -catalog.get_middleware(app, allowed_ext=[".css", .js", .svg", ".png"]) -``` - -Be aware that if you use this option, `get_middleware()` must be called **after** all folders are added. - -## Good practices - -### CSS Scoping - -The styles of your components will not be auto-scoped. This means the styles of a component can affect other components and likewise, it will be affected by global styles or the styles of other components. - -To protect yourself against that, *always* add a custom class to the root element(s) of your component and use it to scope the rest of the component styles. - -You can even use this syntax now supported by [all modern web browsers](https://caniuse.com/css-nesting): - -```sass -.Parent { - .foo { ... } - .bar { ... } -} -``` - -The code above will be interpreted as - -```css -.Parent .foo { ... } -.Parent .bar { ... } -``` - -Example: - -```html+jinja title="components/Card.jinja" -{#css card.css #} - -<div {{ attrs.render(class="Card") }}> - <h1>My Card</h1> - ... -</div> -``` - -```sass title="components/card.css" -/* 🚫 DO NOT do this */ -h1 { font-size: 2em; } -h2 { font-size: 1.5em; } -a { color: blue; } - -/* 👍 DO THIS instead */ -.Card { - & h1 { font-size: 2em; } - & h2 { font-size: 1.5em; } - & a { color: blue; } -} - -/* 👍 Or this */ -.Card h1 { font-size: 2em; } -.Card h2 { font-size: 1.5em; } -.Card a { color: blue; } -``` - -<Callout type="warning"> -Always use a class **instead of** an `id`, or the component will not be usable more than once per page. -</Callout> - -### JS events - -Your components might be inserted in the page on-the-fly, after the JavaScript files have been loaded and executed. So, attaching events to the elements on the page on load will not be enough: - -```js title="components/card.js" -// This will fail for any Card component inserted after page load -document.querySelectorAll('.Card button.share') - .forEach((node) => { - node.addEventListener("click", handleClick) - }) - -/* ... etc ... */ -``` - -A solution can be using event delegation: - -```js title="components/card.js" -// This will work for any Card component inserted after page load -document.addEventListener("click", (event) => { - if (event.target.matches(".Card button.share")) { - handleClick(event) - } -}) -``` diff --git a/docs/content/guide/index.md b/docs/content/guide/index.md deleted file mode 100644 index 0c092ea..0000000 --- a/docs/content/guide/index.md +++ /dev/null @@ -1,196 +0,0 @@ ---- -title: Introduction ---- - -<Header title="Introduction"> -JinjaX is a Python library for creating reusable "components": encapsulated template snippets that can take arguments and render to HTML. They are similar to React or Vue components, but they render on the server side, not in the browser. -</Header> - -Unlike Jinja's `{% include "..." %}` or macros, JinjaX components integrate naturally with the rest of your template code. - -```html+jinja -<div> - <Card class="bg-gray"> - <h1>Products</h1> - {% for product in products %} - <Product product={{ product }} /> - {% endfor %} - </Card> -</div> -``` - -## Features - -### Simple - -JinjaX components are simple Jinja templates. You use them as if they were HTML tags without having to import them: easy to use and easy to read. - -### Encapsulated - -They are independent of each other and can link to their own CSS and JS, so you can freely copy and paste components between applications. - -### Testable - -All components can be unit tested independently of the pages where they are used. - -### Composable - -A JinjaX component can wrap HTML code or other components with a natural syntax, as if they were another tag. - -### Modern - -They are a great complement to technologies like [TailwindCSS](https://tailwindcss.com/), [htmx](https://htmx.org/), or [Hotwire](https://hotwired.dev/). - -## Usage - -#### Install - -Install the library using `pip`. - -```bash -pip install jinjax -``` - -#### Components folder - -Then, create a folder that will contain your components, for example: - -``` -└ myapp/ - ├── app.py - ├── components/ 🆕 - │ └── Card.jinja 🆕 - ├── static/ - ├── templates/ - └── views/ -└─ requirements.txt -``` - -#### Catalog - -Finally, you must create a "catalog" of components in your app. This is the object that manages the components and their global settings. You then add the path of the folder with your components to the catalog: - -```python -from jinjax import Catalog - -catalog = Catalog() -catalog.add_folder("myapp/components") -``` - -#### Render - -You will use the catalog to render components from your views. - -```python -def myview(): - ... - return catalog.render( - "Page", - title="Lorem ipsum", - message="Hello", - ) -``` - -In this example, it is a component for the whole page, but you can also render smaller components, even from inside a regular Jinja template if you add the catalog as a global: - -```python -app.jinja_env.globals["catalog"] = catalog -``` - -```html+jinja -{% block content %} -<div> - {{ catalog.irender("LikeButton", title="Like and subscribe!", post=post) }} -</div> -<p>Lorem ipsum</p> -{{ catalog.irender("CommentForm", post=post) }} -{% endblock %} -``` - -## How It Works - -JinjaX uses Jinja to render the component templates. In fact, it currently works as a pre-processor, replacing all: - -```html -<Component attr="value">content</Component> -``` - -with function calls like: - -```html+jinja -{% call catalog.irender("Component", attr="value") %}content{% endcall %} -``` - -These calls are evaluated at render time. Each call loads the source of the component file, parses it to extract the names of CSS/JS files, required and/or optional attributes, pre-processes the template (replacing components with function calls, as before), and finally renders the new template. - -### Reusing Jinja's Globals, Filters, and Tests - -You can add your own global variables and functions, filters, tests, and Jinja extensions when creating the catalog: - -```python -from jinjax import Catalog - -catalog = Catalog( - globals={ ... }, - filters={ ... }, - tests={ ... }, - extensions=[ ... ], -) -``` - -or afterward. - -```python -catalog.jinja_env.globals.update({ ... }) -catalog.jinja_env.filters.update({ ... }) -catalog.jinja_env.tests.update({ ... }) -catalog.jinja_env.extensions.extend([ ... ]) -``` - -The ["do" extension](https://jinja.palletsprojects.com/en/3.0.x/extensions/#expression-statement) is enabled by default, so you can write things like: - -```html+jinja -{% do attrs.set(class="btn", disabled=True) %} -``` - -### Reusing an Existing Jinja Environment - -You can also reuse an existing Jinja Environment, for example: - -#### Flask: - -```python -app = Flask(__name__) - -# Here we add the Flask Jinja globals, filters, etc., like `url_for()` -catalog = jinjax.Catalog(jinja_env=app.jinja_env) -``` - -#### Django: - -First, configure Jinja in `settings.py` and [jinja_env.py](https://docs.djangoproject.com/en/5.0/topics/templates/#django.template.backends.jinja2.Jinja2). - -To have a separate "components" folder for shared components and also have "components" subfolders at each Django app level: - -```python -import jinjax -from jinja2.loaders import FileSystemLoader - -def environment(loader: FileSystemLoader, **options): - env = Environment(loader=loader, **options) - - ... - - env.add_extension(jinjax.JinjaX) - catalog = jinjax.Catalog(jinja_env=env) - - catalog.add_folder("components") - for dir in loader.searchpath: - catalog.add_folder(os.path.join(dir, "components")) - - return env -``` - -#### FastAPI: - -TBD
\ No newline at end of file diff --git a/docs/content/guide/integrations.md b/docs/content/guide/integrations.md deleted file mode 100644 index 0884d22..0000000 --- a/docs/content/guide/integrations.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Integrations ----
\ No newline at end of file diff --git a/docs/content/guide/motivation.md b/docs/content/guide/motivation.md deleted file mode 100644 index 90602b5..0000000 --- a/docs/content/guide/motivation.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: Motivation ---- -<Header title="Motivation"> -An overview of what Jinja is about, and a glimpse into my disjointed decision-making process that got me here. -</Header> - -## Components are cool - -Despite the complexity of a single-page application, some programmers claim React or Vue offer a better development experience than traditional server-side rendered templates. I believe this is mostly because of the greatest improvement React introduced to web development: components. - -<small> -Components, *as a way to organize template code*. Reactivity is cool too, but unrelated to the main issue. -</small> - -When writing Python, we aim for the code to be easy to understand and test. However, we often forget all of that when writing templates that don't even meet basic standards: long methods, deep conditional nesting, and mysterious variables everywhere. - -Components are way cooler than the HTML soup tag of server-side rendered templates. They make it very clear what arguments they take and how they can render. More than anything, components are modular: markup, logic, and relevant styles all in one package. You can copy and paste them between projects, and you can share them with other people. - -This means a community has formed around sharing these components. Now you can easily find hundreds of ready-to-use components—some of them very polished—for every common UI widget, even the "complex" ones, like color-pickers. The big problem is that you can only use them with React (and Vue components with Vue, etc.) and in a single-page application. - -Jinja is about bringing that innovation back to server-side-rendered applications. - -## Not quite there: Jinja macros - -An underestimated feature of Jinja is *macros*. Jinja [macros](https://jinja.palletsprojects.com/en/3.0.x/templates/#macros) are template snippets that work like functions: They can have positional or keyword arguments, and when called return the rendered text inside. - -```html+jinja -{% macro input(name, value="", type="text", size=20) -%} - <input type="{{ type }}" name="{{ name }}" - value="{{ value|e }}" size="{{ size }}"> -{%- endmacro %} - -{% macro button(type="button") -%} - <button type="{{ type }}" class="btn-blue"> - {{ caller() }} - </button> -{%- endmacro %} -``` - -You can then import the macro to your template to use it: - -```html+jinja -{% from 'forms.html' import input, button %} - -<p>{{ input("username") }}</p> -<p>{{ input("password", type="password") }}</p> -{% call button("submit") %}Submit{% endcall %} -``` -You must use the `{% call x %}` to pass the child content to the macro—by using the weird incantation `{{ caller() }}`—otherwise you can just call it like it were a function. - -So, can we use macros as components and call it a day? Well... no. This looks terrible: - -```html+jinja -{% call Card(label="Hello") %} - {% call MyButton(color="blue", shadowSize=2) %} - {{ Icon(name="ok") }} Click Me - {% endcall %} -{% endcall %} -``` - -compared to how you would write it with JSX: - -```html -<Card label="Hello"> - <MyButton color="blue" shadowSize={2}> - <Icon name="ok" /> Click Me - </MyButton> -</Card> -``` - -But macros are *almost* there. They would be a great foundation if we could adjust the syntax just a little. - -## Strong alternative: Mako - -At some point, I considered dropping this idea and switching to [Mako](https://www.makotemplates.org/), a template library by Michael Bayer (of SQLAlchemy fame). - -It's a hidden gem that doesn't get much attention because of network effects. See how close you can get with it: - -```html+mako -<%def name="layout()"> # <--- A "macro" - <div class="mainlayout"> - <div class="header"> - ${caller.header()} - </div> - - <div class="sidebar"> - ${caller.sidebar()} - </div> - - <div class="content"> - ${caller.body()} - </div> - </div> -</%def> - -## calls the layout def <--- Look! Python-style comments - -<%self:layout> - <%def name="header()"> # <--- This is like a "slot"! - I am the header - </%def> - <%def name="sidebar()"> - <ul> - <li>sidebar 1</li> - <li>sidebar 2</li> - </ul> - </%def> - this is the body -</%self:layout> -``` - -Mako also has `<% include %>`s with arguments, which is another way of doing components if you don't need to pass content. - -However, in the end, the network effects, my familiarity with Jinja, and a little of not-invented-here syndrome tipped the scales to write a Jinja extension. diff --git a/docs/content/guide/performance.md b/docs/content/guide/performance.md deleted file mode 100644 index 609b952..0000000 --- a/docs/content/guide/performance.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Performance ---- diff --git a/docs/content/guide/slots.md b/docs/content/guide/slots.md deleted file mode 100644 index 991f327..0000000 --- a/docs/content/guide/slots.md +++ /dev/null @@ -1,175 +0,0 @@ ---- -title: Slots / Content -description: Working with content in components. ---- - -<Header title="Slots / Content"> -Besides attributes, components can also accept content to render inside them. -</Header> - -Everything between the open and close tags of the components will be rendered and passed to the component as an implicit `content` variable - -This is a very common pattern, and it is called a **_slot_**. A slot is a placeholder for content that can be provided by the user of the component. For example, we may have a `<FancyButton>` component that supports usage like this: - -```html+jinja -<FancyButton> - <i class="icon></i> Click me! -</FancyButton> -``` - -The template of `<FancyButton>` looks like this: - -```html+jinja -<button class="fancy-btn"> - {{ content }} -</button> -``` - -![slot diagram](/static/img/slots-diagram.png) - -The `<FancyButton>` is responsible for rendering the outer `<button>` (and its fancy styling), while the inner content is provided by the parent component. - -A great use case of the `content` is to make layout components: - -<ExampleTabs - prefix="slots-layouts" - panels={{ { - "ArchivePage.jinja": "guide.slots.CompArchive", - "Layout.jinja": "guide.slots.CompLayout", - } }} -/> - - -## Fallback Content - -There are cases when it's useful to specify fallback (i.e. default) content for a slot, to be rendered only when no content is provided. For example, in a `<SubmitButton>` component: - -```html+jinja -<button type="submit"> - {{ content }} -</button> -``` - -We might want the text "Submit" to be rendered inside the `<button>` if the parent didn't provide any slot content. The special "content" variable is just a string like any other, so we can test if it's empty to make "Submit" the fallback content: - -```html+jinja -<button type="submit"> - {% if content %} - {{ content }} - {% else %} - Submit <!-- fallback content --> - {% endif %} -</button> -``` - -Now when we use `<SubmitButton>` in a parent component, providing no content for the slot: - -```html+jinja -<SubmitButton /> -``` - -<Callout type="info"> -The `content` of a self-closing component is an empty string. -</Callout> - -This will render the fallback content, "Submit": - -```html -<button type="submit">Submit</button> -``` - -But if we provide content: - -```html+jinja -<SubmitButton>Save</SubmitButton> -``` - -Then the provided content will be rendered instead: - -```html -<button type="submit">Save</button> -``` - - -## Multiple content slots (a.k.a. "named slots") - -There are cases when a component is complex enough to need multiple content slots. For example, a `<Modal>` component might need a `header`, a `body`, and a `footer` content. - -One way to implement it is using multiple content slots. To do so, instead of rendering `content` as a string, you can also _call_ it with name. Then, the parent component can provide a content _for_ that name. - -![_slot variable](/static/img/slots-_slot.png) - -Note the `_slot` special variable. This is automatically available in the content in the parent component and contains the named the component has used to call request its content. - -The `_slot` variable is scoped to the content of that component, so it's not available outside of it: - -```html+jinja hl_lines="2 7 11" -<FancyButton> - {% if _slot == "hi" %} {# <--- _slot #} - Hello{% endif %} -</FancyButton> - -<FancyButton2> - {% if _slot == "hi" %} {# <--- This _slot is a different one #} - Sup?{% endif %} -</FancyButton2> - -{{ _slot }} {# <--- Undefined variable #} -``` - - -## Composability: better than named slots - -Named slots are a quick way to have multiple content slots, but are a bit messy beyond some simple cases. - -Composability offers a more flexible and idiomatic approach when multiple content slots are needed. The idea is to have separated components for each content slot, and then compose them together. Let's explore this concept using the same example as above. - -Consider a `Modal` component that requires three distinct sections: a header, a body, and a footer. Instead of using named slots, we can create separate components for each section and composing them within a `Modal` component wrapper. - -```html+jinja -<Modal> - - <ModalHeader> - <i class="icon-rocket"></i> - Hello World! - </ModalHeader> - - <ModalBody> - <p>The modal body.</p> - </ModalBody> - - <ModalFooter> - <button>Cancel</button> - <button>Save</button> - </ModalFooter> - -</Modal> -``` - -Now, the `Modal` component is responsible for rendering the outer `<dialog>` and its styling, while the inner content is provided by the child components. - -<ExampleTabs - prefix="slots-modal" - panels={{ { - "Modal.jinja": "guide.slots.Modal", - "ModalHeader.jinja": "guide.slots.ModalHeader", - "ModalBody.jinja": "guide.slots.ModalBody", - "ModalFooter.jinja": "guide.slots.ModalFooter", - } }} -/> - -### Advantages of Composability - -- **Flexibility**: You can easily rearrange, omit, or add new sections without modifying the core `Modal` component. -- **Reusability**: Each section (`ModalHeader`, `ModalBody`, `ModalFooter`) can be used independently or within other components. -- **Maintainability**: It's easier to update or style individual sections without affecting the others. - - -## Testing components with content - -To test a component in isolation, you can manually send a content argument using the special `_content` argument: - -```python -catalog.render("PageLayout", title="Hello world", _content="TEST") -``` - diff --git a/docs/content/index.md b/docs/content/index.md deleted file mode 100644 index 69796da..0000000 --- a/docs/content/index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Welcome -component: PageSingle -description: Super components powers for your Jinja templates -social_card: SocialCardIndex ---- - -<Home /> diff --git a/docs/content/ui/accordion.md b/docs/content/ui/accordion.md deleted file mode 100644 index 8676fd5..0000000 --- a/docs/content/ui/accordion.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Accordion -description: Component for grouping <details> HTML elements where only one of them can be open at the same time. ---- - -<Header title="Accordion" section="UI components"> - Component for grouping <code>details</code> HTML elements where only one of them can be open at the same time. -</Header> - -An accordion is a vertically stacked group of collapsible sections. HTML has already a native element for this, the `<details>` element, but it doesn't support the "only one open at a time" behavior, so we need to add some JS to make it work, and that's what this component does. - -If you don't need to ensure only one section is open at a time, you don't need this component at all, just use the `<details>` element directly. - -<ExampleTabs - prefix="demo" - :panels="{ - 'Result': 'ui.Accordion.DemoResult', - 'HTML': 'ui.Accordion.DemoHTML', - 'CSS': 'ui.Accordion.DemoCSS', - }" -/> - - -The `Accordion` is a simple wrapper plus some JS logic, so it doesn't uses any arguments and it's as accesible as the `details` element you put inside. - - -## Events - -The `Accordion` doesn't emit or listen to any events, but the `<details>` elements inside do. - -In addition to the usual events supported by HTML elements, the `<details>` element supports the `toggle` event, which is dispatched to the `<details>` element whenever its state changes between open and closed. The `Accordion` component listen to it to be able to close the other `<details>` elements when one is opened. - -The `toggle` event is sent *after* the state is changed, although if the state changes multiple times before the browser can dispatch the event, the events are coalesced so that only one is sent. - -```js -details.addEventListener("toggle", (event) => { - if (details.open) { - /* the element was toggled open */ - } else { - /* the element was toggled closed */ - } -}); -``` diff --git a/docs/content/ui/index.md b/docs/content/ui/index.md deleted file mode 100644 index 0a406a4..0000000 --- a/docs/content/ui/index.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: UI components -description: Unstyled, fully accessible UI components, to integrate with your projects. ---- - -<Header title="UI components" :section="false"> - Unstyled, fully accessible UI components, to integrate with your projects. -</Header> - -<div class="cd-cards not-prose"> - <a class="card" href="/ui/tabs"> - <h2>Tabs</h2> - <img src="/static/img/ui-tabs.png" /> - </a> - <a class="card" href="/ui/popover"> - <h2>Popover</h2> - <img src="/static/img/ui-popover.png" /> - </a> - <a class="card" href="/ui/menu"> - <h2>Menu</h2> - <img src="/static/img/ui-menu.png" /> - </a> - <a class="card" href="/ui/accordion"> - <h2>Accordion</h2> - <img src="/static/img/ui-accordion.png" /> - </a> - <a class="card" href="/ui/linkedlist"> - <h2>LinkedList</h2> - <img src="/static/img/ui-linkedlist.png" /> - </a> - <a class="card" href="/ui/reldate"> - <h2>RelDate</h2> - <img src="/static/img/ui-reldate.png" /> - </a> -</div> - - -## How to use - -1. Install the `jinjax-ui` python library doing - - ```bash - pip install jinjax-ui - ``` - -2. Add it to your *JinjaX* catalog: - - ```python - import jinjax_ui - - catalog.add_folder(jinjax_ui.components_path, prefix="") - ``` - -3. Use the UI components in your components/templates: - - ```html+jinja - <Popover> ... </Popover> - ```
\ No newline at end of file diff --git a/docs/content/ui/linkedlist.md b/docs/content/ui/linkedlist.md deleted file mode 100644 index ac3fce2..0000000 --- a/docs/content/ui/linkedlist.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Linked Lists -description: A component to select multiple items from a long list, while keeping them sorted. ---- - -<Header title="Linked Lists" section="UI components"> - A component to select multiple items from a long list, while keeping them sorted. -</Header> - -<ExampleTabs - prefix="demo" - :panels="{ - 'Result': 'ui.LinkedList.DemoResult', - 'HTML': 'ui.LinkedList.DemoHTML', - 'CSS': 'ui.LinkedList.DemoCSS', - }" -/> - -<Callout>The checkboxes above are displayed so you can see how they get checked/unchecked. If you might want to hide them with CSS, the component will keep working as usual, but they must be present.</Callout> diff --git a/docs/content/ui/menu.md b/docs/content/ui/menu.md deleted file mode 100644 index 12539d5..0000000 --- a/docs/content/ui/menu.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: Menu (Dropdown) -description: Displays a list of options that a user can choose with robust support for keyboard navigation. Built using the Popover API. ---- - -<Header title="Menu" section="UI components"> - Displays a list of options that a user can choose with robust support for - keyboard navigation. Built using the Popover API. -</Header> - -<ExampleTabs - prefix="menu-demo" - :panels="{ - 'Result': 'ui.Menu.DemoResult', - 'HTML': 'ui.Menu.DemoHTML', - 'CSS': 'ui.Menu.DemoCSS', - }" -/> - -**Note:** This component does not handle keyboard shortcuts, here are shown only as an example. - -Menus are built using the `Menu`, `MenuButton`, `MenuItem`, and `MenuItemSub` components. Clicking on menu button or activating it with the keyboard will show the corresponding menu. - -```html+jinja -<MenuButton>Open menu</<MenuButton> -<Menu> - <MenuItem> item1 </MenuItem> 〈-- Regular item - <MenuItem> item2 </MenuItem> - <MenuItem> item3 </MenuItem> - <MenuItemSub> item4 〈----------- An item with a submenu - <Menu> ... </Menu>〈----------- Submenu - </MenuItemSub> -</Menu> -``` - -A `Menu` starts hidden on page load by having `display:none` set on it (the Popover API does it automatically). To show/hide the menu, you need to add a `MenuButton`. - -When a `Menu` is shown, it has `display:none` removed from it and it is put into the top layer so, unlike just using `position: absolute`, it's guaranteed that it will sit on top of all other page content. - - -## Anchor positioning - -By default, the menu appears centered in the layout view, but this component allows you to position it relative to an specific element in the page, using the `anchor` and `anchor-to` attributes. - -`anchor` is the ID of the element used as a reference, and `anchor-to` which side of the anchor to use: "top", "bottom", "right", or "left"; with an optional postfix of "start" or "end" ("center" is the default). - -<p> - <img src="/static/img/anchors.png" alt="Anchor positioning" - width="595" height="324" style="display:block;margin:60px auto;" /> -</p> - -The positioning is done every time the menu opens, but you can trigger the re-position, for example, on windows resizing, by calling the `jxui-popover/setPosition(menu)` function. - - -## Styling states - -| CSS selector | Description -| ----------------------- | -------------- -| `.ui-menu` | Every menu has this class -| `.ui-menu:popover-open` | This pseudo-class matches only menus that are currently being shown -| `::backdrop` | This pseudo-element is a full-screen element placed directly behind showing menu elements in the top layer, allowing effects to be added to the page content behind the menu(s) if desired. You might for example want to blur out the content behind the menu to help focus the user's attention on it - -To animate a menu, follow the [Animating popovers section](/headless/popover#animating-popovers) in the Popover page. - - -## Component arguments - -### MenuButton - -| Argument | Type | Default | Description -| --------------- | --------- | ---------- | -------------- -| `target` | `str` | | Required. The ID of the linked `Popover` component. -| `action` | `str` | `"toggle"` | `"open"`, `"close"`, or `"toggle"`. -| `tag` | `str` | `"button"` | HTML tag of the component. - -### Menu - -| Argument | Type | Default | Description -| ------------ | ----- | -------- | -------------- -| `mode` | `str` | `"auto"` | `"auto"` or `"manual"`. -| `anchor` | `str` | | ID of the element used as an anchor -| `anchor-to` | `str` | | Which side/position of the anchor to use: "**top**", "**bottom**", "**right**", or "**left**"; with an optional postfix of "**start**", "**end**", "**center**". -| `tag` | `str` | `"div"` | HTML tag of the component. - -### MenuItem - -| Argument | Type | Default | Description -| ------------ | ----- | -------- | -------------- -| `mode` | `str` | `"auto"` | `"auto"` or `"manual"`. - -### MenuSubItem - -| Argument | Type | Default | Description -| ------------ | ----- | -------- | -------------- -| `mode` | `str` | `"auto"` | `"auto"` or `"manual"`. - - -## Accessibility notes - -### Mouse interaction - -- Clicking a `PopButton` will trigger the button action (open, close, or toggle state). - -- Clicking outside of a `Popover` will close *all* the `Popover` with `mode="auto"`. - - -### Keyboard interaction - -- Pressing the <kbd>Enter</kbd> or <kbd>Space</kbd> keys on a `PopButton` will trigger -the button action (open, close, or toggle state), and close *all* the `Popover` with `mode="auto"`. - -- Pressing the <kbd>Escape</kbd> key will close *all* the `Popover` with `mode="auto"`. diff --git a/docs/content/ui/popover.md b/docs/content/ui/popover.md deleted file mode 100644 index 673f96d..0000000 --- a/docs/content/ui/popover.md +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: Pop-over -description: A wrapper over the Popover API with anchor positioning. ---- - -<Header title="Pop-over" section="UI components"> - A wrapper over the Popover API with anchor positioning. -</Header> - -Pop-overs are powerful components with many use cases like edit menus, -custom notifications, content pickers, or help dialogs. - -They can also be used for big hideable sidebars, like a shopping cart or action panels. -Pop-overs are **always non-modal**. If you want to create a modal popoverover, a `Dialog` -component is the way to go instead. - -<ExampleTabs - prefix="demo" - :panels="{ - 'Result': 'ui.Popover.DemoResult', - 'HTML': 'ui.Popover.DemoHTML', - 'CSS': 'ui.Popover.DemoCSS', - }" -/> - -A `Popover` starts hidden on page load by having `display:none` set on it (the Popover API does it automatically). To show/hide the popover, you need to add some control `PopButton`s. - -When a popover is shown, it has `display:none` removed from it and it is put into the top layer so, unlike just using `position: absolute`, it's guaranteed that it will sit on top of all other page content. - - -## Anchor positioning - -By default, a popover appears centered in the layout view, but this component allows you to position it relative to an specific element in the page, using the `anchor` and `anchor-to` attributes. - -`anchor` is the ID of the element used as a reference, and `anchor-to` which side of the anchor to use: "top", "bottom", "right", or "left"; with an optional postfix of "start" or "end" ("center" is the default). - -<p> - <img src="/static//img/anchors.png" alt="Anchor positioning" - width="595" height="324" style="display:block;margin:60px auto;" /> -</p> - -The positioning is done every time the popover opens, but you can trigger the re-position, for example, on windows resizing, by calling the `jxui-popover/setPosition(popover)` function. - - -## Styling states - -| CSS selector | Description -| ------------------- | -------------- -| `[popover]` | Every popover has this attribute -| `:popover-open` | This pseudo-class matches only popovers that are currently being shown -| `::backdrop` | This pseudo-element is a full-screen element placed directly behind showing popover elements in the top layer, allowing effects to be added to the page content behind the popover(s) if desired. You might for example want to blur out the content behind the popover to help focus the user's attention on it - - -## Closing modes - -A `Popover` can be of two types: "auto" or "manual". This is controlled by the `mode` argument. - -| Argument | Description -| ------------------ | -------------- -| `mode="auto"` | The `Popover` will close automatically when the user clicks outside of it, or when presses the Escape key. -| `mode="manual"` | The `Popover` will not close automatically. It will only close when the user clicks on a linked `PopButton` with `action="close"` or `action="toggle"`. - -If the `mode` argument is not set, it defaults to "auto". - - -## `PopButton` actions - -A `PopButton` can have an `action` argument, which can be set to one of three values: "open", "close", or "toggle". This argument determines what happens to the target `Popover` when the button is clicked. - -| Argument | Description -| ----------------- | -------------- -| `action="open"` | Opens the target `Popover`. If the `Popover` is already open, it has no effect. -| `action="close"` | Closes the target `Popover`. If the `Popover` is already closed, it has no effect. -| `action="toggle"` | This is the default action. It toggles the target `Pop – opening it if it's closed and closing it if it's open. - - -## Animating popovers - -Popovers are set to `display:none;` when hidden and `display:block;` when shown, as well as being removed from / added to the [top layer](https://developer.mozilla.org/en-US/docs/Glossary/Top_layer). Therefore, for popovers to be animated, the `display` property [needs to be animatable]. - -[Supporting browsers](https://developer.mozilla.org/en-US/docs/Web/CSS/display#browser_compatibility) animate `display` flipping between `none` and another value of `display` so that the animated content is shown for the entire animation duration. So, for example: - -- When animating `display` from `none` to `block` (or another visible `display` value), the value will flip to `block` at `0%` of the animation duration so it is visible throughout. -- When animating `display` from `block` (or another visible `display` value) to `none`, the value will flip to `none` at `100%` of the animation duration so it is visible throughout. - -<Callout> -When animating using CSS transitions, `transition-behavior:allow-discrete` needs to be set to enable the above behavior. When animating with CSS animations, the above behavior is available by default; an equivalent step is not required. -</Callout> - - -### Transitioning a popover - -When animating popovers with CSS transitions, the following features are required: - -- `@starting-style` at-rule - - Provides a set of starting values for properties set on the popover that you want to transition from when it is first shown. This is needed to avoid unexpected behavior. By default, CSS transitions only occur when a property changes from one value to another on a visible element; they are not triggered on an element's first style update, or when the `display` type changes from `none` to another type. - -- `display` property - - Add `display` to the transitions list so that the popover will remain as `display:block` (or another visible `display` value) for the duration of the transition, ensuring the other transitions are visible. - -- `overlay` property - - Include `overlay` in the transitions list to ensure the removal of the popover from the top layer is deferred until the transition completes, again ensuring the transition is visible. - -- `transition-behavior` property - - Set `transition-behavior:allow-discrete` on the `display` and `overlay` transitions (or on the `transition` shorthand) to enable discrete transitions on these two properties that are not by default animatable. - -For example, let's say the styles we want to transition are `opacity` and `transform`: we want the popover to fade in or out while moving down or up. - -To achieve this, we set a starting state for these properties on the hidden state of the popover element (selected with the `[popover]` attribute selector) and an end state for the shown state of the popover (selected via the `:popover-open` pseudo-class). We also use the `transition` property to define the properties to animate and the animation's duration as the popover gets shown or hidden: - -```css -/*** Transition for the popover itself ***/ -[popover]:popover-open { - opacity: 1; - transform: scaleX(1); -} -[popover] { - transition: all 0.2s allow-discrete; - /* Final state of the exit animation */ - opacity: 0; - transform: translateY(-3rem); -} -[popover]:popover-open { - opacity: 1; - transform: translateY(0); -} -/* Needs to be after the previous [popover]:popover-open rule -to take effect, as the specificity is the same */ -@starting-style { - [popover]:popover-open { - opacity: 0; - transform: translateY(-3rem); - } -} - -/*** Transition for the popover's backdrop ***/ -[popover]::backdrop { - /* Final state of the exit animation */ - background-color: rgb(0 0 0 / 0%); - transition: all 0.2s allow-discrete; -} -[popover]:popover-open::backdrop { - background-color: rgb(0 0 0 / 15%); -} -@starting-style { - [popover]:popover-open::backdrop { - background-color: rgb(0 0 0 / 0%); - } -} -``` - -You can see a working example of this in the demo [at the beginning of the page](#startpage). - -<Callout> -Because popovers change from <code>display:none</code> to <code>display:block</code> each time they are shown, the popover transitions from its <code>@starting-style</code> styles to its <code>[popover]:popover-open</code> styles every time the entry transition occurs. When the popover closes, it transitions from its <code>[popover]:popover-open</code> state to the default <code>[popover]</code> state. - -<b>So it is possible for the style transition on entry and exit to be different.</b> -</Callout> - -<Callout type="note"> -This section was adapted from [Animating popovers](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API/Using#animating_popovers) -by [Mozilla Contributors](https://developer.mozilla.org/en-US/docs/MDN/Community/Roles_teams#contributor), licensed under [CC-BY-SA 2.5](https://creativecommons.org/licenses/by-sa/2.5/). -</Callout> - - -## Component arguments - -### PopButton - -| Argument | Type | Default | Description -| --------------- | --------- | ---------- | -------------- -| `target` | `str` | | Required. The ID of the linked `Popover` component. -| `action` | `str` | `"toggle"` | `"open"`, `"close"`, or `"toggle"`. -| `tag` | `str` | `"button"` | HTML tag of the component. - -### Pop - -| Argument | Type | Default | Description -| ------------ | ----- | -------- | -------------- -| `mode` | `str` | `"auto"` | `"auto"` or `"manual"`. -| `anchor` | `str` | | ID of the element used as an anchor -| `anchor-to` | `str` | | Which side/position of the anchor to use: "**top**", "**bottom**", "**right**", or "**left**"; with an optional postfix of "**start**", "**end**", "**center**". -| `tag` | `str` | `"div"` | HTML tag of the component. - - -## Accessibility notes - -### Mouse interaction - -- Clicking a `PopButton` will trigger the button action (open, close, or toggle state). - -- Clicking outside of a `Popover` will close *all* the `Popover` with `mode="auto"`. - - -### Keyboard interaction - -- Pressing the <kbd>Enter</kbd> or <kbd>Space</kbd> keys on a `PopButton` will trigger -the button action (open, close, or toggle state), and close *all* the `Popover` with `mode="auto"`. - -- Pressing the <kbd>Escape</kbd> key will close *all* the `Popover` with `mode="auto"`. diff --git a/docs/content/ui/reldate.md b/docs/content/ui/reldate.md deleted file mode 100644 index e3624c8..0000000 --- a/docs/content/ui/reldate.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: Relative date -description: A component to convert datetimes to relative dates strings, such as "a minute ago", "in 2 hours", "yesterday", "3 months ago", etc. using JavaScript's Intl.RelativeTimeFormat API. ---- - -<Header title="Relative date" section="UI components"> -A component to convert datetimes to relative dates strings, -such as "a minute ago", "in 2 hours", "yesterday", "3 months ago", -etc. using JavaScript's <a class="link" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat" target="_blank">Intl.RelativeTimeFormat API</a>. -</Header> - -*Some examples (as if the datetime was `June 20th, 2024 6:30pm`)*: - -| Source | Relative date -| -----------------------------------------| -------------- -| `<RelDate datetime="2024-01-01"/>` | 6 months ago -| `<RelDate datetime="2024-06-19T18:30"/>` | yesterday -| `<RelDate datetime="2024-06-20T14:00"/>` | 5 hours ago -| `<RelDate datetime="2024-06-21T14:00"/>` | in 19 hours -| `<RelDate datetime="2024-06-30T10:00"/>` | next week -| `<RelDate datetime="1992-10-01"/>` | 32 years ago - - -## How it works - -The `RelDate` component is rendered as an empty `<time datetme="..." data-relative>` tag and, when the page load, the datetime is rendered by JavaScript. - -There is also a `MutationObserver` in place to render the datetime on any `<time datetme="..." data-relative>` inserted later to the page by JavaScript. - - -## Localization - -The locale used for the localization of the dates is, in order of priority: - -1. The optional `lang` attribute of the component; or -2. The `lang` attribute of the `<body>` tag - -Both can be a comma-separated lists of locales (e.g.: `"en-US,en-UK,en`). If none of these attributes exists, or if the locales are not supported by the browser, it fallsback to the default browser language. - -*Some examples (as if the datetime was `June 20th, 2024 6:30pm`)*: - -| Source | Relative date -| ---------------------------------------------------------------| -------------- -| `<RelDate datetime="2024-01-01" lang="it"/> ` | 6 mesi fa -| `<RelDate datetime="2024-06-19T18:30" lang="fr"/>` | hier -| `<RelDate datetime="2024-06-21T14:00" lang="es"/>` | dentro de 19 horas -| `<RelDate datetime="2024-06-21T14:00" lang="es-PE,es-ES,es"/>` | dentro de 19 horas - - -## Component arguments - -## RelDate - -| Argument | Type | Description -| -----------| ----- | -------------- -| `datetime` | `str` | Required. -| `lang` | `str` | Optional comma-separated list of locales to use for formatting. If not defined, the attribute `lang` of the `<body>` tag will be used. If that is also not defined, or none of the locales are supported by the browser, the default browser language is used -| `now` | `str` | Optional ISO-formatted date to use as the "present time". Useful for testing. diff --git a/docs/content/ui/tabs.md b/docs/content/ui/tabs.md deleted file mode 100644 index 094e271..0000000 --- a/docs/content/ui/tabs.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: Tabs -description: Easily create accessible, fully customizable tab interfaces, with robust focus management and keyboard navigation support. ---- - -<Header title="Tabs" section="UI components"> - Easily create accessible, fully customizable tab interfaces, with robust focus management and keyboard navigation support. -</Header> - -<ExampleTabs - prefix="demo" - panels={{ { - 'Result': 'ui.Tabs.DemoResult', - 'HTML': 'ui.Tabs.DemoHTML', - 'CSS': 'ui.Tabs.DemoCSS', - } }} -/> - -Tabs are built using the `TabGroup`, `TabList`, `Tab`, and `TabPanel` components. Clicking on any tab or selecting it with the keyboard will activate the corresponding panel. - - -## Styling states - -| CSS selector | Description -| --------------- | -------------- -| `.ui-hidden` | Added to all `TabPanel` except the one that is active. -| `.ui-selected` | Added to the selected `Tab`. -| `.ui-disabled` | Added to disabled `Tab`s. - - -## Disabling a tab - -To disable a tab, use the disabled attribute on the `Tab` component. Disabled tabs cannot be selected with the mouse, and are also skipped when navigating the tab list using the keyboard. - -<Callout type="warning"> -Disabling tabs might be confusing for users. Instead, I reccomend you either remove it or explain why there is no content for that tab when is selected. -</Callout> - - -## Manually activating tabs - -By default, tabs are automatically selected as the user navigates through them using the arrow kbds. - -If you'd rather not change the current tab until the user presses <kbd>Enter</kbd> or <kbd>Space</kbd>, use the `manual` attribute on the `TabGroup` component. - -Remember to add styles to the `:focus` state of the tab so is clear to the user that the tab is focused. - -<ExampleTabs - prefix="manual" - panels={{{ - 'HTML': 'ui.Tabs.ManualHTML', - 'Result': 'ui.Tabs.ManualResult', - } }} -/> - -The manual prop has no impact on mouse interactions — tabs will still be selected as soon as they are clicked. - - -## Vertical tabs - -If you've styled your `TabList` to appear vertically, use the `vertical` attribute to enable navigating with the <kbd title="arrow up">↑</kbd> and <kbd title="arrow down">↓</kbd> arrow kbds instead of <kbd title="arrow left">←</kbd> and <kbd title="arrow right">→</kbd>, and to update the `aria-orientation` attribute for assistive technologies. - -<ExampleTabs - prefix="vertical" - panels={{ { - 'HTML': 'ui.Tabs.VerticalHTML', - 'Result': 'ui.Tabs.VerticalResult', - } }} -/> - - -## Controlling the tabs with a `<select>` - -Sometimes, you want to display a `<select>` element in addition to tabs. To do so, use the `TabSelect` and `TabOption` components. -A `TabSelect` component is a wrapper for a `<select>` element, and it accepts `TabOption` components as children. - -Note that a `TabSelect` **is not a replacement for a `TabList`**. For accessibility the `TabList` must be remain in your code, even if it's visually hidden. - -<ExampleTabs - prefix="select" - :panels="{ - 'HTML': 'ui.Tabs.SelectHTML', - 'Result': 'ui.Tabs.SelectResult', - }" -/> - - -## Component arguments - -### TabGroup - -| Argument | Type | Default | Description -| ----------- | -------- | ---------- | -------------- -| tag | `str` | `"div"` | HTML tag used for rendering the wrapper. - -### TabList - -| Argument | Type | Default | Description -| ----------- | -------- | ---------- | -------------- -| vertical | `bool` | `false` | Use the <kbd title="arrow up">↑</kbd> and <kbd title="arrow down">↓</kbd> arrow kbds to move between tabs instead of the defaults <kbd title="arrow left">←</kbd> and <kbd title="arrow right">→</kbd> arrow kbds. -| manual | `bool` | `false` | If `true`, selecting a tab with the keyboard won't activate it, you must press <kbd>Enter</kbd> os <kbd>Space</kbd> kbds to do it. -| tag | `str` | `"nav"` | HTML tag used for rendering the wrapper. - - -### Tab - -| Argument | Type | Default | Description -| ----------- | -------- | ---------- | -------------- -| target | `str` | | Required. HTML id of the panel associated with this tab. -| selected | `bool` | `false` | Initially selected tab. Only one tab in the `TabList` can be selected at the time. -| disabled | `bool` | `false` | If the tab can be selected. -| tag | `str` | `"button"` | HTML tag used for rendering the tab. - -### TabPanel - -| Argument | Type | Default | Description -| ----------- | -------- | ---------- | -------------- -| hidden | `bool` | `false` | Initially hidden panel. -| tag | `bool` | `"div"` | HTML tag used for rendering the panel. - - -### TabSelect - -No arguments. - - -### TabOption - -| Argument | Type | Default | Description -| ----------- | -------- | ---------- | -------------- -| target | `str` | | Required. HTML id of the panel associated with this tab. -| disabled | `bool` | `false` | Display the option but not allow to select it. - - -## Events - -A tab emits a `jxui:tab:selected` event every time is selected. The event contains the `target` property with the tag node. - -```js -document.addEventListener("jxui:tab:selected", (event) => { - console.log(`'${event.target.textContent}' tab selected`); -}); -``` - - -## Accessibility notes - -### Mouse interaction - -Clicking a `Tab` will select that tab and display the corresponding `TabPanel`. - -### Keyboard interaction - -All interactions apply when a `Tab` component is focused. - -| Command | Description -| ------------------------------------------------------------------------------------- | ----------- -| <kbd title="arrow left">←</kbd> / <kbd title="arrow right">→</kbd> arrow kbds | Selects the previous/next non-disabled tab, cycling from last to first and vice versa. -| <kbd title="arrow up">↑</kbd> / <kbd title="arrow down">↓</kbd> arrow kbds when `vertical` is set | Selects the previous/next non-disabled tab, cycling from last to first and vice versa. -| <kbd>Enter</kbd> or <kbd>Space</kbd> when `manual` is set | Activates the selected tab -| <kbd>Home</kbd> or <kbd>PageUp</kbd> | Activates the **first** tab -| <kbd>End</kbd> or <kbd>PageDown</kbd> | Activates the **last** tab diff --git a/docs/deploy.sh b/docs/deploy.sh deleted file mode 100755 index 9fe8897..0000000 --- a/docs/deploy.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -python docs.py build -ssh code 'rm -rf /var/www/jinjax/build' -rsync --recursive --delete --progress build code:/var/www/jinjax/ diff --git a/docs/docs.py b/docs/docs.py deleted file mode 100755 index d49699f..0000000 --- a/docs/docs.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python -import logging -from pathlib import Path - -import jinjax_ui -from claydocs import Docs - - -logging.getLogger("jinjax").setLevel(logging.INFO) -logging.getLogger("jinjax").addHandler(logging.StreamHandler()) - -here = Path(__file__).parent - -pages = [ - "index.md", - [ - "Guide", - [ - "guide/index.md", - "guide/components.md", - "guide/slots.md", - "guide/css_and_js.md", - # "guide/integrations.md", - # "guide/performance.md", - "guide/motivation.md", - ], - ], - [ - "API", - [ - "api.md", - ], - ], - [ - "UI components", [ - "ui/index.md", - "ui/tabs.md", - "ui/popover.md", - "ui/menu.md", - "ui/accordion.md", - "ui/linkedlist.md", - "ui/reldate.md", - ], - ], -] - -def get_docs() -> Docs: - root_path = here / "content" - docs = Docs( - pages, - content_folder=root_path, - add_ons=[jinjax_ui], - search=False, - cache=False, - domain="https://jinjax.scaletti.dev", - default_component="Page", - default_social="SocialCard", - metadata={ - "name": "JinjaX", - "language": "en", - "license": "MIT", - "version": "0.43", - "web": "https://jinjax.scaletti.dev", - } - ) - docs.add_folder(here / "components") - docs.add_folder(here / "theme") - return docs - - -if __name__ == "__main__": - get_docs().run() diff --git a/docs/indexer.js b/docs/indexer.js deleted file mode 100644 index 637645b..0000000 --- a/docs/indexer.js +++ /dev/null @@ -1,27 +0,0 @@ -var lunr = require("lunr"); -require("lunr-languages/lunr.stemmer.support")(lunr); -const fs = require("node:fs"); - -function build_index([lang, outpath]) { - lang = lang || "en" - outpath = outpath || "." - - if (lang !== "en") { - const lunr_lang = require(`lunr-languages/lunr.${lang}`)(lunr); - this.use(lunr_lang); - } - - const idx = lunr(function() { - this.ref("id"); - this.field("title", { boost: 10 }); - this.field("body"); - const docs = JSON.parse(fs.readFileSync(`${outpath}/docs-${lang}.json`)); - - for (let doc in docs) { - this.add(doc) - } - }) - fs.writeFileSync(`${outpath}/search-${lang}.json`, JSON.stringify(idx)); -} - -build_index(process.argv.slice(2)); diff --git a/docs/static/docs.css b/docs/static/docs.css deleted file mode 100644 index 30c9898..0000000 --- a/docs/static/docs.css +++ /dev/null @@ -1,413 +0,0 @@ -.bg-cover { - position: absolute; - z-index: -1; - inset: 0; -} - -.Logo { - display: flex; - height: 2.5rem; - align-items: center; - color: rgb(24 24 27); - opacity: 0.9; - - &:hover { - opacity: 1; - } - & img.light { - display: block; - } - & img.dark { - display: none; - } - &:is(.dark *) img.light { - display: none; - } - &:is(.dark *) img.dark { - display: block; - } -} - -.NavLinks { - & a { - padding: 0.25rem; - font-size: 0.875rem; - line-height: 1.25rem; - color: rgb(82 82 91); - } - & a:hover { - color: rgb(24 24 27); - } - - & a:is(.dark *) { - color: rgb(212 212 216); - } - & a:is(.dark *):hover { - color: rgb(255 255 255); - } -} - -.homepage { - padding-top: 0; - padding-bottom: 0; - padding-left: var(--cd-padding-left); - padding-right: var(--cd-padding-right); -} -.homepage section.hero { - margin-left: auto; - margin-right: auto; - display: flex; - max-width: 56rem; - flex-direction: column; - padding-top: 2.25rem; - padding-bottom: 2.25rem; - color: rgb(23 23 23); - - &:is(.dark *) { - color: rgb(245 245 245); - } - - & h1 { - margin: 0 auto; - width: 300px; - height: 140px; - background-image: url("/static/img/jinjax-logo.svg"); - background-position: center center; - background-repeat: no-repeat; - background-size: contain; - text-indent: -999px; - display: none; - } - - & h2 { - font-size: 2.2rem; - font-weight: 600; - line-height: 1.2; - letter-spacing: -0.05em; - } - & h2 .g1 { - background-image: linear-gradient(to bottom right, #fbbf24, #fb923c); - background-clip: text; - color: transparent; - } - - & h2 .g2 { - background-image: linear-gradient(to bottom right, #34d399, #3b82f6); - background-clip: text; - color: transparent; - } - - @media (min-width: 768px) { - & { - padding-top: 2.5rem; - padding-bottom: 3rem; - } - & h1 { - display: block; - width: 300px; - height: 100px; - } - & h2 { - font-size: 2.4rem; - text-align: center; - } - & h2 .g2 { - white-space: nowrap; - } - } - - @media (min-width: 1024px) { - & h1 { - width: 400px; - height: 140px; - } - & h2 { - font-size: 3rem; - } - } -} - -.homepage section.code { - margin-left: -1rem; - margin-right: -1rem; - max-width: 72rem; - border-width: 1px; - border-color: rgb(212 212 212); - background-color: rgb(231 229 228); - padding: 1.5rem 0; - - &:is(.dark *) { - border-color: rgb(82 82 82); - background-color: rgb(41 37 36); - } - - & .panel { - display: flex; - flex-direction: column; - } - & .panel ~ .panel { - margin-top: 1.5rem; - } - & h2 { - margin-bottom: 0.5rem; - text-align: center; - font-size: 1.5rem; - line-height: 1.1; - font-weight: 700; - } - & .highlight { - flex-grow: 1; - } - & pre { - height: 100%; - } - - @media (min-width: 1024px) { - & { - border-radius: 1rem; - padding: 1.5rem; - margin-bottom: 2.5rem; - margin-left: auto; - margin-right: auto; - } - & .stack { - display: flex; - align-items: stretch; - } - & .panel { - width: 50%; - } - & .panel ~ .panel { - margin-top: 0; - margin-left: 0.5rem; - } - } -} - -.homepage section.features { - margin-left: auto; - margin-right: auto; - max-width: 56rem; - padding-top: 2rem; - padding-bottom: 2rem; - - & h2 { - margin-bottom: 2rem; - text-align: center; - font-size: 2.2rem; - line-height: 1.2; - font-weight: 800; - } - & h2 code { - font-size: 0.9em; - } - & .cards { - margin-top: 2.5rem; - display: grid; - grid-template-columns: repeat(1, minmax(0, 1fr)); - column-gap: 1rem; - row-gap: 1.5rem; - font-size: 1rem; - line-height: 1.4rem; - } - & .card { - margin-left: auto; - margin-right: auto; - display: flex; - flex-direction: column; - height: 9rem; - max-width: 28rem; - border-radius: 1rem; - border-width: 2px; - border-color: rgb(245 245 244); - background-color: rgb(250 250 249); - padding-top: 1rem; - padding-bottom: 1rem; - padding-left: 1.5rem; - padding-right: 1.5rem; - box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); - } - & .card:is(.dark *) { - border-color: rgb(41 37 36); - background-color: rgb(41 37 36); - } - & .card > .header { - margin-bottom: 0.5rem; - display: flex; - align-items: center; - flex-direction: row-reverse; - } - & .card > .header img { - float: left; - max-height: 32px; - width: 2.5rem; - padding-right: 0.75rem; - } - & .card > .header img:is(.dark *) { - filter: invert(100%) - } - & .card > .header h3 { - font-size: 1.4rem; - font-weight: 600; - color: rgb(24 24 27); - } - & .card > .header h3:is(.dark *) { - color: rgb(228 228 231); - } - & .card > .body { - flex-grow: 1; - margin-top: 0.5rem; - font-size: 1rem; - line-height: 1.4; - color: rgb(82 82 91); - } - & .card a { - font-weight: 600; - } - - @media (min-width: 768px) { - & .cards { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - & .card { - height: 10rem; - } - } - - @media (min-width: 1280px) { - & { - max-width: 1280px; - } - & .cards { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } - & .card { - height: 13rem; - align-items: flex-start; - padding-top: 1.5rem; - padding-bottom: 1.5rem; - } - } -} - -.homepage section.spaghetti { - margin-bottom: 1.25rem; - padding-left: var(--cd-padding-left); - padding-right: var(--cd-padding-right); - - & .wrapper { - margin-left: auto; - margin-right: auto; - max-width: 64rem; - padding-left: 0.75rem; - padding-right: 0.75rem; - padding-top: 2rem; - padding-bottom: 2rem; - } - - & h2 { - margin-bottom: 2rem; - text-align: center; - font-size: 2.2rem; - line-height: 1.2; - font-weight: 800; - } - - & .text { - position: relative; - font-size: 1.4rem; - line-height: 1.4; - } - & .text img { - position: absolute; - left: 0; - top: 0; - display: none; - height: 100%; - max-height: 24rem; - } - & .text p { - margin-bottom:1.5rem; - } - - @media (min-width: 640px) { - & .wrapper { - padding-top: 3rem; - padding-bottom: 3rem; - } - } - - @media (min-width: 1024px) { - & .wrapper { - max-width: 72rem; - } - & .text { - padding-left: 440px; - } - & .text img { - display: block; - } - } -} - -.homepage section.engage { - background-image: linear-gradient(to bottom, #d6d3d1, #e7e5e4, #a8a29e); - margin-left: -1rem; - margin-right: -1rem; - - &:is(.dark *) { - background-image: linear-gradient(to bottom, #000, #1c1917); - } - - & .wrapper { - padding-top: 3rem; - padding-bottom: 3rem; - text-align: center; - } - - & h3 { - margin-bottom: 2rem; - text-align: center; - font-size: 1.875rem; - line-height: 1.4; - font-weight: 800; - } - - & a { - display: flex-inline; - align-items: center; - justify-content: center; - margin-left: auto; - margin-right: auto; - margin-bottom: 1.25rem; - display: inline-block; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - border-radius: 1rem; - background-image: linear-gradient(to top right, #a3e635, #65a30d); - padding: 1rem 2rem; - text-align: center; - font-family: var(--cd-font-sans); - font-size: 1.25rem; - line-height: 1.75rem; - font-weight: 700; - color: rgb(39 39 42); - text-decoration-line: none; - box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); - transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1); - } - & a:hover { - background-image: linear-gradient(to top right, #a3e635, #a3e635); - color: rgb(0 0 0); - } - & a i { - font-style: normal; - font-size: 1.2rem; - } - - & .hint { - font-size: 0.75rem; - line-height: 1rem; - } -}
\ No newline at end of file diff --git a/docs/static/favicon.ico b/docs/static/favicon.ico Binary files differdeleted file mode 100644 index 3615f29..0000000 --- a/docs/static/favicon.ico +++ /dev/null diff --git a/docs/static/fonts/karla-bold-ext.woff2 b/docs/static/fonts/karla-bold-ext.woff2 Binary files differdeleted file mode 100644 index 88c185a..0000000 --- a/docs/static/fonts/karla-bold-ext.woff2 +++ /dev/null diff --git a/docs/static/fonts/karla-bold.woff2 b/docs/static/fonts/karla-bold.woff2 Binary files differdeleted file mode 100644 index 244e69d..0000000 --- a/docs/static/fonts/karla-bold.woff2 +++ /dev/null diff --git a/docs/static/fonts/karla-regular-.woff2 b/docs/static/fonts/karla-regular-.woff2 Binary files differdeleted file mode 100644 index 244e69d..0000000 --- a/docs/static/fonts/karla-regular-.woff2 +++ /dev/null diff --git a/docs/static/fonts/karla-regular-ext.woff2 b/docs/static/fonts/karla-regular-ext.woff2 Binary files differdeleted file mode 100644 index 88c185a..0000000 --- a/docs/static/fonts/karla-regular-ext.woff2 +++ /dev/null diff --git a/docs/static/fonts/material-symbols-rounded.woff2 b/docs/static/fonts/material-symbols-rounded.woff2 Binary files differdeleted file mode 100644 index 0200f5e..0000000 --- a/docs/static/fonts/material-symbols-rounded.woff2 +++ /dev/null diff --git a/docs/static/img/anatomy-en.png b/docs/static/img/anatomy-en.png Binary files differdeleted file mode 100644 index d880437..0000000 --- a/docs/static/img/anatomy-en.png +++ /dev/null diff --git a/docs/static/img/anatomy-en.svg b/docs/static/img/anatomy-en.svg deleted file mode 100644 index bacfb60..0000000 --- a/docs/static/img/anatomy-en.svg +++ /dev/null @@ -1,347 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - width="420" - height="440" - version="1.1" - viewBox="0 0 420 440" - id="svg151" - sodipodi:docname="anatomy-en.svg" - inkscape:export-filename="/media/data/anatomy-en.png" - inkscape:export-xdpi="223.41818" - inkscape:export-ydpi="223.41818" - inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> - <sodipodi:namedview - id="namedview153" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageshadow="2" - inkscape:pageopacity="0.0" - inkscape:pagecheckerboard="0" - showgrid="false" - inkscape:zoom="2.3136364" - inkscape:cx="172.45579" - inkscape:cy="357.66208" - inkscape:window-width="1280" - inkscape:window-height="740" - inkscape:window-x="0" - inkscape:window-y="0" - inkscape:window-maximized="1" - inkscape:current-layer="svg151" /> - <defs - id="defs5"> - <marker - id="TriangleStart" - overflow="visible" - markerHeight="2.6867051" - markerWidth="2.3239999" - orient="auto-start-reverse" - preserveAspectRatio="xMidYMid" - viewBox="0 0 5.3244081 6.1553851"> - <path - transform="scale(.6)" - d="m5.8 0-8.6 5v-10z" - fill="context-stroke" - fill-rule="evenodd" - stroke="context-stroke" - stroke-width="1pt" - id="path2" /> - </marker> - </defs> - <rect - width="420" - height="440" - fill="#ffffff" - fill-opacity="0.85" - stroke="#dddddd" - id="rect7" - x="0.40752804" - y="1.6170791" - inkscape:export-filename="/home/jpsca/Code/jinjax/docs/static/img/anatomy-en.png" - inkscape:export-xdpi="223.418" - inkscape:export-ydpi="223.418" /> - <path - d="m17 98h320" - stroke="#555" - stroke-width="1px" - id="path9" - inkscape:export-filename="/home/jpsca/Code/jinjax/docs/static/img/anatomy-en.png" - inkscape:export-xdpi="223.418" - inkscape:export-ydpi="223.418" /> - <text - id="code" - fill="#444444" - font-family="'SF Mono', Monaco, monospace" - font-size="11px" - font-weight="bold" - stroke-width="1.4" - style="line-height:1.25;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal" - inkscape:export-filename="/home/jpsca/Code/jinjax/docs/static/img/anatomy-en.png" - inkscape:export-xdpi="223.418" - inkscape:export-ydpi="223.418"><tspan - sodipodi:role="line" - id="tspan83456" - x="17" - y="90"><tspan - x="17" - y="90" - font-style="italic" - font-weight="600" - id="tspan8">components/Form.jinja</tspan><tspan - x="17" - y="131" - id="tspan10">{#def action, label, method="post" #}</tspan><tspan - x="17" - y="145" - id="tspan12" /></tspan><tspan - sodipodi:role="line" - id="tspan83458" - x="17" - y="103.75"><tspan - x="17" - y="145" - id="tspan83460" /></tspan><tspan - sodipodi:role="line" - x="17" - y="145" - id="tspan83494"><tspan - x="17" - y="145" - id="tspan83496">{#css form.css, /static/theme.css #}</tspan><tspan - x="17" - y="160" - id="tspan14">{#js form.js #}</tspan><tspan - x="17" - y="187" - fill="#555555" - id="tspan16">{% set method = method.lower() %}</tspan><tspan - x="17" - y="215" - fill="#3771c8" - id="tspan22"><tspan - id="tspan18"><</tspan><tspan - id="tspan20">form</tspan></tspan><tspan - x="24" - y="229" - id="tspan32"><tspan - fill="#5f8dd3" - id="tspan24">method=</tspan><tspan - fill="#008800" - id="tspan26">"</tspan><tspan - fill="#ff7f2a" - id="tspan28">{{ method }}</tspan><tspan - fill="#008800" - id="tspan30">"</tspan></tspan><tspan - x="24" - y="244" - id="tspan42"><tspan - fill="#5f8dd3" - id="tspan34">action=</tspan><tspan - fill="#008800" - id="tspan36">"</tspan><tspan - fill="#ff7f2a" - id="tspan38">{{ action }}</tspan><tspan - fill="#008800" - id="tspan40">"</tspan></tspan><tspan - x="24" - y="257" - fill="#ff7f2a" - id="tspan46">{{ attrs.render(<tspan - id="tspan44">class="form"</tspan>) }}</tspan><tspan - x="17" - y="272" - fill="#3771c8" - id="tspan48">></tspan><tspan - x="24" - y="286" - fill="#555555" - id="tspan50">{% if method == "post" -%}</tspan><tspan - x="24" - y="299" - fill="#3771c8" - id="tspan60"><input <tspan - fill="#5f8dd3" - id="tspan58">type=<tspan - fill="#008800" - id="tspan52">"hidden"</tspan> name=<tspan - fill="#008800" - id="tspan54">"csrf"</tspan> value="<tspan - fill="#ff7f2a" - id="tspan56">{{token}}</tspan>" /></tspan></tspan><tspan - x="24" - y="314" - fill="#555555" - id="tspan62">{% endif -%}</tspan><tspan - x="24" - y="341" - id="tspan66"><tspan - fill="#ff7f2a" - id="tspan64">{{ content }}</tspan></tspan><tspan - x="24" - y="370" - fill="#214478" - id="tspan72"><Button :label=<tspan - fill="#008800" - id="tspan53">"label"</tspan> /></tspan><tspan - x="17" - y="386" - fill="#3771c8" - id="tspan76"></<tspan - fill="#3771c8" - font-weight="bold" - id="tspan74">form</tspan>></tspan></tspan></text> - <g - id="arrows" - transform="translate(0.44852325)" - inkscape:export-filename="/home/jpsca/Code/jinjax/docs/static/img/anatomy-en.png" - inkscape:export-xdpi="223.418" - inkscape:export-ydpi="223.418"> - <path - d="m 96,49 c 13,28 24,0.84 25,24" - fill="none" - marker-end="url(#TriangleStart)" - stroke="#000000" - stroke-width="1.7" - id="path94" /> - <path - d="m 263.05173,66.190373 c 3.21374,29.013609 -66.83732,10.210641 -66.83732,43.210637" - fill="none" - marker-end="url(#TriangleStart)" - stroke="#000000" - stroke-width="1.7" - id="path96" - sodipodi:nodetypes="cc" /> - <path - d="m 299.74715,171.9951 c -24.29574,-13.93589 13.75099,-34.69573 -30.19646,-30.86252" - fill="none" - marker-end="url(#TriangleStart)" - stroke="#000000" - stroke-width="1.7" - id="path98" - sodipodi:nodetypes="cc" /> - <path - d="M 299.74715,171.9951 C 282.96418,161.72557 170.13518,157.37012 132.6202,158.53979" - fill="none" - marker-end="url(#TriangleStart)" - stroke="#000000" - stroke-width="1.7" - id="path100" - sodipodi:nodetypes="cc" /> - <path - d="m 169,404 c -11,-17 -39.53849,-5.19589 -47.53849,-23.49589" - fill="none" - marker-end="url(#TriangleStart)" - stroke="#000000" - stroke-width="1.7" - id="path102" - sodipodi:nodetypes="cc" /> - </g> - <text - style="font-size:12px;font-family:'Comic Neue'" - transform="matrix(0.99580394,0,0,0.99717236,22.306709,8.8220192)" - id="text111" - inkscape:export-filename="/home/jpsca/Code/jinjax/docs/static/img/anatomy-en.png" - inkscape:export-xdpi="223.418" - inkscape:export-ydpi="223.418"><tspan - x="0" - y="11" - id="tspan105">Everything before the </tspan><tspan - x="0" - y="30" - id="tspan107">first dot is the component </tspan><tspan - x="0" - y="48" - id="tspan109">name</tspan></text> - <text - style="font-size:12px;font-family:'Comic Neue'" - transform="matrix(0.99585975,0,0,0.94509234,216.62806,15.846205)" - id="text115" - inkscape:export-filename="/home/jpsca/Code/jinjax/docs/static/img/anatomy-en.png" - inkscape:export-xdpi="223.418" - inkscape:export-ydpi="223.418"><tspan - x="0" - y="6" - id="tspan113">Arguments definition</tspan></text> - <text - style="font-size:12px;font-family:'Comic Neue'" - transform="matrix(0.99962611,0,0,0.98554306,218.63043,28.835757)" - id="text121" - inkscape:export-filename="/home/jpsca/Code/jinjax/docs/static/img/anatomy-en.png" - inkscape:export-xdpi="223.418" - inkscape:export-ydpi="223.418"><tspan - x="0" - y="11" - id="tspan117">Arguments without a </tspan><tspan - x="0" - y="30" - id="tspan119">default value are required</tspan></text> - <text - style="font-size:12px;font-family:'Comic Neue';white-space:pre;inline-size:102.594" - transform="matrix(1.0036128,0,0,0.99557292,305.3546,154.45222)" - id="text127" - inkscape:export-filename="/home/jpsca/Code/jinjax/docs/static/img/anatomy-en.png" - inkscape:export-xdpi="223.418" - inkscape:export-ydpi="223.418" - xml:space="preserve"><tspan - x="0" - y="11" - id="tspan1018">Optional lists of </tspan><tspan - x="0" - y="26" - id="tspan1020">CSS and JS files</tspan></text> - <text - style="font-size:12px;font-family:'Comic Neue';white-space:pre;inline-size:138.046" - transform="translate(277.91845,188.39939)" - id="text135" - inkscape:export-filename="/home/jpsca/Code/jinjax/docs/static/img/anatomy-en.png" - inkscape:export-xdpi="223.418" - inkscape:export-ydpi="223.418" - xml:space="preserve"><tspan - x="0" - y="11" - id="tspan1022">Paths are absolute or </tspan><tspan - x="0" - y="26" - id="tspan1024">relative to the root of -</tspan><tspan - x="0" - y="41" - id="tspan1026">the components folder</tspan></text> - <text - style="font-size:12px;font-family:'Comic Neue'" - transform="matrix(0.99764329,0,0,0.98692271,247.4097,314.31427)" - id="text143" - inkscape:export-filename="/home/jpsca/Code/jinjax/docs/static/img/anatomy-en.png" - inkscape:export-xdpi="223.418" - inkscape:export-ydpi="223.418"><tspan - x="0" - y="11" - id="tspan137">You can have more </tspan><tspan - x="0" - y="30" - id="tspan139">than one parent </tspan><tspan - x="0" - y="48" - id="tspan141">element, unlike React</tspan></text> - <text - style="font-size:12px;font-family:'Comic Neue';white-space:pre;inline-size:165.6" - transform="matrix(0.9980174,0,0,0.98858774,171.78044,387.36773)" - id="text149" - inkscape:export-filename="/home/jpsca/Code/jinjax/docs/static/img/anatomy-en.png" - inkscape:export-xdpi="223.418" - inkscape:export-ydpi="223.418" - xml:space="preserve"><tspan - x="0" - y="11" - id="tspan1028">You can call any other </tspan><tspan - x="0" - y="26" - id="tspan1030">component and pass attributes </tspan><tspan - x="0" - y="41" - id="tspan1032">to them</tspan></text> -</svg> diff --git a/docs/static/img/anatomy-es.svg b/docs/static/img/anatomy-es.svg deleted file mode 100644 index a3b3952..0000000 --- a/docs/static/img/anatomy-es.svg +++ /dev/null @@ -1,288 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - width="420" - height="440" - version="1.1" - viewBox="0 0 420 440" - id="svg151" - sodipodi:docname="anatomy-es.svg" - inkscape:export-filename="/media/data/Code/jinjax-docs/static/img/anatomy-es.png" - inkscape:export-xdpi="223.41818" - inkscape:export-ydpi="223.41818" - inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> - <sodipodi:namedview - id="namedview153" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageshadow="2" - inkscape:pageopacity="0.0" - inkscape:pagecheckerboard="0" - showgrid="false" - inkscape:zoom="1.1568182" - inkscape:cx="14.695481" - inkscape:cy="220.86444" - inkscape:window-width="2560" - inkscape:window-height="1357" - inkscape:window-x="0" - inkscape:window-y="0" - inkscape:window-maximized="1" - inkscape:current-layer="svg151" /> - <defs - id="defs5"> - <marker - id="TriangleStart" - overflow="visible" - markerHeight="2.6867051" - markerWidth="2.3239999" - orient="auto-start-reverse" - preserveAspectRatio="xMidYMid" - viewBox="0 0 5.3244081 6.1553851"> - <path - transform="scale(.6)" - d="m5.8 0-8.6 5v-10z" - fill="context-stroke" - fill-rule="evenodd" - stroke="context-stroke" - stroke-width="1pt" - id="path2" /> - </marker> - </defs> - <rect - width="420" - height="440" - fill="#fff" - fill-opacity=".85" - stroke="#ddd" - id="rect7" /> - <path - d="m17 98h320" - stroke="#555" - stroke-width="1px" - id="path9" /> - <text - id="code" - fill="#444" - font-family="'SF Mono', Monaco, monospace" - font-size="11px" - font-weight="bold" - stroke-width="1.4" - style="font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;line-height:1.25"><tspan - x="17" - y="90" - font-style="italic" - font-weight="600" - id="tspan1151">components/Form.jinja</tspan><tspan - x="17" - y="131" - id="tspan1153">{#def action, label, method="post" #}</tspan><tspan - x="17" - y="145" - id="tspan1155">{#css form.css %}</tspan><tspan - x="17" - y="160" - id="tspan1157">{#js form.js %}</tspan><tspan - x="17" - y="187" - fill="#555" - id="tspan1159">{% set method = method.lower() %}</tspan><tspan - x="17" - y="215" - fill="#3771c8" - id="tspan1165"><tspan - id="tspan1161"><</tspan><tspan - id="tspan1163">form</tspan></tspan><tspan - x="24" - y="229" - id="tspan1175"><tspan - fill="#5f8dd3" - id="tspan1167">method=</tspan><tspan - fill="#080" - id="tspan1169">"</tspan><tspan - fill="#ff7f2a" - id="tspan1171">{{ method }}</tspan><tspan - fill="#080" - id="tspan1173">"</tspan></tspan><tspan - x="24" - y="244" - id="tspan1185"><tspan - fill="#5f8dd3" - id="tspan1177">action=</tspan><tspan - fill="#080" - id="tspan1179">"</tspan><tspan - fill="#ff7f2a" - id="tspan1181">{{ action }}</tspan><tspan - fill="#080" - id="tspan1183">"</tspan></tspan><tspan - x="24" - y="257" - fill="#ff7f2a" - id="tspan1189">{{ attrs.render(<tspan - id="tspan1187">class="form"</tspan>) }} - </tspan><tspan - x="17" - y="272" - fill="#3771c8" - id="tspan1191">></tspan><tspan - x="24" - y="286" - fill="#555" - id="tspan1193">{% if method == "post" -%}</tspan><tspan - x="24" - y="299" - fill="#3771c8" - id="tspan1203"> - <input <tspan - fill="#5f8dd3" - id="tspan1201">type=<tspan - fill="#080" - id="tspan1195">"hidden"</tspan> name=<tspan - fill="#080" - id="tspan1197">"csrf"</tspan> value="<tspan - fill="#ff7f2a" - id="tspan1199">{{token}}</tspan>" /></tspan></tspan><tspan - x="24" - y="314" - fill="#555" - id="tspan1205">{% endif -%}</tspan><tspan - x="24" - y="341" - id="tspan1209"><tspan - fill="#ff7f2a" - id="tspan1207">{{ content }}</tspan></tspan><tspan - x="24" - y="370" - fill="#214478" - id="tspan1215"> - <Button <tspan - fill="#5f8dd3" - id="tspan1211">label=</tspan><tspan - fill="#ff7f2a" - id="tspan1213">{label}</tspan>> - </tspan><tspan - x="17" - y="386" - fill="#3771c8" - id="tspan1219"></<tspan - fill="#3771c8" - font-weight="bold" - id="tspan1217">form</tspan>></tspan></text> - <g - id="arrows"> - <path - d="m96 49c13 28 24 .84 25 24" - fill="none" - marker-end="url(#TriangleStart)" - stroke="#000" - stroke-width="1.7" - id="path94" /> - <path - d="m255 65c13 28-60 16-60 49" - fill="none" - marker-end="url(#TriangleStart)" - stroke="#000" - stroke-width="1.7" - id="path96" /> - <path - d="m260 151c-26 6.7-74-7.6-108-9.2" - fill="none" - marker-end="url(#TriangleStart)" - stroke="#000" - stroke-width="1.7" - id="path98" /> - <path - d="m262 158c-26 5.2-91-.74-124-2" - fill="none" - marker-end="url(#TriangleStart)" - stroke="#000" - stroke-width="1.7" - id="path100" /> - <path - d="m169 404c-11-17-56-3.7-64-22" - fill="none" - marker-end="url(#TriangleStart)" - stroke="#000" - stroke-width="1.7" - id="path102" /> - </g> - <text - style="font-size:12px;font-family:'Comic Neue'" - transform="matrix(0.99580394,0,0,0.99717236,22.306709,8.8220192)" - id="text111"><tspan - x="0" - y="11" - id="tspan105">Todo antes del primer </tspan><tspan - x="0" - y="30" - id="tspan107">punto es el nombre del </tspan><tspan - x="0" - y="48" - id="tspan109">componente</tspan></text> - <text - style="font-size:12px;font-family:'Comic Neue'" - transform="matrix(0.99585975,0,0,0.94509234,216.62806,15.846205)" - id="text115"><tspan - x="0" - y="6" - id="tspan113">Definición de argumentos</tspan></text> - <text - style="font-size:12px;font-family:'Comic Neue'" - transform="matrix(0.99962611,0,0,0.98554306,218.63043,28.835757)" - id="text121"><tspan - x="0" - y="11" - id="tspan117">Los argumentos sin valores </tspan><tspan - x="0" - y="30" - id="tspan119">predefinidos son obligatorios</tspan></text> - <text - style="font-size:12px;font-family:'Comic Neue'" - transform="matrix(1.0036128,0,0,0.99557292,276.36705,142.82391)" - id="text127"><tspan - x="0" - y="11" - id="tspan123">Listas opcionales de </tspan><tspan - x="0" - y="30" - id="tspan125">archivos CSS y JS</tspan></text> - <text - style="font-size:12px;font-family:'Comic Neue'" - transform="translate(275.93954,180.65106)" - id="text135"><tspan - x="0" - y="11" - id="tspan129">Las rutas son </tspan><tspan - x="0" - y="30" - id="tspan131">relativas al folder </tspan><tspan - x="0" - y="48" - id="tspan133">de componentes</tspan></text> - <text - style="font-size:12px;font-family:'Comic Neue'" - transform="matrix(0.99764329,0,0,0.98692271,247.4097,314.31427)" - id="text143"><tspan - x="0" - y="11" - id="tspan137">Puedes tener mas de </tspan><tspan - x="0" - y="30" - id="tspan139">un elemento padre, a </tspan><tspan - x="0" - y="48" - id="tspan141">diferencia de React</tspan></text> - <text - style="font-size:12px;font-family:'Comic Neue'" - transform="matrix(0.9980174,0,0,0.98858774,171.78044,387.36773)" - id="text149"><tspan - x="0" - y="11" - id="tspan145">Puedes llamar a cualquier </tspan><tspan - x="0" - y="30" - id="tspan147">otro componente</tspan></text> -</svg> diff --git a/docs/static/img/anchors.png b/docs/static/img/anchors.png Binary files differdeleted file mode 100644 index ba74fe5..0000000 --- a/docs/static/img/anchors.png +++ /dev/null diff --git a/docs/static/img/apple-touch-icon.png b/docs/static/img/apple-touch-icon.png Binary files differdeleted file mode 100644 index aa04ca4..0000000 --- a/docs/static/img/apple-touch-icon.png +++ /dev/null diff --git a/docs/static/img/composable.svg b/docs/static/img/composable.svg deleted file mode 100644 index c54628c..0000000 --- a/docs/static/img/composable.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"> - <path stroke-linecap="round" stroke-linejoin="round" d="M14.25 6.087c0-.355.186-.676.401-.959.221-.29.349-.634.349-1.003 0-1.036-1.007-1.875-2.25-1.875s-2.25.84-2.25 1.875c0 .369.128.713.349 1.003.215.283.401.604.401.959v0a.64.64 0 01-.657.643 48.39 48.39 0 01-4.163-.3c.186 1.613.293 3.25.315 4.907a.656.656 0 01-.658.663v0c-.355 0-.676-.186-.959-.401a1.647 1.647 0 00-1.003-.349c-1.036 0-1.875 1.007-1.875 2.25s.84 2.25 1.875 2.25c.369 0 .713-.128 1.003-.349.283-.215.604-.401.959-.401v0c.31 0 .555.26.532.57a48.039 48.039 0 01-.642 5.056c1.518.19 3.058.309 4.616.354a.64.64 0 00.657-.643v0c0-.355-.186-.676-.401-.959a1.647 1.647 0 01-.349-1.003c0-1.035 1.008-1.875 2.25-1.875 1.243 0 2.25.84 2.25 1.875 0 .369-.128.713-.349 1.003-.215.283-.4.604-.4.959v0c0 .333.277.599.61.58a48.1 48.1 0 005.427-.63 48.05 48.05 0 00.582-4.717.532.532 0 00-.533-.57v0c-.355 0-.676.186-.959.401-.29.221-.634.349-1.003.349-1.035 0-1.875-1.007-1.875-2.25s.84-2.25 1.875-2.25c.37 0 .713.128 1.003.349.283.215.604.401.96.401v0a.656.656 0 00.658-.663 48.422 48.422 0 00-.37-5.36c-1.886.342-3.81.574-5.766.689a.578.578 0 01-.61-.58v0z" /> -</svg> diff --git a/docs/static/img/encapsulated.svg b/docs/static/img/encapsulated.svg deleted file mode 100644 index afb9119..0000000 --- a/docs/static/img/encapsulated.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"> - <path stroke-linecap="round" stroke-linejoin="round" d="M21 11.25v8.25a1.5 1.5 0 01-1.5 1.5H5.25a1.5 1.5 0 01-1.5-1.5v-8.25M12 4.875A2.625 2.625 0 109.375 7.5H12m0-2.625V7.5m0-2.625A2.625 2.625 0 1114.625 7.5H12m0 0V21m-8.625-9.75h18c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125h-18c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125z" /> -</svg> diff --git a/docs/static/img/favicon.png b/docs/static/img/favicon.png Binary files differdeleted file mode 100644 index 9b6ccd2..0000000 --- a/docs/static/img/favicon.png +++ /dev/null diff --git a/docs/static/img/favicon.svg b/docs/static/img/favicon.svg deleted file mode 100644 index d243cf2..0000000 --- a/docs/static/img/favicon.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg width="512" height="512" viewBox="0 0 135 135" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> - <rect style="fill:#ffffff" width="128.0000" height="112.0000" x="4.0000" y="12.0000" /> - <rect style="fill:#55b2ff" width="128.0000" height="16.0000" x="4.0000" y="12.0000" /> - <path style="fill:#000000" d="m 1.6901338,127.07004 v 3e-5 C 1.3828219,126.9448 0.8768176,126.51851 0.56568825,126.12275 L -6.9341144e-6,125.40319 V 67.874657 C -6.9341144e-6,23.83623 0.07409113,10.183354 0.31607229,9.6520087 1.0219463,8.1019542 -3.7115247,8.2034435 67.877153,8.2034435 h 65.786837 l 0.90134,0.9018238 0.90133,0.9018247 c 0,0 -0.0453,38.573404 -0.0679,57.860106 -0.0226,19.286701 -0.0679,57.860102 -0.0679,57.860102 l -0.7336,0.73399 -0.73359,0.73399 m -3.69215,-5.16205 V 33.351884 H 5.291517 V 122.03323 M 130.17158,13.497852 H 5.291517 V 28.057476 H 130.17158 Z" /> - <rect style="fill:#d0ec7e;stroke:#000000;stroke-width:4.81818;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" width="58.46307" height="58.463062" x="55.0000" y="50.0000" /> -</svg> diff --git a/docs/static/img/jinjax-logo-w.png b/docs/static/img/jinjax-logo-w.png Binary files differdeleted file mode 100644 index 74f52c3..0000000 --- a/docs/static/img/jinjax-logo-w.png +++ /dev/null diff --git a/docs/static/img/jinjax-logo-w.svg b/docs/static/img/jinjax-logo-w.svg deleted file mode 100644 index 0b8c9bf..0000000 --- a/docs/static/img/jinjax-logo-w.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="87mm" height="24mm" viewBox="0 0 87 24"><g style="fill:#f0f0f0;fill-opacity:1"><g style="font-size:40px;line-height:1.25;white-space:pre;shape-inside:url(#d);fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:1.44682;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" transform="matrix(.46943 0 0 .47617 -461.947 -45.454)"><path d="M1054.78 135.02c6.991 0 10.976-3.75 10.976-10.273v-18.691h-8.281v18.632c0 2.227-.957 3.399-2.813 3.399-1.836 0-3.027-1.27-3.027-3.496v-.04h-7.93v.06c0 6.523 4.316 10.41 11.074 10.41zm18.964-25.273c2.246 0 4.082-1.758 4.082-3.984 0-2.247-1.836-4.004-4.082-4.004-2.226 0-4.082 1.757-4.082 4.004 0 2.226 1.856 3.984 4.082 3.984zm-4.004 24.492h8.008v-21.953h-8.008zm11.29.001h8.007v-12.403c0-2.13 1.074-3.653 2.988-3.653 2.032 0 2.95 1.368 2.95 3.653v12.402h8.007v-14.18c0-5.273-2.5-8.32-7.343-8.32-3.047 0-5.313 1.602-6.211 4.024h-.39v-3.477h-8.009zm29.042-24.493c2.246 0 4.082-1.758 4.082-3.984 0-2.247-1.836-4.004-4.082-4.004-2.226 0-4.082 1.757-4.082 4.004 0 2.226 1.856 3.984 4.082 3.984zm-4.804 31.914c5.566 0 8.808-2.598 8.808-7.05v-22.325h-8.008v21.973c0 1.23-.703 1.757-2.324 1.757-.332 0-.683-.019-.918-.058v5.586c.469.058 1.64.117 2.442.117zm18.027-7.109c2.773 0 5.117-1.153 5.957-2.891h.39v2.578h7.852v-14.941c0-4.805-3.574-7.559-9.844-7.559-6.308 0-10.234 2.754-10.566 6.992l-.02.254h7.148l.04-.097c.37-.918 1.328-1.426 2.91-1.426 1.543 0 2.48.703 2.48 1.836v1.62l-4.336.255c-5.82.351-9.004 2.695-9.004 6.68v.038c0 4.004 2.793 6.66 6.992 6.66zm.645-7.266v-.04c0-1.054.976-1.757 2.656-1.874l3.047-.195v1.27c0 1.523-1.426 2.714-3.223 2.714-1.523 0-2.48-.742-2.48-1.875zm15.468 6.954h8.75l4.824-8.497h.157l4.863 8.496h9.219l-8.692-14.082v-.156l8.73-13.945h-9.179l-4.453 8.984h-.156l-4.434-8.984h-9.648l8.32 13.906v.156z" aria-label="JinjaX" style="font-weight:900;font-family:"SF Pro Text";-inkscape-font-specification:"SF Pro Text Heavy";fill:#f0f0f0;fill-opacity:1;stroke:none;stroke-width:1.44682;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/></g></g><g style="fill:#90d73b;stroke:#4d4d4d;stroke-width:4"><path fill="#fff" stroke="none" d="M1.74 1.616h23.704v20.906H1.741Z"/><path fill="#e6e6e6" stroke="none" d="M1.74 1.616h23.704v2.986H1.741Z"/><path fill="#4d4d4d" stroke="none" d="M1 23c.003-7.61 0-15.455 0-22h25v22m-.894-.846V5.601H1.98v16.553m23.126-18.9V1.897H1.98v2.718h23.126z"/><path d="M92.311 45.905h26.316v26.316H92.311Z" transform="matrix(.18519 0 0 .18666 1 -.624)"/><path fill="#fff" d="M17.147 45.887h64.319v64.319H17.147Z" transform="matrix(.18519 0 0 .18666 1 -.624)"/><path fill="#55b2ff" d="M25.854 53.803h35.304v35.304H25.854Z" transform="matrix(.18519 0 0 .18666 1 -.624)"/><path fill="#e6e6e6" d="M92.311 83.873h26.316v26.316H92.311Z" transform="matrix(.18519 0 0 .18666 1 -.624)"/></g></svg>
\ No newline at end of file diff --git a/docs/static/img/jinjax-logo.png b/docs/static/img/jinjax-logo.png Binary files differdeleted file mode 100644 index 941df9f..0000000 --- a/docs/static/img/jinjax-logo.png +++ /dev/null diff --git a/docs/static/img/jinjax-logo.svg b/docs/static/img/jinjax-logo.svg deleted file mode 100644 index 4870abb..0000000 --- a/docs/static/img/jinjax-logo.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="87mm" height="24mm" viewBox="0 0 87 24"><g style="fill:#000;fill-opacity:1"><g style="font-size:40px;line-height:1.25;white-space:pre;shape-inside:url(#d);fill:#000;fill-opacity:1;stroke:none;stroke-width:1.44682;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" transform="matrix(.46943 0 0 .47617 -461.947 -45.454)"><path d="M1054.78 135.02c6.991 0 10.976-3.75 10.976-10.273v-18.691h-8.281v18.632c0 2.227-.957 3.399-2.813 3.399-1.836 0-3.027-1.27-3.027-3.496v-.04h-7.93v.06c0 6.523 4.316 10.41 11.074 10.41zm18.964-25.273c2.246 0 4.082-1.758 4.082-3.984 0-2.247-1.836-4.004-4.082-4.004-2.226 0-4.082 1.757-4.082 4.004 0 2.226 1.856 3.984 4.082 3.984zm-4.004 24.492h8.008v-21.953h-8.008zm11.29.001h8.007v-12.403c0-2.13 1.074-3.653 2.988-3.653 2.032 0 2.95 1.368 2.95 3.653v12.402h8.007v-14.18c0-5.273-2.5-8.32-7.343-8.32-3.047 0-5.313 1.602-6.211 4.024h-.39v-3.477h-8.009zm29.042-24.493c2.246 0 4.082-1.758 4.082-3.984 0-2.247-1.836-4.004-4.082-4.004-2.226 0-4.082 1.757-4.082 4.004 0 2.226 1.856 3.984 4.082 3.984zm-4.804 31.914c5.566 0 8.808-2.598 8.808-7.05v-22.325h-8.008v21.973c0 1.23-.703 1.757-2.324 1.757-.332 0-.683-.019-.918-.058v5.586c.469.058 1.64.117 2.442.117zm18.027-7.109c2.773 0 5.117-1.153 5.957-2.891h.39v2.578h7.852v-14.941c0-4.805-3.574-7.559-9.844-7.559-6.308 0-10.234 2.754-10.566 6.992l-.02.254h7.148l.04-.097c.37-.918 1.328-1.426 2.91-1.426 1.543 0 2.48.703 2.48 1.836v1.62l-4.336.255c-5.82.351-9.004 2.695-9.004 6.68v.038c0 4.004 2.793 6.66 6.992 6.66zm.645-7.266v-.04c0-1.054.976-1.757 2.656-1.874l3.047-.195v1.27c0 1.523-1.426 2.714-3.223 2.714-1.523 0-2.48-.742-2.48-1.875zm15.468 6.954h8.75l4.824-8.497h.157l4.863 8.496h9.219l-8.692-14.082v-.156l8.73-13.945h-9.179l-4.453 8.984h-.156l-4.434-8.984h-9.648l8.32 13.906v.156z" aria-label="JinjaX" style="font-weight:900;font-family:"SF Pro Text";-inkscape-font-specification:"SF Pro Text Heavy";fill:#000;fill-opacity:1;stroke:none;stroke-width:1.44682;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/></g></g><g style="fill:#90d73b;stroke:#4d4d4d;stroke-width:4"><path fill="#fff" stroke="none" d="M1.74 1.616h23.704v20.906H1.741Z"/><path fill="#e6e6e6" stroke="none" d="M1.74 1.616h23.704v2.986H1.741Z"/><path fill="#4d4d4d" stroke="none" d="M1 23c.003-7.61 0-15.455 0-22h25v22m-.894-.846V5.601H1.98v16.553m23.126-18.9V1.897H1.98v2.718h23.126z"/><path d="M92.311 45.905h26.316v26.316H92.311Z" transform="matrix(.18519 0 0 .18666 1 -.624)"/><path fill="#fff" d="M17.147 45.887h64.319v64.319H17.147Z" transform="matrix(.18519 0 0 .18666 1 -.624)"/><path fill="#55b2ff" d="M25.854 53.803h35.304v35.304H25.854Z" transform="matrix(.18519 0 0 .18666 1 -.624)"/><path fill="#e6e6e6" d="M92.311 83.873h26.316v26.316H92.311Z" transform="matrix(.18519 0 0 .18666 1 -.624)"/></g></svg>
\ No newline at end of file diff --git a/docs/static/img/logo.png b/docs/static/img/logo.png Binary files differdeleted file mode 100644 index 4b12c00..0000000 --- a/docs/static/img/logo.png +++ /dev/null diff --git a/docs/static/img/logo.svg b/docs/static/img/logo.svg deleted file mode 100644 index ed5ce3f..0000000 --- a/docs/static/img/logo.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg width="512" height="512" viewBox="0 0 135 135" fill="#90d73b" stroke-width="4" stroke="#4d4d4d" xmlns="http://www.w3.org/2000/svg"> -<path d="M4 12h128v112H4z" fill="#fff" stroke-width="0"/> -<path d="M4 12h128v16H4z" fill="#e6e6e6" stroke-width="0"/> -<path d="M0 126.563C.014 85.794 0 43.763 0 8.7h135v117.862m-4.828-4.53V33.35H5.292v88.681M130.17 20.78V13.5H5.29v14.56h124.88z" fill="#4d4d4d" stroke-width="0"/> -<path d="M92.311 45.905h26.316v26.316H92.311z"/> -<path d="M17.147 45.887h64.319v64.319H17.147z" fill="#fff"/> -<path d="M25.854 53.803h35.304v35.304H25.854z" fill="#55b2ff"/> -<path d="M92.311 83.873h26.316v26.316H92.311z" fill="#e6e6e6"/> -</svg>
\ No newline at end of file diff --git a/docs/static/img/modern.svg b/docs/static/img/modern.svg deleted file mode 100644 index e986962..0000000 --- a/docs/static/img/modern.svg +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg width="32mm" height="20mm" version="1.1" viewBox="0 0 32 20" xmlns="http://www.w3.org/2000/svg"> - <text transform="matrix(.38398 0 0 .3722 -42.207 -42.291)" fill="#000000" font-family="sans-serif" font-size="40px" style="line-height:1.25;shape-inside:url(#rect2079);white-space:pre" xml:space="preserve"/> - <path d="m21.48 2.5704e-6h-3.3855l-7.4789 20h3.3986z" fill="#3465a4" stroke-width=".7728"/> - <path d="m32 8.6678-10.497-3.7261v2.6314l7.9024 2.5711-7.9024 2.5812v2.5711l10.497-3.7261z" fill="#333" stroke-width=".44679"/> - <path d="m1.3575e-7 8.6678 10.497-3.7261v2.6314l-7.9024 2.5711 7.9024 2.5812v2.5711l-10.497-3.7261z" fill="#333" stroke-width=".44679"/> -</svg> diff --git a/docs/static/img/practical.svg b/docs/static/img/practical.svg deleted file mode 100644 index 702446c..0000000 --- a/docs/static/img/practical.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"> - <path stroke-linecap="round" stroke-linejoin="round" d="M18.375 12.739l-7.693 7.693a4.5 4.5 0 01-6.364-6.364l10.94-10.94A3 3 0 1119.5 7.372L8.552 18.32m.009-.01l-.01.01m5.699-9.941l-7.81 7.81a1.5 1.5 0 002.112 2.13" /> -</svg> diff --git a/docs/static/img/simple.svg b/docs/static/img/simple.svg deleted file mode 100644 index b69150b..0000000 --- a/docs/static/img/simple.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"> - <path stroke-linecap="round" stroke-linejoin="round" d="M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /> -</svg> diff --git a/docs/static/img/slots-_slot.png b/docs/static/img/slots-_slot.png Binary files differdeleted file mode 100644 index 93cbab3..0000000 --- a/docs/static/img/slots-_slot.png +++ /dev/null diff --git a/docs/static/img/slots-diagram.png b/docs/static/img/slots-diagram.png Binary files differdeleted file mode 100644 index c085250..0000000 --- a/docs/static/img/slots-diagram.png +++ /dev/null diff --git a/docs/static/img/spaghetti_code.png b/docs/static/img/spaghetti_code.png Binary files differdeleted file mode 100644 index df44455..0000000 --- a/docs/static/img/spaghetti_code.png +++ /dev/null diff --git a/docs/static/img/ui-accordion.png b/docs/static/img/ui-accordion.png Binary files differdeleted file mode 100644 index adddd7b..0000000 --- a/docs/static/img/ui-accordion.png +++ /dev/null diff --git a/docs/static/img/ui-linkedlist.png b/docs/static/img/ui-linkedlist.png Binary files differdeleted file mode 100644 index 87667ba..0000000 --- a/docs/static/img/ui-linkedlist.png +++ /dev/null diff --git a/docs/static/img/ui-menu.png b/docs/static/img/ui-menu.png Binary files differdeleted file mode 100644 index ee82e03..0000000 --- a/docs/static/img/ui-menu.png +++ /dev/null diff --git a/docs/static/img/ui-popover.png b/docs/static/img/ui-popover.png Binary files differdeleted file mode 100644 index 22507f5..0000000 --- a/docs/static/img/ui-popover.png +++ /dev/null diff --git a/docs/static/img/ui-reldate.png b/docs/static/img/ui-reldate.png Binary files differdeleted file mode 100644 index e2258c5..0000000 --- a/docs/static/img/ui-reldate.png +++ /dev/null diff --git a/docs/static/img/ui-tabs.png b/docs/static/img/ui-tabs.png Binary files differdeleted file mode 100644 index 7b3bccd..0000000 --- a/docs/static/img/ui-tabs.png +++ /dev/null diff --git a/docs/static/prose.css b/docs/static/prose.css deleted file mode 100644 index 9a6531d..0000000 --- a/docs/static/prose.css +++ /dev/null @@ -1,637 +0,0 @@ -.prose { - --cd-prose-body: #3f3f46; - --cd-prose-headings: #18181b; - --cd-prose-lead: #52525b; - --cd-prose-links: #18181b; - --cd-prose-bold: #18181b; - --cd-prose-counters: #71717a; - --cd-prose-bullets: #d4d4d8; - --cd-prose-hr: #e4e4e7; - --cd-prose-quotes: #18181b; - --cd-prose-quote-borders: #e4e4e7; - --cd-prose-captions: #71717a; - --cd-prose-code: #18181b; - --cd-prose-pre-code: rgb(238 238 238); - --cd-prose-pre-border: rgb(51, 51, 51); - --cd-prose-pre-bg: rgb(24 24 24); - --cd-prose-th-borders: #ddd; - --cd-prose-td-borders: #eee; - --cd-prose-bg-hover: rgba(0,0,0,0.035); - - --cd-prose-invert-body: #d4d4d8; - --cd-prose-invert-headings: #fff; - --cd-prose-invert-lead: #a1a1aa; - --cd-prose-invert-links: #fff; - --cd-prose-invert-bold: #fff; - --cd-prose-invert-counters: #a1a1aa; - --cd-prose-invert-bullets: #52525b; - --cd-prose-invert-hr: #3f3f46; - --cd-prose-invert-quotes: #f4f4f5; - --cd-prose-invert-quote-borders: #3f3f46; - --cd-prose-invert-captions: #a1a1aa; - --cd-prose-invert-code: #fff; - --cd-prose-invert-pre-code: rgb(238 238 238); - --cd-prose-invert-pre-border: rgb(51, 51, 51); - --cd-prose-invert-pre-bg: rgb(24 24 24); - --cd-prose-invert-th-borders: #52525b; - --cd-prose-invert-td-borders: #3f3f46; - --cd-prose-invert-bg-hover: rgba(0,0,0,0.035); -} - -.dark .prose { - --cd-prose-body: var(--cd-prose-invert-body); - --cd-prose-headings: var(--cd-prose-invert-headings); - --cd-prose-lead: var(--cd-prose-invert-lead); - --cd-prose-links: var(--cd-prose-invert-links); - --cd-prose-bold: var(--cd-prose-invert-bold); - --cd-prose-counters: var(--cd-prose-invert-counters); - --cd-prose-bullets: var(--cd-prose-invert-bullets); - --cd-prose-hr: var(--cd-prose-invert-hr); - --cd-prose-quotes: var(--cd-prose-invert-quotes); - --cd-prose-quote-borders: var(--cd-prose-invert-quote-borders); - --cd-prose-captions: var(--cd-prose-invert-captions); - --cd-prose-code: var(--cd-prose-invert-code); - --cd-prose-pre-code: var(--cd-prose-invert-pre-code); - --cd-prose-pre-border: var(--cd-prose-invert-pre-border); - --cd-prose-pre-bg: var(--cd-prose-invert-pre-bg); - --cd-prose-th-borders: var(--cd-prose-invert-th-borders); - --cd-prose-td-borders: var(--cd-prose-invert-td-borders); - --cd-prose-bg-hover: var(--cd-prose-invert-bg-hover); -} - -.prose { - font-size: 1em; - line-height: 1.75; - color: var(--cd-prose-body); -} - -.prose h1:not(:where([class~="not-prose"] *)) , -.prose h2:not(:where([class~="not-prose"] *)) , -.prose h3:not(:where([class~="not-prose"] *)) , -.prose h4:not(:where([class~="not-prose"] *)) , -.prose h5:not(:where([class~="not-prose"] *)) , -.prose h6:not(:where([class~="not-prose"] *)) { - font-family: var(--cd-font-serif); -} - -.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(--cd-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(--cd-prose-links); - text-decoration: underline; - font-weight: 500; -} - -.prose :where(strong):not(:where([class~="not-prose"] *)) { - color: var(--cd-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(--cd-prose-counters); -} - -.prose :where(ul > li):not(:where([class~="not-prose"] *))::marker { - color: var(--cd-prose-bullets); -} - -.prose :where(hr):not(:where([class~="not-prose"] *)) { - border-color: var(--cd-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(--cd-prose-quotes); - border-left-width: 0.25em; - border-left-color: var(--cd-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(--cd-prose-headings); - font-weight: 800; - font-size: 2.2rem; - 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(--cd-prose-headings); - font-weight: 700; - font-size: 1.8em; - margin-top: 1.2em; - margin-bottom: 0.5em; - 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(--cd-prose-headings); - font-weight: 600; - font-size: 1.4em; - margin-top: 1.6em; - margin-bottom: 0.4em; - 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(--cd-prose-headings); - font-weight: 600; - font-size: 1.2em; - 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(h5):not(:where([class~="not-prose"] *)) { - color: var(--cd-prose-headings); - font-weight: 600; - font-size: 1em; - margin-top: 1em; - margin-bottom: 0.5em; - line-height: 1.5; -} - - -.prose :where(h6):not(:where([class~="not-prose"] *)) { - color: var(--cd-prose-headings); - font-weight: 600; - font-size: 1em; - margin-top: 1em; - margin-bottom: 0.5em; - line-height: 1.4; -} - - -.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(--cd-prose-captions); - font-size: 0.875em; - line-height: 1.4285714; - margin-top: 0.8571429em; -} - -.prose :where(code):not(:where([class~="not-prose"] *)) { - color: var(--cd-prose-code); - font-size: 0.98em; - letter-spacing: -0.02em; -} -.prose :where(code):not(:where(pre code)):not(:where([class~="not-prose"] *)) { - padding: 0.1em; - background: var(--cd-bg-color-hover); -} - -.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(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; - border-width: 1px; - border-color: var(--cd-prose-td-borders); -} - -.prose :where(thead):not(:where([class~="not-prose"] *)) { - border-bottom-width: 1px; - border-bottom-color: var(--cd-prose-th-borders); -} - -.prose :where(thead th):not(:where([class~="not-prose"] *)) { - color: var(--cd-prose-headings); - font-weight: 600; - vertical-align: bottom; - border-left-width: 1px; - border-left-color: var(--cd-prose-th-borders); - /* text-transform: uppercase; */ -} -.prose :where(thead th:first-child):not(:where([class~="not-prose"] *)) { - border-left-width: 0; -} - -.prose :where(tbody tr):not(:where([class~="not-prose"] *)) { - border-bottom-width: 1px; - border-bottom-color: var(--cd-prose-td-borders); - transition: background-color 125ms; -} -.prose :where(tbody tr:hover):not(:where([class~="not-prose"] *)) { - background-color: var(--cd-prose-bg-hover); -} - -.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; - border-left-width: 1px; - border-left-color: var(--cd-prose-th-borders); -} -.prose :where(tbody td:first-child):not(:where([class~="not-prose"] *)) { - border-left-width: 0; -} -.prose :where(tbody td p:first-child):not(:where([class~="not-prose"] *)) { - margin-top: 0; -} - -.prose :where(tfoot):not(:where([class~="not-prose"] *)) { - border-top-width: 1px; - border-top-color: var(--cd-prose-th-borders); -} - -.prose :where(tfoot td):not(:where([class~="not-prose"] *)) { - vertical-align: top; -} - -.prose :where(th, td):not(:where([class~="not-prose"] *)) { - padding: 0.5rem 1rem; -} - -.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(.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 :where(.task-list .task-list):not(:where([class~="not-prose"] *)) { - padding-left: 1em; -} - -.prose :where(dl):not(:where([class~="not-prose"] *)) { - margin-top: 1.25em; - margin-bottom: 1.25em; -} - -.prose :where(dt):not(:where([class~="not-prose"] *)) { - font-weight: bold; -} - -.prose :where(dd):not(:where([class~="not-prose"] *)) { - padding-left: 1em; -} - -pre { - border: 1px solid rgb(var(--cd-prose-pre-border)); - overflow-x: auto; - font-weight: 400; - font-feature-settings: "kern"; - white-space: pre; - scrollbar-width: thin; - padding: 1.25rem 1.5rem; -} -pre::-webkit-scrollbar { - width: 2px; - background-color: ButtonFace; -} -pre:has([data-linenos]) { - padding-left: 0; -} -pre code { - 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; - -} -pre a { - text-decoration: none; -} - -.highlight { - margin-top: 0.5rem; - margin-bottom: 1rem; - border-radius: 6px; -} -.highlight:has(> .filename) { - background-color: rgb(249 250 251); - border: 1px solid rgb(153, 153, 153); -} -.highlight:is(.dark *):has(> .filename) { - background-color: rgb(55 65 81); - border-color: rgb(75 85 99); -} -.highlight > .filename { - border-radius: 6px 0 0 0; - display: inline-block; - border-right: 1px solid rgb(153, 153, 153); - background-color: #e7e9ed; - padding: 0.5rem; - color: #333; - font-weight: 500; - font-size: 0.9em; -} -.highlight:is(.dark *) > .filename { - border-color: rgb(75 85 99); - background-color: #111; - color: rgb(255 255 255); -} -.highlight pre { - background-color: rgba(0, 0, 0, 0.9); - border-radius: 6px; - font-size: 0.98rem; - line-height: 1.4; -} -.highlight .filename + pre { - border-radius: 0 0 6px 6px; -} -.highlight pre code { color: white; } - -.highlight pre code [data-linenos]:before { - content: attr(data-linenos); - display: inline-block; - width: 3rem; - text-align: right; - padding-right: 1rem; - white-space: nowrap; - color: rgb(82 82 91); - font-size: 0.75rem; -} -.highlight .hll { - background-color: #333; - display: block; -} - -.highlight .c { color: hsl(31, 76%, 64%) } /* Comment */ -.highlight .err { color: #960050; background-color: #1e0010 } /* Error */ -.highlight .k { color: #66d9ef } /* Keyword */ -.highlight .l { color: #ae81ff } /* Literal */ -.highlight .n { color: #f8f8f2 } /* Name */ -.highlight .o { color: #f92672 } /* Operator */ -.highlight .p { color: #f8f8f2 } /* Punctuation */ -.highlight .cm { color: hsl(30, 20%, 50%) } /* Comment.Multiline */ -.highlight .cp { color: hsl(30, 20%, 50%) } /* Comment.Preproc */ -.highlight .c1 { color: hsl(30, 20%, 50%) } /* Comment.Single */ -.highlight .cs { color: hsl(30, 20%, 50%) } /* Comment.Special */ -.highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .kc { color: #66d9ef } /* Keyword.Constant */ -.highlight .kd { color: #66d9ef } /* Keyword.Declaration */ -.highlight .kn { color: #f92672 } /* Keyword.Namespace */ -.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */ -.highlight .kr { color: #66d9ef } /* Keyword.Reserved */ -.highlight .kt { color: #66d9ef } /* Keyword.Type */ -.highlight .ld { color: #e6db74 } /* Literal.Date */ -.highlight .m { color: #ae81ff } /* Literal.Number */ -.highlight .s { color: #e6db74 } /* Literal.String */ -.highlight .na { color: #a6e22e } /* Name.Attribute */ -.highlight .nb { color: #f8f8f2 } /* Name.Builtin */ -.highlight .nc { color: #a6e22e } /* Name.Class */ -.highlight .no { color: #66d9ef } /* Name.Constant */ -.highlight .nd { color: #a6e22e } /* Name.Decorator */ -.highlight .ni { color: #f8f8f2 } /* Name.Entity */ -.highlight .ne { color: #a6e22e } /* Name.Exception */ -.highlight .nf { color: #a6e22e } /* Name.Function */ -.highlight .nl { color: #f8f8f2 } /* Name.Label */ -.highlight .nn { color: #f8f8f2 } /* Name.Namespace */ -.highlight .nx { color: #a6e22e } /* Name.Other */ -.highlight .py { color: #f8f8f2 } /* Name.Property */ -.highlight .nt { color: #f92672 } /* Name.Tag */ -.highlight .nv { color: #f8f8f2 } /* Name.Variable */ -.highlight .ow { color: #f92672 } /* Operator.Word */ -.highlight .w { color: #f8f8f2 } /* Text.Whitespace */ -.highlight .mf { color: #ae81ff } /* Literal.Number.Float */ -.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */ -.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */ -.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */ -.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */ -.highlight .sc { color: #e6db74 } /* Literal.String.Char */ -.highlight .sd { color: #e6db74 } /* Literal.String.Doc */ -.highlight .s2 { color: #e6db74 } /* Literal.String.Double */ -.highlight .se { color: #ae81ff } /* Literal.String.Escape */ -.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */ -.highlight .si { color: #e6db74 } /* Literal.String.Interpol */ -.highlight .sx { color: #e6db74 } /* Literal.String.Other */ -.highlight .sr { color: #e6db74 } /* Literal.String.Regex */ -.highlight .s1 { color: #e6db74 } /* Literal.String.Single */ -.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */ -.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ -.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */ -.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */ -.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */ -.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */ - -.highlight .gh { } /* Generic Heading & Diff Header */ -.highlight .gu { color: hsl(30, 20%, 50%); } /* Generic.Subheading & Diff Unified/Comment? */ -.highlight .gd { color: #f92672; } /* Generic.Deleted & Diff Deleted */ -.highlight .gi { color: #a6e22e; } /* Generic.Inserted & Diff Inserted */ diff --git a/docs/static/theme.css b/docs/static/theme.css deleted file mode 100644 index 8dad4aa..0000000 --- a/docs/static/theme.css +++ /dev/null @@ -1,1808 +0,0 @@ -/* latin */ -@font-face { - font-family: "Karla"; - font-style: normal; - font-weight: 400; - src: url("./fonts/karla-regular-.woff2") format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* latin-ext */ -@font-face { - font-family: "Karla"; - font-style: normal; - font-weight: 400; - src: url("./fonts/karla-regular-ext.woff2") format("woff2"); - unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: "Karla"; - font-style: normal; - font-weight: 700; - src: url("./fonts/karla-bold.woff2") format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* latin-ext */ -@font-face { - font-family: "Karla"; - font-style: normal; - font-weight: 700; - src: url("./fonts/karla-bold-ext.woff2") format("woff2"); - unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -@font-face { - font-family: "Material Symbols Rounded"; - font-style: normal; - font-weight: 100 700; - font-display: block; - src: url("./fonts/material-symbols-rounded.woff2") format("woff2"); -} - -/* ---------------------------------------------------------------------- */ - -html { - --cd-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - --cd-font-sans: Karla, sans-serif; - --cd-font-icons: "Material Symbols Rounded"; - - --cd-padding-left: max(1rem, env(safe-area-inset-right)); - --cd-padding-right: max(1rem, env(safe-area-inset-left)); - - --cd-brand-color: #fbbf24; - --cd-bg-color-light: rgb(255 255 255); - --cd-bg-color-dark: rgb(23 23 23); - - --cd-bg-color: var(--cd-bg-color-light); - --cd-bg-color-hover: rgb(240, 240, 240); - --cd-text-color: rgb(23 23 23); - --cd-text-color-mild: rgb(63 63 70); - --cd-border-color: #e3e3e4; - - --cd-nav-bg-color: rgba(255, 255, 255, 0.8); - --cd-nav-bg-color-hover: rgb(244, 244, 244); - - --doc-symbol-parameter-fg-color: #df50af; - --doc-symbol-attribute-fg-color: #953800; - --doc-symbol-function-fg-color: #8250df; - --doc-symbol-method-fg-color: #8250df; - --doc-symbol-class-fg-color: #0550ae; - --doc-symbol-module-fg-color: #5cad0f; - - --doc-symbol-parameter-bg-color: #df50af1a; - --doc-symbol-attribute-bg-color: #9538001a; - --doc-symbol-function-bg-color: #8250df1a; - --doc-symbol-method-bg-color: #8250df1a; - --doc-symbol-class-bg-color: #0550ae1a; - --doc-symbol-module-bg-color: #5cad0f1a; -} - -html.dark { - --cd-brand-color: #3451b2; - - --cd-bg-color: var(--cd-bg-color-dark); - --cd-bg-color-hover: rgb(40 40 40); - --cd-text-color: rgb(250 250 250); - --cd-text-color-mild: rgb(161 161 170); - --cd-border-color: rgb(60 60 60); - - --cd-nav-bg-color: rgba(60, 60, 60, 0.8); - --cd-nav-bg-color-hover: rgb(70, 70, 70); - - --doc-symbol-parameter-fg-color: #ffa8cc; - --doc-symbol-attribute-fg-color: #ffa657; - --doc-symbol-function-fg-color: #d2a8ff; - --doc-symbol-method-fg-color: #d2a8ff; - --doc-symbol-class-fg-color: #79c0ff; - --doc-symbol-module-fg-color: #baff79; - - --doc-symbol-parameter-bg-color: #ffa8cc1a; - --doc-symbol-attribute-bg-color: #ffa6571a; - --doc-symbol-function-bg-color: #d2a8ff1a; - --doc-symbol-method-bg-color: #d2a8ff1a; - --doc-symbol-class-bg-color: #79c0ff1a; - --doc-symbol-module-bg-color: #baff791a; -} - -/* ---------------------------------------------------------------------- */ - -/* -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 { - /* 1 */ - box-sizing: border-box; - /* 2 */ - border-width: 0; - /* 2 */ - border-style: solid; - /* 2 */ - border-color: #e5e7eb; -} -::before, -::after { - --cd-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. Set default font sans -4. Disable tap highlights on iOS -*/ -html, -:host { - /* 1 */ - line-height: 1.5; - /* 2 */ - tab-size: 4; - /* 3 */ - -webkit-text-size-adjust: 100%; - /* 4 */ - font-family: var(--cd-font-sans); - font-feature-settings: normal; - font-variation-settings: normal; - /* 5 */ - -webkit-tap-highlight-color: transparent; -} - -/* -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 { - /* 1 */ - margin: 0; - /* 2 */ - line-height: inherit; -} - -/* -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 { - /* 1 */ - height: 0; - /* 2 */ - color: inherit; - /* 3 */ - border-top-width: 1px; -} - -/* -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 { - /* 1 */ - font-family: var(--cd-font-mono); - font-feature-settings: normal; - font-variation-settings: normal; - /* 2 */ - font-size: 1em; -} - -/* 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 { - /* 1 */ - text-indent: 0; - /* 2 */ - border-color: inherit; - /* 3 */ - border-collapse: collapse; -} - -/* -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 { - /* 1 */ - font-family: inherit; - font-feature-settings: inherit; - font-variation-settings: inherit; - font-size: 100%; - font-weight: inherit; - line-height: inherit; - letter-spacing: inherit; - color: inherit; - /* 2 */ - margin: 0; - /* 3 */ - padding: 0; -} - -/* 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, -input:where([type="button"]), -input:where([type="reset"]), -input:where([type="submit"]) { - /* 1 */ - -webkit-appearance: button; - /* 2 */ - background-color: transparent; - background-image: none; -} - -/* 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"] { - /* 1 */ - -webkit-appearance: textfield; - /* 2 */ - outline-offset: -2px; -} - -/* 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 { - /* 1 */ - -webkit-appearance: button; - /* 2 */ - font: inherit; -} - -/* 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; -} - -/* Reset default styling for dialogs. */ -dialog { - 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 { - /* 1 */ - opacity: 1; - /* 2 */ - color: #9ca3af; -} -input::placeholder, -textarea::placeholder { - /* 1 */ - opacity: 1; - /* 2 */ - color: #9ca3af; -} - -/* 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 { - /* 1 */ - display: block; - /* 2 */ - vertical-align: middle; -} - -/* -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; -} - -/* ---------------------------------------------------------------------- */ - -html:has(.cd-nav-mobile:popover-open) { - overflow: hidden !important; - overflow-x: hidden !important; - overflow-y: hidden !important; -} -body { - position: relative; - min-height: 100vh; - color: var(--cd-text-color); - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - background-color: var(--cd-bg-color-light); - transition: background 100ms linear; -} -html.dark body { - background-color: var(--cd-bg-color-dark); -} - -.keys, -kbd:not(.keys > kbd) { - font-family: var(--cd-font-mono); - display: inline-block; - padding: 0.2rem 0.25rem; - margin-left: 0.1rem; - margin-right: 0.1rem; - font-size: 0.875rem; - line-height: 1; - font-weight: 500; - letter-spacing: -0.025em; - line-height: 1; - border-radius: 0.25rem; - border-width: 1px; - border-color: #ffffff; - box-shadow: 0 0 2px 0 #000; - - &:is(.dark *) { - border-color: rgb(0 0 0); - background-color: rgb(24 24 27); - } -} - -.scrollbar-thin { - scrollbar-width: thin; /* Firefox */ -} -.scrollbar-thin::-webkit-scrollbar { - /* Safari and Chrome */ - width: 2px; - background-color: ButtonFace; -} -.scrollbar-default { - -ms-overflow-style: auto; /* IE and Edge */ - scrollbar-width: auto; /* Firefox */ -} -.scrollbar-default::-webkit-scrollbar { - /* Safari and Chrome */ - width: auto; -} - -a.headerlink { - margin-left: .25rem; - display: inline-block; - text-decoration-line: none; - opacity: 0; - transition-property: opacity; - transition-timing-function: cubic-bezier(.4,0,.2,1); - transition-duration: .15s; -} -h2:hover a.headerlink, -h3:hover a.headerlink, -h4:hover a.headerlink, -h5:hover a.headerlink, -h6:hover a.headerlink { - opacity: 0.5; -} - -/* ---------------------------------------------------------------------- */ - -.doc-symbol { - border-radius: 0.1rem; - padding: 0 0.3em; - font-weight: bold; -} -.doc-symbol-attr { - color: var(--doc-symbol-attribute-fg-color) !important; - background-color: var(--doc-symbol-attribute-bg-color) !important; -} -.doc-symbol-function { - color: var(--doc-symbol-function-fg-color) !important; - background-color: var(--doc-symbol-function-bg-color) !important; -} -.doc-symbol-method { - color: var(--doc-symbol-method-fg-color) !important; - background-color: var(--doc-symbol-method-bg-color) !important; -} -.doc-symbol-class { - color: var(--doc-symbol-class-fg-color) !important; - background-color: var(--doc-symbol-class-bg-color) !important; -} -.doc-symbol-module { - color: var(--doc-symbol-module-fg-color) !important; - background-color: var(--doc-symbol-module-bg-color) !important; -} - -.doc-oname { - font-weight: normal; -} -.doc-olabel { - font-size: 0.6em !important; - color: #36464e !important; - font-weight: 400; - padding: 0.1rem 0.4rem !important; -} - -.doc-attrs ~ .doc-methods, -.doc-properties ~ .doc-methods { - margin-top; 1rem; -} - -/* ---------------------------------------------------------------------- */ - -.icon { - font-family: var(--cd-font-icons); - font-weight: normal; - font-style: normal; - letter-spacing: normal; - text-transform: none; - display: inline-block; - white-space: nowrap; - word-wrap: normal; - direction: ltr; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - text-rendering: optimizeLegibility; - font-feature-settings: "liga"; - cursor: default; - pointer-events: none; -} - -/* ---------------------------------------------------------------------- */ - -.cd-source { - display: flex; - align-items: center; - font-size: 0.85rem; - line-height: 1.2; - white-space: nowrap; - cursor: pointer; - text-decoration: none; - padding: 0.5rem 0.75rem; - min-width: 150px; - backdrop-filter: blur(4px); - background-color: var(--cd-nav-bg-color); - border-radius: 1rem; - transition: background 300ms ease-in-out; - - &:hover { - background-color: var(--cd-nav-bg-color-hover); - } - & > div { - opacity: 0.8; - transition: opacity 300ms ease-in-out; - } - &:hover > div { - opacity: 1; - } - & .cd-source__icon { - padding-right: 0.5rem; - } - & .cd-source__icon svg { - height: 1.5rem; - width: 1.5rem; - fill: currentcolor; - display: block; - } - & .cd-source__label { - font-size: 0.9rem; - font-weight: bold; - } - & .cd-source__repo { - display: inline-block; - max-width: calc(100% - 1.2rem); - overflow: hidden; - text-overflow: ellipsis; - vertical-align: middle; - } - @media (max-width: 480px) { - & { - min-width: 0; - } - & .cd-source__icon { - padding-right: 0; - } - & .cd-source__repo { - display: none; - } - } - & .cd-source__facts { - display: hidden; - gap: 0.4rem; - list-style-type: none; - margin: 0.1rem 0 0; - overflow: hidden; - padding: 0; - width: 100%; - opacity: 0; - transform: translateY(100%); - transition: all 0.5s ease-out; - } - & .cd-source__facts.cd-source__facts--visible { - display: flex; - opacity: 1; - transform: translateY(0); - } - & .cd-source__facts [data-fact] { - overflow: hidden; - text-overflow: ellipsis; - display: flex; - align-items: center; - line-height: 1; - } - & .cd-source__facts [data-fact]:nth-child(1n+2) { - flex-shrink: 0; - } - & .cd-source__facts [data-fact]:not([hidden]):before { - width: 0.6rem; - padding-right: 0.8rem; - font-family: var(--cd-font-icons); - font-weight: normal; - font-style: normal; - letter-spacing: normal; - text-transform: none; - display: inline-block; - white-space: nowrap; - word-wrap: normal; - direction: ltr; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - text-rendering: optimizeLegibility; - font-feature-settings: "liga"; - cursor: default; - pointer-events: none; - } - & .cd-source__facts [data-fact="version"]:not([hidden]):before { - content: "tag"; - } - & .cd-source__facts [data-fact="stars"]:not([hidden]):before { - content: "star"; - } - & .cd-source__facts [data-fact="forks"]:not([hidden]):before { - content: "fork_right"; - } - & .cd-source__facts [data-fact="numrepos"]:not([hidden]):before { - content: "numbers"; - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-cards { - & { - display: grid; - grid-gap: 1rem; - } - @media (min-width: 480px) { - & { grid-template-columns: repeat(2, 1fr); } - } - @media (min-width: 900px) { - & { grid-template-columns: repeat(4, 1fr); } - } - & a.card { - display: block; - border: 1px solid var(--cd-border-color); - padding: 1rem; - border-radius: 6px; - background-color: var(--cd-bg-color); - transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); - } - & a.card:hover { - display: block; - background-color: var(--cd-bg-color-hover); - } - & a.card h2 { - text-decoration: none; - font-family: var(--cd-font-sans); - font-weight: bold; - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-text-button { - display: inline-flex; - cursor: pointer; - touch-action: manipulation; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - align-items: center; - justify-content: center; - white-space: nowrap; - border-radius: 0.25rem; - border-width: 1px; - border-color: rgb(228 228 231); - background-color: rgb(250 250 250); - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.25rem; - font-weight: 600; - color: rgb(39 39 42); - - &:hover { - border-color: rgb(212 212 216); - background-color: rgb(244 244 245); - color: rgb(24 24 27); - box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);; - } - &:focus { - outline-style: solid; - outline-offset: 1px; - outline-color: rgb(82 82 91 / 0.5); - } - &:active { - border-color: rgb(161 161 170); - } - &:disabled { - cursor: default; - outline: 2px solid transparent; - outline-offset: 2px; - } - &:is(.dark *) { - border-color: rgb(82 82 91); - background-color: rgb(82 82 91 / 0.1); - color: rgb(228 228 231); - } - &:is(.dark *):hover { - border-color: rgb(113 113 122); - background-color: rgb(24 24 27); - color: rgb(244 244 245); - } - &:is(.dark *):active { - border-color: var(--cd-bg-color); - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-callout { - --bg-color: rgb(244 244 245); - --border-color: rgb(212 212 216); - --text-color: rgb(39 39 42); - - &.type-note, - &.type-info, - &.type-todo { - --bg-color: rgb(244 244 245); - --border-color: rgb(212 212 216); - --text-color: rgb(39 39 42); - } - &.type-tip { - --bg-color: rgb(254 249 195); - --border-color: rgb(254 240 138); - --text-color: rgb(133 77 14); - } - &.type-alert { - --bg-color: rgb(255 237 213); - --border-color: rgb(254 215 170); - --text-color: rgb(154 52 18); - } - &.type-warning { - --bg-color: rgb(255 237 213); - --border-color: rgb(254 215 170); - --text-color: rgb(154 52 18); - } - &.type-danger { - --bg-color: rgb(255 228 230); - --border-color: rgb(254 205 211); - --text-color: rgb(136 19 55); - } - &.type-error { - --bg-color: rgb(255 228 230); - --border-color: rgb(254 205 211); - --text-color: rgb(136 19 55); - } - &.type-internal { - --bg-color: rgb(231 229 228); - --border-color: rgb(214 211 209); - --text-color: rgb(28 25 23); - } - & { - position: relative; - border-top-width: 1px; - border-bottom-width: 1px; - overflow: hidden; - margin-left: -1rem; - margin-right: -1rem; - background-color: var(--bg-color); - border-color: var(--border-color); - color: var(--text-color); - } - @media (min-width: 640px) { - & { - border-left-width: 1px; - border-right-width: 1px; - border-radius: 0.25rem; - margin-left: 0; - margin-right: 0; - } - } - &:is(.dark *) { - background-color: oklch(from var(--bg-color) calc(l * 2) calc(c * 3) h / 0.8); - border-color: oklch(from var(--border-color) calc(l * 1.5) c h); - color: oklch(from var(--text-color) calc(l * 0.5) c h); - } - &:is(.dark *) ::selection { - background-color: oklch(from var(--bg-color) calc(l * 1.2) calc(c * 4) h) - } - &:is(aside) { - display: flex; - align-items: flex-start; - padding: 1.25rem 1rem 1rem; - } - @media (min-width: 640px) { - &:is(aside) { - padding-left: 1.25rem; - padding-right: 1.25rem; - } - } - & summary { - display: flex; - align-items: center; - font-weight: 700; - height: 3rem; - padding-left: 1.25rem; - padding-right: 1.25rem; - cursor: pointer; - } - & .icon { - margin: -0.1rem 1rem 0 -0.25rem; - opacity: 0.9; - font-size: 1.2rem; - line-height: 1.4; - } - @media (max-width: 639px) { - & .icon { - display: none; - } - } - & .icon.arrow { - margin-left: auto; - transition-property: transform; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; - } - & details&[open] .icon.arrow { - transform: rotate(180deg); - } - & .content { - line-height: 1.4; - } - & details& .content { - padding: 0 1rem 1rem; - } - @media (min-width: 640px) { - & details& .content { - padding: 0 1.25rem 1rem; - } - } -} -/* Cannot be nested */ -.cd-callout::selection { - background-color: oklch(from var(--bg-color) calc(l * 0.9) calc(c * 3) h); -} - -/* ---------------------------------------------------------------------- */ - -.cd-example-tabs { - position: relative; - margin-top: 2rem; - margin-bottom: 3rem; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - width: 100%; - - & .example-tabgroup { - width: 100%; - overflow: hidden; - position: relative; - border: 1px solid #999; - border-radius: 0.4rem; - } - - & .example-tablist { - z-index: 0; - display: flex; - border-bottom: 1px solid #999; - background-color: rgb(249 250 251); - overflow-x: auto; - overflow-y: hidden; - -ms-scroll-chaining: none; - overscroll-behavior: contain; - width: 100%; - text-align: center; - font-size: 0.875rem; - line-height: 1.25rem; - font-weight: 500; - color: rgb(107 114 128); - } - & .example-tablist:is(.dark *) { - border-color: rgb(75 85 99); - background-color: rgb(55 65 81); - color: rgb(156 173 175); - } - - & .example-tab { - user-select: none; - border-right-width: 1px; - border-color: #999; - background-color: rgb(255 255 255); - padding: 0.5rem 1.6rem; - color: #333; - } - & .example-tab:is(.dark *) { - border-color: rgb(75 85 99); - background-color: rgb(31 41 55); - color: rgb(255 255 255); - } - & .example-tab:not(.ui-disabled):not(.ui-selected):hover { - background-color: rgb(249 250 251); - color: rgb(55 65 81); - } - & .example-tab:not(.ui-disabled):not(.ui-selected):hover:is(.dark *) { - background-color: rgb(55 65 81); - color: rgb(255 255 255); - } - & .example-tab.ui-disabled { - color: rgb(193 204 220); - } - & .example-tab.ui-selected { - color: black; - background-color: #e7e9ed; - } - & .example-tab.ui-selected:is(.dark *) { - color: white; - background-color: #111; - } - - & .example-tabpanel { - width: 100%; - flex-grow: 0;` - z-index: 10; - overflow: auto; - position: relative; - max-height: 400px; - } - & .example-tabpanel.ui-hidden { - display: none; - } - & .example-tabpanel div.highlight { - margin: 0; - padding: 0; - border-radius: 0; - font-size: 0.9rem; - } - & .example-tabpanel div.highlight pre { - border-radius: 0; - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-footer { - padding-top: 1.25rem; - padding-bottom: 1.25rem; - padding-left: var(--cd-padding-left); - padding-right: var(--cd-padding-right); - font-size: 0.875rem; - line-height: 1.25rem; - text-align: center; - border-top: 1px solid rgb(228 228 231); - - &:is(.dark *){ - border-color: rgb(82 82 91); - } - & .wrapper { - display: flex; - align-items: center; - } - & .copy { - margin-right: auto; - text-align: left; - padding: 0 16px; - } - & .built-with { - height: 100%; - color: rgb(113 113 122); - } - & .built-with:is(.dark *) { - color: inherit; - } - & .built-with a { - text-decoration: underline; - cursor: pointer; - } - & .themeswitch { - margin-left: 1.5rem; - margin-right: 0; - opacity: 0.8; - border-radius: 1rem; - background-color: var(--cd-nav-bg-color); - transition: opacity 300ms ease-in-out, background 300ms ease-in-out; - padding-left: 0.5rem; - padding-right: 0.5rem; - } - & .themeswitch:hover { - opacity: 1; - background-color: var(--cd-nav-bg-color-hover); - } - @media (max-width: 640px) { - & .built-with, - & .themeswitch { - display: none; - } - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-header { - margin-bottom: 2rem; - - & div p { - margin-bottom: 0.5rem; - font-size: 0.875rem; - line-height: 1; - font-weight: 600; - } - & h1 { - display: inline-block; - font-size: 1.9rem; - line-height: 1.25rem; - color: rgb(24 24 27); - font-weight: 800; - margin: 0; - } - & h1:is(.dark *) { - color: rgb(228 228 231); - } - @media (min-width: 640px) { - & h1 { - font-size: 2.2rem; - } - } - & p.description { - margin-top: 0.25rem; - font-size: 1.125rem; - line-height: 1.75rem; - color: var(--cd-text-color-mild); - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-navbar { - display: flex; - align-items: center; - border-radius: 1rem; - padding: 0 0.75rem; - font-size: 0.875rem; - font-weight: bold; - backdrop-filter: blur(4px); - background-color: var(--cd-nav-bg-color); - box-shadow: rgb(15, 15, 15) 0px 0px 0px 0px inset, - rgba(163, 163, 170, 0.3) 0px 0px 0px 1px inset, - rgba(255, 255, 255, 0.2) 0px 20px 25px -5px, - rgba(255, 255, 255, 0.2) 0px 8px 10px -6px; - - &:is(.dark *) { - box-shadow: rgb(255, 255, 255) 0px 0px 0px 0px inset, - rgba(63, 63, 70, 0.3) 0px 0px 0px 1px inset, - rgba(0, 0, 0, 0.2) 0px 20px 25px -5px, - rgba(0, 0, 0, 0.2) 0px 8px 10px -6px; - } - - & a { - white-space: nowrap; - padding: 0.75rem; - } - & a, - & button { - opacity: 0.8; - transition: opacity 300ms ease-in-out, background 300ms ease-in-out; - border-radius: 4px; - } - & a:hover, - & button:hover { - opacity: 1; - background-color: var(--cd-nav-bg-color-hover); - } - & a svg { - height: 20px; - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-nav-top { - z-index: 1000; - width: 100%; - margin-top: 1rem; - - /* @media ((min-width: 1024px) and (min-height: 640px)) { - & { - position: sticky; - top: 1rem; - } - } */ - & .wrapper { - margin-left: auto; - margin-right: auto; - display: flex; - max-width: 100rem; - align-items: center; - padding-left: var(--cd-padding-left); - padding-right: var(--cd-padding-right); - } - - & .logo { - padding: 0.75rem; - margin-left: -0.75rem; - margin-right: auto; - background-color: transparent; - transition: background 300ms ease-in-out; - } - @media (min-width: 640px) { - & .logo { - border-radius: 4px; - backdrop-filter: blur(4px); - background-color: var(--cd-nav-bg-color); - } - } - - & .nav-links { - display: none; - } - @media (min-width: 768px) { - & .nav-links { - display: inline-flex; - } - } - & .nav-extra { - margin-left: 0.75rem; - } - & .nav-links > .themeswitch { - border: none; - outline: none; - margin-left: 0.25rem; - } - & .cd-toggle-sidebar { - font-size: 1rem; - margin-left: 0.75rem; - width: 4.5rem; - line-height: 1; - padding: 0.75rem 0.5rem; - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-nav-global { - /* position: sticky; */ - /* top: 0; */ - z-index: 0; - width: 12rem; - border-right-width: 1px; - border-color: rgb(228 228 231); - padding-right: 1rem; - padding-bottom: 2rem; - font-size: 0.875rem; - line-height: 1.2; - flex-shrink: 0; - /* - @media (min-height: 640px) { - & { - overflow-y: auto; - height: 100vh; - top: 3rem; - min-height: calc(100vh - 3rem); - } - } */ - - @media (min-width: 1536px) { - & { - font-size: 1rem; - line-height: 1.5rem; - width: 18rem; - } - } - &:is(.dark *) { - border-color: rgb(82 82 91); - } - - & nav { - display: flex; - width: 100%; - flex-direction: column; - padding-bottom: 3.5rem; - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-nav-local { - position: sticky; - top: 5rem; - z-index: 0; - width: 25rem; - height: calc(100vh - 6.5rem); - margin-right: -1rem; - overflow: hidden; - border-left-width: 1px; - border-color: rgb(228 228 231); - - &:is(.dark *) { - border-color: rgb(82 82 91); - } - & .wrapper { - position: absolute; - inset: 0; - overflow-y: auto; - overflow-x: hidden; - -ms-scroll-chaining: none; - overscroll-behavior: contain; - scroll-behavior: smooth; - padding: 1.5rem 0.25rem; - font-size: 0.9rem; - line-height: 1.2; - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-nav-mobile { - position: fixed; - left: 0; - top: 0; - height: 100vh; - width: 100%; - min-width: 360px; - max-width: 640px; - -ms-scroll-chaining: none; - overscroll-behavior: contain; - margin: 0; - padding: 0 0 4rem 0; - background-color: var(--cd-bg-color-hover); - color: var(--cd-text-color); - - transition: all 0.2s allow-discrete; - /* Final state of the exit animation */ - opacity: 0; - transform: translateX(-100%); - - &:popover-open { - opacity: 1; - transform: translateX(0); - } - /* Needs to be after the previous &:popover-open rule - to take effect, as the specificity is the same */ - @starting-style { - &:popover-open { - opacity: 0; - transform: translateX(-100%); - } - } - - @media (min-width: 640px) { - & { - border-right: 1px solid var(--cd-border-color); - } - } - & header { - margin: 1rem 0; - display: flex; - align-items: center; - padding-left: var(--cd-padding-left); - padding-right: var(--cd-padding-right); - } - & .logo { - margin-right: auto; - } - & .themeswitch { - border: none; - background: none; - outline: none; - } - & .cd-toggle-sidebar { - font-size: 1rem; - margin-left: 0.75rem; - width: 4.5rem; - line-height: 1; - padding: 0.75rem 0.5rem; - } - - & .toc { - margin-bottom: 1.25rem; - display: flex; - flex-direction: column; - -ms-scroll-chaining: none; - overscroll-behavior: contain; - padding-left: var(--cd-padding-left); - padding-right: var(--cd-padding-right); - font-size: 1rem; - line-height: 1.5rem; - } -} -/* Transition for the popover's backdrop. - ::backdrop cannot be nested */ -.cd-nav-mobile::backdrop { - transition: all 0.5s allow-discrete; - /* Final state of the exit animation */ - backdrop-filter: blur(0); - background-color: rgb(0 0 0 / 0%); -} -.cd-nav-mobile:popover-open::backdrop { - backdrop-filter: blur(2px); - background-color: rgb(0 0 0 / 15%); -} -@starting-style { - .cd-nav-mobile:popover-open::backdrop { - backdrop-filter: blur(0); - background-color: rgb(0 0 0 / 0%); - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-page-single > main { - margin: 0; - max-width: 100%; - padding: 0; -} - -.cd-page { - & .page-wrapper { - z-index: 10; - margin-left: auto; - margin-right: auto; - display: flex; - max-width: 100rem; - padding-top: 1rem; - padding-left: var(--cd-padding-left); - padding-right: var(--cd-padding-right); - padding-bottom: 1.5rem; - min-width: 360px; - } - & .page-wrapper > main { - width: 100%; - padding-top: 1rem; - } - @media (min-width: 640px) { - & { - padding-bottom: 1rem; - } - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-prevnext { - display: flex; - align-items: stretch; - width: 100%; - margin-top: 2rem; - padding-top: 2rem; - padding-bottom: 2rem; - padding-left: var(--cd-padding-left); - padding-right: var(--cd-padding-right); - border-top: 1px solid var(--cd-border-color); - font-family: var(--cd-font-sans); - - & a.prev, - & a.next { - display: flex; - align-items: center; - padding: 0.75rem 0.25rem; - text-decoration: none; - width: 50%; - border: 1px solid var(--cd-border-color); - color: var(--cd-text-color); - border-radius: 10px; - transition: all 0.2s ease-in; - } - & a.prev { - margin-right: 1.25rem; - justify-content: flex-start; - text-align: left; - } - & a.next { - margin-left: auto; - justify-content: flex-end; - text-align: right; - } - & a.prev:hover, - & a.next:hover { - border-color: rgb(113, 113, 122); - } - &:is(.dark *) a.prev:hover, - &:is(.dark *) a.next:hover { - border-color: rgb(150, 150, 150); - } - & .section { - font-size: 0.875rem; - line-height: 1; - color: rgb(113, 113, 122); - margin-bottom: 0.1rem; - } - &:is(.dark *) .section { - color: rgb(150, 150, 150); - } - & .title { - font-size: 1rem; - line-height: 1.1; - } - & i { - opacity: 0.8; - font-style: normal; - font-size: 1.4rem; - padding: 0 0.5rem; - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-theme-switch { - display: flex; - align-items: center; - justify-content: center; - -webkit-tap-highlight-color: transparent; - - & { - font-weight: 400; - height: 2.5rem; - width: 2.5rem; - flex-grow: 0; - padding: 0.2rem; - } - @media (min-width: 1024px) { - & { - width: auto; - } - } - & svg { - padding: 0.3rem; - margin: 0; - } - &:is(.dark *) svg { - padding: 0.1rem; - } - & .sun-and-moon { - pointer-events: none; - display: block; - height: 100%; - width: 100%; - } - & .sun { - transform-origin: center; - transform: scale(1, 1); - transform: translate3d(0, 0, 0); - fill: #3f3f46; - stroke: transparent; - } - &:hover .sun { - fill: #27272a; - } - &:focus-visible .sun { - fill: #27272a; - } - @media (prefers-reduced-motion: no-preference) { - & .sun { - transition-property: transform; - transition-timing-function: cubic-bezier(0.5, 1.25, 0.75, 1.25); - transition-duration: 0.5s; - } - } - & .sun:is(.dark *) { - transform: scale(1.75, 1).75; - fill: #e4e4e7; - } - &:hover .sun:is(.dark *) { - fill: #f4f4f5; - } - &:focus-visible .sun:is(.dark *) { - fill: #f4f4f5; - } - @media (prefers-reduced-motion: no-preference) { - & .sun:is(.dark *) { - transition-timing-function: cubic-bezier(0.25, 0, 0.3, 1); - transition-duration: 250ms; - } - } - & .sun-beams { - transform-origin: center; - stroke: #3f3f46; - stroke-width: 2; - } - &:hover .sun-beams { - stroke: #27272a; - } - &:focus-visible .sun-beams { - stroke: #27272a; - } - @media (prefers-reduced-motion: no-preference) { - & .sun-beams { - transition-property: transform, opacity; - transition-timing-function: cubic-bezier(0.5, 1.5, 0.75, 1.25); - transition-duration: 400ms; - } - } - & .sun-beams:is(.dark *) { - transform: translate3d(0, 0, 0); - transform: rotate(-25deg); - stroke: #e4e4e7; - opacity: 0; - } - &:hover .sun-beams:is(.dark *) { - stroke: #f4f4f5; - } - &:focus-visible .sun-beams:is(.dark *) { - stroke: #f4f4f5; - } - @media (prefers-reduced-motion: no-preference) { - & .sun-beams:is(.dark *) { - transition-duration: 150ms; - } - } - & .moon { - transform-origin: center; - fill: #52525b; - } - &:hover .moon { - fill: #71717a; - } - & .moon circle { - transform: translate3d(0, 0, 0); - } - @media (prefers-reduced-motion: no-preference) { - & .moon circle { - transition-property: transform; - transition-timing-function: cubic-bezier(0, 0, 0, 1); - transition-duration: 0.3s; - } - } - & .moon circle:is(.dark *) { - transform: translateX(-7px); - } - @media (prefers-reduced-motion: no-preference) { - & .moon circle:is(.dark *) { - transition-delay: 0.3s; - } - } - & .light-text, - & .dark-text { - padding: 0.5rem; - padding-left: 0; - display: none; - white-space: nowrap; - font-weight: bold; - text-align: left; - } - @media (min-width: 1024px) { - & .light-text { - display: block; - } - & .light-text:is(.dark *) { - display: none; - } - & .dark-text:is(.dark *) { - display: block; - } - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-toc { - & details, - & section { - margin-top: 1.5rem; - } - - & summary { - margin-bottom: 0.5rem; - font-weight: 600; - color: rgb(39 39 42); - } - & summary:is(.dark *) { - color: rgb(244 244 245); - } - - & h2 { - margin-bottom: 0.5rem; - font-weight: 600; - color: rgb(39 39 42); - } - & h2:is(.dark *) { - color: rgb(244 244 245); - } - - & .page { - border-left-width: 2px; - border-color: rgb(244 244 245); - padding-left: 0.5rem; - } - & .page:hover { - border-color: rgb(212 212 216); - } - - & .page:is(.dark *) { - border-color: rgb(63 63 70 / 0.5); - } - & .page:is(.dark *):hover { - border-color: rgb(161 161 170); - } - - & a { - position: relative; - display: flex; - align-items: center; - border-radius: 0.25rem; - border-width: 1px; - border-color: transparent; - line-height: 1.2; - margin: 0; - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.5rem; - padding-right: 0.5rem; - color: rgb(63 63 70); - } - & a:hover { - color: rgb(0 0 0); - } - & a:is(.dark *) { - color: rgb(161 161 170); - } - & a:is(.dark *):hover { - color: rgb(244 244 245); - } - & .active a { - border-color: rgb(228 228 231); - background-color: rgb(244 244 245); - font-weight: bold; - color: rgb(39 39 42); - } - & .active:is(.dark *) a { - color: black; - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-toc-page { - margin-top: -0.25rem; - - & li { - position: relative; - display: flex; - align-items: center; - } - - & li::after { - content: ""; - display: block; - position: absolute; - inset: 0; - background-color: var(--cd-brand-color); - border-radius: 0.25rem; - opacity: 0; - transition: opacity 0.2s ease-in-out; - z-index: -1; - } - - & li:has(a.active)::after { - opacity: 0.15; - } - - & a { - display: flex; - align-items: center; - color: rgb(82 82 91); - padding: 0.3rem 0 0.3rem 0.5rem; - } - & a:is(.dark *) { - color: rgb(161 161 170); - } - & a:hover:not(.active) { - & span { - text-decoration: underline; - } - } - - & li.indent-0 a { - padding-left: 0rem; - font-size: smaller; - text-transform: uppercase; - font-weight: bold; - border-bottom-width: 1px; - } - & li.indent-1 a { - padding-left: 0rem; - font-weight: bold; - } - & li.indent-2 a { padding-left: 1rem; } - & li.indent-3 a { padding-left: 1.5rem; } - & li.indent-4 a { padding-left: 2rem; } - & li.indent-5 a { padding-left: 2.5rem; } - & li.indent-6 a { padding-left: 3rem; } - - & li a::before { - content: ""; - display: inline-flex; - align-items: center; - justify-content: right; - line-height: 1; - height: 8px; - width: 8px; - margin: 0 0.5rem 0 0.5rem; - flex-grow: 0; - flex-shrink: 0; - } - li.indent-2 a::before { content: "○" } - li.indent-3 a::before { content: "•" } - li.indent-4 a::before { content: "·" } - li.indent-5 a::before { content: "⁃" } - li.indent-6 a::before { content: "·" } - - & li a.active::before { - content: ""; - border-radius: 3px; - background-color: var(--cd-brand-color); - } -} - -/* ---------------------------------------------------------------------- */ - -.cd-nav-global, -.cd-nav-local, -.cd-nav-mobile { - display: none; -} -.cd-nav-mobile:popover-open, -.cd-nav-top .cd-toggle-sidebar { - display: block; -} - -@media (min-width: 924px) { - .cd-nav-mobile, - .cd-nav-top .cd-toggle-sidebar { - display: none; - } -} - -@media (min-width: 924px) { - .cd-nav-global { - display: block; - } -} - -@media (min-width: 1024px) { - .cd-page .page-wrapper > main { - margin-left: 2.5rem; - margin-right: 2.5rem; - } - .cd-nav-local { - display: block; - } -} diff --git a/docs/theme/Autodoc.jinja b/docs/theme/Autodoc.jinja deleted file mode 100644 index e1a967c..0000000 --- a/docs/theme/Autodoc.jinja +++ /dev/null @@ -1,127 +0,0 @@ -{#def - obj: dict | None = None, - name: str = "", - level: int = 2, - members: bool = True, -#} - -{% set obj = obj or autodoc(name) %} - -<h{{ level }}> - <code class="doc-symbol doc-symbol-{{ obj.symbol }}">{{ obj.symbol }}</code> - <span class="doc-oname doc-oname-{{ obj.symbol }}">{{ name or obj.name }}</span> - {% if obj.label -%} - <small class="doc-olabel doc-olabel-{{ obj.label }}"> - <code>{{ obj.label }}</code> - </small> - {%- endif %} -</h{{ level }}> - -{%- if obj.short_description -%} -<div class="doc-short-description"> - {{ obj.short_description | markdown | utils.widont }} -</div> -{% endif -%} - -{%- if obj.signature -%} -<div class="doc-signature"> -{% filter markdown -%} -```python -{{ obj.signature }} -``` -{%- endfilter %} -</div> -{%- endif %} - -{% if obj.bases -%} -<div class="doc-bases"> - <p>Bases: - {%- for base in obj.bases %} <code>{{ base }}</code>{% if not loop.last %}, {% endif %} - {%- endfor %} - </p> -</div> -{%- endif %} - -{% if obj.params -%} -<table class="doc-arguments"> - <thead><tr><th>Argument</th><th>Description</th></tr> - </thead> - <tbody> -{%- for param in obj.params %} - <tr> - <td><code>{{ param.name }}</code></td> - <td>{{ param.description | markdown | utils.widont }}</td> - </tr> -{%- endfor %} - </tbody> -</table> -{%- endif %} - -{%- if obj.description -%} -<div class="doc-long-description"> - {{ obj.description | markdown | utils.widont }} -</div> -{% endif -%} - -{% if obj.examples -%} -<div class="doc-examples"> -<p><strong>Example:</strong></p> - -{% for ex in obj.examples -%} -<div> -{% if ex.description %}{{ ex.description | markdown | utils.widont }}{% endif %} -{% if ex.snippet %}{{ ex.snippet }}{% endif %} -<div> -{% endfor -%} -</div> -{%- endif %} - -{% if obj.returns -%} -<li class="doc-returns"> - <p><strong>Returns:</strong></p> - - {% if ex.returns -%} - <p>{{ obj.returns }}</p> - {%- endif %} - {% if ex.many_returns -%} - <ul> - {% for return in ex.many_returns %} - <li>{{ return }}</li> - {%- endfor %} - </ul> - {%- endif %} -</div> -{%- endif %} - -{% if obj.raises -%} - <div class="doc-raises"></div> - <p><strong>Raises:</strong></p> - - <ul> - {% for raises in obj.raises -%} - <li>{{ raises.description | markdown | utils.widont }}<ul> - {% endfor -%} - </ul> - </li> -{%- endif %} - -{% if members -%} - {% if obj.attrs or obj.properties-%} - <div class="doc-attrs"> - {% for attr in obj.attrs -%} - <Autodoc obj={{ attr }} level={{ level + 1 }} /> - {% endfor %} - {% for attr in obj.properties %} - <Autodoc obj={{ attr }} level={{ level + 1 }} /> - {%- endfor %} - </div> - {%- endif %} - - {% if obj.methods -%} - <div class="doc-methods"> - {% for method in obj.methods %} - <Autodoc obj={{ method }} level={{ level + 1 }} /> - {%- endfor %} - </div> - {%- endif %} -{%- endif %}
\ No newline at end of file diff --git a/docs/theme/Callout.jinja b/docs/theme/Callout.jinja deleted file mode 100644 index 4279b3a..0000000 --- a/docs/theme/Callout.jinja +++ /dev/null @@ -1,45 +0,0 @@ -{#def title="", type="info", icon="", open=True #} - -{% set icons = { - "note": "sticky_note", - "info": "info", - "tip": "check_circle", - "alert": "release_alert", - "warning": "warning", - "danger": "release_alert", - "error": "release_alert", - "internal": "rocket_launch", - "todo": "checklist", -} %} - -{% if icon != False %} - {% set icon = icon or icons.get(type) %} -{% endif %} - -{% do attrs.set(class="type-" + type or "none") %} - -{% if title -%} - -<details {{ attrs.render(open=open, class="cd-callout", data_component="Callout") }}> - <summary> - {% if icon -%} - <i class="icon">{{ icon }}</i> - {% endif -%} - {{ title }} - <icon class="icon arrow">keyboard_arrow_down</icon> - </summary> - <div class="content">{{content}}</div> -</details> - -{%- else -%} - -<aside {{ attrs.render(class="cd-callout", data_component="Callout") }}> - {% if icon -%} - <div class="icon-wrapper"> - <i class="icon">{{ icon }}</i> - </div> - {%- endif %} - <div class="content">{{content}}</div> -</aside> - -{%- endif %} diff --git a/docs/theme/ExampleTabs.jinja b/docs/theme/ExampleTabs.jinja deleted file mode 100644 index 0853ec5..0000000 --- a/docs/theme/ExampleTabs.jinja +++ /dev/null @@ -1,27 +0,0 @@ -{#def prefix, panels={} #} - -<div {{ attrs.render( - class="cd-example-tabs not-prose", - data_component="ExampleTabs", -) }}> - <TabGroup class="example-tabgroup"> - <TabList class="example-tablist" data-md-skip> - {%- for text in panels.keys() %} - <Tab - class="example-tab" - target={{ "ex-%s-%s" % (prefix, loop.index) }} - selected={{ loop.index == 1 }} - >{{ text }}</Tab> - {%- endfor %} - </TabList> - {%- for name in panels.values() %} - <TabPanel - class="example-tabpanel" - id={{ "ex-%s-%s" % (prefix, loop.index) }} - hidden={{ loop.index != 1 }} - > - {{ catalog.irender(name) }} - </TabPanel> - {%- endfor %} - </TabGroup> -</div> diff --git a/docs/theme/Footer.jinja b/docs/theme/Footer.jinja deleted file mode 100644 index a9e9c5a..0000000 --- a/docs/theme/Footer.jinja +++ /dev/null @@ -1,10 +0,0 @@ -<footer {{ attrs.render(class="cd-footer", data_component="Footer") }}> - <div class="wrapper"> - <Copyright /> - <div class="built-with"> - This site was - <a title="Coming soon!">built using Claydocs</a> - </div> - <ThemeSwitch class="themeswitch" /> - </div> -</footer> diff --git a/docs/theme/Header.jinja b/docs/theme/Header.jinja deleted file mode 100644 index 1b719cf..0000000 --- a/docs/theme/Header.jinja +++ /dev/null @@ -1,17 +0,0 @@ -{#def title="", section="" #} - -{% set section = section or page.section if section != false else None %} -{% set title = title or page.title %} - -<header {{ attrs.render( - class="cd-header", - data_component="Header", -) }}> - <div> - {% if section -%} - <div>{{ section }}</div> - {%- endif %} - <h1>{{ title | utils.widont }}</h1> - </div> - <p class="description">{{ content | utils.widont }}</p> -</header> diff --git a/docs/theme/Layout.jinja b/docs/theme/Layout.jinja deleted file mode 100644 index e76046f..0000000 --- a/docs/theme/Layout.jinja +++ /dev/null @@ -1,25 +0,0 @@ -{#def title="", description="" #} - -<!DOCTYPE html> -<html lang="{{ page.lang }}" class="light"> -<head> -<meta charset="utf-8"> -<MetaTags page={{ page }} /> -<link rel="icon" type="image/x-icon" href="/static/favicon.ico"> -<link rel="apple-touch-icon" sizes="120x120" href="/static/img/apple-touch-icon.png"> -<link rel="stylesheet" href="/static/theme.css?v={{ utils.timestamp }}"> -<link rel="stylesheet" href="/static/prose.css?v={{ utils.timestamp }}"> -<link rel="stylesheet" href="/static/docs.css?v={{ utils.timestamp }}"> -{{ catalog.render_assets() }} -{% if page.prev_page and page.prev_page.url -%} - <link href="{{ page.prev_page.url }}" rel="prev"> -{% endif -%} -{% if page.next_page and page.next_page.url -%} - <link href="{{ page.next_page.url }}" rel="next"> -{% endif -%} -<meta property="generator" content="claydocs" /> -</head> -<body {{ attrs.render() }}> -{{ content }} -</body> -</html> diff --git a/docs/theme/MetaTags.jinja b/docs/theme/MetaTags.jinja deleted file mode 100644 index 2639afb..0000000 --- a/docs/theme/MetaTags.jinja +++ /dev/null @@ -1,22 +0,0 @@ -{#def page #} - -{% set DEFAULT_TITLE = "JinjaX Documentation" %} -{% set title = (page.title + " | " + DEFAULT_TITLE) if page.title else DEFAULT_TITLE %} -{% set description = page.description %} - -<title>{{ title }}</title> -<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> -<meta property="og:type" content="website"> -<meta property="og:url" content="{{ nav.domain }}{{ page.url }}"> -<meta property="og:title" content="{{ title }}"> -<meta property="twitter:title" content="{{ title }}"> -{% if description -%} -<meta property="og:description" content="{{ description }}"> -<meta property="twitter:description" content="{{ description }}"> -{%- endif %} -<meta property="og:image" content="{{ nav.domain }}{{ page.url }}/og-card.png"> -<meta property="og:image:type" content="image/png"> -<meta property="og:image:width" content="1200"> -<meta property="og:image:height" content="630"> -<meta property="twitter:card" content="summary_large_image"> -<meta property="twitter:image" content="{{ nav.domain }}{{ page.url }}/og-card.png"> diff --git a/docs/theme/NavBar.jinja b/docs/theme/NavBar.jinja deleted file mode 100644 index 50f8ca2..0000000 --- a/docs/theme/NavBar.jinja +++ /dev/null @@ -1,3 +0,0 @@ -<nav {{ attrs.render(class="cd-navbar", data_component="NavBar") }}> -{{ content }} -</nav>
\ No newline at end of file diff --git a/docs/theme/NavGlobal.jinja b/docs/theme/NavGlobal.jinja deleted file mode 100644 index 1171db0..0000000 --- a/docs/theme/NavGlobal.jinja +++ /dev/null @@ -1,3 +0,0 @@ -<div {{ attrs.render(class="cd-nav-global scrollbar-thin", data_component="NavGlobal") }}> - <Toc toc={{ nav.toc }} page={{ page}} /> -</div> diff --git a/docs/theme/NavLocal.jinja b/docs/theme/NavLocal.jinja deleted file mode 100644 index 2af7606..0000000 --- a/docs/theme/NavLocal.jinja +++ /dev/null @@ -1,5 +0,0 @@ -<div {{ attrs.render(class="cd-nav-local", data_component="NavLocal") }}> - <div class="wrapper scrollbar-thin"> - <TocPage :page_toc="page.toc" /> - </div> -</div> diff --git a/docs/theme/NavMobile.jinja b/docs/theme/NavMobile.jinja deleted file mode 100644 index 4126fb0..0000000 --- a/docs/theme/NavMobile.jinja +++ /dev/null @@ -1,18 +0,0 @@ -{% do attrs.set(id="navMobile", class="cd-nav-mobile", data_component="NavMobile") %} - -<Popover _attrs={{ attrs }}> - <header> - <Logo base_url={{ page.base_url }} class="logo" /> - <nav class="cd-navbar nav-links"> - <ThemeSwitch class="themeswitch" text={{ false }} /> - </nav> - <PopButton - target="navMobile" - action="close" - title="Close menu" - class="cd-toggle-sidebar cd-text-button" - >Close</PopButton> - </header> - - <Toc class="toc" toc={{ nav.toc }} page={{ page }} /> -</Popover> diff --git a/docs/theme/NavTop.jinja b/docs/theme/NavTop.jinja deleted file mode 100644 index 8518391..0000000 --- a/docs/theme/NavTop.jinja +++ /dev/null @@ -1,17 +0,0 @@ -<section class="cd-nav-top", data_component="NavTop"> - <div class="wrapper"> - <Logo class="logo" base_url={{ page.base_url }} /> - <nav class="cd-navbar nav-links"> - <NavLinks /> - <ThemeSwitch class="themeswitch" text={{ false }} /> - </nav> - <nav class="nav-extra"> - <NavExtra /> - </nav> - <PopButton - target="navMobile" - title="Show menu" - class="cd-toggle-sidebar cd-text-button" - >Menu</PopButton> - </div> -</section> diff --git a/docs/theme/Page.jinja b/docs/theme/Page.jinja deleted file mode 100644 index 8fec014..0000000 --- a/docs/theme/Page.jinja +++ /dev/null @@ -1,19 +0,0 @@ -<Layout - title={{ page.title }} - description={{ page.description }} - class={{ meta.get('class', 'cd-page') }} -> - <NavTop></NavTop> - <div class="page-wrapper"> - <NavGlobal></NavGlobal> - <main id="main" class="page prose">{{ content }}</main> - <NavLocal></NavLocal> - </div> - <PrevNext - curr={{ page }} - prev={{ page.prev_page }} - next={{ page.next_page }} - /> - <NavMobile></NavMobile> - <Footer></Footer> -</Layout> diff --git a/docs/theme/PageSingle.jinja b/docs/theme/PageSingle.jinja deleted file mode 100644 index d89fd49..0000000 --- a/docs/theme/PageSingle.jinja +++ /dev/null @@ -1,10 +0,0 @@ -<Layout - title={{ page.title }} - description={{ page.description }} - class={{ meta.get('class', 'cd-page-single') }} -> - <NavTop /> - <main>{{ content }}</main> - <NavMobile /> - <Footer /> -</Layout> diff --git a/docs/theme/PrevNext.jinja b/docs/theme/PrevNext.jinja deleted file mode 100644 index 9c6a572..0000000 --- a/docs/theme/PrevNext.jinja +++ /dev/null @@ -1,26 +0,0 @@ -{#def curr, prev, next #} - -<nav {{ attrs.render(class="cd-prevnext", data_component="PrevNext") }}> - {% if prev.url -%} - <a href="{{ prev.url }}" class="prev"> - <i>←</i> - <div> - <div class="section"> - {{ prev.section or "Previous" if prev.section != curr.section else "Previous" }} - </div> - <div class="title">{{ prev.title }}</div> - </div> - </a> - {%- endif %} - {% if next.url -%} - <a href="{{ next.url }}" class="next"> - <div> - <div class="section"> - {{ next.section or "Next" if next.section != curr.section else "Next" }} - </div> - <div class="title">{{ next.title }}</div> - </div> - <i>→</i> - </a> - {%- endif %} -</nav> diff --git a/docs/theme/SocialCard.jinja b/docs/theme/SocialCard.jinja deleted file mode 100644 index 2fe00be..0000000 --- a/docs/theme/SocialCard.jinja +++ /dev/null @@ -1,61 +0,0 @@ -{#def page #} -<Layout - title={{ page.title }} - description={{page.description }} -> - <style> - body { - background-color: black; - } - .sc1 { - width: 1200px; - height: 630px; - margin: 0; - font-family: SF Pro Display, system-ui, sans-serif; - color: white; - background-image: linear-gradient(to bottom, #404faa, #0068b2); - } - .sc1__wrapper { - position: absolute; - inset: 60px 90px 90px 60px; - } - .sc1__wrapper > * { - position: absolute; - left: 0; - max-width: 1060px; - } - .sc1__logo { - top: 0; - height: 50px; - } - .sc1__section { - top: 150px; - line-height: 1; - font-weight: bold; - text-transform: uppercase; - font-size: 22px; - width: 600px; - } - .sc1__title { - top: 180px; - line-height: 1; - font-weight: bold; - font-size: 68px; - } - .sc1__description { - bottom: 0; - line-height: 1.4; - font-weight: normal; - font-size: 22px; - } - </style> - - <article class="sc1"> - <div class="sc1__wrapper"> - <img class="sc1__logo" src="/static/img/jinjax-logo-w.png" /> - <h2 class="sc1__section">{{ page.section }}</h2> - <h1 class="sc1__title">{{ page.title | utils.widont }}</h1> - <div class="sc1__description">{{ page.description | utils.widont }}</div> - </div> - </article> -</Layout> diff --git a/docs/theme/Source.jinja b/docs/theme/Source.jinja deleted file mode 100644 index c742f56..0000000 --- a/docs/theme/Source.jinja +++ /dev/null @@ -1,24 +0,0 @@ -{# def url: str, label: str = "" #} -{% do attrs.set(href=url, target="_blank") %} -{% set icon = url.replace("http://", "").replace("https://", "").split(".")[0] %} - -<a {{ attrs.render(class="cd-source", data_component="Source") }}> - <div class="cd-source__icon"> - {% if icon == "github" -%} - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg> - {% elif icon == "gitlab" -%} - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. --><path d="M503.5 204.6L502.8 202.8L433.1 21.02C431.7 17.45 429.2 14.43 425.9 12.38C423.5 10.83 420.8 9.865 417.9 9.57C415 9.275 412.2 9.653 409.5 10.68C406.8 11.7 404.4 13.34 402.4 15.46C400.5 17.58 399.1 20.13 398.3 22.9L351.3 166.9H160.8L113.7 22.9C112.9 20.13 111.5 17.59 109.6 15.47C107.6 13.35 105.2 11.72 102.5 10.7C99.86 9.675 96.98 9.295 94.12 9.587C91.26 9.878 88.51 10.83 86.08 12.38C82.84 14.43 80.33 17.45 78.92 21.02L9.267 202.8L8.543 204.6C-1.484 230.8-2.72 259.6 5.023 286.6C12.77 313.5 29.07 337.3 51.47 354.2L51.74 354.4L52.33 354.8L158.3 434.3L210.9 474L242.9 498.2C246.6 500.1 251.2 502.5 255.9 502.5C260.6 502.5 265.2 500.1 268.9 498.2L300.9 474L353.5 434.3L460.2 354.4L460.5 354.1C482.9 337.2 499.2 313.5 506.1 286.6C514.7 259.6 513.5 230.8 503.5 204.6z"/></svg> - {%- else -%} - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. --><path d="M439.55 236.05L244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg> - {%- endif %} - </div> - <div class="cd-source__repo"> - <span class="cd-source__label">{{ label or url.split("/", 3)[-1] }}</span> - <ul class="cd-source__facts"> - <li data-fact="version" hidden></li> - <li data-fact="stars" hidden></li> - <li data-fact="forks" hidden></li> - <li data-fact="numrepos" hidden></li> - </ul> - </div> -</a>
\ No newline at end of file diff --git a/docs/theme/Source.js b/docs/theme/Source.js deleted file mode 100644 index e627460..0000000 --- a/docs/theme/Source.js +++ /dev/null @@ -1,123 +0,0 @@ -const ATTR_FACT = "data-fact"; -const CLASS_FACTS = "cd-source__facts"; -const CLASS_FACTS_VISIBLE = `${CLASS_FACTS}--visible`; - -document.addEventListener("DOMContentLoaded", function () { - document.querySelectorAll('[data-component="Source"]').forEach(showFacts); -}); - -function showFacts(node) { - function renderFacts(facts) { - Array.from(node.querySelectorAll(`[${ATTR_FACT}]`)) - .forEach(function(node) { - const name = node.getAttribute(ATTR_FACT); - if (facts[name]) { - node.removeAttribute("hidden"); - node.innerText = facts[name]; - } - }); - - node.querySelector(`.${CLASS_FACTS}`).classList.add(CLASS_FACTS_VISIBLE); - } - - getSourceFacts(node.href, renderFacts); -} - -function getSourceFacts(url, callback) { - const key = `Source:${url}`; - let facts = sessionStorage.getItem(key); - if (facts) { - callback(JSON.parse(facts)); - return; - } - - fetchSourceFacts(url) - .then((facts) => { - if (facts && Object.keys(facts).length) { - sessionStorage.setItem(key, JSON.stringify(facts)); - callback(facts); - } - }); -} - -function fetchJSON(url) { - return fetch(url) - .then(response => response.json()) - .catch((error) => { - console.log(error); - }); -} - -function fetchSourceFacts(url) { - /* Try to match GitHub repository */ - let match = url.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i); - if (match) { - const [, user, repo] = match; - return fetchSourceFactsFromGitHub(user, repo); - } - - /* Try to match GitLab repository */ - match = url.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i); - if (match) { - const [, base, slug] = match; - return fetchSourceFactsFromGitLab(base, slug); - } - - /* Fallback */ - return null; -} - -function fetchSourceFactsFromGitLab(base, project) { - const url = `https://${base}/api/v4/projects/${encodeURIComponent(project)}` - - fetchJSON(url) - .then(function({ star_count, forks_count }) { - return { - stars: star_count, - forks: forks_count, - }; - }); -} - -function fetchSourceFactsFromGitHub (user, repo) { - if (typeof repo === "undefined") { - return fetchSourceFactsFromGitHubOrg(user); - } else { - return fetchSourceFactsFromGitHubRepo(user, repo); - } -} - -function fetchSourceFactsFromGitHubOrg(user) { - const url = `https://api.github.com/users/${user}` - - fetchJSON(url) - .then(function(data) { - return { - numrepos: data.public_repos, - }; - }); -} - -function fetchSourceFactsFromGitHubRepo(user, repo) { - const url = `https://api.github.com/repos/${user}/${repo}` - - const release = fetchJSON(`${url}/releases/latest`) - .then((data) => { - return { - version: data.tag_name, - }; - }); - - const info = fetchJSON(url) - .then((data) => { - return { - stars: data.stargazers_count, - forks: data.forks_count, - }; - }); - - return Promise.all([release, info]) - .then(([release, info]) => { - return { ...release, ...info }; - }); -} diff --git a/docs/theme/Test.jinja b/docs/theme/Test.jinja deleted file mode 100644 index 00176ce..0000000 --- a/docs/theme/Test.jinja +++ /dev/null @@ -1,6 +0,0 @@ -<!DOCTYPE html><html> -<head><MetaTags page={{ page }} /></head><body class="prose"> - -{{ content }} - -</body></html>
\ No newline at end of file diff --git a/docs/theme/ThemeSwitch.jinja b/docs/theme/ThemeSwitch.jinja deleted file mode 100644 index 3543b73..0000000 --- a/docs/theme/ThemeSwitch.jinja +++ /dev/null @@ -1,36 +0,0 @@ -{#def text=true #} - -<button {{ attrs.render( - class="cd-theme-switch", - data_component="ThemeSwitch", - title="Toggle light & dark mode", - aria_label="auto", - aria_live="polite", -) }}> - <svg - class="sun-and-moon" - aria-hidden="true" - stroke-linecap="round" - viewBox="0 0 24 24" - > - <circle class="sun" cx="12" cy="12" r="6" mask="url(#moon-mask)"></circle> - <g class="sun-beams"> - <line x1="12" y1="1" x2="12" y2="3" /> - <line x1="12" y1="21" x2="12" y2="23" /> - <line x1="4.22" y1="4.22" x2="5.64" y2="5.64" /> - <line x1="18.36" y1="18.36" x2="19.78" y2="19.78" /> - <line x1="1" y1="12" x2="3" y2="12" /> - <line x1="21" y1="12" x2="23" y2="12" /> - <line x1="4.22" y1="19.78" x2="5.64" y2="18.36" /> - <line x1="18.36" y1="5.64" x2="19.78" y2="4.22" /> - </g> - <mask class="moon" id="moon-mask"> - <rect x="0" y="0" width="100%" height="100%" fill="white" /> - <circle cx="24" cy="10" r="6"></circle> - </mask> - </svg> - {% if text -%} - <span class="light-text">Light</span> - <span class="dark-text">Dark</span> - {%- endif %} -</button> diff --git a/docs/theme/ThemeSwitch.js b/docs/theme/ThemeSwitch.js deleted file mode 100644 index c8b2847..0000000 --- a/docs/theme/ThemeSwitch.js +++ /dev/null @@ -1,41 +0,0 @@ -import { on } from "./jxui.js"; - -const SEL_TARGET = ".cd-theme-switch"; -const STORAGE_KEY = "theme"; - -const DARK = "dark"; -const LIGHT = "light"; -const theme = {value: getColorPreference()}; - -reflectPreference(); -on("click", SEL_TARGET, onClick); -// sync with system changes -window - .matchMedia("(prefers-color-scheme: dark)") - .addEventListener("change", ({matches:isDark}) => { - theme.value = isDark ? DARK : LIGHT - setPreference() - }); - -function onClick (event, target) { - if (target.matches("[disabled]")) return; - theme.value = theme.value === LIGHT ? DARK : LIGHT; - setPreference(); -} -function setPreference () { - localStorage.setItem(STORAGE_KEY, theme.value); - reflectPreference(); -} -function reflectPreference () { - const value = getColorPreference (); - if (value === DARK) { - document.documentElement.classList.add(DARK); - document.documentElement.classList.remove(LIGHT); - } else { - document.documentElement.classList.add(LIGHT); - document.documentElement.classList.remove(DARK); - } -} -function getColorPreference () { - return localStorage.getItem(STORAGE_KEY); -}
\ No newline at end of file diff --git a/docs/theme/Toc.jinja b/docs/theme/Toc.jinja deleted file mode 100644 index 2670b62..0000000 --- a/docs/theme/Toc.jinja +++ /dev/null @@ -1,45 +0,0 @@ -{# def toc, page #} - -{% macro render_page(url, title) %} -{% if url != "/" -%} -<div class="page {{ 'active' if page.url == url else '' }}"> - <a href="{{ url }}#">{{ title }}</a> -</div> -{%- endif %} -{% endmacro %} - - -{% macro render_collapsable(title, children) %} -<details open> - {% if title %}<summary>{{ title }}</summary>{% endif %} - {{ render_children(children) }} -</details> -{% endmacro %} - - -{% macro render_section(title, children) %} -<section open> - {% if title %}<h2>{{ title }}</h2>{% endif %} - {{ render_children(children) }} -</section> -{% endmacro %} - - -{% macro render_children(children, collapsable=True) %} - {%- for url, title, sub_children in children %} - {% if sub_children -%} - {% if collapsable -%} - {{ render_collapsable(title, sub_children) }} - {%- else -%} - {{ render_section(title, sub_children) }} - {%- endif %} - {%- else -%} - {{ render_page(url, title) }} - {%- endif %} - {%- endfor %} -{% endmacro %} - - -<div {{ attrs.render(class="cd-toc", data_component="Toc") }}> - {{ render_children(toc, collapsable=False) }} -</div>
\ No newline at end of file diff --git a/docs/theme/TocPage.jinja b/docs/theme/TocPage.jinja deleted file mode 100644 index 754b624..0000000 --- a/docs/theme/TocPage.jinja +++ /dev/null @@ -1,21 +0,0 @@ -{#def page_toc, max_depth=3 #} - -{% macro render_sub_items(pages) %} -{%- for section in pages %} - <li class="indent-{{ section.level }}"> - <a href="#{{ section.id }}"><span>{{ section.name }}</span></a> - </li> - {% if section.level <= max_depth -%} - {{ render_sub_items(section.children) }} - {%- endif %} -{%- endfor %} -{% endmacro %} - -<ul {{ attrs.render(class="cd-toc-page", data_component="TocPage") }}> -{%- for section in page_toc %} - <li class="indent-{{ section.level }}"> - <a href="#{{ section.id }}"><span>{{ section.name }}</span></a> - </li> - {{ render_sub_items(section.children) }} -{%- endfor %} -</ul> diff --git a/docs/theme/TocPage.js b/docs/theme/TocPage.js deleted file mode 100644 index 77bad1e..0000000 --- a/docs/theme/TocPage.js +++ /dev/null @@ -1,97 +0,0 @@ -import { on } from "./jxui.js"; - -const ACTIVE = "active"; -const SEL_BACKTOTOP = ".cd-back-to-top" -const SEL_PAGETOC = ".cd-toc-page" -const SEL_TARGET = `${SEL_PAGETOC} a`; -const SEL_ACTIVE = `${SEL_TARGET}.${ACTIVE}`; -const SEL_PAGE = "#main.page"; -const SEL_SECTIONS = `${SEL_PAGE} section[id]`; -const DESKTOP_THRESHOLD = 1024; - -on("click", SEL_TARGET, handleClick); -on("click", SEL_BACKTOTOP, backToTop); - -function handleClick(event, target) { - removeHighlight(); - setTimeout(function () { updateHighlight(target) }, 10); -} - -function updateHighlight (elem) { - if (window.innerWidth > DESKTOP_THRESHOLD && !elem?.classList.contains(ACTIVE)) { - removeHighlight(); - if (!elem) return; - elem.classList.add(ACTIVE); - } -} - -function removeHighlight () { - document.querySelectorAll(SEL_ACTIVE).forEach(function (node) { - node.classList.remove(ACTIVE); - }); -} - -function resetNavPosition () { - var pagetoc = document.querySelector(SEL_TOC); - pagetoc?.scroll({ top: 0 }); -} - -export function backToTop () { - window.scrollTo({ top: 0, behavior: "smooth" }); - resetNavPosition(); -} - -export function scrollSpy() { - const sections = Array.from(document.querySelectorAll(SEL_SECTIONS)); - - function matchingNavLink(elem) { - if (!elem) return; - var index = sections.indexOf(elem); - - var match; - while (index >= 0 && !match) { - var sectionId = sections[index].getAttribute("id"); - if (sectionId) { - match = document.querySelector(`${SEL_PAGETOC} [href="#${sectionId}"]`); - } - index--; - } - return match; - } - - function belowBottomHalf(i) { - return i.boundingClientRect.bottom > (i.rootBounds.bottom + i.rootBounds.top) / 2; - } - - function prevElem(elem) { - var index = sections.indexOf(elem); - if (index <= 0) { - return null; - } - return sections[index - 1]; - } - - const PAGE_LOAD_BUFFER = 1000; - - function navHighlight(entries) { - entries.forEach(function (entry) { - if (entry.isIntersecting) { - updateHighlight(matchingNavLink(entry.target)); - } else if (entry.time >= PAGE_LOAD_BUFFER && belowBottomHalf(entry)) { - updateHighlight(matchingNavLink(prevElem(entry.target))); - } - }); - } - - const observer = new IntersectionObserver(navHighlight, { - threshold: 0, - rootMargin: "0% 0px -95% 0px" - }); - - sections.forEach(function (elem) { - observer.observe(elem); - }) - observer.observe(document.querySelector(SEL_PAGE)); -} - -document.addEventListener("DOMContentLoaded", scrollSpy); diff --git a/jinjax-logo.png b/jinjax-logo.png Binary files differdeleted file mode 100644 index 941df9f..0000000 --- a/jinjax-logo.png +++ /dev/null diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index d6bd744..0000000 --- a/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "jinjax", - "lockfileVersion": 3, - "requires": true, - "packages": {} -} diff --git a/poetry.lock b/poetry.lock index 5bcb8e2..c1a84fb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "cachetools" -version = "5.3.3" +version = "5.5.0" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, - {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, + {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, + {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, ] [[package]] @@ -46,63 +46,73 @@ files = [ [[package]] name = "coverage" -version = "7.5.4" +version = "7.6.3" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, - {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, - {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, - {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, - {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, - {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, - {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, - {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, - {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, - {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, - {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, - {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, - {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, - {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, + {file = "coverage-7.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6da42bbcec130b188169107ecb6ee7bd7b4c849d24c9370a0c884cf728d8e976"}, + {file = "coverage-7.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c222958f59b0ae091f4535851cbb24eb57fc0baea07ba675af718fb5302dddb2"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab84a8b698ad5a6c365b08061920138e7a7dd9a04b6feb09ba1bfae68346ce6d"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70a6756ce66cd6fe8486c775b30889f0dc4cb20c157aa8c35b45fd7868255c5c"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c2e6fa98032fec8282f6b27e3f3986c6e05702828380618776ad794e938f53a"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:921fbe13492caf6a69528f09d5d7c7d518c8d0e7b9f6701b7719715f29a71e6e"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6d99198203f0b9cb0b5d1c0393859555bc26b548223a769baf7e321a627ed4fc"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87cd2e29067ea397a47e352efb13f976eb1b03e18c999270bb50589323294c6e"}, + {file = "coverage-7.6.3-cp310-cp310-win32.whl", hash = "sha256:a3328c3e64ea4ab12b85999eb0779e6139295bbf5485f69d42cf794309e3d007"}, + {file = "coverage-7.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:bca4c8abc50d38f9773c1ec80d43f3768df2e8576807d1656016b9d3eeaa96fd"}, + {file = "coverage-7.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c51ef82302386d686feea1c44dbeef744585da16fcf97deea2a8d6c1556f519b"}, + {file = "coverage-7.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ca37993206402c6c35dc717f90d4c8f53568a8b80f0bf1a1b2b334f4d488fba"}, + {file = "coverage-7.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c77326300b839c44c3e5a8fe26c15b7e87b2f32dfd2fc9fee1d13604347c9b38"}, + {file = "coverage-7.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e484e479860e00da1f005cd19d1c5d4a813324e5951319ac3f3eefb497cc549"}, + {file = "coverage-7.6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c6c0f4d53ef603397fc894a895b960ecd7d44c727df42a8d500031716d4e8d2"}, + {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:37be7b5ea3ff5b7c4a9db16074dc94523b5f10dd1f3b362a827af66a55198175"}, + {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:43b32a06c47539fe275106b376658638b418c7cfdfff0e0259fbf877e845f14b"}, + {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee77c7bef0724165e795b6b7bf9c4c22a9b8468a6bdb9c6b4281293c6b22a90f"}, + {file = "coverage-7.6.3-cp311-cp311-win32.whl", hash = "sha256:43517e1f6b19f610a93d8227e47790722c8bf7422e46b365e0469fc3d3563d97"}, + {file = "coverage-7.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:04f2189716e85ec9192df307f7c255f90e78b6e9863a03223c3b998d24a3c6c6"}, + {file = "coverage-7.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27bd5f18d8f2879e45724b0ce74f61811639a846ff0e5c0395b7818fae87aec6"}, + {file = "coverage-7.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d546cfa78844b8b9c1c0533de1851569a13f87449897bbc95d698d1d3cb2a30f"}, + {file = "coverage-7.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9975442f2e7a5cfcf87299c26b5a45266ab0696348420049b9b94b2ad3d40234"}, + {file = "coverage-7.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:583049c63106c0555e3ae3931edab5669668bbef84c15861421b94e121878d3f"}, + {file = "coverage-7.6.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2341a78ae3a5ed454d524206a3fcb3cec408c2a0c7c2752cd78b606a2ff15af4"}, + {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a4fb91d5f72b7e06a14ff4ae5be625a81cd7e5f869d7a54578fc271d08d58ae3"}, + {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e279f3db904e3b55f520f11f983cc8dc8a4ce9b65f11692d4718ed021ec58b83"}, + {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa23ce39661a3e90eea5f99ec59b763b7d655c2cada10729ed920a38bfc2b167"}, + {file = "coverage-7.6.3-cp312-cp312-win32.whl", hash = "sha256:52ac29cc72ee7e25ace7807249638f94c9b6a862c56b1df015d2b2e388e51dbd"}, + {file = "coverage-7.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:40e8b1983080439d4802d80b951f4a93d991ef3261f69e81095a66f86cf3c3c6"}, + {file = "coverage-7.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9134032f5aa445ae591c2ba6991d10136a1f533b1d2fa8f8c21126468c5025c6"}, + {file = "coverage-7.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:99670790f21a96665a35849990b1df447993880bb6463a0a1d757897f30da929"}, + {file = "coverage-7.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc7d6b380ca76f5e817ac9eef0c3686e7834c8346bef30b041a4ad286449990"}, + {file = "coverage-7.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7b26757b22faf88fcf232f5f0e62f6e0fd9e22a8a5d0d5016888cdfe1f6c1c4"}, + {file = "coverage-7.6.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c59d6a4a4633fad297f943c03d0d2569867bd5372eb5684befdff8df8522e39"}, + {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f263b18692f8ed52c8de7f40a0751e79015983dbd77b16906e5b310a39d3ca21"}, + {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:79644f68a6ff23b251cae1c82b01a0b51bc40c8468ca9585c6c4b1aeee570e0b"}, + {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71967c35828c9ff94e8c7d405469a1fb68257f686bca7c1ed85ed34e7c2529c4"}, + {file = "coverage-7.6.3-cp313-cp313-win32.whl", hash = "sha256:e266af4da2c1a4cbc6135a570c64577fd3e6eb204607eaff99d8e9b710003c6f"}, + {file = "coverage-7.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:ea52bd218d4ba260399a8ae4bb6b577d82adfc4518b93566ce1fddd4a49d1dce"}, + {file = "coverage-7.6.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8d4c6ea0f498c7c79111033a290d060c517853a7bcb2f46516f591dab628ddd3"}, + {file = "coverage-7.6.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:331b200ad03dbaa44151d74daeb7da2cf382db424ab923574f6ecca7d3b30de3"}, + {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54356a76b67cf8a3085818026bb556545ebb8353951923b88292556dfa9f812d"}, + {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebec65f5068e7df2d49466aab9128510c4867e532e07cb6960075b27658dca38"}, + {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d33a785ea8354c480515e781554d3be582a86297e41ccbea627a5c632647f2cd"}, + {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f7ddb920106bbbbcaf2a274d56f46956bf56ecbde210d88061824a95bdd94e92"}, + {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:70d24936ca6c15a3bbc91ee9c7fc661132c6f4c9d42a23b31b6686c05073bde5"}, + {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c30e42ea11badb147f0d2e387115b15e2bd8205a5ad70d6ad79cf37f6ac08c91"}, + {file = "coverage-7.6.3-cp313-cp313t-win32.whl", hash = "sha256:365defc257c687ce3e7d275f39738dcd230777424117a6c76043459db131dd43"}, + {file = "coverage-7.6.3-cp313-cp313t-win_amd64.whl", hash = "sha256:23bb63ae3f4c645d2d82fa22697364b0046fbafb6261b258a58587441c5f7bd0"}, + {file = "coverage-7.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:da29ceabe3025a1e5a5aeeb331c5b1af686daab4ff0fb4f83df18b1180ea83e2"}, + {file = "coverage-7.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df8c05a0f574d480947cba11b947dc41b1265d721c3777881da2fb8d3a1ddfba"}, + {file = "coverage-7.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec1e3b40b82236d100d259854840555469fad4db64f669ab817279eb95cd535c"}, + {file = "coverage-7.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4adeb878a374126f1e5cf03b87f66279f479e01af0e9a654cf6d1509af46c40"}, + {file = "coverage-7.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43d6a66e33b1455b98fc7312b124296dad97a2e191c80320587234a77b1b736e"}, + {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1990b1f4e2c402beb317840030bb9f1b6a363f86e14e21b4212e618acdfce7f6"}, + {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:12f9515d875859faedb4144fd38694a761cd2a61ef9603bf887b13956d0bbfbb"}, + {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:99ded130555c021d99729fabd4ddb91a6f4cc0707df4b1daf912c7850c373b13"}, + {file = "coverage-7.6.3-cp39-cp39-win32.whl", hash = "sha256:c3a79f56dee9136084cf84a6c7c4341427ef36e05ae6415bf7d787c96ff5eaa3"}, + {file = "coverage-7.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:aac7501ae73d4a02f4b7ac8fcb9dc55342ca98ffb9ed9f2dfb8a25d53eda0e4d"}, + {file = "coverage-7.6.3-pp39.pp310-none-any.whl", hash = "sha256:b9853509b4bf57ba7b1f99b9d866c422c9c5248799ab20e652bbb8a184a38181"}, + {file = "coverage-7.6.3.tar.gz", hash = "sha256:bb7d5fe92bd0dc235f63ebe9f8c6e0884f7360f88f3411bfed1350c872ef2054"}, ] [package.dependencies] @@ -113,24 +123,24 @@ toml = ["tomli"] [[package]] name = "distlib" -version = "0.3.8" +version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, - {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, + {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, + {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, ] [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -138,29 +148,29 @@ test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.15.4" +version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, - {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] -typing = ["typing-extensions (>=4.8)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "identify" -version = "2.5.36" +version = "2.6.1" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, - {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, + {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, + {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, ] [package.extras] @@ -196,71 +206,72 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] @@ -287,19 +298,19 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" @@ -318,13 +329,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "3.7.1" +version = "4.0.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" files = [ - {file = "pre_commit-3.7.1-py2.py3-none-any.whl", hash = "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5"}, - {file = "pre_commit-3.7.1.tar.gz", hash = "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a"}, + {file = "pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878"}, + {file = "pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2"}, ] [package.dependencies] @@ -336,13 +347,13 @@ virtualenv = ">=20.10.0" [[package]] name = "pyproject-api" -version = "1.7.1" +version = "1.8.0" description = "API to interact with the python pyproject.toml based projects" optional = false python-versions = ">=3.8" files = [ - {file = "pyproject_api-1.7.1-py3-none-any.whl", hash = "sha256:2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb"}, - {file = "pyproject_api-1.7.1.tar.gz", hash = "sha256:7ebc6cd10710f89f4cf2a2731710a98abce37ebff19427116ff2174c9236a827"}, + {file = "pyproject_api-1.8.0-py3-none-any.whl", hash = "sha256:3d7d347a047afe796fd5d1885b1e391ba29be7169bd2f102fcd378f04273d228"}, + {file = "pyproject_api-1.8.0.tar.gz", hash = "sha256:77b8049f2feb5d33eefcc21b57f1e279636277a8ac8ad6b5871037b243778496"}, ] [package.dependencies] @@ -350,36 +361,38 @@ packaging = ">=24.1" tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [package.extras] -docs = ["furo (>=2024.5.6)", "sphinx-autodoc-typehints (>=2.2.1)"] -testing = ["covdefaults (>=2.3)", "pytest (>=8.2.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "setuptools (>=70.1)"] +docs = ["furo (>=2024.8.6)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "pytest (>=8.3.3)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "setuptools (>=75.1)"] [[package]] name = "pyright" -version = "1.1.377" +version = "1.1.385" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.377-py3-none-any.whl", hash = "sha256:af0dd2b6b636c383a6569a083f8c5a8748ae4dcde5df7914b3f3f267e14dd162"}, - {file = "pyright-1.1.377.tar.gz", hash = "sha256:aabc30fedce0ded34baa0c49b24f10e68f4bfc8f68ae7f3d175c4b0f256b4fcf"}, + {file = "pyright-1.1.385-py3-none-any.whl", hash = "sha256:e5b9a1b8d492e13004d822af94d07d235f2c7c158457293b51ab2214c8c5b375"}, + {file = "pyright-1.1.385.tar.gz", hash = "sha256:1bf042b8f080441534aa02101dea30f8fc2efa8f7b6f1ab05197c21317f5bfa7"}, ] [package.dependencies] nodeenv = ">=1.6.0" +typing-extensions = ">=4.1" [package.extras] -all = ["twine (>=3.4.1)"] +all = ["nodejs-wheel-binaries", "twine (>=3.4.1)"] dev = ["twine (>=3.4.1)"] +nodejs = ["nodejs-wheel-binaries"] [[package]] name = "pytest" -version = "8.2.2" +version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, - {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, ] [package.dependencies] @@ -387,7 +400,7 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.5,<2.0" +pluggy = ">=1.5,<2" tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] @@ -413,128 +426,127 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] name = "ruff" -version = "0.5.0" +version = "0.7.0" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.5.0-py3-none-linux_armv6l.whl", hash = "sha256:ee770ea8ab38918f34e7560a597cc0a8c9a193aaa01bfbd879ef43cb06bd9c4c"}, - {file = "ruff-0.5.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38f3b8327b3cb43474559d435f5fa65dacf723351c159ed0dc567f7ab735d1b6"}, - {file = "ruff-0.5.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7594f8df5404a5c5c8f64b8311169879f6cf42142da644c7e0ba3c3f14130370"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adc7012d6ec85032bc4e9065110df205752d64010bed5f958d25dbee9ce35de3"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d505fb93b0fabef974b168d9b27c3960714d2ecda24b6ffa6a87ac432905ea38"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dc5cfd3558f14513ed0d5b70ce531e28ea81a8a3b1b07f0f48421a3d9e7d80a"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:db3ca35265de239a1176d56a464b51557fce41095c37d6c406e658cf80bbb362"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1a321c4f68809fddd9b282fab6a8d8db796b270fff44722589a8b946925a2a8"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c4dfcd8d34b143916994b3876b63d53f56724c03f8c1a33a253b7b1e6bf2a7d"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81e5facfc9f4a674c6a78c64d38becfbd5e4f739c31fcd9ce44c849f1fad9e4c"}, - {file = "ruff-0.5.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e589e27971c2a3efff3fadafb16e5aef7ff93250f0134ec4b52052b673cf988d"}, - {file = "ruff-0.5.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d2ffbc3715a52b037bcb0f6ff524a9367f642cdc5817944f6af5479bbb2eb50e"}, - {file = "ruff-0.5.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cd096e23c6a4f9c819525a437fa0a99d1c67a1b6bb30948d46f33afbc53596cf"}, - {file = "ruff-0.5.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:46e193b36f2255729ad34a49c9a997d506e58f08555366b2108783b3064a0e1e"}, - {file = "ruff-0.5.0-py3-none-win32.whl", hash = "sha256:49141d267100f5ceff541b4e06552e98527870eafa1acc9dec9139c9ec5af64c"}, - {file = "ruff-0.5.0-py3-none-win_amd64.whl", hash = "sha256:e9118f60091047444c1b90952736ee7b1792910cab56e9b9a9ac20af94cd0440"}, - {file = "ruff-0.5.0-py3-none-win_arm64.whl", hash = "sha256:ed5c4df5c1fb4518abcb57725b576659542bdbe93366f4f329e8f398c4b71178"}, - {file = "ruff-0.5.0.tar.gz", hash = "sha256:eb641b5873492cf9bd45bc9c5ae5320648218e04386a5f0c264ad6ccce8226a1"}, + {file = "ruff-0.7.0-py3-none-linux_armv6l.whl", hash = "sha256:0cdf20c2b6ff98e37df47b2b0bd3a34aaa155f59a11182c1303cce79be715628"}, + {file = "ruff-0.7.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:496494d350c7fdeb36ca4ef1c9f21d80d182423718782222c29b3e72b3512737"}, + {file = "ruff-0.7.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:214b88498684e20b6b2b8852c01d50f0651f3cc6118dfa113b4def9f14faaf06"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630fce3fefe9844e91ea5bbf7ceadab4f9981f42b704fae011bb8efcaf5d84be"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:211d877674e9373d4bb0f1c80f97a0201c61bcd1e9d045b6e9726adc42c156aa"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194d6c46c98c73949a106425ed40a576f52291c12bc21399eb8f13a0f7073495"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:82c2579b82b9973a110fab281860403b397c08c403de92de19568f32f7178598"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9af971fe85dcd5eaed8f585ddbc6bdbe8c217fb8fcf510ea6bca5bdfff56040e"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b641c7f16939b7d24b7bfc0be4102c56562a18281f84f635604e8a6989948914"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d71672336e46b34e0c90a790afeac8a31954fd42872c1f6adaea1dff76fd44f9"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ab7d98c7eed355166f367597e513a6c82408df4181a937628dbec79abb2a1fe4"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1eb54986f770f49edb14f71d33312d79e00e629a57387382200b1ef12d6a4ef9"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:dc452ba6f2bb9cf8726a84aa877061a2462afe9ae0ea1d411c53d226661c601d"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4b406c2dce5be9bad59f2de26139a86017a517e6bcd2688da515481c05a2cb11"}, + {file = "ruff-0.7.0-py3-none-win32.whl", hash = "sha256:f6c968509f767776f524a8430426539587d5ec5c662f6addb6aa25bc2e8195ec"}, + {file = "ruff-0.7.0-py3-none-win_amd64.whl", hash = "sha256:ff4aabfbaaba880e85d394603b9e75d32b0693152e16fa659a3064a85df7fce2"}, + {file = "ruff-0.7.0-py3-none-win_arm64.whl", hash = "sha256:10842f69c245e78d6adec7e1db0a7d9ddc2fff0621d730e61657b64fa36f207e"}, + {file = "ruff-0.7.0.tar.gz", hash = "sha256:47a86360cf62d9cd53ebfb0b5eb0e882193fc191c6d717e8bef4462bc3b9ea2b"}, ] [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] name = "tox" -version = "4.15.1" +version = "4.23.0" description = "tox is a generic virtualenv management and test command line tool" optional = false python-versions = ">=3.8" files = [ - {file = "tox-4.15.1-py3-none-any.whl", hash = "sha256:f00a5dc4222b358e69694e47e3da0227ac41253509bca9f45aa8f012053e8d9d"}, - {file = "tox-4.15.1.tar.gz", hash = "sha256:53a092527d65e873e39213ebd4bd027a64623320b6b0326136384213f95b7076"}, + {file = "tox-4.23.0-py3-none-any.whl", hash = "sha256:46da40afb660e46238c251280eb910bdaf00b390c7557c8e4bb611f422e9db12"}, + {file = "tox-4.23.0.tar.gz", hash = "sha256:a6bd7d54231d755348d3c3a7b450b5bf6563833716d1299a1619587a1b77a3bf"}, ] [package.dependencies] -cachetools = ">=5.3.2" +cachetools = ">=5.5" chardet = ">=5.2" colorama = ">=0.4.6" -filelock = ">=3.13.1" -packaging = ">=23.2" -platformdirs = ">=4.1" -pluggy = ">=1.3" -pyproject-api = ">=1.6.1" +filelock = ">=3.16.1" +packaging = ">=24.1" +platformdirs = ">=4.3.6" +pluggy = ">=1.5" +pyproject-api = ">=1.8" tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} -virtualenv = ">=20.25" - -[package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-argparse-cli (>=1.11.1)", "sphinx-autodoc-typehints (>=1.25.2)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2023.4.21)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.11)"] -testing = ["build[virtualenv] (>=1.0.3)", "covdefaults (>=2.3)", "detect-test-pollution (>=1.2)", "devpi-process (>=1)", "diff-cover (>=8.0.2)", "distlib (>=0.3.8)", "flaky (>=3.7)", "hatch-vcs (>=0.4)", "hatchling (>=1.21)", "psutil (>=5.9.7)", "pytest (>=7.4.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-xdist (>=3.5)", "re-assert (>=1.1)", "time-machine (>=2.13)", "wheel (>=0.42)"] +typing-extensions = {version = ">=4.12.2", markers = "python_version < \"3.11\""} +virtualenv = ">=20.26.6" [[package]] name = "typing-extensions" @@ -549,13 +561,13 @@ files = [ [[package]] name = "virtualenv" -version = "20.26.3" +version = "20.27.0" description = "Virtual Python Environment builder" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, - {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, + {file = "virtualenv-20.27.0-py3-none-any.whl", hash = "sha256:44a72c29cceb0ee08f300b314848c86e57bf8d1f13107a5e671fb9274138d655"}, + {file = "virtualenv-20.27.0.tar.gz", hash = "sha256:2ca56a68ed615b8fe4326d11a0dca5dfbe8fd68510fb6c6349163bed3c15f2b2"}, ] [package.dependencies] @@ -581,7 +593,10 @@ files = [ [package.extras] brotli = ["brotli"] +[extras] +whitenoise = ["whitenoise"] + [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "36b1c02ae6cf0c193066f5d7371995106331bd05502b88f82da7b0d5a76318b6" +content-hash = "bd447018e19b53192b02cffca6289a0f4f5a5d251f3a00d86affdc9e07222024" diff --git a/pyproject.toml b/pyproject.toml index e5836e6..d38a070 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,10 @@ classifiers = [ python = "^3.10" jinja2 = ">=3.0" markupsafe = ">=2.0" -whitenoise = ">=5.3" +whitenoise = { version = ">=5.3", optional = true } + +[tool.poetry.extras] +whitenoise = ["whitenoise"] [tool.poetry.group.dev] optional = true @@ -52,7 +55,7 @@ optional = true pytest = "^8.1.1" pytest-cov = "*" ruff = ">0.3" - +whitenoise = ">=5.3" [tool.coverage.run] branch = true diff --git a/src/jinjax/__init__.py b/src/jinjax/__init__.py index e30f39b..b8fc6cf 100644 --- a/src/jinjax/__init__.py +++ b/src/jinjax/__init__.py @@ -1,5 +1,23 @@ -from .catalog import Catalog # noqa -from .component import Component # noqa -from .exceptions import * # noqa -from .jinjax import JinjaX # noqa -from .html_attrs import HTMLAttrs, LazyString # noqa +from .catalog import Catalog +from .component import Component +from .exceptions import ( + ComponentNotFound, + DuplicateDefDeclaration, + InvalidArgument, + MissingRequiredArgument, +) +from .html_attrs import HTMLAttrs, LazyString +from .jinjax import JinjaX + + +__all__ = [ + "Catalog", + "Component", + "ComponentNotFound", + "DuplicateDefDeclaration", + "HTMLAttrs", + "InvalidArgument", + "JinjaX", + "LazyString", + "MissingRequiredArgument", +] diff --git a/src/jinjax/catalog.py b/src/jinjax/catalog.py index d0d0635..7728ed4 100644 --- a/src/jinjax/catalog.py +++ b/src/jinjax/catalog.py @@ -16,6 +16,10 @@ from .middleware import ComponentsMiddleware from .utils import DELIMITER, SLASH, get_url_prefix, logger +if t.TYPE_CHECKING: + from .middleware import ComponentsMiddleware + + DEFAULT_URL_ROOT = "/static/components/" ALLOWED_EXTENSIONS = (".css", ".js", ".mjs") DEFAULT_PREFIX = "" @@ -29,6 +33,8 @@ collected_js: dict[int, ContextVar[list[str]]] = {} class CallerWrapper(UserString): + _content = "" + def __init__(self, caller: t.Callable | None, content: str = "") -> None: self._caller = caller # Pre-calculate the defaut content so the assets are loaded @@ -40,11 +46,14 @@ class CallerWrapper(UserString): return self._content def __html__(self) -> str: - return self() + return self.__call__() + + def __repr__(self) -> str: + return self._content @property def data(self) -> str: # type: ignore - return self() + return self.__call__() class Catalog: @@ -431,14 +440,15 @@ class Catalog: application: t.Callable, allowed_ext: "t.Iterable[str] | None" = ALLOWED_EXTENSIONS, **kwargs, - ) -> ComponentsMiddleware: + ) -> "ComponentsMiddleware": """ Wraps you application with [Withenoise](https://whitenoise.readthedocs.io/), a static file serving middleware. - Tecnically not neccesary if your components doesn't use static assets - or if you serve them by other means. + Tecnically not necessary if your components doesn't use static assets + or if you serve them by other means. Requires the `whitenoise` python + package to be installed. Arguments: @@ -450,6 +460,8 @@ class Catalog: read and return. By default, is just ".css", ".js", and ".mjs". """ + from .middleware import ComponentsMiddleware + logger.debug("Creating middleware") middleware = ComponentsMiddleware( application=application, diff --git a/src/jinjax/jinjax.py b/src/jinjax/jinjax.py index b7a9783..27d5feb 100644 --- a/src/jinjax/jinjax.py +++ b/src/jinjax/jinjax.py @@ -10,7 +10,7 @@ from .utils import logger RENDER_CMD = "catalog.irender" -BLOCK_CALL = '{% call(_slot) [CMD]("[TAG]"[ATTRS]) -%}[CONTENT]{%- endcall %}' +BLOCK_CALL = '{% call(_slot="") [CMD]("[TAG]"[ATTRS]) -%}[CONTENT]{%- endcall %}' BLOCK_CALL = BLOCK_CALL.replace("[CMD]", RENDER_CMD) INLINE_CALL = '{{ [CMD]("[TAG]"[ATTRS]) }}' INLINE_CALL = INLINE_CALL.replace("[CMD]", RENDER_CMD) diff --git a/src/jinjax/middleware.py b/src/jinjax/middleware.py index 7c8acd8..af430b1 100644 --- a/src/jinjax/middleware.py +++ b/src/jinjax/middleware.py @@ -2,8 +2,15 @@ import re import typing as t from pathlib import Path -from whitenoise import WhiteNoise -from whitenoise.responders import Redirect, StaticFile + +try: + from whitenoise import WhiteNoise + from whitenoise.responders import Redirect, StaticFile +except ImportError as err : + raise ImportError( + "This feature requires the package `whitenoise` to be installed. \n" + + "Run `pip install jinjax[whitenoise]` to do it." + ) from err RX_FINGERPRINT = re.compile("(.*)-([abcdef0-9]{64})") @@ -11,6 +18,7 @@ RX_FINGERPRINT = re.compile("(.*)-([abcdef0-9]{64})") class ComponentsMiddleware(WhiteNoise): """WSGI middleware for serving components assets""" + allowed_ext: tuple[str, ...] def __init__(self, **kwargs) -> None: @@ -18,7 +26,6 @@ class ComponentsMiddleware(WhiteNoise): super().__init__(**kwargs) def find_file(self, url: str) -> "StaticFile | Redirect | None": - if self.allowed_ext and not url.endswith(self.allowed_ext): return None @@ -34,6 +41,8 @@ class ComponentsMiddleware(WhiteNoise): return super().find_file(str(relpath)) - def add_file_to_dictionary(self, url: str, path: str, stat_cache: t.Any = None) -> None: + def add_file_to_dictionary( + self, url: str, path: str, stat_cache: t.Any = None + ) -> None: if not self.allowed_ext or url.endswith(self.allowed_ext): super().add_file_to_dictionary(url, path, stat_cache) |