From 58a3cecdf5d087784658eacb5fdf2a4b38510c7e Mon Sep 17 00:00:00 2001 From: matmair Date: Sun, 2 Nov 2025 21:31:50 +0000 Subject: [PATCH] deploy: ea2311f15544f9815a7012f47a0f1d22a2599360 --- LavissaWoW.html | 4 +- LavissaWoW/inventree-ipn-generator.html | 6 +- SchrodingersGat/inventree-brother-plugin.html | 6 +- .../inventree-consolidated-shipping.html | 283 +++ .../inventree-harmonized-codes.html | 276 +++ SchrodingersGat/inventree-order-history.html | 6 +- .../inventree-rolling-stocktake.html | 276 +++ .../inventree-stock-forecasting.html | 6 +- .../inventree-test-statistics.html | 6 +- SchrodingersGat/inventree-wireviz.html | 6 +- SergeoLacruz.html | 4 +- SergeoLacruz/inventree-supplier-panel.html | 6 +- SergeoLacruz/inventree-zebra-plugin.html | 6 +- afkiwers/inventree-kicad.html | 6 +- afwkiers.html | 4 +- assets/index.css | 2 +- blog.html | 20 + blog/2025/10/15/rolling-stocktake.html | 191 ++ blog/2025/11/02/1.1.0.html | 285 +++ blog/feed.atom | 264 +-- digitalocean.html | 6 - extend/plugin/index.html | 4 +- index.html | 72 +- lippoliv.html | 4 +- .../inventree-default-salesorder-items.html | 6 +- matmair.html | 4 +- matmair/inventree-apprise.html | 6 +- matmair/inventree-rapidoc.html | 6 +- matmair/inventree-zapier.html | 6 +- melektron.html | 4 +- melektron/inventree-adv-sheet-label.html | 6 +- news.html | 10 + news/2025/10/02/1.1.0.html | 190 ++ news/feed.atom | 16 +- piramja.html | 4 +- piramja/inventree-niimbot-plugin.html | 6 +- plugins.html | 136 ++ plugins.json | 126 +- plugins/categories/index.html | 518 +++++ plugins/tags/index.html | 1778 +++++++++++++++++ schrodingersgat.html | 28 +- sitemap.xml | 88 +- wolflu05.html | 10 +- wolflu05/inventree-bulk-plugin.html | 6 +- wolflu05/inventree-cups-plugin.html | 6 +- wolflu05/inventree-dymo-plugin.html | 6 +- wolflu05/inventree-report-lsp-plugin.html | 6 +- wolflu05/inventree-zebra.html | 280 +++ 48 files changed, 4659 insertions(+), 342 deletions(-) create mode 100644 SchrodingersGat/inventree-consolidated-shipping.html create mode 100644 SchrodingersGat/inventree-harmonized-codes.html create mode 100644 SchrodingersGat/inventree-rolling-stocktake.html create mode 100644 blog/2025/10/15/rolling-stocktake.html create mode 100644 blog/2025/11/02/1.1.0.html create mode 100644 news/2025/10/02/1.1.0.html create mode 100644 wolflu05/inventree-zebra.html diff --git a/LavissaWoW.html b/LavissaWoW.html index 5e1d974e..95dfbc6e 100644 --- a/LavissaWoW.html +++ b/LavissaWoW.html @@ -30,11 +30,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Yes, WoW is for World of Warcraft","headline":"Lavissawow","mainEntityOfPage":{"@type":"WebPage","@id":"/LavissaWoW"},"url":"/LavissaWoW"} diff --git a/LavissaWoW/inventree-ipn-generator.html b/LavissaWoW/inventree-ipn-generator.html index fb59a847..b2370388 100644 --- a/LavissaWoW/inventree-ipn-generator.html +++ b/LavissaWoW/inventree-ipn-generator.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"LavissaWoW"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Introduction Installing this plugin enables the automatic generation if Internal Part Numbers (IPN) for parts.","headline":"Inventree Ipn Generator","mainEntityOfPage":{"@type":"WebPage","@id":"/LavissaWoW/inventree-ipn-generator"},"url":"/LavissaWoW/inventree-ipn-generator"} @@ -69,7 +69,7 @@

 LavissaWoW

-last modified: 19 Sep 2025 +last modified: 02 Nov 2025
diff --git a/SchrodingersGat/inventree-brother-plugin.html b/SchrodingersGat/inventree-brother-plugin.html index c8d0cf22..17649e7e 100644 --- a/SchrodingersGat/inventree-brother-plugin.html +++ b/SchrodingersGat/inventree-brother-plugin.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"SchrodingersGat"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Brother label printer plugin for InvenTree","headline":"Inventree Brother Plugin","mainEntityOfPage":{"@type":"WebPage","@id":"/SchrodingersGat/inventree-brother-plugin"},"url":"/SchrodingersGat/inventree-brother-plugin"} @@ -69,7 +69,7 @@

 SchrodingersGat

-last modified: 19 Sep 2025 +last modified: 02 Nov 2025
diff --git a/SchrodingersGat/inventree-consolidated-shipping.html b/SchrodingersGat/inventree-consolidated-shipping.html new file mode 100644 index 00000000..dbff85f8 --- /dev/null +++ b/SchrodingersGat/inventree-consolidated-shipping.html @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + +InvenTree - InvenTree Consolidated Shipping Lines + + + +InvenTree Consolidated Shipping Lines | InvenTree + + + + + + + + + + + + + + + + + + + +
+
+
+ + logo + InvenTree + + +
+ + + + +
+
+ +

inventree-consolidated-shipment-lines + + + + mdo +

 SchrodingersGat

+
+
+last modified: 02 Nov 2025 +

+ +
+
+

InvenTree Consolidated Shipping Lines

+ +

Adds extra report context when generating shipping reports, consolidating multiple stock items against each line item.

+ +

Installation

+ +

The easiest way to install the plugin is via the InvenTree user interface.

+ +

Alternatively, you can install the plugin manually as follows:

+ +
pip install inventree-consolidated-shipment-lines
+
+ +

Documentation

+ +

Refer to the plugin documentation for further instructions and information.

+ +
+ +
+

Detail section

+
+

License: + + + MIT
+
+

+
+ Status:
+
+ + + Stable + + +
+
+ + + Maintained + + +
+
+ Package on PyPI:
inventree-consolidated-shipment-lines
+ + + + +
+ +

https://inventree.org

+
+
+ + + + +
+ +
+
+ + + + +
+ +

SchrodingersGat/inventree-consolidated-shipping-report

+
+
+ + + + +
+ +
+ + Shipping + +
+
+ +
+ +
+ + shipping + + consolidated + + report + +
+
+
+
+
+ +
+ +
+ +
+
+ + +
+ + + diff --git a/SchrodingersGat/inventree-harmonized-codes.html b/SchrodingersGat/inventree-harmonized-codes.html new file mode 100644 index 00000000..456454dd --- /dev/null +++ b/SchrodingersGat/inventree-harmonized-codes.html @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + +InvenTree - Inventree Harmonized Codes + + + +Inventree Harmonized Codes | InvenTree + + + + + + + + + + + + + + + + + + + +
+
+
+ + logo + InvenTree + + +
+ + + + +
+
+ +

inventree-harmonized-codes + + + + mdo +

 SchrodingersGat

+
+
+last modified: 02 Nov 2025 +

+ +
+
+

Harmonized System Codes for InvenTree

+ +

A plugin which provides facility to assign harmonized system (HS) codes against parts when shipping internationally.

+ +

Installation

+ +

The easiest way to install the plugin is via the InvenTree user interface.

+ +

Alternatively, you can install the plugin manually as follows:

+ +
pip install inventree-harmonized-system-codes
+
+ +

Documentation

+ +

Refer to the plugin documentation for further instructions and information.

+ +
+ +
+

Detail section

+
+

License: + + + MIT
+
+

+
+ Status:
+
+ + + Stable + + +
+
+ + + Maintained + + +
+
+ Package on PyPI:
inventree-harmonized-system-codes
+ + + + +
+ +

https://inventree.org

+
+
+ + + + + + +
+ +

SchrodingersGat/inventree-harmonized-codes

+
+
+ + + + +
+ +
+ + Shipping + +
+
+ +
+ +
+ + shipping + + harmonized + + codes + +
+
+
+
+
+ +
+ +
+ +
+
+ + +
+ + + diff --git a/SchrodingersGat/inventree-order-history.html b/SchrodingersGat/inventree-order-history.html index caf9de6f..faae292e 100644 --- a/SchrodingersGat/inventree-order-history.html +++ b/SchrodingersGat/inventree-order-history.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"SchrodingersGat"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Order History for InvenTree","headline":"Inventree Order History","mainEntityOfPage":{"@type":"WebPage","@id":"/SchrodingersGat/inventree-order-history"},"url":"/SchrodingersGat/inventree-order-history"} @@ -69,7 +69,7 @@

 SchrodingersGat

-last modified: 19 Sep 2025 +last modified: 02 Nov 2025
diff --git a/SchrodingersGat/inventree-rolling-stocktake.html b/SchrodingersGat/inventree-rolling-stocktake.html new file mode 100644 index 00000000..8a59f0e0 --- /dev/null +++ b/SchrodingersGat/inventree-rolling-stocktake.html @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + +InvenTree - Inventree Rolling Stocktake + + + +Inventree Rolling Stocktake | InvenTree + + + + + + + + + + + + + + + + + + + +
+
+
+ + logo + InvenTree + + +
+ + + + +
+
+ +

inventree-rolling-stocktake + + + + mdo +

 SchrodingersGat

+
+
+last modified: 02 Nov 2025 +

+ +
+
+

Rolling Stocktake for InvenTree

+ +

A plugin which provides a rolling stocktake mechanism for InvenTree.

+ +

Installation

+ +

The easiest way to install the plugin is via the InvenTree user interface.

+ +

Alternatively, you can install the plugin manually as follows:

+ +
pip install inventree-rolling-stocktake
+
+ +

Documentation

+ +

Refer to the plugin documentation for further instructions and information.

+ +
+ +
+

Detail section

+
+

License: + + + MIT
+
+

+
+ Status:
+
+ + + Stable + + +
+
+ + + Maintained + + +
+
+ Package on PyPI:
inventree-rolling-stocktake
+ + + + +
+ +

https://inventree.org

+
+
+ + + + + + +
+ +

inventree/rolling-stocktake-plugin

+
+
+ + + + +
+ +
+ + Stock + +
+
+ +
+ +
+ + stock + + dashboard + + inventory + +
+
+
+
+
+ +
+ +
+ +
+
+ + +
+ + + diff --git a/SchrodingersGat/inventree-stock-forecasting.html b/SchrodingersGat/inventree-stock-forecasting.html index c7db4c17..85bcfe51 100644 --- a/SchrodingersGat/inventree-stock-forecasting.html +++ b/SchrodingersGat/inventree-stock-forecasting.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"SchrodingersGat"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Stock Forecasting for InvenTree","headline":"Inventree Stock Forecasting","mainEntityOfPage":{"@type":"WebPage","@id":"/SchrodingersGat/inventree-stock-forecasting"},"url":"/SchrodingersGat/inventree-stock-forecasting"} @@ -69,7 +69,7 @@

 SchrodingersGat

-last modified: 19 Sep 2025 +last modified: 02 Nov 2025
diff --git a/SchrodingersGat/inventree-test-statistics.html b/SchrodingersGat/inventree-test-statistics.html index 41fa0c2f..89e0fc21 100644 --- a/SchrodingersGat/inventree-test-statistics.html +++ b/SchrodingersGat/inventree-test-statistics.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"SchrodingersGat"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Test Statistics for InvenTree","headline":"Inventree Test Statistics","mainEntityOfPage":{"@type":"WebPage","@id":"/SchrodingersGat/inventree-test-statistics"},"url":"/SchrodingersGat/inventree-test-statistics"} @@ -69,7 +69,7 @@

 SchrodingersGat

-last modified: 19 Sep 2025 +last modified: 02 Nov 2025
diff --git a/SchrodingersGat/inventree-wireviz.html b/SchrodingersGat/inventree-wireviz.html index 49131907..d9579f0a 100644 --- a/SchrodingersGat/inventree-wireviz.html +++ b/SchrodingersGat/inventree-wireviz.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"SchrodingersGat"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Wireviz Extension for InvenTree","headline":"Inventree Wireviz","mainEntityOfPage":{"@type":"WebPage","@id":"/SchrodingersGat/inventree-wireviz"},"url":"/SchrodingersGat/inventree-wireviz"} @@ -69,7 +69,7 @@

 SchrodingersGat

-last modified: 19 Sep 2025 +last modified: 02 Nov 2025
diff --git a/SergeoLacruz.html b/SergeoLacruz.html index 76c272c4..65b44730 100644 --- a/SergeoLacruz.html +++ b/SergeoLacruz.html @@ -30,11 +30,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Hardware engineer in Germany and vintage fan.","headline":"Sergeolacruz","mainEntityOfPage":{"@type":"WebPage","@id":"/SergeoLacruz"},"url":"/SergeoLacruz"} diff --git a/SergeoLacruz/inventree-supplier-panel.html b/SergeoLacruz/inventree-supplier-panel.html index 4cf6c8a4..2741ef9f 100644 --- a/SergeoLacruz/inventree-supplier-panel.html +++ b/SergeoLacruz/inventree-supplier-panel.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"SergeoLacruz"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"The InvenTree-supplier-panel","headline":"Inventree Supplier Panel","mainEntityOfPage":{"@type":"WebPage","@id":"/SergeoLacruz/inventree-supplier-panel"},"url":"/SergeoLacruz/inventree-supplier-panel"} @@ -69,7 +69,7 @@

 SergeoLacruz

-last modified: 19 Sep 2025 +last modified: 02 Nov 2025
diff --git a/SergeoLacruz/inventree-zebra-plugin.html b/SergeoLacruz/inventree-zebra-plugin.html index c286fb00..5ef7f328 100644 --- a/SergeoLacruz/inventree-zebra-plugin.html +++ b/SergeoLacruz/inventree-zebra-plugin.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"SergeoLacruz"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Zebra Label Printer Plugin for Inventree","headline":"Inventree Zebra Plugin","mainEntityOfPage":{"@type":"WebPage","@id":"/SergeoLacruz/inventree-zebra-plugin"},"url":"/SergeoLacruz/inventree-zebra-plugin"} @@ -69,7 +69,7 @@

 SergeoLacruz

-last modified: 19 Sep 2025 +last modified: 02 Nov 2025
diff --git a/afkiwers/inventree-kicad.html b/afkiwers/inventree-kicad.html index e265abc0..a466c214 100644 --- a/afkiwers/inventree-kicad.html +++ b/afkiwers/inventree-kicad.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"afkiwers"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"KiCad Integration for InvenTree","headline":"Inventree Kicad","mainEntityOfPage":{"@type":"WebPage","@id":"/afkiwers/inventree-kicad"},"url":"/afkiwers/inventree-kicad"} @@ -69,7 +69,7 @@

 afkiwers

