diff --git a/404.html b/404.html new file mode 100755 index 0000000..9f97ae0 --- /dev/null +++ b/404.html @@ -0,0 +1 @@ + 一抹雨烟

404 - Not found

\ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index a5268b8..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 yimoyuyan - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 4e7c7d1..0000000 --- a/README.md +++ /dev/null @@ -1,18 +0,0 @@ -### Hi there 👋 - - -## 介绍✨ -这是我的第二大脑。我的日记、阅读、观影等私人碎片式记忆将被整合到这里,我的工作知识、项目追踪、自我能力提升也会收录进这里。我希望它可以帮我记忆、存储、归纳、汇总、检索。 diff --git a/alternatives/index.html b/alternatives/index.html new file mode 100755 index 0000000..db1f776 --- /dev/null +++ b/alternatives/index.html @@ -0,0 +1,12 @@ + Alternatives - 一抹雨烟
Skip to content

Alternatives

There are tons of static site generators and themes out there and choosing the right one for your tech stack is a tough decision. If you're unsure if Material for MkDocs is the right solution for you, this section should help you evaluate alternative solutions.

Docusaurus

Docusaurus by Facebook is a very popular documentation generator and a good choice if you or your company are already using React to build your site. It will generate a single page application which is fundamentally different from the site Material for MkDocs generates for you.

Advantages

  • Very powerful, customizable and extendable
  • Provides many components that aid in technical writing
  • Large and rich ecosystem, backed by Facebook

Challenges

  • High learning curve, JavaScript knowledge mandatory
  • JavaScript ecosystem is very volatile, rather high maintenance
  • More time needed to get up and running

While Docusaurus is one of the best choices when it comes to documentation sites that output a single page application, there are many more solutions, including Docz, Gatsby, Vuepress and Docsify that approach this problem similarly.

Jekyll

Jekyll is probably one of the most mature and widespread static site generators and is written in Ruby. It is not specifically geared towards technical project documentation and has many themes to choose from, which can be challenging.

Advantages

  • Battle-tested, rich ecosystem, many themes to choose from
  • Brings great capabilities for blogging (permalinks, tags, etc.)
  • Generates a SEO-friendly site, similar to Material for MkDocs

Challenges

  • Not specifically geared towards technical project documentation
  • Limited Markdown capabilities, not as advanced as Python Markdown
  • More time needed to get up and running

Sphinx

Sphinx is an alternative static site generator specifically geared towards generating reference documentation, offering powerful capabilities that are lacking in MkDocs. It uses reStructured text, a format similar to Markdown, which some users find harder to use.

Advantages

  • Very powerful, customizable and extendable
  • Generates reference documentation from Python docstrings
  • Large and rich ecosystem, used by many Python projects

Challenges

  • High learning curve, reStructured text syntax might be challenging
  • Search is less powerful than the one provided by MkDocs
  • More time needed to get up and running

If you're considering using Sphinx because you need to generate reference documentation, you should give mkdocstrings a try – an actively maintained and popular framework building on top of MkDocs, implementing Sphinx-like functionality.

GitBook

GitBook offers a hosted documentation solution that generates a beautiful and functional site from Markdown files in your GitHub repository. However, it was once Open Source, but turned into a closed source solution some time ago.

Advantages

  • Hosted solution, minimal technical knowledge required
  • Custom domains, authentication and other enterprise features
  • Great collaboration features for teams

Challenges

  • Closed source, not free for proprietary projects
  • Limited Markdown capabilities, not as advanced as Python Markdown
  • Many Open Source projects moved away from GitBook

Many users switched from GitBook to Material for MkDocs, as they want to keep control and ownership of their documentation, favoring an Open Source solution.

\ No newline at end of file diff --git a/assets/Hexagon.png b/assets/Hexagon.png new file mode 100755 index 0000000..f84c06a Binary files /dev/null and b/assets/Hexagon.png differ diff --git a/assets/favicon.png b/assets/favicon.png new file mode 100755 index 0000000..6771c11 Binary files /dev/null and b/assets/favicon.png differ diff --git a/assets/hexagon-multiple.png b/assets/hexagon-multiple.png new file mode 100755 index 0000000..a8474a4 Binary files /dev/null and b/assets/hexagon-multiple.png differ diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100755 index 0000000..1cf13b9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/images/illustration.png b/assets/images/illustration.png new file mode 100755 index 0000000..583dde9 Binary files /dev/null and b/assets/images/illustration.png differ diff --git a/assets/images/illustration1.png b/assets/images/illustration1.png new file mode 100755 index 0000000..69f739c Binary files /dev/null and b/assets/images/illustration1.png differ diff --git a/assets/images/illustration2.png b/assets/images/illustration2.png new file mode 100755 index 0000000..c392a81 Binary files /dev/null and b/assets/images/illustration2.png differ diff --git a/assets/images/illustration3.png b/assets/images/illustration3.png new file mode 100755 index 0000000..246c3b8 Binary files /dev/null and b/assets/images/illustration3.png differ diff --git a/assets/images/zelda-dark-world.png b/assets/images/zelda-dark-world.png new file mode 100755 index 0000000..275f858 Binary files /dev/null and b/assets/images/zelda-dark-world.png differ diff --git a/assets/images/zelda-light-world.png b/assets/images/zelda-light-world.png new file mode 100755 index 0000000..aaf9f71 Binary files /dev/null and b/assets/images/zelda-light-world.png differ diff --git a/assets/javascripts/bundle.cd18aaf1.min.js b/assets/javascripts/bundle.cd18aaf1.min.js new file mode 100755 index 0000000..07521cc --- /dev/null +++ b/assets/javascripts/bundle.cd18aaf1.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Si=Object.create;var ur=Object.defineProperty;var Ti=Object.getOwnPropertyDescriptor;var Oi=Object.getOwnPropertyNames,kt=Object.getOwnPropertySymbols,Mi=Object.getPrototypeOf,dr=Object.prototype.hasOwnProperty,Zr=Object.prototype.propertyIsEnumerable;var Xr=(e,t,r)=>t in e?ur(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t)=>{for(var r in t||(t={}))dr.call(t,r)&&Xr(e,r,t[r]);if(kt)for(var r of kt(t))Zr.call(t,r)&&Xr(e,r,t[r]);return e};var eo=(e,t)=>{var r={};for(var o in e)dr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&kt)for(var o of kt(e))t.indexOf(o)<0&&Zr.call(e,o)&&(r[o]=e[o]);return r};var hr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Li=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Oi(t))!dr.call(e,n)&&n!==r&&ur(e,n,{get:()=>t[n],enumerable:!(o=Ti(t,n))||o.enumerable});return e};var Ht=(e,t,r)=>(r=e!=null?Si(Mi(e)):{},Li(t||!e||!e.__esModule?ur(r,"default",{value:e,enumerable:!0}):r,e));var to=(e,t,r)=>new Promise((o,n)=>{var i=c=>{try{a(r.next(c))}catch(p){n(p)}},s=c=>{try{a(r.throw(c))}catch(p){n(p)}},a=c=>c.done?o(c.value):Promise.resolve(c.value).then(i,s);a((r=r.apply(e,t)).next())});var oo=hr((br,ro)=>{(function(e,t){typeof br=="object"&&typeof ro!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(br,function(){"use strict";function e(r){var o=!0,n=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(C){return!!(C&&C!==document&&C.nodeName!=="HTML"&&C.nodeName!=="BODY"&&"classList"in C&&"contains"in C.classList)}function c(C){var it=C.type,Ue=C.tagName;return!!(Ue==="INPUT"&&s[it]&&!C.readOnly||Ue==="TEXTAREA"&&!C.readOnly||C.isContentEditable)}function p(C){C.classList.contains("focus-visible")||(C.classList.add("focus-visible"),C.setAttribute("data-focus-visible-added",""))}function l(C){C.hasAttribute("data-focus-visible-added")&&(C.classList.remove("focus-visible"),C.removeAttribute("data-focus-visible-added"))}function f(C){C.metaKey||C.altKey||C.ctrlKey||(a(r.activeElement)&&p(r.activeElement),o=!0)}function u(C){o=!1}function d(C){a(C.target)&&(o||c(C.target))&&p(C.target)}function v(C){a(C.target)&&(C.target.classList.contains("focus-visible")||C.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(C.target))}function b(C){document.visibilityState==="hidden"&&(n&&(o=!0),z())}function z(){document.addEventListener("mousemove",G),document.addEventListener("mousedown",G),document.addEventListener("mouseup",G),document.addEventListener("pointermove",G),document.addEventListener("pointerdown",G),document.addEventListener("pointerup",G),document.addEventListener("touchmove",G),document.addEventListener("touchstart",G),document.addEventListener("touchend",G)}function K(){document.removeEventListener("mousemove",G),document.removeEventListener("mousedown",G),document.removeEventListener("mouseup",G),document.removeEventListener("pointermove",G),document.removeEventListener("pointerdown",G),document.removeEventListener("pointerup",G),document.removeEventListener("touchmove",G),document.removeEventListener("touchstart",G),document.removeEventListener("touchend",G)}function G(C){C.target.nodeName&&C.target.nodeName.toLowerCase()==="html"||(o=!1,K())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",b,!0),z(),r.addEventListener("focus",d,!0),r.addEventListener("blur",v,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var Vr=hr((Ot,Dr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Ot=="object"&&typeof Dr=="object"?Dr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Ot=="object"?Ot.ClipboardJS=r():t.ClipboardJS=r()})(Ot,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return wi}});var s=i(279),a=i.n(s),c=i(370),p=i.n(c),l=i(817),f=i.n(l);function u(W){try{return document.execCommand(W)}catch(O){return!1}}var d=function(O){var S=f()(O);return u("cut"),S},v=d;function b(W){var O=document.documentElement.getAttribute("dir")==="rtl",S=document.createElement("textarea");S.style.fontSize="12pt",S.style.border="0",S.style.padding="0",S.style.margin="0",S.style.position="absolute",S.style[O?"right":"left"]="-9999px";var $=window.pageYOffset||document.documentElement.scrollTop;return S.style.top="".concat($,"px"),S.setAttribute("readonly",""),S.value=W,S}var z=function(O,S){var $=b(O);S.container.appendChild($);var F=f()($);return u("copy"),$.remove(),F},K=function(O){var S=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},$="";return typeof O=="string"?$=z(O,S):O instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(O==null?void 0:O.type)?$=z(O.value,S):($=f()(O),u("copy")),$},G=K;function C(W){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?C=function(S){return typeof S}:C=function(S){return S&&typeof Symbol=="function"&&S.constructor===Symbol&&S!==Symbol.prototype?"symbol":typeof S},C(W)}var it=function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},S=O.action,$=S===void 0?"copy":S,F=O.container,Q=O.target,_e=O.text;if($!=="copy"&&$!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Q!==void 0)if(Q&&C(Q)==="object"&&Q.nodeType===1){if($==="copy"&&Q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if($==="cut"&&(Q.hasAttribute("readonly")||Q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(_e)return G(_e,{container:F});if(Q)return $==="cut"?v(Q):G(Q,{container:F})},Ue=it;function Pe(W){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Pe=function(S){return typeof S}:Pe=function(S){return S&&typeof Symbol=="function"&&S.constructor===Symbol&&S!==Symbol.prototype?"symbol":typeof S},Pe(W)}function di(W,O){if(!(W instanceof O))throw new TypeError("Cannot call a class as a function")}function Jr(W,O){for(var S=0;S0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof F.action=="function"?F.action:this.defaultAction,this.target=typeof F.target=="function"?F.target:this.defaultTarget,this.text=typeof F.text=="function"?F.text:this.defaultText,this.container=Pe(F.container)==="object"?F.container:document.body}},{key:"listenClick",value:function(F){var Q=this;this.listener=p()(F,"click",function(_e){return Q.onClick(_e)})}},{key:"onClick",value:function(F){var Q=F.delegateTarget||F.currentTarget,_e=this.action(Q)||"copy",Ct=Ue({action:_e,container:this.container,target:this.target(Q),text:this.text(Q)});this.emit(Ct?"success":"error",{action:_e,text:Ct,trigger:Q,clearSelection:function(){Q&&Q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(F){return fr("action",F)}},{key:"defaultTarget",value:function(F){var Q=fr("target",F);if(Q)return document.querySelector(Q)}},{key:"defaultText",value:function(F){return fr("text",F)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(F){var Q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return G(F,Q)}},{key:"cut",value:function(F){return v(F)}},{key:"isSupported",value:function(){var F=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Q=typeof F=="string"?[F]:F,_e=!!document.queryCommandSupported;return Q.forEach(function(Ct){_e=_e&&!!document.queryCommandSupported(Ct)}),_e}}]),S}(a()),wi=Ei},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,c){for(;a&&a.nodeType!==n;){if(typeof a.matches=="function"&&a.matches(c))return a;a=a.parentNode}}o.exports=s},438:function(o,n,i){var s=i(828);function a(l,f,u,d,v){var b=p.apply(this,arguments);return l.addEventListener(u,b,v),{destroy:function(){l.removeEventListener(u,b,v)}}}function c(l,f,u,d,v){return typeof l.addEventListener=="function"?a.apply(null,arguments):typeof u=="function"?a.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(b){return a(b,f,u,d,v)}))}function p(l,f,u,d){return function(v){v.delegateTarget=s(v.target,f),v.delegateTarget&&d.call(l,v)}}o.exports=c},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(o,n,i){var s=i(879),a=i(438);function c(u,d,v){if(!u&&!d&&!v)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(v))throw new TypeError("Third argument must be a Function");if(s.node(u))return p(u,d,v);if(s.nodeList(u))return l(u,d,v);if(s.string(u))return f(u,d,v);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function p(u,d,v){return u.addEventListener(d,v),{destroy:function(){u.removeEventListener(d,v)}}}function l(u,d,v){return Array.prototype.forEach.call(u,function(b){b.addEventListener(d,v)}),{destroy:function(){Array.prototype.forEach.call(u,function(b){b.removeEventListener(d,v)})}}}function f(u,d,v){return a(document.body,u,d,v)}o.exports=c},817:function(o){function n(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),p=document.createRange();p.selectNodeContents(i),c.removeAllRanges(),c.addRange(p),s=c.toString()}return s}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,s,a){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var c=this;function p(){c.off(i,p),s.apply(a,arguments)}return p._=s,this.on(i,p,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),c=0,p=a.length;for(c;c{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var $a=/["'&<>]/;Un.exports=Ra;function Ra(e){var t=""+e,r=$a.exec(t);if(!r)return t;var o,n="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(p[0]===6||p[0]===2)){r=0;continue}if(p[0]===3&&(!i||p[1]>i[0]&&p[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],s;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(a){s={error:a}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||a(u,d)})})}function a(u,d){try{c(o[u](d))}catch(v){f(i[0][3],v)}}function c(u){u.value instanceof Ze?Promise.resolve(u.value.v).then(p,l):f(i[0][2],u)}function p(u){a("next",u)}function l(u){a("throw",u)}function f(u,d){u(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function ao(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof we=="function"?we(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(s){return new Promise(function(a,c){s=e[i](s),n(a,c,s.done,s.value)})}}function n(i,s,a,c){Promise.resolve(c).then(function(p){i({value:p,done:a})},s)}}function k(e){return typeof e=="function"}function at(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var Rt=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function De(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=we(s),c=a.next();!c.done;c=a.next()){var p=c.value;p.remove(this)}}catch(b){t={error:b}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(b){i=b instanceof Rt?b.errors:[b]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=we(f),d=u.next();!d.done;d=u.next()){var v=d.value;try{so(v)}catch(b){i=i!=null?i:[],b instanceof Rt?i=D(D([],N(i)),N(b.errors)):i.push(b)}}}catch(b){o={error:b}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new Rt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)so(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&De(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&De(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var gr=Ie.EMPTY;function Pt(e){return e instanceof Ie||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function so(e){k(e)?e():e.unsubscribe()}var Ae={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,s=n.isStopped,a=n.observers;return i||s?gr:(this.currentObservers=null,a.push(r),new Ie(function(){o.currentObservers=null,De(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,s=o.isStopped;n?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new P;return r.source=this,r},t.create=function(r,o){return new bo(r,o)},t}(P);var bo=function(e){ie(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:gr},t}(x);var yt={now:function(){return(yt.delegate||Date).now()},delegate:void 0};var Et=function(e){ie(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=yt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,s=o._infiniteTimeWindow,a=o._timestampProvider,c=o._windowTime;n||(i.push(r),!s&&i.push(a.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,s=n._buffer,a=s.slice(),c=0;c0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=lt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var s=r.actions;o!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==o&&(lt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(jt);var xo=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(Wt);var Oe=new xo(go);var L=new P(function(e){return e.complete()});function Nt(e){return e&&k(e.schedule)}function Or(e){return e[e.length-1]}function Qe(e){return k(Or(e))?e.pop():void 0}function Me(e){return Nt(Or(e))?e.pop():void 0}function Ut(e,t){return typeof Or(e)=="number"?e.pop():t}var mt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Dt(e){return k(e==null?void 0:e.then)}function Vt(e){return k(e[pt])}function zt(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function qt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Ii(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Kt=Ii();function Qt(e){return k(e==null?void 0:e[Kt])}function Yt(e){return io(this,arguments,function(){var r,o,n,i;return $t(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,Ze(r.read())];case 3:return o=s.sent(),n=o.value,i=o.done,i?[4,Ze(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,Ze(n)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Bt(e){return k(e==null?void 0:e.getReader)}function I(e){if(e instanceof P)return e;if(e!=null){if(Vt(e))return Fi(e);if(mt(e))return ji(e);if(Dt(e))return Wi(e);if(zt(e))return yo(e);if(Qt(e))return Ni(e);if(Bt(e))return Ui(e)}throw qt(e)}function Fi(e){return new P(function(t){var r=e[pt]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function ji(e){return new P(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?M(function(n,i){return e(n,i,o)}):ue,xe(1),r?He(t):Fo(function(){return new Jt}))}}function jo(){for(var e=[],t=0;t=2,!0))}function le(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(p){var l,f,u,d=0,v=!1,b=!1,z=function(){f==null||f.unsubscribe(),f=void 0},K=function(){z(),l=u=void 0,v=b=!1},G=function(){var C=l;K(),C==null||C.unsubscribe()};return g(function(C,it){d++,!b&&!v&&z();var Ue=u=u!=null?u:r();it.add(function(){d--,d===0&&!b&&!v&&(f=Hr(G,c))}),Ue.subscribe(it),!l&&d>0&&(l=new tt({next:function(Pe){return Ue.next(Pe)},error:function(Pe){b=!0,z(),f=Hr(K,n,Pe),Ue.error(Pe)},complete:function(){v=!0,z(),f=Hr(K,s),Ue.complete()}}),I(C).subscribe(l))})(p)}}function Hr(e,t){for(var r=[],o=2;oe.next(document)),e}function q(e,t=document){return Array.from(t.querySelectorAll(e))}function U(e,t=document){let r=se(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function se(e,t=document){return t.querySelector(e)||void 0}function Re(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}var ia=_(h(document.body,"focusin"),h(document.body,"focusout")).pipe(ke(1),V(void 0),m(()=>Re()||document.body),J(1));function Zt(e){return ia.pipe(m(t=>e.contains(t)),X())}function Je(e){return{x:e.offsetLeft,y:e.offsetTop}}function Do(e){return _(h(window,"load"),h(window,"resize")).pipe(Ce(0,Oe),m(()=>Je(e)),V(Je(e)))}function er(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return _(h(e,"scroll"),h(window,"resize")).pipe(Ce(0,Oe),m(()=>er(e)),V(er(e)))}function Vo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Vo(e,r)}function T(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Vo(o,n);return o}function tr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function ht(e){let t=T("script",{src:e});return H(()=>(document.head.appendChild(t),_(h(t,"load"),h(t,"error").pipe(E(()=>Mr(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),A(()=>document.head.removeChild(t)),xe(1))))}var zo=new x,aa=H(()=>typeof ResizeObserver=="undefined"?ht("https://unpkg.com/resize-observer-polyfill"):j(void 0)).pipe(m(()=>new ResizeObserver(e=>{for(let t of e)zo.next(t)})),E(e=>_(Ve,j(e)).pipe(A(()=>e.disconnect()))),J(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return aa.pipe(w(t=>t.observe(e)),E(t=>zo.pipe(M(({target:r})=>r===e),A(()=>t.unobserve(e)),m(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function qo(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var Ko=new x,sa=H(()=>j(new IntersectionObserver(e=>{for(let t of e)Ko.next(t)},{threshold:0}))).pipe(E(e=>_(Ve,j(e)).pipe(A(()=>e.disconnect()))),J(1));function rr(e){return sa.pipe(w(t=>t.observe(e)),E(t=>Ko.pipe(M(({target:r})=>r===e),A(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function Qo(e,t=16){return dt(e).pipe(m(({y:r})=>{let o=he(e),n=bt(e);return r>=n.height-o.height-t}),X())}var or={drawer:U("[data-md-toggle=drawer]"),search:U("[data-md-toggle=search]")};function Yo(e){return or[e].checked}function Ke(e,t){or[e].checked!==t&&or[e].click()}function We(e){let t=or[e];return h(t,"change").pipe(m(()=>t.checked),V(t.checked))}function ca(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function pa(){return _(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(V(!1))}function Bo(){let e=h(window,"keydown").pipe(M(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:Yo("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),M(({mode:t,type:r})=>{if(t==="global"){let o=Re();if(typeof o!="undefined")return!ca(o,r)}return!0}),le());return pa().pipe(E(t=>t?L:e))}function pe(){return new URL(location.href)}function ot(e,t=!1){if(te("navigation.instant")&&!t){let r=T("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function Go(){return new x}function Jo(){return location.hash.slice(1)}function nr(e){let t=T("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function la(e){return _(h(window,"hashchange"),e).pipe(m(Jo),V(Jo()),M(t=>t.length>0),J(1))}function Xo(e){return la(e).pipe(m(t=>se(`[id="${t}"]`)),M(t=>typeof t!="undefined"))}function Fr(e){let t=matchMedia(e);return Xt(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function Zo(){let e=matchMedia("print");return _(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(V(e.matches))}function jr(e,t){return e.pipe(E(r=>r?t():L))}function ir(e,t){return new P(r=>{let o=new XMLHttpRequest;o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network Error"))}),o.addEventListener("abort",()=>{r.error(new Error("Request aborted"))}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let i=Number(o.getResponseHeader("Content-Length"))||0;t.progress$.next(n.loaded/i*100)}}),t.progress$.next(5)),o.send()})}function Ne(e,t){return ir(e,t).pipe(E(r=>r.text()),m(r=>JSON.parse(r)),J(1))}function en(e,t){let r=new DOMParser;return ir(e,t).pipe(E(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),J(1))}function tn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function rn(){return _(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(tn),V(tn()))}function on(){return{width:innerWidth,height:innerHeight}}function nn(){return h(window,"resize",{passive:!0}).pipe(m(on),V(on()))}function an(){return B([rn(),nn()]).pipe(m(([e,t])=>({offset:e,size:t})),J(1))}function ar(e,{viewport$:t,header$:r}){let o=t.pipe(ee("size")),n=B([o,r]).pipe(m(()=>Je(e)));return B([r,t,n]).pipe(m(([{height:i},{offset:s,size:a},{x:c,y:p}])=>({offset:{x:s.x-c,y:s.y-p+i},size:a})))}function ma(e){return h(e,"message",t=>t.data)}function fa(e){let t=new x;return t.subscribe(r=>e.postMessage(r)),t}function sn(e,t=new Worker(e)){let r=ma(t),o=fa(t),n=new x;n.subscribe(o);let i=o.pipe(Z(),re(!0));return n.pipe(Z(),qe(r.pipe(Y(i))),le())}var ua=U("#__config"),vt=JSON.parse(ua.textContent);vt.base=`${new URL(vt.base,pe())}`;function me(){return vt}function te(e){return vt.features.includes(e)}function be(e,t){return typeof t!="undefined"?vt.translations[e].replace("#",t.toString()):vt.translations[e]}function Ee(e,t=document){return U(`[data-md-component=${e}]`,t)}function oe(e,t=document){return q(`[data-md-component=${e}]`,t)}function da(e){let t=U(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>U(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function cn(e){if(!te("announce.dismiss")||!e.childElementCount)return L;if(!e.hidden){let t=U(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return H(()=>{let t=new x;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),da(e).pipe(w(r=>t.next(r)),A(()=>t.complete()),m(r=>R({ref:e},r)))})}function ha(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function pn(e,t){let r=new x;return r.subscribe(({hidden:o})=>{e.hidden=o}),ha(e,t).pipe(w(o=>r.next(o)),A(()=>r.complete()),m(o=>R({ref:e},o)))}function ba(e,t){let r=H(()=>B([Do(e),dt(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:s,height:a}=he(e);return{x:o-i.x+s/2,y:n-i.y+a/2}}));return Zt(e).pipe(E(o=>r.pipe(m(n=>({active:o,offset:n})),xe(+!o||1/0))))}function ln(e,t,{target$:r}){let[o,n]=Array.from(e.children);return H(()=>{let i=new x,s=i.pipe(Z(),re(!0));return i.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),rr(e).pipe(Y(s)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),_(i.pipe(M(({active:a})=>a)),i.pipe(ke(250),M(({active:a})=>!a))).subscribe({next({active:a}){a?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Ce(16,Oe)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(Pr(125,Oe),M(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(Y(s),M(a=>!(a.metaKey||a.ctrlKey))).subscribe(a=>{a.stopPropagation(),a.preventDefault()}),h(n,"mousedown").pipe(Y(s),ne(i)).subscribe(([a,{active:c}])=>{var p;if(a.button!==0||a.metaKey||a.ctrlKey)a.preventDefault();else if(c){a.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(p=Re())==null||p.blur()}}),r.pipe(Y(s),M(a=>a===o),ze(125)).subscribe(()=>e.focus()),ba(e,t).pipe(w(a=>i.next(a)),A(()=>i.complete()),m(a=>R({ref:e},a)))})}function Wr(e){return T("div",{class:"md-tooltip",id:e},T("div",{class:"md-tooltip__inner md-typeset"}))}function mn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return T("aside",{class:"md-annotation",tabIndex:0},Wr(t),T("a",{href:r,class:"md-annotation__index",tabIndex:-1},T("span",{"data-md-annotation-id":e})))}else return T("aside",{class:"md-annotation",tabIndex:0},Wr(t),T("span",{class:"md-annotation__index",tabIndex:-1},T("span",{"data-md-annotation-id":e})))}function fn(e){return T("button",{class:"md-clipboard md-icon",title:be("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function Nr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,T("del",null,p)," "],[]).slice(0,-1),i=me(),s=new URL(e.location,i.base);te("search.highlight")&&s.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:a}=me();return T("a",{href:`${s}`,class:"md-search-result__link",tabIndex:-1},T("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&T("div",{class:"md-search-result__icon md-icon"}),r>0&&T("h1",null,e.title),r<=0&&T("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(c=>{let p=a?c in a?`md-tag-icon md-tag--${a[c]}`:"md-tag-icon":"";return T("span",{class:`md-tag ${p}`},c)}),o>0&&n.length>0&&T("p",{class:"md-search-result__terms"},be("search.result.term.missing"),": ",...n)))}function un(e){let t=e[0].score,r=[...e],o=me(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),s=r.findIndex(l=>l.scoreNr(l,1)),...c.length?[T("details",{class:"md-search-result__more"},T("summary",{tabIndex:-1},T("div",null,c.length>0&&c.length===1?be("search.result.more.one"):be("search.result.more.other",c.length))),...c.map(l=>Nr(l,1)))]:[]];return T("li",{class:"md-search-result__item"},p)}function dn(e){return T("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>T("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?tr(r):r)))}function Ur(e){let t=`tabbed-control tabbed-control--${e}`;return T("div",{class:t,hidden:!0},T("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function hn(e){return T("div",{class:"md-typeset__scrollwrap"},T("div",{class:"md-typeset__table"},e))}function va(e){let t=me(),r=new URL(`../${e.version}/`,t.base);return T("li",{class:"md-version__item"},T("a",{href:`${r}`,class:"md-version__link"},e.title))}function bn(e,t){return T("div",{class:"md-version"},T("button",{class:"md-version__current","aria-label":be("select.version")},t.title),T("ul",{class:"md-version__list"},e.map(va)))}function ga(e){return e.tagName==="CODE"?q(".c, .c1, .cm",e):[e]}function xa(e){let t=[];for(let r of ga(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let s;for(;s=/(\(\d+\))(!)?/.exec(i.textContent);){let[,a,c]=s;if(typeof c=="undefined"){let p=i.splitText(s.index);i=p.splitText(a.length),t.push(p)}else{i.textContent=a,t.push(i);break}}}}return t}function vn(e,t){t.append(...Array.from(e.childNodes))}function sr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,s=new Map;for(let a of xa(t)){let[,c]=a.textContent.match(/\((\d+)\)/);se(`:scope > li:nth-child(${c})`,e)&&(s.set(c,mn(c,i)),a.replaceWith(s.get(c)))}return s.size===0?L:H(()=>{let a=new x,c=a.pipe(Z(),re(!0)),p=[];for(let[l,f]of s)p.push([U(".md-typeset",f),U(`:scope > li:nth-child(${l})`,e)]);return o.pipe(Y(c)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of p)l?vn(f,u):vn(u,f)}),_(...[...s].map(([,l])=>ln(l,t,{target$:r}))).pipe(A(()=>a.complete()),le())})}function gn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return gn(t)}}function xn(e,t){return H(()=>{let r=gn(e);return typeof r!="undefined"?sr(r,e,t):L})}var En=Ht(Vr());var ya=0;function wn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return wn(t)}}function yn(e){return ye(e).pipe(m(({width:t})=>({scrollable:bt(e).width>t})),ee("scrollable"))}function Sn(e,t){let{matches:r}=matchMedia("(hover)"),o=H(()=>{let n=new x;if(n.subscribe(({scrollable:s})=>{s&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")}),En.default.isSupported()&&(e.closest(".copy")||te("content.code.copy")&&!e.closest(".no-copy"))){let s=e.closest("pre");s.id=`__code_${ya++}`,s.insertBefore(fn(s.id),e)}let i=e.closest(".highlight");if(i instanceof HTMLElement){let s=wn(i);if(typeof s!="undefined"&&(i.classList.contains("annotate")||te("content.code.annotate"))){let a=sr(s,e,t);return yn(e).pipe(w(c=>n.next(c)),A(()=>n.complete()),m(c=>R({ref:e},c)),qe(ye(i).pipe(m(({width:c,height:p})=>c&&p),X(),E(c=>c?a:L))))}}return yn(e).pipe(w(s=>n.next(s)),A(()=>n.complete()),m(s=>R({ref:e},s)))});return te("content.lazy")?rr(e).pipe(M(n=>n),xe(1),E(()=>o)):o}function Ea(e,{target$:t,print$:r}){let o=!0;return _(t.pipe(m(n=>n.closest("details:not([open])")),M(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(M(n=>n||!o),w(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Tn(e,t){return H(()=>{let r=new x;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Ea(e,t).pipe(w(o=>r.next(o)),A(()=>r.complete()),m(o=>R({ref:e},o)))})}var On=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var zr,Sa=0;function Ta(){return typeof mermaid=="undefined"||mermaid instanceof Element?ht("https://unpkg.com/mermaid@10.6.1/dist/mermaid.min.js"):j(void 0)}function Mn(e){return e.classList.remove("mermaid"),zr||(zr=Ta().pipe(w(()=>mermaid.initialize({startOnLoad:!1,themeCSS:On,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),J(1))),zr.subscribe(()=>to(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Sa++}`,r=T("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),s=r.attachShadow({mode:"closed"});s.innerHTML=n,e.replaceWith(r),i==null||i(s)})),zr.pipe(m(()=>({ref:e})))}var Ln=T("table");function _n(e){return e.replaceWith(Ln),Ln.replaceWith(hn(e)),j({ref:e})}function Oa(e){let t=q(":scope > input",e),r=t.find(o=>o.checked)||t[0];return _(...t.map(o=>h(o,"change").pipe(m(()=>U(`label[for="${o.id}"]`))))).pipe(V(U(`label[for="${r.id}"]`)),m(o=>({active:o})))}function An(e,{viewport$:t}){let r=Ur("prev");e.append(r);let o=Ur("next");e.append(o);let n=U(".tabbed-labels",e);return H(()=>{let i=new x,s=i.pipe(Z(),re(!0));return B([i,ye(e)]).pipe(Ce(1,Oe),Y(s)).subscribe({next([{active:a},c]){let p=Je(a),{width:l}=he(a);e.style.setProperty("--md-indicator-x",`${p.x}px`),e.style.setProperty("--md-indicator-width",`${l}px`);let f=er(n);(p.xf.x+c.width)&&n.scrollTo({left:Math.max(0,p.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),B([dt(n),ye(n)]).pipe(Y(s)).subscribe(([a,c])=>{let p=bt(n);r.hidden=a.x<16,o.hidden=a.x>p.width-c.width-16}),_(h(r,"click").pipe(m(()=>-1)),h(o,"click").pipe(m(()=>1))).pipe(Y(s)).subscribe(a=>{let{width:c}=he(n);n.scrollBy({left:c*a,behavior:"smooth"})}),te("content.tabs.link")&&i.pipe(je(1),ne(t)).subscribe(([{active:a},{offset:c}])=>{let p=a.innerText.trim();if(a.hasAttribute("data-md-switching"))a.removeAttribute("data-md-switching");else{let l=e.offsetTop-c.y;for(let u of q("[data-tabs]"))for(let d of q(":scope > input",u)){let v=U(`label[for="${d.id}"]`);if(v!==a&&v.innerText.trim()===p){v.setAttribute("data-md-switching",""),d.click();break}}window.scrollTo({top:e.offsetTop-l});let f=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([p,...f])])}}),i.pipe(Y(s)).subscribe(()=>{for(let a of q("audio, video",e))a.pause()}),Oa(e).pipe(w(a=>i.next(a)),A(()=>i.complete()),m(a=>R({ref:e},a)))}).pipe(rt(ae))}function Cn(e,{viewport$:t,target$:r,print$:o}){return _(...q(".annotate:not(.highlight)",e).map(n=>xn(n,{target$:r,print$:o})),...q("pre:not(.mermaid) > code",e).map(n=>Sn(n,{target$:r,print$:o})),...q("pre.mermaid",e).map(n=>Mn(n)),...q("table:not([class])",e).map(n=>_n(n)),...q("details",e).map(n=>Tn(n,{target$:r,print$:o})),...q("[data-tabs]",e).map(n=>An(n,{viewport$:t})))}function Ma(e,{alert$:t}){return t.pipe(E(r=>_(j(!0),j(!1).pipe(ze(2e3))).pipe(m(o=>({message:r,active:o})))))}function kn(e,t){let r=U(".md-typeset",e);return H(()=>{let o=new x;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Ma(e,t).pipe(w(n=>o.next(n)),A(()=>o.complete()),m(n=>R({ref:e},n)))})}function La({viewport$:e}){if(!te("header.autohide"))return j(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Le(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),X()),o=We("search");return B([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),X(),E(n=>n?r:j(!1)),V(!1))}function Hn(e,t){return H(()=>B([ye(e),La(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),X((r,o)=>r.height===o.height&&r.hidden===o.hidden),J(1))}function $n(e,{header$:t,main$:r}){return H(()=>{let o=new x,n=o.pipe(Z(),re(!0));return o.pipe(ee("active"),Ge(t)).subscribe(([{active:i},{hidden:s}])=>{e.classList.toggle("md-header--shadow",i&&!s),e.hidden=s}),r.subscribe(o),t.pipe(Y(n),m(i=>R({ref:e},i)))})}function _a(e,{viewport$:t,header$:r}){return ar(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=he(e);return{active:o>=n}}),ee("active"))}function Rn(e,t){return H(()=>{let r=new x;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=se(".md-content h1");return typeof o=="undefined"?L:_a(o,t).pipe(w(n=>r.next(n)),A(()=>r.complete()),m(n=>R({ref:e},n)))})}function Pn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),X()),n=o.pipe(E(()=>ye(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ee("bottom"))));return B([o,n,t]).pipe(m(([i,{top:s,bottom:a},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,s-c,i)-Math.max(0,p+c-a)),{offset:s-i,height:p,active:s-i<=c})),X((i,s)=>i.offset===s.offset&&i.height===s.height&&i.active===s.active))}function Aa(e){let t=__md_get("__palette")||{index:e.findIndex(r=>matchMedia(r.getAttribute("data-md-color-media")).matches)};return j(...e).pipe(ce(r=>h(r,"change").pipe(m(()=>r))),V(e[Math.max(0,t.index)]),m(r=>({index:e.indexOf(r),color:{scheme:r.getAttribute("data-md-color-scheme"),primary:r.getAttribute("data-md-color-primary"),accent:r.getAttribute("data-md-color-accent")}})),J(1))}function In(e){let t=T("meta",{name:"theme-color"});document.head.appendChild(t);let r=T("meta",{name:"color-scheme"});return document.head.appendChild(r),H(()=>{let o=new x;o.subscribe(i=>{document.body.setAttribute("data-md-color-switching","");for(let[s,a]of Object.entries(i.color))document.body.setAttribute(`data-md-color-${s}`,a);for(let s=0;s{let i=Ee("header"),s=window.getComputedStyle(i);return r.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(a=>(+a).toString(16).padStart(2,"0")).join("")})).subscribe(i=>t.content=`#${i}`),o.pipe(Se(ae)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")});let n=q("input",e);return Aa(n).pipe(w(i=>o.next(i)),A(()=>o.complete()),m(i=>R({ref:e},i)))})}function Fn(e,{progress$:t}){return H(()=>{let r=new x;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(w(o=>r.next({value:o})),A(()=>r.complete()),m(o=>({ref:e,value:o})))})}var qr=Ht(Vr());function Ca(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function jn({alert$:e}){qr.default.isSupported()&&new P(t=>{new qr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Ca(U(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(w(t=>{t.trigger.focus()}),m(()=>be("clipboard.copied"))).subscribe(e)}function ka(e){if(e.length<2)return[""];let[t,r]=[...e].sort((n,i)=>n.length-i.length).map(n=>n.replace(/[^/]+$/,"")),o=0;if(t===r)o=t.length;else for(;t.charCodeAt(o)===r.charCodeAt(o);)o++;return e.map(n=>n.replace(t.slice(0,o),""))}function cr(e){let t=__md_get("__sitemap",sessionStorage,e);if(t)return j(t);{let r=me();return en(new URL("sitemap.xml",e||r.base)).pipe(m(o=>ka(q("loc",o).map(n=>n.textContent))),de(()=>L),He([]),w(o=>__md_set("__sitemap",o,sessionStorage,e)))}}function Wn(e){let t=se("[rel=canonical]",e);typeof t!="undefined"&&(t.href=t.href.replace("//localhost:","//127.0.0.1:"));let r=new Map;for(let o of q(":scope > *",e)){let n=o.outerHTML;for(let i of["href","src"]){let s=o.getAttribute(i);if(s===null)continue;let a=new URL(s,t==null?void 0:t.href),c=o.cloneNode();c.setAttribute(i,`${a}`),n=c.outerHTML;break}r.set(n,o)}return r}function Nn({location$:e,viewport$:t,progress$:r}){let o=me();if(location.protocol==="file:")return L;let n=cr().pipe(m(l=>l.map(f=>`${new URL(f,o.base)}`))),i=h(document.body,"click").pipe(ne(n),E(([l,f])=>{if(!(l.target instanceof Element))return L;let u=l.target.closest("a");if(u===null)return L;if(u.target||l.metaKey||l.ctrlKey)return L;let d=new URL(u.href);return d.search=d.hash="",f.includes(`${d}`)?(l.preventDefault(),j(new URL(u.href))):L}),le());i.pipe(xe(1)).subscribe(()=>{let l=se("link[rel=icon]");typeof l!="undefined"&&(l.href=l.href)}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),i.pipe(ne(t)).subscribe(([l,{offset:f}])=>{history.scrollRestoration="manual",history.replaceState(f,""),history.pushState(null,"",l)}),i.subscribe(e);let s=e.pipe(V(pe()),ee("pathname"),je(1),E(l=>ir(l,{progress$:r}).pipe(de(()=>(ot(l,!0),L))))),a=new DOMParser,c=s.pipe(E(l=>l.text()),E(l=>{let f=a.parseFromString(l,"text/html");for(let b of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...te("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let z=se(b),K=se(b,f);typeof z!="undefined"&&typeof K!="undefined"&&z.replaceWith(K)}let u=Wn(document.head),d=Wn(f.head);for(let[b,z]of d)z.getAttribute("rel")==="stylesheet"||z.hasAttribute("src")||(u.has(b)?u.delete(b):document.head.appendChild(z));for(let b of u.values())b.getAttribute("rel")==="stylesheet"||b.hasAttribute("src")||b.remove();let v=Ee("container");return Fe(q("script",v)).pipe(E(b=>{let z=f.createElement("script");if(b.src){for(let K of b.getAttributeNames())z.setAttribute(K,b.getAttribute(K));return b.replaceWith(z),new P(K=>{z.onload=()=>K.complete()})}else return z.textContent=b.textContent,b.replaceWith(z),L}),Z(),re(f))}),le());return h(window,"popstate").pipe(m(pe)).subscribe(e),e.pipe(V(pe()),Le(2,1),M(([l,f])=>l.pathname===f.pathname&&l.hash!==f.hash),m(([,l])=>l)).subscribe(l=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):(history.scrollRestoration="auto",nr(l.hash),history.scrollRestoration="manual")}),e.pipe(Cr(i),V(pe()),Le(2,1),M(([l,f])=>l.pathname===f.pathname&&l.hash===f.hash),m(([,l])=>l)).subscribe(l=>{history.scrollRestoration="auto",nr(l.hash),history.scrollRestoration="manual",history.back()}),c.pipe(ne(e)).subscribe(([,l])=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):nr(l.hash)}),t.pipe(ee("offset"),ke(100)).subscribe(({offset:l})=>{history.replaceState(l,"")}),c}var Vn=Ht(Dn());function zn(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,s)=>`${i}${s}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return s=>(0,Vn.default)(s).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function Mt(e){return e.type===1}function pr(e){return e.type===3}function qn(e,t){let r=sn(e);return _(j(location.protocol!=="file:"),We("search")).pipe($e(o=>o),E(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:te("search.suggest")}}})),r}function Kn({document$:e}){let t=me(),r=Ne(new URL("../versions.json",t.base)).pipe(de(()=>L)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:s,aliases:a})=>s===i||a.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),E(n=>h(document.body,"click").pipe(M(i=>!i.metaKey&&!i.ctrlKey),ne(o),E(([i,s])=>{if(i.target instanceof Element){let a=i.target.closest("a");if(a&&!a.target&&n.has(a.href)){let c=a.href;return!i.target.closest(".md-version")&&n.get(c)===s?L:(i.preventDefault(),j(c))}}return L}),E(i=>{let{version:s}=n.get(i);return cr(new URL(i)).pipe(m(a=>{let p=pe().href.replace(t.base,"");return a.includes(p.split("#")[0])?new URL(`../${s}/${p}`,t.base):new URL(i)}))})))).subscribe(n=>ot(n,!0)),B([r,o]).subscribe(([n,i])=>{U(".md-header__topic").appendChild(bn(n,i))}),e.pipe(E(()=>o)).subscribe(n=>{var s;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let a=((s=t.version)==null?void 0:s.default)||"latest";Array.isArray(a)||(a=[a]);e:for(let c of a)for(let p of n.aliases.concat(n.version))if(new RegExp(c,"i").test(p)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let a of oe("outdated"))a.hidden=!1})}function Ia(e,{worker$:t}){let{searchParams:r}=pe();r.has("q")&&(Ke("search",!0),e.value=r.get("q"),e.focus(),We("search").pipe($e(i=>!i)).subscribe(()=>{let i=pe();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=Zt(e),n=_(t.pipe($e(Mt)),h(e,"keyup"),o).pipe(m(()=>e.value),X());return B([n,o]).pipe(m(([i,s])=>({value:i,focus:s})),J(1))}function Qn(e,{worker$:t}){let r=new x,o=r.pipe(Z(),re(!0));B([t.pipe($e(Mt)),r],(i,s)=>s).pipe(ee("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ee("focus")).subscribe(({focus:i})=>{i&&Ke("search",i)}),h(e.form,"reset").pipe(Y(o)).subscribe(()=>e.focus());let n=U("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),Ia(e,{worker$:t}).pipe(w(i=>r.next(i)),A(()=>r.complete()),m(i=>R({ref:e},i)),J(1))}function Yn(e,{worker$:t,query$:r}){let o=new x,n=Qo(e.parentElement).pipe(M(Boolean)),i=e.parentElement,s=U(":scope > :first-child",e),a=U(":scope > :last-child",e);We("search").subscribe(l=>a.setAttribute("role",l?"list":"presentation")),o.pipe(ne(r),$r(t.pipe($e(Mt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:s.textContent=f.length?be("search.result.none"):be("search.result.placeholder");break;case 1:s.textContent=be("search.result.one");break;default:let u=tr(l.length);s.textContent=be("search.result.other",u)}});let c=o.pipe(w(()=>a.innerHTML=""),E(({items:l})=>_(j(...l.slice(0,10)),j(...l.slice(10)).pipe(Le(4),Ir(n),E(([f])=>f)))),m(un),le());return c.subscribe(l=>a.appendChild(l)),c.pipe(ce(l=>{let f=se("details",l);return typeof f=="undefined"?L:h(f,"toggle").pipe(Y(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(M(pr),m(({data:l})=>l)).pipe(w(l=>o.next(l)),A(()=>o.complete()),m(l=>R({ref:e},l)))}function Fa(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=pe();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function Bn(e,t){let r=new x,o=r.pipe(Z(),re(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(Y(o)).subscribe(n=>n.preventDefault()),Fa(e,t).pipe(w(n=>r.next(n)),A(()=>r.complete()),m(n=>R({ref:e},n)))}function Gn(e,{worker$:t,keyboard$:r}){let o=new x,n=Ee("search-query"),i=_(h(n,"keydown"),h(n,"focus")).pipe(Se(ae),m(()=>n.value),X());return o.pipe(Ge(i),m(([{suggest:a},c])=>{let p=c.split(/([\s-]+)/);if(a!=null&&a.length&&p[p.length-1]){let l=a[a.length-1];l.startsWith(p[p.length-1])&&(p[p.length-1]=l)}else p.length=0;return p})).subscribe(a=>e.innerHTML=a.join("").replace(/\s/g," ")),r.pipe(M(({mode:a})=>a==="search")).subscribe(a=>{switch(a.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(M(pr),m(({data:a})=>a)).pipe(w(a=>o.next(a)),A(()=>o.complete()),m(()=>({ref:e})))}function Jn(e,{index$:t,keyboard$:r}){let o=me();try{let n=qn(o.search,t),i=Ee("search-query",e),s=Ee("search-result",e);h(e,"click").pipe(M(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>Ke("search",!1)),r.pipe(M(({mode:c})=>c==="search")).subscribe(c=>{let p=Re();switch(c.type){case"Enter":if(p===i){let l=new Map;for(let f of q(":first-child [href]",s)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}c.claim()}break;case"Escape":case"Tab":Ke("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let l=[i,...q(":not(details) > [href], summary, details[open] [href]",s)],f=Math.max(0,(Math.max(0,l.indexOf(p))+l.length+(c.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}c.claim();break;default:i!==Re()&&i.focus()}}),r.pipe(M(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let a=Qn(i,{worker$:n});return _(a,Yn(s,{worker$:n,query$:a})).pipe(qe(...oe("search-share",e).map(c=>Bn(c,{query$:a})),...oe("search-suggest",e).map(c=>Gn(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ve}}function Xn(e,{index$:t,location$:r}){return B([t,r.pipe(V(pe()),M(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>zn(o.config)(n.searchParams.get("h"))),m(o=>{var s;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let a=i.nextNode();a;a=i.nextNode())if((s=a.parentElement)!=null&&s.offsetHeight){let c=a.textContent,p=o(c);p.length>c.length&&n.set(a,p)}for(let[a,c]of n){let{childNodes:p}=T("span",null,c);a.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function ja(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return B([r,t]).pipe(m(([{offset:i,height:s},{offset:{y:a}}])=>(s=s+Math.min(n,Math.max(0,a-i))-n,{height:s,locked:a>=i+n})),X((i,s)=>i.height===s.height&&i.locked===s.locked))}function Kr(e,o){var n=o,{header$:t}=n,r=eo(n,["header$"]);let i=U(".md-sidebar__scrollwrap",e),{y:s}=Je(i);return H(()=>{let a=new x,c=a.pipe(Z(),re(!0)),p=a.pipe(Ce(0,Oe));return p.pipe(ne(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*s}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe($e()).subscribe(()=>{for(let l of q(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=he(f);f.scrollTo({top:u-d/2})}}}),ge(q("label[tabindex]",e)).pipe(ce(l=>h(l,"click").pipe(Se(ae),m(()=>l),Y(c)))).subscribe(l=>{let f=U(`[id="${l.htmlFor}"]`);U(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),ja(e,r).pipe(w(l=>a.next(l)),A(()=>a.complete()),m(l=>R({ref:e},l)))})}function Zn(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return St(Ne(`${r}/releases/latest`).pipe(de(()=>L),m(o=>({version:o.tag_name})),He({})),Ne(r).pipe(de(()=>L),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),He({}))).pipe(m(([o,n])=>R(R({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ne(r).pipe(m(o=>({repositories:o.public_repos})),He({}))}}function ei(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ne(r).pipe(de(()=>L),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),He({}))}function ti(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return Zn(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ei(r,o)}return L}var Wa;function Na(e){return Wa||(Wa=H(()=>{let t=__md_get("__source",sessionStorage);if(t)return j(t);if(oe("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return L}return ti(e.href).pipe(w(o=>__md_set("__source",o,sessionStorage)))}).pipe(de(()=>L),M(t=>Object.keys(t).length>0),m(t=>({facts:t})),J(1)))}function ri(e){let t=U(":scope > :last-child",e);return H(()=>{let r=new x;return r.subscribe(({facts:o})=>{t.appendChild(dn(o)),t.classList.add("md-source__repository--active")}),Na(e).pipe(w(o=>r.next(o)),A(()=>r.complete()),m(o=>R({ref:e},o)))})}function Ua(e,{viewport$:t,header$:r}){return ye(document.body).pipe(E(()=>ar(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ee("hidden"))}function oi(e,t){return H(()=>{let r=new x;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(te("navigation.tabs.sticky")?j({hidden:!1}):Ua(e,t)).pipe(w(o=>r.next(o)),A(()=>r.complete()),m(o=>R({ref:e},o)))})}function Da(e,{viewport$:t,header$:r}){let o=new Map,n=q("[href^=\\#]",e);for(let a of n){let c=decodeURIComponent(a.hash.substring(1)),p=se(`[id="${c}"]`);typeof p!="undefined"&&o.set(a,p)}let i=r.pipe(ee("height"),m(({height:a})=>{let c=Ee("main"),p=U(":scope > :first-child",c);return a+.8*(p.offsetTop-c.offsetTop)}),le());return ye(document.body).pipe(ee("height"),E(a=>H(()=>{let c=[];return j([...o].reduce((p,[l,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return p.set([...c=[...c,l]].reverse(),u)},new Map))}).pipe(m(c=>new Map([...c].sort(([,p],[,l])=>p-l))),Ge(i),E(([c,p])=>t.pipe(kr(([l,f],{offset:{y:u},size:d})=>{let v=u+d.height>=Math.floor(a.height);for(;f.length;){let[,b]=f[0];if(b-p=u&&!v)f=[l.pop(),...f];else break}return[l,f]},[[],[...c]]),X((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([a,c])=>({prev:a.map(([p])=>p),next:c.map(([p])=>p)})),V({prev:[],next:[]}),Le(2,1),m(([a,c])=>a.prev.length{let i=new x,s=i.pipe(Z(),re(!0));if(i.subscribe(({prev:a,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[l]]of a.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",p===a.length-1)}),te("toc.follow")){let a=_(t.pipe(ke(1),m(()=>{})),t.pipe(ke(250),m(()=>"smooth")));i.pipe(M(({prev:c})=>c.length>0),Ge(o.pipe(Se(ae))),ne(a)).subscribe(([[{prev:c}],p])=>{let[l]=c[c.length-1];if(l.offsetHeight){let f=qo(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=he(f);f.scrollTo({top:u-d/2,behavior:p})}}})}return te("navigation.tracking")&&t.pipe(Y(s),ee("offset"),ke(250),je(1),Y(n.pipe(je(1))),Tt({delay:250}),ne(i)).subscribe(([,{prev:a}])=>{let c=pe(),p=a[a.length-1];if(p&&p.length){let[l]=p,{hash:f}=new URL(l.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),Da(e,{viewport$:t,header$:r}).pipe(w(a=>i.next(a)),A(()=>i.complete()),m(a=>R({ref:e},a)))})}function Va(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:s}})=>s),Le(2,1),m(([s,a])=>s>a&&a>0),X()),i=r.pipe(m(({active:s})=>s));return B([i,n]).pipe(m(([s,a])=>!(s&&a)),X(),Y(o.pipe(je(1))),re(!0),Tt({delay:250}),m(s=>({hidden:s})))}function ii(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new x,s=i.pipe(Z(),re(!0));return i.subscribe({next({hidden:a}){e.hidden=a,a?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(Y(s),ee("height")).subscribe(({height:a})=>{e.style.top=`${a+16}px`}),h(e,"click").subscribe(a=>{a.preventDefault(),window.scrollTo({top:0})}),Va(e,{viewport$:t,main$:o,target$:n}).pipe(w(a=>i.next(a)),A(()=>i.complete()),m(a=>R({ref:e},a)))}function ai({document$:e,tablet$:t}){e.pipe(E(()=>q(".md-toggle--indeterminate")),w(r=>{r.indeterminate=!0,r.checked=!1}),ce(r=>h(r,"change").pipe(Rr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ne(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function za(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function si({document$:e}){e.pipe(E(()=>q("[data-md-scrollfix]")),w(t=>t.removeAttribute("data-md-scrollfix")),M(za),ce(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function ci({viewport$:e,tablet$:t}){B([We("search"),t]).pipe(m(([r,o])=>r&&!o),E(r=>j(r).pipe(ze(r?400:100))),ne(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function qa(){return location.protocol==="file:"?ht(`${new URL("search/search_index.js",Qr.base)}`).pipe(m(()=>__index),J(1)):Ne(new URL("search/search_index.json",Qr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var nt=Uo(),_t=Go(),gt=Xo(_t),Yr=Bo(),Te=an(),lr=Fr("(min-width: 960px)"),li=Fr("(min-width: 1220px)"),mi=Zo(),Qr=me(),fi=document.forms.namedItem("search")?qa():Ve,Br=new x;jn({alert$:Br});var Gr=new x;te("navigation.instant")&&Nn({location$:_t,viewport$:Te,progress$:Gr}).subscribe(nt);var pi;((pi=Qr.version)==null?void 0:pi.provider)==="mike"&&Kn({document$:nt});_(_t,gt).pipe(ze(125)).subscribe(()=>{Ke("drawer",!1),Ke("search",!1)});Yr.pipe(M(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=se("link[rel=prev]");typeof t!="undefined"&&ot(t);break;case"n":case".":let r=se("link[rel=next]");typeof r!="undefined"&&ot(r);break;case"Enter":let o=Re();o instanceof HTMLLabelElement&&o.click()}});ai({document$:nt,tablet$:lr});si({document$:nt});ci({viewport$:Te,tablet$:lr});var Xe=Hn(Ee("header"),{viewport$:Te}),Lt=nt.pipe(m(()=>Ee("main")),E(e=>Pn(e,{viewport$:Te,header$:Xe})),J(1)),Ka=_(...oe("consent").map(e=>pn(e,{target$:gt})),...oe("dialog").map(e=>kn(e,{alert$:Br})),...oe("header").map(e=>$n(e,{viewport$:Te,header$:Xe,main$:Lt})),...oe("palette").map(e=>In(e)),...oe("progress").map(e=>Fn(e,{progress$:Gr})),...oe("search").map(e=>Jn(e,{index$:fi,keyboard$:Yr})),...oe("source").map(e=>ri(e))),Qa=H(()=>_(...oe("announce").map(e=>cn(e)),...oe("content").map(e=>Cn(e,{viewport$:Te,target$:gt,print$:mi})),...oe("content").map(e=>te("search.highlight")?Xn(e,{index$:fi,location$:_t}):L),...oe("header-title").map(e=>Rn(e,{viewport$:Te,header$:Xe})),...oe("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?jr(li,()=>Kr(e,{viewport$:Te,header$:Xe,main$:Lt})):jr(lr,()=>Kr(e,{viewport$:Te,header$:Xe,main$:Lt}))),...oe("tabs").map(e=>oi(e,{viewport$:Te,header$:Xe})),...oe("toc").map(e=>ni(e,{viewport$:Te,header$:Xe,main$:Lt,target$:gt})),...oe("top").map(e=>ii(e,{viewport$:Te,header$:Xe,main$:Lt,target$:gt})))),ui=nt.pipe(E(()=>Qa),qe(Ka),J(1));ui.subscribe();window.document$=nt;window.location$=_t;window.target$=gt;window.keyboard$=Yr;window.viewport$=Te;window.tablet$=lr;window.screen$=li;window.print$=mi;window.alert$=Br;window.progress$=Gr;window.component$=ui;})(); +//# sourceMappingURL=bundle.cd18aaf1.min.js.map + diff --git a/assets/javascripts/bundle.cd18aaf1.min.js.map b/assets/javascripts/bundle.cd18aaf1.min.js.map new file mode 100755 index 0000000..8bfddbb --- /dev/null +++ b/assets/javascripts/bundle.cd18aaf1.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/tslib.es6.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/sample.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2023 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an + +
+ +This documentation is built with Insiders +[squidfunk.github.io/mkdocs-material][Material for MkDocs] + +
+ -->

What is Insiders?

Every feature is tied to a funding goal in monthly subscriptions. When a funding goal is hit, the features that are tied to it are merged back into Material for MkDocs and released for general availability, making them available to all users. Bugfixes are always released in tandem.

Sponsorships start as low as $15 a month.2

What sponsorships achieve

Sponsorships make this project sustainable, as they buy the maintainers of this project time – a very scarce resource – which is spent on the development of new features, bug fixing, stability improvement, issue triage and general support. The biggest bottleneck in Open Source is time.3

If you're unsure if you should sponsor this project, check out the list of completed funding goals to learn whether you're already using features that were developed with the help of sponsorships. You're most likely using at least a handful of them, thanks to our awesome sponsors!

What's in it for me?

The moment you become a sponsor, you'll get immediate access to 25 additional features that you can start using now, and which are currently exclusively available to sponsors:

New features are added every other week. Be sure to come back.

How to become a sponsor

Thanks for your interest in sponsoring! In order to become an eligible sponsor with your GitHub account, visit squidfunk's sponsor profile, and complete a sponsorship of $15 a month or more. You can use your individual or organization GitHub account for sponsoring.

Important: If you're sponsoring @squidfunk through a GitHub organization, please send a short email to sponsors@squidfunk.com with the name of your organization and the GitHub account of the individual that should be added as a collaborator.4

You can cancel your sponsorship anytime.5

  Join our awesome sponsors


Silver sponsors:

FastAPI Trendpop

Bronze sponsors:

Cirrus CI Basler KX Manticore Games Prefect Datadog Zenoss Posit n8n Dogado World Wide Technology Coda Elastic IP Fabric Apex.AI Jitterbit Sparkfun Eccenca Neptune RackN CivicActions bitcrowd GetScreen.me BotCity Springer Nature Technology Kolena Evergiving Koor Astral Oikolab Bühler Group Transformation Flow 3DR


Funding

Goals

The following section lists all funding goals. Each goal contains a list of features prefixed with a checkmark symbol, denoting whether a feature is already available or planned, but not yet implemented. When the funding goal is hit, the features are released for general availability.

$ 14,000 – Goat's Horn

$ 16,000 – Chipotle

$ 20,000 – Jalapeño

$ 24,000 – Blockpaprika

Goals completed

This section lists all funding goals that were previously completed, which means that those features were part of Insiders, but are now generally available and can be used by all users.

$ 12,000 – Piri Piri

$ 10,000 – Carolina Reaper

$ 8,000 – Scotch Bonnet

$ 7,000 – Royal Gold

$ 6,000 – Trinidad Scorpion

$ 5,000 – Aji Panca

$ 4,000 – Ghost Pepper

$ 3,000 – Caribbean Red

$ 2,500 – Biquinho Vermelho

$ 2,000 – Black Pearl

$ 1,500 – Bhut Jolokia

$ 1,000 – Prairie Fire

$ 500 – Madame Jeanette

  • Improved search result grouping
  • Improved search result relevance and scoring
  • Missing query terms in search results

Frequently asked questions

Compatibility

We're building an open source project and want to allow outside collaborators to run and build our documentation locally without having access to Insiders. Is this still possible?

Yes. Insiders is compatible with Material for MkDocs. Almost all new features and configuration options are either backward-compatible or implemented behind feature flags. When working with outside collaborators, it should be rarely necessary to change the general appearance of your site. Most Insiders features enhance the overall experience, e.g. by adding icons to pages or providing a feedback widget. While these features add value for the user of your site, they shouldn't be necessary for previewing when making changes to content. Currently, the only content-related features in Insiders that can't be properly previewed by non-Insiders users are:

This means that outside collaborators are able to build the documentation locally with Material for MkDocs and when they push their changes, your CI pipeline will build it with Insiders. When using built-in plugins that are exclusive to Insiders, it's recommended to split configuration into a base mkdocs.yml and one with plugin overrides via configuration inheritance.

See the getting started guide for more information.

Payment

We don't want to pay for sponsorship every month. Are there any other options?

Yes. You can sponsor on a yearly basis by switching your GitHub account to a yearly billing cycle. If for some reason you cannot do that, you could also create a dedicated GitHub account with a yearly billing cycle, which you only use for sponsoring (some sponsors already do that).

If you have any problems or further questions, please reach out to sponsors@squidfunk.com.

Terms

Are we allowed to use Insiders under the same terms and conditions as Material for MkDocs?

Yes. Whether you're an individual or a company, you may use Material for MkDocs Insiders precisely under the same terms as Material for MkDocs, which are given by the MIT license. However, we kindly ask you to respect our fair use policy:

  • Please don't distribute the source code of Insiders. You may freely use it for public, private or commercial projects, privately fork or mirror it, but please don't make the source code public, as it would counteract the sponsorware strategy.

  • If you cancel your subscription, you're automatically removed as a collaborator and will miss out on all future updates of Insiders. However, you may use the latest version that's available to you as long as you like. Just remember that GitHub deletes private forks.


  1. In general, every new feature is first exclusively released to sponsors, but sometimes upstream dependencies like Python Markdown Extensions enhance existing features that must be supported by Material for MkDocs. 

  2. Note that $15 a month is the minimum amount to become eligible for Insiders. While GitHub Sponsors also allows to sponsor lower amounts or one-time amounts, those can't be granted access to Insiders due to technical reasons. 

  3. Making an Open Source project sustainable is exceptionally hard: maintainers burn out, projects are abandoned. That's not great and very unpredictable. The sponsorware model ensures that if you decide to use Material for MkDocs, you can be sure that bugs are fixed quickly and new features are added regularly. 

  4. It's currently not possible to grant access to each member of an organization, as GitHub only allows for adding users. Thus, after sponsoring, please send an email to sponsors@squidfunk.com, stating which account should become a collaborator of the Insiders repository. We're working on a solution which will make access to organizations much simpler. To ensure that access is not tied to a particular individual GitHub account, create a bot account (i.e. a GitHub account that is not tied to a specific individual), and use this account for the sponsoring. After being added to the list of collaborators, the bot account can create a private fork of the private Insiders GitHub repository, and grant access to all members of the organizations. 

  5. If you cancel your sponsorship, GitHub schedules a cancellation request which will become effective at the end of the billing cycle. This means that even though you cancel your sponsorship, you will keep your access to Insiders as long as your cancellation isn't effective. All charges are processed by GitHub through Stripe. As we don't receive any information regarding your payment, and GitHub doesn't offer refunds, sponsorships are non-refundable. 

\ No newline at end of file diff --git a/insiders/upgrade/index.html b/insiders/upgrade/index.html new file mode 100755 index 0000000..ef5e500 --- /dev/null +++ b/insiders/upgrade/index.html @@ -0,0 +1,19 @@ + How to upgrade - 一抹雨烟

How to upgrade

When upgrading Insiders, you should always check the version of Material for MkDocs which makes up the first part of the version qualifier, e.g., Insiders 4.x.x is currently based on 9.x.x:

9.x.x-insiders-4.x.x
+

If the major version increased, it's a good idea to consult the upgrade guide and go through the steps to ensure your configuration is up to date and all necessary changes have been made.

Depending on how you installed and what you want to upgrade to you need to run different commands:

If you installed Insiders via pip and you want to upgrade to a specific release, pick the tag from the list of tags and replace the tag at the end of the URL of the command given below:

pip install --upgrade git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git@9.4.2-insiders-4.42.0
+

If you installed Insiders via pip and want to upgrade to the latest development version, run:

pip install --upgrade git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git
+

If you installed Insiders via git, you will first need to check out the version you want to install into your workspace. After this is done, you can run pip to install that version.

First, make sure that your local clone is up-to-date with the upstream repository by running git pull.

You can look up the tags using git tag --sort -refname or you can consult the list of tags. Then, checkout the tag you want to use by replacing the one given in the command below (twice)and running it from your workspace1:

cd mkdocs-material 
+git checkout --detach tags/9.4.2-insiders-4.42.0 
+

Now, change back to the parent directory in which your Git repository lives and run pip:

cd .. 
+pip install -e mkdocs-material
+

  1. The --detach argument serves to tell git that you are ok to have your workspace in the detached head state, which is perfectly fine to have here. 

\ No newline at end of file diff --git a/license/index.html b/license/index.html new file mode 100755 index 0000000..12b42ed --- /dev/null +++ b/license/index.html @@ -0,0 +1,12 @@ + License - 一抹雨烟

License

MIT License

Copyright © 2016-2023 Martin Donath

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

\ No newline at end of file diff --git a/philosophy/index.html b/philosophy/index.html new file mode 100755 index 0000000..7f2eb1a --- /dev/null +++ b/philosophy/index.html @@ -0,0 +1,12 @@ + Philosophy - 一抹雨烟

Philosophy

Before settling for Material for MkDocs, it's a good idea to understand the philosophy behind the project, in order to make sure it aligns with your goals. This page explains the design principles anchored in Material for MkDocs, and discusses the conventions used in this documentation.

Design principles

  • It's just Markdown: Focus on the content of your documentation and create a professional static site in minutes. No need to know HTML,CSS or JavaScript – let Material for MkDocs do the heavy lifting for you.

  • Works on all devices: Serve your documentation with confidence – the underlying layout automatically adapts to perfectly fit the available screen estate, no matter the type or size of the viewing device.

  • Made to measure: Change the colors, fonts, language, icons, logo and much more with a few lines of configuration. Material for MkDocs can be easily extended and provides tons of options to alter appearance and behavior.

  • Fast and lightweight: Don't let your users wait – get incredible value with a small footprint, by using one of the fastest themes around with excellent performance, yielding great search engine rankings and happy users that return.

  • Accessible: Make accessibility a priority – users can navigate your documentation with touch devices, keyboard, and screen readers. Semantic markup ensures that your documentation works for everyone.

  • Open Source: Trust 20,000+ users – choose a mature and well-funded solution built with state-of-the-art Open Source technologies. Keep ownership of your content without fear of vendor lock-in. Licensed under MIT.

\ No newline at end of file diff --git a/plugins/blog/index.html b/plugins/blog/index.html new file mode 100755 index 0000000..b0a86db --- /dev/null +++ b/plugins/blog/index.html @@ -0,0 +1,330 @@ + Built-in blog plugin - 一抹雨烟

Built-in blog plugin

The blog plugin makes it very easy to build a blog, either as a sidecar to your documentation or as the main thing. Focus on your content while the plugin does all the heavy lifting, generating a view of all latest posts, archive and category pages, configurable pagination and much more.

Objective

How it works

The plugin scans the configured posts directory for .md files from which paginated views1 are automatically generated. If not configured otherwise, the plugin expects that your project has the following directory layout, and will create any missing directories or files for you:

.
+├─ docs/
+  └─ blog/
+     ├─ posts/
+     └─ index.md
+└─ mkdocs.yml
+

The index.md file in the blog directory is the entry point to your blog – a paginated view listing all posts in reverse chronological order. Besides that, the plugin supports automatically creating archive and category pages that list a subset of posts for a time interval or category.

Post URLs are completely configurable, no matter if you want your URLs to include the post's date or not. Rendered dates always display in the locale of the site language of your project. Like in other static blog frameworks, posts can be annotated with a variety of metadata, allowing for easy integration with other built-in plugins, e.g., the social and tags plugin.

Posts can be organized in nested folders with a directory layout that suits your specific needs, and can make use of all components and syntax that Material for MkDocs offers, including admonitions, annotations, code blocks, content tabs, diagrams, icons, math, and more.

When to use it

If you want to add a blog to your project, or migrate from another blog framework to Material for MkDocs because of its excellent technical writing capabilities, this plugin is a great choice, as it integrates perfectly with many other built-in plugins:

  •   Built-in meta plugin


    The meta plugin makes it easy to apply metadata to a subset of posts, including authors, tags, categories, draft status, as well as social card layouts.


    Simpler organization, categorization and management of post metadata

  •   Built-in social plugin


    The social plugin automatically generates beautiful and customizable social cards for each post and page, showing as previews on social media.


    Links to your blog render beautiful social cards when shared on social media

  •   Built-in optimize plugin


    The optimize plugin automatically identifies and optimizes all media files that you reference in your project by using compression and conversion techniques.


    Your blog loads faster as smaller images are served to your users

  •   Built-in tags plugin


    The tags plugin allows to categorize posts alongside with pages in your project, to improve their discoverability and connect posts to your documentation.


    Your documentation's tag system integrates with your blog

Configuration

9.2.0 blog – built-in

As with all built-in plugins, getting started with the blog plugin is straightforward. Just add the following lines to mkdocs.yml, and you can start writing your first post:

plugins:
+  - blog
+

The blog plugin is built into Material for MkDocs and doesn't need to be installed.

General

The following settings are available:


enabled

9.2.0 true

Use this setting to enable or disable the plugin when building your project. It's normally not necessary to specify this setting, but if you want to disable the plugin, use:

plugins:
+  - blog:
+      enabled: false
+

blog_dir

9.2.0 blog

Use this setting to change the path where your blog is located in the docs directory. The path is included in the generated URLs as a prefix for all posts and views. You can change it with:

plugins:
+  - blog:
+      blog_dir: blog
+
plugins:
+  - blog:
+      blog_dir: .
+

The provided path is resolved from the docs directory.


blog_toc

9.2.0 false

Use this setting to leverage the table of contents to display post titles in views. This might be useful, if your post excerpts are rather long. If you want to enable it, use:

plugins:
+  - blog:
+      blog_toc: true
+

Posts

The following settings are available for posts:


post_dir

9.2.0 {blog}/posts

Use this setting to change the folder where your posts are located. It's normally not necessary to change this setting, but if you want to rename the folder or change its file system location, use:

plugins:
+  - blog:
+      post_dir: "{blog}/articles"
+

Note that the posts directory is solely used for post organization – it is not included in post URLs, since they are automatically and comfortably generated by this plugin.

The following placeholders are available:

The provided path is resolved from the docs directory.


post_date_format

9.2.0 long

Use this setting to change the date format of posts. This plugin uses babel to render dates in the configured site language. You can use babel's pattern syntax or the following shortcodes:

plugins:
+  - blog:
+      post_date_format: full
+
plugins:
+  - blog:
+      post_date_format: long
+
plugins:
+  - blog:
+      post_date_format: medium
+
plugins:
+  - blog:
+      post_date_format: short
+

Note that depending on the site language, results might look different for other languages.


post_url_date_format

9.2.0 yyyy/MM/dd

Use this setting to change the date format used in post URLs. The format string must adhere to babel's pattern syntax and should not contain whitespace. Some popular choices:

plugins:
+  - blog:
+      post_url_date_format: yyyy/MM/dd
+
plugins:
+  - blog:
+      post_url_date_format: yyyy/MM
+
plugins:
+  - blog:
+      post_url_date_format: yyyy
+

If you want to remove the date from post URLs, e.g., when your blog features mostly evergreen content, you can remove the date placeholder from the post_url_format format string.


post_url_format

9.2.0 {date}/{slug}

Use this setting to change the format string that is used when generating post URLs. You can freely combine placeholders, and join them with slashes or other characters:

plugins:
+  - blog:
+      post_url_format: "{date}/{slug}"
+
plugins:
+  - blog:
+      post_url_format: "{slug}"
+

The following placeholders are available:

If you remove the date placeholder, make sure that post URLs don't collide with URLs of other pages hosted under the blog directory, as this leads to undefined behavior.


post_url_max_categories

9.2.0 1

Use this setting to set an upper bound for the number of categories included in post URLs if the categories placeholder is part of post_url_format and the post defines categories:

plugins:
+  - blog:
+      post_url_format: "{categories}/{slug}"
+      post_url_max_categories: 2
+

If more than one category is given, they are joined with / after slugifying.


post_slugify

9.2.0 pymdownx.slugs.slugify

Use this setting to change the function for generating URL-compatible slugs from post titles. By default, the slugify function from Python Markdown Extensions is used as follows:

plugins:
+  - blog:
+      post_slugify: !!python/object/apply:pymdownx.slugs.slugify
+        kwds:
+          case: lower
+

The default configuration is Unicode-aware and should produce good slugs for all languages. Of course, you can also provide a custom slugification function for more granular control.


post_slugify_separator

9.2.0 -

Use this setting to change the separator that is passed to the slugification function set as part of post_slugify. While the default is a hyphen, it can be set to any string, e.g., _:

plugins:
+  - blog:
+      post_slugify_separator: _
+

post_excerpt

9.2.0 optional

By default, the plugin makes post excerpts optional. When a post doesn't define an excerpt, views include the entire post. This setting can be used to make post excerpts required:

plugins:
+  - blog:
+      post_excerpt: optional
+
plugins:
+  - blog:
+      post_excerpt: required
+

When post excerpts are required, posts without excerpt separators raise an error. Thus, this setting is useful when you want to make sure that all posts have excerpts defined.


post_excerpt_max_authors

9.2.0 1

Use this setting to set an upper bound for the number of authors rendered in post excerpts. While each post may be written by multiple authors, this setting allows to limit the display to just a few or even a single author, or disable authors in post excerpts:

plugins:
+  - blog:
+      post_excerpt_max_authors: 2
+
plugins:
+  - blog:
+      post_excerpt_max_authors: 0
+

This only applies to post excerpts in views. Posts always render all authors.


post_excerpt_max_categories

9.2.0 5

Use this setting to set an upper bound for the number of categories rendered in post excerpts. While each post may be assigned to multiple categories, this setting allows to limit the display to just a few or even a single category, or disable categories in post excerpts:

plugins:
+  - blog:
+      post_excerpt_max_categories: 2
+
plugins:
+  - blog:
+      post_excerpt_max_categories: 0
+

This only applies to post excerpts in views. Posts always render all categories.


post_excerpt_separator

9.2.0 <!-- more -->

Use this setting to set the separator the plugin will look for in a post's content when generating post excerpts. All content before the separator is considered to be part of the excerpt:

plugins:
+  - blog:
+      post_excerpt_separator: <!-- more -->
+

It is common practice to use an HTML comment as a separator.


post_readtime

9.2.0 true

Use this setting to control whether the plugin should automatically compute the reading time of a post, which is then rendered in post excerpts, as well as in posts themselves:

plugins:
+  - blog:
+      post_readtime: false
+

post_readtime_words_per_minute

9.2.0 265

Use this setting to change the number of words that a reader is expected to read per minute when computing the reading time of a post. If you want to fine-tune it, use:

plugins:
+  - blog:
+      post_readtime_words_per_minute: 300
+

A reading time of 265 words per minute is considered to be the average reading time of an adult.

Archive

The following settings are available for archive pages:


archive

9.2.0 true

Use this setting to enable or disable archive pages. An archive page shows all posts for a specific interval (e.g. year, month, etc.) in reverse order. If you want to disable archive pages, use:

plugins:
+  - blog:
+      archive: false
+

archive_name

9.2.0

Use this setting to change the title of the archive section the plugin adds to the navigation. If this setting is omitted, it's sourced from the translations. If you want to change it, use:

plugins:
+  - blog:
+      archive_name: Archive
+

archive_date_format

9.2.0 yyyy

Use this setting to change the date format used for archive page titles. The format string must adhere to babel's pattern syntax. Some popular choices:

plugins:
+  - blog:
+      archive_date_format: yyyy
+
plugins:
+  - blog:
+      archive_date_format: MMMM yyyy
+

Note that depending on the site language, results might look different for other languages.


archive_url_date_format

9.2.0 yyyy

Use this setting to change the date format used for archive page URLs. The format string must adhere to babel's pattern syntax and should not contain whitespace. Some popular choices:

plugins:
+  - blog:
+      archive_url_date_format: yyyy
+
plugins:
+  - blog:
+      archive_url_date_format: yyyy/MM
+

archive_url_format

9.2.0 archive/{date}

Use this setting to change the format string that is used when generating archive page URLs. You can freely combine placeholders, and join them with slashes or other characters:

plugins:
+  - blog:
+      archive_url_format: "archive/{date}"
+
plugins:
+  - blog:
+      archive_url_format: "{date}"
+

The following placeholders are available:


archive_pagination

insiders-4.44.0 true

Use this setting to enable or disable pagination for archive pages. The value of this setting is inherited from pagination, unless it's explicitly set. To disable pagination, use:

plugins:
+  - blog:
+      archive_pagination: false
+

archive_pagination_per_page

insiders-4.44.0 10

Use this setting to change the number of posts rendered per archive page. The value of this setting is inherited from pagination_per_page, unless it's explicitly set. To change it, use:

plugins:
+  - blog:
+      archive_pagination_per_page: 5
+

archive_toc

9.2.0 false

Use this setting to leverage the table of contents to display post titles on all archive pages. The value of this setting is inherited from blog_toc, unless it's explicitly set. To change it, use

plugins:
+  - blog:
+      archive_toc: true
+

Categories

The following settings are available for category pages:


categories

9.2.0 true

Use this setting to enable or disable category pages. A category page shows all posts for a specific category in reverse chronological order. If you want to disable category pages, use:

plugins:
+  - blog:
+      categories: false
+

categories_name

9.2.0

Use this setting to change the title of the category section the plugin adds to the navigation. If this setting is omitted, it's sourced from the translations. If you want to change it, use:

plugins:
+  - blog:
+      categories_name: Categories
+

categories_url_format

9.2.0 category/{slug}

Use this setting to change the format string that is used when generating category page URLs. You can freely combine placeholders, and join them with slashes or other characters:

plugins:
+  - blog:
+      categories_url_format: "category/{slug}"
+
plugins:
+  - blog:
+      categories_url_format: "{slug}"
+

The following placeholders are available:


categories_slugify

9.2.0 pymdownx.slugs.slugify

Use this setting to change the function for generating URL-compatible slugs from categories. By default, the slugify function from Python Markdown Extensions is used as follows:

plugins:
+  - blog:
+      post_slugify: !!python/object/apply:pymdownx.slugs.slugify
+        kwds:
+          case: lower
+

The default configuration is Unicode-aware and should produce good slugs for all languages. Of course, you can also provide a custom slugification function for more granular control.


categories_slugify_separator

9.2.0 -

Use this setting to change the separator that is passed to the slugification function set as part of categories_slugify. While the default is a hyphen, it can be set to any string, e.g., _:

plugins:
+  - blog:
+      categories_slugify_separator: _
+

categories_sort_by

insiders-4.45.0 material.plugins.blog.view_name

Use this setting to specify a custom function for sorting categories. For example, if you want to sort categories by the number of posts they contain, use the following configuration:

plugins:
+  - blog:
+      categories_sort_by: !!python/name:material.plugins.blog.view_post_count
+

Don't forget to enable categories_sort_reverse. You can define your own comparison function, which must return something that can be compared while sorting, i.e., a string or number.


categories_sort_reverse

insiders-4.45.0 false

Use this setting to reverse the order in which categories are sorted. By default, categories are sorted in ascending order, but you can reverse ordering as follows:

plugins:
+  - blog:
+      categories_sort_reverse: true
+

categories_allowed

9.2.0

The plugin allows to check categories against a predefined list, in order to catch typos or make sure that categories are not arbitrarily added. Specify the categories you want to allow with:

plugins:
+  - blog:
+      categories_allowed:
+        - Search
+        - Performance
+

The plugin stops the build if a post references a category that is not part of this list. Posts can be assigned to categories by using the categories metadata property.


categories_pagination

insiders-4.44.0 true

Use this setting to enable or disable pagination for category pages. The value of this setting is inherited from pagination, unless it's explicitly set. To disable pagination, use:

plugins:
+  - blog:
+      categories_pagination: false
+

categories_pagination_per_page

insiders-4.44.0 10

Use this setting to change the number of posts rendered per category page. The value of this setting is inherited from pagination_per_page, unless it's explicitly set. To change it, use:

plugins:
+  - blog:
+      categories_pagination_per_page: 5
+

categories_toc

9.2.0 false

Use this setting to leverage the table of contents to display post titles on all category pages. The value of this setting is inherited from blog_toc, unless it's explicitly set. To change it, use:

plugins:
+  - blog:
+      categories_toc: true
+

Authors

The following settings are available for authors:


authors

9.2.0 true

Use this setting to enable or disable post authors. If this setting is enabled, the plugin will look for a file named .authors.yml and render authors in posts and views. Disable this behavior with:

plugins:
+  - blog:
+      authors: false
+

authors_file

9.2.0 {blog}/.authors.yml

Use this setting to change the path of the file where the author information for your posts resides. It's normally not necessary to change this setting, but if you need to, use:

plugins:
+  - blog:
+      authors_file: "{blog}/.authors.yml"
+

The following placeholders are available:

The provided path is resolved from the docs directory.

Format of author information

The .authors.yml file must adhere to the following format:

.authors.yml
authors:
+  <author>:
+    name: string        # Author name
+    description: string # Author description
+    avatar: url         # Author avatar
+    slug: url           # Author profile slug
+    url: url            # Author website URL
+

Note that <author> must be set to an identifier for associating authors with posts, e.g., a GitHub username like squidfunk. This identifier can then be used in the authors metadata property of a post. Multiple authors are supported. As an example, see the .authors.yml file we're using for our blog.


authors_profiles

insiders-4.46.0 false

Use this setting to enable or disable automatically generated author profiles. An author profile shows all posts by an author in reverse chronological order. You can enable author profiles with:

plugins:
+  - blog:
+      author_profiles: true
+

authors_profiles_name

insiders-4.46.0

Use this setting to change the title of the authors section the plugin adds to the navigation. If this setting is omitted, it's sourced from the translations. If you want to change it, use:

plugins:
+  - blog:
+      authors_profiles_name: Authors
+

authors_profiles_url_format

insiders-4.46.0 author/{slug}

Use this setting to change the format string that is used when generating author profile URLs. You can freely combine placeholders, and join them with slashes or other characters:

plugins:
+  - blog:
+      authors_profiles_url_format: "author/{slug}"
+
plugins:
+  - blog:
+      authors_profiles_url_format: "{slug}"
+

The following placeholders are available:


authors_profiles_pagination

insiders-4.46.0 true

Use this setting to enable or disable pagination for author profiles. The value of this setting is inherited from pagination, unless it's explicitly set. To disable pagination, use:

plugins:
+  - blog:
+      authors_profiles_pagination: false
+

authors_profiles_pagination_per_page

insiders-4.46.0 10

Use this setting to change the number of posts rendered per archive page. The value of this setting is inherited from pagination_per_page, unless it's explicitly set. To change it, use:

plugins:
+  - blog:
+      authors_profiles_pagination_per_page: 5
+

authors_profiles_toc

insiders-4.46.0 false

Use this setting to leverage the table of contents to display post titles on all author profiles. The value of this setting is inherited from blog_toc, unless it's explicitly set. To change it, use:

plugins:
+  - blog:
+      authors_profiles_toc: true
+

Pagination

The following settings are available for pagination:


pagination

9.2.0 true

Use this setting to enable or disable pagination in views – generated pages that show posts or subsets of posts in reverse chronological order. If you want to disable pagination, use:

plugins:
+  - blog:
+      pagination: false
+

pagination_per_page

9.2.0 10

Use this setting to change the number of posts rendered per page. If you have rather long post excerpts, it can be a good idea to reduce the number of posts per page:

plugins:
+  - blog:
+      pagination_per_page: 5
+

pagination_url_format

9.2.0 {date}/{slug}

Use this setting to change the format string that is used when generating paginated view URLs. You can freely combine placeholders, and join them with slashes or other characters:

plugins:
+  - blog:
+      pagination_url_format: "page/{page}"
+
plugins:
+  - blog:
+      pagination_url_format: "{page}"
+

The following placeholders are available:

  • page – Page number

pagination_format

9.2.0 ~2~

The plugin uses the paginate module to generate the pagination markup using a special syntax. Use this setting to customize how pagination is constructed. Some popular choices:

plugins:
+  - blog:
+      pagination_format: "~2~"
+
plugins:
+  - blog:
+      pagination_format: "$link_first $link_previous ~2~ $link_next $link_last"
+
plugins:
+  - blog:
+      pagination_format: "$link_previous $page $link_next"
+

The following placeholders are supported by paginate:

  • $first_page – Number of first reachable page
  • $last_page – Number of last reachable page
  • $page – Number of currently selected page
  • $page_count – Number of reachable pages
  • $items_per_page – Maximal number of items per page
  • $first_item – Index of first item on the current page
  • $last_item – Index of last item on the current page
  • $item_count – Total number of items
  • $link_first – Link to first page (unless on first page)
  • $link_last – Link to last page (unless on last page)
  • $link_previous – Link to previous page (unless on first page)
  • $link_next – Link to next page (unless on last page)

pagination_if_single_page

9.2.0 false

Use this setting to control whether pagination should be automatically disabled when the view only consists of a single page. If you want to always render pagination, use:

plugins:
+  - blog:
+      pagination_if_single_page: true
+

pagination_keep_content

9.2.0 false

Use this setting to enable or disable persistence of content, i.e., if paginated views should also display the content of their containing view. If you want to enable this behavior, use:

plugins:
+  - blog:
+      pagination_keep_content: true
+

Drafts

The following settings are available for drafts:


draft

9.2.0 false

Rendering draft posts can be useful in deploy previews. Use this setting to specify whether the plugin should include posts marked as drafts when building your project:

plugins:
+  - blog:
+      draft: true
+
plugins:
+  - blog:
+      draft: false
+

draft_on_serve

9.2.0 true

Use this setting to control whether the plugin should include posts marked as drafts when previewing your site. If you don't wish to include draft posts when previewing, use:

plugins:
+  - blog:
+      draft_on_serve: false
+

draft_if_future_date

9.2.0 false

The plugin can automatically mark posts with future dates as drafts. When the date is past today, the post is automatically included when building your project, unless explicitly marked as draft:

plugins:
+  - blog:
+      draft_if_future_date: true
+

Usage

Metadata

Posts can define a handful of metadata properties that specify how the plugin renders them, in which views they are integrated, and how they are linked to each other. The metadata of each post is validated against a schema to allow for a quicker discovery of syntax errors.

The following properties are available:


authors

9.2.0

Use this property to associate a post with authors by providing a list of identifiers as defined in the authors_file. If an author can't be resolved, the plugin will terminate with an error:

---
+authors:
+  - squidfunk # (1)!
+---
+
+# Post title
+...
+
  1. Authors are linked by using their identifiers. As an example, see the .authors.yml file we're using for our blog.

categories

9.2.0

Use this property to associate a post with one or more categories, making the post a part of the generated category page. Categories are defined as a list of strings (whitespaces are allowed):

---
+categories:
+  - Search
+  - Performance
+---
+
+# Post title
+...
+

If you want to prevent accidental typos assigning categories to posts, you can set a predefined list of allowed categories in mkdocs.yml by using the categories_allowed setting.


date

9.2.0

Use this property to specify a post's date. Note that this property is required, which means the build fails when it's not set. Additional dates can be set by using a slightly different syntax:

---
+date: 2023-01-31
+---
+
+# Post title
+...
+
---
+date:
+  created: 2023-01-31 # (1)!
+  updated: 2023-02-01
+---
+
+# Post title
+...
+
  1. Each post must have a creation date set.
---
+date:
+  created: 2023-01-31
+  my_custom_date: 2023-02-01 # (1)!
+---
+
+# Post title
+...
+
  1. The blog plugin validates all dates and allows to format them with babel's pattern syntax in templates. When using theme extension, authors can add custom dates to templates.

    This was first requested in #5733.

The following date formats are supported:

  • 2023-01-31
  • 2023-01-31T12:00:00

draft

9.2.0

Use this property to mark a post as draft. The plugin allows to include or exclude posts marked as drafts when building your project using the draft setting. Mark a post as draft with:

---
+draft: true
+---
+
+# Post title
+...
+

insiders-4.23.0

Use this property to define a list of links that are rendered in the sidebar of a post. The property follows the same syntax as nav in mkdocs.yml, supporting sections and even anchors:

---
+links:
+  - setup/setting-up-site-search.md
+  - insiders/index.md
+---
+
+# Post title
+...
+
---
+links:
+  - setup/setting-up-site-search.md
+  - Insiders:
+    - insiders/index.md
+    - insiders/getting-started.md
+---
+
+# Post title
+...
+
---
+links:
+  - plugins/search.md # (1)!
+  - Insiders:
+    - insiders/index.md#how-to-become-a-sponsor
+    - insiders/getting-started.md#requirements
+---
+
+# Post title
+...
+
  1. If a link defines an anchor, the plugin resolves the anchor from the linked page and sets the anchor title as a subtitle.

All relative links are resolved from the docs directory.


readtime

9.2.0

Use this property to explicitly set the reading time of a post in minutes. When post_readtime is enabled, the plugin computes the reading time of a post, which can be overridden with:

---
+readtime: 15
+---
+
+# Post title
+...
+

slug

9.2.0

Use this property to explicitly set the slug of a post. By default, the slug of a post is automatically computed by the post_slugify function from the post's title, which can be overridden with:

---
+slug: help-im-trapped-in-a-universe-factory
+---
+
+# Post title
+...
+

Slugs are passed to post_url_format.


Missing something?

When setting up your blog or migrating from another blog framework, you might discover that you're missing specific functionality – we're happy to consider adding it to the plugin! You can open a discussion to ask a question, or create a change request on our issue tracker, so we can find out if it might be a good fit for the plugin.


  1. Views are pages that are automatically generated, i.e., the entry point to your blog listing all latest posts, as well as archive and category pages that list all posts associated with them through metadata in chronological order. 

\ No newline at end of file diff --git a/plugins/group/index.html b/plugins/group/index.html new file mode 100755 index 0000000..0e775b5 --- /dev/null +++ b/plugins/group/index.html @@ -0,0 +1,26 @@ + Built-in group plugin - 一抹雨烟

Built-in group plugin

The group plugin allows to group plugins into logical units to conditionally enable or disable them for specific environments with the use of environment variables, e.g., to only enable a subset of plugins when building your project during continuous integration (CI).

Objective

How it works

The plugin conditionally and lazily loads all plugins that are part of a group if and only if the group is enabled, which means that the plugin doesn't add any overhead when the group is disabled. It also means that the grouped plugins only need to be installed when the group is enabled.

The plugins that are part of the group are executed in the same order as if they were defined at the top-level in the list of plugins. Thus, order is preserved and deterministic.

When to use it

Whenever you're using multiple plugins that are only required in specific environments, e.g., when building your project during continuous integration (CI), the plugin is the perfect utility for making configuration simpler, as it removes the need for splitting configuration into multiple files.

It can be used with any built-in or third-party plugin.

Configuration

9.3.0 group – built-in

As with all built-in plugins, getting started with the group plugin is straightforward. Just add the following lines to mkdocs.yml, and start splitting plugins into logical units:

plugins:
+  - group
+

The group plugin is built into Material for MkDocs and doesn't need to be installed.

General

The following settings are available:


enabled

9.2.0 false

Use this setting to enable or disable the plugin when building your project. The plugin behaves differently than all other built-in plugins – it is disabled by default. To enable a group, use:

plugins:
+  - group:
+      enabled: !ENV CI # (1)!
+
  1. If you only want to use the group plugin for better organization and always want to enable the plugins that are part of it, use:

    plugins:
    +  - group:
    +      enabled: true
    +

The decision to disable the plugin by default was made to simplify the usage of environment variables, as it removes the need to provide a default value for an environment variable.

Now, when building your project, you can enable a group by setting the environment variable:

CI=true mkdocs build
+

plugins

9.2.0

Use this setting to list the plugins that are part of the group. The syntax is exactly the same as for the plugins setting, so you can simply copy the list of plugins that you want to group, e.g:

plugins:
+  - group:
+      plugins:
+        - optimize
+        - minify
+

The plugins mentioned here are just used for illustration purposes.

\ No newline at end of file diff --git a/plugins/index.html b/plugins/index.html new file mode 100755 index 0000000..54a2874 --- /dev/null +++ b/plugins/index.html @@ -0,0 +1,12 @@ + Built-in plugins - 一抹雨烟

Built-in plugins

Material for MkDocs started out as a theme for MkDocs, but has since evolved into a full-fledged framework for building and maintaining documentation. The theme is still the core of the project, but it's now accompanied by a growing number of complementary built-in plugins.

We strive to make those plugins as modular and generic as possible, so that they can be used in a wide variety of projects and use cases. By providing useful default settings, we also try to make them as easy to use as possible, so that you can get started quickly, tweaking their settings later on. When developing built-in plugins, we always adhere to the following design principles:

  • Modularity: Built-in plugins are designed to be modular, so that they can be easily combined to implement sophisticated pipelines. For example, the offline, optimize and privacy plugins can be used together to build truly offline-capable documentation.

  • Interoperability: Built-in plugins are designed to be as compatible as possible, so they can be used in combination with other plugins, including third-party plugins. We strive to make it simple to integrate with the vast ecosystem that has evolved around MkDocs.

  • Performance: Built-in plugins are designed to be as fast and memory-efficient as possible, so that they don't unnecessarily slow down builds. This is particularly important for large documentation projects with thousands of pages.

Categories

Management

The following plugins greatly improve the authoring experience when working on documentation projects by providing better management capabilities, from the management of plugins, multiple projects, and metadata, to the creation of minimal reproductions for bug reports:

  •   Built-in group plugin


    The group plugin allows to group plugins into logical units to conditionally enable or disable them for specific environments with the use of environment variables.


    Optimal management of plugins when building in different environments

  •   Built-in meta plugin


    The meta plugin makes it easy to manage metadata (front matter) for all pages in a folder, so a certain subset of pages uses specific tags or a custom template.


    Simpler organization, categorization and management of metadata

  •   Built-in projects plugin


    The projects plugin allows to split your main project into multiple distinct projects, build them concurrently and preview them together as one.


    Connect multiple projects together, and build them separately or as one

  •   Built-in info plugin


    The info plugin is a small and useful utility that helps to create self-contained minimal reproductions, so we maintainers can fix reported bugs more quickly.


    Your bug reports are of the highest quality, so we can fix them as fast as possible

Optimization

The following plugins are designed to help you build optimized documentation, making it more accessible to your users through faster loading times, better search engine rankings, beautiful preview images on social media, and GDPR compliance with a few lines of configuration:

  •   Built-in social plugin


    The social plugin automatically generates beautiful and customizable social cards for each page of your documentation, showing as previews on social media.


    Links to your site render beautiful social cards when shared on social media

  •   Built-in optimize plugin


    The optimize plugin automatically identifies and optimizes all media files that you reference in your project by using compression and conversion techniques.


    Your site loads faster as smaller images are served to your users

  •   Built-in privacy plugin


    The privacy plugin downloads external assets automatically for easy self-hosting, allowing for GDPR compliance with a single line of configuration.


    Your documentation can be made GDPR compliant with minimal effort

  •   Built-in offline plugin


    The offline plugin adds support for building offline-capable documentation, so you can distribute the site directory as a .zip file that can be downloaded.


    Your documentation can work without connectivity to the internet

Content

The following plugins are designed to help you set up a blog, provide search functionality to your users, add tags to pages and posts, and use the same typesetting capabilities in specific parts of the documentation exactly as in the main content:

  •   Built-in blog plugin


    The blog plugin adds first-class support for blogging to Material for MkDocs, either as a sidecar to your documentation or as a standalone installation.


    Your blog is built with the same powerful engine as your documentation

  •   Built-in search plugin


    The search plugin adds a search bar to the header, allowing users to search the entire documentation, so it's easier for them to find what they're looking for.


    Your documentation is searchable without any external services, even offline

  •   Built-in tags plugin


    The tags plugin adds first-class support for categorizing pages with tags, adding the ability to group related pages to improve the discovery of related content.


    Your pages are categorized with tags, yielding additional context

  •   Built-in typeset plugin


    The typeset plugin allows to preserve the enriched presentation of titles and headlines within the navigation and table of contents.


    Sidebars preserve the same formatting as section titles in pages

Architecture

Multiple instances

Several built-in plugins have support for multiple instances, which means that they can be used multiple times in the same configuration file, allowing to fine-tune behavior for separate sections of your project. Currently, the following plugins have support for multiple instances:

\ No newline at end of file diff --git a/plugins/info/index.html b/plugins/info/index.html new file mode 100755 index 0000000..23d0e98 --- /dev/null +++ b/plugins/info/index.html @@ -0,0 +1,26 @@ + Built-in info plugin - 一抹雨烟

Built-in info plugin

The info plugin is a utility that is solely intended to create self-contained minimal reproductions as .zip files when reporting bugs or proposing change requests, making communication between us maintainers and you much easier, as we have a common ground to work on.

Objective

How it works

The plugin helps you to prepare a minimal reproduction by collecting the necessary information about the environment and configuration of your project. This makes it easier for us to fix bugs, as it requires that you upgrade to the latest version and remove your customizations.

When following these principles, you can be confident that you don't report a bug that has already been fixed in a subsequent release, or which is caused by one of your customizations. Even more importantly, you actively help us to fix the bug as quickly as possible.

The output of the plugin is a .zip file that you can share with us maintainers.

When to use it

Whenever you're reporting a bug or have something to discuss, like a question or change request, you should attach a small, self-contained minimal reproduction. Runnable examples help to make communication much more efficient, giving us maintainers more time to benefit more users by pushing the project forward. Minimal reproductions are mandatory for bug reports.

Configuration

9.0.0 info – built-in

In order to get started with the built-in info plugin, just add the following lines to mkdocs.yml, and quickly create a minimal reproduction to share with us maintainers:

plugins:
+  - info
+

The info plugin is built into Material for MkDocs and doesn't need to be installed.

General

The following settings are available:


enabled

9.0.0 true

Use this setting to enable or disable the plugin when building your project. It's normally not necessary to specify this setting, but if you want to disable the plugin, use:

plugins:
+  - info:
+      enabled: false
+

enabled_on_serve

9.0.6 false

Use this setting to control whether the plugin should be enabled when previewing your site. It's normally not necessary to specify this setting, but if you want to change this behavior, use:

plugins:
+  - info:
+      enabled_on_serve: true
+

This setting streamlines the process of creating and inspecting minimal reproductions, as it allows to quickly iterate on the reproduction without having to disable the plugin first.

Archive


archive

9.0.0 true

Use this setting to control whether the plugin should create a .zip file from the project or exit after the version check. This setting is solely intended for debugging the plugin itself:

plugins:
+  - info:
+      archive: false
+

archive_stop_on_violation

9.0.0 true

Use this setting to control whether the plugin should stop creating the .zip file when one of the requirements is not satisfied. This setting must only be used when reporting a bug that is related to a customization explicitly mentioned in our documentation. You can change it with:

plugins:
+  - info:
+      archive_stop_on_violation: false
+

If you're using this setting when reporting a bug, please explain why you think it is necessary to include customizations. If you're unsure, please ask us first by creating a discussion.

\ No newline at end of file diff --git a/plugins/meta/index.html b/plugins/meta/index.html new file mode 100755 index 0000000..9c2ee4b --- /dev/null +++ b/plugins/meta/index.html @@ -0,0 +1,40 @@ + Built-in meta plugin - 一抹雨烟

Built-in meta plugin

The meta plugin solves the problem of setting metadata (front matter) for all pages in a folder, i.e., a subsection of your project, which is particularly useful to ensure that a certain subset of pages features specific tags, uses a custom template, or is attributed to an author.


Sponsors only – this plugin is currently reserved to our awesome sponsors.

Objective

How it works

The plugin scans the docs directory for .meta.yml files, and recursively merges the contents of those files with the metadata (front matter) of all pages that are contained in the same folder and all subfolders. For example, if you want to add the tag Example to multiple pages, use:

.meta.yml
tags:
+  - Example
+

Now, given the following directory layout, if you store the file in the folder named example, all pages in that folder receive the tag, while all pages outside of the folder remain unaffected:

.
+├─ docs/
+  ├─ ...
+  ├─ example/
+    ├─ .meta.yml
+    ├─ a.md
+    ├─ ...
+    └─ z.md
+  └─ ...
+└─ mkdocs.yml
+

When combining metadata, lists and dictionaries are recursively merged, which means you can append values to a list and add or set specific properties in a dictionary on arbitrary levels.

When to use it

While the plugin itself doesn't offer much functionality beyond adding and merging metadata, it is a perfect companion for many of the other built-in plugins that Material for MkDocs offers. Some of the most powerful combinations of the meta plugin and other built-in plugins are:

Configuration

insiders-4.21.0 meta – built-in

As with all built-in plugins, getting started with the meta plugin is straightforward. Just add the following lines to mkdocs.yml, and start applying metadata for multiple pages at once:

plugins:
+  - meta
+

The meta plugin is included with Material for MkDocs and doesn't need to be installed.

General

The following settings are available:


enabled

insiders-4.38.0 true

Use this setting to enable or disable the plugin when building your project. It's normally not necessary to specify this setting, but if you want to disable the plugin, use:

plugins:
+  - meta:
+      enabled: false
+

Meta file

The following settings are available for meta files:


meta_file

insiders-4.21.0 .meta.yml

Use this setting to change the meta file name the plugin will look for when scanning the docs directory. It's normally not necessary to change this setting, but if you want to change it, use:

plugins:
+  - meta:
+      meta_file: .meta.yml
+

The provided path is resolved from the docs directory recursively.

\ No newline at end of file diff --git a/plugins/offline/index.html b/plugins/offline/index.html new file mode 100755 index 0000000..bb86b9a --- /dev/null +++ b/plugins/offline/index.html @@ -0,0 +1,18 @@ + Built-in offline plugin - 一抹雨烟

Built-in offline plugin

MkDocs is one of the few frameworks that allow to build offline-capable documentation that can be directly viewed by the user – no server needed. With the offline plugin, you can distribute the site directory as a downloadable .zip file while retaining most interactive functionality.

Objective

How it works

After building your project, switch to the site directory and open index.html in your browser – you're now viewing your documentation from your local file system! Most browsers will denote this by showing file:// in the address bar. However, you'll realize that the site search is gone.

Material for MkDocs offers many interactive features, some of which will not work from the local file system due to the restrictions of modern browsers. More specifically and technically, all calls to the Fetch API will error with a message like:

Cross origin requests are only supported for protocol schemes: http, [...]
+

While browsers impose those restriction for security reasons, it reduces the interactivity of your project. The offline plugin makes sure that site search keeps working by moving the search index to a JavaScript file, and leveraging @squidfunk's iframe-worker shim.

Additionally, the plugin automatically disables the use_directory_urls setting, ensuring that users can open your documentation directly from the local file system.

There are some limitations.

When to use it

As the name already indicates, the plugin should only be used when you're building your project for offline distribution. It's also good to know, that the offline plugin plays nicely with the following other plugins, helping to create even better offline-capable documentation:

  •   Built-in privacy plugin


    The privacy plugin makes it easy to use external assets when building for offline usage, as it automatically downloads them for distribution with your documentation.


    Your documentation can work without connectivity to the internet1

  •   Built-in optimize plugin


    The optimize plugin automatically identifies and optimizes all media files that you reference in your project by using compression and conversion techniques.


    Your documentation can be distributed as a smaller .zip download

Configuration

9.0.0 offline – built-in

As with all built-in plugins, getting started with the offline plugin is straightforward. Just add the following lines to mkdocs.yml, and start building offline-capable documentation:

plugins:
+  - offline
+

The offline plugin is built into Material for MkDocs and doesn't need to be installed.

General

The following settings are available:


enabled

9.0.0 true

Use this setting to enable or disable the plugin when building your project. If you want to build online- as well as offline-capable documentation, it's a good idea to use an environment variable:

plugins:
+  - offline:
+      enabled: !ENV [OFFLINE, false]
+

Limitations

When enabling the offline plugin, make sure to disable the following settings, as they make use of the Fetch API which will error when invoked from the local file system:


  1. You might wonder why the privacy plugin is necessary to build truly offline-capable documentation with the offline plugin. While it's certainly possible to also add support for downloading external assets to the offline plugin, this functionality is already fully implemented in the privacy plugin and is its very raison d'être.

    Material for MkDocs follows a modular approach for its plugin system – many of the plugins work perfectly together and enhance each others functionalities, allowing to solve complex problems with a few lines of configuration. 

\ No newline at end of file diff --git a/plugins/optimize/index.html b/plugins/optimize/index.html new file mode 100755 index 0000000..ffe72eb --- /dev/null +++ b/plugins/optimize/index.html @@ -0,0 +1,64 @@ + Built-in optimize plugin - 一抹雨烟

Built-in optimize plugin

The optimize plugin automatically identifies and optimizes all media files when building your project by using common compression and conversion techniques. As a result, your site loads significantly faster and yields better rankings in search engines.


Sponsors only – this plugin is currently reserved to our awesome sponsors.

Objective

How it works

The plugin scans the docs directory for media files and assets, optimizing them automatically in order to reduce the final size of the site directory. This leads to faster loading times as you ship less bytes to your users, as well as a smaller download for offline-capable documentation.

Optimized images are intelligently cached, which is why the plugin will only optimize media files that changed since the last build. This makes it possible to swap out or update images, without having to worry about optimizing them, or even worse, forgetting to do so.

In order to optimize media files, a few dependencies need to be available on your system.

When to use it

It's generally recommended to use the plugin, as media files are optimized automatically without the need for intervention, ensuring that your site loads as fast as possible. Optimized media files are one of the key components for a high and consistent ranking in search engines.

Additionally, the plugin can be combined with other built-in plugins that Material for MkDocs offers, in order to create sophisticated build pipelines tailored to your project:

  •   Built-in privacy plugin


    The privacy plugin makes it easy to use unoptimized external assets, passing them to the optimize plugin before copying them to the site directory.


    External media files can be automatically downloaded and optimized

  •   Built-in offline plugin


    The offline plugin adds support for building offline-capable documentation, so you can distribute the site directory as a .zip file that can be downloaded.


    Your documentation can be distributed as a smaller .zip download

Configuration

insiders-4.29.0 optimize – built-in

As with all built-in plugins, getting started with the optimize plugin is straightforward. Just add the following lines to mkdocs.yml, and observe how media files are optimized automatically:

plugins:
+  - optimize
+

The optimize plugin is built into Material for MkDocs and doesn't need to be installed.

However, in order to optimize all media files, it's necessary to install the dependencies for image processing, if they're not already available on your system. The linked guide includes instructions for several operating systems and mentions some alternative environments.

General

The following settings are available:


enabled

insiders-4.29.0 true

Use this setting to enable or disable the plugin when building your project. If you want to disable the plugin, e.g., for local builds, you can use an environment variable in mkdocs.yml:

plugins:
+  - optimize:
+      enabled: !ENV [CI, false]
+

This configuration enables the plugin only during continuous integration (CI).


concurrency

insiders-4.29.0 available CPUs - 1

With more CPUs available, the plugin can do more work in parallel, and thus complete media file optimization faster. If you want to disable concurrent processing completely, use:

plugins:
+  - optimize:
+      concurrency: 1
+

By default, the plugin uses all available CPUs - 1 with a minimum of 1.

Caching

The plugin implements an intelligent caching mechanism, ensuring that a media file or asset is only passed through the optimization pipeline when its contents change. If you swap out or update an image, the plugin detects it and updates the optimized version of the media file.

The following settings are available for caching:


cache

insiders-4.29.0 true

Use this setting to instruct the plugin to bypass the cache, in order to re-optimize all media files, even though the cache may not be stale. It's normally not necessary to specify this setting, except for when debugging the plugin itself. Caching can be disabled with:

plugins:
+  - optimize:
+      cache: false
+

cache_dir

insiders-4.29.0 .cache/plugin/optimize

It is normally not necessary to specify this setting, except for when you want to change the path within your root directory where media files are cached. If you want to change it, use:

plugins:
+  - optimize:
+      cache_dir: my/custom/dir
+

If you're using multiple instances of the plugin, it can be a good idea to set different cache directories for both instances, so that they don't interfere with each other.

Optimization

Documentation often makes use of screenshots or diagrams for better visualization of things, both of which are prime candidates for optimization. The plugin automatically optimizes images using pngquant for .png files, and Pillow for .jpg files.

The following settings are available for optimization:


optimize

insiders-4.41.0 true

Use this setting to enable or disable media file optimization. Currently, the plugin's sole purpose is to optimize media files, so it's equivalent to the enabled setting, but in the near future, other features might be added. If you want to disable optimization, use:

plugins:
+  - optimize:
+      optimize: false
+

optimize_png

insiders-4.29.0 true

Use this setting to enable or disable the optimization of .png files. It's normally not necessary to specify this setting, but if you want to disable the optimization of .png files, use:

plugins:
+  - optimize:
+      optimize_png: false
+

optimize_png_speed

insiders-4.29.0 3 of 1-10

Use this setting to specify the speed/quality tradeoff that pngquant applies when optimizing .png files. The lower the number, the more aggressively pngquant will try to optimize:

plugins:
+  - optimize:
+      optimize_png_speed: 1
+
plugins:
+  - optimize:
+      optimize_png_speed: 10
+

A factor of 10 has 5% lower quality, but is 8x faster than the default 3.


optimize_png_strip

insiders-4.29.0 true

Use this setting to specify whether pngquant should strip optional metadata from .png files that are not required to display the image, e.g., EXIF. If you want to preserve metadata, use:

plugins:
+  - optimize:
+      optimize_png_strip: false
+

optimize_jpg

insiders-4.29.0 true

Use this setting to enable or disable the optimization of .jpg files. It's normally not necessary to specify this setting, but if you want to disable the optimization of .jpg files, use:

plugins:
+  - optimize:
+      optimize_jpg: false
+

optimize_jpg_quality

insiders-4.29.0 60 of 0-100

Use this setting to specify the image quality that Pillow applies when optimizing .jpg files. If the images look blurry, it's a good idea to fine-tune and change this setting:

plugins:
+  - optimize:
+      optimize_jpg_quality: 75
+

optimize_jpg_progressive

insiders-4.29.0 true

Use this setting to specify whether Pillow should use progressive encoding when optimizing .jpg files, rendering faster on slow connections. If you want to disable progressive encoding, use:

plugins:
+  - optimize:
+      optimize_jpg_progressive: false
+

optimize_include

insiders-4.41.0

Use this setting to enable media file optimization for specific directories of your project, e.g., when using multiple instances of the plugin to optimize media files differently:

plugins:
+  - optimize:
+      optimize_include:
+        - screenshots/*
+

This configuration enables optimization for all media files that are contained in the screenshots folder and its subfolders inside the docs directory.


optimize_exclude

insiders-4.41.0

Use this setting to disable media file optimization for specific directories of your project, e.g., when using multiple instances of the plugin to optimize media files differently:

plugins:
+  - social:
+      optimize_exclude:
+        - vendor/*
+

This configuration disables optimization for all media files that are contained in the vendor folder and its subfolders inside the docs directory.

Reporting

The following settings are available for reporting:


print_gain

insiders-4.29.0 true

Use this setting to control whether the plugin should print the number of bytes gained after optimizing each file. If you want to disable this behavior, use:

plugins:
+  - optimize:
+      print_gain: false
+

print_gain_summary

insiders-4.29.0 true

Use this setting to control whether the plugin should print the total number of bytes gained after optimizing all files. If you want to disable this behavior, use:

plugins:
+  - optimize:
+      print_gain_summary: false
+
\ No newline at end of file diff --git a/plugins/privacy/index.html b/plugins/privacy/index.html new file mode 100755 index 0000000..e43350d --- /dev/null +++ b/plugins/privacy/index.html @@ -0,0 +1,59 @@ + Built-in privacy plugin - 一抹雨烟

Built-in privacy plugin

The privacy plugin offers a streamlined solution for automatically self-hosting external assets. With just a single line of configuration, the plugin can automatically identify and download external assets, making GDPR compliance as effortless as it can possibly be.


Sponsors only – this plugin is currently reserved to our awesome sponsors.

Objective

How it works

The plugin scans the generated HTML for external assets, i.e., scripts, style sheets, images, and web fonts, downloads them, stores them in the site directory and replaces all references with links to the downloaded copies for effortless self-hosting. For example:

<script src="https://example.com/script.js"></script>
+

This external script is downloaded, and the link is replaced with:

<script src="assets/external/example.com/script.js"></script>
+

Of course, scripts and style sheets can reference further external assets, which is why this process is repeated recursively until no further external assets are detected:

  • Scripts are scanned for further scripts, style sheets and JSON files
  • Style sheets are scanned for images and web fonts

Additionally, hints like preconnect, used to reduce latency when requesting external assets, are removed from the output, as they're not necessary when self-hosting. After the plugin has done it's work, your project will be free of requests to external services.

There are some limitations.

When to use it

The plugin was developed to make compliance with the 2018 European General Data Protection Regulation (GDPR) as simple as possible, while retaining the flexibility and power that Material for MkDocs offers, like for example its tight integration with Google Fonts.

But, that's only the start. For example, if your project includes a lot of images, enabling the plugin allows to move them outside of your repository, as the plugin will automatically download and store them in the site directory when building your project.

Even more interestingly, the plugin can be combined with other built-in plugins that Material for MkDocs offers, in order to create sophisticated build pipelines tailored to your project:

  •   Built-in optimize plugin


    The optimize plugin allows to optimize all downloaded external assets detected by the privacy plugin by using compression and conversion techniques.


    External media files are automatically downloaded and optimized

  •   Built-in offline plugin


    The offline plugin adds support for building offline-capable documentation, so you can distribute the site directory as a .zip file that can be downloaded.


    Your documentation can work without connectivity to the internet

Configuration

insiders-4.9.0 privacy – built-in

As with all built-in plugins, getting started with the privacy plugin is straightforward. Just add the following lines to mkdocs.yml, and start effortlessly self-hosting external assets:

plugins:
+  - privacy
+

The privacy plugin is built into Material for MkDocs and doesn't need to be installed.

General

The following settings are available:


enabled

insiders-4.10.0 true

Use this setting to enable or disable the plugin when building your project. If you want to disable the plugin, e.g., for local builds, you can use an environment variable in mkdocs.yml:

plugins:
+  - privacy:
+      enabled: !ENV [CI, false]
+

This configuration enables the plugin only during continuous integration (CI).


concurrency

insiders-4.30.0 available CPUs - 1

With more CPUs available, the plugin can do more work in parallel, and thus complete handling of external assets faster. If you want to disable concurrent processing completely, use:

plugins:
+  - privacy:
+      concurrency: 1
+

By default, the plugin uses all available CPUs - 1 with a minimum of 1.

Caching

The plugin implements an intelligent caching mechanism, ensuring that external assets are only downloaded when they're not already contained in the cache. While the initial build might take some time, it's a good idea to use caching, as it will speed up consecutive builds.

The following settings are available for caching:


cache

insiders-4.30.0 true

Use this setting to instruct the plugin to bypass the cache, in order to re-schedule downloads for all external assets, even though the cache may not be stale. It's normally not necessary to specify this setting, except for when debugging the plugin itself. Caching can be disabled with:

plugins:
+  - privacy:
+      cache: false
+

cache_dir

insiders-4.30.0 .cache/plugin/privacy

It is normally not necessary to specify this setting, except for when you want to change the path within your root directory where downloaded copies are cached. If you want to change it, use:

plugins:
+  - privacy:
+      cache_dir: my/custom/dir
+

If you're using multiple instances of the plugin, it can be a good idea to set different cache directories for both instances, so that they don't interfere with each other.

External assets

The following settings are available for external assets:


assets

insiders-4.37.0 true

Use this setting to control whether the plugin should download external assets. If you only want the plugin to process external links, you can disable handling of external assets with:

plugins:
+  - privacy:
+      assets: false
+

assets_fetch

insiders-4.37.0 true

Use this setting to control whether the plugin should downloads or only report external assets when they're encountered. If you already self-host all external assets, this setting can be used as a safety net to detect links to external assets placed by the author in pages:

plugins:
+  - privacy:
+      assets_fetch: true
+

assets_fetch_dir

insiders-4.37.0 assets/external

It is normally not necessary to specify this setting, except for when you want to change the path within the site directory where external assets are stored. If you want to change it, use:

plugins:
+  - privacy:
+      assets_fetch_dir: my/custom/dir
+

This configuration stores the downloaded copies at my/custom/dir in the site directory.


assets_include

insiders-4.37.0

Use this setting to enable downloading of external assets for specific origins, e.g., when using multiple instances of the plugin to fine-tune processing of external assets for different origins:

plugins:
+  - privacy:
+      assets_include:
+        - unsplash.com/*
+

assets_exclude

insiders-4.37.0

Use this setting to disable downloading of external assets for specific origins, e.g., when using multiple instances of the plugin to fine-tune processing of external assets for different origins:

plugins:
+  - privacy:
+      assets_exclude: # (1)!
+        - cdn.jsdelivr.net/npm/mathjax@3/*
+        - giscus.app/*
+
  1. MathJax loads web fonts for typesetting of mathematical content through relative URLs, and thus cannot be automatically bundled by the privacy plugin. MathJax can be self-hosted.

    Giscus, which we recommend to use as a comment system, uses a technique called code-splitting to load only the code that is necessary, which is implemented via relative URLs. Giscus can be self-hosted as well.


The following settings are available for external links:


insiders-4.37.0 true

Use this setting to instruct the plugin to parse and process external links to annotate them for improved security, or to automatically add additional attributes to external links. If you want to disable processing of external links, use:

plugins:
+  - privacy:
+      links: false
+

insiders-4.37.0

Use this setting to specify additional attributes that should be added to external links, for example, to add target="_blank" to all external links so they open in a new tab:

plugins:
+  - privacy:
+      links_attr_map:
+        target: _blank
+

insiders-4.37.0 true

It is normally not recommended to change this setting, as it will automatically annotate external links that open in a new window with rel="noopener" for improved security:

plugins:
+  - privacy:
+      links_noopener: true
+

Limitations

Dynamically created URLs as part of scripts are not detected, and thus cannot be downloaded automatically, as the plugin does not execute scripts – it only detects fully qualified URLs for downloading and replacement. In short, don't do this:

const cdn = "https://polyfill.io"
+const url = `${cdn}/v3/polyfill.min.js`
+

Instead, always use fully qualified URLs:

const url ="https://polyfill.io/v3/polyfill.min.js"
+
\ No newline at end of file diff --git a/plugins/projects/index.html b/plugins/projects/index.html new file mode 100755 index 0000000..8183665 --- /dev/null +++ b/plugins/projects/index.html @@ -0,0 +1,70 @@ + Built-in projects plugin - 一抹雨烟

Built-in projects plugin

The projects plugin adds the ability to split your main project into multiple distinct projects, build them concurrently and preview them together as one. This is particularly useful when creating a multi-language project, but can also be used to split very large projects into smaller parts.


Sponsors only – this plugin is currently reserved to our awesome sponsors.

Objective

How it works

The plugin scans the configured projects directory for mkdocs.yml files, identifies all nested projects and builds them concurrently. If not configured otherwise, the plugin expects that your project has the following directory layout, e.g. for a multi-language project:

.
+├─ docs/
+├─ projects/
+  ├─ en/
+    ├─ docs/
+    └─ mkdocs.yml
+  └─ de/
+     ├─ docs/
+     └─ mkdocs.yml
+└─ mkdocs.yml
+

One of the most useful and interesting features of the plugin is that it allows previewing your site from the main project, while still being able to preview and build each project individually. This is especially useful for multi-language projects.

If, when previewing your site, you change a file in one of the projects, the plugin only rebuilds this project and makes sure that MkDocs will also reload the associated files. This also creates the opportunity for splitting your main project into several projects for a better editing experience.

There are some limitations, but we're working hard to remove them.

When to use it

The plugin came into existence because we needed a convenient and scalable method to build our examples repository, which features many self-contained and runnable projects that users can download and use as a basis when boostrapping a new project or creating a reproduction.

When you want to create a multi-language project, or have a very large existing project, you might consider using the plugin, as it makes managing, editing and building more comfortable.

Configuration

insiders-4.38.0 projects – built-in

In order to get started with the projects plugin, just add the following lines to mkdocs.yml, and split your main project into several distinct projects that can be built concurrently:

plugins:
+  - projects
+

The projects plugin is built into Material for MkDocs and doesn't need to be installed.

General

The following settings are available:


enabled

insiders-4.38.0 true

Use this setting to enable or disable the plugin when building your project. If you want to disable the plugin, e.g., for local builds, you can use an environment variable in mkdocs.yml:

plugins:
+  - projects:
+      enabled: !ENV [CI, false]
+

This configuration enables the plugin only during continuous integration (CI).


concurrency

insiders-4.38.0 available CPUs - 1

With more CPUs available, the plugin can do more work in parallel, and thus build projects faster. If you want to disable concurrent processing completely, use:

plugins:
+  - projects:
+      concurrency: 1
+

By default, the plugin uses all available CPUs - 1 with a minimum of 1.

Caching

The plugin implements an intelligent caching mechanism, ensuring that a project is only rebuilt when its contents change. While the initial build might take some time, it's a good idea to use caching, as it will speed up consecutive builds.

The following settings are available for caching:


cache

insiders-4.38.0 true

Use this setting to instruct the plugin to bypass the cache, in order to rebuild all projects, even though the cache may not be stale. It's normally not necessary to specify this setting, except for when debugging the plugin itself. Caching can be disabled with:

plugins:
+  - projects:
+      cache: false
+

cache_dir

insiders-4.38.0 .cache/plugin/projects

It is normally not necessary to specify this setting, except for when you want to change the path within your root directory where the metadata is cached. If you want to change it, use:

plugins:
+  - projects:
+      cache_dir: my/custom/dir
+

Projects

The following settings are available for projects:


projects

insiders-4.38.0 true

Use this setting to enable or disable building of projects. Currently, the plugin's sole purpose is to build projects, so it's equivalent to the enabled setting, but in the future, other features might be added. If you want to disable building of projects, use:

plugins:
+  - projects:
+      projects: false
+

projects_dir

insiders-4.38.0 projects

Use this setting to change the folder where your projects are located. It's normally not necessary to change this setting, but if you want to rename the folder or change its file system location, use:

plugins:
+  - projects:
+      projects_dir: projects
+

Note that the projects directory is solely used for project organization – it is not included in project URLs, since projects are automatically hoisted by the plugin.

The provided path is resolved from the root directory.


projects_config_files

insiders-4.42.0 */mkdocs.yml

Use this setting to change the location or name of configuration files the plugin will look for when scanning the projects directory. Adjusting this setting can be necessary when the configuration files are located in subdirectories of projects, e.g. docs/mkdocs.yml:

plugins:
+  - projects:
+      projects_config_files: "**/mkdocs.yml" # (1)!
+
  1. If all projects share the same location for their configuration files, e.g., docs/mkdocs.yml, it's advisable to fully qualify the path, as it's faster to resolve than a ** glob pattern.

    plugins:
    +  - projects:
    +      projects_config_files: "*/docs/mkdocs.yml"
    +

    This configuration fits the following directory structure, which is quite common for projects using git submodules:

    .
    +├─ docs/
    +├─ projects/
    +  ├─ git-submodule-a/
    +    └─ docs/
    +       └─ mkdocs.yml
    +  └─ git-submodule-b/
    +     └─ docs/
    +        └─ mkdocs.yml
    +└─ mkdocs.yml
    +

The provided path is resolved from the projects directory.


projects_config_transform

insiders-4.42.0

Use this setting to transform the configuration of each project as read from mkdocs.yml before it is built, which allows for adjusting the configuration of each project when building them together, but leave them untouched when building them individually:

plugins:
+  - projects:
+      projects_config_transform: !!python/name:projects.transform
+

The provided module and function name are looked up in Python's module search path. You need to add your root directory to the search path when building your site, so Python can resolve it. The easiest way is to add the working directory to the PYTHONPATH environment variable:

export PYTHONPATH=.
+

How to define a configuration transformation function

The python/name tag is provided by PyYAML and must point to a valid module and function name within Python's module search path. The plugin passes the project and top-level config objects to the function.

As an example, we can inherit the use_directory_urls setting for all projects from the top-level configuration:

projects/__init__.py
from mkdocs.config.defaults import MkDocsConfig
+
+# Transform project configuration
+def transform(project: MkDocsConfig, config: MkDocsConfig):
+    project.use_directory_urls = config.use_directory_urls
+

Hoisting

The following settings are available for hoisting:


hoisting

insiders-4.39.0 true

Use this setting to enable or disable hoisting of themes files to the main project. If you disable this setting, each project receives a copy of the theme's files, which can be considered redundant:

plugins:
+  - projects:
+      hoisting: false
+

It's generally advisable to enable hoisting, as it yields faster deployments and faster loading of your project's sites, because the files are the same for all projects and can be deduplicated.

Limitations

The plugin is one of the latest additions to Material for MkDocs, which means it is rather young and has some limitations. We're working hard to remove them, and we're happy to receive feedback and learn about your requirements in #5800. Current limitations are:

  • Basic multi-language support only: we'll be investigating how to provide better support for multi-language projects, allowing to easier interlink projects and switch between them.

  • Separate search indexes and sitemaps: currently, the projects are entirely separate, which means they will have separate search indexes and sitemaps.

\ No newline at end of file diff --git a/plugins/requirements/caching/index.html b/plugins/requirements/caching/index.html new file mode 100755 index 0000000..09ffe2c --- /dev/null +++ b/plugins/requirements/caching/index.html @@ -0,0 +1,13 @@ + Caching - 一抹雨烟

Caching

Some of the built-in plugins implement intelligent caching mechanisms, which massively speed up consecutive builds by reducing the amount of work that needs to be done. This guide explains how to configure caching in different environments.

Prerequisites

Caching is entirely optional but enabled by default. It can be disabled per plugin. If not configured otherwise, plugins will cache their data in the .cache folder in the root of your project. For this reason it's recommended to create a .gitignore file in the root of your project:

.gitignore
.cache
+

This ensures that cached files are not added to your git repository – something that is generally not recommended to do unless absolutely necessary. In some cases, you might need to check in cached files, e.g. when you need to pre-generate social cards locally, e.g., when you're not be able to install the image processing dependencies in your continuous integration (CI) environment.

In this case, we recommend changing the cache_dir setting – something that all plugins that implement caching share – to a folder which you add to your git repository.

\ No newline at end of file diff --git a/plugins/requirements/image-processing/index.html b/plugins/requirements/image-processing/index.html new file mode 100755 index 0000000..0ddabc0 --- /dev/null +++ b/plugins/requirements/image-processing/index.html @@ -0,0 +1,19 @@ + Image processing - 一抹雨烟

Image processing

Some of the built-in plugins depend on external libraries for efficient image processing, most notably the social plugin to generate social cards, and the optimize plugin for applying image optimization. This guide explains how to install those libraries in different environments.

Dependencies

The libraries for image processing are entirely optional, and only need to be installed if you want to use the social plugin or the optimize plugin. The libraries are listed under the imaging extra:

pip install "mkdocs-material[imaging]"
+

This will install compatible versions of the following packages:

Cairo Graphics

Cairo Graphics is a graphics library and dependency of Pillow, which Material for MkDocs makes use of for generating social cards and performing image optimization. See the following section which explains how to install Cairo Graphics and its dependencies on your system:

Make sure Homebrew is installed, which is a modern package manager for macOS. Next, use the following command to install all necessary dependencies:

brew install cairo freetype libffi libjpeg libpng zlib
+

As stated in the installation guide, the easiest way to get up and running with the Cairo Graphics library on Windows is by installing GTK+. You can also download a precompiled GTK runtime.

There are several package managers for Linux with varying availability per distribution. The installation guide explains how to install the Cairo Graphics library for your distribution:

apt-get install libcairo2-dev libfreetype6-dev libffi-dev libjpeg-dev libpng-dev libz-dev
+
yum install cairo-devel freetype-devel libffi-devel libjpeg-devel libpng-devel zlib-devel
+
zypper install cairo-devel freetype-devel libffi-devel libjpeg-devel libpng-devel zlib-devel
+

The following environments come with a preinstalled version of Cairo Graphics:

pngquant

pngquant is an excellent library for lossy PNG compression, and a direct dependency of the built-in optimize plugin. See the following section which explains how to install pngquant system:

Make sure Homebrew is installed, which is a modern package manager for macOS. Next, use the following command to install all necessary dependencies:

brew install pngquant
+

Installing pngquant on Windows is a little more involved. The pngquant-winbuild repository contains a guide on how to set up an environment for building pngquant on Windows.

All popular Linux distributions, regardless of package manager, should allow to install pngquant with the bundled package manager. For example, on Ubuntu, pngquant can be installed with:

apt-get install pngquant
+

The same is true for yum and zypper.

The following environments come with a preinstalled version of pngquant:

\ No newline at end of file diff --git a/plugins/search/index.html b/plugins/search/index.html new file mode 100755 index 0000000..02ea185 --- /dev/null +++ b/plugins/search/index.html @@ -0,0 +1,65 @@ + Built-in search plugin - 一抹雨烟

Built-in search plugin

The search plugin adds a search bar to the header, allowing users to search your documentation. It's powered by lunr.js, a lightweight full-text search engine for the browser, elimininating the need for external services, and even works when building offline-capable documentation.

Objective

How it works

The plugin scans the generated HTML and builds a search index from all pages and sections by extracting the section titles and contents. It preserves some inline formatting like code blocks and lists, but removes all other formatting, so the search index is as small as possible.

When a user visits your site, the search index is shipped to the browser, indexed with lunr.js and made available for fast and simple querying – no server needed. This ensures that the search index is always up to date with your documentation, yielding accurate results.

When to use it

It's generally recommended to use the plugin, as interactive search functionality is a vital part of every good documentation. Additionally, the plugin integrates perfectly with several of the other built-in plugins that Material for MkDocs offers:

  •   Built-in offline plugin


    The offline plugin adds support for building offline-capable documentation, so you can distribute the site directory as a .zip file that can be downloaded.


    Your documentation can work without connectivity to the internet

  •   Built-in meta plugin


    The meta plugin makes it easy to boost specific sections in search results or to exclude them entirely from being indexed, giving more granular control over search.


    Simpler organization and management of search in different subsections

Configuration

9.0.0 search – built-in

As with all built-in plugins, getting started with the search plugin is straightforward. Just add the following lines to mkdocs.yml, and your users will be able to search your documentation:

plugins:
+  - search
+

The search plugin is built into Material for MkDocs and doesn't need to be installed.

General

The following settings are available:


enabled

9.2.9 true

Use this setting to enable or disable the plugin when building your project. It's normally not necessary to specify this setting, but if you want to disable the plugin, use:

plugins:
+  - search:
+      enabled: false
+

The following settings are available for search:


lang

9.0.0

Use this setting to specify the language of the search index, enabling stemming support for other languages than English. The default value is automatically computed from the site language, but can be explicitly set to another language or even multiple languages with:

plugins:
+  - search:
+      lang: en
+
plugins:
+  - search:
+      lang: # (1)!
+        - en
+        - de
+
  1. Be aware that including support for further languages increases the base JavaScript payload by around 20kb and by another 15-30kb per language, all before gzip.

Language support is provided by lunr languages, a collection of language-specific stemmers and stop words for lunr.js maintained by the Open Source community.


The following languages are currently supported by lunr languages:

  • ar – Arabic
  • da – Danish
  • de – German
  • du – Dutch
  • en – English
  • es – Spanish
  • fi – Finnish
  • fr – French
  • hi – Hindi
  • hu – Hungarian
  • hy – Armenian
  • it – Italian
  • ja – Japanese
  • kn - Kannada
  • ko – Korean
  • no – Norwegian
  • pt – Portuguese
  • ro – Romanian
  • ru – Russian
  • sa – Sanskrit
  • sv – Swedish
  • ta – Tamil
  • te – Telugu
  • th – Thai
  • tr – Turkish
  • vi – Vietnamese
  • zh – Chinese

If lunr languages doesn't provide support for the selected site language, the plugin falls back to another language that yields the best stemming results. If you discover that the search results are not satisfactory, you can contribute to lunr languages by adding support for your language.


separator

9.0.0

Use this setting to specify the separator used to split words when building the search index on the client side. The default value is automatically computed from the site language, but can also be explicitly set to another value with:

plugins:
+  - search:
+      separator: '[\s\-,:!=\[\]()"/]+|(?!\b)(?=[A-Z][a-z])|\.(?!\d)|&[lg]t;'
+

Separators support positive and negative lookahead assertions, which allows for rather complex expressions that yield precise control over how words are split when building the search index.

Broken into its parts, this separator induces the following behavior:

[\s\-,:!=\[\]()"/]+
+

The first part of the expression inserts token boundaries for each document before and after whitespace, hyphens, commas, brackets and other special characters. If several of those special characters are adjacent, they are treated as one.

(?!\b)(?=[A-Z][a-z])
+

Many programming languages have naming conventions like PascalCase or camelCase. By adding this subexpression to the separator, words are split at case changes, tokenizing the word PascalCase into Pascal and Case.

\.(?!\d)
+

When adding . to the separator, version strings like 1.2.3 are split into 1, 2 and 3, which makes them undiscoverable via search. When using this subexpression, a small lookahead is introduced which will preserve version strings and keep them discoverable.

&[lg]t;
+

If your documentation includes HTML/XML code examples, you may want to allow users to find specific tag names. Unfortunately, the < and > control characters are encoded in code blocks as &lt; and &gt;. Adding this subexpression to the separator allows for just that.


pipeline

9.0.0

Use this setting to specify the pipeline functions that are used to filter and expand tokens after tokenizing them with the separator and before adding them to the search index. The default value is automatically computed from the site language, but can also be explicitly set with:

plugins:
+  - search:
+      pipeline:
+        - stemmer
+        - stopWordFilter
+        - trimmer
+

The following pipeline functions can be used:

  • stemmer – Stem tokens to their root form, e.g. running to run
  • stopWordFilter – Filter common words according, e.g. a, the, etc.
  • trimmer – Trim whitespace from tokens

Segmentation

The plugin supports text segmentation of Chinese via jieba, a popular Chinese text segmentation library. Other languages like Japanese and Korean are currently segmented on the client side, but we're considering to move this functionality into the plugin in the future.

The following settings are available for segmentation:


jieba_dict

9.2.0

Use this setting to specify a custom dictionary to be used by jieba for segmenting text, replacing the default dictionary. jieba comes with several dictionaries, which can be used with:

plugins:
+  - search:
+      jieba_dict: dict.txt
+

The following dictionaries are provided by jieba:

The provided path is resolved from the root directory.


jieba_dict_user

9.2.0

Use this setting to specify an additional user dictionary to be used by jieba for segmenting text, augmenting the default dictionary. User dictionaries are ideal for tuning the segmenter:

plugins:
+  - search:
+      jieba_dict_user: user_dict.txt
+

The provided path is resolved from the root directory.

Usage

Metadata

The following properties are available:


boost

8.3.0

Use this property to increase or decrease the relevance of a page in the search results, giving more weight to them. Use values above 1 to rank up and values below 1 to rank down:

---
+search:
+  boost: 2 # (1)!
+---
+
+# Page title
+...
+
  1. When boosting pages, always start with low values.
---
+search:
+  boost: 0.5
+---
+
+# Page title
+...
+

exclude

9.0.0

Use this property to exclude a page from the search results. Note that this will not only remove the page, but also all subsections of the page from the search results:

---
+search:
+  exclude: true
+---
+
+# Page title
+...
+
\ No newline at end of file diff --git a/plugins/social/index.html b/plugins/social/index.html new file mode 100755 index 0000000..4660954 --- /dev/null +++ b/plugins/social/index.html @@ -0,0 +1,183 @@ + Built-in social plugin - 一抹雨烟

Built-in social plugin

The social plugin automatically and intelligently generates beautiful and highly customizable social cards in different layouts for each page of your project, rendering as preview images whenever you or somebody else share a link to your project on social media.

Objective

How it works

The plugin automatically generates a customizable social card for each page of your project, which appears as a preview image when sharing a link to your project on social media, without the use of external services and just a single line of configuration.

With the use of an efficient image processing library, the plugin allows to define custom layouts for social cards, which can be adapted to match your project's style and branding. While it would technically be much simpler to generate social cards by using a web browser and an automation framework like Puppeteer1, it would add further liabilities to your toolchain, with the potential to make build pipelines more complex, much more resource intense, and significantly slower.

The generated social cards are cached and stored in the site directory, and thus self-hosted, ensuring that your project doesn't depend on external services. In order to generate social cards images, a few dependencies need to be available on your system.

When to use it

There's one particular case when we don't recommend to use the plugin: when you build offline-capable documentation to offer it as a download. Otherwise, it always makes sense to enable the plugin, as links to your documentation shared on social media will appear much more appealing.

Even more interestingly, the plugin can be combined with other built-in plugins that Material for MkDocs offers, in order to create sophisticated build pipelines tailored to your project:

Configuration

8.5.0 social – built-in

In order to get started with the social plugin, just add the following lines to mkdocs.yml, and observe how Material for MkDocs generates beautiful social cards for you:

plugins:
+  - social
+

The social plugin is built into Material for MkDocs and doesn't need to be installed.

However, in order to generate social card images, it's necessary to install the dependencies for image processing, if they're not already available on your system. The linked guide includes instructions for several operating systems and mentions some alternative environments.

General

The following settings are available:


enabled

8.5.0 true

Use this setting to enable or disable the plugin when building your project. If you want to disable the plugin, e.g., for local builds, you can use an environment variable in mkdocs.yml:

plugins:
+  - social:
+      enabled: !ENV [CI, false]
+

This configuration enables the plugin only during continuous integration (CI).


concurrency

insiders-4.33.0 available CPUs - 1

With more CPUs available, the plugin can do more work in parallel, and thus complete social card generation faster. If you want to disable concurrent processing completely, use:

plugins:
+  - social:
+      concurrency: 1
+

By default, the plugin uses all available CPUs - 1 with a minimum of 1.

Caching

The plugin implements an intelligent caching mechanism, ensuring that social cards are only regenerated when their contents change or they're not already contained in the cache. If any of the variables used in a layout changes, the plugin detects it and regenerates the social card.

The following settings are available for caching:


cache

insiders-4.33.0 true

Use this setting to instruct the plugin to bypass the cache, in order to re-generate social cards for all pages, even though the cache may not be stale. It's normally not necessary to specify this setting, except for when debugging the plugin itself. Caching can be disabled with:

plugins:
+  - social:
+      cache: false
+

cache_dir

8.5.0 .cache/plugin/social

It is normally not necessary to specify this setting, except for when you want to change the path within your root directory where social card images are cached. If you want to change it, use:

plugins:
+  - social:
+      cache_dir: my/custom/dir
+

If you're using multiple instances of the plugin, it can be a good idea to set different cache directories for both instances, so that they don't interfere with each other.

Logging

The following settings are available for logging:


log

insiders-4.40.2 true

Use this setting to control whether the plugin should only log errors when generating social cards without terminating the build, e.g., invalid references to icons. To terminate the build, use:

plugins:
+  - social:
+      log: false
+

log_level

insiders-4.40.2 warn

Use this setting to control the log level that the plugin should employ when encountering errors, which requires that the log setting is enabled. The following log levels are available:

plugins:
+  - social:
+      log_level: warn
+

Errors are reported as warnings, terminating the build in strict mode.

plugins:
+  - social:
+      log_level: info
+

Errors are only reported as informational messages.

plugins:
+  - social:
+      log_level: ignore
+

Errors are only reported when using the --verbose flag.

Social cards

The following settings are available for social card generation:


cards

8.5.0 true

Use this setting to enable or disable social card generation. Currently, the plugin's sole purpose is to generate social cards, so it's equivalent to the enabled setting, but in the future, other features might be added. If you want to disable social card generation, use:

plugins:
+  - social:
+      cards: false
+

cards_dir

8.5.0 assets/images/social

It is normally not necessary to specify this setting, except for when you want to change the path within the site directory where social cards are stored. If you want to change it, use:

plugins:
+  - social:
+      cards_dir: my/custom/dir
+

This configuration stores the generated images at my/custom/dir in the site directory.


cards_layout_dir

insiders-4.33.0 layouts

If you want to build a custom social card layout, use this setting to change the folder where you store your custom layouts, the default being a folder called layouts in your root directory:

plugins:
+  - social:
+      cards_layout_dir: layouts
+

The provided path is resolved from the root directory.

Where to store custom layouts

Our recommendation is to locate the folder outside of the docs directory, to make sure that your custom layouts are not copied to the site directory when building your project, e.g., by adhering to the following directory layout:

.
+├─ docs/
+  └─ *.md
+├─ layouts/
+  └─ *.yml
+└─ mkdocs.yml
+

cards_layout

insiders-4.33.0 default

The plugin ships a growing list of default layouts for social cards. If you've created a custom social card layout, you can instruct the plugin to use it exactly as one of the included layouts:

plugins:
+  - social:
+      cards_layout: my-custom-layout
+

The provided path is resolved from the layouts directory.

How custom layouts are resolved

By default, the plugin will load your custom layouts from a folder named layouts in your root directory. If your layout is called my-custom-layout, the directory layout must adhere to:

.
+├─ docs/
+  └─ *.md
+├─ layouts/
+  └─ my-custom-layout.yml
+└─ mkdocs.yml
+

cards_layout_options

9.1.10

Use this setting to set options for the layout specified via cards_layout (if the layout supports it), which allows for making layouts easily and entirely configurable:

plugins:
+  - social:
+      cards_layout_options:
+        <option>: <value>
+

When creating a custom layout, you are completely free in defining which parts of your layout can be parametrized. The default layouts included with the plugin support the following options:


cards_include

insiders-4.35.0

Use this setting to enable social card generation for subsections of your project, e.g., when using multiple instances of the plugin to generate different social cards for different subsections:

plugins:
+  - social:
+      cards_include:
+        - blog/*
+

This configuration enables social card generation for all pages that are contained in the blog folder and its subfolders inside the docs directory.


cards_exclude

insiders-4.35.0

Use this setting to disable social card generation for subsections of your project, e.g., when using multiple instances of the plugin to generate different social cards for different subsections:

plugins:
+  - social:
+      cards_exclude:
+        - changelog/*
+

This configuration disables social card generation for all pages that are contained in the changelog folder and its subfolders inside the docs directory.

Debugging

The plugin includes a special mode for debugging layouts, which is very useful when creating custom layouts, as it allows for quicker iteration and better understanding of composition.

The following settings are available for debugging:


debug

insiders-4.33.0 false

Use this setting to enable a special mode for debugging your layout, which renders each layer with a colored outline and its x and y offsets, and overlays a dot grid for alignment, so it's easier to understand how the distinct layers of your layout are composed together:

plugins:
+  - social:
+      debug: true
+

debug_on_build

insiders-4.34.1 false

By default, the plugin automatically disables debug mode when building your project, so you can be sure that debug overlays are never deployed to production. If you want to change that, use:

plugins:
+  - social:
+      debug_on_build: true
+

It's normally not necessary to change this setting, as it's just intended to be a safety net.


debug_grid

insiders-4.33.0 true

When debug mode is enabled, this setting specifies whether a dot grid is rendered on top of all layers, to allow for better alignment. If you want to switch the grid off, use:

plugins:
+  - social:
+      debug_grid: false
+

debug_grid_step

insiders-4.33.0 32

Use this setting to specify the step size of the dot grid in pixels, if enabled, which can be useful to create perfectly aligned layers for ideal composition. It you want to change it, use:

plugins:
+  - social:
+      debug_grid_step: 64
+

debug_color

insiders-4.33.0 grey

Use this setting to specify the color of the outlines that are added to each layer and the dot grid that is rendered on top of all layers. If you need to change it, use:

plugins:
+  - social:
+      debug_color: yellow
+

In rare cases, it might be necessary to change this setting if the dot grid or the outlines are hard to distinguish, as the plugin will automatically adjust the color if not explicitly set.

Usage

Metadata

The plugin allows to override a subset of settings through metadata (front matter) in order to customize social card generation, e.g., to set options for the included default layouts for a single page, or even for an entire subsection of your project by leveraging the meta plugin.

The following properties are available:


cards

insiders-4.37.0

Use this property to override the cards setting for the given page:

---
+social:
+  cards: false
+---
+
+# Page title
+...
+

cards_layout

insiders-4.37.0

Use this property to override the cards_layout setting for the given page:

---
+social:
+  cards_layout: my-custom-layout
+---
+
+# Page title
+...
+

cards_layout_options

insiders-4.37.0

Use this property to override the cards_layout_options setting for the given page:

---
+social:
+  cards_layout_options:
+    background_color: blue             # Change background color
+    background_image: null             # Remove background image
+---
+
+# Page title
+...
+

Setting an option to null resets the option.

Layouts

While it is possible and simple to build custom layouts, the plugin ships several predefined layouts, all of which are prefixed with default. The following layouts are included:

plugins:
+  - social:
+      cards_layout: default
+

Layout default

This layout sets the following defaults:

plugins:
+  - social:
+      cards_layout: default/variant
+

Layout default variant

This layout includes the page icon and sets the following defaults:

plugins:
+  - social:
+      cards_layout: default/accent
+

Layout default accent

This layout sets the following defaults:

plugins:
+  - social:
+      cards_layout: default/invert
+

Layout default invert

This layout sets the following defaults:

plugins:
+  - social:
+      cards_layout: default/only/image
+      cards_layout_options:
+        background_image: layouts/background.png
+

This layout only shows the given background image and scales it to cover.

The default layouts are very flexible and comfortable to use, as they replicate the original behavior of the plugin, sourcing default values for all options from other theme settings.

The following options are available:


background_color

9.1.10

Use this option to change the background color of the generated social card. The value can be set to a valid color value supported by pillow, the imaging library used for card generation:

plugins:
+  - social:
+      cards_layout_options:
+        background_color: "#ff1493" # (1)!
+
  1. The following notations are supported, whereas each character after the # must be a valid hexadecimal in the range 0-F:

    • #rgb – Color (short)
    • #rgba – Color + alpha (short)
    • #rrggbb – Color
    • #rrggbbaa – Color + alpha
plugins:
+  - social:
+      cards_layout_options:
+        background_color: rgb(255, 20, 147) # (1)!
+
  1. The following functions are supported, listing the allowed maximum values with the minimum values all being 0 or 0%:

    • rgb(255, 255, 255) – Red, green and blue
    • hsl(360, 100%, 100%) – Hue, saturation and lightness
    • hsv(360, 100%, 100%) – Hue, saturation and value
plugins:
+  - social:
+      cards_layout_options:
+        background_color: deeppink # (1)!
+
  1. See the <named-color> CSS data type for a list of supported color names. Note that some might not be available.

If this options is used together with background_image, the color is rendered on top of the image which allows for tinting images. If you want to remove the background color, use:

plugins:
+  - social:
+      cards_layout_options:
+        background_color: transparent
+

background_image

insiders-4.33.0

Use this option to define a background image for the generated social card. Note that the image is tinted with the background_color, which can also be set to transparent:

plugins:
+  - social:
+      cards_layout_options:
+        background_image: layouts/background.png
+        background_color: transparent
+
plugins:
+  - social:
+      cards_layout_options:
+        background_image: layouts/background.png
+        background_color: "#ff149366"
+

The provided path is resolved from the root directory.


color

9.1.10

Use this option to change the foreground color of the generated social card. The value can be set to a valid color value supported by pillow, the imaging library used for card generation:

plugins:
+  - social:
+      cards_layout_options:
+        color: "#ffffff" # (1)!
+
  1. The following notations are supported, whereas each character after the # must be a valid hexadecimal in the range 0-F:

    • #rgb – Color (short)
    • #rgba – Color + alpha (short)
    • #rrggbb – Color
    • #rrggbbaa – Color + alpha
plugins:
+  - social:
+      cards_layout_options:
+        color: rgb(255, 255, 255) # (1)!
+
  1. The following functions are supported, listing the allowed maximum values with the minimum values all being 0 or 0%:

    • rgb(255, 255, 255) – Red, green and blue
    • hsl(360, 100%, 100%) – Hue, saturation and lightness
    • hsv(360, 100%, 100%) – Hue, saturation and value
plugins:
+  - social:
+      cards_layout_options:
+        color: white # (1)!
+
  1. See the <named-color> CSS data type for a list of supported color names. Note that some might not be available.

font_family

9.1.10

Use this option to change the font family of the generated social card. The plugin automatically downloads the font from Google Fonts, so the font must point to an existing Google Font:

plugins:
+  - social:
+      cards_layout_options:
+        font_family: Ubuntu
+

When you've found a font that you like on Google Fonts, you can just copy the name from the font's specimen page and use it as the value for this option – no further configuration needed.


insiders-4.40.0

Use this option to change the logo that is used in the generated social card. By default, the plugin uses the theme.logo or theme.icon.logo setting from mkdocs.yml. You can change it with:

plugins:
+  - social:
+      cards_layout_options:
+        logo: layouts/logo.png
+

The provided path is resolved from the root directory.


title

insiders-4.40.0

Use this option to change the title of the generated social card. This overrides the computed page title as assigned by MkDocs, as well as the title metadata property:

plugins:
+  - social:
+      cards_layout_options:
+        title: My custom title
+

description

insiders-4.40.0

Use this option to change the description of the generated social card. This overrides the set site_description, if defined, as well as the description metadata property:

plugins:
+  - social:
+      cards_layout_options:
+        description: My custom description
+

Missing something?

When setting up social cards, you might discover that you're missing specific functionality – we're happy to consider adding it to the plugin! You can open a discussion to ask a question, or create a change request on our issue tracker, so we can find out if it might be a good fit for the plugin.


  1. GitHub wrote in their blog that they use Puppeteer to generate social card images for repositories, issues, commits, discussions, and basically everything else that appear as preview images when shared on social media. 

\ No newline at end of file diff --git a/plugins/tags/index.html b/plugins/tags/index.html new file mode 100755 index 0000000..e4b7225 --- /dev/null +++ b/plugins/tags/index.html @@ -0,0 +1,67 @@ + Built-in tags plugin - 一抹雨烟

Built-in tags plugin

The tags plugin adds first-class support for categorizing pages with the use of tags, adding the possibility to group related pages and make them discoverable via search and dedicated tags indexes. If your documentation is large, tags can help to discover relevant information faster.

Objective

How it works

The plugin scans all pages for the tags metadata property and generates a tags index, which is an inverted list of tags and the pages they appear on. The tags index can be located anywhere in the nav, allowing for maximum flexibility when adding tags to your project.

When to use it

If you want to add one or multiple tags indexes to your project, the tags plugin is a perfect choice as it makes this process ridiculously simple. Additionally, it integrates perfectly with several of the other built-in plugins that Material for MkDocs offers:

  •   Built-in meta plugin


    The meta plugin makes it possible to ensure that subsections of your project are annotated with specific tags, so they can't be forgotten when adding pages.


    Simpler organization and management of tags in different subsections

  •   Built-in blog plugin


    The tags plugin allows to categorize posts alongside with pages in your project, to improve their discoverability and connect posts to your documentation.


    Your documentation's tag system integrates with your blog

Configuration

8.2.0 tags – built-in

As with all built-in plugins, getting started with the tags plugin is straightforward. Just add the following lines to mkdocs.yml, and start using tags to categorize your pages:

plugins:
+  - tags
+

The tags plugin is built into Material for MkDocs and doesn't need to be installed.

General

The following settings are available:


enabled

9.1.7 true

Use this setting to enable or disable the plugin when building your project. It's normally not necessary to specify this setting, but if you want to disable the plugin, use:

plugins:
+  - tags:
+      enabled: false
+

Tags

The following settings are available for tags:


tags

9.2.9 true

Use this setting to enable or disable handling of tags. Currently, the plugin's sole purpose is to process tags, so it's equivalent to the enabled setting, but in the future, other features might be added. If you want to disable handling of tags, use:

plugins:
+  - tags:
+      tags: false
+

tags_file

8.2.0

Use this setting to specify the location of the tags index, which is the page used to render a list of all tags and their associated pages. If this setting is specified, tags become clickable, pointing to the corresponding section in the tags index:

plugins:
+  - tags:
+      tags_file: tags.md
+

The page holding the tags index can be linked anywhere in the nav section of mkdocs.yml. This setting is not required – you should only use it if you want to have a tags index.

The provided path is resolved from the docs directory.


tags_extra_files

insiders-4.20.0

Use this setting to specify the locations of additional tags indexes, which are pages that render a subset of the tags index, in order to provide scoped tags indexes for specific sections:

plugins:
+  - tags:
+      tags_extra_files:
+        extra-1.md: [tag-id-1, tag-id-2, ...]
+        extra-2.md: [tag-id-3, tag-id-4, ...]
+        ...
+

The provided path is resolved from the docs directory.


tags_slugify

insiders-4.25.0 pymdownx.slugs.slugify

Use this setting to change the function for generating URL-compatible slugs from post titles. By default, the slugify function from Python Markdown Extensions is used as follows:

plugins:
+  - blog:
+      post_slugify: !!python/object/apply:pymdownx.slugs.slugify
+        kwds:
+          case: lower
+

The default configuration is Unicode-aware and should produce good slugs for all languages. Of course, you can also provide a custom slugification function for more granular control.


tags_slugify_separator

insiders-4.25.0 -

Use this setting to change the separator that is passed to the slugification function set as part of tags_slugify. While the default is a hyphen, it can be set to any string, e.g., _:

plugins:
+  - tags:
+      tags_slugify_separator: _
+

tags_compare

insiders-4.26.2

Use this setting to specify a custom function for comparing tags. By default, tag comparison is case-sensitive, but you can use the casefold function for case-insensitive comparison:

plugins:
+  - tags:
+      tags_compare: !!python/name:material.plugins.tags.casefold
+

You can also define your own comparison function, which must return a string representing the tag, that is used for sorting, and reference it in tags_compare.


tags_compare_reverse

insiders-4.26.2 false

Use this setting to reverse the order in which tags are sorted when comparing them. By default, tags are sorted in ascending order, but you can reverse ordering as follows:

plugins:
+  - tags:
+      tags_compare_reverse: true
+

tags_pages_compare

insiders-4.39.0

Use this setting to specify a custom function for comparing pages. By default, pages occur in order of appearance, but you can sort them by using the following configuration:

plugins:
+  - tags:
+      tags_pages_compare: !!python/name:material.plugins.tags.page_title
+
plugins:
+  - tags:
+      tags_pages_compare: !!python/name:material.plugins.tags.page_url
+

You can also define your own comparison function, which must return a string representing the page, that is used for sorting, and reference it in tags_pages_compare.


tags_pages_compare_reverse

insiders-4.39.0 false

Use this setting to reverse the order in which pages are sorted when comparing them. By default, pages are sorted in ascending order, but you can reverse ordering as follows:

plugins:
+  - tags:
+      tags_pages_compare_reverse: true
+

tags_allowed

insiders-4.25.0

The plugin allows to check tags against a predefined list, in order to catch typos or make sure that tags are not arbitrarily added. Specify the tags you want to allow with:

plugins:
+  - tags:
+      tags_allowed:
+        - HTML5
+        - JavaScript
+        - CSS
+

The plugin stops the build if a page references a tag that is not part of this list. Pages can be assigned to tags by using the tags metadata property.

Usage

Metadata

The following properties are available:


tags

8.2.0

Use this property to associate a page with one or more tags, making the page appear in the generated tags index. Tags are defined as a list of strings (whitespaces are allowed):

---
+tags:
+  - HTML5
+  - JavaScript
+  - CSS
+---
+
+# Page title
+...
+

If you want to prevent accidental typos when assigning tags to pages, you can set a predefined list of allowed tags in mkdocs.yml by using the tags_allowed setting.

\ No newline at end of file diff --git a/plugins/typeset/index.html b/plugins/typeset/index.html new file mode 100755 index 0000000..aa5c5ad --- /dev/null +++ b/plugins/typeset/index.html @@ -0,0 +1,17 @@ + Built-in typeset plugin - 一抹雨烟

Built-in typeset plugin

The typeset plugin allows to preserve the enriched presentation of titles and headlines within the navigation and table of contents. This means that code blocks, icons, emojis and any other inline formatting can be rendered exactly as defined in the page's content.


Sponsors only – this plugin is currently reserved to our awesome sponsors.

Objective

How it works

When building your project, MkDocs extracts the plain text from headlines and drops the original formatting. This is generally useful and a good idea, since this information is made available to other plugins that might have problems when being passed HTML instead of plain text.

However, it also means that the entire formatting is lost.

The plugin hooks into the rendering process, extracts the original headlines, and makes them available to be used in templates and plugins. The templates of Material for MkDocs use this information to render an enriched version of the navigation and table of contents.

When to use it

It's generally recommended to use the plugin, because it is a drop-in solution that doesn't require any configuration and is designed to work out of the box. Since it doesn't overwrite but only adds information, it's not expected to interfere with other plugins.

Configuration

insiders-4.27.0 typeset – built-in

As with all built-in plugins, getting started with the typeset plugin is straightforward. Just add the following lines to mkdocs.yml, and observe the enriched navigation and table of contents:

plugins:
+  - typeset
+

The typeset plugin is built into Material for MkDocs and doesn't need to be installed.

General

The following settings are available:


enabled

insiders-4.27.0 true

Use this setting to enable or disable the plugin when building your project. It's normally not necessary to specify this setting, but if you want to disable the plugin, use:

plugins:
+  - typeset:
+      enabled: false
+
\ No newline at end of file diff --git a/publishing-your-site/index.html b/publishing-your-site/index.html new file mode 100755 index 0000000..ae18017 --- /dev/null +++ b/publishing-your-site/index.html @@ -0,0 +1,101 @@ + Publishing your site - 一抹雨烟

Publishing your site

The great thing about hosting project documentation in a git repository is the ability to deploy it automatically when new changes are pushed. MkDocs makes this ridiculously simple.

GitHub Pages

If you're already hosting your code on GitHub, GitHub Pages is certainly the most convenient way to publish your project documentation. It's free of charge and pretty easy to set up.

with GitHub Actions

Using GitHub Actions you can automate the deployment of your project documentation. At the root of your repository, create a new GitHub Actions workflow, e.g. .github/workflows/ci.yml, and copy and paste the following contents:

name: ci # (1)!
+on:
+  push:
+    branches:
+      - master # (2)!
+      - main
+permissions:
+  contents: write
+jobs:
+  deploy:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - name: Configure Git Credentials
+        run: |
+          git config user.name github-actions[bot]
+          git config user.email 41898282+github-actions[bot]@users.noreply.github.com
+      - uses: actions/setup-python@v4
+        with:
+          python-version: 3.x
+      - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV # (3)!
+      - uses: actions/cache@v3
+        with:
+          key: mkdocs-material-${{ env.cache_id }}
+          path: .cache
+          restore-keys: |
+            mkdocs-material-
+      - run: pip install mkdocs-material # (4)!
+      - run: mkdocs gh-deploy --force
+
  1. You can change the name to your liking.

  2. At some point, GitHub renamed master to main. If your default branch is named master, you can safely remove main, vice versa.

  3. Store the cache_id environmental variable to access it later during cache key creation. The name is case-sensitive, so be sure to align it with ${{ env.cache_id }}.

    • The --utc option makes sure that each workflow runner uses the same time zone.
    • The %V format assures a cache update once a week.
    • You can change the format to %F to have daily cache updates.

    You can read the manual page to learn more about the formatting options of the date command.

  4. This is the place to install further MkDocs plugins or Markdown extensions with pip to be used during the build:

    pip install \
    +  mkdocs-material \
    +  mkdocs-awesome-pages-plugin \
    +  ...
    +
name: ci
+on:
+  push:
+    branches:
+      - master
+      - main
+permissions:
+  contents: write
+jobs:
+  deploy:
+    runs-on: ubuntu-latest
+    if: github.event.repository.fork == false
+    steps:
+      - uses: actions/checkout@v4
+      - name: Configure Git Credentials
+        run: |
+          git config user.name github-actions[bot]
+          git config user.email 41898282+github-actions[bot]@users.noreply.github.com
+      - uses: actions/setup-python@v4
+        with:
+          python-version: 3.x
+      - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
+      - uses: actions/cache@v3
+        with:
+          key: mkdocs-material-${{ env.cache_id }}
+          path: .cache
+          restore-keys: |
+            mkdocs-material-
+      - run: apt-get install pngquant # (1)!
+      - run: pip install git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git
+      - run: mkdocs gh-deploy --force
+env:
+  GH_TOKEN: ${{ secrets.GH_TOKEN }} # (2)!
+
  1. This step is only necessary if you want to use the built-in optimize plugin to automatically compress images.

  2. Remember to set the GH_TOKEN environment variable to the value of your personal access token when deploying Insiders, which can be done using GitHub secrets.

Now, when a new commit is pushed to either the master or main branches, the static site is automatically built and deployed. Push your changes to see the workflow in action.

If the GitHub Page doesn't show up after a few minutes, go to the settings of your repository and ensure that the publishing source branch for your GitHub Page is set to gh-pages.

Your documentation should shortly appear at <username>.github.io/<repository>.

with MkDocs

If you prefer to deploy your project documentation manually, you can just invoke the following command from the directory containing the mkdocs.yml file:

mkdocs gh-deploy --force
+

This will build your documentation and deploy it to a branch gh-pages in your repository. See this overview in the MkDocs documentation for more information. For a description of the arguments, see the documentation for the command.

GitLab Pages

If you're hosting your code on GitLab, deploying to GitLab Pages can be done by using the GitLab CI task runner. At the root of your repository, create a task definition named .gitlab-ci.yml and copy and paste the following contents:

pages:
+  stage: deploy
+  image: python:latest
+  script:
+    - pip install mkdocs-material
+    - mkdocs build --site-dir public
+  artifacts:
+    paths:
+      - public
+  rules:
+    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+
pages:
+  stage: deploy
+  image: python:latest
+  script: # (1)!
+    - pip install git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git
+    - mkdocs build --site-dir public
+  artifacts:
+    paths:
+      - public
+  rules:
+    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+
  1. Remember to set the GH_TOKEN environment variable to the value of your personal access token when deploying Insiders, which can be done using masked custom variables.

Now, when a new commit is pushed to the default branch (typically master or main), the static site is automatically built and deployed. Commit and push the file to your repository to see the workflow in action.

Your documentation should shortly appear at <username>.gitlab.io/<repository>.

Other

Since we can't cover all possible platforms, we rely on community contributed guides that explain how to deploy websites built with Material for MkDocs to other providers:

\ No newline at end of file diff --git a/reference/admonitions/index.html b/reference/admonitions/index.html new file mode 100755 index 0000000..a92631f --- /dev/null +++ b/reference/admonitions/index.html @@ -0,0 +1,143 @@ + Admonitions - 一抹雨烟

Admonitions

Admonitions, also known as call-outs, are an excellent choice for including side content without significantly interrupting the document flow. Material for MkDocs provides several different types of admonitions and allows for the inclusion and nesting of arbitrary content.

Configuration

This configuration enables admonitions, allows to make them collapsible and to nest arbitrary content inside admonitions. Add the following lines to mkdocs.yml:

markdown_extensions:
+  - admonition
+  - pymdownx.details
+  - pymdownx.superfences
+

See additional configuration options:

Admonition icons

8.3.0

Each of the supported admonition types has a distinct icon, which can be changed to any icon bundled with the theme, or even a custom icon. Add the following lines to mkdocs.yml:

theme:
+  icon:
+    admonition:
+      <type>: <icon> # (1)!
+
  1. Enter a few keywords to find the perfect icon using our icon search and click on the shortcode to copy it to your clipboard:

    Expand to show alternate icon sets
    theme:
    +  icon:
    +    admonition:
    +      note: octicons/tag-16
    +      abstract: octicons/checklist-16
    +      info: octicons/info-16
    +      tip: octicons/squirrel-16
    +      success: octicons/check-16
    +      question: octicons/question-16
    +      warning: octicons/alert-16
    +      failure: octicons/x-circle-16
    +      danger: octicons/zap-16
    +      bug: octicons/bug-16
    +      example: octicons/beaker-16
    +      quote: octicons/quote-16
    +
    theme:
    +  icon:
    +    admonition:
    +      note: fontawesome/solid/note-sticky
    +      abstract: fontawesome/solid/book
    +      info: fontawesome/solid/circle-info
    +      tip: fontawesome/solid/bullhorn
    +      success: fontawesome/solid/check
    +      question: fontawesome/solid/circle-question
    +      warning: fontawesome/solid/triangle-exclamation
    +      failure: fontawesome/solid/bomb
    +      danger: fontawesome/solid/skull
    +      bug: fontawesome/solid/robot
    +      example: fontawesome/solid/flask
    +      quote: fontawesome/solid/quote-left
    +

    Usage

    Admonitions follow a simple syntax: a block starts with !!!, followed by a single keyword used as a type qualifier. The content of the block follows on the next line, indented by four spaces:

    Admonition
    !!! note
    +
    +    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
    +    nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
    +    massa, nec semper lorem quam in massa.
    +

    Note

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    Changing the title

    By default, the title will equal the type qualifier in titlecase. However, it can be changed by adding a quoted string containing valid Markdown (including links, formatting, ...) after the type qualifier:

    Admonition with custom title
    !!! note "Phasellus posuere in sem ut cursus"
    +
    +    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
    +    nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
    +    massa, nec semper lorem quam in massa.
    +

    Phasellus posuere in sem ut cursus

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    Removing the title

    Similar to changing the title, the icon and title can be omitted entirely by adding an empty string directly after the type qualifier. Note that this will not work for collapsible blocks:

    Admonition without title
    !!! note ""
    +
    +    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
    +    nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
    +    massa, nec semper lorem quam in massa.
    +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    Collapsible blocks

    When Details is enabled and an admonition block is started with ??? instead of !!!, the admonition is rendered as a collapsible block with a small toggle on the right side:

    Admonition, collapsible
    ??? note
    +
    +    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
    +    nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
    +    massa, nec semper lorem quam in massa.
    +
    Note

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    Adding a + after the ??? token renders the block expanded:

    Admonition, collapsible and initially expanded
    ???+ note
    +
    +    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
    +    nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
    +    massa, nec semper lorem quam in massa.
    +
    Note

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    Inline blocks

    Admonitions can also be rendered as inline blocks (e.g., for sidebars), placing them to the right using the inline + end modifiers, or to the left using only the inline modifier:

    Lorem ipsum

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    !!! info inline end "Lorem ipsum"
    +
    +    Lorem ipsum dolor sit amet, consectetur
    +    adipiscing elit. Nulla et euismod nulla.
    +    Curabitur feugiat, tortor non consequat
    +    finibus, justo purus auctor massa, nec
    +    semper lorem quam in massa.
    +

    Use inline end to align to the right (left for rtl languages).

    Lorem ipsum

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    !!! info inline "Lorem ipsum"
    +
    +    Lorem ipsum dolor sit amet, consectetur
    +    adipiscing elit. Nulla et euismod nulla.
    +    Curabitur feugiat, tortor non consequat
    +    finibus, justo purus auctor massa, nec
    +    semper lorem quam in massa.
    +

    Use inline to align to the left (right for rtl languages).

    Important: admonitions that use the inline modifiers must be declared prior to the content block you want to place them beside. If there's insufficient space to render the admonition next to the block, the admonition will stretch to the full width of the viewport, e.g., on mobile viewports.

    Supported types

    Following is a list of type qualifiers provided by Material for MkDocs, whereas the default type, and thus fallback for unknown type qualifiers, is note1:

    note

    Note

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    abstract

    Abstract

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    info

    Info

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    tip

    Tip

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    success

    Success

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    question

    Question

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    warning

    Warning

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    failure

    Failure

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    danger

    Danger

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    bug

    Bug

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    example

    Example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    quote

    Quote

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    Customization

    Classic admonitions

    Prior to version 8.5.6, admonitions had a slightly different appearance:

    Note

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

    If you want to restore this appearance, add the following CSS to an additional style sheet:

    .md-typeset .admonition,
    +.md-typeset details {
    +  border-width: 0;
    +  border-left-width: 4px;
    +}
    +
    extra_css:
    +  - stylesheets/extra.css
    +

    Custom admonitions

    If you want to add a custom admonition type, all you need is a color and an *.svg icon. Copy the icon's code from the .icons folder and add the following CSS to an additional style sheet:

    :root {
    +  --md-admonition-icon--pied-piper: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M244 246c-3.2-2-6.3-2.9-10.1-2.9-6.6 0-12.6 3.2-19.3 3.7l1.7 4.9zm135.9 197.9c-19 0-64.1 9.5-79.9 19.8l6.9 45.1c35.7 6.1 70.1 3.6 106-9.8-4.8-10-23.5-55.1-33-55.1zM340.8 177c6.6 2.8 11.5 9.2 22.7 22.1 2-1.4 7.5-5.2 7.5-8.6 0-4.9-11.8-13.2-13.2-23 11.2-5.7 25.2-6 37.6-8.9 68.1-16.4 116.3-52.9 146.8-116.7C548.3 29.3 554 16.1 554.6 2l-2 2.6c-28.4 50-33 63.2-81.3 100-31.9 24.4-69.2 40.2-106.6 54.6l-6.3-.3v-21.8c-19.6 1.6-19.7-14.6-31.6-23-18.7 20.6-31.6 40.8-58.9 51.1-12.7 4.8-19.6 10-25.9 21.8 34.9-16.4 91.2-13.5 98.8-10zM555.5 0l-.6 1.1-.3.9.6-.6zm-59.2 382.1c-33.9-56.9-75.3-118.4-150-115.5l-.3-6c-1.1-13.5 32.8 3.2 35.1-31l-14.4 7.2c-19.8-45.7-8.6-54.3-65.5-54.3-14.7 0-26.7 1.7-41.4 4.6 2.9 18.6 2.2 36.7-10.9 50.3l19.5 5.5c-1.7 3.2-2.9 6.3-2.9 9.8 0 21 42.8 2.9 42.8 33.6 0 18.4-36.8 60.1-54.9 60.1-8 0-53.7-50-53.4-60.1l.3-4.6 52.3-11.5c13-2.6 12.3-22.7-2.9-22.7-3.7 0-43.1 9.2-49.4 10.6-2-5.2-7.5-14.1-13.8-14.1-3.2 0-6.3 3.2-9.5 4-9.2 2.6-31 2.9-21.5 20.1L15.9 298.5c-5.5 1.1-8.9 6.3-8.9 11.8 0 6 5.5 10.9 11.5 10.9 8 0 131.3-28.4 147.4-32.2 2.6 3.2 4.6 6.3 7.8 8.6 20.1 14.4 59.8 85.9 76.4 85.9 24.1 0 58-22.4 71.3-41.9 3.2-4.3 6.9-7.5 12.4-6.9.6 13.8-31.6 34.2-33 43.7-1.4 10.2-1 35.2-.3 41.1 26.7 8.1 52-3.6 77.9-2.9 4.3-21 10.6-41.9 9.8-63.5l-.3-9.5c-1.4-34.2-10.9-38.5-34.8-58.6-1.1-1.1-2.6-2.6-3.7-4 2.2-1.4 1.1-1 4.6-1.7 88.5 0 56.3 183.6 111.5 229.9 33.1-15 72.5-27.9 103.5-47.2-29-25.6-52.6-45.7-72.7-79.9zm-196.2 46.1v27.2l11.8-3.4-2.9-23.8zm-68.7-150.4l24.1 61.2 21-13.8-31.3-50.9zm84.4 154.9l2 12.4c9-1.5 58.4-6.6 58.4-14.1 0-1.4-.6-3.2-.9-4.6-26.8 0-36.9 3.8-59.5 6.3z"/></svg>')
    +}
    +.md-typeset .admonition.pied-piper,
    +.md-typeset details.pied-piper {
    +  border-color: rgb(43, 155, 70);
    +}
    +.md-typeset .pied-piper > .admonition-title,
    +.md-typeset .pied-piper > summary {
    +  background-color: rgba(43, 155, 70, 0.1);
    +}
    +.md-typeset .pied-piper > .admonition-title::before,
    +.md-typeset .pied-piper > summary::before {
    +  background-color: rgb(43, 155, 70);
    +  -webkit-mask-image: var(--md-admonition-icon--pied-piper);
    +          mask-image: var(--md-admonition-icon--pied-piper);
    +}
    +
    extra_css:
    +  - stylesheets/extra.css
    +

    After applying the customization, you can use the custom admonition type:

    Admonition with custom type
    !!! pied-piper "Pied Piper"
    +
    +    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et
    +    euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo
    +    purus auctor massa, nec semper lorem quam in massa.
    +

    Pied Piper

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.


    1. Previously, some of the supported types defined more than one qualifier. For example, authors could use summary or tldr as alternative qualifiers to render an abstract admonition. As this increased the size of the CSS that is shipped with Material for MkDocs, the additional type qualifiers are now all deprecated and will be removed in the next major version. This will also be mentioned in the upgrade guide. 

    \ No newline at end of file diff --git a/reference/annotations/index.html b/reference/annotations/index.html new file mode 100755 index 0000000..cd2a0c4 --- /dev/null +++ b/reference/annotations/index.html @@ -0,0 +1,59 @@ + Annotations - 一抹雨烟

    Annotations

    One of the flagship features of Material for MkDocs is the ability to inject annotations – little markers that can be added almost anywhere in a document and expand a tooltip containing arbitrary Markdown on click or keyboard focus.

    Configuration

    This configuration allows to add annotations to all inline- and block-level elements, as well as code blocks, and nest annotations inside each other. Add the following lines to mkdocs.yml:

    markdown_extensions:
    +  - attr_list
    +  - md_in_html
    +  - pymdownx.superfences
    +

    See additional configuration options:

    Annotation icons

    9.2.0

    The annotation icon can be changed to any icon bundled with the theme, or even a custom icon, e.g. to material/arrow-right-circle:. Simply add the following lines to mkdocs.yml:

    theme:
    +  icon:
    +    annotation: material/arrow-right-circle # (1)!
    +
    1. Enter a few keywords to find the perfect icon using our icon search and click on the shortcode to copy it to your clipboard:

      Some popular choices:

      • - material/plus-circle
      • - material/circle-medium
      • - material/record-circle
      • - material/arrow-right-circle
      • - material/arrow-right-circle-outline
      • - material/chevron-right-circle
      • - material/star-four-points-circle
      • - material/plus-circle-outline

      Usage

      Using annotations

      9.2.0

      Annotations consist of two parts: a marker, which can be placed anywhere in a block marked with the annotate class, and content located in a list below the block containing the marker:

      Text with annotations
      Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit.
      +{ .annotate }
      +
      +1.  :man_raising_hand: I'm an annotation! I can contain `code`, __formatted
      +    text__, images, ... basically anything that can be expressed in Markdown.
      +

      Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit.

      1. 🙋‍♂️ I'm an annotation! I can contain code, formatted text, images, ... basically anything that can be written in Markdown.

      Note that the annotate class must only be added to the outermost block. All nested elements can use the same list to define annotations, except when annotations are nested themselves.

      in annotations

      When SuperFences is enabled, annotations can be nested inside annotations by adding the annotate class to the list item hosting the annotation content, repeating the process:

      Text with nested annotations
      Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit.
      +{ .annotate }
      +
      +1.  :man_raising_hand: I'm an annotation! (1)
      +    { .annotate }
      +
      +    1.  :woman_raising_hand: I'm an annotation as well!
      +

      Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit.

      1. 🙋‍♂️ I'm an annotation! (1)

        1. 🙋‍♀️ I'm an annotation as well!

      in admonitions

      The titles and bodies of admonitions can also host annotations by adding the annotate modifier after the type qualifier, which is similar to how inline blocks work:

      Admonition with annotations
      !!! note annotate "Phasellus posuere in sem ut cursus (1)"
      +
      +    Lorem ipsum dolor sit amet, (2) consectetur adipiscing elit. Nulla et
      +    euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo
      +    purus auctor massa, nec semper lorem quam in massa.
      +
      +1.  :man_raising_hand: I'm an annotation!
      +2.  :woman_raising_hand: I'm an annotation as well!
      +

      Phasellus posuere in sem ut cursus (1)

      Lorem ipsum dolor sit amet, (2) consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

      1. 🙋‍♂️ I'm an annotation!
      2. 🙋‍♀️ I'm an annotation as well!

      in content tabs

      Content tabs can host annotations by adding the annotate class to the block of a dedicated content tab (and not to the container, which is not supported):

      Content tabs with annotations
      === "Tab 1"
      +
      +    Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit.
      +    { .annotate }
      +
      +    1.  :man_raising_hand: I'm an annotation!
      +
      +=== "Tab 2"
      +
      +    Phasellus posuere in sem ut cursus (1)
      +    { .annotate }
      +
      +    1.  :woman_raising_hand: I'm an annotation as well!
      +

      Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit.

      1. 🙋‍♂️ I'm an annotation!

      Phasellus posuere in sem ut cursus (1)

      1. 🙋‍♀️ I'm an annotation as well!

      in everything else

      The Attribute Lists extension is the key ingredient for adding annotations to most elements, but it has some limitations. However, it's always possible to leverage the Markdown in HTML extension to wrap arbitrary elements with a div with the annotate class:

      HTML with annotations
      <div class="annotate" markdown>
      +
      +> Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit.
      +
      +</div>
      +
      +1.  :man_raising_hand: I'm an annotation!
      +

      Lorem ipsum dolor sit amet, (1) consectetur adipiscing elit.

      1. 🙋‍♂️ I'm an annotation!

      With this trick, annotations can also be added to blockquotes, lists, and many other elements that are not supported by the Attribute Lists extension. Furthermore, note that code blocks follow different semantics.

      Known limitations

      Please note that annotations currently don't work in data tables as reported in #3453, as data tables are scrollable elements and positioning is very tricky to get right. This might be fixed in the future.

      \ No newline at end of file diff --git a/reference/buttons/index.html b/reference/buttons/index.html new file mode 100755 index 0000000..7b46b61 --- /dev/null +++ b/reference/buttons/index.html @@ -0,0 +1,17 @@ + Buttons - 一抹雨烟

      Buttons

      Material for MkDocs provides dedicated styles for primary and secondary buttons that can be added to any link, label or button element. This is especially useful for documents or landing pages with dedicated call-to-actions.

      Configuration

      This configuration allows to add attributes to all inline- and block-level elements with a simple syntax, turning any link into a button. Add the following lines to mkdocs.yml:

      markdown_extensions:
      +  - attr_list
      +

      See additional configuration options:

      Usage

      Adding buttons

      In order to render a link as a button, suffix it with curly braces and add the .md-button class selector to it. The button will receive the selected primary color and accent color if active.

      Button
      [Subscribe to our newsletter](#){ .md-button }
      +

      Adding primary buttons

      If you want to display a filled, primary button (like on the landing page of Material for MkDocs), add both, the .md-button and .md-button--primary CSS class selectors.

      Button, primary
      [Subscribe to our newsletter](#){ .md-button .md-button--primary }
      +

      Adding icon buttons

      Of course, icons can be added to all types of buttons by using the icon syntax together with any valid icon shortcode, which can be easily found with a few keystrokes through our icon search.

      Button with icon
      [Send :fontawesome-solid-paper-plane:](#){ .md-button }
      +
      \ No newline at end of file diff --git a/reference/code-blocks/index.html b/reference/code-blocks/index.html new file mode 100755 index 0000000..9da7d8e --- /dev/null +++ b/reference/code-blocks/index.html @@ -0,0 +1,152 @@ + Code blocks - 一抹雨烟

      Code blocks

      Code blocks and examples are an essential part of technical project documentation. Material for MkDocs provides different ways to set up syntax highlighting for code blocks, either during build time using Pygments or during runtime using a JavaScript syntax highlighter.

      Configuration

      This configuration enables syntax highlighting on code blocks and inline code blocks, and allows to include source code directly from other files. Add the following lines to mkdocs.yml:

      markdown_extensions:
      +  - pymdownx.highlight:
      +      anchor_linenums: true
      +      line_spans: __span
      +      pygments_lang_class: true
      +  - pymdownx.inlinehilite
      +  - pymdownx.snippets
      +  - pymdownx.superfences
      +

      The following sections discuss how to use different syntax highlighting features with Pygments, the recommended highlighter, so they don't apply when using a JavaScript syntax highlighter.

      See additional configuration options:

      Code copy button

      9.0.0

      Code blocks can automatically render a button on the right side to allow the user to copy a code block's contents to the clipboard. Add the following to mkdocs.yml to enable them globally:

      theme:
      +  features:
      +    - content.code.copy
      +
      Enabling or disabling code copy buttons for a specific code block

      If you don't want to enable code copy buttons globally, you can enable them for a specific code block by using a slightly different syntax based on the Attribute Lists extension:

      ``` { .yaml .copy }
      +# Code block content
      +```
      +

      Note that the language shortcode which has to come first must now also be prefixed by a .. Similarly, the copy button can also be disabled for a specific code block:

      ``` { .yaml .no-copy }
      +# Code block content
      +```
      +

      Code selection button

      insiders-4.32.0

      Code blocks can include a button to allow for the selection of line ranges by the user, which is perfect for linking to a specific subsection of a code block. This allows the user to apply line highlighting dynamically. Add the following to mkdocs.yml to enable it globally:

      theme:
      +  features:
      +    - content.code.select
      +
      Enabling or disabling code selection buttons for a specific code block

      If you don't want to enable code selection buttons globally, you can enable them for a specific code block by using a slightly different syntax based on the Attribute Lists extension:

      ``` { .yaml .select }
      +# Code block content
      +```
      +

      Note that the language shortcode which has to come first must now also be prefixed by a .. Similarly, the selection button can also be disabled for a specific code block:

      ``` { .yaml .no-select }
      +# Code block content
      +```
      +

      Code annotations

      8.0.0

      Code annotations offer a comfortable and friendly way to attach arbitrary content to specific sections of code blocks by adding numeric markers in block and inline comments in the language of the code block. Add the following to mkdocs.yml to enable them globally:

      theme:
      +  features:
      +    - content.code.annotate # (1)!
      +
      1. 🙋‍♂️ I'm a code annotation! I can contain code, formatted text, images, ... basically anything that can be written in Markdown.
      Enabling code annotations for a specific code block

      If you don't want to enable code annotations globally, because you don't like the automatic inlining behavior, you can enable them for a specific code block by using a slightly different syntax based on the Attribute Lists extension:

      ``` { .yaml .annotate }
      +# Code block content
      +```
      +

      Note that the language shortcode which has to come first must now also be prefixed by a ..

      Custom selectors

      insiders-4.32.0

      Normally, code annotations can only be placed in comments, as comments can be considered safe for placement. However, sometimes it might be necessary to place annotations in parts of the code block where comments are not allowed, e.g. in strings.

      Additional selectors can be set per-language:

      extra:
      +  annotate:
      +    json: [.s2] # (1)!
      +
      1. .s2 is the name of the lexeme that Pygments generates for double-quoted strings. If you want to use a code annotation in another lexeme than a comment, inspect the code block and determine which lexeme needs to be added to the list of additional selectors.

        Important: Code annotations cannot be split between lexemes.

      Now, code annotations can be used from within strings in JSON:

      {
      +  "key": "value (1)"
      +}
      +
      1. 🙋‍♂️ I'm a code annotation! I can contain code, formatted text, images, ... basically anything that can be written in Markdown.

      Usage

      Code blocks must be enclosed with two separate lines containing three backticks. To add syntax highlighting to those blocks, add the language shortcode directly after the opening block. See the list of available lexers to find the shortcode for a given language:

      Code block
      ``` py
      +import tensorflow as tf
      +```
      +
      import tensorflow as tf
      +

      Adding a title

      In order to provide additional context, a custom title can be added to a code block by using the title="<custom title>" option directly after the shortcode, e.g. to display the name of a file:

      Code block with title
      ``` py title="bubble_sort.py"
      +def bubble_sort(items):
      +    for i in range(len(items)):
      +        for j in range(len(items) - 1 - i):
      +            if items[j] > items[j + 1]:
      +                items[j], items[j + 1] = items[j + 1], items[j]
      +```
      +
      bubble_sort.py
      def bubble_sort(items):
      +    for i in range(len(items)):
      +        for j in range(len(items) - 1 - i):
      +            if items[j] > items[j + 1]:
      +                items[j], items[j + 1] = items[j + 1], items[j]
      +

      Adding annotations

      Code annotations can be placed anywhere in a code block where a comment for the language of the block can be placed, e.g. for JavaScript in // ... and /* ... */, for YAML in # ..., etc.1:

      Code block with annotation
      ``` yaml
      +theme:
      +  features:
      +    - content.code.annotate # (1)
      +```
      +
      +1.  :man_raising_hand: I'm a code annotation! I can contain `code`, __formatted
      +    text__, images, ... basically anything that can be written in Markdown.
      +
      theme:
      +  features:
      +    - content.code.annotate # (1)
      +
      1. 🙋‍♂️ I'm a code annotation! I can contain code, formatted text, images, ... basically anything that can be written in Markdown.

      Stripping comments

      8.5.0

      If you wish to strip the comment characters surrounding a code annotation, simply add an ! after the closing parenthesis of the code annotation:

      Code block with annotation, stripped
      ``` yaml
      +# (1)!
      +```
      +
      +1.  Look ma, less line noise!
      +
      # (1)!
      +
      1. Look ma, less line noise!

      Note that this only allows for a single code annotation to be rendered per comment. If you want to add multiple code annotations, comments cannot be stripped for technical reasons.

      Adding line numbers

      Line numbers can be added to a code block by using the linenums="<start>" option directly after the shortcode, whereas <start> represents the starting line number. A code block can start from a line number other than 1, which allows to split large code blocks for readability:

      Code block with line numbers
      ``` py linenums="1"
      +def bubble_sort(items):
      +    for i in range(len(items)):
      +        for j in range(len(items) - 1 - i):
      +            if items[j] > items[j + 1]:
      +                items[j], items[j + 1] = items[j + 1], items[j]
      +```
      +
      1
      +2
      +3
      +4
      +5
      def bubble_sort(items):
      +    for i in range(len(items)):
      +        for j in range(len(items) - 1 - i):
      +            if items[j] > items[j + 1]:
      +                items[j], items[j + 1] = items[j + 1], items[j]
      +

      Highlighting specific lines

      Specific lines can be highlighted by passing the line numbers to the hl_lines argument placed right after the language shortcode. Note that line counts start at 1, regardless of the starting line number specified as part of linenums:

      Code block with highlighted lines
      ``` py hl_lines="2 3"
      +def bubble_sort(items):
      +    for i in range(len(items)):
      +        for j in range(len(items) - 1 - i):
      +            if items[j] > items[j + 1]:
      +                items[j], items[j + 1] = items[j + 1], items[j]
      +```
      +
      1
      +2
      +3
      +4
      +5
      def bubble_sort(items):
      +    for i in range(len(items)):
      +        for j in range(len(items) - 1 - i):
      +            if items[j] > items[j + 1]:
      +                items[j], items[j + 1] = items[j + 1], items[j]
      +
      Code block with highlighted line range
      ``` py hl_lines="3-5"
      +def bubble_sort(items):
      +    for i in range(len(items)):
      +        for j in range(len(items) - 1 - i):
      +            if items[j] > items[j + 1]:
      +                items[j], items[j + 1] = items[j + 1], items[j]
      +```
      +
      1
      +2
      +3
      +4
      +5
      def bubble_sort(items):
      +    for i in range(len(items)):
      +        for j in range(len(items) - 1 - i):
      +            if items[j] > items[j + 1]:
      +                items[j], items[j + 1] = items[j + 1], items[j]
      +

      Highlighting inline code blocks

      When InlineHilite is enabled, syntax highlighting can be applied to inline code blocks by prefixing them with a shebang, i.e. #!, directly followed by the corresponding language shortcode.

      Inline code block
      The `#!python range()` function is used to generate a sequence of numbers.
      +

      The range() function is used to generate a sequence of numbers.

      Embedding external files

      When Snippets is enabled, content from other files (including source files) can be embedded by using the --8<-- notation directly from within a code block:

      Code block with external content
      ``` title=".browserslistrc"
      +--8<-- ".browserslistrc"
      +```
      +
      .browserslistrc
      last 4 years
      +

      Customization

      Custom syntax theme

      If Pygments is used, Material for MkDocs provides the styles for code blocks, which are built with a custom and well-balanced palette that works equally well for both color schemes:

      • --md-code-hl-number-color
      • --md-code-hl-special-color
      • --md-code-hl-function-color
      • --md-code-hl-constant-color
      • --md-code-hl-keyword-color
      • --md-code-hl-string-color
      • --md-code-hl-name-color
      • --md-code-hl-operator-color
      • --md-code-hl-punctuation-color
      • --md-code-hl-comment-color
      • --md-code-hl-generic-color
      • --md-code-hl-variable-color

      Code block foreground, background and line highlight colors are defined via:

      • --md-code-fg-color
      • --md-code-bg-color
      • --md-code-hl-color

      Let's say you want to change the color of "strings". While there are several types of string tokens, they use the same color. You can assign a new color by using an additional style sheet:

      :root > * {
      +  --md-code-hl-string-color: #0FF1CE;
      +}
      +
      extra_css:
      +  - stylesheets/extra.css
      +

      If you want to tweak a specific type of string, e.g. `backticks`, you can lookup the specific CSS class name in the syntax theme definition, and override it as part of your additional style sheet:

      .highlight .sb {
      +  color: #0FF1CE;
      +}
      +
      extra_css:
      +  - stylesheets/extra.css
      +

      Annotation tooltip width

      If you have a lot of content hosted inside your code annotations, it can be a good idea to increase the width of the tooltip by adding the following as part of an additional style sheet:

      :root {
      +  --md-tooltip-width: 600px;
      +}
      +
      extra_css:
      +  - stylesheets/extra.css
      +

      This will render annotations with a larger width:

      # (1)!
      +
      1. Muuuuuuuuuuuuuuuch more space for content

      1. Code annotations require syntax highlighting with Pygments – they're currently not compatible with JavaScript syntax highlighters, or languages that do not have comments in their grammar. However, we're actively working on supporting alternate ways of defining code annotations, allowing to always place code annotations at the end of lines. 

      \ No newline at end of file diff --git a/reference/content-tabs/index.html b/reference/content-tabs/index.html new file mode 100755 index 0000000..621f516 --- /dev/null +++ b/reference/content-tabs/index.html @@ -0,0 +1,91 @@ + Content tabs - 一抹雨烟

      Content tabs

      Sometimes, it's desirable to group alternative content under different tabs, e.g. when describing how to access an API from different languages or environments. Material for MkDocs allows for beautiful and functional tabs, grouping code blocks and other content.

      Configuration

      This configuration enables content tabs, and allows to nest arbitrary content inside content tabs, including code blocks and ... more content tabs! Add the following lines to mkdocs.yml:

      markdown_extensions:
      +  - pymdownx.superfences
      +  - pymdownx.tabbed:
      +      alternate_style: true
      +

      See additional configuration options:

      insiders-4.17.0

      In order to link to content tabs and share them more easily, [Insiders] adds an anchor link to each content tab automatically, which you can copy via right click or open in a new tab:

      You can copy the link of the tab and create a link on the same or any other page. For example, you can jump to the third tab above this paragraph or to the publishing guide for Insiders.

      Readable anchor links

      Python Markdown Extensions 9.6 adds support for slugification of content tabs, which produces nicer looking and more readable anchor links. Enable the slugify function with the following lines:

      markdown_extensions:
      +  - pymdownx.tabbed:
      +      slugify: !!python/object/apply:pymdownx.slugs.slugify
      +        kwds:
      +          case: lower
      +

      Fore more information, please see the extension guide.

      Linked content tabs

      8.3.0

      When enabled, all content tabs across the whole documentation site will be linked and switch to the same label when the user clicks on a tab. Add the following lines to mkdocs.yml:

      theme:
      +  features:
      +    - content.tabs.link
      +

      Content tabs are linked based on their label, not offset. This means that all tabs with the same label will be activated when a user clicks a content tab regardless of order inside a container. Furthermore, this feature is fully integrated with instant loading and persisted across page loads.

      Linked content tabs enabled

      Linked content tabs disabled

      Usage

      Grouping code blocks

      Code blocks are one of the primary targets to be grouped, and can be considered a special case of content tabs, as tabs with a single code block are always rendered without horizontal spacing:

      Content tabs with code blocks
      === "C"
      +
      +    ``` c
      +    #include <stdio.h>
      +
      +    int main(void) {
      +      printf("Hello world!\n");
      +      return 0;
      +    }
      +    ```
      +
      +=== "C++"
      +
      +    ``` c++
      +    #include <iostream>
      +
      +    int main(void) {
      +      std::cout << "Hello world!" << std::endl;
      +      return 0;
      +    }
      +    ```
      +
      #include <stdio.h>
      +
      +int main(void) {
      +  printf("Hello world!\n");
      +  return 0;
      +}
      +
      #include <iostream>
      +
      +int main(void) {
      +  std::cout << "Hello world!" << std::endl;
      +  return 0;
      +}
      +

      Grouping other content

      When a content tab contains more than one code block, it is rendered with horizontal spacing. Vertical spacing is never added, but can be achieved by nesting tabs in other blocks:

      Content tabs
      === "Unordered list"
      +
      +    * Sed sagittis eleifend rutrum
      +    * Donec vitae suscipit est
      +    * Nulla tempor lobortis orci
      +
      +=== "Ordered list"
      +
      +    1. Sed sagittis eleifend rutrum
      +    2. Donec vitae suscipit est
      +    3. Nulla tempor lobortis orci
      +
      • Sed sagittis eleifend rutrum
      • Donec vitae suscipit est
      • Nulla tempor lobortis orci
      1. Sed sagittis eleifend rutrum
      2. Donec vitae suscipit est
      3. Nulla tempor lobortis orci

      Embedded content

      When SuperFences is enabled, content tabs can contain arbitrary nested content, including further content tabs, and can be nested in other blocks like admonitions or blockquotes:

      Content tabs in admonition
      !!! example
      +
      +    === "Unordered List"
      +
      +        ``` markdown
      +        * Sed sagittis eleifend rutrum
      +        * Donec vitae suscipit est
      +        * Nulla tempor lobortis orci
      +        ```
      +
      +    === "Ordered List"
      +
      +        ``` markdown
      +        1. Sed sagittis eleifend rutrum
      +        2. Donec vitae suscipit est
      +        3. Nulla tempor lobortis orci
      +        ```
      +

      Example

      * Sed sagittis eleifend rutrum
      +* Donec vitae suscipit est
      +* Nulla tempor lobortis orci
      +
      1. Sed sagittis eleifend rutrum
      +2. Donec vitae suscipit est
      +3. Nulla tempor lobortis orci
      +
      \ No newline at end of file diff --git a/reference/data-tables/index.html b/reference/data-tables/index.html new file mode 100755 index 0000000..25aed87 --- /dev/null +++ b/reference/data-tables/index.html @@ -0,0 +1,51 @@ + Data tables - 一抹雨烟

      Data tables

      Material for MkDocs defines default styles for data tables – an excellent way of rendering tabular data in project documentation. Furthermore, customizations like sortable tables can be achieved with a third-party library and some additional JavaScript.

      Configuration

      This configuration enables Markdown table support, which should normally be enabled by default, but to be sure, add the following lines to mkdocs.yml:

      markdown_extensions:
      +  - tables
      +

      See additional configuration options:

      Usage

      Data tables can be used at any position in your project documentation and can contain arbitrary Markdown, including inline code blocks, as well as icons and emojis:

      Data table
      | Method      | Description                          |
      +| ----------- | ------------------------------------ |
      +| `GET`       | :material-check:     Fetch resource  |
      +| `PUT`       | :material-check-all: Update resource |
      +| `DELETE`    | :material-close:     Delete resource |
      +
      Method Description
      GET Fetch resource
      PUT Update resource
      DELETE Delete resource

      Column alignment

      If you want to align a specific column to the left, center or right, you can use the regular Markdown syntax placing : characters at the beginning and/or end of the divider.

      Data table, columns aligned to left
      | Method      | Description                          |
      +| :---------- | :----------------------------------- |
      +| `GET`       | :material-check:     Fetch resource  |
      +| `PUT`       | :material-check-all: Update resource |
      +| `DELETE`    | :material-close:     Delete resource |
      +
      Method Description
      GET Fetch resource
      PUT Update resource
      DELETE Delete resource
      Data table, columns centered
      | Method      | Description                          |
      +| :---------: | :----------------------------------: |
      +| `GET`       | :material-check:     Fetch resource  |
      +| `PUT`       | :material-check-all: Update resource |
      +| `DELETE`    | :material-close:     Delete resource |
      +
      Method Description
      GET Fetch resource
      PUT Update resource
      DELETE Delete resource
      Data table, columns aligned to right
      | Method      | Description                          |
      +| ----------: | -----------------------------------: |
      +| `GET`       | :material-check:     Fetch resource  |
      +| `PUT`       | :material-check-all: Update resource |
      +| `DELETE`    | :material-close:     Delete resource |
      +
      Method Description
      GET Fetch resource
      PUT Update resource
      DELETE Delete resource

      Customization

      Sortable tables

      If you want to make data tables sortable, you can add tablesort, which is natively integrated with Material for MkDocs and will also work with instant loading via additional JavaScript:

      document$.subscribe(function() {
      +  var tables = document.querySelectorAll("article table:not([class])")
      +  tables.forEach(function(table) {
      +    new Tablesort(table)
      +  })
      +})
      +
      extra_javascript:
      +  - https://unpkg.com/tablesort@5.3.0/dist/tablesort.min.js
      +  - javascripts/tablesort.js
      +

      After applying the customization, data tables can be sorted by clicking on a column:

      Data table, columns sortable
      | Method      | Description                          |
      +| ----------- | ------------------------------------ |
      +| `GET`       | :material-check:     Fetch resource  |
      +| `PUT`       | :material-check-all: Update resource |
      +| `DELETE`    | :material-close:     Delete resource |
      +
      Method Description
      GET Fetch resource
      PUT Update resource
      DELETE Delete resource

      Note that tablesort provides alternative comparison implementations like numbers, filesizes, dates and month names. See the tablesort documentation for more information.

      Import table from file

      The plugin mkdocs-table-reader-plugin allows you to import data from a CSV or Excel file.

      \ No newline at end of file diff --git a/reference/diagrams/index.html b/reference/diagrams/index.html new file mode 100755 index 0000000..818a1fd --- /dev/null +++ b/reference/diagrams/index.html @@ -0,0 +1,145 @@ + Diagrams - 一抹雨烟

      Diagrams

      Diagrams help to communicate complex relationships and interconnections between different technical components, and are a great addition to project documentation. Material for MkDocs integrates with Mermaid.js, a very popular and flexible solution for drawing diagrams.

      Configuration

      8.2.0

      This configuration enables native support for Mermaid.js diagrams. Material for MkDocs will automatically initialize the JavaScript runtime when a page includes a mermaid code block:

      markdown_extensions:
      +  - pymdownx.superfences:
      +      custom_fences:
      +        - name: mermaid
      +          class: mermaid
      +          format: !!python/name:pymdownx.superfences.fence_code_format
      +

      No further configuration is necessary. Advantages over a custom integration:

      • Works with instant loading without any additional effort
      • Diagrams automatically use fonts and colors defined in mkdocs.yml1
      • Fonts and colors can be customized with additional style sheets
      • Support for both, light and dark color schemes – try it on this page!

      Usage

      Using flowcharts

      Flowcharts are diagrams that represent workflows or processes. The steps are rendered as nodes of various kinds and are connected by edges, describing the necessary order of steps:

      Flow chart
      ``` mermaid
      +graph LR
      +  A[Start] --> B{Error?};
      +  B -->|Yes| C[Hmm...];
      +  C --> D[Debug];
      +  D --> B;
      +  B ---->|No| E[Yay!];
      +```
      +
      graph LR
      +  A[Start] --> B{Error?};
      +  B -->|Yes| C[Hmm...];
      +  C --> D[Debug];
      +  D --> B;
      +  B ---->|No| E[Yay!];

      Using sequence diagrams

      Sequence diagrams describe a specific scenario as sequential interactions between multiple objects or actors, including the messages that are exchanged between those actors:

      Sequence diagram
      ``` mermaid
      +sequenceDiagram
      +  autonumber
      +  Alice->>John: Hello John, how are you?
      +  loop Healthcheck
      +      John->>John: Fight against hypochondria
      +  end
      +  Note right of John: Rational thoughts!
      +  John-->>Alice: Great!
      +  John->>Bob: How about you?
      +  Bob-->>John: Jolly good!
      +```
      +
      sequenceDiagram
      +  autonumber
      +  Alice->>John: Hello John, how are you?
      +  loop Healthcheck
      +      John->>John: Fight against hypochondria
      +  end
      +  Note right of John: Rational thoughts!
      +  John-->>Alice: Great!
      +  John->>Bob: How about you?
      +  Bob-->>John: Jolly good!

      Using state diagrams

      State diagrams are a great tool to describe the behavior of a system, decomposing it into a finite number of states, and transitions between those states:

      State diagram
      ``` mermaid
      +stateDiagram-v2
      +  state fork_state <<fork>>
      +    [*] --> fork_state
      +    fork_state --> State2
      +    fork_state --> State3
      +
      +    state join_state <<join>>
      +    State2 --> join_state
      +    State3 --> join_state
      +    join_state --> State4
      +    State4 --> [*]
      +```
      +
      stateDiagram-v2
      +  state fork_state <<fork>>
      +    [*] --> fork_state
      +    fork_state --> State2
      +    fork_state --> State3
      +
      +    state join_state <<join>>
      +    State2 --> join_state
      +    State3 --> join_state
      +    join_state --> State4
      +    State4 --> [*]

      Using class diagrams

      Class diagrams are central to object oriented programing, describing the structure of a system by modelling entities as classes and relationships between them:

      Class diagram
      ``` mermaid
      +classDiagram
      +  Person <|-- Student
      +  Person <|-- Professor
      +  Person : +String name
      +  Person : +String phoneNumber
      +  Person : +String emailAddress
      +  Person: +purchaseParkingPass()
      +  Address "1" <-- "0..1" Person:lives at
      +  class Student{
      +    +int studentNumber
      +    +int averageMark
      +    +isEligibleToEnrol()
      +    +getSeminarsTaken()
      +  }
      +  class Professor{
      +    +int salary
      +  }
      +  class Address{
      +    +String street
      +    +String city
      +    +String state
      +    +int postalCode
      +    +String country
      +    -validate()
      +    +outputAsLabel()  
      +  }
      +```
      +
      classDiagram
      +  Person <|-- Student
      +  Person <|-- Professor
      +  Person : +String name
      +  Person : +String phoneNumber
      +  Person : +String emailAddress
      +  Person: +purchaseParkingPass()
      +  Address "1" <-- "0..1" Person:lives at
      +  class Student{
      +    +int studentNumber
      +    +int averageMark
      +    +isEligibleToEnrol()
      +    +getSeminarsTaken()
      +  }
      +  class Professor{
      +    +int salary
      +  }
      +  class Address{
      +    +String street
      +    +String city
      +    +String state
      +    +int postalCode
      +    +String country
      +    -validate()
      +    +outputAsLabel()  
      +  }

      Using entity-relationship diagrams

      An entity-relationship diagram is composed of entity types and specifies relationships that exist between entities. It describes inter-related things in a specific domain of knowledge:

      Entity-relationship diagram
      ``` mermaid
      +erDiagram
      +  CUSTOMER ||--o{ ORDER : places
      +  ORDER ||--|{ LINE-ITEM : contains
      +  LINE-ITEM {
      +    string name
      +    int pricePerUnit
      +  }
      +  CUSTOMER }|..|{ DELIVERY-ADDRESS : uses
      +```
      +
      erDiagram
      +  CUSTOMER ||--o{ ORDER : places
      +  ORDER ||--|{ LINE-ITEM : contains
      +  LINE-ITEM {
      +    string name
      +    int pricePerUnit
      +  }
      +  CUSTOMER }|..|{ DELIVERY-ADDRESS : uses

      Other diagram types

      Besides the diagram types listed above, Mermaid.js provides support for pie charts, gantt charts, user journeys, git graphs and requirement diagrams, all of which are not officially supported by Material for MkDocs. Those diagrams should still work as advertised by Mermaid.js, but we don't consider them a good choice, mostly as they don't work well on mobile.


      1. While all Mermaid.js features should work out-of-the-box, Material for MkDocs will currently only adjust the fonts and colors for flowcharts, sequence diagrams, class diagrams, state diagrams and entity relationship diagrams. See the section on other diagrams for more information why this is currently not implemented for all diagrams. 

      \ No newline at end of file diff --git a/reference/footnotes/index.html b/reference/footnotes/index.html new file mode 100755 index 0000000..39bf3ce --- /dev/null +++ b/reference/footnotes/index.html @@ -0,0 +1,20 @@ + Footnotes - 一抹雨烟

      Footnotes

      Footnotes are a great way to add supplemental or additional information to a specific word, phrase or sentence without interrupting the flow of a document. Material for MkDocs provides the ability to define, reference and render footnotes.

      Configuration

      This configuration adds the ability to define inline footnotes, which are then rendered below all Markdown content of a document. Add the following lines to mkdocs.yml:

      markdown_extensions:
      +  - footnotes
      +

      See additional configuration options:

      Usage

      Adding footnote references

      A footnote reference must be enclosed in square brackets and must start with a caret ^, directly followed by an arbitrary identifier, which is similar to the standard Markdown link syntax.

      Text with footnote references
      Lorem ipsum[^1] dolor sit amet, consectetur adipiscing elit.[^2]
      +

      Lorem ipsum1 dolor sit amet, consectetur adipiscing elit.2

      Adding footnote content

      The footnote content must be declared with the same identifier as the reference. It can be inserted at an arbitrary position in the document and is always rendered at the bottom of the page. Furthermore, a backlink to the footnote reference is automatically added.

      on a single line

      Short footnotes can be written on the same line:

      Footnote
      [^1]: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
      +

      on multiple lines

      Paragraphs can be written on the next line and must be indented by four spaces:

      Footnote
      [^2]:
      +    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
      +    nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
      +    massa, nec semper lorem quam in massa.
      +

      1. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 

      2. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa. 

      \ No newline at end of file diff --git a/reference/formatting/index.html b/reference/formatting/index.html new file mode 100755 index 0000000..99ed0cf --- /dev/null +++ b/reference/formatting/index.html @@ -0,0 +1,34 @@ + Formatting - 一抹雨烟

      Formatting

      Material for MkDocs provides support for several HTML elements that can be used to highlight sections of a document or apply specific formatting. Additionally, Critic Markup is supported, adding the ability to display suggested changes for a document.

      Configuration

      This configuration enables support for keyboard keys, tracking changes in documents, defining sub- and superscript and highlighting text. Add the following lines to mkdocs.yml:

      markdown_extensions:
      +  - pymdownx.critic
      +  - pymdownx.caret
      +  - pymdownx.keys
      +  - pymdownx.mark
      +  - pymdownx.tilde
      +

      See additional configuration options:

      Usage

      Highlighting changes

      When Critic is enabled, Critic Markup can be used, which adds the ability to highlight suggested changes, as well as add inline comments to a document:

      Text with suggested changes
      Text can be {--deleted--} and replacement text {++added++}. This can also be
      +combined into {~~one~>a single~~} operation. {==Highlighting==} is also
      +possible {>>and comments can be added inline<<}.
      +
      +{==
      +
      +Formatting can also be applied to blocks by putting the opening and closing
      +tags on separate lines and adding new lines between the tags and the content.
      +
      +==}
      +

      Text can be deleted and replacement text added. This can also be combined into onea single operation. Highlighting is also possible and comments can be added inline.

      Formatting can also be applied to blocks by putting the opening and closing tags on separate lines and adding new lines between the tags and the content.

      Highlighting text

      When Caret, Mark & Tilde are enabled, text can be highlighted with a simple syntax, which is more convenient that directly using the corresponding mark, ins and del HTML tags:

      Text with highlighting
      - ==This was marked==
      +- ^^This was inserted^^
      +- ~~This was deleted~~
      +
      • This was marked
      • This was inserted
      • This was deleted

      Sub- and superscripts

      When Caret & Tilde are enabled, text can be sub- and superscripted with a simple syntax, which is more convenient than directly using the corresponding sub and sup HTML tags:

      Text with sub- and superscripts
      - H~2~O
      +- A^T^A
      +
      • H2O
      • ATA

      Adding keyboard keys

      When Keys is enabled, keyboard keys can be rendered with a simple syntax. Consult the Python Markdown Extensions documentation to learn about all available shortcodes:

      Keyboard keys
      ++ctrl+alt+del++
      +

      Ctrl+Alt+Del

      \ No newline at end of file diff --git a/reference/grids/index.html b/reference/grids/index.html new file mode 100755 index 0000000..c4e6cbb --- /dev/null +++ b/reference/grids/index.html @@ -0,0 +1,113 @@ + Grids - 一抹雨烟

      Grids

      Material for MkDocs makes it easy to arrange sections into grids, grouping blocks that convey similar meaning or are of equal importance. Grids are just perfect for building index pages that show a brief overview of a large section of your documentation.

      Configuration

      This configuration enables the use of grids, allowing to bring blocks of identical or different types into a rectangular shape. Add the following lines to mkdocs.yml:

      markdown_extensions: # (1)!
      +  - attr_list
      +  - md_in_html
      +
      1. Note that some of the examples listed below use icons and emojis, which have to be configured separately.

      See additional configuration options:

      Usage

      Grids come in two flavors: card grids, which wrap each element in a card that levitates on hover, and generic grids, which allow to arrange arbitrary block elements in a rectangular shape.

      Using card grids

      insiders-4.12.0

      Card grids wrap each grid item with a beautiful hover card that levitates on hover. They come in two slightly different syntaxes: list and block syntax, adding support for distinct use cases.

      List syntax

      The list syntax is essentially a shortcut for card grids, and consists of an unordered (or ordered) list wrapped by a div with both, the grid and cards classes:

      Card grid
      <div class="grid cards" markdown>
      +
      +- :fontawesome-brands-html5: __HTML__ for content and structure
      +- :fontawesome-brands-js: __JavaScript__ for interactivity
      +- :fontawesome-brands-css3: __CSS__ for text running out of boxes
      +- :fontawesome-brands-internet-explorer: __Internet Explorer__ ... huh?
      +
      +</div>
      +
      • HTML for content and structure
      • JavaScript for interactivity
      • CSS for text running out of boxes
      • Internet Explorer ... huh?

      List elements can contain arbitrary Markdown, as long as the surrounding div defines the markdown attribute. Following is a more complex example, which includes icons and links:

      Card grid, complex example
      <div class="grid cards" markdown>
      +
      +-   :material-clock-fast:{ .lg .middle } __Set up in 5 minutes__
      +
      +    ---
      +
      +    Install [`mkdocs-material`](#) with [`pip`](#) and get up
      +    and running in minutes
      +
      +    [:octicons-arrow-right-24: Getting started](#)
      +
      +-   :fontawesome-brands-markdown:{ .lg .middle } __It's just Markdown__
      +
      +    ---
      +
      +    Focus on your content and generate a responsive and searchable static site
      +
      +    [:octicons-arrow-right-24: Reference](#)
      +
      +-   :material-format-font:{ .lg .middle } __Made to measure__
      +
      +    ---
      +
      +    Change the colors, fonts, language, icons, logo and more with a few lines
      +
      +    [:octicons-arrow-right-24: Customization](#)
      +
      +-   :material-scale-balance:{ .lg .middle } __Open Source, MIT__
      +
      +    ---
      +
      +    Material for MkDocs is licensed under MIT and available on [GitHub]
      +
      +    [:octicons-arrow-right-24: License](#)
      +
      +</div>
      +
      • Set up in 5 minutes


        Install mkdocs-material with pip and get up and running in minutes

        Getting started

      • It's just Markdown


        Focus on your content and generate a responsive and searchable static site

        Reference

      • Made to measure


        Change the colors, fonts, language, icons, logo and more with a few lines

        Customization

      • Open Source, MIT


        Material for MkDocs is licensed under MIT and available on GitHub

        License

      If there's insufficient space to render grid items next to each other, the items will stretch to the full width of the viewport, e.g. on mobile viewports. If there's more space available, grids will render in items of 3 and more, e.g. when hiding both sidebars.

      Block syntax

      The block syntax allows for arranging cards in grids together with other elements, as explained in the section on generic grids. Just add the card class to any block element inside a grid:

      Card grid, blocks
      <div class="grid" markdown>
      +
      +:fontawesome-brands-html5: __HTML__ for content and structure
      +{ .card }
      +
      +:fontawesome-brands-js: __JavaScript__ for interactivity
      +{ .card }
      +
      +:fontawesome-brands-css3: __CSS__ for text running out of boxes
      +{ .card }
      +
      +> :fontawesome-brands-internet-explorer: __Internet Explorer__ ... huh?
      +
      +</div>
      +

      HTML for content and structure

      JavaScript for interactivity

      CSS for text running out of boxes

      Internet Explorer ... huh?

      While this syntax may seem unnecessarily verbose at first, the previous example shows how card grids can now be mixed with other elements that will also stretch to the grid.

      Using generic grids

      insiders-4.12.0

      Generic grids allow for arranging arbitrary block elements in a grid, including admonitions, code blocks, content tabs and more. Just wrap a set of blocks by using a div with the grid class:

      Generic grid
      <div class="grid" markdown>
      +
      +=== "Unordered list"
      +
      +    * Sed sagittis eleifend rutrum
      +    * Donec vitae suscipit est
      +    * Nulla tempor lobortis orci
      +
      +=== "Ordered list"
      +
      +    1. Sed sagittis eleifend rutrum
      +    2. Donec vitae suscipit est
      +    3. Nulla tempor lobortis orci
      +
      +``` title="Content tabs"
      +=== "Unordered list"
      +
      +    * Sed sagittis eleifend rutrum
      +    * Donec vitae suscipit est
      +    * Nulla tempor lobortis orci
      +
      +=== "Ordered list"
      +
      +    1. Sed sagittis eleifend rutrum
      +    2. Donec vitae suscipit est
      +    3. Nulla tempor lobortis orci
      +```
      +
      +</div>
      +
      • Sed sagittis eleifend rutrum
      • Donec vitae suscipit est
      • Nulla tempor lobortis orci
      1. Sed sagittis eleifend rutrum
      2. Donec vitae suscipit est
      3. Nulla tempor lobortis orci
      Content tabs
      === "Unordered list"
      +
      +    * Sed sagittis eleifend rutrum
      +    * Donec vitae suscipit est
      +    * Nulla tempor lobortis orci
      +
      +=== "Ordered list"
      +
      +    1. Sed sagittis eleifend rutrum
      +    2. Donec vitae suscipit est
      +    3. Nulla tempor lobortis orci
      +
      \ No newline at end of file diff --git a/reference/icons-emojis/index.html b/reference/icons-emojis/index.html new file mode 100755 index 0000000..5619aee --- /dev/null +++ b/reference/icons-emojis/index.html @@ -0,0 +1,46 @@ + Icons, Emojis - 一抹雨烟

      Icons, Emojis

      One of the best features of Material for MkDocs is the possibility to use more than 10,000 icons and thousands of emojis in your project documentation with practically zero additional effort. Moreover, custom icons can be added and used in mkdocs.yml, documents and templates.

        Tip: Enter some keywords to find icons and emojis and click on the shortcode to copy it to your clipboard.

        Configuration

        This configuration enables the use of icons and emojis by using simple shortcodes which can be discovered through the icon search. Add the following lines to mkdocs.yml:

        markdown_extensions:
        +  - attr_list
        +  - pymdownx.emoji:
        +      emoji_index: !!python/name:material.extensions.emoji.twemoji
        +      emoji_generator: !!python/name:material.extensions.emoji.to_svg
        +

        The following icon sets are bundled with Material for MkDocs:

        See additional configuration options:

        Usage

        Using emojis

        Emojis can be integrated in Markdown by putting the shortcode of the emoji between two colons. If you're using Twemoji (recommended), you can look up the shortcodes at Emojipedia:

        Emoji
        :smile:
        +

        😄

        Using icons

        When Emoji is enabled, icons can be used similar to emojis, by referencing a valid path to any icon bundled with the theme, which are located in the .icons directory, and replacing / with -:

        Icon
        :fontawesome-regular-face-laugh-wink:
        +

        with colors

        When Attribute Lists is enabled, custom CSS classes can be added to icons by suffixing the icon with a special syntax. While HTML allows to use inline styles, it's always recommended to add an additional style sheet and move declarations into dedicated CSS classes:

        .youtube {
        +  color: #EE0F0F;
        +}
        +
        extra_css:
        +  - stylesheets/extra.css
        +

        After applying the customization, add the CSS class to the icon shortcode:

        Icon with color
        :fontawesome-brands-youtube:{ .youtube }
        +

        with animations

        Similar to adding colors, it's just as easy to add animations to icons by using an additional style sheet, defining a @keyframes rule and adding a dedicated CSS class to the icon:

        @keyframes heart {
        +  0%, 40%, 80%, 100% {
        +    transform: scale(1);
        +  }
        +  20%, 60% {
        +    transform: scale(1.15);
        +  }
        +}
        +.heart {
        +  animation: heart 1000ms infinite;
        +}
        +
        extra_css:
        +  - stylesheets/extra.css
        +

        After applying the customization, add the CSS class to the icon shortcode:

        Icon with animation
        :octicons-heart-fill-24:{ .heart }
        +

        Icons, emojis in sidebars 😄

        With the help of the built-in typeset plugin, you can use icons and emojis in headings, which will then be rendered in the sidebars. The plugin preserves Markdown and HTML formatting.

        Customization

        Using icons in templates

        When you're extending the theme with partials or blocks, you can simply reference any icon that's bundled with the theme with Jinja's include function and wrap it with the .twemoji CSS class:

        <span class="twemoji">
        +  {% include ".icons/fontawesome/brands/youtube.svg" %} <!-- (1)! -->
        +</span>
        +
        1. Enter a few keywords to find the perfect icon using our icon search and click on the shortcode to copy it to your clipboard:

          This is exactly what Material for MkDocs does in its templates.

          \ No newline at end of file diff --git a/reference/images/index.html b/reference/images/index.html new file mode 100755 index 0000000..db4270e --- /dev/null +++ b/reference/images/index.html @@ -0,0 +1,35 @@ + Images - 一抹雨烟

          Images

          While images are first-class citizens of Markdown and part of the core syntax, it can be difficult to work with them. Material for MkDocs makes working with images more comfortable, providing styles for image alignment and image captions.

          Configuration

          This configuration adds the ability to align images, add captions to images (rendering them as figures), and mark large images for lazy-loading. Add the following lines to mkdocs.yml:

          markdown_extensions:
          +  - attr_list
          +  - md_in_html
          +

          See additional configuration options:

          0.1.0 glightbox

          If you want to add image zoom functionality to your documentation, the glightbox plugin is an excellent choice, as it integrates perfectly with Material for MkDocs. Install it with pip:

          pip install mkdocs-glightbox
          +

          Then, add the following lines to mkdocs.yml:

          plugins:
          +  - glightbox
          +

          We recommend checking out the available configuration options.

          Usage

          Image alignment

          When Attribute Lists is enabled, images can be aligned by adding the respective alignment directions via the align attribute, i.e. align=left or align=right:

          Image, aligned to left
          ![Image title](https://dummyimage.com/600x400/eee/aaa){ align=left }
          +

          Image title

          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

          Image, aligned to right
          ![Image title](https://dummyimage.com/600x400/eee/aaa){ align=right }
          +

          Image title

          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor massa, nec semper lorem quam in massa.

          If there's insufficient space to render the text next to the image, the image will stretch to the full width of the viewport, e.g. on mobile viewports.

          Why is there no centered alignment?

          The align attribute doesn't allow for centered alignment, which is why this option is not supported by Material for MkDocs.1 Instead, the image captions syntax can be used, as captions are optional.

          Image captions

          Sadly, the Markdown syntax doesn't provide native support for image captions, but it's always possible to use the Markdown in HTML extension with literal figure and figcaption tags:

          Image with caption
          <figure markdown>
          +  ![Image title](https://dummyimage.com/600x400/){ width="300" }
          +  <figcaption>Image caption</figcaption>
          +</figure>
          +
          Image caption

          Image lazy-loading

          Modern browsers provide native support for lazy-loading images through the loading=lazy directive, which degrades to eager-loading in browsers without support:

          Image, lazy-loaded
          ![Image title](https://dummyimage.com/600x400/){ loading=lazy }
          +

          Light and dark mode

          8.1.1

          If you added a color palette toggle and want to show different images for light and dark color schemes, you can append a #only-light or #only-dark hash fragment to the image URL:

          Image, different for light and dark mode
          ![Image title](https://dummyimage.com/600x400/f5f5f5/aaaaaa#only-light)
          +![Image title](https://dummyimage.com/600x400/21222c/d5d7e2#only-dark)
          +

          Zelda light world Zelda dark world

          Requirements when using custom color schemes

          The built-in color schemes define the aforementioned hash fragments, but if you're using custom color schemes, you'll also have to add the following selectors to your scheme, depending on whether it's a light or dark scheme:

          [data-md-color-scheme="custom-light"] img[src$="#only-dark"],
          +[data-md-color-scheme="custom-light"] img[src$="#gh-dark-mode-only"] {
          +  display: none; /* Hide dark images in light mode */
          +}
          +
          [data-md-color-scheme="custom-dark"] img[src$="#only-light"],
          +[data-md-color-scheme="custom-dark"] img[src$="#gh-light-mode-only"] {
          +  display: none; /* Hide light images in dark mode */
          +}
          +

          Remember to change "custom-light" and "custom-dark" to the name of your scheme.


          1. You might also realize that the align attribute has been deprecated as of HTML5, so why use it anyways? The main reason is portability – it's still supported by all browsers and clients, and is very unlikely to be completely removed, as many older websites still use it. This ensures a consistent appearance when a Markdown file with these attributes is viewed outside of a website generated by Material for MkDocs. 

          \ No newline at end of file diff --git a/reference/index.html b/reference/index.html new file mode 100755 index 0000000..566dae3 --- /dev/null +++ b/reference/index.html @@ -0,0 +1,69 @@ + Reference - 一抹雨烟

          Reference

          Material for MkDocs is packed with many great features that make technical writing a joyful activity. This section of the documentation explains how to set up a page, and showcases all available specimen that can be used directly from within Markdown files.

          Configuration

          Usage

          Setting the page title

          Each page has a designated title, which is used in the navigation sidebar, for social cards and in other places. While MkDocs attempts to automatically determine the title of a page in a four step process, the title can also be explicitly set with the front matter title property:

          ---
          +title: Lorem ipsum dolor sit amet # (1)!
          +---
          +
          +# Page title
          +...
          +
          1. This line sets the title inside the HTML document's head for the generated page to the given value. Note that the site title, which is set via site_name, is appended with a dash.

          Setting the page description

          A Markdown file can include a description that is added to the meta tags of a page, and is also used for social cards. It's a good idea to set a site_description in mkdocs.yml as a fallback value if the author does not explicitly define a description for a Markdown file:

          ---
          +description: Nullam urna elit, malesuada eget finibus ut, ac tortor. # (1)!
          +---
          +
          +# Page title
          +...
          +
          1. This line sets the meta tag containing the description inside the document head for the current page to the provided value.

          Setting the page icon

          9.2.0

          An icon can be assigned to each page, which is then rendered as part of the navigation sidebar, as well as navigation tabs, if enabled. Use the front matter icon property to reference an icon, adding the following lines at the top of a Markdown file:

          ---
          +icon: material/emoticon-happy # (1)!
          +---
          +
          +# Page title
          +...
          +
          1. Enter a few keywords to find the perfect icon using our icon search and click on the shortcode to copy it to your clipboard:

            Setting the page status

            9.2.0 .zip

            A status can be assigned to each page, which is then displayed as part of the navigation sidebar. First, associate a status identifier with a description by adding the following to mkdocs.yml:

            extra:
            +  status:
            +    <identifier>: <description> # (1)!
            +
            1. The identifier can only include alphanumeric characters, as well as dashes and underscores. For example, if you have a status Recently added, you can set new as an identifier:

              extra:
              +  status:
              +    new: Recently added
              +

            The page status can now be set with the front matter status property. For example, you can mark a page as new with the following lines at the top of a Markdown file:

            ---
            +status: new
            +---
            +
            +# Page title
            +...
            +

            The following status identifiers are already defined:

            • new
            • deprecated

            You can define a custom page status this way but if you want it to have an icon other than the default one you need to also configure that in your extra.css. We have an example for a custom page status to get you started.

            Setting the page subtitle

            insiders-4.25.0

            Each page can define a subtitle, which is then rendered below the title as part of the navigation sidebar by using the front matter subtitle property, and adding the following lines:

            ---
            +subtitle: Nullam urna elit, malesuada eget finibus ut, ac tortor
            +---
            +
            +# Page title
            +...
            +

            Setting the page template

            If you're using theme extension and created a new page template in the overrides directory, you can enable it for a specific page. Add the following lines at the top of a Markdown file:

            ---
            +template: custom.html
            +---
            +
            +# Page title
            +...
            +
            How to set a page template for an entire folder?

            With the help of the built-in meta plugin, you can set a custom template for an entire section and all nested pages, by creating a .meta.yml file in the corresponding folder with the following content:

            template: custom.html
            +

            Customization

            Using metadata in templates

            on all pages

            In order to add custom meta tags to your document, you can extend the theme and override the extrahead block, e.g. to add indexing policies for search engines via the robots property:

            {% extends "base.html" %}
            +
            +{% block extrahead %}
            +  <meta name="robots" content="noindex, nofollow" />
            +{% endblock %}
            +

            on a single page

            If you want to set a meta tag on a single page, or want to set different values for different pages, you can use the page.meta object inside your template override, e.g.:

            {% extends "base.html" %}
            +
            +{% block extrahead %}
            +  {% if page and page.meta and page.meta.robots %}
            +    <meta name="robots" content="{{ page.meta.robots }}" />
            +  {% else %}
            +    <meta name="robots" content="index, follow" />
            +  {% endif %}
            +{% endblock %}
            +

            You can now use robots exactly like title and description to set values. Note that in this case, the template defines an else branch, which would set a default if none was given.

            \ No newline at end of file diff --git a/reference/lists/index.html b/reference/lists/index.html new file mode 100755 index 0000000..86fe4f0 --- /dev/null +++ b/reference/lists/index.html @@ -0,0 +1,56 @@ + Lists - 一抹雨烟

            Lists

            Material for MkDocs supports several flavors of lists that cater to different use cases, including unordered lists and ordered lists, which are supported through standard Markdown, as well as definition lists and task lists, which are supported through extensions.

            Configuration

            This configuration enables the use of definition lists and tasks lists, which are both not part of the standard Markdown syntax. Add the following lines to mkdocs.yml:

            markdown_extensions:
            +  - def_list
            +  - pymdownx.tasklist:
            +      custom_checkbox: true
            +

            See additional configuration options:

            Usage

            Using unordered lists

            Unordered lists can be written by prefixing a line with a -, * or + list marker, all of which can be used interchangeably. Furthermore, all flavors of lists can be nested inside each other:

            List, unordered
            - Nulla et rhoncus turpis. Mauris ultricies elementum leo. Duis efficitur
            +  accumsan nibh eu mattis. Vivamus tempus velit eros, porttitor placerat nibh
            +  lacinia sed. Aenean in finibus diam.
            +
            +    * Duis mollis est eget nibh volutpat, fermentum aliquet dui mollis.
            +    * Nam vulputate tincidunt fringilla.
            +    * Nullam dignissim ultrices urna non auctor.
            +
            • Nulla et rhoncus turpis. Mauris ultricies elementum leo. Duis efficitur accumsan nibh eu mattis. Vivamus tempus velit eros, porttitor placerat nibh lacinia sed. Aenean in finibus diam.

              • Duis mollis est eget nibh volutpat, fermentum aliquet dui mollis.
              • Nam vulputate tincidunt fringilla.
              • Nullam dignissim ultrices urna non auctor.

            Using ordered lists

            Ordered lists must start with a number immediately followed by a dot. The numbers do not need to be consecutive and can be all set to 1., as they will be re-numbered when rendered:

            List, ordered
            1.  Vivamus id mi enim. Integer id turpis sapien. Ut condimentum lobortis
            +    sagittis. Aliquam purus tellus, faucibus eget urna at, iaculis venenatis
            +    nulla. Vivamus a pharetra leo.
            +
            +    1.  Vivamus venenatis porttitor tortor sit amet rutrum. Pellentesque aliquet
            +        quam enim, eu volutpat urna rutrum a. Nam vehicula nunc mauris, a
            +        ultricies libero efficitur sed.
            +
            +    2.  Morbi eget dapibus felis. Vivamus venenatis porttitor tortor sit amet
            +        rutrum. Pellentesque aliquet quam enim, eu volutpat urna rutrum a.
            +
            +        1.  Mauris dictum mi lacus
            +        2.  Ut sit amet placerat ante
            +        3.  Suspendisse ac eros arcu
            +
            1. Vivamus id mi enim. Integer id turpis sapien. Ut condimentum lobortis sagittis. Aliquam purus tellus, faucibus eget urna at, iaculis venenatis nulla. Vivamus a pharetra leo.

              1. Vivamus venenatis porttitor tortor sit amet rutrum. Pellentesque aliquet quam enim, eu volutpat urna rutrum a. Nam vehicula nunc mauris, a ultricies libero efficitur sed.

              2. Morbi eget dapibus felis. Vivamus venenatis porttitor tortor sit amet rutrum. Pellentesque aliquet quam enim, eu volutpat urna rutrum a.

                1. Mauris dictum mi lacus
                2. Ut sit amet placerat ante
                3. Suspendisse ac eros arcu

            Using definition lists

            When Definition Lists is enabled, lists of arbitrary key-value pairs, e.g. the parameters of functions or modules, can be enumerated with a simple syntax:

            Definition list
            `Lorem ipsum dolor sit amet`
            +
            +:   Sed sagittis eleifend rutrum. Donec vitae suscipit est. Nullam tempus
            +    tellus non sem sollicitudin, quis rutrum leo facilisis.
            +
            +`Cras arcu libero`
            +
            +:   Aliquam metus eros, pretium sed nulla venenatis, faucibus auctor ex. Proin
            +    ut eros sed sapien ullamcorper consequat. Nunc ligula ante.
            +
            +    Duis mollis est eget nibh volutpat, fermentum aliquet dui mollis.
            +    Nam vulputate tincidunt fringilla.
            +    Nullam dignissim ultrices urna non auctor.
            +
            Lorem ipsum dolor sit amet

            Sed sagittis eleifend rutrum. Donec vitae suscipit est. Nullam tempus tellus non sem sollicitudin, quis rutrum leo facilisis.

            Cras arcu libero

            Aliquam metus eros, pretium sed nulla venenatis, faucibus auctor ex. Proin ut eros sed sapien ullamcorper consequat. Nunc ligula ante.

            Duis mollis est eget nibh volutpat, fermentum aliquet dui mollis. Nam vulputate tincidunt fringilla. Nullam dignissim ultrices urna non auctor.

            Using task lists

            When Tasklist is enabled, unordered list items can be prefixed with [ ] to render an unchecked checkbox or [x] to render a checked checkbox, allowing for the definition of task lists:

            Task list
            - [x] Lorem ipsum dolor sit amet, consectetur adipiscing elit
            +- [ ] Vestibulum convallis sit amet nisi a tincidunt
            +    * [x] In hac habitasse platea dictumst
            +    * [x] In scelerisque nibh non dolor mollis congue sed et metus
            +    * [ ] Praesent sed risus massa
            +- [ ] Aenean pretium efficitur erat, donec pharetra, ligula non scelerisque
            +
            • Lorem ipsum dolor sit amet, consectetur adipiscing elit
            • Vestibulum convallis sit amet nisi a tincidunt
              • In hac habitasse platea dictumst
              • In scelerisque nibh non dolor mollis congue sed et metus
              • Praesent sed risus massa
            • Aenean pretium efficitur erat, donec pharetra, ligula non scelerisque
            \ No newline at end of file diff --git a/reference/math/index.html b/reference/math/index.html new file mode 100755 index 0000000..b4abf44 --- /dev/null +++ b/reference/math/index.html @@ -0,0 +1,76 @@ + Math - 一抹雨烟

            Math

            MathJax and KaTeX are two popular libraries for displaying mathematical content in browsers. Although both libraries offer similar functionality, they use different syntaxes and have different configuration options. This documentation site provides information on how to integrate them with Material for MkDocs easily.

            Configuration

            The following configuration enables support for rendering block and inline block equations using MathJax and KaTeX.

            MathJax

            MathJax is a powerful and flexible library that supports multiple input formats, such as LaTeX, MathML, AsciiMath, as well as various output formats like HTML, SVG, MathML. To use MathJax within your project, add the following lines to your mkdocs.yml.

            window.MathJax = {
            +  tex: {
            +    inlineMath: [["\\(", "\\)"]],
            +    displayMath: [["\\[", "\\]"]],
            +    processEscapes: true,
            +    processEnvironments: true
            +  },
            +  options: {
            +    ignoreHtmlClass: ".*|",
            +    processHtmlClass: "arithmatex"
            +  }
            +};
            +
            +document$.subscribe(() => { // (1)!
            +  MathJax.typesetPromise()
            +})
            +
            1. This integrates MathJax with instant loading.
            markdown_extensions:
            +  - pymdownx.arithmatex:
            +      generic: true
            +
            +extra_javascript:
            +  - javascripts/mathjax.js
            +  - https://polyfill.io/v3/polyfill.min.js?features=es6
            +  - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
            +

            See additional configuration options:

            KaTeX

            KaTeX is a lightweight library that focuses on speed and simplicity. It supports a subset of LaTeX syntax and can render math to HTML and SVG. To use KaTeX within your project, add the following lines to your mkdocs.yml.

            document$.subscribe(({ body }) => { // (1)!
            +  renderMathInElement(body, {
            +    delimiters: [
            +      { left: "$$",  right: "$$",  display: true },
            +      { left: "$",   right: "$",   display: false },
            +      { left: "\\(", right: "\\)", display: false },
            +      { left: "\\[", right: "\\]", display: true }
            +    ],
            +  })
            +})
            +
            1. This integrates KaTeX with instant loading.
            markdown_extensions:
            +  - pymdownx.arithmatex:
            +      generic: true
            +
            +extra_javascript:
            +  - javascripts/katex.js 
            +  - https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.7/katex.min.js  # (1)!
            +  - https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.7/contrib/auto-render.min.js
            +
            +extra_css:
            +  - https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.7/katex.min.css
            +
            1. Alternatively, you can add these JavaScript and CSS files via script tags by overriding HTML files.

            Usage

            Using block syntax

            Blocks must be enclosed in $$...$$ or \[...\] on separate lines:

            block syntax
            $$
            +\operatorname{ker} f=\{g\in G:f(g)=e_{H}\}{\mbox{.}}
            +$$
            +
            \[ \operatorname{ker} f=\{g\in G:f(g)=e_{H}\}{\mbox{.}} \]

            Using inline block syntax

            Inline blocks must be enclosed in $...$ or \(...\):

            inline syntax
            The homomorphism $f$ is injective if and only if its kernel is only the 
            +singleton set $e_G$, because otherwise $\exists a,b\in G$ with $a\neq b$ such 
            +that $f(a)=f(b)$.
            +

            The homomorphism \(f\) is injective if and only if its kernel is only the singleton set \(e_G\), because otherwise \(\exists a,b\in G\) with \(a\neq b\) such that \(f(a)=f(b)\).

            Comparing MathJax and KaTeX

            When deciding between MathJax and KaTeX, there are several key factors to consider:

            • Speed: KaTeX is generally faster than MathJax. If your site requires rendering large quantities of complex equations quickly, KaTeX may be the better choice.

            • Syntax Support: MathJax supports a wider array of LaTeX commands and can process a variety of mathematical markup languages (like AsciiMath and MathML). If you need advanced LaTeX features, MathJax may be more suitable.

            • Output Format: Both libraries support HTML and SVG outputs. However, MathJax also offers MathML output, which can be essential for accessibility, as it is readable by screen readers.

            • Configurability: MathJax provides a range of configuration options, allowing for more precise control over its behavior. If you have specific rendering requirements, MathJax might be a more flexible choice.

            • Browser Support: While both libraries work well in modern browsers, MathJax has broader compatibility with older browsers. If your audience uses a variety of browsers, including older ones, MathJax might be a safer option.

            In summary, KaTeX shines with its speed and simplicity, whereas MathJax offers more features and better compatibility at the expense of speed. The choice between the two will largely depend on your specific needs and constraints.

            \ No newline at end of file diff --git a/reference/tooltips/index.html b/reference/tooltips/index.html new file mode 100755 index 0000000..276cb1b --- /dev/null +++ b/reference/tooltips/index.html @@ -0,0 +1,34 @@ + Tooltips - 一抹雨烟

            Tooltips

            Technical documentation often incurs the usage of many acronyms, which may need additional explanation, especially for new user of your project. For these matters, Material for MkDocs uses a combination of Markdown extensions to enable site-wide glossaries.

            Configuration

            This configuration enables abbreviations and allows to build a simple project-wide glossary, sourcing definitions from a central location. Add the following line to mkdocs.yml:

            markdown_extensions:
            +  - abbr
            +  - attr_list
            +  - pymdownx.snippets
            +

            See additional configuration options:

            Improved tooltips

            insiders-4.15.0

            When improved tooltips are enabled, Material for MkDocs replaces the browser's rendering logic for title attribute with beautiful little tooltips. Add the following lines to mkdocs.yml:

            theme:
            +  features:
            +    - content.tooltips
            +

            Now, tooltips will be rendered for the following elements:

            • Content – elements with a title, permalinks and code copy button
            • Header – home button, header title, color palette switch and repository link
            • Navigation – links that are shortened with ellipsis, i.e. ...

            Usage

            Adding tooltips

            The Markdown syntax allows to specify a title for each link, which will render as a beautiful tooltip when improved tooltips are enabled. Add a tooltip to a link with the following lines:

            Link with tooltip, inline syntax
            [Hover me](https://example.com "I'm a tooltip!")
            +

            Tooltips can also be added to link references:

            Link with tooltip, reference syntax
            [Hover me][example]
            +
            +  [example]: https://example.com "I'm a tooltip!"
            +

            For all other elements, a title can be added by using the Attribute Lists extension:

            Icon with tooltip
            :material-information-outline:{ title="Important information" }
            +

            Adding abbreviations

            Abbreviations can be defined by using a special syntax similar to URLs and footnotes, starting with a * and immediately followed by the term or acronym to be associated in square brackets:

            Text with abbreviations
            The HTML specification is maintained by the W3C.
            +
            +*[HTML]: Hyper Text Markup Language
            +*[W3C]: World Wide Web Consortium
            +

            The HTML specification is maintained by the W3C.

            Adding a glossary

            The Snippets extension can be used to implement a simple glossary by moving all abbreviations in a dedicated file1, and auto-append this file to all pages with the following configuration:

            *[HTML]: Hyper Text Markup Language
            +*[W3C]: World Wide Web Consortium
            +
            markdown_extensions:
            +  - pymdownx.snippets:
            +      auto_append:
            +        - includes/abbreviations.md
            +

            1. It's highly recommended to put the Markdown file containing the abbreviations outside of the docs folder (here, a folder with the name includes is used), as MkDocs might otherwise complain about an unreferenced file. 

            \ No newline at end of file diff --git a/schema.json b/schema.json new file mode 100755 index 0000000..b8d5139 --- /dev/null +++ b/schema.json @@ -0,0 +1,179 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Material for MkDocs", + "markdownDescription": "Configuration", + "type": "object", + "properties": { + "INHERIT": { + "title": "Inherit from configuration", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#configuration-inheritance", + "pattern": "\\.yml$" + }, + "site_name": { + "title": "Site name, used in header, title and drawer", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_name", + "type": "string" + }, + "site_url": { + "title": "Site URL", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_url", + "type": "string" + }, + "site_author": { + "title": "Site author, used in document head", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_author", + "type": "string" + }, + "site_description": { + "title": "Site description, used in document head and in social cards", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_description", + "type": "string" + }, + "repo_name": { + "title": "Repository name, used in header", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#repository-name", + "type": "string" + }, + "repo_url": { + "title": "Repository URL", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#repository", + "type": "string" + }, + "edit_uri": { + "title": "Path from repository root to directory containing Markdown", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#edit_uri", + "type": "string" + }, + "copyright": { + "title": "Copyright, used in footer", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#copyright-notice", + "type": "string" + }, + "docs_dir": { + "title": "Directory containing the Markdown sources", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#docs_dir", + "type": "string", + "default": "docs" + }, + "site_dir": { + "title": "Directory containing the HTML output", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#site_dir", + "type": "string", + "default": "site" + }, + "use_directory_urls": { + "title": "Pages are located in their own directories", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#use_directory_urls", + "type": "boolean", + "default": false + }, + "extra_templates": { + "title": "Additional HTML files to include", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#extra_templates", + "type": "array", + "items": { + "title": "Path to HTML file", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#extra_templates", + "pattern": "\\.html$" + }, + "uniqueItems": true, + "minItems": 1 + }, + "extra_css": { + "title": "Additional CSS files to include", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-css", + "type": "array", + "items": { + "title": "Path to CSS file", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-css", + "pattern": "\\.css($|\\?)" + }, + "uniqueItems": true, + "minItems": 1 + }, + "extra_javascript": { + "title": "Additional JavaScript files to include", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-javascript", + "type": "array", + "items": { + "title": "Path to JavaScript file", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#additional-javascript", + "pattern": "\\.m?js($|\\?)" + }, + "uniqueItems": true, + "minItems": 1 + }, + "hooks": { + "title": "Hooks", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#hooks", + "type": "array", + "items": { + "title": "Path to Python file", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#hooks", + "pattern": "\\.py$" + }, + "uniqueItems": true, + "minItems": 1 + }, + "strict": { + "title": "Strict mode", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#strict", + "type": "boolean", + "default": false + }, + "dev_addr": { + "title": "Development IP Address", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#dev_addr", + "type": "string", + "default": "127.0.0.1:8000" + }, + "remote_branch": { + "title": "Remote branch to deploy to", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#remote_branch", + "type": "string", + "default": "gh-pages" + }, + "remote_name": { + "title": "Remote origin to deploy to", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#remote_name", + "type": "string", + "default": "origin" + }, + "theme": { + "$ref": "schema/theme.json" + }, + "plugins": { + "$ref": "schema/plugins.json" + }, + "markdown_extensions": { + "$ref": "schema/extensions.json" + }, + "extra": { + "$ref": "schema/extra.json" + }, + "nav": { + "$ref": "schema/nav.json" + }, + "validation": { + "$ref": "schema/validation.json" + }, + "exclude_docs": { + "title": "Pattern to declare files to exclude from build", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#exclude_docs", + "type": "string" + }, + "not_in_nav": { + "title": "Pattern to declare pages that do not appear in the navigation", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#not_in_nav", + "type": "string" + }, + "watch": { + "items": { + "title": "Path to watch for changes", + "type": "string" + }, + "type": "array" + } + }, + "additionalProperties": false +} diff --git a/schema/assets/fonts.json b/schema/assets/fonts.json new file mode 100755 index 0000000..b08ca37 --- /dev/null +++ b/schema/assets/fonts.json @@ -0,0 +1,7913 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Google Fonts", + "markdownDescription": "https://fonts.google.com/", + "type": "string", + "oneOf": [ + { + "title": "ABeeZee", + "markdownDescription": "https://fonts.google.com/specimen/ABeeZee", + "const": "ABeeZee" + }, + { + "title": "ADLaM Display", + "markdownDescription": "https://fonts.google.com/specimen/ADLaM+Display", + "const": "ADLaM Display" + }, + { + "title": "AR One Sans", + "markdownDescription": "https://fonts.google.com/specimen/AR+One+Sans", + "const": "AR One Sans" + }, + { + "title": "Abel", + "markdownDescription": "https://fonts.google.com/specimen/Abel", + "const": "Abel" + }, + { + "title": "Abhaya Libre", + "markdownDescription": "https://fonts.google.com/specimen/Abhaya+Libre", + "const": "Abhaya Libre" + }, + { + "title": "Aboreto", + "markdownDescription": "https://fonts.google.com/specimen/Aboreto", + "const": "Aboreto" + }, + { + "title": "Abril Fatface", + "markdownDescription": "https://fonts.google.com/specimen/Abril+Fatface", + "const": "Abril Fatface" + }, + { + "title": "Abyssinica SIL", + "markdownDescription": "https://fonts.google.com/specimen/Abyssinica+SIL", + "const": "Abyssinica SIL" + }, + { + "title": "Aclonica", + "markdownDescription": "https://fonts.google.com/specimen/Aclonica", + "const": "Aclonica" + }, + { + "title": "Acme", + "markdownDescription": "https://fonts.google.com/specimen/Acme", + "const": "Acme" + }, + { + "title": "Actor", + "markdownDescription": "https://fonts.google.com/specimen/Actor", + "const": "Actor" + }, + { + "title": "Adamina", + "markdownDescription": "https://fonts.google.com/specimen/Adamina", + "const": "Adamina" + }, + { + "title": "Advent Pro", + "markdownDescription": "https://fonts.google.com/specimen/Advent+Pro", + "const": "Advent Pro" + }, + { + "title": "Agdasima", + "markdownDescription": "https://fonts.google.com/specimen/Agdasima", + "const": "Agdasima" + }, + { + "title": "Aguafina Script", + "markdownDescription": "https://fonts.google.com/specimen/Aguafina+Script", + "const": "Aguafina Script" + }, + { + "title": "Akatab", + "markdownDescription": "https://fonts.google.com/specimen/Akatab", + "const": "Akatab" + }, + { + "title": "Akaya Kanadaka", + "markdownDescription": "https://fonts.google.com/specimen/Akaya+Kanadaka", + "const": "Akaya Kanadaka" + }, + { + "title": "Akaya Telivigala", + "markdownDescription": "https://fonts.google.com/specimen/Akaya+Telivigala", + "const": "Akaya Telivigala" + }, + { + "title": "Akronim", + "markdownDescription": "https://fonts.google.com/specimen/Akronim", + "const": "Akronim" + }, + { + "title": "Akshar", + "markdownDescription": "https://fonts.google.com/specimen/Akshar", + "const": "Akshar" + }, + { + "title": "Aladin", + "markdownDescription": "https://fonts.google.com/specimen/Aladin", + "const": "Aladin" + }, + { + "title": "Alata", + "markdownDescription": "https://fonts.google.com/specimen/Alata", + "const": "Alata" + }, + { + "title": "Alatsi", + "markdownDescription": "https://fonts.google.com/specimen/Alatsi", + "const": "Alatsi" + }, + { + "title": "Albert Sans", + "markdownDescription": "https://fonts.google.com/specimen/Albert+Sans", + "const": "Albert Sans" + }, + { + "title": "Aldrich", + "markdownDescription": "https://fonts.google.com/specimen/Aldrich", + "const": "Aldrich" + }, + { + "title": "Alef", + "markdownDescription": "https://fonts.google.com/specimen/Alef", + "const": "Alef" + }, + { + "title": "Alegreya", + "markdownDescription": "https://fonts.google.com/specimen/Alegreya", + "const": "Alegreya" + }, + { + "title": "Alegreya SC", + "markdownDescription": "https://fonts.google.com/specimen/Alegreya+SC", + "const": "Alegreya SC" + }, + { + "title": "Alegreya Sans", + "markdownDescription": "https://fonts.google.com/specimen/Alegreya+Sans", + "const": "Alegreya Sans" + }, + { + "title": "Alegreya Sans SC", + "markdownDescription": "https://fonts.google.com/specimen/Alegreya+Sans+SC", + "const": "Alegreya Sans SC" + }, + { + "title": "Aleo", + "markdownDescription": "https://fonts.google.com/specimen/Aleo", + "const": "Aleo" + }, + { + "title": "Alex Brush", + "markdownDescription": "https://fonts.google.com/specimen/Alex+Brush", + "const": "Alex Brush" + }, + { + "title": "Alexandria", + "markdownDescription": "https://fonts.google.com/specimen/Alexandria", + "const": "Alexandria" + }, + { + "title": "Alfa Slab One", + "markdownDescription": "https://fonts.google.com/specimen/Alfa+Slab+One", + "const": "Alfa Slab One" + }, + { + "title": "Alice", + "markdownDescription": "https://fonts.google.com/specimen/Alice", + "const": "Alice" + }, + { + "title": "Alike", + "markdownDescription": "https://fonts.google.com/specimen/Alike", + "const": "Alike" + }, + { + "title": "Alike Angular", + "markdownDescription": "https://fonts.google.com/specimen/Alike+Angular", + "const": "Alike Angular" + }, + { + "title": "Alkalami", + "markdownDescription": "https://fonts.google.com/specimen/Alkalami", + "const": "Alkalami" + }, + { + "title": "Alkatra", + "markdownDescription": "https://fonts.google.com/specimen/Alkatra", + "const": "Alkatra" + }, + { + "title": "Allan", + "markdownDescription": "https://fonts.google.com/specimen/Allan", + "const": "Allan" + }, + { + "title": "Allerta", + "markdownDescription": "https://fonts.google.com/specimen/Allerta", + "const": "Allerta" + }, + { + "title": "Allerta Stencil", + "markdownDescription": "https://fonts.google.com/specimen/Allerta+Stencil", + "const": "Allerta Stencil" + }, + { + "title": "Allison", + "markdownDescription": "https://fonts.google.com/specimen/Allison", + "const": "Allison" + }, + { + "title": "Allura", + "markdownDescription": "https://fonts.google.com/specimen/Allura", + "const": "Allura" + }, + { + "title": "Almarai", + "markdownDescription": "https://fonts.google.com/specimen/Almarai", + "const": "Almarai" + }, + { + "title": "Almendra", + "markdownDescription": "https://fonts.google.com/specimen/Almendra", + "const": "Almendra" + }, + { + "title": "Almendra Display", + "markdownDescription": "https://fonts.google.com/specimen/Almendra+Display", + "const": "Almendra Display" + }, + { + "title": "Almendra SC", + "markdownDescription": "https://fonts.google.com/specimen/Almendra+SC", + "const": "Almendra SC" + }, + { + "title": "Alumni Sans", + "markdownDescription": "https://fonts.google.com/specimen/Alumni+Sans", + "const": "Alumni Sans" + }, + { + "title": "Alumni Sans Collegiate One", + "markdownDescription": "https://fonts.google.com/specimen/Alumni+Sans+Collegiate+One", + "const": "Alumni Sans Collegiate One" + }, + { + "title": "Alumni Sans Inline One", + "markdownDescription": "https://fonts.google.com/specimen/Alumni+Sans+Inline+One", + "const": "Alumni Sans Inline One" + }, + { + "title": "Alumni Sans Pinstripe", + "markdownDescription": "https://fonts.google.com/specimen/Alumni+Sans+Pinstripe", + "const": "Alumni Sans Pinstripe" + }, + { + "title": "Amarante", + "markdownDescription": "https://fonts.google.com/specimen/Amarante", + "const": "Amarante" + }, + { + "title": "Amaranth", + "markdownDescription": "https://fonts.google.com/specimen/Amaranth", + "const": "Amaranth" + }, + { + "title": "Amatic SC", + "markdownDescription": "https://fonts.google.com/specimen/Amatic+SC", + "const": "Amatic SC" + }, + { + "title": "Amethysta", + "markdownDescription": "https://fonts.google.com/specimen/Amethysta", + "const": "Amethysta" + }, + { + "title": "Amiko", + "markdownDescription": "https://fonts.google.com/specimen/Amiko", + "const": "Amiko" + }, + { + "title": "Amiri", + "markdownDescription": "https://fonts.google.com/specimen/Amiri", + "const": "Amiri" + }, + { + "title": "Amiri Quran", + "markdownDescription": "https://fonts.google.com/specimen/Amiri+Quran", + "const": "Amiri Quran" + }, + { + "title": "Amita", + "markdownDescription": "https://fonts.google.com/specimen/Amita", + "const": "Amita" + }, + { + "title": "Anaheim", + "markdownDescription": "https://fonts.google.com/specimen/Anaheim", + "const": "Anaheim" + }, + { + "title": "Andada Pro", + "markdownDescription": "https://fonts.google.com/specimen/Andada+Pro", + "const": "Andada Pro" + }, + { + "title": "Andika", + "markdownDescription": "https://fonts.google.com/specimen/Andika", + "const": "Andika" + }, + { + "title": "Anek Bangla", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Bangla", + "const": "Anek Bangla" + }, + { + "title": "Anek Devanagari", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Devanagari", + "const": "Anek Devanagari" + }, + { + "title": "Anek Gujarati", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Gujarati", + "const": "Anek Gujarati" + }, + { + "title": "Anek Gurmukhi", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Gurmukhi", + "const": "Anek Gurmukhi" + }, + { + "title": "Anek Kannada", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Kannada", + "const": "Anek Kannada" + }, + { + "title": "Anek Latin", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Latin", + "const": "Anek Latin" + }, + { + "title": "Anek Malayalam", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Malayalam", + "const": "Anek Malayalam" + }, + { + "title": "Anek Odia", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Odia", + "const": "Anek Odia" + }, + { + "title": "Anek Tamil", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Tamil", + "const": "Anek Tamil" + }, + { + "title": "Anek Telugu", + "markdownDescription": "https://fonts.google.com/specimen/Anek+Telugu", + "const": "Anek Telugu" + }, + { + "title": "Angkor", + "markdownDescription": "https://fonts.google.com/specimen/Angkor", + "const": "Angkor" + }, + { + "title": "Annie Use Your Telescope", + "markdownDescription": "https://fonts.google.com/specimen/Annie+Use+Your+Telescope", + "const": "Annie Use Your Telescope" + }, + { + "title": "Anonymous Pro", + "markdownDescription": "https://fonts.google.com/specimen/Anonymous+Pro", + "const": "Anonymous Pro" + }, + { + "title": "Antic", + "markdownDescription": "https://fonts.google.com/specimen/Antic", + "const": "Antic" + }, + { + "title": "Antic Didone", + "markdownDescription": "https://fonts.google.com/specimen/Antic+Didone", + "const": "Antic Didone" + }, + { + "title": "Antic Slab", + "markdownDescription": "https://fonts.google.com/specimen/Antic+Slab", + "const": "Antic Slab" + }, + { + "title": "Anton", + "markdownDescription": "https://fonts.google.com/specimen/Anton", + "const": "Anton" + }, + { + "title": "Antonio", + "markdownDescription": "https://fonts.google.com/specimen/Antonio", + "const": "Antonio" + }, + { + "title": "Anuphan", + "markdownDescription": "https://fonts.google.com/specimen/Anuphan", + "const": "Anuphan" + }, + { + "title": "Anybody", + "markdownDescription": "https://fonts.google.com/specimen/Anybody", + "const": "Anybody" + }, + { + "title": "Aoboshi One", + "markdownDescription": "https://fonts.google.com/specimen/Aoboshi+One", + "const": "Aoboshi One" + }, + { + "title": "Arapey", + "markdownDescription": "https://fonts.google.com/specimen/Arapey", + "const": "Arapey" + }, + { + "title": "Arbutus", + "markdownDescription": "https://fonts.google.com/specimen/Arbutus", + "const": "Arbutus" + }, + { + "title": "Arbutus Slab", + "markdownDescription": "https://fonts.google.com/specimen/Arbutus+Slab", + "const": "Arbutus Slab" + }, + { + "title": "Architects Daughter", + "markdownDescription": "https://fonts.google.com/specimen/Architects+Daughter", + "const": "Architects Daughter" + }, + { + "title": "Archivo", + "markdownDescription": "https://fonts.google.com/specimen/Archivo", + "const": "Archivo" + }, + { + "title": "Archivo Black", + "markdownDescription": "https://fonts.google.com/specimen/Archivo+Black", + "const": "Archivo Black" + }, + { + "title": "Archivo Narrow", + "markdownDescription": "https://fonts.google.com/specimen/Archivo+Narrow", + "const": "Archivo Narrow" + }, + { + "title": "Are You Serious", + "markdownDescription": "https://fonts.google.com/specimen/Are+You+Serious", + "const": "Are You Serious" + }, + { + "title": "Aref Ruqaa", + "markdownDescription": "https://fonts.google.com/specimen/Aref+Ruqaa", + "const": "Aref Ruqaa" + }, + { + "title": "Aref Ruqaa Ink", + "markdownDescription": "https://fonts.google.com/specimen/Aref+Ruqaa+Ink", + "const": "Aref Ruqaa Ink" + }, + { + "title": "Arima", + "markdownDescription": "https://fonts.google.com/specimen/Arima", + "const": "Arima" + }, + { + "title": "Arima Madurai", + "markdownDescription": "https://fonts.google.com/specimen/Arima+Madurai", + "const": "Arima Madurai" + }, + { + "title": "Arimo", + "markdownDescription": "https://fonts.google.com/specimen/Arimo", + "const": "Arimo" + }, + { + "title": "Arizonia", + "markdownDescription": "https://fonts.google.com/specimen/Arizonia", + "const": "Arizonia" + }, + { + "title": "Armata", + "markdownDescription": "https://fonts.google.com/specimen/Armata", + "const": "Armata" + }, + { + "title": "Arsenal", + "markdownDescription": "https://fonts.google.com/specimen/Arsenal", + "const": "Arsenal" + }, + { + "title": "Artifika", + "markdownDescription": "https://fonts.google.com/specimen/Artifika", + "const": "Artifika" + }, + { + "title": "Arvo", + "markdownDescription": "https://fonts.google.com/specimen/Arvo", + "const": "Arvo" + }, + { + "title": "Arya", + "markdownDescription": "https://fonts.google.com/specimen/Arya", + "const": "Arya" + }, + { + "title": "Asap", + "markdownDescription": "https://fonts.google.com/specimen/Asap", + "const": "Asap" + }, + { + "title": "Asap Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Asap+Condensed", + "const": "Asap Condensed" + }, + { + "title": "Asar", + "markdownDescription": "https://fonts.google.com/specimen/Asar", + "const": "Asar" + }, + { + "title": "Asset", + "markdownDescription": "https://fonts.google.com/specimen/Asset", + "const": "Asset" + }, + { + "title": "Assistant", + "markdownDescription": "https://fonts.google.com/specimen/Assistant", + "const": "Assistant" + }, + { + "title": "Astloch", + "markdownDescription": "https://fonts.google.com/specimen/Astloch", + "const": "Astloch" + }, + { + "title": "Asul", + "markdownDescription": "https://fonts.google.com/specimen/Asul", + "const": "Asul" + }, + { + "title": "Athiti", + "markdownDescription": "https://fonts.google.com/specimen/Athiti", + "const": "Athiti" + }, + { + "title": "Atkinson Hyperlegible", + "markdownDescription": "https://fonts.google.com/specimen/Atkinson+Hyperlegible", + "const": "Atkinson Hyperlegible" + }, + { + "title": "Atma", + "markdownDescription": "https://fonts.google.com/specimen/Atma", + "const": "Atma" + }, + { + "title": "Atomic Age", + "markdownDescription": "https://fonts.google.com/specimen/Atomic+Age", + "const": "Atomic Age" + }, + { + "title": "Aubrey", + "markdownDescription": "https://fonts.google.com/specimen/Aubrey", + "const": "Aubrey" + }, + { + "title": "Audiowide", + "markdownDescription": "https://fonts.google.com/specimen/Audiowide", + "const": "Audiowide" + }, + { + "title": "Autour One", + "markdownDescription": "https://fonts.google.com/specimen/Autour+One", + "const": "Autour One" + }, + { + "title": "Average", + "markdownDescription": "https://fonts.google.com/specimen/Average", + "const": "Average" + }, + { + "title": "Average Sans", + "markdownDescription": "https://fonts.google.com/specimen/Average+Sans", + "const": "Average Sans" + }, + { + "title": "Averia Gruesa Libre", + "markdownDescription": "https://fonts.google.com/specimen/Averia+Gruesa+Libre", + "const": "Averia Gruesa Libre" + }, + { + "title": "Averia Libre", + "markdownDescription": "https://fonts.google.com/specimen/Averia+Libre", + "const": "Averia Libre" + }, + { + "title": "Averia Sans Libre", + "markdownDescription": "https://fonts.google.com/specimen/Averia+Sans+Libre", + "const": "Averia Sans Libre" + }, + { + "title": "Averia Serif Libre", + "markdownDescription": "https://fonts.google.com/specimen/Averia+Serif+Libre", + "const": "Averia Serif Libre" + }, + { + "title": "Azeret Mono", + "markdownDescription": "https://fonts.google.com/specimen/Azeret+Mono", + "const": "Azeret Mono" + }, + { + "title": "B612", + "markdownDescription": "https://fonts.google.com/specimen/B612", + "const": "B612" + }, + { + "title": "B612 Mono", + "markdownDescription": "https://fonts.google.com/specimen/B612+Mono", + "const": "B612 Mono" + }, + { + "title": "BIZ UDGothic", + "markdownDescription": "https://fonts.google.com/specimen/BIZ+UDGothic", + "const": "BIZ UDGothic" + }, + { + "title": "BIZ UDMincho", + "markdownDescription": "https://fonts.google.com/specimen/BIZ+UDMincho", + "const": "BIZ UDMincho" + }, + { + "title": "BIZ UDPGothic", + "markdownDescription": "https://fonts.google.com/specimen/BIZ+UDPGothic", + "const": "BIZ UDPGothic" + }, + { + "title": "BIZ UDPMincho", + "markdownDescription": "https://fonts.google.com/specimen/BIZ+UDPMincho", + "const": "BIZ UDPMincho" + }, + { + "title": "Babylonica", + "markdownDescription": "https://fonts.google.com/specimen/Babylonica", + "const": "Babylonica" + }, + { + "title": "Bacasime Antique", + "markdownDescription": "https://fonts.google.com/specimen/Bacasime+Antique", + "const": "Bacasime Antique" + }, + { + "title": "Bad Script", + "markdownDescription": "https://fonts.google.com/specimen/Bad+Script", + "const": "Bad Script" + }, + { + "title": "Bagel Fat One", + "markdownDescription": "https://fonts.google.com/specimen/Bagel+Fat+One", + "const": "Bagel Fat One" + }, + { + "title": "Bahiana", + "markdownDescription": "https://fonts.google.com/specimen/Bahiana", + "const": "Bahiana" + }, + { + "title": "Bahianita", + "markdownDescription": "https://fonts.google.com/specimen/Bahianita", + "const": "Bahianita" + }, + { + "title": "Bai Jamjuree", + "markdownDescription": "https://fonts.google.com/specimen/Bai+Jamjuree", + "const": "Bai Jamjuree" + }, + { + "title": "Bakbak One", + "markdownDescription": "https://fonts.google.com/specimen/Bakbak+One", + "const": "Bakbak One" + }, + { + "title": "Ballet", + "markdownDescription": "https://fonts.google.com/specimen/Ballet", + "const": "Ballet" + }, + { + "title": "Baloo 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+2", + "const": "Baloo 2" + }, + { + "title": "Baloo Bhai 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Bhai+2", + "const": "Baloo Bhai 2" + }, + { + "title": "Baloo Bhaijaan 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Bhaijaan+2", + "const": "Baloo Bhaijaan 2" + }, + { + "title": "Baloo Bhaina 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Bhaina+2", + "const": "Baloo Bhaina 2" + }, + { + "title": "Baloo Chettan 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Chettan+2", + "const": "Baloo Chettan 2" + }, + { + "title": "Baloo Da 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Da+2", + "const": "Baloo Da 2" + }, + { + "title": "Baloo Paaji 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Paaji+2", + "const": "Baloo Paaji 2" + }, + { + "title": "Baloo Tamma 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Tamma+2", + "const": "Baloo Tamma 2" + }, + { + "title": "Baloo Tammudu 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Tammudu+2", + "const": "Baloo Tammudu 2" + }, + { + "title": "Baloo Thambi 2", + "markdownDescription": "https://fonts.google.com/specimen/Baloo+Thambi+2", + "const": "Baloo Thambi 2" + }, + { + "title": "Balsamiq Sans", + "markdownDescription": "https://fonts.google.com/specimen/Balsamiq+Sans", + "const": "Balsamiq Sans" + }, + { + "title": "Balthazar", + "markdownDescription": "https://fonts.google.com/specimen/Balthazar", + "const": "Balthazar" + }, + { + "title": "Bangers", + "markdownDescription": "https://fonts.google.com/specimen/Bangers", + "const": "Bangers" + }, + { + "title": "Barlow", + "markdownDescription": "https://fonts.google.com/specimen/Barlow", + "const": "Barlow" + }, + { + "title": "Barlow Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Barlow+Condensed", + "const": "Barlow Condensed" + }, + { + "title": "Barlow Semi Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Barlow+Semi+Condensed", + "const": "Barlow Semi Condensed" + }, + { + "title": "Barriecito", + "markdownDescription": "https://fonts.google.com/specimen/Barriecito", + "const": "Barriecito" + }, + { + "title": "Barrio", + "markdownDescription": "https://fonts.google.com/specimen/Barrio", + "const": "Barrio" + }, + { + "title": "Basic", + "markdownDescription": "https://fonts.google.com/specimen/Basic", + "const": "Basic" + }, + { + "title": "Baskervville", + "markdownDescription": "https://fonts.google.com/specimen/Baskervville", + "const": "Baskervville" + }, + { + "title": "Battambang", + "markdownDescription": "https://fonts.google.com/specimen/Battambang", + "const": "Battambang" + }, + { + "title": "Baumans", + "markdownDescription": "https://fonts.google.com/specimen/Baumans", + "const": "Baumans" + }, + { + "title": "Bayon", + "markdownDescription": "https://fonts.google.com/specimen/Bayon", + "const": "Bayon" + }, + { + "title": "Be Vietnam Pro", + "markdownDescription": "https://fonts.google.com/specimen/Be+Vietnam+Pro", + "const": "Be Vietnam Pro" + }, + { + "title": "Beau Rivage", + "markdownDescription": "https://fonts.google.com/specimen/Beau+Rivage", + "const": "Beau Rivage" + }, + { + "title": "Bebas Neue", + "markdownDescription": "https://fonts.google.com/specimen/Bebas+Neue", + "const": "Bebas Neue" + }, + { + "title": "Belanosima", + "markdownDescription": "https://fonts.google.com/specimen/Belanosima", + "const": "Belanosima" + }, + { + "title": "Belgrano", + "markdownDescription": "https://fonts.google.com/specimen/Belgrano", + "const": "Belgrano" + }, + { + "title": "Bellefair", + "markdownDescription": "https://fonts.google.com/specimen/Bellefair", + "const": "Bellefair" + }, + { + "title": "Belleza", + "markdownDescription": "https://fonts.google.com/specimen/Belleza", + "const": "Belleza" + }, + { + "title": "Bellota", + "markdownDescription": "https://fonts.google.com/specimen/Bellota", + "const": "Bellota" + }, + { + "title": "Bellota Text", + "markdownDescription": "https://fonts.google.com/specimen/Bellota+Text", + "const": "Bellota Text" + }, + { + "title": "BenchNine", + "markdownDescription": "https://fonts.google.com/specimen/BenchNine", + "const": "BenchNine" + }, + { + "title": "Benne", + "markdownDescription": "https://fonts.google.com/specimen/Benne", + "const": "Benne" + }, + { + "title": "Bentham", + "markdownDescription": "https://fonts.google.com/specimen/Bentham", + "const": "Bentham" + }, + { + "title": "Berkshire Swash", + "markdownDescription": "https://fonts.google.com/specimen/Berkshire+Swash", + "const": "Berkshire Swash" + }, + { + "title": "Besley", + "markdownDescription": "https://fonts.google.com/specimen/Besley", + "const": "Besley" + }, + { + "title": "Beth Ellen", + "markdownDescription": "https://fonts.google.com/specimen/Beth+Ellen", + "const": "Beth Ellen" + }, + { + "title": "Bevan", + "markdownDescription": "https://fonts.google.com/specimen/Bevan", + "const": "Bevan" + }, + { + "title": "BhuTuka Expanded One", + "markdownDescription": "https://fonts.google.com/specimen/BhuTuka+Expanded+One", + "const": "BhuTuka Expanded One" + }, + { + "title": "Big Shoulders Display", + "markdownDescription": "https://fonts.google.com/specimen/Big+Shoulders+Display", + "const": "Big Shoulders Display" + }, + { + "title": "Big Shoulders Inline Display", + "markdownDescription": "https://fonts.google.com/specimen/Big+Shoulders+Inline+Display", + "const": "Big Shoulders Inline Display" + }, + { + "title": "Big Shoulders Inline Text", + "markdownDescription": "https://fonts.google.com/specimen/Big+Shoulders+Inline+Text", + "const": "Big Shoulders Inline Text" + }, + { + "title": "Big Shoulders Stencil Display", + "markdownDescription": "https://fonts.google.com/specimen/Big+Shoulders+Stencil+Display", + "const": "Big Shoulders Stencil Display" + }, + { + "title": "Big Shoulders Stencil Text", + "markdownDescription": "https://fonts.google.com/specimen/Big+Shoulders+Stencil+Text", + "const": "Big Shoulders Stencil Text" + }, + { + "title": "Big Shoulders Text", + "markdownDescription": "https://fonts.google.com/specimen/Big+Shoulders+Text", + "const": "Big Shoulders Text" + }, + { + "title": "Bigelow Rules", + "markdownDescription": "https://fonts.google.com/specimen/Bigelow+Rules", + "const": "Bigelow Rules" + }, + { + "title": "Bigshot One", + "markdownDescription": "https://fonts.google.com/specimen/Bigshot+One", + "const": "Bigshot One" + }, + { + "title": "Bilbo", + "markdownDescription": "https://fonts.google.com/specimen/Bilbo", + "const": "Bilbo" + }, + { + "title": "Bilbo Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Bilbo+Swash+Caps", + "const": "Bilbo Swash Caps" + }, + { + "title": "BioRhyme", + "markdownDescription": "https://fonts.google.com/specimen/BioRhyme", + "const": "BioRhyme" + }, + { + "title": "BioRhyme Expanded", + "markdownDescription": "https://fonts.google.com/specimen/BioRhyme+Expanded", + "const": "BioRhyme Expanded" + }, + { + "title": "Birthstone", + "markdownDescription": "https://fonts.google.com/specimen/Birthstone", + "const": "Birthstone" + }, + { + "title": "Birthstone Bounce", + "markdownDescription": "https://fonts.google.com/specimen/Birthstone+Bounce", + "const": "Birthstone Bounce" + }, + { + "title": "Biryani", + "markdownDescription": "https://fonts.google.com/specimen/Biryani", + "const": "Biryani" + }, + { + "title": "Bitter", + "markdownDescription": "https://fonts.google.com/specimen/Bitter", + "const": "Bitter" + }, + { + "title": "Black And White Picture", + "markdownDescription": "https://fonts.google.com/specimen/Black+And+White+Picture", + "const": "Black And White Picture" + }, + { + "title": "Black Han Sans", + "markdownDescription": "https://fonts.google.com/specimen/Black+Han+Sans", + "const": "Black Han Sans" + }, + { + "title": "Black Ops One", + "markdownDescription": "https://fonts.google.com/specimen/Black+Ops+One", + "const": "Black Ops One" + }, + { + "title": "Blaka", + "markdownDescription": "https://fonts.google.com/specimen/Blaka", + "const": "Blaka" + }, + { + "title": "Blaka Hollow", + "markdownDescription": "https://fonts.google.com/specimen/Blaka+Hollow", + "const": "Blaka Hollow" + }, + { + "title": "Blaka Ink", + "markdownDescription": "https://fonts.google.com/specimen/Blaka+Ink", + "const": "Blaka Ink" + }, + { + "title": "Blinker", + "markdownDescription": "https://fonts.google.com/specimen/Blinker", + "const": "Blinker" + }, + { + "title": "Bodoni Moda", + "markdownDescription": "https://fonts.google.com/specimen/Bodoni+Moda", + "const": "Bodoni Moda" + }, + { + "title": "Bokor", + "markdownDescription": "https://fonts.google.com/specimen/Bokor", + "const": "Bokor" + }, + { + "title": "Bona Nova", + "markdownDescription": "https://fonts.google.com/specimen/Bona+Nova", + "const": "Bona Nova" + }, + { + "title": "Bonbon", + "markdownDescription": "https://fonts.google.com/specimen/Bonbon", + "const": "Bonbon" + }, + { + "title": "Bonheur Royale", + "markdownDescription": "https://fonts.google.com/specimen/Bonheur+Royale", + "const": "Bonheur Royale" + }, + { + "title": "Boogaloo", + "markdownDescription": "https://fonts.google.com/specimen/Boogaloo", + "const": "Boogaloo" + }, + { + "title": "Borel", + "markdownDescription": "https://fonts.google.com/specimen/Borel", + "const": "Borel" + }, + { + "title": "Bowlby One", + "markdownDescription": "https://fonts.google.com/specimen/Bowlby+One", + "const": "Bowlby One" + }, + { + "title": "Bowlby One SC", + "markdownDescription": "https://fonts.google.com/specimen/Bowlby+One+SC", + "const": "Bowlby One SC" + }, + { + "title": "Braah One", + "markdownDescription": "https://fonts.google.com/specimen/Braah+One", + "const": "Braah One" + }, + { + "title": "Brawler", + "markdownDescription": "https://fonts.google.com/specimen/Brawler", + "const": "Brawler" + }, + { + "title": "Bree Serif", + "markdownDescription": "https://fonts.google.com/specimen/Bree+Serif", + "const": "Bree Serif" + }, + { + "title": "Bricolage Grotesque", + "markdownDescription": "https://fonts.google.com/specimen/Bricolage+Grotesque", + "const": "Bricolage Grotesque" + }, + { + "title": "Bruno Ace", + "markdownDescription": "https://fonts.google.com/specimen/Bruno+Ace", + "const": "Bruno Ace" + }, + { + "title": "Bruno Ace SC", + "markdownDescription": "https://fonts.google.com/specimen/Bruno+Ace+SC", + "const": "Bruno Ace SC" + }, + { + "title": "Brygada 1918", + "markdownDescription": "https://fonts.google.com/specimen/Brygada+1918", + "const": "Brygada 1918" + }, + { + "title": "Bubblegum Sans", + "markdownDescription": "https://fonts.google.com/specimen/Bubblegum+Sans", + "const": "Bubblegum Sans" + }, + { + "title": "Bubbler One", + "markdownDescription": "https://fonts.google.com/specimen/Bubbler+One", + "const": "Bubbler One" + }, + { + "title": "Buda", + "markdownDescription": "https://fonts.google.com/specimen/Buda", + "const": "Buda" + }, + { + "title": "Buenard", + "markdownDescription": "https://fonts.google.com/specimen/Buenard", + "const": "Buenard" + }, + { + "title": "Bungee", + "markdownDescription": "https://fonts.google.com/specimen/Bungee", + "const": "Bungee" + }, + { + "title": "Bungee Hairline", + "markdownDescription": "https://fonts.google.com/specimen/Bungee+Hairline", + "const": "Bungee Hairline" + }, + { + "title": "Bungee Inline", + "markdownDescription": "https://fonts.google.com/specimen/Bungee+Inline", + "const": "Bungee Inline" + }, + { + "title": "Bungee Outline", + "markdownDescription": "https://fonts.google.com/specimen/Bungee+Outline", + "const": "Bungee Outline" + }, + { + "title": "Bungee Shade", + "markdownDescription": "https://fonts.google.com/specimen/Bungee+Shade", + "const": "Bungee Shade" + }, + { + "title": "Bungee Spice", + "markdownDescription": "https://fonts.google.com/specimen/Bungee+Spice", + "const": "Bungee Spice" + }, + { + "title": "Butcherman", + "markdownDescription": "https://fonts.google.com/specimen/Butcherman", + "const": "Butcherman" + }, + { + "title": "Butterfly Kids", + "markdownDescription": "https://fonts.google.com/specimen/Butterfly+Kids", + "const": "Butterfly Kids" + }, + { + "title": "Cabin", + "markdownDescription": "https://fonts.google.com/specimen/Cabin", + "const": "Cabin" + }, + { + "title": "Cabin Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Cabin+Condensed", + "const": "Cabin Condensed" + }, + { + "title": "Cabin Sketch", + "markdownDescription": "https://fonts.google.com/specimen/Cabin+Sketch", + "const": "Cabin Sketch" + }, + { + "title": "Caesar Dressing", + "markdownDescription": "https://fonts.google.com/specimen/Caesar+Dressing", + "const": "Caesar Dressing" + }, + { + "title": "Cagliostro", + "markdownDescription": "https://fonts.google.com/specimen/Cagliostro", + "const": "Cagliostro" + }, + { + "title": "Cairo", + "markdownDescription": "https://fonts.google.com/specimen/Cairo", + "const": "Cairo" + }, + { + "title": "Cairo Play", + "markdownDescription": "https://fonts.google.com/specimen/Cairo+Play", + "const": "Cairo Play" + }, + { + "title": "Caladea", + "markdownDescription": "https://fonts.google.com/specimen/Caladea", + "const": "Caladea" + }, + { + "title": "Calistoga", + "markdownDescription": "https://fonts.google.com/specimen/Calistoga", + "const": "Calistoga" + }, + { + "title": "Calligraffitti", + "markdownDescription": "https://fonts.google.com/specimen/Calligraffitti", + "const": "Calligraffitti" + }, + { + "title": "Cambay", + "markdownDescription": "https://fonts.google.com/specimen/Cambay", + "const": "Cambay" + }, + { + "title": "Cambo", + "markdownDescription": "https://fonts.google.com/specimen/Cambo", + "const": "Cambo" + }, + { + "title": "Candal", + "markdownDescription": "https://fonts.google.com/specimen/Candal", + "const": "Candal" + }, + { + "title": "Cantarell", + "markdownDescription": "https://fonts.google.com/specimen/Cantarell", + "const": "Cantarell" + }, + { + "title": "Cantata One", + "markdownDescription": "https://fonts.google.com/specimen/Cantata+One", + "const": "Cantata One" + }, + { + "title": "Cantora One", + "markdownDescription": "https://fonts.google.com/specimen/Cantora+One", + "const": "Cantora One" + }, + { + "title": "Caprasimo", + "markdownDescription": "https://fonts.google.com/specimen/Caprasimo", + "const": "Caprasimo" + }, + { + "title": "Capriola", + "markdownDescription": "https://fonts.google.com/specimen/Capriola", + "const": "Capriola" + }, + { + "title": "Caramel", + "markdownDescription": "https://fonts.google.com/specimen/Caramel", + "const": "Caramel" + }, + { + "title": "Carattere", + "markdownDescription": "https://fonts.google.com/specimen/Carattere", + "const": "Carattere" + }, + { + "title": "Cardo", + "markdownDescription": "https://fonts.google.com/specimen/Cardo", + "const": "Cardo" + }, + { + "title": "Carlito", + "markdownDescription": "https://fonts.google.com/specimen/Carlito", + "const": "Carlito" + }, + { + "title": "Carme", + "markdownDescription": "https://fonts.google.com/specimen/Carme", + "const": "Carme" + }, + { + "title": "Carrois Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Carrois+Gothic", + "const": "Carrois Gothic" + }, + { + "title": "Carrois Gothic SC", + "markdownDescription": "https://fonts.google.com/specimen/Carrois+Gothic+SC", + "const": "Carrois Gothic SC" + }, + { + "title": "Carter One", + "markdownDescription": "https://fonts.google.com/specimen/Carter+One", + "const": "Carter One" + }, + { + "title": "Castoro", + "markdownDescription": "https://fonts.google.com/specimen/Castoro", + "const": "Castoro" + }, + { + "title": "Castoro Titling", + "markdownDescription": "https://fonts.google.com/specimen/Castoro+Titling", + "const": "Castoro Titling" + }, + { + "title": "Catamaran", + "markdownDescription": "https://fonts.google.com/specimen/Catamaran", + "const": "Catamaran" + }, + { + "title": "Caudex", + "markdownDescription": "https://fonts.google.com/specimen/Caudex", + "const": "Caudex" + }, + { + "title": "Caveat", + "markdownDescription": "https://fonts.google.com/specimen/Caveat", + "const": "Caveat" + }, + { + "title": "Caveat Brush", + "markdownDescription": "https://fonts.google.com/specimen/Caveat+Brush", + "const": "Caveat Brush" + }, + { + "title": "Cedarville Cursive", + "markdownDescription": "https://fonts.google.com/specimen/Cedarville+Cursive", + "const": "Cedarville Cursive" + }, + { + "title": "Ceviche One", + "markdownDescription": "https://fonts.google.com/specimen/Ceviche+One", + "const": "Ceviche One" + }, + { + "title": "Chakra Petch", + "markdownDescription": "https://fonts.google.com/specimen/Chakra+Petch", + "const": "Chakra Petch" + }, + { + "title": "Changa", + "markdownDescription": "https://fonts.google.com/specimen/Changa", + "const": "Changa" + }, + { + "title": "Changa One", + "markdownDescription": "https://fonts.google.com/specimen/Changa+One", + "const": "Changa One" + }, + { + "title": "Chango", + "markdownDescription": "https://fonts.google.com/specimen/Chango", + "const": "Chango" + }, + { + "title": "Charis SIL", + "markdownDescription": "https://fonts.google.com/specimen/Charis+SIL", + "const": "Charis SIL" + }, + { + "title": "Charm", + "markdownDescription": "https://fonts.google.com/specimen/Charm", + "const": "Charm" + }, + { + "title": "Charmonman", + "markdownDescription": "https://fonts.google.com/specimen/Charmonman", + "const": "Charmonman" + }, + { + "title": "Chathura", + "markdownDescription": "https://fonts.google.com/specimen/Chathura", + "const": "Chathura" + }, + { + "title": "Chau Philomene One", + "markdownDescription": "https://fonts.google.com/specimen/Chau+Philomene+One", + "const": "Chau Philomene One" + }, + { + "title": "Chela One", + "markdownDescription": "https://fonts.google.com/specimen/Chela+One", + "const": "Chela One" + }, + { + "title": "Chelsea Market", + "markdownDescription": "https://fonts.google.com/specimen/Chelsea+Market", + "const": "Chelsea Market" + }, + { + "title": "Chenla", + "markdownDescription": "https://fonts.google.com/specimen/Chenla", + "const": "Chenla" + }, + { + "title": "Cherish", + "markdownDescription": "https://fonts.google.com/specimen/Cherish", + "const": "Cherish" + }, + { + "title": "Cherry Bomb One", + "markdownDescription": "https://fonts.google.com/specimen/Cherry+Bomb+One", + "const": "Cherry Bomb One" + }, + { + "title": "Cherry Cream Soda", + "markdownDescription": "https://fonts.google.com/specimen/Cherry+Cream+Soda", + "const": "Cherry Cream Soda" + }, + { + "title": "Cherry Swash", + "markdownDescription": "https://fonts.google.com/specimen/Cherry+Swash", + "const": "Cherry Swash" + }, + { + "title": "Chewy", + "markdownDescription": "https://fonts.google.com/specimen/Chewy", + "const": "Chewy" + }, + { + "title": "Chicle", + "markdownDescription": "https://fonts.google.com/specimen/Chicle", + "const": "Chicle" + }, + { + "title": "Chilanka", + "markdownDescription": "https://fonts.google.com/specimen/Chilanka", + "const": "Chilanka" + }, + { + "title": "Chivo", + "markdownDescription": "https://fonts.google.com/specimen/Chivo", + "const": "Chivo" + }, + { + "title": "Chivo Mono", + "markdownDescription": "https://fonts.google.com/specimen/Chivo+Mono", + "const": "Chivo Mono" + }, + { + "title": "Chokokutai", + "markdownDescription": "https://fonts.google.com/specimen/Chokokutai", + "const": "Chokokutai" + }, + { + "title": "Chonburi", + "markdownDescription": "https://fonts.google.com/specimen/Chonburi", + "const": "Chonburi" + }, + { + "title": "Cinzel", + "markdownDescription": "https://fonts.google.com/specimen/Cinzel", + "const": "Cinzel" + }, + { + "title": "Cinzel Decorative", + "markdownDescription": "https://fonts.google.com/specimen/Cinzel+Decorative", + "const": "Cinzel Decorative" + }, + { + "title": "Clicker Script", + "markdownDescription": "https://fonts.google.com/specimen/Clicker+Script", + "const": "Clicker Script" + }, + { + "title": "Climate Crisis", + "markdownDescription": "https://fonts.google.com/specimen/Climate+Crisis", + "const": "Climate Crisis" + }, + { + "title": "Coda", + "markdownDescription": "https://fonts.google.com/specimen/Coda", + "const": "Coda" + }, + { + "title": "Coda Caption", + "markdownDescription": "https://fonts.google.com/specimen/Coda+Caption", + "const": "Coda Caption" + }, + { + "title": "Codystar", + "markdownDescription": "https://fonts.google.com/specimen/Codystar", + "const": "Codystar" + }, + { + "title": "Coiny", + "markdownDescription": "https://fonts.google.com/specimen/Coiny", + "const": "Coiny" + }, + { + "title": "Combo", + "markdownDescription": "https://fonts.google.com/specimen/Combo", + "const": "Combo" + }, + { + "title": "Comfortaa", + "markdownDescription": "https://fonts.google.com/specimen/Comfortaa", + "const": "Comfortaa" + }, + { + "title": "Comforter", + "markdownDescription": "https://fonts.google.com/specimen/Comforter", + "const": "Comforter" + }, + { + "title": "Comforter Brush", + "markdownDescription": "https://fonts.google.com/specimen/Comforter+Brush", + "const": "Comforter Brush" + }, + { + "title": "Comic Neue", + "markdownDescription": "https://fonts.google.com/specimen/Comic+Neue", + "const": "Comic Neue" + }, + { + "title": "Coming Soon", + "markdownDescription": "https://fonts.google.com/specimen/Coming+Soon", + "const": "Coming Soon" + }, + { + "title": "Comme", + "markdownDescription": "https://fonts.google.com/specimen/Comme", + "const": "Comme" + }, + { + "title": "Commissioner", + "markdownDescription": "https://fonts.google.com/specimen/Commissioner", + "const": "Commissioner" + }, + { + "title": "Concert One", + "markdownDescription": "https://fonts.google.com/specimen/Concert+One", + "const": "Concert One" + }, + { + "title": "Condiment", + "markdownDescription": "https://fonts.google.com/specimen/Condiment", + "const": "Condiment" + }, + { + "title": "Content", + "markdownDescription": "https://fonts.google.com/specimen/Content", + "const": "Content" + }, + { + "title": "Contrail One", + "markdownDescription": "https://fonts.google.com/specimen/Contrail+One", + "const": "Contrail One" + }, + { + "title": "Convergence", + "markdownDescription": "https://fonts.google.com/specimen/Convergence", + "const": "Convergence" + }, + { + "title": "Cookie", + "markdownDescription": "https://fonts.google.com/specimen/Cookie", + "const": "Cookie" + }, + { + "title": "Copse", + "markdownDescription": "https://fonts.google.com/specimen/Copse", + "const": "Copse" + }, + { + "title": "Corben", + "markdownDescription": "https://fonts.google.com/specimen/Corben", + "const": "Corben" + }, + { + "title": "Corinthia", + "markdownDescription": "https://fonts.google.com/specimen/Corinthia", + "const": "Corinthia" + }, + { + "title": "Cormorant", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant", + "const": "Cormorant" + }, + { + "title": "Cormorant Garamond", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+Garamond", + "const": "Cormorant Garamond" + }, + { + "title": "Cormorant Infant", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+Infant", + "const": "Cormorant Infant" + }, + { + "title": "Cormorant SC", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+SC", + "const": "Cormorant SC" + }, + { + "title": "Cormorant Unicase", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+Unicase", + "const": "Cormorant Unicase" + }, + { + "title": "Cormorant Upright", + "markdownDescription": "https://fonts.google.com/specimen/Cormorant+Upright", + "const": "Cormorant Upright" + }, + { + "title": "Courgette", + "markdownDescription": "https://fonts.google.com/specimen/Courgette", + "const": "Courgette" + }, + { + "title": "Courier Prime", + "markdownDescription": "https://fonts.google.com/specimen/Courier+Prime", + "const": "Courier Prime" + }, + { + "title": "Cousine", + "markdownDescription": "https://fonts.google.com/specimen/Cousine", + "const": "Cousine" + }, + { + "title": "Coustard", + "markdownDescription": "https://fonts.google.com/specimen/Coustard", + "const": "Coustard" + }, + { + "title": "Covered By Your Grace", + "markdownDescription": "https://fonts.google.com/specimen/Covered+By+Your+Grace", + "const": "Covered By Your Grace" + }, + { + "title": "Crafty Girls", + "markdownDescription": "https://fonts.google.com/specimen/Crafty+Girls", + "const": "Crafty Girls" + }, + { + "title": "Creepster", + "markdownDescription": "https://fonts.google.com/specimen/Creepster", + "const": "Creepster" + }, + { + "title": "Crete Round", + "markdownDescription": "https://fonts.google.com/specimen/Crete+Round", + "const": "Crete Round" + }, + { + "title": "Crimson Pro", + "markdownDescription": "https://fonts.google.com/specimen/Crimson+Pro", + "const": "Crimson Pro" + }, + { + "title": "Crimson Text", + "markdownDescription": "https://fonts.google.com/specimen/Crimson+Text", + "const": "Crimson Text" + }, + { + "title": "Croissant One", + "markdownDescription": "https://fonts.google.com/specimen/Croissant+One", + "const": "Croissant One" + }, + { + "title": "Crushed", + "markdownDescription": "https://fonts.google.com/specimen/Crushed", + "const": "Crushed" + }, + { + "title": "Cuprum", + "markdownDescription": "https://fonts.google.com/specimen/Cuprum", + "const": "Cuprum" + }, + { + "title": "Cute Font", + "markdownDescription": "https://fonts.google.com/specimen/Cute+Font", + "const": "Cute Font" + }, + { + "title": "Cutive", + "markdownDescription": "https://fonts.google.com/specimen/Cutive", + "const": "Cutive" + }, + { + "title": "Cutive Mono", + "markdownDescription": "https://fonts.google.com/specimen/Cutive+Mono", + "const": "Cutive Mono" + }, + { + "title": "DM Mono", + "markdownDescription": "https://fonts.google.com/specimen/DM+Mono", + "const": "DM Mono" + }, + { + "title": "DM Sans", + "markdownDescription": "https://fonts.google.com/specimen/DM+Sans", + "const": "DM Sans" + }, + { + "title": "DM Serif Display", + "markdownDescription": "https://fonts.google.com/specimen/DM+Serif+Display", + "const": "DM Serif Display" + }, + { + "title": "DM Serif Text", + "markdownDescription": "https://fonts.google.com/specimen/DM+Serif+Text", + "const": "DM Serif Text" + }, + { + "title": "Dai Banna SIL", + "markdownDescription": "https://fonts.google.com/specimen/Dai+Banna+SIL", + "const": "Dai Banna SIL" + }, + { + "title": "Damion", + "markdownDescription": "https://fonts.google.com/specimen/Damion", + "const": "Damion" + }, + { + "title": "Dancing Script", + "markdownDescription": "https://fonts.google.com/specimen/Dancing+Script", + "const": "Dancing Script" + }, + { + "title": "Dangrek", + "markdownDescription": "https://fonts.google.com/specimen/Dangrek", + "const": "Dangrek" + }, + { + "title": "Darker Grotesque", + "markdownDescription": "https://fonts.google.com/specimen/Darker+Grotesque", + "const": "Darker Grotesque" + }, + { + "title": "Darumadrop One", + "markdownDescription": "https://fonts.google.com/specimen/Darumadrop+One", + "const": "Darumadrop One" + }, + { + "title": "David Libre", + "markdownDescription": "https://fonts.google.com/specimen/David+Libre", + "const": "David Libre" + }, + { + "title": "Dawning of a New Day", + "markdownDescription": "https://fonts.google.com/specimen/Dawning+of+a+New+Day", + "const": "Dawning of a New Day" + }, + { + "title": "Days One", + "markdownDescription": "https://fonts.google.com/specimen/Days+One", + "const": "Days One" + }, + { + "title": "Dekko", + "markdownDescription": "https://fonts.google.com/specimen/Dekko", + "const": "Dekko" + }, + { + "title": "Dela Gothic One", + "markdownDescription": "https://fonts.google.com/specimen/Dela+Gothic+One", + "const": "Dela Gothic One" + }, + { + "title": "Delicious Handrawn", + "markdownDescription": "https://fonts.google.com/specimen/Delicious+Handrawn", + "const": "Delicious Handrawn" + }, + { + "title": "Delius", + "markdownDescription": "https://fonts.google.com/specimen/Delius", + "const": "Delius" + }, + { + "title": "Delius Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Delius+Swash+Caps", + "const": "Delius Swash Caps" + }, + { + "title": "Delius Unicase", + "markdownDescription": "https://fonts.google.com/specimen/Delius+Unicase", + "const": "Delius Unicase" + }, + { + "title": "Della Respira", + "markdownDescription": "https://fonts.google.com/specimen/Della+Respira", + "const": "Della Respira" + }, + { + "title": "Denk One", + "markdownDescription": "https://fonts.google.com/specimen/Denk+One", + "const": "Denk One" + }, + { + "title": "Devonshire", + "markdownDescription": "https://fonts.google.com/specimen/Devonshire", + "const": "Devonshire" + }, + { + "title": "Dhurjati", + "markdownDescription": "https://fonts.google.com/specimen/Dhurjati", + "const": "Dhurjati" + }, + { + "title": "Didact Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Didact+Gothic", + "const": "Didact Gothic" + }, + { + "title": "Diphylleia", + "markdownDescription": "https://fonts.google.com/specimen/Diphylleia", + "const": "Diphylleia" + }, + { + "title": "Diplomata", + "markdownDescription": "https://fonts.google.com/specimen/Diplomata", + "const": "Diplomata" + }, + { + "title": "Diplomata SC", + "markdownDescription": "https://fonts.google.com/specimen/Diplomata+SC", + "const": "Diplomata SC" + }, + { + "title": "Do Hyeon", + "markdownDescription": "https://fonts.google.com/specimen/Do+Hyeon", + "const": "Do Hyeon" + }, + { + "title": "Dokdo", + "markdownDescription": "https://fonts.google.com/specimen/Dokdo", + "const": "Dokdo" + }, + { + "title": "Domine", + "markdownDescription": "https://fonts.google.com/specimen/Domine", + "const": "Domine" + }, + { + "title": "Donegal One", + "markdownDescription": "https://fonts.google.com/specimen/Donegal+One", + "const": "Donegal One" + }, + { + "title": "Dongle", + "markdownDescription": "https://fonts.google.com/specimen/Dongle", + "const": "Dongle" + }, + { + "title": "Doppio One", + "markdownDescription": "https://fonts.google.com/specimen/Doppio+One", + "const": "Doppio One" + }, + { + "title": "Dorsa", + "markdownDescription": "https://fonts.google.com/specimen/Dorsa", + "const": "Dorsa" + }, + { + "title": "Dosis", + "markdownDescription": "https://fonts.google.com/specimen/Dosis", + "const": "Dosis" + }, + { + "title": "DotGothic16", + "markdownDescription": "https://fonts.google.com/specimen/DotGothic16", + "const": "DotGothic16" + }, + { + "title": "Dr Sugiyama", + "markdownDescription": "https://fonts.google.com/specimen/Dr+Sugiyama", + "const": "Dr Sugiyama" + }, + { + "title": "Duru Sans", + "markdownDescription": "https://fonts.google.com/specimen/Duru+Sans", + "const": "Duru Sans" + }, + { + "title": "DynaPuff", + "markdownDescription": "https://fonts.google.com/specimen/DynaPuff", + "const": "DynaPuff" + }, + { + "title": "Dynalight", + "markdownDescription": "https://fonts.google.com/specimen/Dynalight", + "const": "Dynalight" + }, + { + "title": "EB Garamond", + "markdownDescription": "https://fonts.google.com/specimen/EB+Garamond", + "const": "EB Garamond" + }, + { + "title": "Eagle Lake", + "markdownDescription": "https://fonts.google.com/specimen/Eagle+Lake", + "const": "Eagle Lake" + }, + { + "title": "East Sea Dokdo", + "markdownDescription": "https://fonts.google.com/specimen/East+Sea+Dokdo", + "const": "East Sea Dokdo" + }, + { + "title": "Eater", + "markdownDescription": "https://fonts.google.com/specimen/Eater", + "const": "Eater" + }, + { + "title": "Economica", + "markdownDescription": "https://fonts.google.com/specimen/Economica", + "const": "Economica" + }, + { + "title": "Eczar", + "markdownDescription": "https://fonts.google.com/specimen/Eczar", + "const": "Eczar" + }, + { + "title": "Edu NSW ACT Foundation", + "markdownDescription": "https://fonts.google.com/specimen/Edu+NSW+ACT+Foundation", + "const": "Edu NSW ACT Foundation" + }, + { + "title": "Edu QLD Beginner", + "markdownDescription": "https://fonts.google.com/specimen/Edu+QLD+Beginner", + "const": "Edu QLD Beginner" + }, + { + "title": "Edu SA Beginner", + "markdownDescription": "https://fonts.google.com/specimen/Edu+SA+Beginner", + "const": "Edu SA Beginner" + }, + { + "title": "Edu TAS Beginner", + "markdownDescription": "https://fonts.google.com/specimen/Edu+TAS+Beginner", + "const": "Edu TAS Beginner" + }, + { + "title": "Edu VIC WA NT Beginner", + "markdownDescription": "https://fonts.google.com/specimen/Edu+VIC+WA+NT+Beginner", + "const": "Edu VIC WA NT Beginner" + }, + { + "title": "El Messiri", + "markdownDescription": "https://fonts.google.com/specimen/El+Messiri", + "const": "El Messiri" + }, + { + "title": "Electrolize", + "markdownDescription": "https://fonts.google.com/specimen/Electrolize", + "const": "Electrolize" + }, + { + "title": "Elsie", + "markdownDescription": "https://fonts.google.com/specimen/Elsie", + "const": "Elsie" + }, + { + "title": "Elsie Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Elsie+Swash+Caps", + "const": "Elsie Swash Caps" + }, + { + "title": "Emblema One", + "markdownDescription": "https://fonts.google.com/specimen/Emblema+One", + "const": "Emblema One" + }, + { + "title": "Emilys Candy", + "markdownDescription": "https://fonts.google.com/specimen/Emilys+Candy", + "const": "Emilys Candy" + }, + { + "title": "Encode Sans", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans", + "const": "Encode Sans" + }, + { + "title": "Encode Sans Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans+Condensed", + "const": "Encode Sans Condensed" + }, + { + "title": "Encode Sans Expanded", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans+Expanded", + "const": "Encode Sans Expanded" + }, + { + "title": "Encode Sans SC", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans+SC", + "const": "Encode Sans SC" + }, + { + "title": "Encode Sans Semi Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans+Semi+Condensed", + "const": "Encode Sans Semi Condensed" + }, + { + "title": "Encode Sans Semi Expanded", + "markdownDescription": "https://fonts.google.com/specimen/Encode+Sans+Semi+Expanded", + "const": "Encode Sans Semi Expanded" + }, + { + "title": "Engagement", + "markdownDescription": "https://fonts.google.com/specimen/Engagement", + "const": "Engagement" + }, + { + "title": "Englebert", + "markdownDescription": "https://fonts.google.com/specimen/Englebert", + "const": "Englebert" + }, + { + "title": "Enriqueta", + "markdownDescription": "https://fonts.google.com/specimen/Enriqueta", + "const": "Enriqueta" + }, + { + "title": "Ephesis", + "markdownDescription": "https://fonts.google.com/specimen/Ephesis", + "const": "Ephesis" + }, + { + "title": "Epilogue", + "markdownDescription": "https://fonts.google.com/specimen/Epilogue", + "const": "Epilogue" + }, + { + "title": "Erica One", + "markdownDescription": "https://fonts.google.com/specimen/Erica+One", + "const": "Erica One" + }, + { + "title": "Esteban", + "markdownDescription": "https://fonts.google.com/specimen/Esteban", + "const": "Esteban" + }, + { + "title": "Estonia", + "markdownDescription": "https://fonts.google.com/specimen/Estonia", + "const": "Estonia" + }, + { + "title": "Euphoria Script", + "markdownDescription": "https://fonts.google.com/specimen/Euphoria+Script", + "const": "Euphoria Script" + }, + { + "title": "Ewert", + "markdownDescription": "https://fonts.google.com/specimen/Ewert", + "const": "Ewert" + }, + { + "title": "Exo", + "markdownDescription": "https://fonts.google.com/specimen/Exo", + "const": "Exo" + }, + { + "title": "Exo 2", + "markdownDescription": "https://fonts.google.com/specimen/Exo+2", + "const": "Exo 2" + }, + { + "title": "Expletus Sans", + "markdownDescription": "https://fonts.google.com/specimen/Expletus+Sans", + "const": "Expletus Sans" + }, + { + "title": "Explora", + "markdownDescription": "https://fonts.google.com/specimen/Explora", + "const": "Explora" + }, + { + "title": "Fahkwang", + "markdownDescription": "https://fonts.google.com/specimen/Fahkwang", + "const": "Fahkwang" + }, + { + "title": "Familjen Grotesk", + "markdownDescription": "https://fonts.google.com/specimen/Familjen+Grotesk", + "const": "Familjen Grotesk" + }, + { + "title": "Fanwood Text", + "markdownDescription": "https://fonts.google.com/specimen/Fanwood+Text", + "const": "Fanwood Text" + }, + { + "title": "Farro", + "markdownDescription": "https://fonts.google.com/specimen/Farro", + "const": "Farro" + }, + { + "title": "Farsan", + "markdownDescription": "https://fonts.google.com/specimen/Farsan", + "const": "Farsan" + }, + { + "title": "Fascinate", + "markdownDescription": "https://fonts.google.com/specimen/Fascinate", + "const": "Fascinate" + }, + { + "title": "Fascinate Inline", + "markdownDescription": "https://fonts.google.com/specimen/Fascinate+Inline", + "const": "Fascinate Inline" + }, + { + "title": "Faster One", + "markdownDescription": "https://fonts.google.com/specimen/Faster+One", + "const": "Faster One" + }, + { + "title": "Fasthand", + "markdownDescription": "https://fonts.google.com/specimen/Fasthand", + "const": "Fasthand" + }, + { + "title": "Fauna One", + "markdownDescription": "https://fonts.google.com/specimen/Fauna+One", + "const": "Fauna One" + }, + { + "title": "Faustina", + "markdownDescription": "https://fonts.google.com/specimen/Faustina", + "const": "Faustina" + }, + { + "title": "Federant", + "markdownDescription": "https://fonts.google.com/specimen/Federant", + "const": "Federant" + }, + { + "title": "Federo", + "markdownDescription": "https://fonts.google.com/specimen/Federo", + "const": "Federo" + }, + { + "title": "Felipa", + "markdownDescription": "https://fonts.google.com/specimen/Felipa", + "const": "Felipa" + }, + { + "title": "Fenix", + "markdownDescription": "https://fonts.google.com/specimen/Fenix", + "const": "Fenix" + }, + { + "title": "Festive", + "markdownDescription": "https://fonts.google.com/specimen/Festive", + "const": "Festive" + }, + { + "title": "Figtree", + "markdownDescription": "https://fonts.google.com/specimen/Figtree", + "const": "Figtree" + }, + { + "title": "Finger Paint", + "markdownDescription": "https://fonts.google.com/specimen/Finger+Paint", + "const": "Finger Paint" + }, + { + "title": "Finlandica", + "markdownDescription": "https://fonts.google.com/specimen/Finlandica", + "const": "Finlandica" + }, + { + "title": "Fira Code", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Code", + "const": "Fira Code" + }, + { + "title": "Fira Mono", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Mono", + "const": "Fira Mono" + }, + { + "title": "Fira Sans", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Sans", + "const": "Fira Sans" + }, + { + "title": "Fira Sans Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Sans+Condensed", + "const": "Fira Sans Condensed" + }, + { + "title": "Fira Sans Extra Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Fira+Sans+Extra+Condensed", + "const": "Fira Sans Extra Condensed" + }, + { + "title": "Fjalla One", + "markdownDescription": "https://fonts.google.com/specimen/Fjalla+One", + "const": "Fjalla One" + }, + { + "title": "Fjord One", + "markdownDescription": "https://fonts.google.com/specimen/Fjord+One", + "const": "Fjord One" + }, + { + "title": "Flamenco", + "markdownDescription": "https://fonts.google.com/specimen/Flamenco", + "const": "Flamenco" + }, + { + "title": "Flavors", + "markdownDescription": "https://fonts.google.com/specimen/Flavors", + "const": "Flavors" + }, + { + "title": "Fleur De Leah", + "markdownDescription": "https://fonts.google.com/specimen/Fleur+De+Leah", + "const": "Fleur De Leah" + }, + { + "title": "Flow Block", + "markdownDescription": "https://fonts.google.com/specimen/Flow+Block", + "const": "Flow Block" + }, + { + "title": "Flow Circular", + "markdownDescription": "https://fonts.google.com/specimen/Flow+Circular", + "const": "Flow Circular" + }, + { + "title": "Flow Rounded", + "markdownDescription": "https://fonts.google.com/specimen/Flow+Rounded", + "const": "Flow Rounded" + }, + { + "title": "Foldit", + "markdownDescription": "https://fonts.google.com/specimen/Foldit", + "const": "Foldit" + }, + { + "title": "Fondamento", + "markdownDescription": "https://fonts.google.com/specimen/Fondamento", + "const": "Fondamento" + }, + { + "title": "Fontdiner Swanky", + "markdownDescription": "https://fonts.google.com/specimen/Fontdiner+Swanky", + "const": "Fontdiner Swanky" + }, + { + "title": "Forum", + "markdownDescription": "https://fonts.google.com/specimen/Forum", + "const": "Forum" + }, + { + "title": "Fragment Mono", + "markdownDescription": "https://fonts.google.com/specimen/Fragment+Mono", + "const": "Fragment Mono" + }, + { + "title": "Francois One", + "markdownDescription": "https://fonts.google.com/specimen/Francois+One", + "const": "Francois One" + }, + { + "title": "Frank Ruhl Libre", + "markdownDescription": "https://fonts.google.com/specimen/Frank+Ruhl+Libre", + "const": "Frank Ruhl Libre" + }, + { + "title": "Fraunces", + "markdownDescription": "https://fonts.google.com/specimen/Fraunces", + "const": "Fraunces" + }, + { + "title": "Freckle Face", + "markdownDescription": "https://fonts.google.com/specimen/Freckle+Face", + "const": "Freckle Face" + }, + { + "title": "Fredericka the Great", + "markdownDescription": "https://fonts.google.com/specimen/Fredericka+the+Great", + "const": "Fredericka the Great" + }, + { + "title": "Fredoka", + "markdownDescription": "https://fonts.google.com/specimen/Fredoka", + "const": "Fredoka" + }, + { + "title": "Freehand", + "markdownDescription": "https://fonts.google.com/specimen/Freehand", + "const": "Freehand" + }, + { + "title": "Fresca", + "markdownDescription": "https://fonts.google.com/specimen/Fresca", + "const": "Fresca" + }, + { + "title": "Frijole", + "markdownDescription": "https://fonts.google.com/specimen/Frijole", + "const": "Frijole" + }, + { + "title": "Fruktur", + "markdownDescription": "https://fonts.google.com/specimen/Fruktur", + "const": "Fruktur" + }, + { + "title": "Fugaz One", + "markdownDescription": "https://fonts.google.com/specimen/Fugaz+One", + "const": "Fugaz One" + }, + { + "title": "Fuggles", + "markdownDescription": "https://fonts.google.com/specimen/Fuggles", + "const": "Fuggles" + }, + { + "title": "Fuzzy Bubbles", + "markdownDescription": "https://fonts.google.com/specimen/Fuzzy+Bubbles", + "const": "Fuzzy Bubbles" + }, + { + "title": "GFS Didot", + "markdownDescription": "https://fonts.google.com/specimen/GFS+Didot", + "const": "GFS Didot" + }, + { + "title": "GFS Neohellenic", + "markdownDescription": "https://fonts.google.com/specimen/GFS+Neohellenic", + "const": "GFS Neohellenic" + }, + { + "title": "Gabarito", + "markdownDescription": "https://fonts.google.com/specimen/Gabarito", + "const": "Gabarito" + }, + { + "title": "Gabriela", + "markdownDescription": "https://fonts.google.com/specimen/Gabriela", + "const": "Gabriela" + }, + { + "title": "Gaegu", + "markdownDescription": "https://fonts.google.com/specimen/Gaegu", + "const": "Gaegu" + }, + { + "title": "Gafata", + "markdownDescription": "https://fonts.google.com/specimen/Gafata", + "const": "Gafata" + }, + { + "title": "Gajraj One", + "markdownDescription": "https://fonts.google.com/specimen/Gajraj+One", + "const": "Gajraj One" + }, + { + "title": "Galada", + "markdownDescription": "https://fonts.google.com/specimen/Galada", + "const": "Galada" + }, + { + "title": "Galdeano", + "markdownDescription": "https://fonts.google.com/specimen/Galdeano", + "const": "Galdeano" + }, + { + "title": "Galindo", + "markdownDescription": "https://fonts.google.com/specimen/Galindo", + "const": "Galindo" + }, + { + "title": "Gamja Flower", + "markdownDescription": "https://fonts.google.com/specimen/Gamja+Flower", + "const": "Gamja Flower" + }, + { + "title": "Gantari", + "markdownDescription": "https://fonts.google.com/specimen/Gantari", + "const": "Gantari" + }, + { + "title": "Gasoek One", + "markdownDescription": "https://fonts.google.com/specimen/Gasoek+One", + "const": "Gasoek One" + }, + { + "title": "Gayathri", + "markdownDescription": "https://fonts.google.com/specimen/Gayathri", + "const": "Gayathri" + }, + { + "title": "Gelasio", + "markdownDescription": "https://fonts.google.com/specimen/Gelasio", + "const": "Gelasio" + }, + { + "title": "Gemunu Libre", + "markdownDescription": "https://fonts.google.com/specimen/Gemunu+Libre", + "const": "Gemunu Libre" + }, + { + "title": "Genos", + "markdownDescription": "https://fonts.google.com/specimen/Genos", + "const": "Genos" + }, + { + "title": "Gentium Book Plus", + "markdownDescription": "https://fonts.google.com/specimen/Gentium+Book+Plus", + "const": "Gentium Book Plus" + }, + { + "title": "Gentium Plus", + "markdownDescription": "https://fonts.google.com/specimen/Gentium+Plus", + "const": "Gentium Plus" + }, + { + "title": "Geo", + "markdownDescription": "https://fonts.google.com/specimen/Geo", + "const": "Geo" + }, + { + "title": "Geologica", + "markdownDescription": "https://fonts.google.com/specimen/Geologica", + "const": "Geologica" + }, + { + "title": "Georama", + "markdownDescription": "https://fonts.google.com/specimen/Georama", + "const": "Georama" + }, + { + "title": "Geostar", + "markdownDescription": "https://fonts.google.com/specimen/Geostar", + "const": "Geostar" + }, + { + "title": "Geostar Fill", + "markdownDescription": "https://fonts.google.com/specimen/Geostar+Fill", + "const": "Geostar Fill" + }, + { + "title": "Germania One", + "markdownDescription": "https://fonts.google.com/specimen/Germania+One", + "const": "Germania One" + }, + { + "title": "Gideon Roman", + "markdownDescription": "https://fonts.google.com/specimen/Gideon+Roman", + "const": "Gideon Roman" + }, + { + "title": "Gidugu", + "markdownDescription": "https://fonts.google.com/specimen/Gidugu", + "const": "Gidugu" + }, + { + "title": "Gilda Display", + "markdownDescription": "https://fonts.google.com/specimen/Gilda+Display", + "const": "Gilda Display" + }, + { + "title": "Girassol", + "markdownDescription": "https://fonts.google.com/specimen/Girassol", + "const": "Girassol" + }, + { + "title": "Give You Glory", + "markdownDescription": "https://fonts.google.com/specimen/Give+You+Glory", + "const": "Give You Glory" + }, + { + "title": "Glass Antiqua", + "markdownDescription": "https://fonts.google.com/specimen/Glass+Antiqua", + "const": "Glass Antiqua" + }, + { + "title": "Glegoo", + "markdownDescription": "https://fonts.google.com/specimen/Glegoo", + "const": "Glegoo" + }, + { + "title": "Gloock", + "markdownDescription": "https://fonts.google.com/specimen/Gloock", + "const": "Gloock" + }, + { + "title": "Gloria Hallelujah", + "markdownDescription": "https://fonts.google.com/specimen/Gloria+Hallelujah", + "const": "Gloria Hallelujah" + }, + { + "title": "Glory", + "markdownDescription": "https://fonts.google.com/specimen/Glory", + "const": "Glory" + }, + { + "title": "Gluten", + "markdownDescription": "https://fonts.google.com/specimen/Gluten", + "const": "Gluten" + }, + { + "title": "Goblin One", + "markdownDescription": "https://fonts.google.com/specimen/Goblin+One", + "const": "Goblin One" + }, + { + "title": "Gochi Hand", + "markdownDescription": "https://fonts.google.com/specimen/Gochi+Hand", + "const": "Gochi Hand" + }, + { + "title": "Goldman", + "markdownDescription": "https://fonts.google.com/specimen/Goldman", + "const": "Goldman" + }, + { + "title": "Golos Text", + "markdownDescription": "https://fonts.google.com/specimen/Golos+Text", + "const": "Golos Text" + }, + { + "title": "Gorditas", + "markdownDescription": "https://fonts.google.com/specimen/Gorditas", + "const": "Gorditas" + }, + { + "title": "Gothic A1", + "markdownDescription": "https://fonts.google.com/specimen/Gothic+A1", + "const": "Gothic A1" + }, + { + "title": "Gotu", + "markdownDescription": "https://fonts.google.com/specimen/Gotu", + "const": "Gotu" + }, + { + "title": "Goudy Bookletter 1911", + "markdownDescription": "https://fonts.google.com/specimen/Goudy+Bookletter+1911", + "const": "Goudy Bookletter 1911" + }, + { + "title": "Gowun Batang", + "markdownDescription": "https://fonts.google.com/specimen/Gowun+Batang", + "const": "Gowun Batang" + }, + { + "title": "Gowun Dodum", + "markdownDescription": "https://fonts.google.com/specimen/Gowun+Dodum", + "const": "Gowun Dodum" + }, + { + "title": "Graduate", + "markdownDescription": "https://fonts.google.com/specimen/Graduate", + "const": "Graduate" + }, + { + "title": "Grand Hotel", + "markdownDescription": "https://fonts.google.com/specimen/Grand+Hotel", + "const": "Grand Hotel" + }, + { + "title": "Grandiflora One", + "markdownDescription": "https://fonts.google.com/specimen/Grandiflora+One", + "const": "Grandiflora One" + }, + { + "title": "Grandstander", + "markdownDescription": "https://fonts.google.com/specimen/Grandstander", + "const": "Grandstander" + }, + { + "title": "Grape Nuts", + "markdownDescription": "https://fonts.google.com/specimen/Grape+Nuts", + "const": "Grape Nuts" + }, + { + "title": "Gravitas One", + "markdownDescription": "https://fonts.google.com/specimen/Gravitas+One", + "const": "Gravitas One" + }, + { + "title": "Great Vibes", + "markdownDescription": "https://fonts.google.com/specimen/Great+Vibes", + "const": "Great Vibes" + }, + { + "title": "Grechen Fuemen", + "markdownDescription": "https://fonts.google.com/specimen/Grechen+Fuemen", + "const": "Grechen Fuemen" + }, + { + "title": "Grenze", + "markdownDescription": "https://fonts.google.com/specimen/Grenze", + "const": "Grenze" + }, + { + "title": "Grenze Gotisch", + "markdownDescription": "https://fonts.google.com/specimen/Grenze+Gotisch", + "const": "Grenze Gotisch" + }, + { + "title": "Grey Qo", + "markdownDescription": "https://fonts.google.com/specimen/Grey+Qo", + "const": "Grey Qo" + }, + { + "title": "Griffy", + "markdownDescription": "https://fonts.google.com/specimen/Griffy", + "const": "Griffy" + }, + { + "title": "Gruppo", + "markdownDescription": "https://fonts.google.com/specimen/Gruppo", + "const": "Gruppo" + }, + { + "title": "Gudea", + "markdownDescription": "https://fonts.google.com/specimen/Gudea", + "const": "Gudea" + }, + { + "title": "Gugi", + "markdownDescription": "https://fonts.google.com/specimen/Gugi", + "const": "Gugi" + }, + { + "title": "Gulzar", + "markdownDescription": "https://fonts.google.com/specimen/Gulzar", + "const": "Gulzar" + }, + { + "title": "Gupter", + "markdownDescription": "https://fonts.google.com/specimen/Gupter", + "const": "Gupter" + }, + { + "title": "Gurajada", + "markdownDescription": "https://fonts.google.com/specimen/Gurajada", + "const": "Gurajada" + }, + { + "title": "Gwendolyn", + "markdownDescription": "https://fonts.google.com/specimen/Gwendolyn", + "const": "Gwendolyn" + }, + { + "title": "Habibi", + "markdownDescription": "https://fonts.google.com/specimen/Habibi", + "const": "Habibi" + }, + { + "title": "Hachi Maru Pop", + "markdownDescription": "https://fonts.google.com/specimen/Hachi+Maru+Pop", + "const": "Hachi Maru Pop" + }, + { + "title": "Hahmlet", + "markdownDescription": "https://fonts.google.com/specimen/Hahmlet", + "const": "Hahmlet" + }, + { + "title": "Halant", + "markdownDescription": "https://fonts.google.com/specimen/Halant", + "const": "Halant" + }, + { + "title": "Hammersmith One", + "markdownDescription": "https://fonts.google.com/specimen/Hammersmith+One", + "const": "Hammersmith One" + }, + { + "title": "Hanalei", + "markdownDescription": "https://fonts.google.com/specimen/Hanalei", + "const": "Hanalei" + }, + { + "title": "Hanalei Fill", + "markdownDescription": "https://fonts.google.com/specimen/Hanalei+Fill", + "const": "Hanalei Fill" + }, + { + "title": "Handjet", + "markdownDescription": "https://fonts.google.com/specimen/Handjet", + "const": "Handjet" + }, + { + "title": "Handlee", + "markdownDescription": "https://fonts.google.com/specimen/Handlee", + "const": "Handlee" + }, + { + "title": "Hanken Grotesk", + "markdownDescription": "https://fonts.google.com/specimen/Hanken+Grotesk", + "const": "Hanken Grotesk" + }, + { + "title": "Hanuman", + "markdownDescription": "https://fonts.google.com/specimen/Hanuman", + "const": "Hanuman" + }, + { + "title": "Happy Monkey", + "markdownDescription": "https://fonts.google.com/specimen/Happy+Monkey", + "const": "Happy Monkey" + }, + { + "title": "Harmattan", + "markdownDescription": "https://fonts.google.com/specimen/Harmattan", + "const": "Harmattan" + }, + { + "title": "Headland One", + "markdownDescription": "https://fonts.google.com/specimen/Headland+One", + "const": "Headland One" + }, + { + "title": "Heebo", + "markdownDescription": "https://fonts.google.com/specimen/Heebo", + "const": "Heebo" + }, + { + "title": "Henny Penny", + "markdownDescription": "https://fonts.google.com/specimen/Henny+Penny", + "const": "Henny Penny" + }, + { + "title": "Hepta Slab", + "markdownDescription": "https://fonts.google.com/specimen/Hepta+Slab", + "const": "Hepta Slab" + }, + { + "title": "Herr Von Muellerhoff", + "markdownDescription": "https://fonts.google.com/specimen/Herr+Von+Muellerhoff", + "const": "Herr Von Muellerhoff" + }, + { + "title": "Hi Melody", + "markdownDescription": "https://fonts.google.com/specimen/Hi+Melody", + "const": "Hi Melody" + }, + { + "title": "Hina Mincho", + "markdownDescription": "https://fonts.google.com/specimen/Hina+Mincho", + "const": "Hina Mincho" + }, + { + "title": "Hind", + "markdownDescription": "https://fonts.google.com/specimen/Hind", + "const": "Hind" + }, + { + "title": "Hind Guntur", + "markdownDescription": "https://fonts.google.com/specimen/Hind+Guntur", + "const": "Hind Guntur" + }, + { + "title": "Hind Madurai", + "markdownDescription": "https://fonts.google.com/specimen/Hind+Madurai", + "const": "Hind Madurai" + }, + { + "title": "Hind Siliguri", + "markdownDescription": "https://fonts.google.com/specimen/Hind+Siliguri", + "const": "Hind Siliguri" + }, + { + "title": "Hind Vadodara", + "markdownDescription": "https://fonts.google.com/specimen/Hind+Vadodara", + "const": "Hind Vadodara" + }, + { + "title": "Holtwood One SC", + "markdownDescription": "https://fonts.google.com/specimen/Holtwood+One+SC", + "const": "Holtwood One SC" + }, + { + "title": "Homemade Apple", + "markdownDescription": "https://fonts.google.com/specimen/Homemade+Apple", + "const": "Homemade Apple" + }, + { + "title": "Homenaje", + "markdownDescription": "https://fonts.google.com/specimen/Homenaje", + "const": "Homenaje" + }, + { + "title": "Hubballi", + "markdownDescription": "https://fonts.google.com/specimen/Hubballi", + "const": "Hubballi" + }, + { + "title": "Hurricane", + "markdownDescription": "https://fonts.google.com/specimen/Hurricane", + "const": "Hurricane" + }, + { + "title": "IBM Plex Mono", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Mono", + "const": "IBM Plex Mono" + }, + { + "title": "IBM Plex Sans", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans", + "const": "IBM Plex Sans" + }, + { + "title": "IBM Plex Sans Arabic", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+Arabic", + "const": "IBM Plex Sans Arabic" + }, + { + "title": "IBM Plex Sans Condensed", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+Condensed", + "const": "IBM Plex Sans Condensed" + }, + { + "title": "IBM Plex Sans Devanagari", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+Devanagari", + "const": "IBM Plex Sans Devanagari" + }, + { + "title": "IBM Plex Sans Hebrew", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+Hebrew", + "const": "IBM Plex Sans Hebrew" + }, + { + "title": "IBM Plex Sans JP", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+JP", + "const": "IBM Plex Sans JP" + }, + { + "title": "IBM Plex Sans KR", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+KR", + "const": "IBM Plex Sans KR" + }, + { + "title": "IBM Plex Sans Thai", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+Thai", + "const": "IBM Plex Sans Thai" + }, + { + "title": "IBM Plex Sans Thai Looped", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Sans+Thai+Looped", + "const": "IBM Plex Sans Thai Looped" + }, + { + "title": "IBM Plex Serif", + "markdownDescription": "https://fonts.google.com/specimen/IBM+Plex+Serif", + "const": "IBM Plex Serif" + }, + { + "title": "IM Fell DW Pica", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+DW+Pica", + "const": "IM Fell DW Pica" + }, + { + "title": "IM Fell DW Pica SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+DW+Pica+SC", + "const": "IM Fell DW Pica SC" + }, + { + "title": "IM Fell Double Pica", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+Double+Pica", + "const": "IM Fell Double Pica" + }, + { + "title": "IM Fell Double Pica SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+Double+Pica+SC", + "const": "IM Fell Double Pica SC" + }, + { + "title": "IM Fell English", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+English", + "const": "IM Fell English" + }, + { + "title": "IM Fell English SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+English+SC", + "const": "IM Fell English SC" + }, + { + "title": "IM Fell French Canon", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+French+Canon", + "const": "IM Fell French Canon" + }, + { + "title": "IM Fell French Canon SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+French+Canon+SC", + "const": "IM Fell French Canon SC" + }, + { + "title": "IM Fell Great Primer", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+Great+Primer", + "const": "IM Fell Great Primer" + }, + { + "title": "IM Fell Great Primer SC", + "markdownDescription": "https://fonts.google.com/specimen/IM+Fell+Great+Primer+SC", + "const": "IM Fell Great Primer SC" + }, + { + "title": "Ibarra Real Nova", + "markdownDescription": "https://fonts.google.com/specimen/Ibarra+Real+Nova", + "const": "Ibarra Real Nova" + }, + { + "title": "Iceberg", + "markdownDescription": "https://fonts.google.com/specimen/Iceberg", + "const": "Iceberg" + }, + { + "title": "Iceland", + "markdownDescription": "https://fonts.google.com/specimen/Iceland", + "const": "Iceland" + }, + { + "title": "Imbue", + "markdownDescription": "https://fonts.google.com/specimen/Imbue", + "const": "Imbue" + }, + { + "title": "Imperial Script", + "markdownDescription": "https://fonts.google.com/specimen/Imperial+Script", + "const": "Imperial Script" + }, + { + "title": "Imprima", + "markdownDescription": "https://fonts.google.com/specimen/Imprima", + "const": "Imprima" + }, + { + "title": "Inclusive Sans", + "markdownDescription": "https://fonts.google.com/specimen/Inclusive+Sans", + "const": "Inclusive Sans" + }, + { + "title": "Inconsolata", + "markdownDescription": "https://fonts.google.com/specimen/Inconsolata", + "const": "Inconsolata" + }, + { + "title": "Inder", + "markdownDescription": "https://fonts.google.com/specimen/Inder", + "const": "Inder" + }, + { + "title": "Indie Flower", + "markdownDescription": "https://fonts.google.com/specimen/Indie+Flower", + "const": "Indie Flower" + }, + { + "title": "Ingrid Darling", + "markdownDescription": "https://fonts.google.com/specimen/Ingrid+Darling", + "const": "Ingrid Darling" + }, + { + "title": "Inika", + "markdownDescription": "https://fonts.google.com/specimen/Inika", + "const": "Inika" + }, + { + "title": "Inknut Antiqua", + "markdownDescription": "https://fonts.google.com/specimen/Inknut+Antiqua", + "const": "Inknut Antiqua" + }, + { + "title": "Inria Sans", + "markdownDescription": "https://fonts.google.com/specimen/Inria+Sans", + "const": "Inria Sans" + }, + { + "title": "Inria Serif", + "markdownDescription": "https://fonts.google.com/specimen/Inria+Serif", + "const": "Inria Serif" + }, + { + "title": "Inspiration", + "markdownDescription": "https://fonts.google.com/specimen/Inspiration", + "const": "Inspiration" + }, + { + "title": "Instrument Sans", + "markdownDescription": "https://fonts.google.com/specimen/Instrument+Sans", + "const": "Instrument Sans" + }, + { + "title": "Instrument Serif", + "markdownDescription": "https://fonts.google.com/specimen/Instrument+Serif", + "const": "Instrument Serif" + }, + { + "title": "Inter", + "markdownDescription": "https://fonts.google.com/specimen/Inter", + "const": "Inter" + }, + { + "title": "Inter Tight", + "markdownDescription": "https://fonts.google.com/specimen/Inter+Tight", + "const": "Inter Tight" + }, + { + "title": "Irish Grover", + "markdownDescription": "https://fonts.google.com/specimen/Irish+Grover", + "const": "Irish Grover" + }, + { + "title": "Island Moments", + "markdownDescription": "https://fonts.google.com/specimen/Island+Moments", + "const": "Island Moments" + }, + { + "title": "Istok Web", + "markdownDescription": "https://fonts.google.com/specimen/Istok+Web", + "const": "Istok Web" + }, + { + "title": "Italiana", + "markdownDescription": "https://fonts.google.com/specimen/Italiana", + "const": "Italiana" + }, + { + "title": "Italianno", + "markdownDescription": "https://fonts.google.com/specimen/Italianno", + "const": "Italianno" + }, + { + "title": "Itim", + "markdownDescription": "https://fonts.google.com/specimen/Itim", + "const": "Itim" + }, + { + "title": "Jacques Francois", + "markdownDescription": "https://fonts.google.com/specimen/Jacques+Francois", + "const": "Jacques Francois" + }, + { + "title": "Jacques Francois Shadow", + "markdownDescription": "https://fonts.google.com/specimen/Jacques+Francois+Shadow", + "const": "Jacques Francois Shadow" + }, + { + "title": "Jaldi", + "markdownDescription": "https://fonts.google.com/specimen/Jaldi", + "const": "Jaldi" + }, + { + "title": "JetBrains Mono", + "markdownDescription": "https://fonts.google.com/specimen/JetBrains+Mono", + "const": "JetBrains Mono" + }, + { + "title": "Jim Nightshade", + "markdownDescription": "https://fonts.google.com/specimen/Jim+Nightshade", + "const": "Jim Nightshade" + }, + { + "title": "Joan", + "markdownDescription": "https://fonts.google.com/specimen/Joan", + "const": "Joan" + }, + { + "title": "Jockey One", + "markdownDescription": "https://fonts.google.com/specimen/Jockey+One", + "const": "Jockey One" + }, + { + "title": "Jolly Lodger", + "markdownDescription": "https://fonts.google.com/specimen/Jolly+Lodger", + "const": "Jolly Lodger" + }, + { + "title": "Jomhuria", + "markdownDescription": "https://fonts.google.com/specimen/Jomhuria", + "const": "Jomhuria" + }, + { + "title": "Jomolhari", + "markdownDescription": "https://fonts.google.com/specimen/Jomolhari", + "const": "Jomolhari" + }, + { + "title": "Josefin Sans", + "markdownDescription": "https://fonts.google.com/specimen/Josefin+Sans", + "const": "Josefin Sans" + }, + { + "title": "Josefin Slab", + "markdownDescription": "https://fonts.google.com/specimen/Josefin+Slab", + "const": "Josefin Slab" + }, + { + "title": "Jost", + "markdownDescription": "https://fonts.google.com/specimen/Jost", + "const": "Jost" + }, + { + "title": "Joti One", + "markdownDescription": "https://fonts.google.com/specimen/Joti+One", + "const": "Joti One" + }, + { + "title": "Jua", + "markdownDescription": "https://fonts.google.com/specimen/Jua", + "const": "Jua" + }, + { + "title": "Judson", + "markdownDescription": "https://fonts.google.com/specimen/Judson", + "const": "Judson" + }, + { + "title": "Julee", + "markdownDescription": "https://fonts.google.com/specimen/Julee", + "const": "Julee" + }, + { + "title": "Julius Sans One", + "markdownDescription": "https://fonts.google.com/specimen/Julius+Sans+One", + "const": "Julius Sans One" + }, + { + "title": "Junge", + "markdownDescription": "https://fonts.google.com/specimen/Junge", + "const": "Junge" + }, + { + "title": "Jura", + "markdownDescription": "https://fonts.google.com/specimen/Jura", + "const": "Jura" + }, + { + "title": "Just Another Hand", + "markdownDescription": "https://fonts.google.com/specimen/Just+Another+Hand", + "const": "Just Another Hand" + }, + { + "title": "Just Me Again Down Here", + "markdownDescription": "https://fonts.google.com/specimen/Just+Me+Again+Down+Here", + "const": "Just Me Again Down Here" + }, + { + "title": "K2D", + "markdownDescription": "https://fonts.google.com/specimen/K2D", + "const": "K2D" + }, + { + "title": "Kablammo", + "markdownDescription": "https://fonts.google.com/specimen/Kablammo", + "const": "Kablammo" + }, + { + "title": "Kadwa", + "markdownDescription": "https://fonts.google.com/specimen/Kadwa", + "const": "Kadwa" + }, + { + "title": "Kaisei Decol", + "markdownDescription": "https://fonts.google.com/specimen/Kaisei+Decol", + "const": "Kaisei Decol" + }, + { + "title": "Kaisei HarunoUmi", + "markdownDescription": "https://fonts.google.com/specimen/Kaisei+HarunoUmi", + "const": "Kaisei HarunoUmi" + }, + { + "title": "Kaisei Opti", + "markdownDescription": "https://fonts.google.com/specimen/Kaisei+Opti", + "const": "Kaisei Opti" + }, + { + "title": "Kaisei Tokumin", + "markdownDescription": "https://fonts.google.com/specimen/Kaisei+Tokumin", + "const": "Kaisei Tokumin" + }, + { + "title": "Kalam", + "markdownDescription": "https://fonts.google.com/specimen/Kalam", + "const": "Kalam" + }, + { + "title": "Kameron", + "markdownDescription": "https://fonts.google.com/specimen/Kameron", + "const": "Kameron" + }, + { + "title": "Kanit", + "markdownDescription": "https://fonts.google.com/specimen/Kanit", + "const": "Kanit" + }, + { + "title": "Kantumruy Pro", + "markdownDescription": "https://fonts.google.com/specimen/Kantumruy+Pro", + "const": "Kantumruy Pro" + }, + { + "title": "Karantina", + "markdownDescription": "https://fonts.google.com/specimen/Karantina", + "const": "Karantina" + }, + { + "title": "Karla", + "markdownDescription": "https://fonts.google.com/specimen/Karla", + "const": "Karla" + }, + { + "title": "Karma", + "markdownDescription": "https://fonts.google.com/specimen/Karma", + "const": "Karma" + }, + { + "title": "Katibeh", + "markdownDescription": "https://fonts.google.com/specimen/Katibeh", + "const": "Katibeh" + }, + { + "title": "Kaushan Script", + "markdownDescription": "https://fonts.google.com/specimen/Kaushan+Script", + "const": "Kaushan Script" + }, + { + "title": "Kavivanar", + "markdownDescription": "https://fonts.google.com/specimen/Kavivanar", + "const": "Kavivanar" + }, + { + "title": "Kavoon", + "markdownDescription": "https://fonts.google.com/specimen/Kavoon", + "const": "Kavoon" + }, + { + "title": "Kdam Thmor Pro", + "markdownDescription": "https://fonts.google.com/specimen/Kdam+Thmor+Pro", + "const": "Kdam Thmor Pro" + }, + { + "title": "Keania One", + "markdownDescription": "https://fonts.google.com/specimen/Keania+One", + "const": "Keania One" + }, + { + "title": "Kelly Slab", + "markdownDescription": "https://fonts.google.com/specimen/Kelly+Slab", + "const": "Kelly Slab" + }, + { + "title": "Kenia", + "markdownDescription": "https://fonts.google.com/specimen/Kenia", + "const": "Kenia" + }, + { + "title": "Khand", + "markdownDescription": "https://fonts.google.com/specimen/Khand", + "const": "Khand" + }, + { + "title": "Khmer", + "markdownDescription": "https://fonts.google.com/specimen/Khmer", + "const": "Khmer" + }, + { + "title": "Khula", + "markdownDescription": "https://fonts.google.com/specimen/Khula", + "const": "Khula" + }, + { + "title": "Kings", + "markdownDescription": "https://fonts.google.com/specimen/Kings", + "const": "Kings" + }, + { + "title": "Kirang Haerang", + "markdownDescription": "https://fonts.google.com/specimen/Kirang+Haerang", + "const": "Kirang Haerang" + }, + { + "title": "Kite One", + "markdownDescription": "https://fonts.google.com/specimen/Kite+One", + "const": "Kite One" + }, + { + "title": "Kiwi Maru", + "markdownDescription": "https://fonts.google.com/specimen/Kiwi+Maru", + "const": "Kiwi Maru" + }, + { + "title": "Klee One", + "markdownDescription": "https://fonts.google.com/specimen/Klee+One", + "const": "Klee One" + }, + { + "title": "Knewave", + "markdownDescription": "https://fonts.google.com/specimen/Knewave", + "const": "Knewave" + }, + { + "title": "KoHo", + "markdownDescription": "https://fonts.google.com/specimen/KoHo", + "const": "KoHo" + }, + { + "title": "Kodchasan", + "markdownDescription": "https://fonts.google.com/specimen/Kodchasan", + "const": "Kodchasan" + }, + { + "title": "Koh Santepheap", + "markdownDescription": "https://fonts.google.com/specimen/Koh+Santepheap", + "const": "Koh Santepheap" + }, + { + "title": "Kolker Brush", + "markdownDescription": "https://fonts.google.com/specimen/Kolker+Brush", + "const": "Kolker Brush" + }, + { + "title": "Konkhmer Sleokchher", + "markdownDescription": "https://fonts.google.com/specimen/Konkhmer+Sleokchher", + "const": "Konkhmer Sleokchher" + }, + { + "title": "Kosugi", + "markdownDescription": "https://fonts.google.com/specimen/Kosugi", + "const": "Kosugi" + }, + { + "title": "Kosugi Maru", + "markdownDescription": "https://fonts.google.com/specimen/Kosugi+Maru", + "const": "Kosugi Maru" + }, + { + "title": "Kotta One", + "markdownDescription": "https://fonts.google.com/specimen/Kotta+One", + "const": "Kotta One" + }, + { + "title": "Koulen", + "markdownDescription": "https://fonts.google.com/specimen/Koulen", + "const": "Koulen" + }, + { + "title": "Kranky", + "markdownDescription": "https://fonts.google.com/specimen/Kranky", + "const": "Kranky" + }, + { + "title": "Kreon", + "markdownDescription": "https://fonts.google.com/specimen/Kreon", + "const": "Kreon" + }, + { + "title": "Kristi", + "markdownDescription": "https://fonts.google.com/specimen/Kristi", + "const": "Kristi" + }, + { + "title": "Krona One", + "markdownDescription": "https://fonts.google.com/specimen/Krona+One", + "const": "Krona One" + }, + { + "title": "Krub", + "markdownDescription": "https://fonts.google.com/specimen/Krub", + "const": "Krub" + }, + { + "title": "Kufam", + "markdownDescription": "https://fonts.google.com/specimen/Kufam", + "const": "Kufam" + }, + { + "title": "Kulim Park", + "markdownDescription": "https://fonts.google.com/specimen/Kulim+Park", + "const": "Kulim Park" + }, + { + "title": "Kumar One", + "markdownDescription": "https://fonts.google.com/specimen/Kumar+One", + "const": "Kumar One" + }, + { + "title": "Kumar One Outline", + "markdownDescription": "https://fonts.google.com/specimen/Kumar+One+Outline", + "const": "Kumar One Outline" + }, + { + "title": "Kumbh Sans", + "markdownDescription": "https://fonts.google.com/specimen/Kumbh+Sans", + "const": "Kumbh Sans" + }, + { + "title": "Kurale", + "markdownDescription": "https://fonts.google.com/specimen/Kurale", + "const": "Kurale" + }, + { + "title": "La Belle Aurore", + "markdownDescription": "https://fonts.google.com/specimen/La+Belle+Aurore", + "const": "La Belle Aurore" + }, + { + "title": "Labrada", + "markdownDescription": "https://fonts.google.com/specimen/Labrada", + "const": "Labrada" + }, + { + "title": "Lacquer", + "markdownDescription": "https://fonts.google.com/specimen/Lacquer", + "const": "Lacquer" + }, + { + "title": "Laila", + "markdownDescription": "https://fonts.google.com/specimen/Laila", + "const": "Laila" + }, + { + "title": "Lakki Reddy", + "markdownDescription": "https://fonts.google.com/specimen/Lakki+Reddy", + "const": "Lakki Reddy" + }, + { + "title": "Lalezar", + "markdownDescription": "https://fonts.google.com/specimen/Lalezar", + "const": "Lalezar" + }, + { + "title": "Lancelot", + "markdownDescription": "https://fonts.google.com/specimen/Lancelot", + "const": "Lancelot" + }, + { + "title": "Langar", + "markdownDescription": "https://fonts.google.com/specimen/Langar", + "const": "Langar" + }, + { + "title": "Lateef", + "markdownDescription": "https://fonts.google.com/specimen/Lateef", + "const": "Lateef" + }, + { + "title": "Lato", + "markdownDescription": "https://fonts.google.com/specimen/Lato", + "const": "Lato" + }, + { + "title": "Lavishly Yours", + "markdownDescription": "https://fonts.google.com/specimen/Lavishly+Yours", + "const": "Lavishly Yours" + }, + { + "title": "League Gothic", + "markdownDescription": "https://fonts.google.com/specimen/League+Gothic", + "const": "League Gothic" + }, + { + "title": "League Script", + "markdownDescription": "https://fonts.google.com/specimen/League+Script", + "const": "League Script" + }, + { + "title": "League Spartan", + "markdownDescription": "https://fonts.google.com/specimen/League+Spartan", + "const": "League Spartan" + }, + { + "title": "Leckerli One", + "markdownDescription": "https://fonts.google.com/specimen/Leckerli+One", + "const": "Leckerli One" + }, + { + "title": "Ledger", + "markdownDescription": "https://fonts.google.com/specimen/Ledger", + "const": "Ledger" + }, + { + "title": "Lekton", + "markdownDescription": "https://fonts.google.com/specimen/Lekton", + "const": "Lekton" + }, + { + "title": "Lemon", + "markdownDescription": "https://fonts.google.com/specimen/Lemon", + "const": "Lemon" + }, + { + "title": "Lemonada", + "markdownDescription": "https://fonts.google.com/specimen/Lemonada", + "const": "Lemonada" + }, + { + "title": "Lexend", + "markdownDescription": "https://fonts.google.com/specimen/Lexend", + "const": "Lexend" + }, + { + "title": "Lexend Deca", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Deca", + "const": "Lexend Deca" + }, + { + "title": "Lexend Exa", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Exa", + "const": "Lexend Exa" + }, + { + "title": "Lexend Giga", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Giga", + "const": "Lexend Giga" + }, + { + "title": "Lexend Mega", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Mega", + "const": "Lexend Mega" + }, + { + "title": "Lexend Peta", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Peta", + "const": "Lexend Peta" + }, + { + "title": "Lexend Tera", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Tera", + "const": "Lexend Tera" + }, + { + "title": "Lexend Zetta", + "markdownDescription": "https://fonts.google.com/specimen/Lexend+Zetta", + "const": "Lexend Zetta" + }, + { + "title": "Libre Barcode 128", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+128", + "const": "Libre Barcode 128" + }, + { + "title": "Libre Barcode 128 Text", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+128+Text", + "const": "Libre Barcode 128 Text" + }, + { + "title": "Libre Barcode 39", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+39", + "const": "Libre Barcode 39" + }, + { + "title": "Libre Barcode 39 Extended", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+39+Extended", + "const": "Libre Barcode 39 Extended" + }, + { + "title": "Libre Barcode 39 Extended Text", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+39+Extended+Text", + "const": "Libre Barcode 39 Extended Text" + }, + { + "title": "Libre Barcode 39 Text", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+39+Text", + "const": "Libre Barcode 39 Text" + }, + { + "title": "Libre Barcode EAN13 Text", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Barcode+EAN13+Text", + "const": "Libre Barcode EAN13 Text" + }, + { + "title": "Libre Baskerville", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Baskerville", + "const": "Libre Baskerville" + }, + { + "title": "Libre Bodoni", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Bodoni", + "const": "Libre Bodoni" + }, + { + "title": "Libre Caslon Display", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Caslon+Display", + "const": "Libre Caslon Display" + }, + { + "title": "Libre Caslon Text", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Caslon+Text", + "const": "Libre Caslon Text" + }, + { + "title": "Libre Franklin", + "markdownDescription": "https://fonts.google.com/specimen/Libre+Franklin", + "const": "Libre Franklin" + }, + { + "title": "Licorice", + "markdownDescription": "https://fonts.google.com/specimen/Licorice", + "const": "Licorice" + }, + { + "title": "Life Savers", + "markdownDescription": "https://fonts.google.com/specimen/Life+Savers", + "const": "Life Savers" + }, + { + "title": "Lilita One", + "markdownDescription": "https://fonts.google.com/specimen/Lilita+One", + "const": "Lilita One" + }, + { + "title": "Lily Script One", + "markdownDescription": "https://fonts.google.com/specimen/Lily+Script+One", + "const": "Lily Script One" + }, + { + "title": "Limelight", + "markdownDescription": "https://fonts.google.com/specimen/Limelight", + "const": "Limelight" + }, + { + "title": "Linden Hill", + "markdownDescription": "https://fonts.google.com/specimen/Linden+Hill", + "const": "Linden Hill" + }, + { + "title": "Lisu Bosa", + "markdownDescription": "https://fonts.google.com/specimen/Lisu+Bosa", + "const": "Lisu Bosa" + }, + { + "title": "Literata", + "markdownDescription": "https://fonts.google.com/specimen/Literata", + "const": "Literata" + }, + { + "title": "Liu Jian Mao Cao", + "markdownDescription": "https://fonts.google.com/specimen/Liu+Jian+Mao+Cao", + "const": "Liu Jian Mao Cao" + }, + { + "title": "Livvic", + "markdownDescription": "https://fonts.google.com/specimen/Livvic", + "const": "Livvic" + }, + { + "title": "Lobster", + "markdownDescription": "https://fonts.google.com/specimen/Lobster", + "const": "Lobster" + }, + { + "title": "Lobster Two", + "markdownDescription": "https://fonts.google.com/specimen/Lobster+Two", + "const": "Lobster Two" + }, + { + "title": "Londrina Outline", + "markdownDescription": "https://fonts.google.com/specimen/Londrina+Outline", + "const": "Londrina Outline" + }, + { + "title": "Londrina Shadow", + "markdownDescription": "https://fonts.google.com/specimen/Londrina+Shadow", + "const": "Londrina Shadow" + }, + { + "title": "Londrina Sketch", + "markdownDescription": "https://fonts.google.com/specimen/Londrina+Sketch", + "const": "Londrina Sketch" + }, + { + "title": "Londrina Solid", + "markdownDescription": "https://fonts.google.com/specimen/Londrina+Solid", + "const": "Londrina Solid" + }, + { + "title": "Long Cang", + "markdownDescription": "https://fonts.google.com/specimen/Long+Cang", + "const": "Long Cang" + }, + { + "title": "Lora", + "markdownDescription": "https://fonts.google.com/specimen/Lora", + "const": "Lora" + }, + { + "title": "Love Light", + "markdownDescription": "https://fonts.google.com/specimen/Love+Light", + "const": "Love Light" + }, + { + "title": "Love Ya Like A Sister", + "markdownDescription": "https://fonts.google.com/specimen/Love+Ya+Like+A+Sister", + "const": "Love Ya Like A Sister" + }, + { + "title": "Loved by the King", + "markdownDescription": "https://fonts.google.com/specimen/Loved+by+the+King", + "const": "Loved by the King" + }, + { + "title": "Lovers Quarrel", + "markdownDescription": "https://fonts.google.com/specimen/Lovers+Quarrel", + "const": "Lovers Quarrel" + }, + { + "title": "Luckiest Guy", + "markdownDescription": "https://fonts.google.com/specimen/Luckiest+Guy", + "const": "Luckiest Guy" + }, + { + "title": "Lugrasimo", + "markdownDescription": "https://fonts.google.com/specimen/Lugrasimo", + "const": "Lugrasimo" + }, + { + "title": "Lumanosimo", + "markdownDescription": "https://fonts.google.com/specimen/Lumanosimo", + "const": "Lumanosimo" + }, + { + "title": "Lunasima", + "markdownDescription": "https://fonts.google.com/specimen/Lunasima", + "const": "Lunasima" + }, + { + "title": "Lusitana", + "markdownDescription": "https://fonts.google.com/specimen/Lusitana", + "const": "Lusitana" + }, + { + "title": "Lustria", + "markdownDescription": "https://fonts.google.com/specimen/Lustria", + "const": "Lustria" + }, + { + "title": "Luxurious Roman", + "markdownDescription": "https://fonts.google.com/specimen/Luxurious+Roman", + "const": "Luxurious Roman" + }, + { + "title": "Luxurious Script", + "markdownDescription": "https://fonts.google.com/specimen/Luxurious+Script", + "const": "Luxurious Script" + }, + { + "title": "M PLUS 1", + "markdownDescription": "https://fonts.google.com/specimen/M+PLUS+1", + "const": "M PLUS 1" + }, + { + "title": "M PLUS 1 Code", + "markdownDescription": "https://fonts.google.com/specimen/M+PLUS+1+Code", + "const": "M PLUS 1 Code" + }, + { + "title": "M PLUS 1p", + "markdownDescription": "https://fonts.google.com/specimen/M+PLUS+1p", + "const": "M PLUS 1p" + }, + { + "title": "M PLUS 2", + "markdownDescription": "https://fonts.google.com/specimen/M+PLUS+2", + "const": "M PLUS 2" + }, + { + "title": "M PLUS Code Latin", + "markdownDescription": "https://fonts.google.com/specimen/M+PLUS+Code+Latin", + "const": "M PLUS Code Latin" + }, + { + "title": "M PLUS Rounded 1c", + "markdownDescription": "https://fonts.google.com/specimen/M+PLUS+Rounded+1c", + "const": "M PLUS Rounded 1c" + }, + { + "title": "Ma Shan Zheng", + "markdownDescription": "https://fonts.google.com/specimen/Ma+Shan+Zheng", + "const": "Ma Shan Zheng" + }, + { + "title": "Macondo", + "markdownDescription": "https://fonts.google.com/specimen/Macondo", + "const": "Macondo" + }, + { + "title": "Macondo Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Macondo+Swash+Caps", + "const": "Macondo Swash Caps" + }, + { + "title": "Mada", + "markdownDescription": "https://fonts.google.com/specimen/Mada", + "const": "Mada" + }, + { + "title": "Magra", + "markdownDescription": "https://fonts.google.com/specimen/Magra", + "const": "Magra" + }, + { + "title": "Maiden Orange", + "markdownDescription": "https://fonts.google.com/specimen/Maiden+Orange", + "const": "Maiden Orange" + }, + { + "title": "Maitree", + "markdownDescription": "https://fonts.google.com/specimen/Maitree", + "const": "Maitree" + }, + { + "title": "Major Mono Display", + "markdownDescription": "https://fonts.google.com/specimen/Major+Mono+Display", + "const": "Major Mono Display" + }, + { + "title": "Mako", + "markdownDescription": "https://fonts.google.com/specimen/Mako", + "const": "Mako" + }, + { + "title": "Mali", + "markdownDescription": "https://fonts.google.com/specimen/Mali", + "const": "Mali" + }, + { + "title": "Mallanna", + "markdownDescription": "https://fonts.google.com/specimen/Mallanna", + "const": "Mallanna" + }, + { + "title": "Mandali", + "markdownDescription": "https://fonts.google.com/specimen/Mandali", + "const": "Mandali" + }, + { + "title": "Manjari", + "markdownDescription": "https://fonts.google.com/specimen/Manjari", + "const": "Manjari" + }, + { + "title": "Manrope", + "markdownDescription": "https://fonts.google.com/specimen/Manrope", + "const": "Manrope" + }, + { + "title": "Mansalva", + "markdownDescription": "https://fonts.google.com/specimen/Mansalva", + "const": "Mansalva" + }, + { + "title": "Manuale", + "markdownDescription": "https://fonts.google.com/specimen/Manuale", + "const": "Manuale" + }, + { + "title": "Marcellus", + "markdownDescription": "https://fonts.google.com/specimen/Marcellus", + "const": "Marcellus" + }, + { + "title": "Marcellus SC", + "markdownDescription": "https://fonts.google.com/specimen/Marcellus+SC", + "const": "Marcellus SC" + }, + { + "title": "Marck Script", + "markdownDescription": "https://fonts.google.com/specimen/Marck+Script", + "const": "Marck Script" + }, + { + "title": "Margarine", + "markdownDescription": "https://fonts.google.com/specimen/Margarine", + "const": "Margarine" + }, + { + "title": "Marhey", + "markdownDescription": "https://fonts.google.com/specimen/Marhey", + "const": "Marhey" + }, + { + "title": "Markazi Text", + "markdownDescription": "https://fonts.google.com/specimen/Markazi+Text", + "const": "Markazi Text" + }, + { + "title": "Marko One", + "markdownDescription": "https://fonts.google.com/specimen/Marko+One", + "const": "Marko One" + }, + { + "title": "Marmelad", + "markdownDescription": "https://fonts.google.com/specimen/Marmelad", + "const": "Marmelad" + }, + { + "title": "Martel", + "markdownDescription": "https://fonts.google.com/specimen/Martel", + "const": "Martel" + }, + { + "title": "Martel Sans", + "markdownDescription": "https://fonts.google.com/specimen/Martel+Sans", + "const": "Martel Sans" + }, + { + "title": "Martian Mono", + "markdownDescription": "https://fonts.google.com/specimen/Martian+Mono", + "const": "Martian Mono" + }, + { + "title": "Marvel", + "markdownDescription": "https://fonts.google.com/specimen/Marvel", + "const": "Marvel" + }, + { + "title": "Mate", + "markdownDescription": "https://fonts.google.com/specimen/Mate", + "const": "Mate" + }, + { + "title": "Mate SC", + "markdownDescription": "https://fonts.google.com/specimen/Mate+SC", + "const": "Mate SC" + }, + { + "title": "Material Icons", + "markdownDescription": "https://fonts.google.com/specimen/Material+Icons", + "const": "Material Icons" + }, + { + "title": "Material Icons Outlined", + "markdownDescription": "https://fonts.google.com/specimen/Material+Icons+Outlined", + "const": "Material Icons Outlined" + }, + { + "title": "Material Icons Round", + "markdownDescription": "https://fonts.google.com/specimen/Material+Icons+Round", + "const": "Material Icons Round" + }, + { + "title": "Material Icons Sharp", + "markdownDescription": "https://fonts.google.com/specimen/Material+Icons+Sharp", + "const": "Material Icons Sharp" + }, + { + "title": "Material Icons Two Tone", + "markdownDescription": "https://fonts.google.com/specimen/Material+Icons+Two+Tone", + "const": "Material Icons Two Tone" + }, + { + "title": "Material Symbols Outlined", + "markdownDescription": "https://fonts.google.com/specimen/Material+Symbols+Outlined", + "const": "Material Symbols Outlined" + }, + { + "title": "Material Symbols Rounded", + "markdownDescription": "https://fonts.google.com/specimen/Material+Symbols+Rounded", + "const": "Material Symbols Rounded" + }, + { + "title": "Material Symbols Sharp", + "markdownDescription": "https://fonts.google.com/specimen/Material+Symbols+Sharp", + "const": "Material Symbols Sharp" + }, + { + "title": "Maven Pro", + "markdownDescription": "https://fonts.google.com/specimen/Maven+Pro", + "const": "Maven Pro" + }, + { + "title": "McLaren", + "markdownDescription": "https://fonts.google.com/specimen/McLaren", + "const": "McLaren" + }, + { + "title": "Mea Culpa", + "markdownDescription": "https://fonts.google.com/specimen/Mea+Culpa", + "const": "Mea Culpa" + }, + { + "title": "Meddon", + "markdownDescription": "https://fonts.google.com/specimen/Meddon", + "const": "Meddon" + }, + { + "title": "MedievalSharp", + "markdownDescription": "https://fonts.google.com/specimen/MedievalSharp", + "const": "MedievalSharp" + }, + { + "title": "Medula One", + "markdownDescription": "https://fonts.google.com/specimen/Medula+One", + "const": "Medula One" + }, + { + "title": "Meera Inimai", + "markdownDescription": "https://fonts.google.com/specimen/Meera+Inimai", + "const": "Meera Inimai" + }, + { + "title": "Megrim", + "markdownDescription": "https://fonts.google.com/specimen/Megrim", + "const": "Megrim" + }, + { + "title": "Meie Script", + "markdownDescription": "https://fonts.google.com/specimen/Meie+Script", + "const": "Meie Script" + }, + { + "title": "Meow Script", + "markdownDescription": "https://fonts.google.com/specimen/Meow+Script", + "const": "Meow Script" + }, + { + "title": "Merienda", + "markdownDescription": "https://fonts.google.com/specimen/Merienda", + "const": "Merienda" + }, + { + "title": "Merriweather", + "markdownDescription": "https://fonts.google.com/specimen/Merriweather", + "const": "Merriweather" + }, + { + "title": "Merriweather Sans", + "markdownDescription": "https://fonts.google.com/specimen/Merriweather+Sans", + "const": "Merriweather Sans" + }, + { + "title": "Metal", + "markdownDescription": "https://fonts.google.com/specimen/Metal", + "const": "Metal" + }, + { + "title": "Metal Mania", + "markdownDescription": "https://fonts.google.com/specimen/Metal+Mania", + "const": "Metal Mania" + }, + { + "title": "Metamorphous", + "markdownDescription": "https://fonts.google.com/specimen/Metamorphous", + "const": "Metamorphous" + }, + { + "title": "Metrophobic", + "markdownDescription": "https://fonts.google.com/specimen/Metrophobic", + "const": "Metrophobic" + }, + { + "title": "Michroma", + "markdownDescription": "https://fonts.google.com/specimen/Michroma", + "const": "Michroma" + }, + { + "title": "Milonga", + "markdownDescription": "https://fonts.google.com/specimen/Milonga", + "const": "Milonga" + }, + { + "title": "Miltonian", + "markdownDescription": "https://fonts.google.com/specimen/Miltonian", + "const": "Miltonian" + }, + { + "title": "Miltonian Tattoo", + "markdownDescription": "https://fonts.google.com/specimen/Miltonian+Tattoo", + "const": "Miltonian Tattoo" + }, + { + "title": "Mina", + "markdownDescription": "https://fonts.google.com/specimen/Mina", + "const": "Mina" + }, + { + "title": "Mingzat", + "markdownDescription": "https://fonts.google.com/specimen/Mingzat", + "const": "Mingzat" + }, + { + "title": "Miniver", + "markdownDescription": "https://fonts.google.com/specimen/Miniver", + "const": "Miniver" + }, + { + "title": "Miriam Libre", + "markdownDescription": "https://fonts.google.com/specimen/Miriam+Libre", + "const": "Miriam Libre" + }, + { + "title": "Mirza", + "markdownDescription": "https://fonts.google.com/specimen/Mirza", + "const": "Mirza" + }, + { + "title": "Miss Fajardose", + "markdownDescription": "https://fonts.google.com/specimen/Miss+Fajardose", + "const": "Miss Fajardose" + }, + { + "title": "Mitr", + "markdownDescription": "https://fonts.google.com/specimen/Mitr", + "const": "Mitr" + }, + { + "title": "Mochiy Pop One", + "markdownDescription": "https://fonts.google.com/specimen/Mochiy+Pop+One", + "const": "Mochiy Pop One" + }, + { + "title": "Mochiy Pop P One", + "markdownDescription": "https://fonts.google.com/specimen/Mochiy+Pop+P+One", + "const": "Mochiy Pop P One" + }, + { + "title": "Modak", + "markdownDescription": "https://fonts.google.com/specimen/Modak", + "const": "Modak" + }, + { + "title": "Modern Antiqua", + "markdownDescription": "https://fonts.google.com/specimen/Modern+Antiqua", + "const": "Modern Antiqua" + }, + { + "title": "Mogra", + "markdownDescription": "https://fonts.google.com/specimen/Mogra", + "const": "Mogra" + }, + { + "title": "Mohave", + "markdownDescription": "https://fonts.google.com/specimen/Mohave", + "const": "Mohave" + }, + { + "title": "Moirai One", + "markdownDescription": "https://fonts.google.com/specimen/Moirai+One", + "const": "Moirai One" + }, + { + "title": "Molengo", + "markdownDescription": "https://fonts.google.com/specimen/Molengo", + "const": "Molengo" + }, + { + "title": "Molle", + "markdownDescription": "https://fonts.google.com/specimen/Molle", + "const": "Molle" + }, + { + "title": "Monda", + "markdownDescription": "https://fonts.google.com/specimen/Monda", + "const": "Monda" + }, + { + "title": "Monofett", + "markdownDescription": "https://fonts.google.com/specimen/Monofett", + "const": "Monofett" + }, + { + "title": "Monomaniac One", + "markdownDescription": "https://fonts.google.com/specimen/Monomaniac+One", + "const": "Monomaniac One" + }, + { + "title": "Monoton", + "markdownDescription": "https://fonts.google.com/specimen/Monoton", + "const": "Monoton" + }, + { + "title": "Monsieur La Doulaise", + "markdownDescription": "https://fonts.google.com/specimen/Monsieur+La+Doulaise", + "const": "Monsieur La Doulaise" + }, + { + "title": "Montaga", + "markdownDescription": "https://fonts.google.com/specimen/Montaga", + "const": "Montaga" + }, + { + "title": "Montagu Slab", + "markdownDescription": "https://fonts.google.com/specimen/Montagu+Slab", + "const": "Montagu Slab" + }, + { + "title": "MonteCarlo", + "markdownDescription": "https://fonts.google.com/specimen/MonteCarlo", + "const": "MonteCarlo" + }, + { + "title": "Montez", + "markdownDescription": "https://fonts.google.com/specimen/Montez", + "const": "Montez" + }, + { + "title": "Montserrat", + "markdownDescription": "https://fonts.google.com/specimen/Montserrat", + "const": "Montserrat" + }, + { + "title": "Montserrat Alternates", + "markdownDescription": "https://fonts.google.com/specimen/Montserrat+Alternates", + "const": "Montserrat Alternates" + }, + { + "title": "Montserrat Subrayada", + "markdownDescription": "https://fonts.google.com/specimen/Montserrat+Subrayada", + "const": "Montserrat Subrayada" + }, + { + "title": "Moo Lah Lah", + "markdownDescription": "https://fonts.google.com/specimen/Moo+Lah+Lah", + "const": "Moo Lah Lah" + }, + { + "title": "Mooli", + "markdownDescription": "https://fonts.google.com/specimen/Mooli", + "const": "Mooli" + }, + { + "title": "Moon Dance", + "markdownDescription": "https://fonts.google.com/specimen/Moon+Dance", + "const": "Moon Dance" + }, + { + "title": "Moul", + "markdownDescription": "https://fonts.google.com/specimen/Moul", + "const": "Moul" + }, + { + "title": "Moulpali", + "markdownDescription": "https://fonts.google.com/specimen/Moulpali", + "const": "Moulpali" + }, + { + "title": "Mountains of Christmas", + "markdownDescription": "https://fonts.google.com/specimen/Mountains+of+Christmas", + "const": "Mountains of Christmas" + }, + { + "title": "Mouse Memoirs", + "markdownDescription": "https://fonts.google.com/specimen/Mouse+Memoirs", + "const": "Mouse Memoirs" + }, + { + "title": "Mr Bedfort", + "markdownDescription": "https://fonts.google.com/specimen/Mr+Bedfort", + "const": "Mr Bedfort" + }, + { + "title": "Mr Dafoe", + "markdownDescription": "https://fonts.google.com/specimen/Mr+Dafoe", + "const": "Mr Dafoe" + }, + { + "title": "Mr De Haviland", + "markdownDescription": "https://fonts.google.com/specimen/Mr+De+Haviland", + "const": "Mr De Haviland" + }, + { + "title": "Mrs Saint Delafield", + "markdownDescription": "https://fonts.google.com/specimen/Mrs+Saint+Delafield", + "const": "Mrs Saint Delafield" + }, + { + "title": "Mrs Sheppards", + "markdownDescription": "https://fonts.google.com/specimen/Mrs+Sheppards", + "const": "Mrs Sheppards" + }, + { + "title": "Ms Madi", + "markdownDescription": "https://fonts.google.com/specimen/Ms+Madi", + "const": "Ms Madi" + }, + { + "title": "Mukta", + "markdownDescription": "https://fonts.google.com/specimen/Mukta", + "const": "Mukta" + }, + { + "title": "Mukta Mahee", + "markdownDescription": "https://fonts.google.com/specimen/Mukta+Mahee", + "const": "Mukta Mahee" + }, + { + "title": "Mukta Malar", + "markdownDescription": "https://fonts.google.com/specimen/Mukta+Malar", + "const": "Mukta Malar" + }, + { + "title": "Mukta Vaani", + "markdownDescription": "https://fonts.google.com/specimen/Mukta+Vaani", + "const": "Mukta Vaani" + }, + { + "title": "Mulish", + "markdownDescription": "https://fonts.google.com/specimen/Mulish", + "const": "Mulish" + }, + { + "title": "Murecho", + "markdownDescription": "https://fonts.google.com/specimen/Murecho", + "const": "Murecho" + }, + { + "title": "MuseoModerno", + "markdownDescription": "https://fonts.google.com/specimen/MuseoModerno", + "const": "MuseoModerno" + }, + { + "title": "My Soul", + "markdownDescription": "https://fonts.google.com/specimen/My+Soul", + "const": "My Soul" + }, + { + "title": "Mynerve", + "markdownDescription": "https://fonts.google.com/specimen/Mynerve", + "const": "Mynerve" + }, + { + "title": "Mystery Quest", + "markdownDescription": "https://fonts.google.com/specimen/Mystery+Quest", + "const": "Mystery Quest" + }, + { + "title": "NTR", + "markdownDescription": "https://fonts.google.com/specimen/NTR", + "const": "NTR" + }, + { + "title": "Nabla", + "markdownDescription": "https://fonts.google.com/specimen/Nabla", + "const": "Nabla" + }, + { + "title": "Nanum Brush Script", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Brush+Script", + "const": "Nanum Brush Script" + }, + { + "title": "Nanum Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Gothic", + "const": "Nanum Gothic" + }, + { + "title": "Nanum Gothic Coding", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Gothic+Coding", + "const": "Nanum Gothic Coding" + }, + { + "title": "Nanum Myeongjo", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Myeongjo", + "const": "Nanum Myeongjo" + }, + { + "title": "Nanum Pen Script", + "markdownDescription": "https://fonts.google.com/specimen/Nanum+Pen+Script", + "const": "Nanum Pen Script" + }, + { + "title": "Narnoor", + "markdownDescription": "https://fonts.google.com/specimen/Narnoor", + "const": "Narnoor" + }, + { + "title": "Neonderthaw", + "markdownDescription": "https://fonts.google.com/specimen/Neonderthaw", + "const": "Neonderthaw" + }, + { + "title": "Nerko One", + "markdownDescription": "https://fonts.google.com/specimen/Nerko+One", + "const": "Nerko One" + }, + { + "title": "Neucha", + "markdownDescription": "https://fonts.google.com/specimen/Neucha", + "const": "Neucha" + }, + { + "title": "Neuton", + "markdownDescription": "https://fonts.google.com/specimen/Neuton", + "const": "Neuton" + }, + { + "title": "New Rocker", + "markdownDescription": "https://fonts.google.com/specimen/New+Rocker", + "const": "New Rocker" + }, + { + "title": "New Tegomin", + "markdownDescription": "https://fonts.google.com/specimen/New+Tegomin", + "const": "New Tegomin" + }, + { + "title": "News Cycle", + "markdownDescription": "https://fonts.google.com/specimen/News+Cycle", + "const": "News Cycle" + }, + { + "title": "Newsreader", + "markdownDescription": "https://fonts.google.com/specimen/Newsreader", + "const": "Newsreader" + }, + { + "title": "Niconne", + "markdownDescription": "https://fonts.google.com/specimen/Niconne", + "const": "Niconne" + }, + { + "title": "Niramit", + "markdownDescription": "https://fonts.google.com/specimen/Niramit", + "const": "Niramit" + }, + { + "title": "Nixie One", + "markdownDescription": "https://fonts.google.com/specimen/Nixie+One", + "const": "Nixie One" + }, + { + "title": "Nobile", + "markdownDescription": "https://fonts.google.com/specimen/Nobile", + "const": "Nobile" + }, + { + "title": "Nokora", + "markdownDescription": "https://fonts.google.com/specimen/Nokora", + "const": "Nokora" + }, + { + "title": "Norican", + "markdownDescription": "https://fonts.google.com/specimen/Norican", + "const": "Norican" + }, + { + "title": "Nosifer", + "markdownDescription": "https://fonts.google.com/specimen/Nosifer", + "const": "Nosifer" + }, + { + "title": "Notable", + "markdownDescription": "https://fonts.google.com/specimen/Notable", + "const": "Notable" + }, + { + "title": "Nothing You Could Do", + "markdownDescription": "https://fonts.google.com/specimen/Nothing+You+Could+Do", + "const": "Nothing You Could Do" + }, + { + "title": "Noticia Text", + "markdownDescription": "https://fonts.google.com/specimen/Noticia+Text", + "const": "Noticia Text" + }, + { + "title": "Noto Color Emoji", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Color+Emoji", + "const": "Noto Color Emoji" + }, + { + "title": "Noto Emoji", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Emoji", + "const": "Noto Emoji" + }, + { + "title": "Noto Kufi Arabic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Kufi+Arabic", + "const": "Noto Kufi Arabic" + }, + { + "title": "Noto Music", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Music", + "const": "Noto Music" + }, + { + "title": "Noto Naskh Arabic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Naskh+Arabic", + "const": "Noto Naskh Arabic" + }, + { + "title": "Noto Nastaliq Urdu", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Nastaliq+Urdu", + "const": "Noto Nastaliq Urdu" + }, + { + "title": "Noto Rashi Hebrew", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Rashi+Hebrew", + "const": "Noto Rashi Hebrew" + }, + { + "title": "Noto Sans", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans", + "const": "Noto Sans" + }, + { + "title": "Noto Sans Adlam", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Adlam", + "const": "Noto Sans Adlam" + }, + { + "title": "Noto Sans Adlam Unjoined", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Adlam+Unjoined", + "const": "Noto Sans Adlam Unjoined" + }, + { + "title": "Noto Sans Anatolian Hieroglyphs", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Anatolian+Hieroglyphs", + "const": "Noto Sans Anatolian Hieroglyphs" + }, + { + "title": "Noto Sans Arabic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Arabic", + "const": "Noto Sans Arabic" + }, + { + "title": "Noto Sans Armenian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Armenian", + "const": "Noto Sans Armenian" + }, + { + "title": "Noto Sans Avestan", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Avestan", + "const": "Noto Sans Avestan" + }, + { + "title": "Noto Sans Balinese", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Balinese", + "const": "Noto Sans Balinese" + }, + { + "title": "Noto Sans Bamum", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Bamum", + "const": "Noto Sans Bamum" + }, + { + "title": "Noto Sans Bassa Vah", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Bassa+Vah", + "const": "Noto Sans Bassa Vah" + }, + { + "title": "Noto Sans Batak", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Batak", + "const": "Noto Sans Batak" + }, + { + "title": "Noto Sans Bengali", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Bengali", + "const": "Noto Sans Bengali" + }, + { + "title": "Noto Sans Bhaiksuki", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Bhaiksuki", + "const": "Noto Sans Bhaiksuki" + }, + { + "title": "Noto Sans Brahmi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Brahmi", + "const": "Noto Sans Brahmi" + }, + { + "title": "Noto Sans Buginese", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Buginese", + "const": "Noto Sans Buginese" + }, + { + "title": "Noto Sans Buhid", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Buhid", + "const": "Noto Sans Buhid" + }, + { + "title": "Noto Sans Canadian Aboriginal", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Canadian+Aboriginal", + "const": "Noto Sans Canadian Aboriginal" + }, + { + "title": "Noto Sans Carian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Carian", + "const": "Noto Sans Carian" + }, + { + "title": "Noto Sans Caucasian Albanian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Caucasian+Albanian", + "const": "Noto Sans Caucasian Albanian" + }, + { + "title": "Noto Sans Chakma", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Chakma", + "const": "Noto Sans Chakma" + }, + { + "title": "Noto Sans Cham", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Cham", + "const": "Noto Sans Cham" + }, + { + "title": "Noto Sans Cherokee", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Cherokee", + "const": "Noto Sans Cherokee" + }, + { + "title": "Noto Sans Chorasmian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Chorasmian", + "const": "Noto Sans Chorasmian" + }, + { + "title": "Noto Sans Coptic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Coptic", + "const": "Noto Sans Coptic" + }, + { + "title": "Noto Sans Cuneiform", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Cuneiform", + "const": "Noto Sans Cuneiform" + }, + { + "title": "Noto Sans Cypriot", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Cypriot", + "const": "Noto Sans Cypriot" + }, + { + "title": "Noto Sans Cypro Minoan", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Cypro+Minoan", + "const": "Noto Sans Cypro Minoan" + }, + { + "title": "Noto Sans Deseret", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Deseret", + "const": "Noto Sans Deseret" + }, + { + "title": "Noto Sans Devanagari", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Devanagari", + "const": "Noto Sans Devanagari" + }, + { + "title": "Noto Sans Display", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Display", + "const": "Noto Sans Display" + }, + { + "title": "Noto Sans Duployan", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Duployan", + "const": "Noto Sans Duployan" + }, + { + "title": "Noto Sans Egyptian Hieroglyphs", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Egyptian+Hieroglyphs", + "const": "Noto Sans Egyptian Hieroglyphs" + }, + { + "title": "Noto Sans Elbasan", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Elbasan", + "const": "Noto Sans Elbasan" + }, + { + "title": "Noto Sans Elymaic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Elymaic", + "const": "Noto Sans Elymaic" + }, + { + "title": "Noto Sans Ethiopic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Ethiopic", + "const": "Noto Sans Ethiopic" + }, + { + "title": "Noto Sans Georgian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Georgian", + "const": "Noto Sans Georgian" + }, + { + "title": "Noto Sans Glagolitic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Glagolitic", + "const": "Noto Sans Glagolitic" + }, + { + "title": "Noto Sans Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Gothic", + "const": "Noto Sans Gothic" + }, + { + "title": "Noto Sans Grantha", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Grantha", + "const": "Noto Sans Grantha" + }, + { + "title": "Noto Sans Gujarati", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Gujarati", + "const": "Noto Sans Gujarati" + }, + { + "title": "Noto Sans Gunjala Gondi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Gunjala+Gondi", + "const": "Noto Sans Gunjala Gondi" + }, + { + "title": "Noto Sans Gurmukhi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Gurmukhi", + "const": "Noto Sans Gurmukhi" + }, + { + "title": "Noto Sans HK", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+HK", + "const": "Noto Sans HK" + }, + { + "title": "Noto Sans Hanifi Rohingya", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Hanifi+Rohingya", + "const": "Noto Sans Hanifi Rohingya" + }, + { + "title": "Noto Sans Hanunoo", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Hanunoo", + "const": "Noto Sans Hanunoo" + }, + { + "title": "Noto Sans Hatran", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Hatran", + "const": "Noto Sans Hatran" + }, + { + "title": "Noto Sans Hebrew", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Hebrew", + "const": "Noto Sans Hebrew" + }, + { + "title": "Noto Sans Imperial Aramaic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Imperial+Aramaic", + "const": "Noto Sans Imperial Aramaic" + }, + { + "title": "Noto Sans Indic Siyaq Numbers", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Indic+Siyaq+Numbers", + "const": "Noto Sans Indic Siyaq Numbers" + }, + { + "title": "Noto Sans Inscriptional Pahlavi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Inscriptional+Pahlavi", + "const": "Noto Sans Inscriptional Pahlavi" + }, + { + "title": "Noto Sans Inscriptional Parthian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Inscriptional+Parthian", + "const": "Noto Sans Inscriptional Parthian" + }, + { + "title": "Noto Sans JP", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+JP", + "const": "Noto Sans JP" + }, + { + "title": "Noto Sans Javanese", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Javanese", + "const": "Noto Sans Javanese" + }, + { + "title": "Noto Sans KR", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+KR", + "const": "Noto Sans KR" + }, + { + "title": "Noto Sans Kaithi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Kaithi", + "const": "Noto Sans Kaithi" + }, + { + "title": "Noto Sans Kannada", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Kannada", + "const": "Noto Sans Kannada" + }, + { + "title": "Noto Sans Kayah Li", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Kayah+Li", + "const": "Noto Sans Kayah Li" + }, + { + "title": "Noto Sans Kharoshthi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Kharoshthi", + "const": "Noto Sans Kharoshthi" + }, + { + "title": "Noto Sans Khmer", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Khmer", + "const": "Noto Sans Khmer" + }, + { + "title": "Noto Sans Khojki", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Khojki", + "const": "Noto Sans Khojki" + }, + { + "title": "Noto Sans Khudawadi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Khudawadi", + "const": "Noto Sans Khudawadi" + }, + { + "title": "Noto Sans Lao", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Lao", + "const": "Noto Sans Lao" + }, + { + "title": "Noto Sans Lao Looped", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Lao+Looped", + "const": "Noto Sans Lao Looped" + }, + { + "title": "Noto Sans Lepcha", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Lepcha", + "const": "Noto Sans Lepcha" + }, + { + "title": "Noto Sans Limbu", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Limbu", + "const": "Noto Sans Limbu" + }, + { + "title": "Noto Sans Linear A", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Linear+A", + "const": "Noto Sans Linear A" + }, + { + "title": "Noto Sans Linear B", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Linear+B", + "const": "Noto Sans Linear B" + }, + { + "title": "Noto Sans Lisu", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Lisu", + "const": "Noto Sans Lisu" + }, + { + "title": "Noto Sans Lycian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Lycian", + "const": "Noto Sans Lycian" + }, + { + "title": "Noto Sans Lydian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Lydian", + "const": "Noto Sans Lydian" + }, + { + "title": "Noto Sans Mahajani", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Mahajani", + "const": "Noto Sans Mahajani" + }, + { + "title": "Noto Sans Malayalam", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Malayalam", + "const": "Noto Sans Malayalam" + }, + { + "title": "Noto Sans Mandaic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Mandaic", + "const": "Noto Sans Mandaic" + }, + { + "title": "Noto Sans Manichaean", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Manichaean", + "const": "Noto Sans Manichaean" + }, + { + "title": "Noto Sans Marchen", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Marchen", + "const": "Noto Sans Marchen" + }, + { + "title": "Noto Sans Masaram Gondi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Masaram+Gondi", + "const": "Noto Sans Masaram Gondi" + }, + { + "title": "Noto Sans Math", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Math", + "const": "Noto Sans Math" + }, + { + "title": "Noto Sans Mayan Numerals", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Mayan+Numerals", + "const": "Noto Sans Mayan Numerals" + }, + { + "title": "Noto Sans Medefaidrin", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Medefaidrin", + "const": "Noto Sans Medefaidrin" + }, + { + "title": "Noto Sans Meetei Mayek", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Meetei+Mayek", + "const": "Noto Sans Meetei Mayek" + }, + { + "title": "Noto Sans Mende Kikakui", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Mende+Kikakui", + "const": "Noto Sans Mende Kikakui" + }, + { + "title": "Noto Sans Meroitic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Meroitic", + "const": "Noto Sans Meroitic" + }, + { + "title": "Noto Sans Miao", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Miao", + "const": "Noto Sans Miao" + }, + { + "title": "Noto Sans Modi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Modi", + "const": "Noto Sans Modi" + }, + { + "title": "Noto Sans Mongolian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Mongolian", + "const": "Noto Sans Mongolian" + }, + { + "title": "Noto Sans Mono", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Mono", + "const": "Noto Sans Mono" + }, + { + "title": "Noto Sans Mro", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Mro", + "const": "Noto Sans Mro" + }, + { + "title": "Noto Sans Multani", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Multani", + "const": "Noto Sans Multani" + }, + { + "title": "Noto Sans Myanmar", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Myanmar", + "const": "Noto Sans Myanmar" + }, + { + "title": "Noto Sans NKo", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+NKo", + "const": "Noto Sans NKo" + }, + { + "title": "Noto Sans NKo Unjoined", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+NKo+Unjoined", + "const": "Noto Sans NKo Unjoined" + }, + { + "title": "Noto Sans Nabataean", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Nabataean", + "const": "Noto Sans Nabataean" + }, + { + "title": "Noto Sans Nag Mundari", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Nag+Mundari", + "const": "Noto Sans Nag Mundari" + }, + { + "title": "Noto Sans Nandinagari", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Nandinagari", + "const": "Noto Sans Nandinagari" + }, + { + "title": "Noto Sans New Tai Lue", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+New+Tai+Lue", + "const": "Noto Sans New Tai Lue" + }, + { + "title": "Noto Sans Newa", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Newa", + "const": "Noto Sans Newa" + }, + { + "title": "Noto Sans Nushu", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Nushu", + "const": "Noto Sans Nushu" + }, + { + "title": "Noto Sans Ogham", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Ogham", + "const": "Noto Sans Ogham" + }, + { + "title": "Noto Sans Ol Chiki", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Ol+Chiki", + "const": "Noto Sans Ol Chiki" + }, + { + "title": "Noto Sans Old Hungarian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+Hungarian", + "const": "Noto Sans Old Hungarian" + }, + { + "title": "Noto Sans Old Italic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+Italic", + "const": "Noto Sans Old Italic" + }, + { + "title": "Noto Sans Old North Arabian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+North+Arabian", + "const": "Noto Sans Old North Arabian" + }, + { + "title": "Noto Sans Old Permic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+Permic", + "const": "Noto Sans Old Permic" + }, + { + "title": "Noto Sans Old Persian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+Persian", + "const": "Noto Sans Old Persian" + }, + { + "title": "Noto Sans Old Sogdian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+Sogdian", + "const": "Noto Sans Old Sogdian" + }, + { + "title": "Noto Sans Old South Arabian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+South+Arabian", + "const": "Noto Sans Old South Arabian" + }, + { + "title": "Noto Sans Old Turkic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Old+Turkic", + "const": "Noto Sans Old Turkic" + }, + { + "title": "Noto Sans Oriya", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Oriya", + "const": "Noto Sans Oriya" + }, + { + "title": "Noto Sans Osage", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Osage", + "const": "Noto Sans Osage" + }, + { + "title": "Noto Sans Osmanya", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Osmanya", + "const": "Noto Sans Osmanya" + }, + { + "title": "Noto Sans Pahawh Hmong", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Pahawh+Hmong", + "const": "Noto Sans Pahawh Hmong" + }, + { + "title": "Noto Sans Palmyrene", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Palmyrene", + "const": "Noto Sans Palmyrene" + }, + { + "title": "Noto Sans Pau Cin Hau", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Pau+Cin+Hau", + "const": "Noto Sans Pau Cin Hau" + }, + { + "title": "Noto Sans Phags Pa", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Phags+Pa", + "const": "Noto Sans Phags Pa" + }, + { + "title": "Noto Sans Phoenician", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Phoenician", + "const": "Noto Sans Phoenician" + }, + { + "title": "Noto Sans Psalter Pahlavi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Psalter+Pahlavi", + "const": "Noto Sans Psalter Pahlavi" + }, + { + "title": "Noto Sans Rejang", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Rejang", + "const": "Noto Sans Rejang" + }, + { + "title": "Noto Sans Runic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Runic", + "const": "Noto Sans Runic" + }, + { + "title": "Noto Sans SC", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+SC", + "const": "Noto Sans SC" + }, + { + "title": "Noto Sans Samaritan", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Samaritan", + "const": "Noto Sans Samaritan" + }, + { + "title": "Noto Sans Saurashtra", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Saurashtra", + "const": "Noto Sans Saurashtra" + }, + { + "title": "Noto Sans Sharada", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Sharada", + "const": "Noto Sans Sharada" + }, + { + "title": "Noto Sans Shavian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Shavian", + "const": "Noto Sans Shavian" + }, + { + "title": "Noto Sans Siddham", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Siddham", + "const": "Noto Sans Siddham" + }, + { + "title": "Noto Sans SignWriting", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+SignWriting", + "const": "Noto Sans SignWriting" + }, + { + "title": "Noto Sans Sinhala", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Sinhala", + "const": "Noto Sans Sinhala" + }, + { + "title": "Noto Sans Sogdian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Sogdian", + "const": "Noto Sans Sogdian" + }, + { + "title": "Noto Sans Sora Sompeng", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Sora+Sompeng", + "const": "Noto Sans Sora Sompeng" + }, + { + "title": "Noto Sans Soyombo", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Soyombo", + "const": "Noto Sans Soyombo" + }, + { + "title": "Noto Sans Sundanese", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Sundanese", + "const": "Noto Sans Sundanese" + }, + { + "title": "Noto Sans Syloti Nagri", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Syloti+Nagri", + "const": "Noto Sans Syloti Nagri" + }, + { + "title": "Noto Sans Symbols", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Symbols", + "const": "Noto Sans Symbols" + }, + { + "title": "Noto Sans Symbols 2", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Symbols+2", + "const": "Noto Sans Symbols 2" + }, + { + "title": "Noto Sans Syriac", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Syriac", + "const": "Noto Sans Syriac" + }, + { + "title": "Noto Sans Syriac Eastern", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Syriac+Eastern", + "const": "Noto Sans Syriac Eastern" + }, + { + "title": "Noto Sans TC", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+TC", + "const": "Noto Sans TC" + }, + { + "title": "Noto Sans Tagalog", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tagalog", + "const": "Noto Sans Tagalog" + }, + { + "title": "Noto Sans Tagbanwa", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tagbanwa", + "const": "Noto Sans Tagbanwa" + }, + { + "title": "Noto Sans Tai Le", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tai+Le", + "const": "Noto Sans Tai Le" + }, + { + "title": "Noto Sans Tai Tham", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tai+Tham", + "const": "Noto Sans Tai Tham" + }, + { + "title": "Noto Sans Tai Viet", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tai+Viet", + "const": "Noto Sans Tai Viet" + }, + { + "title": "Noto Sans Takri", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Takri", + "const": "Noto Sans Takri" + }, + { + "title": "Noto Sans Tamil", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tamil", + "const": "Noto Sans Tamil" + }, + { + "title": "Noto Sans Tamil Supplement", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tamil+Supplement", + "const": "Noto Sans Tamil Supplement" + }, + { + "title": "Noto Sans Tangsa", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tangsa", + "const": "Noto Sans Tangsa" + }, + { + "title": "Noto Sans Telugu", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Telugu", + "const": "Noto Sans Telugu" + }, + { + "title": "Noto Sans Thaana", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Thaana", + "const": "Noto Sans Thaana" + }, + { + "title": "Noto Sans Thai", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Thai", + "const": "Noto Sans Thai" + }, + { + "title": "Noto Sans Thai Looped", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Thai+Looped", + "const": "Noto Sans Thai Looped" + }, + { + "title": "Noto Sans Tifinagh", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tifinagh", + "const": "Noto Sans Tifinagh" + }, + { + "title": "Noto Sans Tirhuta", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Tirhuta", + "const": "Noto Sans Tirhuta" + }, + { + "title": "Noto Sans Ugaritic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Ugaritic", + "const": "Noto Sans Ugaritic" + }, + { + "title": "Noto Sans Vai", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Vai", + "const": "Noto Sans Vai" + }, + { + "title": "Noto Sans Vithkuqi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Vithkuqi", + "const": "Noto Sans Vithkuqi" + }, + { + "title": "Noto Sans Wancho", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Wancho", + "const": "Noto Sans Wancho" + }, + { + "title": "Noto Sans Warang Citi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Warang+Citi", + "const": "Noto Sans Warang Citi" + }, + { + "title": "Noto Sans Yi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Yi", + "const": "Noto Sans Yi" + }, + { + "title": "Noto Sans Zanabazar Square", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Sans+Zanabazar+Square", + "const": "Noto Sans Zanabazar Square" + }, + { + "title": "Noto Serif", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif", + "const": "Noto Serif" + }, + { + "title": "Noto Serif Ahom", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Ahom", + "const": "Noto Serif Ahom" + }, + { + "title": "Noto Serif Armenian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Armenian", + "const": "Noto Serif Armenian" + }, + { + "title": "Noto Serif Balinese", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Balinese", + "const": "Noto Serif Balinese" + }, + { + "title": "Noto Serif Bengali", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Bengali", + "const": "Noto Serif Bengali" + }, + { + "title": "Noto Serif Devanagari", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Devanagari", + "const": "Noto Serif Devanagari" + }, + { + "title": "Noto Serif Display", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Display", + "const": "Noto Serif Display" + }, + { + "title": "Noto Serif Dogra", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Dogra", + "const": "Noto Serif Dogra" + }, + { + "title": "Noto Serif Ethiopic", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Ethiopic", + "const": "Noto Serif Ethiopic" + }, + { + "title": "Noto Serif Georgian", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Georgian", + "const": "Noto Serif Georgian" + }, + { + "title": "Noto Serif Grantha", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Grantha", + "const": "Noto Serif Grantha" + }, + { + "title": "Noto Serif Gujarati", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Gujarati", + "const": "Noto Serif Gujarati" + }, + { + "title": "Noto Serif Gurmukhi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Gurmukhi", + "const": "Noto Serif Gurmukhi" + }, + { + "title": "Noto Serif HK", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+HK", + "const": "Noto Serif HK" + }, + { + "title": "Noto Serif Hebrew", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Hebrew", + "const": "Noto Serif Hebrew" + }, + { + "title": "Noto Serif JP", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+JP", + "const": "Noto Serif JP" + }, + { + "title": "Noto Serif KR", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+KR", + "const": "Noto Serif KR" + }, + { + "title": "Noto Serif Kannada", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Kannada", + "const": "Noto Serif Kannada" + }, + { + "title": "Noto Serif Khitan Small Script", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Khitan+Small+Script", + "const": "Noto Serif Khitan Small Script" + }, + { + "title": "Noto Serif Khmer", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Khmer", + "const": "Noto Serif Khmer" + }, + { + "title": "Noto Serif Khojki", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Khojki", + "const": "Noto Serif Khojki" + }, + { + "title": "Noto Serif Lao", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Lao", + "const": "Noto Serif Lao" + }, + { + "title": "Noto Serif Makasar", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Makasar", + "const": "Noto Serif Makasar" + }, + { + "title": "Noto Serif Malayalam", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Malayalam", + "const": "Noto Serif Malayalam" + }, + { + "title": "Noto Serif Myanmar", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Myanmar", + "const": "Noto Serif Myanmar" + }, + { + "title": "Noto Serif NP Hmong", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+NP+Hmong", + "const": "Noto Serif NP Hmong" + }, + { + "title": "Noto Serif Oriya", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Oriya", + "const": "Noto Serif Oriya" + }, + { + "title": "Noto Serif Ottoman Siyaq", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Ottoman+Siyaq", + "const": "Noto Serif Ottoman Siyaq" + }, + { + "title": "Noto Serif SC", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+SC", + "const": "Noto Serif SC" + }, + { + "title": "Noto Serif Sinhala", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Sinhala", + "const": "Noto Serif Sinhala" + }, + { + "title": "Noto Serif TC", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+TC", + "const": "Noto Serif TC" + }, + { + "title": "Noto Serif Tamil", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Tamil", + "const": "Noto Serif Tamil" + }, + { + "title": "Noto Serif Tangut", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Tangut", + "const": "Noto Serif Tangut" + }, + { + "title": "Noto Serif Telugu", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Telugu", + "const": "Noto Serif Telugu" + }, + { + "title": "Noto Serif Thai", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Thai", + "const": "Noto Serif Thai" + }, + { + "title": "Noto Serif Tibetan", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Tibetan", + "const": "Noto Serif Tibetan" + }, + { + "title": "Noto Serif Toto", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Toto", + "const": "Noto Serif Toto" + }, + { + "title": "Noto Serif Vithkuqi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Vithkuqi", + "const": "Noto Serif Vithkuqi" + }, + { + "title": "Noto Serif Yezidi", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Serif+Yezidi", + "const": "Noto Serif Yezidi" + }, + { + "title": "Noto Traditional Nushu", + "markdownDescription": "https://fonts.google.com/specimen/Noto+Traditional+Nushu", + "const": "Noto Traditional Nushu" + }, + { + "title": "Nova Cut", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Cut", + "const": "Nova Cut" + }, + { + "title": "Nova Flat", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Flat", + "const": "Nova Flat" + }, + { + "title": "Nova Mono", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Mono", + "const": "Nova Mono" + }, + { + "title": "Nova Oval", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Oval", + "const": "Nova Oval" + }, + { + "title": "Nova Round", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Round", + "const": "Nova Round" + }, + { + "title": "Nova Script", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Script", + "const": "Nova Script" + }, + { + "title": "Nova Slim", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Slim", + "const": "Nova Slim" + }, + { + "title": "Nova Square", + "markdownDescription": "https://fonts.google.com/specimen/Nova+Square", + "const": "Nova Square" + }, + { + "title": "Numans", + "markdownDescription": "https://fonts.google.com/specimen/Numans", + "const": "Numans" + }, + { + "title": "Nunito", + "markdownDescription": "https://fonts.google.com/specimen/Nunito", + "const": "Nunito" + }, + { + "title": "Nunito Sans", + "markdownDescription": "https://fonts.google.com/specimen/Nunito+Sans", + "const": "Nunito Sans" + }, + { + "title": "Nuosu SIL", + "markdownDescription": "https://fonts.google.com/specimen/Nuosu+SIL", + "const": "Nuosu SIL" + }, + { + "title": "Odibee Sans", + "markdownDescription": "https://fonts.google.com/specimen/Odibee+Sans", + "const": "Odibee Sans" + }, + { + "title": "Odor Mean Chey", + "markdownDescription": "https://fonts.google.com/specimen/Odor+Mean+Chey", + "const": "Odor Mean Chey" + }, + { + "title": "Offside", + "markdownDescription": "https://fonts.google.com/specimen/Offside", + "const": "Offside" + }, + { + "title": "Oi", + "markdownDescription": "https://fonts.google.com/specimen/Oi", + "const": "Oi" + }, + { + "title": "Old Standard TT", + "markdownDescription": "https://fonts.google.com/specimen/Old+Standard+TT", + "const": "Old Standard TT" + }, + { + "title": "Oldenburg", + "markdownDescription": "https://fonts.google.com/specimen/Oldenburg", + "const": "Oldenburg" + }, + { + "title": "Ole", + "markdownDescription": "https://fonts.google.com/specimen/Ole", + "const": "Ole" + }, + { + "title": "Oleo Script", + "markdownDescription": "https://fonts.google.com/specimen/Oleo+Script", + "const": "Oleo Script" + }, + { + "title": "Oleo Script Swash Caps", + "markdownDescription": "https://fonts.google.com/specimen/Oleo+Script+Swash+Caps", + "const": "Oleo Script Swash Caps" + }, + { + "title": "Onest", + "markdownDescription": "https://fonts.google.com/specimen/Onest", + "const": "Onest" + }, + { + "title": "Oooh Baby", + "markdownDescription": "https://fonts.google.com/specimen/Oooh+Baby", + "const": "Oooh Baby" + }, + { + "title": "Open Sans", + "markdownDescription": "https://fonts.google.com/specimen/Open+Sans", + "const": "Open Sans" + }, + { + "title": "Oranienbaum", + "markdownDescription": "https://fonts.google.com/specimen/Oranienbaum", + "const": "Oranienbaum" + }, + { + "title": "Orbit", + "markdownDescription": "https://fonts.google.com/specimen/Orbit", + "const": "Orbit" + }, + { + "title": "Orbitron", + "markdownDescription": "https://fonts.google.com/specimen/Orbitron", + "const": "Orbitron" + }, + { + "title": "Oregano", + "markdownDescription": "https://fonts.google.com/specimen/Oregano", + "const": "Oregano" + }, + { + "title": "Orelega One", + "markdownDescription": "https://fonts.google.com/specimen/Orelega+One", + "const": "Orelega One" + }, + { + "title": "Orienta", + "markdownDescription": "https://fonts.google.com/specimen/Orienta", + "const": "Orienta" + }, + { + "title": "Original Surfer", + "markdownDescription": "https://fonts.google.com/specimen/Original+Surfer", + "const": "Original Surfer" + }, + { + "title": "Oswald", + "markdownDescription": "https://fonts.google.com/specimen/Oswald", + "const": "Oswald" + }, + { + "title": "Outfit", + "markdownDescription": "https://fonts.google.com/specimen/Outfit", + "const": "Outfit" + }, + { + "title": "Over the Rainbow", + "markdownDescription": "https://fonts.google.com/specimen/Over+the+Rainbow", + "const": "Over the Rainbow" + }, + { + "title": "Overlock", + "markdownDescription": "https://fonts.google.com/specimen/Overlock", + "const": "Overlock" + }, + { + "title": "Overlock SC", + "markdownDescription": "https://fonts.google.com/specimen/Overlock+SC", + "const": "Overlock SC" + }, + { + "title": "Overpass", + "markdownDescription": "https://fonts.google.com/specimen/Overpass", + "const": "Overpass" + }, + { + "title": "Overpass Mono", + "markdownDescription": "https://fonts.google.com/specimen/Overpass+Mono", + "const": "Overpass Mono" + }, + { + "title": "Ovo", + "markdownDescription": "https://fonts.google.com/specimen/Ovo", + "const": "Ovo" + }, + { + "title": "Oxanium", + "markdownDescription": "https://fonts.google.com/specimen/Oxanium", + "const": "Oxanium" + }, + { + "title": "Oxygen", + "markdownDescription": "https://fonts.google.com/specimen/Oxygen", + "const": "Oxygen" + }, + { + "title": "Oxygen Mono", + "markdownDescription": "https://fonts.google.com/specimen/Oxygen+Mono", + "const": "Oxygen Mono" + }, + { + "title": "PT Mono", + "markdownDescription": "https://fonts.google.com/specimen/PT+Mono", + "const": "PT Mono" + }, + { + "title": "PT Sans", + "markdownDescription": "https://fonts.google.com/specimen/PT+Sans", + "const": "PT Sans" + }, + { + "title": "PT Sans Caption", + "markdownDescription": "https://fonts.google.com/specimen/PT+Sans+Caption", + "const": "PT Sans Caption" + }, + { + "title": "PT Sans Narrow", + "markdownDescription": "https://fonts.google.com/specimen/PT+Sans+Narrow", + "const": "PT Sans Narrow" + }, + { + "title": "PT Serif", + "markdownDescription": "https://fonts.google.com/specimen/PT+Serif", + "const": "PT Serif" + }, + { + "title": "PT Serif Caption", + "markdownDescription": "https://fonts.google.com/specimen/PT+Serif+Caption", + "const": "PT Serif Caption" + }, + { + "title": "Pacifico", + "markdownDescription": "https://fonts.google.com/specimen/Pacifico", + "const": "Pacifico" + }, + { + "title": "Padauk", + "markdownDescription": "https://fonts.google.com/specimen/Padauk", + "const": "Padauk" + }, + { + "title": "Padyakke Expanded One", + "markdownDescription": "https://fonts.google.com/specimen/Padyakke+Expanded+One", + "const": "Padyakke Expanded One" + }, + { + "title": "Palanquin", + "markdownDescription": "https://fonts.google.com/specimen/Palanquin", + "const": "Palanquin" + }, + { + "title": "Palanquin Dark", + "markdownDescription": "https://fonts.google.com/specimen/Palanquin+Dark", + "const": "Palanquin Dark" + }, + { + "title": "Palette Mosaic", + "markdownDescription": "https://fonts.google.com/specimen/Palette+Mosaic", + "const": "Palette Mosaic" + }, + { + "title": "Pangolin", + "markdownDescription": "https://fonts.google.com/specimen/Pangolin", + "const": "Pangolin" + }, + { + "title": "Paprika", + "markdownDescription": "https://fonts.google.com/specimen/Paprika", + "const": "Paprika" + }, + { + "title": "Parisienne", + "markdownDescription": "https://fonts.google.com/specimen/Parisienne", + "const": "Parisienne" + }, + { + "title": "Passero One", + "markdownDescription": "https://fonts.google.com/specimen/Passero+One", + "const": "Passero One" + }, + { + "title": "Passion One", + "markdownDescription": "https://fonts.google.com/specimen/Passion+One", + "const": "Passion One" + }, + { + "title": "Passions Conflict", + "markdownDescription": "https://fonts.google.com/specimen/Passions+Conflict", + "const": "Passions Conflict" + }, + { + "title": "Pathway Extreme", + "markdownDescription": "https://fonts.google.com/specimen/Pathway+Extreme", + "const": "Pathway Extreme" + }, + { + "title": "Pathway Gothic One", + "markdownDescription": "https://fonts.google.com/specimen/Pathway+Gothic+One", + "const": "Pathway Gothic One" + }, + { + "title": "Patrick Hand", + "markdownDescription": "https://fonts.google.com/specimen/Patrick+Hand", + "const": "Patrick Hand" + }, + { + "title": "Patrick Hand SC", + "markdownDescription": "https://fonts.google.com/specimen/Patrick+Hand+SC", + "const": "Patrick Hand SC" + }, + { + "title": "Pattaya", + "markdownDescription": "https://fonts.google.com/specimen/Pattaya", + "const": "Pattaya" + }, + { + "title": "Patua One", + "markdownDescription": "https://fonts.google.com/specimen/Patua+One", + "const": "Patua One" + }, + { + "title": "Pavanam", + "markdownDescription": "https://fonts.google.com/specimen/Pavanam", + "const": "Pavanam" + }, + { + "title": "Paytone One", + "markdownDescription": "https://fonts.google.com/specimen/Paytone+One", + "const": "Paytone One" + }, + { + "title": "Peddana", + "markdownDescription": "https://fonts.google.com/specimen/Peddana", + "const": "Peddana" + }, + { + "title": "Peralta", + "markdownDescription": "https://fonts.google.com/specimen/Peralta", + "const": "Peralta" + }, + { + "title": "Permanent Marker", + "markdownDescription": "https://fonts.google.com/specimen/Permanent+Marker", + "const": "Permanent Marker" + }, + { + "title": "Petemoss", + "markdownDescription": "https://fonts.google.com/specimen/Petemoss", + "const": "Petemoss" + }, + { + "title": "Petit Formal Script", + "markdownDescription": "https://fonts.google.com/specimen/Petit+Formal+Script", + "const": "Petit Formal Script" + }, + { + "title": "Petrona", + "markdownDescription": "https://fonts.google.com/specimen/Petrona", + "const": "Petrona" + }, + { + "title": "Philosopher", + "markdownDescription": "https://fonts.google.com/specimen/Philosopher", + "const": "Philosopher" + }, + { + "title": "Phudu", + "markdownDescription": "https://fonts.google.com/specimen/Phudu", + "const": "Phudu" + }, + { + "title": "Piazzolla", + "markdownDescription": "https://fonts.google.com/specimen/Piazzolla", + "const": "Piazzolla" + }, + { + "title": "Piedra", + "markdownDescription": "https://fonts.google.com/specimen/Piedra", + "const": "Piedra" + }, + { + "title": "Pinyon Script", + "markdownDescription": "https://fonts.google.com/specimen/Pinyon+Script", + "const": "Pinyon Script" + }, + { + "title": "Pirata One", + "markdownDescription": "https://fonts.google.com/specimen/Pirata+One", + "const": "Pirata One" + }, + { + "title": "Pixelify Sans", + "markdownDescription": "https://fonts.google.com/specimen/Pixelify+Sans", + "const": "Pixelify Sans" + }, + { + "title": "Plaster", + "markdownDescription": "https://fonts.google.com/specimen/Plaster", + "const": "Plaster" + }, + { + "title": "Play", + "markdownDescription": "https://fonts.google.com/specimen/Play", + "const": "Play" + }, + { + "title": "Playball", + "markdownDescription": "https://fonts.google.com/specimen/Playball", + "const": "Playball" + }, + { + "title": "Playfair", + "markdownDescription": "https://fonts.google.com/specimen/Playfair", + "const": "Playfair" + }, + { + "title": "Playfair Display", + "markdownDescription": "https://fonts.google.com/specimen/Playfair+Display", + "const": "Playfair Display" + }, + { + "title": "Playfair Display SC", + "markdownDescription": "https://fonts.google.com/specimen/Playfair+Display+SC", + "const": "Playfair Display SC" + }, + { + "title": "Playpen Sans", + "markdownDescription": "https://fonts.google.com/specimen/Playpen+Sans", + "const": "Playpen Sans" + }, + { + "title": "Plus Jakarta Sans", + "markdownDescription": "https://fonts.google.com/specimen/Plus+Jakarta+Sans", + "const": "Plus Jakarta Sans" + }, + { + "title": "Podkova", + "markdownDescription": "https://fonts.google.com/specimen/Podkova", + "const": "Podkova" + }, + { + "title": "Poiret One", + "markdownDescription": "https://fonts.google.com/specimen/Poiret+One", + "const": "Poiret One" + }, + { + "title": "Poller One", + "markdownDescription": "https://fonts.google.com/specimen/Poller+One", + "const": "Poller One" + }, + { + "title": "Poltawski Nowy", + "markdownDescription": "https://fonts.google.com/specimen/Poltawski+Nowy", + "const": "Poltawski Nowy" + }, + { + "title": "Poly", + "markdownDescription": "https://fonts.google.com/specimen/Poly", + "const": "Poly" + }, + { + "title": "Pompiere", + "markdownDescription": "https://fonts.google.com/specimen/Pompiere", + "const": "Pompiere" + }, + { + "title": "Pontano Sans", + "markdownDescription": "https://fonts.google.com/specimen/Pontano+Sans", + "const": "Pontano Sans" + }, + { + "title": "Poor Story", + "markdownDescription": "https://fonts.google.com/specimen/Poor+Story", + "const": "Poor Story" + }, + { + "title": "Poppins", + "markdownDescription": "https://fonts.google.com/specimen/Poppins", + "const": "Poppins" + }, + { + "title": "Port Lligat Sans", + "markdownDescription": "https://fonts.google.com/specimen/Port+Lligat+Sans", + "const": "Port Lligat Sans" + }, + { + "title": "Port Lligat Slab", + "markdownDescription": "https://fonts.google.com/specimen/Port+Lligat+Slab", + "const": "Port Lligat Slab" + }, + { + "title": "Potta One", + "markdownDescription": "https://fonts.google.com/specimen/Potta+One", + "const": "Potta One" + }, + { + "title": "Pragati Narrow", + "markdownDescription": "https://fonts.google.com/specimen/Pragati+Narrow", + "const": "Pragati Narrow" + }, + { + "title": "Praise", + "markdownDescription": "https://fonts.google.com/specimen/Praise", + "const": "Praise" + }, + { + "title": "Prata", + "markdownDescription": "https://fonts.google.com/specimen/Prata", + "const": "Prata" + }, + { + "title": "Preahvihear", + "markdownDescription": "https://fonts.google.com/specimen/Preahvihear", + "const": "Preahvihear" + }, + { + "title": "Press Start 2P", + "markdownDescription": "https://fonts.google.com/specimen/Press+Start+2P", + "const": "Press Start 2P" + }, + { + "title": "Pridi", + "markdownDescription": "https://fonts.google.com/specimen/Pridi", + "const": "Pridi" + }, + { + "title": "Princess Sofia", + "markdownDescription": "https://fonts.google.com/specimen/Princess+Sofia", + "const": "Princess Sofia" + }, + { + "title": "Prociono", + "markdownDescription": "https://fonts.google.com/specimen/Prociono", + "const": "Prociono" + }, + { + "title": "Prompt", + "markdownDescription": "https://fonts.google.com/specimen/Prompt", + "const": "Prompt" + }, + { + "title": "Prosto One", + "markdownDescription": "https://fonts.google.com/specimen/Prosto+One", + "const": "Prosto One" + }, + { + "title": "Proza Libre", + "markdownDescription": "https://fonts.google.com/specimen/Proza+Libre", + "const": "Proza Libre" + }, + { + "title": "Public Sans", + "markdownDescription": "https://fonts.google.com/specimen/Public+Sans", + "const": "Public Sans" + }, + { + "title": "Puppies Play", + "markdownDescription": "https://fonts.google.com/specimen/Puppies+Play", + "const": "Puppies Play" + }, + { + "title": "Puritan", + "markdownDescription": "https://fonts.google.com/specimen/Puritan", + "const": "Puritan" + }, + { + "title": "Purple Purse", + "markdownDescription": "https://fonts.google.com/specimen/Purple+Purse", + "const": "Purple Purse" + }, + { + "title": "Qahiri", + "markdownDescription": "https://fonts.google.com/specimen/Qahiri", + "const": "Qahiri" + }, + { + "title": "Quando", + "markdownDescription": "https://fonts.google.com/specimen/Quando", + "const": "Quando" + }, + { + "title": "Quantico", + "markdownDescription": "https://fonts.google.com/specimen/Quantico", + "const": "Quantico" + }, + { + "title": "Quattrocento", + "markdownDescription": "https://fonts.google.com/specimen/Quattrocento", + "const": "Quattrocento" + }, + { + "title": "Quattrocento Sans", + "markdownDescription": "https://fonts.google.com/specimen/Quattrocento+Sans", + "const": "Quattrocento Sans" + }, + { + "title": "Questrial", + "markdownDescription": "https://fonts.google.com/specimen/Questrial", + "const": "Questrial" + }, + { + "title": "Quicksand", + "markdownDescription": "https://fonts.google.com/specimen/Quicksand", + "const": "Quicksand" + }, + { + "title": "Quintessential", + "markdownDescription": "https://fonts.google.com/specimen/Quintessential", + "const": "Quintessential" + }, + { + "title": "Qwigley", + "markdownDescription": "https://fonts.google.com/specimen/Qwigley", + "const": "Qwigley" + }, + { + "title": "Qwitcher Grypen", + "markdownDescription": "https://fonts.google.com/specimen/Qwitcher+Grypen", + "const": "Qwitcher Grypen" + }, + { + "title": "REM", + "markdownDescription": "https://fonts.google.com/specimen/REM", + "const": "REM" + }, + { + "title": "Racing Sans One", + "markdownDescription": "https://fonts.google.com/specimen/Racing+Sans+One", + "const": "Racing Sans One" + }, + { + "title": "Radio Canada", + "markdownDescription": "https://fonts.google.com/specimen/Radio+Canada", + "const": "Radio Canada" + }, + { + "title": "Radley", + "markdownDescription": "https://fonts.google.com/specimen/Radley", + "const": "Radley" + }, + { + "title": "Rajdhani", + "markdownDescription": "https://fonts.google.com/specimen/Rajdhani", + "const": "Rajdhani" + }, + { + "title": "Rakkas", + "markdownDescription": "https://fonts.google.com/specimen/Rakkas", + "const": "Rakkas" + }, + { + "title": "Raleway", + "markdownDescription": "https://fonts.google.com/specimen/Raleway", + "const": "Raleway" + }, + { + "title": "Raleway Dots", + "markdownDescription": "https://fonts.google.com/specimen/Raleway+Dots", + "const": "Raleway Dots" + }, + { + "title": "Ramabhadra", + "markdownDescription": "https://fonts.google.com/specimen/Ramabhadra", + "const": "Ramabhadra" + }, + { + "title": "Ramaraja", + "markdownDescription": "https://fonts.google.com/specimen/Ramaraja", + "const": "Ramaraja" + }, + { + "title": "Rambla", + "markdownDescription": "https://fonts.google.com/specimen/Rambla", + "const": "Rambla" + }, + { + "title": "Rammetto One", + "markdownDescription": "https://fonts.google.com/specimen/Rammetto+One", + "const": "Rammetto One" + }, + { + "title": "Rampart One", + "markdownDescription": "https://fonts.google.com/specimen/Rampart+One", + "const": "Rampart One" + }, + { + "title": "Ranchers", + "markdownDescription": "https://fonts.google.com/specimen/Ranchers", + "const": "Ranchers" + }, + { + "title": "Rancho", + "markdownDescription": "https://fonts.google.com/specimen/Rancho", + "const": "Rancho" + }, + { + "title": "Ranga", + "markdownDescription": "https://fonts.google.com/specimen/Ranga", + "const": "Ranga" + }, + { + "title": "Rasa", + "markdownDescription": "https://fonts.google.com/specimen/Rasa", + "const": "Rasa" + }, + { + "title": "Rationale", + "markdownDescription": "https://fonts.google.com/specimen/Rationale", + "const": "Rationale" + }, + { + "title": "Ravi Prakash", + "markdownDescription": "https://fonts.google.com/specimen/Ravi+Prakash", + "const": "Ravi Prakash" + }, + { + "title": "Readex Pro", + "markdownDescription": "https://fonts.google.com/specimen/Readex+Pro", + "const": "Readex Pro" + }, + { + "title": "Recursive", + "markdownDescription": "https://fonts.google.com/specimen/Recursive", + "const": "Recursive" + }, + { + "title": "Red Hat Display", + "markdownDescription": "https://fonts.google.com/specimen/Red+Hat+Display", + "const": "Red Hat Display" + }, + { + "title": "Red Hat Mono", + "markdownDescription": "https://fonts.google.com/specimen/Red+Hat+Mono", + "const": "Red Hat Mono" + }, + { + "title": "Red Hat Text", + "markdownDescription": "https://fonts.google.com/specimen/Red+Hat+Text", + "const": "Red Hat Text" + }, + { + "title": "Red Rose", + "markdownDescription": "https://fonts.google.com/specimen/Red+Rose", + "const": "Red Rose" + }, + { + "title": "Redacted", + "markdownDescription": "https://fonts.google.com/specimen/Redacted", + "const": "Redacted" + }, + { + "title": "Redacted Script", + "markdownDescription": "https://fonts.google.com/specimen/Redacted+Script", + "const": "Redacted Script" + }, + { + "title": "Redressed", + "markdownDescription": "https://fonts.google.com/specimen/Redressed", + "const": "Redressed" + }, + { + "title": "Reem Kufi", + "markdownDescription": "https://fonts.google.com/specimen/Reem+Kufi", + "const": "Reem Kufi" + }, + { + "title": "Reem Kufi Fun", + "markdownDescription": "https://fonts.google.com/specimen/Reem+Kufi+Fun", + "const": "Reem Kufi Fun" + }, + { + "title": "Reem Kufi Ink", + "markdownDescription": "https://fonts.google.com/specimen/Reem+Kufi+Ink", + "const": "Reem Kufi Ink" + }, + { + "title": "Reenie Beanie", + "markdownDescription": "https://fonts.google.com/specimen/Reenie+Beanie", + "const": "Reenie Beanie" + }, + { + "title": "Reggae One", + "markdownDescription": "https://fonts.google.com/specimen/Reggae+One", + "const": "Reggae One" + }, + { + "title": "Revalia", + "markdownDescription": "https://fonts.google.com/specimen/Revalia", + "const": "Revalia" + }, + { + "title": "Rhodium Libre", + "markdownDescription": "https://fonts.google.com/specimen/Rhodium+Libre", + "const": "Rhodium Libre" + }, + { + "title": "Ribeye", + "markdownDescription": "https://fonts.google.com/specimen/Ribeye", + "const": "Ribeye" + }, + { + "title": "Ribeye Marrow", + "markdownDescription": "https://fonts.google.com/specimen/Ribeye+Marrow", + "const": "Ribeye Marrow" + }, + { + "title": "Righteous", + "markdownDescription": "https://fonts.google.com/specimen/Righteous", + "const": "Righteous" + }, + { + "title": "Risque", + "markdownDescription": "https://fonts.google.com/specimen/Risque", + "const": "Risque" + }, + { + "title": "Road Rage", + "markdownDescription": "https://fonts.google.com/specimen/Road+Rage", + "const": "Road Rage" + }, + { + "title": "Roboto", + "markdownDescription": "https://fonts.google.com/specimen/Roboto", + "const": "Roboto" + }, + { + "title": "Roboto Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Roboto+Condensed", + "const": "Roboto Condensed" + }, + { + "title": "Roboto Flex", + "markdownDescription": "https://fonts.google.com/specimen/Roboto+Flex", + "const": "Roboto Flex" + }, + { + "title": "Roboto Mono", + "markdownDescription": "https://fonts.google.com/specimen/Roboto+Mono", + "const": "Roboto Mono" + }, + { + "title": "Roboto Serif", + "markdownDescription": "https://fonts.google.com/specimen/Roboto+Serif", + "const": "Roboto Serif" + }, + { + "title": "Roboto Slab", + "markdownDescription": "https://fonts.google.com/specimen/Roboto+Slab", + "const": "Roboto Slab" + }, + { + "title": "Rochester", + "markdownDescription": "https://fonts.google.com/specimen/Rochester", + "const": "Rochester" + }, + { + "title": "Rock 3D", + "markdownDescription": "https://fonts.google.com/specimen/Rock+3D", + "const": "Rock 3D" + }, + { + "title": "Rock Salt", + "markdownDescription": "https://fonts.google.com/specimen/Rock+Salt", + "const": "Rock Salt" + }, + { + "title": "RocknRoll One", + "markdownDescription": "https://fonts.google.com/specimen/RocknRoll+One", + "const": "RocknRoll One" + }, + { + "title": "Rokkitt", + "markdownDescription": "https://fonts.google.com/specimen/Rokkitt", + "const": "Rokkitt" + }, + { + "title": "Romanesco", + "markdownDescription": "https://fonts.google.com/specimen/Romanesco", + "const": "Romanesco" + }, + { + "title": "Ropa Sans", + "markdownDescription": "https://fonts.google.com/specimen/Ropa+Sans", + "const": "Ropa Sans" + }, + { + "title": "Rosario", + "markdownDescription": "https://fonts.google.com/specimen/Rosario", + "const": "Rosario" + }, + { + "title": "Rosarivo", + "markdownDescription": "https://fonts.google.com/specimen/Rosarivo", + "const": "Rosarivo" + }, + { + "title": "Rouge Script", + "markdownDescription": "https://fonts.google.com/specimen/Rouge+Script", + "const": "Rouge Script" + }, + { + "title": "Rowdies", + "markdownDescription": "https://fonts.google.com/specimen/Rowdies", + "const": "Rowdies" + }, + { + "title": "Rozha One", + "markdownDescription": "https://fonts.google.com/specimen/Rozha+One", + "const": "Rozha One" + }, + { + "title": "Rubik", + "markdownDescription": "https://fonts.google.com/specimen/Rubik", + "const": "Rubik" + }, + { + "title": "Rubik 80s Fade", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+80s+Fade", + "const": "Rubik 80s Fade" + }, + { + "title": "Rubik Beastly", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Beastly", + "const": "Rubik Beastly" + }, + { + "title": "Rubik Bubbles", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Bubbles", + "const": "Rubik Bubbles" + }, + { + "title": "Rubik Burned", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Burned", + "const": "Rubik Burned" + }, + { + "title": "Rubik Dirt", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Dirt", + "const": "Rubik Dirt" + }, + { + "title": "Rubik Distressed", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Distressed", + "const": "Rubik Distressed" + }, + { + "title": "Rubik Gemstones", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Gemstones", + "const": "Rubik Gemstones" + }, + { + "title": "Rubik Glitch", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Glitch", + "const": "Rubik Glitch" + }, + { + "title": "Rubik Iso", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Iso", + "const": "Rubik Iso" + }, + { + "title": "Rubik Marker Hatch", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Marker+Hatch", + "const": "Rubik Marker Hatch" + }, + { + "title": "Rubik Maze", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Maze", + "const": "Rubik Maze" + }, + { + "title": "Rubik Microbe", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Microbe", + "const": "Rubik Microbe" + }, + { + "title": "Rubik Mono One", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Mono+One", + "const": "Rubik Mono One" + }, + { + "title": "Rubik Moonrocks", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Moonrocks", + "const": "Rubik Moonrocks" + }, + { + "title": "Rubik Pixels", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Pixels", + "const": "Rubik Pixels" + }, + { + "title": "Rubik Puddles", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Puddles", + "const": "Rubik Puddles" + }, + { + "title": "Rubik Spray Paint", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Spray+Paint", + "const": "Rubik Spray Paint" + }, + { + "title": "Rubik Storm", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Storm", + "const": "Rubik Storm" + }, + { + "title": "Rubik Vinyl", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Vinyl", + "const": "Rubik Vinyl" + }, + { + "title": "Rubik Wet Paint", + "markdownDescription": "https://fonts.google.com/specimen/Rubik+Wet+Paint", + "const": "Rubik Wet Paint" + }, + { + "title": "Ruda", + "markdownDescription": "https://fonts.google.com/specimen/Ruda", + "const": "Ruda" + }, + { + "title": "Rufina", + "markdownDescription": "https://fonts.google.com/specimen/Rufina", + "const": "Rufina" + }, + { + "title": "Ruge Boogie", + "markdownDescription": "https://fonts.google.com/specimen/Ruge+Boogie", + "const": "Ruge Boogie" + }, + { + "title": "Ruluko", + "markdownDescription": "https://fonts.google.com/specimen/Ruluko", + "const": "Ruluko" + }, + { + "title": "Rum Raisin", + "markdownDescription": "https://fonts.google.com/specimen/Rum+Raisin", + "const": "Rum Raisin" + }, + { + "title": "Ruslan Display", + "markdownDescription": "https://fonts.google.com/specimen/Ruslan+Display", + "const": "Ruslan Display" + }, + { + "title": "Russo One", + "markdownDescription": "https://fonts.google.com/specimen/Russo+One", + "const": "Russo One" + }, + { + "title": "Ruthie", + "markdownDescription": "https://fonts.google.com/specimen/Ruthie", + "const": "Ruthie" + }, + { + "title": "Ruwudu", + "markdownDescription": "https://fonts.google.com/specimen/Ruwudu", + "const": "Ruwudu" + }, + { + "title": "Rye", + "markdownDescription": "https://fonts.google.com/specimen/Rye", + "const": "Rye" + }, + { + "title": "STIX Two Text", + "markdownDescription": "https://fonts.google.com/specimen/STIX+Two+Text", + "const": "STIX Two Text" + }, + { + "title": "Sacramento", + "markdownDescription": "https://fonts.google.com/specimen/Sacramento", + "const": "Sacramento" + }, + { + "title": "Sahitya", + "markdownDescription": "https://fonts.google.com/specimen/Sahitya", + "const": "Sahitya" + }, + { + "title": "Sail", + "markdownDescription": "https://fonts.google.com/specimen/Sail", + "const": "Sail" + }, + { + "title": "Saira", + "markdownDescription": "https://fonts.google.com/specimen/Saira", + "const": "Saira" + }, + { + "title": "Saira Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Saira+Condensed", + "const": "Saira Condensed" + }, + { + "title": "Saira Extra Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Saira+Extra+Condensed", + "const": "Saira Extra Condensed" + }, + { + "title": "Saira Semi Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Saira+Semi+Condensed", + "const": "Saira Semi Condensed" + }, + { + "title": "Saira Stencil One", + "markdownDescription": "https://fonts.google.com/specimen/Saira+Stencil+One", + "const": "Saira Stencil One" + }, + { + "title": "Salsa", + "markdownDescription": "https://fonts.google.com/specimen/Salsa", + "const": "Salsa" + }, + { + "title": "Sanchez", + "markdownDescription": "https://fonts.google.com/specimen/Sanchez", + "const": "Sanchez" + }, + { + "title": "Sancreek", + "markdownDescription": "https://fonts.google.com/specimen/Sancreek", + "const": "Sancreek" + }, + { + "title": "Sansita", + "markdownDescription": "https://fonts.google.com/specimen/Sansita", + "const": "Sansita" + }, + { + "title": "Sansita Swashed", + "markdownDescription": "https://fonts.google.com/specimen/Sansita+Swashed", + "const": "Sansita Swashed" + }, + { + "title": "Sarabun", + "markdownDescription": "https://fonts.google.com/specimen/Sarabun", + "const": "Sarabun" + }, + { + "title": "Sarala", + "markdownDescription": "https://fonts.google.com/specimen/Sarala", + "const": "Sarala" + }, + { + "title": "Sarina", + "markdownDescription": "https://fonts.google.com/specimen/Sarina", + "const": "Sarina" + }, + { + "title": "Sarpanch", + "markdownDescription": "https://fonts.google.com/specimen/Sarpanch", + "const": "Sarpanch" + }, + { + "title": "Sassy Frass", + "markdownDescription": "https://fonts.google.com/specimen/Sassy+Frass", + "const": "Sassy Frass" + }, + { + "title": "Satisfy", + "markdownDescription": "https://fonts.google.com/specimen/Satisfy", + "const": "Satisfy" + }, + { + "title": "Sawarabi Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Sawarabi+Gothic", + "const": "Sawarabi Gothic" + }, + { + "title": "Sawarabi Mincho", + "markdownDescription": "https://fonts.google.com/specimen/Sawarabi+Mincho", + "const": "Sawarabi Mincho" + }, + { + "title": "Scada", + "markdownDescription": "https://fonts.google.com/specimen/Scada", + "const": "Scada" + }, + { + "title": "Scheherazade New", + "markdownDescription": "https://fonts.google.com/specimen/Scheherazade+New", + "const": "Scheherazade New" + }, + { + "title": "Schibsted Grotesk", + "markdownDescription": "https://fonts.google.com/specimen/Schibsted+Grotesk", + "const": "Schibsted Grotesk" + }, + { + "title": "Schoolbell", + "markdownDescription": "https://fonts.google.com/specimen/Schoolbell", + "const": "Schoolbell" + }, + { + "title": "Scope One", + "markdownDescription": "https://fonts.google.com/specimen/Scope+One", + "const": "Scope One" + }, + { + "title": "Seaweed Script", + "markdownDescription": "https://fonts.google.com/specimen/Seaweed+Script", + "const": "Seaweed Script" + }, + { + "title": "Secular One", + "markdownDescription": "https://fonts.google.com/specimen/Secular+One", + "const": "Secular One" + }, + { + "title": "Sedgwick Ave", + "markdownDescription": "https://fonts.google.com/specimen/Sedgwick+Ave", + "const": "Sedgwick Ave" + }, + { + "title": "Sedgwick Ave Display", + "markdownDescription": "https://fonts.google.com/specimen/Sedgwick+Ave+Display", + "const": "Sedgwick Ave Display" + }, + { + "title": "Sen", + "markdownDescription": "https://fonts.google.com/specimen/Sen", + "const": "Sen" + }, + { + "title": "Send Flowers", + "markdownDescription": "https://fonts.google.com/specimen/Send+Flowers", + "const": "Send Flowers" + }, + { + "title": "Sevillana", + "markdownDescription": "https://fonts.google.com/specimen/Sevillana", + "const": "Sevillana" + }, + { + "title": "Seymour One", + "markdownDescription": "https://fonts.google.com/specimen/Seymour+One", + "const": "Seymour One" + }, + { + "title": "Shadows Into Light", + "markdownDescription": "https://fonts.google.com/specimen/Shadows+Into+Light", + "const": "Shadows Into Light" + }, + { + "title": "Shadows Into Light Two", + "markdownDescription": "https://fonts.google.com/specimen/Shadows+Into+Light+Two", + "const": "Shadows Into Light Two" + }, + { + "title": "Shalimar", + "markdownDescription": "https://fonts.google.com/specimen/Shalimar", + "const": "Shalimar" + }, + { + "title": "Shantell Sans", + "markdownDescription": "https://fonts.google.com/specimen/Shantell+Sans", + "const": "Shantell Sans" + }, + { + "title": "Shanti", + "markdownDescription": "https://fonts.google.com/specimen/Shanti", + "const": "Shanti" + }, + { + "title": "Share", + "markdownDescription": "https://fonts.google.com/specimen/Share", + "const": "Share" + }, + { + "title": "Share Tech", + "markdownDescription": "https://fonts.google.com/specimen/Share+Tech", + "const": "Share Tech" + }, + { + "title": "Share Tech Mono", + "markdownDescription": "https://fonts.google.com/specimen/Share+Tech+Mono", + "const": "Share Tech Mono" + }, + { + "title": "Shippori Antique", + "markdownDescription": "https://fonts.google.com/specimen/Shippori+Antique", + "const": "Shippori Antique" + }, + { + "title": "Shippori Antique B1", + "markdownDescription": "https://fonts.google.com/specimen/Shippori+Antique+B1", + "const": "Shippori Antique B1" + }, + { + "title": "Shippori Mincho", + "markdownDescription": "https://fonts.google.com/specimen/Shippori+Mincho", + "const": "Shippori Mincho" + }, + { + "title": "Shippori Mincho B1", + "markdownDescription": "https://fonts.google.com/specimen/Shippori+Mincho+B1", + "const": "Shippori Mincho B1" + }, + { + "title": "Shizuru", + "markdownDescription": "https://fonts.google.com/specimen/Shizuru", + "const": "Shizuru" + }, + { + "title": "Shojumaru", + "markdownDescription": "https://fonts.google.com/specimen/Shojumaru", + "const": "Shojumaru" + }, + { + "title": "Short Stack", + "markdownDescription": "https://fonts.google.com/specimen/Short+Stack", + "const": "Short Stack" + }, + { + "title": "Shrikhand", + "markdownDescription": "https://fonts.google.com/specimen/Shrikhand", + "const": "Shrikhand" + }, + { + "title": "Siemreap", + "markdownDescription": "https://fonts.google.com/specimen/Siemreap", + "const": "Siemreap" + }, + { + "title": "Sigmar", + "markdownDescription": "https://fonts.google.com/specimen/Sigmar", + "const": "Sigmar" + }, + { + "title": "Sigmar One", + "markdownDescription": "https://fonts.google.com/specimen/Sigmar+One", + "const": "Sigmar One" + }, + { + "title": "Signika", + "markdownDescription": "https://fonts.google.com/specimen/Signika", + "const": "Signika" + }, + { + "title": "Signika Negative", + "markdownDescription": "https://fonts.google.com/specimen/Signika+Negative", + "const": "Signika Negative" + }, + { + "title": "Silkscreen", + "markdownDescription": "https://fonts.google.com/specimen/Silkscreen", + "const": "Silkscreen" + }, + { + "title": "Simonetta", + "markdownDescription": "https://fonts.google.com/specimen/Simonetta", + "const": "Simonetta" + }, + { + "title": "Single Day", + "markdownDescription": "https://fonts.google.com/specimen/Single+Day", + "const": "Single Day" + }, + { + "title": "Sintony", + "markdownDescription": "https://fonts.google.com/specimen/Sintony", + "const": "Sintony" + }, + { + "title": "Sirin Stencil", + "markdownDescription": "https://fonts.google.com/specimen/Sirin+Stencil", + "const": "Sirin Stencil" + }, + { + "title": "Six Caps", + "markdownDescription": "https://fonts.google.com/specimen/Six+Caps", + "const": "Six Caps" + }, + { + "title": "Skranji", + "markdownDescription": "https://fonts.google.com/specimen/Skranji", + "const": "Skranji" + }, + { + "title": "Slabo 13px", + "markdownDescription": "https://fonts.google.com/specimen/Slabo+13px", + "const": "Slabo 13px" + }, + { + "title": "Slabo 27px", + "markdownDescription": "https://fonts.google.com/specimen/Slabo+27px", + "const": "Slabo 27px" + }, + { + "title": "Slackey", + "markdownDescription": "https://fonts.google.com/specimen/Slackey", + "const": "Slackey" + }, + { + "title": "Slackside One", + "markdownDescription": "https://fonts.google.com/specimen/Slackside+One", + "const": "Slackside One" + }, + { + "title": "Smokum", + "markdownDescription": "https://fonts.google.com/specimen/Smokum", + "const": "Smokum" + }, + { + "title": "Smooch", + "markdownDescription": "https://fonts.google.com/specimen/Smooch", + "const": "Smooch" + }, + { + "title": "Smooch Sans", + "markdownDescription": "https://fonts.google.com/specimen/Smooch+Sans", + "const": "Smooch Sans" + }, + { + "title": "Smythe", + "markdownDescription": "https://fonts.google.com/specimen/Smythe", + "const": "Smythe" + }, + { + "title": "Sniglet", + "markdownDescription": "https://fonts.google.com/specimen/Sniglet", + "const": "Sniglet" + }, + { + "title": "Snippet", + "markdownDescription": "https://fonts.google.com/specimen/Snippet", + "const": "Snippet" + }, + { + "title": "Snowburst One", + "markdownDescription": "https://fonts.google.com/specimen/Snowburst+One", + "const": "Snowburst One" + }, + { + "title": "Sofadi One", + "markdownDescription": "https://fonts.google.com/specimen/Sofadi+One", + "const": "Sofadi One" + }, + { + "title": "Sofia", + "markdownDescription": "https://fonts.google.com/specimen/Sofia", + "const": "Sofia" + }, + { + "title": "Sofia Sans", + "markdownDescription": "https://fonts.google.com/specimen/Sofia+Sans", + "const": "Sofia Sans" + }, + { + "title": "Sofia Sans Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Sofia+Sans+Condensed", + "const": "Sofia Sans Condensed" + }, + { + "title": "Sofia Sans Extra Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Sofia+Sans+Extra+Condensed", + "const": "Sofia Sans Extra Condensed" + }, + { + "title": "Sofia Sans Semi Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Sofia+Sans+Semi+Condensed", + "const": "Sofia Sans Semi Condensed" + }, + { + "title": "Solitreo", + "markdownDescription": "https://fonts.google.com/specimen/Solitreo", + "const": "Solitreo" + }, + { + "title": "Solway", + "markdownDescription": "https://fonts.google.com/specimen/Solway", + "const": "Solway" + }, + { + "title": "Sometype Mono", + "markdownDescription": "https://fonts.google.com/specimen/Sometype+Mono", + "const": "Sometype Mono" + }, + { + "title": "Song Myung", + "markdownDescription": "https://fonts.google.com/specimen/Song+Myung", + "const": "Song Myung" + }, + { + "title": "Sono", + "markdownDescription": "https://fonts.google.com/specimen/Sono", + "const": "Sono" + }, + { + "title": "Sonsie One", + "markdownDescription": "https://fonts.google.com/specimen/Sonsie+One", + "const": "Sonsie One" + }, + { + "title": "Sora", + "markdownDescription": "https://fonts.google.com/specimen/Sora", + "const": "Sora" + }, + { + "title": "Sorts Mill Goudy", + "markdownDescription": "https://fonts.google.com/specimen/Sorts+Mill+Goudy", + "const": "Sorts Mill Goudy" + }, + { + "title": "Source Code Pro", + "markdownDescription": "https://fonts.google.com/specimen/Source+Code+Pro", + "const": "Source Code Pro" + }, + { + "title": "Source Sans 3", + "markdownDescription": "https://fonts.google.com/specimen/Source+Sans+3", + "const": "Source Sans 3" + }, + { + "title": "Source Serif 4", + "markdownDescription": "https://fonts.google.com/specimen/Source+Serif+4", + "const": "Source Serif 4" + }, + { + "title": "Space Grotesk", + "markdownDescription": "https://fonts.google.com/specimen/Space+Grotesk", + "const": "Space Grotesk" + }, + { + "title": "Space Mono", + "markdownDescription": "https://fonts.google.com/specimen/Space+Mono", + "const": "Space Mono" + }, + { + "title": "Special Elite", + "markdownDescription": "https://fonts.google.com/specimen/Special+Elite", + "const": "Special Elite" + }, + { + "title": "Spectral", + "markdownDescription": "https://fonts.google.com/specimen/Spectral", + "const": "Spectral" + }, + { + "title": "Spectral SC", + "markdownDescription": "https://fonts.google.com/specimen/Spectral+SC", + "const": "Spectral SC" + }, + { + "title": "Spicy Rice", + "markdownDescription": "https://fonts.google.com/specimen/Spicy+Rice", + "const": "Spicy Rice" + }, + { + "title": "Spinnaker", + "markdownDescription": "https://fonts.google.com/specimen/Spinnaker", + "const": "Spinnaker" + }, + { + "title": "Spirax", + "markdownDescription": "https://fonts.google.com/specimen/Spirax", + "const": "Spirax" + }, + { + "title": "Splash", + "markdownDescription": "https://fonts.google.com/specimen/Splash", + "const": "Splash" + }, + { + "title": "Spline Sans", + "markdownDescription": "https://fonts.google.com/specimen/Spline+Sans", + "const": "Spline Sans" + }, + { + "title": "Spline Sans Mono", + "markdownDescription": "https://fonts.google.com/specimen/Spline+Sans+Mono", + "const": "Spline Sans Mono" + }, + { + "title": "Squada One", + "markdownDescription": "https://fonts.google.com/specimen/Squada+One", + "const": "Squada One" + }, + { + "title": "Square Peg", + "markdownDescription": "https://fonts.google.com/specimen/Square+Peg", + "const": "Square Peg" + }, + { + "title": "Sree Krushnadevaraya", + "markdownDescription": "https://fonts.google.com/specimen/Sree+Krushnadevaraya", + "const": "Sree Krushnadevaraya" + }, + { + "title": "Sriracha", + "markdownDescription": "https://fonts.google.com/specimen/Sriracha", + "const": "Sriracha" + }, + { + "title": "Srisakdi", + "markdownDescription": "https://fonts.google.com/specimen/Srisakdi", + "const": "Srisakdi" + }, + { + "title": "Staatliches", + "markdownDescription": "https://fonts.google.com/specimen/Staatliches", + "const": "Staatliches" + }, + { + "title": "Stalemate", + "markdownDescription": "https://fonts.google.com/specimen/Stalemate", + "const": "Stalemate" + }, + { + "title": "Stalinist One", + "markdownDescription": "https://fonts.google.com/specimen/Stalinist+One", + "const": "Stalinist One" + }, + { + "title": "Stardos Stencil", + "markdownDescription": "https://fonts.google.com/specimen/Stardos+Stencil", + "const": "Stardos Stencil" + }, + { + "title": "Stick", + "markdownDescription": "https://fonts.google.com/specimen/Stick", + "const": "Stick" + }, + { + "title": "Stick No Bills", + "markdownDescription": "https://fonts.google.com/specimen/Stick+No+Bills", + "const": "Stick No Bills" + }, + { + "title": "Stint Ultra Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Stint+Ultra+Condensed", + "const": "Stint Ultra Condensed" + }, + { + "title": "Stint Ultra Expanded", + "markdownDescription": "https://fonts.google.com/specimen/Stint+Ultra+Expanded", + "const": "Stint Ultra Expanded" + }, + { + "title": "Stoke", + "markdownDescription": "https://fonts.google.com/specimen/Stoke", + "const": "Stoke" + }, + { + "title": "Strait", + "markdownDescription": "https://fonts.google.com/specimen/Strait", + "const": "Strait" + }, + { + "title": "Style Script", + "markdownDescription": "https://fonts.google.com/specimen/Style+Script", + "const": "Style Script" + }, + { + "title": "Stylish", + "markdownDescription": "https://fonts.google.com/specimen/Stylish", + "const": "Stylish" + }, + { + "title": "Sue Ellen Francisco", + "markdownDescription": "https://fonts.google.com/specimen/Sue+Ellen+Francisco", + "const": "Sue Ellen Francisco" + }, + { + "title": "Suez One", + "markdownDescription": "https://fonts.google.com/specimen/Suez+One", + "const": "Suez One" + }, + { + "title": "Sulphur Point", + "markdownDescription": "https://fonts.google.com/specimen/Sulphur+Point", + "const": "Sulphur Point" + }, + { + "title": "Sumana", + "markdownDescription": "https://fonts.google.com/specimen/Sumana", + "const": "Sumana" + }, + { + "title": "Sunflower", + "markdownDescription": "https://fonts.google.com/specimen/Sunflower", + "const": "Sunflower" + }, + { + "title": "Sunshiney", + "markdownDescription": "https://fonts.google.com/specimen/Sunshiney", + "const": "Sunshiney" + }, + { + "title": "Supermercado One", + "markdownDescription": "https://fonts.google.com/specimen/Supermercado+One", + "const": "Supermercado One" + }, + { + "title": "Sura", + "markdownDescription": "https://fonts.google.com/specimen/Sura", + "const": "Sura" + }, + { + "title": "Suranna", + "markdownDescription": "https://fonts.google.com/specimen/Suranna", + "const": "Suranna" + }, + { + "title": "Suravaram", + "markdownDescription": "https://fonts.google.com/specimen/Suravaram", + "const": "Suravaram" + }, + { + "title": "Suwannaphum", + "markdownDescription": "https://fonts.google.com/specimen/Suwannaphum", + "const": "Suwannaphum" + }, + { + "title": "Swanky and Moo Moo", + "markdownDescription": "https://fonts.google.com/specimen/Swanky+and+Moo+Moo", + "const": "Swanky and Moo Moo" + }, + { + "title": "Syncopate", + "markdownDescription": "https://fonts.google.com/specimen/Syncopate", + "const": "Syncopate" + }, + { + "title": "Syne", + "markdownDescription": "https://fonts.google.com/specimen/Syne", + "const": "Syne" + }, + { + "title": "Syne Mono", + "markdownDescription": "https://fonts.google.com/specimen/Syne+Mono", + "const": "Syne Mono" + }, + { + "title": "Syne Tactile", + "markdownDescription": "https://fonts.google.com/specimen/Syne+Tactile", + "const": "Syne Tactile" + }, + { + "title": "Tai Heritage Pro", + "markdownDescription": "https://fonts.google.com/specimen/Tai+Heritage+Pro", + "const": "Tai Heritage Pro" + }, + { + "title": "Tajawal", + "markdownDescription": "https://fonts.google.com/specimen/Tajawal", + "const": "Tajawal" + }, + { + "title": "Tangerine", + "markdownDescription": "https://fonts.google.com/specimen/Tangerine", + "const": "Tangerine" + }, + { + "title": "Tapestry", + "markdownDescription": "https://fonts.google.com/specimen/Tapestry", + "const": "Tapestry" + }, + { + "title": "Taprom", + "markdownDescription": "https://fonts.google.com/specimen/Taprom", + "const": "Taprom" + }, + { + "title": "Tauri", + "markdownDescription": "https://fonts.google.com/specimen/Tauri", + "const": "Tauri" + }, + { + "title": "Taviraj", + "markdownDescription": "https://fonts.google.com/specimen/Taviraj", + "const": "Taviraj" + }, + { + "title": "Teko", + "markdownDescription": "https://fonts.google.com/specimen/Teko", + "const": "Teko" + }, + { + "title": "Tektur", + "markdownDescription": "https://fonts.google.com/specimen/Tektur", + "const": "Tektur" + }, + { + "title": "Telex", + "markdownDescription": "https://fonts.google.com/specimen/Telex", + "const": "Telex" + }, + { + "title": "Tenali Ramakrishna", + "markdownDescription": "https://fonts.google.com/specimen/Tenali+Ramakrishna", + "const": "Tenali Ramakrishna" + }, + { + "title": "Tenor Sans", + "markdownDescription": "https://fonts.google.com/specimen/Tenor+Sans", + "const": "Tenor Sans" + }, + { + "title": "Text Me One", + "markdownDescription": "https://fonts.google.com/specimen/Text+Me+One", + "const": "Text Me One" + }, + { + "title": "Texturina", + "markdownDescription": "https://fonts.google.com/specimen/Texturina", + "const": "Texturina" + }, + { + "title": "Thasadith", + "markdownDescription": "https://fonts.google.com/specimen/Thasadith", + "const": "Thasadith" + }, + { + "title": "The Girl Next Door", + "markdownDescription": "https://fonts.google.com/specimen/The+Girl+Next+Door", + "const": "The Girl Next Door" + }, + { + "title": "The Nautigal", + "markdownDescription": "https://fonts.google.com/specimen/The+Nautigal", + "const": "The Nautigal" + }, + { + "title": "Tienne", + "markdownDescription": "https://fonts.google.com/specimen/Tienne", + "const": "Tienne" + }, + { + "title": "Tillana", + "markdownDescription": "https://fonts.google.com/specimen/Tillana", + "const": "Tillana" + }, + { + "title": "Tilt Neon", + "markdownDescription": "https://fonts.google.com/specimen/Tilt+Neon", + "const": "Tilt Neon" + }, + { + "title": "Tilt Prism", + "markdownDescription": "https://fonts.google.com/specimen/Tilt+Prism", + "const": "Tilt Prism" + }, + { + "title": "Tilt Warp", + "markdownDescription": "https://fonts.google.com/specimen/Tilt+Warp", + "const": "Tilt Warp" + }, + { + "title": "Timmana", + "markdownDescription": "https://fonts.google.com/specimen/Timmana", + "const": "Timmana" + }, + { + "title": "Tinos", + "markdownDescription": "https://fonts.google.com/specimen/Tinos", + "const": "Tinos" + }, + { + "title": "Tiro Bangla", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Bangla", + "const": "Tiro Bangla" + }, + { + "title": "Tiro Devanagari Hindi", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Devanagari+Hindi", + "const": "Tiro Devanagari Hindi" + }, + { + "title": "Tiro Devanagari Marathi", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Devanagari+Marathi", + "const": "Tiro Devanagari Marathi" + }, + { + "title": "Tiro Devanagari Sanskrit", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Devanagari+Sanskrit", + "const": "Tiro Devanagari Sanskrit" + }, + { + "title": "Tiro Gurmukhi", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Gurmukhi", + "const": "Tiro Gurmukhi" + }, + { + "title": "Tiro Kannada", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Kannada", + "const": "Tiro Kannada" + }, + { + "title": "Tiro Tamil", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Tamil", + "const": "Tiro Tamil" + }, + { + "title": "Tiro Telugu", + "markdownDescription": "https://fonts.google.com/specimen/Tiro+Telugu", + "const": "Tiro Telugu" + }, + { + "title": "Titan One", + "markdownDescription": "https://fonts.google.com/specimen/Titan+One", + "const": "Titan One" + }, + { + "title": "Titillium Web", + "markdownDescription": "https://fonts.google.com/specimen/Titillium+Web", + "const": "Titillium Web" + }, + { + "title": "Tomorrow", + "markdownDescription": "https://fonts.google.com/specimen/Tomorrow", + "const": "Tomorrow" + }, + { + "title": "Tourney", + "markdownDescription": "https://fonts.google.com/specimen/Tourney", + "const": "Tourney" + }, + { + "title": "Trade Winds", + "markdownDescription": "https://fonts.google.com/specimen/Trade+Winds", + "const": "Trade Winds" + }, + { + "title": "Train One", + "markdownDescription": "https://fonts.google.com/specimen/Train+One", + "const": "Train One" + }, + { + "title": "Trirong", + "markdownDescription": "https://fonts.google.com/specimen/Trirong", + "const": "Trirong" + }, + { + "title": "Trispace", + "markdownDescription": "https://fonts.google.com/specimen/Trispace", + "const": "Trispace" + }, + { + "title": "Trocchi", + "markdownDescription": "https://fonts.google.com/specimen/Trocchi", + "const": "Trocchi" + }, + { + "title": "Trochut", + "markdownDescription": "https://fonts.google.com/specimen/Trochut", + "const": "Trochut" + }, + { + "title": "Truculenta", + "markdownDescription": "https://fonts.google.com/specimen/Truculenta", + "const": "Truculenta" + }, + { + "title": "Trykker", + "markdownDescription": "https://fonts.google.com/specimen/Trykker", + "const": "Trykker" + }, + { + "title": "Tsukimi Rounded", + "markdownDescription": "https://fonts.google.com/specimen/Tsukimi+Rounded", + "const": "Tsukimi Rounded" + }, + { + "title": "Tulpen One", + "markdownDescription": "https://fonts.google.com/specimen/Tulpen+One", + "const": "Tulpen One" + }, + { + "title": "Turret Road", + "markdownDescription": "https://fonts.google.com/specimen/Turret+Road", + "const": "Turret Road" + }, + { + "title": "Twinkle Star", + "markdownDescription": "https://fonts.google.com/specimen/Twinkle+Star", + "const": "Twinkle Star" + }, + { + "title": "Ubuntu", + "markdownDescription": "https://fonts.google.com/specimen/Ubuntu", + "const": "Ubuntu" + }, + { + "title": "Ubuntu Condensed", + "markdownDescription": "https://fonts.google.com/specimen/Ubuntu+Condensed", + "const": "Ubuntu Condensed" + }, + { + "title": "Ubuntu Mono", + "markdownDescription": "https://fonts.google.com/specimen/Ubuntu+Mono", + "const": "Ubuntu Mono" + }, + { + "title": "Uchen", + "markdownDescription": "https://fonts.google.com/specimen/Uchen", + "const": "Uchen" + }, + { + "title": "Ultra", + "markdownDescription": "https://fonts.google.com/specimen/Ultra", + "const": "Ultra" + }, + { + "title": "Unbounded", + "markdownDescription": "https://fonts.google.com/specimen/Unbounded", + "const": "Unbounded" + }, + { + "title": "Uncial Antiqua", + "markdownDescription": "https://fonts.google.com/specimen/Uncial+Antiqua", + "const": "Uncial Antiqua" + }, + { + "title": "Underdog", + "markdownDescription": "https://fonts.google.com/specimen/Underdog", + "const": "Underdog" + }, + { + "title": "Unica One", + "markdownDescription": "https://fonts.google.com/specimen/Unica+One", + "const": "Unica One" + }, + { + "title": "UnifrakturCook", + "markdownDescription": "https://fonts.google.com/specimen/UnifrakturCook", + "const": "UnifrakturCook" + }, + { + "title": "UnifrakturMaguntia", + "markdownDescription": "https://fonts.google.com/specimen/UnifrakturMaguntia", + "const": "UnifrakturMaguntia" + }, + { + "title": "Unkempt", + "markdownDescription": "https://fonts.google.com/specimen/Unkempt", + "const": "Unkempt" + }, + { + "title": "Unlock", + "markdownDescription": "https://fonts.google.com/specimen/Unlock", + "const": "Unlock" + }, + { + "title": "Unna", + "markdownDescription": "https://fonts.google.com/specimen/Unna", + "const": "Unna" + }, + { + "title": "Updock", + "markdownDescription": "https://fonts.google.com/specimen/Updock", + "const": "Updock" + }, + { + "title": "Urbanist", + "markdownDescription": "https://fonts.google.com/specimen/Urbanist", + "const": "Urbanist" + }, + { + "title": "VT323", + "markdownDescription": "https://fonts.google.com/specimen/VT323", + "const": "VT323" + }, + { + "title": "Vampiro One", + "markdownDescription": "https://fonts.google.com/specimen/Vampiro+One", + "const": "Vampiro One" + }, + { + "title": "Varela", + "markdownDescription": "https://fonts.google.com/specimen/Varela", + "const": "Varela" + }, + { + "title": "Varela Round", + "markdownDescription": "https://fonts.google.com/specimen/Varela+Round", + "const": "Varela Round" + }, + { + "title": "Varta", + "markdownDescription": "https://fonts.google.com/specimen/Varta", + "const": "Varta" + }, + { + "title": "Vast Shadow", + "markdownDescription": "https://fonts.google.com/specimen/Vast+Shadow", + "const": "Vast Shadow" + }, + { + "title": "Vazirmatn", + "markdownDescription": "https://fonts.google.com/specimen/Vazirmatn", + "const": "Vazirmatn" + }, + { + "title": "Vesper Libre", + "markdownDescription": "https://fonts.google.com/specimen/Vesper+Libre", + "const": "Vesper Libre" + }, + { + "title": "Viaoda Libre", + "markdownDescription": "https://fonts.google.com/specimen/Viaoda+Libre", + "const": "Viaoda Libre" + }, + { + "title": "Vibes", + "markdownDescription": "https://fonts.google.com/specimen/Vibes", + "const": "Vibes" + }, + { + "title": "Vibur", + "markdownDescription": "https://fonts.google.com/specimen/Vibur", + "const": "Vibur" + }, + { + "title": "Victor Mono", + "markdownDescription": "https://fonts.google.com/specimen/Victor+Mono", + "const": "Victor Mono" + }, + { + "title": "Vidaloka", + "markdownDescription": "https://fonts.google.com/specimen/Vidaloka", + "const": "Vidaloka" + }, + { + "title": "Viga", + "markdownDescription": "https://fonts.google.com/specimen/Viga", + "const": "Viga" + }, + { + "title": "Vina Sans", + "markdownDescription": "https://fonts.google.com/specimen/Vina+Sans", + "const": "Vina Sans" + }, + { + "title": "Voces", + "markdownDescription": "https://fonts.google.com/specimen/Voces", + "const": "Voces" + }, + { + "title": "Volkhov", + "markdownDescription": "https://fonts.google.com/specimen/Volkhov", + "const": "Volkhov" + }, + { + "title": "Vollkorn", + "markdownDescription": "https://fonts.google.com/specimen/Vollkorn", + "const": "Vollkorn" + }, + { + "title": "Vollkorn SC", + "markdownDescription": "https://fonts.google.com/specimen/Vollkorn+SC", + "const": "Vollkorn SC" + }, + { + "title": "Voltaire", + "markdownDescription": "https://fonts.google.com/specimen/Voltaire", + "const": "Voltaire" + }, + { + "title": "Vujahday Script", + "markdownDescription": "https://fonts.google.com/specimen/Vujahday+Script", + "const": "Vujahday Script" + }, + { + "title": "Waiting for the Sunrise", + "markdownDescription": "https://fonts.google.com/specimen/Waiting+for+the+Sunrise", + "const": "Waiting for the Sunrise" + }, + { + "title": "Wallpoet", + "markdownDescription": "https://fonts.google.com/specimen/Wallpoet", + "const": "Wallpoet" + }, + { + "title": "Walter Turncoat", + "markdownDescription": "https://fonts.google.com/specimen/Walter+Turncoat", + "const": "Walter Turncoat" + }, + { + "title": "Warnes", + "markdownDescription": "https://fonts.google.com/specimen/Warnes", + "const": "Warnes" + }, + { + "title": "Water Brush", + "markdownDescription": "https://fonts.google.com/specimen/Water+Brush", + "const": "Water Brush" + }, + { + "title": "Waterfall", + "markdownDescription": "https://fonts.google.com/specimen/Waterfall", + "const": "Waterfall" + }, + { + "title": "Wavefont", + "markdownDescription": "https://fonts.google.com/specimen/Wavefont", + "const": "Wavefont" + }, + { + "title": "Wellfleet", + "markdownDescription": "https://fonts.google.com/specimen/Wellfleet", + "const": "Wellfleet" + }, + { + "title": "Wendy One", + "markdownDescription": "https://fonts.google.com/specimen/Wendy+One", + "const": "Wendy One" + }, + { + "title": "Whisper", + "markdownDescription": "https://fonts.google.com/specimen/Whisper", + "const": "Whisper" + }, + { + "title": "WindSong", + "markdownDescription": "https://fonts.google.com/specimen/WindSong", + "const": "WindSong" + }, + { + "title": "Wire One", + "markdownDescription": "https://fonts.google.com/specimen/Wire+One", + "const": "Wire One" + }, + { + "title": "Wix Madefor Display", + "markdownDescription": "https://fonts.google.com/specimen/Wix+Madefor+Display", + "const": "Wix Madefor Display" + }, + { + "title": "Wix Madefor Text", + "markdownDescription": "https://fonts.google.com/specimen/Wix+Madefor+Text", + "const": "Wix Madefor Text" + }, + { + "title": "Work Sans", + "markdownDescription": "https://fonts.google.com/specimen/Work+Sans", + "const": "Work Sans" + }, + { + "title": "Xanh Mono", + "markdownDescription": "https://fonts.google.com/specimen/Xanh+Mono", + "const": "Xanh Mono" + }, + { + "title": "Yaldevi", + "markdownDescription": "https://fonts.google.com/specimen/Yaldevi", + "const": "Yaldevi" + }, + { + "title": "Yanone Kaffeesatz", + "markdownDescription": "https://fonts.google.com/specimen/Yanone+Kaffeesatz", + "const": "Yanone Kaffeesatz" + }, + { + "title": "Yantramanav", + "markdownDescription": "https://fonts.google.com/specimen/Yantramanav", + "const": "Yantramanav" + }, + { + "title": "Yatra One", + "markdownDescription": "https://fonts.google.com/specimen/Yatra+One", + "const": "Yatra One" + }, + { + "title": "Yellowtail", + "markdownDescription": "https://fonts.google.com/specimen/Yellowtail", + "const": "Yellowtail" + }, + { + "title": "Yeon Sung", + "markdownDescription": "https://fonts.google.com/specimen/Yeon+Sung", + "const": "Yeon Sung" + }, + { + "title": "Yeseva One", + "markdownDescription": "https://fonts.google.com/specimen/Yeseva+One", + "const": "Yeseva One" + }, + { + "title": "Yesteryear", + "markdownDescription": "https://fonts.google.com/specimen/Yesteryear", + "const": "Yesteryear" + }, + { + "title": "Yomogi", + "markdownDescription": "https://fonts.google.com/specimen/Yomogi", + "const": "Yomogi" + }, + { + "title": "Young Serif", + "markdownDescription": "https://fonts.google.com/specimen/Young+Serif", + "const": "Young Serif" + }, + { + "title": "Yrsa", + "markdownDescription": "https://fonts.google.com/specimen/Yrsa", + "const": "Yrsa" + }, + { + "title": "Ysabeau", + "markdownDescription": "https://fonts.google.com/specimen/Ysabeau", + "const": "Ysabeau" + }, + { + "title": "Ysabeau Infant", + "markdownDescription": "https://fonts.google.com/specimen/Ysabeau+Infant", + "const": "Ysabeau Infant" + }, + { + "title": "Ysabeau Office", + "markdownDescription": "https://fonts.google.com/specimen/Ysabeau+Office", + "const": "Ysabeau Office" + }, + { + "title": "Ysabeau SC", + "markdownDescription": "https://fonts.google.com/specimen/Ysabeau+SC", + "const": "Ysabeau SC" + }, + { + "title": "Yuji Boku", + "markdownDescription": "https://fonts.google.com/specimen/Yuji+Boku", + "const": "Yuji Boku" + }, + { + "title": "Yuji Hentaigana Akari", + "markdownDescription": "https://fonts.google.com/specimen/Yuji+Hentaigana+Akari", + "const": "Yuji Hentaigana Akari" + }, + { + "title": "Yuji Hentaigana Akebono", + "markdownDescription": "https://fonts.google.com/specimen/Yuji+Hentaigana+Akebono", + "const": "Yuji Hentaigana Akebono" + }, + { + "title": "Yuji Mai", + "markdownDescription": "https://fonts.google.com/specimen/Yuji+Mai", + "const": "Yuji Mai" + }, + { + "title": "Yuji Syuku", + "markdownDescription": "https://fonts.google.com/specimen/Yuji+Syuku", + "const": "Yuji Syuku" + }, + { + "title": "Yusei Magic", + "markdownDescription": "https://fonts.google.com/specimen/Yusei+Magic", + "const": "Yusei Magic" + }, + { + "title": "ZCOOL KuaiLe", + "markdownDescription": "https://fonts.google.com/specimen/ZCOOL+KuaiLe", + "const": "ZCOOL KuaiLe" + }, + { + "title": "ZCOOL QingKe HuangYou", + "markdownDescription": "https://fonts.google.com/specimen/ZCOOL+QingKe+HuangYou", + "const": "ZCOOL QingKe HuangYou" + }, + { + "title": "ZCOOL XiaoWei", + "markdownDescription": "https://fonts.google.com/specimen/ZCOOL+XiaoWei", + "const": "ZCOOL XiaoWei" + }, + { + "title": "Zen Antique", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Antique", + "const": "Zen Antique" + }, + { + "title": "Zen Antique Soft", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Antique+Soft", + "const": "Zen Antique Soft" + }, + { + "title": "Zen Dots", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Dots", + "const": "Zen Dots" + }, + { + "title": "Zen Kaku Gothic Antique", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Kaku+Gothic+Antique", + "const": "Zen Kaku Gothic Antique" + }, + { + "title": "Zen Kaku Gothic New", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Kaku+Gothic+New", + "const": "Zen Kaku Gothic New" + }, + { + "title": "Zen Kurenaido", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Kurenaido", + "const": "Zen Kurenaido" + }, + { + "title": "Zen Loop", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Loop", + "const": "Zen Loop" + }, + { + "title": "Zen Maru Gothic", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Maru+Gothic", + "const": "Zen Maru Gothic" + }, + { + "title": "Zen Old Mincho", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Old+Mincho", + "const": "Zen Old Mincho" + }, + { + "title": "Zen Tokyo Zoo", + "markdownDescription": "https://fonts.google.com/specimen/Zen+Tokyo+Zoo", + "const": "Zen Tokyo Zoo" + }, + { + "title": "Zeyada", + "markdownDescription": "https://fonts.google.com/specimen/Zeyada", + "const": "Zeyada" + }, + { + "title": "Zhi Mang Xing", + "markdownDescription": "https://fonts.google.com/specimen/Zhi+Mang+Xing", + "const": "Zhi Mang Xing" + }, + { + "title": "Zilla Slab", + "markdownDescription": "https://fonts.google.com/specimen/Zilla+Slab", + "const": "Zilla Slab" + }, + { + "title": "Zilla Slab Highlight", + "markdownDescription": "https://fonts.google.com/specimen/Zilla+Slab+Highlight", + "const": "Zilla Slab Highlight" + } + ] +} \ No newline at end of file diff --git a/schema/assets/icons.json b/schema/assets/icons.json new file mode 100755 index 0000000..2f4c84f --- /dev/null +++ b/schema/assets/icons.json @@ -0,0 +1,12800 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Icon", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/icons-emojis/#search", + "type": "string", + "enum": [ + "fontawesome/brands/42-group", + "fontawesome/brands/500px", + "fontawesome/brands/accessible-icon", + "fontawesome/brands/accusoft", + "fontawesome/brands/adn", + "fontawesome/brands/adversal", + "fontawesome/brands/affiliatetheme", + "fontawesome/brands/airbnb", + "fontawesome/brands/algolia", + "fontawesome/brands/alipay", + "fontawesome/brands/amazon-pay", + "fontawesome/brands/amazon", + "fontawesome/brands/amilia", + "fontawesome/brands/android", + "fontawesome/brands/angellist", + "fontawesome/brands/angrycreative", + "fontawesome/brands/angular", + "fontawesome/brands/app-store-ios", + "fontawesome/brands/app-store", + "fontawesome/brands/apper", + "fontawesome/brands/apple-pay", + "fontawesome/brands/apple", + "fontawesome/brands/artstation", + "fontawesome/brands/asymmetrik", + "fontawesome/brands/atlassian", + "fontawesome/brands/audible", + "fontawesome/brands/autoprefixer", + "fontawesome/brands/avianex", + "fontawesome/brands/aviato", + "fontawesome/brands/aws", + "fontawesome/brands/bandcamp", + "fontawesome/brands/battle-net", + "fontawesome/brands/behance", + "fontawesome/brands/bilibili", + "fontawesome/brands/bimobject", + "fontawesome/brands/bitbucket", + "fontawesome/brands/bitcoin", + "fontawesome/brands/bity", + "fontawesome/brands/black-tie", + "fontawesome/brands/blackberry", + "fontawesome/brands/blogger-b", + "fontawesome/brands/blogger", + "fontawesome/brands/bluetooth-b", + "fontawesome/brands/bluetooth", + "fontawesome/brands/bootstrap", + "fontawesome/brands/bots", + "fontawesome/brands/btc", + "fontawesome/brands/buffer", + "fontawesome/brands/buromobelexperte", + "fontawesome/brands/buy-n-large", + "fontawesome/brands/buysellads", + "fontawesome/brands/canadian-maple-leaf", + "fontawesome/brands/cc-amazon-pay", + "fontawesome/brands/cc-amex", + "fontawesome/brands/cc-apple-pay", + "fontawesome/brands/cc-diners-club", + "fontawesome/brands/cc-discover", + "fontawesome/brands/cc-jcb", + "fontawesome/brands/cc-mastercard", + "fontawesome/brands/cc-paypal", + "fontawesome/brands/cc-stripe", + "fontawesome/brands/cc-visa", + "fontawesome/brands/centercode", + "fontawesome/brands/centos", + "fontawesome/brands/chrome", + "fontawesome/brands/chromecast", + "fontawesome/brands/cloudflare", + "fontawesome/brands/cloudscale", + "fontawesome/brands/cloudsmith", + "fontawesome/brands/cloudversify", + "fontawesome/brands/cmplid", + "fontawesome/brands/codepen", + "fontawesome/brands/codiepie", + "fontawesome/brands/confluence", + "fontawesome/brands/connectdevelop", + "fontawesome/brands/contao", + "fontawesome/brands/cotton-bureau", + "fontawesome/brands/cpanel", + "fontawesome/brands/creative-commons-by", + "fontawesome/brands/creative-commons-nc-eu", + "fontawesome/brands/creative-commons-nc-jp", + "fontawesome/brands/creative-commons-nc", + "fontawesome/brands/creative-commons-nd", + "fontawesome/brands/creative-commons-pd-alt", + "fontawesome/brands/creative-commons-pd", + "fontawesome/brands/creative-commons-remix", + "fontawesome/brands/creative-commons-sa", + "fontawesome/brands/creative-commons-sampling-plus", + "fontawesome/brands/creative-commons-sampling", + "fontawesome/brands/creative-commons-share", + "fontawesome/brands/creative-commons-zero", + "fontawesome/brands/creative-commons", + "fontawesome/brands/critical-role", + "fontawesome/brands/css3-alt", + "fontawesome/brands/css3", + "fontawesome/brands/cuttlefish", + "fontawesome/brands/d-and-d-beyond", + "fontawesome/brands/d-and-d", + "fontawesome/brands/dailymotion", + "fontawesome/brands/dashcube", + "fontawesome/brands/debian", + "fontawesome/brands/deezer", + "fontawesome/brands/delicious", + "fontawesome/brands/deploydog", + "fontawesome/brands/deskpro", + "fontawesome/brands/dev", + "fontawesome/brands/deviantart", + "fontawesome/brands/dhl", + "fontawesome/brands/diaspora", + "fontawesome/brands/digg", + "fontawesome/brands/digital-ocean", + "fontawesome/brands/discord", + "fontawesome/brands/discourse", + "fontawesome/brands/dochub", + "fontawesome/brands/docker", + "fontawesome/brands/draft2digital", + "fontawesome/brands/dribbble", + "fontawesome/brands/dropbox", + "fontawesome/brands/drupal", + "fontawesome/brands/dyalog", + "fontawesome/brands/earlybirds", + "fontawesome/brands/ebay", + "fontawesome/brands/edge-legacy", + "fontawesome/brands/edge", + "fontawesome/brands/elementor", + "fontawesome/brands/ello", + "fontawesome/brands/ember", + "fontawesome/brands/empire", + "fontawesome/brands/envira", + "fontawesome/brands/erlang", + "fontawesome/brands/ethereum", + "fontawesome/brands/etsy", + "fontawesome/brands/evernote", + "fontawesome/brands/expeditedssl", + "fontawesome/brands/facebook-f", + "fontawesome/brands/facebook-messenger", + "fontawesome/brands/facebook", + "fontawesome/brands/fantasy-flight-games", + "fontawesome/brands/fedex", + "fontawesome/brands/fedora", + "fontawesome/brands/figma", + "fontawesome/brands/firefox-browser", + "fontawesome/brands/firefox", + "fontawesome/brands/first-order-alt", + "fontawesome/brands/first-order", + "fontawesome/brands/firstdraft", + "fontawesome/brands/flickr", + "fontawesome/brands/flipboard", + "fontawesome/brands/fly", + "fontawesome/brands/font-awesome", + "fontawesome/brands/fonticons-fi", + "fontawesome/brands/fonticons", + "fontawesome/brands/fort-awesome-alt", + "fontawesome/brands/fort-awesome", + "fontawesome/brands/forumbee", + "fontawesome/brands/foursquare", + "fontawesome/brands/free-code-camp", + "fontawesome/brands/freebsd", + "fontawesome/brands/fulcrum", + "fontawesome/brands/galactic-republic", + "fontawesome/brands/galactic-senate", + "fontawesome/brands/get-pocket", + "fontawesome/brands/gg-circle", + "fontawesome/brands/gg", + "fontawesome/brands/git-alt", + "fontawesome/brands/git", + "fontawesome/brands/github-alt", + "fontawesome/brands/github", + "fontawesome/brands/gitkraken", + "fontawesome/brands/gitlab", + "fontawesome/brands/gitter", + "fontawesome/brands/glide-g", + "fontawesome/brands/glide", + "fontawesome/brands/gofore", + "fontawesome/brands/golang", + "fontawesome/brands/goodreads-g", + "fontawesome/brands/goodreads", + "fontawesome/brands/google-drive", + "fontawesome/brands/google-pay", + "fontawesome/brands/google-play", + "fontawesome/brands/google-plus-g", + "fontawesome/brands/google-plus", + "fontawesome/brands/google-wallet", + "fontawesome/brands/google", + "fontawesome/brands/gratipay", + "fontawesome/brands/grav", + "fontawesome/brands/gripfire", + "fontawesome/brands/grunt", + "fontawesome/brands/guilded", + "fontawesome/brands/gulp", + "fontawesome/brands/hacker-news", + "fontawesome/brands/hackerrank", + "fontawesome/brands/hashnode", + "fontawesome/brands/hips", + "fontawesome/brands/hire-a-helper", + "fontawesome/brands/hive", + "fontawesome/brands/hooli", + "fontawesome/brands/hornbill", + "fontawesome/brands/hotjar", + "fontawesome/brands/houzz", + "fontawesome/brands/html5", + "fontawesome/brands/hubspot", + "fontawesome/brands/ideal", + "fontawesome/brands/imdb", + "fontawesome/brands/instagram", + "fontawesome/brands/instalod", + "fontawesome/brands/intercom", + "fontawesome/brands/internet-explorer", + "fontawesome/brands/invision", + "fontawesome/brands/ioxhost", + "fontawesome/brands/itch-io", + "fontawesome/brands/itunes-note", + "fontawesome/brands/itunes", + "fontawesome/brands/java", + "fontawesome/brands/jedi-order", + "fontawesome/brands/jenkins", + "fontawesome/brands/jira", + "fontawesome/brands/joget", + "fontawesome/brands/joomla", + "fontawesome/brands/js", + "fontawesome/brands/jsfiddle", + "fontawesome/brands/kaggle", + "fontawesome/brands/keybase", + "fontawesome/brands/keycdn", + "fontawesome/brands/kickstarter-k", + "fontawesome/brands/kickstarter", + "fontawesome/brands/korvue", + "fontawesome/brands/laravel", + "fontawesome/brands/lastfm", + "fontawesome/brands/leanpub", + "fontawesome/brands/less", + "fontawesome/brands/line", + "fontawesome/brands/linkedin-in", + "fontawesome/brands/linkedin", + "fontawesome/brands/linode", + "fontawesome/brands/linux", + "fontawesome/brands/lyft", + "fontawesome/brands/magento", + "fontawesome/brands/mailchimp", + "fontawesome/brands/mandalorian", + "fontawesome/brands/markdown", + "fontawesome/brands/mastodon", + "fontawesome/brands/maxcdn", + "fontawesome/brands/mdb", + "fontawesome/brands/medapps", + "fontawesome/brands/medium", + "fontawesome/brands/medrt", + "fontawesome/brands/meetup", + "fontawesome/brands/megaport", + "fontawesome/brands/mendeley", + "fontawesome/brands/meta", + "fontawesome/brands/microblog", + "fontawesome/brands/microsoft", + "fontawesome/brands/mix", + "fontawesome/brands/mixcloud", + "fontawesome/brands/mixer", + "fontawesome/brands/mizuni", + "fontawesome/brands/modx", + "fontawesome/brands/monero", + "fontawesome/brands/napster", + "fontawesome/brands/neos", + "fontawesome/brands/nfc-directional", + "fontawesome/brands/nfc-symbol", + "fontawesome/brands/nimblr", + "fontawesome/brands/node-js", + "fontawesome/brands/node", + "fontawesome/brands/npm", + "fontawesome/brands/ns8", + "fontawesome/brands/nutritionix", + "fontawesome/brands/octopus-deploy", + "fontawesome/brands/odnoklassniki", + "fontawesome/brands/odysee", + "fontawesome/brands/old-republic", + "fontawesome/brands/opencart", + "fontawesome/brands/openid", + "fontawesome/brands/opera", + "fontawesome/brands/optin-monster", + "fontawesome/brands/orcid", + "fontawesome/brands/osi", + "fontawesome/brands/padlet", + "fontawesome/brands/page4", + "fontawesome/brands/pagelines", + "fontawesome/brands/palfed", + "fontawesome/brands/patreon", + "fontawesome/brands/paypal", + "fontawesome/brands/perbyte", + "fontawesome/brands/periscope", + "fontawesome/brands/phabricator", + "fontawesome/brands/phoenix-framework", + "fontawesome/brands/phoenix-squadron", + "fontawesome/brands/php", + "fontawesome/brands/pied-piper-alt", + "fontawesome/brands/pied-piper-hat", + "fontawesome/brands/pied-piper-pp", + "fontawesome/brands/pied-piper", + "fontawesome/brands/pinterest-p", + "fontawesome/brands/pinterest", + "fontawesome/brands/pix", + "fontawesome/brands/playstation", + "fontawesome/brands/product-hunt", + "fontawesome/brands/pushed", + "fontawesome/brands/python", + "fontawesome/brands/qq", + "fontawesome/brands/quinscape", + "fontawesome/brands/quora", + "fontawesome/brands/r-project", + "fontawesome/brands/raspberry-pi", + "fontawesome/brands/ravelry", + "fontawesome/brands/react", + "fontawesome/brands/reacteurope", + "fontawesome/brands/readme", + "fontawesome/brands/rebel", + "fontawesome/brands/red-river", + "fontawesome/brands/reddit-alien", + "fontawesome/brands/reddit", + "fontawesome/brands/redhat", + "fontawesome/brands/renren", + "fontawesome/brands/replyd", + "fontawesome/brands/researchgate", + "fontawesome/brands/resolving", + "fontawesome/brands/rev", + "fontawesome/brands/rocketchat", + "fontawesome/brands/rockrms", + "fontawesome/brands/rust", + "fontawesome/brands/safari", + "fontawesome/brands/salesforce", + "fontawesome/brands/sass", + "fontawesome/brands/schlix", + "fontawesome/brands/screenpal", + "fontawesome/brands/scribd", + "fontawesome/brands/searchengin", + "fontawesome/brands/sellcast", + "fontawesome/brands/sellsy", + "fontawesome/brands/servicestack", + "fontawesome/brands/shirtsinbulk", + "fontawesome/brands/shopify", + "fontawesome/brands/shopware", + "fontawesome/brands/simplybuilt", + "fontawesome/brands/sistrix", + "fontawesome/brands/sith", + "fontawesome/brands/sitrox", + "fontawesome/brands/sketch", + "fontawesome/brands/skyatlas", + "fontawesome/brands/skype", + "fontawesome/brands/slack", + "fontawesome/brands/slideshare", + "fontawesome/brands/snapchat", + "fontawesome/brands/soundcloud", + "fontawesome/brands/sourcetree", + "fontawesome/brands/space-awesome", + "fontawesome/brands/speakap", + "fontawesome/brands/speaker-deck", + "fontawesome/brands/spotify", + "fontawesome/brands/square-behance", + "fontawesome/brands/square-dribbble", + "fontawesome/brands/square-facebook", + "fontawesome/brands/square-font-awesome-stroke", + "fontawesome/brands/square-font-awesome", + "fontawesome/brands/square-git", + "fontawesome/brands/square-github", + "fontawesome/brands/square-gitlab", + "fontawesome/brands/square-google-plus", + "fontawesome/brands/square-hacker-news", + "fontawesome/brands/square-instagram", + "fontawesome/brands/square-js", + "fontawesome/brands/square-lastfm", + "fontawesome/brands/square-odnoklassniki", + "fontawesome/brands/square-pied-piper", + "fontawesome/brands/square-pinterest", + "fontawesome/brands/square-reddit", + "fontawesome/brands/square-snapchat", + "fontawesome/brands/square-steam", + "fontawesome/brands/square-threads", + "fontawesome/brands/square-tumblr", + "fontawesome/brands/square-twitter", + "fontawesome/brands/square-viadeo", + "fontawesome/brands/square-vimeo", + "fontawesome/brands/square-whatsapp", + "fontawesome/brands/square-x-twitter", + "fontawesome/brands/square-xing", + "fontawesome/brands/square-youtube", + "fontawesome/brands/squarespace", + "fontawesome/brands/stack-exchange", + "fontawesome/brands/stack-overflow", + "fontawesome/brands/stackpath", + "fontawesome/brands/staylinked", + "fontawesome/brands/steam-symbol", + "fontawesome/brands/steam", + "fontawesome/brands/sticker-mule", + "fontawesome/brands/strava", + "fontawesome/brands/stripe-s", + "fontawesome/brands/stripe", + "fontawesome/brands/stubber", + "fontawesome/brands/studiovinari", + "fontawesome/brands/stumbleupon-circle", + "fontawesome/brands/stumbleupon", + "fontawesome/brands/superpowers", + "fontawesome/brands/supple", + "fontawesome/brands/suse", + "fontawesome/brands/swift", + "fontawesome/brands/symfony", + "fontawesome/brands/teamspeak", + "fontawesome/brands/telegram", + "fontawesome/brands/tencent-weibo", + "fontawesome/brands/the-red-yeti", + "fontawesome/brands/themeco", + "fontawesome/brands/themeisle", + "fontawesome/brands/think-peaks", + "fontawesome/brands/threads", + "fontawesome/brands/tiktok", + "fontawesome/brands/trade-federation", + "fontawesome/brands/trello", + "fontawesome/brands/tumblr", + "fontawesome/brands/twitch", + "fontawesome/brands/twitter", + "fontawesome/brands/typo3", + "fontawesome/brands/uber", + "fontawesome/brands/ubuntu", + "fontawesome/brands/uikit", + "fontawesome/brands/umbraco", + "fontawesome/brands/uncharted", + "fontawesome/brands/uniregistry", + "fontawesome/brands/unity", + "fontawesome/brands/unsplash", + "fontawesome/brands/untappd", + "fontawesome/brands/ups", + "fontawesome/brands/usb", + "fontawesome/brands/usps", + "fontawesome/brands/ussunnah", + "fontawesome/brands/vaadin", + "fontawesome/brands/viacoin", + "fontawesome/brands/viadeo", + "fontawesome/brands/viber", + "fontawesome/brands/vimeo-v", + "fontawesome/brands/vimeo", + "fontawesome/brands/vine", + "fontawesome/brands/vk", + "fontawesome/brands/vnv", + "fontawesome/brands/vuejs", + "fontawesome/brands/watchman-monitoring", + "fontawesome/brands/waze", + "fontawesome/brands/weebly", + "fontawesome/brands/weibo", + "fontawesome/brands/weixin", + "fontawesome/brands/whatsapp", + "fontawesome/brands/whmcs", + "fontawesome/brands/wikipedia-w", + "fontawesome/brands/windows", + "fontawesome/brands/wirsindhandwerk", + "fontawesome/brands/wix", + "fontawesome/brands/wizards-of-the-coast", + "fontawesome/brands/wodu", + "fontawesome/brands/wolf-pack-battalion", + "fontawesome/brands/wordpress-simple", + "fontawesome/brands/wordpress", + "fontawesome/brands/wpbeginner", + "fontawesome/brands/wpexplorer", + "fontawesome/brands/wpforms", + "fontawesome/brands/wpressr", + "fontawesome/brands/x-twitter", + "fontawesome/brands/xbox", + "fontawesome/brands/xing", + "fontawesome/brands/y-combinator", + "fontawesome/brands/yahoo", + "fontawesome/brands/yammer", + "fontawesome/brands/yandex-international", + "fontawesome/brands/yandex", + "fontawesome/brands/yarn", + "fontawesome/brands/yelp", + "fontawesome/brands/yoast", + "fontawesome/brands/youtube", + "fontawesome/brands/zhihu", + "fontawesome/regular/address-book", + "fontawesome/regular/address-card", + "fontawesome/regular/bell-slash", + "fontawesome/regular/bell", + "fontawesome/regular/bookmark", + "fontawesome/regular/building", + "fontawesome/regular/calendar-check", + "fontawesome/regular/calendar-days", + "fontawesome/regular/calendar-minus", + "fontawesome/regular/calendar-plus", + "fontawesome/regular/calendar-xmark", + "fontawesome/regular/calendar", + "fontawesome/regular/chart-bar", + "fontawesome/regular/chess-bishop", + "fontawesome/regular/chess-king", + "fontawesome/regular/chess-knight", + "fontawesome/regular/chess-pawn", + "fontawesome/regular/chess-queen", + "fontawesome/regular/chess-rook", + "fontawesome/regular/circle-check", + "fontawesome/regular/circle-dot", + "fontawesome/regular/circle-down", + "fontawesome/regular/circle-left", + "fontawesome/regular/circle-pause", + "fontawesome/regular/circle-play", + "fontawesome/regular/circle-question", + "fontawesome/regular/circle-right", + "fontawesome/regular/circle-stop", + "fontawesome/regular/circle-up", + "fontawesome/regular/circle-user", + "fontawesome/regular/circle-xmark", + "fontawesome/regular/circle", + "fontawesome/regular/clipboard", + "fontawesome/regular/clock", + "fontawesome/regular/clone", + "fontawesome/regular/closed-captioning", + "fontawesome/regular/comment-dots", + "fontawesome/regular/comment", + "fontawesome/regular/comments", + "fontawesome/regular/compass", + "fontawesome/regular/copy", + "fontawesome/regular/copyright", + "fontawesome/regular/credit-card", + "fontawesome/regular/envelope-open", + "fontawesome/regular/envelope", + "fontawesome/regular/eye-slash", + "fontawesome/regular/eye", + "fontawesome/regular/face-angry", + "fontawesome/regular/face-dizzy", + "fontawesome/regular/face-flushed", + "fontawesome/regular/face-frown-open", + "fontawesome/regular/face-frown", + "fontawesome/regular/face-grimace", + "fontawesome/regular/face-grin-beam-sweat", + "fontawesome/regular/face-grin-beam", + "fontawesome/regular/face-grin-hearts", + "fontawesome/regular/face-grin-squint-tears", + "fontawesome/regular/face-grin-squint", + "fontawesome/regular/face-grin-stars", + "fontawesome/regular/face-grin-tears", + "fontawesome/regular/face-grin-tongue-squint", + "fontawesome/regular/face-grin-tongue-wink", + "fontawesome/regular/face-grin-tongue", + "fontawesome/regular/face-grin-wide", + "fontawesome/regular/face-grin-wink", + "fontawesome/regular/face-grin", + "fontawesome/regular/face-kiss-beam", + "fontawesome/regular/face-kiss-wink-heart", + "fontawesome/regular/face-kiss", + "fontawesome/regular/face-laugh-beam", + "fontawesome/regular/face-laugh-squint", + "fontawesome/regular/face-laugh-wink", + "fontawesome/regular/face-laugh", + "fontawesome/regular/face-meh-blank", + "fontawesome/regular/face-meh", + "fontawesome/regular/face-rolling-eyes", + "fontawesome/regular/face-sad-cry", + "fontawesome/regular/face-sad-tear", + "fontawesome/regular/face-smile-beam", + "fontawesome/regular/face-smile-wink", + "fontawesome/regular/face-smile", + "fontawesome/regular/face-surprise", + "fontawesome/regular/face-tired", + "fontawesome/regular/file-audio", + "fontawesome/regular/file-code", + "fontawesome/regular/file-excel", + "fontawesome/regular/file-image", + "fontawesome/regular/file-lines", + "fontawesome/regular/file-pdf", + "fontawesome/regular/file-powerpoint", + "fontawesome/regular/file-video", + "fontawesome/regular/file-word", + "fontawesome/regular/file-zipper", + "fontawesome/regular/file", + "fontawesome/regular/flag", + "fontawesome/regular/floppy-disk", + "fontawesome/regular/folder-closed", + "fontawesome/regular/folder-open", + "fontawesome/regular/folder", + "fontawesome/regular/font-awesome", + "fontawesome/regular/futbol", + "fontawesome/regular/gem", + "fontawesome/regular/hand-back-fist", + "fontawesome/regular/hand-lizard", + "fontawesome/regular/hand-peace", + "fontawesome/regular/hand-point-down", + "fontawesome/regular/hand-point-left", + "fontawesome/regular/hand-point-right", + "fontawesome/regular/hand-point-up", + "fontawesome/regular/hand-pointer", + "fontawesome/regular/hand-scissors", + "fontawesome/regular/hand-spock", + "fontawesome/regular/hand", + "fontawesome/regular/handshake", + "fontawesome/regular/hard-drive", + "fontawesome/regular/heart", + "fontawesome/regular/hospital", + "fontawesome/regular/hourglass-half", + "fontawesome/regular/hourglass", + "fontawesome/regular/id-badge", + "fontawesome/regular/id-card", + "fontawesome/regular/image", + "fontawesome/regular/images", + "fontawesome/regular/keyboard", + "fontawesome/regular/lemon", + "fontawesome/regular/life-ring", + "fontawesome/regular/lightbulb", + "fontawesome/regular/map", + "fontawesome/regular/message", + "fontawesome/regular/money-bill-1", + "fontawesome/regular/moon", + "fontawesome/regular/newspaper", + "fontawesome/regular/note-sticky", + "fontawesome/regular/object-group", + "fontawesome/regular/object-ungroup", + "fontawesome/regular/paper-plane", + "fontawesome/regular/paste", + "fontawesome/regular/pen-to-square", + "fontawesome/regular/rectangle-list", + "fontawesome/regular/rectangle-xmark", + "fontawesome/regular/registered", + "fontawesome/regular/share-from-square", + "fontawesome/regular/snowflake", + "fontawesome/regular/square-caret-down", + "fontawesome/regular/square-caret-left", + "fontawesome/regular/square-caret-right", + "fontawesome/regular/square-caret-up", + "fontawesome/regular/square-check", + "fontawesome/regular/square-full", + "fontawesome/regular/square-minus", + "fontawesome/regular/square-plus", + "fontawesome/regular/square", + "fontawesome/regular/star-half-stroke", + "fontawesome/regular/star-half", + "fontawesome/regular/star", + "fontawesome/regular/sun", + "fontawesome/regular/thumbs-down", + "fontawesome/regular/thumbs-up", + "fontawesome/regular/trash-can", + "fontawesome/regular/user", + "fontawesome/regular/window-maximize", + "fontawesome/regular/window-minimize", + "fontawesome/regular/window-restore", + "fontawesome/solid/0", + "fontawesome/solid/1", + "fontawesome/solid/2", + "fontawesome/solid/3", + "fontawesome/solid/4", + "fontawesome/solid/5", + "fontawesome/solid/6", + "fontawesome/solid/7", + "fontawesome/solid/8", + "fontawesome/solid/9", + "fontawesome/solid/a", + "fontawesome/solid/address-book", + "fontawesome/solid/address-card", + "fontawesome/solid/align-center", + "fontawesome/solid/align-justify", + "fontawesome/solid/align-left", + "fontawesome/solid/align-right", + "fontawesome/solid/anchor-circle-check", + "fontawesome/solid/anchor-circle-exclamation", + "fontawesome/solid/anchor-circle-xmark", + "fontawesome/solid/anchor-lock", + "fontawesome/solid/anchor", + "fontawesome/solid/angle-down", + "fontawesome/solid/angle-left", + "fontawesome/solid/angle-right", + "fontawesome/solid/angle-up", + "fontawesome/solid/angles-down", + "fontawesome/solid/angles-left", + "fontawesome/solid/angles-right", + "fontawesome/solid/angles-up", + "fontawesome/solid/ankh", + "fontawesome/solid/apple-whole", + "fontawesome/solid/archway", + "fontawesome/solid/arrow-down-1-9", + "fontawesome/solid/arrow-down-9-1", + "fontawesome/solid/arrow-down-a-z", + "fontawesome/solid/arrow-down-long", + "fontawesome/solid/arrow-down-short-wide", + "fontawesome/solid/arrow-down-up-across-line", + "fontawesome/solid/arrow-down-up-lock", + "fontawesome/solid/arrow-down-wide-short", + "fontawesome/solid/arrow-down-z-a", + "fontawesome/solid/arrow-down", + "fontawesome/solid/arrow-left-long", + "fontawesome/solid/arrow-left", + "fontawesome/solid/arrow-pointer", + "fontawesome/solid/arrow-right-arrow-left", + "fontawesome/solid/arrow-right-from-bracket", + "fontawesome/solid/arrow-right-long", + "fontawesome/solid/arrow-right-to-bracket", + "fontawesome/solid/arrow-right-to-city", + "fontawesome/solid/arrow-right", + "fontawesome/solid/arrow-rotate-left", + "fontawesome/solid/arrow-rotate-right", + "fontawesome/solid/arrow-trend-down", + "fontawesome/solid/arrow-trend-up", + "fontawesome/solid/arrow-turn-down", + "fontawesome/solid/arrow-turn-up", + "fontawesome/solid/arrow-up-1-9", + "fontawesome/solid/arrow-up-9-1", + "fontawesome/solid/arrow-up-a-z", + "fontawesome/solid/arrow-up-from-bracket", + "fontawesome/solid/arrow-up-from-ground-water", + "fontawesome/solid/arrow-up-from-water-pump", + "fontawesome/solid/arrow-up-long", + "fontawesome/solid/arrow-up-right-dots", + "fontawesome/solid/arrow-up-right-from-square", + "fontawesome/solid/arrow-up-short-wide", + "fontawesome/solid/arrow-up-wide-short", + "fontawesome/solid/arrow-up-z-a", + "fontawesome/solid/arrow-up", + "fontawesome/solid/arrows-down-to-line", + "fontawesome/solid/arrows-down-to-people", + "fontawesome/solid/arrows-left-right-to-line", + "fontawesome/solid/arrows-left-right", + "fontawesome/solid/arrows-rotate", + "fontawesome/solid/arrows-spin", + "fontawesome/solid/arrows-split-up-and-left", + "fontawesome/solid/arrows-to-circle", + "fontawesome/solid/arrows-to-dot", + "fontawesome/solid/arrows-to-eye", + "fontawesome/solid/arrows-turn-right", + "fontawesome/solid/arrows-turn-to-dots", + "fontawesome/solid/arrows-up-down-left-right", + "fontawesome/solid/arrows-up-down", + "fontawesome/solid/arrows-up-to-line", + "fontawesome/solid/asterisk", + "fontawesome/solid/at", + "fontawesome/solid/atom", + "fontawesome/solid/audio-description", + "fontawesome/solid/austral-sign", + "fontawesome/solid/award", + "fontawesome/solid/b", + "fontawesome/solid/baby-carriage", + "fontawesome/solid/baby", + "fontawesome/solid/backward-fast", + "fontawesome/solid/backward-step", + "fontawesome/solid/backward", + "fontawesome/solid/bacon", + "fontawesome/solid/bacteria", + "fontawesome/solid/bacterium", + "fontawesome/solid/bag-shopping", + "fontawesome/solid/bahai", + "fontawesome/solid/baht-sign", + "fontawesome/solid/ban-smoking", + "fontawesome/solid/ban", + "fontawesome/solid/bandage", + "fontawesome/solid/bangladeshi-taka-sign", + "fontawesome/solid/barcode", + "fontawesome/solid/bars-progress", + "fontawesome/solid/bars-staggered", + "fontawesome/solid/bars", + "fontawesome/solid/baseball-bat-ball", + "fontawesome/solid/baseball", + "fontawesome/solid/basket-shopping", + "fontawesome/solid/basketball", + "fontawesome/solid/bath", + "fontawesome/solid/battery-empty", + "fontawesome/solid/battery-full", + "fontawesome/solid/battery-half", + "fontawesome/solid/battery-quarter", + "fontawesome/solid/battery-three-quarters", + "fontawesome/solid/bed-pulse", + "fontawesome/solid/bed", + "fontawesome/solid/beer-mug-empty", + "fontawesome/solid/bell-concierge", + "fontawesome/solid/bell-slash", + "fontawesome/solid/bell", + "fontawesome/solid/bezier-curve", + "fontawesome/solid/bicycle", + "fontawesome/solid/binoculars", + "fontawesome/solid/biohazard", + "fontawesome/solid/bitcoin-sign", + "fontawesome/solid/blender-phone", + "fontawesome/solid/blender", + "fontawesome/solid/blog", + "fontawesome/solid/bold", + "fontawesome/solid/bolt-lightning", + "fontawesome/solid/bolt", + "fontawesome/solid/bomb", + "fontawesome/solid/bone", + "fontawesome/solid/bong", + "fontawesome/solid/book-atlas", + "fontawesome/solid/book-bible", + "fontawesome/solid/book-bookmark", + "fontawesome/solid/book-journal-whills", + "fontawesome/solid/book-medical", + "fontawesome/solid/book-open-reader", + "fontawesome/solid/book-open", + "fontawesome/solid/book-quran", + "fontawesome/solid/book-skull", + "fontawesome/solid/book-tanakh", + "fontawesome/solid/book", + "fontawesome/solid/bookmark", + "fontawesome/solid/border-all", + "fontawesome/solid/border-none", + "fontawesome/solid/border-top-left", + "fontawesome/solid/bore-hole", + "fontawesome/solid/bottle-droplet", + "fontawesome/solid/bottle-water", + "fontawesome/solid/bowl-food", + "fontawesome/solid/bowl-rice", + "fontawesome/solid/bowling-ball", + "fontawesome/solid/box-archive", + "fontawesome/solid/box-open", + "fontawesome/solid/box-tissue", + "fontawesome/solid/box", + "fontawesome/solid/boxes-packing", + "fontawesome/solid/boxes-stacked", + "fontawesome/solid/braille", + "fontawesome/solid/brain", + "fontawesome/solid/brazilian-real-sign", + "fontawesome/solid/bread-slice", + "fontawesome/solid/bridge-circle-check", + "fontawesome/solid/bridge-circle-exclamation", + "fontawesome/solid/bridge-circle-xmark", + "fontawesome/solid/bridge-lock", + "fontawesome/solid/bridge-water", + "fontawesome/solid/bridge", + "fontawesome/solid/briefcase-medical", + "fontawesome/solid/briefcase", + "fontawesome/solid/broom-ball", + "fontawesome/solid/broom", + "fontawesome/solid/brush", + "fontawesome/solid/bucket", + "fontawesome/solid/bug-slash", + "fontawesome/solid/bug", + "fontawesome/solid/bugs", + "fontawesome/solid/building-circle-arrow-right", + "fontawesome/solid/building-circle-check", + "fontawesome/solid/building-circle-exclamation", + "fontawesome/solid/building-circle-xmark", + "fontawesome/solid/building-columns", + "fontawesome/solid/building-flag", + "fontawesome/solid/building-lock", + "fontawesome/solid/building-ngo", + "fontawesome/solid/building-shield", + "fontawesome/solid/building-un", + "fontawesome/solid/building-user", + "fontawesome/solid/building-wheat", + "fontawesome/solid/building", + "fontawesome/solid/bullhorn", + "fontawesome/solid/bullseye", + "fontawesome/solid/burger", + "fontawesome/solid/burst", + "fontawesome/solid/bus-simple", + "fontawesome/solid/bus", + "fontawesome/solid/business-time", + "fontawesome/solid/c", + "fontawesome/solid/cable-car", + "fontawesome/solid/cake-candles", + "fontawesome/solid/calculator", + "fontawesome/solid/calendar-check", + "fontawesome/solid/calendar-day", + "fontawesome/solid/calendar-days", + "fontawesome/solid/calendar-minus", + "fontawesome/solid/calendar-plus", + "fontawesome/solid/calendar-week", + "fontawesome/solid/calendar-xmark", + "fontawesome/solid/calendar", + "fontawesome/solid/camera-retro", + "fontawesome/solid/camera-rotate", + "fontawesome/solid/camera", + "fontawesome/solid/campground", + "fontawesome/solid/candy-cane", + "fontawesome/solid/cannabis", + "fontawesome/solid/capsules", + "fontawesome/solid/car-battery", + "fontawesome/solid/car-burst", + "fontawesome/solid/car-on", + "fontawesome/solid/car-rear", + "fontawesome/solid/car-side", + "fontawesome/solid/car-tunnel", + "fontawesome/solid/car", + "fontawesome/solid/caravan", + "fontawesome/solid/caret-down", + "fontawesome/solid/caret-left", + "fontawesome/solid/caret-right", + "fontawesome/solid/caret-up", + "fontawesome/solid/carrot", + "fontawesome/solid/cart-arrow-down", + "fontawesome/solid/cart-flatbed-suitcase", + "fontawesome/solid/cart-flatbed", + "fontawesome/solid/cart-plus", + "fontawesome/solid/cart-shopping", + "fontawesome/solid/cash-register", + "fontawesome/solid/cat", + "fontawesome/solid/cedi-sign", + "fontawesome/solid/cent-sign", + "fontawesome/solid/certificate", + "fontawesome/solid/chair", + "fontawesome/solid/chalkboard-user", + "fontawesome/solid/chalkboard", + "fontawesome/solid/champagne-glasses", + "fontawesome/solid/charging-station", + "fontawesome/solid/chart-area", + "fontawesome/solid/chart-bar", + "fontawesome/solid/chart-column", + "fontawesome/solid/chart-gantt", + "fontawesome/solid/chart-line", + "fontawesome/solid/chart-pie", + "fontawesome/solid/chart-simple", + "fontawesome/solid/check-double", + "fontawesome/solid/check-to-slot", + "fontawesome/solid/check", + "fontawesome/solid/cheese", + "fontawesome/solid/chess-bishop", + "fontawesome/solid/chess-board", + "fontawesome/solid/chess-king", + "fontawesome/solid/chess-knight", + "fontawesome/solid/chess-pawn", + "fontawesome/solid/chess-queen", + "fontawesome/solid/chess-rook", + "fontawesome/solid/chess", + "fontawesome/solid/chevron-down", + "fontawesome/solid/chevron-left", + "fontawesome/solid/chevron-right", + "fontawesome/solid/chevron-up", + "fontawesome/solid/child-combatant", + "fontawesome/solid/child-dress", + "fontawesome/solid/child-reaching", + "fontawesome/solid/child", + "fontawesome/solid/children", + "fontawesome/solid/church", + "fontawesome/solid/circle-arrow-down", + "fontawesome/solid/circle-arrow-left", + "fontawesome/solid/circle-arrow-right", + "fontawesome/solid/circle-arrow-up", + "fontawesome/solid/circle-check", + "fontawesome/solid/circle-chevron-down", + "fontawesome/solid/circle-chevron-left", + "fontawesome/solid/circle-chevron-right", + "fontawesome/solid/circle-chevron-up", + "fontawesome/solid/circle-dollar-to-slot", + "fontawesome/solid/circle-dot", + "fontawesome/solid/circle-down", + "fontawesome/solid/circle-exclamation", + "fontawesome/solid/circle-h", + "fontawesome/solid/circle-half-stroke", + "fontawesome/solid/circle-info", + "fontawesome/solid/circle-left", + "fontawesome/solid/circle-minus", + "fontawesome/solid/circle-nodes", + "fontawesome/solid/circle-notch", + "fontawesome/solid/circle-pause", + "fontawesome/solid/circle-play", + "fontawesome/solid/circle-plus", + "fontawesome/solid/circle-question", + "fontawesome/solid/circle-radiation", + "fontawesome/solid/circle-right", + "fontawesome/solid/circle-stop", + "fontawesome/solid/circle-up", + "fontawesome/solid/circle-user", + "fontawesome/solid/circle-xmark", + "fontawesome/solid/circle", + "fontawesome/solid/city", + "fontawesome/solid/clapperboard", + "fontawesome/solid/clipboard-check", + "fontawesome/solid/clipboard-list", + "fontawesome/solid/clipboard-question", + "fontawesome/solid/clipboard-user", + "fontawesome/solid/clipboard", + "fontawesome/solid/clock-rotate-left", + "fontawesome/solid/clock", + "fontawesome/solid/clone", + "fontawesome/solid/closed-captioning", + "fontawesome/solid/cloud-arrow-down", + "fontawesome/solid/cloud-arrow-up", + "fontawesome/solid/cloud-bolt", + "fontawesome/solid/cloud-meatball", + "fontawesome/solid/cloud-moon-rain", + "fontawesome/solid/cloud-moon", + "fontawesome/solid/cloud-rain", + "fontawesome/solid/cloud-showers-heavy", + "fontawesome/solid/cloud-showers-water", + "fontawesome/solid/cloud-sun-rain", + "fontawesome/solid/cloud-sun", + "fontawesome/solid/cloud", + "fontawesome/solid/clover", + "fontawesome/solid/code-branch", + "fontawesome/solid/code-commit", + "fontawesome/solid/code-compare", + "fontawesome/solid/code-fork", + "fontawesome/solid/code-merge", + "fontawesome/solid/code-pull-request", + "fontawesome/solid/code", + "fontawesome/solid/coins", + "fontawesome/solid/colon-sign", + "fontawesome/solid/comment-dollar", + "fontawesome/solid/comment-dots", + "fontawesome/solid/comment-medical", + "fontawesome/solid/comment-slash", + "fontawesome/solid/comment-sms", + "fontawesome/solid/comment", + "fontawesome/solid/comments-dollar", + "fontawesome/solid/comments", + "fontawesome/solid/compact-disc", + "fontawesome/solid/compass-drafting", + "fontawesome/solid/compass", + "fontawesome/solid/compress", + "fontawesome/solid/computer-mouse", + "fontawesome/solid/computer", + "fontawesome/solid/cookie-bite", + "fontawesome/solid/cookie", + "fontawesome/solid/copy", + "fontawesome/solid/copyright", + "fontawesome/solid/couch", + "fontawesome/solid/cow", + "fontawesome/solid/credit-card", + "fontawesome/solid/crop-simple", + "fontawesome/solid/crop", + "fontawesome/solid/cross", + "fontawesome/solid/crosshairs", + "fontawesome/solid/crow", + "fontawesome/solid/crown", + "fontawesome/solid/crutch", + "fontawesome/solid/cruzeiro-sign", + "fontawesome/solid/cube", + "fontawesome/solid/cubes-stacked", + "fontawesome/solid/cubes", + "fontawesome/solid/d", + "fontawesome/solid/database", + "fontawesome/solid/delete-left", + "fontawesome/solid/democrat", + "fontawesome/solid/desktop", + "fontawesome/solid/dharmachakra", + "fontawesome/solid/diagram-next", + "fontawesome/solid/diagram-predecessor", + "fontawesome/solid/diagram-project", + "fontawesome/solid/diagram-successor", + "fontawesome/solid/diamond-turn-right", + "fontawesome/solid/diamond", + "fontawesome/solid/dice-d20", + "fontawesome/solid/dice-d6", + "fontawesome/solid/dice-five", + "fontawesome/solid/dice-four", + "fontawesome/solid/dice-one", + "fontawesome/solid/dice-six", + "fontawesome/solid/dice-three", + "fontawesome/solid/dice-two", + "fontawesome/solid/dice", + "fontawesome/solid/disease", + "fontawesome/solid/display", + "fontawesome/solid/divide", + "fontawesome/solid/dna", + "fontawesome/solid/dog", + "fontawesome/solid/dollar-sign", + "fontawesome/solid/dolly", + "fontawesome/solid/dong-sign", + "fontawesome/solid/door-closed", + "fontawesome/solid/door-open", + "fontawesome/solid/dove", + "fontawesome/solid/down-left-and-up-right-to-center", + "fontawesome/solid/down-long", + "fontawesome/solid/download", + "fontawesome/solid/dragon", + "fontawesome/solid/draw-polygon", + "fontawesome/solid/droplet-slash", + "fontawesome/solid/droplet", + "fontawesome/solid/drum-steelpan", + "fontawesome/solid/drum", + "fontawesome/solid/drumstick-bite", + "fontawesome/solid/dumbbell", + "fontawesome/solid/dumpster-fire", + "fontawesome/solid/dumpster", + "fontawesome/solid/dungeon", + "fontawesome/solid/e", + "fontawesome/solid/ear-deaf", + "fontawesome/solid/ear-listen", + "fontawesome/solid/earth-africa", + "fontawesome/solid/earth-americas", + "fontawesome/solid/earth-asia", + "fontawesome/solid/earth-europe", + "fontawesome/solid/earth-oceania", + "fontawesome/solid/egg", + "fontawesome/solid/eject", + "fontawesome/solid/elevator", + "fontawesome/solid/ellipsis-vertical", + "fontawesome/solid/ellipsis", + "fontawesome/solid/envelope-circle-check", + "fontawesome/solid/envelope-open-text", + "fontawesome/solid/envelope-open", + "fontawesome/solid/envelope", + "fontawesome/solid/envelopes-bulk", + "fontawesome/solid/equals", + "fontawesome/solid/eraser", + "fontawesome/solid/ethernet", + "fontawesome/solid/euro-sign", + "fontawesome/solid/exclamation", + "fontawesome/solid/expand", + "fontawesome/solid/explosion", + "fontawesome/solid/eye-dropper", + "fontawesome/solid/eye-low-vision", + "fontawesome/solid/eye-slash", + "fontawesome/solid/eye", + "fontawesome/solid/f", + "fontawesome/solid/face-angry", + "fontawesome/solid/face-dizzy", + "fontawesome/solid/face-flushed", + "fontawesome/solid/face-frown-open", + "fontawesome/solid/face-frown", + "fontawesome/solid/face-grimace", + "fontawesome/solid/face-grin-beam-sweat", + "fontawesome/solid/face-grin-beam", + "fontawesome/solid/face-grin-hearts", + "fontawesome/solid/face-grin-squint-tears", + "fontawesome/solid/face-grin-squint", + "fontawesome/solid/face-grin-stars", + "fontawesome/solid/face-grin-tears", + "fontawesome/solid/face-grin-tongue-squint", + "fontawesome/solid/face-grin-tongue-wink", + "fontawesome/solid/face-grin-tongue", + "fontawesome/solid/face-grin-wide", + "fontawesome/solid/face-grin-wink", + "fontawesome/solid/face-grin", + "fontawesome/solid/face-kiss-beam", + "fontawesome/solid/face-kiss-wink-heart", + "fontawesome/solid/face-kiss", + "fontawesome/solid/face-laugh-beam", + "fontawesome/solid/face-laugh-squint", + "fontawesome/solid/face-laugh-wink", + "fontawesome/solid/face-laugh", + "fontawesome/solid/face-meh-blank", + "fontawesome/solid/face-meh", + "fontawesome/solid/face-rolling-eyes", + "fontawesome/solid/face-sad-cry", + "fontawesome/solid/face-sad-tear", + "fontawesome/solid/face-smile-beam", + "fontawesome/solid/face-smile-wink", + "fontawesome/solid/face-smile", + "fontawesome/solid/face-surprise", + "fontawesome/solid/face-tired", + "fontawesome/solid/fan", + "fontawesome/solid/faucet-drip", + "fontawesome/solid/faucet", + "fontawesome/solid/fax", + "fontawesome/solid/feather-pointed", + "fontawesome/solid/feather", + "fontawesome/solid/ferry", + "fontawesome/solid/file-arrow-down", + "fontawesome/solid/file-arrow-up", + "fontawesome/solid/file-audio", + "fontawesome/solid/file-circle-check", + "fontawesome/solid/file-circle-exclamation", + "fontawesome/solid/file-circle-minus", + "fontawesome/solid/file-circle-plus", + "fontawesome/solid/file-circle-question", + "fontawesome/solid/file-circle-xmark", + "fontawesome/solid/file-code", + "fontawesome/solid/file-contract", + "fontawesome/solid/file-csv", + "fontawesome/solid/file-excel", + "fontawesome/solid/file-export", + "fontawesome/solid/file-image", + "fontawesome/solid/file-import", + "fontawesome/solid/file-invoice-dollar", + "fontawesome/solid/file-invoice", + "fontawesome/solid/file-lines", + "fontawesome/solid/file-medical", + "fontawesome/solid/file-pdf", + "fontawesome/solid/file-pen", + "fontawesome/solid/file-powerpoint", + "fontawesome/solid/file-prescription", + "fontawesome/solid/file-shield", + "fontawesome/solid/file-signature", + "fontawesome/solid/file-video", + "fontawesome/solid/file-waveform", + "fontawesome/solid/file-word", + "fontawesome/solid/file-zipper", + "fontawesome/solid/file", + "fontawesome/solid/fill-drip", + "fontawesome/solid/fill", + "fontawesome/solid/film", + "fontawesome/solid/filter-circle-dollar", + "fontawesome/solid/filter-circle-xmark", + "fontawesome/solid/filter", + "fontawesome/solid/fingerprint", + "fontawesome/solid/fire-burner", + "fontawesome/solid/fire-extinguisher", + "fontawesome/solid/fire-flame-curved", + "fontawesome/solid/fire-flame-simple", + "fontawesome/solid/fire", + "fontawesome/solid/fish-fins", + "fontawesome/solid/fish", + "fontawesome/solid/flag-checkered", + "fontawesome/solid/flag-usa", + "fontawesome/solid/flag", + "fontawesome/solid/flask-vial", + "fontawesome/solid/flask", + "fontawesome/solid/floppy-disk", + "fontawesome/solid/florin-sign", + "fontawesome/solid/folder-closed", + "fontawesome/solid/folder-minus", + "fontawesome/solid/folder-open", + "fontawesome/solid/folder-plus", + "fontawesome/solid/folder-tree", + "fontawesome/solid/folder", + "fontawesome/solid/font-awesome", + "fontawesome/solid/font", + "fontawesome/solid/football", + "fontawesome/solid/forward-fast", + "fontawesome/solid/forward-step", + "fontawesome/solid/forward", + "fontawesome/solid/franc-sign", + "fontawesome/solid/frog", + "fontawesome/solid/futbol", + "fontawesome/solid/g", + "fontawesome/solid/gamepad", + "fontawesome/solid/gas-pump", + "fontawesome/solid/gauge-high", + "fontawesome/solid/gauge-simple-high", + "fontawesome/solid/gauge-simple", + "fontawesome/solid/gauge", + "fontawesome/solid/gavel", + "fontawesome/solid/gear", + "fontawesome/solid/gears", + "fontawesome/solid/gem", + "fontawesome/solid/genderless", + "fontawesome/solid/ghost", + "fontawesome/solid/gift", + "fontawesome/solid/gifts", + "fontawesome/solid/glass-water-droplet", + "fontawesome/solid/glass-water", + "fontawesome/solid/glasses", + "fontawesome/solid/globe", + "fontawesome/solid/golf-ball-tee", + "fontawesome/solid/gopuram", + "fontawesome/solid/graduation-cap", + "fontawesome/solid/greater-than-equal", + "fontawesome/solid/greater-than", + "fontawesome/solid/grip-lines-vertical", + "fontawesome/solid/grip-lines", + "fontawesome/solid/grip-vertical", + "fontawesome/solid/grip", + "fontawesome/solid/group-arrows-rotate", + "fontawesome/solid/guarani-sign", + "fontawesome/solid/guitar", + "fontawesome/solid/gun", + "fontawesome/solid/h", + "fontawesome/solid/hammer", + "fontawesome/solid/hamsa", + "fontawesome/solid/hand-back-fist", + "fontawesome/solid/hand-dots", + "fontawesome/solid/hand-fist", + "fontawesome/solid/hand-holding-dollar", + "fontawesome/solid/hand-holding-droplet", + "fontawesome/solid/hand-holding-hand", + "fontawesome/solid/hand-holding-heart", + "fontawesome/solid/hand-holding-medical", + "fontawesome/solid/hand-holding", + "fontawesome/solid/hand-lizard", + "fontawesome/solid/hand-middle-finger", + "fontawesome/solid/hand-peace", + "fontawesome/solid/hand-point-down", + "fontawesome/solid/hand-point-left", + "fontawesome/solid/hand-point-right", + "fontawesome/solid/hand-point-up", + "fontawesome/solid/hand-pointer", + "fontawesome/solid/hand-scissors", + "fontawesome/solid/hand-sparkles", + "fontawesome/solid/hand-spock", + "fontawesome/solid/hand", + "fontawesome/solid/handcuffs", + "fontawesome/solid/hands-asl-interpreting", + "fontawesome/solid/hands-bound", + "fontawesome/solid/hands-bubbles", + "fontawesome/solid/hands-clapping", + "fontawesome/solid/hands-holding-child", + "fontawesome/solid/hands-holding-circle", + "fontawesome/solid/hands-holding", + "fontawesome/solid/hands-praying", + "fontawesome/solid/hands", + "fontawesome/solid/handshake-angle", + "fontawesome/solid/handshake-simple-slash", + "fontawesome/solid/handshake-simple", + "fontawesome/solid/handshake-slash", + "fontawesome/solid/handshake", + "fontawesome/solid/hanukiah", + "fontawesome/solid/hard-drive", + "fontawesome/solid/hashtag", + "fontawesome/solid/hat-cowboy-side", + "fontawesome/solid/hat-cowboy", + "fontawesome/solid/hat-wizard", + "fontawesome/solid/head-side-cough-slash", + "fontawesome/solid/head-side-cough", + "fontawesome/solid/head-side-mask", + "fontawesome/solid/head-side-virus", + "fontawesome/solid/heading", + "fontawesome/solid/headphones-simple", + "fontawesome/solid/headphones", + "fontawesome/solid/headset", + "fontawesome/solid/heart-circle-bolt", + "fontawesome/solid/heart-circle-check", + "fontawesome/solid/heart-circle-exclamation", + "fontawesome/solid/heart-circle-minus", + "fontawesome/solid/heart-circle-plus", + "fontawesome/solid/heart-circle-xmark", + "fontawesome/solid/heart-crack", + "fontawesome/solid/heart-pulse", + "fontawesome/solid/heart", + "fontawesome/solid/helicopter-symbol", + "fontawesome/solid/helicopter", + "fontawesome/solid/helmet-safety", + "fontawesome/solid/helmet-un", + "fontawesome/solid/highlighter", + "fontawesome/solid/hill-avalanche", + "fontawesome/solid/hill-rockslide", + "fontawesome/solid/hippo", + "fontawesome/solid/hockey-puck", + "fontawesome/solid/holly-berry", + "fontawesome/solid/horse-head", + "fontawesome/solid/horse", + "fontawesome/solid/hospital-user", + "fontawesome/solid/hospital", + "fontawesome/solid/hot-tub-person", + "fontawesome/solid/hotdog", + "fontawesome/solid/hotel", + "fontawesome/solid/hourglass-end", + "fontawesome/solid/hourglass-half", + "fontawesome/solid/hourglass-start", + "fontawesome/solid/hourglass", + "fontawesome/solid/house-chimney-crack", + "fontawesome/solid/house-chimney-medical", + "fontawesome/solid/house-chimney-user", + "fontawesome/solid/house-chimney-window", + "fontawesome/solid/house-chimney", + "fontawesome/solid/house-circle-check", + "fontawesome/solid/house-circle-exclamation", + "fontawesome/solid/house-circle-xmark", + "fontawesome/solid/house-crack", + "fontawesome/solid/house-fire", + "fontawesome/solid/house-flag", + "fontawesome/solid/house-flood-water-circle-arrow-right", + "fontawesome/solid/house-flood-water", + "fontawesome/solid/house-laptop", + "fontawesome/solid/house-lock", + "fontawesome/solid/house-medical-circle-check", + "fontawesome/solid/house-medical-circle-exclamation", + "fontawesome/solid/house-medical-circle-xmark", + "fontawesome/solid/house-medical-flag", + "fontawesome/solid/house-medical", + "fontawesome/solid/house-signal", + "fontawesome/solid/house-tsunami", + "fontawesome/solid/house-user", + "fontawesome/solid/house", + "fontawesome/solid/hryvnia-sign", + "fontawesome/solid/hurricane", + "fontawesome/solid/i-cursor", + "fontawesome/solid/i", + "fontawesome/solid/ice-cream", + "fontawesome/solid/icicles", + "fontawesome/solid/icons", + "fontawesome/solid/id-badge", + "fontawesome/solid/id-card-clip", + "fontawesome/solid/id-card", + "fontawesome/solid/igloo", + "fontawesome/solid/image-portrait", + "fontawesome/solid/image", + "fontawesome/solid/images", + "fontawesome/solid/inbox", + "fontawesome/solid/indent", + "fontawesome/solid/indian-rupee-sign", + "fontawesome/solid/industry", + "fontawesome/solid/infinity", + "fontawesome/solid/info", + "fontawesome/solid/italic", + "fontawesome/solid/j", + "fontawesome/solid/jar-wheat", + "fontawesome/solid/jar", + "fontawesome/solid/jedi", + "fontawesome/solid/jet-fighter-up", + "fontawesome/solid/jet-fighter", + "fontawesome/solid/joint", + "fontawesome/solid/jug-detergent", + "fontawesome/solid/k", + "fontawesome/solid/kaaba", + "fontawesome/solid/key", + "fontawesome/solid/keyboard", + "fontawesome/solid/khanda", + "fontawesome/solid/kip-sign", + "fontawesome/solid/kit-medical", + "fontawesome/solid/kitchen-set", + "fontawesome/solid/kiwi-bird", + "fontawesome/solid/l", + "fontawesome/solid/land-mine-on", + "fontawesome/solid/landmark-dome", + "fontawesome/solid/landmark-flag", + "fontawesome/solid/landmark", + "fontawesome/solid/language", + "fontawesome/solid/laptop-code", + "fontawesome/solid/laptop-file", + "fontawesome/solid/laptop-medical", + "fontawesome/solid/laptop", + "fontawesome/solid/lari-sign", + "fontawesome/solid/layer-group", + "fontawesome/solid/leaf", + "fontawesome/solid/left-long", + "fontawesome/solid/left-right", + "fontawesome/solid/lemon", + "fontawesome/solid/less-than-equal", + "fontawesome/solid/less-than", + "fontawesome/solid/life-ring", + "fontawesome/solid/lightbulb", + "fontawesome/solid/lines-leaning", + "fontawesome/solid/link-slash", + "fontawesome/solid/link", + "fontawesome/solid/lira-sign", + "fontawesome/solid/list-check", + "fontawesome/solid/list-ol", + "fontawesome/solid/list-ul", + "fontawesome/solid/list", + "fontawesome/solid/litecoin-sign", + "fontawesome/solid/location-arrow", + "fontawesome/solid/location-crosshairs", + "fontawesome/solid/location-dot", + "fontawesome/solid/location-pin-lock", + "fontawesome/solid/location-pin", + "fontawesome/solid/lock-open", + "fontawesome/solid/lock", + "fontawesome/solid/locust", + "fontawesome/solid/lungs-virus", + "fontawesome/solid/lungs", + "fontawesome/solid/m", + "fontawesome/solid/magnet", + "fontawesome/solid/magnifying-glass-arrow-right", + "fontawesome/solid/magnifying-glass-chart", + "fontawesome/solid/magnifying-glass-dollar", + "fontawesome/solid/magnifying-glass-location", + "fontawesome/solid/magnifying-glass-minus", + "fontawesome/solid/magnifying-glass-plus", + "fontawesome/solid/magnifying-glass", + "fontawesome/solid/manat-sign", + "fontawesome/solid/map-location-dot", + "fontawesome/solid/map-location", + "fontawesome/solid/map-pin", + "fontawesome/solid/map", + "fontawesome/solid/marker", + "fontawesome/solid/mars-and-venus-burst", + "fontawesome/solid/mars-and-venus", + "fontawesome/solid/mars-double", + "fontawesome/solid/mars-stroke-right", + "fontawesome/solid/mars-stroke-up", + "fontawesome/solid/mars-stroke", + "fontawesome/solid/mars", + "fontawesome/solid/martini-glass-citrus", + "fontawesome/solid/martini-glass-empty", + "fontawesome/solid/martini-glass", + "fontawesome/solid/mask-face", + "fontawesome/solid/mask-ventilator", + "fontawesome/solid/mask", + "fontawesome/solid/masks-theater", + "fontawesome/solid/mattress-pillow", + "fontawesome/solid/maximize", + "fontawesome/solid/medal", + "fontawesome/solid/memory", + "fontawesome/solid/menorah", + "fontawesome/solid/mercury", + "fontawesome/solid/message", + "fontawesome/solid/meteor", + "fontawesome/solid/microchip", + "fontawesome/solid/microphone-lines-slash", + "fontawesome/solid/microphone-lines", + "fontawesome/solid/microphone-slash", + "fontawesome/solid/microphone", + "fontawesome/solid/microscope", + "fontawesome/solid/mill-sign", + "fontawesome/solid/minimize", + "fontawesome/solid/minus", + "fontawesome/solid/mitten", + "fontawesome/solid/mobile-button", + "fontawesome/solid/mobile-retro", + "fontawesome/solid/mobile-screen-button", + "fontawesome/solid/mobile-screen", + "fontawesome/solid/mobile", + "fontawesome/solid/money-bill-1-wave", + "fontawesome/solid/money-bill-1", + "fontawesome/solid/money-bill-transfer", + "fontawesome/solid/money-bill-trend-up", + "fontawesome/solid/money-bill-wave", + "fontawesome/solid/money-bill-wheat", + "fontawesome/solid/money-bill", + "fontawesome/solid/money-bills", + "fontawesome/solid/money-check-dollar", + "fontawesome/solid/money-check", + "fontawesome/solid/monument", + "fontawesome/solid/moon", + "fontawesome/solid/mortar-pestle", + "fontawesome/solid/mosque", + "fontawesome/solid/mosquito-net", + "fontawesome/solid/mosquito", + "fontawesome/solid/motorcycle", + "fontawesome/solid/mound", + "fontawesome/solid/mountain-city", + "fontawesome/solid/mountain-sun", + "fontawesome/solid/mountain", + "fontawesome/solid/mug-hot", + "fontawesome/solid/mug-saucer", + "fontawesome/solid/music", + "fontawesome/solid/n", + "fontawesome/solid/naira-sign", + "fontawesome/solid/network-wired", + "fontawesome/solid/neuter", + "fontawesome/solid/newspaper", + "fontawesome/solid/not-equal", + "fontawesome/solid/notdef", + "fontawesome/solid/note-sticky", + "fontawesome/solid/notes-medical", + "fontawesome/solid/o", + "fontawesome/solid/object-group", + "fontawesome/solid/object-ungroup", + "fontawesome/solid/oil-can", + "fontawesome/solid/oil-well", + "fontawesome/solid/om", + "fontawesome/solid/otter", + "fontawesome/solid/outdent", + "fontawesome/solid/p", + "fontawesome/solid/pager", + "fontawesome/solid/paint-roller", + "fontawesome/solid/paintbrush", + "fontawesome/solid/palette", + "fontawesome/solid/pallet", + "fontawesome/solid/panorama", + "fontawesome/solid/paper-plane", + "fontawesome/solid/paperclip", + "fontawesome/solid/parachute-box", + "fontawesome/solid/paragraph", + "fontawesome/solid/passport", + "fontawesome/solid/paste", + "fontawesome/solid/pause", + "fontawesome/solid/paw", + "fontawesome/solid/peace", + "fontawesome/solid/pen-clip", + "fontawesome/solid/pen-fancy", + "fontawesome/solid/pen-nib", + "fontawesome/solid/pen-ruler", + "fontawesome/solid/pen-to-square", + "fontawesome/solid/pen", + "fontawesome/solid/pencil", + "fontawesome/solid/people-arrows", + "fontawesome/solid/people-carry-box", + "fontawesome/solid/people-group", + "fontawesome/solid/people-line", + "fontawesome/solid/people-pulling", + "fontawesome/solid/people-robbery", + "fontawesome/solid/people-roof", + "fontawesome/solid/pepper-hot", + "fontawesome/solid/percent", + "fontawesome/solid/person-arrow-down-to-line", + "fontawesome/solid/person-arrow-up-from-line", + "fontawesome/solid/person-biking", + "fontawesome/solid/person-booth", + "fontawesome/solid/person-breastfeeding", + "fontawesome/solid/person-burst", + "fontawesome/solid/person-cane", + "fontawesome/solid/person-chalkboard", + "fontawesome/solid/person-circle-check", + "fontawesome/solid/person-circle-exclamation", + "fontawesome/solid/person-circle-minus", + "fontawesome/solid/person-circle-plus", + "fontawesome/solid/person-circle-question", + "fontawesome/solid/person-circle-xmark", + "fontawesome/solid/person-digging", + "fontawesome/solid/person-dots-from-line", + "fontawesome/solid/person-dress-burst", + "fontawesome/solid/person-dress", + "fontawesome/solid/person-drowning", + "fontawesome/solid/person-falling-burst", + "fontawesome/solid/person-falling", + "fontawesome/solid/person-half-dress", + "fontawesome/solid/person-harassing", + "fontawesome/solid/person-hiking", + "fontawesome/solid/person-military-pointing", + "fontawesome/solid/person-military-rifle", + "fontawesome/solid/person-military-to-person", + "fontawesome/solid/person-praying", + "fontawesome/solid/person-pregnant", + "fontawesome/solid/person-rays", + "fontawesome/solid/person-rifle", + "fontawesome/solid/person-running", + "fontawesome/solid/person-shelter", + "fontawesome/solid/person-skating", + "fontawesome/solid/person-skiing-nordic", + "fontawesome/solid/person-skiing", + "fontawesome/solid/person-snowboarding", + "fontawesome/solid/person-swimming", + "fontawesome/solid/person-through-window", + "fontawesome/solid/person-walking-arrow-loop-left", + "fontawesome/solid/person-walking-arrow-right", + "fontawesome/solid/person-walking-dashed-line-arrow-right", + "fontawesome/solid/person-walking-luggage", + "fontawesome/solid/person-walking-with-cane", + "fontawesome/solid/person-walking", + "fontawesome/solid/person", + "fontawesome/solid/peseta-sign", + "fontawesome/solid/peso-sign", + "fontawesome/solid/phone-flip", + "fontawesome/solid/phone-slash", + "fontawesome/solid/phone-volume", + "fontawesome/solid/phone", + "fontawesome/solid/photo-film", + "fontawesome/solid/piggy-bank", + "fontawesome/solid/pills", + "fontawesome/solid/pizza-slice", + "fontawesome/solid/place-of-worship", + "fontawesome/solid/plane-arrival", + "fontawesome/solid/plane-circle-check", + "fontawesome/solid/plane-circle-exclamation", + "fontawesome/solid/plane-circle-xmark", + "fontawesome/solid/plane-departure", + "fontawesome/solid/plane-lock", + "fontawesome/solid/plane-slash", + "fontawesome/solid/plane-up", + "fontawesome/solid/plane", + "fontawesome/solid/plant-wilt", + "fontawesome/solid/plate-wheat", + "fontawesome/solid/play", + "fontawesome/solid/plug-circle-bolt", + "fontawesome/solid/plug-circle-check", + "fontawesome/solid/plug-circle-exclamation", + "fontawesome/solid/plug-circle-minus", + "fontawesome/solid/plug-circle-plus", + "fontawesome/solid/plug-circle-xmark", + "fontawesome/solid/plug", + "fontawesome/solid/plus-minus", + "fontawesome/solid/plus", + "fontawesome/solid/podcast", + "fontawesome/solid/poo-storm", + "fontawesome/solid/poo", + "fontawesome/solid/poop", + "fontawesome/solid/power-off", + "fontawesome/solid/prescription-bottle-medical", + "fontawesome/solid/prescription-bottle", + "fontawesome/solid/prescription", + "fontawesome/solid/print", + "fontawesome/solid/pump-medical", + "fontawesome/solid/pump-soap", + "fontawesome/solid/puzzle-piece", + "fontawesome/solid/q", + "fontawesome/solid/qrcode", + "fontawesome/solid/question", + "fontawesome/solid/quote-left", + "fontawesome/solid/quote-right", + "fontawesome/solid/r", + "fontawesome/solid/radiation", + "fontawesome/solid/radio", + "fontawesome/solid/rainbow", + "fontawesome/solid/ranking-star", + "fontawesome/solid/receipt", + "fontawesome/solid/record-vinyl", + "fontawesome/solid/rectangle-ad", + "fontawesome/solid/rectangle-list", + "fontawesome/solid/rectangle-xmark", + "fontawesome/solid/recycle", + "fontawesome/solid/registered", + "fontawesome/solid/repeat", + "fontawesome/solid/reply-all", + "fontawesome/solid/reply", + "fontawesome/solid/republican", + "fontawesome/solid/restroom", + "fontawesome/solid/retweet", + "fontawesome/solid/ribbon", + "fontawesome/solid/right-from-bracket", + "fontawesome/solid/right-left", + "fontawesome/solid/right-long", + "fontawesome/solid/right-to-bracket", + "fontawesome/solid/ring", + "fontawesome/solid/road-barrier", + "fontawesome/solid/road-bridge", + "fontawesome/solid/road-circle-check", + "fontawesome/solid/road-circle-exclamation", + "fontawesome/solid/road-circle-xmark", + "fontawesome/solid/road-lock", + "fontawesome/solid/road-spikes", + "fontawesome/solid/road", + "fontawesome/solid/robot", + "fontawesome/solid/rocket", + "fontawesome/solid/rotate-left", + "fontawesome/solid/rotate-right", + "fontawesome/solid/rotate", + "fontawesome/solid/route", + "fontawesome/solid/rss", + "fontawesome/solid/ruble-sign", + "fontawesome/solid/rug", + "fontawesome/solid/ruler-combined", + "fontawesome/solid/ruler-horizontal", + "fontawesome/solid/ruler-vertical", + "fontawesome/solid/ruler", + "fontawesome/solid/rupee-sign", + "fontawesome/solid/rupiah-sign", + "fontawesome/solid/s", + "fontawesome/solid/sack-dollar", + "fontawesome/solid/sack-xmark", + "fontawesome/solid/sailboat", + "fontawesome/solid/satellite-dish", + "fontawesome/solid/satellite", + "fontawesome/solid/scale-balanced", + "fontawesome/solid/scale-unbalanced-flip", + "fontawesome/solid/scale-unbalanced", + "fontawesome/solid/school-circle-check", + "fontawesome/solid/school-circle-exclamation", + "fontawesome/solid/school-circle-xmark", + "fontawesome/solid/school-flag", + "fontawesome/solid/school-lock", + "fontawesome/solid/school", + "fontawesome/solid/scissors", + "fontawesome/solid/screwdriver-wrench", + "fontawesome/solid/screwdriver", + "fontawesome/solid/scroll-torah", + "fontawesome/solid/scroll", + "fontawesome/solid/sd-card", + "fontawesome/solid/section", + "fontawesome/solid/seedling", + "fontawesome/solid/server", + "fontawesome/solid/shapes", + "fontawesome/solid/share-from-square", + "fontawesome/solid/share-nodes", + "fontawesome/solid/share", + "fontawesome/solid/sheet-plastic", + "fontawesome/solid/shekel-sign", + "fontawesome/solid/shield-cat", + "fontawesome/solid/shield-dog", + "fontawesome/solid/shield-halved", + "fontawesome/solid/shield-heart", + "fontawesome/solid/shield-virus", + "fontawesome/solid/shield", + "fontawesome/solid/ship", + "fontawesome/solid/shirt", + "fontawesome/solid/shoe-prints", + "fontawesome/solid/shop-lock", + "fontawesome/solid/shop-slash", + "fontawesome/solid/shop", + "fontawesome/solid/shower", + "fontawesome/solid/shrimp", + "fontawesome/solid/shuffle", + "fontawesome/solid/shuttle-space", + "fontawesome/solid/sign-hanging", + "fontawesome/solid/signal", + "fontawesome/solid/signature", + "fontawesome/solid/signs-post", + "fontawesome/solid/sim-card", + "fontawesome/solid/sink", + "fontawesome/solid/sitemap", + "fontawesome/solid/skull-crossbones", + "fontawesome/solid/skull", + "fontawesome/solid/slash", + "fontawesome/solid/sleigh", + "fontawesome/solid/sliders", + "fontawesome/solid/smog", + "fontawesome/solid/smoking", + "fontawesome/solid/snowflake", + "fontawesome/solid/snowman", + "fontawesome/solid/snowplow", + "fontawesome/solid/soap", + "fontawesome/solid/socks", + "fontawesome/solid/solar-panel", + "fontawesome/solid/sort-down", + "fontawesome/solid/sort-up", + "fontawesome/solid/sort", + "fontawesome/solid/spa", + "fontawesome/solid/spaghetti-monster-flying", + "fontawesome/solid/spell-check", + "fontawesome/solid/spider", + "fontawesome/solid/spinner", + "fontawesome/solid/splotch", + "fontawesome/solid/spoon", + "fontawesome/solid/spray-can-sparkles", + "fontawesome/solid/spray-can", + "fontawesome/solid/square-arrow-up-right", + "fontawesome/solid/square-caret-down", + "fontawesome/solid/square-caret-left", + "fontawesome/solid/square-caret-right", + "fontawesome/solid/square-caret-up", + "fontawesome/solid/square-check", + "fontawesome/solid/square-envelope", + "fontawesome/solid/square-full", + "fontawesome/solid/square-h", + "fontawesome/solid/square-minus", + "fontawesome/solid/square-nfi", + "fontawesome/solid/square-parking", + "fontawesome/solid/square-pen", + "fontawesome/solid/square-person-confined", + "fontawesome/solid/square-phone-flip", + "fontawesome/solid/square-phone", + "fontawesome/solid/square-plus", + "fontawesome/solid/square-poll-horizontal", + "fontawesome/solid/square-poll-vertical", + "fontawesome/solid/square-root-variable", + "fontawesome/solid/square-rss", + "fontawesome/solid/square-share-nodes", + "fontawesome/solid/square-up-right", + "fontawesome/solid/square-virus", + "fontawesome/solid/square-xmark", + "fontawesome/solid/square", + "fontawesome/solid/staff-snake", + "fontawesome/solid/stairs", + "fontawesome/solid/stamp", + "fontawesome/solid/stapler", + "fontawesome/solid/star-and-crescent", + "fontawesome/solid/star-half-stroke", + "fontawesome/solid/star-half", + "fontawesome/solid/star-of-david", + "fontawesome/solid/star-of-life", + "fontawesome/solid/star", + "fontawesome/solid/sterling-sign", + "fontawesome/solid/stethoscope", + "fontawesome/solid/stop", + "fontawesome/solid/stopwatch-20", + "fontawesome/solid/stopwatch", + "fontawesome/solid/store-slash", + "fontawesome/solid/store", + "fontawesome/solid/street-view", + "fontawesome/solid/strikethrough", + "fontawesome/solid/stroopwafel", + "fontawesome/solid/subscript", + "fontawesome/solid/suitcase-medical", + "fontawesome/solid/suitcase-rolling", + "fontawesome/solid/suitcase", + "fontawesome/solid/sun-plant-wilt", + "fontawesome/solid/sun", + "fontawesome/solid/superscript", + "fontawesome/solid/swatchbook", + "fontawesome/solid/synagogue", + "fontawesome/solid/syringe", + "fontawesome/solid/t", + "fontawesome/solid/table-cells-large", + "fontawesome/solid/table-cells", + "fontawesome/solid/table-columns", + "fontawesome/solid/table-list", + "fontawesome/solid/table-tennis-paddle-ball", + "fontawesome/solid/table", + "fontawesome/solid/tablet-button", + "fontawesome/solid/tablet-screen-button", + "fontawesome/solid/tablet", + "fontawesome/solid/tablets", + "fontawesome/solid/tachograph-digital", + "fontawesome/solid/tag", + "fontawesome/solid/tags", + "fontawesome/solid/tape", + "fontawesome/solid/tarp-droplet", + "fontawesome/solid/tarp", + "fontawesome/solid/taxi", + "fontawesome/solid/teeth-open", + "fontawesome/solid/teeth", + "fontawesome/solid/temperature-arrow-down", + "fontawesome/solid/temperature-arrow-up", + "fontawesome/solid/temperature-empty", + "fontawesome/solid/temperature-full", + "fontawesome/solid/temperature-half", + "fontawesome/solid/temperature-high", + "fontawesome/solid/temperature-low", + "fontawesome/solid/temperature-quarter", + "fontawesome/solid/temperature-three-quarters", + "fontawesome/solid/tenge-sign", + "fontawesome/solid/tent-arrow-down-to-line", + "fontawesome/solid/tent-arrow-left-right", + "fontawesome/solid/tent-arrow-turn-left", + "fontawesome/solid/tent-arrows-down", + "fontawesome/solid/tent", + "fontawesome/solid/tents", + "fontawesome/solid/terminal", + "fontawesome/solid/text-height", + "fontawesome/solid/text-slash", + "fontawesome/solid/text-width", + "fontawesome/solid/thermometer", + "fontawesome/solid/thumbs-down", + "fontawesome/solid/thumbs-up", + "fontawesome/solid/thumbtack", + "fontawesome/solid/ticket-simple", + "fontawesome/solid/ticket", + "fontawesome/solid/timeline", + "fontawesome/solid/toggle-off", + "fontawesome/solid/toggle-on", + "fontawesome/solid/toilet-paper-slash", + "fontawesome/solid/toilet-paper", + "fontawesome/solid/toilet-portable", + "fontawesome/solid/toilet", + "fontawesome/solid/toilets-portable", + "fontawesome/solid/toolbox", + "fontawesome/solid/tooth", + "fontawesome/solid/torii-gate", + "fontawesome/solid/tornado", + "fontawesome/solid/tower-broadcast", + "fontawesome/solid/tower-cell", + "fontawesome/solid/tower-observation", + "fontawesome/solid/tractor", + "fontawesome/solid/trademark", + "fontawesome/solid/traffic-light", + "fontawesome/solid/trailer", + "fontawesome/solid/train-subway", + "fontawesome/solid/train-tram", + "fontawesome/solid/train", + "fontawesome/solid/transgender", + "fontawesome/solid/trash-arrow-up", + "fontawesome/solid/trash-can-arrow-up", + "fontawesome/solid/trash-can", + "fontawesome/solid/trash", + "fontawesome/solid/tree-city", + "fontawesome/solid/tree", + "fontawesome/solid/triangle-exclamation", + "fontawesome/solid/trophy", + "fontawesome/solid/trowel-bricks", + "fontawesome/solid/trowel", + "fontawesome/solid/truck-arrow-right", + "fontawesome/solid/truck-droplet", + "fontawesome/solid/truck-fast", + "fontawesome/solid/truck-field-un", + "fontawesome/solid/truck-field", + "fontawesome/solid/truck-front", + "fontawesome/solid/truck-medical", + "fontawesome/solid/truck-monster", + "fontawesome/solid/truck-moving", + "fontawesome/solid/truck-pickup", + "fontawesome/solid/truck-plane", + "fontawesome/solid/truck-ramp-box", + "fontawesome/solid/truck", + "fontawesome/solid/tty", + "fontawesome/solid/turkish-lira-sign", + "fontawesome/solid/turn-down", + "fontawesome/solid/turn-up", + "fontawesome/solid/tv", + "fontawesome/solid/u", + "fontawesome/solid/umbrella-beach", + "fontawesome/solid/umbrella", + "fontawesome/solid/underline", + "fontawesome/solid/universal-access", + "fontawesome/solid/unlock-keyhole", + "fontawesome/solid/unlock", + "fontawesome/solid/up-down-left-right", + "fontawesome/solid/up-down", + "fontawesome/solid/up-long", + "fontawesome/solid/up-right-and-down-left-from-center", + "fontawesome/solid/up-right-from-square", + "fontawesome/solid/upload", + "fontawesome/solid/user-astronaut", + "fontawesome/solid/user-check", + "fontawesome/solid/user-clock", + "fontawesome/solid/user-doctor", + "fontawesome/solid/user-gear", + "fontawesome/solid/user-graduate", + "fontawesome/solid/user-group", + "fontawesome/solid/user-injured", + "fontawesome/solid/user-large-slash", + "fontawesome/solid/user-large", + "fontawesome/solid/user-lock", + "fontawesome/solid/user-minus", + "fontawesome/solid/user-ninja", + "fontawesome/solid/user-nurse", + "fontawesome/solid/user-pen", + "fontawesome/solid/user-plus", + "fontawesome/solid/user-secret", + "fontawesome/solid/user-shield", + "fontawesome/solid/user-slash", + "fontawesome/solid/user-tag", + "fontawesome/solid/user-tie", + "fontawesome/solid/user-xmark", + "fontawesome/solid/user", + "fontawesome/solid/users-between-lines", + "fontawesome/solid/users-gear", + "fontawesome/solid/users-line", + "fontawesome/solid/users-rays", + "fontawesome/solid/users-rectangle", + "fontawesome/solid/users-slash", + "fontawesome/solid/users-viewfinder", + "fontawesome/solid/users", + "fontawesome/solid/utensils", + "fontawesome/solid/v", + "fontawesome/solid/van-shuttle", + "fontawesome/solid/vault", + "fontawesome/solid/vector-square", + "fontawesome/solid/venus-double", + "fontawesome/solid/venus-mars", + "fontawesome/solid/venus", + "fontawesome/solid/vest-patches", + "fontawesome/solid/vest", + "fontawesome/solid/vial-circle-check", + "fontawesome/solid/vial-virus", + "fontawesome/solid/vial", + "fontawesome/solid/vials", + "fontawesome/solid/video-slash", + "fontawesome/solid/video", + "fontawesome/solid/vihara", + "fontawesome/solid/virus-covid-slash", + "fontawesome/solid/virus-covid", + "fontawesome/solid/virus-slash", + "fontawesome/solid/virus", + "fontawesome/solid/viruses", + "fontawesome/solid/voicemail", + "fontawesome/solid/volcano", + "fontawesome/solid/volleyball", + "fontawesome/solid/volume-high", + "fontawesome/solid/volume-low", + "fontawesome/solid/volume-off", + "fontawesome/solid/volume-xmark", + "fontawesome/solid/vr-cardboard", + "fontawesome/solid/w", + "fontawesome/solid/walkie-talkie", + "fontawesome/solid/wallet", + "fontawesome/solid/wand-magic-sparkles", + "fontawesome/solid/wand-magic", + "fontawesome/solid/wand-sparkles", + "fontawesome/solid/warehouse", + "fontawesome/solid/water-ladder", + "fontawesome/solid/water", + "fontawesome/solid/wave-square", + "fontawesome/solid/weight-hanging", + "fontawesome/solid/weight-scale", + "fontawesome/solid/wheat-awn-circle-exclamation", + "fontawesome/solid/wheat-awn", + "fontawesome/solid/wheelchair-move", + "fontawesome/solid/wheelchair", + "fontawesome/solid/whiskey-glass", + "fontawesome/solid/wifi", + "fontawesome/solid/wind", + "fontawesome/solid/window-maximize", + "fontawesome/solid/window-minimize", + "fontawesome/solid/window-restore", + "fontawesome/solid/wine-bottle", + "fontawesome/solid/wine-glass-empty", + "fontawesome/solid/wine-glass", + "fontawesome/solid/won-sign", + "fontawesome/solid/worm", + "fontawesome/solid/wrench", + "fontawesome/solid/x-ray", + "fontawesome/solid/x", + "fontawesome/solid/xmark", + "fontawesome/solid/xmarks-lines", + "fontawesome/solid/y", + "fontawesome/solid/yen-sign", + "fontawesome/solid/yin-yang", + "fontawesome/solid/z", + "logo-monochrome", + "logo", + "material/ab-testing", + "material/abacus", + "material/abjad-arabic", + "material/abjad-hebrew", + "material/abugida-devanagari", + "material/abugida-thai", + "material/access-point-check", + "material/access-point-minus", + "material/access-point-network-off", + "material/access-point-network", + "material/access-point-off", + "material/access-point-plus", + "material/access-point-remove", + "material/access-point", + "material/account-alert-outline", + "material/account-alert", + "material/account-arrow-down-outline", + "material/account-arrow-down", + "material/account-arrow-left-outline", + "material/account-arrow-left", + "material/account-arrow-right-outline", + "material/account-arrow-right", + "material/account-arrow-up-outline", + "material/account-arrow-up", + "material/account-badge-outline", + "material/account-badge", + "material/account-box-multiple-outline", + "material/account-box-multiple", + "material/account-box-outline", + "material/account-box", + "material/account-cancel-outline", + "material/account-cancel", + "material/account-card-outline", + "material/account-card", + "material/account-cash-outline", + "material/account-cash", + "material/account-check-outline", + "material/account-check", + "material/account-child-circle", + "material/account-child-outline", + "material/account-child", + "material/account-circle-outline", + "material/account-circle", + "material/account-clock-outline", + "material/account-clock", + "material/account-cog-outline", + "material/account-cog", + "material/account-convert-outline", + "material/account-convert", + "material/account-cowboy-hat-outline", + "material/account-cowboy-hat", + "material/account-credit-card-outline", + "material/account-credit-card", + "material/account-details-outline", + "material/account-details", + "material/account-edit-outline", + "material/account-edit", + "material/account-eye-outline", + "material/account-eye", + "material/account-file-outline", + "material/account-file-text-outline", + "material/account-file-text", + "material/account-file", + "material/account-filter-outline", + "material/account-filter", + "material/account-group-outline", + "material/account-group", + "material/account-hard-hat-outline", + "material/account-hard-hat", + "material/account-heart-outline", + "material/account-heart", + "material/account-injury-outline", + "material/account-injury", + "material/account-key-outline", + "material/account-key", + "material/account-lock-open-outline", + "material/account-lock-open", + "material/account-lock-outline", + "material/account-lock", + "material/account-minus-outline", + "material/account-minus", + "material/account-multiple-check-outline", + "material/account-multiple-check", + "material/account-multiple-minus-outline", + "material/account-multiple-minus", + "material/account-multiple-outline", + "material/account-multiple-plus-outline", + "material/account-multiple-plus", + "material/account-multiple-remove-outline", + "material/account-multiple-remove", + "material/account-multiple", + "material/account-music-outline", + "material/account-music", + "material/account-network-off-outline", + "material/account-network-off", + "material/account-network-outline", + "material/account-network", + "material/account-off-outline", + "material/account-off", + "material/account-outline", + "material/account-plus-outline", + "material/account-plus", + "material/account-question-outline", + "material/account-question", + "material/account-reactivate-outline", + "material/account-reactivate", + "material/account-remove-outline", + "material/account-remove", + "material/account-school-outline", + "material/account-school", + "material/account-search-outline", + "material/account-search", + "material/account-settings-outline", + "material/account-settings", + "material/account-star-outline", + "material/account-star", + "material/account-supervisor-circle-outline", + "material/account-supervisor-circle", + "material/account-supervisor-outline", + "material/account-supervisor", + "material/account-switch-outline", + "material/account-switch", + "material/account-sync-outline", + "material/account-sync", + "material/account-tag-outline", + "material/account-tag", + "material/account-tie-hat-outline", + "material/account-tie-hat", + "material/account-tie-outline", + "material/account-tie-voice-off-outline", + "material/account-tie-voice-off", + "material/account-tie-voice-outline", + "material/account-tie-voice", + "material/account-tie-woman", + "material/account-tie", + "material/account-voice-off", + "material/account-voice", + "material/account-wrench-outline", + "material/account-wrench", + "material/account", + "material/adjust", + "material/advertisements-off", + "material/advertisements", + "material/air-conditioner", + "material/air-filter", + "material/air-horn", + "material/air-humidifier-off", + "material/air-humidifier", + "material/air-purifier-off", + "material/air-purifier", + "material/airbag", + "material/airballoon-outline", + "material/airballoon", + "material/airplane-alert", + "material/airplane-check", + "material/airplane-clock", + "material/airplane-cog", + "material/airplane-edit", + "material/airplane-landing", + "material/airplane-marker", + "material/airplane-minus", + "material/airplane-off", + "material/airplane-plus", + "material/airplane-remove", + "material/airplane-search", + "material/airplane-settings", + "material/airplane-takeoff", + "material/airplane", + "material/airport", + "material/alarm-bell", + "material/alarm-check", + "material/alarm-light-off-outline", + "material/alarm-light-off", + "material/alarm-light-outline", + "material/alarm-light", + "material/alarm-multiple", + "material/alarm-note-off", + "material/alarm-note", + "material/alarm-off", + "material/alarm-panel-outline", + "material/alarm-panel", + "material/alarm-plus", + "material/alarm-snooze", + "material/alarm", + "material/album", + "material/alert-box-outline", + "material/alert-box", + "material/alert-circle-check-outline", + "material/alert-circle-check", + "material/alert-circle-outline", + "material/alert-circle", + "material/alert-decagram-outline", + "material/alert-decagram", + "material/alert-minus-outline", + "material/alert-minus", + "material/alert-octagon-outline", + "material/alert-octagon", + "material/alert-octagram-outline", + "material/alert-octagram", + "material/alert-outline", + "material/alert-plus-outline", + "material/alert-plus", + "material/alert-remove-outline", + "material/alert-remove", + "material/alert-rhombus-outline", + "material/alert-rhombus", + "material/alert", + "material/alien-outline", + "material/alien", + "material/align-horizontal-center", + "material/align-horizontal-distribute", + "material/align-horizontal-left", + "material/align-horizontal-right", + "material/align-vertical-bottom", + "material/align-vertical-center", + "material/align-vertical-distribute", + "material/align-vertical-top", + "material/all-inclusive-box-outline", + "material/all-inclusive-box", + "material/all-inclusive", + "material/allergy", + "material/alpha-a-box-outline", + "material/alpha-a-box", + "material/alpha-a-circle-outline", + "material/alpha-a-circle", + "material/alpha-a", + "material/alpha-b-box-outline", + "material/alpha-b-box", + "material/alpha-b-circle-outline", + "material/alpha-b-circle", + "material/alpha-b", + "material/alpha-c-box-outline", + "material/alpha-c-box", + "material/alpha-c-circle-outline", + "material/alpha-c-circle", + "material/alpha-c", + "material/alpha-d-box-outline", + "material/alpha-d-box", + "material/alpha-d-circle-outline", + "material/alpha-d-circle", + "material/alpha-d", + "material/alpha-e-box-outline", + "material/alpha-e-box", + "material/alpha-e-circle-outline", + "material/alpha-e-circle", + "material/alpha-e", + "material/alpha-f-box-outline", + "material/alpha-f-box", + "material/alpha-f-circle-outline", + "material/alpha-f-circle", + "material/alpha-f", + "material/alpha-g-box-outline", + "material/alpha-g-box", + "material/alpha-g-circle-outline", + "material/alpha-g-circle", + "material/alpha-g", + "material/alpha-h-box-outline", + "material/alpha-h-box", + "material/alpha-h-circle-outline", + "material/alpha-h-circle", + "material/alpha-h", + "material/alpha-i-box-outline", + "material/alpha-i-box", + "material/alpha-i-circle-outline", + "material/alpha-i-circle", + "material/alpha-i", + "material/alpha-j-box-outline", + "material/alpha-j-box", + "material/alpha-j-circle-outline", + "material/alpha-j-circle", + "material/alpha-j", + "material/alpha-k-box-outline", + "material/alpha-k-box", + "material/alpha-k-circle-outline", + "material/alpha-k-circle", + "material/alpha-k", + "material/alpha-l-box-outline", + "material/alpha-l-box", + "material/alpha-l-circle-outline", + "material/alpha-l-circle", + "material/alpha-l", + "material/alpha-m-box-outline", + "material/alpha-m-box", + "material/alpha-m-circle-outline", + "material/alpha-m-circle", + "material/alpha-m", + "material/alpha-n-box-outline", + "material/alpha-n-box", + "material/alpha-n-circle-outline", + "material/alpha-n-circle", + "material/alpha-n", + "material/alpha-o-box-outline", + "material/alpha-o-box", + "material/alpha-o-circle-outline", + "material/alpha-o-circle", + "material/alpha-o", + "material/alpha-p-box-outline", + "material/alpha-p-box", + "material/alpha-p-circle-outline", + "material/alpha-p-circle", + "material/alpha-p", + "material/alpha-q-box-outline", + "material/alpha-q-box", + "material/alpha-q-circle-outline", + "material/alpha-q-circle", + "material/alpha-q", + "material/alpha-r-box-outline", + "material/alpha-r-box", + "material/alpha-r-circle-outline", + "material/alpha-r-circle", + "material/alpha-r", + "material/alpha-s-box-outline", + "material/alpha-s-box", + "material/alpha-s-circle-outline", + "material/alpha-s-circle", + "material/alpha-s", + "material/alpha-t-box-outline", + "material/alpha-t-box", + "material/alpha-t-circle-outline", + "material/alpha-t-circle", + "material/alpha-t", + "material/alpha-u-box-outline", + "material/alpha-u-box", + "material/alpha-u-circle-outline", + "material/alpha-u-circle", + "material/alpha-u", + "material/alpha-v-box-outline", + "material/alpha-v-box", + "material/alpha-v-circle-outline", + "material/alpha-v-circle", + "material/alpha-v", + "material/alpha-w-box-outline", + "material/alpha-w-box", + "material/alpha-w-circle-outline", + "material/alpha-w-circle", + "material/alpha-w", + "material/alpha-x-box-outline", + "material/alpha-x-box", + "material/alpha-x-circle-outline", + "material/alpha-x-circle", + "material/alpha-x", + "material/alpha-y-box-outline", + "material/alpha-y-box", + "material/alpha-y-circle-outline", + "material/alpha-y-circle", + "material/alpha-y", + "material/alpha-z-box-outline", + "material/alpha-z-box", + "material/alpha-z-circle-outline", + "material/alpha-z-circle", + "material/alpha-z", + "material/alpha", + "material/alphabet-aurebesh", + "material/alphabet-cyrillic", + "material/alphabet-greek", + "material/alphabet-latin", + "material/alphabet-piqad", + "material/alphabet-tengwar", + "material/alphabetical-off", + "material/alphabetical-variant-off", + "material/alphabetical-variant", + "material/alphabetical", + "material/altimeter", + "material/ambulance", + "material/ammunition", + "material/ampersand", + "material/amplifier-off", + "material/amplifier", + "material/anchor", + "material/android-studio", + "material/android", + "material/angle-acute", + "material/angle-obtuse", + "material/angle-right", + "material/angular", + "material/angularjs", + "material/animation-outline", + "material/animation-play-outline", + "material/animation-play", + "material/animation", + "material/ansible", + "material/antenna", + "material/anvil", + "material/apache-kafka", + "material/api-off", + "material/api", + "material/apple-finder", + "material/apple-icloud", + "material/apple-ios", + "material/apple-keyboard-caps", + "material/apple-keyboard-command", + "material/apple-keyboard-control", + "material/apple-keyboard-option", + "material/apple-keyboard-shift", + "material/apple-safari", + "material/apple", + "material/application-array-outline", + "material/application-array", + "material/application-braces-outline", + "material/application-braces", + "material/application-brackets-outline", + "material/application-brackets", + "material/application-cog-outline", + "material/application-cog", + "material/application-edit-outline", + "material/application-edit", + "material/application-export", + "material/application-import", + "material/application-outline", + "material/application-parentheses-outline", + "material/application-parentheses", + "material/application-settings-outline", + "material/application-settings", + "material/application-variable-outline", + "material/application-variable", + "material/application", + "material/approximately-equal-box", + "material/approximately-equal", + "material/apps-box", + "material/apps", + "material/arch", + "material/archive-alert-outline", + "material/archive-alert", + "material/archive-arrow-down-outline", + "material/archive-arrow-down", + "material/archive-arrow-up-outline", + "material/archive-arrow-up", + "material/archive-cancel-outline", + "material/archive-cancel", + "material/archive-check-outline", + "material/archive-check", + "material/archive-clock-outline", + "material/archive-clock", + "material/archive-cog-outline", + "material/archive-cog", + "material/archive-edit-outline", + "material/archive-edit", + "material/archive-eye-outline", + "material/archive-eye", + "material/archive-lock-open-outline", + "material/archive-lock-open", + "material/archive-lock-outline", + "material/archive-lock", + "material/archive-marker-outline", + "material/archive-marker", + "material/archive-minus-outline", + "material/archive-minus", + "material/archive-music-outline", + "material/archive-music", + "material/archive-off-outline", + "material/archive-off", + "material/archive-outline", + "material/archive-plus-outline", + "material/archive-plus", + "material/archive-refresh-outline", + "material/archive-refresh", + "material/archive-remove-outline", + "material/archive-remove", + "material/archive-search-outline", + "material/archive-search", + "material/archive-settings-outline", + "material/archive-settings", + "material/archive-star-outline", + "material/archive-star", + "material/archive-sync-outline", + "material/archive-sync", + "material/archive", + "material/arm-flex-outline", + "material/arm-flex", + "material/arrange-bring-forward", + "material/arrange-bring-to-front", + "material/arrange-send-backward", + "material/arrange-send-to-back", + "material/arrow-all", + "material/arrow-bottom-left-bold-box-outline", + "material/arrow-bottom-left-bold-box", + "material/arrow-bottom-left-bold-outline", + "material/arrow-bottom-left-thick", + "material/arrow-bottom-left-thin-circle-outline", + "material/arrow-bottom-left-thin", + "material/arrow-bottom-left", + "material/arrow-bottom-right-bold-box-outline", + "material/arrow-bottom-right-bold-box", + "material/arrow-bottom-right-bold-outline", + "material/arrow-bottom-right-thick", + "material/arrow-bottom-right-thin-circle-outline", + "material/arrow-bottom-right-thin", + "material/arrow-bottom-right", + "material/arrow-collapse-all", + "material/arrow-collapse-down", + "material/arrow-collapse-horizontal", + "material/arrow-collapse-left", + "material/arrow-collapse-right", + "material/arrow-collapse-up", + "material/arrow-collapse-vertical", + "material/arrow-collapse", + "material/arrow-decision-auto-outline", + "material/arrow-decision-auto", + "material/arrow-decision-outline", + "material/arrow-decision", + "material/arrow-down-bold-box-outline", + "material/arrow-down-bold-box", + "material/arrow-down-bold-circle-outline", + "material/arrow-down-bold-circle", + "material/arrow-down-bold-hexagon-outline", + "material/arrow-down-bold-outline", + "material/arrow-down-bold", + "material/arrow-down-box", + "material/arrow-down-circle-outline", + "material/arrow-down-circle", + "material/arrow-down-drop-circle-outline", + "material/arrow-down-drop-circle", + "material/arrow-down-left-bold", + "material/arrow-down-left", + "material/arrow-down-right-bold", + "material/arrow-down-right", + "material/arrow-down-thick", + "material/arrow-down-thin-circle-outline", + "material/arrow-down-thin", + "material/arrow-down", + "material/arrow-expand-all", + "material/arrow-expand-down", + "material/arrow-expand-horizontal", + "material/arrow-expand-left", + "material/arrow-expand-right", + "material/arrow-expand-up", + "material/arrow-expand-vertical", + "material/arrow-expand", + "material/arrow-horizontal-lock", + "material/arrow-left-bold-box-outline", + "material/arrow-left-bold-box", + "material/arrow-left-bold-circle-outline", + "material/arrow-left-bold-circle", + "material/arrow-left-bold-hexagon-outline", + "material/arrow-left-bold-outline", + "material/arrow-left-bold", + "material/arrow-left-bottom-bold", + "material/arrow-left-bottom", + "material/arrow-left-box", + "material/arrow-left-circle-outline", + "material/arrow-left-circle", + "material/arrow-left-drop-circle-outline", + "material/arrow-left-drop-circle", + "material/arrow-left-right-bold-outline", + "material/arrow-left-right-bold", + "material/arrow-left-right", + "material/arrow-left-thick", + "material/arrow-left-thin-circle-outline", + "material/arrow-left-thin", + "material/arrow-left-top-bold", + "material/arrow-left-top", + "material/arrow-left", + "material/arrow-oscillating-off", + "material/arrow-oscillating", + "material/arrow-projectile-multiple", + "material/arrow-projectile", + "material/arrow-right-bold-box-outline", + "material/arrow-right-bold-box", + "material/arrow-right-bold-circle-outline", + "material/arrow-right-bold-circle", + "material/arrow-right-bold-hexagon-outline", + "material/arrow-right-bold-outline", + "material/arrow-right-bold", + "material/arrow-right-bottom-bold", + "material/arrow-right-bottom", + "material/arrow-right-box", + "material/arrow-right-circle-outline", + "material/arrow-right-circle", + "material/arrow-right-drop-circle-outline", + "material/arrow-right-drop-circle", + "material/arrow-right-thick", + "material/arrow-right-thin-circle-outline", + "material/arrow-right-thin", + "material/arrow-right-top-bold", + "material/arrow-right-top", + "material/arrow-right", + "material/arrow-split-horizontal", + "material/arrow-split-vertical", + "material/arrow-top-left-bold-box-outline", + "material/arrow-top-left-bold-box", + "material/arrow-top-left-bold-outline", + "material/arrow-top-left-bottom-right-bold", + "material/arrow-top-left-bottom-right", + "material/arrow-top-left-thick", + "material/arrow-top-left-thin-circle-outline", + "material/arrow-top-left-thin", + "material/arrow-top-left", + "material/arrow-top-right-bold-box-outline", + "material/arrow-top-right-bold-box", + "material/arrow-top-right-bold-outline", + "material/arrow-top-right-bottom-left-bold", + "material/arrow-top-right-bottom-left", + "material/arrow-top-right-thick", + "material/arrow-top-right-thin-circle-outline", + "material/arrow-top-right-thin", + "material/arrow-top-right", + "material/arrow-u-down-left-bold", + "material/arrow-u-down-left", + "material/arrow-u-down-right-bold", + "material/arrow-u-down-right", + "material/arrow-u-left-bottom-bold", + "material/arrow-u-left-bottom", + "material/arrow-u-left-top-bold", + "material/arrow-u-left-top", + "material/arrow-u-right-bottom-bold", + "material/arrow-u-right-bottom", + "material/arrow-u-right-top-bold", + "material/arrow-u-right-top", + "material/arrow-u-up-left-bold", + "material/arrow-u-up-left", + "material/arrow-u-up-right-bold", + "material/arrow-u-up-right", + "material/arrow-up-bold-box-outline", + "material/arrow-up-bold-box", + "material/arrow-up-bold-circle-outline", + "material/arrow-up-bold-circle", + "material/arrow-up-bold-hexagon-outline", + "material/arrow-up-bold-outline", + "material/arrow-up-bold", + "material/arrow-up-box", + "material/arrow-up-circle-outline", + "material/arrow-up-circle", + "material/arrow-up-down-bold-outline", + "material/arrow-up-down-bold", + "material/arrow-up-down", + "material/arrow-up-drop-circle-outline", + "material/arrow-up-drop-circle", + "material/arrow-up-left-bold", + "material/arrow-up-left", + "material/arrow-up-right-bold", + "material/arrow-up-right", + "material/arrow-up-thick", + "material/arrow-up-thin-circle-outline", + "material/arrow-up-thin", + "material/arrow-up", + "material/arrow-vertical-lock", + "material/artboard", + "material/artstation", + "material/aspect-ratio", + "material/assistant", + "material/asterisk-circle-outline", + "material/asterisk", + "material/at", + "material/atlassian", + "material/atm", + "material/atom-variant", + "material/atom", + "material/attachment-check", + "material/attachment-lock", + "material/attachment-minus", + "material/attachment-off", + "material/attachment-plus", + "material/attachment-remove", + "material/attachment", + "material/atv", + "material/audio-input-rca", + "material/audio-input-stereo-minijack", + "material/audio-input-xlr", + "material/audio-video-off", + "material/audio-video", + "material/augmented-reality", + "material/aurora", + "material/auto-download", + "material/auto-fix", + "material/auto-mode", + "material/auto-upload", + "material/autorenew-off", + "material/autorenew", + "material/av-timer", + "material/awning-outline", + "material/awning", + "material/aws", + "material/axe-battle", + "material/axe", + "material/axis-arrow-info", + "material/axis-arrow-lock", + "material/axis-arrow", + "material/axis-lock", + "material/axis-x-arrow-lock", + "material/axis-x-arrow", + "material/axis-x-rotate-clockwise", + "material/axis-x-rotate-counterclockwise", + "material/axis-x-y-arrow-lock", + "material/axis-y-arrow-lock", + "material/axis-y-arrow", + "material/axis-y-rotate-clockwise", + "material/axis-y-rotate-counterclockwise", + "material/axis-z-arrow-lock", + "material/axis-z-arrow", + "material/axis-z-rotate-clockwise", + "material/axis-z-rotate-counterclockwise", + "material/axis", + "material/babel", + "material/baby-bottle-outline", + "material/baby-bottle", + "material/baby-buggy-off", + "material/baby-buggy", + "material/baby-carriage-off", + "material/baby-carriage", + "material/baby-face-outline", + "material/baby-face", + "material/baby", + "material/backburger", + "material/backspace-outline", + "material/backspace-reverse-outline", + "material/backspace-reverse", + "material/backspace", + "material/backup-restore", + "material/bacteria-outline", + "material/bacteria", + "material/badge-account-alert-outline", + "material/badge-account-alert", + "material/badge-account-horizontal-outline", + "material/badge-account-horizontal", + "material/badge-account-outline", + "material/badge-account", + "material/badminton", + "material/bag-carry-on-check", + "material/bag-carry-on-off", + "material/bag-carry-on", + "material/bag-checked", + "material/bag-personal-off-outline", + "material/bag-personal-off", + "material/bag-personal-outline", + "material/bag-personal-plus-outline", + "material/bag-personal-plus", + "material/bag-personal-tag-outline", + "material/bag-personal-tag", + "material/bag-personal", + "material/bag-suitcase-off-outline", + "material/bag-suitcase-off", + "material/bag-suitcase-outline", + "material/bag-suitcase", + "material/baguette", + "material/balcony", + "material/balloon", + "material/ballot-outline", + "material/ballot-recount-outline", + "material/ballot-recount", + "material/ballot", + "material/bandage", + "material/bank-check", + "material/bank-circle-outline", + "material/bank-circle", + "material/bank-minus", + "material/bank-off-outline", + "material/bank-off", + "material/bank-outline", + "material/bank-plus", + "material/bank-remove", + "material/bank-transfer-in", + "material/bank-transfer-out", + "material/bank-transfer", + "material/bank", + "material/barcode-off", + "material/barcode-scan", + "material/barcode", + "material/barley-off", + "material/barley", + "material/barn", + "material/barrel-outline", + "material/barrel", + "material/baseball-bat", + "material/baseball-diamond-outline", + "material/baseball-diamond", + "material/baseball-outline", + "material/baseball", + "material/bash", + "material/basket-check-outline", + "material/basket-check", + "material/basket-fill", + "material/basket-minus-outline", + "material/basket-minus", + "material/basket-off-outline", + "material/basket-off", + "material/basket-outline", + "material/basket-plus-outline", + "material/basket-plus", + "material/basket-remove-outline", + "material/basket-remove", + "material/basket-unfill", + "material/basket", + "material/basketball-hoop-outline", + "material/basketball-hoop", + "material/basketball", + "material/bat", + "material/bathtub-outline", + "material/bathtub", + "material/battery-10-bluetooth", + "material/battery-10", + "material/battery-20-bluetooth", + "material/battery-20", + "material/battery-30-bluetooth", + "material/battery-30", + "material/battery-40-bluetooth", + "material/battery-40", + "material/battery-50-bluetooth", + "material/battery-50", + "material/battery-60-bluetooth", + "material/battery-60", + "material/battery-70-bluetooth", + "material/battery-70", + "material/battery-80-bluetooth", + "material/battery-80", + "material/battery-90-bluetooth", + "material/battery-90", + "material/battery-alert-bluetooth", + "material/battery-alert-variant-outline", + "material/battery-alert-variant", + "material/battery-alert", + "material/battery-arrow-down-outline", + "material/battery-arrow-down", + "material/battery-arrow-up-outline", + "material/battery-arrow-up", + "material/battery-bluetooth-variant", + "material/battery-bluetooth", + "material/battery-charging-10", + "material/battery-charging-100", + "material/battery-charging-20", + "material/battery-charging-30", + "material/battery-charging-40", + "material/battery-charging-50", + "material/battery-charging-60", + "material/battery-charging-70", + "material/battery-charging-80", + "material/battery-charging-90", + "material/battery-charging-high", + "material/battery-charging-low", + "material/battery-charging-medium", + "material/battery-charging-outline", + "material/battery-charging-wireless-10", + "material/battery-charging-wireless-20", + "material/battery-charging-wireless-30", + "material/battery-charging-wireless-40", + "material/battery-charging-wireless-50", + "material/battery-charging-wireless-60", + "material/battery-charging-wireless-70", + "material/battery-charging-wireless-80", + "material/battery-charging-wireless-90", + "material/battery-charging-wireless-alert", + "material/battery-charging-wireless-outline", + "material/battery-charging-wireless", + "material/battery-charging", + "material/battery-check-outline", + "material/battery-check", + "material/battery-clock-outline", + "material/battery-clock", + "material/battery-heart-outline", + "material/battery-heart-variant", + "material/battery-heart", + "material/battery-high", + "material/battery-lock-open", + "material/battery-lock", + "material/battery-low", + "material/battery-medium", + "material/battery-minus-outline", + "material/battery-minus-variant", + "material/battery-minus", + "material/battery-negative", + "material/battery-off-outline", + "material/battery-off", + "material/battery-outline", + "material/battery-plus-outline", + "material/battery-plus-variant", + "material/battery-plus", + "material/battery-positive", + "material/battery-remove-outline", + "material/battery-remove", + "material/battery-sync-outline", + "material/battery-sync", + "material/battery-unknown-bluetooth", + "material/battery-unknown", + "material/battery", + "material/beach", + "material/beaker-alert-outline", + "material/beaker-alert", + "material/beaker-check-outline", + "material/beaker-check", + "material/beaker-minus-outline", + "material/beaker-minus", + "material/beaker-outline", + "material/beaker-plus-outline", + "material/beaker-plus", + "material/beaker-question-outline", + "material/beaker-question", + "material/beaker-remove-outline", + "material/beaker-remove", + "material/beaker", + "material/bed-clock", + "material/bed-double-outline", + "material/bed-double", + "material/bed-empty", + "material/bed-king-outline", + "material/bed-king", + "material/bed-outline", + "material/bed-queen-outline", + "material/bed-queen", + "material/bed-single-outline", + "material/bed-single", + "material/bed", + "material/bee-flower", + "material/bee", + "material/beehive-off-outline", + "material/beehive-outline", + "material/beekeeper", + "material/beer-outline", + "material/beer", + "material/bell-alert-outline", + "material/bell-alert", + "material/bell-badge-outline", + "material/bell-badge", + "material/bell-cancel-outline", + "material/bell-cancel", + "material/bell-check-outline", + "material/bell-check", + "material/bell-circle-outline", + "material/bell-circle", + "material/bell-cog-outline", + "material/bell-cog", + "material/bell-minus-outline", + "material/bell-minus", + "material/bell-off-outline", + "material/bell-off", + "material/bell-outline", + "material/bell-plus-outline", + "material/bell-plus", + "material/bell-remove-outline", + "material/bell-remove", + "material/bell-ring-outline", + "material/bell-ring", + "material/bell-sleep-outline", + "material/bell-sleep", + "material/bell", + "material/bench-back", + "material/bench", + "material/beta", + "material/betamax", + "material/biathlon", + "material/bicycle-basket", + "material/bicycle-cargo", + "material/bicycle-electric", + "material/bicycle-penny-farthing", + "material/bicycle", + "material/bike-fast", + "material/bike-pedal-clipless", + "material/bike-pedal-mountain", + "material/bike-pedal", + "material/bike", + "material/billboard", + "material/billiards-rack", + "material/billiards", + "material/binoculars", + "material/bio", + "material/biohazard", + "material/bird", + "material/bitbucket", + "material/bitcoin", + "material/black-mesa", + "material/blender-outline", + "material/blender-software", + "material/blender", + "material/blinds-horizontal-closed", + "material/blinds-horizontal", + "material/blinds-open", + "material/blinds-vertical-closed", + "material/blinds-vertical", + "material/blinds", + "material/block-helper", + "material/blood-bag", + "material/bluetooth-audio", + "material/bluetooth-connect", + "material/bluetooth-off", + "material/bluetooth-settings", + "material/bluetooth-transfer", + "material/bluetooth", + "material/blur-linear", + "material/blur-off", + "material/blur-radial", + "material/blur", + "material/bolt", + "material/bomb-off", + "material/bomb", + "material/bone-off", + "material/bone", + "material/book-account-outline", + "material/book-account", + "material/book-alert-outline", + "material/book-alert", + "material/book-alphabet", + "material/book-arrow-down-outline", + "material/book-arrow-down", + "material/book-arrow-left-outline", + "material/book-arrow-left", + "material/book-arrow-right-outline", + "material/book-arrow-right", + "material/book-arrow-up-outline", + "material/book-arrow-up", + "material/book-cancel-outline", + "material/book-cancel", + "material/book-check-outline", + "material/book-check", + "material/book-clock-outline", + "material/book-clock", + "material/book-cog-outline", + "material/book-cog", + "material/book-cross", + "material/book-edit-outline", + "material/book-edit", + "material/book-education-outline", + "material/book-education", + "material/book-heart-outline", + "material/book-heart", + "material/book-information-variant", + "material/book-lock-open-outline", + "material/book-lock-open", + "material/book-lock-outline", + "material/book-lock", + "material/book-marker-outline", + "material/book-marker", + "material/book-minus-multiple-outline", + "material/book-minus-multiple", + "material/book-minus-outline", + "material/book-minus", + "material/book-multiple-outline", + "material/book-multiple", + "material/book-music-outline", + "material/book-music", + "material/book-off-outline", + "material/book-off", + "material/book-open-blank-variant", + "material/book-open-outline", + "material/book-open-page-variant-outline", + "material/book-open-page-variant", + "material/book-open-variant", + "material/book-open", + "material/book-outline", + "material/book-play-outline", + "material/book-play", + "material/book-plus-multiple-outline", + "material/book-plus-multiple", + "material/book-plus-outline", + "material/book-plus", + "material/book-refresh-outline", + "material/book-refresh", + "material/book-remove-multiple-outline", + "material/book-remove-multiple", + "material/book-remove-outline", + "material/book-remove", + "material/book-search-outline", + "material/book-search", + "material/book-settings-outline", + "material/book-settings", + "material/book-sync-outline", + "material/book-sync", + "material/book-variant", + "material/book", + "material/bookmark-box-multiple-outline", + "material/bookmark-box-multiple", + "material/bookmark-box-outline", + "material/bookmark-box", + "material/bookmark-check-outline", + "material/bookmark-check", + "material/bookmark-minus-outline", + "material/bookmark-minus", + "material/bookmark-multiple-outline", + "material/bookmark-multiple", + "material/bookmark-music-outline", + "material/bookmark-music", + "material/bookmark-off-outline", + "material/bookmark-off", + "material/bookmark-outline", + "material/bookmark-plus-outline", + "material/bookmark-plus", + "material/bookmark-remove-outline", + "material/bookmark-remove", + "material/bookmark", + "material/bookshelf", + "material/boom-gate-alert-outline", + "material/boom-gate-alert", + "material/boom-gate-arrow-down-outline", + "material/boom-gate-arrow-down", + "material/boom-gate-arrow-up-outline", + "material/boom-gate-arrow-up", + "material/boom-gate-outline", + "material/boom-gate-up-outline", + "material/boom-gate-up", + "material/boom-gate", + "material/boombox", + "material/boomerang", + "material/bootstrap", + "material/border-all-variant", + "material/border-all", + "material/border-bottom-variant", + "material/border-bottom", + "material/border-color", + "material/border-horizontal", + "material/border-inside", + "material/border-left-variant", + "material/border-left", + "material/border-none-variant", + "material/border-none", + "material/border-outside", + "material/border-radius", + "material/border-right-variant", + "material/border-right", + "material/border-style", + "material/border-top-variant", + "material/border-top", + "material/border-vertical", + "material/bottle-soda-classic-outline", + "material/bottle-soda-classic", + "material/bottle-soda-outline", + "material/bottle-soda", + "material/bottle-tonic-outline", + "material/bottle-tonic-plus-outline", + "material/bottle-tonic-plus", + "material/bottle-tonic-skull-outline", + "material/bottle-tonic-skull", + "material/bottle-tonic", + "material/bottle-wine-outline", + "material/bottle-wine", + "material/bow-arrow", + "material/bow-tie", + "material/bowl-mix-outline", + "material/bowl-mix", + "material/bowl-outline", + "material/bowl", + "material/bowling", + "material/box-cutter-off", + "material/box-cutter", + "material/box-shadow", + "material/box", + "material/boxing-glove", + "material/braille", + "material/brain", + "material/bread-slice-outline", + "material/bread-slice", + "material/bridge", + "material/briefcase-account-outline", + "material/briefcase-account", + "material/briefcase-arrow-left-right-outline", + "material/briefcase-arrow-left-right", + "material/briefcase-arrow-up-down-outline", + "material/briefcase-arrow-up-down", + "material/briefcase-check-outline", + "material/briefcase-check", + "material/briefcase-clock-outline", + "material/briefcase-clock", + "material/briefcase-download-outline", + "material/briefcase-download", + "material/briefcase-edit-outline", + "material/briefcase-edit", + "material/briefcase-eye-outline", + "material/briefcase-eye", + "material/briefcase-minus-outline", + "material/briefcase-minus", + "material/briefcase-off-outline", + "material/briefcase-off", + "material/briefcase-outline", + "material/briefcase-plus-outline", + "material/briefcase-plus", + "material/briefcase-remove-outline", + "material/briefcase-remove", + "material/briefcase-search-outline", + "material/briefcase-search", + "material/briefcase-upload-outline", + "material/briefcase-upload", + "material/briefcase-variant-off-outline", + "material/briefcase-variant-off", + "material/briefcase-variant-outline", + "material/briefcase-variant", + "material/briefcase", + "material/brightness-1", + "material/brightness-2", + "material/brightness-3", + "material/brightness-4", + "material/brightness-5", + "material/brightness-6", + "material/brightness-7", + "material/brightness-auto", + "material/brightness-percent", + "material/broadcast-off", + "material/broadcast", + "material/broom", + "material/brush-off", + "material/brush-outline", + "material/brush-variant", + "material/brush", + "material/bucket-outline", + "material/bucket", + "material/buffet", + "material/bug-check-outline", + "material/bug-check", + "material/bug-outline", + "material/bug-pause-outline", + "material/bug-pause", + "material/bug-play-outline", + "material/bug-play", + "material/bug-stop-outline", + "material/bug-stop", + "material/bug", + "material/bugle", + "material/bulkhead-light", + "material/bulldozer", + "material/bullet", + "material/bulletin-board", + "material/bullhorn-outline", + "material/bullhorn-variant-outline", + "material/bullhorn-variant", + "material/bullhorn", + "material/bullseye-arrow", + "material/bullseye", + "material/bulma", + "material/bunk-bed-outline", + "material/bunk-bed", + "material/bus-alert", + "material/bus-articulated-end", + "material/bus-articulated-front", + "material/bus-clock", + "material/bus-double-decker", + "material/bus-electric", + "material/bus-marker", + "material/bus-multiple", + "material/bus-school", + "material/bus-side", + "material/bus-sign", + "material/bus-stop-covered", + "material/bus-stop-uncovered", + "material/bus-stop", + "material/bus-wrench", + "material/bus", + "material/butterfly-outline", + "material/butterfly", + "material/button-cursor", + "material/button-pointer", + "material/cabin-a-frame", + "material/cable-data", + "material/cached", + "material/cactus", + "material/cake-layered", + "material/cake-variant-outline", + "material/cake-variant", + "material/cake", + "material/calculator-variant-outline", + "material/calculator-variant", + "material/calculator", + "material/calendar-account-outline", + "material/calendar-account", + "material/calendar-alert-outline", + "material/calendar-alert", + "material/calendar-arrow-left", + "material/calendar-arrow-right", + "material/calendar-badge-outline", + "material/calendar-badge", + "material/calendar-blank-multiple", + "material/calendar-blank-outline", + "material/calendar-blank", + "material/calendar-check-outline", + "material/calendar-check", + "material/calendar-clock-outline", + "material/calendar-clock", + "material/calendar-collapse-horizontal-outline", + "material/calendar-collapse-horizontal", + "material/calendar-cursor-outline", + "material/calendar-cursor", + "material/calendar-edit-outline", + "material/calendar-edit", + "material/calendar-end-outline", + "material/calendar-end", + "material/calendar-expand-horizontal-outline", + "material/calendar-expand-horizontal", + "material/calendar-export-outline", + "material/calendar-export", + "material/calendar-filter-outline", + "material/calendar-filter", + "material/calendar-heart-outline", + "material/calendar-heart", + "material/calendar-import-outline", + "material/calendar-import", + "material/calendar-lock-open-outline", + "material/calendar-lock-open", + "material/calendar-lock-outline", + "material/calendar-lock", + "material/calendar-minus-outline", + "material/calendar-minus", + "material/calendar-month-outline", + "material/calendar-month", + "material/calendar-multiple-check", + "material/calendar-multiple", + "material/calendar-multiselect-outline", + "material/calendar-multiselect", + "material/calendar-outline", + "material/calendar-plus-outline", + "material/calendar-plus", + "material/calendar-question-outline", + "material/calendar-question", + "material/calendar-range-outline", + "material/calendar-range", + "material/calendar-refresh-outline", + "material/calendar-refresh", + "material/calendar-remove-outline", + "material/calendar-remove", + "material/calendar-search-outline", + "material/calendar-search", + "material/calendar-star-four-points", + "material/calendar-star-outline", + "material/calendar-star", + "material/calendar-start-outline", + "material/calendar-start", + "material/calendar-sync-outline", + "material/calendar-sync", + "material/calendar-text-outline", + "material/calendar-text", + "material/calendar-today-outline", + "material/calendar-today", + "material/calendar-week-begin-outline", + "material/calendar-week-begin", + "material/calendar-week-outline", + "material/calendar-week", + "material/calendar-weekend-outline", + "material/calendar-weekend", + "material/calendar", + "material/call-made", + "material/call-merge", + "material/call-missed", + "material/call-received", + "material/call-split", + "material/camcorder-off", + "material/camcorder", + "material/camera-account", + "material/camera-burst", + "material/camera-control", + "material/camera-document-off", + "material/camera-document", + "material/camera-enhance-outline", + "material/camera-enhance", + "material/camera-flip-outline", + "material/camera-flip", + "material/camera-front-variant", + "material/camera-front", + "material/camera-gopro", + "material/camera-image", + "material/camera-iris", + "material/camera-lock-open-outline", + "material/camera-lock-open", + "material/camera-lock-outline", + "material/camera-lock", + "material/camera-marker-outline", + "material/camera-marker", + "material/camera-metering-center", + "material/camera-metering-matrix", + "material/camera-metering-partial", + "material/camera-metering-spot", + "material/camera-off-outline", + "material/camera-off", + "material/camera-outline", + "material/camera-party-mode", + "material/camera-plus-outline", + "material/camera-plus", + "material/camera-rear-variant", + "material/camera-rear", + "material/camera-retake-outline", + "material/camera-retake", + "material/camera-switch-outline", + "material/camera-switch", + "material/camera-timer", + "material/camera-wireless-outline", + "material/camera-wireless", + "material/camera", + "material/campfire", + "material/cancel", + "material/candelabra-fire", + "material/candelabra", + "material/candle", + "material/candy-off-outline", + "material/candy-off", + "material/candy-outline", + "material/candy", + "material/candycane", + "material/cannabis-off", + "material/cannabis", + "material/caps-lock", + "material/car-2-plus", + "material/car-3-plus", + "material/car-arrow-left", + "material/car-arrow-right", + "material/car-back", + "material/car-battery", + "material/car-brake-abs", + "material/car-brake-alert", + "material/car-brake-fluid-level", + "material/car-brake-hold", + "material/car-brake-low-pressure", + "material/car-brake-parking", + "material/car-brake-retarder", + "material/car-brake-temperature", + "material/car-brake-worn-linings", + "material/car-child-seat", + "material/car-clock", + "material/car-clutch", + "material/car-cog", + "material/car-connected", + "material/car-convertible", + "material/car-coolant-level", + "material/car-cruise-control", + "material/car-defrost-front", + "material/car-defrost-rear", + "material/car-door-lock-open", + "material/car-door-lock", + "material/car-door", + "material/car-electric-outline", + "material/car-electric", + "material/car-emergency", + "material/car-esp", + "material/car-estate", + "material/car-hatchback", + "material/car-info", + "material/car-key", + "material/car-lifted-pickup", + "material/car-light-alert", + "material/car-light-dimmed", + "material/car-light-fog", + "material/car-light-high", + "material/car-limousine", + "material/car-multiple", + "material/car-off", + "material/car-outline", + "material/car-parking-lights", + "material/car-pickup", + "material/car-search-outline", + "material/car-search", + "material/car-seat-cooler", + "material/car-seat-heater", + "material/car-seat", + "material/car-select", + "material/car-settings", + "material/car-shift-pattern", + "material/car-side", + "material/car-speed-limiter", + "material/car-sports", + "material/car-tire-alert", + "material/car-traction-control", + "material/car-turbocharger", + "material/car-wash", + "material/car-windshield-outline", + "material/car-windshield", + "material/car-wireless", + "material/car-wrench", + "material/car", + "material/carabiner", + "material/caravan", + "material/card-account-details-outline", + "material/card-account-details-star-outline", + "material/card-account-details-star", + "material/card-account-details", + "material/card-account-mail-outline", + "material/card-account-mail", + "material/card-account-phone-outline", + "material/card-account-phone", + "material/card-bulleted-off-outline", + "material/card-bulleted-off", + "material/card-bulleted-outline", + "material/card-bulleted-settings-outline", + "material/card-bulleted-settings", + "material/card-bulleted", + "material/card-minus-outline", + "material/card-minus", + "material/card-multiple-outline", + "material/card-multiple", + "material/card-off-outline", + "material/card-off", + "material/card-outline", + "material/card-plus-outline", + "material/card-plus", + "material/card-remove-outline", + "material/card-remove", + "material/card-search-outline", + "material/card-search", + "material/card-text-outline", + "material/card-text", + "material/card", + "material/cards-club-outline", + "material/cards-club", + "material/cards-diamond-outline", + "material/cards-diamond", + "material/cards-heart-outline", + "material/cards-heart", + "material/cards-outline", + "material/cards-playing-club-multiple-outline", + "material/cards-playing-club-multiple", + "material/cards-playing-club-outline", + "material/cards-playing-club", + "material/cards-playing-diamond-multiple-outline", + "material/cards-playing-diamond-multiple", + "material/cards-playing-diamond-outline", + "material/cards-playing-diamond", + "material/cards-playing-heart-multiple-outline", + "material/cards-playing-heart-multiple", + "material/cards-playing-heart-outline", + "material/cards-playing-heart", + "material/cards-playing-outline", + "material/cards-playing-spade-multiple-outline", + "material/cards-playing-spade-multiple", + "material/cards-playing-spade-outline", + "material/cards-playing-spade", + "material/cards-playing", + "material/cards-spade-outline", + "material/cards-spade", + "material/cards-variant", + "material/cards", + "material/carrot", + "material/cart-arrow-down", + "material/cart-arrow-right", + "material/cart-arrow-up", + "material/cart-check", + "material/cart-heart", + "material/cart-minus", + "material/cart-off", + "material/cart-outline", + "material/cart-percent", + "material/cart-plus", + "material/cart-remove", + "material/cart-variant", + "material/cart", + "material/case-sensitive-alt", + "material/cash-100", + "material/cash-check", + "material/cash-clock", + "material/cash-edit", + "material/cash-fast", + "material/cash-lock-open", + "material/cash-lock", + "material/cash-marker", + "material/cash-minus", + "material/cash-multiple", + "material/cash-off", + "material/cash-plus", + "material/cash-refund", + "material/cash-register", + "material/cash-remove", + "material/cash-sync", + "material/cash", + "material/cassette", + "material/cast-audio-variant", + "material/cast-audio", + "material/cast-connected", + "material/cast-education", + "material/cast-off", + "material/cast-variant", + "material/cast", + "material/castle", + "material/cat", + "material/cctv-off", + "material/cctv", + "material/ceiling-fan-light", + "material/ceiling-fan", + "material/ceiling-light-multiple-outline", + "material/ceiling-light-multiple", + "material/ceiling-light-outline", + "material/ceiling-light", + "material/cellphone-arrow-down-variant", + "material/cellphone-arrow-down", + "material/cellphone-basic", + "material/cellphone-charging", + "material/cellphone-check", + "material/cellphone-cog", + "material/cellphone-dock", + "material/cellphone-information", + "material/cellphone-key", + "material/cellphone-link-off", + "material/cellphone-link", + "material/cellphone-lock", + "material/cellphone-marker", + "material/cellphone-message-off", + "material/cellphone-message", + "material/cellphone-nfc-off", + "material/cellphone-nfc", + "material/cellphone-off", + "material/cellphone-play", + "material/cellphone-remove", + "material/cellphone-screenshot", + "material/cellphone-settings", + "material/cellphone-sound", + "material/cellphone-text", + "material/cellphone-wireless", + "material/cellphone", + "material/centos", + "material/certificate-outline", + "material/certificate", + "material/chair-rolling", + "material/chair-school", + "material/chandelier", + "material/charity-search", + "material/charity", + "material/chart-arc", + "material/chart-areaspline-variant", + "material/chart-areaspline", + "material/chart-bar-stacked", + "material/chart-bar", + "material/chart-bell-curve-cumulative", + "material/chart-bell-curve", + "material/chart-box-outline", + "material/chart-box-plus-outline", + "material/chart-box", + "material/chart-bubble", + "material/chart-donut-variant", + "material/chart-donut", + "material/chart-gantt", + "material/chart-histogram", + "material/chart-line-stacked", + "material/chart-line-variant", + "material/chart-line", + "material/chart-multiline", + "material/chart-multiple", + "material/chart-pie-outline", + "material/chart-pie", + "material/chart-ppf", + "material/chart-sankey-variant", + "material/chart-sankey", + "material/chart-scatter-plot-hexbin", + "material/chart-scatter-plot", + "material/chart-timeline-variant-shimmer", + "material/chart-timeline-variant", + "material/chart-timeline", + "material/chart-tree", + "material/chart-waterfall", + "material/chat-alert-outline", + "material/chat-alert", + "material/chat-minus-outline", + "material/chat-minus", + "material/chat-outline", + "material/chat-plus-outline", + "material/chat-plus", + "material/chat-processing-outline", + "material/chat-processing", + "material/chat-question-outline", + "material/chat-question", + "material/chat-remove-outline", + "material/chat-remove", + "material/chat-sleep-outline", + "material/chat-sleep", + "material/chat", + "material/check-all", + "material/check-bold", + "material/check-circle-outline", + "material/check-circle", + "material/check-decagram-outline", + "material/check-decagram", + "material/check-network-outline", + "material/check-network", + "material/check-outline", + "material/check-underline-circle-outline", + "material/check-underline-circle", + "material/check-underline", + "material/check", + "material/checkbook-arrow-left", + "material/checkbook-arrow-right", + "material/checkbook", + "material/checkbox-blank-badge-outline", + "material/checkbox-blank-badge", + "material/checkbox-blank-circle-outline", + "material/checkbox-blank-circle", + "material/checkbox-blank-off-outline", + "material/checkbox-blank-off", + "material/checkbox-blank-outline", + "material/checkbox-blank", + "material/checkbox-intermediate-variant", + "material/checkbox-intermediate", + "material/checkbox-marked-circle-auto-outline", + "material/checkbox-marked-circle-minus-outline", + "material/checkbox-marked-circle-outline", + "material/checkbox-marked-circle-plus-outline", + "material/checkbox-marked-circle", + "material/checkbox-marked-outline", + "material/checkbox-marked", + "material/checkbox-multiple-blank-circle-outline", + "material/checkbox-multiple-blank-circle", + "material/checkbox-multiple-blank-outline", + "material/checkbox-multiple-blank", + "material/checkbox-multiple-marked-circle-outline", + "material/checkbox-multiple-marked-circle", + "material/checkbox-multiple-marked-outline", + "material/checkbox-multiple-marked", + "material/checkbox-multiple-outline", + "material/checkbox-outline", + "material/checkerboard-minus", + "material/checkerboard-plus", + "material/checkerboard-remove", + "material/checkerboard", + "material/cheese-off", + "material/cheese", + "material/chef-hat", + "material/chemical-weapon", + "material/chess-bishop", + "material/chess-king", + "material/chess-knight", + "material/chess-pawn", + "material/chess-queen", + "material/chess-rook", + "material/chevron-double-down", + "material/chevron-double-left", + "material/chevron-double-right", + "material/chevron-double-up", + "material/chevron-down-box-outline", + "material/chevron-down-box", + "material/chevron-down-circle-outline", + "material/chevron-down-circle", + "material/chevron-down", + "material/chevron-left-box-outline", + "material/chevron-left-box", + "material/chevron-left-circle-outline", + "material/chevron-left-circle", + "material/chevron-left", + "material/chevron-right-box-outline", + "material/chevron-right-box", + "material/chevron-right-circle-outline", + "material/chevron-right-circle", + "material/chevron-right", + "material/chevron-triple-down", + "material/chevron-triple-left", + "material/chevron-triple-right", + "material/chevron-triple-up", + "material/chevron-up-box-outline", + "material/chevron-up-box", + "material/chevron-up-circle-outline", + "material/chevron-up-circle", + "material/chevron-up", + "material/chili-alert-outline", + "material/chili-alert", + "material/chili-hot-outline", + "material/chili-hot", + "material/chili-medium-outline", + "material/chili-medium", + "material/chili-mild-outline", + "material/chili-mild", + "material/chili-off-outline", + "material/chili-off", + "material/chip", + "material/church-outline", + "material/church", + "material/cigar-off", + "material/cigar", + "material/circle-box-outline", + "material/circle-box", + "material/circle-double", + "material/circle-edit-outline", + "material/circle-expand", + "material/circle-half-full", + "material/circle-half", + "material/circle-medium", + "material/circle-multiple-outline", + "material/circle-multiple", + "material/circle-off-outline", + "material/circle-opacity", + "material/circle-outline", + "material/circle-slice-1", + "material/circle-slice-2", + "material/circle-slice-3", + "material/circle-slice-4", + "material/circle-slice-5", + "material/circle-slice-6", + "material/circle-slice-7", + "material/circle-slice-8", + "material/circle-small", + "material/circle", + "material/circular-saw", + "material/city-switch", + "material/city-variant-outline", + "material/city-variant", + "material/city", + "material/clipboard-account-outline", + "material/clipboard-account", + "material/clipboard-alert-outline", + "material/clipboard-alert", + "material/clipboard-arrow-down-outline", + "material/clipboard-arrow-down", + "material/clipboard-arrow-left-outline", + "material/clipboard-arrow-left", + "material/clipboard-arrow-right-outline", + "material/clipboard-arrow-right", + "material/clipboard-arrow-up-outline", + "material/clipboard-arrow-up", + "material/clipboard-check-multiple-outline", + "material/clipboard-check-multiple", + "material/clipboard-check-outline", + "material/clipboard-check", + "material/clipboard-clock-outline", + "material/clipboard-clock", + "material/clipboard-edit-outline", + "material/clipboard-edit", + "material/clipboard-file-outline", + "material/clipboard-file", + "material/clipboard-flow-outline", + "material/clipboard-flow", + "material/clipboard-list-outline", + "material/clipboard-list", + "material/clipboard-minus-outline", + "material/clipboard-minus", + "material/clipboard-multiple-outline", + "material/clipboard-multiple", + "material/clipboard-off-outline", + "material/clipboard-off", + "material/clipboard-outline", + "material/clipboard-play-multiple-outline", + "material/clipboard-play-multiple", + "material/clipboard-play-outline", + "material/clipboard-play", + "material/clipboard-plus-outline", + "material/clipboard-plus", + "material/clipboard-pulse-outline", + "material/clipboard-pulse", + "material/clipboard-remove-outline", + "material/clipboard-remove", + "material/clipboard-search-outline", + "material/clipboard-search", + "material/clipboard-text-clock-outline", + "material/clipboard-text-clock", + "material/clipboard-text-multiple-outline", + "material/clipboard-text-multiple", + "material/clipboard-text-off-outline", + "material/clipboard-text-off", + "material/clipboard-text-outline", + "material/clipboard-text-play-outline", + "material/clipboard-text-play", + "material/clipboard-text-search-outline", + "material/clipboard-text-search", + "material/clipboard-text", + "material/clipboard", + "material/clippy", + "material/clock-alert-outline", + "material/clock-alert", + "material/clock-check-outline", + "material/clock-check", + "material/clock-digital", + "material/clock-edit-outline", + "material/clock-edit", + "material/clock-end", + "material/clock-fast", + "material/clock-in", + "material/clock-minus-outline", + "material/clock-minus", + "material/clock-out", + "material/clock-outline", + "material/clock-plus-outline", + "material/clock-plus", + "material/clock-remove-outline", + "material/clock-remove", + "material/clock-star-four-points-outline", + "material/clock-star-four-points", + "material/clock-start", + "material/clock-time-eight-outline", + "material/clock-time-eight", + "material/clock-time-eleven-outline", + "material/clock-time-eleven", + "material/clock-time-five-outline", + "material/clock-time-five", + "material/clock-time-four-outline", + "material/clock-time-four", + "material/clock-time-nine-outline", + "material/clock-time-nine", + "material/clock-time-one-outline", + "material/clock-time-one", + "material/clock-time-seven-outline", + "material/clock-time-seven", + "material/clock-time-six-outline", + "material/clock-time-six", + "material/clock-time-ten-outline", + "material/clock-time-ten", + "material/clock-time-three-outline", + "material/clock-time-three", + "material/clock-time-twelve-outline", + "material/clock-time-twelve", + "material/clock-time-two-outline", + "material/clock-time-two", + "material/clock", + "material/close-box-multiple-outline", + "material/close-box-multiple", + "material/close-box-outline", + "material/close-box", + "material/close-circle-multiple-outline", + "material/close-circle-multiple", + "material/close-circle-outline", + "material/close-circle", + "material/close-network-outline", + "material/close-network", + "material/close-octagon-outline", + "material/close-octagon", + "material/close-outline", + "material/close-thick", + "material/close", + "material/closed-caption-outline", + "material/closed-caption", + "material/cloud-alert-outline", + "material/cloud-alert", + "material/cloud-arrow-down-outline", + "material/cloud-arrow-down", + "material/cloud-arrow-left-outline", + "material/cloud-arrow-left", + "material/cloud-arrow-right-outline", + "material/cloud-arrow-right", + "material/cloud-arrow-up-outline", + "material/cloud-arrow-up", + "material/cloud-braces", + "material/cloud-cancel-outline", + "material/cloud-cancel", + "material/cloud-check-outline", + "material/cloud-check-variant-outline", + "material/cloud-check-variant", + "material/cloud-check", + "material/cloud-circle-outline", + "material/cloud-circle", + "material/cloud-clock-outline", + "material/cloud-clock", + "material/cloud-cog-outline", + "material/cloud-cog", + "material/cloud-download-outline", + "material/cloud-download", + "material/cloud-key-outline", + "material/cloud-key", + "material/cloud-lock-open-outline", + "material/cloud-lock-open", + "material/cloud-lock-outline", + "material/cloud-lock", + "material/cloud-minus-outline", + "material/cloud-minus", + "material/cloud-off-outline", + "material/cloud-off", + "material/cloud-outline", + "material/cloud-percent-outline", + "material/cloud-percent", + "material/cloud-plus-outline", + "material/cloud-plus", + "material/cloud-print-outline", + "material/cloud-print", + "material/cloud-question-outline", + "material/cloud-question", + "material/cloud-refresh-outline", + "material/cloud-refresh-variant-outline", + "material/cloud-refresh-variant", + "material/cloud-refresh", + "material/cloud-remove-outline", + "material/cloud-remove", + "material/cloud-search-outline", + "material/cloud-search", + "material/cloud-sync-outline", + "material/cloud-sync", + "material/cloud-tags", + "material/cloud-upload-outline", + "material/cloud-upload", + "material/cloud", + "material/clouds", + "material/clover-outline", + "material/clover", + "material/coach-lamp-variant", + "material/coach-lamp", + "material/coat-rack", + "material/code-array", + "material/code-block-braces", + "material/code-block-brackets", + "material/code-block-parentheses", + "material/code-block-tags", + "material/code-braces-box", + "material/code-braces", + "material/code-brackets", + "material/code-equal", + "material/code-greater-than-or-equal", + "material/code-greater-than", + "material/code-json", + "material/code-less-than-or-equal", + "material/code-less-than", + "material/code-not-equal-variant", + "material/code-not-equal", + "material/code-parentheses-box", + "material/code-parentheses", + "material/code-string", + "material/code-tags-check", + "material/code-tags", + "material/codepen", + "material/coffee-maker-check-outline", + "material/coffee-maker-check", + "material/coffee-maker-outline", + "material/coffee-maker", + "material/coffee-off-outline", + "material/coffee-off", + "material/coffee-outline", + "material/coffee-to-go-outline", + "material/coffee-to-go", + "material/coffee", + "material/coffin", + "material/cog-box", + "material/cog-clockwise", + "material/cog-counterclockwise", + "material/cog-off-outline", + "material/cog-off", + "material/cog-outline", + "material/cog-pause-outline", + "material/cog-pause", + "material/cog-play-outline", + "material/cog-play", + "material/cog-refresh-outline", + "material/cog-refresh", + "material/cog-stop-outline", + "material/cog-stop", + "material/cog-sync-outline", + "material/cog-sync", + "material/cog-transfer-outline", + "material/cog-transfer", + "material/cog", + "material/cogs", + "material/collage", + "material/collapse-all-outline", + "material/collapse-all", + "material/color-helper", + "material/comma-box-outline", + "material/comma-box", + "material/comma-circle-outline", + "material/comma-circle", + "material/comma", + "material/comment-account-outline", + "material/comment-account", + "material/comment-alert-outline", + "material/comment-alert", + "material/comment-arrow-left-outline", + "material/comment-arrow-left", + "material/comment-arrow-right-outline", + "material/comment-arrow-right", + "material/comment-bookmark-outline", + "material/comment-bookmark", + "material/comment-check-outline", + "material/comment-check", + "material/comment-edit-outline", + "material/comment-edit", + "material/comment-eye-outline", + "material/comment-eye", + "material/comment-flash-outline", + "material/comment-flash", + "material/comment-minus-outline", + "material/comment-minus", + "material/comment-multiple-outline", + "material/comment-multiple", + "material/comment-off-outline", + "material/comment-off", + "material/comment-outline", + "material/comment-plus-outline", + "material/comment-plus", + "material/comment-processing-outline", + "material/comment-processing", + "material/comment-question-outline", + "material/comment-question", + "material/comment-quote-outline", + "material/comment-quote", + "material/comment-remove-outline", + "material/comment-remove", + "material/comment-search-outline", + "material/comment-search", + "material/comment-text-multiple-outline", + "material/comment-text-multiple", + "material/comment-text-outline", + "material/comment-text", + "material/comment", + "material/compare-horizontal", + "material/compare-remove", + "material/compare-vertical", + "material/compare", + "material/compass-off-outline", + "material/compass-off", + "material/compass-outline", + "material/compass-rose", + "material/compass", + "material/compost", + "material/cone-off", + "material/cone", + "material/connection", + "material/console-line", + "material/console-network-outline", + "material/console-network", + "material/console", + "material/consolidate", + "material/contactless-payment-circle-outline", + "material/contactless-payment-circle", + "material/contactless-payment", + "material/contacts-outline", + "material/contacts", + "material/contain-end", + "material/contain-start", + "material/contain", + "material/content-copy", + "material/content-cut", + "material/content-duplicate", + "material/content-paste", + "material/content-save-alert-outline", + "material/content-save-alert", + "material/content-save-all-outline", + "material/content-save-all", + "material/content-save-check-outline", + "material/content-save-check", + "material/content-save-cog-outline", + "material/content-save-cog", + "material/content-save-edit-outline", + "material/content-save-edit", + "material/content-save-minus-outline", + "material/content-save-minus", + "material/content-save-move-outline", + "material/content-save-move", + "material/content-save-off-outline", + "material/content-save-off", + "material/content-save-outline", + "material/content-save-plus-outline", + "material/content-save-plus", + "material/content-save-settings-outline", + "material/content-save-settings", + "material/content-save", + "material/contrast-box", + "material/contrast-circle", + "material/contrast", + "material/controller-classic-outline", + "material/controller-classic", + "material/controller-off", + "material/controller", + "material/cookie-alert-outline", + "material/cookie-alert", + "material/cookie-check-outline", + "material/cookie-check", + "material/cookie-clock-outline", + "material/cookie-clock", + "material/cookie-cog-outline", + "material/cookie-cog", + "material/cookie-edit-outline", + "material/cookie-edit", + "material/cookie-lock-outline", + "material/cookie-lock", + "material/cookie-minus-outline", + "material/cookie-minus", + "material/cookie-off-outline", + "material/cookie-off", + "material/cookie-outline", + "material/cookie-plus-outline", + "material/cookie-plus", + "material/cookie-refresh-outline", + "material/cookie-refresh", + "material/cookie-remove-outline", + "material/cookie-remove", + "material/cookie-settings-outline", + "material/cookie-settings", + "material/cookie", + "material/coolant-temperature", + "material/copyleft", + "material/copyright", + "material/cordova", + "material/corn-off", + "material/corn", + "material/cosine-wave", + "material/counter", + "material/countertop-outline", + "material/countertop", + "material/cow-off", + "material/cow", + "material/cpu-32-bit", + "material/cpu-64-bit", + "material/cradle-outline", + "material/cradle", + "material/crane", + "material/creation-outline", + "material/creation", + "material/creative-commons", + "material/credit-card-check-outline", + "material/credit-card-check", + "material/credit-card-chip-outline", + "material/credit-card-chip", + "material/credit-card-clock-outline", + "material/credit-card-clock", + "material/credit-card-edit-outline", + "material/credit-card-edit", + "material/credit-card-fast-outline", + "material/credit-card-fast", + "material/credit-card-lock-outline", + "material/credit-card-lock", + "material/credit-card-marker-outline", + "material/credit-card-marker", + "material/credit-card-minus-outline", + "material/credit-card-minus", + "material/credit-card-multiple-outline", + "material/credit-card-multiple", + "material/credit-card-off-outline", + "material/credit-card-off", + "material/credit-card-outline", + "material/credit-card-plus-outline", + "material/credit-card-plus", + "material/credit-card-refresh-outline", + "material/credit-card-refresh", + "material/credit-card-refund-outline", + "material/credit-card-refund", + "material/credit-card-remove-outline", + "material/credit-card-remove", + "material/credit-card-scan-outline", + "material/credit-card-scan", + "material/credit-card-search-outline", + "material/credit-card-search", + "material/credit-card-settings-outline", + "material/credit-card-settings", + "material/credit-card-sync-outline", + "material/credit-card-sync", + "material/credit-card-wireless-off-outline", + "material/credit-card-wireless-off", + "material/credit-card-wireless-outline", + "material/credit-card-wireless", + "material/credit-card", + "material/cricket", + "material/crop-free", + "material/crop-landscape", + "material/crop-portrait", + "material/crop-rotate", + "material/crop-square", + "material/crop", + "material/cross-bolnisi", + "material/cross-celtic", + "material/cross-outline", + "material/cross", + "material/crosshairs-gps", + "material/crosshairs-off", + "material/crosshairs-question", + "material/crosshairs", + "material/crowd", + "material/crown-circle-outline", + "material/crown-circle", + "material/crown-outline", + "material/crown", + "material/cryengine", + "material/crystal-ball", + "material/cube-off-outline", + "material/cube-off", + "material/cube-outline", + "material/cube-scan", + "material/cube-send", + "material/cube-unfolded", + "material/cube", + "material/cup-off-outline", + "material/cup-off", + "material/cup-outline", + "material/cup-water", + "material/cup", + "material/cupboard-outline", + "material/cupboard", + "material/cupcake", + "material/curling", + "material/currency-bdt", + "material/currency-brl", + "material/currency-btc", + "material/currency-cny", + "material/currency-eth", + "material/currency-eur-off", + "material/currency-eur", + "material/currency-fra", + "material/currency-gbp", + "material/currency-ils", + "material/currency-inr", + "material/currency-jpy", + "material/currency-krw", + "material/currency-kzt", + "material/currency-mnt", + "material/currency-ngn", + "material/currency-php", + "material/currency-rial", + "material/currency-rub", + "material/currency-rupee", + "material/currency-sign", + "material/currency-thb", + "material/currency-try", + "material/currency-twd", + "material/currency-uah", + "material/currency-usd-off", + "material/currency-usd", + "material/current-ac", + "material/current-dc", + "material/cursor-default-click-outline", + "material/cursor-default-click", + "material/cursor-default-gesture-outline", + "material/cursor-default-gesture", + "material/cursor-default-outline", + "material/cursor-default", + "material/cursor-move", + "material/cursor-pointer", + "material/cursor-text", + "material/curtains-closed", + "material/curtains", + "material/cylinder-off", + "material/cylinder", + "material/dance-ballroom", + "material/dance-pole", + "material/data-matrix-edit", + "material/data-matrix-minus", + "material/data-matrix-plus", + "material/data-matrix-remove", + "material/data-matrix-scan", + "material/data-matrix", + "material/database-alert-outline", + "material/database-alert", + "material/database-arrow-down-outline", + "material/database-arrow-down", + "material/database-arrow-left-outline", + "material/database-arrow-left", + "material/database-arrow-right-outline", + "material/database-arrow-right", + "material/database-arrow-up-outline", + "material/database-arrow-up", + "material/database-check-outline", + "material/database-check", + "material/database-clock-outline", + "material/database-clock", + "material/database-cog-outline", + "material/database-cog", + "material/database-edit-outline", + "material/database-edit", + "material/database-export-outline", + "material/database-export", + "material/database-eye-off-outline", + "material/database-eye-off", + "material/database-eye-outline", + "material/database-eye", + "material/database-import-outline", + "material/database-import", + "material/database-lock-outline", + "material/database-lock", + "material/database-marker-outline", + "material/database-marker", + "material/database-minus-outline", + "material/database-minus", + "material/database-off-outline", + "material/database-off", + "material/database-outline", + "material/database-plus-outline", + "material/database-plus", + "material/database-refresh-outline", + "material/database-refresh", + "material/database-remove-outline", + "material/database-remove", + "material/database-search-outline", + "material/database-search", + "material/database-settings-outline", + "material/database-settings", + "material/database-sync-outline", + "material/database-sync", + "material/database", + "material/death-star-variant", + "material/death-star", + "material/deathly-hallows", + "material/debian", + "material/debug-step-into", + "material/debug-step-out", + "material/debug-step-over", + "material/decagram-outline", + "material/decagram", + "material/decimal-comma-decrease", + "material/decimal-comma-increase", + "material/decimal-comma", + "material/decimal-decrease", + "material/decimal-increase", + "material/decimal", + "material/delete-alert-outline", + "material/delete-alert", + "material/delete-circle-outline", + "material/delete-circle", + "material/delete-clock-outline", + "material/delete-clock", + "material/delete-empty-outline", + "material/delete-empty", + "material/delete-forever-outline", + "material/delete-forever", + "material/delete-off-outline", + "material/delete-off", + "material/delete-outline", + "material/delete-restore", + "material/delete-sweep-outline", + "material/delete-sweep", + "material/delete-variant", + "material/delete", + "material/delta", + "material/desk-lamp-off", + "material/desk-lamp-on", + "material/desk-lamp", + "material/desk", + "material/deskphone", + "material/desktop-classic", + "material/desktop-tower-monitor", + "material/desktop-tower", + "material/details", + "material/dev-to", + "material/developer-board", + "material/deviantart", + "material/devices", + "material/dharmachakra", + "material/diabetes", + "material/dialpad", + "material/diameter-outline", + "material/diameter-variant", + "material/diameter", + "material/diamond-outline", + "material/diamond-stone", + "material/diamond", + "material/dice-1-outline", + "material/dice-1", + "material/dice-2-outline", + "material/dice-2", + "material/dice-3-outline", + "material/dice-3", + "material/dice-4-outline", + "material/dice-4", + "material/dice-5-outline", + "material/dice-5", + "material/dice-6-outline", + "material/dice-6", + "material/dice-d10-outline", + "material/dice-d10", + "material/dice-d12-outline", + "material/dice-d12", + "material/dice-d20-outline", + "material/dice-d20", + "material/dice-d4-outline", + "material/dice-d4", + "material/dice-d6-outline", + "material/dice-d6", + "material/dice-d8-outline", + "material/dice-d8", + "material/dice-multiple-outline", + "material/dice-multiple", + "material/digital-ocean", + "material/dip-switch", + "material/directions-fork", + "material/directions", + "material/disc-alert", + "material/disc-player", + "material/disc", + "material/dishwasher-alert", + "material/dishwasher-off", + "material/dishwasher", + "material/disqus", + "material/distribute-horizontal-center", + "material/distribute-horizontal-left", + "material/distribute-horizontal-right", + "material/distribute-vertical-bottom", + "material/distribute-vertical-center", + "material/distribute-vertical-top", + "material/diversify", + "material/diving-flippers", + "material/diving-helmet", + "material/diving-scuba-flag", + "material/diving-scuba-mask", + "material/diving-scuba-tank-multiple", + "material/diving-scuba-tank", + "material/diving-scuba", + "material/diving-snorkel", + "material/diving", + "material/division-box", + "material/division", + "material/dlna", + "material/dna", + "material/dns-outline", + "material/dns", + "material/dock-bottom", + "material/dock-left", + "material/dock-right", + "material/dock-top", + "material/dock-window", + "material/docker", + "material/doctor", + "material/dog-service", + "material/dog-side-off", + "material/dog-side", + "material/dog", + "material/dolby", + "material/dolly", + "material/dolphin", + "material/domain-off", + "material/domain-plus", + "material/domain-remove", + "material/domain-switch", + "material/domain", + "material/dome-light", + "material/domino-mask", + "material/donkey", + "material/door-closed-cancel", + "material/door-closed-lock", + "material/door-closed", + "material/door-open", + "material/door-sliding-lock", + "material/door-sliding-open", + "material/door-sliding", + "material/door", + "material/doorbell-video", + "material/doorbell", + "material/dot-net", + "material/dots-circle", + "material/dots-grid", + "material/dots-hexagon", + "material/dots-horizontal-circle-outline", + "material/dots-horizontal-circle", + "material/dots-horizontal", + "material/dots-square", + "material/dots-triangle", + "material/dots-vertical-circle-outline", + "material/dots-vertical-circle", + "material/dots-vertical", + "material/download-box-outline", + "material/download-box", + "material/download-circle-outline", + "material/download-circle", + "material/download-lock-outline", + "material/download-lock", + "material/download-multiple", + "material/download-network-outline", + "material/download-network", + "material/download-off-outline", + "material/download-off", + "material/download-outline", + "material/download", + "material/drag-horizontal-variant", + "material/drag-horizontal", + "material/drag-variant", + "material/drag-vertical-variant", + "material/drag-vertical", + "material/drag", + "material/drama-masks", + "material/draw-pen", + "material/draw", + "material/drawing-box", + "material/drawing", + "material/dresser-outline", + "material/dresser", + "material/drone", + "material/dropbox", + "material/drupal", + "material/duck", + "material/dumbbell", + "material/dump-truck", + "material/ear-hearing-loop", + "material/ear-hearing-off", + "material/ear-hearing", + "material/earbuds-off-outline", + "material/earbuds-off", + "material/earbuds-outline", + "material/earbuds", + "material/earth-arrow-down", + "material/earth-arrow-left", + "material/earth-arrow-right", + "material/earth-arrow-up", + "material/earth-box-minus", + "material/earth-box-off", + "material/earth-box-plus", + "material/earth-box-remove", + "material/earth-box", + "material/earth-minus", + "material/earth-off", + "material/earth-plus", + "material/earth-remove", + "material/earth", + "material/egg-easter", + "material/egg-fried", + "material/egg-off-outline", + "material/egg-off", + "material/egg-outline", + "material/egg", + "material/eiffel-tower", + "material/eight-track", + "material/eject-circle-outline", + "material/eject-circle", + "material/eject-outline", + "material/eject", + "material/electric-switch-closed", + "material/electric-switch", + "material/electron-framework", + "material/elephant", + "material/elevation-decline", + "material/elevation-rise", + "material/elevator-down", + "material/elevator-passenger-off-outline", + "material/elevator-passenger-off", + "material/elevator-passenger-outline", + "material/elevator-passenger", + "material/elevator-up", + "material/elevator", + "material/ellipse-outline", + "material/ellipse", + "material/email-alert-outline", + "material/email-alert", + "material/email-arrow-left-outline", + "material/email-arrow-left", + "material/email-arrow-right-outline", + "material/email-arrow-right", + "material/email-box", + "material/email-check-outline", + "material/email-check", + "material/email-edit-outline", + "material/email-edit", + "material/email-fast-outline", + "material/email-fast", + "material/email-heart-outline", + "material/email-lock-outline", + "material/email-lock", + "material/email-mark-as-unread", + "material/email-minus-outline", + "material/email-minus", + "material/email-multiple-outline", + "material/email-multiple", + "material/email-newsletter", + "material/email-off-outline", + "material/email-off", + "material/email-open-heart-outline", + "material/email-open-multiple-outline", + "material/email-open-multiple", + "material/email-open-outline", + "material/email-open", + "material/email-outline", + "material/email-plus-outline", + "material/email-plus", + "material/email-remove-outline", + "material/email-remove", + "material/email-seal-outline", + "material/email-seal", + "material/email-search-outline", + "material/email-search", + "material/email-sync-outline", + "material/email-sync", + "material/email-variant", + "material/email", + "material/ember", + "material/emby", + "material/emoticon-angry-outline", + "material/emoticon-angry", + "material/emoticon-confused-outline", + "material/emoticon-confused", + "material/emoticon-cool-outline", + "material/emoticon-cool", + "material/emoticon-cry-outline", + "material/emoticon-cry", + "material/emoticon-dead-outline", + "material/emoticon-dead", + "material/emoticon-devil-outline", + "material/emoticon-devil", + "material/emoticon-excited-outline", + "material/emoticon-excited", + "material/emoticon-frown-outline", + "material/emoticon-frown", + "material/emoticon-happy-outline", + "material/emoticon-happy", + "material/emoticon-kiss-outline", + "material/emoticon-kiss", + "material/emoticon-lol-outline", + "material/emoticon-lol", + "material/emoticon-minus-outline", + "material/emoticon-minus", + "material/emoticon-neutral-outline", + "material/emoticon-neutral", + "material/emoticon-outline", + "material/emoticon-plus-outline", + "material/emoticon-plus", + "material/emoticon-poop-outline", + "material/emoticon-poop", + "material/emoticon-remove-outline", + "material/emoticon-remove", + "material/emoticon-sad-outline", + "material/emoticon-sad", + "material/emoticon-sick-outline", + "material/emoticon-sick", + "material/emoticon-tongue-outline", + "material/emoticon-tongue", + "material/emoticon-wink-outline", + "material/emoticon-wink", + "material/emoticon", + "material/engine-off-outline", + "material/engine-off", + "material/engine-outline", + "material/engine", + "material/epsilon", + "material/equal-box", + "material/equal", + "material/equalizer-outline", + "material/equalizer", + "material/eraser-variant", + "material/eraser", + "material/escalator-box", + "material/escalator-down", + "material/escalator-up", + "material/escalator", + "material/eslint", + "material/et", + "material/ethereum", + "material/ethernet-cable-off", + "material/ethernet-cable", + "material/ethernet", + "material/ev-plug-ccs1", + "material/ev-plug-ccs2", + "material/ev-plug-chademo", + "material/ev-plug-tesla", + "material/ev-plug-type1", + "material/ev-plug-type2", + "material/ev-station", + "material/evernote", + "material/excavator", + "material/exclamation-thick", + "material/exclamation", + "material/exit-run", + "material/exit-to-app", + "material/expand-all-outline", + "material/expand-all", + "material/expansion-card-variant", + "material/expansion-card", + "material/exponent-box", + "material/exponent", + "material/export-variant", + "material/export", + "material/eye-arrow-left-outline", + "material/eye-arrow-left", + "material/eye-arrow-right-outline", + "material/eye-arrow-right", + "material/eye-check-outline", + "material/eye-check", + "material/eye-circle-outline", + "material/eye-circle", + "material/eye-closed", + "material/eye-lock-open-outline", + "material/eye-lock-open", + "material/eye-lock-outline", + "material/eye-lock", + "material/eye-minus-outline", + "material/eye-minus", + "material/eye-off-outline", + "material/eye-off", + "material/eye-outline", + "material/eye-plus-outline", + "material/eye-plus", + "material/eye-refresh-outline", + "material/eye-refresh", + "material/eye-remove-outline", + "material/eye-remove", + "material/eye-settings-outline", + "material/eye-settings", + "material/eye", + "material/eyedropper-minus", + "material/eyedropper-off", + "material/eyedropper-plus", + "material/eyedropper-remove", + "material/eyedropper-variant", + "material/eyedropper", + "material/face-agent", + "material/face-man-outline", + "material/face-man-profile", + "material/face-man-shimmer-outline", + "material/face-man-shimmer", + "material/face-man", + "material/face-mask-outline", + "material/face-mask", + "material/face-recognition", + "material/face-woman-outline", + "material/face-woman-profile", + "material/face-woman-shimmer-outline", + "material/face-woman-shimmer", + "material/face-woman", + "material/facebook-gaming", + "material/facebook-messenger", + "material/facebook-workplace", + "material/facebook", + "material/factory", + "material/family-tree", + "material/fan-alert", + "material/fan-auto", + "material/fan-chevron-down", + "material/fan-chevron-up", + "material/fan-clock", + "material/fan-minus", + "material/fan-off", + "material/fan-plus", + "material/fan-remove", + "material/fan-speed-1", + "material/fan-speed-2", + "material/fan-speed-3", + "material/fan", + "material/fast-forward-10", + "material/fast-forward-15", + "material/fast-forward-30", + "material/fast-forward-45", + "material/fast-forward-5", + "material/fast-forward-60", + "material/fast-forward-outline", + "material/fast-forward", + "material/faucet-variant", + "material/faucet", + "material/fax", + "material/feather", + "material/feature-search-outline", + "material/feature-search", + "material/fedora", + "material/fence-electric", + "material/fence", + "material/fencing", + "material/ferris-wheel", + "material/ferry", + "material/file-account-outline", + "material/file-account", + "material/file-alert-outline", + "material/file-alert", + "material/file-arrow-left-right-outline", + "material/file-arrow-left-right", + "material/file-arrow-up-down-outline", + "material/file-arrow-up-down", + "material/file-cabinet", + "material/file-cad-box", + "material/file-cad", + "material/file-cancel-outline", + "material/file-cancel", + "material/file-certificate-outline", + "material/file-certificate", + "material/file-chart-check-outline", + "material/file-chart-check", + "material/file-chart-outline", + "material/file-chart", + "material/file-check-outline", + "material/file-check", + "material/file-clock-outline", + "material/file-clock", + "material/file-cloud-outline", + "material/file-cloud", + "material/file-code-outline", + "material/file-code", + "material/file-cog-outline", + "material/file-cog", + "material/file-compare", + "material/file-delimited-outline", + "material/file-delimited", + "material/file-document-alert-outline", + "material/file-document-alert", + "material/file-document-arrow-right-outline", + "material/file-document-arrow-right", + "material/file-document-check-outline", + "material/file-document-check", + "material/file-document-edit-outline", + "material/file-document-edit", + "material/file-document-minus-outline", + "material/file-document-minus", + "material/file-document-multiple-outline", + "material/file-document-multiple", + "material/file-document-outline", + "material/file-document-plus-outline", + "material/file-document-plus", + "material/file-document-refresh-outline", + "material/file-document-refresh", + "material/file-document-remove-outline", + "material/file-document-remove", + "material/file-document", + "material/file-download-outline", + "material/file-download", + "material/file-edit-outline", + "material/file-edit", + "material/file-excel-box-outline", + "material/file-excel-box", + "material/file-excel-outline", + "material/file-excel", + "material/file-export-outline", + "material/file-export", + "material/file-eye-outline", + "material/file-eye", + "material/file-find-outline", + "material/file-find", + "material/file-gif-box", + "material/file-hidden", + "material/file-image-marker-outline", + "material/file-image-marker", + "material/file-image-minus-outline", + "material/file-image-minus", + "material/file-image-outline", + "material/file-image-plus-outline", + "material/file-image-plus", + "material/file-image-remove-outline", + "material/file-image-remove", + "material/file-image", + "material/file-import-outline", + "material/file-import", + "material/file-jpg-box", + "material/file-key-outline", + "material/file-key", + "material/file-link-outline", + "material/file-link", + "material/file-lock-open-outline", + "material/file-lock-open", + "material/file-lock-outline", + "material/file-lock", + "material/file-marker-outline", + "material/file-marker", + "material/file-minus-outline", + "material/file-minus", + "material/file-move-outline", + "material/file-move", + "material/file-multiple-outline", + "material/file-multiple", + "material/file-music-outline", + "material/file-music", + "material/file-outline", + "material/file-pdf-box", + "material/file-percent-outline", + "material/file-percent", + "material/file-phone-outline", + "material/file-phone", + "material/file-plus-outline", + "material/file-plus", + "material/file-png-box", + "material/file-powerpoint-box-outline", + "material/file-powerpoint-box", + "material/file-powerpoint-outline", + "material/file-powerpoint", + "material/file-presentation-box", + "material/file-question-outline", + "material/file-question", + "material/file-refresh-outline", + "material/file-refresh", + "material/file-remove-outline", + "material/file-remove", + "material/file-replace-outline", + "material/file-replace", + "material/file-restore-outline", + "material/file-restore", + "material/file-rotate-left-outline", + "material/file-rotate-left", + "material/file-rotate-right-outline", + "material/file-rotate-right", + "material/file-search-outline", + "material/file-search", + "material/file-send-outline", + "material/file-send", + "material/file-settings-outline", + "material/file-settings", + "material/file-sign", + "material/file-star-four-points-outline", + "material/file-star-four-points", + "material/file-star-outline", + "material/file-star", + "material/file-swap-outline", + "material/file-swap", + "material/file-sync-outline", + "material/file-sync", + "material/file-table-box-multiple-outline", + "material/file-table-box-multiple", + "material/file-table-box-outline", + "material/file-table-box", + "material/file-table-outline", + "material/file-table", + "material/file-tree-outline", + "material/file-tree", + "material/file-undo-outline", + "material/file-undo", + "material/file-upload-outline", + "material/file-upload", + "material/file-video-outline", + "material/file-video", + "material/file-word-box-outline", + "material/file-word-box", + "material/file-word-outline", + "material/file-word", + "material/file-xml-box", + "material/file", + "material/film", + "material/filmstrip-box-multiple", + "material/filmstrip-box", + "material/filmstrip-off", + "material/filmstrip", + "material/filter-check-outline", + "material/filter-check", + "material/filter-cog-outline", + "material/filter-cog", + "material/filter-menu-outline", + "material/filter-menu", + "material/filter-minus-outline", + "material/filter-minus", + "material/filter-multiple-outline", + "material/filter-multiple", + "material/filter-off-outline", + "material/filter-off", + "material/filter-outline", + "material/filter-plus-outline", + "material/filter-plus", + "material/filter-remove-outline", + "material/filter-remove", + "material/filter-settings-outline", + "material/filter-settings", + "material/filter-variant-minus", + "material/filter-variant-plus", + "material/filter-variant-remove", + "material/filter-variant", + "material/filter", + "material/finance", + "material/find-replace", + "material/fingerprint-off", + "material/fingerprint", + "material/fire-alert", + "material/fire-circle", + "material/fire-extinguisher", + "material/fire-hydrant-alert", + "material/fire-hydrant-off", + "material/fire-hydrant", + "material/fire-off", + "material/fire-station", + "material/fire-truck", + "material/fire", + "material/firebase", + "material/firefox", + "material/fireplace-off", + "material/fireplace", + "material/firewire", + "material/firework-off", + "material/firework", + "material/fish-off", + "material/fish", + "material/fishbowl-outline", + "material/fishbowl", + "material/fit-to-page-outline", + "material/fit-to-page", + "material/fit-to-screen-outline", + "material/fit-to-screen", + "material/flag-checkered", + "material/flag-minus-outline", + "material/flag-minus", + "material/flag-off-outline", + "material/flag-off", + "material/flag-outline", + "material/flag-plus-outline", + "material/flag-plus", + "material/flag-remove-outline", + "material/flag-remove", + "material/flag-triangle", + "material/flag-variant-minus-outline", + "material/flag-variant-minus", + "material/flag-variant-off-outline", + "material/flag-variant-off", + "material/flag-variant-outline", + "material/flag-variant-plus-outline", + "material/flag-variant-plus", + "material/flag-variant-remove-outline", + "material/flag-variant-remove", + "material/flag-variant", + "material/flag", + "material/flare", + "material/flash-alert-outline", + "material/flash-alert", + "material/flash-auto", + "material/flash-off-outline", + "material/flash-off", + "material/flash-outline", + "material/flash-red-eye", + "material/flash-triangle-outline", + "material/flash-triangle", + "material/flash", + "material/flashlight-off", + "material/flashlight", + "material/flask-empty-minus-outline", + "material/flask-empty-minus", + "material/flask-empty-off-outline", + "material/flask-empty-off", + "material/flask-empty-outline", + "material/flask-empty-plus-outline", + "material/flask-empty-plus", + "material/flask-empty-remove-outline", + "material/flask-empty-remove", + "material/flask-empty", + "material/flask-minus-outline", + "material/flask-minus", + "material/flask-off-outline", + "material/flask-off", + "material/flask-outline", + "material/flask-plus-outline", + "material/flask-plus", + "material/flask-remove-outline", + "material/flask-remove", + "material/flask-round-bottom-empty-outline", + "material/flask-round-bottom-empty", + "material/flask-round-bottom-outline", + "material/flask-round-bottom", + "material/flask", + "material/fleur-de-lis", + "material/flip-horizontal", + "material/flip-to-back", + "material/flip-to-front", + "material/flip-vertical", + "material/floor-lamp-dual-outline", + "material/floor-lamp-dual", + "material/floor-lamp-outline", + "material/floor-lamp-torchiere-outline", + "material/floor-lamp-torchiere-variant-outline", + "material/floor-lamp-torchiere-variant", + "material/floor-lamp-torchiere", + "material/floor-lamp", + "material/floor-plan", + "material/floppy-variant", + "material/floppy", + "material/flower-outline", + "material/flower-pollen-outline", + "material/flower-pollen", + "material/flower-poppy", + "material/flower-tulip-outline", + "material/flower-tulip", + "material/flower", + "material/focus-auto", + "material/focus-field-horizontal", + "material/focus-field-vertical", + "material/focus-field", + "material/folder-account-outline", + "material/folder-account", + "material/folder-alert-outline", + "material/folder-alert", + "material/folder-arrow-down-outline", + "material/folder-arrow-down", + "material/folder-arrow-left-outline", + "material/folder-arrow-left-right-outline", + "material/folder-arrow-left-right", + "material/folder-arrow-left", + "material/folder-arrow-right-outline", + "material/folder-arrow-right", + "material/folder-arrow-up-down-outline", + "material/folder-arrow-up-down", + "material/folder-arrow-up-outline", + "material/folder-arrow-up", + "material/folder-cancel-outline", + "material/folder-cancel", + "material/folder-check-outline", + "material/folder-check", + "material/folder-clock-outline", + "material/folder-clock", + "material/folder-cog-outline", + "material/folder-cog", + "material/folder-download-outline", + "material/folder-download", + "material/folder-edit-outline", + "material/folder-edit", + "material/folder-eye-outline", + "material/folder-eye", + "material/folder-file-outline", + "material/folder-file", + "material/folder-google-drive", + "material/folder-heart-outline", + "material/folder-heart", + "material/folder-hidden", + "material/folder-home-outline", + "material/folder-home", + "material/folder-image", + "material/folder-information-outline", + "material/folder-information", + "material/folder-key-network-outline", + "material/folder-key-network", + "material/folder-key-outline", + "material/folder-key", + "material/folder-lock-open-outline", + "material/folder-lock-open", + "material/folder-lock-outline", + "material/folder-lock", + "material/folder-marker-outline", + "material/folder-marker", + "material/folder-minus-outline", + "material/folder-minus", + "material/folder-move-outline", + "material/folder-move", + "material/folder-multiple-image", + "material/folder-multiple-outline", + "material/folder-multiple-plus-outline", + "material/folder-multiple-plus", + "material/folder-multiple", + "material/folder-music-outline", + "material/folder-music", + "material/folder-network-outline", + "material/folder-network", + "material/folder-off-outline", + "material/folder-off", + "material/folder-open-outline", + "material/folder-open", + "material/folder-outline", + "material/folder-play-outline", + "material/folder-play", + "material/folder-plus-outline", + "material/folder-plus", + "material/folder-pound-outline", + "material/folder-pound", + "material/folder-question-outline", + "material/folder-question", + "material/folder-refresh-outline", + "material/folder-refresh", + "material/folder-remove-outline", + "material/folder-remove", + "material/folder-search-outline", + "material/folder-search", + "material/folder-settings-outline", + "material/folder-settings", + "material/folder-star-multiple-outline", + "material/folder-star-multiple", + "material/folder-star-outline", + "material/folder-star", + "material/folder-swap-outline", + "material/folder-swap", + "material/folder-sync-outline", + "material/folder-sync", + "material/folder-table-outline", + "material/folder-table", + "material/folder-text-outline", + "material/folder-text", + "material/folder-upload-outline", + "material/folder-upload", + "material/folder-wrench-outline", + "material/folder-wrench", + "material/folder-zip-outline", + "material/folder-zip", + "material/folder", + "material/font-awesome", + "material/food-apple-outline", + "material/food-apple", + "material/food-croissant", + "material/food-drumstick-off-outline", + "material/food-drumstick-off", + "material/food-drumstick-outline", + "material/food-drumstick", + "material/food-fork-drink", + "material/food-halal", + "material/food-hot-dog", + "material/food-kosher", + "material/food-off-outline", + "material/food-off", + "material/food-outline", + "material/food-steak-off", + "material/food-steak", + "material/food-takeout-box-outline", + "material/food-takeout-box", + "material/food-turkey", + "material/food-variant-off", + "material/food-variant", + "material/food", + "material/foot-print", + "material/football-australian", + "material/football-helmet", + "material/football", + "material/forest-outline", + "material/forest", + "material/forklift", + "material/form-dropdown", + "material/form-select", + "material/form-textarea", + "material/form-textbox-lock", + "material/form-textbox-password", + "material/form-textbox", + "material/format-align-bottom", + "material/format-align-center", + "material/format-align-justify", + "material/format-align-left", + "material/format-align-middle", + "material/format-align-right", + "material/format-align-top", + "material/format-annotation-minus", + "material/format-annotation-plus", + "material/format-bold", + "material/format-clear", + "material/format-color-fill", + "material/format-color-highlight", + "material/format-color-marker-cancel", + "material/format-color-text", + "material/format-columns", + "material/format-float-center", + "material/format-float-left", + "material/format-float-none", + "material/format-float-right", + "material/format-font-size-decrease", + "material/format-font-size-increase", + "material/format-font", + "material/format-header-1", + "material/format-header-2", + "material/format-header-3", + "material/format-header-4", + "material/format-header-5", + "material/format-header-6", + "material/format-header-decrease", + "material/format-header-equal", + "material/format-header-increase", + "material/format-header-pound", + "material/format-horizontal-align-center", + "material/format-horizontal-align-left", + "material/format-horizontal-align-right", + "material/format-indent-decrease", + "material/format-indent-increase", + "material/format-italic", + "material/format-letter-case-lower", + "material/format-letter-case-upper", + "material/format-letter-case", + "material/format-letter-ends-with", + "material/format-letter-matches", + "material/format-letter-spacing-variant", + "material/format-letter-spacing", + "material/format-letter-starts-with", + "material/format-line-height", + "material/format-line-spacing", + "material/format-line-style", + "material/format-line-weight", + "material/format-list-bulleted-square", + "material/format-list-bulleted-triangle", + "material/format-list-bulleted-type", + "material/format-list-bulleted", + "material/format-list-checkbox", + "material/format-list-checks", + "material/format-list-group-plus", + "material/format-list-group", + "material/format-list-numbered-rtl", + "material/format-list-numbered", + "material/format-list-text", + "material/format-overline", + "material/format-page-break", + "material/format-page-split", + "material/format-paint", + "material/format-paragraph-spacing", + "material/format-paragraph", + "material/format-pilcrow-arrow-left", + "material/format-pilcrow-arrow-right", + "material/format-pilcrow", + "material/format-quote-close-outline", + "material/format-quote-close", + "material/format-quote-open-outline", + "material/format-quote-open", + "material/format-rotate-90", + "material/format-section", + "material/format-size", + "material/format-strikethrough-variant", + "material/format-strikethrough", + "material/format-subscript", + "material/format-superscript", + "material/format-text-rotation-angle-down", + "material/format-text-rotation-angle-up", + "material/format-text-rotation-down-vertical", + "material/format-text-rotation-down", + "material/format-text-rotation-none", + "material/format-text-rotation-up", + "material/format-text-rotation-vertical", + "material/format-text-variant-outline", + "material/format-text-variant", + "material/format-text-wrapping-clip", + "material/format-text-wrapping-overflow", + "material/format-text-wrapping-wrap", + "material/format-text", + "material/format-textbox", + "material/format-title", + "material/format-underline-wavy", + "material/format-underline", + "material/format-vertical-align-bottom", + "material/format-vertical-align-center", + "material/format-vertical-align-top", + "material/format-wrap-inline", + "material/format-wrap-square", + "material/format-wrap-tight", + "material/format-wrap-top-bottom", + "material/forum-minus-outline", + "material/forum-minus", + "material/forum-outline", + "material/forum-plus-outline", + "material/forum-plus", + "material/forum-remove-outline", + "material/forum-remove", + "material/forum", + "material/forward", + "material/forwardburger", + "material/fountain-pen-tip", + "material/fountain-pen", + "material/fountain", + "material/fraction-one-half", + "material/freebsd", + "material/french-fries", + "material/frequently-asked-questions", + "material/fridge-alert-outline", + "material/fridge-alert", + "material/fridge-bottom", + "material/fridge-industrial-alert-outline", + "material/fridge-industrial-alert", + "material/fridge-industrial-off-outline", + "material/fridge-industrial-off", + "material/fridge-industrial-outline", + "material/fridge-industrial", + "material/fridge-off-outline", + "material/fridge-off", + "material/fridge-outline", + "material/fridge-top", + "material/fridge-variant-alert-outline", + "material/fridge-variant-alert", + "material/fridge-variant-off-outline", + "material/fridge-variant-off", + "material/fridge-variant-outline", + "material/fridge-variant", + "material/fridge", + "material/fruit-cherries-off", + "material/fruit-cherries", + "material/fruit-citrus-off", + "material/fruit-citrus", + "material/fruit-grapes-outline", + "material/fruit-grapes", + "material/fruit-pear", + "material/fruit-pineapple", + "material/fruit-watermelon", + "material/fuel-cell", + "material/fuel", + "material/fullscreen-exit", + "material/fullscreen", + "material/function-variant", + "material/function", + "material/furigana-horizontal", + "material/furigana-vertical", + "material/fuse-alert", + "material/fuse-blade", + "material/fuse-off", + "material/fuse", + "material/gamepad-circle-down", + "material/gamepad-circle-left", + "material/gamepad-circle-outline", + "material/gamepad-circle-right", + "material/gamepad-circle-up", + "material/gamepad-circle", + "material/gamepad-down", + "material/gamepad-left", + "material/gamepad-outline", + "material/gamepad-right", + "material/gamepad-round-down", + "material/gamepad-round-left", + "material/gamepad-round-outline", + "material/gamepad-round-right", + "material/gamepad-round-up", + "material/gamepad-round", + "material/gamepad-square-outline", + "material/gamepad-square", + "material/gamepad-up", + "material/gamepad-variant-outline", + "material/gamepad-variant", + "material/gamepad", + "material/gamma", + "material/gantry-crane", + "material/garage-alert-variant", + "material/garage-alert", + "material/garage-lock", + "material/garage-open-variant", + "material/garage-open", + "material/garage-variant-lock", + "material/garage-variant", + "material/garage", + "material/gas-burner", + "material/gas-cylinder", + "material/gas-station-in-use-outline", + "material/gas-station-in-use", + "material/gas-station-off-outline", + "material/gas-station-off", + "material/gas-station-outline", + "material/gas-station", + "material/gate-alert", + "material/gate-and", + "material/gate-arrow-left", + "material/gate-arrow-right", + "material/gate-buffer", + "material/gate-nand", + "material/gate-nor", + "material/gate-not", + "material/gate-open", + "material/gate-or", + "material/gate-xnor", + "material/gate-xor", + "material/gate", + "material/gatsby", + "material/gauge-empty", + "material/gauge-full", + "material/gauge-low", + "material/gauge", + "material/gavel", + "material/gender-female", + "material/gender-male-female-variant", + "material/gender-male-female", + "material/gender-male", + "material/gender-non-binary", + "material/gender-transgender", + "material/generator-mobile", + "material/generator-portable", + "material/generator-stationary", + "material/gentoo", + "material/gesture-double-tap", + "material/gesture-pinch", + "material/gesture-spread", + "material/gesture-swipe-down", + "material/gesture-swipe-horizontal", + "material/gesture-swipe-left", + "material/gesture-swipe-right", + "material/gesture-swipe-up", + "material/gesture-swipe-vertical", + "material/gesture-swipe", + "material/gesture-tap-box", + "material/gesture-tap-button", + "material/gesture-tap-hold", + "material/gesture-tap", + "material/gesture-two-double-tap", + "material/gesture-two-tap", + "material/gesture", + "material/ghost-off-outline", + "material/ghost-off", + "material/ghost-outline", + "material/ghost", + "material/gift-off-outline", + "material/gift-off", + "material/gift-open-outline", + "material/gift-open", + "material/gift-outline", + "material/gift", + "material/git", + "material/github", + "material/gitlab", + "material/glass-cocktail-off", + "material/glass-cocktail", + "material/glass-flute", + "material/glass-fragile", + "material/glass-mug-off", + "material/glass-mug-variant-off", + "material/glass-mug-variant", + "material/glass-mug", + "material/glass-pint-outline", + "material/glass-stange", + "material/glass-tulip", + "material/glass-wine", + "material/glasses", + "material/globe-light-outline", + "material/globe-light", + "material/globe-model", + "material/gmail", + "material/gnome", + "material/go-kart-track", + "material/go-kart", + "material/gog", + "material/gold", + "material/golf-cart", + "material/golf-tee", + "material/golf", + "material/gondola", + "material/goodreads", + "material/google-ads", + "material/google-analytics", + "material/google-assistant", + "material/google-cardboard", + "material/google-chrome", + "material/google-circles-communities", + "material/google-circles-extended", + "material/google-circles-group", + "material/google-circles", + "material/google-classroom", + "material/google-cloud", + "material/google-downasaur", + "material/google-drive", + "material/google-earth", + "material/google-fit", + "material/google-glass", + "material/google-hangouts", + "material/google-keep", + "material/google-lens", + "material/google-maps", + "material/google-my-business", + "material/google-nearby", + "material/google-play", + "material/google-plus", + "material/google-podcast", + "material/google-spreadsheet", + "material/google-street-view", + "material/google-translate", + "material/google", + "material/gradient-horizontal", + "material/gradient-vertical", + "material/grain", + "material/graph-outline", + "material/graph", + "material/graphql", + "material/grass", + "material/grave-stone", + "material/grease-pencil", + "material/greater-than-or-equal", + "material/greater-than", + "material/greenhouse", + "material/grid-large", + "material/grid-off", + "material/grid", + "material/grill-outline", + "material/grill", + "material/group", + "material/guitar-acoustic", + "material/guitar-electric", + "material/guitar-pick-outline", + "material/guitar-pick", + "material/guy-fawkes-mask", + "material/gymnastics", + "material/hail", + "material/hair-dryer-outline", + "material/hair-dryer", + "material/halloween", + "material/hamburger-check", + "material/hamburger-minus", + "material/hamburger-off", + "material/hamburger-plus", + "material/hamburger-remove", + "material/hamburger", + "material/hammer-screwdriver", + "material/hammer-sickle", + "material/hammer-wrench", + "material/hammer", + "material/hand-back-left-off-outline", + "material/hand-back-left-off", + "material/hand-back-left-outline", + "material/hand-back-left", + "material/hand-back-right-off-outline", + "material/hand-back-right-off", + "material/hand-back-right-outline", + "material/hand-back-right", + "material/hand-clap-off", + "material/hand-clap", + "material/hand-coin-outline", + "material/hand-coin", + "material/hand-cycle", + "material/hand-extended-outline", + "material/hand-extended", + "material/hand-front-left-outline", + "material/hand-front-left", + "material/hand-front-right-outline", + "material/hand-front-right", + "material/hand-heart-outline", + "material/hand-heart", + "material/hand-okay", + "material/hand-peace-variant", + "material/hand-peace", + "material/hand-pointing-down", + "material/hand-pointing-left", + "material/hand-pointing-right", + "material/hand-pointing-up", + "material/hand-saw", + "material/hand-wash-outline", + "material/hand-wash", + "material/hand-water", + "material/hand-wave-outline", + "material/hand-wave", + "material/handball", + "material/handcuffs", + "material/hands-pray", + "material/handshake-outline", + "material/handshake", + "material/hanger", + "material/hard-hat", + "material/harddisk-plus", + "material/harddisk-remove", + "material/harddisk", + "material/hat-fedora", + "material/hazard-lights", + "material/hdmi-port", + "material/hdr-off", + "material/hdr", + "material/head-alert-outline", + "material/head-alert", + "material/head-check-outline", + "material/head-check", + "material/head-cog-outline", + "material/head-cog", + "material/head-dots-horizontal-outline", + "material/head-dots-horizontal", + "material/head-flash-outline", + "material/head-flash", + "material/head-heart-outline", + "material/head-heart", + "material/head-lightbulb-outline", + "material/head-lightbulb", + "material/head-minus-outline", + "material/head-minus", + "material/head-outline", + "material/head-plus-outline", + "material/head-plus", + "material/head-question-outline", + "material/head-question", + "material/head-remove-outline", + "material/head-remove", + "material/head-snowflake-outline", + "material/head-snowflake", + "material/head-sync-outline", + "material/head-sync", + "material/head", + "material/headphones-bluetooth", + "material/headphones-box", + "material/headphones-off", + "material/headphones-settings", + "material/headphones", + "material/headset-dock", + "material/headset-off", + "material/headset", + "material/heart-box-outline", + "material/heart-box", + "material/heart-broken-outline", + "material/heart-broken", + "material/heart-circle-outline", + "material/heart-circle", + "material/heart-cog-outline", + "material/heart-cog", + "material/heart-flash", + "material/heart-half-full", + "material/heart-half-outline", + "material/heart-half", + "material/heart-minus-outline", + "material/heart-minus", + "material/heart-multiple-outline", + "material/heart-multiple", + "material/heart-off-outline", + "material/heart-off", + "material/heart-outline", + "material/heart-plus-outline", + "material/heart-plus", + "material/heart-pulse", + "material/heart-remove-outline", + "material/heart-remove", + "material/heart-search", + "material/heart-settings-outline", + "material/heart-settings", + "material/heart", + "material/heat-pump-outline", + "material/heat-pump", + "material/heat-wave", + "material/heating-coil", + "material/helicopter", + "material/help-box-multiple-outline", + "material/help-box-multiple", + "material/help-box-outline", + "material/help-box", + "material/help-circle-outline", + "material/help-circle", + "material/help-network-outline", + "material/help-network", + "material/help-rhombus-outline", + "material/help-rhombus", + "material/help", + "material/hexadecimal", + "material/hexagon-multiple-outline", + "material/hexagon-multiple", + "material/hexagon-outline", + "material/hexagon-slice-1", + "material/hexagon-slice-2", + "material/hexagon-slice-3", + "material/hexagon-slice-4", + "material/hexagon-slice-5", + "material/hexagon-slice-6", + "material/hexagon", + "material/hexagram-outline", + "material/hexagram", + "material/high-definition-box", + "material/high-definition", + "material/highway", + "material/hiking", + "material/history", + "material/hockey-puck", + "material/hockey-sticks", + "material/hololens", + "material/home-account", + "material/home-alert-outline", + "material/home-alert", + "material/home-analytics", + "material/home-assistant", + "material/home-automation", + "material/home-battery-outline", + "material/home-battery", + "material/home-circle-outline", + "material/home-circle", + "material/home-city-outline", + "material/home-city", + "material/home-clock-outline", + "material/home-clock", + "material/home-edit-outline", + "material/home-edit", + "material/home-export-outline", + "material/home-flood", + "material/home-floor-0", + "material/home-floor-1", + "material/home-floor-2", + "material/home-floor-3", + "material/home-floor-a", + "material/home-floor-b", + "material/home-floor-g", + "material/home-floor-l", + "material/home-floor-negative-1", + "material/home-group-minus", + "material/home-group-plus", + "material/home-group-remove", + "material/home-group", + "material/home-heart", + "material/home-import-outline", + "material/home-lightbulb-outline", + "material/home-lightbulb", + "material/home-lightning-bolt-outline", + "material/home-lightning-bolt", + "material/home-lock-open", + "material/home-lock", + "material/home-map-marker", + "material/home-minus-outline", + "material/home-minus", + "material/home-modern", + "material/home-off-outline", + "material/home-off", + "material/home-outline", + "material/home-percent-outline", + "material/home-percent", + "material/home-plus-outline", + "material/home-plus", + "material/home-remove-outline", + "material/home-remove", + "material/home-roof", + "material/home-search-outline", + "material/home-search", + "material/home-silo-outline", + "material/home-silo", + "material/home-sound-in-outline", + "material/home-sound-in", + "material/home-sound-out-outline", + "material/home-sound-out", + "material/home-switch-outline", + "material/home-switch", + "material/home-thermometer-outline", + "material/home-thermometer", + "material/home-variant-outline", + "material/home-variant", + "material/home", + "material/hook-off", + "material/hook", + "material/hoop-house", + "material/hops", + "material/horizontal-rotate-clockwise", + "material/horizontal-rotate-counterclockwise", + "material/horse-human", + "material/horse-variant-fast", + "material/horse-variant", + "material/horse", + "material/horseshoe", + "material/hospital-box-outline", + "material/hospital-box", + "material/hospital-building", + "material/hospital-marker", + "material/hospital", + "material/hot-tub", + "material/hours-12", + "material/hours-24", + "material/hub-outline", + "material/hub", + "material/hubspot", + "material/hulu", + "material/human-baby-changing-table", + "material/human-cane", + "material/human-capacity-decrease", + "material/human-capacity-increase", + "material/human-child", + "material/human-dolly", + "material/human-edit", + "material/human-female-boy", + "material/human-female-dance", + "material/human-female-female-child", + "material/human-female-female", + "material/human-female-girl", + "material/human-female", + "material/human-greeting-proximity", + "material/human-greeting-variant", + "material/human-greeting", + "material/human-handsdown", + "material/human-handsup", + "material/human-male-board-poll", + "material/human-male-board", + "material/human-male-boy", + "material/human-male-child", + "material/human-male-female-child", + "material/human-male-female", + "material/human-male-girl", + "material/human-male-height-variant", + "material/human-male-height", + "material/human-male-male-child", + "material/human-male-male", + "material/human-male", + "material/human-non-binary", + "material/human-pregnant", + "material/human-queue", + "material/human-scooter", + "material/human-walker", + "material/human-wheelchair", + "material/human-white-cane", + "material/human", + "material/humble-bundle", + "material/hvac-off", + "material/hvac", + "material/hydraulic-oil-level", + "material/hydraulic-oil-temperature", + "material/hydro-power", + "material/hydrogen-station", + "material/ice-cream-off", + "material/ice-cream", + "material/ice-pop", + "material/id-card", + "material/identifier", + "material/ideogram-cjk-variant", + "material/ideogram-cjk", + "material/image-album", + "material/image-area-close", + "material/image-area", + "material/image-auto-adjust", + "material/image-broken-variant", + "material/image-broken", + "material/image-check-outline", + "material/image-check", + "material/image-edit-outline", + "material/image-edit", + "material/image-filter-black-white", + "material/image-filter-center-focus-strong-outline", + "material/image-filter-center-focus-strong", + "material/image-filter-center-focus-weak", + "material/image-filter-center-focus", + "material/image-filter-drama-outline", + "material/image-filter-drama", + "material/image-filter-frames", + "material/image-filter-hdr-outline", + "material/image-filter-hdr", + "material/image-filter-none", + "material/image-filter-tilt-shift", + "material/image-filter-vintage", + "material/image-frame", + "material/image-lock-outline", + "material/image-lock", + "material/image-marker-outline", + "material/image-marker", + "material/image-minus-outline", + "material/image-minus", + "material/image-move", + "material/image-multiple-outline", + "material/image-multiple", + "material/image-off-outline", + "material/image-off", + "material/image-outline", + "material/image-plus-outline", + "material/image-plus", + "material/image-refresh-outline", + "material/image-refresh", + "material/image-remove-outline", + "material/image-remove", + "material/image-search-outline", + "material/image-search", + "material/image-size-select-actual", + "material/image-size-select-large", + "material/image-size-select-small", + "material/image-sync-outline", + "material/image-sync", + "material/image-text", + "material/image", + "material/import", + "material/inbox-arrow-down-outline", + "material/inbox-arrow-down", + "material/inbox-arrow-up-outline", + "material/inbox-arrow-up", + "material/inbox-full-outline", + "material/inbox-full", + "material/inbox-multiple-outline", + "material/inbox-multiple", + "material/inbox-outline", + "material/inbox-remove-outline", + "material/inbox-remove", + "material/inbox", + "material/incognito-circle-off", + "material/incognito-circle", + "material/incognito-off", + "material/incognito", + "material/induction", + "material/infinity", + "material/information-box-outline", + "material/information-box", + "material/information-off-outline", + "material/information-off", + "material/information-outline", + "material/information-slab-box-outline", + "material/information-slab-box", + "material/information-slab-circle-outline", + "material/information-slab-circle", + "material/information-slab-symbol", + "material/information-symbol", + "material/information-variant-box-outline", + "material/information-variant-box", + "material/information-variant-circle-outline", + "material/information-variant-circle", + "material/information-variant", + "material/information", + "material/instagram", + "material/instrument-triangle", + "material/integrated-circuit-chip", + "material/invert-colors-off", + "material/invert-colors", + "material/iobroker", + "material/ip-network-outline", + "material/ip-network", + "material/ip-outline", + "material/ip", + "material/ipod", + "material/iron-board", + "material/iron-outline", + "material/iron", + "material/island-variant", + "material/island", + "material/iv-bag", + "material/jabber", + "material/jeepney", + "material/jellyfish-outline", + "material/jellyfish", + "material/jira", + "material/jquery", + "material/jsfiddle", + "material/jump-rope", + "material/kabaddi", + "material/kangaroo", + "material/karate", + "material/kayaking", + "material/keg", + "material/kettle-alert-outline", + "material/kettle-alert", + "material/kettle-off-outline", + "material/kettle-off", + "material/kettle-outline", + "material/kettle-pour-over", + "material/kettle-steam-outline", + "material/kettle-steam", + "material/kettle", + "material/kettlebell", + "material/key-alert-outline", + "material/key-alert", + "material/key-arrow-right", + "material/key-chain-variant", + "material/key-chain", + "material/key-change", + "material/key-link", + "material/key-minus", + "material/key-outline", + "material/key-plus", + "material/key-remove", + "material/key-star", + "material/key-variant", + "material/key-wireless", + "material/key", + "material/keyboard-backspace", + "material/keyboard-caps", + "material/keyboard-close-outline", + "material/keyboard-close", + "material/keyboard-esc", + "material/keyboard-f1", + "material/keyboard-f10", + "material/keyboard-f11", + "material/keyboard-f12", + "material/keyboard-f2", + "material/keyboard-f3", + "material/keyboard-f4", + "material/keyboard-f5", + "material/keyboard-f6", + "material/keyboard-f7", + "material/keyboard-f8", + "material/keyboard-f9", + "material/keyboard-off-outline", + "material/keyboard-off", + "material/keyboard-outline", + "material/keyboard-return", + "material/keyboard-settings-outline", + "material/keyboard-settings", + "material/keyboard-space", + "material/keyboard-tab-reverse", + "material/keyboard-tab", + "material/keyboard-variant", + "material/keyboard", + "material/khanda", + "material/kickstarter", + "material/kite-outline", + "material/kite", + "material/kitesurfing", + "material/klingon", + "material/knife-military", + "material/knife", + "material/knob", + "material/koala", + "material/kodi", + "material/kubernetes", + "material/label-multiple-outline", + "material/label-multiple", + "material/label-off-outline", + "material/label-off", + "material/label-outline", + "material/label-percent-outline", + "material/label-percent", + "material/label-variant-outline", + "material/label-variant", + "material/label", + "material/ladder", + "material/ladybug", + "material/lambda", + "material/lamp-outline", + "material/lamp", + "material/lamps-outline", + "material/lamps", + "material/lan-check", + "material/lan-connect", + "material/lan-disconnect", + "material/lan-pending", + "material/lan", + "material/land-fields", + "material/land-plots-circle-variant", + "material/land-plots-circle", + "material/land-plots-marker", + "material/land-plots", + "material/land-rows-horizontal", + "material/land-rows-vertical", + "material/landslide-outline", + "material/landslide", + "material/language-c", + "material/language-cpp", + "material/language-csharp", + "material/language-css3", + "material/language-fortran", + "material/language-go", + "material/language-haskell", + "material/language-html5", + "material/language-java", + "material/language-javascript", + "material/language-kotlin", + "material/language-lua", + "material/language-markdown-outline", + "material/language-markdown", + "material/language-php", + "material/language-python", + "material/language-r", + "material/language-ruby-on-rails", + "material/language-ruby", + "material/language-rust", + "material/language-swift", + "material/language-typescript", + "material/language-xaml", + "material/laptop-account", + "material/laptop-off", + "material/laptop", + "material/laravel", + "material/laser-pointer", + "material/lasso", + "material/lastpass", + "material/latitude", + "material/launch", + "material/lava-lamp", + "material/layers-edit", + "material/layers-minus", + "material/layers-off-outline", + "material/layers-off", + "material/layers-outline", + "material/layers-plus", + "material/layers-remove", + "material/layers-search-outline", + "material/layers-search", + "material/layers-triple-outline", + "material/layers-triple", + "material/layers", + "material/lead-pencil", + "material/leaf-circle-outline", + "material/leaf-circle", + "material/leaf-maple-off", + "material/leaf-maple", + "material/leaf-off", + "material/leaf", + "material/leak-off", + "material/leak", + "material/lectern", + "material/led-off", + "material/led-on", + "material/led-outline", + "material/led-strip-variant-off", + "material/led-strip-variant", + "material/led-strip", + "material/led-variant-off", + "material/led-variant-on", + "material/led-variant-outline", + "material/leek", + "material/less-than-or-equal", + "material/less-than", + "material/library-outline", + "material/library-shelves", + "material/library", + "material/license", + "material/lifebuoy", + "material/light-flood-down", + "material/light-flood-up", + "material/light-recessed", + "material/light-switch-off", + "material/light-switch", + "material/lightbulb-alert-outline", + "material/lightbulb-alert", + "material/lightbulb-auto-outline", + "material/lightbulb-auto", + "material/lightbulb-cfl-off", + "material/lightbulb-cfl-spiral-off", + "material/lightbulb-cfl-spiral", + "material/lightbulb-cfl", + "material/lightbulb-fluorescent-tube-outline", + "material/lightbulb-fluorescent-tube", + "material/lightbulb-group-off-outline", + "material/lightbulb-group-off", + "material/lightbulb-group-outline", + "material/lightbulb-group", + "material/lightbulb-multiple-off-outline", + "material/lightbulb-multiple-off", + "material/lightbulb-multiple-outline", + "material/lightbulb-multiple", + "material/lightbulb-night-outline", + "material/lightbulb-night", + "material/lightbulb-off-outline", + "material/lightbulb-off", + "material/lightbulb-on-10", + "material/lightbulb-on-20", + "material/lightbulb-on-30", + "material/lightbulb-on-40", + "material/lightbulb-on-50", + "material/lightbulb-on-60", + "material/lightbulb-on-70", + "material/lightbulb-on-80", + "material/lightbulb-on-90", + "material/lightbulb-on-outline", + "material/lightbulb-on", + "material/lightbulb-outline", + "material/lightbulb-question-outline", + "material/lightbulb-question", + "material/lightbulb-spot-off", + "material/lightbulb-spot", + "material/lightbulb-variant-outline", + "material/lightbulb-variant", + "material/lightbulb", + "material/lighthouse-on", + "material/lighthouse", + "material/lightning-bolt-circle", + "material/lightning-bolt-outline", + "material/lightning-bolt", + "material/line-scan", + "material/lingerie", + "material/link-box-outline", + "material/link-box-variant-outline", + "material/link-box-variant", + "material/link-box", + "material/link-circle-outline", + "material/link-circle", + "material/link-edit", + "material/link-lock", + "material/link-off", + "material/link-plus", + "material/link-variant-minus", + "material/link-variant-off", + "material/link-variant-plus", + "material/link-variant-remove", + "material/link-variant", + "material/link", + "material/linkedin", + "material/linux-mint", + "material/linux", + "material/lipstick", + "material/liquid-spot", + "material/liquor", + "material/list-box-outline", + "material/list-box", + "material/list-status", + "material/litecoin", + "material/loading", + "material/location-enter", + "material/location-exit", + "material/lock-alert-outline", + "material/lock-alert", + "material/lock-check-outline", + "material/lock-check", + "material/lock-clock", + "material/lock-minus-outline", + "material/lock-minus", + "material/lock-off-outline", + "material/lock-off", + "material/lock-open-alert-outline", + "material/lock-open-alert", + "material/lock-open-check-outline", + "material/lock-open-check", + "material/lock-open-minus-outline", + "material/lock-open-minus", + "material/lock-open-outline", + "material/lock-open-plus-outline", + "material/lock-open-plus", + "material/lock-open-remove-outline", + "material/lock-open-remove", + "material/lock-open-variant-outline", + "material/lock-open-variant", + "material/lock-open", + "material/lock-outline", + "material/lock-pattern", + "material/lock-percent-open-outline", + "material/lock-percent-open-variant-outline", + "material/lock-percent-open-variant", + "material/lock-percent-open", + "material/lock-percent-outline", + "material/lock-percent", + "material/lock-plus-outline", + "material/lock-plus", + "material/lock-question", + "material/lock-remove-outline", + "material/lock-remove", + "material/lock-reset", + "material/lock-smart", + "material/lock", + "material/locker-multiple", + "material/locker", + "material/login-variant", + "material/login", + "material/logout-variant", + "material/logout", + "material/longitude", + "material/looks", + "material/lotion-outline", + "material/lotion-plus-outline", + "material/lotion-plus", + "material/lotion", + "material/loupe", + "material/lumx", + "material/lungs", + "material/mace", + "material/magazine-pistol", + "material/magazine-rifle", + "material/magic-staff", + "material/magnet-on", + "material/magnet", + "material/magnify-close", + "material/magnify-expand", + "material/magnify-minus-cursor", + "material/magnify-minus-outline", + "material/magnify-minus", + "material/magnify-plus-cursor", + "material/magnify-plus-outline", + "material/magnify-plus", + "material/magnify-remove-cursor", + "material/magnify-remove-outline", + "material/magnify-scan", + "material/magnify", + "material/mail", + "material/mailbox-open-outline", + "material/mailbox-open-up-outline", + "material/mailbox-open-up", + "material/mailbox-open", + "material/mailbox-outline", + "material/mailbox-up-outline", + "material/mailbox-up", + "material/mailbox", + "material/manjaro", + "material/map-check-outline", + "material/map-check", + "material/map-clock-outline", + "material/map-clock", + "material/map-legend", + "material/map-marker-account-outline", + "material/map-marker-account", + "material/map-marker-alert-outline", + "material/map-marker-alert", + "material/map-marker-check-outline", + "material/map-marker-check", + "material/map-marker-circle", + "material/map-marker-distance", + "material/map-marker-down", + "material/map-marker-left-outline", + "material/map-marker-left", + "material/map-marker-minus-outline", + "material/map-marker-minus", + "material/map-marker-multiple-outline", + "material/map-marker-multiple", + "material/map-marker-off-outline", + "material/map-marker-off", + "material/map-marker-outline", + "material/map-marker-path", + "material/map-marker-plus-outline", + "material/map-marker-plus", + "material/map-marker-question-outline", + "material/map-marker-question", + "material/map-marker-radius-outline", + "material/map-marker-radius", + "material/map-marker-remove-outline", + "material/map-marker-remove-variant", + "material/map-marker-remove", + "material/map-marker-right-outline", + "material/map-marker-right", + "material/map-marker-star-outline", + "material/map-marker-star", + "material/map-marker-up", + "material/map-marker", + "material/map-minus", + "material/map-outline", + "material/map-plus", + "material/map-search-outline", + "material/map-search", + "material/map", + "material/mapbox", + "material/margin", + "material/marker-cancel", + "material/marker-check", + "material/marker", + "material/mastodon", + "material/material-design", + "material/material-ui", + "material/math-compass", + "material/math-cos", + "material/math-integral-box", + "material/math-integral", + "material/math-log", + "material/math-norm-box", + "material/math-norm", + "material/math-sin", + "material/math-tan", + "material/matrix", + "material/medal-outline", + "material/medal", + "material/medical-bag", + "material/medical-cotton-swab", + "material/medication-outline", + "material/medication", + "material/meditation", + "material/memory-arrow-down", + "material/memory", + "material/menorah-fire", + "material/menorah", + "material/menu-close", + "material/menu-down-outline", + "material/menu-down", + "material/menu-left-outline", + "material/menu-left", + "material/menu-open", + "material/menu-right-outline", + "material/menu-right", + "material/menu-swap-outline", + "material/menu-swap", + "material/menu-up-outline", + "material/menu-up", + "material/menu", + "material/merge", + "material/message-alert-outline", + "material/message-alert", + "material/message-arrow-left-outline", + "material/message-arrow-left", + "material/message-arrow-right-outline", + "material/message-arrow-right", + "material/message-badge-outline", + "material/message-badge", + "material/message-bookmark-outline", + "material/message-bookmark", + "material/message-bulleted-off", + "material/message-bulleted", + "material/message-check-outline", + "material/message-check", + "material/message-cog-outline", + "material/message-cog", + "material/message-draw", + "material/message-fast-outline", + "material/message-fast", + "material/message-flash-outline", + "material/message-flash", + "material/message-image-outline", + "material/message-image", + "material/message-lock-outline", + "material/message-lock", + "material/message-minus-outline", + "material/message-minus", + "material/message-off-outline", + "material/message-off", + "material/message-outline", + "material/message-plus-outline", + "material/message-plus", + "material/message-processing-outline", + "material/message-processing", + "material/message-question-outline", + "material/message-question", + "material/message-reply-outline", + "material/message-reply-text-outline", + "material/message-reply-text", + "material/message-reply", + "material/message-settings-outline", + "material/message-settings", + "material/message-star-outline", + "material/message-star", + "material/message-text-clock-outline", + "material/message-text-clock", + "material/message-text-fast-outline", + "material/message-text-fast", + "material/message-text-lock-outline", + "material/message-text-lock", + "material/message-text-outline", + "material/message-text", + "material/message-video", + "material/message", + "material/meteor", + "material/meter-electric-outline", + "material/meter-electric", + "material/meter-gas-outline", + "material/meter-gas", + "material/metronome-tick", + "material/metronome", + "material/micro-sd", + "material/microphone-message-off", + "material/microphone-message", + "material/microphone-minus", + "material/microphone-off", + "material/microphone-outline", + "material/microphone-plus", + "material/microphone-question-outline", + "material/microphone-question", + "material/microphone-settings", + "material/microphone-variant-off", + "material/microphone-variant", + "material/microphone", + "material/microscope", + "material/microsoft-access", + "material/microsoft-azure-devops", + "material/microsoft-azure", + "material/microsoft-bing", + "material/microsoft-dynamics-365", + "material/microsoft-edge", + "material/microsoft-excel", + "material/microsoft-internet-explorer", + "material/microsoft-office", + "material/microsoft-onedrive", + "material/microsoft-onenote", + "material/microsoft-outlook", + "material/microsoft-powerpoint", + "material/microsoft-sharepoint", + "material/microsoft-teams", + "material/microsoft-visual-studio-code", + "material/microsoft-visual-studio", + "material/microsoft-windows-classic", + "material/microsoft-windows", + "material/microsoft-word", + "material/microsoft-xbox-controller-battery-alert", + "material/microsoft-xbox-controller-battery-charging", + "material/microsoft-xbox-controller-battery-empty", + "material/microsoft-xbox-controller-battery-full", + "material/microsoft-xbox-controller-battery-low", + "material/microsoft-xbox-controller-battery-medium", + "material/microsoft-xbox-controller-battery-unknown", + "material/microsoft-xbox-controller-menu", + "material/microsoft-xbox-controller-off", + "material/microsoft-xbox-controller-view", + "material/microsoft-xbox-controller", + "material/microsoft-xbox", + "material/microsoft", + "material/microwave-off", + "material/microwave", + "material/middleware-outline", + "material/middleware", + "material/midi-port", + "material/midi", + "material/mine", + "material/minecraft", + "material/mini-sd", + "material/minidisc", + "material/minus-box-multiple-outline", + "material/minus-box-multiple", + "material/minus-box-outline", + "material/minus-box", + "material/minus-circle-multiple-outline", + "material/minus-circle-multiple", + "material/minus-circle-off-outline", + "material/minus-circle-off", + "material/minus-circle-outline", + "material/minus-circle", + "material/minus-network-outline", + "material/minus-network", + "material/minus-thick", + "material/minus", + "material/mirror-rectangle", + "material/mirror-variant", + "material/mirror", + "material/mixed-martial-arts", + "material/mixed-reality", + "material/molecule-co", + "material/molecule-co2", + "material/molecule", + "material/monitor-account", + "material/monitor-arrow-down-variant", + "material/monitor-arrow-down", + "material/monitor-cellphone-star", + "material/monitor-cellphone", + "material/monitor-dashboard", + "material/monitor-edit", + "material/monitor-eye", + "material/monitor-lock", + "material/monitor-multiple", + "material/monitor-off", + "material/monitor-screenshot", + "material/monitor-share", + "material/monitor-shimmer", + "material/monitor-small", + "material/monitor-speaker-off", + "material/monitor-speaker", + "material/monitor-star", + "material/monitor-vertical", + "material/monitor", + "material/moon-first-quarter", + "material/moon-full", + "material/moon-last-quarter", + "material/moon-new", + "material/moon-waning-crescent", + "material/moon-waning-gibbous", + "material/moon-waxing-crescent", + "material/moon-waxing-gibbous", + "material/moped-electric-outline", + "material/moped-electric", + "material/moped-outline", + "material/moped", + "material/more", + "material/mortar-pestle-plus", + "material/mortar-pestle", + "material/mosque-outline", + "material/mosque", + "material/mother-heart", + "material/mother-nurse", + "material/motion-outline", + "material/motion-pause-outline", + "material/motion-pause", + "material/motion-play-outline", + "material/motion-play", + "material/motion-sensor-off", + "material/motion-sensor", + "material/motion", + "material/motorbike-electric", + "material/motorbike-off", + "material/motorbike", + "material/mouse-bluetooth", + "material/mouse-move-down", + "material/mouse-move-up", + "material/mouse-move-vertical", + "material/mouse-off", + "material/mouse-variant-off", + "material/mouse-variant", + "material/mouse", + "material/move-resize-variant", + "material/move-resize", + "material/movie-check-outline", + "material/movie-check", + "material/movie-cog-outline", + "material/movie-cog", + "material/movie-edit-outline", + "material/movie-edit", + "material/movie-filter-outline", + "material/movie-filter", + "material/movie-minus-outline", + "material/movie-minus", + "material/movie-off-outline", + "material/movie-off", + "material/movie-open-check-outline", + "material/movie-open-check", + "material/movie-open-cog-outline", + "material/movie-open-cog", + "material/movie-open-edit-outline", + "material/movie-open-edit", + "material/movie-open-minus-outline", + "material/movie-open-minus", + "material/movie-open-off-outline", + "material/movie-open-off", + "material/movie-open-outline", + "material/movie-open-play-outline", + "material/movie-open-play", + "material/movie-open-plus-outline", + "material/movie-open-plus", + "material/movie-open-remove-outline", + "material/movie-open-remove", + "material/movie-open-settings-outline", + "material/movie-open-settings", + "material/movie-open-star-outline", + "material/movie-open-star", + "material/movie-open", + "material/movie-outline", + "material/movie-play-outline", + "material/movie-play", + "material/movie-plus-outline", + "material/movie-plus", + "material/movie-remove-outline", + "material/movie-remove", + "material/movie-roll", + "material/movie-search-outline", + "material/movie-search", + "material/movie-settings-outline", + "material/movie-settings", + "material/movie-star-outline", + "material/movie-star", + "material/movie", + "material/mower-bag-on", + "material/mower-bag", + "material/mower-on", + "material/mower", + "material/muffin", + "material/multicast", + "material/multimedia", + "material/multiplication-box", + "material/multiplication", + "material/mushroom-off-outline", + "material/mushroom-off", + "material/mushroom-outline", + "material/mushroom", + "material/music-accidental-double-flat", + "material/music-accidental-double-sharp", + "material/music-accidental-flat", + "material/music-accidental-natural", + "material/music-accidental-sharp", + "material/music-box-multiple-outline", + "material/music-box-multiple", + "material/music-box-outline", + "material/music-box", + "material/music-circle-outline", + "material/music-circle", + "material/music-clef-alto", + "material/music-clef-bass", + "material/music-clef-treble", + "material/music-note-bluetooth-off", + "material/music-note-bluetooth", + "material/music-note-eighth-dotted", + "material/music-note-eighth", + "material/music-note-half-dotted", + "material/music-note-half", + "material/music-note-minus", + "material/music-note-off-outline", + "material/music-note-off", + "material/music-note-outline", + "material/music-note-plus", + "material/music-note-quarter-dotted", + "material/music-note-quarter", + "material/music-note-sixteenth-dotted", + "material/music-note-sixteenth", + "material/music-note-whole-dotted", + "material/music-note-whole", + "material/music-note", + "material/music-off", + "material/music-rest-eighth", + "material/music-rest-half", + "material/music-rest-quarter", + "material/music-rest-sixteenth", + "material/music-rest-whole", + "material/music", + "material/mustache", + "material/nail", + "material/nas", + "material/nativescript", + "material/nature-outline", + "material/nature-people-outline", + "material/nature-people", + "material/nature", + "material/navigation-outline", + "material/navigation-variant-outline", + "material/navigation-variant", + "material/navigation", + "material/near-me", + "material/necklace", + "material/needle-off", + "material/needle", + "material/netflix", + "material/network-off-outline", + "material/network-off", + "material/network-outline", + "material/network-pos", + "material/network-strength-1-alert", + "material/network-strength-1", + "material/network-strength-2-alert", + "material/network-strength-2", + "material/network-strength-3-alert", + "material/network-strength-3", + "material/network-strength-4-alert", + "material/network-strength-4-cog", + "material/network-strength-4", + "material/network-strength-off-outline", + "material/network-strength-off", + "material/network-strength-outline", + "material/network", + "material/new-box", + "material/newspaper-check", + "material/newspaper-minus", + "material/newspaper-plus", + "material/newspaper-remove", + "material/newspaper-variant-multiple-outline", + "material/newspaper-variant-multiple", + "material/newspaper-variant-outline", + "material/newspaper-variant", + "material/newspaper", + "material/nfc-search-variant", + "material/nfc-tap", + "material/nfc-variant-off", + "material/nfc-variant", + "material/nfc", + "material/ninja", + "material/nintendo-game-boy", + "material/nintendo-switch", + "material/nintendo-wii", + "material/nintendo-wiiu", + "material/nix", + "material/nodejs", + "material/noodles", + "material/not-equal-variant", + "material/not-equal", + "material/note-alert-outline", + "material/note-alert", + "material/note-check-outline", + "material/note-check", + "material/note-edit-outline", + "material/note-edit", + "material/note-minus-outline", + "material/note-minus", + "material/note-multiple-outline", + "material/note-multiple", + "material/note-off-outline", + "material/note-off", + "material/note-outline", + "material/note-plus-outline", + "material/note-plus", + "material/note-remove-outline", + "material/note-remove", + "material/note-search-outline", + "material/note-search", + "material/note-text-outline", + "material/note-text", + "material/note", + "material/notebook-check-outline", + "material/notebook-check", + "material/notebook-edit-outline", + "material/notebook-edit", + "material/notebook-heart-outline", + "material/notebook-heart", + "material/notebook-minus-outline", + "material/notebook-minus", + "material/notebook-multiple", + "material/notebook-outline", + "material/notebook-plus-outline", + "material/notebook-plus", + "material/notebook-remove-outline", + "material/notebook-remove", + "material/notebook", + "material/notification-clear-all", + "material/npm", + "material/nuke", + "material/null", + "material/numeric-0-box-multiple-outline", + "material/numeric-0-box-multiple", + "material/numeric-0-box-outline", + "material/numeric-0-box", + "material/numeric-0-circle-outline", + "material/numeric-0-circle", + "material/numeric-0", + "material/numeric-1-box-multiple-outline", + "material/numeric-1-box-multiple", + "material/numeric-1-box-outline", + "material/numeric-1-box", + "material/numeric-1-circle-outline", + "material/numeric-1-circle", + "material/numeric-1", + "material/numeric-10-box-multiple-outline", + "material/numeric-10-box-multiple", + "material/numeric-10-box-outline", + "material/numeric-10-box", + "material/numeric-10-circle-outline", + "material/numeric-10-circle", + "material/numeric-10", + "material/numeric-2-box-multiple-outline", + "material/numeric-2-box-multiple", + "material/numeric-2-box-outline", + "material/numeric-2-box", + "material/numeric-2-circle-outline", + "material/numeric-2-circle", + "material/numeric-2", + "material/numeric-3-box-multiple-outline", + "material/numeric-3-box-multiple", + "material/numeric-3-box-outline", + "material/numeric-3-box", + "material/numeric-3-circle-outline", + "material/numeric-3-circle", + "material/numeric-3", + "material/numeric-4-box-multiple-outline", + "material/numeric-4-box-multiple", + "material/numeric-4-box-outline", + "material/numeric-4-box", + "material/numeric-4-circle-outline", + "material/numeric-4-circle", + "material/numeric-4", + "material/numeric-5-box-multiple-outline", + "material/numeric-5-box-multiple", + "material/numeric-5-box-outline", + "material/numeric-5-box", + "material/numeric-5-circle-outline", + "material/numeric-5-circle", + "material/numeric-5", + "material/numeric-6-box-multiple-outline", + "material/numeric-6-box-multiple", + "material/numeric-6-box-outline", + "material/numeric-6-box", + "material/numeric-6-circle-outline", + "material/numeric-6-circle", + "material/numeric-6", + "material/numeric-7-box-multiple-outline", + "material/numeric-7-box-multiple", + "material/numeric-7-box-outline", + "material/numeric-7-box", + "material/numeric-7-circle-outline", + "material/numeric-7-circle", + "material/numeric-7", + "material/numeric-8-box-multiple-outline", + "material/numeric-8-box-multiple", + "material/numeric-8-box-outline", + "material/numeric-8-box", + "material/numeric-8-circle-outline", + "material/numeric-8-circle", + "material/numeric-8", + "material/numeric-9-box-multiple-outline", + "material/numeric-9-box-multiple", + "material/numeric-9-box-outline", + "material/numeric-9-box", + "material/numeric-9-circle-outline", + "material/numeric-9-circle", + "material/numeric-9-plus-box-multiple-outline", + "material/numeric-9-plus-box-multiple", + "material/numeric-9-plus-box-outline", + "material/numeric-9-plus-box", + "material/numeric-9-plus-circle-outline", + "material/numeric-9-plus-circle", + "material/numeric-9-plus", + "material/numeric-9", + "material/numeric-negative-1", + "material/numeric-off", + "material/numeric-positive-1", + "material/numeric", + "material/nut", + "material/nutrition", + "material/nuxt", + "material/oar", + "material/ocarina", + "material/oci", + "material/ocr", + "material/octagon-outline", + "material/octagon", + "material/octagram-edit-outline", + "material/octagram-edit", + "material/octagram-minus-outline", + "material/octagram-minus", + "material/octagram-outline", + "material/octagram-plus-outline", + "material/octagram-plus", + "material/octagram", + "material/octahedron-off", + "material/octahedron", + "material/odnoklassniki", + "material/offer", + "material/office-building-cog-outline", + "material/office-building-cog", + "material/office-building-marker-outline", + "material/office-building-marker", + "material/office-building-minus-outline", + "material/office-building-minus", + "material/office-building-outline", + "material/office-building-plus-outline", + "material/office-building-plus", + "material/office-building-remove-outline", + "material/office-building-remove", + "material/office-building", + "material/oil-lamp", + "material/oil-level", + "material/oil-temperature", + "material/oil", + "material/om", + "material/omega", + "material/one-up", + "material/onepassword", + "material/opacity", + "material/open-in-app", + "material/open-in-new", + "material/open-source-initiative", + "material/openid", + "material/opera", + "material/orbit-variant", + "material/orbit", + "material/order-alphabetical-ascending", + "material/order-alphabetical-descending", + "material/order-bool-ascending-variant", + "material/order-bool-ascending", + "material/order-bool-descending-variant", + "material/order-bool-descending", + "material/order-numeric-ascending", + "material/order-numeric-descending", + "material/origin", + "material/ornament-variant", + "material/ornament", + "material/outdoor-lamp", + "material/overscan", + "material/owl", + "material/pac-man", + "material/package-check", + "material/package-down", + "material/package-up", + "material/package-variant-closed-check", + "material/package-variant-closed-minus", + "material/package-variant-closed-plus", + "material/package-variant-closed-remove", + "material/package-variant-closed", + "material/package-variant-minus", + "material/package-variant-plus", + "material/package-variant-remove", + "material/package-variant", + "material/package", + "material/page-first", + "material/page-last", + "material/page-layout-body", + "material/page-layout-footer", + "material/page-layout-header-footer", + "material/page-layout-header", + "material/page-layout-sidebar-left", + "material/page-layout-sidebar-right", + "material/page-next-outline", + "material/page-next", + "material/page-previous-outline", + "material/page-previous", + "material/pail-minus-outline", + "material/pail-minus", + "material/pail-off-outline", + "material/pail-off", + "material/pail-outline", + "material/pail-plus-outline", + "material/pail-plus", + "material/pail-remove-outline", + "material/pail-remove", + "material/pail", + "material/palette-advanced", + "material/palette-outline", + "material/palette-swatch-outline", + "material/palette-swatch-variant", + "material/palette-swatch", + "material/palette", + "material/palm-tree", + "material/pan-bottom-left", + "material/pan-bottom-right", + "material/pan-down", + "material/pan-horizontal", + "material/pan-left", + "material/pan-right", + "material/pan-top-left", + "material/pan-top-right", + "material/pan-up", + "material/pan-vertical", + "material/pan", + "material/panda", + "material/pandora", + "material/panorama-fisheye", + "material/panorama-horizontal-outline", + "material/panorama-horizontal", + "material/panorama-outline", + "material/panorama-sphere-outline", + "material/panorama-sphere", + "material/panorama-variant-outline", + "material/panorama-variant", + "material/panorama-vertical-outline", + "material/panorama-vertical", + "material/panorama-wide-angle-outline", + "material/panorama-wide-angle", + "material/panorama", + "material/paper-cut-vertical", + "material/paper-roll-outline", + "material/paper-roll", + "material/paperclip-check", + "material/paperclip-lock", + "material/paperclip-minus", + "material/paperclip-off", + "material/paperclip-plus", + "material/paperclip-remove", + "material/paperclip", + "material/parachute-outline", + "material/parachute", + "material/paragliding", + "material/parking", + "material/party-popper", + "material/passport-alert", + "material/passport-biometric", + "material/passport-cancel", + "material/passport-check", + "material/passport-minus", + "material/passport-plus", + "material/passport-remove", + "material/passport", + "material/pasta", + "material/patio-heater", + "material/patreon", + "material/pause-box-outline", + "material/pause-box", + "material/pause-circle-outline", + "material/pause-circle", + "material/pause-octagon-outline", + "material/pause-octagon", + "material/pause", + "material/paw-off-outline", + "material/paw-off", + "material/paw-outline", + "material/paw", + "material/peace", + "material/peanut-off-outline", + "material/peanut-off", + "material/peanut-outline", + "material/peanut", + "material/pen-lock", + "material/pen-minus", + "material/pen-off", + "material/pen-plus", + "material/pen-remove", + "material/pen", + "material/pencil-box-multiple-outline", + "material/pencil-box-multiple", + "material/pencil-box-outline", + "material/pencil-box", + "material/pencil-circle-outline", + "material/pencil-circle", + "material/pencil-lock-outline", + "material/pencil-lock", + "material/pencil-minus-outline", + "material/pencil-minus", + "material/pencil-off-outline", + "material/pencil-off", + "material/pencil-outline", + "material/pencil-plus-outline", + "material/pencil-plus", + "material/pencil-remove-outline", + "material/pencil-remove", + "material/pencil-ruler-outline", + "material/pencil-ruler", + "material/pencil", + "material/penguin", + "material/pentagon-outline", + "material/pentagon", + "material/pentagram", + "material/percent-box-outline", + "material/percent-box", + "material/percent-circle-outline", + "material/percent-circle", + "material/percent-outline", + "material/percent", + "material/periodic-table", + "material/perspective-less", + "material/perspective-more", + "material/ph", + "material/phone-alert-outline", + "material/phone-alert", + "material/phone-bluetooth-outline", + "material/phone-bluetooth", + "material/phone-cancel-outline", + "material/phone-cancel", + "material/phone-check-outline", + "material/phone-check", + "material/phone-classic-off", + "material/phone-classic", + "material/phone-clock", + "material/phone-dial-outline", + "material/phone-dial", + "material/phone-forward-outline", + "material/phone-forward", + "material/phone-hangup-outline", + "material/phone-hangup", + "material/phone-in-talk-outline", + "material/phone-in-talk", + "material/phone-incoming-outgoing-outline", + "material/phone-incoming-outgoing", + "material/phone-incoming-outline", + "material/phone-incoming", + "material/phone-lock-outline", + "material/phone-lock", + "material/phone-log-outline", + "material/phone-log", + "material/phone-message-outline", + "material/phone-message", + "material/phone-minus-outline", + "material/phone-minus", + "material/phone-missed-outline", + "material/phone-missed", + "material/phone-off-outline", + "material/phone-off", + "material/phone-outgoing-outline", + "material/phone-outgoing", + "material/phone-outline", + "material/phone-paused-outline", + "material/phone-paused", + "material/phone-plus-outline", + "material/phone-plus", + "material/phone-refresh-outline", + "material/phone-refresh", + "material/phone-remove-outline", + "material/phone-remove", + "material/phone-return-outline", + "material/phone-return", + "material/phone-ring-outline", + "material/phone-ring", + "material/phone-rotate-landscape", + "material/phone-rotate-portrait", + "material/phone-settings-outline", + "material/phone-settings", + "material/phone-sync-outline", + "material/phone-sync", + "material/phone-voip", + "material/phone", + "material/pi-box", + "material/pi-hole", + "material/pi", + "material/piano-off", + "material/piano", + "material/pickaxe", + "material/picture-in-picture-bottom-right-outline", + "material/picture-in-picture-bottom-right", + "material/picture-in-picture-top-right-outline", + "material/picture-in-picture-top-right", + "material/pier-crane", + "material/pier", + "material/pig-variant-outline", + "material/pig-variant", + "material/pig", + "material/piggy-bank-outline", + "material/piggy-bank", + "material/pill-multiple", + "material/pill-off", + "material/pill", + "material/pillar", + "material/pin-off-outline", + "material/pin-off", + "material/pin-outline", + "material/pin", + "material/pine-tree-box", + "material/pine-tree-fire", + "material/pine-tree-variant-outline", + "material/pine-tree-variant", + "material/pine-tree", + "material/pinterest", + "material/pinwheel-outline", + "material/pinwheel", + "material/pipe-disconnected", + "material/pipe-leak", + "material/pipe-valve", + "material/pipe-wrench", + "material/pipe", + "material/pirate", + "material/pistol", + "material/piston", + "material/pitchfork", + "material/pizza", + "material/plane-car", + "material/plane-train", + "material/play-box-edit-outline", + "material/play-box-lock-open-outline", + "material/play-box-lock-open", + "material/play-box-lock-outline", + "material/play-box-lock", + "material/play-box-multiple-outline", + "material/play-box-multiple", + "material/play-box-outline", + "material/play-box", + "material/play-circle-outline", + "material/play-circle", + "material/play-network-outline", + "material/play-network", + "material/play-outline", + "material/play-pause", + "material/play-protected-content", + "material/play-speed", + "material/play", + "material/playlist-check", + "material/playlist-edit", + "material/playlist-minus", + "material/playlist-music-outline", + "material/playlist-music", + "material/playlist-play", + "material/playlist-plus", + "material/playlist-remove", + "material/playlist-star", + "material/plex", + "material/pliers", + "material/plus-box-multiple-outline", + "material/plus-box-multiple", + "material/plus-box-outline", + "material/plus-box", + "material/plus-circle-multiple-outline", + "material/plus-circle-multiple", + "material/plus-circle-outline", + "material/plus-circle", + "material/plus-lock-open", + "material/plus-lock", + "material/plus-minus-box", + "material/plus-minus-variant", + "material/plus-minus", + "material/plus-network-outline", + "material/plus-network", + "material/plus-outline", + "material/plus-thick", + "material/plus", + "material/pocket", + "material/podcast", + "material/podium-bronze", + "material/podium-gold", + "material/podium-silver", + "material/podium", + "material/point-of-sale", + "material/pokeball", + "material/pokemon-go", + "material/poker-chip", + "material/polaroid", + "material/police-badge-outline", + "material/police-badge", + "material/police-station", + "material/poll", + "material/polo", + "material/polymer", + "material/pool-thermometer", + "material/pool", + "material/popcorn", + "material/post-lamp", + "material/post-outline", + "material/post", + "material/postage-stamp", + "material/pot-mix-outline", + "material/pot-mix", + "material/pot-outline", + "material/pot-steam-outline", + "material/pot-steam", + "material/pot", + "material/pound-box-outline", + "material/pound-box", + "material/pound", + "material/power-cycle", + "material/power-off", + "material/power-on", + "material/power-plug-battery-outline", + "material/power-plug-battery", + "material/power-plug-off-outline", + "material/power-plug-off", + "material/power-plug-outline", + "material/power-plug", + "material/power-settings", + "material/power-sleep", + "material/power-socket-au", + "material/power-socket-ch", + "material/power-socket-de", + "material/power-socket-eu", + "material/power-socket-fr", + "material/power-socket-it", + "material/power-socket-jp", + "material/power-socket-uk", + "material/power-socket-us", + "material/power-socket", + "material/power-standby", + "material/power", + "material/powershell", + "material/prescription", + "material/presentation-play", + "material/presentation", + "material/pretzel", + "material/printer-3d-nozzle-alert-outline", + "material/printer-3d-nozzle-alert", + "material/printer-3d-nozzle-heat-outline", + "material/printer-3d-nozzle-heat", + "material/printer-3d-nozzle-off-outline", + "material/printer-3d-nozzle-off", + "material/printer-3d-nozzle-outline", + "material/printer-3d-nozzle", + "material/printer-3d-off", + "material/printer-3d", + "material/printer-alert", + "material/printer-check", + "material/printer-eye", + "material/printer-off-outline", + "material/printer-off", + "material/printer-outline", + "material/printer-pos-alert-outline", + "material/printer-pos-alert", + "material/printer-pos-cancel-outline", + "material/printer-pos-cancel", + "material/printer-pos-check-outline", + "material/printer-pos-check", + "material/printer-pos-cog-outline", + "material/printer-pos-cog", + "material/printer-pos-edit-outline", + "material/printer-pos-edit", + "material/printer-pos-minus-outline", + "material/printer-pos-minus", + "material/printer-pos-network-outline", + "material/printer-pos-network", + "material/printer-pos-off-outline", + "material/printer-pos-off", + "material/printer-pos-outline", + "material/printer-pos-pause-outline", + "material/printer-pos-pause", + "material/printer-pos-play-outline", + "material/printer-pos-play", + "material/printer-pos-plus-outline", + "material/printer-pos-plus", + "material/printer-pos-refresh-outline", + "material/printer-pos-refresh", + "material/printer-pos-remove-outline", + "material/printer-pos-remove", + "material/printer-pos-star-outline", + "material/printer-pos-star", + "material/printer-pos-stop-outline", + "material/printer-pos-stop", + "material/printer-pos-sync-outline", + "material/printer-pos-sync", + "material/printer-pos-wrench-outline", + "material/printer-pos-wrench", + "material/printer-pos", + "material/printer-search", + "material/printer-settings", + "material/printer-wireless", + "material/printer", + "material/priority-high", + "material/priority-low", + "material/professional-hexagon", + "material/progress-alert", + "material/progress-check", + "material/progress-clock", + "material/progress-close", + "material/progress-download", + "material/progress-helper", + "material/progress-pencil", + "material/progress-question", + "material/progress-star-four-points", + "material/progress-star", + "material/progress-upload", + "material/progress-wrench", + "material/projector-off", + "material/projector-screen-off-outline", + "material/projector-screen-off", + "material/projector-screen-outline", + "material/projector-screen-variant-off-outline", + "material/projector-screen-variant-off", + "material/projector-screen-variant-outline", + "material/projector-screen-variant", + "material/projector-screen", + "material/projector", + "material/propane-tank-outline", + "material/propane-tank", + "material/protocol", + "material/publish-off", + "material/publish", + "material/pulse", + "material/pump-off", + "material/pump", + "material/pumpkin", + "material/purse-outline", + "material/purse", + "material/puzzle-check-outline", + "material/puzzle-check", + "material/puzzle-edit-outline", + "material/puzzle-edit", + "material/puzzle-heart-outline", + "material/puzzle-heart", + "material/puzzle-minus-outline", + "material/puzzle-minus", + "material/puzzle-outline", + "material/puzzle-plus-outline", + "material/puzzle-plus", + "material/puzzle-remove-outline", + "material/puzzle-remove", + "material/puzzle-star-outline", + "material/puzzle-star", + "material/puzzle", + "material/pyramid-off", + "material/pyramid", + "material/qi", + "material/qqchat", + "material/qrcode-edit", + "material/qrcode-minus", + "material/qrcode-plus", + "material/qrcode-remove", + "material/qrcode-scan", + "material/qrcode", + "material/quadcopter", + "material/quality-high", + "material/quality-low", + "material/quality-medium", + "material/queue-first-in-last-out", + "material/quora", + "material/rabbit-variant-outline", + "material/rabbit-variant", + "material/rabbit", + "material/racing-helmet", + "material/racquetball", + "material/radar", + "material/radiator-disabled", + "material/radiator-off", + "material/radiator", + "material/radio-am", + "material/radio-fm", + "material/radio-handheld", + "material/radio-off", + "material/radio-tower", + "material/radio", + "material/radioactive-circle-outline", + "material/radioactive-circle", + "material/radioactive-off", + "material/radioactive", + "material/radiobox-blank", + "material/radiobox-indeterminate-variant", + "material/radiobox-marked", + "material/radiology-box-outline", + "material/radiology-box", + "material/radius-outline", + "material/radius", + "material/railroad-light", + "material/rake", + "material/raspberry-pi", + "material/raw-off", + "material/raw", + "material/ray-end-arrow", + "material/ray-end", + "material/ray-start-arrow", + "material/ray-start-end", + "material/ray-start-vertex-end", + "material/ray-start", + "material/ray-vertex", + "material/razor-double-edge", + "material/razor-single-edge", + "material/react", + "material/read", + "material/receipt-clock-outline", + "material/receipt-clock", + "material/receipt-outline", + "material/receipt-send-outline", + "material/receipt-send", + "material/receipt-text-arrow-left-outline", + "material/receipt-text-arrow-left", + "material/receipt-text-arrow-right-outline", + "material/receipt-text-arrow-right", + "material/receipt-text-check-outline", + "material/receipt-text-check", + "material/receipt-text-clock-outline", + "material/receipt-text-clock", + "material/receipt-text-edit-outline", + "material/receipt-text-edit", + "material/receipt-text-minus-outline", + "material/receipt-text-minus", + "material/receipt-text-outline", + "material/receipt-text-plus-outline", + "material/receipt-text-plus", + "material/receipt-text-remove-outline", + "material/receipt-text-remove", + "material/receipt-text-send-outline", + "material/receipt-text-send", + "material/receipt-text", + "material/receipt", + "material/record-circle-outline", + "material/record-circle", + "material/record-player", + "material/record-rec", + "material/record", + "material/rectangle-outline", + "material/rectangle", + "material/recycle-variant", + "material/recycle", + "material/reddit", + "material/redhat", + "material/redo-variant", + "material/redo", + "material/reflect-horizontal", + "material/reflect-vertical", + "material/refresh-auto", + "material/refresh-circle", + "material/refresh", + "material/regex", + "material/registered-trademark", + "material/reiterate", + "material/relation-many-to-many", + "material/relation-many-to-one-or-many", + "material/relation-many-to-one", + "material/relation-many-to-only-one", + "material/relation-many-to-zero-or-many", + "material/relation-many-to-zero-or-one", + "material/relation-one-or-many-to-many", + "material/relation-one-or-many-to-one-or-many", + "material/relation-one-or-many-to-one", + "material/relation-one-or-many-to-only-one", + "material/relation-one-or-many-to-zero-or-many", + "material/relation-one-or-many-to-zero-or-one", + "material/relation-one-to-many", + "material/relation-one-to-one-or-many", + "material/relation-one-to-one", + "material/relation-one-to-only-one", + "material/relation-one-to-zero-or-many", + "material/relation-one-to-zero-or-one", + "material/relation-only-one-to-many", + "material/relation-only-one-to-one-or-many", + "material/relation-only-one-to-one", + "material/relation-only-one-to-only-one", + "material/relation-only-one-to-zero-or-many", + "material/relation-only-one-to-zero-or-one", + "material/relation-zero-or-many-to-many", + "material/relation-zero-or-many-to-one-or-many", + "material/relation-zero-or-many-to-one", + "material/relation-zero-or-many-to-only-one", + "material/relation-zero-or-many-to-zero-or-many", + "material/relation-zero-or-many-to-zero-or-one", + "material/relation-zero-or-one-to-many", + "material/relation-zero-or-one-to-one-or-many", + "material/relation-zero-or-one-to-one", + "material/relation-zero-or-one-to-only-one", + "material/relation-zero-or-one-to-zero-or-many", + "material/relation-zero-or-one-to-zero-or-one", + "material/relative-scale", + "material/reload-alert", + "material/reload", + "material/reminder", + "material/remote-desktop", + "material/remote-off", + "material/remote-tv-off", + "material/remote-tv", + "material/remote", + "material/rename-box-outline", + "material/rename-box", + "material/rename-outline", + "material/rename", + "material/reorder-horizontal", + "material/reorder-vertical", + "material/repeat-off", + "material/repeat-once", + "material/repeat-variant", + "material/repeat", + "material/replay", + "material/reply-all-outline", + "material/reply-all", + "material/reply-circle", + "material/reply-outline", + "material/reply", + "material/reproduction", + "material/resistor-nodes", + "material/resistor", + "material/resize-bottom-right", + "material/resize", + "material/responsive", + "material/restart-alert", + "material/restart-off", + "material/restart", + "material/restore-alert", + "material/restore", + "material/rewind-10", + "material/rewind-15", + "material/rewind-30", + "material/rewind-45", + "material/rewind-5", + "material/rewind-60", + "material/rewind-outline", + "material/rewind", + "material/rhombus-medium-outline", + "material/rhombus-medium", + "material/rhombus-outline", + "material/rhombus-split-outline", + "material/rhombus-split", + "material/rhombus", + "material/ribbon", + "material/rice", + "material/rickshaw-electric", + "material/rickshaw", + "material/ring", + "material/rivet", + "material/road-variant", + "material/road", + "material/robber", + "material/robot-angry-outline", + "material/robot-angry", + "material/robot-confused-outline", + "material/robot-confused", + "material/robot-dead-outline", + "material/robot-dead", + "material/robot-excited-outline", + "material/robot-excited", + "material/robot-happy-outline", + "material/robot-happy", + "material/robot-industrial-outline", + "material/robot-industrial", + "material/robot-love-outline", + "material/robot-love", + "material/robot-mower-outline", + "material/robot-mower", + "material/robot-off-outline", + "material/robot-off", + "material/robot-outline", + "material/robot-vacuum-alert", + "material/robot-vacuum-off", + "material/robot-vacuum-variant-alert", + "material/robot-vacuum-variant-off", + "material/robot-vacuum-variant", + "material/robot-vacuum", + "material/robot", + "material/rocket-launch-outline", + "material/rocket-launch", + "material/rocket-outline", + "material/rocket", + "material/rodent", + "material/roller-shade-closed", + "material/roller-shade", + "material/roller-skate-off", + "material/roller-skate", + "material/rollerblade-off", + "material/rollerblade", + "material/rollupjs", + "material/rolodex-outline", + "material/rolodex", + "material/roman-numeral-1", + "material/roman-numeral-10", + "material/roman-numeral-2", + "material/roman-numeral-3", + "material/roman-numeral-4", + "material/roman-numeral-5", + "material/roman-numeral-6", + "material/roman-numeral-7", + "material/roman-numeral-8", + "material/roman-numeral-9", + "material/room-service-outline", + "material/room-service", + "material/rotate-360", + "material/rotate-3d-variant", + "material/rotate-3d", + "material/rotate-left-variant", + "material/rotate-left", + "material/rotate-orbit", + "material/rotate-right-variant", + "material/rotate-right", + "material/rounded-corner", + "material/router-network-wireless", + "material/router-network", + "material/router-wireless-off", + "material/router-wireless-settings", + "material/router-wireless", + "material/router", + "material/routes-clock", + "material/routes", + "material/rowing", + "material/rss-box", + "material/rss-off", + "material/rss", + "material/rug", + "material/rugby", + "material/ruler-square-compass", + "material/ruler-square", + "material/ruler", + "material/run-fast", + "material/run", + "material/rv-truck", + "material/sack-outline", + "material/sack-percent", + "material/sack", + "material/safe-square-outline", + "material/safe-square", + "material/safe", + "material/safety-goggles", + "material/sail-boat-sink", + "material/sail-boat", + "material/sale-outline", + "material/sale", + "material/salesforce", + "material/sass", + "material/satellite-uplink", + "material/satellite-variant", + "material/satellite", + "material/sausage-off", + "material/sausage", + "material/saw-blade", + "material/sawtooth-wave", + "material/saxophone", + "material/scale-balance", + "material/scale-bathroom", + "material/scale-off", + "material/scale-unbalanced", + "material/scale", + "material/scan-helper", + "material/scanner-off", + "material/scanner", + "material/scatter-plot-outline", + "material/scatter-plot", + "material/scent-off", + "material/scent", + "material/school-outline", + "material/school", + "material/scissors-cutting", + "material/scooter-electric", + "material/scooter", + "material/scoreboard-outline", + "material/scoreboard", + "material/screen-rotation-lock", + "material/screen-rotation", + "material/screw-flat-top", + "material/screw-lag", + "material/screw-machine-flat-top", + "material/screw-machine-round-top", + "material/screw-round-top", + "material/screwdriver", + "material/script-outline", + "material/script-text-key-outline", + "material/script-text-key", + "material/script-text-outline", + "material/script-text-play-outline", + "material/script-text-play", + "material/script-text", + "material/script", + "material/sd", + "material/seal-variant", + "material/seal", + "material/search-web", + "material/seat-flat-angled", + "material/seat-flat", + "material/seat-individual-suite", + "material/seat-legroom-extra", + "material/seat-legroom-normal", + "material/seat-legroom-reduced", + "material/seat-outline", + "material/seat-passenger", + "material/seat-recline-extra", + "material/seat-recline-normal", + "material/seat", + "material/seatbelt", + "material/security-network", + "material/security", + "material/seed-off-outline", + "material/seed-off", + "material/seed-outline", + "material/seed-plus-outline", + "material/seed-plus", + "material/seed", + "material/seesaw", + "material/segment", + "material/select-all", + "material/select-arrow-down", + "material/select-arrow-up", + "material/select-color", + "material/select-compare", + "material/select-drag", + "material/select-group", + "material/select-inverse", + "material/select-marker", + "material/select-multiple-marker", + "material/select-multiple", + "material/select-off", + "material/select-place", + "material/select-remove", + "material/select-search", + "material/select", + "material/selection-drag", + "material/selection-ellipse-arrow-inside", + "material/selection-ellipse-remove", + "material/selection-ellipse", + "material/selection-marker", + "material/selection-multiple-marker", + "material/selection-multiple", + "material/selection-off", + "material/selection-remove", + "material/selection-search", + "material/selection", + "material/semantic-web", + "material/send-check-outline", + "material/send-check", + "material/send-circle-outline", + "material/send-circle", + "material/send-clock-outline", + "material/send-clock", + "material/send-lock-outline", + "material/send-lock", + "material/send-outline", + "material/send-variant-clock-outline", + "material/send-variant-clock", + "material/send-variant-outline", + "material/send-variant", + "material/send", + "material/serial-port", + "material/server-minus-outline", + "material/server-minus", + "material/server-network-off", + "material/server-network-outline", + "material/server-network", + "material/server-off", + "material/server-outline", + "material/server-plus-outline", + "material/server-plus", + "material/server-remove", + "material/server-security", + "material/server", + "material/set-all", + "material/set-center-right", + "material/set-center", + "material/set-left-center", + "material/set-left-right", + "material/set-left", + "material/set-merge", + "material/set-none", + "material/set-right", + "material/set-split", + "material/set-square", + "material/set-top-box", + "material/settings-helper", + "material/shaker-outline", + "material/shaker", + "material/shape-circle-plus", + "material/shape-outline", + "material/shape-oval-plus", + "material/shape-plus-outline", + "material/shape-plus", + "material/shape-polygon-plus", + "material/shape-rectangle-plus", + "material/shape-square-plus", + "material/shape-square-rounded-plus", + "material/shape", + "material/share-all-outline", + "material/share-all", + "material/share-circle", + "material/share-off-outline", + "material/share-off", + "material/share-outline", + "material/share-variant-outline", + "material/share-variant", + "material/share", + "material/shark-fin-outline", + "material/shark-fin", + "material/shark-off", + "material/shark", + "material/sheep", + "material/shield-account-outline", + "material/shield-account-variant-outline", + "material/shield-account-variant", + "material/shield-account", + "material/shield-airplane-outline", + "material/shield-airplane", + "material/shield-alert-outline", + "material/shield-alert", + "material/shield-bug-outline", + "material/shield-bug", + "material/shield-car", + "material/shield-check-outline", + "material/shield-check", + "material/shield-cross-outline", + "material/shield-cross", + "material/shield-crown-outline", + "material/shield-crown", + "material/shield-edit-outline", + "material/shield-edit", + "material/shield-half-full", + "material/shield-half", + "material/shield-home-outline", + "material/shield-home", + "material/shield-key-outline", + "material/shield-key", + "material/shield-link-variant-outline", + "material/shield-link-variant", + "material/shield-lock-open-outline", + "material/shield-lock-open", + "material/shield-lock-outline", + "material/shield-lock", + "material/shield-moon-outline", + "material/shield-moon", + "material/shield-off-outline", + "material/shield-off", + "material/shield-outline", + "material/shield-plus-outline", + "material/shield-plus", + "material/shield-refresh-outline", + "material/shield-refresh", + "material/shield-remove-outline", + "material/shield-remove", + "material/shield-search", + "material/shield-star-outline", + "material/shield-star", + "material/shield-sun-outline", + "material/shield-sun", + "material/shield-sword-outline", + "material/shield-sword", + "material/shield-sync-outline", + "material/shield-sync", + "material/shield", + "material/shimmer", + "material/ship-wheel", + "material/shipping-pallet", + "material/shoe-ballet", + "material/shoe-cleat", + "material/shoe-formal", + "material/shoe-heel", + "material/shoe-print", + "material/shoe-sneaker", + "material/shopping-music", + "material/shopping-outline", + "material/shopping-search-outline", + "material/shopping-search", + "material/shopping", + "material/shore", + "material/shovel-off", + "material/shovel", + "material/shower-head", + "material/shower", + "material/shredder", + "material/shuffle-disabled", + "material/shuffle-variant", + "material/shuffle", + "material/shuriken", + "material/sickle", + "material/sigma-lower", + "material/sigma", + "material/sign-caution", + "material/sign-direction-minus", + "material/sign-direction-plus", + "material/sign-direction-remove", + "material/sign-direction", + "material/sign-language-outline", + "material/sign-language", + "material/sign-pole", + "material/sign-real-estate", + "material/sign-text", + "material/sign-yield", + "material/signal-2g", + "material/signal-3g", + "material/signal-4g", + "material/signal-5g", + "material/signal-cellular-1", + "material/signal-cellular-2", + "material/signal-cellular-3", + "material/signal-cellular-outline", + "material/signal-distance-variant", + "material/signal-hspa-plus", + "material/signal-hspa", + "material/signal-off", + "material/signal-variant", + "material/signal", + "material/signature-freehand", + "material/signature-image", + "material/signature-text", + "material/signature", + "material/silo-outline", + "material/silo", + "material/silverware-clean", + "material/silverware-fork-knife", + "material/silverware-fork", + "material/silverware-spoon", + "material/silverware-variant", + "material/silverware", + "material/sim-alert-outline", + "material/sim-alert", + "material/sim-off-outline", + "material/sim-off", + "material/sim-outline", + "material/sim", + "material/simple-icons", + "material/sina-weibo", + "material/sine-wave", + "material/sitemap-outline", + "material/sitemap", + "material/size-l", + "material/size-m", + "material/size-s", + "material/size-xl", + "material/size-xs", + "material/size-xxl", + "material/size-xxs", + "material/size-xxxl", + "material/skate-off", + "material/skate", + "material/skateboard", + "material/skateboarding", + "material/skew-less", + "material/skew-more", + "material/ski-cross-country", + "material/ski-water", + "material/ski", + "material/skip-backward-outline", + "material/skip-backward", + "material/skip-forward-outline", + "material/skip-forward", + "material/skip-next-circle-outline", + "material/skip-next-circle", + "material/skip-next-outline", + "material/skip-next", + "material/skip-previous-circle-outline", + "material/skip-previous-circle", + "material/skip-previous-outline", + "material/skip-previous", + "material/skull-crossbones-outline", + "material/skull-crossbones", + "material/skull-outline", + "material/skull-scan-outline", + "material/skull-scan", + "material/skull", + "material/skype-business", + "material/skype", + "material/slack", + "material/slash-forward-box", + "material/slash-forward", + "material/sledding", + "material/sleep-off", + "material/sleep", + "material/slide", + "material/slope-downhill", + "material/slope-uphill", + "material/slot-machine-outline", + "material/slot-machine", + "material/smart-card-off-outline", + "material/smart-card-off", + "material/smart-card-outline", + "material/smart-card-reader-outline", + "material/smart-card-reader", + "material/smart-card", + "material/smog", + "material/smoke-detector-alert-outline", + "material/smoke-detector-alert", + "material/smoke-detector-off-outline", + "material/smoke-detector-off", + "material/smoke-detector-outline", + "material/smoke-detector-variant-alert", + "material/smoke-detector-variant-off", + "material/smoke-detector-variant", + "material/smoke-detector", + "material/smoke", + "material/smoking-off", + "material/smoking-pipe-off", + "material/smoking-pipe", + "material/smoking", + "material/snail", + "material/snake", + "material/snapchat", + "material/snowboard", + "material/snowflake-alert", + "material/snowflake-check", + "material/snowflake-melt", + "material/snowflake-off", + "material/snowflake-thermometer", + "material/snowflake-variant", + "material/snowflake", + "material/snowman", + "material/snowmobile", + "material/snowshoeing", + "material/soccer-field", + "material/soccer", + "material/social-distance-2-meters", + "material/social-distance-6-feet", + "material/sofa-outline", + "material/sofa-single-outline", + "material/sofa-single", + "material/sofa", + "material/solar-panel-large", + "material/solar-panel", + "material/solar-power-variant-outline", + "material/solar-power-variant", + "material/solar-power", + "material/soldering-iron", + "material/solid", + "material/sony-playstation", + "material/sort-alphabetical-ascending-variant", + "material/sort-alphabetical-ascending", + "material/sort-alphabetical-descending-variant", + "material/sort-alphabetical-descending", + "material/sort-alphabetical-variant", + "material/sort-ascending", + "material/sort-bool-ascending-variant", + "material/sort-bool-ascending", + "material/sort-bool-descending-variant", + "material/sort-bool-descending", + "material/sort-calendar-ascending", + "material/sort-calendar-descending", + "material/sort-clock-ascending-outline", + "material/sort-clock-ascending", + "material/sort-clock-descending-outline", + "material/sort-clock-descending", + "material/sort-descending", + "material/sort-numeric-ascending-variant", + "material/sort-numeric-ascending", + "material/sort-numeric-descending-variant", + "material/sort-numeric-descending", + "material/sort-numeric-variant", + "material/sort-reverse-variant", + "material/sort-variant-lock-open", + "material/sort-variant-lock", + "material/sort-variant-off", + "material/sort-variant-remove", + "material/sort-variant", + "material/sort", + "material/soundbar", + "material/soundcloud", + "material/source-branch-check", + "material/source-branch-minus", + "material/source-branch-plus", + "material/source-branch-refresh", + "material/source-branch-remove", + "material/source-branch-sync", + "material/source-branch", + "material/source-commit-end-local", + "material/source-commit-end", + "material/source-commit-local", + "material/source-commit-next-local", + "material/source-commit-start-next-local", + "material/source-commit-start", + "material/source-commit", + "material/source-fork", + "material/source-merge", + "material/source-pull", + "material/source-repository-multiple", + "material/source-repository", + "material/soy-sauce-off", + "material/soy-sauce", + "material/spa-outline", + "material/spa", + "material/space-invaders", + "material/space-station", + "material/spade", + "material/speaker-bluetooth", + "material/speaker-message", + "material/speaker-multiple", + "material/speaker-off", + "material/speaker-pause", + "material/speaker-play", + "material/speaker-stop", + "material/speaker-wireless", + "material/speaker", + "material/spear", + "material/speedometer-medium", + "material/speedometer-slow", + "material/speedometer", + "material/spellcheck", + "material/sphere-off", + "material/sphere", + "material/spider-outline", + "material/spider-thread", + "material/spider-web", + "material/spider", + "material/spirit-level", + "material/spoon-sugar", + "material/spotify", + "material/spotlight-beam", + "material/spotlight", + "material/spray-bottle", + "material/spray", + "material/sprinkler-fire", + "material/sprinkler-variant", + "material/sprinkler", + "material/sprout-outline", + "material/sprout", + "material/square-circle-outline", + "material/square-circle", + "material/square-edit-outline", + "material/square-medium-outline", + "material/square-medium", + "material/square-off-outline", + "material/square-off", + "material/square-opacity", + "material/square-outline", + "material/square-root-box", + "material/square-root", + "material/square-rounded-badge-outline", + "material/square-rounded-badge", + "material/square-rounded-outline", + "material/square-rounded", + "material/square-small", + "material/square-wave", + "material/square", + "material/squeegee", + "material/ssh", + "material/stack-exchange", + "material/stack-overflow", + "material/stackpath", + "material/stadium-outline", + "material/stadium-variant", + "material/stadium", + "material/stairs-box", + "material/stairs-down", + "material/stairs-up", + "material/stairs", + "material/stamper", + "material/standard-definition", + "material/star-box-multiple-outline", + "material/star-box-multiple", + "material/star-box-outline", + "material/star-box", + "material/star-check-outline", + "material/star-check", + "material/star-circle-outline", + "material/star-circle", + "material/star-cog-outline", + "material/star-cog", + "material/star-crescent", + "material/star-david", + "material/star-face", + "material/star-four-points-box-outline", + "material/star-four-points-box", + "material/star-four-points-circle-outline", + "material/star-four-points-circle", + "material/star-four-points-outline", + "material/star-four-points-small", + "material/star-four-points", + "material/star-half-full", + "material/star-half", + "material/star-minus-outline", + "material/star-minus", + "material/star-off-outline", + "material/star-off", + "material/star-outline", + "material/star-plus-outline", + "material/star-plus", + "material/star-remove-outline", + "material/star-remove", + "material/star-settings-outline", + "material/star-settings", + "material/star-shooting-outline", + "material/star-shooting", + "material/star-three-points-outline", + "material/star-three-points", + "material/star", + "material/state-machine", + "material/steam", + "material/steering-off", + "material/steering", + "material/step-backward-2", + "material/step-backward", + "material/step-forward-2", + "material/step-forward", + "material/stethoscope", + "material/sticker-alert-outline", + "material/sticker-alert", + "material/sticker-check-outline", + "material/sticker-check", + "material/sticker-circle-outline", + "material/sticker-emoji", + "material/sticker-minus-outline", + "material/sticker-minus", + "material/sticker-outline", + "material/sticker-plus-outline", + "material/sticker-plus", + "material/sticker-remove-outline", + "material/sticker-remove", + "material/sticker-text-outline", + "material/sticker-text", + "material/sticker", + "material/stocking", + "material/stomach", + "material/stool-outline", + "material/stool", + "material/stop-circle-outline", + "material/stop-circle", + "material/stop", + "material/storage-tank-outline", + "material/storage-tank", + "material/store-24-hour", + "material/store-alert-outline", + "material/store-alert", + "material/store-check-outline", + "material/store-check", + "material/store-clock-outline", + "material/store-clock", + "material/store-cog-outline", + "material/store-cog", + "material/store-edit-outline", + "material/store-edit", + "material/store-marker-outline", + "material/store-marker", + "material/store-minus-outline", + "material/store-minus", + "material/store-off-outline", + "material/store-off", + "material/store-outline", + "material/store-plus-outline", + "material/store-plus", + "material/store-remove-outline", + "material/store-remove", + "material/store-search-outline", + "material/store-search", + "material/store-settings-outline", + "material/store-settings", + "material/store", + "material/storefront-check-outline", + "material/storefront-check", + "material/storefront-edit-outline", + "material/storefront-edit", + "material/storefront-minus-outline", + "material/storefront-minus", + "material/storefront-outline", + "material/storefront-plus-outline", + "material/storefront-plus", + "material/storefront-remove-outline", + "material/storefront-remove", + "material/storefront", + "material/stove", + "material/strategy", + "material/stretch-to-page-outline", + "material/stretch-to-page", + "material/string-lights-off", + "material/string-lights", + "material/subdirectory-arrow-left", + "material/subdirectory-arrow-right", + "material/submarine", + "material/subtitles-outline", + "material/subtitles", + "material/subway-alert-variant", + "material/subway-variant", + "material/subway", + "material/summit", + "material/sun-angle-outline", + "material/sun-angle", + "material/sun-clock-outline", + "material/sun-clock", + "material/sun-compass", + "material/sun-snowflake-variant", + "material/sun-snowflake", + "material/sun-thermometer-outline", + "material/sun-thermometer", + "material/sun-wireless-outline", + "material/sun-wireless", + "material/sunglasses", + "material/surfing", + "material/surround-sound-2-0", + "material/surround-sound-2-1", + "material/surround-sound-3-1", + "material/surround-sound-5-1-2", + "material/surround-sound-5-1", + "material/surround-sound-7-1", + "material/surround-sound", + "material/svg", + "material/swap-horizontal-bold", + "material/swap-horizontal-circle-outline", + "material/swap-horizontal-circle", + "material/swap-horizontal-variant", + "material/swap-horizontal", + "material/swap-vertical-bold", + "material/swap-vertical-circle-outline", + "material/swap-vertical-circle", + "material/swap-vertical-variant", + "material/swap-vertical", + "material/swim", + "material/switch", + "material/sword-cross", + "material/sword", + "material/syllabary-hangul", + "material/syllabary-hiragana", + "material/syllabary-katakana-halfwidth", + "material/syllabary-katakana", + "material/symbol", + "material/symfony", + "material/synagogue-outline", + "material/synagogue", + "material/sync-alert", + "material/sync-circle", + "material/sync-off", + "material/sync", + "material/tab-minus", + "material/tab-plus", + "material/tab-remove", + "material/tab-search", + "material/tab-unselected", + "material/tab", + "material/table-account", + "material/table-alert", + "material/table-arrow-down", + "material/table-arrow-left", + "material/table-arrow-right", + "material/table-arrow-up", + "material/table-border", + "material/table-cancel", + "material/table-chair", + "material/table-check", + "material/table-clock", + "material/table-cog", + "material/table-column-plus-after", + "material/table-column-plus-before", + "material/table-column-remove", + "material/table-column-width", + "material/table-column", + "material/table-edit", + "material/table-eye-off", + "material/table-eye", + "material/table-filter", + "material/table-furniture", + "material/table-headers-eye-off", + "material/table-headers-eye", + "material/table-heart", + "material/table-key", + "material/table-large-plus", + "material/table-large-remove", + "material/table-large", + "material/table-lock", + "material/table-merge-cells", + "material/table-minus", + "material/table-multiple", + "material/table-network", + "material/table-of-contents", + "material/table-off", + "material/table-picnic", + "material/table-pivot", + "material/table-plus", + "material/table-question", + "material/table-refresh", + "material/table-remove", + "material/table-row-height", + "material/table-row-plus-after", + "material/table-row-plus-before", + "material/table-row-remove", + "material/table-row", + "material/table-search", + "material/table-settings", + "material/table-split-cell", + "material/table-star", + "material/table-sync", + "material/table-tennis", + "material/table", + "material/tablet-cellphone", + "material/tablet-dashboard", + "material/tablet", + "material/taco", + "material/tag-arrow-down-outline", + "material/tag-arrow-down", + "material/tag-arrow-left-outline", + "material/tag-arrow-left", + "material/tag-arrow-right-outline", + "material/tag-arrow-right", + "material/tag-arrow-up-outline", + "material/tag-arrow-up", + "material/tag-check-outline", + "material/tag-check", + "material/tag-edit-outline", + "material/tag-edit", + "material/tag-faces", + "material/tag-heart-outline", + "material/tag-heart", + "material/tag-hidden", + "material/tag-minus-outline", + "material/tag-minus", + "material/tag-multiple-outline", + "material/tag-multiple", + "material/tag-off-outline", + "material/tag-off", + "material/tag-outline", + "material/tag-plus-outline", + "material/tag-plus", + "material/tag-remove-outline", + "material/tag-remove", + "material/tag-search-outline", + "material/tag-search", + "material/tag-text-outline", + "material/tag-text", + "material/tag", + "material/tailwind", + "material/tally-mark-1", + "material/tally-mark-2", + "material/tally-mark-3", + "material/tally-mark-4", + "material/tally-mark-5", + "material/tangram", + "material/tank", + "material/tanker-truck", + "material/tape-drive", + "material/tape-measure", + "material/target-account", + "material/target-variant", + "material/target", + "material/taxi", + "material/tea-outline", + "material/tea", + "material/teamviewer", + "material/teddy-bear", + "material/telescope", + "material/television-ambient-light", + "material/television-box", + "material/television-classic-off", + "material/television-classic", + "material/television-guide", + "material/television-off", + "material/television-pause", + "material/television-play", + "material/television-shimmer", + "material/television-speaker-off", + "material/television-speaker", + "material/television-stop", + "material/television", + "material/temperature-celsius", + "material/temperature-fahrenheit", + "material/temperature-kelvin", + "material/temple-buddhist-outline", + "material/temple-buddhist", + "material/temple-hindu-outline", + "material/temple-hindu", + "material/tennis-ball-outline", + "material/tennis-ball", + "material/tennis", + "material/tent", + "material/terraform", + "material/terrain", + "material/test-tube-empty", + "material/test-tube-off", + "material/test-tube", + "material/text-account", + "material/text-box-check-outline", + "material/text-box-check", + "material/text-box-edit-outline", + "material/text-box-edit", + "material/text-box-minus-outline", + "material/text-box-minus", + "material/text-box-multiple-outline", + "material/text-box-multiple", + "material/text-box-outline", + "material/text-box-plus-outline", + "material/text-box-plus", + "material/text-box-remove-outline", + "material/text-box-remove", + "material/text-box-search-outline", + "material/text-box-search", + "material/text-box", + "material/text-long", + "material/text-recognition", + "material/text-search-variant", + "material/text-search", + "material/text-shadow", + "material/text-short", + "material/text", + "material/texture-box", + "material/texture", + "material/theater", + "material/theme-light-dark", + "material/thermometer-alert", + "material/thermometer-auto", + "material/thermometer-bluetooth", + "material/thermometer-check", + "material/thermometer-chevron-down", + "material/thermometer-chevron-up", + "material/thermometer-high", + "material/thermometer-lines", + "material/thermometer-low", + "material/thermometer-minus", + "material/thermometer-off", + "material/thermometer-plus", + "material/thermometer-probe-off", + "material/thermometer-probe", + "material/thermometer-water", + "material/thermometer", + "material/thermostat-auto", + "material/thermostat-box-auto", + "material/thermostat-box", + "material/thermostat-cog", + "material/thermostat", + "material/thought-bubble-outline", + "material/thought-bubble", + "material/thumb-down-outline", + "material/thumb-down", + "material/thumb-up-outline", + "material/thumb-up", + "material/thumbs-up-down-outline", + "material/thumbs-up-down", + "material/ticket-account", + "material/ticket-confirmation-outline", + "material/ticket-confirmation", + "material/ticket-outline", + "material/ticket-percent-outline", + "material/ticket-percent", + "material/ticket", + "material/tie", + "material/tilde-off", + "material/tilde", + "material/timelapse", + "material/timeline-alert-outline", + "material/timeline-alert", + "material/timeline-check-outline", + "material/timeline-check", + "material/timeline-clock-outline", + "material/timeline-clock", + "material/timeline-minus-outline", + "material/timeline-minus", + "material/timeline-outline", + "material/timeline-plus-outline", + "material/timeline-plus", + "material/timeline-question-outline", + "material/timeline-question", + "material/timeline-remove-outline", + "material/timeline-remove", + "material/timeline-text-outline", + "material/timeline-text", + "material/timeline", + "material/timer-10", + "material/timer-3", + "material/timer-alert-outline", + "material/timer-alert", + "material/timer-cancel-outline", + "material/timer-cancel", + "material/timer-check-outline", + "material/timer-check", + "material/timer-cog-outline", + "material/timer-cog", + "material/timer-edit-outline", + "material/timer-edit", + "material/timer-lock-open-outline", + "material/timer-lock-open", + "material/timer-lock-outline", + "material/timer-lock", + "material/timer-marker-outline", + "material/timer-marker", + "material/timer-minus-outline", + "material/timer-minus", + "material/timer-music-outline", + "material/timer-music", + "material/timer-off-outline", + "material/timer-off", + "material/timer-outline", + "material/timer-pause-outline", + "material/timer-pause", + "material/timer-play-outline", + "material/timer-play", + "material/timer-plus-outline", + "material/timer-plus", + "material/timer-refresh-outline", + "material/timer-refresh", + "material/timer-remove-outline", + "material/timer-remove", + "material/timer-sand-complete", + "material/timer-sand-empty", + "material/timer-sand-full", + "material/timer-sand-paused", + "material/timer-sand", + "material/timer-settings-outline", + "material/timer-settings", + "material/timer-star-outline", + "material/timer-star", + "material/timer-stop-outline", + "material/timer-stop", + "material/timer-sync-outline", + "material/timer-sync", + "material/timer", + "material/timetable", + "material/tire", + "material/toaster-off", + "material/toaster-oven", + "material/toaster", + "material/toggle-switch-off-outline", + "material/toggle-switch-off", + "material/toggle-switch-outline", + "material/toggle-switch-variant-off", + "material/toggle-switch-variant", + "material/toggle-switch", + "material/toilet", + "material/toolbox-outline", + "material/toolbox", + "material/tools", + "material/tooltip-account", + "material/tooltip-cellphone", + "material/tooltip-check-outline", + "material/tooltip-check", + "material/tooltip-edit-outline", + "material/tooltip-edit", + "material/tooltip-image-outline", + "material/tooltip-image", + "material/tooltip-minus-outline", + "material/tooltip-minus", + "material/tooltip-outline", + "material/tooltip-plus-outline", + "material/tooltip-plus", + "material/tooltip-question-outline", + "material/tooltip-question", + "material/tooltip-remove-outline", + "material/tooltip-remove", + "material/tooltip-text-outline", + "material/tooltip-text", + "material/tooltip", + "material/tooth-outline", + "material/tooth", + "material/toothbrush-electric", + "material/toothbrush-paste", + "material/toothbrush", + "material/torch", + "material/tortoise", + "material/toslink", + "material/touch-text-outline", + "material/tournament", + "material/tow-truck", + "material/tower-beach", + "material/tower-fire", + "material/town-hall", + "material/toy-brick-marker-outline", + "material/toy-brick-marker", + "material/toy-brick-minus-outline", + "material/toy-brick-minus", + "material/toy-brick-outline", + "material/toy-brick-plus-outline", + "material/toy-brick-plus", + "material/toy-brick-remove-outline", + "material/toy-brick-remove", + "material/toy-brick-search-outline", + "material/toy-brick-search", + "material/toy-brick", + "material/track-light-off", + "material/track-light", + "material/trackpad-lock", + "material/trackpad", + "material/tractor-variant", + "material/tractor", + "material/trademark", + "material/traffic-cone", + "material/traffic-light-outline", + "material/traffic-light", + "material/train-bus", + "material/train-car-autorack", + "material/train-car-box-full", + "material/train-car-box-open", + "material/train-car-box", + "material/train-car-caboose", + "material/train-car-centerbeam-full", + "material/train-car-centerbeam", + "material/train-car-container", + "material/train-car-flatbed-car", + "material/train-car-flatbed-tank", + "material/train-car-flatbed", + "material/train-car-gondola-full", + "material/train-car-gondola", + "material/train-car-hopper-covered", + "material/train-car-hopper-full", + "material/train-car-hopper", + "material/train-car-intermodal", + "material/train-car-passenger-door-open", + "material/train-car-passenger-door", + "material/train-car-passenger-variant", + "material/train-car-passenger", + "material/train-car-tank", + "material/train-car", + "material/train-variant", + "material/train", + "material/tram-side", + "material/tram", + "material/transcribe-close", + "material/transcribe", + "material/transfer-down", + "material/transfer-left", + "material/transfer-right", + "material/transfer-up", + "material/transfer", + "material/transit-connection-horizontal", + "material/transit-connection-variant", + "material/transit-connection", + "material/transit-detour", + "material/transit-skip", + "material/transit-transfer", + "material/transition-masked", + "material/transition", + "material/translate-off", + "material/translate-variant", + "material/translate", + "material/transmission-tower-export", + "material/transmission-tower-import", + "material/transmission-tower-off", + "material/transmission-tower", + "material/trash-can-outline", + "material/trash-can", + "material/tray-alert", + "material/tray-arrow-down", + "material/tray-arrow-up", + "material/tray-full", + "material/tray-minus", + "material/tray-plus", + "material/tray-remove", + "material/tray", + "material/treasure-chest-outline", + "material/treasure-chest", + "material/tree-outline", + "material/tree", + "material/trello", + "material/trending-down", + "material/trending-neutral", + "material/trending-up", + "material/triangle-down-outline", + "material/triangle-down", + "material/triangle-outline", + "material/triangle-small-down", + "material/triangle-small-up", + "material/triangle-wave", + "material/triangle", + "material/triforce", + "material/trophy-award", + "material/trophy-broken", + "material/trophy-outline", + "material/trophy-variant-outline", + "material/trophy-variant", + "material/trophy", + "material/truck-alert-outline", + "material/truck-alert", + "material/truck-cargo-container", + "material/truck-check-outline", + "material/truck-check", + "material/truck-delivery-outline", + "material/truck-delivery", + "material/truck-fast-outline", + "material/truck-fast", + "material/truck-flatbed", + "material/truck-minus-outline", + "material/truck-minus", + "material/truck-off-road-off", + "material/truck-off-road", + "material/truck-outline", + "material/truck-plus-outline", + "material/truck-plus", + "material/truck-remove-outline", + "material/truck-remove", + "material/truck-snowflake", + "material/truck-trailer", + "material/truck", + "material/trumpet", + "material/tshirt-crew-outline", + "material/tshirt-crew", + "material/tshirt-v-outline", + "material/tshirt-v", + "material/tsunami", + "material/tumble-dryer-alert", + "material/tumble-dryer-off", + "material/tumble-dryer", + "material/tune-variant", + "material/tune-vertical-variant", + "material/tune-vertical", + "material/tune", + "material/tunnel-outline", + "material/tunnel", + "material/turbine", + "material/turkey", + "material/turnstile-outline", + "material/turnstile", + "material/turtle", + "material/twitch", + "material/twitter", + "material/two-factor-authentication", + "material/typewriter", + "material/ubisoft", + "material/ubuntu", + "material/ufo-outline", + "material/ufo", + "material/ultra-high-definition", + "material/umbraco", + "material/umbrella-beach-outline", + "material/umbrella-beach", + "material/umbrella-closed-outline", + "material/umbrella-closed-variant", + "material/umbrella-closed", + "material/umbrella-outline", + "material/umbrella", + "material/undo-variant", + "material/undo", + "material/unfold-less-horizontal", + "material/unfold-less-vertical", + "material/unfold-more-horizontal", + "material/unfold-more-vertical", + "material/ungroup", + "material/unicode", + "material/unicorn-variant", + "material/unicorn", + "material/unicycle", + "material/unity", + "material/unreal", + "material/update", + "material/upload-lock-outline", + "material/upload-lock", + "material/upload-multiple", + "material/upload-network-outline", + "material/upload-network", + "material/upload-off-outline", + "material/upload-off", + "material/upload-outline", + "material/upload", + "material/usb-c-port", + "material/usb-flash-drive-outline", + "material/usb-flash-drive", + "material/usb-port", + "material/usb", + "material/vacuum-outline", + "material/vacuum", + "material/valve-closed", + "material/valve-open", + "material/valve", + "material/van-passenger", + "material/van-utility", + "material/vanish-quarter", + "material/vanish", + "material/vanity-light", + "material/variable-box", + "material/variable", + "material/vector-arrange-above", + "material/vector-arrange-below", + "material/vector-bezier", + "material/vector-circle-variant", + "material/vector-circle", + "material/vector-combine", + "material/vector-curve", + "material/vector-difference-ab", + "material/vector-difference-ba", + "material/vector-difference", + "material/vector-ellipse", + "material/vector-intersection", + "material/vector-line", + "material/vector-link", + "material/vector-point-edit", + "material/vector-point-minus", + "material/vector-point-plus", + "material/vector-point-select", + "material/vector-point", + "material/vector-polygon-variant", + "material/vector-polygon", + "material/vector-polyline-edit", + "material/vector-polyline-minus", + "material/vector-polyline-plus", + "material/vector-polyline-remove", + "material/vector-polyline", + "material/vector-radius", + "material/vector-rectangle", + "material/vector-selection", + "material/vector-square-close", + "material/vector-square-edit", + "material/vector-square-minus", + "material/vector-square-open", + "material/vector-square-plus", + "material/vector-square-remove", + "material/vector-square", + "material/vector-triangle", + "material/vector-union", + "material/vhs", + "material/vibrate-off", + "material/vibrate", + "material/video-2d", + "material/video-3d-off", + "material/video-3d-variant", + "material/video-3d", + "material/video-4k-box", + "material/video-account", + "material/video-box-off", + "material/video-box", + "material/video-check-outline", + "material/video-check", + "material/video-high-definition", + "material/video-image", + "material/video-input-antenna", + "material/video-input-component", + "material/video-input-hdmi", + "material/video-input-scart", + "material/video-input-svideo", + "material/video-marker-outline", + "material/video-marker", + "material/video-minus-outline", + "material/video-minus", + "material/video-off-outline", + "material/video-off", + "material/video-outline", + "material/video-plus-outline", + "material/video-plus", + "material/video-stabilization", + "material/video-standard-definition", + "material/video-switch-outline", + "material/video-switch", + "material/video-vintage", + "material/video-wireless-outline", + "material/video-wireless", + "material/video", + "material/view-agenda-outline", + "material/view-agenda", + "material/view-array-outline", + "material/view-array", + "material/view-carousel-outline", + "material/view-carousel", + "material/view-column-outline", + "material/view-column", + "material/view-comfy-outline", + "material/view-comfy", + "material/view-compact-outline", + "material/view-compact", + "material/view-dashboard-edit-outline", + "material/view-dashboard-edit", + "material/view-dashboard-outline", + "material/view-dashboard-variant-outline", + "material/view-dashboard-variant", + "material/view-dashboard", + "material/view-day-outline", + "material/view-day", + "material/view-gallery-outline", + "material/view-gallery", + "material/view-grid-compact", + "material/view-grid-outline", + "material/view-grid-plus-outline", + "material/view-grid-plus", + "material/view-grid", + "material/view-headline", + "material/view-list-outline", + "material/view-list", + "material/view-module-outline", + "material/view-module", + "material/view-parallel-outline", + "material/view-parallel", + "material/view-quilt-outline", + "material/view-quilt", + "material/view-sequential-outline", + "material/view-sequential", + "material/view-split-horizontal", + "material/view-split-vertical", + "material/view-stream-outline", + "material/view-stream", + "material/view-week-outline", + "material/view-week", + "material/vimeo", + "material/violin", + "material/virtual-reality", + "material/virus-off-outline", + "material/virus-off", + "material/virus-outline", + "material/virus", + "material/vlc", + "material/voicemail", + "material/volcano-outline", + "material/volcano", + "material/volleyball", + "material/volume-equal", + "material/volume-high", + "material/volume-low", + "material/volume-medium", + "material/volume-minus", + "material/volume-mute", + "material/volume-off", + "material/volume-plus", + "material/volume-source", + "material/volume-variant-off", + "material/volume-vibrate", + "material/vote-outline", + "material/vote", + "material/vpn", + "material/vuejs", + "material/vuetify", + "material/walk", + "material/wall-fire", + "material/wall-sconce-flat-outline", + "material/wall-sconce-flat-variant-outline", + "material/wall-sconce-flat-variant", + "material/wall-sconce-flat", + "material/wall-sconce-outline", + "material/wall-sconce-round-outline", + "material/wall-sconce-round-variant-outline", + "material/wall-sconce-round-variant", + "material/wall-sconce-round", + "material/wall-sconce", + "material/wall", + "material/wallet-bifold-outline", + "material/wallet-bifold", + "material/wallet-giftcard", + "material/wallet-membership", + "material/wallet-outline", + "material/wallet-plus-outline", + "material/wallet-plus", + "material/wallet-travel", + "material/wallet", + "material/wallpaper", + "material/wan", + "material/wardrobe-outline", + "material/wardrobe", + "material/warehouse", + "material/washing-machine-alert", + "material/washing-machine-off", + "material/washing-machine", + "material/watch-export-variant", + "material/watch-export", + "material/watch-import-variant", + "material/watch-import", + "material/watch-variant", + "material/watch-vibrate-off", + "material/watch-vibrate", + "material/watch", + "material/water-alert-outline", + "material/water-alert", + "material/water-boiler-alert", + "material/water-boiler-auto", + "material/water-boiler-off", + "material/water-boiler", + "material/water-check-outline", + "material/water-check", + "material/water-circle", + "material/water-minus-outline", + "material/water-minus", + "material/water-off-outline", + "material/water-off", + "material/water-opacity", + "material/water-outline", + "material/water-percent-alert", + "material/water-percent", + "material/water-plus-outline", + "material/water-plus", + "material/water-polo", + "material/water-pump-off", + "material/water-pump", + "material/water-remove-outline", + "material/water-remove", + "material/water-sync", + "material/water-thermometer-outline", + "material/water-thermometer", + "material/water-well-outline", + "material/water-well", + "material/water", + "material/waterfall", + "material/watering-can-outline", + "material/watering-can", + "material/watermark", + "material/wave-arrow-down", + "material/wave-arrow-up", + "material/wave-undercurrent", + "material/wave", + "material/waveform", + "material/waves-arrow-left", + "material/waves-arrow-right", + "material/waves-arrow-up", + "material/waves", + "material/waze", + "material/weather-cloudy-alert", + "material/weather-cloudy-arrow-right", + "material/weather-cloudy-clock", + "material/weather-cloudy", + "material/weather-dust", + "material/weather-fog", + "material/weather-hail", + "material/weather-hazy", + "material/weather-hurricane-outline", + "material/weather-hurricane", + "material/weather-lightning-rainy", + "material/weather-lightning", + "material/weather-night-partly-cloudy", + "material/weather-night", + "material/weather-partly-cloudy", + "material/weather-partly-lightning", + "material/weather-partly-rainy", + "material/weather-partly-snowy-rainy", + "material/weather-partly-snowy", + "material/weather-pouring", + "material/weather-rainy", + "material/weather-snowy-heavy", + "material/weather-snowy-rainy", + "material/weather-snowy", + "material/weather-sunny-alert", + "material/weather-sunny-off", + "material/weather-sunny", + "material/weather-sunset-down", + "material/weather-sunset-up", + "material/weather-sunset", + "material/weather-tornado", + "material/weather-windy-variant", + "material/weather-windy", + "material/web-box", + "material/web-cancel", + "material/web-check", + "material/web-clock", + "material/web-minus", + "material/web-off", + "material/web-plus", + "material/web-refresh", + "material/web-remove", + "material/web-sync", + "material/web", + "material/webcam-off", + "material/webcam", + "material/webhook", + "material/webpack", + "material/webrtc", + "material/wechat", + "material/weight-gram", + "material/weight-kilogram", + "material/weight-lifter", + "material/weight-pound", + "material/weight", + "material/whatsapp", + "material/wheel-barrow", + "material/wheelchair-accessibility", + "material/wheelchair", + "material/whistle-outline", + "material/whistle", + "material/white-balance-auto", + "material/white-balance-incandescent", + "material/white-balance-iridescent", + "material/white-balance-sunny", + "material/widgets-outline", + "material/widgets", + "material/wifi-alert", + "material/wifi-arrow-down", + "material/wifi-arrow-left-right", + "material/wifi-arrow-left", + "material/wifi-arrow-right", + "material/wifi-arrow-up-down", + "material/wifi-arrow-up", + "material/wifi-cancel", + "material/wifi-check", + "material/wifi-cog", + "material/wifi-lock-open", + "material/wifi-lock", + "material/wifi-marker", + "material/wifi-minus", + "material/wifi-off", + "material/wifi-plus", + "material/wifi-refresh", + "material/wifi-remove", + "material/wifi-settings", + "material/wifi-star", + "material/wifi-strength-1-alert", + "material/wifi-strength-1-lock-open", + "material/wifi-strength-1-lock", + "material/wifi-strength-1", + "material/wifi-strength-2-alert", + "material/wifi-strength-2-lock-open", + "material/wifi-strength-2-lock", + "material/wifi-strength-2", + "material/wifi-strength-3-alert", + "material/wifi-strength-3-lock-open", + "material/wifi-strength-3-lock", + "material/wifi-strength-3", + "material/wifi-strength-4-alert", + "material/wifi-strength-4-lock-open", + "material/wifi-strength-4-lock", + "material/wifi-strength-4", + "material/wifi-strength-alert-outline", + "material/wifi-strength-lock-open-outline", + "material/wifi-strength-lock-outline", + "material/wifi-strength-off-outline", + "material/wifi-strength-off", + "material/wifi-strength-outline", + "material/wifi-sync", + "material/wifi", + "material/wikipedia", + "material/wind-power-outline", + "material/wind-power", + "material/wind-turbine-alert", + "material/wind-turbine-check", + "material/wind-turbine", + "material/window-close", + "material/window-closed-variant", + "material/window-closed", + "material/window-maximize", + "material/window-minimize", + "material/window-open-variant", + "material/window-open", + "material/window-restore", + "material/window-shutter-alert", + "material/window-shutter-auto", + "material/window-shutter-cog", + "material/window-shutter-open", + "material/window-shutter-settings", + "material/window-shutter", + "material/windsock", + "material/wiper-wash-alert", + "material/wiper-wash", + "material/wiper", + "material/wizard-hat", + "material/wordpress", + "material/wrap-disabled", + "material/wrap", + "material/wrench-check-outline", + "material/wrench-check", + "material/wrench-clock-outline", + "material/wrench-clock", + "material/wrench-cog-outline", + "material/wrench-cog", + "material/wrench-outline", + "material/wrench", + "material/xamarin", + "material/xml", + "material/xmpp", + "material/yahoo", + "material/yeast", + "material/yin-yang", + "material/yoga", + "material/youtube-gaming", + "material/youtube-studio", + "material/youtube-subscription", + "material/youtube-tv", + "material/youtube", + "material/yurt", + "material/z-wave", + "material/zend", + "material/zigbee", + "material/zip-box-outline", + "material/zip-box", + "material/zip-disk", + "material/zodiac-aquarius", + "material/zodiac-aries", + "material/zodiac-cancer", + "material/zodiac-capricorn", + "material/zodiac-gemini", + "material/zodiac-leo", + "material/zodiac-libra", + "material/zodiac-pisces", + "material/zodiac-sagittarius", + "material/zodiac-scorpio", + "material/zodiac-taurus", + "material/zodiac-virgo", + "octicons/accessibility-16", + "octicons/accessibility-inset-16", + "octicons/alert-16", + "octicons/alert-24", + "octicons/alert-fill-12", + "octicons/alert-fill-16", + "octicons/alert-fill-24", + "octicons/apps-16", + "octicons/archive-16", + "octicons/archive-24", + "octicons/arrow-both-16", + "octicons/arrow-both-24", + "octicons/arrow-down-16", + "octicons/arrow-down-24", + "octicons/arrow-down-left-16", + "octicons/arrow-down-left-24", + "octicons/arrow-down-right-16", + "octicons/arrow-down-right-24", + "octicons/arrow-left-16", + "octicons/arrow-left-24", + "octicons/arrow-right-16", + "octicons/arrow-right-24", + "octicons/arrow-switch-16", + "octicons/arrow-switch-24", + "octicons/arrow-up-16", + "octicons/arrow-up-24", + "octicons/arrow-up-left-16", + "octicons/arrow-up-left-24", + "octicons/arrow-up-right-16", + "octicons/arrow-up-right-24", + "octicons/beaker-16", + "octicons/beaker-24", + "octicons/bell-16", + "octicons/bell-24", + "octicons/bell-fill-16", + "octicons/bell-fill-24", + "octicons/bell-slash-16", + "octicons/bell-slash-24", + "octicons/blocked-16", + "octicons/blocked-24", + "octicons/bold-16", + "octicons/bold-24", + "octicons/book-16", + "octicons/book-24", + "octicons/bookmark-16", + "octicons/bookmark-24", + "octicons/bookmark-fill-24", + "octicons/bookmark-slash-16", + "octicons/bookmark-slash-24", + "octicons/bookmark-slash-fill-24", + "octicons/briefcase-16", + "octicons/briefcase-24", + "octicons/broadcast-16", + "octicons/broadcast-24", + "octicons/browser-16", + "octicons/browser-24", + "octicons/bug-16", + "octicons/bug-24", + "octicons/cache-16", + "octicons/calendar-16", + "octicons/calendar-24", + "octicons/check-16", + "octicons/check-24", + "octicons/check-circle-16", + "octicons/check-circle-24", + "octicons/check-circle-fill-12", + "octicons/check-circle-fill-16", + "octicons/check-circle-fill-24", + "octicons/checkbox-16", + "octicons/checkbox-24", + "octicons/checklist-16", + "octicons/checklist-24", + "octicons/chevron-down-12", + "octicons/chevron-down-16", + "octicons/chevron-down-24", + "octicons/chevron-left-16", + "octicons/chevron-left-24", + "octicons/chevron-right-12", + "octicons/chevron-right-16", + "octicons/chevron-right-24", + "octicons/chevron-up-12", + "octicons/chevron-up-16", + "octicons/chevron-up-24", + "octicons/circle-16", + "octicons/circle-24", + "octicons/circle-slash-16", + "octicons/circle-slash-24", + "octicons/clock-16", + "octicons/clock-24", + "octicons/clock-fill-16", + "octicons/clock-fill-24", + "octicons/cloud-16", + "octicons/cloud-24", + "octicons/cloud-offline-16", + "octicons/cloud-offline-24", + "octicons/code-16", + "octicons/code-24", + "octicons/code-of-conduct-16", + "octicons/code-of-conduct-24", + "octicons/code-review-16", + "octicons/code-review-24", + "octicons/code-square-16", + "octicons/code-square-24", + "octicons/codescan-16", + "octicons/codescan-24", + "octicons/codescan-checkmark-16", + "octicons/codescan-checkmark-24", + "octicons/codespaces-16", + "octicons/codespaces-24", + "octicons/columns-16", + "octicons/columns-24", + "octicons/command-palette-16", + "octicons/command-palette-24", + "octicons/comment-16", + "octicons/comment-24", + "octicons/comment-discussion-16", + "octicons/comment-discussion-24", + "octicons/commit-24", + "octicons/container-16", + "octicons/container-24", + "octicons/copilot-16", + "octicons/copilot-24", + "octicons/copilot-48", + "octicons/copilot-96", + "octicons/copilot-error-16", + "octicons/copilot-warning-16", + "octicons/copy-16", + "octicons/copy-24", + "octicons/cpu-16", + "octicons/cpu-24", + "octicons/credit-card-16", + "octicons/credit-card-24", + "octicons/cross-reference-16", + "octicons/cross-reference-24", + "octicons/dash-16", + "octicons/dash-24", + "octicons/database-16", + "octicons/database-24", + "octicons/dependabot-16", + "octicons/dependabot-24", + "octicons/desktop-download-16", + "octicons/desktop-download-24", + "octicons/device-camera-16", + "octicons/device-camera-video-16", + "octicons/device-camera-video-24", + "octicons/device-desktop-16", + "octicons/device-desktop-24", + "octicons/device-mobile-16", + "octicons/device-mobile-24", + "octicons/devices-16", + "octicons/devices-24", + "octicons/diamond-16", + "octicons/diamond-24", + "octicons/diff-16", + "octicons/diff-24", + "octicons/diff-added-16", + "octicons/diff-ignored-16", + "octicons/diff-modified-16", + "octicons/diff-removed-16", + "octicons/diff-renamed-16", + "octicons/discussion-closed-16", + "octicons/discussion-closed-24", + "octicons/discussion-duplicate-16", + "octicons/discussion-duplicate-24", + "octicons/discussion-outdated-16", + "octicons/discussion-outdated-24", + "octicons/dot-16", + "octicons/dot-24", + "octicons/dot-fill-16", + "octicons/dot-fill-24", + "octicons/download-16", + "octicons/download-24", + "octicons/duplicate-16", + "octicons/duplicate-24", + "octicons/ellipsis-16", + "octicons/eye-16", + "octicons/eye-24", + "octicons/eye-closed-16", + "octicons/eye-closed-24", + "octicons/feed-discussion-16", + "octicons/feed-forked-16", + "octicons/feed-heart-16", + "octicons/feed-issue-closed-16", + "octicons/feed-issue-draft-16", + "octicons/feed-issue-open-16", + "octicons/feed-issue-reopen-16", + "octicons/feed-merged-16", + "octicons/feed-person-16", + "octicons/feed-plus-16", + "octicons/feed-public-16", + "octicons/feed-pull-request-closed-16", + "octicons/feed-pull-request-draft-16", + "octicons/feed-pull-request-open-16", + "octicons/feed-repo-16", + "octicons/feed-rocket-16", + "octicons/feed-star-16", + "octicons/feed-tag-16", + "octicons/feed-trophy-16", + "octicons/file-16", + "octicons/file-24", + "octicons/file-added-16", + "octicons/file-badge-16", + "octicons/file-binary-16", + "octicons/file-binary-24", + "octicons/file-code-16", + "octicons/file-code-24", + "octicons/file-diff-16", + "octicons/file-diff-24", + "octicons/file-directory-16", + "octicons/file-directory-24", + "octicons/file-directory-fill-16", + "octicons/file-directory-fill-24", + "octicons/file-directory-open-fill-16", + "octicons/file-directory-symlink-16", + "octicons/file-directory-symlink-24", + "octicons/file-media-24", + "octicons/file-moved-16", + "octicons/file-removed-16", + "octicons/file-submodule-16", + "octicons/file-submodule-24", + "octicons/file-symlink-file-16", + "octicons/file-symlink-file-24", + "octicons/file-zip-16", + "octicons/file-zip-24", + "octicons/filter-16", + "octicons/filter-24", + "octicons/filter-remove-16", + "octicons/filter-remove-24", + "octicons/fiscal-host-16", + "octicons/flame-16", + "octicons/flame-24", + "octicons/fold-16", + "octicons/fold-24", + "octicons/fold-down-16", + "octicons/fold-down-24", + "octicons/fold-up-16", + "octicons/fold-up-24", + "octicons/gear-16", + "octicons/gear-24", + "octicons/gift-16", + "octicons/gift-24", + "octicons/git-branch-16", + "octicons/git-branch-24", + "octicons/git-commit-16", + "octicons/git-commit-24", + "octicons/git-compare-16", + "octicons/git-compare-24", + "octicons/git-merge-16", + "octicons/git-merge-24", + "octicons/git-merge-queue-16", + "octicons/git-merge-queue-24", + "octicons/git-pull-request-16", + "octicons/git-pull-request-24", + "octicons/git-pull-request-closed-16", + "octicons/git-pull-request-closed-24", + "octicons/git-pull-request-draft-16", + "octicons/git-pull-request-draft-24", + "octicons/globe-16", + "octicons/globe-24", + "octicons/goal-16", + "octicons/goal-24", + "octicons/grabber-16", + "octicons/grabber-24", + "octicons/graph-16", + "octicons/graph-24", + "octicons/hash-16", + "octicons/hash-24", + "octicons/heading-16", + "octicons/heading-24", + "octicons/heart-16", + "octicons/heart-24", + "octicons/heart-fill-16", + "octicons/heart-fill-24", + "octicons/history-16", + "octicons/history-24", + "octicons/home-16", + "octicons/home-24", + "octicons/home-fill-24", + "octicons/horizontal-rule-16", + "octicons/horizontal-rule-24", + "octicons/hourglass-16", + "octicons/hourglass-24", + "octicons/hubot-16", + "octicons/hubot-24", + "octicons/id-badge-16", + "octicons/image-16", + "octicons/image-24", + "octicons/inbox-16", + "octicons/inbox-24", + "octicons/infinity-16", + "octicons/infinity-24", + "octicons/info-16", + "octicons/info-24", + "octicons/issue-closed-16", + "octicons/issue-closed-24", + "octicons/issue-draft-16", + "octicons/issue-draft-24", + "octicons/issue-opened-16", + "octicons/issue-opened-24", + "octicons/issue-reopened-16", + "octicons/issue-reopened-24", + "octicons/issue-tracked-by-16", + "octicons/issue-tracked-by-24", + "octicons/issue-tracks-16", + "octicons/issue-tracks-24", + "octicons/italic-16", + "octicons/italic-24", + "octicons/iterations-16", + "octicons/iterations-24", + "octicons/kebab-horizontal-16", + "octicons/kebab-horizontal-24", + "octicons/key-16", + "octicons/key-24", + "octicons/key-asterisk-16", + "octicons/law-16", + "octicons/law-24", + "octicons/light-bulb-16", + "octicons/light-bulb-24", + "octicons/link-16", + "octicons/link-24", + "octicons/link-external-16", + "octicons/link-external-24", + "octicons/list-ordered-16", + "octicons/list-ordered-24", + "octicons/list-unordered-16", + "octicons/list-unordered-24", + "octicons/location-16", + "octicons/location-24", + "octicons/lock-16", + "octicons/lock-24", + "octicons/log-16", + "octicons/log-24", + "octicons/logo-gist-16", + "octicons/logo-github-16", + "octicons/mail-16", + "octicons/mail-24", + "octicons/mark-github-16", + "octicons/markdown-16", + "octicons/megaphone-16", + "octicons/megaphone-24", + "octicons/mention-16", + "octicons/mention-24", + "octicons/meter-16", + "octicons/milestone-16", + "octicons/milestone-24", + "octicons/mirror-16", + "octicons/mirror-24", + "octicons/moon-16", + "octicons/moon-24", + "octicons/mortar-board-16", + "octicons/mortar-board-24", + "octicons/move-to-bottom-16", + "octicons/move-to-bottom-24", + "octicons/move-to-end-16", + "octicons/move-to-end-24", + "octicons/move-to-start-16", + "octicons/move-to-start-24", + "octicons/move-to-top-16", + "octicons/move-to-top-24", + "octicons/multi-select-16", + "octicons/multi-select-24", + "octicons/mute-16", + "octicons/mute-24", + "octicons/no-entry-16", + "octicons/no-entry-24", + "octicons/no-entry-fill-12", + "octicons/north-star-16", + "octicons/north-star-24", + "octicons/note-16", + "octicons/note-24", + "octicons/number-16", + "octicons/number-24", + "octicons/organization-16", + "octicons/organization-24", + "octicons/package-16", + "octicons/package-24", + "octicons/package-dependencies-16", + "octicons/package-dependencies-24", + "octicons/package-dependents-16", + "octicons/package-dependents-24", + "octicons/paintbrush-16", + "octicons/paper-airplane-16", + "octicons/paper-airplane-24", + "octicons/paperclip-16", + "octicons/paperclip-24", + "octicons/passkey-fill-16", + "octicons/passkey-fill-24", + "octicons/paste-16", + "octicons/paste-24", + "octicons/pencil-16", + "octicons/pencil-24", + "octicons/people-16", + "octicons/people-24", + "octicons/person-16", + "octicons/person-24", + "octicons/person-add-16", + "octicons/person-add-24", + "octicons/person-fill-16", + "octicons/person-fill-24", + "octicons/pin-16", + "octicons/pin-24", + "octicons/pin-slash-16", + "octicons/pin-slash-24", + "octicons/pivot-column-16", + "octicons/pivot-column-24", + "octicons/play-16", + "octicons/play-24", + "octicons/plug-16", + "octicons/plug-24", + "octicons/plus-16", + "octicons/plus-24", + "octicons/plus-circle-16", + "octicons/plus-circle-24", + "octicons/project-16", + "octicons/project-24", + "octicons/project-roadmap-16", + "octicons/project-roadmap-24", + "octicons/project-symlink-16", + "octicons/project-symlink-24", + "octicons/project-template-16", + "octicons/project-template-24", + "octicons/pulse-16", + "octicons/pulse-24", + "octicons/question-16", + "octicons/question-24", + "octicons/quote-16", + "octicons/quote-24", + "octicons/read-16", + "octicons/read-24", + "octicons/redo-16", + "octicons/rel-file-path-16", + "octicons/rel-file-path-24", + "octicons/reply-16", + "octicons/reply-24", + "octicons/repo-16", + "octicons/repo-24", + "octicons/repo-clone-16", + "octicons/repo-clone-24", + "octicons/repo-deleted-16", + "octicons/repo-forked-16", + "octicons/repo-forked-24", + "octicons/repo-locked-16", + "octicons/repo-locked-24", + "octicons/repo-pull-16", + "octicons/repo-pull-24", + "octicons/repo-push-16", + "octicons/repo-push-24", + "octicons/repo-template-16", + "octicons/repo-template-24", + "octicons/report-16", + "octicons/report-24", + "octicons/rocket-16", + "octicons/rocket-24", + "octicons/rows-16", + "octicons/rows-24", + "octicons/rss-16", + "octicons/rss-24", + "octicons/ruby-16", + "octicons/ruby-24", + "octicons/screen-full-16", + "octicons/screen-full-24", + "octicons/screen-normal-16", + "octicons/screen-normal-24", + "octicons/search-16", + "octicons/search-24", + "octicons/server-16", + "octicons/server-24", + "octicons/share-16", + "octicons/share-24", + "octicons/share-android-16", + "octicons/share-android-24", + "octicons/shield-16", + "octicons/shield-24", + "octicons/shield-check-16", + "octicons/shield-check-24", + "octicons/shield-lock-16", + "octicons/shield-lock-24", + "octicons/shield-slash-16", + "octicons/shield-slash-24", + "octicons/shield-x-16", + "octicons/shield-x-24", + "octicons/sidebar-collapse-16", + "octicons/sidebar-collapse-24", + "octicons/sidebar-expand-16", + "octicons/sidebar-expand-24", + "octicons/sign-in-16", + "octicons/sign-in-24", + "octicons/sign-out-16", + "octicons/sign-out-24", + "octicons/single-select-16", + "octicons/single-select-24", + "octicons/skip-16", + "octicons/skip-24", + "octicons/skip-fill-16", + "octicons/skip-fill-24", + "octicons/sliders-16", + "octicons/smiley-16", + "octicons/smiley-24", + "octicons/sort-asc-16", + "octicons/sort-asc-24", + "octicons/sort-desc-16", + "octicons/sort-desc-24", + "octicons/sparkle-fill-16", + "octicons/sponsor-tiers-16", + "octicons/sponsor-tiers-24", + "octicons/square-16", + "octicons/square-24", + "octicons/square-fill-16", + "octicons/square-fill-24", + "octicons/squirrel-16", + "octicons/squirrel-24", + "octicons/stack-16", + "octicons/stack-24", + "octicons/star-16", + "octicons/star-24", + "octicons/star-fill-16", + "octicons/star-fill-24", + "octicons/stop-16", + "octicons/stop-24", + "octicons/stopwatch-16", + "octicons/stopwatch-24", + "octicons/strikethrough-16", + "octicons/strikethrough-24", + "octicons/sun-16", + "octicons/sun-24", + "octicons/sync-16", + "octicons/sync-24", + "octicons/tab-24", + "octicons/tab-external-16", + "octicons/table-16", + "octicons/table-24", + "octicons/tag-16", + "octicons/tag-24", + "octicons/tasklist-16", + "octicons/tasklist-24", + "octicons/telescope-16", + "octicons/telescope-24", + "octicons/telescope-fill-16", + "octicons/telescope-fill-24", + "octicons/terminal-16", + "octicons/terminal-24", + "octicons/three-bars-16", + "octicons/thumbsdown-16", + "octicons/thumbsdown-24", + "octicons/thumbsup-16", + "octicons/thumbsup-24", + "octicons/tools-16", + "octicons/tools-24", + "octicons/tracked-by-closed-completed-16", + "octicons/tracked-by-closed-completed-24", + "octicons/tracked-by-closed-not-planned-16", + "octicons/tracked-by-closed-not-planned-24", + "octicons/trash-16", + "octicons/trash-24", + "octicons/triangle-down-16", + "octicons/triangle-down-24", + "octicons/triangle-left-16", + "octicons/triangle-left-24", + "octicons/triangle-right-16", + "octicons/triangle-right-24", + "octicons/triangle-up-16", + "octicons/triangle-up-24", + "octicons/trophy-16", + "octicons/trophy-24", + "octicons/typography-16", + "octicons/typography-24", + "octicons/undo-16", + "octicons/unfold-16", + "octicons/unfold-24", + "octicons/unlink-16", + "octicons/unlink-24", + "octicons/unlock-16", + "octicons/unlock-24", + "octicons/unmute-16", + "octicons/unmute-24", + "octicons/unread-16", + "octicons/unread-24", + "octicons/unverified-16", + "octicons/unverified-24", + "octicons/upload-16", + "octicons/upload-24", + "octicons/verified-16", + "octicons/verified-24", + "octicons/versions-16", + "octicons/versions-24", + "octicons/video-16", + "octicons/video-24", + "octicons/webhook-16", + "octicons/workflow-16", + "octicons/workflow-24", + "octicons/x-12", + "octicons/x-16", + "octicons/x-24", + "octicons/x-circle-16", + "octicons/x-circle-24", + "octicons/x-circle-fill-12", + "octicons/x-circle-fill-16", + "octicons/x-circle-fill-24", + "octicons/zap-16", + "octicons/zap-24", + "octicons/zoom-in-16", + "octicons/zoom-in-24", + "octicons/zoom-out-16", + "octicons/zoom-out-24", + "simple/1001tracklists", + "simple/1password", + "simple/3m", + "simple/42", + "simple/4chan", + "simple/4d", + "simple/500px", + "simple/abbott", + "simple/abbrobotstudio", + "simple/abbvie", + "simple/aboutdotme", + "simple/abstract", + "simple/academia", + "simple/accenture", + "simple/accusoft", + "simple/acer", + "simple/acm", + "simple/actigraph", + "simple/activision", + "simple/activitypub", + "simple/acura", + "simple/adafruit", + "simple/adblock", + "simple/adblockplus", + "simple/adguard", + "simple/adidas", + "simple/adminer", + "simple/adobe", + "simple/adobeacrobatreader", + "simple/adobeaftereffects", + "simple/adobeaudition", + "simple/adobecreativecloud", + "simple/adobedreamweaver", + "simple/adobefonts", + "simple/adobeillustrator", + "simple/adobeindesign", + "simple/adobelightroom", + "simple/adobelightroomclassic", + "simple/adobephotoshop", + "simple/adobepremierepro", + "simple/adobexd", + "simple/adonisjs", + "simple/adp", + "simple/adroll", + "simple/adventofcode", + "simple/adyen", + "simple/aerlingus", + "simple/aeroflot", + "simple/aeromexico", + "simple/aerospike", + "simple/aew", + "simple/affine", + "simple/affinity", + "simple/affinitydesigner", + "simple/affinityphoto", + "simple/affinitypublisher", + "simple/aframe", + "simple/agora", + "simple/aib", + "simple/aidungeon", + "simple/aiohttp", + "simple/aiqfome", + "simple/airasia", + "simple/airbnb", + "simple/airbrakedotio", + "simple/airbus", + "simple/airbyte", + "simple/aircall", + "simple/aircanada", + "simple/airchina", + "simple/airfrance", + "simple/airindia", + "simple/airplayaudio", + "simple/airplayvideo", + "simple/airtable", + "simple/ajv", + "simple/akamai", + "simple/akaunting", + "simple/alacritty", + "simple/alamy", + "simple/albertheijn", + "simple/alby", + "simple/alchemy", + "simple/aldinord", + "simple/aldisud", + "simple/alfaromeo", + "simple/alfred", + "simple/algolia", + "simple/algorand", + "simple/alibabacloud", + "simple/alibabadotcom", + "simple/alienware", + "simple/aliexpress", + "simple/alipay", + "simple/allegro", + "simple/alliedmodders", + "simple/allocine", + "simple/alltrails", + "simple/almalinux", + "simple/alpinedotjs", + "simple/alpinelinux", + "simple/alteryx", + "simple/altiumdesigner", + "simple/alwaysdata", + "simple/amazon", + "simple/amazonalexa", + "simple/amazonapigateway", + "simple/amazonaws", + "simple/amazoncloudwatch", + "simple/amazondocumentdb", + "simple/amazondynamodb", + "simple/amazonec2", + "simple/amazonecs", + "simple/amazoneks", + "simple/amazonfiretv", + "simple/amazongames", + "simple/amazoniam", + "simple/amazonlumberyard", + "simple/amazonluna", + "simple/amazonpay", + "simple/amazonprime", + "simple/amazonrds", + "simple/amazonredshift", + "simple/amazonroute53", + "simple/amazons3", + "simple/amazonsimpleemailservice", + "simple/amazonsqs", + "simple/amd", + "simple/ameba", + "simple/americanairlines", + "simple/americanexpress", + "simple/amg", + "simple/amp", + "simple/amul", + "simple/ana", + "simple/anaconda", + "simple/analogue", + "simple/andela", + "simple/android", + "simple/androidauto", + "simple/androidstudio", + "simple/angular", + "simple/anilist", + "simple/ansible", + "simple/answer", + "simple/ansys", + "simple/anta", + "simple/antdesign", + "simple/antena3", + "simple/anydesk", + "simple/aol", + "simple/apache", + "simple/apacheairflow", + "simple/apacheant", + "simple/apachecassandra", + "simple/apachecloudstack", + "simple/apachecordova", + "simple/apachecouchdb", + "simple/apachedruid", + "simple/apacheecharts", + "simple/apacheflink", + "simple/apachegroovy", + "simple/apacheguacamole", + "simple/apachehadoop", + "simple/apachehive", + "simple/apachejmeter", + "simple/apachekafka", + "simple/apachekylin", + "simple/apachemaven", + "simple/apachenetbeanside", + "simple/apacheopenoffice", + "simple/apacheparquet", + "simple/apachepulsar", + "simple/apacherocketmq", + "simple/apachesolr", + "simple/apachespark", + "simple/apachestorm", + "simple/apachetomcat", + "simple/aparat", + "simple/apifox", + "simple/apollographql", + "simple/apostrophe", + "simple/appian", + "simple/apple", + "simple/applearcade", + "simple/applemusic", + "simple/applenews", + "simple/applepay", + "simple/applepodcasts", + "simple/appletv", + "simple/appsignal", + "simple/appsmith", + "simple/appstore", + "simple/appveyor", + "simple/appwrite", + "simple/aqua", + "simple/aral", + "simple/arangodb", + "simple/arc", + "simple/arcgis", + "simple/archicad", + "simple/archiveofourown", + "simple/archlinux", + "simple/ardour", + "simple/arduino", + "simple/argo", + "simple/argos", + "simple/ariakit", + "simple/arkecosystem", + "simple/arlo", + "simple/arm", + "simple/armkeil", + "simple/arstechnica", + "simple/artifacthub", + "simple/artixlinux", + "simple/artstation", + "simple/arxiv", + "simple/asana", + "simple/asciidoctor", + "simple/asciinema", + "simple/asda", + "simple/aseprite", + "simple/askfm", + "simple/assemblyscript", + "simple/astonmartin", + "simple/astro", + "simple/asus", + "simple/atandt", + "simple/atari", + "simple/atlassian", + "simple/auchan", + "simple/audacity", + "simple/audi", + "simple/audible", + "simple/audioboom", + "simple/audiomack", + "simple/audiotechnica", + "simple/aurelia", + "simple/auth0", + "simple/authelia", + "simple/authy", + "simple/autodesk", + "simple/autodeskrevit", + "simple/autohotkey", + "simple/automattic", + "simple/autoprefixer", + "simple/avajs", + "simple/avast", + "simple/avianca", + "simple/avira", + "simple/awesomelists", + "simple/awesomewm", + "simple/awsamplify", + "simple/awsfargate", + "simple/awslambda", + "simple/awsorganizations", + "simple/axios", + "simple/azureartifacts", + "simple/azuredataexplorer", + "simple/azuredevops", + "simple/azurefunctions", + "simple/azurepipelines", + "simple/babel", + "simple/babylondotjs", + "simple/backblaze", + "simple/backbonedotjs", + "simple/backendless", + "simple/backstage", + "simple/badoo", + "simple/baidu", + "simple/bamboo", + "simple/bandcamp", + "simple/bandlab", + "simple/bandrautomation", + "simple/bandsintown", + "simple/bankofamerica", + "simple/barclays", + "simple/baremetrics", + "simple/basecamp", + "simple/basicattentiontoken", + "simple/bastyon", + "simple/bata", + "simple/battledotnet", + "simple/beatport", + "simple/beats", + "simple/beatsbydre", + "simple/behance", + "simple/beijingsubway", + "simple/bem", + "simple/bentley", + "simple/bento", + "simple/bentoml", + "simple/bereal", + "simple/betfair", + "simple/bevy", + "simple/bigbasket", + "simple/bigbluebutton", + "simple/bigcartel", + "simple/bigcommerce", + "simple/bilibili", + "simple/billboard", + "simple/bim", + "simple/binance", + "simple/biolink", + "simple/bisecthosting", + "simple/bit", + "simple/bitbucket", + "simple/bitcoin", + "simple/bitcoincash", + "simple/bitcoinsv", + "simple/bitcomet", + "simple/bitdefender", + "simple/bitly", + "simple/bitrise", + "simple/bitwarden", + "simple/bitwig", + "simple/blackberry", + "simple/blackmagicdesign", + "simple/blazemeter", + "simple/blazor", + "simple/blender", + "simple/blockbench", + "simple/blockchaindotcom", + "simple/blogger", + "simple/bloglovin", + "simple/blueprint", + "simple/bluetooth", + "simple/bmcsoftware", + "simple/bmw", + "simple/bnbchain", + "simple/boardgamegeek", + "simple/boehringeringelheim", + "simple/boeing", + "simple/bombardier", + "simple/bookalope", + "simple/bookbub", + "simple/bookmeter", + "simple/bookmyshow", + "simple/bookstack", + "simple/boost", + "simple/boosty", + "simple/boots", + "simple/bootstrap", + "simple/borgbackup", + "simple/bosch", + "simple/bose", + "simple/botblecms", + "simple/boulanger", + "simple/bower", + "simple/box", + "simple/boxysvg", + "simple/brandfolder", + "simple/brave", + "simple/breaker", + "simple/brevo", + "simple/britishairways", + "simple/broadcom", + "simple/bsd", + "simple/bspwm", + "simple/bt", + "simple/buddy", + "simple/budibase", + "simple/buefy", + "simple/buffer", + "simple/bugatti", + "simple/bugcrowd", + "simple/bugsnag", + "simple/buildkite", + "simple/bukalapak", + "simple/bulma", + "simple/bun", + "simple/bunq", + "simple/burgerking", + "simple/burton", + "simple/buymeacoffee", + "simple/buzzfeed", + "simple/bvg", + "simple/byjus", + "simple/bytedance", + "simple/c", + "simple/cachet", + "simple/caddy", + "simple/cadillac", + "simple/cafepress", + "simple/caffeine", + "simple/cairographics", + "simple/cairometro", + "simple/cakephp", + "simple/campaignmonitor", + "simple/canonical", + "simple/canva", + "simple/canvas", + "simple/capacitor", + "simple/cardano", + "simple/carrd", + "simple/carrefour", + "simple/carthrottle", + "simple/carto", + "simple/cashapp", + "simple/castbox", + "simple/castorama", + "simple/castro", + "simple/caterpillar", + "simple/cbc", + "simple/cbs", + "simple/cdprojekt", + "simple/celery", + "simple/celestron", + "simple/centos", + "simple/ceph", + "simple/cesium", + "simple/chai", + "simple/chainguard", + "simple/chainlink", + "simple/chakraui", + "simple/channel4", + "simple/chartdotjs", + "simple/chartmogul", + "simple/chase", + "simple/chatbot", + "simple/chatwoot", + "simple/checkio", + "simple/checkmarx", + "simple/checkmk", + "simple/chedraui", + "simple/chef", + "simple/chemex", + "simple/chevrolet", + "simple/chianetwork", + "simple/chinaeasternairlines", + "simple/chinasouthernairlines", + "simple/chocolatey", + "simple/chromatic", + "simple/chromecast", + "simple/chrysler", + "simple/chupachups", + "simple/cilium", + "simple/cinema4d", + "simple/circle", + "simple/circleci", + "simple/circuitverse", + "simple/cirrusci", + "simple/cisco", + "simple/citrix", + "simple/citroen", + "simple/civicrm", + "simple/civo", + "simple/ckeditor4", + "simple/clarifai", + "simple/claris", + "simple/clarivate", + "simple/clerk", + "simple/clickhouse", + "simple/clickup", + "simple/clion", + "simple/cliqz", + "simple/clockify", + "simple/clojure", + "simple/cloud66", + "simple/cloudbees", + "simple/cloudcannon", + "simple/cloudera", + "simple/cloudflare", + "simple/cloudflarepages", + "simple/cloudfoundry", + "simple/cloudsmith", + "simple/cloudways", + "simple/clubhouse", + "simple/clyp", + "simple/cmake", + "simple/cncf", + "simple/cnn", + "simple/cocacola", + "simple/cockpit", + "simple/cockroachlabs", + "simple/cocoapods", + "simple/cocos", + "simple/coda", + "simple/codacy", + "simple/codeberg", + "simple/codecademy", + "simple/codeceptjs", + "simple/codechef", + "simple/codeclimate", + "simple/codecov", + "simple/codefactor", + "simple/codeforces", + "simple/codeigniter", + "simple/codeium", + "simple/codemagic", + "simple/codemirror", + "simple/codenewbie", + "simple/codepen", + "simple/codeproject", + "simple/codersrank", + "simple/coderwall", + "simple/codesandbox", + "simple/codeship", + "simple/codesignal", + "simple/codestream", + "simple/codewars", + "simple/codingame", + "simple/codingninjas", + "simple/codio", + "simple/coffeescript", + "simple/cognizant", + "simple/coil", + "simple/coinbase", + "simple/coinmarketcap", + "simple/commerzbank", + "simple/commitlint", + "simple/commodore", + "simple/commonworkflowlanguage", + "simple/compilerexplorer", + "simple/composer", + "simple/comptia", + "simple/comsol", + "simple/conan", + "simple/concourse", + "simple/condaforge", + "simple/conekta", + "simple/confluence", + "simple/construct3", + "simple/consul", + "simple/contactlesspayment", + "simple/containerd", + "simple/contao", + "simple/contentful", + "simple/conventionalcommits", + "simple/convertio", + "simple/cookiecutter", + "simple/coop", + "simple/cora", + "simple/coronaengine", + "simple/coronarenderer", + "simple/corsair", + "simple/couchbase", + "simple/counterstrike", + "simple/countingworkspro", + "simple/coursera", + "simple/coveralls", + "simple/cpanel", + "simple/cplusplus", + "simple/cplusplusbuilder", + "simple/craftcms", + "simple/craftsman", + "simple/cratedb", + "simple/crayon", + "simple/creality", + "simple/createreactapp", + "simple/creativecommons", + "simple/creativetechnology", + "simple/credly", + "simple/crehana", + "simple/crewunited", + "simple/criticalrole", + "simple/crowdin", + "simple/crowdsource", + "simple/crunchbase", + "simple/crunchyroll", + "simple/cryengine", + "simple/crystal", + "simple/csharp", + "simple/css3", + "simple/cssmodules", + "simple/csswizardry", + "simple/cts", + "simple/cucumber", + "simple/cultura", + "simple/curl", + "simple/curseforge", + "simple/customink", + "simple/cyberdefenders", + "simple/cycling74", + "simple/cypress", + "simple/cytoscapedotjs", + "simple/d", + "simple/d3dotjs", + "simple/dacia", + "simple/daf", + "simple/dailymotion", + "simple/daimler", + "simple/daisyui", + "simple/dapr", + "simple/darkreader", + "simple/dart", + "simple/darty", + "simple/daserste", + "simple/dash", + "simple/dashlane", + "simple/dask", + "simple/dassaultsystemes", + "simple/databricks", + "simple/datacamp", + "simple/datadog", + "simple/datadotai", + "simple/datagrip", + "simple/dataiku", + "simple/datastax", + "simple/dataverse", + "simple/datocms", + "simple/datto", + "simple/dazn", + "simple/dblp", + "simple/dbt", + "simple/dcentertainment", + "simple/debian", + "simple/decapcms", + "simple/dedge", + "simple/deepin", + "simple/deepnote", + "simple/delicious", + "simple/deliveroo", + "simple/dell", + "simple/delonghi", + "simple/delphi", + "simple/delta", + "simple/deluge", + "simple/deno", + "simple/denon", + "simple/dependabot", + "simple/dependencycheck", + "simple/depositphotos", + "simple/derspiegel", + "simple/designernews", + "simple/deutschebahn", + "simple/deutschebank", + "simple/devdotto", + "simple/devexpress", + "simple/deviantart", + "simple/devpost", + "simple/devrant", + "simple/dgraph", + "simple/dhl", + "simple/diagramsdotnet", + "simple/dialogflow", + "simple/diaspora", + "simple/digg", + "simple/digikeyelectronics", + "simple/digitalocean", + "simple/dinersclub", + "simple/dior", + "simple/directus", + "simple/discogs", + "simple/discord", + "simple/discourse", + "simple/discover", + "simple/disqus", + "simple/disroot", + "simple/distrokid", + "simple/django", + "simple/dji", + "simple/dlib", + "simple/dlna", + "simple/dm", + "simple/docker", + "simple/docsdotrs", + "simple/docsify", + "simple/docusaurus", + "simple/docusign", + "simple/dogecoin", + "simple/doi", + "simple/dolby", + "simple/doordash", + "simple/dotenv", + "simple/dotnet", + "simple/douban", + "simple/doubanread", + "simple/dovecot", + "simple/dpd", + "simple/dragonframe", + "simple/draugiemdotlv", + "simple/dreamstime", + "simple/dribbble", + "simple/drizzle", + "simple/drone", + "simple/drooble", + "simple/dropbox", + "simple/drupal", + "simple/dsautomobiles", + "simple/dts", + "simple/dtube", + "simple/ducati", + "simple/duckdb", + "simple/duckduckgo", + "simple/dungeonsanddragons", + "simple/dunked", + "simple/duolingo", + "simple/dvc", + "simple/dwavesystems", + "simple/dwm", + "simple/dynamics365", + "simple/dynatrace", + "simple/e", + "simple/e3", + "simple/ea", + "simple/eagle", + "simple/easyeda", + "simple/easyjet", + "simple/ebay", + "simple/ebox", + "simple/eclipseadoptium", + "simple/eclipseche", + "simple/eclipseide", + "simple/eclipsejetty", + "simple/eclipsemosquitto", + "simple/eclipsevertdotx", + "simple/edeka", + "simple/editorconfig", + "simple/edotleclerc", + "simple/edx", + "simple/egghead", + "simple/egnyte", + "simple/eightsleep", + "simple/elastic", + "simple/elasticcloud", + "simple/elasticsearch", + "simple/elasticstack", + "simple/elavon", + "simple/electron", + "simple/electronbuilder", + "simple/electronfiddle", + "simple/element", + "simple/elementary", + "simple/elementor", + "simple/eleventy", + "simple/elgato", + "simple/elixir", + "simple/eljueves", + "simple/ello", + "simple/elm", + "simple/elsevier", + "simple/embarcadero", + "simple/emberdotjs", + "simple/emby", + "simple/emirates", + "simple/emlakjet", + "simple/empirekred", + "simple/engadget", + "simple/enpass", + "simple/enterprisedb", + "simple/envato", + "simple/envoyproxy", + "simple/epel", + "simple/epicgames", + "simple/epson", + "simple/equinixmetal", + "simple/ericsson", + "simple/erlang", + "simple/esbuild", + "simple/esea", + "simple/eslgaming", + "simple/eslint", + "simple/esphome", + "simple/espressif", + "simple/esri", + "simple/etcd", + "simple/ethereum", + "simple/ethiopianairlines", + "simple/etihadairways", + "simple/etsy", + "simple/eventbrite", + "simple/eventstore", + "simple/evernote", + "simple/exercism", + "simple/exordo", + "simple/exoscale", + "simple/expedia", + "simple/expensify", + "simple/expertsexchange", + "simple/expo", + "simple/express", + "simple/expressvpn", + "simple/eyeem", + "simple/f1", + "simple/f5", + "simple/facebook", + "simple/facebookgaming", + "simple/facebooklive", + "simple/faceit", + "simple/facepunch", + "simple/fairphone", + "simple/falco", + "simple/falcon", + "simple/fampay", + "simple/fandango", + "simple/fandom", + "simple/fanfou", + "simple/fantom", + "simple/fareharbor", + "simple/farfetch", + "simple/fastapi", + "simple/fastify", + "simple/fastlane", + "simple/fastly", + "simple/fathom", + "simple/fauna", + "simple/favro", + "simple/fdroid", + "simple/feathub", + "simple/fedex", + "simple/fedora", + "simple/feedly", + "simple/ferrari", + "simple/ferrarinv", + "simple/ferretdb", + "simple/ffmpeg", + "simple/fi", + "simple/fiat", + "simple/fidoalliance", + "simple/fifa", + "simple/fig", + "simple/figma", + "simple/figshare", + "simple/fila", + "simple/files", + "simple/filezilla", + "simple/fineco", + "simple/fing", + "simple/firebase", + "simple/firefish", + "simple/fireflyiii", + "simple/firefox", + "simple/firefoxbrowser", + "simple/fireship", + "simple/firewalla", + "simple/first", + "simple/fitbit", + "simple/fite", + "simple/fivem", + "simple/fiverr", + "simple/flask", + "simple/flat", + "simple/flathub", + "simple/flatpak", + "simple/flattr", + "simple/flickr", + "simple/flightaware", + "simple/flipboard", + "simple/flipkart", + "simple/floatplane", + "simple/flood", + "simple/fluentbit", + "simple/fluentd", + "simple/fluke", + "simple/flutter", + "simple/flux", + "simple/fluxus", + "simple/flyway", + "simple/fmod", + "simple/fnac", + "simple/folium", + "simple/fonoma", + "simple/fontawesome", + "simple/fontbase", + "simple/fontforge", + "simple/foodpanda", + "simple/ford", + "simple/forgejo", + "simple/formstack", + "simple/fortinet", + "simple/fortran", + "simple/fossa", + "simple/fossilscm", + "simple/foursquare", + "simple/foursquarecityguide", + "simple/fox", + "simple/foxtel", + "simple/fozzy", + "simple/framer", + "simple/framework", + "simple/framework7", + "simple/franprix", + "simple/fraunhofergesellschaft", + "simple/freebsd", + "simple/freecodecamp", + "simple/freedesktopdotorg", + "simple/freelancer", + "simple/freenas", + "simple/freepik", + "simple/frontendmentor", + "simple/frontify", + "simple/fsecure", + "simple/fsharp", + "simple/fugacloud", + "simple/fujifilm", + "simple/fujitsu", + "simple/funimation", + "simple/furaffinity", + "simple/furrynetwork", + "simple/futurelearn", + "simple/g2", + "simple/g2a", + "simple/gameandwatch", + "simple/gamebanana", + "simple/gamedeveloper", + "simple/gamejolt", + "simple/gamemaker", + "simple/garmin", + "simple/gatling", + "simple/gatsby", + "simple/gdal", + "simple/geant", + "simple/geeksforgeeks", + "simple/generalelectric", + "simple/generalmotors", + "simple/genius", + "simple/gentoo", + "simple/geocaching", + "simple/gerrit", + "simple/ghost", + "simple/ghostery", + "simple/gimp", + "simple/giphy", + "simple/git", + "simple/gitbook", + "simple/gitea", + "simple/gitee", + "simple/gitextensions", + "simple/github", + "simple/githubactions", + "simple/githubpages", + "simple/githubsponsors", + "simple/gitignoredotio", + "simple/gitkraken", + "simple/gitlab", + "simple/gitlfs", + "simple/gitpod", + "simple/gitter", + "simple/glassdoor", + "simple/glitch", + "simple/globus", + "simple/gmail", + "simple/gnome", + "simple/gnometerminal", + "simple/gnu", + "simple/gnubash", + "simple/gnuemacs", + "simple/gnuicecat", + "simple/gnuprivacyguard", + "simple/gnusocial", + "simple/go", + "simple/gocd", + "simple/godaddy", + "simple/godotengine", + "simple/gofundme", + "simple/gogdotcom", + "simple/goland", + "simple/goldenline", + "simple/goodreads", + "simple/google", + "simple/googleadmob", + "simple/googleads", + "simple/googleadsense", + "simple/googleanalytics", + "simple/googleappsscript", + "simple/googleassistant", + "simple/googlebard", + "simple/googlebigquery", + "simple/googlecalendar", + "simple/googlecardboard", + "simple/googlechat", + "simple/googlechrome", + "simple/googleclassroom", + "simple/googlecloud", + "simple/googlecloudcomposer", + "simple/googlecloudspanner", + "simple/googlecolab", + "simple/googlecontaineroptimizedos", + "simple/googledataflow", + "simple/googledataproc", + "simple/googledatastudio", + "simple/googledocs", + "simple/googledomains", + "simple/googledrive", + "simple/googleearth", + "simple/googleearthengine", + "simple/googlefit", + "simple/googlefonts", + "simple/googleforms", + "simple/googlehangouts", + "simple/googlehome", + "simple/googlekeep", + "simple/googlelens", + "simple/googlemaps", + "simple/googlemarketingplatform", + "simple/googlemeet", + "simple/googlemessages", + "simple/googlemybusiness", + "simple/googlenearby", + "simple/googlenews", + "simple/googleoptimize", + "simple/googlepay", + "simple/googlephotos", + "simple/googleplay", + "simple/googlepodcasts", + "simple/googlepubsub", + "simple/googlescholar", + "simple/googlesearchconsole", + "simple/googlesheets", + "simple/googleslides", + "simple/googlestreetview", + "simple/googletagmanager", + "simple/googletasks", + "simple/googletranslate", + "simple/gotomeeting", + "simple/grab", + "simple/gradle", + "simple/gradleplaypublisher", + "simple/grafana", + "simple/grammarly", + "simple/grandfrais", + "simple/graphql", + "simple/grav", + "simple/gravatar", + "simple/graylog", + "simple/greenhouse", + "simple/greensock", + "simple/griddotai", + "simple/gridsome", + "simple/groupme", + "simple/groupon", + "simple/grubhub", + "simple/grunt", + "simple/gsk", + "simple/gsmarenadotcom", + "simple/gstreamer", + "simple/gtk", + "simple/guangzhoumetro", + "simple/guilded", + "simple/gulp", + "simple/gumroad", + "simple/gumtree", + "simple/gunicorn", + "simple/gurobi", + "simple/gutenberg", + "simple/h3", + "simple/habr", + "simple/hackaday", + "simple/hackclub", + "simple/hackerearth", + "simple/hackernoon", + "simple/hackerone", + "simple/hackerrank", + "simple/hackster", + "simple/hackthebox", + "simple/hal", + "simple/handlebarsdotjs", + "simple/handm", + "simple/handshake", + "simple/handshake_protocol", + "simple/happycow", + "simple/harbor", + "simple/harmonyos", + "simple/hashicorp", + "simple/hashnode", + "simple/haskell", + "simple/hasura", + "simple/hatenabookmark", + "simple/haveibeenpwned", + "simple/haxe", + "simple/hbo", + "simple/hcl", + "simple/headlessui", + "simple/headphonezone", + "simple/headspace", + "simple/hearth", + "simple/hearthisdotat", + "simple/hedera", + "simple/hellofresh", + "simple/hellyhansen", + "simple/helm", + "simple/helpdesk", + "simple/helpscout", + "simple/here", + "simple/heroku", + "simple/hetzner", + "simple/hexlet", + "simple/hexo", + "simple/hey", + "simple/hibernate", + "simple/hibob", + "simple/hilton", + "simple/hiltonhotelsandresorts", + "simple/hitachi", + "simple/hive", + "simple/hive_blockchain", + "simple/homeadvisor", + "simple/homeassistant", + "simple/homeassistantcommunitystore", + "simple/homebrew", + "simple/homebridge", + "simple/homify", + "simple/honda", + "simple/honey", + "simple/honor", + "simple/hootsuite", + "simple/hoppscotch", + "simple/hotelsdotcom", + "simple/hotjar", + "simple/hotwire", + "simple/houdini", + "simple/houzz", + "simple/hp", + "simple/hsbc", + "simple/html5", + "simple/htmlacademy", + "simple/htop", + "simple/httpie", + "simple/huawei", + "simple/hubspot", + "simple/hugo", + "simple/hulu", + "simple/humblebundle", + "simple/hungryjacks", + "simple/husqvarna", + "simple/hyper", + "simple/hypothesis", + "simple/hyundai", + "simple/i18next", + "simple/i3", + "simple/iata", + "simple/ibeacon", + "simple/ibm", + "simple/ibmcloud", + "simple/ibmwatson", + "simple/iced", + "simple/iceland", + "simple/icinga", + "simple/icloud", + "simple/icomoon", + "simple/icon", + "simple/iconfinder", + "simple/iconify", + "simple/iconjar", + "simple/icons8", + "simple/icq", + "simple/ieee", + "simple/ifixit", + "simple/ifood", + "simple/ifttt", + "simple/igdb", + "simple/iheartradio", + "simple/ikea", + "simple/iledefrancemobilites", + "simple/imagej", + "simple/imdb", + "simple/imgur", + "simple/immer", + "simple/immich", + "simple/imou", + "simple/improvmx", + "simple/indeed", + "simple/indigo", + "simple/inertia", + "simple/infiniti", + "simple/influxdb", + "simple/infoq", + "simple/informatica", + "simple/infosys", + "simple/infracost", + "simple/ingress", + "simple/inkdrop", + "simple/inkscape", + "simple/insomnia", + "simple/insta360", + "simple/instacart", + "simple/instagram", + "simple/instapaper", + "simple/instatus", + "simple/instructables", + "simple/instructure", + "simple/integromat", + "simple/intel", + "simple/intellijidea", + "simple/interactiondesignfoundation", + "simple/interactjs", + "simple/interbase", + "simple/intercom", + "simple/intermarche", + "simple/internetarchive", + "simple/internetcomputer", + "simple/internetexplorer", + "simple/intigriti", + "simple/intuit", + "simple/invision", + "simple/invoiceninja", + "simple/iobroker", + "simple/ionic", + "simple/ionos", + "simple/ios", + "simple/iota", + "simple/ipfs", + "simple/iris", + "simple/isc2", + "simple/issuu", + "simple/istio", + "simple/itchdotio", + "simple/iterm2", + "simple/itunes", + "simple/itvx", + "simple/iveco", + "simple/jabber", + "simple/jaeger", + "simple/jaguar", + "simple/jamboard", + "simple/jameson", + "simple/jamstack", + "simple/jasmine", + "simple/javascript", + "simple/jbl", + "simple/jcb", + "simple/jeep", + "simple/jekyll", + "simple/jellyfin", + "simple/jenkins", + "simple/jest", + "simple/jet", + "simple/jetblue", + "simple/jetbrains", + "simple/jetpackcompose", + "simple/jfrog", + "simple/jfrogpipelines", + "simple/jinja", + "simple/jira", + "simple/jirasoftware", + "simple/jitpack", + "simple/jitsi", + "simple/johndeere", + "simple/joomla", + "simple/joplin", + "simple/jordan", + "simple/jovian", + "simple/jpeg", + "simple/jquery", + "simple/jrgroup", + "simple/jsdelivr", + "simple/jsfiddle", + "simple/json", + "simple/jsonwebtokens", + "simple/jss", + "simple/juce", + "simple/juejin", + "simple/juke", + "simple/julia", + "simple/junipernetworks", + "simple/junit5", + "simple/jupyter", + "simple/justeat", + "simple/justgiving", + "simple/k3s", + "simple/k6", + "simple/kaggle", + "simple/kahoot", + "simple/kaios", + "simple/kakao", + "simple/kakaotalk", + "simple/kalilinux", + "simple/kamailio", + "simple/kaniko", + "simple/karlsruherverkehrsverbund", + "simple/kasasmart", + "simple/kashflow", + "simple/kaspersky", + "simple/katacoda", + "simple/katana", + "simple/kaufland", + "simple/kde", + "simple/kdenlive", + "simple/kedro", + "simple/keepachangelog", + "simple/keepassxc", + "simple/kentico", + "simple/keras", + "simple/keybase", + "simple/keycdn", + "simple/keystone", + "simple/kfc", + "simple/khanacademy", + "simple/khronosgroup", + "simple/kia", + "simple/kibana", + "simple/kicad", + "simple/kick", + "simple/kickstarter", + "simple/kik", + "simple/kingstontechnology", + "simple/kinopoisk", + "simple/kinsta", + "simple/kirby", + "simple/kit", + "simple/kitsu", + "simple/klarna", + "simple/klm", + "simple/klook", + "simple/knative", + "simple/knowledgebase", + "simple/known", + "simple/koa", + "simple/koc", + "simple/kodak", + "simple/kodi", + "simple/kofax", + "simple/kofi", + "simple/komoot", + "simple/konami", + "simple/kong", + "simple/kongregate", + "simple/konva", + "simple/kotlin", + "simple/koyeb", + "simple/krita", + "simple/ktm", + "simple/kuaishou", + "simple/kubernetes", + "simple/kubuntu", + "simple/kuma", + "simple/kuula", + "simple/kyocera", + "simple/labview", + "simple/lada", + "simple/lamborghini", + "simple/landrover", + "simple/lapce", + "simple/laragon", + "simple/laravel", + "simple/laravelhorizon", + "simple/laravelnova", + "simple/lastdotfm", + "simple/lastpass", + "simple/latex", + "simple/launchpad", + "simple/lazarus", + "simple/lbry", + "simple/leaderprice", + "simple/leaflet", + "simple/leagueoflegends", + "simple/leanpub", + "simple/leetcode", + "simple/legacygames", + "simple/leica", + "simple/lemmy", + "simple/lenovo", + "simple/lens", + "simple/leptos", + "simple/lequipe", + "simple/lerna", + "simple/leroymerlin", + "simple/less", + "simple/letsencrypt", + "simple/letterboxd", + "simple/levelsdotfyi", + "simple/lg", + "simple/liberadotchat", + "simple/liberapay", + "simple/librariesdotio", + "simple/librarything", + "simple/libreoffice", + "simple/libreofficebase", + "simple/libuv", + "simple/lichess", + "simple/lidl", + "simple/lifx", + "simple/lightburn", + "simple/lighthouse", + "simple/lightning", + "simple/line", + "simple/lineageos", + "simple/linear", + "simple/linkedin", + "simple/linkerd", + "simple/linkfire", + "simple/linktree", + "simple/linux", + "simple/linuxcontainers", + "simple/linuxfoundation", + "simple/linuxmint", + "simple/lionair", + "simple/liquibase", + "simple/lit", + "simple/litecoin", + "simple/litiengine", + "simple/livechat", + "simple/livejournal", + "simple/livewire", + "simple/llvm", + "simple/lmms", + "simple/local", + "simple/lodash", + "simple/logitech", + "simple/logmein", + "simple/logseq", + "simple/logstash", + "simple/looker", + "simple/loom", + "simple/loop", + "simple/loopback", + "simple/lootcrate", + "simple/lospec", + "simple/lotpolishairlines", + "simple/ltspice", + "simple/lua", + "simple/lubuntu", + "simple/ludwig", + "simple/lufthansa", + "simple/lumen", + "simple/lunacy", + "simple/lutris", + "simple/lydia", + "simple/lyft", + "simple/maas", + "simple/macos", + "simple/macpaw", + "simple/macys", + "simple/magasinsu", + "simple/magento", + "simple/magisk", + "simple/mahindra", + "simple/mailchimp", + "simple/maildotcom", + "simple/maildotru", + "simple/mailgun", + "simple/mailtrap", + "simple/majorleaguehacking", + "simple/makerbot", + "simple/mambaui", + "simple/mamp", + "simple/man", + "simple/manageiq", + "simple/manjaro", + "simple/mantine", + "simple/mapbox", + "simple/maplibre", + "simple/mariadb", + "simple/mariadbfoundation", + "simple/markdown", + "simple/marketo", + "simple/marko", + "simple/marriott", + "simple/marvelapp", + "simple/maserati", + "simple/mastercard", + "simple/mastercomfig", + "simple/mastodon", + "simple/materialdesign", + "simple/materialdesignicons", + "simple/materialformkdocs", + "simple/matillion", + "simple/matomo", + "simple/matrix", + "simple/matterdotjs", + "simple/mattermost", + "simple/matternet", + "simple/mautic", + "simple/max", + "simple/maxplanckgesellschaft", + "simple/maytag", + "simple/mazda", + "simple/mcafee", + "simple/mcdonalds", + "simple/mclaren", + "simple/mdbook", + "simple/mdnwebdocs", + "simple/mdx", + "simple/mediafire", + "simple/mediamarkt", + "simple/mediatek", + "simple/medibangpaint", + "simple/medium", + "simple/medusa", + "simple/meetup", + "simple/mega", + "simple/meilisearch", + "simple/mendeley", + "simple/mercadopago", + "simple/mercedes", + "simple/merck", + "simple/mercurial", + "simple/mermaid", + "simple/messenger", + "simple/meta", + "simple/metabase", + "simple/metafilter", + "simple/meteor", + "simple/metro", + "simple/metrodelaciudaddemexico", + "simple/metrodemadrid", + "simple/metrodeparis", + "simple/mewe", + "simple/mg", + "simple/microbit", + "simple/microdotblog", + "simple/microeditor", + "simple/microgenetics", + "simple/micropython", + "simple/microsoft", + "simple/microsoftacademic", + "simple/microsoftaccess", + "simple/microsoftazure", + "simple/microsoftbing", + "simple/microsoftedge", + "simple/microsoftexcel", + "simple/microsoftexchange", + "simple/microsoftonedrive", + "simple/microsoftonenote", + "simple/microsoftoutlook", + "simple/microsoftpowerpoint", + "simple/microsoftsharepoint", + "simple/microsoftsqlserver", + "simple/microsoftstore", + "simple/microsoftteams", + "simple/microsofttranslator", + "simple/microsoftvisio", + "simple/microsoftword", + "simple/microstation", + "simple/microstrategy", + "simple/midi", + "simple/mikrotik", + "simple/milvus", + "simple/minds", + "simple/minecraft", + "simple/minetest", + "simple/mini", + "simple/minio", + "simple/minutemailer", + "simple/miraheze", + "simple/miro", + "simple/misskey", + "simple/mitsubishi", + "simple/mix", + "simple/mixcloud", + "simple/mixpanel", + "simple/mlb", + "simple/mlflow", + "simple/mobx", + "simple/mobxstatetree", + "simple/mocha", + "simple/mockserviceworker", + "simple/modin", + "simple/modrinth", + "simple/modx", + "simple/mojangstudios", + "simple/moleculer", + "simple/momenteo", + "simple/monero", + "simple/moneygram", + "simple/mongodb", + "simple/mongoose", + "simple/mongoosedotws", + "simple/monica", + "simple/monkeytie", + "simple/monkeytype", + "simple/monogame", + "simple/monoprix", + "simple/monster", + "simple/monzo", + "simple/moo", + "simple/moonrepo", + "simple/morrisons", + "simple/moscowmetro", + "simple/motorola", + "simple/mozilla", + "simple/mpv", + "simple/mqtt", + "simple/msi", + "simple/msibusiness", + "simple/mta", + "simple/mtr", + "simple/mubi", + "simple/mui", + "simple/mulesoft", + "simple/muller", + "simple/multisim", + "simple/mumble", + "simple/mural", + "simple/musescore", + "simple/musicbrainz", + "simple/mxlinux", + "simple/myanimelist", + "simple/myob", + "simple/myspace", + "simple/mysql", + "simple/n26", + "simple/namebase", + "simple/namecheap", + "simple/nano", + "simple/nasa", + "simple/nationalgrid", + "simple/nativescript", + "simple/natsdotio", + "simple/naver", + "simple/nba", + "simple/nbb", + "simple/nbc", + "simple/ndr", + "simple/near", + "simple/nec", + "simple/neo4j", + "simple/neovim", + "simple/nestjs", + "simple/netapp", + "simple/netbsd", + "simple/netflix", + "simple/netlify", + "simple/nette", + "simple/netto", + "simple/neutralinojs", + "simple/newbalance", + "simple/newegg", + "simple/newjapanprowrestling", + "simple/newrelic", + "simple/newyorktimes", + "simple/nextbilliondotai", + "simple/nextcloud", + "simple/nextdoor", + "simple/nextdotjs", + "simple/nextra", + "simple/nextui", + "simple/nfc", + "simple/nginx", + "simple/nginxproxymanager", + "simple/ngrok", + "simple/ngrx", + "simple/nhl", + "simple/niconico", + "simple/nike", + "simple/nikon", + "simple/nim", + "simple/nintendo", + "simple/nintendo3ds", + "simple/nintendogamecube", + "simple/nintendonetwork", + "simple/nintendoswitch", + "simple/nissan", + "simple/nixos", + "simple/nodedotjs", + "simple/nodemon", + "simple/nodered", + "simple/nokia", + "simple/norco", + "simple/nordicsemiconductor", + "simple/nordvpn", + "simple/normalizedotcss", + "simple/norton", + "simple/norwegian", + "simple/notepadplusplus", + "simple/notion", + "simple/notist", + "simple/nounproject", + "simple/novu", + "simple/now", + "simple/npm", + "simple/nrwl", + "simple/nsis", + "simple/nubank", + "simple/nucleo", + "simple/nuget", + "simple/nuke", + "simple/numba", + "simple/numpy", + "simple/nunjucks", + "simple/nutanix", + "simple/nuxtdotjs", + "simple/nvidia", + "simple/nx", + "simple/nxp", + "simple/nzxt", + "simple/observable", + "simple/obsidian", + "simple/obsstudio", + "simple/ocaml", + "simple/octanerender", + "simple/octave", + "simple/octobercms", + "simple/octoprint", + "simple/octopusdeploy", + "simple/oculus", + "simple/odnoklassniki", + "simple/odoo", + "simple/odysee", + "simple/ohdear", + "simple/okcupid", + "simple/okta", + "simple/oneplus", + "simple/onlyfans", + "simple/onlyoffice", + "simple/onnx", + "simple/onstar", + "simple/opel", + "simple/openaccess", + "simple/openai", + "simple/openaigym", + "simple/openapiinitiative", + "simple/openbadges", + "simple/openbsd", + "simple/openbugbounty", + "simple/opencollective", + "simple/opencontainersinitiative", + "simple/opencv", + "simple/openfaas", + "simple/opengl", + "simple/openhab", + "simple/openid", + "simple/openjdk", + "simple/openlayers", + "simple/openmined", + "simple/opennebula", + "simple/openproject", + "simple/openscad", + "simple/opensea", + "simple/opensearch", + "simple/opensourcehardware", + "simple/opensourceinitiative", + "simple/openssl", + "simple/openstack", + "simple/openstreetmap", + "simple/opensuse", + "simple/opentelemetry", + "simple/opentext", + "simple/opentofu", + "simple/openverse", + "simple/openvpn", + "simple/openwrt", + "simple/openzeppelin", + "simple/openzfs", + "simple/opera", + "simple/operagx", + "simple/opnsense", + "simple/oppo", + "simple/opsgenie", + "simple/opslevel", + "simple/oracle", + "simple/orcid", + "simple/oreilly", + "simple/org", + "simple/origin", + "simple/osano", + "simple/osgeo", + "simple/oshkosh", + "simple/osmc", + "simple/osu", + "simple/otto", + "simple/overcast", + "simple/overleaf", + "simple/ovh", + "simple/owasp", + "simple/owncloud", + "simple/oxygen", + "simple/oyo", + "simple/p5dotjs", + "simple/packagist", + "simple/packer", + "simple/paddlepaddle", + "simple/paddypower", + "simple/pagekit", + "simple/pagerduty", + "simple/pagespeedinsights", + "simple/pagseguro", + "simple/palantir", + "simple/paloaltonetworks", + "simple/paloaltosoftware", + "simple/panasonic", + "simple/pandas", + "simple/pandora", + "simple/pantheon", + "simple/paperspace", + "simple/paritysubstrate", + "simple/parsedotly", + "simple/passport", + "simple/pastebin", + "simple/patreon", + "simple/paychex", + "simple/payhip", + "simple/payloadcms", + "simple/payoneer", + "simple/paypal", + "simple/paytm", + "simple/pcgamingwiki", + "simple/pdm", + "simple/peakdesign", + "simple/pearson", + "simple/peerlist", + "simple/peertube", + "simple/pegasusairlines", + "simple/pelican", + "simple/peloton", + "simple/penny", + "simple/penpot", + "simple/pepsi", + "simple/percy", + "simple/perforce", + "simple/perl", + "simple/persistent", + "simple/personio", + "simple/petsathome", + "simple/peugeot", + "simple/pexels", + "simple/pfsense", + "simple/phabricator", + "simple/philipshue", + "simple/phoenixframework", + "simple/phonepe", + "simple/phosphoricons", + "simple/photobucket", + "simple/photocrowd", + "simple/photopea", + "simple/php", + "simple/phpmyadmin", + "simple/phpstorm", + "simple/piaggiogroup", + "simple/picardsurgeles", + "simple/picartodottv", + "simple/picnic", + "simple/picpay", + "simple/pihole", + "simple/pimcore", + "simple/pinboard", + "simple/pinescript", + "simple/pinetwork", + "simple/pingdom", + "simple/pinterest", + "simple/pioneerdj", + "simple/pivotaltracker", + "simple/piwigo", + "simple/pix", + "simple/pixabay", + "simple/pixiv", + "simple/pkgsrc", + "simple/planet", + "simple/planetscale", + "simple/plangrid", + "simple/platformdotsh", + "simple/platformio", + "simple/platzi", + "simple/plausibleanalytics", + "simple/playcanvas", + "simple/playerdotme", + "simple/playerfm", + "simple/playstation", + "simple/playstation2", + "simple/playstation3", + "simple/playstation4", + "simple/playstation5", + "simple/playstationvita", + "simple/playwright", + "simple/pleroma", + "simple/plesk", + "simple/plex", + "simple/plotly", + "simple/pluralsight", + "simple/plurk", + "simple/pluscodes", + "simple/pm2", + "simple/pnpm", + "simple/pocket", + "simple/pocketbase", + "simple/pocketcasts", + "simple/podcastaddict", + "simple/podcastindex", + "simple/podman", + "simple/poe", + "simple/poetry", + "simple/pointy", + "simple/pokemon", + "simple/polars", + "simple/polestar", + "simple/polkadot", + "simple/poly", + "simple/polygon", + "simple/polymerproject", + "simple/polywork", + "simple/popos", + "simple/porsche", + "simple/portainer", + "simple/portswigger", + "simple/postcss", + "simple/postgresql", + "simple/posthog", + "simple/postman", + "simple/postmates", + "simple/powerapps", + "simple/powerautomate", + "simple/powerbi", + "simple/powerfx", + "simple/powerpages", + "simple/powers", + "simple/powershell", + "simple/powervirtualagents", + "simple/prdotco", + "simple/preact", + "simple/precommit", + "simple/prefect", + "simple/premierleague", + "simple/prepbytes", + "simple/prestashop", + "simple/presto", + "simple/prettier", + "simple/pretzel", + "simple/prevention", + "simple/prezi", + "simple/prime", + "simple/primevideo", + "simple/printables", + "simple/prisma", + "simple/prismic", + "simple/privateinternetaccess", + "simple/probot", + "simple/processingfoundation", + "simple/processwire", + "simple/producthunt", + "simple/progate", + "simple/progress", + "simple/prometheus", + "simple/prosieben", + "simple/protocolsdotio", + "simple/protodotio", + "simple/proton", + "simple/protoncalendar", + "simple/protondb", + "simple/protondrive", + "simple/protonmail", + "simple/protonvpn", + "simple/protools", + "simple/protractor", + "simple/proxmox", + "simple/pterodactyl", + "simple/pubg", + "simple/publons", + "simple/pubmed", + "simple/pug", + "simple/pulumi", + "simple/puma", + "simple/puppet", + "simple/puppeteer", + "simple/purescript", + "simple/purgecss", + "simple/purism", + "simple/pusher", + "simple/pwa", + "simple/pycharm", + "simple/pydantic", + "simple/pyg", + "simple/pypi", + "simple/pypy", + "simple/pyscaffold", + "simple/pysyft", + "simple/pytest", + "simple/python", + "simple/pythonanywhere", + "simple/pytorch", + "simple/pyup", + "simple/qantas", + "simple/qatarairways", + "simple/qemu", + "simple/qgis", + "simple/qi", + "simple/qiita", + "simple/qiskit", + "simple/qiwi", + "simple/qlik", + "simple/qmk", + "simple/qt", + "simple/qualcomm", + "simple/qualtrics", + "simple/qualys", + "simple/quantcast", + "simple/quantconnect", + "simple/quarkus", + "simple/quasar", + "simple/qubesos", + "simple/quest", + "simple/quickbooks", + "simple/quicklook", + "simple/quicktime", + "simple/quip", + "simple/quora", + "simple/qwant", + "simple/qwiklabs", + "simple/qzone", + "simple/r", + "simple/r3", + "simple/rabbitmq", + "simple/racket", + "simple/radar", + "simple/radiopublic", + "simple/radixui", + "simple/radstudio", + "simple/railway", + "simple/rainmeter", + "simple/rakuten", + "simple/ram", + "simple/rancher", + "simple/rarible", + "simple/rasa", + "simple/raspberrypi", + "simple/ravelry", + "simple/ray", + "simple/raycast", + "simple/razer", + "simple/razorpay", + "simple/react", + "simple/reacthookform", + "simple/reactivex", + "simple/reactos", + "simple/reactquery", + "simple/reactrouter", + "simple/reacttable", + "simple/readdotcv", + "simple/readme", + "simple/readthedocs", + "simple/realm", + "simple/reason", + "simple/reasonstudios", + "simple/recoil", + "simple/red", + "simple/redbubble", + "simple/reddit", + "simple/redhat", + "simple/redhatopenshift", + "simple/redis", + "simple/redmine", + "simple/redox", + "simple/redux", + "simple/reduxsaga", + "simple/redwoodjs", + "simple/reebok", + "simple/refine", + "simple/relay", + "simple/relianceindustrieslimited", + "simple/remark", + "simple/remix", + "simple/renault", + "simple/render", + "simple/renovatebot", + "simple/renpy", + "simple/renren", + "simple/replit", + "simple/republicofgamers", + "simple/rescript", + "simple/rescuetime", + "simple/researchgate", + "simple/resharper", + "simple/resurrectionremixos", + "simple/retool", + "simple/retroarch", + "simple/retropie", + "simple/revanced", + "simple/revealdotjs", + "simple/reverbnation", + "simple/revoltdotchat", + "simple/revolut", + "simple/revue", + "simple/rewe", + "simple/rezgo", + "simple/rhinoceros", + "simple/rider", + "simple/rimacautomobili", + "simple/ring", + "simple/riotgames", + "simple/ripple", + "simple/riscv", + "simple/riseup", + "simple/rive", + "simple/roadmapdotsh", + "simple/roamresearch", + "simple/robinhood", + "simple/roblox", + "simple/robloxstudio", + "simple/robotframework", + "simple/rocketdotchat", + "simple/rocksdb", + "simple/rockylinux", + "simple/roku", + "simple/rollsroyce", + "simple/rollupdotjs", + "simple/rome", + "simple/rootme", + "simple/roots", + "simple/rootsbedrock", + "simple/rootssage", + "simple/ros", + "simple/rossmann", + "simple/rotaryinternational", + "simple/rottentomatoes", + "simple/roundcube", + "simple/rsocket", + "simple/rss", + "simple/rstudio", + "simple/rte", + "simple/rtl", + "simple/rtlzwei", + "simple/rtm", + "simple/rubocop", + "simple/ruby", + "simple/rubygems", + "simple/rubyonrails", + "simple/rubysinatra", + "simple/ruff", + "simple/rumble", + "simple/rundeck", + "simple/runkeeper", + "simple/runkit", + "simple/rust", + "simple/rxdb", + "simple/ryanair", + "simple/rye", + "simple/s7airlines", + "simple/sabanci", + "simple/safari", + "simple/sage", + "simple/sahibinden", + "simple/sailfishos", + "simple/sailsdotjs", + "simple/salesforce", + "simple/saltproject", + "simple/samsclub", + "simple/samsung", + "simple/samsungpay", + "simple/sandisk", + "simple/sanfranciscomunicipalrailway", + "simple/sanic", + "simple/sanity", + "simple/saopaulometro", + "simple/sap", + "simple/sass", + "simple/sat1", + "simple/satellite", + "simple/saturn", + "simple/saucelabs", + "simple/scala", + "simple/scaleway", + "simple/scania", + "simple/schneiderelectric", + "simple/scikitlearn", + "simple/scipy", + "simple/scopus", + "simple/scpfoundation", + "simple/scrapbox", + "simple/scratch", + "simple/screencastify", + "simple/scribd", + "simple/scrimba", + "simple/scrollreveal", + "simple/scrumalliance", + "simple/scrutinizerci", + "simple/scylladb", + "simple/seagate", + "simple/searxng", + "simple/seat", + "simple/securityscorecard", + "simple/sefaria", + "simple/sega", + "simple/selenium", + "simple/sellfy", + "simple/semanticrelease", + "simple/semanticscholar", + "simple/semanticuireact", + "simple/semanticweb", + "simple/semaphoreci", + "simple/semrush", + "simple/semver", + "simple/sencha", + "simple/sennheiser", + "simple/sensu", + "simple/sentry", + "simple/sepa", + "simple/sequelize", + "simple/serverfault", + "simple/serverless", + "simple/session", + "simple/sessionize", + "simple/setapp", + "simple/sfml", + "simple/shadow", + "simple/shanghaimetro", + "simple/sharex", + "simple/sharp", + "simple/shazam", + "simple/shell", + "simple/shelly", + "simple/shenzhenmetro", + "simple/shieldsdotio", + "simple/shikimori", + "simple/shopee", + "simple/shopify", + "simple/shopware", + "simple/shortcut", + "simple/shotcut", + "simple/showpad", + "simple/showtime", + "simple/shutterstock", + "simple/siemens", + "simple/sifive", + "simple/signal", + "simple/similarweb", + "simple/simkl", + "simple/simpleanalytics", + "simple/simpleicons", + "simple/simplenote", + "simple/sinaweibo", + "simple/singaporeairlines", + "simple/singlestore", + "simple/sitecore", + "simple/sitepoint", + "simple/sketch", + "simple/sketchfab", + "simple/sketchup", + "simple/skillshare", + "simple/skoda", + "simple/sky", + "simple/skynet", + "simple/skypack", + "simple/skype", + "simple/skypeforbusiness", + "simple/skyrock", + "simple/slack", + "simple/slackware", + "simple/slashdot", + "simple/slickpic", + "simple/slides", + "simple/slideshare", + "simple/slint", + "simple/smart", + "simple/smartthings", + "simple/smashdotgg", + "simple/smashingmagazine", + "simple/smrt", + "simple/smugmug", + "simple/snapchat", + "simple/snapcraft", + "simple/sncf", + "simple/snowflake", + "simple/snowpack", + "simple/snyk", + "simple/socialblade", + "simple/society6", + "simple/socketdotio", + "simple/sogou", + "simple/solid", + "simple/solidity", + "simple/sololearn", + "simple/solus", + "simple/sonar", + "simple/sonarcloud", + "simple/sonarlint", + "simple/sonarqube", + "simple/sonatype", + "simple/songkick", + "simple/songoda", + "simple/sonicwall", + "simple/sonos", + "simple/sony", + "simple/soundcharts", + "simple/soundcloud", + "simple/sourceengine", + "simple/sourceforge", + "simple/sourcehut", + "simple/sourcetree", + "simple/southwestairlines", + "simple/spacemacs", + "simple/spacex", + "simple/spacy", + "simple/sparkar", + "simple/sparkasse", + "simple/sparkfun", + "simple/sparkpost", + "simple/spdx", + "simple/speakerdeck", + "simple/spectrum", + "simple/speedtest", + "simple/speedypage", + "simple/sphinx", + "simple/spigotmc", + "simple/spinnaker", + "simple/spinrilla", + "simple/splunk", + "simple/spoj", + "simple/spond", + "simple/spotify", + "simple/spotlight", + "simple/spreadshirt", + "simple/spreaker", + "simple/spring", + "simple/spring_creators", + "simple/springboot", + "simple/springsecurity", + "simple/spyderide", + "simple/sqlalchemy", + "simple/sqlite", + "simple/square", + "simple/squareenix", + "simple/squarespace", + "simple/ssrn", + "simple/sst", + "simple/stackbit", + "simple/stackblitz", + "simple/stackedit", + "simple/stackexchange", + "simple/stackhawk", + "simple/stackoverflow", + "simple/stackpath", + "simple/stackshare", + "simple/stadia", + "simple/staffbase", + "simple/standardjs", + "simple/standardresume", + "simple/starbucks", + "simple/stardock", + "simple/starlingbank", + "simple/starship", + "simple/startrek", + "simple/starz", + "simple/statamic", + "simple/statuspage", + "simple/statuspal", + "simple/steam", + "simple/steamdb", + "simple/steamdeck", + "simple/steamworks", + "simple/steelseries", + "simple/steem", + "simple/steemit", + "simple/steinberg", + "simple/stellar", + "simple/stencyl", + "simple/stimulus", + "simple/stitcher", + "simple/stmicroelectronics", + "simple/stockx", + "simple/stopstalk", + "simple/storyblok", + "simple/storybook", + "simple/strapi", + "simple/strava", + "simple/streamlit", + "simple/stripe", + "simple/strongswan", + "simple/stryker", + "simple/stubhub", + "simple/studio3t", + "simple/studyverse", + "simple/styledcomponents", + "simple/stylelint", + "simple/styleshare", + "simple/stylus", + "simple/subaru", + "simple/sublimetext", + "simple/substack", + "simple/subtitleedit", + "simple/subversion", + "simple/suckless", + "simple/sumologic", + "simple/supabase", + "simple/supercrease", + "simple/supermicro", + "simple/superuser", + "simple/surrealdb", + "simple/surveymonkey", + "simple/suse", + "simple/suzuki", + "simple/svelte", + "simple/svg", + "simple/svgdotjs", + "simple/svgo", + "simple/swagger", + "simple/swarm", + "simple/swc", + "simple/swift", + "simple/swiggy", + "simple/swiper", + "simple/swr", + "simple/symantec", + "simple/symbolab", + "simple/symfony", + "simple/symphony", + "simple/sympy", + "simple/synology", + "simple/system76", + "simple/tableau", + "simple/tablecheck", + "simple/tacobell", + "simple/tado", + "simple/taichigraphics", + "simple/taichilang", + "simple/tails", + "simple/tailwindcss", + "simple/talend", + "simple/talenthouse", + "simple/tamiya", + "simple/tampermonkey", + "simple/taobao", + "simple/tapas", + "simple/target", + "simple/task", + "simple/tasmota", + "simple/tata", + "simple/tauri", + "simple/taxbuzz", + "simple/tcs", + "simple/teamcity", + "simple/teamspeak", + "simple/teamviewer", + "simple/ted", + "simple/teespring", + "simple/tekton", + "simple/tele5", + "simple/telegram", + "simple/telegraph", + "simple/temporal", + "simple/tencentqq", + "simple/tensorflow", + "simple/teradata", + "simple/teratail", + "simple/termius", + "simple/terraform", + "simple/tesco", + "simple/tesla", + "simple/testcafe", + "simple/testin", + "simple/testinglibrary", + "simple/testrail", + "simple/tether", + "simple/textpattern", + "simple/tga", + "simple/thangs", + "simple/thealgorithms", + "simple/theconversation", + "simple/theirishtimes", + "simple/themighty", + "simple/themodelsresource", + "simple/themoviedatabase", + "simple/thenorthface", + "simple/theregister", + "simple/thesoundsresource", + "simple/thespritersresource", + "simple/thewashingtonpost", + "simple/thingiverse", + "simple/thinkpad", + "simple/threadless", + "simple/threads", + "simple/threedotjs", + "simple/threema", + "simple/thumbtack", + "simple/thunderbird", + "simple/thurgauerkantonalbank", + "simple/thymeleaf", + "simple/ticketmaster", + "simple/tidal", + "simple/tiddlywiki", + "simple/tide", + "simple/tidyverse", + "simple/tietoevry", + "simple/tiktok", + "simple/tile", + "simple/timescale", + "simple/tina", + "simple/tinder", + "simple/tinyletter", + "simple/tistory", + "simple/tmobile", + "simple/tmux", + "simple/todoist", + "simple/toggl", + "simple/toggltrack", + "simple/tokyometro", + "simple/toll", + "simple/toml", + "simple/tomorrowland", + "simple/ton", + "simple/topcoder", + "simple/toptal", + "simple/torbrowser", + "simple/torproject", + "simple/toshiba", + "simple/tourbox", + "simple/toyota", + "simple/tplink", + "simple/tqdm", + "simple/tradingview", + "simple/traefikmesh", + "simple/traefikproxy", + "simple/trailforks", + "simple/trainerroad", + "simple/trakt", + "simple/transportforireland", + "simple/transportforlondon", + "simple/travisci", + "simple/treehouse", + "simple/trello", + "simple/trendmicro", + "simple/treyarch", + "simple/tricentis", + "simple/trilium", + "simple/triller", + "simple/trino", + "simple/tripadvisor", + "simple/tripdotcom", + "simple/trivy", + "simple/trove", + "simple/trpc", + "simple/truenas", + "simple/trulia", + "simple/trustedshops", + "simple/trustpilot", + "simple/tryhackme", + "simple/tryitonline", + "simple/tsnode", + "simple/tubi", + "simple/tui", + "simple/tumblr", + "simple/tunein", + "simple/turbo", + "simple/turborepo", + "simple/turbosquid", + "simple/turkishairlines", + "simple/turso", + "simple/tutanota", + "simple/tvtime", + "simple/twilio", + "simple/twitch", + "simple/twitter", + "simple/typeform", + "simple/typescript", + "simple/typo3", + "simple/uber", + "simple/ubereats", + "simple/ubiquiti", + "simple/ubisoft", + "simple/ublockorigin", + "simple/ubuntu", + "simple/ubuntumate", + "simple/udacity", + "simple/udemy", + "simple/ufc", + "simple/uikit", + "simple/ulule", + "simple/umami", + "simple/umbraco", + "simple/uml", + "simple/unacademy", + "simple/underarmour", + "simple/underscoredotjs", + "simple/undertale", + "simple/unicode", + "simple/unilever", + "simple/unitedairlines", + "simple/unitednations", + "simple/unity", + "simple/unlicense", + "simple/uno", + "simple/unocss", + "simple/unraid", + "simple/unrealengine", + "simple/unsplash", + "simple/untappd", + "simple/upcloud", + "simple/uplabs", + "simple/upptime", + "simple/ups", + "simple/upstash", + "simple/uptimekuma", + "simple/uptobox", + "simple/upwork", + "simple/usps", + "simple/utorrent", + "simple/v", + "simple/v2ex", + "simple/v8", + "simple/vaadin", + "simple/vagrant", + "simple/vala", + "simple/valorant", + "simple/valve", + "simple/vapor", + "simple/vault", + "simple/vaultwarden", + "simple/vauxhall", + "simple/vbulletin", + "simple/vectorlogozone", + "simple/vectorworks", + "simple/veeam", + "simple/veepee", + "simple/vega", + "simple/velog", + "simple/venmo", + "simple/vercel", + "simple/verdaccio", + "simple/veritas", + "simple/verizon", + "simple/vespa", + "simple/vexxhost", + "simple/vfairs", + "simple/viadeo", + "simple/viaplay", + "simple/viber", + "simple/victoriametrics", + "simple/vim", + "simple/vimeo", + "simple/vimeolivestream", + "simple/virgin", + "simple/virginmedia", + "simple/virtualbox", + "simple/virustotal", + "simple/visa", + "simple/visualbasic", + "simple/visualstudio", + "simple/visualstudiocode", + "simple/vite", + "simple/vitess", + "simple/vitest", + "simple/vivaldi", + "simple/vivawallet", + "simple/vivino", + "simple/vivint", + "simple/vk", + "simple/vlcmediaplayer", + "simple/vmware", + "simple/vodafone", + "simple/voidlinux", + "simple/voipdotms", + "simple/volkswagen", + "simple/volvo", + "simple/vonage", + "simple/vorondesign", + "simple/vowpalwabbit", + "simple/vox", + "simple/vsco", + "simple/vscodium", + "simple/vtex", + "simple/vuedotjs", + "simple/vuetify", + "simple/vulkan", + "simple/vultr", + "simple/vyond", + "simple/w3schools", + "simple/wacom", + "simple/wagtail", + "simple/wails", + "simple/wakatime", + "simple/walkman", + "simple/wallabag", + "simple/walletconnect", + "simple/walmart", + "simple/wantedly", + "simple/wappalyzer", + "simple/warnerbros", + "simple/warp", + "simple/wasabi", + "simple/wasmcloud", + "simple/wasmer", + "simple/wattpad", + "simple/wayland", + "simple/waze", + "simple/wazirx", + "simple/wearos", + "simple/weasyl", + "simple/web3dotjs", + "simple/webassembly", + "simple/webauthn", + "simple/webcomponentsdotorg", + "simple/webdriverio", + "simple/webex", + "simple/webflow", + "simple/webgl", + "simple/weblate", + "simple/webmin", + "simple/webmoney", + "simple/webpack", + "simple/webrtc", + "simple/webstorm", + "simple/webtoon", + "simple/webtrees", + "simple/wechat", + "simple/wegame", + "simple/weightsandbiases", + "simple/welcometothejungle", + "simple/wellfound", + "simple/wellsfargo", + "simple/wemo", + "simple/westerndigital", + "simple/wetransfer", + "simple/wezterm", + "simple/whatsapp", + "simple/wheniwork", + "simple/wii", + "simple/wiiu", + "simple/wikidata", + "simple/wikidotgg", + "simple/wikidotjs", + "simple/wikimediacommons", + "simple/wikipedia", + "simple/wikiquote", + "simple/wikivoyage", + "simple/winamp", + "simple/windows", + "simple/windows10", + "simple/windows11", + "simple/windows95", + "simple/windowsterminal", + "simple/windowsxp", + "simple/wipro", + "simple/wire", + "simple/wireguard", + "simple/wireshark", + "simple/wise", + "simple/wish", + "simple/wistia", + "simple/wix", + "simple/wizzair", + "simple/wolfram", + "simple/wolframlanguage", + "simple/wolframmathematica", + "simple/woo", + "simple/woocommerce", + "simple/wordpress", + "simple/workplace", + "simple/worldhealthorganization", + "simple/wpengine", + "simple/wpexplorer", + "simple/wprocket", + "simple/writedotas", + "simple/wwe", + "simple/wwise", + "simple/x", + "simple/xamarin", + "simple/xaml", + "simple/xampp", + "simple/xbox", + "simple/xcode", + "simple/xdadevelopers", + "simple/xdotorg", + "simple/xero", + "simple/xfce", + "simple/xiaomi", + "simple/xing", + "simple/xmpp", + "simple/xo", + "simple/xrp", + "simple/xsplit", + "simple/xstate", + "simple/yale", + "simple/yamahacorporation", + "simple/yamahamotorcorporation", + "simple/yaml", + "simple/yammer", + "simple/yandexcloud", + "simple/yarn", + "simple/ycombinator", + "simple/yelp", + "simple/yeti", + "simple/yoast", + "simple/youtube", + "simple/youtubegaming", + "simple/youtubemusic", + "simple/youtubeshorts", + "simple/youtubestudio", + "simple/youtubetv", + "simple/yubico", + "simple/zabka", + "simple/zalando", + "simple/zalo", + "simple/zapier", + "simple/zara", + "simple/zazzle", + "simple/zcash", + "simple/zdf", + "simple/zebpay", + "simple/zebratechnologies", + "simple/zelle", + "simple/zend", + "simple/zendesk", + "simple/zenn", + "simple/zenodo", + "simple/zensar", + "simple/zerodha", + "simple/zerply", + "simple/zettlr", + "simple/zhihu", + "simple/zig", + "simple/zigbee", + "simple/zilch", + "simple/zillow", + "simple/zincsearch", + "simple/zingat", + "simple/zod", + "simple/zoho", + "simple/zoiper", + "simple/zomato", + "simple/zoom", + "simple/zorin", + "simple/zotero", + "simple/zsh", + "simple/zulip", + "simple/zyte" + ] +} \ No newline at end of file diff --git a/schema/extensions.json b/schema/extensions.json new file mode 100755 index 0000000..6e4b128 --- /dev/null +++ b/schema/extensions.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Markdown extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/$defs/external" + }, + { + "$ref": "#/$defs/external-community" + } + ] + }, + "uniqueItems": true, + "minItems": 1, + "$defs": { + "external": { + "description": "External markdown extensions, schema provided by us", + "anyOf": [ + { + "$ref": "extensions/markdown.json" + }, + { + "$ref": "extensions/pymdownx.json" + } + ] + }, + "external-community": { + "description": "External markdown extensions, schema provided by our community", + "anyOf": [ + { + "$ref": "https://raw.githubusercontent.com/Neoteroi/mkdocs-plugins/main/docs/extensions-schema.json" + } + ] + } + } +} diff --git a/schema/extensions/markdown.json b/schema/extensions/markdown.json new file mode 100755 index 0000000..746040f --- /dev/null +++ b/schema/extensions/markdown.json @@ -0,0 +1,156 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Markdown extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/", + "oneOf": [ + { + "title": "Abbreviations – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#abbreviations", + "enum": [ + "markdown.extensions.abbr", + "abbr" + ] + }, + { + "title": "Admonition – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#admonition", + "enum": [ + "markdown.extensions.admonition", + "admonition" + ] + }, + { + "title": "Attribute Lists – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#attribute-lists", + "enum": [ + "markdown.extensions.attr_list", + "attr_list" + ] + }, + { + "title": "Markdown extension: a classier syntax for admonitions", + "markdownDescription": "https://github.com/oprypin/markdown-callouts", + "enum": [ + "markdown.extensions.callouts", + "callouts" + ] + }, + { + "title": "Definition Lists – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#definition-lists", + "enum": [ + "markdown.extensions.def_list", + "def_list" + ] + }, + { + "title": "Footnotes – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#footnotes", + "enum": [ + "markdown.extensions.footnotes", + "footnotes" + ] + }, + { + "title": "Markdown in HTML – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#markdown-in-html", + "enum": [ + "markdown.extensions.md_in_html", + "md_in_html" + ] + }, + { + "title": "Sane Lists – Python Markdown", + "markdownDescription": "https://python-markdown.github.io/extensions/sane_lists/", + "enum": [ + "markdown.extensions.sane_lists", + "sane_lists" + ] + }, + { + "title": "Tables – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#tables", + "enum": [ + "markdown.extensions.tables", + "tables" + ] + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "toc": { + "$ref": "#/$defs/toc" + }, + "markdown.extensions.toc": { + "$ref": "#/$defs/toc" + } + }, + "additionalProperties": false + }, + { + "title": "Table Of Contents – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#table-of-contents", + "enum": [ + "markdown.extensions.toc", + "toc" + ] + } + ] + } + ], + "$defs": { + "toc": { + "title": "Table Of Contents – Python Markdown", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#table-of-contents", + "type": "object", + "properties": { + "title": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#+toc.title", + "type": "string" + }, + "permalink": { + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#+toc.permalink", + "type": "boolean" + }, + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#+toc.permalink", + "type": "string" + } + ], + "default": true + }, + "anchorlink": { + "markdownDescription": "https://python-markdown.github.io/extensions/toc/#usage", + "type": "boolean", + "default": false + }, + "permalink_title": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#+toc.permalink_title", + "type": "string" + }, + "slugify": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#+toc.slugify", + "default": "!!python/object/apply:pymdownx.slugs.slugify {kwds: {case: lower}}" + }, + "toc_depth": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/#+toc.toc_depth", + "type": "number", + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6 + ] + } + }, + "additionalProperties": false + } + } +} diff --git a/schema/extensions/pymdownx.json b/schema/extensions/pymdownx.json new file mode 100755 index 0000000..9da8895 --- /dev/null +++ b/schema/extensions/pymdownx.json @@ -0,0 +1,701 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Markdown extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/", + "oneOf": [ + { + "oneOf": [ + { + "type": "object", + "properties": { + "pymdownx.arithmatex": { + "title": "Arithmatex – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#arithmatex", + "type": "object", + "properties": { + "generic": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/arithmatex/#options", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "title": "Arithmatex – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#arithmatex", + "const": "pymdownx.arithmatex" + } + ] + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "pymdownx.betterem": { + "title": "BetterEm – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#betterem", + "type": "object", + "properties": { + "smart_enable": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/betterem/#options", + "type": "string", + "enum": [ + "all", + "asterisk", + "underscore", + "none" + ], + "default": "all" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "title": "BetterEm – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#betterem", + "const": "pymdownx.betterem" + } + ] + }, + { + "oneOf": [ + { + "title": "Caret – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "const": "pymdownx.caret" + }, + { + "type": "object", + "properties": { + "pymdownx.caret": { + "title": "Caret – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "type": "object", + "properties": { + "smart_insert": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/caret/#options", + "type": "boolean", + "default": true + }, + "insert": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/caret/#options", + "type": "boolean", + "default": true + }, + "superscript": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/caret/#options", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "Critic – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#critic", + "const": "pymdownx.critic" + }, + { + "type": "object", + "properties": { + "pymdownx.critic": { + "title": "Critic – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#critic", + "type": "object", + "properties": { + "mode": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.critic.mode", + "enum": [ + "view", + "accept", + "reject" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "title": "Details – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#details", + "const": "pymdownx.details" + }, + { + "oneOf": [ + { + "title": "Emoji – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#emoji", + "const": "pymdownx.emoji" + }, + { + "type": "object", + "properties": { + "pymdownx.emoji": { + "title": "Emoji – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#emoji", + "type": "object", + "properties": { + "emoji_generator": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.emoji.emoji_generator", + "default": "!!python/name:material.extensions.emoji.to_svg" + }, + "emoji_index": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.emoji.emoji_index", + "default": "!!python/name:material.extensions.emoji.twemoji" + }, + "options": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.emoji.options.custom_icons", + "type": "object", + "properties": { + "custom_icons": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.emoji.options.custom_icons", + "type": "array", + "items": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.emoji.options.custom_icons", + "type": "string" + }, + "uniqueItems": true, + "minItems": 1 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "required": [ + "emoji_generator", + "emoji_index" + ] + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "Highlight – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight", + "const": "pymdownx.highlight" + }, + { + "type": "object", + "properties": { + "pymdownx.highlight": { + "title": "Highlight – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight", + "type": "object", + "properties": { + "use_pygments": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.highlight.use_pygments", + "type": "boolean" + }, + "pygments_lang_class": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.highlight.pygments_lang_class", + "type": "boolean" + }, + "auto_title": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.highlight.auto_title", + "type": "boolean" + }, + "auto_title_map": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/highlight/#options", + "type": "object" + }, + "linenums": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.highlight.linenums", + "type": "boolean" + }, + "linenums_style": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.highlight.linenums_style", + "enum": [ + "inline", + "pymdownx-inline", + "table" + ] + }, + "anchor_linenums": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.highlight.anchor_linenums", + "type": "boolean" + }, + "line_spans": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.highlight.line_spans", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "title": "InlineHilite – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#inlinehilite", + "const": "pymdownx.inlinehilite" + }, + { + "oneOf": [ + { + "title": "Keys – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#keys", + "const": "pymdownx.keys" + }, + { + "type": "object", + "properties": { + "pymdownx.keys": { + "title": "Keys – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#keys", + "type": "object", + "properties": { + "separator": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "string", + "default": "+" + }, + "strict": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean", + "default": false + }, + "camel_case": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean", + "default": false + }, + "key_map": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "object" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "MagicLink – Python Markdown Extensions", + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/", + "const": "pymdownx.magiclink" + }, + { + "type": "object", + "properties": { + "pymdownx.magiclink": { + "title": "MagicLink – Python Markdown Extensions", + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/", + "type": "object", + "properties": { + "hide_protocol":{ + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "boolean", + "default": false + }, + "labels": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#labels", + "type": "object", + "default": { + "commit": "Commit", + "compare": "Compare", + "issue": "Issue", + "pull": "Pull Request", + "mention": "User", + "repository": "Repository" + } + }, + "normalize_issue_symbols": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "boolean", + "default": false + }, + "user": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "string", + "default": "" + }, + "provider": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "string", + "default": "github" + }, + "repo": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "string", + "repo": "" + }, + "repo_url_shorthand": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "boolean", + "default": true + }, + "repo_url_shortener": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "boolean", + "default": false + }, + "social_url_shorthand": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "boolean", + "default": false + }, + "social_url_shortener": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#options", + "type": "boolean", + "default": false + }, + "shortener_user_exclude": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/magiclink/#user-excludes", + "type": "object" + } + }, + "additionalProperties": false, + "required": [ + "user", + "repo" + ] + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "Mark – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "const": "pymdownx.mark" + }, + { + "type": "object", + "properties": { + "pymdownx.mark": { + "title": "Mark – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "type": "object", + "properties": { + "smart_mark": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/mark/#options", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "SmartSymbols – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#smartsymbols", + "const": "pymdownx.smartsymbols" + }, + { + "type": "object", + "properties": { + "pymdownx.smartsymbols": { + "title": "SmartSymbols – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#smartsymbols", + "type": "object", + "properties": { + "trademark": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "copyright": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "registered": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "care_of": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "plusminus": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "arrows": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "notequal": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "fractions": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + }, + "ordinal_numbers": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/smartsymbols/#options", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "pymdownx.snippets": { + "title": "Snippets – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#snippets", + "type": "object", + "properties": { + "base_path": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "array", + "items": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "string" + }, + "uniqueItems": true, + "minItems": 1 + }, + "auto_append": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "array", + "items": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "string" + }, + "uniqueItems": true, + "minItems": 1 + }, + "check_paths": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "boolean", + "default": true + }, + "url_download": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "boolean", + "default": false + }, + "url_max_size": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "integer", + "default": 33554432 + }, + "url_timeout": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "number", + "default": 10.0 + }, + "url_request_headers": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/snippets/#options", + "type": "object", + "default": {} + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "title": "Snippets – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#snippets", + "const": "pymdownx.snippets" + } + ] + }, + { + "oneOf": [ + { + "title": "SuperFences – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#superfences", + "const": "pymdownx.superfences" + }, + { + "type": "object", + "properties": { + "pymdownx.superfences": { + "title": "SuperFences – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#superfences", + "type": "object", + "properties": { + "custom_fences": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.superfences.custom_fences", + "type": "array", + "items": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.superfences.custom_fences", + "type": "object", + "properties": { + "name": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/superfences/#custom-fences", + "type": "string" + }, + "class": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/superfences/#custom-fences", + "type": "string" + }, + "format": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/superfences/#custom-fences", + "type": "string" + } + }, + "additionalProperties": false + }, + "minItems": 1 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "type": "object", + "properties": { + "pymdownx.tabbed": { + "title": "Tabbed – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#tabbed", + "type": "object", + "properties": { + "alternate_style": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.tabbed.alternate_style", + "type": "boolean", + "enum": [ + true + ], + "default": true + }, + "combine_header_slug": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.tabbed.combine_header_slug", + "type": "boolean", + "default": true + }, + "slugify": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.tabbed.slugify", + "default": "!!python/object/apply:pymdownx.slugs.slugify {kwds: {case: lower}}" + } + }, + "additionalProperties": false, + "required": [ + "alternate_style" + ] + } + }, + "additionalProperties": false + }, + { + "oneOf": [ + { + "title": "Tasklist – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#tasklist", + "const": "pymdownx.tasklist" + }, + { + "type": "object", + "properties": { + "pymdownx.tasklist": { + "title": "Tasklist – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#tasklist", + "type": "object", + "properties": { + "custom_checkbox": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.tasklist.custom_checkbox", + "type": "boolean", + "default": true + }, + "clickable_checkbox": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#+pymdownx.tasklist.clickable_checkbox", + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "oneOf": [ + { + "title": "Tilde – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "const": "pymdownx.tilde" + }, + { + "type": "object", + "properties": { + "pymdownx.tilde": { + "title": "Tilde – Python Markdown Extensions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#caret-mark-tilde", + "type": "object", + "properties": { + "smart_delete": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/tilde/#options", + "type": "boolean" + }, + "delete": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/tilde/#options", + "type": "boolean" + }, + "subscript": { + "markdownDescription": "https://facelessuser.github.io/pymdown-extensions/extensions/tilde/#options", + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + } + ] +} diff --git a/schema/extra.json b/schema/extra.json new file mode 100755 index 0000000..de1ea6c --- /dev/null +++ b/schema/extra.json @@ -0,0 +1,439 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Extra configuration", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/", + "type": "object", + "properties": { + "homepage": { + "title": "Homepage link (when clicking on logo)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-logo-and-icons/#logo", + "type": "string" + }, + "analytics": { + "title": "Analytics provider", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics", + "type": "object", + "allOf": [ + { + "if": { + "properties": { + "provider": { + "const": "google" + } + } + }, + "then": { + "properties": { + "provider": { + "title": "Google Analytics", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics", + "const": "google" + }, + "property": { + "anyOf": [ + { + "title": "Google Analytics 4", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics", + "pattern": "^G-\\w{10}$" + }, + { + "title": "Unknown property", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#google-analytics", + "type": "string" + } + ] + }, + "feedback": { + "$ref": "#/$defs/feedback" + } + }, + "required": [ + "provider", + "property" + ], + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "provider": { + "type": "string" + } + } + }, + "then": { + "properties": { + "provider": { + "title": "Custom analytics provider", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#custom-site-analytics", + "type": "string" + }, + "feedback": { + "$ref": "#/$defs/feedback" + } + }, + "required": [ + "provider" + ] + } + } + ], + "defaultSnippets": [ + { + "label": "feedback (default)", + "body": { + "feedback": { + "title": "${1:Was this page helpful}", + "ratings": [ + { + "icon": "${2:material/emoticon-happy-outline}", + "name": "${3:This page was helpful}", + "data": 1, + "note": "${4:Thanks for your feedback!}" + }, + { + "icon": "${5:material/emoticon-sad-outline}", + "name": "${6:This page could be improved}", + "data": 0, + "note": "${7:Thanks for your feedback!}" + } + ] + } + } + } + ] + }, + "annotate": { + "title": "Custom selectors for annotations", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/code-blocks/#custom-selectors", + "type": "object", + "patternProperties": { + ".*": { + "title": "Custom selector", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/code-blocks/#custom-selectors", + "type": "array", + "items": { + "type": "string", + "pattern": "^\\.\\w+" + } + } + } + }, + "consent": { + "title": "Cookie consent", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "object", + "properties": { + "title": { + "title": "Cookie consent title", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#+consent.title", + "type": "string", + "default": "Cookie consent" + }, + "description": { + "title": "Cookie consent description", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#+consent.description", + "type": "string" + }, + "cookies": { + "title": "Cookies", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#+consent.cookies", + "type": "object", + "properties": { + "analytics": { + "$ref": "#/$defs/cookie" + }, + "github": { + "$ref": "#/$defs/cookie" + } + }, + "patternProperties": { + "\\w+": { + "$ref": "#/$defs/cookie" + } + }, + "additionalProperties": false, + "defaultSnippets": [ + { + "label": "analytics (default)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#+consent.cookies", + "body": { + "analytics": { + "name": "Google Analytics", + "checked": true + } + } + }, + { + "label": "github (default)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#+consent.cookies", + "body": { + "analytics": { + "name": "GitHub", + "checked": true + } + } + } + ] + }, + "actions": { + "title": "Cookie consent actions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#+consent.actions", + "type": "array", + "items": { + "oneOf": [ + { + "title": "Button to accept cookies", + "const": "accept" + }, + { + "title": "Button to reject cookies", + "const": "reject" + }, + { + "title": "Button to manage settings", + "const": "manage" + } + ] + }, + "uniqueItems": true + } + }, + "additionalProperties": false, + "defaultSnippets": [ + { + "label": "actions (default)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#+consent.actions", + "body": { + "actions": [ + "accept", + "manage" + ] + } + } + ], + "required": [ + "title", + "description" + ] + }, + "social": { + "title": "Social links", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#social-links", + "type": "array", + "items": { + "title": "Social link", + "type": "object", + "properties": { + "icon": { + "$ref": "#/$defs/icon" + }, + "link": { + "title": "Social link", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#+social.link", + "type": "string" + }, + "name": { + "title": "Social link name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#+social.name", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "icon", + "link" + ] + } + }, + "alternate": { + "title": "Site language selector", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#site-language-selector", + "type": "array", + "items": { + "title": "Alternate language", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#site-language-selector", + "type": "object", + "properties": { + "name": { + "title": "Alternate language name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#+alternate.name", + "type": "string" + }, + "link": { + "title": "Alternate language link", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#+alternate.link", + "type": "string" + }, + "lang": { + "title": "Alternate language code (ISO 639-1)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#+alternate.lang", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "link", + "lang" + ] + } + }, + "tags": { + "title": "Tag identifiers", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#tag-icons-and-identifiers", + "type": "object", + "patternProperties": { + ".*": { + "title": "Tag identifier mapping", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#tag-icons-and-identifiers", + "pattern": "^[\\w-]+$" + } + } + }, + "version": { + "title": "Versioning", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-versioning/#versioning", + "type": "object", + "properties": { + "provider": { + "title": "Versioning provider", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-versioning/#versioning", + "const": "mike" + }, + "default": { + "title": "Default version", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-versioning/#version-warning", + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "default": "stable" + } + } + }, + "generator": { + "title": "Generator notice", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/#generator-notice", + "type": "boolean", + "default": true + } + }, + "additionalProperties": true, + "$defs": { + "cookie": { + "title": "Cookie", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "oneOf": [ + { + "type": "object", + "properties": { + "name": { + "title": "Cookie name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "string" + }, + "checked": { + "title": "Initial state", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false, + "required": [ + "name" + ] + }, + { + "title": "Cookie name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/ensuring-data-privacy/#cookie-consent", + "type": "string" + } + ] + }, + "icon": { + "anyOf": [ + { + "$ref": "assets/icons.json" + }, + { + "title": "Unknown icon", + "type": "string" + } + ] + }, + "feedback": { + "title": "Was this page helpful?", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful", + "type": "object", + "properties": { + "title": { + "title": "Feedback widget title", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful", + "type": "string", + "default": "Was this page helpful?" + }, + "ratings": { + "title": "Feedback ratings", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful", + "type": "array", + "items": { + "title": "Feedback rating", + "type": "object", + "properties": { + "icon": { + "$ref": "#/$defs/icon" + }, + "name": { + "title": "Feedback rating name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#+analytics.feedback.ratings.name", + "type": "string" + }, + "data": { + "title": "Feedback rating data", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#+analytics.feedback.ratings.data", + "type": "number" + }, + "note": { + "title": "Feedback rating data", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#+analytics.feedback.ratings.note", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "icon", + "name", + "data", + "note" + ] + } + } + }, + "additionalProperties": false, + "required": [ + "title" + ] + } + }, + "defaultSnippets": [ + { + "label": "analytics (default)", + "body": { + "analytics": { + "provider": "${1:google}", + "property": "${2:G-XXXXXXXXXX}" + } + } + } + ] +} diff --git a/schema/nav.json b/schema/nav.json new file mode 100755 index 0000000..8e17fef --- /dev/null +++ b/schema/nav.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Navigation tree", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#nav", + "type": "array", + "items": { + "anyOf": [ + { + "title": "Navigation item", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#nav", + "pattern": "\\.md$" + }, + { + "type": "object", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#nav", + "patternProperties": { + ".*": { + "oneOf": [ + { + "title": "Navigation item", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#nav", + "pattern": "\\.md$" + }, + { + "$ref": "#" + } + ] + } + } + } + ] + }, + "additionalItems": false +} diff --git a/schema/plugins.json b/schema/plugins.json new file mode 100755 index 0000000..1f1c99b --- /dev/null +++ b/schema/plugins.json @@ -0,0 +1,131 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Plugins", + "markdownDescription": "https://www.mkdocs.org/dev-guide/plugins/", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/$defs/built-in" + }, + { + "$ref": "#/$defs/external" + }, + { + "$ref": "#/$defs/external-community" + } + ] + }, + "uniqueItems": true, + "minItems": 1, + "$defs": { + "built-in": { + "description": "Built-in plugins", + "anyOf": [ + { + "$ref": "plugins/blog.json" + }, + { + "$ref": "plugins/group.json" + }, + { + "$ref": "plugins/info.json" + }, + { + "$ref": "plugins/meta.json" + }, + { + "$ref": "plugins/offline.json" + }, + { + "$ref": "plugins/optimize.json" + }, + { + "$ref": "plugins/privacy.json" + }, + { + "$ref": "plugins/projects.json" + }, + { + "$ref": "plugins/search.json" + }, + { + "$ref": "plugins/social.json" + }, + { + "$ref": "plugins/tags.json" + }, + { + "$ref": "plugins/typeset.json" + } + ] + }, + "external": { + "description": "External plugins, schema provided by us", + "anyOf": [ + { + "$ref": "plugins/external/gen-files.json" + }, + { + "$ref": "plugins/external/git-authors.json" + }, + { + "$ref": "plugins/external/git-committers.json" + }, + { + "$ref": "plugins/external/git-revision-date.json" + }, + { + "$ref": "plugins/external/literate-nav.json" + }, + { + "$ref": "plugins/external/macros.json" + }, + { + "$ref": "plugins/external/minify.json" + }, + { + "$ref": "plugins/external/redirects.json" + }, + { + "$ref": "plugins/external/section-index.json" + } + ] + }, + "external-community": { + "description": "External plugins, schema provided by our community", + "anyOf": [ + { + "$ref": "https://raw.githubusercontent.com/mondeja/mkdocs-include-markdown-plugin/master/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/mondeja/mkdocs-material-relative-language-selector/master/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/Guts/mkdocs-rss-plugin/main/docs/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/timvink/mkdocs-git-revision-date-localized-plugin/master/docs/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/blueswen/mkdocs-glightbox/main/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/prcr/mkdocs-meta-descriptions-plugin/main/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/mkdocstrings/mkdocstrings/master/docs/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/pawamoy/mkdocs-coverage/master/docs/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/pawamoy/mkdocs-spellcheck/master/docs/schema.json" + }, + { + "$ref": "https://raw.githubusercontent.com/pawamoy/markdown-exec/master/docs/schema.json" + } + ] + } + } +} diff --git a/schema/plugins/blog.json b/schema/plugins/blog.json new file mode 100755 index 0000000..ef46b43 --- /dev/null +++ b/schema/plugins/blog.json @@ -0,0 +1,449 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in blog plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/", + "const": "blog" + }, + { + "type": "object", + "properties": { + "blog": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.enabled", + "type": "boolean", + "default": true + }, + "blog_dir": { + "title": "Blog directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.blog_dir", + "type": "string", + "default": "blog" + }, + "blog_toc": { + "title": "Table of contents", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.blog_toc", + "type": "boolean", + "default": false + }, + "post_dir": { + "title": "Post directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_dir", + "type": "string", + "default": "\"{blog\\}/posts\"" + }, + "post_date_format": { + "title": "Format string for post dates", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_date_format", + "default": "long", + "oneOf": [ + { + "enum": [ + "full", + "long", + "medium", + "short" + ] + }, + { + "type": "string" + } + ] + }, + "post_url_date_format": { + "title": "Format string for post dates in URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_url_date_format", + "oneOf": [ + { + "enum": [ + "yyyy", + "yyyy/MM", + "yyyy/MM/dd" + ] + }, + { + "type": "string" + } + ], + "default": "yyyy" + }, + "post_url_format": { + "title": "Format string for post URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_url_format", + "oneOf": [ + { + "enum": [ + "\"{date}/{file}\"", + "\"{date}/{slug}\"", + "\"{file}\"", + "\"{slug}\"" + ] + }, + { + "type": "string" + } + ] + }, + "post_url_max_categories": { + "title": "Number of categories in post URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_url_max_categories", + "type": "number", + "default": 1 + }, + "post_slugify": { + "title": "Post slugify function", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_slugify", + "default": "!!python/object/apply:pymdownx.slugs.slugify {kwds: {case: lower}}" + }, + "post_slugify_separator": { + "title": "Post slugify separator", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_slugify_separator", + "type": "string", + "default": "\"-\"" + }, + "post_excerpt": { + "title": "Post excerpts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_excerpt", + "oneOf": [ + { + "title": "Post excerpts are optional", + "const": "optional" + }, + { + "title": "Post excerpts are required, thus the build will fail", + "const": "required" + } + ], + "default": "optional" + }, + "post_excerpt_max_authors": { + "title": "Number of authors to render in post excerpts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_excerpt_max_authors", + "type": "number", + "default": 1 + }, + "post_excerpt_max_categories": { + "title": "Number of categories to render in post excerpts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_excerpt_max_categories", + "type": "number", + "default": 5 + }, + "post_excerpt_separator": { + "title": "Post excerpt separator", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_excerpt_separator", + "type": "string", + "default": "" + }, + "post_readtime": { + "title": "Post reading time computation", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_readtime", + "type": "boolean", + "default": true + }, + "post_readtime_words_per_minute": { + "title": "Post reading time words per minute", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.post_readtime_words_per_minute", + "type": "number", + "default": 265 + }, + "archive": { + "title": "Archive", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive", + "type": "boolean", + "default": true + }, + "archive_name": { + "title": "Archive name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_name", + "type": "string", + "default": "Archive" + }, + "archive_date_format": { + "title": "Format string for archive dates", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_date_format", + "oneOf": [ + { + "enum": [ + "yyyy", + "MMMM yyyy" + ] + }, + { + "type": "string" + } + ], + "default": "yyyy" + }, + "archive_url_date_format": { + "title": "Format string for archive dates in URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_url_date_format", + "oneOf": [ + { + "enum": [ + "yyyy", + "yyyy/MM" + ] + }, + { + "type": "string" + } + ], + "default": "yyyy" + }, + "archive_url_format": { + "title": "Format string for archive URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_url_format", + "oneOf": [ + { + "enum": [ + "\"archive/{date}\"" + ] + }, + { + "type": "string" + } + ] + }, + "archive_pagination": { + "title": "Pagination for archive", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_pagination", + "type": "boolean", + "default": true + }, + "archive_pagination_per_page": { + "title": "Posts per page for archive", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_pagination_per_page", + "type": "number", + "default": 10 + }, + "archive_toc": { + "title": "Table of contents for archive", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.archive_toc", + "type": "boolean", + "default": false + }, + "categories": { + "title": "Categories", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories", + "type": "boolean", + "default": true + }, + "categories_name": { + "title": "Categories name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_name", + "type": "string", + "default": "Categories" + }, + "categories_url_format": { + "title": "Format string for category URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_url_format", + "oneOf": [ + { + "enum": [ + "\"category/{slug}\"", + "\"{slug}\"" + ] + }, + { + "type": "string" + } + ] + }, + "categories_slugify": { + "title": "Categories slugify function", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_slugify", + "default": "!!python/object/apply:pymdownx.slugs.slugify {kwds: {case: lower}}" + }, + "categories_slugify_separator": { + "title": "Categories slugify separator", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_slugify_separator", + "type": "string", + "default": "\"-\"" + }, + "categories_sort_by": { + "title": "Sort categories by this function", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_sort_by", + "default": "!!python/name:material.plugins.blog.view_name", + "oneOf": [ + { + "type": "string" + }, + { + "enum": [ + "!!python/name:material.plugins.blog.view_name", + "!!python/name:material.plugins.blog.view_post_count" + ] + } + ] + }, + "categories_sort_reverse": { + "title": "Soft categories in reverse", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_sort_reverse", + "default": false + }, + "categories_allowed": { + "title": "Allowed categories", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_allowed", + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true, + "default": [] + }, + "categories_pagination": { + "title": "Pagination for categories", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_pagination", + "type": "boolean", + "default": true + }, + "categories_pagination_per_page": { + "title": "Posts per page for categories", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_pagination_per_page", + "type": "number", + "default": 10 + }, + "categories_toc": { + "title": "Table of contents for categories", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.categories_toc", + "type": "boolean", + "default": false + }, + "authors": { + "title": "Author info", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors", + "type": "boolean", + "default": true + }, + "authors_file": { + "title": "Authors file", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors_file", + "type": "string", + "default": "\"{blog}/.authors.yml\"" + }, + "authors_profiles": { + "title": "Author profiles", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors_profiles", + "type": "boolean", + "default": false + }, + "authors_profiles_name": { + "title": "Authors profiles name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors_profiles_name", + "type": "string", + "default": "Authors" + }, + "authors_profiles_url_format": { + "title": "Format string for author profile URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors_profiles_url_format", + "oneOf": [ + { + "enum": [ + "\"author/{slug}\"", + "\"{slug}\"" + ] + }, + { + "type": "string" + } + ] + }, + "authors_profiles_pagination": { + "title": "Pagination for author profiles", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors_profiles_pagination", + "type": "boolean", + "default": true + }, + "authors_profiles_pagination_per_page": { + "title": "Posts per page for author profiles", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors_profiles_pagination_per_page", + "type": "number", + "default": 10 + }, + "authors_profiles_toc": { + "title": "Table of contents for author profiles", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.authors_profiles_toc", + "type": "boolean", + "default": false + }, + "pagination": { + "title": "Pagination", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.pagination", + "type": "boolean", + "default": true + }, + "pagination_per_page": { + "title": "Posts per page", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.pagination_per_page", + "type": "number", + "default": 10 + }, + "pagination_url_format": { + "title": "Format string for pagination URLs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.pagination_url_format", + "oneOf": [ + { + "enum": [ + "\"page/{page}\"", + "\"{page}\"" + ] + }, + { + "type": "string" + } + ] + }, + "pagination_template": { + "title": "Template string for pagination", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.pagination_template", + "oneOf": [ + { + "enum": [ + "~2~", + "$link_first $link_previous ~2~ $link_next $link_last", + "$link_previous $page $link_next" + ] + }, + { + "type": "string" + } + ], + "default": "~2~" + }, + "pagination_keep_content": { + "title": "Paginated indexes inherit content", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.pagination_keep_content", + "type": "boolean", + "default": false + }, + "draft": { + "title": "Render posts marked as drafts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.draft", + "type": "boolean", + "default": false + }, + "draft_on_serve": { + "title": "Render posts marked as drafts when previewing", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.draft_on_serve", + "type": "boolean", + "default": true + }, + "draft_if_future_date": { + "title": "Automatically mark posts with future dates as drafts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/blog/#config.draft_if_future_date", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/external/gen-files.json b/schema/plugins/external/gen-files.json new file mode 100755 index 0000000..ceec5de --- /dev/null +++ b/schema/plugins/external/gen-files.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Generate pages during the build", + "oneOf": [ + { + "markdownDescription": "https://github.com/oprypin/mkdocs-gen-files", + "const": "git-authors" + }, + { + "type": "object", + "properties": { + "gen-files": { + "additionalProperties": false, + "properties": { + "scripts": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": ["object", "null"] + } + } + } + ] +} diff --git a/schema/plugins/external/git-authors.json b/schema/plugins/external/git-authors.json new file mode 100755 index 0000000..f7b5e31 --- /dev/null +++ b/schema/plugins/external/git-authors.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Add git authors to pages", + "oneOf": [ + { + "markdownDescription": "https://timvink.github.io/mkdocs-git-authors-plugin/", + "const": "git-authors" + }, + { + "type": "object", + "properties": { + "git-authors": { + "markdownDescription": "https://timvink.github.io/mkdocs-git-authors-plugin/options.html", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://timvink.github.io/mkdocs-git-authors-plugin/options.html#enabled", + "type": "boolean", + "default": true + }, + "exclude": { + "title": "List of Markdown file patterns", + "markdownDescription": "https://timvink.github.io/mkdocs-git-authors-plugin/options.html#exclude", + "type": "array", + "items": { + "pattern": "(\\*|\\.md)$" + }, + "uniqueItems": true, + "minItems": 1 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/external/git-committers.json b/schema/plugins/external/git-committers.json new file mode 100755 index 0000000..06a70f4 --- /dev/null +++ b/schema/plugins/external/git-committers.json @@ -0,0 +1,43 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Add git contributors to pages", + "oneOf": [ + { + "markdownDescription": "https://github.com/ojacques/mkdocs-git-committers-plugin-2", + "const": "git-committers" + }, + { + "type": "object", + "properties": { + "git-committers": { + "markdownDescription": "https://github.com/ojacques/mkdocs-git-committers-plugin-2", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#+git-committers.enabled", + "type": "boolean", + "default": true + }, + "repository": { + "title": "Repository slug", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#+git-committers.repository", + "type": "string" + }, + "branch": { + "title": "Repository branch", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#+git-committers.branch", + "type": "string", + "default": "master" + } + }, + "additionalProperties": false, + "required": [ + "repository" + ] + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/external/git-revision-date.json b/schema/plugins/external/git-revision-date.json new file mode 100755 index 0000000..968bed6 --- /dev/null +++ b/schema/plugins/external/git-revision-date.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Add git revision date to pages", + "oneOf": [ + { + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin", + "const": "git-revision-date" + }, + { + "type": "object", + "properties": { + "git-revision-date": { + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin", + "type": "object", + "properties": { + "enable_if_env": { + "title": "Enable plugin when environment variable is set", + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin#options", + "type": "string" + }, + "modify_md": { + "title": "Enable plugin to be used in Markdown files", + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin#options", + "type": "boolean", + "default": true + }, + "as_datetime": { + "title": "Output as Python datetime", + "markdownDescription": "https://github.com/zhaoterryy/mkdocs-git-revision-date-plugin#options", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/external/literate-nav.json b/schema/plugins/external/literate-nav.json new file mode 100755 index 0000000..1cdeb0b --- /dev/null +++ b/schema/plugins/external/literate-nav.json @@ -0,0 +1,35 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "title": "Configure navigation in Markdown instead of YAML", + "oneOf": [ + { + "markdownDescription": "https://github.com/oprypin/mkdocs-literate-nav", + "const": "literate-nav" + }, + { + "type": "object", + "properties": { + "literate-nav": { + "markdownDescription": "https://github.com/oprypin/mkdocs-literate-nav", + "type": "object", + "properties": { + "nav_file": { + "title": "The name of the file to read to determine the navigation for a particular directory under `docs_dir`", + "markdownDescription": "https://oprypin.github.io/mkdocs-literate-nav/reference.html#nav_file", + "type": "string", + "default": "SUMMARY.md" + }, + "implicit_index": { + "title": "If set and a directory has a file named `index.md` or `README.md`, but the literate nav for that directory that never includes it, it will be inserted as the first item of the nav", + "markdownDescription": "https://oprypin.github.io/mkdocs-literate-nav/reference.html#implicit_index", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/external/macros.json b/schema/plugins/external/macros.json new file mode 100755 index 0000000..122de24 --- /dev/null +++ b/schema/plugins/external/macros.json @@ -0,0 +1,70 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "title": "Use variables and macros in Markdown", + "oneOf": [ + { + "markdownDescription": "https://github.com/fralau/mkdocs_macros_plugin", + "const": "macros" + }, + { + "type": "object", + "properties": { + "macros": { + "markdownDescription": "", + "type": "object", + "properties": { + "module_name": { + "title": "Name of the Python module containing macros, filters and variables", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/#configuration-of-the-plugin", + "type": "string", + "default": "main" + }, + "modules": { + "title": "List of preinstalled Python modules, i.e. listed by `pip list`", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/#configuration-of-the-plugin", + "type": "array" + }, + "include_dir": { + "title": "Directory for including external files", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/advanced/#changing-the-directory-of-the-includes", + "type": "string" + }, + "include_yaml": { + "title": "List of yaml files or `key: filename` pairs to be included", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/advanced/#including-external-yaml-files", + "type": "array" + }, + "j2_block_start_string": { + "title": "Non-standard Jinja2 marker for start of block", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/advanced/#solution-4-altering-the-syntax-of-jinja2-for-mkdocs-macros", + "type": "string" + }, + "j2_block_end_string": { + "title": "Non-standard Jinja2 marker for end of block", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/advanced/#solution-4-altering-the-syntax-of-jinja2-for-mkdocs-macros", + "type": "string" + }, + "j2_variable_start_string": { + "title": "Non-standard Jinja2 marker for start of variable", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/advanced/#solution-4-altering-the-syntax-of-jinja2-for-mkdocs-macros", + "type": "string" + }, + "j2_variable_end_string": { + "title": "Non-standard Jinja2 marker for end of variable", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/advanced/#solution-4-altering-the-syntax-of-jinja2-for-mkdocs-macros", + "type": "string" + }, + "on_error_fail": { + "title": "Stop build/serve when macro error happens", + "markdownDescription": "https://mkdocs-macros-plugin.readthedocs.io/en/latest/advanced/#can-i-make-mkdocs-macros-build-process-to-fail-in-case-of-error-instead-of-displaying-the-error-on-the-page", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/external/minify.json b/schema/plugins/external/minify.json new file mode 100755 index 0000000..5867fa6 --- /dev/null +++ b/schema/plugins/external/minify.json @@ -0,0 +1,76 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Minify HTML, JavaScript and CSS during the build", + "type": "object", + "properties": { + "minify": { + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin", + "type": "object", + "dependencies": { + "minify_js": [ + "js_files" + ], + "minify_css": [ + "css_files" + ] + }, + "properties": { + "minify_html": { + "title": "Minify HTML files", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "boolean", + "default": true + }, + "minify_js": { + "title": "Minify JavaScript files", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "boolean", + "default": false + }, + "minify_css": { + "title": "Minify CSS files", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "boolean", + "default": false + }, + "htmlmin_opts": { + "title": "Options for HTML minifier", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "object" + }, + "cache_safe": { + "title": "Add hash to Javascript and CSS file names", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "boolean", + "default": false + }, + "js_files": { + "title": "JavaScript files to minify", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "array", + "items": { + "title": "Path to JavaScript file", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "pattern": "\\.js$" + }, + "uniqueItems": true, + "minItems": 1 + }, + "css_files": { + "title": "CSS files to minify", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "type": "array", + "items": { + "title": "Path to CSS file", + "markdownDescription": "https://github.com/byrnereese/mkdocs-minify-plugin#options", + "pattern": "\\.css$" + }, + "uniqueItems": true, + "minItems": 1 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/schema/plugins/external/redirects.json b/schema/plugins/external/redirects.json new file mode 100755 index 0000000..e053486 --- /dev/null +++ b/schema/plugins/external/redirects.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Add redirects when moving pages to new locations", + "type": "object", + "properties": { + "redirects": { + "markdownDescription": "https://github.com/mkdocs/mkdocs-redirects", + "type": "object", + "properties": { + "redirect_maps": { + "title": "Mapping of Markdown files", + "markdownDescription": "https://github.com/mkdocs/mkdocs-redirects#using", + "type": "object", + "patternProperties": { + "\\.md$": { + "oneOf": [ + { + "title": "Internal redirect", + "markdownDescription": "https://github.com/mkdocs/mkdocs-redirects#using", + "pattern": "\\.md(#\\S+)?$" + }, + { + "title": "External redirect", + "markdownDescription": "https://github.com/mkdocs/mkdocs-redirects#using", + "pattern": "^https?:" + } + ] + } + }, + "defaultSnippets": [ + { + "label": "Internal redirect", + "body": { + "${1:from}.md": "${2:to}.md" + } + }, + { + "label": "External redirect", + "body": { + "${1:from}.md": "https://${2:to.url}" + } + } + ], + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/schema/plugins/external/section-index.json b/schema/plugins/external/section-index.json new file mode 100755 index 0000000..3c83526 --- /dev/null +++ b/schema/plugins/external/section-index.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Add index section pages to navigation", + "oneOf": [ + { + "markdownDescription": "https://github.com/oprypin/mkdocs-section-index", + "const": "section-index" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "section-index": {} + } + } + ] +} diff --git a/schema/plugins/group.json b/schema/plugins/group.json new file mode 100755 index 0000000..f5c5647 --- /dev/null +++ b/schema/plugins/group.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in group plugin", + "oneOf": [ + { + "type": "object", + "properties": { + "group": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/group/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/group/#config.enabled", + "type": "boolean", + "default": true + }, + "plugins": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/group/#config.plugins", + "$ref": "../plugins.json" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/info.json b/schema/plugins/info.json new file mode 100755 index 0000000..320b73c --- /dev/null +++ b/schema/plugins/info.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in info plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/info/", + "const": "info" + }, + { + "type": "object", + "properties": { + "info": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/info/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/info/#config.enabled", + "type": "boolean", + "default": true + }, + "enabled_on_serve": { + "title": "Enable plugin when previewing", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/info/#config.enabled_on_serve", + "type": "boolean", + "default": false + }, + "archive": { + "title": "Enable creation of archive", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/info/#config.archive", + "type": "boolean", + "default": true + }, + "archive_stop_on_violation": { + "title": "Stop creation of archive on violation", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/info/#config.archive_stop_on_violation", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/meta.json b/schema/plugins/meta.json new file mode 100755 index 0000000..7e8c5e7 --- /dev/null +++ b/schema/plugins/meta.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in meta plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/meta/", + "const": "meta" + }, + { + "type": "object", + "properties": { + "meta": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/meta/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/meta/#config.enabled", + "type": "boolean", + "default": true + }, + "meta_file": { + "title": "Meta file name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/meta/#config.meta_file", + "pattern": "\\.yml$", + "default": "\"**/.meta.yml\"" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/offline.json b/schema/plugins/offline.json new file mode 100755 index 0000000..838168d --- /dev/null +++ b/schema/plugins/offline.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in offline plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/offline/", + "const": "offline" + }, + { + "type": "object", + "properties": { + "offline": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/offline/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/offline/#config.enabled", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/optimize.json b/schema/plugins/optimize.json new file mode 100755 index 0000000..f61a73f --- /dev/null +++ b/schema/plugins/optimize.json @@ -0,0 +1,118 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in optimize plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/", + "const": "optimize" + }, + { + "type": "object", + "properties": { + "optimize": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.enabled", + "type": "boolean", + "default": true + }, + "concurrency": { + "title": "Concurrency (number of CPUs)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.concurrency", + "type": "number" + }, + "cache": { + "title": "Enable caching", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.cache", + "type": "boolean", + "default": true + }, + "cache_dir": { + "title": "Cache directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.cache_dir", + "type": "string", + "default": ".cache/plugins/optimize" + }, + "optimize_png": { + "title": "Optimization of PNGs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_png", + "type": "boolean", + "default": true + }, + "optimize_png_speed": { + "title": "Speed/quality tradeoff [1,10]", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_png_speed", + "type": "number", + "default": 4 + }, + "optimize_png_strip": { + "title": "Strip unnecessary metadata from PNGs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_png_strip", + "type": "boolean", + "default": true + }, + "optimize_jpg": { + "title": "Optimization of JPGs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_jpg", + "type": "boolean", + "default": true + }, + "optimize_jpg_quality": { + "title": "Speed/quality tradeoff for pngquant [0,10]", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_jpg_quality", + "type": "number", + "default": 60 + }, + "optimize_jpg_progressive": { + "title": "Progressive encoding (faster rendering)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_jpg_progressive", + "type": "boolean", + "default": true + }, + "optimize_include": { + "title": "Files or folders to include", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_include", + "type": "array", + "items": { + "title": "Files or folders matching this pattern will be included", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_include", + "pattern": ".*" + }, + "uniqueItems": true, + "minItems": 1 + }, + "optimize_exclude": { + "title": "Files or folders to exclude", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_exclude", + "type": "array", + "items": { + "title": "Files or folders matching this pattern will be excluded", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.optimize_exclude", + "pattern": ".*" + }, + "uniqueItems": true, + "minItems": 1 + }, + "print_gain": { + "title": "Print optimization gain", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.print_gain", + "type": "boolean", + "default": true + }, + "print_gain_summary": { + "title": "Print optimization gain summary", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/optimize/#config.print_gain_summary", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/privacy.json b/schema/plugins/privacy.json new file mode 100755 index 0000000..d884e61 --- /dev/null +++ b/schema/plugins/privacy.json @@ -0,0 +1,110 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in privacy plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/", + "const": "privacy" + }, + { + "type": "object", + "properties": { + "privacy": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.enabled", + "type": "boolean", + "default": true + }, + "concurrency": { + "title": "Concurrency (number of CPUs)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.concurrency", + "type": "number" + }, + "cache": { + "title": "Enable caching", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.cache", + "type": "boolean", + "default": true + }, + "cache_dir": { + "title": "Cache directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.cache_dir", + "type": "string", + "default": ".cache/plugins/privacy" + }, + "assets": { + "title": "Process external assets", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets", + "type": "boolean", + "default": true + }, + "assets_fetch": { + "title": "Download external assets", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets_fetch", + "type": "boolean", + "default": true + }, + "assets_fetch_dir": { + "title": "Download external assets to this directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets_fetch_dir", + "type": "string", + "default": "assets/external" + }, + "assets_include": { + "title": "External assets to include", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets_include", + "type": "array", + "items": { + "title": "External assets matching this pattern will be downloaded", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets_include", + "pattern": ".*" + }, + "uniqueItems": true, + "minItems": 1 + }, + "assets_exclude": { + "title": "External assets to exclude", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets_exclude", + "type": "array", + "items": { + "title": "External assets matching this pattern will not be downloaded", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.assets_exclude", + "pattern": ".*" + }, + "uniqueItems": true, + "minItems": 1 + }, + "links": { + "title": "Process external links", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.links", + "type": "boolean", + "default": true + }, + "links_attr_map": { + "title": "Custom attributes to add to external links", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.links_attr_map", + "type": "object", + "patternProperties": { + "^[\\w_]+$": { + "type": "string" + } + } + }, + "links_noopener": { + "title": "Behavior for external links that open in new windows", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/privacy/#config.links_noopener", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/projects.json b/schema/plugins/projects.json new file mode 100755 index 0000000..1ea7d85 --- /dev/null +++ b/schema/plugins/projects.json @@ -0,0 +1,80 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in projects plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/", + "const": "projects" + }, + { + "type": "object", + "properties": { + "projects": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.enabled", + "type": "boolean", + "default": true + }, + "concurrency": { + "title": "Concurrency (number of CPUs)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.concurrency", + "type": "number" + }, + "cache": { + "title": "Enable caching", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.cache", + "type": "boolean", + "default": true + }, + "cache_dir": { + "title": "Cache directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.cache_dir", + "type": "string", + "default": ".cache/plugins/projects" + }, + "projects": { + "title": "Enable projects", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.projects", + "type": "boolean", + "default": true + }, + "projects_dir": { + "title": "Projects directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.projects_dir", + "type": "string", + "default": "projects" + }, + "projects_config_files": { + "title": "Projects configuration files", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.projects_config_files", + "type": "string", + "default": "\"*/mkdocs.yml\"" + }, + "projects_config_transform": { + "title": "Projects configuration transform", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.projects_config_transform", + "type": "string", + "defaultSnippets": [ + { + "body": "!!python/name:${1:module}.${2:function}" + } + ] + }, + "hoisting": { + "title": "Enable hoisting", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/projects/#config.hoisting", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/search.json b/schema/plugins/search.json new file mode 100755 index 0000000..dd1ad9e --- /dev/null +++ b/schema/plugins/search.json @@ -0,0 +1,152 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in search plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/", + "const": "search" + }, + { + "type": "object", + "properties": { + "search": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/", + "type": "object", + "properties": { + "lang": { + "oneOf": [ + { + "$ref": "#/$defs/lang" + }, + { + "type": "array", + "items": { + "$ref": "#/$defs/lang" + }, + "uniqueItems": true, + "minItems": 1 + } + ], + "default": "en" + }, + "separator": { + "title": "Separator for indexing and query tokenization", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/#config.separator", + "type": "string" + }, + "pipeline": { + "title": "Text processing pipeline for indexing", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/#config.pipeline", + "type": "array", + "items": { + "enum": [ + "stemmer", + "stopWordFilter", + "trimmer" + ] + }, + "uniqueItems": true + }, + "jieba_dict": { + "title": "Jieba dictionary replacement", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/#config.jieba_dict", + "type": "string" + }, + "jieba_dict_user": { + "title": "Jieba dictionary augmentation", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/#config.jieba_dict_user", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "$defs": { + "lang": { + "title": "Site search language", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/search/#config.lang", + "oneOf": [ + { + "title": "Site search language: Arabic", + "const": "ar" + }, + { + "title": "Site search language: Danish", + "const": "da" + }, + { + "title": "Site search language: German", + "const": "de" + }, + { + "title": "Site search language: Dutch", + "const": "du" + }, + { + "title": "Site search language: English", + "const": "en" + }, + { + "title": "Site search language: Spanish", + "const": "es" + }, + { + "title": "Site search language: Finnish", + "const": "fi" + }, + { + "title": "Site search language: French", + "const": "fr" + }, + { + "title": "Site search language: Hungarian", + "const": "hu" + }, + { + "title": "Site search language: Italian", + "const": "it" + }, + { + "title": "Site search language: Japanese", + "const": "ja" + }, + { + "title": "Site search language: Norwegian", + "const": "no" + }, + { + "title": "Site search language: Portuguese", + "const": "pt" + }, + { + "title": "Site search language: Romanian", + "const": "ro" + }, + { + "title": "Site search language: Russian", + "const": "ru" + }, + { + "title": "Site search language: Swedish", + "const": "sv" + }, + { + "title": "Site search language: Thai", + "const": "th" + }, + { + "title": "Site search language: Turkish", + "const": "tr" + }, + { + "title": "Site search language: Vietnamese", + "const": "vi" + } + ] + } + } +} + diff --git a/schema/plugins/social.json b/schema/plugins/social.json new file mode 100755 index 0000000..82a20ce --- /dev/null +++ b/schema/plugins/social.json @@ -0,0 +1,141 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in social plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/", + "const": "social" + }, + { + "type": "object", + "properties": { + "social": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.enabled", + "type": "boolean", + "default": true + }, + "concurrency": { + "title": "Concurrency (number of CPUs)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.concurrency", + "type": "number" + }, + "cache": { + "title": "Enable caching", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cache", + "type": "boolean", + "default": true + }, + "cache_dir": { + "title": "Cache directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cache_dir", + "type": "string", + "default": ".cache/plugins/social" + }, + "cards": { + "title": "Social cards", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards", + "type": "boolean", + "default": true + }, + "cards_dir": { + "title": "Social cards directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_dir", + "type": "string", + "default": "assets/images/social" + }, + "cards_layout_dir": { + "title": "Social cards layout directory", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_layout_dir", + "type": "string", + "default": "layouts" + }, + "cards_layout": { + "title": "Social cards layout", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_layout", + "default": "default", + "oneOf": [ + { + "enum": [ + "default", + "default/accent", + "default/invert", + "default/variant" + ] + }, + { + "type": "string" + } + ] + }, + "cards_layout_options": { + "title": "Social cards layout options", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_layout_options", + "type": "object" + }, + "cards_include": { + "title": "Pages or folders to include", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_include", + "type": "array", + "items": { + "title": "Pages or folders matching this pattern will be included", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_include", + "pattern": ".*" + }, + "uniqueItems": true, + "minItems": 1 + }, + "cards_exclude": { + "title": "Pages or folders to exclude", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_exclude", + "type": "array", + "items": { + "title": "Pages or folders matching this pattern will be excluded", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.cards_exclude", + "pattern": ".*" + }, + "uniqueItems": true, + "minItems": 1 + }, + "debug": { + "title": "Debug mode", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.debug", + "type": "boolean", + "default": true + }, + "debug_on_build": { + "title": "Always disable debug mode on build", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.debug_on_build", + "type": "boolean", + "default": false + }, + "debug_grid": { + "title": "Debug grid", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.debug_grid", + "type": "boolean", + "default": true + }, + "debug_grid_step": { + "title": "Debug grid step size", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.debug_grid_step", + "type": "number", + "default": 32 + }, + "debug_color": { + "title": "Debug color", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/social/#config.debug_color", + "type": "string", + "default": "yellow" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/tags.json b/schema/plugins/tags.json new file mode 100755 index 0000000..0261ba3 --- /dev/null +++ b/schema/plugins/tags.json @@ -0,0 +1,91 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in tags plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/", + "const": "tags" + }, + { + "type": "object", + "properties": { + "tags": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.enabled", + "type": "boolean", + "default": true + }, + "tags_file": { + "title": "Markdown file to render tags index", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_file", + "pattern": "\\.md$", + "default": "tags.md" + }, + "tags_extra_files": { + "title": "Markdown files to render additional tags indexes", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_extra_files", + "type": "object", + "patternProperties": { + "\\.md$": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + } + }, + "additionalProperties": false + }, + "tags_slugify": { + "title": "Tags slugify function", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_slugify", + "default": "!!python/object/apply:pymdownx.slugs.slugify {kwds: {case: lower}}" + }, + "tags_slugify_separator": { + "title": "Tags slugify separator", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_slugify_separator", + "type": "string", + "default": "\"-\"" + }, + "tags_compare": { + "title": "Sort tags by this function", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_compare", + "default": "!!python/name:material.plugins.tags.casefold" + }, + "tags_compare_reverse": { + "title": "Soft tags in reverse", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_compare_reverse", + "default": false + }, + "tags_pages_compare": { + "title": "Sort tags pages by this function", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_pages_compare", + "default": "!!python/name:material.plugins.tags.page_title" + }, + "tags_pages_compare_reverse": { + "title": "Soft tags pages in reverse", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_pages_compare_reverse", + "default": false + }, + "tags_allowed": { + "title": "Tags allowed", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/tags/#config.tags_allowed", + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true, + "default": [] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/plugins/typeset.json b/schema/plugins/typeset.json new file mode 100755 index 0000000..1975da5 --- /dev/null +++ b/schema/plugins/typeset.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Built-in typeset plugin", + "oneOf": [ + { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/typeset/", + "const": "typeset" + }, + { + "type": "object", + "properties": { + "typeset": { + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/typeset/", + "type": "object", + "properties": { + "enabled": { + "title": "Enable plugin", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/plugins/typeset/#config.enabled", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] +} diff --git a/schema/theme.json b/schema/theme.json new file mode 100755 index 0000000..d871a55 --- /dev/null +++ b/schema/theme.json @@ -0,0 +1,825 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Theme configuration", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/", + "type": "object", + "properties": { + "name": { + "title": "Theme name", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#name", + "oneOf": [ + { + "const": "material" + }, + { + "type": "null" + } + ], + "default": "material" + }, + "custom_dir": { + "title": "Directory with theme overrides", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/customization/#setup-and-theme-structure", + "type": "string", + "defaultSnippets": [ + { + "body": "${1:overrides}" + } + ] + }, + "static_templates": { + "title": "Static templates to render", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#static_templates", + "type": "array", + "items": { + "title": "Path to HTML file", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#static_templates", + "pattern": "\\.html$" + }, + "uniqueItems": true, + "minItems": 1 + }, + "language": { + "title": "Site language", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/", + "oneOf": [ + { + "title": "Site language: Custom", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#custom-translations", + "const": "custom" + }, + { + "title": "Site language: Afrikaans", + "const": "af" + }, + { + "title": "Site language: Arabic", + "const": "ar" + }, + { + "title": "Site language: Bulgarian", + "const": "bg" + }, + { + "title": "Site language: Bengali (Bangla)", + "const": "bn" + }, + { + "title": "Site language: Catalan", + "const": "ca" + }, + { + "title": "Site language: Czech", + "const": "cs" + }, + { + "title": "Site language: Danish", + "const": "da" + }, + { + "title": "Site language: German", + "const": "de" + }, + { + "title": "Site language: Greek", + "const": "el" + }, + { + "title": "Site language: English", + "const": "en" + }, + { + "title": "Site language: Esperanto", + "const": "eo" + }, + { + "title": "Site language: Spanish", + "const": "es" + }, + { + "title": "Site language: Estonian", + "const": "et" + }, + { + "title": "Site language: Persian (Farsi)", + "const": "fa" + }, + { + "title": "Site language: Finnish", + "const": "fi" + }, + { + "title": "Site language: French", + "const": "fr" + }, + { + "title": "Site language: Galician", + "const": "gl" + }, + { + "title": "Site language: Hebrew", + "const": "he" + }, + { + "title": "Site language: Hindi", + "const": "hi" + }, + { + "title": "Site language: Croatian", + "const": "hr" + }, + { + "title": "Site language: Hungarian", + "const": "hu" + }, + { + "title": "Site language: Armenian", + "const": "hy" + }, + { + "title": "Site language: Indonesian", + "const": "id" + }, + { + "title": "Site language: Icelandic", + "const": "is" + }, + { + "title": "Site language: Italian", + "const": "it" + }, + { + "title": "Site language: Japanese", + "const": "ja" + }, + { + "title": "Site language: Georgian", + "const": "ka" + }, + { + "title": "Site language: Kannada", + "const": "kn" + }, + { + "title": "Site language: Korean", + "const": "ko" + }, + { + "title": "Site language: Lithuanian", + "const": "lt" + }, + { + "title": "Site language: Latvian", + "const": "lv" + }, + { + "title": "Site language: Macedonian", + "const": "mk" + }, + { + "title": "Site language: Mongolian", + "const": "mn" + }, + { + "title": "Site language: Bahasa Malaysia", + "const": "ms" + }, + { + "title": "Site language: Burmese", + "const": "my" + }, + { + "title": "Site language: Dutch", + "const": "nl" + }, + { + "title": "Site language: Norwegian (Bokmål)", + "const": "nb" + }, + { + "title": "Site language: Norwegian (Nynorsk)", + "const": "nn" + }, + { + "title": "Site language: Polish", + "const": "pl" + }, + { + "title": "Site language: Portuguese", + "const": "pt" + }, + { + "title": "Site language: Portuguese (Brasilian)", + "const": "pt-BR" + }, + { + "title": "Site language: Romanian", + "const": "ro" + }, + { + "title": "Site language: Russian", + "const": "ru" + }, + { + "title": "Site language: Sanskrit", + "const": "sa" + }, + { + "title": "Site language: Serbo-Croatian", + "const": "sh" + }, + { + "title": "Site language: Sinhalese", + "const": "si" + }, + { + "title": "Site language: Slovak", + "const": "sk" + }, + { + "title": "Site language: Slovenian", + "const": "sl" + }, + { + "title": "Site language: Serbian", + "const": "sr" + }, + { + "title": "Site language: Swedish", + "const": "sv" + }, + { + "title": "Site language: Telugu", + "const": "te" + }, + { + "title": "Site language: Thai", + "const": "th" + }, + { + "title": "Site language: Tagalog", + "const": "tl" + }, + { + "title": "Site language: Turkish", + "const": "tr" + }, + { + "title": "Site language: Ukrainian", + "const": "uk" + }, + { + "title": "Site language: Urdu", + "const": "ur" + }, + { + "title": "Site language: Uzbek", + "const": "uz" + }, + { + "title": "Site language: Vietnamese", + "const": "vi" + }, + { + "title": "Site language: Chinese (Simplified)", + "const": "zh" + }, + { + "title": "Site language: Chinese (Traditional)", + "const": "zh-Hant" + }, + { + "title": "Site language: Chinese (Taiwanese)", + "const": "zh-TW" + } + ], + "default": "en" + }, + "direction": { + "title": "Directionality", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#directionality", + "enum": [ + "ltr", + "rtl" + ] + }, + "favicon": { + "title": "Favicon", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-logo-and-icons/#favicon", + "pattern": "\\.(ico|png|svg|jpe?g)$", + "defaultSnippets": [ + { + "body": "${1:path/to/file}.png" + } + ] + }, + "logo": { + "title": "Logo", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-logo-and-icons/#logo", + "pattern": "\\.(png|svg|jpe?g)$", + "defaultSnippets": [ + { + "body": "${1:path/to/file}.png" + } + ] + }, + "icon": { + "title": "Icons", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-logo-and-icons/", + "type": "object", + "properties": { + "edit": { + "$ref": "#/$defs/icon" + }, + "view": { + "$ref": "#/$defs/icon" + }, + "logo": { + "$ref": "#/$defs/icon" + }, + "repo": { + "$ref": "#/$defs/icon" + }, + "admonition": { + "title": "Admonition icon", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/admonitions/#admonition-icons", + "type": "object", + "properties": { + "note": { + "$ref": "#/$defs/icon" + }, + "abstract": { + "$ref": "#/$defs/icon" + }, + "info": { + "$ref": "#/$defs/icon" + }, + "tip": { + "$ref": "#/$defs/icon" + }, + "success": { + "$ref": "#/$defs/icon" + }, + "question": { + "$ref": "#/$defs/icon" + }, + "warning": { + "$ref": "#/$defs/icon" + }, + "failure": { + "$ref": "#/$defs/icon" + }, + "danger": { + "$ref": "#/$defs/icon" + }, + "bug": { + "$ref": "#/$defs/icon" + }, + "example": { + "$ref": "#/$defs/icon" + }, + "quote": { + "$ref": "#/$defs/icon" + } + }, + "additionalProperties": false, + "defaultSnippets": [ + { + "label": "note", + "body": "note: ${1:material/pencil-circle}" + }, + { + "label": "abstract", + "body": "abstract: ${1:material/clipboard-text}" + }, + { + "label": "info", + "body": "info: ${1:material/information}" + }, + { + "label": "tip", + "body": "tip: ${1:material/fire}" + }, + { + "label": "success", + "body": "success: ${1:material/check}" + }, + { + "label": "question", + "body": "question: ${1:material/help-circle}" + }, + { + "label": "warning", + "body": "warning: ${1:material/alert}" + }, + { + "label": "failure", + "body": "failure: ${1:material/close}" + }, + { + "label": "danger", + "body": "danger: ${1:material/lightning-bolt-circle}" + }, + { + "label": "bug", + "body": "bug: ${1:material/shield-bug}" + }, + { + "label": "example", + "body": "example: ${1:material/test-tube}" + }, + { + "label": "quote", + "body": "quote: ${1:material/format-quote-close}" + } + ] + }, + "tag": { + "title": "Tag icon", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-tags/#tag-icons-and-identifiers", + "type": "object", + "patternProperties": { + "^[\\w-]+$": { + "$ref": "#/$defs/icon" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "defaultSnippets": [ + { + "label": "edit", + "body": "edit: ${1:material/pencil}" + }, + { + "label": "logo", + "body": "logo: ${1:material/library}" + }, + { + "label": "repo", + "body": "repo: ${1:fontawesome/brands/git-alt}" + } + ] + }, + "features": { + "title": "Feature flags", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/", + "type": "array", + "items": { + "oneOf": [ + { + "title": "Mark as read", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-header/#mark-as-read", + "const": "announce.dismiss" + }, + { + "title": "Edit this page", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#code-actions", + "const": "content.action.edit" + }, + { + "title": "View source of this page", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/adding-a-git-repository/#code-actions", + "const": "content.action.view" + }, + { + "title": "Code annotations", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/code-blocks/#code-annotations", + "const": "content.code.annotate" + }, + { + "title": "Code copy button", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/code-blocks/#code-copy-button", + "const": "content.code.copy" + }, + { + "title": "Code selection button", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/code-blocks/#code-selection-button", + "const": "content.code.select" + }, + { + "title": "Linked content tabs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/content-tabs/#linked-content-tabs", + "const": "content.tabs.link" + }, + { + "title": "Improved tooltips", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/reference/tooltips/#improved-tooltips", + "const": "content.tooltips" + }, + { + "title": "Header hides automatically when scrolling", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-header/#automatic-hiding", + "const": "header.autohide" + }, + { + "title": "Navigation expansion", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-expansion", + "const": "navigation.expand" + }, + { + "title": "Navigation footer", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-footer", + "const": "navigation.footer" + }, + { + "title": "Section index pages", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#section-index-pages", + "const": "navigation.indexes" + }, + { + "title": "Instant loading", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#instant-loading", + "const": "navigation.instant" + }, + { + "title": "Instant prefetching", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#instant-prefetching", + "const": "navigation.instant.prefetch" + }, + { + "title": "Progress indicator", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#progress-indicator", + "const": "navigation.instant.progress" + }, + { + "title": "Navigation path (Breadcrumbs)", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-path", + "const": "navigation.path" + }, + { + "title": "Navigation pruning", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-pruning", + "const": "navigation.prune" + }, + { + "title": "Navigation sections", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-sections", + "const": "navigation.sections" + }, + { + "title": "Navigation tabs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-tabs", + "const": "navigation.tabs" + }, + { + "title": "Sticky navigation tabs", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#sticky-navigation-tabs", + "const": "navigation.tabs.sticky" + }, + { + "title": "Back-to-top button", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#back-to-top-button", + "const": "navigation.top" + }, + { + "title": "Anchor tracking", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#anchor-tracking", + "const": "navigation.tracking" + }, + { + "title": "Search higlighting", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#search-highlighting", + "const": "search.highlight" + }, + { + "title": "Search sharing", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#search-sharing", + "const": "search.share" + }, + { + "title": "Search suggestions", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-search/#search-suggestions", + "const": "search.suggest" + }, + { + "title": "Integrated table of contents", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#anchor-following", + "const": "toc.follow" + }, + { + "title": "Integrated table of contents", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-integration", + "const": "toc.integrate" + } + ] + }, + "uniqueItems": true, + "minItems": 1 + }, + "palette": { + "oneOf": [ + { + "title": "Color palette", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/", + "type": "object", + "properties": { + "scheme": { + "$ref": "#/$defs/scheme" + }, + "primary": { + "$ref": "#/$defs/primary" + }, + "accent": { + "$ref": "#/$defs/accent" + } + }, + "additionalProperties": false + }, + { + "title": "Color palette", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/", + "type": "array", + "items": { + "type": "object", + "properties": { + "scheme": { + "$ref": "#/$defs/scheme" + }, + "primary": { + "$ref": "#/$defs/primary" + }, + "accent": { + "$ref": "#/$defs/accent" + }, + "media": { + "oneOf": [ + { + "title": "System preference", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#system-preference", + "type": "string", + "enum": [ + "\"(prefers-color-scheme: light)\"", + "\"(prefers-color-scheme: dark)\"" + ] + }, + { + "type": "string" + } + ], + "defaultSnippets": [ + { + "label": "\"(prefers-color-scheme: light)\"", + "body": "\"(prefers-color-scheme: ${1:light})\"" + } + ] + }, + "toggle": { + "title": "Color palette toggle", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#color-palette-toggle", + "properties": { + "icon": { + "$ref": "#/$defs/icon" + }, + "name": { + "title": "Color palette toggle name", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#toggle-name", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "icon", + "name" + ] + } + }, + "additionalProperties": false, + "required": [ + "toggle" + ] + }, + "uniqueItems": true, + "minItems": 1 + } + ], + "default": { + "scheme": "default", + "primary": "indigo", + "accent": "indigo" + } + }, + "font": { + "oneOf": [ + { + "title": "Google Fonts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-fonts/", + "type": "object", + "properties": { + "text": { + "$ref": "assets/fonts.json" + }, + "code": { + "$ref": "assets/fonts.json" + } + }, + "additionalProperties": false + }, + { + "title": "Disable Google Fonts", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-fonts/#autoloading", + "enum": [ + false + ] + } + ], + "defaultSnippets": [ + { + "body": { + "text": "${1:Roboto}", + "code": "${2:Roboto Mono}" + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "name" + ], + "$defs": { + "scheme": { + "title": "Color scheme", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#color-scheme", + "anyOf": [ + { + "enum": [ + "default", + "slate" + ] + }, + { + "type": "string" + } + ] + }, + "primary": { + "title": "Primary color", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#primary-color", + "enum": [ + "red", + "pink", + "purple", + "deep purple", + "indigo", + "blue", + "light blue", + "cyan", + "teal", + "green", + "light green", + "lime", + "yellow", + "amber", + "orange", + "deep orange", + "brown", + "grey", + "blue grey", + "black", + "white", + "custom" + ] + }, + "accent": { + "title": "Accent color", + "markdownDescription": "https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#accent-color", + "enum": [ + "red", + "pink", + "purple", + "deep purple", + "indigo", + "blue", + "light blue", + "cyan", + "teal", + "green", + "light green", + "lime", + "yellow", + "amber", + "orange", + "deep orange", + "brown", + "grey", + "blue grey", + "black", + "white", + "custom" + ] + }, + "icon": { + "anyOf": [ + { + "$ref": "assets/icons.json" + }, + { + "title": "Unknown icon", + "type": "string" + } + ] + } + } +} diff --git a/schema/validation.json b/schema/validation.json new file mode 100755 index 0000000..a153e6d --- /dev/null +++ b/schema/validation.json @@ -0,0 +1,54 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Validation settings", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#validation", + "type": "object", + "properties": { + "omitted_files": { "$ref": "#/$defs/omitted_files" }, + "not_found": { "$ref": "#/$defs/not_found" }, + "absolute_links": { "$ref": "#/$defs/absolute_links" }, + "unrecognized_links": { "$ref": "#/$defs/unrecognized_links" }, + "nav": { + "title": "validation of navigation", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#validation", + "properties": { + "omitted_files": { "$ref": "#/$defs/omitted_files" }, + "not_found": { "$ref": "#/$defs/not_found" }, + "absolute_links": { "$ref": "#/$defs/absolute_links" } + }, + "additionalProperties": false + }, + "links": { + "title": "Validation of links", + "markdownDescription": "https://www.mkdocs.org/user-guide/configuration/#validation", + "properties": { + "not_found": { "$ref": "#/$defs/not_found" }, + "absolute_links": { "$ref": "#/$defs/absolute_links" }, + "unrecognized_links": { "$ref": "#/$defs/unrecognized_links" } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "$defs": { + "omitted_files": { + "title": "warning level when files exist but are not referenced in navigation", + "$ref": "#/$defs/warning_levels" + }, + "not_found": { + "title": "warning level when file referenced is not found or is excluded", + "$ref": "#/$defs/warning_levels" + }, + "absolute_links": { + "title": "warning level when absolute links are used", + "$ref": "#/$defs/warning_levels" + }, + "unrecognized_links": { + "title": "warning level when a relative link cannot be resolved to a document", + "$ref": "#/$defs/warning_levels" + }, + "warning_levels": { + "enum": ["warn", "info", "ignore"] + } + } +} diff --git a/setup/adding-a-comment-system/index.html b/setup/adding-a-comment-system/index.html new file mode 100755 index 0000000..935c05b --- /dev/null +++ b/setup/adding-a-comment-system/index.html @@ -0,0 +1,73 @@ + Adding a comment system - 一抹雨烟

            Adding a comment system

            Material for MkDocs allows to easily add the third-party comment system of your choice to the footer of any page by using theme extension. As an example, we'll be integrating Giscus, which is Open Source, free, and uses GitHub discussions as a backend.

            Customization

            Giscus integration

            Before you can use Giscus, you need to complete the following steps:

            1. Install the Giscus GitHub App and grant access to the repository that should host comments as GitHub discussions. Note that this can be a repository different from your documentation.
            2. Visit Giscus and generate the snippet through their configuration tool to load the comment system. Copy the snippet for the next step. The resulting snippet should look similar to this:

              <script
              +  src="https://giscus.app/client.js"
              +  data-repo="<username>/<repository>"
              +  data-repo-id="..."
              +  data-category="..."
              +  data-category-id="..."
              +  data-mapping="pathname"
              +  data-reactions-enabled="1"
              +  data-emit-metadata="1"
              +  data-theme="light"
              +  data-lang="en"
              +  crossorigin="anonymous"
              +  async
              +>
              +</script>
              +

            The comments.html partial (empty by default) is the best place to add the snippet generated by Giscus. Follow the guide on theme extension and override the comments.html partial with:

            {% if page.meta.comments %}
            +  <h2 id="__comments">{{ lang.t("meta.comments") }}</h2>
            +  <!-- Insert generated snippet here -->
            +
            +  <!-- Synchronize Giscus theme with palette -->
            +  <script>
            +    var giscus = document.querySelector("script[src*=giscus]")
            +
            +    // Set palette on initial load
            +    var palette = __md_get("__palette")
            +    if (palette && typeof palette.color === "object") {
            +      var theme = palette.color.scheme === "slate"
            +        ? "transparent_dark"
            +        : "light"
            +
            +      // Instruct Giscus to set theme
            +      giscus.setAttribute("data-theme", theme) // (1)!
            +    }
            +
            +    // Register event handlers after documented loaded
            +    document.addEventListener("DOMContentLoaded", function() {
            +      var ref = document.querySelector("[data-md-component=palette]")
            +      ref.addEventListener("change", function() {
            +        var palette = __md_get("__palette")
            +        if (palette && typeof palette.color === "object") {
            +          var theme = palette.color.scheme === "slate"
            +            ? "transparent_dark"
            +            : "light"
            +
            +          // Instruct Giscus to change theme
            +          var frame = document.querySelector(".giscus-frame")
            +          frame.contentWindow.postMessage(
            +            { giscus: { setConfig: { theme } } },
            +            "https://giscus.app"
            +          )
            +        }
            +      })
            +    })
            +  </script>
            +{% endif %}
            +
            1. This code block ensures that Giscus renders with a dark theme when the palette is set to slate. Note that multiple dark themes are available, so you can change it to your liking.

            Replace the highlighted line with the snippet you generated with the Giscus configuration tool in the previous step. If you copied the snippet from above, you can enable comments on a page by setting the comments front matter property to true:

            ---
            +comments: true
            +---
            +
            +# Page title
            +...
            +

            If you wish to enable comments for an entire folder, you can use the built-in meta plugin.

            \ No newline at end of file diff --git a/setup/adding-a-git-repository/index.html b/setup/adding-a-git-repository/index.html new file mode 100755 index 0000000..dc670cd --- /dev/null +++ b/setup/adding-a-git-repository/index.html @@ -0,0 +1,61 @@ + Adding a git repository - 一抹雨烟

            Adding a git repository

            If your documentation is related to source code, Material for MkDocs provides the ability to display information to the project's repository as part of the static site, including stars and forks. Furthermore, the date of last update and creation, as well as contributors can be shown.

            Configuration

            Repository

            0.1.0

            In order to display a link to the repository of your project as part of your documentation, set repo_url in mkdocs.yml to the public URL of your repository, e.g.:

            repo_url: https://github.com/squidfunk/mkdocs-material
            +

            The link to the repository will be rendered next to the search bar on big screens and as part of the main navigation drawer on smaller screen sizes. Additionally, for public repositories hosted on GitHub or GitLab, the number of stars and forks is automatically requested and rendered.

            GitHub repositories also include the tag of the latest release.1

            Repository name

            0.1.0 automatically set to GitHub, GitLab or Bitbucket

            MkDocs will infer the source provider by examining the URL and try to set the repository name automatically. If you wish to customize the name, set repo_name in mkdocs.yml:

            repo_name: squidfunk/mkdocs-material
            +

            Repository icon

            5.0.0

            While the default repository icon is a generic git icon, it can be set to any icon bundled with the theme by referencing a valid icon path in mkdocs.yml:

            theme:
            +  icon:
            +    repo: fontawesome/brands/git-alt # (1)!
            +
            1. Enter a few keywords to find the perfect icon using our icon search and click on the shortcode to copy it to your clipboard:

              Some popular choices:

              • fontawesome/brands/git
              • fontawesome/brands/git-alt
              • fontawesome/brands/github
              • fontawesome/brands/github-alt
              • fontawesome/brands/gitlab
              • fontawesome/brands/gitkraken
              • fontawesome/brands/bitbucket
              • fontawesome/solid/trash

              Code actions

              9.0.0

              If the repository URL points to a valid GitHub, GitLab or Bitbucket repository, MkDocs provides a setting called edit_uri, which resolves to the subfolder where your documentation is hosted.

              If your default branch is called main, change the setting to:

              edit_uri: edit/main/docs/
              +

              After making sure that edit_uri is correctly configured, buttons for code actions can be added. Two types of code actions are supported: edit and view (GitHub only):

              theme:
              +  features:
              +    - content.action.edit
              +
              theme:
              +  features:
              +    - content.action.view
              +

              The icon of the edit and view buttons can be changed with the following lines:

              theme:
              +  icon:
              +    edit: material/pencil # (1)!
              +    view: material/eye
              +
              1. Enter a few keywords to find the perfect icon using our icon search and click on the shortcode to copy it to your clipboard:

                Revisioning

                The following plugins are fully integrated with Material for MkDocs, allowing for showing the date of last update and creation of a document, as well as links to all contributors or authors involved.

                Document dates

                4.6.0 git-revision-date-localized

                The git-revision-date-localized plugin adds support for adding the date of last update and creation of a document at the bottom of each page. Install it with pip:

                pip install mkdocs-git-revision-date-localized-plugin
                +

                Then, add the following lines to mkdocs.yml:

                plugins:
                +  - git-revision-date-localized:
                +      enable_creation_date: true
                +

                The following configuration options are supported:

                enabled

                true This option specifies whether the plugin is enabled when building your project. If you want to switch the plugin off, e.g. for local builds, use an environment variable:

                plugins:
                +  - git-revision-date-localized:
                +      enabled: !ENV [CI, false]
                +
                type

                date The format of the date to be displayed. Valid values are date, datetime, iso_date, iso_datetime and timeago:

                plugins:
                +  - git-revision-date-localized:
                +      type: date
                +
                enable_creation_date

                false Enables the display of the creation date of the file associated with the page next to the last updated date at the bottom of the page:

                plugins:
                +  - git-revision-date-localized:
                +      enable_creation_date: true
                +

                When using build environments

                If you are deploying through a CI system, you might need to adjust your CI settings when fetching the code. For more information, see git-revision-date-localized.

                fallback_to_build_date

                false Enables falling back to the time when mkdocs build was executed. Can be used as a fallback when the build is performed outside of a git repository:

                plugins:
                +  - git-revision-date-localized:
                +      fallback_to_build_date: true
                +

                The other configuration options of this extension are not officially supported by Material for MkDocs, which is why they may yield unexpected results. Use them at your own risk.

                Document contributors

                insiders-4.19.0 git-committers

                The git-committers2 plugin renders the GitHub avatars of all contributors, linking to their GitHub profiles at the bottom of each page. As always, it can be installed with pip:

                pip install mkdocs-git-committers-plugin-2
                +

                Then, add the following lines to mkdocs.yml:

                plugins:
                +  - git-committers:
                +      repository: squidfunk/mkdocs-material
                +      branch: main
                +

                The following configuration options are supported:

                enabled

                true This option specifies whether the plugin is enabled when building your project. If you want to switch the plugin off, e.g. for local builds, use an environment variable:

                plugins:
                +  - git-committers:
                +      enabled: !ENV [CI, false]
                +
                repository

                This property must be set to the slug of the repository that contains your documentation. The slug must follow the pattern <username>/<repository>:

                plugins:
                +  - git-committers:
                +      repository: squidfunk/mkdocs-material
                +
                branch

                master This property should be set to the branch of the repository from which to retrieve the contributors. To use the main branch:

                plugins:
                +  - git-committers:
                +      branch: main
                +

                The other configuration options of this extension are not officially supported by Material for MkDocs, which is why they may yield unexpected results. Use them at your own risk.

                Document authors

                insiders-4.19.0 git-authors

                The git-authors plugin is a lightweight alternative to the git-committers plugin and extracts the authors of a document from git to display them at the bottom of each page.

                Insiders offers deep integration for git-authors. This means the customized overrides are not necessary, and additional styling (such as nice icons) are added. Simply install it with pip:

                pip install mkdocs-git-authors-plugin
                +

                Then, add the following lines to mkdocs.yml:

                plugins:
                +  - git-authors
                +

                1. Unfortunately, GitHub only provides an API endpoint to obtain the latest release - not the latest tag. Thus, make sure to create a release (not pre-release) for the latest tag you want to display next to the number of stars and forks. 

                2. We currently recommend using a fork of the git-committers plugin, as it contains many improvements that have not yet been merged back into the original plugin. See byrnereese/mkdocs-git-committers-plugin#12 for more information. 

                \ No newline at end of file diff --git a/setup/building-an-optimized-site/index.html b/setup/building-an-optimized-site/index.html new file mode 100755 index 0000000..77fbcce --- /dev/null +++ b/setup/building-an-optimized-site/index.html @@ -0,0 +1,16 @@ + Building an optimized site - 一抹雨烟

                Building an optimized site

                Material for MkDocs, by default, allows to build optimized sites that rank great on search engines, load fast (even on slow networks), and work perfectly without JavaScript. Additionally, the built-in optimize plugin adds support for further useful automatic optimization techniques.

                Configuration

                Built-in projects plugin

                insiders-4.38.0 projects – built-in

                The built-in projects plugin allows to split your documentation into multiple distinct MkDocs projects, build them concurrently and serve them together. Add the following to mkdocs.yml:

                plugins:
                +  - projects
                +

                For a list of all settings, please consult the plugin documentation.

                Use cases for the projects plugin

                Ideal use cases for the projects plugin are:

                • Building a multi-language site
                • Building a blog alongside your documentation
                • Splitting large code bases for better performance

                Note that the plugin is currently experimental. We're releasing it early, so that we can improve it together with our users and make it even more powerful as we discover new use cases.

                Built-in optimize plugin

                insiders-4.29.0 optimize – built-in

                The built-in optimize plugin automatically identifies and optimizes all media files as part of the build using compression and conversion techniques. Add the following lines to mkdocs.yml:

                plugins:
                +  - optimize
                +

                For a list of all settings, please consult the plugin documentation.

                \ No newline at end of file diff --git a/setup/building-for-offline-usage/index.html b/setup/building-for-offline-usage/index.html new file mode 100755 index 0000000..94cfb29 --- /dev/null +++ b/setup/building-for-offline-usage/index.html @@ -0,0 +1,14 @@ + Building for offline usage - 一抹雨烟

                Building for offline usage

                If you want to ship your documentation together with your product, MkDocs has you covered – with support from themes, MkDocs allows for building offline-capable documentation. Notably, Material for MkDocs offers offline support for many of its features.

                Configuration

                Built-in offline plugin

                9.0.0 offline – built-in

                The built-in offline plugin makes sure that the site search works when you distribute the contents of your site directory as a download. Simply add the following lines to mkdocs.yml:

                plugins:
                +  - offline
                +

                For a list of all settings, please consult the plugin documentation.

                Automatically bundle all external assets

                The built-in privacy plugin makes it easy to use external assets while building documentation for offline usage, as it will automatically download all external assets to distribute them with your documentation.

                Limitations

                Material for MkDocs offers many interactive features, some of which will not work from the file system due to the restrictions of modern browsers: all features that use the fetch API will error.

                Thus, when building for offline usage, make sure to disable the following configuration settings: instant loading, site analytics, git repository, versioning and comment systems.

                \ No newline at end of file diff --git a/setup/changing-the-colors/index.html b/setup/changing-the-colors/index.html new file mode 100755 index 0000000..5c3f14d --- /dev/null +++ b/setup/changing-the-colors/index.html @@ -0,0 +1,135 @@ + Changing the colors - 一抹雨烟

                Changing the colors

                As any proper Material Design implementation, Material for MkDocs supports Google's original color palette, which can be easily configured through mkdocs.yml. Furthermore, colors can be customized with a few lines of CSS to fit your brand's identity by using CSS variables.

                Configuration

                Color palette

                Color scheme

                5.2.0 default

                Material for MkDocs supports two color schemes: a light mode, which is just called default, and a dark mode, which is called slate. The color scheme can be set via mkdocs.yml:

                theme:
                +  palette:
                +    scheme: default
                +

                Click on a tile to change the color scheme:

                Primary color

                0.2.0 indigo

                The primary color is used for the header, the sidebar, text links and several other components. In order to change the primary color, set the following value in mkdocs.yml to a valid color name:

                theme:
                +  palette:
                +    primary: indigo
                +

                Click on a tile to change the primary color:

                See our guide below to learn how to set custom colors.

                Accent color

                0.2.0 indigo

                The accent color is used to denote elements that can be interacted with, e.g. hovered links, buttons and scrollbars. It can be changed in mkdocs.yml by choosing a valid color name:

                theme:
                +  palette:
                +    accent: indigo
                +

                Click on a tile to change the accent color:

                See our guide below to learn how to set custom colors.

                Color palette toggle

                7.1.0 .zip

                Offering a light and dark color palette makes your documentation pleasant to read at different times of the day, so the user can choose accordingly. Add the following lines to mkdocs.yml:

                theme:
                +  palette: # (1)!
                +
                +    # Palette toggle for light mode
                +    - scheme: default
                +      toggle:
                +        icon: material/brightness-7 # (2)!
                +        name: Switch to dark mode
                +
                +    # Palette toggle for dark mode
                +    - scheme: slate
                +      toggle:
                +        icon: material/brightness-4
                +        name: Switch to light mode
                +
                1. Note that the theme.palette setting is now defined as a list.

                2. Enter a few keywords to find the perfect icon using our icon search and click on the shortcode to copy it to your clipboard:

                  This configuration will render a color palette toggle next to the search bar. Note that you can also define separate settings for primary and accent per color palette.

                  The following properties must be set for each toggle:

                  icon

                  This property must point to a valid icon path referencing any icon bundled with the theme, or the build will not succeed. Some popular combinations:

                  • + material/brightness-7 + material/brightness-4
                  • + material/toggle-switch + material/toggle-switch-off-outline
                  • + material/weather-night + material/weather-sunny
                  • + material/eye + material/eye-outline
                  • + material/lightbulb + material/lightbulb-outline
                  name

                  This property is used as the toggle's title attribute and should be set to a discernable name to improve accessibility. It's rendered as a tooltip.

                  System preference

                  7.1.0 .zip

                  Each color palette can be linked to the user's system preference for light and dark appearance by using a media query. Simply add a media property next to the scheme definition in mkdocs.yml:

                  theme:
                  +  palette:
                  +
                  +    # Palette toggle for light mode
                  +    - media: "(prefers-color-scheme: light)"
                  +      scheme: default
                  +      toggle:
                  +        icon: material/brightness-7
                  +        name: Switch to dark mode
                  +
                  +    # Palette toggle for dark mode
                  +    - media: "(prefers-color-scheme: dark)"
                  +      scheme: slate
                  +      toggle:
                  +        icon: material/brightness-4
                  +        name: Switch to light mode
                  +

                  When the user first visits your site, the media queries are evaluated in the order of their definition. The first media query that matches selects the default color palette.

                  Automatic light / dark mode

                  insiders-4.18.0 .zip

                  Newer operating systems allow to automatically switch between light and dark appearance during day and night times. Insiders adds support for automatic light / dark mode, delegating color palette selection to the user's operating system. Add the following lines to mkdocs.yml:

                  theme:
                  +  palette:
                  +
                  +    # Palette toggle for automatic mode
                  +    - media: "(prefers-color-scheme)"
                  +      toggle:
                  +        icon: material/brightness-auto
                  +        name: Switch to light mode
                  +
                  +    # Palette toggle for light mode
                  +    - media: "(prefers-color-scheme: light)"
                  +      scheme: default # (1)!
                  +      toggle:
                  +        icon: material/brightness-7
                  +        name: Switch to dark mode
                  +
                  +    # Palette toggle for dark mode
                  +    - media: "(prefers-color-scheme: dark)"
                  +      scheme: slate
                  +      toggle:
                  +        icon: material/brightness-4
                  +        name: Switch to system preference
                  +
                  1. You can also define separate settings for primary and accent per color palette, i.e. different colors for light and dark mode.

                  Material for MkDocs will now change the color palette each time the operating system switches between light and dark appearance, even when the user doesn't reload the site.

                  Customization

                  Custom colors

                  5.0.0 .zip

                  Material for MkDocs implements colors using CSS variables (custom properties). If you want to customize the colors beyond the palette (e.g. to use your brand-specific colors), you can add an additional style sheet and tweak the values of the CSS variables.

                  First, set the primary or accent values in mkdocs.yml to custom, to signal to the theme that you want to define custom colors, e.g., when you want to override the primary color:

                  theme:
                  +  palette:
                  +    primary: custom
                  +

                  Let's say you're YouTube, and want to set the primary color to your brand's palette. Just add:

                  :root {
                  +  --md-primary-fg-color:        #EE0F0F;
                  +  --md-primary-fg-color--light: #ECB7B7;
                  +  --md-primary-fg-color--dark:  #90030C;
                  +}
                  +
                  extra_css:
                  +  - stylesheets/extra.css
                  +

                  See the file containing the color definitions for a list of all CSS variables.

                  Custom color schemes

                  Besides overriding specific colors, you can create your own, named color scheme by wrapping the definitions in a [data-md-color-scheme="..."] attribute selector, which you can then set via mkdocs.yml as described in the color schemes section:

                  [data-md-color-scheme="youtube"] {
                  +  --md-primary-fg-color:        #EE0F0F;
                  +  --md-primary-fg-color--light: #ECB7B7;
                  +  --md-primary-fg-color--dark:  #90030C;
                  +}
                  +
                  theme:
                  +  palette:
                  +    scheme: youtube
                  +extra_css:
                  +  - stylesheets/extra.css
                  +

                  Additionally, the slate color scheme defines all of it's colors via hsla color functions and deduces its colors from the --md-hue CSS variable. You can tune the slate theme with:

                  [data-md-color-scheme="slate"] {
                  +  --md-hue: 210; /* (1)! */
                  +}
                  +
                  1. The hue value must be in the range of [0, 360]
                  \ No newline at end of file diff --git a/setup/changing-the-fonts/index.html b/setup/changing-the-fonts/index.html new file mode 100755 index 0000000..b47a735 --- /dev/null +++ b/setup/changing-the-fonts/index.html @@ -0,0 +1,32 @@ + Changing the fonts - 一抹雨烟

                  Changing the fonts

                  Material for MkDocs makes it easy to change the typeface of your project documentation, as it directly integrates with Google Fonts. Alternatively, fonts can be custom-loaded if self-hosting is preferred for data privacy reasons or another destination should be used.

                  Configuration

                  Regular font

                  0.1.2 Roboto

                  The regular font is used for all body copy, headlines, and essentially everything that does not need to be monospaced. It can be set to any valid Google Font via mkdocs.yml:

                  theme:
                  +  font:
                  +    text: Roboto
                  +

                  The typeface will be loaded in 300, 400, 400i and 700.

                  Monospaced font

                  0.1.2 Roboto Mono

                  The monospaced font is used for code blocks and can be configured separately. Just like the regular font, it can be set to any valid Google Font via mkdocs.yml:

                  theme:
                  +  font:
                  +    code: Roboto Mono
                  +

                  The typeface will be loaded in 400.

                  Autoloading

                  1.0.0

                  If you want to prevent typefaces from being loaded from Google Fonts, e.g. to adhere to data privacy regulations, and fall back to system fonts, add the following lines to mkdocs.yml:

                  theme:
                  +  font: false
                  +

                  Automatically bundle Google Fonts

                  The built-in privacy plugin makes it easy to use Google Fonts while complying with the General Data Protection Regulation (GDPR), by automatically downloading and self-hosting the web font files.

                  Customization

                  Additional fonts

                  If you want to load an (additional) font from another destination or override the system font, you can use an additional style sheet to add the corresponding @font-face definition:

                  @font-face {
                  +  font-family: "<font>";
                  +  src: "...";
                  +}
                  +
                  extra_css:
                  +  - stylesheets/extra.css
                  +

                  The font can then be applied to specific elements, e.g. only headlines, or globally to be used as the site-wide regular or monospaced font:

                  :root {
                  +  --md-text-font: "<font>"; /* (1)! */
                  +}
                  +
                  1. Always define fonts through CSS variables and not font-family, as this would disable the system font fallback.
                  :root {
                  +  --md-code-font: "<font>";
                  +}
                  +
                  \ No newline at end of file diff --git a/setup/changing-the-language/index.html b/setup/changing-the-language/index.html new file mode 100755 index 0000000..cf0d6b0 --- /dev/null +++ b/setup/changing-the-language/index.html @@ -0,0 +1,50 @@ + Changing the language - 一抹雨烟

                  Changing the language

                  Material for MkDocs supports internationalization (i18n) and provides translations for template variables and labels in 60+ languages. Additionally, the site search can be configured to use a language-specific stemmer, if available.

                  Configuration

                  Site language

                  1.12.0 en

                  You can set the site language in mkdocs.yml with:

                  theme:
                  +  language: en # (1)!
                  +
                  1. HTML5 only allows to set a single language per document, which is why Material for MkDocs only supports setting a canonical language for the entire project, i.e. one per mkdocs.yml.

                    The easiest way to build a multi-language documentation is to create one project in a subfolder per language, and then use the language selector to interlink those projects.

                  The following languages are supported:

                  1. 🇿🇦 Afrikaans af Complete
                  2. 🇦🇪 Arabic ar Complete
                  3. 🇦🇲 Armenian hy Complete
                  4. 🇲🇾 Bahasa Malaysia ms 21 translations missing
                  5. 🇪🇸 Basque eu Complete
                  6. 🇧🇾 Belarusian be Complete
                  7. 🇧🇩 Bengali (Bangla) bn Complete
                  8. 🇧🇬 Bulgarian bg Complete
                  9. 🇪🇸 Catalan ca Complete
                  10. 🇨🇳 Chinese (Simplified) zh Complete
                  11. 🇹🇼 Chinese (Taiwanese) zh-TW Complete
                  12. 🇨🇳 Chinese (Traditional) zh-Hant Complete
                  13. 🇭🇷 Croatian hr Complete
                  14. 🇨🇿 Czech cs Complete
                  15. 🇩🇰 Danish da Complete
                  16. 🇳🇱 Dutch nl Complete
                  17. 🇺🇸 English en Complete
                  18. 🇫🇷 French fr Complete
                  19. 🇩🇪 German de Complete
                  20. 🇮🇱 Hebrew he Complete
                  21. 🇮🇳 Hindi hi Complete
                  22. 🇭🇺 Hungarian hu Complete
                  23. 🇮🇸 Icelandic is Complete
                  24. 🇮🇩 Indonesian id Complete
                  25. 🇮🇹 Italian it Complete
                  26. 🇯🇵 Japanese ja Complete
                  27. 🇮🇳 Kannada kn Complete
                  28. 🇰🇷 Korean ko Complete
                  29. 🇮🇶 Kurdish (Soranî) ku-IQ 13 translations missing
                  30. 🇱🇹 Lithuanian lt Complete
                  31. 🇱🇺 Luxembourgish lb Complete
                  32. 🇳🇴 Norwegian Bokmål nb Complete
                  33. 🇳🇴 Norwegian Nynorsk nn Complete
                  34. 🇮🇷 Persian (Farsi) fa Complete
                  35. 🇵🇱 Polish pl Complete
                  36. 🇵🇹 Portuguese pt Complete
                  37. 🇧🇷 Portuguese (Brasilian) pt-BR Complete
                  38. 🇷🇴 Romanian ro Complete
                  39. 🇷🇺 Russian ru Complete
                  40. 🇮🇳 Sanskrit sa Complete
                  41. 🇷🇸 Serbo-Croatian sh 5 translations missing
                  42. 🇸🇮 Slovenian sl Complete
                  43. 🇪🇸 Spanish es Complete
                  44. 🇸🇪 Swedish sv Complete
                  45. 🇮🇳 Telugu te Complete
                  46. 🇹🇭 Thai th Complete
                  47. 🇹🇷 Turkish tr Complete
                  48. 🇺🇦 Ukrainian uk Complete
                  49. 🇵🇰 Urdu ur Complete
                  50. 🇺🇿 Uzbek uz Complete
                  51. 🇻🇳 Vietnamese vi Complete

                  Note that some languages will produce unreadable anchor links due to the way the default slug function works. Consider using a Unicode-aware slug function.

                  Translations missing? Help us out, it takes only 5 minutes

                  Material for MkDocs relies on outside contributions for adding and updating translations for the more than 60 languages it supports. If your language shows that some translations are missing, click on the link to add them. If your language is not in the list, click here to add a new language.

                  Site language selector

                  7.0.0

                  If your documentation is available in multiple languages, a language selector pointing to those languages can be added to the header. Alternate languages can be defined via mkdocs.yml.

                  extra:
                  +  alternate:
                  +    - name: English
                  +      link: /en/ # (1)!
                  +      lang: en
                  +    - name: Deutsch
                  +      link: /de/
                  +      lang: de
                  +
                  1. Note that this must be an absolute link. If it includes a domain part, it's used as defined. Otherwise the domain part of the site_url as set in mkdocs.yml is prepended to the link.

                  The following properties are available for each alternate language:

                  name

                  This value of this property is used inside the language selector as the name of the language and must be set to a non-empty string.

                  link

                  This property must be set to an absolute link, which might also point to another domain or subdomain not necessarily generated with MkDocs.

                  lang

                  This property must contain an ISO 639-1 language code and is used for the hreflang attribute of the link, improving discoverability via search engines.

                  Language selector preview

                  Directionality

                  2.5.0

                  While many languages are read ltr (left-to-right), Material for MkDocs also supports rtl (right-to-left) directionality which is deduced from the selected language, but can also be set with:

                  theme:
                  +  direction: ltr
                  +

                  Click on a tile to change the directionality:

                  Customization

                  Custom translations

                  If you want to customize some of the translations for a language, just follow the guide on theme extension and create a new partial in the overrides folder. Then, import the translations of the language as a fallback and only adjust the ones you want to override:

                  <!-- Import translations for language and fallback -->
                  +{% import "partials/languages/de.html" as language %}
                  +{% import "partials/languages/en.html" as fallback %} <!-- (1)! -->
                  +
                  +<!-- Define custom translations -->
                  +{% macro override(key) %}{{ {
                  +  "source.file.date.created": "Erstellt am", <!-- (2)! -->
                  +  "source.file.date.updated": "Aktualisiert am"
                  +}[key] }}{% endmacro %}
                  +
                  +<!-- Re-export translations -->
                  +{% macro t(key) %}{{
                  +  override(key) or language.t(key) or fallback.t(key)
                  +}}{% endmacro %}
                  +
                  1. Note that en must always be used as a fallback language, as it's the default theme language.

                  2. Check the list of available languages, pick the translation you want to override for your language and add them here.

                  theme:
                  +  language: custom
                  +
                  \ No newline at end of file diff --git a/setup/changing-the-logo-and-icons/index.html b/setup/changing-the-logo-and-icons/index.html new file mode 100755 index 0000000..fd6c62d --- /dev/null +++ b/setup/changing-the-logo-and-icons/index.html @@ -0,0 +1,42 @@ + Changing the logo and icons - 一抹雨烟

                  Changing the logo and icons

                  When installing Material for MkDocs, you immediately get access to over 8,000 icons ready to be used for customization of specific parts of the theme and/or when writing your documentation in Markdown. Not enough? You can also add additional icons with minimal effort.

                  Configuration

                  0.1.0 material/library

                  The logo can be changed to a user-provided image (any type, incl. *.png and *.svg) located in the docs folder, or to any icon bundled with the theme. Add the following lines to mkdocs.yml:

                  theme:
                  +  logo: assets/logo.png
                  +
                  theme:
                  +  icon:
                  +    logo: material/library # (1)!
                  +
                  1. Enter a few keywords to find the perfect icon using our icon search and click on the shortcode to copy it to your clipboard:

                    Normally, the logo in the header and sidebar links to the homepage of the documentation, which is the same as site_url. This behavior can be changed with the following configuration:

                    extra:
                    +  homepage: https://example.com
                    +

                    Favicon

                    0.1.0 assets/images/favicon.png

                    The favicon can be changed to a path pointing to a user-provided image, which must be located in the docs folder. Add the following lines to mkdocs.yml:

                    theme:
                    +  favicon: images/favicon.png
                    +

                    Site icons

                    9.2.0

                    Most icons you see on your site, such as navigation icons, can also be changed. For example, to change the navigation arrows in the footer, add the following lines to mkdocs.yml:

                    theme:
                    +  icon:
                    +    previous: fontawesome/solid/angle-left
                    +    next: fontawesome/solid/angle-right
                    +

                    The following is a complete list of customizable icons used by the theme:

                    Icon name Purpose
                    logo See Logo
                    menu Open drawer
                    alternate Change language
                    search Search icon
                    share Share search
                    close Reset search, dismiss announcements
                    top Back-to-top button
                    edit Edit current page
                    view View page source
                    repo Repository icon
                    admonition See Admonition icons
                    tag See Tag icons and identifiers
                    previous Previous page in footer, hide search on mobile
                    next Next page in footer

                    Customization

                    Additional icons

                    In order to use custom icons, extend the theme and create a new folder named .icons in the custom_dir you want to use for overrides. Next, add your *.svg icons into a subfolder of the .icons folder. Let's say you downloaded and unpacked the Bootstrap icon set, and want to add it to your project documentation. The structure of your project should look like this:

                    .
                    +├─ overrides/
                    +  └─ .icons/
                    +     └─ bootstrap/
                    +        └─ *.svg
                    +└─ mkdocs.yml
                    +

                    Then, add the following lines to mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.emoji:
                    +      emoji_index: !!python/name:material.extensions.emoji.twemoji
                    +      emoji_generator: !!python/name:material.extensions.emoji.to_svg
                    +      options:
                    +        custom_icons:
                    +          - overrides/.icons
                    +

                    You can now use all Bootstrap icons anywhere in Markdown files, as well as everywhere icons can be used in mkdocs.yml. However, note that the syntaxes are slightly different:

                    • Using icons in configuration: take the path of the *.svg icon file starting at the .icons folder and drop the file extension, e.g. for .icons/bootstrap/envelope-paper.svg, use:

                      theme:
                      +  icon:
                      +    logo: bootstrap/envelope-paper
                      +
                    • Using icons in Markdown files: additionally to taking the path from the .icons folder as noted above, replace all / with - and enclose the icon shortcode in two colons:

                      :bootstrap-envelope-paper:
                      +

                    For further notes on icon usage, please consult the icon reference.

                    \ No newline at end of file diff --git a/setup/ensuring-data-privacy/index.html b/setup/ensuring-data-privacy/index.html new file mode 100755 index 0000000..3c1145d --- /dev/null +++ b/setup/ensuring-data-privacy/index.html @@ -0,0 +1,115 @@ + Ensuring data privacy - 一抹雨烟

                    Ensuring data privacy

                    Material for MkDocs makes compliance with data privacy regulations very easy, as it offers a native cookie consent solution to seek explicit consent from users before setting up analytics. Additionally, external assets can be automatically downloaded for self-hosting.

                    Configuration

                    8.4.0 .zip

                    Material for MkDocs ships a native and extensible cookie consent form which asks the user for consent prior to sending requests to third parties. Add the following to mkdocs.yml:

                    extra:
                    +  consent:
                    +    title: Cookie consent
                    +    description: >- # (1)!
                    +      We use cookies to recognize your repeated visits and preferences, as well
                    +      as to measure the effectiveness of our documentation and whether users
                    +      find what they're searching for. With your consent, you're helping us to
                    +      make our documentation better.
                    +
                    1. You can add arbitrary HTML tags in the description, e.g. to link to your terms of service or other parts of the site.

                    The following properties are available:

                    title

                    This property sets the title of the cookie consent, which is rendered at the top of the form and must be set to a non-empty string.

                    description

                    This property sets the description of the cookie consent, is rendered below the title, and may include raw HTML (e.g. a links to the terms of service).

                    cookies

                    This property allows to add custom cookies or change the initial checked state and name of built-in cookies. Currently, the following cookies are built-in:

                    • Google Analyticsanalytics (enabled by default)
                    • GitHubgithub (enabled by default)

                    Each cookie must receive a unique identifier which is used as a key in the cookies map, and can be either set to a string, or to a map defining name and checked state:

                    extra:
                    +  consent:
                    +    cookies:
                    +      analytics: Custom name
                    +
                    extra:
                    +  consent:
                    +    cookies:
                    +      analytics:
                    +        name: Google Analytics
                    +        checked: false
                    +
                    extra:
                    +  consent:
                    +    cookies:
                    +      analytics: Google Analytics # (1)!
                    +      custom: Custom cookie
                    +
                    1. If you define a custom cookie as part of the cookies property, the analytics cookie must be added back explicitly, or analytics won't be triggered.

                    If Google Analytics was configured via mkdocs.yml, the cookie consent will automatically include a setting for the user to disable it. Custom cookies can be used from JavaScript.

                    actions

                    [accept, manage] This property defines which buttons are shown and in which order, e.g. to allow the user to accept cookies and manage settings:

                    extra:
                    +  consent:
                    +    actions:
                    +      - accept
                    +      - manage # (1)!
                    +
                    1. If the manage settings button is omitted from the actions property, the settings are always shown.

                    The cookie consent form includes three types of buttons:

                    • accept – Button to accept selected cookies
                    • reject – Button to reject all cookies
                    • manage – Button to manage settings

                    When a user first visits your site, a cookie consent form is rendered:

                    Cookie consent enabled

                    In order to comply with GDPR, users must be able to change their cookie settings at any time. This can be done by adding a simple link to your copyright notice in mkdocs.yml:

                    copyright: >
                    +  Copyright &copy; 2016 - 2023 Martin Donath –
                    +  <a href="#__consent">Change cookie settings</a>
                    +

                    Built-in privacy plugin

                    insiders-4.9.0 privacy

                    The built-in privacy plugin automatically identifies external assets as part of the build process and downloads all assets for very simple self-hosting. Add the following lines to mkdocs.yml:

                    plugins:
                    +  - privacy
                    +

                    For a list of all settings, please consult the plugin documentation.

                    Hosting images externally and optimizing them automatically

                    This option makes the built-in privacy plugin an excellent choice for when you want to host assets like images outside of your git repository in another location to keep them fresh and your repository lean.

                    Additionally, as of insiders-4.30.0, the built-in privacy plugin was entirely rewritten and now works perfectly with the built-in optimize plugin, which means that external assets can be passed through the same optimization pipeline as the rest of your documentation. This means you can store and edit unoptimized files outside of your repository, and let both plugins built a highly optimized site for you.

                    If you want to implement separate pipelines, i.e., optimize some images differently from others or exclude some images from downloading, you can use multiple instances of the built-in privacy plugin.

                    Why can't Material for MkDocs bundle all assets by design?

                    The primary reason why Material for MkDocs can't just bundle all of its own assets is the integration with Google Fonts, which offers over a thousand different fonts that can be used to render your documentation. Most of the fonts include several weights and are split up into different character sets to keep the download size small, so the browser only downloads what is really needed. For Roboto, our default regular font, this results in 42 *.woff2 files in total.

                    If Material for MkDocs would bundle all font files, the download size would be in the hundreds of megabytes, slowing down automated builds. Furthermore, authors might add external assets like third-party scripts or style sheets that would need to be remembered to be defined as further local assets.

                    This is the very reason the built-in privacy plugin exists — it automates the process of downloading all external assets manually to ensure compliance with GDPR with some some [technical limitations].

                    Expand to inspect example

                    For the official documentation, the built-in privacy plugin downloads the following resources:

                    .
                    +└─ assets/external/
                    +   ├─ unpkg.com/tablesort@5.3.0/dist/tablesort.min.js
                    +   ├─ fonts.googleapis.com/css
                    +   ├─ fonts.gstatic.com/s/
                    +     ├─ roboto/v29/
                    +       ├─ KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2
                    +       ├─ KFOjCnqEu92Fr1Mu51TjASc0CsTKlA.woff2
                    +       ├─ KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2
                    +       ├─ KFOjCnqEu92Fr1Mu51TjASc2CsTKlA.woff2
                    +       ├─ KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2
                    +       ├─ KFOjCnqEu92Fr1Mu51TjASc5CsTKlA.woff2
                    +       ├─ KFOjCnqEu92Fr1Mu51TjASc6CsQ.woff2
                    +       ├─ KFOjCnqEu92Fr1Mu51TzBic-CsTKlA.woff2
                    +       ├─ KFOjCnqEu92Fr1Mu51TzBic0CsTKlA.woff2
                    +       ├─ KFOjCnqEu92Fr1Mu51TzBic1CsTKlA.woff2
                    +       ├─ KFOjCnqEu92Fr1Mu51TzBic2CsTKlA.woff2
                    +       ├─ KFOjCnqEu92Fr1Mu51TzBic3CsTKlA.woff2
                    +       ├─ KFOjCnqEu92Fr1Mu51TzBic5CsTKlA.woff2
                    +       ├─ KFOjCnqEu92Fr1Mu51TzBic6CsQ.woff2
                    +       ├─ KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2
                    +       ├─ KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2
                    +       ├─ KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2
                    +       ├─ KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2
                    +       ├─ KFOkCnqEu92Fr1Mu51xIIzI.woff2
                    +       ├─ KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2
                    +       ├─ KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2
                    +       ├─ KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2
                    +       ├─ KFOlCnqEu92Fr1MmSU5fBBc4.woff2
                    +       ├─ KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2
                    +       ├─ KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2
                    +       ├─ KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2
                    +       ├─ KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2
                    +       ├─ KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2
                    +       ├─ KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2
                    +       ├─ KFOlCnqEu92Fr1MmWUlfBBc4.woff2
                    +       ├─ KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2
                    +       ├─ KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2
                    +       ├─ KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2
                    +       ├─ KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2
                    +       ├─ KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2
                    +       ├─ KFOmCnqEu92Fr1Mu4WxKOzY.woff2
                    +       ├─ KFOmCnqEu92Fr1Mu4mxK.woff2
                    +       ├─ KFOmCnqEu92Fr1Mu5mxKOzY.woff2
                    +       ├─ KFOmCnqEu92Fr1Mu72xKOzY.woff2
                    +       ├─ KFOmCnqEu92Fr1Mu7GxKOzY.woff2
                    +       ├─ KFOmCnqEu92Fr1Mu7WxKOzY.woff2
                    +       └─ KFOmCnqEu92Fr1Mu7mxKOzY.woff2
                    +     └─ robotomono/v13/
                    +        ├─ L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0mf0h.woff2
                    +        ├─ L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0mf0h.woff2
                    +        ├─ L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0mf0h.woff2
                    +        ├─ L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0mQ.woff2
                    +        ├─ L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0mf0h.woff2
                    +        ├─ L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0mf0h.woff2
                    +        ├─ L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlYIw.woff2
                    +        ├─ L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlYIw.woff2
                    +        ├─ L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlYIw.woff2
                    +        ├─ L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ul.woff2
                    +        ├─ L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlYIw.woff2
                    +        └─ L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-UlYIw.woff2
                    +   └─ polyfill.io/v3/polyfill.min.js
                    +

                    Customization

                    Custom cookies

                    8.4.0 .zip

                    If you've customized the cookie consent and added a custom cookie, the user will be prompted to accept or reject your custom cookie. Once the user accepts or rejects the cookie consent, or changes the settings, the page reloads1. Use additional JavaScript to query the result:

                    var consent = __md_get("__consent")
                    +if (consent && consent.custom) {
                    +  /* The user accepted the cookie */
                    +} else {
                    +  /* The user rejected the cookie */
                    +}
                    +
                    extra_javascript:
                    +  - javascripts/consent.js
                    +

                    1. We reload the page to make interop with custom cookies simpler. If Material for MkDocs would implement a callback-based approach, the author would need to make sure to correctly update all scripts that use cookies. Additionally, the cookie consent is only answered initially, which is why we consider this to be a good trade-off of DX and UX. 

                    \ No newline at end of file diff --git a/setup/extensions/index.html b/setup/extensions/index.html new file mode 100755 index 0000000..0378a8b --- /dev/null +++ b/setup/extensions/index.html @@ -0,0 +1,54 @@ + Extensions - 一抹雨烟

                    Extensions

                    Markdown is a very small language with a kind-of reference implementation called John Gruber's Markdown. Python Markdown and Python Markdown Extensions are two packages that enhance the Markdown writing experience, adding useful syntax extensions for technical writing.

                    Supported extensions

                    The following extensions are all supported by Material for MkDocs and therefore strongly recommended. Click on each extension to learn about its purpose and configuration:

                    Configuration

                    Extensions are configured as part of mkdocs.yml – the MkDocs configuration file. The following sections contain two example configurations to bootstrap your documentation project.

                    Minimal configuration

                    This configuration is a good starting point for when you're using Material for MkDocs for the first time. The best idea is to explore the reference, and gradually add what you want to use:

                    markdown_extensions:
                    +
                    +  # Python Markdown
                    +  - toc:
                    +      permalink: true
                    +
                    +  # Python Markdown Extensions
                    +  - pymdownx.highlight
                    +  - pymdownx.superfences
                    +

                    This configuration enables all Markdown-related features of Material for MkDocs and is great for experienced users bootstrapping a new documentation project:

                    markdown_extensions:
                    +
                    +  # Python Markdown
                    +  - abbr
                    +  - admonition
                    +  - attr_list
                    +  - def_list
                    +  - footnotes
                    +  - md_in_html
                    +  - toc:
                    +      permalink: true
                    +
                    +  # Python Markdown Extensions
                    +  - pymdownx.arithmatex:
                    +      generic: true
                    +  - pymdownx.betterem:
                    +      smart_enable: all
                    +  - pymdownx.caret
                    +  - pymdownx.details
                    +  - pymdownx.emoji:
                    +      emoji_index: !!python/name:material.extensions.emoji.twemoji
                    +      emoji_generator: !!python/name:material.extensions.emoji.to_svg
                    +  - pymdownx.highlight
                    +  - pymdownx.inlinehilite
                    +  - pymdownx.keys
                    +  - pymdownx.mark
                    +  - pymdownx.smartsymbols
                    +  - pymdownx.superfences
                    +  - pymdownx.tabbed:
                    +      alternate_style: true
                    +  - pymdownx.tasklist:
                    +      custom_checkbox: true
                    +  - pymdownx.tilde
                    +
                    \ No newline at end of file diff --git a/setup/extensions/python-markdown-extensions/index.html b/setup/extensions/python-markdown-extensions/index.html new file mode 100755 index 0000000..8e70c8f --- /dev/null +++ b/setup/extensions/python-markdown-extensions/index.html @@ -0,0 +1,151 @@ + Python Markdown Extensions - 一抹雨烟

                    Python Markdown Extensions

                    The Python Markdown Extensions package is an excellent collection of additional extensions perfectly suited for advanced technical writing. Material for MkDocs lists this package as an explicit dependency, so it's automatically installed with a supported version.

                    Supported extensions

                    In general, all extensions that are part of Python Markdown Extensions should work with Material for MkDocs. The following list includes all extensions that are natively supported, meaning they work without any further adjustments.

                    Arithmatex

                    1.0.0 pymdownx.arithmatex

                    The Arithmatex extension allows for rendering of block and inline block equations and integrates seamlessly with MathJax1 – a library for mathematical typesetting. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.arithmatex:
                    +      generic: true
                    +

                    Besides enabling the extension in mkdocs.yml, a MathJax configuration and the JavaScript runtime need to be included, which can be done with a few lines of additional JavaScript:

                    window.MathJax = {
                    +  tex: {
                    +    inlineMath: [["\\(", "\\)"]],
                    +    displayMath: [["\\[", "\\]"]],
                    +    processEscapes: true,
                    +    processEnvironments: true
                    +  },
                    +  options: {
                    +    ignoreHtmlClass: ".*|",
                    +    processHtmlClass: "arithmatex"
                    +  }
                    +};
                    +
                    +document$.subscribe(() => {
                    +  MathJax.typesetPromise()
                    +})
                    +
                    extra_javascript:
                    +  - javascripts/mathjax.js
                    +  - https://polyfill.io/v3/polyfill.min.js?features=es6
                    +  - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
                    +

                    The other configuration options of this extension are not officially supported by Material for MkDocs, which is why they may yield unexpected results. Use them at your own risk.

                    See reference for usage:

                    BetterEm

                    0.1.0 pymdownx.betterem

                    The BetterEm extension improves the detection of Markup to emphasize text in Markdown using special characters, i.e. for **bold** and _italic_ formatting. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.betterem
                    +

                    The configuration options of this extension are not specific to Material for MkDocs, as they only impact the Markdown parsing stage. See the BetterEm documentation for more information.

                    Caret, Mark & Tilde

                    1.0.0 pymdownx.caret

                    The Caret, Mark and Tilde extensions add the ability to highlight text and define sub- and superscript using a simple syntax. Enable them together via mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.caret
                    +  - pymdownx.mark
                    +  - pymdownx.tilde
                    +

                    The configuration options of this extension are not specific to Material for MkDocs, as they only impact the Markdown parsing stage. See the Caret, Mark and Tilde documentation for guidance.

                    See reference for usage:

                    Critic

                    1.0.0 pymdownx.critic

                    The Critic extension allows for the usage of Critic Markup to highlight added, deleted or updated sections in a document, i.e. for tracking changes in Markdown syntax. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.critic
                    +

                    The following configuration options are supported:

                    mode

                    view This option defines how the markup should be parsed, i.e. whether to just view all suggested changes, or alternatively accept or reject them:

                    markdown_extensions:
                    +  - pymdownx.critic:
                    +      mode: view
                    +
                    markdown_extensions:
                    +  - pymdownx.critic:
                    +      mode: accept
                    +
                    markdown_extensions:
                    +  - pymdownx.critic:
                    +      mode: reject
                    +

                    See reference for usage:

                    Details

                    1.9.0 pymdownx.details

                    The Details extension supercharges the Admonition extension, making the resulting call-outs collapsible, allowing them to be opened and closed by the user. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.details
                    +

                    No configuration options are available. See reference for usage:

                    Emoji

                    1.0.0 pymdownx.emoji

                    The Emoji extension automatically inlines bundled and custom icons and emojis in *.svg file format into the resulting HTML page. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.emoji:
                    +      emoji_index: !!python/name:material.extensions.emoji.twemoji # (1)!
                    +      emoji_generator: !!python/name:material.extensions.emoji.to_svg
                    +
                    1. Python Markdown Extensions uses the pymdownx namespace, but in order to support the inlining of icons, the materialx namespace must be used, as it extends the functionality of pymdownx.

                    The following configuration options are supported:

                    emoji_index

                    emojione This option defines which set of emojis is used for rendering. Note that the use of emojione is not recommended due to restrictions in licensing:

                    markdown_extensions:
                    +  - pymdownx.emoji:
                    +      emoji_index: !!python/name:material.extensions.emoji.twemoji
                    +
                    emoji_generator

                    to_png This option defines how the resolved emoji or icon shortcode is render. Note that icons can only be used together with the to_svg configuration:

                    markdown_extensions:
                    +  - pymdownx.emoji:
                    +      emoji_generator: !!python/name:material.extensions.emoji.to_svg
                    +
                    custom_icons

                    This option allows to list folders with additional icon sets to be used in Markdown or mkdocs.yml, which is explained in more detail in the icon customization guide:

                    markdown_extensions:
                    +  - pymdownx.emoji:
                    +      emoji_index: !!python/name:material.extensions.emoji.twemoji
                    +      emoji_generator: !!python/name:material.extensions.emoji.to_svg
                    +      options:
                    +        custom_icons:
                    +          - overrides/.icons
                    +

                    The other configuration options of this extension are not officially supported by Material for MkDocs, which is why they may yield unexpected results. Use them at your own risk.

                    See reference for usage:

                    Highlight

                    5.0.0 pymdownx.highlight

                    The Highlight extension adds support for syntax highlighting of code blocks (with the help of SuperFences) and inline code blocks (with the help of InlineHilite). Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.highlight:
                    +      anchor_linenums: true
                    +  - pymdownx.superfences # (1)!
                    +
                    1. Highlight is used by the SuperFences extension to perform syntax highlighting on code blocks, not the other way round, which is why this extension also needs to be enabled.

                    The following configuration options are supported:

                    use_pygments

                    true This option allows to control whether highlighting should be carried out during build time using Pygments or in the browser with a JavaScript syntax highlighter:

                    markdown_extensions:
                    +  - pymdownx.highlight:
                    +      use_pygments: true
                    +  - pymdownx.superfences
                    +
                    markdown_extensions:
                    +  - pymdownx.highlight:
                    +      use_pygments: false
                    +

                    As an example, Highlight.js, a JavaScript syntax highlighter, can be integrated with some additional JavaScript and an additional style sheet in mkdocs.yml:

                    document$.subscribe(() => {
                    +  hljs.highlightAll()
                    +})
                    +
                    extra_javascript:
                    +  - https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/highlight.min.js
                    +  - javascripts/highlight.js
                    +extra_css:
                    +  - https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/styles/default.min.css
                    +

                    Note that Highlight.js has no affiliation with the Highlight extension.

                    All following configuration options are only compatible with build-time syntax highlighting using Pygments, so they don't apply if use_pygments is set to false.

                    pygments_lang_class

                    false This option instructs Pygments to add a CSS class to identify the language of the code block, which is essential for custom annotation markers to function:

                    markdown_extensions:
                    +  - pymdownx.highlight:
                    +      pygments_lang_class: true
                    +
                    auto_title

                    false This option will automatically add a title to all code blocks that shows the name of the language being used, e.g. Python is printed for a py block:

                    markdown_extensions:
                    +  - pymdownx.highlight:
                    +      auto_title: true
                    +
                    linenums

                    false This option will add line numbers to all code blocks. If you wish to add line numbers to some, but not all code blocks, consult the section on adding line numbers in the code block reference, which also contains some tips on working with line numbers:

                    markdown_extensions:
                    +  - pymdownx.highlight:
                    +      linenums: true
                    +
                    linenums_style

                    table The Highlight extension provides three ways to add line numbers, two of which are supported by Material for MkDocs. While table wraps a code block in a <table> element, pymdownx-inline renders line numbers as part of the line itself:

                    markdown_extensions:
                    +  - pymdownx.highlight:
                    +      linenums_style: pymdownx-inline
                    +

                    Note that inline will put line numbers next to the actual code, which means that they will be included when selecting text with the cursor or copying a code block to the clipboard. Thus, the usage of either table or pymdownx-inline is recommended.

                    anchor_linenums

                    8.1.0 Default: false – If a code blocks contains line numbers, enabling this setting will wrap them with anchor links, so they can be hyperlinked and shared more easily:

                    markdown_extensions:
                    +  - pymdownx.highlight:
                    +      anchor_linenums: true
                    +
                    line_spans

                    When this option is set, each line of a code block is wrapped in a span, which is essential for features like line highlighting to work correctly:

                    markdown_extensions:
                    +  - pymdownx.highlight:
                    +      line_spans: __span
                    +

                    The other configuration options of this extension are not officially supported by Material for MkDocs, which is why they may yield unexpected results. Use them at your own risk.

                    See reference for usage:

                    InlineHilite

                    5.0.0 pymdownx.inlinehilite

                    The InlineHilite extension add support for syntax highlighting of inline code blocks. It's built on top of the Highlight extension, from which it sources its configuration. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.highlight
                    +  - pymdownx.inlinehilite
                    +

                    The configuration options of this extension are not specific to Material for MkDocs, as they only impact the Markdown parsing stage. The only exception is the css_class option, which must not be changed. See the InlineHilite documentation for guidance.

                    See reference for usage:

                    Keys

                    1.0.0 pymdownx.keys

                    The Keys extension adds a simple syntax to allow for the rendering of keyboard keys and combinations, e.g. Ctrl+Alt+Del. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.keys
                    +

                    The configuration options of this extension are not specific to Material for MkDocs, as they only impact the Markdown parsing stage. The only exception is the class option, which must not be changed. See the Keys documentation for more information.

                    See reference for usage:

                    SmartSymbols

                    0.1.0 pymdownx.smartsymbols

                    The SmartSymbols extension converts some sequences of characters into their corresponding symbols, e.h. copyright symbols or fractions. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.smartsymbols
                    +

                    The configuration options of this extension are not specific to Material for MkDocs, as they only impact the Markdown parsing stage. See the SmartSymbols documentation for guidance.

                    Snippets

                    0.1.0 pymdownx.snippets

                    The Snippets extension adds the ability to embed content from arbitrary files into a document, including other documents or source files, by using a simple syntax. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.snippets
                    +

                    The configuration options of this extension are not specific to Material for MkDocs, as they only impact the Markdown parsing stage. See the Snippets documentation for more information.

                    See reference for usage:

                    SuperFences

                    0.1.0 pymdownx.superfences

                    The SuperFences extension allows for arbitrary nesting of code and content blocks inside each other, including admonitions, tabs, lists and all other elements. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.superfences
                    +

                    The following configuration options are supported:

                    custom_fences

                    This option allows to define a handler for custom fences, e.g. to preserve the definitions of Mermaid.js diagrams to be interpreted in the browser:

                    markdown_extensions:
                    +  - pymdownx.superfences:
                    +      custom_fences:
                    +        - name: mermaid
                    +          class: mermaid
                    +          format: !!python/name:pymdownx.superfences.fence_code_format
                    +

                    Note that this will primarily prevent syntax highlighting from being applied. See the reference on diagrams to learn how Mermaid.js is integrated with Material for MkDocs.

                    The other configuration options of this extension are not officially supported by Material for MkDocs, which is why they may yield unexpected results. Use them at your own risk.

                    See reference for usage:

                    Tabbed

                    5.0.0 pymdownx.tabbed

                    The Tabbed extension allows the usage of content tabs, a simple way to group related content and code blocks under accessible tabs. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.tabbed:
                    +      alternate_style: true
                    +

                    The following configuration options are supported:

                    alternate_style

                    7.3.1 false This option enables the content tabs alternate style, which has better behavior on mobile viewports, and is the only supported style:

                    markdown_extensions:
                    +  - pymdownx.tabbed:
                    +      alternate_style: true
                    +
                    combine_header_slug

                    false This option enables the content tabs combine_header_slug style flag, which prepends the id of the header to the id of the tab:

                    markdown_extensions:
                    +  - pymdownx.tabbed:
                    +      combine_header_slug: true
                    +
                    slugify

                    toc.slugify This option allows for customization of the slug function. For some languages, the default may not produce good and readable identifiers – consider using another slug function like for example those from Python Markdown Extensions:

                    markdown_extensions:
                    +  - pymdownx.tabbed:
                    +      slugify: !!python/object/apply:pymdownx.slugs.slugify
                    +        kwds:
                    +          case: lower
                    +
                    markdown_extensions:
                    +  - pymdownx.tabbed:
                    +      slugify: !!python/object/apply:pymdownx.slugs.slugify
                    +

                    The other configuration options of this extension are not officially supported by Material for MkDocs, which is why they may yield unexpected results. Use them at your own risk.

                    See reference for usage:

                    Tasklist

                    1.0.0 pymdownx.tasklist

                    The Tasklist extension allows for the usage of GitHub Flavored Markdown inspired task lists, following the same syntactical conventions. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - pymdownx.tasklist:
                    +      custom_checkbox: true
                    +

                    The following configuration options are supported:

                    custom_checkbox

                    false This option toggles the rendering style of checkboxes, replacing native checkbox styles with beautiful icons, and is therefore recommended:

                    markdown_extensions:
                    +  - pymdownx.tasklist:
                    +      custom_checkbox: true
                    +
                    clickable_checkbox

                    false This option toggles whether checkboxes are clickable. As the state is not persisted, the use of this option is rather discouraged from a user experience perspective:

                    markdown_extensions:
                    +  - pymdownx.tasklist:
                    +      clickable_checkbox: true
                    +

                    The other configuration options of this extension are not officially supported by Material for MkDocs, which is why they may yield unexpected results. Use them at your own risk.

                    See reference for usage:


                    1. Other libraries like KaTeX are also supported and can be integrated with some additional effort. See the Arithmatex documentation on KaTeX for further guidance, as this is beyond the scope of Material for MkDocs. 

                    \ No newline at end of file diff --git a/setup/extensions/python-markdown/index.html b/setup/extensions/python-markdown/index.html new file mode 100755 index 0000000..5b4aca1 --- /dev/null +++ b/setup/extensions/python-markdown/index.html @@ -0,0 +1,55 @@ + Python Markdown - 一抹雨烟

                    Python Markdown

                    Material for MkDocs supports a large number of Python Markdown extensions, which is part of what makes it so attractive for technical writing. Following is a list of all supported extensions, linking to the relevant sections of the reference for which features they need to be enabled.

                    Supported extensions

                    Abbreviations

                    1.0.0 abbr

                    The Abbreviations extension adds the ability to add a small tooltip to an element, by wrapping it with an abbr tag. Only plain text (no markup) is supported. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - abbr
                    +

                    No configuration options are available. See reference for usage:

                    Admonition

                    0.1.0 admonition

                    The Admonition extension adds support for admonitions, more commonly known as call-outs, which can be defined in Markdown by using a simple syntax. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - admonition
                    +

                    No configuration options are available. See reference for usage:

                    Attribute Lists

                    0.1.0 attr_list

                    The Attribute Lists extension allows to add HTML attributes and CSS classes to almost every Markdown inline- and block-level element with a special syntax. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - attr_list
                    +

                    No configuration options are available. See reference for usage:

                    Definition Lists

                    1.1.0 def_list

                    The Definition Lists extension adds the ability to add definition lists (more commonly known as description listsdl in HTML) via Markdown to a document. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - def_list
                    +

                    No configuration options are available. See reference for usage:

                    Footnotes

                    1.0.0 footnotes

                    The Footnotes extension allows to define inline footnotes, which are then rendered below all Markdown content of a document. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - footnotes
                    +

                    No configuration options are supported. See reference for usage:

                    Markdown in HTML

                    0.1.0 md_in_html

                    The Markdown in HTML extension allows for writing Markdown inside of HTML, which is useful for wrapping Markdown content with custom elements. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - md_in_html
                    +

                    By default, Markdown ignores any content within a raw HTML block-level element. With the md_in_html extension enabled, the content of a raw HTML block-level element can be parsed as Markdown by including a markdown attribute on the opening tag. The markdown attribute will be stripped from the output, while all other attributes will be preserved.

                    No configuration options are available. See reference for usage:

                    Table of Contents

                    0.1.0 toc

                    The Table of Contents extension automatically generates a table of contents from a document, which Material for MkDocs will render as part of the resulting page. Enable it via mkdocs.yml:

                    markdown_extensions:
                    +  - toc:
                    +      permalink: true
                    +

                    The following configuration options are supported:

                    title

                    7.3.5 – This option sets the title of the table of contents in the right navigation sidebar, which is normally automatically sourced from the translations for the site language as set in mkdocs.yml:

                    markdown_extensions:
                    +  - toc:
                    +      title: On this page
                    +
                    permalink

                    false This option adds an anchor link containing the paragraph symbol or another custom symbol at the end of each headline, exactly like on the page you're currently viewing, which Material for MkDocs will make appear on hover:

                    markdown_extensions:
                    +  - toc:
                    +      permalink: true
                    +
                    markdown_extensions:
                    +  - toc:
                    +      permalink: ⚓︎
                    +
                    permalink_title

                    Permanent link This option sets the title of the anchor link which is shown on hover and read by screen readers. For accessibility reasons, it might be beneficial to change it to a more discernable name, stating that the anchor links to the section itself:

                    markdown_extensions:
                    +  - toc:
                    +      permalink_title: Anchor link to this section for reference
                    +
                    slugify

                    toc.slugify This option allows for customization of the slug function. For some languages, the default may not produce good and readable identifiers – consider using another slug function like for example those from Python Markdown Extensions:

                    markdown_extensions:
                    +  - toc:
                    +      slugify: !!python/object/apply:pymdownx.slugs.slugify
                    +        kwds:
                    +          case: lower
                    +
                    markdown_extensions:
                    +  - toc:
                    +      slugify: !!python/object/apply:pymdownx.slugs.slugify
                    +
                    toc_depth

                    6 Define the range of levels to be included in the table of contents. This may be useful for project documentation with deeply structured headings to decrease the length of the table of contents, or to remove the table of contents altogether:

                    markdown_extensions:
                    +  - toc:
                    +      toc_depth: 3
                    +
                    markdown_extensions:
                    +  - toc:
                    +      toc_depth: 0
                    +

                    The other configuration options of this extension are not officially supported by Material for MkDocs, which is why they may yield unexpected results. Use them at your own risk.

                    Tables

                    0.1.0 tables

                    The Tables extension adds the ability to create tables in Markdown by using a simple syntax. Enable it via mkdocs.yml (albeit it should be enabled by default):

                    markdown_extensions:
                    +  - tables
                    +

                    No configuration options are available. See reference for usage:

                    Superseded extensions

                    The following Python Markdown extensions are not (or might not be) supported anymore, and are therefore not recommended for use. Instead, the alternatives should be considered.

                    Fenced Code Blocks

                    0.1.0 fenced_code_blocks

                    Superseded by SuperFences. This extension might still work, but the SuperFences extension is superior in many ways, as it allows for arbitrary nesting, and is therefore recommended.

                    CodeHilite

                    0.1.0 codehilite

                    Superseded by Highlight. Support for CodeHilite was dropped in 6.0.0, as Highlight has a better integration with other essential extensions like SuperFences and InlineHilite.

                    \ No newline at end of file diff --git a/setup/index.html b/setup/index.html new file mode 100755 index 0000000..aaa268f --- /dev/null +++ b/setup/index.html @@ -0,0 +1,12 @@ + Setup - 一抹雨烟

                    Setup

                    Material for MkDocs offers a wide range of options for customizing your documentation. In this section, we will explain how you can create a meaningful structure for your site, change the look and feel, add a blog and comment system, and build a highly optimized site.

                    Site structure

                    Set up and customize the structure of your documentation by configuring the header and footer to your taste, choosing among many modes of navigation, setting up site search, and more.

                    • Language – Choose out of the 60+ supported languages or add a new one
                    • Navigation – Create a clear, concise, and comprehensive navigation structure
                    • Header – Customize the behavior of the header, add an announcement bar
                    • Footer – Add links to your social media profiles or websites in the footer
                    • Search – Set up and configure search, running entirely in the user's browser
                    • Tags – Categorize your pages with tags and group related pages

                    Appearance

                    Match your brand's colors, fonts, icons, logo, and more with a few lines of configuration – Material for MkDocs makes it easy to extend the basic configuration or alter the appearance.

                    • Colors Change colors with an existing color palette or customize with CSS
                    • Fonts – Choose among 1,000 Google Fonts or load self-hosted fonts
                    • Logo & Icons – Change the logo, use any of the 8,000+ icons, or add new ones
                    • Social Cards – Automatically create social media previews when sharing links

                    Content

                    Create a blog, integrate a comment system, connect a git repository, and set up versioned documentation that matches your project's versioning methodology.

                    • Blog – Set up a standalone blog or host it alongside your documentation
                    • Comment System – Add a third-party comment system on any page or footer
                    • Versioning – Deploy multiple versions by integrating with external utilities
                    • Repository – Connect your documentation to your git repository

                    Optimization

                    Add site analytics and build an optimized site by adding automatic image compression, complying with GDPR data privacy regulations, and making it offline-capable.

                    • Site analytics – Learn how your users experience your documentation
                    • Optimized site – Create optimized sites that rank great on search engines
                    • Data Privacy – Ensure compliance with data privacy regulations
                    • Offline usage – Build an online and offline-capable documentation
                    \ No newline at end of file diff --git a/setup/setting-up-a-blog/index.html b/setup/setting-up-a-blog/index.html new file mode 100755 index 0000000..84599c7 --- /dev/null +++ b/setup/setting-up-a-blog/index.html @@ -0,0 +1,178 @@ + Setting up a blog - 一抹雨烟

                    Setting up a blog

                    Material for MkDocs makes it very easy to build a blog, either as a sidecar to your documentation or standalone. Focus on your content while the engine does all the heavy lifting, automatically generating archive and category indexes, post slugs, configurable pagination and more.


                    Check out our blog, which is created with the new built-in blog plugin!

                    Configuration

                    Built-in blog plugin

                    9.2.0

                    The built-in blog plugin adds support for building a blog from a folder of posts, which are annotated with dates and other structured data. First, add the following lines to mkdocs.yml:

                    plugins:
                    +  - blog
                    +

                    For a list of all settings, please consult the plugin documentation.

                    Advanced settings

                    insiders-4.44.0

                    The following advanced settings are currently reserved to our sponsors. They are entirely optional, and don't affect the functionality of the blog, but can be helpful for customizations:

                    We'll add more settings here, as we discover new use cases.

                    RSS

                    9.2.0 rss

                    The built-in blog plugin integrates seamlessly with the RSS plugin, which provides a simple way to add an RSS feed to your blog (or to your whole documentation). Install it with pip:

                    pip install mkdocs-rss-plugin
                    +

                    Then, add the following lines to mkdocs.yml:

                    plugins:
                    +  - rss:
                    +      match_path: blog/posts/.* # (1)!
                    +      date_from_meta:
                    +        as_creation: date
                    +      categories:
                    +        - categories
                    +        - tags # (2)!
                    +
                    1. The RSS plugin allows to filter for URLs to be included in the feed. In this example, only blog posts will be part of the feed.

                    2. If you want to include a post's categories as well as its tags in the feed, add both categories and tags here.

                    The following configuration options are supported:

                    enabled

                    true This option specifies whether the plugin is enabled when building your project. If you want to speed up local builds, you can use an [environment variable]:

                    plugins:
                    +  - rss:
                    +      enabled: !ENV [CI, false]
                    +
                    match_path

                    .* This option specifies which pages should be included in the feed. For example, to only include blog posts in the feed, use the following regular expression:

                    plugins:
                    +  - rss:
                    +      match_path: blog/posts/.*
                    +
                    date_from_meta

                    This option specifies which front matter property should be used as a creation date of a page in the feed. It's recommended to use the date property:

                    plugins:
                    +  - rss:
                    +      date_from_meta:
                    +        as_creation: date
                    +
                    categories

                    This option specifies which front matter properties are used as categories as part of the feed. If you use categories and tags, add both with the following lines:

                    plugins:
                    +  - rss:
                    +      categories:
                    +        - categories
                    +        - tags
                    +
                    comments_path

                    This option specifies the anchor at which comments for a post or page can be found. If you've integrated a comment system, add the following lines:

                    plugins:
                    +  - rss:
                    +      comments_path: "#__comments"
                    +

                    Material for MkDocs will automatically add the necessary metadata to your site which will make the RSS feed discoverable by browsers and feed readers. Note that the RSS plugin comes with several other configuration options. For further information, see the documentation.

                    Usage

                    Writing your first post

                    After you've successfully set up the built-in blog plugin, it's time to write your first post. The plugin doesn't assume any specific directory structure, so you're completely free in how you organize your posts, as long as they are all located inside the posts directory:

                    .
                    +├─ docs/
                    +  └─ blog/
                    +     ├─ posts/
                    +       └─ hello-world.md # (1)!
                    +     └─ index.md
                    +└─ mkdocs.yml
                    +
                    1. If you'd like to arrange posts differently, you're free to do so. The URLs are built from the format specified in post_url_format and the titles and dates of posts, no matter how they are organized inside the posts directory.

                    Create a new file called hello-world.md and add the following lines:

                    ---
                    +draft: true # (1)!
                    +date: 2023-01-31 # (2)!
                    +categories:
                    +  - Hello
                    +  - World
                    +---
                    +
                    +# Hello world!
                    +...
                    +
                    1. If you mark a post as a draft, a red marker appears next to the post date on index pages. When the site is built, drafts are not included in the output. This behavior can be changed, e.g. for rendering drafts when building deploy previews.

                    2. If you wish to provide multiple dates, you can use the following syntax, allowing you to define a date when you last updated the blog post + further custom dates you can add to the template:

                      ---
                      +date:
                      +  created: 2022-01-31
                      +  updated: 2022-02-02
                      +---
                      +
                      +# Hello world!
                      +

                      Note that the creation date must be set under date.created, as each blog post must have a creation date set.

                    When you spin up the live preview server, you should be greeted by your first post! You'll also realize, that archive and category indexes have been automatically generated for you.

                    Adding an excerpt

                    The blog index, as well as archive and category indexes can either list the entire content of each post, or excerpts of posts. An excerpt can be created by adding a <!-- more --> separator after the first few paragraphs of a post:

                    # Hello world!
                    +
                    +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
                    +nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
                    +massa, nec semper lorem quam in massa.
                    +
                    +<!-- more -->
                    +...
                    +

                    When the built-in blog plugin generates all indexes, the content before the excerpt separator is automatically extracted, allowing the user to start reading a post before deciding to jump in.

                    Adding authors

                    In order to add a little more personality to your posts, you can associate each post with one or multiple authors. First, create the .authors.yml file in your blog directory, and add an author:

                    authors:
                    +  squidfunk:
                    +    name: Martin Donath
                    +    description: Creator
                    +    avatar: https://github.com/squidfunk.png
                    +

                    The .authors.yml file associates each author with an identifier (in this example squidfunk), which can then be used in posts. Different attributes can be configured. For a list of all possible attributes, please consult the authors_file documentation.

                    Now, you can assign one or more authors to a post by referencing their identifiers in the front matter of the Markdown file under the authors property. For each author, a small profile is rendered in the left sidebar of each post, as well as in post excerpts on index pages:

                    ---
                    +date: 2023-01-31
                    +authors:
                    +  - squidfunk
                    +    ...
                    +---
                    +
                    +# Hello world!
                    +...
                    +

                    Adding author profiles

                    insiders-4.46.0

                    If you wish to add a dedicated page for each author, you can enable author profiles by setting the authors_profiles configuration option to true. Just add the following lines to mkdocs.yml:

                    plugins:
                    +  - blog:
                    +      authors_profiles: true
                    +

                    If you combine this with custom index pages, you can create a dedicated page for each author with a short description, social media links, etc. – basically anything you can write in Markdown. The list of posts is then appended after the content of the page.

                    Adding categories

                    Categories are an excellent way for grouping your posts thematically on dedicated index pages. This way, a user interested in a specific topic can explore all of your posts on this topic. Make sure categories are enabled and add them to the front matter categories property:

                    ---
                    +date: 2023-01-31
                    +categories:
                    +  - Hello
                    +  - World
                    +---
                    +
                    +# Hello world!
                    +...
                    +

                    If you want to save yourself from typos when typing out categories, you can define your desired categories in mkdocs.yml as part of the categories_allowed configuration option. The built-in blog plugin will stop the build if a category is not found within the list.

                    Adding tags

                    Besides categories, the built-in blog plugin also integrates with the built-in tags plugin. If you add tags in the front matter tags property as part of a post, the post is linked from the tags index:

                    ---
                    +date: 2023-01-31
                    +tags:
                    +  - Foo
                    +  - Bar
                    +---
                    +
                    +# Hello world!
                    +...
                    +

                    As usual, the tags are rendered above the main headline and posts are linked on the tags index page, if configured. Note that posts are, as pages, only linked with their titles.

                    Changing the slug

                    Slugs are the shortened description of your post used in the URL. They are automatically generated, but you can specify a custom slug for a page:

                    ---
                    +slug: hello-world
                    +---
                    +
                    +# Hello there world!
                    +...
                    +

                    insiders-4.23.0

                    Related links offer the perfect way to prominently add a further reading section to your post that is included in the left sidebar, guiding the user to other destinations of your documentation. Use the front matter links property to add related links to a post:

                    ---
                    +date: 2023-01-31
                    +links:
                    +  - plugins/search.md
                    +  - insiders/index.md#how-to-become-a-sponsor
                    +---
                    +
                    +# Hello world!
                    +...
                    +

                    You can use the exact same syntax as for the nav section in mkdocs.yml, which means you can set explicit titles for links, add external links and even use nesting:

                    ---
                    +date: 2023-01-31
                    +links:
                    +  - plugins/search.md
                    +  - insiders/index.md#how-to-become-a-sponsor
                    +  - Nested section:
                    +    - External link: https://example.com
                    +    - setup/setting-up-site-search.md
                    +---
                    +
                    +# Hello world!
                    +...
                    +

                    If you look closely, you'll realize that you can even use an anchor to link to a specific section of a document, extending the possibilities of the nav syntax in mkdocs.yml. The built-in blog plugin resolves the anchor and sets the title of the anchor as a subtitle of the related link.

                    Note that all links must be relative to docs_dir, as is also the case for the nav setting.

                    Linking from and to posts

                    While post URLs are dynamically computed, the built-in blog plugin ensures that all links from and to posts and a post's assets are correct. If you want to link to a post, just use the path to the Markdown file as a link reference (links must be relative):

                    [Hello World!](blog/posts/hello-world.md)
                    +

                    Linking from a post to a page, e.g. the index, follows the same method:

                    [Blog](../index.md)
                    +

                    All assets inside the posts directory are copied to the blog/assets folder when the site is being built. Of course, you can also reference assets from posts outside of the posts directory. The built-in blog plugin ensures that all links are correct.

                    Setting the reading time

                    When enabled, the readtime package is used to compute the expected reading time of each post, which is rendered as part of the post and post excerpt. Nowadays, many blogs show reading times, which is why the built-in blog plugin offers this capability as well.

                    Sometimes, however, the computed reading time might not feel accurate, or result in odd and unpleasant numbers. For this reason, reading time can be overridden and explicitly set with the front matter readtime property for a post:

                    ---
                    +date: 2023-01-31
                    +readtime: 15
                    +---
                    +
                    +# Hello world!
                    +...
                    +

                    This will disable automatic reading time computation.

                    Setting defaults

                    If you have a lot of posts, it might feel redundant to define all of the above for each post. Luckily, the built-in meta plugin allows to set default front matter properties per folder. You can group your posts by categories, or authors, and add a .meta.yml file to set common properties:

                    .
                    +├─ docs/
                    +  └─ blog/
                    +     ├─ posts/
                    +     ├─ .meta.yml # (1)!
                    +     └─ index.md
                    +└─ mkdocs.yml
                    +
                    1. As already noted, you can also place a .meta.yml file in nested folders of the posts directory. This file then can define all front matter properties that are valid in posts, e.g.:

                      authors:
                      +  - squidfunk
                      +categories:
                      +  - Hello
                      +  - World
                      +

                    Note that order matters – the built-in meta plugin must be defined before the blog plugin in mkdocs.yml, so that all set defaults are correctly picked up by the built-in blog plugin:

                    plugins:
                    +  - meta
                    +  - blog
                    +

                    Lists and dictionaries in .meta.yml files are merged and deduplicated with the values defined for a post, which means you can define common properties in .meta.yml and then add specific properties or overrides for each post.

                    Adding pages

                    Besides posts, it's also possible to add static pages to your blog by listing the pages in the nav section of mkdocs.yml. All generated indexes are included after the last specified page. For example, to add a page on the authors of the blog, add the following to mkdocs.yml:

                    nav:
                    +  - Blog:
                    +    - blog/index.md
                    +    - blog/authors.md
                    +      ...
                    +

                    Customization

                    Custom index pages

                    insiders-4.24.0

                    If you want to add custom content to automatically generated archive and category indexes, e.g. to add a category description prior to the list of posts, you can manually create the category page in the same location where the built-in blog plugin would create it:

                    .
                    +├─ docs/
                    +  └─ blog/
                    +     ├─ category/
                    +       └─ hello.md # (1)!
                    +     ├─ posts/
                    +     └─ index.md
                    +└─ mkdocs.yml
                    +
                    1. The easiest way is to first add the category to the blog post, then take the URL generated by the built-in blog plugin and create the file at the corresponding location in the [blog_dir][this is configurable] folder.

                      Note that the shown directory listing is based on the default configuration. If you specify different values for the following options, be sure to adjust the path accordingly:

                    You can now add arbitrary content to the newly created file, or set specific front matter properties for this page, e.g. to change the page description:

                    ---
                    +description: Nullam urna elit, malesuada eget finibus ut, ac tortor.
                    +---
                    +
                    +# Hello
                    +...
                    +

                    All post excerpts belonging to the category are automatically appended.

                    Overriding templates

                    The built-in blog plugin is built on the same basis as Material for MkDocs, which means you can override all templates used for the blog by using theme extension as usual.

                    The following templates are added by the built-in blog plugin:

                    \ No newline at end of file diff --git a/setup/setting-up-navigation/index.html b/setup/setting-up-navigation/index.html new file mode 100755 index 0000000..08f2b89 --- /dev/null +++ b/setup/setting-up-navigation/index.html @@ -0,0 +1,94 @@ + Setting up navigation - 一抹雨烟

                    Setting up navigation

                    A clear and concise navigation structure is an important aspect of good project documentation. Material for MkDocs provides a multitude of options to configure the behavior of navigational elements, including tabs and sections, and one of its flagship features: instant loading.

                    Configuration

                    Instant loading

                    5.0.0

                    When instant loading is enabled, clicks on all internal links will be intercepted and dispatched via XHR without fully reloading the page. Add the following lines to mkdocs.yml:

                    theme:
                    +  features:
                    +    - navigation.instant
                    +

                    The resulting page is parsed and injected and all event handlers and components are rebound automatically, i.e., Material for MkDocs now behaves like a Single Page Application. Now, the search index survives navigation, which is especially useful for large documentation sites.

                    Instant prefetching

                    insiders-4.36.0

                    Instant prefetching is a new experimental feature that will start to fetch a page once the user hovers over a link. This will reduce the perceived loading time for the user, especially on slow connections, as the page will be available immediately upon navigation. Enable it with:

                    theme:
                    +  features:
                    +    - navigation.instant
                    +    - navigation.instant.prefetch
                    +

                    Progress indicator

                    9.4.3

                    In order to provide a better user experience on slow connections when using instant navigation, a progress indicator can be enabled. It will be shown at the top of the page and will be hidden once the page has fully loaded. You can enable it in mkdocs.yml with:

                    theme:
                    +  features:
                    +    - navigation.instant
                    +    - navigation.instant.progress
                    +

                    The progress indicator will only show if the page hasn't finished loading after 400ms, so that fast connections will never show it for a better instant experience.

                    Anchor tracking

                    8.0.0

                    When anchor tracking is enabled, the URL in the address bar is automatically updated with the active anchor as highlighted in the table of contents. Add the following lines to mkdocs.yml:

                    theme:
                    +  features:
                    +    - navigation.tracking
                    +

                    1.1.0

                    When tabs are enabled, top-level sections are rendered in a menu layer below the header for viewports above 1220px, but remain as-is on mobile.1 Add the following lines to mkdocs.yml:

                    theme:
                    +  features:
                    +    - navigation.tabs
                    +

                    Navigation tabs enabled

                    Navigation tabs disabled

                    7.3.0

                    When sticky tabs are enabled, navigation tabs will lock below the header and always remain visible when scrolling down. Just add the following two feature flags to mkdocs.yml:

                    theme:
                    +  features:
                    +    - navigation.tabs
                    +    - navigation.tabs.sticky
                    +

                    Sticky navigation tabs enabled

                    Sticky navigation tabs disabled

                    6.2.0

                    When sections are enabled, top-level sections are rendered as groups in the sidebar for viewports above 1220px, but remain as-is on mobile. Add the following lines to mkdocs.yml:

                    theme:
                    +  features:
                    +    - navigation.sections
                    +

                    Navigation sections enabled

                    Navigation sections disabled

                    Both feature flags, navigation.tabs and navigation.sections, can be combined with each other. If both feature flags are enabled, sections are rendered for level 2 navigation items.

                    6.2.0

                    When expansion is enabled, the left sidebar will expand all collapsible subsections by default, so the user doesn't have to open subsections manually. Add the following lines to mkdocs.yml:

                    theme:
                    +  features:
                    +    - navigation.expand
                    +

                    Navigation expansion enabled

                    Navigation expansion disabled

                    insiders-4.28.0

                    When navigation paths are activated, a breadcrumb navigation is rendered above the title of each page, which might make orientation easier for users visiting your documentation on devices with smaller screens. Add the following lines to mkdocs.yml:

                    theme:
                    +  features:
                    +    - navigation.path
                    +

                    Navigation path enabled

                    Navigation path disabled

                    9.2.0

                    When pruning is enabled, only the visible navigation items are included in the rendered HTML, reducing the size of the built site by 33% or more. Add the following lines to mkdocs.yml:

                    theme:
                    +  features:
                    +    - navigation.prune # (1)!
                    +
                    1. This feature flag is not compatible with navigation.expand, as navigation expansion requires the complete navigation structure.

                    This feature flag is especially useful for documentation sites with 100+ or even 1,000+ of pages, as the navigation makes up a significant fraction of the HTML. Navigation pruning will replace all expandable sections with links to the first page in that section (or the section index page).

                    Section index pages

                    7.3.0

                    When section index pages are enabled, documents can be directly attached to sections, which is particularly useful for providing overview pages. Add the following lines to mkdocs.yml:

                    theme:
                    +  features:
                    +    - navigation.indexes # (1)!
                    +
                    1. This feature flag is not compatible with toc.integrate, as sections cannot host the table of contents due to missing space.

                    Section index pages enabled

                    Section index pages disabled

                    In order to link a page to a section, create a new document with the name index.md in the respective folder, and add it to the beginning of your navigation section:

                    nav:
                    +  - Section:
                    +    - section/index.md # (1)!
                    +    - Page 1: section/page-1.md
                    +    ...
                    +    - Page n: section/page-n.md
                    +
                    1. MkDocs also considers files called README.md as index pages.

                    Table of contents

                    Anchor following

                    8.5.0

                    When anchor following for the table of contents is enabled, the sidebar is automatically scrolled so that the active anchor is always visible. Add the following lines to mkdocs.yml:

                    theme:
                    +  features:
                    +    - toc.follow
                    +

                    6.2.0

                    When navigation integration for the table of contents is enabled, it is always rendered as part of the navigation sidebar on the left. Add the following lines to mkdocs.yml:

                    theme:
                    +  features:
                    +    - toc.integrate # (1)!
                    +
                    1. This feature flag is not compatible with navigation.indexes, as sections cannot host the table of contents due to missing space.

                    Navigation integration enabled

                    Navigation integration disabled

                    Back-to-top button

                    7.1.0

                    A back-to-top button can be shown when the user, after scrolling down, starts to scroll up again. It's rendered centered and just below the header. Add the following lines to mkdocs.yml:

                    theme:
                    +  features:
                    +    - navigation.top
                    +

                    Usage

                    Hiding the sidebars

                    6.2.0

                    The navigation and/or table of contents sidebars can be hidden for a document with the front matter hide property. Add the following lines at the top of a Markdown file:

                    ---
                    +hide:
                    +  - navigation
                    +  - toc
                    +---
                    +
                    +# Page title
                    +...
                    +

                    Hide navigation enabled

                    Hide table of contents enabled

                    Hide both enabled

                    Hiding the navigation path

                    insiders-4.28.0

                    While the navigation path is rendered above the main headline, sometimes, it might be desirable to hide it for a specific page, which can be achieved with the front matter hide property:

                    ---
                    +hide:
                    +  - path
                    +---
                    +
                    +# Page title
                    +...
                    +

                    Customization

                    Keyboard shortcuts

                    Material for MkDocs includes several keyboard shortcuts that make it possible to navigate your project documentation via keyboard. There are two modes:

                    search

                    This mode is active when the search is focused. It provides several key bindings to make search accessible and navigable via keyboard:

                    • Down , Up : select next / previous result
                    • Esc , Tab : close search dialog
                    • Enter : follow selected result
                    global

                    This mode is active when search is not focussed and when there's no other focussed element that is susceptible to keyboard input. The following keys are bound:

                    • F , S , / : open search dialog
                    • P , , : go to previous page
                    • N , . : go to next page

                    Let's say you want to bind some action to the X key. By using additional JavaScript, you can subscribe to the keyboard$ observable and attach your custom event listener:

                    keyboard$.subscribe(function(key) {
                    +  if (key.mode === "global" && key.type === "x") {
                    +    /* Add custom keyboard handler here */
                    +    key.claim() // (1)!
                    +  }
                    +})
                    +
                    1. The call to key.claim() will execute preventDefault() on the underlying event, so the keypress will not propagate further and touch other event listeners.
                    extra_javascript:
                    +  - javascripts/shortcuts.js
                    +

                    Content area width

                    The width of the content area is set so the length of each line doesn't exceed 80-100 characters, depending on the width of the characters. While this is a reasonable default, as longer lines tend to be harder to read, it may be desirable to increase the overall width of the content area, or even make it stretch to the entire available space.

                    This can easily be achieved with an additional style sheet and a few lines of CSS:

                    .md-grid {
                    +  max-width: 1440px; /* (1)! */
                    +}
                    +
                    1. If you want the content area to always stretch to the available screen space, reset max-width with the following CSS:

                      .md-grid {
                      +  max-width: initial;
                      +}
                      +
                    extra_css:
                    +  - stylesheets/extra.css
                    +

                    1. Prior to 6.2.0, navigation tabs had a slightly different behavior. All top-level pages (i.e. all top-level entries directly referring to a *.md file) defined inside the nav entry of mkdocs.yml were grouped under the first tab which received the title of the first page. This made it impossible to include a top-level page (or external link) as a tab item, as was reported in #1884 and #2072. From 6.2.0 on, navigation tabs include all top-level pages and sections. 

                    \ No newline at end of file diff --git a/setup/setting-up-site-analytics/index.html b/setup/setting-up-site-analytics/index.html new file mode 100755 index 0000000..8dab678 --- /dev/null +++ b/setup/setting-up-site-analytics/index.html @@ -0,0 +1,69 @@ + Setting up site analytics - 一抹雨烟

                    Setting up site analytics

                    As with any other service offered on the web, understanding how your project documentation is actually used can be an essential success factor. Material for MkDocs natively integrates with Google Analytics and offers a customizable cookie consent and a feedback widget.

                    Configuration

                    Google Analytics

                    7.1.8

                    Material for MkDocs integrates natively with Google Analytics 41. If you already set up Google Analytics and have a property, enable it by adding the following lines to mkdocs.yml:

                    extra:
                    +  analytics:
                    +    provider: google
                    +    property: G-XXXXXXXXXX
                    +
                    How to measure site search usage?

                    Besides page views and events, site search can be tracked to better understand how people use your documentation and what they expect to find. In order to enable site search tracking, the following steps are required:

                    1. Go to your Google Analytics admin settings
                    2. Select the property for the respective tracking code
                    3. Select the data streams tab and click the corresponding URL
                    4. Click the gear icon within the enhanced measurement section
                    5. Ensure that site search is enabled

                    Was this page helpful?

                    8.4.0

                    A simple feedback widget can be included at the bottom of each page, encouraging users to give instant feedback whether a page was helpful or not. Add the following lines to mkdocs.yml:

                    extra:
                    +  analytics: # (1)!
                    +    feedback:
                    +      title: Was this page helpful?
                    +      ratings:
                    +        - icon: material/emoticon-happy-outline
                    +          name: This page was helpful
                    +          data: 1
                    +          note: >-
                    +            Thanks for your feedback!
                    +        - icon: material/emoticon-sad-outline
                    +          name: This page could be improved
                    +          data: 0
                    +          note: >- # (2)!
                    +            Thanks for your feedback! Help us improve this page by
                    +            using our <a href="..." target="_blank" rel="noopener">feedback form</a>.
                    +
                    1. This feature is natively integrated with Google Analytics, which is why provider and property are also required. However, it's also possible to provide a custom feedback integration.

                    2. You can add arbitrary HTML tags to the note which is shown after the user submitted the feedback, e.g. to link to a feedback form.

                    Both properties, title and ratings, are required. Note that it's allowed to define more than two ratings, e.g. to implement a 1-5 star rating. Since the feedback widget sends data to a third-party service, it is, of course, natively integrated with the cookie consent feature2.

                    How to visualize the collected feedback ratings?

                    To visualize feedback ratings you'll need to create a custom report with Google Analytics that will quickly show you the worst- and best-rated pages of your project documentation.

                    1. Go to your Google Analytics dashboard

                    2. Go to the configure page on the left hand menu, then select custom definitions

                    3. Click the custom metrics tab and then create custom metrics, enter the following values:

                      • Metric name: Page helpful
                      • Description: Was this page helpful?
                      • Event parameter: data
                      • Unit of measurement: Standard
                    4. Go to the explore page on the left hand menu, create a new blank exploration

                    5. Configure the report as follows:

                      • Dimensions: Add Event name and Page location
                      • Metrics: Add Event count and Page helpful (the custom metric created in step 3)
                      • Rows: Page location
                      • Values: Drag in both Event count and Page helpful
                      • Filters: Add a new filter for Event name / exactly matches / feedback

                    Delay in data availability

                    The report may take 24 hours or longer to begin displaying data

                    Now, after you've saved the report and collected some feedback ratings, you'll have a list of all pages with the total number of ratings, and an average rating per page. This should help you identify pages that need to be improved:

                    Google Analytics 4 does not support average values

                    To our knowledge, Google Analytics 4 has currently no feature that allows to define a custom calculated metric to compute the average rating of a page. See #5740.

                    feedback report

                    The following properties are available for each rating:

                    icon

                    This property must point to a valid icon path referencing any icon bundled with the theme, or the build will not succeed. Some popular combinations:

                    • + material/emoticon-happy-outline + material/emoticon-sad-outline
                    • + material/thumb-up-outline + material/thumb-down-outline
                    • + material/heart + material/heart-broken
                    name

                    The value of this property is shown on user interaction (i.e. keyboard focus or mouse hover), explaining the meaning of the rating behind the icon.

                    data

                    The value of this property is sent as a data value with the custom event that is transmitted to Google Analytics3 (or any custom integration).

                    note

                    The value of this property is shown after the user selected the rating. It may contain arbitrary HTML tags, which is especially useful to ask the user to provide more detailed feedback for the current page through a form. It's also possible to pre-fill forms with the URL and title of the current page by using the following placeholders:

                    • {url} – Page URL
                    • {title} – Page title
                    https://github.com/.../issues/new/?title=[Feedback]+{title}+-+{url}
                    +

                    In this example, when clicking the link, the user is redirected to the "new issue" form of your repository, with a pre-filled title including the path of the current document, e.g.:

                    [Feedback] Setting up site analytics – /setup/setting-up-site-analytics/
                    +

                    An alternative to GitHub issues is Google Forms.

                    Usage

                    Hiding the feedback widget

                    The feedback widget can be hidden for a document with the front matter hide property. Add the following lines at the top of a Markdown file:

                    ---
                    +hide:
                    +  - feedback
                    +---
                    +
                    +# Page title
                    +...
                    +

                    Customization

                    Custom site analytics

                    In order to integrate another analytics service provider offering a JavaScript-based tracking solution, just follow the guide on theme extension and create a new partial in the overrides folder. The name of the partial is used to configure the custom integration via mkdocs.yml:

                    <script>
                    +  /* Add custom analytics integration here, e.g. */
                    +  var property = "{{ config.extra.analytics.property }}" // (1)!
                    +
                    +  /* Wait for page to load and application to mount */
                    +  document.addEventListener("DOMContentLoaded", function() {
                    +    location$.subscribe(function(url) {
                    +      /* Add custom page event tracking here */ // (2)!
                    +    })
                    +  })
                    +</script>
                    +
                    1. As an example, this variable receives the value set in mkdocs.yml, which is "foobar" for property.
                    2. If you're using instant loading, you can use the location$ observable to listen for navigation events, which always emits the current URL.
                    extra:
                    +  analytics:
                    +    provider: custom
                    +    property: foobar # (1)!
                    +
                    1. You can add arbitrary key-value combinations to configure your custom integration. This is especially useful if you're sharing the custom integration across multiple repositories.

                    Custom site feedback

                    A custom feedback widget integration just needs to process the events that are generated by users interacting with the feedback widget with the help of some additional JavaScript:

                    var feedback = document.forms.feedback
                    +feedback.addEventListener("submit", function(ev) {
                    +  ev.preventDefault()
                    +
                    +  /* Retrieve page and feedback value */
                    +  var page = document.location.pathname
                    +  var data = ev.submitter.getAttribute("data-md-value")
                    +
                    +  /* Send feedback value */
                    +  console.log(page, data)
                    +})
                    +
                    extra_javascript:
                    +  - javascripts/feedback.js
                    +

                     


                    1. Prior to Material for MkDocs 9.2.0, Universal Analytics was supported as well. However, since Universal Analytics has been sunset, this integration was removed in 9.2.0. 

                    2. If the user doesn't accept the analytics cookie, the feedback widget is not shown. 

                    3. Note that for Google Analytics, the data value must be an integer. 

                    \ No newline at end of file diff --git a/setup/setting-up-site-search/index.html b/setup/setting-up-site-search/index.html new file mode 100755 index 0000000..f1ed670 --- /dev/null +++ b/setup/setting-up-site-search/index.html @@ -0,0 +1,84 @@ + Setting up site search - 一抹雨烟

                    Setting up site search

                    Material for MkDocs provides an excellent client-side search implementation, omitting the need for the integration of third-party services, which might not be compliant with privacy regulations. Moreover, search even works offline, allowing users to download your documentation.

                    Configuration

                    Built-in search plugin

                    0.1.0

                    The built-in search plugin integrates seamlessly with Material for MkDocs, adding multilingual client-side search with lunr and lunr-languages. It's enabled by default, but must be re-added to mkdocs.yml when other plugins are used:

                    plugins:
                    +  - search
                    +

                    For a list of all settings, please consult the plugin documentation.

                    Search suggestions

                    7.2.0

                    When search suggestions are enabled, the search will display the likeliest completion for the last word which can be accepted with the Right key. Add the following lines to mkdocs.yml:

                    theme:
                    +  features:
                    +    - search.suggest
                    +

                    Searching for search su yields search suggestions as a suggestion.

                    Search highlighting

                    7.2.0

                    When search highlighting is enabled and a user clicks on a search result, Material for MkDocs will highlight all occurrences after following the link. Add the following lines to mkdocs.yml:

                    theme:
                    +  features:
                    +    - search.highlight
                    +

                    Searching for code blocks highlights all occurrences of both terms.

                    Search sharing

                    7.2.0

                    When search sharing is activated, a share button is rendered next to the reset button, which allows to deep link to the current search query and result. Add the following lines to mkdocs.yml:

                    theme:
                    +  features:
                    +    - search.share
                    +

                    When a user clicks the share button, the URL is automatically copied to the clipboard.

                    Usage

                    Search boosting

                    8.3.0

                    Pages can be boosted in search with the front matter search.boost property, which will make them rank higher. Add the following lines at the top of a Markdown file:

                    ---
                    +search:
                    +  boost: 2 # (1)!
                    +---
                    +
                    +# Page title
                    +...
                    +
                    1. 🧘‍♀️ When boosting pages, be gentle and start with low values.
                    ---
                    +search:
                    +  boost: 0.5
                    +---
                    +
                    +# Page title
                    +...
                    +

                    Search exclusion

                    9.0.0

                    Pages can be excluded from search with the front matter search.exclude property, removing them from the index. Add the following lines at the top of a Markdown file:

                    ---
                    +search:
                    +  exclude: true
                    +---
                    +
                    +# Page title
                    +...
                    +

                    Excluding sections

                    When Attribute Lists is enabled, specific sections of pages can be excluded from search by adding the data-search-exclude pragma after a Markdown heading:

                    # Page title
                    +
                    +## Section 1
                    +
                    +The content of this section is included
                    +
                    +## Section 2 { data-search-exclude }
                    +
                    +The content of this section is excluded
                    +
                    {
                    +  ...
                    +  "docs": [
                    +    {
                    +      "location":"page/",
                    +      "text":"",
                    +      "title":"Document title"
                    +    },
                    +    {
                    +      "location":"page/#section-1",
                    +      "text":"<p>The content of this section is included</p>",
                    +      "title":"Section 1"
                    +    }
                    +  ]
                    +}
                    +

                    Excluding blocks

                    When Attribute Lists is enabled, specific sections of pages can be excluded from search by adding the data-search-exclude pragma after a Markdown inline- or block-level element:

                    # Page title
                    +
                    +The content of this block is included
                    +
                    +The content of this block is excluded
                    +{ data-search-exclude }
                    +
                    {
                    +  ...
                    +  "docs": [
                    +    {
                    +      "location":"page/",
                    +      "text":"<p>The content of this block is included</p>",
                    +      "title":"Document title"
                    +    }
                    +  ]
                    +}
                    +
                    \ No newline at end of file diff --git a/setup/setting-up-social-cards/index.html b/setup/setting-up-social-cards/index.html new file mode 100755 index 0000000..d384735 --- /dev/null +++ b/setup/setting-up-social-cards/index.html @@ -0,0 +1,177 @@ + Setting up social cards - 一抹雨烟

                    Setting up social cards

                    Material for MkDocs can automatically create beautiful social cards for your documentation, which appear as link previews on social media platforms. You can select from several pre-designed layouts or create custom layouts to match your unique style and branding.


                    How to build custom social cards by @james-willett 24m – Learn how to create entirely custom social cards perfectly matching your branding for each page automatically!

                    Layout default variant

                    Social card of our formatting reference

                    Configuration

                    Built-in social plugin

                    8.5.0

                    The built-in social plugin automatically generate a custom preview image for each page. Install all dependencies for image processing and add the following lines to mkdocs.yml:

                    plugins:
                    +  - social
                    +

                    For a list of all settings, please consult the plugin documentation.

                    The site_url setting must be set

                    Note that you must set site_url when using the social plugin, or the generated cards will not be correctly linked. Social media services like Twitter and Facebook demand that social previews point to an absolute URL, which the plugin can only compute when site_url is set. Example:

                    site_url: https://example.com
                    +

                    Usage

                    If you want to adjust the title or set a custom description for the social card, you can set the front matter title and description properties, which take precedence over the defaults, or use:

                    Choosing a font

                    Some fonts do not contain CJK characters, like for example the default font, Roboto. In case your site_name, site_description, or page title contain CJK characters, choose another font from Google Fonts which comes with CJK characters, e.g. one from the Noto Sans font family:

                    plugins:
                    +  - social:
                    +      cards_layout_options:
                    +        font_family: Noto Sans SC
                    +
                    plugins:
                    +  - social:
                    +      cards_layout_options:
                    +        font_family: Noto Sans TC
                    +
                    plugins:
                    +  - social:
                    +      cards_layout_options:
                    +        font_family: Noto Sans JP
                    +
                    plugins:
                    +  - social:
                    +      cards_layout_options:
                    +        font_family: Noto Sans KR
                    +

                    Changing the layout

                    insiders-4.37.0

                    If you want to use a different layout for a single page (e.g. your landing page), you can use the social front matter property together with the cards_layout key, exactly as in mkdocs.yml:

                    ---
                    +social:
                    +  cards_layout: custom
                    +---
                    +
                    +# Page title
                    +...
                    +

                    You can apply those changes for entire subtrees of your documentation, e.g., to generate different social cards for your blog and API reference, by using the built-in meta plugin.

                    Parametrizing the layout

                    insiders-4.37.0

                    Besides changing the entire layout, you can override all options that a layout exposes. This means you can parametrize social cards with custom front matter properties, such as tags, date, author or anything you can think of. Simply define cards_layout_options:

                    ---
                    +social:
                    +  cards_layout_options:
                    +    background_color: blue # Change background color
                    +    background_image: null # Remove background image
                    +---
                    +
                    +# Page title
                    +...
                    +

                    You can apply those changes for entire subtrees of your documentation, e.g., to generate different social cards for your blog and API reference, by using the built-in meta plugin.

                    Disabling social cards

                    insiders-4.37.0

                    If you wish to disable social cards for a page, simply add the following to the front matter of the Markdown document:

                    ---
                    +social:
                    +  cards: false
                    +---
                    +
                    +# Page title
                    +...
                    +

                    Customization

                    insiders-4.33.0

                    Insiders ships a ground up rewrite of the built-in social plugin and introduces a brand new layout system based on a combination of YAML and Jinja templates – the same engine Material for MkDocs uses for HTML templating – allowing for the creation of complex custom layouts:

                    Layer 0
                    Layer 1
                    Layer 2
                    Layer 3
                    Layer 4
                    Layer 5

                    Social cards are composed of layers, analogous to how they are represented in graphic design software such as Adobe Photoshop. As many layers are common across the cards generated for each page (e.g., backgrounds or logos), the built-in social plugin can automatically deduplicate layers and render them just once, substantially accelerating card generation. The generated cards are cached to ensure they are only regenerated when their contents change.

                    Layouts are written in YAML syntax. Before starting to create a custom layout, it is a good idea to study the pre-designed layouts (link to Insiders repository), in order to get a better understanding of how they work. Then, create a new layout and reference it in mkdocs.yml:

                    size: { width: 1200, height: 630 }
                    +layers: []
                    +
                    plugins:
                    +  - social:
                    +      cards_layout_dir: layouts
                    +      cards_layout: custom
                    +      debug: true
                    +

                    Note that the .yml file extension should be omitted. Next, run mkdocs serve, and see how the .cache directory is populated with the generated cards. Open any card in your editor, so you can see your changes immediately. Since we haven't defined any layers, the cards are transparent.

                    The following sections explain how to create custom layouts.

                    Size and offset

                    Each layer has an associated size and offset, which is defined in pixels. The size is defined by a width and height property, and the offset by x and y properties:

                    size: { width: 1200, height: 630 }
                    +layers:
                    +  - size: { width: 1200, height: 630 }
                    +    offset: { x: 0, y: 0 }
                    +

                    If the size is omitted, it defaults to the size of the layout. If the offset is omitted, it defaults to the top left corner, which is the defaut origin. Saving the layout and reloading renders:

                    Layer size

                    The layer outline and grid are visible because we enabled debug mode in mkdocs.yml. The top left shows the layer index and offset, which is useful for alignment and composition.

                    Origin

                    insiders-4.35.0

                    The origin for the x and y values can be changed, so that the layer is aligned to one of the edges or corners of the layout, e.g., to the bottom right corner of the layout:

                    size: { width: 1200, height: 630 }
                    +layers:
                    +  - size: { width: 1200, height: 630 }
                    +    offset: { x: 0, y: 0 }
                    +    origin: end bottom
                    +

                    The following table shows the supported values:

                    Origin
                    start top center top end top
                    start center center end center
                    start bottom center bottom end bottom
                    Supported values for origin

                    Backgrounds

                    Each layer can be assigned a background color and image. If both are given, the color is rendered on top of the image, allowing for semi-transparent, tinted backgrounds:

                    size: { width: 1200, height: 630 }
                    +layers:
                    +  - background:
                    +      color: "#4051b5"
                    +

                    Layer background color

                    size: { width: 1200, height: 630 }
                    +layers:
                    +  - background:
                    +      image: layouts/background.png
                    +

                    Layer background image

                    size: { width: 1200, height: 630 }
                    +layers:
                    +  - background:
                    +      image: layouts/background.png
                    +      color: "#4051b5ee" # (1)!
                    +
                    1. The color value can be set to a [CSS color keyword], or a 3, 4, 6 or 8 letter HEX color code, allowing for semi-transparent layers.

                    Layer background

                    Background images are automatically scaled to fit the layer while preserving aspect-ratio. Notice how we omitted size and offset, because we want to fill the entire area of the social card.

                    Typography

                    Now, we can add dynamic typography that is sourced from Markdown files - this is the actual raison d'être of the built-in social plugin. Jinja templates are used to render a text string that is then added to the image:

                    size: { width: 1200, height: 630 }
                    +layers:
                    +  - size: { width: 832, height: 310 }
                    +    offset: { x: 62, y: 160 }
                    +    typography:
                    +      content: "{{ page.title }}" # (1)!
                    +      align: start
                    +      color: white
                    +      line:
                    +        amount: 3
                    +        height: 1.25
                    +      font:
                    +        family: Roboto
                    +        style: Bold
                    +
                    1. The following variables can be used in Jinja templates:

                      The author is free in defining layout.* options, which can be used to pass arbitrary data to the layout from mkdocs.yml.

                    This renders a text layer with the title of the page with a line height of 1.25, and a maximum number of 3 lines. The plugin automatically computes the font size from the line height, the number of lines, and font metrics like ascender and descender.1 This renders:

                    Layer typography

                    Overflow

                    If the text overflows the layer, there are two possible behaviors: either the text is automatically truncated and shortened with an ellipsis, or the text is automatically scaled down to fit the layer:

                    # If we use a very long headline, we can see how the text will be truncated
                    +

                    Layer typography ellipsis

                    Layer typography shrink

                    While truncating with an ellipsis is the default, auto-shrinking can be enabled by setting overflow to shrink:

                    size: { width: 1200, height: 630 }
                    +layers:
                    +  - size: { width: 832, height: 310 }
                    +    offset: { x: 62, y: 160 }
                    +    typography:
                    +      content: "{{ page.title }}"
                    +      overflow: shrink
                    +      align: start
                    +      color: white
                    +      line:
                    +        amount: 3
                    +        height: 1.25
                    +      font:
                    +        family: Roboto
                    +        style: Bold
                    +

                    Alignment

                    Text can be aligned to all corners and edges of the layer. For example, if we want to align the text to the middle of the layer, we can set align to start center, which will render as:

                    Layer typography align

                    The following table shows the supported values:

                    Alignment
                    start top center top end top
                    start center center end center
                    start bottom center bottom end bottom
                    Supported values for text alignment

                    Font

                    The built-in social plugin integrates with Google Fonts and will automatically download the font files for you. The font property accepts a family and style property, where the family must be set to the name of the font, and the style to one of the supported font styles. For example, setting family to Roboto will automatically download the following files:

                    .cache/plugins/social/fonts
                    +└─ Roboto/
                    +    ├─ Black.ttf
                    +    ├─ Black Italic.ttf
                    +    ├─ Bold.ttf
                    +    ├─ Bold Italic.ttf
                    +    ├─ Italic.ttf
                    +    ├─ Light.ttf
                    +    ├─ Light Italic.ttf
                    +    ├─ Medium.ttf
                    +    ├─ Medium Italic.ttf
                    +    ├─ Regular.ttf
                    +    ├─ Thin.ttf
                    +    └─ Thin Italic.ttf
                    +

                    In that case, the author can use Bold or Medium Italic as the style. If the font style specified in the layer is not part of the font family, the font always falls back to Regular and prints a warning in debug mode, as Regular is included with all font families.

                    Icons

                    Authors can leverage the full range of icons that are shipped with Material for MkDocs, or even provide custom icons by using theme extension and going through the process described in the guide on additional icons. Icons can even be tinted by using the color property:

                    size: { width: 1200, height: 630 }
                    +layers:
                    +  - background:
                    +      color: "#4051b5"
                    +  - size: { width: 144, height: 144 }
                    +    offset: { x: 992, y: 64 }
                    +    icon:
                    +      value: material/cat
                    +      color: white
                    +

                    This will render the icon in the top right corner of the social card:

                    Layer icon

                    The possibilities are endless. For example, icons can be used to draw shapes like circles:

                    size: { width: 1200, height: 630 }
                    +layers:
                    +  - background:
                    +      color: "#4051b5"
                    +  - size: { width: 2400, height: 2400 }
                    +    offset: { x: -1024, y: 64 }
                    +    icon:
                    +      value: material/circle
                    +      color: "#5c6bc0"
                    +  - size: { width: 1800, height: 1800 }
                    +    offset: { x: 512, y: -1024 }
                    +    icon:
                    +      value: material/circle
                    +      color: "#3949ab"
                    +

                    This will add two circles to the background:

                    Layer icon circles

                    Tags

                    The new built-in social plugin gives full flexibility of the meta tags that are added to your site, which are necessary to instruct services like Twitter or Discord how to display your social card. All default layouts use the following set of tags, which you can copy to your layout and adapt:

                    definitions:
                    +
                    +  - &page_title_with_site_name >-
                    +    {%- if not page.is_homepage -%}
                    +      {{ page.meta.get("title", page.title) }} - {{ config.site_name }}
                    +    {%- else -%}
                    +      {{ page.meta.get("title", page.title) }}
                    +    {%- endif -%}
                    +
                    +  - &page_description >-
                    +    {{ page.meta.get("description", config.site_description) or "" }}
                    +
                    +tags:
                    +
                    +  og:type: website
                    +  og:title: *page_title_with_site_name
                    +  og:description: *page_description
                    +  og:image: "{{ image.url }}"
                    +  og:image:type: "{{ image.type }}"
                    +  og:image:width: "{{ image.width }}"
                    +  og:image:height: "{{ image.height }}"
                    +  og:url: "{{ page.canonical_url }}"
                    +
                    +  twitter:card: summary_large_image
                    +  twitter:title: *page_title_with_site_name
                    +  twitter:description: *page_description
                    +  twitter:image: "{{ image.url }}"
                    +

                    Note that this examples makes use of YAML anchors to minify repetition. The definitions property is solely intended for the definition on aliases that can then be referenced with anchors.

                    Are you missing something? Please open a discussion and let us know!


                    1. If the plugin would require the author to specify the font size and line height manually, it would be impossible to guarantee that the text fits into the layer. For this reason we implemented a declarative approach, where the author specifies the desired line height and number of lines, and the plugin computes the font size automatically. 

                    \ No newline at end of file diff --git a/setup/setting-up-tags/index.html b/setup/setting-up-tags/index.html new file mode 100755 index 0000000..5276985 --- /dev/null +++ b/setup/setting-up-tags/index.html @@ -0,0 +1,66 @@ + Setting up tags - 一抹雨烟

                    Setting up tags

                    Material for MkDocs adds first-class support for categorizing pages with tags, which adds the possibility to group related pages and make them discoverable via search and a dedicated tags index. If your documentation is large, tags can help to discover relevant information faster.

                    Configuration

                    Built-in tags plugin

                    8.2.0

                    The built-in tags plugin adds the ability to categorize any page with tags as part of the front matter of the page. In order to add support for tags, add the following lines to mkdocs.yml:

                    plugins:
                    +  - tags
                    +

                    For a list of all settings, please consult the plugin documentation.

                    Tag icons and identifiers

                    8.5.0 .zip

                    Each tag can be associated with an icon, which is then rendered inside the tag. Before assigning icons to tags, associate each tag with a unique identifier, by adding the following to mkdocs.yml:

                    extra:
                    +  tags:
                    +    <tag>: <identifier> # (1)!
                    +
                    1. The identifier can only include alphanumeric characters, as well as dashes and underscores. For example, if you have a tag Compatibility, you can set compat as an identifier:

                      extra:
                      +  tags:
                      +    Compatibility: compat
                      +

                      Identifiers can be reused between tags. Tags which are not explicitly associated will use the default tag icon which is

                    Next, each identifier can be associated with an icon, even a custom icon, by adding the following lines to mkdocs.yml under the theme.icon configuration setting:

                    theme:
                    +  icon:
                    +    tag:
                    +      <identifier>: <icon> # (1)!
                    +
                    1. Enter a few keywords to find the perfect icon using our icon search and click on the shortcode to copy it to your clipboard:

                      theme:
                      +  icon:
                      +    tag:
                      +      default: <icon>
                      +
                      Expand to inspect example
                      theme:
                      +  icon:
                      +    tag:
                      +      html: fontawesome/brands/html5
                      +      js: fontawesome/brands/js
                      +      css:  fontawesome/brands/css3
                      +extra:
                      +  tags:
                      +    HTML5: html
                      +    JavaScript: js
                      +    CSS: css
                      +

                      Usage

                      Adding tags

                      8.2.0 .zip

                      When the built-in tags plugin is enabled, tags can be added for a document with the front matter tags property. Add the following lines at the top of a Markdown file:

                      ---
                      +tags:
                      +  - HTML5
                      +  - JavaScript
                      +  - CSS
                      +---
                      +
                      +...
                      +

                      The page will now render with those tags above the main headline and within the search preview, which now allows to find pages by tags.

                      How to set tags for an entire folder?

                      With the help of the built-in meta plugin, you can ensure that tags are set for an entire section and all nested pages, by creating a .meta.yml file in the corresponding folder with the following content:

                      tags:
                      +  - HTML5
                      +  - JavaScript
                      +  - CSS
                      +

                      The tags set in .meta.yml are merged and deduplicated with the tags defined for a page, which means you can define common tags in .meta.yml and then add specific tags for each page. The tags in .meta.yml are appended.

                      Adding a tags index

                      8.2.0 .zip

                      The built-in tags plugin allows to define a file to render a tags index, which can be any page that is part of the nav section. To add a tags index, create a page, e.g. tags.md:

                      # Tags
                      +
                      +Following is a list of relevant tags:
                      +
                      +[TAGS]
                      +

                      Then in your mkdocs.yml file, add the following.

                      plugins:
                      +  - tags:
                      +      tags_file: tags.md
                      +

                      Note that the path to tags.md is relative to the docs/ directory.

                      The [TAGS] marker specifies the position of the tags index, i.e. it is replaced with the actual tags index when the page is rendered. You can include arbitrary content before and after the marker:

                      Tags index

                      Hiding tags on a page

                      While the tags are rendered above the main headline, sometimes, it might be desirable to hide them for a specific page, which can be achieved with the front matter hide property:

                      ---
                      +hide:
                      +  - tags
                      +---
                      +
                      +# Page title
                      +...
                      +
                      \ No newline at end of file diff --git a/setup/setting-up-the-footer/index.html b/setup/setting-up-the-footer/index.html new file mode 100755 index 0000000..87faf23 --- /dev/null +++ b/setup/setting-up-the-footer/index.html @@ -0,0 +1,42 @@ + Setting up the footer - 一抹雨烟

                      Setting up the footer

                      The footer of your project documentation is a great place to add links to websites or platforms you or your company are using as additional marketing channels, e.g. or , which you can easily configure via mkdocs.yml.

                      Configuration

                      9.0.0

                      The footer can include links to the previous and next page of the current page. If you wish to enable this behavior, add the following lines to mkdocs.yml:

                      theme:
                      +  features:
                      +    - navigation.footer
                      +

                      1.0.0

                      Social links are rendered next to the copyright notice as part of the footer of your project documentation. Add a list of social links in mkdocs.yml with:

                      extra:
                      +  social:
                      +    - icon: fontawesome/brands/mastodon # (1)!
                      +      link: https://fosstodon.org/@squidfunk
                      +
                      1. Enter a few keywords to find the perfect icon using our icon search and click on the shortcode to copy it to your clipboard:

                        The following properties are available for each link:

                        icon

                        This property must contain a valid path to any icon bundled with the theme, or the build will not succeed. Some popular choices:

                        • fontawesome/brands/github
                        • fontawesome/brands/gitlab
                        • fontawesome/brands/x-twitter
                        • fontawesome/brands/mastodon automatically adds rel=me
                        • fontawesome/brands/docker
                        • fontawesome/brands/facebook
                        • fontawesome/brands/instagram
                        • fontawesome/brands/linkedin
                        • fontawesome/brands/slack
                        • fontawesome/brands/discord
                        • fontawesome/brands/pied-piper-alt
                        link

                        This property must be set to a relative or absolute URL including the URI scheme. All URI schemes are supported, including mailto and bitcoin:

                        extra:
                        +  social:
                        +    - icon: fontawesome/brands/mastodon
                        +      link: https://fosstodon.org/@squidfunk
                        +
                        extra:
                        +  social:
                        +    - icon: fontawesome/solid/paper-plane
                        +      link: mailto:<email-address>
                        +
                        name

                        domain name from link, if available This property is used as the link's title attribute and can be set to a discernable name to improve accessibility:

                        extra:
                        +  social:
                        +    - icon: fontawesome/brands/mastodon
                        +      link: https://fosstodon.org/@squidfunk
                        +      name: squidfunk on Fosstodon
                        +

                        0.1.0

                        A custom copyright banner can be rendered as part of the footer, which is displayed next to the social links. It can be defined as part of mkdocs.yml:

                        copyright: Copyright &copy; 2016 - 2020 Martin Donath
                        +

                        Generator notice

                        7.3.0 true

                        The footer displays a Made with Material for MkDocs notice to denote how the site was generated. The notice can be removed with the following option via mkdocs.yml:

                        extra:
                        +  generator: false
                        +

                        Please read this before removing the generator notice

                        The subtle Made with Material for MkDocs hint in the footer is one of the reasons why this project is so popular, as it tells the user how the site is generated, helping new users to discover this project. Before removing please consider that you're enjoying the benefits of @squidfunk's work for free, as this project is Open Source and has a permissive license. Thousands of hours went into this project, most of them without any financial return.

                        Thus, if you remove this notice, please consider sponsoring the project. Thank you

                        Usage

                        The footer navigation showing links to the previous and next page can be hidden with the front matter hide property. Add the following lines at the top of a Markdown file:

                        ---
                        +hide:
                        +  - footer
                        +---
                        +
                        +# Page title
                        +...
                        +

                        Customization

                        8.0.0

                        In order to customize and override the copyright notice, extend the theme and override the copyright.html partial, which normally includes the copyright property set in mkdocs.yml.

                        \ No newline at end of file diff --git a/setup/setting-up-the-header/index.html b/setup/setting-up-the-header/index.html new file mode 100755 index 0000000..5a14f72 --- /dev/null +++ b/setup/setting-up-the-header/index.html @@ -0,0 +1,23 @@ + Setting up the header - 一抹雨烟

                        Setting up the header

                        Material for MkDocs' header can be customized to show an announcement bar that disappears upon scrolling, and provides some options for further configuration. It also includes the search bar and a place to display your project's git repository, as explained in those dedicated guides.

                        Configuration

                        Automatic hiding

                        6.2.0

                        When autohiding is enabled, the header is automatically hidden when the user scrolls past a certain threshold, leaving more space for content. Add the following lines to mkdocs.yml:

                        theme:
                        +  features:
                        +    - header.autohide
                        +

                        Announcement bar

                        5.0.0

                        Material for MkDocs includes an announcement bar, which is the perfect place to display project news or other important information to the user. When the user scrolls past the header, the bar will automatically disappear. In order to add an announcement bar, extend the theme and override the announce block, which is empty by default:

                        {% extends "base.html" %}
                        +
                        +{% block announce %}
                        +  <!-- Add announcement here, including arbitrary HTML -->
                        +{% endblock %}
                        +

                        Mark as read

                        8.4.0

                        In order to render temporary announcements that can be marked as read by the user, a button to dismiss the current announcement can be included. Add the following lines to mkdocs.yml:

                        theme:
                        +  features:
                        +    - announce.dismiss
                        +

                        When the user clicks the button, the current announcement is dismissed and not displayed again until the content of the announcement changes. This is handled automatically.

                        Scroll to the top of this page to see it in action.

                        \ No newline at end of file diff --git a/setup/setting-up-versioning/index.html b/setup/setting-up-versioning/index.html new file mode 100755 index 0000000..0f14957 --- /dev/null +++ b/setup/setting-up-versioning/index.html @@ -0,0 +1,34 @@ + Setting up versioning - 一抹雨烟

                        Setting up versioning

                        Material for MkDocs makes it easy to deploy multiple versions of your project documentation by integrating with external utilities that add those capabilities to MkDocs, i.e. mike. When deploying a new version, older versions of your documentation remain untouched.

                        Configuration

                        Versioning

                        7.0.0 mike

                        mike makes it easy to deploy multiple versions of your project documentation. It integrates natively with Material for MkDocs and can be enabled via mkdocs.yml:

                        extra:
                        +  version:
                        +    provider: mike
                        +

                        This renders a version selector in the header:

                        Version selector preview

                        Check out the versioning example to see it in action – squidfunk.github.io/mkdocs-material-example-versioning

                        Why use mike?

                        mike is built around the idea that once you've generated your docs for a particular version, you should never need to touch that version again. This means you never have to worry about breaking changes in MkDocs, since your old docs (built with an old version of MkDocs) are already generated and sitting in your gh-pages branch.

                        While mike is flexible, it's optimized around putting your docs in a <major>.<minor> directory, with optional aliases (e.g. latest or dev) to particularly notable versions. This makes it easy to make permalinks to whatever version of the documentation you want to direct people to.

                        Stay on the same page when switching versions

                        When the user chooses a version in the version selector, they usually want to go to the page corresponding to the page they were previously viewing. Material for MkDocs implements this behavior by default, but there are a few caveats:

                        • the [site_url] must be set correctly in mkdocs.yml. See the "Publishing a new version" section for an example.
                        • you must be viewing the site at that URL (and not locally, for example).
                        • the redirect happens via JavaScript and there is no way to know which page you will be redirected to ahead of time.

                        Version warning

                        8.0.0

                        If you're using versioning, you might want to display a warning when the user visits any other version than the latest version. Using theme extension, you can override the outdated block:

                        {% extends "base.html" %}
                        +
                        +{% block outdated %}
                        +  You're not viewing the latest version.
                        +  <a href="{{ '../' ~ base_url }}"> <!-- (1)! -->
                        +    <strong>Click here to go to latest.</strong>
                        +  </a>
                        +{% endblock %}
                        +
                        1. Given this value for the href attribute, the link will always redirect to the root of your site, which will then redirect to the latest version. This ensures that older versions of your site do not depend on a specific alias, e.g. latest, to allow for changing the alias later on without breaking earlier versions.

                        This will render a version warning above the header:

                        Version warning preview

                        The default version is identified by the latest alias. If you wish to set another alias as the latest version, e.g. stable, add the following lines to mkdocs.yml:

                        extra:
                        +  version:
                        +    default: stable # (1)!
                        +
                        1. You can also define multiple aliases as the default version, e.g. stable and development.

                          extra:
                          +  version:
                          +    default:
                          +      - stable
                          +      - development
                          +

                          Now every version that has the stable and development aliases will not display the version warning.

                        Make sure one alias matches the default version, as this is where users are redirected to.

                        Usage

                        While this section outlines the basic workflow for publishing new versions, it's best to check out mike's documentation to make yourself familiar with its mechanics.

                        Publishing a new version

                        If you want to publish a new version of your project documentation, choose a version identifier and update the alias set as the default version with:

                        mike deploy --push --update-aliases 0.1 latest
                        +

                        Note that every version will be deployed as a subdirectory of your site_url, which you should set explicitly. For example, if your mkdocs.yml contains:

                        site_url: 'https://docs.example.com/'  # Trailing slash is recommended
                        +

                        the documentation will be published to URLs such as:

                        • docs.example.com/0.1/
                        • docs.example.com/0.2/
                        • ...

                        Setting a default version

                        When starting with mike, a good idea is to set an alias as a default version, e.g. latest, and when publishing a new version, always update the alias to point to the latest version:

                        mike set-default --push latest
                        +

                        When publishing a new version, mike will create a redirect in the root of your project documentation to the version associated with the alias:

                        docs.example.com docs.example.com/0.1

                        \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100755 index 0000000..b410d21 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,423 @@ + + + + https://yimoyuyan.github.io/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/alternatives/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/browser-support/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/conventions/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/creating-your-site/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/customization/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/enterprise-support/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/getting-started/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/license/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/philosophy/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/publishing-your-site/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/upgrade/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/blog/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/blog/posts/blog-support-just-landed/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/blog/posts/chinese-search-support/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/blog/posts/excluding-content-from-search/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/blog/posts/git-sparse-checkout/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/blog/posts/search-better-faster-smaller/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/blog/posts/sunsetting-gitter/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/blog/posts/the-past-present-and-future/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/changelog/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/documentations/Changelog/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/documentations/8.%E5%B7%A5%E4%BD%9C%E7%9F%A5%E8%AF%86%E5%BA%93/S3D/%E5%9F%B9%E8%AE%AD/%E5%BC%80%E5%8F%91%E5%9F%B9%E8%AE%AD134762320240108/NameRule/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/documentations/8.%E5%B7%A5%E4%BD%9C%E7%9F%A5%E8%AF%86%E5%BA%93/S3D/%E5%9F%B9%E8%AE%AD/%E5%BC%80%E5%8F%91%E5%9F%B9%E8%AE%AD134762320240108/Visual_Studio_Install/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/guides/creating-a-reproduction/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/insiders/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/insiders/getting-started/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/insiders/upgrade/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/insiders/changelog/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/insiders/community-experts-program/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/insiders/faq/sponsoring/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/blog/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/group/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/info/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/meta/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/offline/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/optimize/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/privacy/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/projects/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/search/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/social/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/tags/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/typeset/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/requirements/caching/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/plugins/requirements/image-processing/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/admonitions/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/annotations/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/buttons/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/code-blocks/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/content-tabs/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/data-tables/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/diagrams/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/footnotes/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/formatting/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/grids/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/icons-emojis/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/images/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/lists/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/math/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/reference/tooltips/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/adding-a-comment-system/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/adding-a-git-repository/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/building-an-optimized-site/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/building-for-offline-usage/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/changing-the-colors/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/changing-the-fonts/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/changing-the-language/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/changing-the-logo-and-icons/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/ensuring-data-privacy/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/setting-up-a-blog/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/setting-up-navigation/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/setting-up-site-analytics/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/setting-up-site-search/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/setting-up-social-cards/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/setting-up-tags/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/setting-up-the-footer/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/setting-up-the-header/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/setting-up-versioning/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/extensions/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/extensions/python-markdown-extensions/ + 2024-01-09 + daily + + + https://yimoyuyan.github.io/setup/extensions/python-markdown/ + 2024-01-09 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100755 index 0000000..8c41531 Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/upgrade/index.html b/upgrade/index.html new file mode 100755 index 0000000..69aedbe --- /dev/null +++ b/upgrade/index.html @@ -0,0 +1,1423 @@ + How to upgrade - 一抹雨烟

                        How to upgrade

                        Upgrade to the latest version with:

                        pip install --upgrade --force-reinstall mkdocs-material
                        +

                        Show the currently installed version with:

                        pip show mkdocs-material
                        +

                        Upgrading from 8.x to 9.x

                        This major release includes a brand new search implementation that is faster and allows for rich previews, advanced tokenization and better highlighting. It was available as part of Insiders for over a year, and now that the funding goal was hit, makes its way into the community edition.

                        Changes to mkdocs.yml

                        content.code.copy

                        The copy-to-clipboard buttons are now opt-in and can be enabled or disabled per block. If you wish to enable them for all code blocks, add the following lines to mkdocs.yml:

                        theme:
                        +  features:
                        +    - content.code.copy
                        +

                        content.action.*

                        A "view source" button can be shown next to the "edit this page" button, both of which must now be explicitly enabled. Add the following lines to mkdocs.yml:

                        theme:
                        +  features:
                        +    - content.action.edit
                        +    - content.action.view
                        +

                        The previous and next buttons in the footer are now opt-in. If you wish to keep them for your documentation, add the following lines to mkdocs.yml:

                        theme:
                        +  features:
                        +    - navigation.footer
                        +

                        theme.language

                        The Korean and Norwegian language codes were renamed, as they were non-standard:

                        • kr to ko
                        • no to nb

                        feedback.ratings

                        The old, nameless placeholders were removed (after being deprecated for several months). Make sure to switch to the new named placeholders {title} and {url}:

                        https://github.com/.../issues/new/?title=[Feedback]+{title}+-+{url}
                        +

                        Changes to *.html files

                        The templates have undergone a series of changes. If you have customized Material for MkDocs with theme extension, be sure to incorporate the latest changes into your templates. A good starting point is to inspect the diff.

                        Built-in plugins not working after upgrade?

                        If one of the built-in plugins (search or tags) doesn't work anymore without any apparent error or cause, it is very likely related to custom overrides. MkDocs 1.4.1 and above allow themes to namespace built-in plugins, which Material for MkDocs 9 now does in order to allow authors to use third-party plugins with the same name as built-in plugins. Search your overrides for "in config.plugins" and add the material/ namespace. Affected partials:

                        Upgrading from 7.x to 8.x

                        What's new?

                        • Added support for code annotations
                        • Added support for anchor tracking
                        • Added support for version warning
                        • Added copyright partial for easier override
                        • Removed deprecated content tabs legacy implementation
                        • Removed deprecated seealso admonition type
                        • Removed deprecated site_keywords setting (unsupported by MkDocs)
                        • Removed deprecated prebuilt search index support
                        • Removed deprecated web app manifest – use customization
                        • Removed extracopyright variable – use new copyright partial
                        • Removed Disqus integration – use customization
                        • Switched to :is() selectors for simple selector lists
                        • Switched autoprefixer from last 4 years to last 2 years
                        • Improved CSS overall to match modern standards
                        • Improved CSS variable semantics for fonts
                        • Improved extensibility by restructuring partials
                        • Improved handling of details when printing
                        • Improved keyboard navigation for footnotes
                        • Fixed #3214: Search highlighting breaks site when empty

                        Changes to mkdocs.yml

                        pymdownx.tabbed

                        Support for the legacy style of the Tabbed extension was dropped in favor of the new, alternate implementation which has better behavior on mobile viewports:

                        markdown_extensions:
                        +  - pymdownx.tabbed:
                        +      alternate_style: true
                        +
                        markdown_extensions:
                        +  - pymdownx.tabbed
                        +

                        pymdownx.superfences

                        The *-experimental suffix must be removed from the custom fence class property, which is used to target code blocks to be rendered as diagrams using Mermaid.js:

                        markdown_extensions:
                        +  - pymdownx.superfences:
                        +      custom_fences:
                        +        - name: mermaid
                        +          class: mermaid
                        +          format: !!python/name:pymdownx.superfences.fence_code_format
                        +
                        markdown_extensions:
                        +  - pymdownx.superfences:
                        +      custom_fences:
                        +        - name: mermaid
                        +          class: mermaid-experimental
                        +          format: !!python/name:pymdownx.superfences.fence_code_format
                        +

                        google_analytics

                        This option was deprecated in MkDocs 1.2.0, as the implementation of a JavaScript-based analytics integration is the responsibility of a theme. The following lines must be changed:

                        extra:
                        +  analytics:
                        +    provider: google
                        +    property: UA-XXXXXXXX-X
                        +
                        google_analytics:
                        +  - UA-XXXXXXXX-X
                        +  - auto
                        +

                        Changes to *.html files

                        The templates have undergone a set of changes to make them future-proof. If you've used theme extension to override a block or template, make sure that it matches the new structure:

                        • If you've overridden a block, check base.html for potential changes
                        • If you've overridden a template, check the respective *.html file for potential changes
                        @@ -13,11 +13,6 @@
                        +       {% elif config.site_description %}
                        +         <meta name="description" content="{{ config.site_description }}">
                        +       {% endif %}
                        +-      {% if page and page.meta and page.meta.keywords %}
                        +-        <meta name="keywords" content="{{ page.meta.keywords }}">
                        +-      {% elif config.site_keywords %}
                        +-        <meta name="keywords" content="{{ config.site_keywords }}">
                        +-      {% endif %}
                        +       {% if page and page.meta and page.meta.author %}
                        +         <meta name="author" content="{{ page.meta.author }}">
                        +       {% elif config.site_author %}
                        +@@ -61,15 +56,13 @@
                        +             font.text | replace(' ', '+') + ':300,400,400i,700%7C' +
                        +             font.code | replace(' ', '+')
                        +           }}&display=fallback">
                        +-        <style>:root{--md-text-font-family:"{{ font.text }}";--md-code-font-family:"{{ font.code }}"}</style>
                        ++        <style>:root{--md-text-font:"{{ font.text }}";--md-code-font:"{{ font.code }}"}</style>
                        +       {% endif %}
                        +     {% endblock %}
                        +-    {% if config.extra.manifest %}
                        +-      <link rel="manifest" href="{{ config.extra.manifest | url }}" crossorigin="use-credentials">
                        +-    {% endif %}
                        +     {% for path in config["extra_css"] %}
                        +       <link rel="stylesheet" href="{{ path | url }}">
                        +     {% endfor %}
                        ++    {% include "partials/javascripts/base.html" %}
                        +     {% block analytics %}
                        +       {% include "partials/integrations/analytics.html" %}
                        +     {% endblock %}
                        +@@ -89,7 +82,6 @@
                        +     <body dir="{{ direction }}">
                        +   {% endif %}
                        +     {% set features = config.theme.features or [] %}
                        +-    {% include "partials/javascripts/base.html" %}
                        +     {% if not config.theme.palette is mapping %}
                        +       {% include "partials/javascripts/palette.html" %}
                        +     {% endif %}
                        +@@ -106,13 +98,25 @@
                        +     </div>
                        +     <div data-md-component="announce">
                        +       {% if self.announce() %}
                        +-        <aside class="md-banner md-announce">
                        +-          <div class="md-banner__inner md-announce__inner md-grid md-typeset">
                        ++        <aside class="md-banner">
                        ++          <div class="md-banner__inner md-grid md-typeset">
                        +             {% block announce %}{% endblock %}
                        +           </div>
                        +         </aside>
                        +       {% endif %}
                        +     </div>
                        ++    {% if config.extra.version %}
                        ++      <div data-md-component="outdated" hidden>
                        ++        <aside class="md-banner md-banner--warning">
                        ++          {% if self.outdated() %}
                        ++            <div class="md-banner__inner md-grid md-typeset">
                        ++              {% block outdated %}{% endblock %}
                        ++            </div>
                        ++            {% include "partials/javascripts/outdated.html" %}
                        ++          {% endif %}
                        ++        </aside>
                        ++      </div>
                        ++    {% endif %}
                        +     {% block header %}
                        +       {% include "partials/header.html" %}
                        +     {% endblock %}
                        +@@ -156,25 +160,7 @@
                        +           <div class="md-content" data-md-component="content">
                        +             <article class="md-content__inner md-typeset">
                        +               {% block content %}
                        +-                {% if page.edit_url %}
                        +-                  <a href="{{ page.edit_url }}" title="{{ lang.t('edit.link.title') }}" class="md-content__button md-icon">
                        +-                    {% include ".icons/material/pencil.svg" %}
                        +-                  </a>
                        +-                {% endif %}
                        +-                {% if not "\x3ch1" in page.content %}
                        +-                  <h1>{{ page.title | d(config.site_name, true)}}</h1>
                        +-                {% endif %}
                        +-                {{ page.content }}
                        +-                {% if page and page.meta %}
                        +-                  {% if page.meta.git_revision_date_localized or
                        +-                        page.meta.revision_date
                        +-                  %}
                        +-                    {% include "partials/source-file.html" %}
                        +-                  {% endif %}
                        +-                {% endif %}
                        +-              {% endblock %}
                        +-              {% block disqus %}
                        +-                {% include "partials/integrations/disqus.html" %}
                        ++                {% include "partials/content.html" %}
                        +               {% endblock %}
                        +             </article>
                        +           </div>
                        +
                        @@ -38,13 +38,6 @@
                        +         <meta name="description" content="{{ config.site_description }}" />
                        +       {% endif %}
                        +
                        +-      <!-- Page keywords -->
                        +-      {% if page and page.meta and page.meta.keywords %}
                        +-        <meta name="keywords" content="{{ page.meta.keywords }}" />
                        +-      {% elif config.site_keywords %}
                        +-        <meta name="keywords" content="{{ config.site_keywords }}" />
                        +-      {% endif %}
                        +-
                        +       <!-- Page author -->
                        +       {% if page and page.meta and page.meta.author %}
                        +         <meta name="author" content="{{ page.meta.author }}" />
                        +@@ -120,27 +113,21 @@
                        +         />
                        +         <style>
                        +           :root {
                        +-            --md-text-font-family: "{{ font.text }}";
                        +-            --md-code-font-family: "{{ font.code }}";
                        ++            --md-text-font: "{{ font.text }}";
                        ++            --md-code-font: "{{ font.code }}";
                        +           }
                        +         </style>
                        +       {% endif %}
                        +     {% endblock %}
                        +
                        +-    <!-- Progressive Web App Manifest -->
                        +-    {% if config.extra.manifest %}
                        +-      <link
                        +-        rel="manifest"
                        +-        href="{{ config.extra.manifest | url }}"
                        +-        crossorigin="use-credentials"
                        +-      />
                        +-    {% endif %}
                        +-
                        +     <!-- Custom style sheets -->
                        +     {% for path in config["extra_css"] %}
                        +       <link rel="stylesheet" href="{{ path | url }}" />
                        +     {% endfor %}
                        +
                        ++    <!-- Helper functions for inline scripts -->
                        ++    {% include "partials/javascripts/base.html" %}
                        ++
                        +     <!-- Analytics -->
                        +     {% block analytics %}
                        +       {% include "partials/integrations/analytics.html" %}
                        +@@ -172,7 +159,6 @@
                        +
                        +     <!-- Retrieve features from configuration -->
                        +     {% set features = config.theme.features or [] %}
                        +-    {% include "partials/javascripts/base.html" %}
                        +
                        +     <!-- User preference: color palette -->
                        +     {% if not config.theme.palette is mapping %}
                        +@@ -214,14 +200,28 @@
                        +     <!-- Announcement bar -->
                        +     <div data-md-component="announce">
                        +       {% if self.announce() %}
                        +-        <aside class="md-banner md-announce">
                        +-          <div class="md-banner__inner md-announce__inner md-grid md-typeset">
                        ++        <aside class="md-banner">
                        ++          <div class="md-banner__inner md-grid md-typeset">
                        +             {% block announce %}{% endblock %}
                        +           </div>
                        +         </aside>
                        +       {% endif %}
                        +     </div>
                        +
                        ++    <!-- Version warning -->
                        ++    {% if config.extra.version %}
                        ++      <div data-md-component="outdated" hidden>
                        ++        <aside class="md-banner md-banner--warning">
                        ++          {% if self.outdated() %}
                        ++            <div class="md-banner__inner md-grid md-typeset">
                        ++              {% block outdated %}{% endblock %}
                        ++            </div>
                        ++            {% include "partials/javascripts/outdated.html" %}
                        ++          {% endif %}
                        ++        </aside>
                        ++      </div>
                        ++    {% endif %}
                        ++
                        +     <!-- Header -->
                        +     {% block header %}
                        +       {% include "partials/header.html" %}
                        +@@ -295,49 +295,11 @@
                        +               {% block content %}
                        +-
                        +-                <!-- Edit button -->
                        +-                {% if page.edit_url %}
                        +-                  <a
                        +-                    href="{{ page.edit_url }}"
                        +-                    title="{{ lang.t('edit.link.title') }}"
                        +-                    class="md-content__button md-icon"
                        +-                  >
                        +-                    {% include ".icons/material/pencil.svg" %}
                        +-                  </a>
                        +-                {% endif %}
                        +-
                        +-                <!--
                        +-                  Hack: check whether the content contains a h1 headline. If it
                        +-                  doesn't, the page title (or respectively site name) is used
                        +-                  as the main headline.
                        +-                -->
                        +-                {% if not "\x3ch1" in page.content %}
                        +-                  <h1>{{ page.title | d(config.site_name, true)}}</h1>
                        +-                {% endif %}
                        +-
                        +-                <!-- Markdown content -->
                        +-                {{ page.content }}
                        +-
                        +-                <!-- Last update of source file -->
                        +-                {% if page and page.meta %}
                        +-                  {% if page.meta.git_revision_date_localized or
                        +-                        page.meta.revision_date
                        +-                  %}
                        +-                    {% include "partials/source-file.html" %}
                        +-                  {% endif %}
                        +-                {% endif %}
                        +-              {% endblock %}
                        +-
                        +-              <!-- Disqus integration -->
                        +-              {% block disqus %}
                        +-                {% include "partials/integrations/disqus.html" %}
                        ++                {% include "partials/content.html" %}
                        +               {% endblock %}
                        +             </article>
                        +           </div>
                        +
                        @@ -0,0 +1,16 @@
                        ++{#-
                        ++  This file was automatically generated - do not edit
                        ++-#}
                        ++<div class="md-copyright">
                        ++  {% if config.copyright %}
                        ++    <div class="md-copyright__highlight">
                        ++      {{ config.copyright }}
                        ++    </div>
                        ++  {% endif %}
                        ++  {% if not config.extra.generator == false %}
                        ++    Made with
                        ++    <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
                        ++      Material for MkDocs
                        ++    </a>
                        ++  {% endif %}
                        ++</div>
                        +
                        @@ -41,21 +40,10 @@
                        +   {% endif %}
                        +   <div class="md-footer-meta md-typeset">
                        +     <div class="md-footer-meta__inner md-grid">
                        +-      <div class="md-footer-copyright">
                        +-        {% if config.copyright %}
                        +-          <div class="md-footer-copyright__highlight">
                        +-            {{ config.copyright }}
                        +-          </div>
                        +-        {% endif %}
                        +-        {% if not config.extra.generator == false %}
                        +-          Made with
                        +-          <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
                        +-            Material for MkDocs
                        +-          </a>
                        +-        {% endif %}
                        +-        {{ extracopyright }}
                        +-      </div>
                        +-      {% include "partials/social.html" %}
                        ++      {% include "partials/copyright.html" %}
                        ++      {% if config.extra.social %}
                        ++        {% include "partials/social.html" %}
                        ++      {% endif %}
                        +     </div>
                        +   </div>
                        + </footer>
                        +
                        @@ -4,17 +4,15 @@
                        +-{% if config.extra.social %}
                        +-  <div class="md-footer-social">
                        +-    {% for social in config.extra.social %}
                        +-      {% set title = social.name %}
                        +-      {% if not title and "//" in social.link %}
                        +-        {% set _,url = social.link.split("//") %}
                        +-        {% set title = url.split("/")[0] %}
                        +-      {% endif %}
                        +-      <a href="{{ social.link }}" target="_blank" rel="noopener" title="{{ title | e }}" class="md-footer-social__link">
                        +-        {% include ".icons/" ~ social.icon ~ ".svg" %}
                        +-      </a>
                        +-    {% endfor %}
                        +-  </div>
                        +-{% endif %}
                        ++<div class="md-social">
                        ++  {% for social in config.extra.social %}
                        ++    {% set title = social.name %}
                        ++    {% if not title and "//" in social.link %}
                        ++      {% set _, url = social.link.split("//") %}
                        ++      {% set title  = url.split("/")[0] %}
                        ++    {% endif %}
                        ++    <a href="{{ social.link }}" target="_blank" rel="noopener" title="{{ title | e }}" class="md-social__link">
                        ++      {% include ".icons/" ~ social.icon ~ ".svg" %}
                        ++    </a>
                        ++  {% endfor %}
                        ++</div>
                        +

                        Upgrading from 6.x to 7.x

                        What's new?

                        • Added support for deploying multiple versions
                        • Added support for integrating a language selector
                        • Added support for rendering admonitions as inline blocks
                        • Rewrite of the underlying reactive architecture
                        • Removed Webpack in favor of reactive build strategy (–480 dependencies)
                        • Fixed keyboard navigation for code blocks after content tabs switch

                        Changes to mkdocs.yml

                        extra.version.method

                        The versioning method configuration was renamed to extra.version.provider to allow for different versioning strategies in the future:

                        extra:
                        +  version:
                        +    provider: mike
                        +
                        extra:
                        +  version:
                        +    method: mike
                        +

                        Changes to *.html files

                        The templates have undergone a set of changes to make them future-proof. If you've used theme extension to override a block or template, make sure that it matches the new structure:

                        • If you've overridden a block, check base.html for potential changes
                        • If you've overridden a template, check the respective *.html file for potential changes
                        @@ -61,7 +61,7 @@
                        +             font.text | replace(' ', '+') + ':300,400,400i,700%7C' +
                        +             font.code | replace(' ', '+')
                        +           }}&display=fallback">
                        +-        <style>body,input{font-family:"{{ font.text }}",-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"{{ font.code }}",SFMono-Regular,Consolas,Menlo,monospace}</style>
                        ++        <style>:root{--md-text-font-family:"{{ font.text }}";--md-code-font-family:"{{ font.code }}"}</style>
                        +       {% endif %}
                        +     {% endblock %}
                        +     {% if config.extra.manifest %}
                        +@@ -131,7 +131,7 @@
                        +               {% if page and page.meta and page.meta.hide %}
                        +                 {% set hidden = "hidden" if "navigation" in page.meta.hide %}
                        +               {% endif %}
                        +-              <div class="md-sidebar md-sidebar--primary" data-md-component="navigation" {{ hidden }}>
                        ++              <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" {{ hidden }}>
                        +                 <div class="md-sidebar__scrollwrap">
                        +                   <div class="md-sidebar__inner">
                        +                     {% include "partials/nav.html" %}
                        +@@ -143,7 +143,7 @@
                        +               {% if page and page.meta and page.meta.hide %}
                        +                 {% set hidden = "hidden" if "toc" in page.meta.hide %}
                        +               {% endif %}
                        +-              <div class="md-sidebar md-sidebar--secondary" data-md-component="toc" {{ hidden }}>
                        ++              <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" {{ hidden }}>
                        +                 <div class="md-sidebar__scrollwrap">
                        +                   <div class="md-sidebar__inner">
                        +                     {% include "partials/toc.html" %}
                        +@@ -152,7 +152,7 @@
                        +               </div>
                        +             {% endif %}
                        +           {% endblock %}
                        +-          <div class="md-content">
                        ++          <div class="md-content" data-md-component="content">
                        +             <article class="md-content__inner md-typeset">
                        +               {% block content %}
                        +                 {% if page.edit_url %}
                        +@@ -183,10 +183,18 @@
                        +         {% include "partials/footer.html" %}
                        +       {% endblock %}
                        +     </div>
                        +-    {% block scripts %}
                        +-      <script src="{{ 'assets/javascripts/vendor.18f0862e.min.js' | url }}"></script>
                        +-      <script src="{{ 'assets/javascripts/bundle.994580cf.min.js' | url }}"></script>
                        +-      {%- set translations = {} -%}
                        ++    <div class="md-dialog" data-md-component="dialog">
                        ++      <div class="md-dialog__inner md-typeset"></div>
                        ++    </div>
                        ++    {% block config %}
                        ++      {%- set app = {
                        ++        "base": base_url,
                        ++        "features": features,
                        ++        "translations": {},
                        ++        "search": "assets/javascripts/workers/search.217ffd95.min.js" | url,
                        ++        "version": config.extra.version or None
                        ++      } -%}
                        ++      {%- set translations = app.translations -%}
                        +       {%- for key in [
                        +         "clipboard.copy",
                        +         "clipboard.copied",
                        +@@ -204,19 +212,12 @@
                        +       ] -%}
                        +         {%- set _ = translations.update({ key: lang.t(key) }) -%}
                        +       {%- endfor -%}
                        +-      <script id="__lang" type="application/json">
                        +-        {{- translations | tojson -}}
                        +-      </script>
                        +-      {% block config %}{% endblock %}
                        +-      <script>
                        +-        app = initialize({
                        +-          base: "{{ base_url }}",
                        +-          features: {{ features or [] | tojson }},
                        +-          search: Object.assign({
                        +-            worker: "{{ 'assets/javascripts/worker/search.9c0e82ba.min.js' | url }}"
                        +-          }, typeof search !== "undefined" && search)
                        +-        })
                        ++      <script id="__config" type="application/json">
                        ++        {{- app | tojson -}}
                        +       </script>
                        ++    {% endblock %}
                        ++    {% block scripts %}
                        ++      <script src="{{ 'assets/javascripts/bundle.926459b3.min.js' | url }}"></script>
                        +       {% for path in config["extra_javascript"] %}
                        +         <script src="{{ path | url }}"></script>
                        +       {% endfor %}
                        +
                        -    <div class="md-footer-nav">
                        +-      <nav class="md-footer-nav__inner md-grid" aria-label="{{ lang.t('footer.title') }}">
                        +-        {% if page.previous_page %}
                        +-          <a href="{{ page.previous_page.url | url }}" class="md-footer-nav__link md-footer-nav__link--prev" rel="prev">
                        +-            <div class="md-footer-nav__button md-icon">
                        +-              {% include ".icons/material/arrow-left.svg" %}
                        +-            </div>
                        +-            <div class="md-footer-nav__title">
                        +-              <div class="md-ellipsis">
                        +-                <span class="md-footer-nav__direction">
                        +-                  {{ lang.t("footer.previous") }}
                        +-                </span>
                        +-                {{ page.previous_page.title }}
                        +-              </div>
                        +-            </div>
                        +-          </a>
                        +-        {% endif %}
                        +-        {% if page.next_page %}
                        +-          <a href="{{ page.next_page.url | url }}" class="md-footer-nav__link md-footer-nav__link--next" rel="next">
                        +-            <div class="md-footer-nav__title">
                        +-              <div class="md-ellipsis">
                        +-                <span class="md-footer-nav__direction">
                        +-                  {{ lang.t("footer.next") }}
                        +-                </span>
                        +-                {{ page.next_page.title }}
                        +-              </div>
                        ++    <nav class="md-footer__inner md-grid" aria-label="{{ lang.t('footer.title') }}">
                        ++      {% if page.previous_page %}
                        ++        <a href="{{ page.previous_page.url | url }}" class="md-footer__link md-footer__link--prev" rel="prev">
                        ++          <div class="md-footer__button md-icon">
                        ++            {% include ".icons/material/arrow-left.svg" %}
                        ++          </div>
                        ++          <div class="md-footer__title">
                        ++            <div class="md-ellipsis">
                        ++              <span class="md-footer__direction">
                        ++                {{ lang.t("footer.previous") }}
                        ++              </span>
                        ++              {{ page.previous_page.title }}
                        +             </div>
                        +-            <div class="md-footer-nav__button md-icon">
                        +-              {% include ".icons/material/arrow-right.svg" %}
                        ++          </div>
                        ++        </a>
                        ++      {% endif %}
                        ++      {% if page.next_page %}
                        ++        <a href="{{ page.next_page.url | url }}" class="md-footer__link md-footer__link--next" rel="next">
                        ++          <div class="md-footer__title">
                        ++            <div class="md-ellipsis">
                        ++              <span class="md-footer__direction">
                        ++                {{ lang.t("footer.next") }}
                        ++              </span>
                        ++              {{ page.next_page.title }}
                        +             </div>
                        +-          </a>
                        +-        {% endif %}
                        +-      </nav>
                        +-    </div>
                        ++          </div>
                        ++          <div class="md-footer__button md-icon">
                        ++            {% include ".icons/material/arrow-right.svg" %}
                        ++          </div>
                        ++        </a>
                        ++      {% endif %}
                        ++    </nav>
                        +   {% endif %}
                        +   <div class="md-footer-meta md-typeset">
                        +     <div class="md-footer-meta__inner md-grid">
                        +
                        @@ -6,21 +6,21 @@
                        +   {% set site_url = site_url ~ "/index.html" %}
                        + {% endif %}
                        + <header class="md-header" data-md-component="header">
                        +-  <nav class="md-header-nav md-grid" aria-label="{{ lang.t('header.title') }}">
                        +-    <a href="{{ site_url }}" title="{{ config.site_name | e }}" class="md-header-nav__button md-logo" aria-label="{{ config.site_name }}">
                        ++  <nav class="md-header__inner md-grid" aria-label="{{ lang.t('header.title') }}">
                        ++    <a href="{{ site_url }}" title="{{ config.site_name | e }}" class="md-header__button md-logo" aria-label="{{ config.site_name }}">
                        +       {% include "partials/logo.html" %}
                        +     </a>
                        +-    <label class="md-header-nav__button md-icon" for="__drawer">
                        ++    <label class="md-header__button md-icon" for="__drawer">
                        +       {% include ".icons/material/menu" ~ ".svg" %}
                        +     </label>
                        +-    <div class="md-header-nav__title" data-md-component="header-title">
                        +-      <div class="md-header-nav__ellipsis">
                        +-        <div class="md-header-nav__topic">
                        ++    <div class="md-header__title" data-md-component="header-title">
                        ++      <div class="md-header__ellipsis">
                        ++        <div class="md-header__topic">
                        +           <span class="md-ellipsis">
                        +             {{ config.site_name }}
                        +           </span>
                        +         </div>
                        +-        <div class="md-header-nav__topic">
                        ++        <div class="md-header__topic" data-md-component="header-topic">
                        +           <span class="md-ellipsis">
                        +             {% if page and page.meta and page.meta.title %}
                        +               {{ page.meta.title }}
                        +@@ -31,14 +31,35 @@
                        +         </div>
                        +       </div>
                        +     </div>
                        ++    <div class="md-header__options">
                        ++      {% if config.extra.alternate %}
                        ++        <div class="md-select">
                        ++          {% set icon = config.theme.icon.alternate or "material/translate" %}
                        ++          <span class="md-header__button md-icon">
                        ++            {% include ".icons/" ~ icon ~ ".svg" %}
                        ++          </span>
                        ++          <div class="md-select__inner">
                        ++            <ul class="md-select__list">
                        ++              {% for alt in config.extra.alternate %}
                        ++                <li class="md-select__item">
                        ++                  <a href="{{ alt.link | url }}" class="md-select__link">
                        ++                    {{ alt.name }}
                        ++                  </a>
                        ++                </li>
                        ++                {% endfor %}
                        ++            </ul>
                        ++          </div>
                        ++        </div>
                        ++      {% endif %}
                        ++    </div>
                        +     {% if "search" in config["plugins"] %}
                        +-      <label class="md-header-nav__button md-icon" for="__search">
                        ++      <label class="md-header__button md-icon" for="__search">
                        +         {% include ".icons/material/magnify.svg" %}
                        +       </label>
                        +       {% include "partials/search.html" %}
                        +     {% endif %}
                        +     {% if config.repo_url %}
                        +-      <div class="md-header-nav__source">
                        ++      <div class="md-header__source">
                        +         {% include "partials/source.html" %}
                        +       </div>
                        +     {% endif %}
                        +
                        @@ -4,5 +4,5 @@
                        + {% import "partials/language.html" as lang with context %}
                        +-<a href="{{ config.repo_url }}" title="{{ lang.t('source.link.title') }}" class="md-source">
                        ++<a href="{{ config.repo_url }}" title="{{ lang.t('source.link.title') }}"  class="md-source" data-md-component="source">
                        +   <div class="md-source__icon md-icon">
                        +     {% set icon = config.theme.icon.repo or "fontawesome/brands/git-alt" %}
                        +     {% include ".icons/" ~ icon ~ ".svg" %}
                        +
                        @@ -12,7 +12,7 @@
                        +       <span class="md-nav__icon md-icon"></span>
                        +       {{ lang.t("toc.title") }}
                        +     </label>
                        +-    <ul class="md-nav__list" data-md-scrollfix>
                        ++    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
                        +       {% for toc_item in toc %}
                        +         {% include "partials/toc-item.html" %}
                        +       {% endfor %}
                        +

                        Upgrading from 5.x to 6.x

                        What's new?

                        • Improved search result look and feel
                        • Improved search result stability while typing
                        • Improved search result grouping (pages + headings)
                        • Improved search result relevance and scoring
                        • Added display of missing query terms to search results
                        • Reduced size of vendor bundle by 25% (84kb → 67kb)
                        • Reduced size of the Docker image to improve CI build performance
                        • Removed hero partial in favor of custom implementation
                        • Removed deprecated front matter features

                        Changes to mkdocs.yml

                        Following is a list of changes that need to be made to mkdocs.yml. Note that you only have to adjust the value if you defined it, so if your configuration does not contain the key, you can skip it.

                        theme.features

                        All feature flags that can be set from mkdocs.yml, like tabs and instant loading, are now prefixed with the name of the component or function they apply to, e.g. navigation.*:

                        theme:
                        +  features:
                        +    - navigation.tabs
                        +    - navigation.instant
                        +
                        theme:
                        +  features:
                        +    - tabs
                        +    - instant
                        +

                        Changes to *.html files

                        The templates have undergone a set of changes to make them future-proof. If you've used theme extension to override a block or template, make sure that it matches the new structure:

                        • If you've overridden a block, check base.html for potential changes
                        • If you've overridden a template, check the respective *.html file for potential changes
                        @@ -22,13 +22,6 @@
                        +
                        + {% import "partials/language.html" as lang with context %}
                        +
                        +-<!-- Theme options -->
                        +-{% set palette = config.theme.palette %}
                        +-{% if not palette is mapping %}
                        +-  {% set palette = palette | first %}
                        +-{% endif %}
                        +-{% set font = config.theme.font %}
                        +-
                        + <!doctype html>
                        + <html lang="{{ lang.t('language') }}" class="no-js">
                        +   <head>
                        +@@ -45,21 +38,8 @@
                        +         <meta name="description" content="{{ config.site_description }}" />
                        +       {% endif %}
                        +
                        +-      <!-- Redirect -->
                        +-      {% if page and page.meta and page.meta.redirect %}
                        +-        <script>
                        +-          var anchor = window.location.hash.substr(1)
                        +-          location.href = '{{ page.meta.redirect }}' +
                        +-            (anchor ? '#' + anchor : '')
                        +-        </script>
                        +-
                        +-        <!-- Fallback in case JavaScript is not available -->
                        +-        <meta http-equiv="refresh" content="0; url={{ page.meta.redirect }}" />
                        +-        <meta name="robots" content="noindex" />
                        +-        <link rel="canonical" href="{{ page.meta.redirect }}" />
                        +-
                        +       <!-- Canonical -->
                        +-      {% elif page.canonical_url %}
                        ++      {% if page.canonical_url %}
                        +         <link rel="canonical" href="{{ page.canonical_url }}" />
                        +       {% endif %}
                        +
                        +@@ -96,20 +76,21 @@
                        +       <link rel="stylesheet" href="{{ 'assets/stylesheets/main.css' | url }}" />
                        +
                        +       <!-- Extra color palette -->
                        +-      {% if palette.scheme or palette.primary or palette.accent %}
                        ++      {% if config.theme.palette %}
                        ++        {% set palette = config.theme.palette %}
                        +         <link
                        +           rel="stylesheet"
                        +           href="{{ 'assets/stylesheets/palette.css' | url }}"
                        +         />
                        +-      {% endif %}
                        +
                        +-      <!-- Theme-color meta tag for Android -->
                        +-      {% if palette.primary %}
                        +-        {% import "partials/palette.html" as map %}
                        +-        {% set primary = map.primary(
                        +-          palette.primary | replace(" ", "-") | lower
                        +-        ) %}
                        +-        <meta name="theme-color" content="{{ primary }}" />
                        ++        <!-- Theme-color meta tag for Android -->
                        ++        {% if palette.primary %}
                        ++          {% import "partials/palette.html" as map %}
                        ++          {% set primary = map.primary(
                        ++            palette.primary | replace(" ", "-") | lower
                        ++          ) %}
                        ++          <meta name="theme-color" content="{{ primary }}" />
                        ++        {% endif %}
                        +       {% endif %}
                        +     {% endblock %}
                        +
                        +@@ -120,7 +101,8 @@
                        +     {% block fonts %}
                        +
                        +       <!-- Load fonts from Google -->
                        +-      {% if font != false %}
                        ++      {% if config.theme.font != false %}
                        ++        {% set font = config.theme.font %}
                        +         <link href="https://fonts.gstatic.com" rel="preconnect" crossorigin />
                        +         <link
                        +          rel="stylesheet"
                        +@@ -169,8 +151,12 @@
                        +
                        +   <!-- Text direction and color palette, if defined -->
                        +   {% set direction = config.theme.direction or lang.t('direction') %}
                        +-  {% if palette.scheme or palette.primary or palette.accent %}
                        +-    {% set scheme  = palette.scheme | lower %}
                        ++  {% if config.theme.palette %}
                        ++    {% set palette = config.theme.palette %}
                        ++    {% if not palette is mapping %}
                        ++      {% set palette = palette | first %}
                        ++    {% endif %}
                        ++    {% set scheme  = palette.scheme  | replace(" ", "-") | lower %}
                        +     {% set primary = palette.primary | replace(" ", "-") | lower %}
                        +     {% set accent  = palette.accent  | replace(" ", "-") | lower %}
                        +     <body
                        +@@ -179,18 +165,19 @@
                        +       data-md-color-primary="{{ primary }}"
                        +       data-md-color-accent="{{ accent }}"
                        +     >
                        ++
                        ++      <!-- Experimental: set color scheme based on preference -->
                        ++      {% if "preference" == scheme %}
                        ++        <script>
                        ++          if (matchMedia("(prefers-color-scheme: dark)").matches)
                        ++            document.body.setAttribute("data-md-color-scheme", "slate")
                        ++        </script>
                        ++      {% endif %}
                        ++
                        +   {% else %}
                        +     <body dir="{{ direction }}">
                        +   {% endif %}
                        +
                        +-    <!-- Experimental: set color scheme based on preference -->
                        +-    {% if "preference" == palette.scheme %}
                        +-      <script>
                        +-        if (matchMedia("(prefers-color-scheme: dark)").matches)
                        +-          document.body.setAttribute("data-md-color-scheme", "slate")
                        +-      </script>
                        +-    {% endif %}
                        +-
                        +     <!--
                        +       State toggles - we need to set autocomplete="off" in order to reset the
                        +       drawer on back button invocation in some browsers
                        +@@ -243,15 +230,11 @@
                        +     <div class="md-container" data-md-component="container">
                        +
                        +       <!-- Hero teaser -->
                        +-      {% block hero %}
                        +-        {% if page and page.meta and page.meta.hero %}
                        +-          {% include "partials/hero.html" with context %}
                        +-        {% endif %}
                        +-      {% endblock %}
                        ++      {% block hero %}{% endblock %}
                        +
                        +       <!-- Tabs navigation -->
                        +       {% block tabs %}
                        +-        {% if "tabs" in config.theme.features %}
                        ++        {% if "navigation.tabs" in config.theme.features %}
                        +           {% include "partials/tabs.html" %}
                        +         {% endif %}
                        +       {% endblock %}
                        +@@ -310,13 +293,6 @@
                        +                   </a>
                        +                 {% endif %}
                        +
                        +-                <!-- Link to source file -->
                        +-                {% block source %}
                        +-                  {% if page and page.meta and page.meta.source %}
                        +-                    {% include "partials/source-link.html" %}
                        +-                  {% endif %}
                        +-                {% endblock %}
                        +-
                        +                 <!--
                        +                   Hack: check whether the content contains a h1 headline. If it
                        +                   doesn't, the page title (or respectively site name) is used
                        +@@ -370,7 +346,10 @@
                        +         "search.result.placeholder",
                        +         "search.result.none",
                        +         "search.result.one",
                        +-        "search.result.other"
                        ++        "search.result.other",
                        ++        "search.result.more.one",
                        ++        "search.result.more.other",
                        ++        "search.result.term.missing"
                        +       ] -%}
                        +         {%- set _ = translations.update({ key: lang.t(key) }) -%}
                        +       {%- endfor -%}
                        +
                        @@ -1,12 +0,0 @@
                        +-{#-
                        +-  This file was automatically generated - do not edit
                        +--#}
                        +-{% set class = "md-hero" %}
                        +-{% if "tabs" not in config.theme.features %}
                        +-  {% set class = "md-hero md-hero--expand" %}
                        +-{% endif %}
                        +-<div class="{{ class }}" data-md-component="hero">
                        +-  <div class="md-hero__inner md-grid">
                        +-    {{ page.meta.hero }}
                        +-  </div>
                        +-</div>
                        +
                        @@ -1,14 +0,0 @@
                        +-{#-
                        +-  This file was automatically generated - do not edit
                        +--#}
                        +-{% import "partials/language.html" as lang with context %}
                        +-{% set repo = config.repo_url %}
                        +-{% if repo | last == "/" %}
                        +-  {% set repo = repo[:-1] %}
                        +-{% endif %}
                        +-{% set path = page.meta.path | default("") %}
                        +-<a href="{{ [repo, path, page.meta.source] | join('/') }}" title="{{ page.meta.source }}" class="md-content__button md-icon">
                        +-  {{ lang.t("meta.source") }}
                        +-  {% set icon = config.theme.icon.repo or "fontawesome/brands/git-alt" %}
                        +-  {% include ".icons/" ~ icon ~ ".svg" %}
                        +-</a>
                        +

                        Upgrading from 4.x to 5.x

                        What's new?

                        • Reactive architecture – try app.dialog$.next("Hi!") in the console
                        • Instant loading – make Material behave like a Single Page Application
                        • Improved CSS customization with CSS variables – set your brand's colors
                        • Improved CSS resilience, e.g. proper sidebar locking for customized headers
                        • Improved icon integration and configuration – now including over 5k icons
                        • Added possibility to use any icon for logo, repository and social links
                        • Search UI does not freeze anymore (moved to web worker)
                        • Search index built only once when using instant loading
                        • Improved extensible keyboard handling
                        • Support for prebuilt search indexes
                        • Support for displaying stars and forks for GitLab repositories
                        • Support for scroll snapping of sidebars and search results
                        • Reduced HTML and CSS footprint due to deprecation of Internet Explorer support
                        • Slight facelifting of some UI elements (admonitions, tables, ...)

                        Changes to mkdocs.yml

                        Following is a list of changes that need to be made to mkdocs.yml. Note that you only have to adjust the value if you defined it, so if your configuration does not contain the key, you can skip it.

                        theme.feature

                        Optional features like tabs and instant loading are now implemented as flags and can be enabled by listing them in mkdocs.yml under theme.features:

                        theme:
                        +  features:
                        +    - tabs
                        +    - instant
                        +
                        theme:
                        +  feature:
                        +    tabs: true
                        +

                        theme.logo.icon

                        The logo icon configuration was centralized under theme.icon.logo and can now be set to any of the icons bundled with the theme:

                        theme:
                        +  icon:
                        +    logo: material/cloud
                        +
                        theme:
                        +  logo:
                        +    icon: cloud
                        +

                        extra.repo_icon

                        The repo icon configuration was centralized under theme.icon.repo and can now be set to any of the icons bundled with the theme:

                        theme:
                        +  icon:
                        +    repo: fontawesome/brands/gitlab
                        +
                        extra:
                        +  repo_icon: gitlab
                        +

                        extra.search.*

                        Search is now configured as part of the plugin options. Note that the search languages must now be listed as an array of strings and the tokenizer was renamed to separator:

                        plugins:
                        +  - search:
                        +      separator: '[\s\-\.]+'
                        +      lang:
                        +        - en
                        +        - de
                        +        - ru
                        +
                        extra:
                        +  search:
                        +    language: en, de, ru
                        +    tokenizer: '[\s\-\.]+'
                        +

                        extra.social.*

                        Social links stayed in the same place, but the type key was renamed to icon in order to match the new way of specifying which icon to be used:

                        extra:
                        +  social:
                        +    - icon: fontawesome/brands/github-alt
                        +      link: https://github.com/squidfunk
                        +
                        extra:
                        +  social:
                        +    - type: github
                        +      link: https://github.com/squidfunk
                        +

                        Changes to *.html files

                        The templates have undergone a set of changes to make them future-proof. If you've used theme extension to override a block or template, make sure that it matches the new structure:

                        • If you've overridden a block, check base.html for potential changes
                        • If you've overridden a template, check the respective *.html file for potential changes
                        @@ -4,7 +4,6 @@
                        + {% import "partials/language.html" as lang with context %}
                        +-{% set feature = config.theme.feature %}
                        + {% set palette = config.theme.palette %}
                        + {% set font = config.theme.font %}
                        + <!doctype html>
                        +@@ -30,19 +29,6 @@
                        +       {% elif config.site_author %}
                        +         <meta name="author" content="{{ config.site_author }}">
                        +       {% endif %}
                        +-      {% for key in [
                        +-        "clipboard.copy",
                        +-        "clipboard.copied",
                        +-        "search.language",
                        +-        "search.pipeline.stopwords",
                        +-        "search.pipeline.trimmer",
                        +-        "search.result.none",
                        +-        "search.result.one",
                        +-        "search.result.other",
                        +-        "search.tokenizer"
                        +-      ] %}
                        +-        <meta name="lang:{{ key }}" content="{{ lang.t(key) }}">
                        +-      {% endfor %}
                        +       <link rel="shortcut icon" href="{{ config.theme.favicon | url }}">
                        +       <meta name="generator" content="mkdocs-{{ mkdocs_version }}, mkdocs-material-5.0.0">
                        +     {% endblock %}
                        +@@ -56,9 +42,9 @@
                        +       {% endif %}
                        +     {% endblock %}
                        +     {% block styles %}
                        +-      <link rel="stylesheet" href="{{ 'assets/stylesheets/application.********.css' | url }}">
                        ++      <link rel="stylesheet" href="{{ 'assets/stylesheets/main.********.min.css' | url }}">
                        +       {% if palette.primary or palette.accent %}
                        +-        <link rel="stylesheet" href="{{ 'assets/stylesheets/application-palette.********.css' | url }}">
                        ++        <link rel="stylesheet" href="{{ 'assets/stylesheets/palette.********.min.css' | url }}">
                        +       {% endif %}
                        +       {% if palette.primary %}
                        +         {% import "partials/palette.html" as map %}
                        +@@ -69,20 +55,17 @@
                        +       {% endif %}
                        +     {% endblock %}
                        +     {% block libs %}
                        +-      <script src="{{ 'assets/javascripts/modernizr.********.js' | url }}"></script>
                        +     {% endblock %}
                        +     {% block fonts %}
                        +       {% if font != false %}
                        +         <link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
                        +         <link rel="stylesheet" href="https://fonts.googleapis.com/css?family={{
                        +             font.text | replace(' ', '+') + ':300,400,400i,700%7C' +
                        +             font.code | replace(' ', '+')
                        +           }}&display=fallback">
                        +         <style>body,input{font-family:"{{ font.text }}","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"{{ font.code }}","Courier New",Courier,monospace}</style>
                        +       {% endif %}
                        +     {% endblock %}
                        +-    <link rel="stylesheet" href="{{ 'assets/fonts/material-icons.css' | url }}">
                        +     {% if config.extra.manifest %}
                        +       <link rel="manifest" href="{{ config.extra.manifest | url }}" crossorigin="use-credentials">
                        +     {% endif %}
                        +@@ -95,47 +77,50 @@
                        +     {% endblock %}
                        +     {% block extrahead %}{% endblock %}
                        +   </head>
                        ++  {% set direction = config.theme.direction | default(lang.t('direction')) %}
                        +   {% if palette.primary or palette.accent %}
                        +     {% set primary = palette.primary | replace(" ", "-") | lower %}
                        +     {% set accent  = palette.accent  | replace(" ", "-") | lower %}
                        +-    <body dir="{{ lang.t('direction') }}" data-md-color-primary="{{ primary }}" data-md-color-accent="{{ accent }}">
                        ++    <body dir="{{ direction }}" data-md-color-primary="{{ primary }}" data-md-color-accent="{{ accent }}">
                        +   {% else %}
                        +-    <body dir="{{ lang.t('direction') }}">
                        ++    <body dir="{{ direction }}">
                        +   {% endif %}
                        +-    <svg class="md-svg">
                        +-      <defs>
                        +-        {% set platform = config.extra.repo_icon or config.repo_url %}
                        +-        {% if "github" in platform %}
                        +-          {% include "assets/images/icons/github.f0b8504a.svg" %}
                        +-        {% elif "gitlab" in platform %}
                        +-          {% include "assets/images/icons/gitlab.6dd19c00.svg" %}
                        +-        {% elif "bitbucket" in platform %}
                        +-          {% include "assets/images/icons/bitbucket.1b09e088.svg" %}
                        +-        {% endif %}
                        +-      </defs>
                        +-    </svg>
                        +     <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
                        +     <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
                        +-    <label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
                        ++    <label class="md-overlay" for="__drawer"></label>
                        ++    <div data-md-component="skip">
                        ++      {% if page.toc | first is defined %}
                        ++        {% set skip = page.toc | first %}
                        ++        <a href="{{ skip.url | url }}" class="md-skip">
                        ++          {{ lang.t('skip.link.title') }}
                        ++        </a>
                        ++      {% endif %}
                        ++    </div>
                        ++    <div data-md-component="announce">
                        ++      {% if self.announce() %}
                        ++        <aside class="md-announce">
                        ++          <div class="md-announce__inner md-grid md-typeset">
                        ++            {% block announce %}{% endblock %}
                        ++          </div>
                        ++        </aside>
                        ++      {% endif %}
                        ++    </div>
                        +     {% block header %}
                        +       {% include "partials/header.html" %}
                        +     {% endblock %}
                        +-    <div class="md-container">
                        ++    <div class="md-container" data-md-component="container">
                        +       {% block hero %}
                        +         {% if page and page.meta and page.meta.hero %}
                        +           {% include "partials/hero.html" with context %}
                        +         {% endif %}
                        +       {% endblock %}
                        +-      {% if feature.tabs %}
                        +-        {% include "partials/tabs.html" %}
                        +-      {% endif %}
                        ++      {% block tabs %}
                        ++        {% if "tabs" in config.theme.features %}
                        ++          {% include "partials/tabs.html" %}
                        ++        {% endif %}
                        ++      {% endblock %}
                        +-      <main class="md-main" role="main">
                        +-        <div class="md-main__inner md-grid" data-md-component="container">
                        ++      <main class="md-main" data-md-component="main">
                        ++        <div class="md-main__inner md-grid">
                        +           {% block site_nav %}
                        +             {% if nav %}
                        +               <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
                        +@@ -160,41 +141,25 @@
                        +             <article class="md-content__inner md-typeset">
                        +               {% block content %}
                        +                 {% if page.edit_url %}
                        +-                  <a href="{{ page.edit_url }}" title="{{ lang.t('edit.link.title') }}" class="md-icon md-content__icon">&#xE3C9;</a>
                        ++                  <a href="{{ page.edit_url }}" title="{{ lang.t('edit.link.title') }}" class="md-content__button md-icon">
                        ++                    {% include ".icons/material/pencil.svg" %}
                        ++                  </a>
                        +                 {% endif %}
                        ++                {% block source %}
                        ++                  {% if page and page.meta and page.meta.source %}
                        ++                    {% include "partials/source-link.html" %}
                        ++                  {% endif %}
                        ++                {% endblock %}
                        +                 {% if not "\x3ch1" in page.content %}
                        +                   <h1>{{ page.title | default(config.site_name, true)}}</h1>
                        +                 {% endif %}
                        +                 {{ page.content }}
                        +-                {% block source %}
                        +-                  {% if page and page.meta and page.meta.source %}
                        +-                    <h2 id="__source">{{ lang.t("meta.source") }}</h2>
                        +-                    {% set repo = config.repo_url %}
                        +-                    {% if repo | last == "/" %}
                        +-                      {% set repo = repo[:-1] %}
                        +-                    {% endif %}
                        +-                    {% set path = page.meta.path | default([""]) %}
                        +-                    {% set file = page.meta.source %}
                        +-                    <a href="{{ [repo, path, file] | join('/') }}" title="{{ file }}" class="md-source-file">
                        +-                      {{ file }}
                        +-                    </a>
                        +-                  {% endif %}
                        +-                {% endblock %}
                        ++                {% if page and page.meta %}
                        ++                  {% if page.meta.git_revision_date_localized or
                        ++                        page.meta.revision_date
                        ++                  %}
                        ++                    {% include "partials/source-date.html" %}
                        +-                {% if page and page.meta and (
                        +-                      page.meta.git_revision_date_localized or
                        +-                      page.meta.revision_date
                        +-                ) %}
                        +-                  {% set label = lang.t("source.revision.date") %}
                        +-                  <hr>
                        +-                  <div class="md-source-date">
                        +-                    <small>
                        +-                      {% if page.meta.git_revision_date_localized %}
                        +-                        {{ label }}: {{ page.meta.git_revision_date_localized }}
                        +-                      {% elif page.meta.revision_date %}
                        +-                        {{ label }}: {{ page.meta.revision_date }}
                        +-                      {% endif %}
                        +-                    </small>
                        +-                  </div>
                        +                 {% endif %}
                        +               {% endblock %}
                        +               {% block disqus %}
                        +@@ -208,29 +174,35 @@
                        +         {% include "partials/footer.html" %}
                        +       {% endblock %}
                        +     </div>
                        +     {% block scripts %}
                        +-      <script src="{{ 'assets/javascripts/application.********.js' | url }}"></script>
                        +-      {% if lang.t("search.language") != "en" %}
                        +-        {% set languages = lang.t("search.language").split(",") %}
                        +-        {% if languages | length and languages[0] != "" %}
                        +-          {% set path = "assets/javascripts/lunr/" %}
                        +-          <script src="{{ (path ~ 'lunr.stemmer.support.js') | url }}"></script>
                        +-          {% for language in languages | map("trim") %}
                        +-            {% if language != "en" %}
                        +-              {% if language == "ja" %}
                        +-                <script src="{{ (path ~ 'tinyseg.js') | url }}"></script>
                        +-              {% endif %}
                        +-              {% if language in ("ar", "da", "de", "es", "fi", "fr", "hu", "it", "ja", "nl", "no", "pt", "ro", "ru", "sv", "th", "tr", "vi") %}
                        +-                <script src="{{ (path ~ 'lunr.' ~ language ~ '.js') | url }}"></script>
                        +-              {% endif %}
                        +-            {% endif %}
                        +-          {% endfor %}
                        +-          {% if languages | length > 1 %}
                        +-            <script src="{{ (path ~ 'lunr.multi.js') | url }}"></script>
                        +-          {% endif %}
                        +-        {% endif %}
                        +-      {% endif %}
                        +-      <script>app.initialize({version:"{{ mkdocs_version }}",url:{base:"{{ base_url }}"}})</script>
                        ++      <script src="{{ 'assets/javascripts/vendor.********.min.js' | url }}"></script>
                        ++      <script src="{{ 'assets/javascripts/bundle.********.min.js' | url }}"></script>
                        ++      {%- set translations = {} -%}
                        ++      {%- for key in [
                        ++        "clipboard.copy",
                        ++        "clipboard.copied",
                        ++        "search.config.lang",
                        ++        "search.config.pipeline",
                        ++        "search.config.separator",
                        ++        "search.result.placeholder",
                        ++        "search.result.none",
                        ++        "search.result.one",
                        ++        "search.result.other"
                        ++      ] -%}
                        ++        {%- set _ = translations.update({ key: lang.t(key) }) -%}
                        ++      {%- endfor -%}
                        ++      <script id="__lang" type="application/json">
                        ++        {{- translations | tojson -}}
                        ++      </script>
                        ++      {% block config %}{% endblock %}
                        ++      <script>
                        ++        app = initialize({
                        ++          base: "{{ base_url }}",
                        ++          features: {{ config.theme.features | tojson }},
                        ++          search: Object.assign({
                        ++            worker: "{{ 'assets/javascripts/worker/search.********.min.js' | url }}"
                        ++          }, typeof search !== "undefined" && search)
                        ++        })
                        ++      </script>
                        +       {% for path in config["extra_javascript"] %}
                        +         <script src="{{ path | url }}"></script>
                        +       {% endfor %}
                        +
                        @@ -5,34 +5,34 @@
                        +     <div class="md-footer-nav">
                        +-      <nav class="md-footer-nav__inner md-grid">
                        ++      <nav class="md-footer-nav__inner md-grid" aria-label="{{ lang.t('footer.title') }}">
                        +         {% if page.previous_page %}
                        +-          <a href="{{ page.previous_page.url | url }}" title="{{ page.previous_page.title | striptags }}" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
                        +-            <div class="md-flex__cell md-flex__cell--shrink">
                        +-              <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
                        ++          <a href="{{ page.previous_page.url | url }}" title="{{ page.previous_page.title | striptags }}" class="md-footer-nav__link md-footer-nav__link--prev" rel="prev">
                        ++            <div class="md-footer-nav__button md-icon">
                        ++              {% include ".icons/material/arrow-left.svg" %}
                        +             </div>
                        +-            <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
                        +-              <span class="md-flex__ellipsis">
                        ++            <div class="md-footer-nav__title">
                        ++              <div class="md-ellipsis">
                        +                 <span class="md-footer-nav__direction">
                        +                   {{ lang.t("footer.previous") }}
                        +                 </span>
                        +                 {{ page.previous_page.title }}
                        +-              </span>
                        ++              </div>
                        +             </div>
                        +           </a>
                        +         {% endif %}
                        +         {% if page.next_page %}
                        +-          <a href="{{ page.next_page.url | url }}" title="{{ page.next_page.title | striptags }}" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
                        +-            <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
                        +-              <span class="md-flex__ellipsis">
                        ++          <a href="{{ page.next_page.url | url }}" title="{{ page.next_page.title | striptags }}" class="md-footer-nav__link md-footer-nav__link--next" rel="next">
                        ++            <div class="md-footer-nav__title">
                        ++              <div class="md-ellipsis">
                        +                 <span class="md-footer-nav__direction">
                        +                   {{ lang.t("footer.next") }}
                        +                 </span>
                        +                 {{ page.next_page.title }}
                        +-              </span>
                        ++              </div>
                        +             </div>
                        +-            <div class="md-flex__cell md-flex__cell--shrink">
                        +-              <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
                        ++            <div class="md-footer-nav__button md-icon">
                        ++              {% include ".icons/material/arrow-right.svg" %}
                        +             </div>
                        +           </a>
                        +         {% endif %}
                        +
                        @@ -4,51 +4,43 @@
                        + <header class="md-header" data-md-component="header">
                        +-  <nav class="md-header-nav md-grid">
                        +-    <div class="md-flex">
                        +-      <div class="md-flex__cell md-flex__cell--shrink">
                        +-        <a href="{{ config.site_url | default(nav.homepage.url, true) | url }}" title="{{ config.site_name }}" aria-label="{{ config.site_name }}" class="md-header-nav__button md-logo">
                        +-          {% if config.theme.logo.icon %}
                        +-            <i class="md-icon">{{ config.theme.logo.icon }}</i>
                        +-          {% else %}
                        +-            <img alt="logo" src="{{ config.theme.logo | url }}" width="24" height="24">
                        +-          {% endif %}
                        +-        </a>
                        +-      </div>
                        +-      <div class="md-flex__cell md-flex__cell--shrink">
                        +-        <label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
                        +-      </div>
                        +-      <div class="md-flex__cell md-flex__cell--stretch">
                        +-        <div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
                        +-          {% if config.site_name == page.title %}
                        +-            {{ config.site_name }}
                        +-          {% else %}
                        +-            <span class="md-header-nav__topic">
                        +-              {{ config.site_name }}
                        +-            </span>
                        +-            <span class="md-header-nav__topic">
                        +-              {% if page and page.meta and page.meta.title %}
                        +-                {{ page.meta.title }}
                        +-              {% else %}
                        +-                {{ page.title }}
                        +-              {% endif %}
                        +-            </span>
                        +-          {% endif %}
                        ++  <nav class="md-header-nav md-grid" aria-label="{{ lang.t('header.title') }}">
                        ++    <a href="{{ config.site_url | default(nav.homepage.url, true) | url }}" title="{{ config.site_name }}" class="md-header-nav__button md-logo" aria-label="{{ config.site_name }}">
                        ++      {% include "partials/logo.html" %}
                        ++    </a>
                        ++    <label class="md-header-nav__button md-icon" for="__drawer">
                        ++      {% include ".icons/material/menu" ~ ".svg" %}
                        ++    </label>
                        ++    <div class="md-header-nav__title" data-md-component="header-title">
                        ++      {% if config.site_name == page.title %}
                        ++        <div class="md-header-nav__ellipsis md-ellipsis">
                        ++          {{ config.site_name }}
                        +         </div>
                        +-      </div>
                        +-      <div class="md-flex__cell md-flex__cell--shrink">
                        +-        {% if "search" in config["plugins"] %}
                        +-          <label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
                        +-          {% include "partials/search.html" %}
                        +-        {% endif %}
                        +-      </div>
                        +-      {% if config.repo_url %}
                        +-        <div class="md-flex__cell md-flex__cell--shrink">
                        +-          <div class="md-header-nav__source">
                        +-            {% include "partials/source.html" %}
                        +-          </div>
                        ++      {% else %}
                        ++        <div class="md-header-nav__ellipsis">
                        ++          <span class="md-header-nav__topic md-ellipsis">
                        ++            {{ config.site_name }}
                        ++          </span>
                        ++          <span class="md-header-nav__topic md-ellipsis">
                        ++            {% if page and page.meta and page.meta.title %}
                        ++              {{ page.meta.title }}
                        ++            {% else %}
                        ++              {{ page.title }}
                        ++            {% endif %}
                        ++          </span>
                        +         </div>
                        +       {% endif %}
                        +     </div>
                        ++    {% if "search" in config["plugins"] %}
                        ++      <label class="md-header-nav__button md-icon" for="__search">
                        ++        {% include ".icons/material/magnify.svg" %}
                        ++      </label>
                        ++      {% include "partials/search.html" %}
                        ++    {% endif %}
                        ++    {% if config.repo_url %}
                        ++      <div class="md-header-nav__source">
                        ++        {% include "partials/source.html" %}
                        ++      </div>
                        ++    {% endif %}
                        +   </nav>
                        + </header>
                        +
                        @@ -4,9 +4,8 @@
                        +-{% set feature = config.theme.feature %}
                        + {% set class = "md-hero" %}
                        +-{% if not feature.tabs %}
                        ++{% if "tabs" not in config.theme.features %}
                        +   {% set class = "md-hero md-hero--expand" %}
                        + {% endif %}
                        + <div class="{{ class }}" data-md-component="hero">
                        +
                        @@ -4,12 +4,4 @@
                        + {% import "partials/language/" + config.theme.language + ".html" as lang %}
                        + {% import "partials/language/en.html" as fallback %}
                        +-{% macro t(key) %}{{ {
                        +-  "direction": config.theme.direction,
                        +-  "search.language": (
                        +-    config.extra.search | default({})
                        +-  ).language,
                        +-  "search.tokenizer": (
                        +-    config.extra.search | default({})
                        +-  ).tokenizer | default("", true),
                        +-}[key] or lang.t(key) or fallback.t(key) }}{% endmacro %}
                        ++{% macro t(key) %}{{ lang.t(key) | default(fallback.t(key)) }}{% endmacro %}
                        +
                        @@ -0,0 +1,9 @@
                        ++{#-
                        ++  This file was automatically generated - do not edit
                        ++-#}
                        ++{% if config.theme.logo %}
                        ++  <img src="{{ config.theme.logo | url }}" alt="logo">
                        ++{% else %}
                        ++  {% set icon = config.theme.icon.logo or "material/library" %}
                        ++  {% include ".icons/" ~ icon ~ ".svg" %}
                        ++{% endif %}
                        +
                        @@ -14,9 +14,15 @@
                        +     {% endif %}
                        +     <label class="md-nav__link" for="{{ path }}">
                        +       {{ nav_item.title }}
                        ++      <span class="md-nav__icon md-icon">
                        ++        {% include ".icons/material/chevron-right.svg" %}
                        ++      </span>
                        +     </label>
                        +-    <nav class="md-nav" data-md-component="collapsible" data-md-level="{{ level }}">
                        ++    <nav class="md-nav" aria-label="{{ nav_item.title }}" data-md-level="{{ level }}">
                        +       <label class="md-nav__title" for="{{ path }}">
                        ++        <span class="md-nav__icon md-icon">
                        ++          {% include ".icons/material/arrow-left.svg" %}
                        ++        </span>
                        +         {{ nav_item.title }}
                        +       </label>
                        +       <ul class="md-nav__list" data-md-scrollfix>
                        +@@ -39,6 +45,9 @@
                        +     {% if toc | first is defined %}
                        +       <label class="md-nav__link md-nav__link--active" for="__toc">
                        +         {{ nav_item.title }}
                        ++        <span class="md-nav__icon md-icon">
                        ++          {% include ".icons/material/table-of-contents.svg" %}
                        ++        </span>
                        +       </label>
                        +     {% endif %}
                        +     <a href="{{ nav_item.url | url }}" title="{{ nav_item.title | striptags }}" class="md-nav__link md-nav__link--active">
                        +
                        @@ -4,14 +4,10 @@
                        +-<nav class="md-nav md-nav--primary" data-md-level="0">
                        +-  <label class="md-nav__title md-nav__title--site" for="__drawer">
                        +-    <a href="{{ config.site_url | default(nav.homepage.url, true) | url }}" title="{{ config.site_name }}" class="md-nav__button md-logo">
                        +-      {% if config.theme.logo.icon %}
                        +-        <i class="md-icon">{{ config.theme.logo.icon }}</i>
                        +-      {% else %}
                        +-        <img alt="logo" src="{{ config.theme.logo | url }}" width="48" height="48">
                        +-      {% endif %}
                        ++<nav class="md-nav md-nav--primary" aria-label="{{ lang.t('nav.title') }}" data-md-level="0">
                        ++  <label class="md-nav__title" for="__drawer">
                        ++    <a href="{{ config.site_url | default(nav.homepage.url, true) | url }}" title="{{ config.site_name }}" class="md-nav__button md-logo" aria-label="{{ config.site_name }}">
                        ++      {% include "partials/logo.html" %}
                        +     </a>
                        +     {{ config.site_name }}
                        +   </label>
                        +
                        @@ -6,15 +6,18 @@
                        +   <label class="md-search__overlay" for="__search"></label>
                        +   <div class="md-search__inner" role="search">
                        +     <form class="md-search__form" name="search">
                        +-      <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="{{ lang.t('search.placeholder') }}" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
                        ++      <input type="text" class="md-search__input" name="query" aria-label="{{ lang.t('search.placeholder') }}" placeholder="{{ lang.t('search.placeholder') }}" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" data-md-state="active">
                        +       <label class="md-search__icon md-icon" for="__search">
                        ++        {% include ".icons/material/magnify.svg" %}
                        ++        {% include ".icons/material/arrow-left.svg" %}
                        +       </label>
                        +-      <button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
                        +-        &#xE5CD;
                        ++      <button type="reset" class="md-search__icon md-icon" aria-label="{{ lang.t('search.reset') }}" data-md-component="search-reset" tabindex="-1">
                        ++        {% include ".icons/material/close.svg" %}
                        +       </button>
                        +     </form>
                        +     <div class="md-search__output">
                        +       <div class="md-search__scrollwrap" data-md-scrollfix>
                        +-        <div class="md-search-result" data-md-component="result">
                        ++        <div class="md-search-result" data-md-component="search-result">
                        +           <div class="md-search-result__meta">
                        +             {{ lang.t("search.result.placeholder") }}
                        +           </div>
                        +
                        @@ -4,9 +4,12 @@
                        + {% if config.extra.social %}
                        +   <div class="md-footer-social">
                        +-    <link rel="stylesheet" href="{{ 'assets/fonts/font-awesome.css' | url }}">
                        +     {% for social in config.extra.social %}
                        +-      <a href="{{ social.link }}" target="_blank" rel="noopener" title="{{ social.type }}" class="md-footer-social__link fa fa-{{ social.type }}"></a>
                        ++      {% set _,rest = social.link.split("//") %}
                        ++      {% set domain = rest.split("/")[0] %}
                        ++      <a href="{{ social.link }}" target="_blank" rel="noopener" title="{{ domain }}" class="md-footer-social__link">
                        ++        {% include ".icons/" ~ social.icon ~ ".svg" %}
                        ++      </a>
                        +     {% endfor %}
                        +   </div>
                        + {% endif %}
                        +
                        @@ -0,0 +1,15 @@
                        ++{#-
                        ++  This file was automatically generated - do not edit
                        ++-#}
                        ++{% import "partials/language.html" as lang with context %}
                        ++{% set label = lang.t("source.revision.date") %}
                        ++<hr>
                        ++<div class="md-source-date">
                        ++  <small>
                        ++    {% if page.meta.git_revision_date_localized %}
                        ++      {{ label }}: {{ page.meta.git_revision_date_localized }}
                        ++    {% elif page.meta.revision_date %}
                        ++      {{ label }}: {{ page.meta.revision_date }}
                        ++    {% endif %}
                        ++  </small>
                        ++</div>
                        +
                        @@ -0,0 +1,13 @@
                        ++{#-
                        ++  This file was automatically generated - do not edit
                        ++-#}
                        ++{% import "partials/language.html" as lang with context %}
                        ++{% set repo = config.repo_url %}
                        ++{% if repo | last == "/" %}
                        ++  {% set repo = repo[:-1] %}
                        ++{% endif %}
                        ++{% set path = page.meta.path | default([""]) %}
                        ++<a href="{{ [repo, path, page.meta.source] | join('/') }}" title="{{ file }}" class="md-content__button md-icon">
                        ++  {{ lang.t("meta.source") }}
                        ++  {% include ".icons/" ~ config.theme.icon.repo ~ ".svg" %}
                        ++</a>
                        +
                        @@ -4,24 +4,11 @@
                        + {% import "partials/language.html" as lang with context %}
                        +-{% set platform = config.extra.repo_icon or config.repo_url %}
                        +-{% if "github" in platform %}
                        +-  {% set repo_type = "github" %}
                        +-{% elif "gitlab" in platform %}
                        +-  {% set repo_type = "gitlab" %}
                        +-{% elif "bitbucket" in platform %}
                        +-  {% set repo_type = "bitbucket" %}
                        +-{% else %}
                        +-  {% set repo_type = "" %}
                        +-{% endif %}
                        +-<a href="{{ config.repo_url }}" title="{{ lang.t('source.link.title') }}" class="md-source" data-md-source="{{ repo_type }}">
                        +-  {% if repo_type %}
                        +-    <div class="md-source__icon">
                        +-      <svg viewBox="0 0 24 24" width="24" height="24">
                        +-        <use xlink:href="#__{{ repo_type }}" width="24" height="24"></use>
                        +-      </svg>
                        +-    </div>
                        +-  {% endif %}
                        ++<a href="{{ config.repo_url }}" title="{{ lang.t('source.link.title') }}" class="md-source">
                        ++  <div class="md-source__icon md-icon">
                        ++    {% set icon = config.theme.icon.repo or "fontawesome/brands/git-alt" %}
                        ++    {% include ".icons/" ~ icon ~ ".svg" %}
                        ++  </div>
                        +   <div class="md-source__repository">
                        +     {{ config.repo_name }}
                        +   </div>
                        +
                        @@ -4,7 +4,7 @@
                        +-{% if nav_item.is_homepage %}
                        ++{% if nav_item.is_homepage or nav_item.url == "index.html" %}
                        +   <li class="md-tabs__item">
                        +     {% if not page.ancestors | length and nav | selectattr("url", page.url) %}
                        +       <a href="{{ nav_item.url | url }}" class="md-tabs__link md-tabs__link--active">
                        +
                        @@ -5,7 +5,7 @@
                        + {% if page.ancestors | length > 0 %}
                        +   {% set class = "md-tabs md-tabs--active" %}
                        + {% endif %}
                        +-<nav class="{{ class }}" data-md-component="tabs">
                        ++<nav class="{{ class }}" aria-label="{{ lang.t('tabs.title') }}" data-md-component="tabs">
                        +   <div class="md-tabs__inner md-grid">
                        +     <ul class="md-tabs__list">
                        +       {% for nav_item in nav %}
                        +
                        @@ -6,7 +6,7 @@
                        +     {{ toc_item.title }}
                        +   </a>
                        +   {% if toc_item.children %}
                        +-    <nav class="md-nav">
                        ++    <nav class="md-nav" aria-label="{{ toc_item.title }}">
                        +       <ul class="md-nav__list">
                        +         {% for toc_item in toc_item.children %}
                        +           {% include "partials/toc-item.html" %}
                        +
                        @@ -4,35 +4,22 @@
                        + {% import "partials/language.html" as lang with context %}
                        +-<nav class="md-nav md-nav--secondary">
                        ++<nav class="md-nav md-nav--secondary" aria-label="{{ lang.t('toc.title') }}">
                        +   {% endif %}
                        +   {% if toc | first is defined %}
                        +     <label class="md-nav__title" for="__toc">
                        ++      <span class="md-nav__icon md-icon">
                        ++        {% include ".icons/material/arrow-left.svg" %}
                        ++      </span>
                        +       {{ lang.t("toc.title") }}
                        +     </label>
                        +     <ul class="md-nav__list" data-md-scrollfix>
                        +       {% for toc_item in toc %}
                        +         {% include "partials/toc-item.html" %}
                        +       {% endfor %}
                        +-      {% if page.meta.source and page.meta.source | length > 0 %}
                        +-        <li class="md-nav__item">
                        +-          <a href="#__source" class="md-nav__link md-nav__link--active">
                        +-            {{ lang.t("meta.source") }}
                        +-          </a>
                        +-        </li>
                        +-      {% endif %}
                        +-      {% set disqus = config.extra.disqus %}
                        +-      {% if page and page.meta and page.meta.disqus is string %}
                        +-        {% set disqus = page.meta.disqus %}
                        +-      {% endif %}
                        +-      {% if not page.is_homepage and disqus %}
                        +-        <li class="md-nav__item">
                        +-          <a href="#__comments" class="md-nav__link md-nav__link--active">
                        +-            {{ lang.t("meta.comments") }}
                        +-          </a>
                        +-        </li>
                        +-      {% endif %}
                        +     </ul>
                        +   {% endif %}
                        + </nav>
                        +

                        Upgrading from 3.x to 4.x

                        What's new?

                        Material for MkDocs 4 fixes incorrect layout on Chinese systems. The fix includes a mandatory change of the base font-size from 10px to 20px which means all rem values needed to be updated. Within the theme, px to rem calculation is now encapsulated in a new function called px2rem which is part of the SASS code base.

                        If you use Material for MkDocs with custom CSS that is based on rem values, note that those values must now be divided by 2. Now, 1.0rem doesn't map to 10px, but 20px. To learn more about the problem and implications, please refer to #911 in which the problem was discovered and fixed.

                        Changes to mkdocs.yml

                        None.

                        Changes to *.html files

                        None.

                        \ No newline at end of file

                        Material for MkDocs Insiders is a private fork of Material for MkDocs, hosted as a private GitHub repository. Almost1 all new features are developed as part of this fork, which means that they are immediately available to all eligible sponsors, as they are made collaborators of this repository.