-last modified: 19 Sep 2025 +last modified: 02 Nov 2025
diff --git a/afwkiers.html b/afwkiers.html index 5367a742..50a972ae 100644 --- a/afwkiers.html +++ b/afwkiers.html @@ -30,11 +30,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"InvenTree is an open-source inventory management system which provides intuitive parts management and stock control. It is at the center of an ecosystem of addins for EDA tools, API wrapper, deeply integrated plugins and 3rd party tools.","headline":"Afwkiers","mainEntityOfPage":{"@type":"WebPage","@id":"/afwkiers"},"url":"/afwkiers"} diff --git a/assets/index.css b/assets/index.css index 18b4aaa6..f4efc540 100644 --- a/assets/index.css +++ b/assets/index.css @@ -1 +1 @@ -*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:470px){.container{max-width:470px}}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}article{color:var(--tw-prose-body);max-width:65ch}article :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}article :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}article :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}article :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}article :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}article :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}article :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}article :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}article :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}article :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}article :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}article :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}article :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}article :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}article :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}article :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}article :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}article :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}article :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-bottom:3em;margin-top:3em}article :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-inline-start-color:var(--tw-prose-quote-borders);border-inline-start-width:.25rem;color:var(--tw-prose-quotes);font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em;quotes:"\201C""\201D""\2018""\2019"}article :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}article :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}article :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:2.25em;font-weight:800;line-height:1.1111111;margin-bottom:.8888889em}article :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}article :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5em;font-weight:700;line-height:1.3333333;margin-bottom:1em;margin-top:2em}article :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}article :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25em;font-weight:600;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}article :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}article :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;line-height:1.5;margin-bottom:.5em;margin-top:1.5em}article :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}article :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-bottom:2em;margin-top:2em}article :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows)/10%),0 3px 0 rgb(var(--tw-prose-kbd-shadows)/10%);color:var(--tw-prose-kbd);font-family:inherit;font-size:.875em;font-weight:500;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}article :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}article :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}article :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}article :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}article :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}article :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}article :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;width:100%}article :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}article :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;vertical-align:bottom}article :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}article :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}article :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}article :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-color:var(--tw-prose-th-borders);border-top-width:1px}article :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}article :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}article :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}article{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:17 24 39;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}article :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}article :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}article :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}article :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}article :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}article :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}article :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}article :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}article :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}article :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}article :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}article :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}article :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}article{font-size:.875rem;line-height:1.7142857}article :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em}article :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-bottom:.8888889em;margin-top:.8888889em}article :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.1111111em}article :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.1428571em;line-height:1.2;margin-bottom:.8em;margin-top:0}article :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.4285714em;line-height:1.4;margin-bottom:.8em;margin-top:1.6em}article :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.5555556em}article :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.4285714;margin-bottom:.5714286em;margin-top:1.4285714em}article :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}article :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}article :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}article :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.8571429em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-top:.1428571em;padding-inline-start:.3571429em}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em}article :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}article :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}article :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.25rem;font-size:.8571429em;line-height:1.6666667;margin-bottom:1.6666667em;margin-top:1.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-top:.6666667em;padding-inline-start:1em}article :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em;padding-inline-start:1.5714286em}article :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em;padding-inline-start:1.5714286em}article :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.2857143em;margin-top:.2857143em}article :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}article :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}article :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5714286em;margin-top:.5714286em}article :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}article :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}article :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}article :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}article :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5714286em;margin-top:.5714286em}article :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em}article :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}article :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}article :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2.8571429em;margin-top:2.8571429em}article :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.5}article :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}article :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-top:.6666667em;padding-inline-start:1em}article :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}article :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}article :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}article{margin:1.25rem}@media (min-width:640px){article{color:var(--tw-prose-body);max-width:65ch}article :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}article :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}article :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}article :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}article :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}article :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}article :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}article :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}article :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}article :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}article :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}article :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}article :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}article :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}article :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}article :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}article :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}article :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}article :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-bottom:3em;margin-top:3em}article :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-inline-start-color:var(--tw-prose-quote-borders);border-inline-start-width:.25rem;color:var(--tw-prose-quotes);font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em;quotes:"\201C""\201D""\2018""\2019"}article :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}article :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}article :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:2.25em;font-weight:800;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}article :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}article :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5em;font-weight:700;line-height:1.3333333;margin-bottom:1em;margin-top:2em}article :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}article :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25em;font-weight:600;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}article :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}article :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;line-height:1.5;margin-bottom:.5em;margin-top:1.5em}article :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}article :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-bottom:2em;margin-top:2em}article :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows)/10%),0 3px 0 rgb(var(--tw-prose-kbd-shadows)/10%);color:var(--tw-prose-kbd);font-family:inherit;font-size:.875em;font-weight:500;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}article :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}article :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}article :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}article :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}article :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}article :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}article :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;width:100%}article :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}article :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;vertical-align:bottom}article :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}article :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}article :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}article :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-color:var(--tw-prose-th-borders);border-top-width:1px}article :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}article :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}article :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}article{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:17 24 39;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}article :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}article :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}article :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}article :where(.sm\:prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}article :where(.sm\:prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}article :where(.sm\:prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}article :where(.sm\:prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}article :where(.sm\:prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}article :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}article :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}article :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}article :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}article :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(.sm\:prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(.sm\:prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}}@media (min-width:1024px){article{font-size:1.125rem;line-height:1.7777778}article :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}article :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2222222em;line-height:1.4545455;margin-bottom:1.0909091em;margin-top:1.0909091em}article :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6666667em;margin-top:1.6666667em;padding-inline-start:1em}article :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.6666667em;line-height:1;margin-bottom:.8333333em;margin-top:0}article :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.6666667em;line-height:1.3333333;margin-bottom:1.0666667em;margin-top:1.8666667em}article :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.3333333em;line-height:1.5;margin-bottom:.6666667em;margin-top:1.6666667em}article :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.7777778em}article :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}article :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}article :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}article :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.8888889em;padding-inline-end:.4444444em;padding-bottom:.2222222em;padding-top:.2222222em;padding-inline-start:.4444444em}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}article :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8666667em}article :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}article :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.375rem;font-size:.8888889em;line-height:1.75;margin-bottom:2em;margin-top:2em;padding-inline-end:1.5em;padding-bottom:1em;padding-top:1em;padding-inline-start:1.5em}article :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}article :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}article :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.6666667em;margin-top:.6666667em}article :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}article :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}article :where(.lg\:prose-lg>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}article :where(.lg\:prose-lg>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}article :where(.lg\:prose-lg>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}article :where(.lg\:prose-lg>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}article :where(.lg\:prose-lg>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}article :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}article :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}article :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}article :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;padding-inline-start:1.5555556em}article :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:3.1111111em;margin-top:3.1111111em}article :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5}article :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}article :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-top:.75em;padding-inline-start:.75em}article :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}article :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5;margin-top:1em}article :where(.lg\:prose-lg>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(.lg\:prose-lg>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}}@media (min-width:1280px){article{font-size:1.25rem;line-height:1.8}article :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em}article :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2em;line-height:1.5;margin-bottom:1em;margin-top:1em}article :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1.0666667em}article :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.8em;line-height:1;margin-bottom:.8571429em;margin-top:0}article :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.8em;line-height:1.1111111;margin-bottom:.8888889em;margin-top:1.5555556em}article :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.5em;line-height:1.3333333;margin-bottom:.6666667em;margin-top:1.6em}article :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.6;margin-bottom:.6em;margin-top:1.8em}article :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.9em;padding-inline-end:.4em;padding-bottom:.25em;padding-top:.25em;padding-inline-start:.4em}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}article :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8611111em}article :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}article :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.5rem;font-size:.9em;line-height:1.7777778;margin-bottom:2em;margin-top:2em;padding-inline-end:1.3333333em;padding-bottom:1.1111111em;padding-top:1.1111111em;padding-inline-start:1.3333333em}article :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em;padding-inline-start:1.6em}article :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em;padding-inline-start:1.6em}article :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.6em;margin-top:.6em}article :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4em}article :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4em}article :where(.xl\:prose-xl>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8em;margin-top:.8em}article :where(.xl\:prose-xl>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}article :where(.xl\:prose-xl>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em}article :where(.xl\:prose-xl>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}article :where(.xl\:prose-xl>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em}article :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8em;margin-top:.8em}article :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em}article :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}article :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6em;padding-inline-start:1.6em}article :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2.8em;margin-top:2.8em}article :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;line-height:1.5555556}article :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.6666667em;padding-bottom:.8888889em;padding-inline-start:.6666667em}article :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.6666667em;padding-bottom:.8888889em;padding-top:.8888889em;padding-inline-start:.6666667em}article :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;line-height:1.5555556;margin-top:1em}article :where(.xl\:prose-xl>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(.xl\:prose-xl>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}}@media (min-width:640px){article{margin-left:auto;margin-right:auto}}.section-container{width:100%}@media (min-width:470px){.section-container{max-width:470px}}@media (min-width:640px){.section-container{max-width:640px}}@media (min-width:768px){.section-container{max-width:768px}}@media (min-width:1024px){.section-container{max-width:1024px}}@media (min-width:1280px){.section-container{max-width:1280px}}@media (min-width:1536px){.section-container{max-width:1536px}}.section-container{margin-left:auto;margin-right:auto;padding:6rem 1.25rem}.header-text{font-size:1.5rem;font-weight:500;line-height:2rem}@media (min-width:640px){.header-text{font-size:1.875rem;line-height:2.25rem}}.footer-link{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.footer-link:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.footer-categorie{font-size:.875rem;font-weight:500;letter-spacing:.1em;line-height:1.25rem;margin-bottom:.75rem;--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.cm-hvr-btn{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.cm-hvr-btn:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.cm-hvr-btn-primary{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(221 188 145/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.cm-hvr-btn-primary:hover{--tw-bg-opacity:1;background-color:rgb(144 168 216/var(--tw-bg-opacity,1))}.cm-gray-1{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.cm-gray-2{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.cm-gray-3{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}a.anchor{display:block;position:relative;top:-72px;visibility:hidden}.content a{color:#111827;font-weight:500;text-decoration:underline}.color-link{--tw-text-opacity:1;color:rgb(221 188 145/var(--tw-text-opacity,1))}.badge{border-radius:9999px;padding:.25rem .625rem}.list-unstyled,.list-unstyled li{list-style-type:none;padding-left:0;position:static}.plugin_cat{background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.plugin_cat,.plugin_tag{border-radius:9999px;padding:.25rem .625rem;white-space:nowrap;--tw-bg-opacity:1}.plugin_tag{background-color:rgb(96 165 250/var(--tw-bg-opacity,1))}.max-w-p90{max-width:90%}img+em{display:block;text-align:center}.plugin_links{font-style:italic;margin-bottom:0}.success{color:#155724}.anchor{display:block;position:relative;top:-4.5rem}.anchor,.invisible{visibility:hidden}.static{position:static}.absolute{position:absolute}.sticky{position:sticky}.top-0{top:0}.z-50{z-index:50}.-m-4{margin:-1rem}.m-5{margin:1.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0{margin-top:0}.mb-0,.my-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-16{margin-bottom:4rem}.mb-2{margin-bottom:.5rem}.mb-20{margin-bottom:5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.contents{display:contents}.hidden{display:none}.h-1{height:.25rem}.h-12{height:3rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-12{width:3rem}.w-20{width:5rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-5\/6{width:83.333333%}.w-6{width:1.5rem}.w-64{width:16rem}.w-full{width:100%}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.list-none{list-style-type:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-center{justify-content:center}.self-center{align-self:center}.overflow-hidden,.truncate{overflow:hidden}.truncate{text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-b{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.border{border-width:1px}.border-0{border-width:0}.border-t-4{border-top-width:4px}.border-teal-500{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity,1))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-lime-600{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity,1))}.bg-secondary{--tw-bg-opacity:1;background-color:rgb(221 188 145/var(--tw-bg-opacity,1))}.bg-teal-100{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity,1))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-primary{--tw-gradient-from:#90a8d8 var(--tw-gradient-from-position);--tw-gradient-to:rgba(144,168,216,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-white{--tw-gradient-from:#fff var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-secondary{--tw-gradient-to:#ddbc91 var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.fill-current{fill:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.object-center{-o-object-position:center;object-position:center}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-24{padding-bottom:6rem;padding-top:6rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.pb-1{padding-bottom:.25rem}.pl-4{padding-left:1rem}.pt-3{padding-top:.75rem}.pt-8{padding-top:2rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.italic{font-style:italic}.leading-loose{line-height:2}.leading-relaxed{line-height:1.625}.tracking-widest{letter-spacing:.1em}.text-primary{--tw-text-opacity:1;color:rgb(144 168 216/var(--tw-text-opacity,1))}.text-secondary{--tw-text-opacity:1;color:rgb(221 188 145/var(--tw-text-opacity,1))}.text-teal-500{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity,1))}.text-teal-900{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity,1))}.text-transparent{color:transparent}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.no-underline{text-decoration-line:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.hover\:cm-gray-1:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.hover\:bg-primary:hover{--tw-bg-opacity:1;background-color:rgb(144 168 216/var(--tw-bg-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}@media (min-width:470px){.xs\:ml-4{margin-left:1rem}.xs\:flex-none{flex:none}.xs\:border-l{border-left-width:1px}.xs\:border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.xs\:pl-4{padding-left:1rem}}@media (min-width:640px){.sm\:ml-2{margin-left:.5rem}.sm\:ml-auto{margin-left:auto}.sm\:mt-0{margin-top:0}.sm\:hidden{display:none}.sm\:w-1\/4{width:25%}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:pl-8{padding-left:2rem}.sm\:pr-16{padding-right:4rem}.sm\:text-left{text-align:left}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:768px){.md\:mx-0{margin-left:0;margin-right:0}.md\:mb-0{margin-bottom:0}.md\:mr-4{margin-right:1rem}.md\:mr-auto{margin-right:auto}.md\:mt-0{margin-top:0}.md\:flex{display:flex}.md\:w-1\/2{width:50%}.md\:w-1\/4{width:25%}.md\:w-auto{width:auto}.md\:w-full{width:100%}.md\:flex-row{flex-direction:row}.md\:flex-nowrap{flex-wrap:nowrap}.md\:items-start{align-items:flex-start}.md\:justify-start{justify-content:flex-start}.md\:py-1{padding-bottom:.25rem;padding-top:.25rem}.md\:pl-10{padding-left:2.5rem}.md\:pr-16{padding-right:4rem}.md\:text-left{text-align:left}}@media (min-width:1024px){.lg\:mb-0{margin-bottom:0}.lg\:inline-block{display:inline-block}.lg\:w-1\/2{width:50%}.lg\:w-2\/3{width:66.666667%}.lg\:w-full{width:100%}.lg\:max-w-lg{max-width:32rem}.lg\:flex-grow{flex-grow:1}.lg\:pr-24{padding-right:6rem}}@media (min-width:1280px){.xl\:w-1\/3{width:33.333333%}.xl\:w-1\/4{width:25%}} \ No newline at end of file +*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:470px){.container{max-width:470px}}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}article{color:var(--tw-prose-body);max-width:65ch}article :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}article :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}article :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}article :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}article :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}article :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}article :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}article :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}article :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}article :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}article :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}article :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}article :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}article :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}article :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}article :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}article :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}article :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}article :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-bottom:3em;margin-top:3em}article :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-inline-start-color:var(--tw-prose-quote-borders);border-inline-start-width:.25rem;color:var(--tw-prose-quotes);font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em;quotes:"\201C""\201D""\2018""\2019"}article :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}article :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}article :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:2.25em;font-weight:800;line-height:1.1111111;margin-bottom:.8888889em}article :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}article :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5em;font-weight:700;line-height:1.3333333;margin-bottom:1em;margin-top:2em}article :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}article :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25em;font-weight:600;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}article :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}article :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;line-height:1.5;margin-bottom:.5em;margin-top:1.5em}article :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}article :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-bottom:2em;margin-top:2em}article :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);color:var(--tw-prose-kbd);font-family:inherit;font-size:.875em;font-weight:500;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}article :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}article :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}article :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}article :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}article :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}article :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}article :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;width:100%}article :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}article :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;vertical-align:bottom}article :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}article :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}article :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}article :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-color:var(--tw-prose-th-borders);border-top-width:1px}article :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}article :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}article :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}article{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}article :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}article :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}article :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}article :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}article :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}article :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}article :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}article :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}article :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}article :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}article :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}article :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}article :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}article{font-size:.875rem;line-height:1.7142857}article :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em}article :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-bottom:.8888889em;margin-top:.8888889em}article :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.1111111em}article :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.1428571em;line-height:1.2;margin-bottom:.8em;margin-top:0}article :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.4285714em;line-height:1.4;margin-bottom:.8em;margin-top:1.6em}article :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.5555556em}article :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.4285714;margin-bottom:.5714286em;margin-top:1.4285714em}article :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}article :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}article :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}article :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.8571429em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-top:.1428571em;padding-inline-start:.3571429em}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em}article :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}article :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}article :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.25rem;font-size:.8571429em;line-height:1.6666667;margin-bottom:1.6666667em;margin-top:1.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-top:.6666667em;padding-inline-start:1em}article :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em;padding-inline-start:1.5714286em}article :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em;padding-inline-start:1.5714286em}article :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.2857143em;margin-top:.2857143em}article :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}article :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}article :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5714286em;margin-top:.5714286em}article :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}article :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}article :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}article :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}article :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5714286em;margin-top:.5714286em}article :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em}article :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}article :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}article :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2.8571429em;margin-top:2.8571429em}article :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.5}article :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}article :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-top:.6666667em;padding-inline-start:1em}article :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}article :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}article :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}article{margin:1.25rem}@media (min-width:640px){article{color:var(--tw-prose-body);max-width:65ch}article :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}article :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}article :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}article :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}article :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}article :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}article :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}article :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}article :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}article :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}article :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}article :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}article :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}article :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}article :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}article :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}article :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}article :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}article :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-bottom:3em;margin-top:3em}article :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-inline-start-color:var(--tw-prose-quote-borders);border-inline-start-width:.25rem;color:var(--tw-prose-quotes);font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em;quotes:"\201C""\201D""\2018""\2019"}article :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}article :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}article :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:2.25em;font-weight:800;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}article :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}article :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5em;font-weight:700;line-height:1.3333333;margin-bottom:1em;margin-top:2em}article :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}article :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25em;font-weight:600;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}article :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}article :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;line-height:1.5;margin-bottom:.5em;margin-top:1.5em}article :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}article :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-bottom:2em;margin-top:2em}article :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);color:var(--tw-prose-kbd);font-family:inherit;font-size:.875em;font-weight:500;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}article :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}article :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}article :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}article :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}article :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}article :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}article :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}article :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;width:100%}article :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}article :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;vertical-align:bottom}article :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}article :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}article :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}article :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-color:var(--tw-prose-th-borders);border-top-width:1px}article :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}article :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}article :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}article{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}article :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}article :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}article :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}article :where(.sm\:prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}article :where(.sm\:prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}article :where(.sm\:prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}article :where(.sm\:prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}article :where(.sm\:prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}article :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}article :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}article :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}article :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}article :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(.sm\:prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(.sm\:prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}}@media (min-width:1024px){article{font-size:1.125rem;line-height:1.7777778}article :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}article :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2222222em;line-height:1.4545455;margin-bottom:1.0909091em;margin-top:1.0909091em}article :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6666667em;margin-top:1.6666667em;padding-inline-start:1em}article :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.6666667em;line-height:1;margin-bottom:.8333333em;margin-top:0}article :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.6666667em;line-height:1.3333333;margin-bottom:1.0666667em;margin-top:1.8666667em}article :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.3333333em;line-height:1.5;margin-bottom:.6666667em;margin-top:1.6666667em}article :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.7777778em}article :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}article :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}article :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}article :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.8888889em;padding-inline-end:.4444444em;padding-bottom:.2222222em;padding-top:.2222222em;padding-inline-start:.4444444em}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}article :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8666667em}article :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}article :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.375rem;font-size:.8888889em;line-height:1.75;margin-bottom:2em;margin-top:2em;padding-inline-end:1.5em;padding-bottom:1em;padding-top:1em;padding-inline-start:1.5em}article :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}article :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}article :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.6666667em;margin-top:.6666667em}article :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}article :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}article :where(.lg\:prose-lg>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}article :where(.lg\:prose-lg>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}article :where(.lg\:prose-lg>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}article :where(.lg\:prose-lg>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}article :where(.lg\:prose-lg>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}article :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}article :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}article :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}article :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;padding-inline-start:1.5555556em}article :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:3.1111111em;margin-top:3.1111111em}article :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5}article :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}article :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-top:.75em;padding-inline-start:.75em}article :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}article :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5;margin-top:1em}article :where(.lg\:prose-lg>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(.lg\:prose-lg>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}}@media (min-width:1280px){article{font-size:1.25rem;line-height:1.8}article :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em}article :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2em;line-height:1.5;margin-bottom:1em;margin-top:1em}article :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1.0666667em}article :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.8em;line-height:1;margin-bottom:.8571429em;margin-top:0}article :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.8em;line-height:1.1111111;margin-bottom:.8888889em;margin-top:1.5555556em}article :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.5em;line-height:1.3333333;margin-bottom:.6666667em;margin-top:1.6em}article :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.6;margin-bottom:.6em;margin-top:1.8em}article :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.9em;padding-inline-end:.4em;padding-bottom:.25em;padding-top:.25em;padding-inline-start:.4em}article :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}article :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8611111em}article :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}article :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.5rem;font-size:.9em;line-height:1.7777778;margin-bottom:2em;margin-top:2em;padding-inline-end:1.3333333em;padding-bottom:1.1111111em;padding-top:1.1111111em;padding-inline-start:1.3333333em}article :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em;padding-inline-start:1.6em}article :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em;padding-inline-start:1.6em}article :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.6em;margin-top:.6em}article :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4em}article :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4em}article :where(.xl\:prose-xl>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8em;margin-top:.8em}article :where(.xl\:prose-xl>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}article :where(.xl\:prose-xl>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em}article :where(.xl\:prose-xl>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}article :where(.xl\:prose-xl>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em}article :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8em;margin-top:.8em}article :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.2em;margin-top:1.2em}article :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.2em}article :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6em;padding-inline-start:1.6em}article :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2.8em;margin-top:2.8em}article :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;line-height:1.5555556}article :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.6666667em;padding-bottom:.8888889em;padding-inline-start:.6666667em}article :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.6666667em;padding-bottom:.8888889em;padding-top:.8888889em;padding-inline-start:.6666667em}article :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}article :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}article :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}article :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}article :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em;line-height:1.5555556;margin-top:1em}article :where(.xl\:prose-xl>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}article :where(.xl\:prose-xl>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}}@media (min-width:640px){article{margin-left:auto;margin-right:auto}}.section-container{width:100%}@media (min-width:470px){.section-container{max-width:470px}}@media (min-width:640px){.section-container{max-width:640px}}@media (min-width:768px){.section-container{max-width:768px}}@media (min-width:1024px){.section-container{max-width:1024px}}@media (min-width:1280px){.section-container{max-width:1280px}}@media (min-width:1536px){.section-container{max-width:1536px}}.section-container{margin-left:auto;margin-right:auto;padding:6rem 1.25rem}.header-text{font-size:1.5rem;font-weight:500;line-height:2rem}@media (min-width:640px){.header-text{font-size:1.875rem;line-height:2.25rem}}.footer-link{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.footer-link:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.footer-categorie{font-size:.875rem;font-weight:500;letter-spacing:.1em;line-height:1.25rem;margin-bottom:.75rem;--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.cm-hvr-btn{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.cm-hvr-btn:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.cm-hvr-btn-primary{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(221 188 145/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.cm-hvr-btn-primary:hover{--tw-bg-opacity:1;background-color:rgb(144 168 216/var(--tw-bg-opacity,1))}.cm-gray-1{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.cm-gray-2{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.cm-gray-3{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}a.anchor{display:block;position:relative;top:-72px;visibility:hidden}.content a{color:#111827;font-weight:500;text-decoration:underline}.color-link{--tw-text-opacity:1;color:rgb(221 188 145/var(--tw-text-opacity,1))}.badge{border-radius:9999px;padding:.25rem .625rem}.list-unstyled,.list-unstyled li{list-style-type:none;padding-left:0;position:static}.plugin_cat{background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.plugin_cat,.plugin_tag{border-radius:9999px;padding:.25rem .625rem;white-space:nowrap;--tw-bg-opacity:1}.plugin_tag{background-color:rgb(96 165 250/var(--tw-bg-opacity,1))}.max-w-p90{max-width:90%}img+em{display:block;text-align:center}.plugin_links{font-style:italic;margin-bottom:0}.success{color:#155724}.anchor{display:block;position:relative;top:-4.5rem}.anchor,.invisible{visibility:hidden}.static{position:static}.absolute{position:absolute}.sticky{position:sticky}.top-0{top:0}.z-50{z-index:50}.-m-4{margin:-1rem}.m-5{margin:1.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0{margin-top:0}.mb-0,.my-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-16{margin-bottom:4rem}.mb-2{margin-bottom:.5rem}.mb-20{margin-bottom:5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.contents{display:contents}.hidden{display:none}.h-1{height:.25rem}.h-12{height:3rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-12{width:3rem}.w-20{width:5rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-5\/6{width:83.333333%}.w-6{width:1.5rem}.w-64{width:16rem}.w-full{width:100%}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.list-none{list-style-type:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-center{justify-content:center}.self-center{align-self:center}.overflow-hidden,.truncate{overflow:hidden}.truncate{text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-b{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.border{border-width:1px}.border-0{border-width:0}.border-t-4{border-top-width:4px}.border-teal-500{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity,1))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-lime-600{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity,1))}.bg-secondary{--tw-bg-opacity:1;background-color:rgb(221 188 145/var(--tw-bg-opacity,1))}.bg-teal-100{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity,1))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-primary{--tw-gradient-from:#90a8d8 var(--tw-gradient-from-position);--tw-gradient-to:rgba(144,168,216,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-white{--tw-gradient-from:#fff var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-secondary{--tw-gradient-to:#ddbc91 var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.fill-current{fill:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.object-center{-o-object-position:center;object-position:center}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-24{padding-bottom:6rem;padding-top:6rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.pb-1{padding-bottom:.25rem}.pl-4{padding-left:1rem}.pt-3{padding-top:.75rem}.pt-8{padding-top:2rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.italic{font-style:italic}.leading-loose{line-height:2}.leading-relaxed{line-height:1.625}.tracking-widest{letter-spacing:.1em}.text-primary{--tw-text-opacity:1;color:rgb(144 168 216/var(--tw-text-opacity,1))}.text-secondary{--tw-text-opacity:1;color:rgb(221 188 145/var(--tw-text-opacity,1))}.text-teal-500{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity,1))}.text-teal-900{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity,1))}.text-transparent{color:transparent}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.no-underline{text-decoration-line:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.hover\:cm-gray-1:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.hover\:bg-primary:hover{--tw-bg-opacity:1;background-color:rgb(144 168 216/var(--tw-bg-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}@media (min-width:470px){.xs\:ml-4{margin-left:1rem}.xs\:flex-none{flex:none}.xs\:border-l{border-left-width:1px}.xs\:border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.xs\:pl-4{padding-left:1rem}}@media (min-width:640px){.sm\:ml-2{margin-left:.5rem}.sm\:ml-auto{margin-left:auto}.sm\:mt-0{margin-top:0}.sm\:hidden{display:none}.sm\:w-1\/4{width:25%}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:pl-8{padding-left:2rem}.sm\:pr-16{padding-right:4rem}.sm\:text-left{text-align:left}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:768px){.md\:mx-0{margin-left:0;margin-right:0}.md\:mb-0{margin-bottom:0}.md\:mr-4{margin-right:1rem}.md\:mr-auto{margin-right:auto}.md\:mt-0{margin-top:0}.md\:flex{display:flex}.md\:w-1\/2{width:50%}.md\:w-1\/4{width:25%}.md\:w-auto{width:auto}.md\:w-full{width:100%}.md\:flex-row{flex-direction:row}.md\:flex-nowrap{flex-wrap:nowrap}.md\:items-start{align-items:flex-start}.md\:justify-start{justify-content:flex-start}.md\:py-1{padding-bottom:.25rem;padding-top:.25rem}.md\:pl-10{padding-left:2.5rem}.md\:pr-16{padding-right:4rem}.md\:text-left{text-align:left}}@media (min-width:1024px){.lg\:mb-0{margin-bottom:0}.lg\:inline-block{display:inline-block}.lg\:w-1\/2{width:50%}.lg\:w-2\/3{width:66.666667%}.lg\:w-full{width:100%}.lg\:max-w-lg{max-width:32rem}.lg\:flex-grow{flex-grow:1}.lg\:pr-24{padding-right:6rem}}@media (min-width:1280px){.xl\:w-1\/3{width:33.333333%}.xl\:w-1\/4{width:25%}} \ No newline at end of file diff --git a/blog.html b/blog.html index 442f80b5..5183a1db 100644 --- a/blog.html +++ b/blog.html @@ -66,6 +66,26 @@ +
+

+ 1.1.0 Release +

+ 1.1.0 Release + 02 Nov 2025 | + +Oliver +
+ +
+

+ Rolling Stocktake Plugin +

+ Rolling Stocktake Plugin + 15 Oct 2025 | + +Oliver +
+

1.0.0 Release diff --git a/blog/2025/10/15/rolling-stocktake.html b/blog/2025/10/15/rolling-stocktake.html new file mode 100644 index 00000000..963df3f1 --- /dev/null +++ b/blog/2025/10/15/rolling-stocktake.html @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + +InvenTree - Rolling Stocktake Plugin + + + +Rolling Stocktake Plugin | InvenTree + + + + + + + + + + + + + + + + + + + +
+
+
+ + logo + InvenTree + + +
+ + + + +
+
+ + + go back + Back + + +
+ +
+

Rolling Stocktake Plugin

+

+ 15 Oct 2025 + + +Oliver +

+

Rolling Stocktake Plugin

+ +

The InvenTree development team has released a new plugin which provides a “Rolling Stocktake” mechanism for InvenTree.

+ +

This plugin encourgaes users to perform regular stocktakes of inventory items in a rolling fashion, ensuring that stock levels are consistently accurate without the need for a complete inventory shutdown.

+ +

By presenting users with a dashboard widget that highlights stock items that are overdue for stocktake, the plugin helps maintain inventory accuracy and reduces the risk of stock discrepancies.

+ +

For more information about the plugin, please refer to the plugin reference or the GitHub page.

+ + +
+
+ +
+
+ + +
+ + + diff --git a/blog/2025/11/02/1.1.0.html b/blog/2025/11/02/1.1.0.html new file mode 100644 index 00000000..fa6ed992 --- /dev/null +++ b/blog/2025/11/02/1.1.0.html @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + +InvenTree - 1.1.0 Release + + + +1.1.0 Release | InvenTree + + + + + + + + + + + + + + + + + + + +
+
+
+ + logo + InvenTree + + +
+ + + + +
+
+ + + go back + Back + + +
+ +
+

1.1.0 Release

+

+ 02 Nov 2025 + + +Oliver +

+

1.1.0 Release

+ +

The InvenTree team is excited to announce the release of version 1.1.0.

+ +

This is the first major update since our 1.0.0 stable release, and includes numerous new features, improvements, and bug fixes to enhance your experience with InvenTree.

+ +

Changelog

+ +

Major changes are documented in the CHANGELOG.md file in the InvenTree repository.

+ +

For a full list of changes made in this release, please refer to the release notes.

+ +

Update Procedure

+ +

To update to the latest version of InvenTree, please follow the updating instructions provided in the InvenTree documentation. Note that the particular update procedure may vary depending on your installation method.

+ +

New Features

+ +

Partial Build Output Complete

+ +

#10499 adds the ability to complete only a partial quantity of a build output. This allows for finer control over the manufacturing process.

+ +

Build Output Adjustments

+ +

#10600 allows users to perform stock adjustment actions (count, transfer, etc) on stock items which are in production, i.e. associated with a build output. This provides greater flexibility in managing stock during the manufacturing process.

+ +

Report Helper Functions

+ +

There have been several additions to the report helper functions, in particular relating to maths and currency operations. Refer to the report documentation for more information on how to use these new functions.

+ +

Supplier Part Attachments

+ +

In #10724 we added support for uploading attachments against supplier parts. This allows users to associate relevant documents (e.g. datasheets, certifications, etc) directly with supplier parts.

+ +

Bug Fixes

+ +

There have been a significant number of bug fixes in this release. Thanks to the many community members who have contributed to identifying and resolving these issues!

+ +

Contributing

+ +

New Contributors

+ +

As always we would like to thank all of our contributors for their hard work and dedication to the InvenTree project. In particular, we would like to welcome the following new contributors who have made their first contributions in this release:

+ + + +

Translation

+ +

Our translation efforts continue to grow, with coverage increasing across a wide range of languages. We are grateful to all of our translators who have contributed to making InvenTree accessible to users around the world.

+ +

If you are interested in contributing to the translation efforts, please visit our Crowdin project and join the community of translators.

+ +

Code Contributions

+ +

Check out our GitHub page for a list of outstanding issues and feature requests. If you are a developer, you can help to contribute to the project by submitting a pull request.

+ +

In particular, we are looking for assistance with frontend development, as we work to complete the new user interface and improve the overall UI/UX of the project.

+ +

Report Bugs

+ +

If you encounter a bug in InvenTree, please report it on our GitHub issues page. Please ensure that you provide as much information as possible to help us diagnose and fix the issue.

+ +

Documentation / Technical Writing

+ +

If you have experience with technical writing, you can help to improve the InvenTree documentation. We are always looking for help to improve the documentation and make it more accessible to new users.

+ +

Financial Support

+ +

Sponsorships help to keep this project sustainable, and buys time for the core developers to commit to the project. A recurring or one off sponsorship is a great way to help InvenTree development to continue at full steam!

+ +

The work undertaken to keep InvenTree running is done by a very small group of core developers, who do so in their spare time (and are not sponsored by their employers to work on InvenTree). If you benefit from the InvenTree project, please consider contributing to maintain vibrant development of this software!

+ + + +

If you are using InvenTree in a commercial setting, please consider sponsoring the project to help support ongoing development and maintenance. Your support is greatly appreciated and helps to ensure that InvenTree remains a viable and sustainable project for years to come.

+ +

If your company benefits from InvenTree, please consider a one time sponsorship or a recurring sponsorship to help support the project.

+ + + +
+
+ +
+
+ + +
+ + + diff --git a/blog/feed.atom b/blog/feed.atom index 71d85250..e427c843 100644 --- a/blog/feed.atom +++ b/blog/feed.atom @@ -1,4 +1,99 @@ -Jekyll2025-09-19T01:13:41+00:00/blog/feed.atomInvenTreeInvenTree is an open-source inventory management system which provides intuitive parts management and stock control. It is at the center of an ecosystem of addins for EDA tools, API wrapper, deeply integrated plugins and 3rd party tools.1.0.0 Release2025-09-15T00:00:00+00:002025-09-15T00:00:00+00:00/blog/2025/09/15/1.0.01.0.0 Release

+Jekyll2025-11-02T21:31:39+00:00/blog/feed.atomInvenTreeInvenTree is an open-source inventory management system which provides intuitive parts management and stock control. It is at the center of an ecosystem of addins for EDA tools, API wrapper, deeply integrated plugins and 3rd party tools.1.1.0 Release2025-11-02T00:00:00+00:002025-11-02T00:00:00+00:00/blog/2025/11/02/1.1.01.1.0 Release + +

The InvenTree team is excited to announce the release of version 1.1.0.

+ +

This is the first major update since our 1.0.0 stable release, and includes numerous new features, improvements, and bug fixes to enhance your experience with InvenTree.

+ +

Changelog

+ +

Major changes are documented in the CHANGELOG.md file in the InvenTree repository.

+ +

For a full list of changes made in this release, please refer to the release notes.

+ +

Update Procedure

+ +

To update to the latest version of InvenTree, please follow the updating instructions provided in the InvenTree documentation. Note that the particular update procedure may vary depending on your installation method.

+ +

New Features

+ +

Partial Build Output Complete

+ +

#10499 adds the ability to complete only a partial quantity of a build output. This allows for finer control over the manufacturing process.

+ +

Build Output Adjustments

+ +

#10600 allows users to perform stock adjustment actions (count, transfer, etc) on stock items which are in production, i.e. associated with a build output. This provides greater flexibility in managing stock during the manufacturing process.

+ +

Report Helper Functions

+ +

There have been several additions to the report helper functions, in particular relating to maths and currency operations. Refer to the report documentation for more information on how to use these new functions.

+ +

Supplier Part Attachments

+ +

In #10724 we added support for uploading attachments against supplier parts. This allows users to associate relevant documents (e.g. datasheets, certifications, etc) directly with supplier parts.

+ +

Bug Fixes

+ +

There have been a significant number of bug fixes in this release. Thanks to the many community members who have contributed to identifying and resolving these issues!

+ +

Contributing

+ +

New Contributors

+ +

As always we would like to thank all of our contributors for their hard work and dedication to the InvenTree project. In particular, we would like to welcome the following new contributors who have made their first contributions in this release:

+ +
    +
  • @BbqGamer made their first contribution in #10426
  • +
  • @hhhapz made their first contribution in #10485
  • +
  • @wolfpackmars2 made their first contribution in #10481
  • +
  • @neilbeukes made their first contribution in #10497
  • +
  • @austenwho made their first contribution in #10551
  • +
  • @KaranLala made their first contribution in #10549
  • +
  • @akhilsingh-git made their first contribution in #10722
  • +
+ +

Translation

+ +

Our translation efforts continue to grow, with coverage increasing across a wide range of languages. We are grateful to all of our translators who have contributed to making InvenTree accessible to users around the world.

+ +

If you are interested in contributing to the translation efforts, please visit our Crowdin project and join the community of translators.

+ +

Code Contributions

+ +

Check out our GitHub page for a list of outstanding issues and feature requests. If you are a developer, you can help to contribute to the project by submitting a pull request.

+ +

In particular, we are looking for assistance with frontend development, as we work to complete the new user interface and improve the overall UI/UX of the project.

+ +

Report Bugs

+ +

If you encounter a bug in InvenTree, please report it on our GitHub issues page. Please ensure that you provide as much information as possible to help us diagnose and fix the issue.

+ +

Documentation / Technical Writing

+ +

If you have experience with technical writing, you can help to improve the InvenTree documentation. We are always looking for help to improve the documentation and make it more accessible to new users.

+ +

Financial Support

+ +

Sponsorships help to keep this project sustainable, and buys time for the core developers to commit to the project. A recurring or one off sponsorship is a great way to help InvenTree development to continue at full steam!

+ +

The work undertaken to keep InvenTree running is done by a very small group of core developers, who do so in their spare time (and are not sponsored by their employers to work on InvenTree). If you benefit from the InvenTree project, please consider contributing to maintain vibrant development of this software!

+ + + +

If you are using InvenTree in a commercial setting, please consider sponsoring the project to help support ongoing development and maintenance. Your support is greatly appreciated and helps to ensure that InvenTree remains a viable and sustainable project for years to come.

+ +

If your company benefits from InvenTree, please consider a one time sponsorship or a recurring sponsorship to help support the project.

]]>
SchrodingersGat
Rolling Stocktake Plugin2025-10-15T00:00:00+00:002025-10-15T00:00:00+00:00/blog/2025/10/15/rolling-stocktakeRolling Stocktake Plugin + +

The InvenTree development team has released a new plugin which provides a “Rolling Stocktake” mechanism for InvenTree.

+ +

This plugin encourgaes users to perform regular stocktakes of inventory items in a rolling fashion, ensuring that stock levels are consistently accurate without the need for a complete inventory shutdown.

+ +

By presenting users with a dashboard widget that highlights stock items that are overdue for stocktake, the plugin helps maintain inventory accuracy and reduces the risk of stock discrepancies.

+ +

For more information about the plugin, please refer to the plugin reference or the GitHub page.

]]>
SchrodingersGat
1.0.0 Release2025-09-15T00:00:00+00:002025-09-15T00:00:00+00:00/blog/2025/09/15/1.0.01.0.0 Release

The 1.0.0 release marks a major milestone for the InvenTree project. Not only does it represent an important step in the evolution of the software, but it also introduces a host of new features and improvements that enhance the user experience.

@@ -561,169 +656,4 @@ Therefore 1.0 will be PUI only. The compiled javascript, CSS and html files will

Switching to 1.0 will also mean that we will follow SemVer fully. Big breaking changes will only be in major releases, feature releases (1.0, 1.1, 1.2) will follow the SemVer rules. This will make it easier for some of our enterprise users who face backlash or difficulty because of the below 1.0 version number.

-

We are discussing a few more breaking changes in 1.0 - feel free to chime in on the dedicated issue #6417.

]]>
matmair
0.16.0 Stable Release2024-08-25T00:00:00+00:002024-08-25T00:00:00+00:00/blog/2024/08/25/0.16.0The InvenTree development team is pleased to announce the release of InvenTree stable version 0.16.0. This release once again includes a wide range of new features, bug fixes, and improvements. We have closed out over 250 pull requests against this release target!

- -

Release Notes

- -

For a full list of changes made in this release, please see the release notes on GitHub.

- -

Breaking Changes

- -

This release includes a number of changes which adjust existing APIs and may require updates to custom code or scripts.

- -

View a full list of breaking changes on our GitHub page.

- -

Report Printing Refactor

- -

In PR #7074, the report printing system has received a major refactor. This change has been a long time coming, and we are excited to see it finally merged into the main branch.

- -

Previously, each report template type was stored in a separate database table. All reports have now been consolidated into a single table, which simplifies the codebase and makes it easier to manage report templates.

- -

A similar single table has been implemented for label templates.

- -

Additionally, the report template live editor has received some improvements, making it easier to create and edit report templates directly within the InvenTree interface.

- -

This change has removed a number of existing API endpoints, as all report functionality is consolidated to a smaller set of API commands. Refer to the InvenTree API documentation for more information.

- -

Attachment Refactor

- -

In PR #7420, all attachment tables have been consolidated into a single table. This code change results in a large number of redundant API endpoints being removed, and simplifies the codebase. As all attachments are now stored in a single table, any custom plugins which interact with attachments will need to be updated to reflect this change.

- -

Plugin Static File Management

- -

We have changed the way that static files for plugins are handled. Previously only plugins which used the “app mixin” system could include static files. Now, all plugins can include static files, which are automatically loaded by the InvenTree system.

- -

Refer to PR #7763 for more information.

- -

Plugin API Lookup

- -

In PR #7224 the plugin API was changed to use the “slug” of the plugin as the primary lookup, rather than the unique ID in the database. This change simplifies the plugin API and makes it easier to manage plugins, allowing consistent access to plugin data.

- -

Security Patches

- -

A number of critical security updates have been made. For a full list, refer to the GitHub project page.

- -

Dependency Updates

- -

We have updated a number of dependencies to address security vulnerabilities. These updates are part of our ongoing commitment to security and privacy. While there have been a significant number of dependency updates in this release cycle, below is a list of PRs which address security vulnerabilities:

- -
    -
  • https://github.com/inventree/InvenTree/pull/7839
  • -
  • https://github.com/inventree/InvenTree/pull/7827
  • -
  • https://github.com/inventree/InvenTree/pull/7620
  • -
  • https://github.com/inventree/InvenTree/pull/7430
  • -
- -

2FA Login Fix

- -

2FA authentication for the new React frontend has been fixed in PR #7469.

- -

Frontend SBOMs

- -

PR #7784 generates SBOMs for the frontend, providing detailed information on the dependencies used in the frontend codebase.

- -

New Features

- -

This has been a significant release cycle for new features, with a number of exciting additions to the InvenTree codebase. There are so many new updates here that we can’t list them all, some of the highlights include:

- -

User Interface Improvements

- -

Major improvements have been made to the new React frontend, with a number of new features and enhancements. The new frontend is now the primary focus of development, and we are working to migrate all frontend code to React. From this point onwards, major bug fixes and security patches will still be applied to the old frontend, but new features will only be added to the React frontend.

- -

Data Import / Export

- -

We have been working on an entire rewrite of the data import and export system. This new system is more robust and flexible, and allows for more complex data import and export operations. This system is now live in the new React frontend, and we are excited to see it in action.

- -

Future work will focus on bringing all import/export functionality across to the new system, and removing the old import/export system entirely.

- -

Validation Plugin Enhancements

- -

The validation plugin system has been significantly enhanced to provide greater flexibility for custom validation options.

- -

API Documentation

- -

The API documentation has been enhanced, and is now built automatically from the InvenTree codebase and included in the InvenTree documentation.

- -

Bug Fixes

- -

Our commitment to bug fixes continues, with a number of issues resolved in this release cycle. For a full list of bug fixes, refer to the GitHub project page.

- -

Many of these bugs have been identified and fixed by our community of users, and we are grateful for their ongoing support! If you identify a bug in InvenTree, please report it to us on our GitHub issues page.

- -

Translation Support

- -

Our support for multiple languages continues to grow, and we are grateful to the many contributors who have helped us add new languages to InvenTree. To contribute to the translation effort, please refer our Crowdin page.

- -

New Contributors

- -

Once again, we are excited to welcome a number of new contributors to the InvenTree project. We are grateful for the time and effort that these contributors have put into the project, and we look forward to working with them in the future.

- - - -

We welcome any new contributors to the project, and we are always looking for new people to help us improve InvenTree. If you are interested in contributing to the project, please refer to our Contributing Guidelines.

- -

1.0.0 Release

- -

We continue to push hard to reach the 1.0.0 release milestone. This release will mark a significant milestone in the InvenTree project, and we are excited to see it come to fruition. Fingers crossed that the next minor release will be the last one before our 1.0.0 release!

- -

User Interface Improvements

- -

The new React interface remains a major hurdle to overcome before the 1.0.0 release. We are working hard to migrate all frontend code to React, and would greatly appreciate any help from the community in this effort. Any assistance with frontend development, testing, or bug fixing would be greatly appreciated. Please reach out via our GitHub page if you are interested in helping out.

- -

Support the Project

- -

As always, there are many ways to support the InvenTree project!

- -

Translation

- -

We are always looking for new translators to help us add new languages to InvenTree. If you are fluent in a language other than English, please consider contributing to our translation effort on Crowdin.

- -

Code Contributions

- -

We welcome code contributions from the community. If you are interested in contributing to the InvenTree codebase, please refer to our Contributing Guidelines.

- -

Report Bugs

- -

If you find a bug in InvenTree, please report it to us on our GitHub issues page. Reporting bugs is critical to improving the software, and we appreciate any help in identifying and fixing issues.

- -

Documentation

- -

Documenting a large software project is a challenging and ongoing effort. If you are able to provide assistance in improving the documentation set, please consider doing so! Documentation contributions can be made on GitHub.

- -

Financial Support

- -

If you or your company uses InvenTree, please consider sponsoring the project to show your support. Sponsorships help to keep this project sustainable, and buys time for the core developers to commit to the project. A recurring or one off sponsorship is a great way to help InvenTree development to continue at full steam!

- -

A friendly reminder that the majority of the work undertaken to keep InvenTree running is done by a very small group of core developers, who do so in their spare time (and are not sponsored by their employers to work on InvenTree). If you benefit from the InvenTree project, please consider contributing to maintain vibrant development of this software!

- - - -

Deploying InvenTree

- -

If you are new to the InvenTree project, there are multiple ways to deploy InvenTree for your own use. Please refer to the deployment guide for more information.

]]>
SchrodingersGat
0.15.2 Bugfix Release2024-05-26T00:00:00+00:002024-05-26T00:00:00+00:00/blog/2024/05/26/0.15.2The InvenTree team has just released version 0.15.2 which includes a patch for a critical security vulnerability.

- -

Security Patch

- -

We have fixed a critical security vulnerability in the InvenTree codebase which was identified and reported by one of our users. For more information on this security advisory, please refer to GHSA-2crp-q9pc-457j.

- -

Release Notes

- -

Releases notes for the 0.15.2 release can be found on our GitHub page

- -

Security Policy

- -

We take security very seriously at InvenTree. If you identify a security vulnerability in the InvenTree codebase, please report it to us immediately. You can find more information on our security policy.

]]>
SchrodingersGat
\ No newline at end of file +

We are discussing a few more breaking changes in 1.0 - feel free to chime in on the dedicated issue #6417.

]]>matmair \ No newline at end of file diff --git a/digitalocean.html b/digitalocean.html index 7b539489..07076a91 100644 --- a/digitalocean.html +++ b/digitalocean.html @@ -67,12 +67,6 @@

-

One-Click Install

- -

Deploy to DO

- -

InvenTree is available as a one-click install on the DigitalOcean marketplace. The image makes use of the installer and is maintained by team member matmair. The source is available here.

-

DigitalOcean Open Source Credits

DigitalOcean is kind enough to provide open source projects with free credits to use their services.
diff --git a/extend/plugin/index.html b/extend/plugin/index.html index c93c4861..d8f371e3 100644 --- a/extend/plugin/index.html +++ b/extend/plugin/index.html @@ -75,11 +75,11 @@

  • Zebra
  • -

    Plugin repo

    +

    Plugins

    You can find all tagged plugins on PyPi and GitHub.

    -

    We also offer a plugin repo with a community driven list of plugins. We encourage you to add your own plugins.

    +

    We also offer a plugin repository with a community driven list of plugins. We encourage you to add your own plugins to this list.

    diff --git a/index.html b/index.html index f9142290..9f7f7c6a 100644 --- a/index.html +++ b/index.html @@ -177,7 +177,7 @@   - 2.8 million + 2.9 million

    Docker pulls

    @@ -187,7 +187,7 @@   - 5752 + 5911

    GitHub Stars

    @@ -197,7 +197,7 @@   - 1071 + 1125

    Forks

    @@ -207,7 +207,7 @@   - 108 + 115

    Contributors

    @@ -357,6 +357,40 @@ diff --git a/lippoliv.html b/lippoliv.html index 6f7a5ed2..9bf9683c 100644 --- a/lippoliv.html +++ b/lippoliv.html @@ -30,11 +30,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"With over 15 years of experience and big big passion I learned to take care about the details. They build up to the big picture we have in mind. I’m planning ahead & act early to prevent a big bang.","headline":"Lippoliv","mainEntityOfPage":{"@type":"WebPage","@id":"/lippoliv"},"url":"/lippoliv"} diff --git a/lippoliv/inventree-default-salesorder-items.html b/lippoliv/inventree-default-salesorder-items.html index de1c48bc..bc761e08 100644 --- a/lippoliv/inventree-default-salesorder-items.html +++ b/lippoliv/inventree-default-salesorder-items.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"lippoliv"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Add default parts (configurable) to every newly created sales order automatically.","headline":"Inventree Default Salesorder Items","mainEntityOfPage":{"@type":"WebPage","@id":"/lippoliv/inventree-default-salesorder-items"},"url":"/lippoliv/inventree-default-salesorder-items"} @@ -69,7 +69,7 @@

     lippoliv

    -last modified: 19 Sep 2025 +last modified: 02 Nov 2025
    diff --git a/matmair.html b/matmair.html index ee2ff35a..03a2e2c0 100644 --- a/matmair.html +++ b/matmair.html @@ -30,11 +30,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"I try to build an ecosystem of reusable plugins and integrations for InvenTree. Code once and KISS!","headline":"Matmair","mainEntityOfPage":{"@type":"WebPage","@id":"/matmair"},"url":"/matmair"} diff --git a/matmair/inventree-apprise.html b/matmair/inventree-apprise.html index 55014719..6b40cf54 100644 --- a/matmair/inventree-apprise.html +++ b/matmair/inventree-apprise.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"matmair"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Send notifications from InvenTree via Apprise","headline":"Inventree Apprise","mainEntityOfPage":{"@type":"WebPage","@id":"/matmair/inventree-apprise"},"url":"/matmair/inventree-apprise"} @@ -69,7 +69,7 @@

     matmair

    -last modified: 19 Sep 2025 +last modified: 02 Nov 2025
    diff --git a/matmair/inventree-rapidoc.html b/matmair/inventree-rapidoc.html index 59f02673..58b1bc85 100644 --- a/matmair/inventree-rapidoc.html +++ b/matmair/inventree-rapidoc.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"matmair"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Use RapiDoc for Inventree API docs.","headline":"Inventree Rapidoc","mainEntityOfPage":{"@type":"WebPage","@id":"/matmair/inventree-rapidoc"},"url":"/matmair/inventree-rapidoc"} @@ -69,7 +69,7 @@

     matmair

    -last modified: 19 Sep 2025 +last modified: 02 Nov 2025
    diff --git a/matmair/inventree-zapier.html b/matmair/inventree-zapier.html index e3044785..4d6a669a 100644 --- a/matmair/inventree-zapier.html +++ b/matmair/inventree-zapier.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"matmair"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Integrate Zapier into InvenTree","headline":"Inventree Zapier","mainEntityOfPage":{"@type":"WebPage","@id":"/matmair/inventree-zapier"},"url":"/matmair/inventree-zapier"} @@ -69,7 +69,7 @@

     matmair

    -last modified: 19 Sep 2025 +last modified: 02 Nov 2025
    diff --git a/melektron.html b/melektron.html index 60174094..291227a0 100644 --- a/melektron.html +++ b/melektron.html @@ -30,11 +30,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Juggling with bits and bytes for fun and profit ;) (and also electrons if I feel like it)","headline":"Melektron","mainEntityOfPage":{"@type":"WebPage","@id":"/melektron"},"url":"/melektron"} diff --git a/melektron/inventree-adv-sheet-label.html b/melektron/inventree-adv-sheet-label.html index a43db6a6..aabe34e4 100644 --- a/melektron/inventree-adv-sheet-label.html +++ b/melektron/inventree-adv-sheet-label.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"melektron"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"A label printing plugin for InvenTree which provides support for printing labels on off-the-shelf label sheet layouts and adds some more useful features compared to the sheet label plugin included with InvenTree.","headline":"Inventree Adv Sheet Label","mainEntityOfPage":{"@type":"WebPage","@id":"/melektron/inventree-adv-sheet-label"},"url":"/melektron/inventree-adv-sheet-label"} @@ -69,7 +69,7 @@

     melektron

    -last modified: 19 Sep 2025 +last modified: 02 Nov 2025
    diff --git a/news.html b/news.html index 664ea9eb..3a325971 100644 --- a/news.html +++ b/news.html @@ -66,6 +66,16 @@ +
    +

    + 1.1.0 Release +

    + 1.1.0 Release + 02 Oct 2025 | + +Oliver +
    +

    1.0.0 Release diff --git a/news/2025/10/02/1.1.0.html b/news/2025/10/02/1.1.0.html new file mode 100644 index 00000000..bfbca762 --- /dev/null +++ b/news/2025/10/02/1.1.0.html @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + +InvenTree - 1.1.0 Release + + + +1.1.0 Release | InvenTree + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + logo + InvenTree + + +
    + + + + +
    +
    + + + go back + Back + + +
    + +
    +

    1.1.0 Release

    +

    + 02 Oct 2025 + + +Oliver +

    +

    1.1.0 Release

    + +

    The InvenTree team is excited to announce the release of version 1.1.0! This update brings a host of new features, improvements, and bug fixes to enhance your experience.

    + + + + +
    +
    + +
    +
    + + +
    + + + diff --git a/news/feed.atom b/news/feed.atom index b2d5c80e..ee726234 100644 --- a/news/feed.atom +++ b/news/feed.atom @@ -1,4 +1,10 @@ -Jekyll2025-09-19T01:13:41+00:00/news/feed.atomInvenTree | NewsInvenTree is an open-source inventory management system which provides intuitive parts management and stock control. It is at the center of an ecosystem of addins for EDA tools, API wrapper, deeply integrated plugins and 3rd party tools.1.0.0 Release2025-09-15T00:00:00+00:002025-09-15T00:00:00+00:00/news/2025/09/15/1.0.01.0.0 Release

    +Jekyll2025-11-02T21:31:39+00:00/news/feed.atomInvenTree | NewsInvenTree is an open-source inventory management system which provides intuitive parts management and stock control. It is at the center of an ecosystem of addins for EDA tools, API wrapper, deeply integrated plugins and 3rd party tools.1.1.0 Release2025-10-02T00:00:00+00:002025-10-02T00:00:00+00:00/news/2025/10/02/1.1.01.1.0 Release + +

    The InvenTree team is excited to announce the release of version 1.1.0! This update brings a host of new features, improvements, and bug fixes to enhance your experience.

    + +]]>
    SchrodingersGat
    1.0.0 Release2025-09-15T00:00:00+00:002025-09-15T00:00:00+00:00/news/2025/09/15/1.0.01.0.0 Release

    We are pleased to announce the 1.0.0 stable release, which represents a significant milestone in the development of InvenTree.

    @@ -36,10 +42,4 @@ It is recommended to read the release notes ]]>
    SchrodingersGat
    UI Roadmap - going 1.02024-09-23T00:00:00+00:002024-09-23T00:00:00+00:00/news/2024/09/23/ui-roadmapUI Roadmap - going 1.0 -

    We are excited to share that we have formed a plan for 1.0 - this contains breaking changes to how UI works. Read the details in the full article and learn how you can help / prepare.

    ]]>
    matmair
    0.16.0 Release2024-08-25T00:00:00+00:002024-08-25T00:00:00+00:00/news/2024/08/25/0.16.00.16.0 Release - -

    We are pleased to announce the 0.16.0 stable release, which represents a significant milestone in the development of InvenTree.

    - -]]>
    SchrodingersGat
    \ No newline at end of file +

    We are excited to share that we have formed a plan for 1.0 - this contains breaking changes to how UI works. Read the details in the full article and learn how you can help / prepare.

    ]]>matmair \ No newline at end of file diff --git a/piramja.html b/piramja.html index 0d0fd6c5..146a621a 100644 --- a/piramja.html +++ b/piramja.html @@ -30,11 +30,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"And in the end, we have no choice but to embrace the chaos and laugh about it.","headline":"Piramja","mainEntityOfPage":{"@type":"WebPage","@id":"/piramja"},"url":"/piramja"} diff --git a/piramja/inventree-niimbot-plugin.html b/piramja/inventree-niimbot-plugin.html index ebc6de5c..74e296f0 100644 --- a/piramja/inventree-niimbot-plugin.html +++ b/piramja/inventree-niimbot-plugin.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"piramja"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Introduction A label printing plugin for InvenTree, which provides support for the Niimbot Label Printers. This plugin is based on the amazing work from labbots/NiimPrintX and modifications from LorisPolenz/NiimPrintX.","headline":"Inventree Niimbot Plugin","mainEntityOfPage":{"@type":"WebPage","@id":"/piramja/inventree-niimbot-plugin"},"url":"/piramja/inventree-niimbot-plugin"} @@ -69,7 +69,7 @@

     piramja

    -last modified: 19 Sep 2025 +last modified: 02 Nov 2025
    diff --git a/plugins.html b/plugins.html index f5c22516..c5dba772 100644 --- a/plugins.html +++ b/plugins.html @@ -219,6 +219,40 @@
    + +
    + + diff --git a/plugins.json b/plugins.json index fb0e4166..741b3305 100644 --- a/plugins.json +++ b/plugins.json @@ -3,7 +3,7 @@ "/melektron/inventree-adv-sheet-label": { "name": "InvenTree Advanced Sheet Label", "author": "melektron", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": true, @@ -25,7 +25,7 @@ "/matmair/inventree-apprise": { "name": "InvenTree Apprise", "author": "matmair", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": true, @@ -47,7 +47,7 @@ "/SchrodingersGat/inventree-brother-plugin": { "name": "inventree-brother-plugin", "author": "SchrodingersGat", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": false, @@ -69,7 +69,7 @@ "/wolflu05/inventree-bulk-plugin": { "name": "inventree-bulk-plugin", "author": "wolflu05", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": true, @@ -88,10 +88,32 @@ "content_txt" : "Bulk creation plugin for InvenTree\n\ninventree-bulk-plugin\n\n\n\n\nThis plugin helps you bulk create storage locations and part categories in InvenTree by using customized naming strategies. That means you not only have the option to generate multidimensional* names for stock locations or part categories, but also have the option to save the templates for later usage if your storage room uses e.g. drawer towers, saved templates help to ensure naming consistency for all later added towers.\n\n\n ℹ️ * multidimensional means that you are not limited to namings like D1,D2, .. but also something like D1.A, D1.B, D2.A, D2.B, …\n\n\nThis will generate the previous mentioned example:\n\n\n\nIf you want to try out the templates on you’re own, you can just copy the below json to your clipboard and use the “New untitled schema from clipboard” button to import them (see import/export). For more examples refer to the plugin documentation.\n\n{\"name\":\"Example\",\"template_type\":\"STOCK_LOCATION\",\"template\":{\"version\":\"1.0.0\",\"input\":{},\"templates\":[],\"output\":{\"parent_name_match\":\"true\",\"dimensions\":[\"*NUMERIC\",\"*ALPHA\"],\"count\":[\"3\",\"2\"],\"generate\":{\"name\":\"D.\"},\"childs\":[]}}}\n\n\n⚙️ Installation\n\nInstall this plugin as follows:\n\n\n Make sure you allow the use of the url integration and app integration (see Why does this plugin needs the app mixin?)\n Goto Settings > Plugins > Install Plugin, enter inventree-bulk-plugin as package name. Enable the confirm switch and click submit.\n Restart your server and activate the plugin.\n Stop your server and run invoke update (for docker installs it is docker-compose inventree-server invoke update). This ensures that all migrations run and the static files get collected. You can now start your server again and start using the plugin.\n\n\n\n ❗At least InvenTree v0.12.7 is required to use this plugin.\n\n\n📖 Documentation\n\nRefer to the plugin documentation for further examples, instructions and information.\n", "content": "

    Bulk creation plugin for InvenTree

    \n\n

    inventree-bulk-plugin

    \n\n

    \"License:\n\"CI\"

    \n\n

    This plugin helps you bulk create storage locations and part categories in InvenTree by using customized naming strategies. That means you not only have the option to generate multidimensional* names for stock locations or part categories, but also have the option to save the templates for later usage if your storage room uses e.g. drawer towers, saved templates help to ensure naming consistency for all later added towers.

    \n\n
    \n

    ℹ️ * multidimensional means that you are not limited to namings like D1,D2, .. but also something like D1.A, D1.B, D2.A, D2.B, …

    \n
    \n\n

    This will generate the previous mentioned example:

    \n\n

    \"image\"

    \n\n

    If you want to try out the templates on you’re own, you can just copy the below json to your clipboard and use the “New untitled schema from clipboard” button to import them (see import/export). For more examples refer to the plugin documentation.

    \n\n
    {\"name\":\"Example\",\"template_type\":\"STOCK_LOCATION\",\"template\":{\"version\":\"1.0.0\",\"input\":{},\"templates\":[],\"output\":{\"parent_name_match\":\"true\",\"dimensions\":[\"*NUMERIC\",\"*ALPHA\"],\"count\":[\"3\",\"2\"],\"generate\":{\"name\":\"D.\"},\"childs\":[]}}}\n
    \n\n

    ⚙️ Installation

    \n\n

    Install this plugin as follows:

    \n\n
      \n
    1. Make sure you allow the use of the url integration and app integration (see Why does this plugin needs the app mixin?)
    2. \n
    3. Goto Settings > Plugins > Install Plugin, enter inventree-bulk-plugin as package name. Enable the confirm switch and click submit.
    4. \n
    5. Restart your server and activate the plugin.
    6. \n
    7. Stop your server and run invoke update (for docker installs it is docker-compose inventree-server invoke update). This ensures that all migrations run and the static files get collected. You can now start your server again and start using the plugin.
    8. \n
    \n\n
    \n

    ❗At least InvenTree v0.12.7 is required to use this plugin.

    \n
    \n\n

    📖 Documentation

    \n\n

    Refer to the plugin documentation for further examples, instructions and information.

    \n" }, +"/SchrodingersGat/inventree-consolidated-shipping": { + "name": "inventree-consolidated-shipment-lines", + "author": "SchrodingersGat", + "last_modified": "2025-11-02 21:31:24 +0000", + "open_source": null, + "license": "MIT", + "stable": true, + "maintained": true, + "pypi": true, + "package_name": "inventree-consolidated-shipment-lines", + "links":{ + "website": "https://inventree.org", + "issue_tracker": "https://github.com/SchrodingersGat/inventree-consolidated-shipping-report/issues", + "github": "https://github.com/SchrodingersGat/inventree-consolidated-shipping-report", + "gitlab": null, + "source": null + }, + "categories": ["Shipping"], + "tags": ["shipping","consolidated","report"], + "content_txt" : "InvenTree Consolidated Shipping Lines\n\nAdds extra report context when generating shipping reports, consolidating multiple stock items against each line item.\n\nInstallation\n\nThe easiest way to install the plugin is via the InvenTree user interface.\n\nAlternatively, you can install the plugin manually as follows:\n\npip install inventree-consolidated-shipment-lines\n\n\nDocumentation\n\nRefer to the plugin documentation for further instructions and information.\n", + "content": "

    InvenTree Consolidated Shipping Lines

    \n\n

    Adds extra report context when generating shipping reports, consolidating multiple stock items against each line item.

    \n\n

    Installation

    \n\n

    The easiest way to install the plugin is via the InvenTree user interface.

    \n\n

    Alternatively, you can install the plugin manually as follows:

    \n\n
    pip install inventree-consolidated-shipment-lines\n
    \n\n

    Documentation

    \n\n

    Refer to the plugin documentation for further instructions and information.

    \n" +}, "/wolflu05/inventree-cups-plugin": { "name": "inventree-cups-plugin", "author": "wolflu05", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": true, @@ -113,7 +135,7 @@ "/lippoliv/inventree-default-salesorder-items": { "name": "Default sales order items", "author": "lippoliv", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": true, @@ -135,7 +157,7 @@ "/wolflu05/inventree-dymo-plugin": { "name": "inventree-dymo-plugin", "author": "wolflu05", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "GPL-3.0+", "stable": true, @@ -154,10 +176,32 @@ "content_txt" : "Dymo label printer driver plugin for InvenTree\n\ninventree-dymo-plugin\n\n\n\n\nA label printer driver plugin for InvenTree, which provides support for Dymo Label Writer® printers.\n\nCompatibility\n\nThe following printers are already supported by the driver:\n\n\n DYMO Label Writer 450\n DYMO Label Writer 450 Duo (Tape is not supported currently)\n DYMO Label Writer 450 Turbo\n DYMO Label Writer 450 Twin Turbo\n\n\nRequirements\n\nCurrently only printing over network is supported, so an RAW network socket server needs to be connected to the printer. A raspberry pi zero w is just enough for that job.\n\nThe easiest way to set this up, is using cups and configure a RAW printer device in combination with xinetd like described in this blog post.\n\nInstallation\n\n\n :warning: This plugin is only compatible with InvenTree>=0.16 because this uses the new label printer driver interface introduced with inventree/InvenTree#4824 and was fixed with 0.16 to work inside of workers.\n\n\nGoto “Admin Center > Plugins > Install Plugin” and enter inventree-dymo-plugin as package name.\n\nThen goto “Admin Center > Machines” and create a new machine using this driver.\n\nTechnical working\n\nThis driver implements the RAW Dymo LabelWriter® 450 Series commands like described in the technical reference manual to send the label data to the printer.\n", "content": "

    Dymo label printer driver plugin for InvenTree

    \n\n

    inventree-dymo-plugin

    \n\n

    \"License:\n\"CI\"

    \n\n

    A label printer driver plugin for InvenTree, which provides support for Dymo Label Writer® printers.

    \n\n

    Compatibility

    \n\n

    The following printers are already supported by the driver:

    \n\n
      \n
    • DYMO Label Writer 450
    • \n
    • DYMO Label Writer 450 Duo (Tape is not supported currently)
    • \n
    • DYMO Label Writer 450 Turbo
    • \n
    • DYMO Label Writer 450 Twin Turbo
    • \n
    \n\n

    Requirements

    \n\n

    Currently only printing over network is supported, so an RAW network socket server needs to be connected to the printer. A raspberry pi zero w is just enough for that job.

    \n\n

    The easiest way to set this up, is using cups and configure a RAW printer device in combination with xinetd like described in this blog post.

    \n\n

    Installation

    \n\n
    \n

    :warning: This plugin is only compatible with InvenTree>=0.16 because this uses the new label printer driver interface introduced with inventree/InvenTree#4824 and was fixed with 0.16 to work inside of workers.

    \n
    \n\n

    Goto “Admin Center > Plugins > Install Plugin” and enter inventree-dymo-plugin as package name.

    \n\n

    Then goto “Admin Center > Machines” and create a new machine using this driver.

    \n\n

    Technical working

    \n\n

    This driver implements the RAW Dymo LabelWriter® 450 Series commands like described in the technical reference manual to send the label data to the printer.

    \n" }, +"/SchrodingersGat/inventree-harmonized-codes": { + "name": "inventree-harmonized-codes", + "author": "SchrodingersGat", + "last_modified": "2025-11-02 21:31:24 +0000", + "open_source": null, + "license": "MIT", + "stable": true, + "maintained": true, + "pypi": true, + "package_name": "inventree-harmonized-system-codes", + "links":{ + "website": "https://inventree.org", + "issue_tracker": null, + "github": "https://github.com/SchrodingersGat/inventree-harmonized-codes", + "gitlab": null, + "source": null + }, + "categories": ["Shipping"], + "tags": ["shipping","harmonized","codes"], + "content_txt" : "Harmonized System Codes for InvenTree\n\nA plugin which provides facility to assign harmonized system (HS) codes against parts when shipping internationally.\n\nInstallation\n\nThe easiest way to install the plugin is via the InvenTree user interface.\n\nAlternatively, you can install the plugin manually as follows:\n\npip install inventree-harmonized-system-codes\n\n\nDocumentation\n\nRefer to the plugin documentation for further instructions and information.\n", + "content": "

    Harmonized System Codes for InvenTree

    \n\n

    A plugin which provides facility to assign harmonized system (HS) codes against parts when shipping internationally.

    \n\n

    Installation

    \n\n

    The easiest way to install the plugin is via the InvenTree user interface.

    \n\n

    Alternatively, you can install the plugin manually as follows:

    \n\n
    pip install inventree-harmonized-system-codes\n
    \n\n

    Documentation

    \n\n

    Refer to the plugin documentation for further instructions and information.

    \n" +}, "/LavissaWoW/inventree-ipn-generator": { "name": "inventree-ipn-generator", "author": "LavissaWoW", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": true, @@ -179,7 +223,7 @@ "/afkiwers/inventree-kicad": { "name": "inventree-kicad-plugin", "author": "afkiwers", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": true, @@ -201,7 +245,7 @@ "/piramja/inventree-niimbot-plugin": { "name": "inventree-niimbot-plugin", "author": "piramja", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": true, @@ -223,7 +267,7 @@ "/SchrodingersGat/inventree-order-history": { "name": "inventree-order-history", "author": "SchrodingersGat", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": true, @@ -245,7 +289,7 @@ "/matmair/inventree-rapidoc": { "name": "Inventree RapiDoc", "author": "matmair", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT license", "stable": true, @@ -267,7 +311,7 @@ "/wolflu05/inventree-report-lsp-plugin": { "name": "inventree-report-lsp-plugin", "author": "wolflu05", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "GPL-3.0+", "stable": true, @@ -286,10 +330,32 @@ "content_txt" : "A report editor with auto completion, diagnostic messages and many more capabilities to help with creating custom templates, powered by django-template-lsp.\n\n\n\n\n\n\nTo install this plugin, follow the guide on the Readme. Note, that at least InvenTree v0.18.0 is required to use this plugin.\n", "content": "

    A report editor with auto completion, diagnostic messages and many more capabilities to help with creating custom templates, powered by django-template-lsp.

    \n\n

    \"License:\n\"CI\"

    \n\n

    \"Screenshot\"

    \n\n

    To install this plugin, follow the guide on the Readme. Note, that at least InvenTree v0.18.0 is required to use this plugin.

    \n" }, +"/SchrodingersGat/inventree-rolling-stocktake": { + "name": "inventree-rolling-stocktake", + "author": "SchrodingersGat", + "last_modified": "2025-11-02 21:31:24 +0000", + "open_source": null, + "license": "MIT", + "stable": true, + "maintained": true, + "pypi": true, + "package_name": "inventree-rolling-stocktake", + "links":{ + "website": "https://inventree.org", + "issue_tracker": null, + "github": "https://github.com/inventree/rolling-stocktake-plugin", + "gitlab": null, + "source": null + }, + "categories": ["Stock"], + "tags": ["stock","dashboard","inventory"], + "content_txt" : "Rolling Stocktake for InvenTree\n\nA plugin which provides a rolling stocktake mechanism for InvenTree.\n\nInstallation\n\nThe easiest way to install the plugin is via the InvenTree user interface.\n\nAlternatively, you can install the plugin manually as follows:\n\npip install inventree-rolling-stocktake\n\n\nDocumentation\n\nRefer to the plugin documentation for further instructions and information.\n", + "content": "

    Rolling Stocktake for InvenTree

    \n\n

    A plugin which provides a rolling stocktake mechanism for InvenTree.

    \n\n

    Installation

    \n\n

    The easiest way to install the plugin is via the InvenTree user interface.

    \n\n

    Alternatively, you can install the plugin manually as follows:

    \n\n
    pip install inventree-rolling-stocktake\n
    \n\n

    Documentation

    \n\n

    Refer to the plugin documentation for further instructions and information.

    \n" +}, "/SchrodingersGat/inventree-stock-forecasting": { "name": "inventree-stock-forecasting", "author": "SchrodingersGat", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": true, @@ -311,7 +377,7 @@ "/SergeoLacruz/inventree-supplier-panel": { "name": "inventree-supplier-panel", "author": "SergeoLacruz", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": true, @@ -333,7 +399,7 @@ "/SchrodingersGat/inventree-test-statistics": { "name": "inventree-test-statistics", "author": "SchrodingersGat", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": true, @@ -355,7 +421,7 @@ "/SchrodingersGat/inventree-wireviz": { "name": "inventree-wireviz-plugin", "author": "SchrodingersGat", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": true, @@ -377,7 +443,7 @@ "/matmair/inventree-zapier": { "name": "inventree-zapier", "author": "matmair", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": false, @@ -399,7 +465,7 @@ "/SergeoLacruz/inventree-zebra-plugin": { "name": "inventree-zebra-plugin", "author": "SergeoLacruz", - "last_modified": "2025-09-19 01:13:27 +0000", + "last_modified": "2025-11-02 21:31:24 +0000", "open_source": null, "license": "MIT", "stable": true, @@ -417,6 +483,28 @@ "tags": ["Label","Printer","Zebra","ZPL"], "content_txt" : "Zebra Label Printer Plugin for Inventree\n\nThis is a label printing plugin for InvenTree, which provides\nsupport for Zebra Label printers. It allows two modes of operation:\n\n\n Use the ZPL library to convert the png data provided by InvenTree to Zebra’s bitmap\nformat and send this to the printer.\n Write a ZPL template and let the printer do the rendering.\n\n\nIt can output the print data either to a local printer connected to the computer via\nUSB or to a network printer with an IP address. The output can be configured in the\nInvenTree plugin user interface.\n\nError handling is very basic.\n\nInstallation\n\nThe plugin is on pypi. Install this plugin using pip with the following command:\n\npip install inventree-zebra-plugin\n\n\nConfiguration Options\nPrinter Interface\nHere you can chose between local printer, network printer or the labelary.com API.\nThe last one is useful for preview of labels, especially when ZPL templates are used.\nDefault value is a local printer.\n\nIP address\nIn case you use an IP printer set the IPv4 address here.\n\nPort\nIn case you use an IP printer set the port number here. The default port number is 9100.\n\nLocal Device\nIn case of a local printer set the device here. The plugin actually puts the data directly to the\ndevice /dev/usb/lp0. No printer spooler is involved so far.\n\nThreshold\nThe image from pillow comes in greyscale. The plugin converts it ti pure BW because this gives a much\nbetter print result. The threshold between black and white can be adjusted here.\n\nDarkness\nThis is a value that influences the darkness of the print. Allowed values are 0 (white) to 30 (black).\nIt is directly converted to a SD command in ZPL. If your black areas tend to blur out reduce the\ndarkness.\n\nDots per mm\nThis sets the resolution of the printer. You can choose between 8, 12 and 24\ndpmm depending on your printer model.\n\nPrinter init\nThis string added to the printer output. It can be used to set special commands\ne.g. label rotation, mirror or white on black. Please refer to the ZPL manual\nfor more information.\n\nZebra printers store settings after printing. So if a rotated label has been\nprinted all following label will be rotated unless you change it. The default\nsets the printer to settings that have been useful for me. You might want to\nchange it according to your requirements. Please keep in mind that this string\nis passed directly to the printer without any checks. So be careful when editing\nhere.\n\nGet Printer info\nTurn this switch on to display a collection of all IP printers below on this page.\n\nLabel Template\nThe label needs a template described in html and css. The template should\nstart with a page definition that defines the label size as shown below:\n\n\n @page {\n {% localize off %}\n height: {{ height }}mm;\n width: {{ width }}mm;\n {% endlocalize %}\n padding: 0mm;\n margin: 0px 0px 0px 0px;\n background-color: white;\n }\n\n\n\nThe height and width parameters are defined in the InvenTree admin panel\nin the label section. These values have to fit the label size that is in\nthe printer. See the example templates for details on template definition.\n\nMulti printer hack\nWe have the requirement to print labels in different sizes. As we do not\nwant to change the reel for each print we set up a second printer loaded\nwith a different label size. InvenTree is not yet able to handle different\nprinters. So I added a multi printer hack. You can define a key with an IP\naddress in the label meta data:\n\n{\"ip_address\":\"xxx.yyy.zzz.eee\"}\n{\"darkness\":xx}\n\n\nIf the printer driver finds that key, the IP address from the printer settings\nis overwritten with the address from the meta data. So the print will end up\nin another printer.\n\nOnly the IP address and darkness can be overwritten so far. All other settings remain.\n\nQuality matters\nThe InvenTree printer system uses a graphical representation of the label. The label is described\nin HTML, converted to a pixel graphic and printed. The advantage is independency from printer\nmodels and systems. Disadvantage is larger data and quality problems with darkness and scaling.\nLet’s have a look at the following printout:\n\n\n\nBoth codes have been printed with the same printer on the same reel. The left one is\nhardly readable using my mobile. The right one reads easily even as it is smaller.\n\nSecret 1, Scale\nThe printer resolution is 8 dots per mm resulting in a dot size of 0.125mm. The QR code pixel\nand the printer pixel size should be integrally divisible. The code in the picture has 21\npixels plus one in the frame, so 23 pixel. The frame is set in the HTML description.\n\n{% qrcode qr_data border=1 %}\n\n\nI selected two dots per pixel. So 23 * 2 * 0.125 = 6.125mm. If the size is something different\nscaling takes place and the result might be worse. If you like a larger printout select more\ndots per pixel. From a certain size upwards the value does not matter any more because the code\ngets large enough to be readable in any quality.\n\nSecret 2: Darkness\nZebra printers allow to set the darkness of the print in values between 0 (white) and 30 (max)\nThe left code was printed with a value of 30. The black dots tend to blur out a bit resulting\nin smaller white areas. The right code was printed with a value of 25 resulting in larger white\npixels. The darkness values are just examples. Your values will differ based on printer model,\nmedia type and printer age. The printer head tends to wear out and the darkness value might\nneed an adjustment from time to time.\n\nIn printer rendering\nYou can also bypass the InvenTree print engine and render the label inside the printer.\nThe printer knows how to render the label for best quality. Inspired by the \ninventree-zpl-plugin inventree-zpl-plugin a similar\nfunction was aded to the zebra printer driver. You can write a ZPL template and upload\nit to the InvenTree Label templates as usual. Add a command to the template’s metadata:\n\n{\"zpl_template\": \"True\"}\n\n\nIn that case the printer driver ignores the picture rendered by WeasyPrint. Instead\nit calls the render_to_string function of the template and sends the\nresult to the printer. The result can look like:\n\n\n\nThe upper label was created using this template:\n\n\n{% autoescape off %}\n^FT30,25^A0N,18,22^FDIPN^FS\n^FT150,30^FB100,1,,C,,^A0N,24,32^FDACME^FS\n^FT320,25^A0N,18,22^FD{{ item.pk }}^FS\n^FT100,70^FB200,2,,C,,^A0N,18,22^FD{{ part.name }}^FS\n^FT100,100^FB200,1,,C,,^A0N,18,22^FD{{ part.manufacturer_parts.first.manufacturer.name }}^FS\n^FT30,150^FB340,1,,C,,^A0N,30,40^FD{{ part.IPN }}^FS\n^FT20,210^FB360,3,,L,,^A0N,18,22^FD{{ part.description }}^FS\n^FT15,110^BQ,2,3^FDQA,{{ part.IPN }}^FS\n^FT310,130^BQ,2,3^FDQA,{{ qr_data }}^FS\n{% endautoescape %}\n\n\n\nAutoescape must be off. We do not need &quot and similar escapes here.\nContext variables can be used as usual.\n\n!!! warning “Limitation”\n ZPL commands starting with backslash like \\& cannot be used so far.\n\nPreview\nThe printer driver allows an output device called “preview”. If this is selected\nthe ZPL code is sent to the API of labelary.com. The API sends back pdf data\nwhich is displayed in a new browser window. This is helpful while writing ZPL\ntemplates but works with HTML templates too. Please be careful and do not send\nconfidential information to the API.\n\nIn case you need to pass a proxy for the POST requests set the environment\nvariables PROXY_CON and PROXY_URL on the server. The plugin does not have\nsettings for this.\n\nGetting printer info\nWith the multi printer feature it can happen that you have several printers in\nyour setup. When the Get Printer Info switch is set ON, the driver calls each printer\nonce a minute and collects some info about it. It calls the printer configured\nin the settings as well as all printers it finds in the label templates.\nIn case a printer is unreachable, an error message is shown. If a printer is used\nin several templates it is listed only once.\n\nThe printer info feature works for local USB printers too.\n\n\n\nHow it works\nFirst import all the stuff you need. Here we use the translation mechanism from Django for multi language support.\nThe import the InvenTree libs and everything you need for plugin. Here we have ZPL for the Zebra bitmaps and socket\nfor the IP connection to the printer.\n\nThe next part is this:\n\nclass ZebraLabelPlugin(LabelPrintingMixin, SettingsMixin, IntegrationPluginBase):\n\n AUTHOR = \"Michael Buchmann\"\n DESCRIPTION = \"Label printing plugin for Zebra printers\"\n VERSION = ZEBRA_PLUGIN_VERSION\n NAME = \"Zebra labels\"\n SLUG = \"zebra\"\n TITLE = \"Zebra Label Printer\"\n\n\nThe name of the class can be freely chosen but should be different from SLUG. Otherwise it does not\nshow up. You reference to it in the entry_points section of the setup.py file.\nThe parameters need to be like in the example. Then there is the description block. The keywords are fixed and\nneed to be like that. The values are found in the UI as shown in the picture below.\n\n\n\nThen we add the configuration parameters.\nSETTINGS = {\n 'CONNECTION': {\n 'name': _('Printer Interface'),\n 'description': _('Select local or network printer'),\n 'choices': [('local','Local printer e.g. USB'),('network','Network printer with IP address')],\n 'default': 'local',\n },\n 'PORT': {\n 'name': _('Port'),\n 'description': _('Network port in case of network printer'),\n 'default': '9100',\n },\n }\n\n\n\nWe need to define a dict with the name SETTINGS. Please be aware the keys need to be in all CAPITAL letters like CONNECTION.\nSimple parameters are just text strings like the port. We can set a default. The name and description shows up in the UI.\nInstead of a simple text we can also use choices. The first string like “local” it the key you use in the code. The second\none is the description in the UI.\nAfter that we need to define a function:\n\ndef print_label(self, **kwargs){\n\n\nThe kwargs is a dict with the following keys:\n\n\n pdf_data\n user\n filename\n label_instance\n item_instance\n width\n height\n png_file\n\n\nThe item_instance is the part to be printed. This allows direct access to all part data. The arguments width and height\ncome from the settings of the label in the admin interface. NOT from the html template.\nFor the Zebra printer we use the png_file. This is a PIL (python Pillow) object with the graphic of the label in PNG format.\nThe PIL object is a greyscale image. Because the printer can just print pure BW we convert this to a BW picture.\n\nfn = lambda x : 255 if x > Threshold else 0\nlabel_image = label_image.convert('L').point(fn, mode='1')\n\n\nThe threshold can by modified by a plugin parameter. 200 is a good starting value. This trick gives much better prints.\nWe can put the result of this directly into the ZPL library.\n\nl = zpl.Label(Height, Width, dpmm)\nli.set_darkness(darkness)\n...\nl.write_graphic(label_image, Width)\nl.endorigin()\n\n\nWidth and Height define is the size of the label in millimeters as described above.\nThe third parameter is the resolution of the printer in dots per mm.\nwrite_graphic converts the pillow data to ZPL.\n\nThe plugin was tested with a labels of various sizes defined using css and html. The DPI scaling\ncan be chosen in the InvenTree settings. 800 is a good value because it gives high quality.\n\nThe rest of the code is just output to the printer on different interfaces.\n\nHappy printing.\n", "content": "

    Zebra Label Printer Plugin for Inventree

    \n\n

    This is a label printing plugin for InvenTree, which provides\nsupport for Zebra Label printers. It allows two modes of operation:

    \n\n
      \n
    • Use the ZPL library to convert the png data provided by InvenTree to Zebra’s bitmap\nformat and send this to the printer.
    • \n
    • Write a ZPL template and let the printer do the rendering.
    • \n
    \n\n

    It can output the print data either to a local printer connected to the computer via\nUSB or to a network printer with an IP address. The output can be configured in the\nInvenTree plugin user interface.

    \n\n

    Error handling is very basic.

    \n\n

    Installation

    \n\n

    The plugin is on pypi. Install this plugin using pip with the following command:

    \n\n
    pip install inventree-zebra-plugin\n
    \n\n

    Configuration Options

    \n

    Printer Interface

    \n

    Here you can chose between local printer, network printer or the labelary.com API.\nThe last one is useful for preview of labels, especially when ZPL templates are used.\nDefault value is a local printer.

    \n\n

    IP address

    \n

    In case you use an IP printer set the IPv4 address here.

    \n\n

    Port

    \n

    In case you use an IP printer set the port number here. The default port number is 9100.

    \n\n

    Local Device

    \n

    In case of a local printer set the device here. The plugin actually puts the data directly to the\ndevice /dev/usb/lp0. No printer spooler is involved so far.

    \n\n

    Threshold

    \n

    The image from pillow comes in greyscale. The plugin converts it ti pure BW because this gives a much\nbetter print result. The threshold between black and white can be adjusted here.

    \n\n

    Darkness

    \n

    This is a value that influences the darkness of the print. Allowed values are 0 (white) to 30 (black).\nIt is directly converted to a SD command in ZPL. If your black areas tend to blur out reduce the\ndarkness.

    \n\n

    Dots per mm

    \n

    This sets the resolution of the printer. You can choose between 8, 12 and 24\ndpmm depending on your printer model.

    \n\n

    Printer init

    \n

    This string added to the printer output. It can be used to set special commands\ne.g. label rotation, mirror or white on black. Please refer to the ZPL manual\nfor more information.

    \n\n

    Zebra printers store settings after printing. So if a rotated label has been\nprinted all following label will be rotated unless you change it. The default\nsets the printer to settings that have been useful for me. You might want to\nchange it according to your requirements. Please keep in mind that this string\nis passed directly to the printer without any checks. So be careful when editing\nhere.

    \n\n

    Get Printer info

    \n

    Turn this switch on to display a collection of all IP printers below on this page.

    \n\n

    Label Template

    \n

    The label needs a template described in html and css. The template should\nstart with a page definition that defines the label size as shown below:

    \n\n
    \n    @page {\n        {% localize off %}\n        height: {{ height }}mm;\n        width: {{ width }}mm;\n        {% endlocalize %}\n        padding: 0mm;\n        margin: 0px 0px 0px 0px;\n        background-color: white;\n    }\n\n
    \n\n

    The height and width parameters are defined in the InvenTree admin panel\nin the label section. These values have to fit the label size that is in\nthe printer. See the example templates for details on template definition.

    \n\n

    Multi printer hack

    \n

    We have the requirement to print labels in different sizes. As we do not\nwant to change the reel for each print we set up a second printer loaded\nwith a different label size. InvenTree is not yet able to handle different\nprinters. So I added a multi printer hack. You can define a key with an IP\naddress in the label meta data:

    \n\n
    {\"ip_address\":\"xxx.yyy.zzz.eee\"}\n{\"darkness\":xx}\n
    \n\n

    If the printer driver finds that key, the IP address from the printer settings\nis overwritten with the address from the meta data. So the print will end up\nin another printer.

    \n\n

    Only the IP address and darkness can be overwritten so far. All other settings remain.

    \n\n

    Quality matters

    \n

    The InvenTree printer system uses a graphical representation of the label. The label is described\nin HTML, converted to a pixel graphic and printed. The advantage is independency from printer\nmodels and systems. Disadvantage is larger data and quality problems with darkness and scaling.\nLet’s have a look at the following printout:

    \n\n

    \"QRCodes\"

    \n\n

    Both codes have been printed with the same printer on the same reel. The left one is\nhardly readable using my mobile. The right one reads easily even as it is smaller.

    \n\n

    Secret 1, Scale

    \n

    The printer resolution is 8 dots per mm resulting in a dot size of 0.125mm. The QR code pixel\nand the printer pixel size should be integrally divisible. The code in the picture has 21\npixels plus one in the frame, so 23 pixel. The frame is set in the HTML description.

    \n\n
    {% qrcode qr_data border=1 %}\n
    \n\n

    I selected two dots per pixel. So 23 * 2 * 0.125 = 6.125mm. If the size is something different\nscaling takes place and the result might be worse. If you like a larger printout select more\ndots per pixel. From a certain size upwards the value does not matter any more because the code\ngets large enough to be readable in any quality.

    \n\n

    Secret 2: Darkness

    \n

    Zebra printers allow to set the darkness of the print in values between 0 (white) and 30 (max)\nThe left code was printed with a value of 30. The black dots tend to blur out a bit resulting\nin smaller white areas. The right code was printed with a value of 25 resulting in larger white\npixels. The darkness values are just examples. Your values will differ based on printer model,\nmedia type and printer age. The printer head tends to wear out and the darkness value might\nneed an adjustment from time to time.

    \n\n

    In printer rendering

    \n

    You can also bypass the InvenTree print engine and render the label inside the printer.\nThe printer knows how to render the label for best quality. Inspired by the \ninventree-zpl-plugin inventree-zpl-plugin a similar\nfunction was aded to the zebra printer driver. You can write a ZPL template and upload\nit to the InvenTree Label templates as usual. Add a command to the template’s metadata:

    \n\n
    {\"zpl_template\": \"True\"}\n
    \n\n

    In that case the printer driver ignores the picture rendered by WeasyPrint. Instead\nit calls the render_to_string function of the template and sends the\nresult to the printer. The result can look like:

    \n\n

    \"Label

    \n\n

    The upper label was created using this template:

    \n\n
    \n{% autoescape off %}\n^FT30,25^A0N,18,22^FDIPN^FS\n^FT150,30^FB100,1,,C,,^A0N,24,32^FDACME^FS\n^FT320,25^A0N,18,22^FD{{ item.pk }}^FS\n^FT100,70^FB200,2,,C,,^A0N,18,22^FD{{ part.name }}^FS\n^FT100,100^FB200,1,,C,,^A0N,18,22^FD{{ part.manufacturer_parts.first.manufacturer.name }}^FS\n^FT30,150^FB340,1,,C,,^A0N,30,40^FD{{ part.IPN }}^FS\n^FT20,210^FB360,3,,L,,^A0N,18,22^FD{{ part.description }}^FS\n^FT15,110^BQ,2,3^FDQA,{{ part.IPN }}^FS\n^FT310,130^BQ,2,3^FDQA,{{ qr_data }}^FS\n{% endautoescape %}\n\n
    \n\n

    Autoescape must be off. We do not need &quot and similar escapes here.\nContext variables can be used as usual.

    \n\n

    !!! warning “Limitation”\n ZPL commands starting with backslash like \\& cannot be used so far.

    \n\n

    Preview

    \n

    The printer driver allows an output device called “preview”. If this is selected\nthe ZPL code is sent to the API of labelary.com. The API sends back pdf data\nwhich is displayed in a new browser window. This is helpful while writing ZPL\ntemplates but works with HTML templates too. Please be careful and do not send\nconfidential information to the API.

    \n\n

    In case you need to pass a proxy for the POST requests set the environment\nvariables PROXY_CON and PROXY_URL on the server. The plugin does not have\nsettings for this.

    \n\n

    Getting printer info

    \n

    With the multi printer feature it can happen that you have several printers in\nyour setup. When the Get Printer Info switch is set ON, the driver calls each printer\nonce a minute and collects some info about it. It calls the printer configured\nin the settings as well as all printers it finds in the label templates.\nIn case a printer is unreachable, an error message is shown. If a printer is used\nin several templates it is listed only once.

    \n\n

    The printer info feature works for local USB printers too.

    \n\n

    \"Printer

    \n\n

    How it works

    \n

    First import all the stuff you need. Here we use the translation mechanism from Django for multi language support.\nThe import the InvenTree libs and everything you need for plugin. Here we have ZPL for the Zebra bitmaps and socket\nfor the IP connection to the printer.

    \n\n

    The next part is this:

    \n\n
    class ZebraLabelPlugin(LabelPrintingMixin, SettingsMixin, IntegrationPluginBase):\n\n    AUTHOR = \"Michael Buchmann\"\n    DESCRIPTION = \"Label printing plugin for Zebra printers\"\n    VERSION = ZEBRA_PLUGIN_VERSION\n    NAME = \"Zebra labels\"\n    SLUG = \"zebra\"\n    TITLE = \"Zebra Label Printer\"\n
    \n\n

    The name of the class can be freely chosen but should be different from SLUG. Otherwise it does not\nshow up. You reference to it in the entry_points section of the setup.py file.\nThe parameters need to be like in the example. Then there is the description block. The keywords are fixed and\nneed to be like that. The values are found in the UI as shown in the picture below.

    \n\n

    \"Config\"

    \n\n

    Then we add the configuration parameters.

    \n
    SETTINGS = {\n        'CONNECTION': {\n            'name': _('Printer Interface'),\n            'description': _('Select local or network printer'),\n            'choices': [('local','Local printer e.g. USB'),('network','Network printer with IP address')],\n            'default': 'local',\n        },\n        'PORT': {\n            'name': _('Port'),\n            'description': _('Network port in case of network printer'),\n            'default': '9100',\n        },\n    }\n\n
    \n\n

    We need to define a dict with the name SETTINGS. Please be aware the keys need to be in all CAPITAL letters like CONNECTION.\nSimple parameters are just text strings like the port. We can set a default. The name and description shows up in the UI.\nInstead of a simple text we can also use choices. The first string like “local” it the key you use in the code. The second\none is the description in the UI.\nAfter that we need to define a function:

    \n\n
    def print_label(self, **kwargs){\n
    \n\n

    The kwargs is a dict with the following keys:

    \n\n
      \n
    • pdf_data
    • \n
    • user
    • \n
    • filename
    • \n
    • label_instance
    • \n
    • item_instance
    • \n
    • width
    • \n
    • height
    • \n
    • png_file
    • \n
    \n\n

    The item_instance is the part to be printed. This allows direct access to all part data. The arguments width and height\ncome from the settings of the label in the admin interface. NOT from the html template.\nFor the Zebra printer we use the png_file. This is a PIL (python Pillow) object with the graphic of the label in PNG format.\nThe PIL object is a greyscale image. Because the printer can just print pure BW we convert this to a BW picture.

    \n\n
    fn = lambda x : 255 if x > Threshold else 0\nlabel_image = label_image.convert('L').point(fn, mode='1')\n
    \n\n

    The threshold can by modified by a plugin parameter. 200 is a good starting value. This trick gives much better prints.\nWe can put the result of this directly into the ZPL library.

    \n\n
    l = zpl.Label(Height, Width, dpmm)\nli.set_darkness(darkness)\n...\nl.write_graphic(label_image, Width)\nl.endorigin()\n
    \n\n

    Width and Height define is the size of the label in millimeters as described above.\nThe third parameter is the resolution of the printer in dots per mm.\nwrite_graphic converts the pillow data to ZPL.

    \n\n

    The plugin was tested with a labels of various sizes defined using css and html. The DPI scaling\ncan be chosen in the InvenTree settings. 800 is a good value because it gives high quality.

    \n\n

    The rest of the code is just output to the printer on different interfaces.

    \n\n

    Happy printing.

    \n" +}, +"/wolflu05/inventree-zebra": { + "name": "inventree-zebra", + "author": "wolflu05", + "last_modified": "2025-11-02 21:31:24 +0000", + "open_source": null, + "license": "GPL-3.0+", + "stable": true, + "maintained": true, + "pypi": true, + "package_name": "inventree-zebra", + "links":{ + "website": null, + "issue_tracker": "https://github.com/wolflu05/inventree-zebra/issues", + "github": "https://github.com/wolflu05/inventree-zebra", + "gitlab": null, + "source": null + }, + "categories": ["Printer"], + "tags": ["Label","Printer","Zebra"], + "content_txt" : "Zebra label printer driver plugin for InvenTree\n\ninventree-zebra\n\n\n\n\nA zebra label printer driver plugin compatible with the InvenTree Machine Registry.\n\n\n\nInstallation\n\n\n [!IMPORTANT]\nThis plugin is only compatible with InvenTree>=1.1.0\n\n\nGoto “Admin Center > Plugins > Install Plugin” and enter inventree-zebra as package name and activate it.\n\nThen goto “Admin Center > Machines” and create a new machine using this driver.\n", + "content": "

    Zebra label printer driver plugin for InvenTree

    \n\n

    inventree-zebra

    \n\n

    \"License:\n\"CI\"

    \n\n

    A zebra label printer driver plugin compatible with the InvenTree Machine Registry.

    \n\n

    \"Printer

    \n\n

    Installation

    \n\n
    \n

    [!IMPORTANT]\nThis plugin is only compatible with InvenTree>=1.1.0

    \n
    \n\n

    Goto “Admin Center > Plugins > Install Plugin” and enter inventree-zebra as package name and activate it.

    \n\n

    Then goto “Admin Center > Machines” and create a new machine using this driver.

    \n" } }, "publishers":{ diff --git a/plugins/categories/index.html b/plugins/categories/index.html index dbea9007..7701b381 100644 --- a/plugins/categories/index.html +++ b/plugins/categories/index.html @@ -131,6 +131,18 @@ + + Shipping + + + + + + Stock + + + + Supplier @@ -184,6 +196,14 @@ + + + + + + + + @@ -241,6 +261,14 @@ + + + + + + + + @@ -352,6 +380,22 @@ + + + + + + + + + + + + + + + + @@ -396,6 +440,10 @@ + + + + @@ -443,6 +491,10 @@ + + + +
    @@ -512,6 +564,10 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + + @@ -550,6 +606,10 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + +
    @@ -613,6 +673,18 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + + + + + + + + + + @@ -667,6 +739,10 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + +
    @@ -702,6 +778,14 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + + + + + + @@ -775,6 +859,14 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + + + + + + @@ -859,6 +951,14 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + + + + + + @@ -964,6 +1064,14 @@ A label printing plugin for
    InvenTree, which + + + + + + + + @@ -1083,6 +1191,22 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + + + @@ -1160,6 +1284,10 @@ A label printing plugin for InvenTree, which + + + +
    @@ -1273,6 +1401,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -1317,6 +1453,42 @@ A label printing plugin for InvenTree, which
    + + + + + +
    @@ -1360,6 +1532,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -1447,6 +1627,10 @@ A label printing plugin for InvenTree, which + + + +
    @@ -1595,6 +1783,10 @@ A label printing plugin for InvenTree, which + + + + @@ -1666,6 +1858,316 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +

    Shipping

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +

    Stock

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1742,6 +2244,18 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + @@ -1803,6 +2317,10 @@ A label printing plugin for InvenTree, which + + + +
    diff --git a/plugins/tags/index.html b/plugins/tags/index.html index bddc2a1d..70bd7b91 100644 --- a/plugins/tags/index.html +++ b/plugins/tags/index.html @@ -281,6 +281,24 @@ + + codes + + + + + + consolidated + + + + + + dashboard + + + + data @@ -299,12 +317,24 @@ + + harmonized + + + + history + + inventory + + + + kicad @@ -335,6 +365,12 @@ + + shipping + + + + stock @@ -463,6 +499,22 @@ + + + + + + + + + + + + + + + + @@ -590,6 +642,22 @@ + + + + + + + + + + + + + + + + @@ -634,6 +702,10 @@ + + + + @@ -713,6 +785,18 @@ + + + + + + + + + + + + @@ -789,6 +873,18 @@ + + + + + + + + + + + + @@ -843,6 +939,10 @@ + + + +
    @@ -943,6 +1043,22 @@ + + + + + + + + + + + + + + + + @@ -1023,6 +1139,18 @@ + + + + + + + + + + + + @@ -1077,6 +1205,10 @@ + + + +
    @@ -1179,6 +1311,22 @@ + + + + + + + + + + + + + + + + @@ -1220,6 +1368,10 @@ + + + + @@ -1302,6 +1454,18 @@ + + + + + + + + + + + + @@ -1339,6 +1503,10 @@ + + + + @@ -1421,6 +1589,18 @@ + + + + + + + + + + + + @@ -1544,6 +1724,22 @@ + + + + + + + + + + + + + + + + @@ -1592,6 +1788,10 @@ + + + + @@ -1665,6 +1865,18 @@ + + + + + + + + + + + + @@ -1709,6 +1921,14 @@ + + + + + + + + @@ -1788,6 +2008,14 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + + + + + + @@ -1907,6 +2135,22 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + + + + + + + + + + + + + + @@ -1955,6 +2199,14 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + + + + + + @@ -2034,6 +2286,14 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + + + + + + @@ -2094,6 +2354,14 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + + + + + + @@ -2153,6 +2421,14 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + + + + + + @@ -2258,6 +2534,10 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + +
    @@ -2344,6 +2624,10 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + +
    @@ -2443,6 +2727,10 @@ A label printing plugin for InvenTree, which + + + + @@ -2483,6 +2771,42 @@ A label printing plugin for InvenTree, which
    + + + + + +
    @@ -2585,6 +2909,22 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + + + @@ -2712,6 +3052,22 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + + + @@ -2839,6 +3195,22 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + + + @@ -2895,6 +3267,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -2966,6 +3346,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -3079,6 +3467,22 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + + + @@ -3165,6 +3569,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -3235,6 +3647,10 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + + @@ -3281,6 +3697,10 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + +
    @@ -3308,6 +3728,10 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + + @@ -3387,6 +3811,18 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + + + + + + + + + + @@ -3460,6 +3896,10 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + +
    @@ -3546,6 +3986,10 @@ Installing this plugin enables the automatic generation if Internal Part Numbers + + + +
    @@ -3611,6 +4055,10 @@ A label printing plugin for InvenTree, which + + + + @@ -3651,6 +4099,42 @@ A label printing plugin for InvenTree, which
    + + + + + +
    @@ -3755,6 +4239,22 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + + + @@ -3819,6 +4319,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -3876,6 +4384,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -3912,6 +4428,10 @@ A label printing plugin for InvenTree, which + + + + @@ -3991,6 +4511,18 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + @@ -4108,6 +4640,22 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + + + @@ -4235,6 +4783,22 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + + + @@ -4354,6 +4918,22 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + + + @@ -4481,6 +5061,22 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + + + @@ -4569,6 +5165,18 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + @@ -4617,6 +5225,10 @@ A label printing plugin for InvenTree, which
    + + + +
    @@ -4684,6 +5296,18 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + @@ -4730,6 +5354,10 @@ A label printing plugin for InvenTree, which + + + +
    @@ -4801,6 +5429,18 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + @@ -4849,6 +5489,42 @@ A label printing plugin for InvenTree, which
    + + + + + +
    @@ -4884,6 +5560,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -4945,6 +5629,413 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +

    codes

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +

    consolidated

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +

    dashboard

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5009,6 +6100,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -5062,6 +6161,10 @@ A label printing plugin for InvenTree, which + + + +
    @@ -5202,6 +6309,18 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + @@ -5263,6 +6382,10 @@ A label printing plugin for InvenTree, which + + + +
    @@ -5316,6 +6439,18 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + @@ -5361,6 +6496,143 @@ A label printing plugin for InvenTree, which
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +

    harmonized

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5425,6 +6697,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -5486,6 +6766,147 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +

    inventory

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5534,6 +6955,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -5607,6 +7036,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -5671,6 +7108,18 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + @@ -5732,6 +7181,10 @@ A label printing plugin for InvenTree, which + + + +
    @@ -5777,6 +7230,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -5842,6 +7303,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -5879,6 +7348,46 @@ A label printing plugin for InvenTree, which + + + + + + + + + + @@ -5957,6 +7466,10 @@ A label printing plugin for InvenTree, which + + + +
    @@ -6037,6 +7554,14 @@ A label printing plugin for InvenTree, which + + + + + + + + @@ -6098,6 +7623,179 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +

    shipping

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6178,6 +7876,50 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + + + @@ -6231,6 +7973,10 @@ A label printing plugin for InvenTree, which + + + + @@ -6291,6 +8037,18 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + @@ -6352,6 +8110,10 @@ A label printing plugin for InvenTree, which + + + +
    @@ -6413,6 +8175,18 @@ A label printing plugin for InvenTree, which + + + + + + + + + + + + @@ -6471,6 +8245,10 @@ A label printing plugin for InvenTree, which + + + +
    diff --git a/schrodingersgat.html b/schrodingersgat.html index 223bc3c3..837ca39b 100644 --- a/schrodingersgat.html +++ b/schrodingersgat.html @@ -30,11 +30,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Maintainer of InvenTree.","headline":"Schrodingersgat","mainEntityOfPage":{"@type":"WebPage","@id":"/schrodingersgat"},"url":"/schrodingersgat"} @@ -96,6 +96,12 @@

    Posts

    diff --git a/wolflu05/inventree-bulk-plugin.html b/wolflu05/inventree-bulk-plugin.html index 8a184903..2ce074e4 100644 --- a/wolflu05/inventree-bulk-plugin.html +++ b/wolflu05/inventree-bulk-plugin.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"wolflu05"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Bulk creation plugin for InvenTree","headline":"Inventree Bulk Plugin","mainEntityOfPage":{"@type":"WebPage","@id":"/wolflu05/inventree-bulk-plugin"},"url":"/wolflu05/inventree-bulk-plugin"} @@ -69,7 +69,7 @@

     wolflu05

    -last modified: 19 Sep 2025 +last modified: 02 Nov 2025
    diff --git a/wolflu05/inventree-cups-plugin.html b/wolflu05/inventree-cups-plugin.html index b2d55647..fa82b20f 100644 --- a/wolflu05/inventree-cups-plugin.html +++ b/wolflu05/inventree-cups-plugin.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"wolflu05"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Label printing plugin for generic cups printers","headline":"Inventree Cups Plugin","mainEntityOfPage":{"@type":"WebPage","@id":"/wolflu05/inventree-cups-plugin"},"url":"/wolflu05/inventree-cups-plugin"} @@ -69,7 +69,7 @@

     wolflu05

    -last modified: 19 Sep 2025 +last modified: 02 Nov 2025
    diff --git a/wolflu05/inventree-dymo-plugin.html b/wolflu05/inventree-dymo-plugin.html index 036324df..e6887bf8 100644 --- a/wolflu05/inventree-dymo-plugin.html +++ b/wolflu05/inventree-dymo-plugin.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"wolflu05"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"Dymo label printer driver plugin for InvenTree","headline":"Inventree Dymo Plugin","mainEntityOfPage":{"@type":"WebPage","@id":"/wolflu05/inventree-dymo-plugin"},"url":"/wolflu05/inventree-dymo-plugin"} @@ -69,7 +69,7 @@

     wolflu05

    -last modified: 19 Sep 2025 +last modified: 02 Nov 2025
    diff --git a/wolflu05/inventree-report-lsp-plugin.html b/wolflu05/inventree-report-lsp-plugin.html index cbd59e2d..7a215307 100644 --- a/wolflu05/inventree-report-lsp-plugin.html +++ b/wolflu05/inventree-report-lsp-plugin.html @@ -31,11 +31,11 @@ - + +{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"wolflu05"},"dateModified":"2025-11-02T21:31:39+00:00","datePublished":"2025-11-02T21:31:39+00:00","description":"A report editor with auto completion, diagnostic messages and many more capabilities to help with creating custom templates, powered by django-template-lsp.","headline":"Inventree Report Lsp Plugin","mainEntityOfPage":{"@type":"WebPage","@id":"/wolflu05/inventree-report-lsp-plugin"},"url":"/wolflu05/inventree-report-lsp-plugin"} @@ -69,7 +69,7 @@

     wolflu05

    -last modified: 19 Sep 2025 +last modified: 02 Nov 2025
    diff --git a/wolflu05/inventree-zebra.html b/wolflu05/inventree-zebra.html new file mode 100644 index 00000000..cb125814 --- /dev/null +++ b/wolflu05/inventree-zebra.html @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + +InvenTree - Inventree Zebra + + + +Inventree Zebra | InvenTree + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + logo + InvenTree + + +
    + + + + +
    +
    + +

    inventree-zebra + + + + mdo +

     wolflu05

    +
    +
    +last modified: 02 Nov 2025 +

    + +
    +
    +

    Zebra label printer driver plugin for InvenTree

    + +

    inventree-zebra

    + +

    License: +CI

    + +

    A zebra label printer driver plugin compatible with the InvenTree Machine Registry.

    + +

    Printer Settings

    + +

    Installation

    + +
    +

    [!IMPORTANT] +This plugin is only compatible with InvenTree>=1.1.0

    +
    + +

    Goto “Admin Center > Plugins > Install Plugin” and enter inventree-zebra as package name and activate it.

    + +

    Then goto “Admin Center > Machines” and create a new machine using this driver.

    + +
    + +
    +

    Detail section

    +
    +

    License: + + + GPL-3.0+
    +
    +

    +
    + Status:
    +
    + + + Stable + + +
    +
    + + + Maintained + + +
    +
    + Package on PyPI:
    inventree-zebra
    + + + + + + +
    + +
    +
    + + + + +
    + +

    wolflu05/inventree-zebra

    +
    +
    + + + + +
    + +
    + + Printer + +
    +
    + +
    + +
    + + Label + + Printer + + Zebra + +
    +
    +
    +
    +
    + +
    + +
    + +
    +
    + + +
    + + +