Merge of features tied to 'Trinidad Scorpion' funding goal

This commit is contained in:
squidfunk 2022-06-02 17:20:33 +02:00
parent a3f457ecb1
commit e2556d84d6
89 changed files with 13701 additions and 290 deletions

View File

@ -1,3 +1,12 @@
mkdocs-material-8.3.0 (2022-06-02)
* Added support for custom admonition icons
* Added support for linking of content tabs
* Added support for boosting pages in search
* Added previous/next next indicators to content tabs
* Improved typeset link colors in light and dark modes
* Fixed #3954: add option to hide footer navigation
mkdocs-material-8.2.16+insiders-4.16.2 (2022-05-28)
* Fixed #3961: Nested sections triggered build error for navigation tabs

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

View File

@ -6,6 +6,15 @@ template: overrides/main.html
## Material for MkDocs
### 8.3.0 <small>_ June 2, 2022</small> { id="8.3.0" }
- Added support for custom admonition icons
- Added support for linking of content tabs
- Added support for boosting pages in search
- Added previous/next next indicators to content tabs
- Fixed #3954: add option to hide footer navigation
- Improved typeset link colors in light and dark modes
### 8.2.16 <small>_ May 28, 2022</small> { id="8.2.16" }
- Fixed #3957: Only animate code annotations when visible (save CPU cycles)

View File

@ -195,9 +195,6 @@ which are currently exclusively available to sponsors:
- [x] [Excluding content from search]
- [x] [Social cards]
- [x] [Cookie consent]
- [x] [Linking content tabs]
- [x] [Boosting pages in search]
- [x] [Custom admonition icons]
</div>
@ -211,16 +208,6 @@ features prefixed with a checkmark symbol, denoting whether a feature is
:octicons-check-circle-fill-24:{ style="color: var(--md-default-fg-color--lightest)" } planned, but not yet implemented. When the funding goal is hit, the features
are released for general availability.
#### $ 6,000 Trinidad Scorpion
- [x] [Boosting pages in search]
- [x] [Custom admonition icons]
- [x] [Linking content tabs]
[Boosting pages in search]: ../setup/setting-up-site-search.md#search-boosting
[Custom admonition icons]: ../reference/admonitions.md#admonition-icons
[Linking content tabs]: ../reference/content-tabs.md#linked-content-tabs
#### $ 7,000 Royal Gold
- [x] [Cookie consent]
@ -296,6 +283,16 @@ 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.
#### $ 6,000 Trinidad Scorpion
- [x] [Boosting pages in search]
- [x] [Custom admonition icons]
- [x] [Linking content tabs]
[Boosting pages in search]: ../setup/setting-up-site-search.md#search-boosting
[Custom admonition icons]: ../reference/admonitions.md#admonition-icons
[Linking content tabs]: ../reference/content-tabs.md#linked-content-tabs
#### $ 5,000 Aji Panca
- [x] [Mermaid.js integration]

View File

@ -35,8 +35,8 @@ See additional configuration options:
### Admonition icons
[:octicons-heart-fill-24:{ .mdx-heart } Sponsors only][Insiders]{ .mdx-insiders } ·
[:octicons-tag-24: insiders-2.4.0][Insiders]
[:octicons-tag-24: 8.3.0][icon support] ·
:octicons-beaker-24: Experimental
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
@ -82,12 +82,6 @@ theme:
quote: octicons/quote-16
```
<div class="result" markdown>
[![Octicons]][Octicons]
</div>
=== ":fontawesome-brands-font-awesome: FontAwesome"
@ -109,18 +103,10 @@ theme:
quote: fontawesome/solid/quote-left
```
<div class="result" markdown>
[![FontAwesome]][FontAwesome]
</div>
[Insiders]: ../insiders/index.md
[icon support]: https://github.com/squidfunk/mkdocs-material/releases/tag/8.3.0
[custom icon]: ../setup/changing-the-logo-and-icons.md#additional-icons
[supported types]: #supported-types
[icon search]: icons-emojis.md#search
[Octicons]: ../assets/screenshots/admonition-octicons.png
[FontAwesome]: ../assets/screenshots/admonition-fontawesome.png
## Usage

View File

@ -46,8 +46,7 @@ See additional configuration options:
### Code annotations
[:octicons-tag-24: 8.0.0][Code annotations support] ·
:octicons-unlock-24: Feature flag ·
:octicons-beaker-24: Experimental
:octicons-unlock-24: Feature flag
Code annotations offer a comfortable and friendly way to attach arbitrary
content to specific sections of code blocks by adding numeric markers in block
@ -127,8 +126,7 @@ import tensorflow as tf
### Adding a title
[:octicons-tag-24: 7.3.6][Title support] ·
:octicons-beaker-24: Experimental
[:octicons-tag-24: 7.3.6][Title support]
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,

View File

@ -33,8 +33,7 @@ See additional configuration options:
### Linked content tabs
[:octicons-heart-fill-24:{ .mdx-heart } Sponsors only][Insiders]{ .mdx-insiders } ·
[:octicons-tag-24: insiders-2.9.0][Insiders] ·
[:octicons-tag-24: 8.3.0][link support] ·
:octicons-unlock-24: Feature flag ·
:octicons-beaker-24: Experimental
@ -61,7 +60,7 @@ integrated with [instant loading] and persisted across page loads.
[![content.tabs.link disabled]][content.tabs.link disabled]
[Insiders]: ../insiders/index.md
[link support]: https://github.com/squidfunk/mkdocs-material/releases/tag/8.3.0
[instant loading]: ../setup/setting-up-navigation.md#instant-loading
[content.tabs.link enabled]: ../assets/screenshots/content-tabs-link.png
[content.tabs.link disabled]: ../assets/screenshots/content-tabs.png

View File

@ -17,8 +17,7 @@ support for many of its features.
[:octicons-heart-fill-24:{ .mdx-heart } Sponsors only][Insiders]{ .mdx-insiders } ·
[:octicons-tag-24: insiders-4.10.0][Insiders] ·
:octicons-cpu-24: Plugin ·
:octicons-beaker-24: Experimental
:octicons-cpu-24: Plugin
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

View File

@ -96,8 +96,7 @@ theme:
#### Sticky navigation tabs
[:octicons-tag-24: 7.3.0][navigation.tabs.sticky support] ·
:octicons-unlock-24: Feature flag ·
:octicons-beaker-24: Experimental
:octicons-unlock-24: Feature flag
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
@ -211,8 +210,7 @@ page in that section (or the section index page).
### Section index pages
[:octicons-tag-24: 7.3.0][navigation.indexes support] ·
:octicons-unlock-24: Feature flag ·
:octicons-beaker-24: Experimental
:octicons-unlock-24: Feature flag
When section index pages are enabled, documents can be directly attached to
sections, which is particularly useful for providing overview pages. Add the

View File

@ -316,8 +316,8 @@ clipboard.
### Search boosting
[:octicons-heart-fill-24:{ .mdx-heart } Sponsors only][Insiders]{ .mdx-insiders } ·
[:octicons-tag-24: insiders-2.8.0][Insiders]
[:octicons-tag-24: 8.3.0][boost support] ·
:octicons-beaker-24: Experimental
When [Metadata] is enabled, pages can be boosted in search with custom front
matter, which will make them rank higher. Add the following lines at the top of
@ -336,6 +336,7 @@ search:
1. :woman_in_lotus_position: When boosting pages, be gentle and start with
__low values__.
[boost support]: https://github.com/squidfunk/mkdocs-material/releases/tag/8.3.0
[Metadata]: extensions/python-markdown.md#metadata
### Search exclusion

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -43,6 +43,6 @@
* Copyright(c) 2015 Andreas Lubbe
* Copyright(c) 2015 Tiancheng "Timothy" Gu
* MIT Licensed
*/var Le=/["'&<>]/;ne.exports=we;function we(t){var e=""+t,r=Le.exec(e);if(!r)return e;var n,i="",s=0,o=0;for(s=r.index;s<e.length;s++){switch(e.charCodeAt(s)){case 34:n="&quot;";break;case 38:n="&amp;";break;case 39:n="&#39;";break;case 60:n="&lt;";break;case 62:n="&gt;";break;default:continue}o!==s&&(i+=e.substring(o,s)),o=s+1,i+=n}return o!==s?i+e.substring(o,s):i}});var le=H(re());Object.entries||(Object.entries=function(t){let e=[];for(let r of Object.keys(t))e.push([r,t[r]]);return e});Object.values||(Object.values=function(t){let e=[];for(let r of Object.keys(t))e.push(t[r]);return e});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(t,e){typeof t=="object"?(this.scrollLeft=t.left,this.scrollTop=t.top):(this.scrollLeft=t,this.scrollTop=e)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...t){let e=this.parentNode;if(e){t.length===0&&e.removeChild(this);for(let r=t.length-1;r>=0;r--){let n=t[r];typeof n!="object"?n=document.createTextNode(n):n.parentNode&&n.parentNode.removeChild(n),r?e.insertBefore(this.previousSibling,n):e.replaceChild(n,this)}}}));var ie=H(q());function se(t){let e=new Map,r=new Set;for(let n of t){let[i,s]=n.location.split("#"),o=n.location,a=n.title,u=n.tags,c=(0,ie.default)(n.text).replace(/\s+(?=[,.:;!?])/g,"").replace(/\s+/g," ");if(s){let h=e.get(i);r.has(h)?e.set(o,{location:o,title:a,text:c,parent:h}):(h.title=n.title,h.text=c,r.add(h))}else e.set(o,M({location:o,title:a,text:c},u&&{tags:u}))}return e}var oe=H(q());function ae(t,e){let r=new RegExp(t.separator,"img"),n=(i,s,o)=>`${s}<mark data-md-highlight>${o}</mark>`;return i=>{i=i.replace(/[\s*+\-:~^]+/g," ").trim();let s=new RegExp(`(^|${t.separator})(${i.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return o=>(e?(0,oe.default)(o):o).replace(s,n).replace(/<\/mark>(\s+)<mark[^>]*>/img,"$1")}}function ue(t){let e=new lunr.Query(["title","text"]);return new lunr.QueryParser(t,e).parse(),e.clauses}function ce(t,e){var i;let r=new Set(t),n={};for(let s=0;s<e.length;s++)for(let o of r)e[s].startsWith(o.term)&&(n[o.term]=!0,r.delete(o));for(let s of r)(i=lunr.stopWordFilter)!=null&&i.call(lunr,s.term)&&(n[s.term]=!1);return n}function Ee(t,e){let[r,n]=[new Set(t),new Set(e)];return[...new Set([...r].filter(i=>!n.has(i)))]}var U=class{constructor({config:e,docs:r,options:n}){this.options=n,this.documents=se(r),this.highlight=ae(e,!1),lunr.tokenizer.separator=new RegExp(e.separator),this.index=lunr(function(){e.lang.length===1&&e.lang[0]!=="en"?this.use(lunr[e.lang[0]]):e.lang.length>1&&this.use(lunr.multiLanguage(...e.lang));let i=Ee(["trimmer","stopWordFilter","stemmer"],n.pipeline);for(let s of e.lang.map(o=>o==="en"?lunr:lunr[o]))for(let o of i)this.pipeline.remove(s[o]),this.searchPipeline.remove(s[o]);this.ref("location"),this.field("title",{boost:1e3}),this.field("text"),this.field("tags",{boost:1e6});for(let s of r)this.add(s)})}search(e){if(e)try{let r=this.highlight(e),n=ue(e).filter(o=>o.presence!==lunr.Query.presence.PROHIBITED),i=this.index.search(`${e}*`).reduce((o,{ref:a,score:u,matchData:c})=>{let h=this.documents.get(a);if(typeof h!="undefined"){let{location:y,title:g,text:b,tags:m,parent:Q}=h,p=ce(n,Object.keys(c.metadata)),d=+!Q+ +Object.values(p).every(w=>w);o.push(Z(M({location:y,title:r(g),text:r(b)},m&&{tags:m.map(r)}),{score:u*(1+d),terms:p}))}return o},[]).sort((o,a)=>a.score-o.score).reduce((o,a)=>{let u=this.documents.get(a.location);if(typeof u!="undefined"){let c="parent"in u?u.parent.location:u.location;o.set(c,[...o.get(c)||[],a])}return o},new Map),s;if(this.options.suggestions){let o=this.index.query(a=>{for(let u of n)a.term(u.term,{fields:["title"],presence:lunr.Query.presence.REQUIRED,wildcard:lunr.Query.wildcard.TRAILING})});s=o.length?Object.keys(o[0].matchData.metadata):[]}return M({items:[...i.values()]},typeof s!="undefined"&&{suggestions:s})}catch(r){console.warn(`Invalid query: ${e} \u2013 see https://bit.ly/2s3ChXG`)}return{items:[]}}};var Y;function ke(t){return z(this,null,function*(){let e="../lunr";if(typeof parent!="undefined"&&"IFrameWorker"in parent){let n=document.querySelector("script[src]"),[i]=n.src.split("/worker");e=e.replace("..",i)}let r=[];for(let n of t.lang){switch(n){case"ja":r.push(`${e}/tinyseg.js`);break;case"hi":case"th":r.push(`${e}/wordcut.js`);break}n!=="en"&&r.push(`${e}/min/lunr.${n}.min.js`)}t.lang.length>1&&r.push(`${e}/min/lunr.multi.min.js`),r.length&&(yield importScripts(`${e}/min/lunr.stemmer.support.min.js`,...r))})}function Te(t){return z(this,null,function*(){switch(t.type){case 0:return yield ke(t.data.config),Y=new U(t.data),{type:1};case 2:return{type:3,data:Y?Y.search(t.data):{items:[]}};default:throw new TypeError("Invalid message type")}})}self.lunr=le.default;addEventListener("message",t=>z(void 0,null,function*(){postMessage(yield Te(t.data))}));})();
//# sourceMappingURL=search.e82c77d7.min.js.map
*/var Le=/["'&<>]/;ne.exports=we;function we(t){var e=""+t,r=Le.exec(e);if(!r)return e;var n,i="",s=0,o=0;for(s=r.index;s<e.length;s++){switch(e.charCodeAt(s)){case 34:n="&quot;";break;case 38:n="&amp;";break;case 39:n="&#39;";break;case 60:n="&lt;";break;case 62:n="&gt;";break;default:continue}o!==s&&(i+=e.substring(o,s)),o=s+1,i+=n}return o!==s?i+e.substring(o,s):i}});var le=H(re());Object.entries||(Object.entries=function(t){let e=[];for(let r of Object.keys(t))e.push([r,t[r]]);return e});Object.values||(Object.values=function(t){let e=[];for(let r of Object.keys(t))e.push(t[r]);return e});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(t,e){typeof t=="object"?(this.scrollLeft=t.left,this.scrollTop=t.top):(this.scrollLeft=t,this.scrollTop=e)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...t){let e=this.parentNode;if(e){t.length===0&&e.removeChild(this);for(let r=t.length-1;r>=0;r--){let n=t[r];typeof n!="object"?n=document.createTextNode(n):n.parentNode&&n.parentNode.removeChild(n),r?e.insertBefore(this.previousSibling,n):e.replaceChild(n,this)}}}));var ie=H(q());function se(t){let e=new Map,r=new Set;for(let n of t){let[i,s]=n.location.split("#"),o=n.location,a=n.title,u=n.tags,c=(0,ie.default)(n.text).replace(/\s+(?=[,.:;!?])/g,"").replace(/\s+/g," ");if(s){let h=e.get(i);r.has(h)?e.set(o,{location:o,title:a,text:c,parent:h}):(h.title=n.title,h.text=c,r.add(h))}else e.set(o,M({location:o,title:a,text:c},u&&{tags:u}))}return e}var oe=H(q());function ae(t,e){let r=new RegExp(t.separator,"img"),n=(i,s,o)=>`${s}<mark data-md-highlight>${o}</mark>`;return i=>{i=i.replace(/[\s*+\-:~^]+/g," ").trim();let s=new RegExp(`(^|${t.separator})(${i.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return o=>(e?(0,oe.default)(o):o).replace(s,n).replace(/<\/mark>(\s+)<mark[^>]*>/img,"$1")}}function ue(t){let e=new lunr.Query(["title","text"]);return new lunr.QueryParser(t,e).parse(),e.clauses}function ce(t,e){var i;let r=new Set(t),n={};for(let s=0;s<e.length;s++)for(let o of r)e[s].startsWith(o.term)&&(n[o.term]=!0,r.delete(o));for(let s of r)(i=lunr.stopWordFilter)!=null&&i.call(lunr,s.term)&&(n[s.term]=!1);return n}function Ee(t,e){let[r,n]=[new Set(t),new Set(e)];return[...new Set([...r].filter(i=>!n.has(i)))]}var U=class{constructor({config:e,docs:r,options:n}){this.options=n,this.documents=se(r),this.highlight=ae(e,!1),lunr.tokenizer.separator=new RegExp(e.separator),this.index=lunr(function(){e.lang.length===1&&e.lang[0]!=="en"?this.use(lunr[e.lang[0]]):e.lang.length>1&&this.use(lunr.multiLanguage(...e.lang));let i=Ee(["trimmer","stopWordFilter","stemmer"],n.pipeline);for(let s of e.lang.map(o=>o==="en"?lunr:lunr[o]))for(let o of i)this.pipeline.remove(s[o]),this.searchPipeline.remove(s[o]);this.ref("location"),this.field("title",{boost:1e3}),this.field("text"),this.field("tags",{boost:1e6});for(let s of r)this.add(s,{boost:s.boost})})}search(e){if(e)try{let r=this.highlight(e),n=ue(e).filter(o=>o.presence!==lunr.Query.presence.PROHIBITED),i=this.index.search(`${e}*`).reduce((o,{ref:a,score:u,matchData:c})=>{let h=this.documents.get(a);if(typeof h!="undefined"){let{location:y,title:g,text:b,tags:m,parent:Q}=h,p=ce(n,Object.keys(c.metadata)),d=+!Q+ +Object.values(p).every(w=>w);o.push(Z(M({location:y,title:r(g),text:r(b)},m&&{tags:m.map(r)}),{score:u*(1+d),terms:p}))}return o},[]).sort((o,a)=>a.score-o.score).reduce((o,a)=>{let u=this.documents.get(a.location);if(typeof u!="undefined"){let c="parent"in u?u.parent.location:u.location;o.set(c,[...o.get(c)||[],a])}return o},new Map),s;if(this.options.suggestions){let o=this.index.query(a=>{for(let u of n)a.term(u.term,{fields:["title"],presence:lunr.Query.presence.REQUIRED,wildcard:lunr.Query.wildcard.TRAILING})});s=o.length?Object.keys(o[0].matchData.metadata):[]}return M({items:[...i.values()]},typeof s!="undefined"&&{suggestions:s})}catch(r){console.warn(`Invalid query: ${e} \u2013 see https://bit.ly/2s3ChXG`)}return{items:[]}}};var Y;function ke(t){return z(this,null,function*(){let e="../lunr";if(typeof parent!="undefined"&&"IFrameWorker"in parent){let n=document.querySelector("script[src]"),[i]=n.src.split("/worker");e=e.replace("..",i)}let r=[];for(let n of t.lang){switch(n){case"ja":r.push(`${e}/tinyseg.js`);break;case"hi":case"th":r.push(`${e}/wordcut.js`);break}n!=="en"&&r.push(`${e}/min/lunr.${n}.min.js`)}t.lang.length>1&&r.push(`${e}/min/lunr.multi.min.js`),r.length&&(yield importScripts(`${e}/min/lunr.stemmer.support.min.js`,...r))})}function Te(t){return z(this,null,function*(){switch(t.type){case 0:return yield ke(t.data.config),Y=new U(t.data),{type:1};case 2:return{type:3,data:Y?Y.search(t.data):{items:[]}};default:throw new TypeError("Invalid message type")}})}self.lunr=le.default;addEventListener("message",t=>z(void 0,null,function*(){postMessage(yield Te(t.data))}));})();
//# sourceMappingURL=search.b028fd86.min.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"version":3,"sources":["src/assets/stylesheets/palette/_scheme.scss","../../../src/assets/stylesheets/palette.scss","src/assets/stylesheets/palette/_accent.scss","src/assets/stylesheets/palette/_primary.scss","src/assets/stylesheets/utilities/_break.scss"],"names":[],"mappings":"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","file":"palette.css"}

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
{"version":3,"sources":["src/assets/stylesheets/palette/_accent.scss","../../../src/assets/stylesheets/palette.scss","src/assets/stylesheets/palette/_primary.scss","src/assets/stylesheets/utilities/_break.scss","src/assets/stylesheets/palette/_scheme.scss"],"names":[],"mappings":"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","file":"palette.css"}

View File

@ -22,7 +22,7 @@
<link rel="canonical" href="{{ page.canonical_url }}">
{% endif %}
<link rel="icon" href="{{ config.theme.favicon | url }}">
<meta name="generator" content="mkdocs-{{ mkdocs_version }}, mkdocs-material-8.2.16">
<meta name="generator" content="mkdocs-{{ mkdocs_version }}, mkdocs-material-8.3.0">
{% endblock %}
{% block htmltitle %}
{% if page and page.meta and page.meta.title %}
@ -34,10 +34,10 @@
{% endif %}
{% endblock %}
{% block styles %}
<link rel="stylesheet" href="{{ 'assets/stylesheets/main.64b3143d.min.css' | url }}">
<link rel="stylesheet" href="{{ 'assets/stylesheets/main.fd896c8a.min.css' | url }}">
{% if config.theme.palette %}
{% set palette = config.theme.palette %}
<link rel="stylesheet" href="{{ 'assets/stylesheets/palette.cc9b2e1e.min.css' | url }}">
<link rel="stylesheet" href="{{ 'assets/stylesheets/palette.cbb835fc.min.css' | url }}">
{% if palette.primary %}
{% import "partials/palette.html" as map %}
{% set primary = map.primary(
@ -46,6 +46,7 @@
<meta name="theme-color" content="{{ primary }}">
{% endif %}
{% endif %}
{% include "partials/icons.html" %}
{% endblock %}
{% block libs %}{% endblock %}
{% block fonts %}
@ -164,10 +165,11 @@
{% include "partials/content.html" %}
{% endblock %}
</article>
{% include "partials/javascripts/content.html" %}
</div>
</div>
{% if "navigation.top" in features %}
<a href="#" class="md-top md-icon" data-md-component="top" data-md-state="hidden">
<a href="#" class="md-top md-top--hidden md-icon" data-md-component="top">
{% include ".icons/material/arrow-up.svg" %}
{{ lang.t('top.title') }}
</a>
@ -185,7 +187,7 @@
"base": base_url,
"features": features,
"translations": {},
"search": "assets/javascripts/workers/search.e82c77d7.min.js" | url
"search": "assets/javascripts/workers/search.b028fd86.min.js" | url
} -%}
{%- if config.extra.version -%}
{%- set _ = app.update({ "version": config.extra.version }) -%}
@ -214,7 +216,7 @@
</script>
{% endblock %}
{% block scripts %}
<script src="{{ 'assets/javascripts/bundle.3a4b43e5.min.js' | url }}"></script>
<script src="{{ 'assets/javascripts/bundle.0f659f14.min.js' | url }}"></script>
{% for path in config["extra_javascript"] %}
<script src="{{ path | url }}"></script>
{% endfor %}

View File

@ -19,5 +19,5 @@
{% endblock %}
{% block scripts %}
{{ super() }}
<script src="{{ 'overrides/assets/javascripts/bundle.2bc01bfd.min.js' | url }}"></script>
<script src="{{ 'overrides/assets/javascripts/bundle.1ff6d521.min.js' | url }}"></script>
{% endblock %}

View File

@ -3,7 +3,8 @@
-#}
<footer class="md-footer">
{% if page.previous_page or page.next_page %}
<nav class="md-footer__inner md-grid" aria-label="{{ lang.t('footer.title') }}">
{% set hidden = "hidden" if "footer" in page.meta.hide %}
<nav class="md-footer__inner md-grid" aria-label="{{ lang.t('footer.title') }}" {{ hidden }}>
{% if page.previous_page %}
{% set direction = lang.t("footer.previous") %}
<a href="{{ page.previous_page.url | url }}" class="md-footer__link md-footer__link--prev" aria-label="{{ direction }}: {{ page.previous_page.title | e }}" rel="prev">

View File

@ -0,0 +1,17 @@
{#-
This file was automatically generated - do not edit
-#}
{% if config.theme.icon.admonition %}
{% set style = ["\x3cstyle\x3e:root{"] %}
{% for type, icon in config.theme.icon.admonition.items() %}
{% import ".icons/" ~ icon ~ ".svg" as icon %}
{% set _ = style.append(
"--md-admonition-icon--" ~ type ~ ":" ~
"url('data:image/svg+xml;charset=utf-8," ~
icon | replace("\n", "") ~
"');"
) %}
{% endfor %}
{% set _ = style.append("}\x3c/style\x3e") %}
{{ style | join }}
{% endif %}

View File

@ -0,0 +1,6 @@
{#-
This file was automatically generated - do not edit
-#}
{% if "content.tabs.link" in features %}
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var tab,labels=set.querySelector(".tabbed-labels");for(tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
{% endif %}

View File

@ -3,7 +3,6 @@
-#}
{% macro t(key) %}{{ {
"language": "el",
"direction": "ltr",
"clipboard.copy": "Αντιγραφή στο πρόχειρο",
"clipboard.copied": "Αντιγράφηκε στο πρόχειρο",
"edit.link.title": "Επεξεργασία αυτής της σελίδας",

View File

@ -3,7 +3,6 @@
-#}
{% macro t(key) %}{{ {
"language": "it",
"direction": "ltr",
"clipboard.copy": "Copia",
"clipboard.copied": "Copiato",
"edit.link.title": "Modifica",

View File

@ -3,7 +3,6 @@
-#}
{% macro t(key) %}{{ {
"language": "pt",
"direction": "ltr",
"clipboard.copy": "Copiar para área de Transferência",
"clipboard.copied": "Copiado para área de Transferência",
"edit.link.title": "Editar esta página",

View File

@ -3,7 +3,6 @@
-#}
{% macro t(key) %}{{ {
"language": "zh",
"direction": "ltr",
"clipboard.copy": "复制",
"clipboard.copied": "已复制",
"edit.link.title": "编辑此页",

View File

@ -15,7 +15,7 @@
<li class="{{ class }} md-nav__item--nested">
{% set checked = "checked" if nav_item.active %}
{% if "navigation.expand" in features and not checked %}
<input class="md-nav__toggle md-toggle" data-md-toggle="{{ path }}" data-md-state="indeterminate" type="checkbox" id="{{ path }}" checked>
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle="{{ path }}" type="checkbox" id="{{ path }}" checked>
{% else %}
<input class="md-nav__toggle md-toggle" data-md-toggle="{{ path }}" type="checkbox" id="{{ path }}" {{ checked }}>
{% endif %}

View File

@ -47,3 +47,9 @@ class SearchIndex(BaseIndex):
# Add document tags
if "tags" in page.meta:
entry["tags"] = page.meta["tags"]
# Add document boost for search
if "search" in page.meta:
search = page.meta["search"]
if "boost" in search:
entry["boost"] = search["boost"]

View File

@ -27,7 +27,6 @@ from markdown.extensions.toc import slugify
from mkdocs import utils
from mkdocs.commands.build import DuplicateFilter
from mkdocs.config.config_options import Type
from mkdocs.exceptions import ConfigurationError
from mkdocs.plugins import BasePlugin
# -----------------------------------------------------------------------------

13079
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "mkdocs-material",
"version": "8.2.16",
"version": "8.3.0",
"description": "Documentation that simply works",
"keywords": [
"mkdocs",

View File

@ -31,6 +31,7 @@ import { getElement, getLocation } from "~/browser"
*/
export type Flag =
| "content.code.annotate" /* Code annotations */
| "content.tabs.link" /* Link content tabs */
| "header.autohide" /* Hide header */
| "navigation.expand" /* Automatic expansion */
| "navigation.indexes" /* Section pages */

View File

@ -54,9 +54,9 @@ export interface Mermaid {}
let mermaid$: Observable<void>
/**
* Global index for Mermaid integration
* Global sequence number for diagrams
*/
let index = 0
let sequence = 0
/* ----------------------------------------------------------------------------
* Helper functions
@ -101,7 +101,7 @@ export function mountMermaid(
/* Render diagram */
mermaid$.subscribe(() => {
el.classList.add("mermaid") // Hack: mitigate https://bit.ly/3CiN6Du
const id = `__mermaid_${index++}`
const id = `__mermaid_${sequence++}`
const host = h("div", { class: "mermaid" })
mermaid.mermaidAPI.render(id, el.textContent, (svg: string) => {

View File

@ -32,6 +32,7 @@ import {
fromEvent,
map,
merge,
skip,
startWith,
subscribeOn,
takeLast,
@ -39,13 +40,18 @@ import {
tap
} from "rxjs"
import { feature } from "~/_"
import {
getElement,
getElementContentOffset,
getElementContentSize,
getElementOffset,
getElementSize,
getElements,
watchElementContentOffset,
watchElementSize
} from "~/browser"
import { renderTabbedControl } from "~/templates"
import { Component } from "../../_"
@ -75,18 +81,15 @@ export function watchContentTabs(
el: HTMLElement
): Observable<ContentTabs> {
const inputs = getElements<HTMLInputElement>(":scope > input", el)
const active = inputs.find(input => input.checked) || inputs[0]
const initial = inputs.find(input => input.checked) || inputs[0]
return merge(...inputs.map(input => fromEvent(input, "change")
.pipe(
map(() => ({
active: getElement(`label[for=${input.id}]`)
}) as ContentTabs)
map(() => getElement<HTMLLabelElement>(`label[for=${input.id}]`))
)
))
.pipe(
startWith({
active: getElement(`label[for=${active.id}]`)
} as ContentTabs)
startWith(getElement<HTMLLabelElement>(`label[for=${initial.id}]`)),
map(active => ({ active }))
)
}
@ -105,18 +108,29 @@ export function watchContentTabs(
export function mountContentTabs(
el: HTMLElement
): Observable<Component<ContentTabs>> {
/* Render content tab previous button for pagination */
const prev = renderTabbedControl("prev")
el.append(prev)
/* Render content tab next button for pagination */
const next = renderTabbedControl("next")
el.append(next)
/* Mount component on subscription */
const container = getElement(".tabbed-labels", el)
return defer(() => {
const push$ = new Subject<ContentTabs>()
const done$ = push$.pipe(takeLast(1))
combineLatest([push$, watchElementSize(el)])
.pipe(
auditTime(1, animationFrameScheduler),
takeUntil(push$.pipe(takeLast(1)))
takeUntil(done$)
)
.subscribe({
/* Handle emission */
next([{ active }]) {
next([{ active }, size]) {
const offset = getElementOffset(active)
const { width } = getElementSize(active)
@ -124,11 +138,12 @@ export function mountContentTabs(
el.style.setProperty("--md-indicator-x", `${offset.x}px`)
el.style.setProperty("--md-indicator-width", `${width}px`)
/* Smoothly scroll container */
container.scrollTo({
behavior: "smooth",
left: offset.x
})
/* Scroll container to active content tab */
const content = getElementContentOffset(container)
if (offset.x < content.x)
prev.click()
else if (offset.x + width > content.x + size.width)
next.click()
},
/* Handle complete */
@ -138,6 +153,57 @@ export function mountContentTabs(
}
})
/* Hide content tab buttons on borders */
combineLatest([
watchElementContentOffset(container),
watchElementSize(container)
])
.pipe(
takeUntil(done$)
)
.subscribe(([offset, size]) => {
const content = getElementContentSize(container)
prev.hidden = offset.x < 16
next.hidden = offset.x > content.width - size.width - 16
})
/* Paginate content tab container on click */
merge(
fromEvent(prev, "click").pipe(map(() => -1)),
fromEvent(next, "click").pipe(map(() => +1))
)
.pipe(
takeUntil(done$)
)
.subscribe(direction => {
const { width } = getElementSize(container)
container.scrollBy({
left: width * direction,
behavior: "smooth"
})
})
/* Set up linking of content tabs, if enabled */
if (feature("content.tabs.link"))
push$.pipe(skip(1))
.subscribe(({ active }) => {
const tab = active.innerText.trim()
for (const set of getElements("[data-tabs]"))
for (const input of getElements<HTMLInputElement>(
":scope > input", set
)) {
const label = getElement(`label[for=${input.id}]`)
if (label.innerText.trim() === tab) {
input.click()
break
}
}
/* Persist active tabs in local storage */
const tabs = __md_get<string[]>("__tabs") || []
__md_set("__tabs", [...new Set([tab, ...tabs])])
})
/* Create and return component */
return watchContentTabs(el)
.pipe(

View File

@ -113,11 +113,8 @@ export function mountDialog(
return defer(() => {
const push$ = new Subject<Dialog>()
push$.subscribe(({ message, active }) => {
el.classList.toggle("md-dialog--active", active)
inner.textContent = message
if (active)
el.setAttribute("data-md-state", "open")
else
el.removeAttribute("data-md-state")
})
/* Create and return component */

View File

@ -175,16 +175,15 @@ export function mountHeader(
): Observable<Component<Header>> {
return defer(() => {
const push$ = new Subject<Main>()
const done$ = push$.pipe(takeLast(1))
push$
.pipe(
distinctUntilKeyChanged("active"),
combineLatestWith(header$)
)
.subscribe(([{ active }, { hidden }]) => {
if (active)
el.setAttribute("data-md-state", hidden ? "hidden" : "shadow")
else
el.removeAttribute("data-md-state")
el.classList.toggle("md-header--hidden", hidden)
el.classList.toggle("md-header--shadow", active && !hidden)
})
/* Link to main area */
@ -193,7 +192,7 @@ export function mountHeader(
/* Create and return component */
return header$
.pipe(
takeUntil(push$.pipe(takeLast(1))),
takeUntil(done$),
map(state => ({ ref: el, ...state }))
)
})

View File

@ -116,10 +116,7 @@ export function mountHeaderTitle(
return defer(() => {
const push$ = new Subject<HeaderTitle>()
push$.subscribe(({ active }) => {
if (active)
el.setAttribute("data-md-state", "active")
else
el.removeAttribute("data-md-state")
el.classList.toggle("md-header__title--active", active)
})
/* Obtain headline, if any */

View File

@ -32,6 +32,7 @@ import {
fromEvent,
map,
merge,
share,
shareReplay,
startWith,
take,
@ -155,6 +156,7 @@ export function mountSearchQuery(
el: HTMLInputElement, { tx$, rx$ }: SearchWorker
): Observable<Component<SearchQuery, HTMLInputElement>> {
const push$ = new Subject<SearchQuery>()
const done$ = push$.pipe(takeLast(1))
/* Handle value changes */
push$
@ -184,7 +186,7 @@ export function mountSearchQuery(
/* Handle reset */
fromEvent(el.form!, "reset")
.pipe(
takeUntil(push$.pipe(takeLast(1)))
takeUntil(done$)
)
.subscribe(() => el.focus())
@ -193,6 +195,7 @@ export function mountSearchQuery(
.pipe(
tap(state => push$.next(state)),
finalize(() => push$.complete()),
map(state => ({ ref: el, ...state }))
map(state => ({ ref: el, ...state })),
share()
)
}

View File

@ -113,7 +113,7 @@ export function mountSource(
const push$ = new Subject<Source>()
push$.subscribe(({ facts }) => {
inner.appendChild(renderSourceFacts(facts))
inner.setAttribute("data-md-state", "done")
inner.classList.add("md-source__repository--active")
})
/* Create and return component */

View File

@ -120,15 +120,12 @@ export function mountTabs(
/* Handle emission */
next({ hidden }) {
if (hidden)
el.setAttribute("data-md-state", "hidden")
else
el.removeAttribute("data-md-state")
el.classList.toggle("md-tabs--hidden", hidden)
},
/* Handle complete */
complete() {
el.removeAttribute("data-md-state")
el.classList.remove("md-tabs--hidden")
}
})

View File

@ -269,19 +269,18 @@ export function mountTableOfContents(
): Observable<Component<TableOfContents>> {
return defer(() => {
const push$ = new Subject<TableOfContents>()
const done$ = push$.pipe(takeLast(1))
push$.subscribe(({ prev, next }) => {
/* Look forward */
for (const [anchor] of next) {
anchor.removeAttribute("data-md-state")
anchor.classList.remove(
"md-nav__link--active"
)
anchor.classList.remove("md-nav__link--passed")
anchor.classList.remove("md-nav__link--active")
}
/* Look backward */
for (const [index, [anchor]] of prev.entries()) {
anchor.setAttribute("data-md-state", "blur")
anchor.classList.add("md-nav__link--passed")
anchor.classList.toggle(
"md-nav__link--active",
index === prev.length - 1
@ -293,7 +292,7 @@ export function mountTableOfContents(
if (feature("navigation.tracking"))
viewport$
.pipe(
takeUntil(push$.pipe(takeLast(1))),
takeUntil(done$),
distinctUntilKeyChanged("offset"),
debounceTime(250),
skip(1),

View File

@ -134,16 +134,16 @@ export function mountBackToTop(
el: HTMLElement, { viewport$, header$, main$, target$ }: MountOptions
): Observable<Component<BackToTop>> {
const push$ = new Subject<BackToTop>()
const done$ = push$.pipe(takeLast(1))
push$.subscribe({
/* Handle emission */
next({ hidden }) {
el.classList.toggle("md-top--hidden", hidden)
if (hidden) {
el.setAttribute("data-md-state", "hidden")
el.setAttribute("tabindex", "-1")
el.blur()
} else {
el.removeAttribute("data-md-state")
el.removeAttribute("tabindex")
}
},
@ -151,7 +151,7 @@ export function mountBackToTop(
/* Handle complete */
complete() {
el.style.top = ""
el.setAttribute("data-md-state", "hidden")
el.classList.add("md-top--hidden")
el.removeAttribute("tabindex")
}
})
@ -159,7 +159,7 @@ export function mountBackToTop(
/* Watch header height */
header$
.pipe(
takeUntil(push$.pipe(endWith(0), takeLast(1))),
takeUntil(done$),
distinctUntilKeyChanged("height")
)
.subscribe(({ height }) => {

View File

@ -56,6 +56,7 @@ export interface SearchIndexDocument {
title: string /* Document title */
text: string /* Document text */
tags?: string[] /* Document tags */
boost?: number /* Document boost */
}
/* ------------------------------------------------------------------------- */
@ -207,7 +208,7 @@ export class Search {
/* Index documents */
for (const doc of docs)
this.add(doc)
this.add(doc, { boost: doc.boost })
})
}

View File

@ -63,7 +63,8 @@ export function patchIndeterminate(
document$
.pipe(
switchMap(() => getElements<HTMLInputElement>(
"[data-md-state=indeterminate]"
// @todo `data-md-state` is deprecated and removed in v9
".md-toggle--indeterminate, [data-md-state=indeterminate]"
)),
tap(el => {
el.indeterminate = true
@ -71,14 +72,14 @@ export function patchIndeterminate(
}),
mergeMap(el => fromEvent(el, "change")
.pipe(
takeWhile(() => el.hasAttribute("data-md-state")),
takeWhile(() => el.classList.contains("md-toggle--indeterminate")),
map(() => el)
)
),
withLatestFrom(tablet$)
)
.subscribe(([el, tablet]) => {
el.removeAttribute("data-md-state")
el.classList.remove("md-toggle--indeterminate")
if (tablet)
el.checked = false
})

View File

@ -76,11 +76,11 @@ export function patchScrolllock(
)
.subscribe(([active, { offset: { y }}]) => {
if (active) {
document.body.setAttribute("data-md-state", "lock")
document.body.setAttribute("data-md-scrolllock", "")
document.body.style.top = `-${y}px`
} else {
const value = -1 * parseInt(document.body.style.top, 10)
document.body.removeAttribute("data-md-state")
document.body.removeAttribute("data-md-scrolllock")
document.body.style.top = ""
if (value)
window.scrollTo(0, value)

View File

@ -24,5 +24,6 @@ export * from "./annotation"
export * from "./clipboard"
export * from "./search"
export * from "./source"
export * from "./tabbed"
export * from "./table"
export * from "./version"

View File

@ -0,0 +1,56 @@
/*
* Copyright (c) 2016-2022 Martin Donath <martin.donath@squidfunk.com>
*
* 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.
*/
import { h } from "~/utilities"
/* ----------------------------------------------------------------------------
* Helper types
* ------------------------------------------------------------------------- */
/**
* Tabbed control type
*/
type TabbedControlType =
| "prev"
| "next"
/* ----------------------------------------------------------------------------
* Functions
* ------------------------------------------------------------------------- */
/**
* Render control for content tabs
*
* @param type - Control type
*
* @returns Element
*/
export function renderTabbedControl(
type: TabbedControlType
): HTMLElement {
const classes = `tabbed-control tabbed-control--${type}`
return (
<div class={classes} hidden>
<button class="tabbed-button" tabIndex={-1}></button>
</div>
)
}

View File

@ -54,7 +54,7 @@ function renderVersion(version: Version): HTMLElement {
const url = new URL(`../${version.version}/`, config.base)
return (
<li class="md-version__item">
<a href={url.toString()} class="md-version__link">
<a href={`${url}`} class="md-version__link">
{version.title}
</a>
</li>

View File

@ -100,11 +100,16 @@ export function h<T extends h.JSX.Element>(
/* Set attributes, if any */
if (attributes)
for (const attr of Object.keys(attributes))
for (const attr of Object.keys(attributes)) {
if (typeof attributes[attr] === "undefined")
continue
/* Set default attribute or boolean */
if (typeof attributes[attr] !== "boolean")
el.setAttribute(attr, attributes[attr])
else if (attributes[attr])
else
el.setAttribute(attr, "")
}
/* Append child nodes */
for (const child of children)

View File

@ -50,60 +50,56 @@
--md-accent-bg-color: hsla(0, 0%, 100%, 1);
--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7);
// Light theme (default)
> * {
// Code color shades
--md-code-fg-color: hsla(200, 18%, 26%, 1);
--md-code-bg-color: hsla(0, 0%, 96%, 1);
// Code color shades
--md-code-fg-color: hsla(200, 18%, 26%, 1);
--md-code-bg-color: hsla(0, 0%, 96%, 1);
// Code highlighting color shades
--md-code-hl-color: hsla(#{hex2hsl($clr-yellow-a200)}, 0.5);
--md-code-hl-number-color: hsla(0, 67%, 50%, 1);
--md-code-hl-special-color: hsla(340, 83%, 47%, 1);
--md-code-hl-function-color: hsla(291, 45%, 50%, 1);
--md-code-hl-constant-color: hsla(250, 63%, 60%, 1);
--md-code-hl-keyword-color: hsla(219, 54%, 51%, 1);
--md-code-hl-string-color: hsla(150, 63%, 30%, 1);
--md-code-hl-name-color: var(--md-code-fg-color);
--md-code-hl-operator-color: var(--md-default-fg-color--light);
--md-code-hl-punctuation-color: var(--md-default-fg-color--light);
--md-code-hl-comment-color: var(--md-default-fg-color--light);
--md-code-hl-generic-color: var(--md-default-fg-color--light);
--md-code-hl-variable-color: var(--md-default-fg-color--light);
// Code highlighting color shades
--md-code-hl-color: hsla(#{hex2hsl($clr-yellow-a200)}, 0.5);
--md-code-hl-number-color: hsla(0, 67%, 50%, 1);
--md-code-hl-special-color: hsla(340, 83%, 47%, 1);
--md-code-hl-function-color: hsla(291, 45%, 50%, 1);
--md-code-hl-constant-color: hsla(250, 63%, 60%, 1);
--md-code-hl-keyword-color: hsla(219, 54%, 51%, 1);
--md-code-hl-string-color: hsla(150, 63%, 30%, 1);
--md-code-hl-name-color: var(--md-code-fg-color);
--md-code-hl-operator-color: var(--md-default-fg-color--light);
--md-code-hl-punctuation-color: var(--md-default-fg-color--light);
--md-code-hl-comment-color: var(--md-default-fg-color--light);
--md-code-hl-generic-color: var(--md-default-fg-color--light);
--md-code-hl-variable-color: var(--md-default-fg-color--light);
// Typeset color shades
--md-typeset-color: var(--md-default-fg-color);
// Typeset color shades
--md-typeset-color: var(--md-default-fg-color);
// Typeset `a` color shades
--md-typeset-a-color: var(--md-primary-fg-color);
// Typeset `a` color shades
--md-typeset-a-color: var(--md-primary-fg-color);
// Typeset `mark` color shades
--md-typeset-mark-color: hsla(#{hex2hsl($clr-yellow-a200)}, 0.5);
// Typeset `mark` color shades
--md-typeset-mark-color: hsla(#{hex2hsl($clr-yellow-a200)}, 0.5);
// Typeset `del` and `ins` color shades
--md-typeset-del-color: hsla(6, 90%, 60%, 0.15);
--md-typeset-ins-color: hsla(150, 90%, 44%, 0.15);
// Typeset `del` and `ins` color shades
--md-typeset-del-color: hsla(6, 90%, 60%, 0.15);
--md-typeset-ins-color: hsla(150, 90%, 44%, 0.15);
// Typeset `kbd` color shades
--md-typeset-kbd-color: hsla(0, 0%, 98%, 1);
--md-typeset-kbd-accent-color: hsla(0, 100%, 100%, 1);
--md-typeset-kbd-border-color: hsla(0, 0%, 72%, 1);
// Typeset `kbd` color shades
--md-typeset-kbd-color: hsla(0, 0%, 98%, 1);
--md-typeset-kbd-accent-color: hsla(0, 100%, 100%, 1);
--md-typeset-kbd-border-color: hsla(0, 0%, 72%, 1);
// Typeset `table` color shades
--md-typeset-table-color: hsla(0, 0%, 0%, 0.12);
// Typeset `table` color shades
--md-typeset-table-color: hsla(0, 0%, 0%, 0.12);
// Admonition color shades
--md-admonition-fg-color: var(--md-default-fg-color);
--md-admonition-bg-color: var(--md-default-bg-color);
// Admonition color shades
--md-admonition-fg-color: var(--md-default-fg-color);
--md-admonition-bg-color: var(--md-default-bg-color);
// Footer color shades
--md-footer-fg-color: hsla(0, 0%, 100%, 1);
--md-footer-fg-color--light: hsla(0, 0%, 100%, 0.7);
--md-footer-fg-color--lighter: hsla(0, 0%, 100%, 0.3);
--md-footer-bg-color: hsla(0, 0%, 0%, 0.87);
--md-footer-bg-color--dark: hsla(0, 0%, 0%, 0.32);
}
// Footer color shades
--md-footer-fg-color: hsla(0, 0%, 100%, 1);
--md-footer-fg-color--light: hsla(0, 0%, 100%, 0.7);
--md-footer-fg-color--lighter: hsla(0, 0%, 100%, 0.3);
--md-footer-bg-color: hsla(0, 0%, 0%, 0.87);
--md-footer-bg-color--dark: hsla(0, 0%, 0%, 0.32);
// Shadow depth 1
--md-shadow-z1:
@ -120,3 +116,10 @@
0 #{px2rem(4px)} #{px2rem(10px)} hsla(0, 0%, 0%, 0.2),
0 0 #{px2rem(1px)} hsla(0, 0%, 0%, 0.35);
}
// ----------------------------------------------------------------------------
// Allow to explicitly use color schemes in nested content
[data-md-color-scheme="default"] {
@extend :root;
}

View File

@ -152,6 +152,7 @@ $admonitions: (
// Rules: flavours
// ----------------------------------------------------------------------------
// Define admonition flavors
@each $names, $props in $admonitions {
$name: list.nth($names, 1);
$tint: list.nth($props, 2);

View File

@ -24,6 +24,14 @@
// Rules
// ----------------------------------------------------------------------------
// Tabbed variables
:root {
--md-tabbed-icon--prev: svg-load("material/chevron-left.svg");
--md-tabbed-icon--next: svg-load("material/chevron-right.svg");
}
// ----------------------------------------------------------------------------
// Scoped in typesetted content to match specificity of regular content
.md-typeset {
@ -139,6 +147,7 @@
transition:
background-color 250ms,
color 250ms;
scroll-margin-inline-start: px2rem(20px);
// [print]: Intersperse labels with containers
@media print {
@ -239,6 +248,85 @@
margin: 0;
}
}
// Tabbed button
.tabbed-button {
display: block;
align-self: center;
width: px2rem(18px);
height: px2rem(18px);
margin-top: px2rem(2px);
color: var(--md-default-fg-color--light);
border-radius: 100%;
cursor: pointer;
transition: background-color 250ms;
pointer-events: initial;
// Tabbed button on hover
&:hover {
color: var(--md-accent-fg-color);
background-color: var(--md-accent-fg-color--transparent);
}
// Tabbed button icon
&::after {
display: block;
width: 100%;
height: 100%;
background-color: currentcolor;
transition:
background-color 250ms,
transform 250ms;
mask-image: var(--md-tabbed-icon--prev);
mask-repeat: no-repeat;
mask-size: contain;
content: "";
}
}
// Tabbed control
.tabbed-control {
position: absolute;
display: flex;
justify-content: start;
width: px2rem(24px);
height: px2rem(38px);
background:
linear-gradient(
to right,
var(--md-default-bg-color) 60%,
transparent
);
transition: opacity 125ms;
pointer-events: none;
// Adjust for right-to-left languages
[dir="rtl"] & {
transform: rotate(180deg);
}
// Tabbed control is hidden
&[hidden] {
opacity: 0;
}
// Tabbed control next
&--next {
right: 0;
justify-content: end;
background:
linear-gradient(
to left,
var(--md-default-bg-color) 60%,
transparent
);
// Tabbed button icon content
.tabbed-button::after {
mask-image: var(--md-tabbed-icon--next);
}
}
}
}
// ----------------------------------------------------------------------------
@ -261,6 +349,20 @@
padding-inline-end: px2rem(16px);
content: "";
}
// Tabbed control previous
~ .tabbed-control--prev {
width: px2rem(40px);
margin-inline-start: px2rem(-16px);
padding-inline-start: px2rem(16px);
}
// Tabbed control next
~ .tabbed-control--next {
width: px2rem(40px);
margin-inline-end: px2rem(-16px);
padding-inline-end: px2rem(16px);
}
}
}

View File

@ -25,7 +25,7 @@
// ----------------------------------------------------------------------------
// All definitions
:root > * {
:root {
--md-mermaid-font-family: var(--md-text-font-family), sans-serif;
// Colors

View File

@ -66,7 +66,7 @@ body {
}
// Body in locked state
&[data-md-state="lock"] {
&[data-md-scrolllock] {
// [tablet portrait -]: Omit scroll bubbling
@include break-to-device(tablet portrait) {

View File

@ -47,8 +47,8 @@
display: none;
}
// Dialog in open state
&[data-md-state="open"] {
// Active dialog
&--active {
transform: translateY(0);
opacity: 1;
transition:

View File

@ -36,10 +36,14 @@
// Footer wrapper
&__inner {
display: flex;
justify-content: space-between;
padding: px2rem(4px);
overflow: auto;
// Footer is visible
&:not([hidden]) {
display: flex;
}
}
// Footer link to previous and next page
@ -99,6 +103,7 @@
padding: 0 px2rem(20px);
font-size: px2rem(18px);
line-height: px2rem(48px);
white-space: nowrap;
}
// Footer link button

View File

@ -45,7 +45,7 @@
}
// Header in shadow state, i.e. shadow is visible
&[data-md-state="shadow"] {
&--shadow {
box-shadow:
0 0 px2rem(4px) rgba(0, 0, 0, 0.1),
0 px2rem(4px) px2rem(8px) rgba(0, 0, 0, 0.2);
@ -55,7 +55,7 @@
}
// Header in hidden state, i.e. moved out of sight
&[data-md-state="hidden"] {
&--hidden {
transform: translateY(-100%);
transition:
transform 250ms cubic-bezier(0.8, 0, 0.6, 1),
@ -150,6 +150,7 @@
position: absolute;
display: flex;
max-width: 100%;
white-space: nowrap;
transition:
transform 400ms cubic-bezier(0.1, 0.7, 0.1, 1),
opacity 150ms;
@ -186,7 +187,7 @@
line-height: px2rem(48px);
// Header title in active state, i.e. page title is visible
&[data-md-state="active"] .md-header__topic {
&--active .md-header__topic {
z-index: -1;
transform: translateX(px2rem(-25px));
opacity: 0;

View File

@ -101,8 +101,8 @@
transition: color 125ms;
scroll-snap-align: start;
// Navigation link in blurred state
&[data-md-state="blur"] {
// Navigation link that was passed
&--passed {
color: var(--md-default-fg-color--light);
}

View File

@ -529,6 +529,8 @@
margin: 0;
padding: 0;
list-style: none;
// Hack: omit accidental text selection on fast toggle of more button
user-select: none;
}
// Search result item

View File

@ -122,7 +122,7 @@
opacity: 0.75;
// Show after the data was loaded
[data-md-state="done"] & {
.md-source__repository--active & {
animation: facts 250ms ease-in;
}
}
@ -132,7 +132,7 @@
display: inline-block;
// Show after the data was loaded
[data-md-state="done"] & {
.md-source__repository--active & {
animation: fact 400ms ease-out;
}

View File

@ -29,6 +29,7 @@
width: 100%;
overflow: auto;
color: var(--md-primary-bg-color);
line-height: 1.3;
background-color: var(--md-primary-fg-color);
// [print]: Hide tabs
@ -41,8 +42,8 @@
display: none;
}
// Tabs in hidden state, i.e. when scrolling down
&[data-md-state="hidden"] {
// Navigation tabs are hidden
&--hidden {
pointer-events: none;
}
@ -94,7 +95,7 @@
// Hide tabs upon scrolling - disable transition to minimizes repaints
// while scrolling down, while scrolling up seems to be okay
.md-tabs[data-md-state="hidden"] & {
.md-tabs.md-tabs--hidden & {
transform: translateY(50%);
opacity: 0;
transition:

View File

@ -61,12 +61,10 @@
clamp(
var(--md-tooltip-0, #{px2rem(0px)}) + #{px2rem(16px)},
var(--md-tooltip-x),
(
100vw +
var(--md-tooltip-0, #{px2rem(0px)}) + #{px2rem(16px)} -
var(--md-tooltip-width) -
2 * #{px2rem(16px)}
)
100vw +
var(--md-tooltip-0, #{px2rem(0px)}) + #{px2rem(16px)} -
var(--md-tooltip-width) -
2 * #{px2rem(16px)}
);
// Hack: set an explicit `z-index` so we can transition it to ensure that any
// following elements are not overlaying the tooltip during the transition.

View File

@ -54,8 +54,8 @@
transform: translate(50%, 0);
}
// Back-to-top button in hidden state
&[data-md-state="hidden"] {
// Back-to-top button is hidden
&--hidden {
transform: translate(-50%, px2rem(4px));
opacity: 0;
transition-duration: 0ms;

View File

@ -35,6 +35,6 @@
@import "config";
@import "palette/scheme";
@import "palette/accent";
@import "palette/primary";
@import "palette/scheme";

View File

@ -24,6 +24,7 @@
// Rules
// ----------------------------------------------------------------------------
// Define accent colors
@each $name, $color in (
"red": $clr-red-a400,
"pink": $clr-pink-a400,

View File

@ -26,6 +26,7 @@
// Rules
// ----------------------------------------------------------------------------
// Define primary colors
@each $name, $colors in (
"red": $clr-red-400 $clr-red-300 $clr-red-600,
"pink": $clr-pink-500 $clr-pink-400 $clr-pink-700,
@ -62,6 +63,26 @@
--md-primary-bg-color: hsla(0, 0%, 100%, 1);
--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7);
}
// Typeset color shades
@if index("grey" "blue-grey", $name) {
--md-typeset-a-color: hsl(#{hex2hsl($clr-indigo-500)});
}
}
}
// ----------------------------------------------------------------------------
// Adjust link colors for light primary colors
@each $name, $color in (
"light-green": hsl(88, 58%, 43%),
"lime": hsl(66, 88%, 32%),
"yellow": hsl(54, 100%, 36%),
"amber": hsl(45, 100%, 41%),
"orange": hsl(36, 100%, 45%)
) {
[data-md-color-primary="#{$name}"]:not([data-md-color-scheme="slate"]) {
--md-typeset-a-color: #{$color};
}
}
@ -69,7 +90,7 @@
// Rules: white
// ----------------------------------------------------------------------------
// Color palette
// Define primary colors for white
[data-md-color-primary="white"] {
--md-primary-fg-color: hsla(0, 0%, 100%, 1);
--md-primary-fg-color--light: hsla(0, 0%, 100%, 0.7);
@ -77,8 +98,8 @@
--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);
--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54);
// Typeset color shades
--md-typeset-a-color: hsla(#{hex2hsl($clr-indigo-500)}, 1);
// Typeset `a` color shades
--md-typeset-a-color: hsl(#{hex2hsl($clr-indigo-500)});
// [tablet portrait +]: Header-embedded search
@include break-from-device(tablet landscape) {
@ -113,7 +134,7 @@
// Rules: black
// ----------------------------------------------------------------------------
// Color palette
// Define primary colors for black
[data-md-color-primary="black"] {
--md-primary-fg-color: hsla(0, 0%, 0%, 1);
--md-primary-fg-color--light: hsla(0, 0%, 0%, 0.54);
@ -121,8 +142,8 @@
--md-primary-bg-color: hsla(0, 0%, 100%, 1);
--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7);
// Text color shades
--md-typeset-a-color: hsla(#{hex2hsl($clr-indigo-500)}, 1);
// Typeset `a` color shades
--md-typeset-a-color: hsl(#{hex2hsl($clr-indigo-500)});
// Header
.md-header {

View File

@ -82,19 +82,27 @@
--md-typeset-table-color: hsla(var(--md-hue), 75%, 95%, 0.12);
// Admonition color shades
--md-admonition-bg-color: hsla(var(--md-hue), 0%, 100%, 0.025);
--md-admonition-fg-color: var(--md-default-fg-color);
--md-admonition-bg-color: var(--md-default-bg-color);
// Footer color shades
--md-footer-bg-color: hsla(var(--md-hue), 15%, 12%, 0.87);
--md-footer-bg-color--dark: hsla(var(--md-hue), 15%, 10%, 1);
// Black and white primary colors
&[data-md-color-primary="black"],
&[data-md-color-primary="white"] {
// Shadow depth 1
--md-shadow-z1:
0 #{px2rem(4px)} #{px2rem(10px)} hsla(0, 0%, 0%, 0.2),
0 0 #{px2rem(1px)} hsla(0, 0%, 0%, 0.1);
// Typeset color shades
--md-typeset-a-color: hsla(#{hex2hsl($clr-indigo-400)}, 1);
}
// Shadow depth 2
--md-shadow-z2:
0 #{px2rem(4px)} #{px2rem(10px)} hsla(0, 0%, 0%, 0.3),
0 0 #{px2rem(1px)} hsla(0, 0%, 0%, 0.25);
// Shadow depth 3
--md-shadow-z3:
0 #{px2rem(4px)} #{px2rem(10px)} hsla(0, 0%, 0%, 0.4),
0 0 #{px2rem(1px)} hsla(0, 0%, 0%, 0.35);
// Hide images for light mode
img[src$="#only-light"],
@ -109,6 +117,32 @@
}
}
// --------------------------------------------------------------------------
// Adjust link colors for dark primary colors
@each $name, $color in (
"pink": hsl(340, 81%, 63%),
"purple": hsl(291, 43%, 63%),
"deep-purple": hsl(262, 63%, 70%),
"indigo": hsl(219, 56%, 63%),
"teal": hsl(174, 100%, 40%),
"green": hsl(122, 39%, 60%),
"deep-orange": hsl(14, 100%, 73%),
"brown": hsl(16, 45%, 60%),
// Set neutral colors to indigo
"grey": hsl(219, 56%, 63%),
"blue-grey": hsl(219, 56%, 63%),
"white": hsl(219, 56%, 63%),
"black": hsl(219, 56%, 63%)
) {
[data-md-color-scheme="slate"][data-md-color-primary="#{$name}"] {
--md-typeset-a-color: #{$color};
}
}
// --------------------------------------------------------------------------
// Switching in progress - disable all transitions temporarily
[data-md-color-switching] *,
[data-md-color-switching] *::before,

View File

@ -92,6 +92,9 @@
<meta name="theme-color" content="{{ primary }}" />
{% endif %}
{% endif %}
<!-- Custom icons -->
{% include "partials/icons.html" %}
{% endblock %}
<!-- JavaScript libraries -->
@ -157,8 +160,6 @@
{% else %}
<body dir="{{ direction }}">
{% endif %}
<!-- Retrieve features from configuration -->
{% set features = config.theme.features or [] %}
<!-- User preference: color palette -->
@ -247,10 +248,10 @@
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<!-- Navigation -->
<!-- Sidebars -->
{% block site_nav %}
<!-- Main navigation -->
<!-- Navigation -->
{% if nav %}
{% if page and page.meta and page.meta.hide %}
{% set hidden = "hidden" if "navigation" in page.meta.hide %}
@ -296,6 +297,9 @@
{% include "partials/content.html" %}
{% endblock %}
</article>
<!-- User preference: content -->
{% include "partials/javascripts/content.html" %}
</div>
</div>
@ -303,9 +307,8 @@
{% if "navigation.top" in features %}
<a
href="#"
class="md-top md-icon"
class="md-top md-top--hidden md-icon"
data-md-component="top"
data-md-state="hidden"
>
{% include ".icons/material/arrow-up.svg" %}
{{ lang.t('top.title') }}

View File

@ -25,9 +25,11 @@
<!-- Link to previous and/or next page -->
{% if page.previous_page or page.next_page %}
{% set hidden = "hidden" if "footer" in page.meta.hide %}
<nav
class="md-footer__inner md-grid"
aria-label="{{ lang.t('footer.title') }}"
{{ hidden }}
>
<!-- Link to previous page -->

37
src/partials/icons.html Normal file
View File

@ -0,0 +1,37 @@
<!--
Copyright (c) 2016-2022 Martin Donath <martin.donath@squidfunk.com>
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.
-->
<!-- Custom admonition icons -->
{% if config.theme.icon.admonition %}
{% set style = ["\x3cstyle\x3e:root{"] %}
{% for type, icon in config.theme.icon.admonition.items() %}
{% import ".icons/" ~ icon ~ ".svg" as icon %}
{% set _ = style.append(
"--md-admonition-icon--" ~ type ~ ":" ~
"url('data:image/svg+xml;charset=utf-8," ~
icon | replace("\n", "") ~
"');"
) %}
{% endfor %}
{% set _ = style.append("}\x3c/style\x3e") %}
{{ style | join }}
{% endif %}

View File

@ -0,0 +1,39 @@
<!--
Copyright (c) 2016-2022 Martin Donath <martin.donath@squidfunk.com>
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.
-->
<!-- User-preference: link content tabs -->
{% if "content.tabs.link" in features %}
<script>
var tabs = __md_get("__tabs")
if (Array.isArray(tabs))
main: for (var set of document.querySelectorAll(".tabbed-set")) {
var labels = set.querySelector(".tabbed-labels")
for (var tab of tabs)
for (var label of labels.getElementsByTagName("label"))
if (label.innerText.trim() === tab) {
var input = document.getElementById(label.htmlFor)
input.checked = true
continue main
}
}
</script>
{% endif %}

View File

@ -23,7 +23,6 @@
<!-- Translations: Greek -->
{% macro t(key) %}{{ {
"language": "el",
"direction": "ltr",
"clipboard.copy": "Αντιγραφή στο πρόχειρο",
"clipboard.copied": "Αντιγράφηκε στο πρόχειρο",
"edit.link.title": "Επεξεργασία αυτής της σελίδας",

View File

@ -23,7 +23,6 @@
<!-- Translations: Italian -->
{% macro t(key) %}{{ {
"language": "it",
"direction": "ltr",
"clipboard.copy": "Copia",
"clipboard.copied": "Copiato",
"edit.link.title": "Modifica",

View File

@ -23,7 +23,6 @@
<!-- Translations: Portuguese (Brasilian) -->
{% macro t(key) %}{{ {
"language": "pt",
"direction": "ltr",
"clipboard.copy": "Copiar para área de Transferência",
"clipboard.copied": "Copiado para área de Transferência",
"edit.link.title": "Editar esta página",

View File

@ -23,7 +23,6 @@
<!-- Translations: Chinese (Simplified) -->
{% macro t(key) %}{{ {
"language": "zh",
"direction": "ltr",
"clipboard.copy": "复制",
"clipboard.copied": "已复制",
"edit.link.title": "编辑此页",

View File

@ -46,9 +46,8 @@
{% set checked = "checked" if nav_item.active %}
{% if "navigation.expand" in features and not checked %}
<input
class="md-nav__toggle md-toggle"
class="md-nav__toggle md-toggle md-toggle--indeterminate"
data-md-toggle="{{ path }}"
data-md-state="indeterminate"
type="checkbox"
id="{{ path }}"
checked

View File

@ -26,7 +26,7 @@
{{ toc_item.title }}
</a>
<!-- Render nested item list -->
<!-- Table of contents list -->
{% if toc_item.children %}
<nav class="md-nav" aria-label="{{ toc_item.title }}">
<ul class="md-nav__list">

View File

@ -41,7 +41,7 @@
{% set toc = first.children %}
{% endif %}
<!-- Render item list -->
<!-- Table of contents title and list -->
{% if toc %}
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>

View File

@ -47,3 +47,9 @@ class SearchIndex(BaseIndex):
# Add document tags
if "tags" in page.meta:
entry["tags"] = page.meta["tags"]
# Add document boost for search
if "search" in page.meta:
search = page.meta["search"]
if "boost" in search:
entry["boost"] = search["boost"]

View File

@ -27,7 +27,6 @@ from markdown.extensions.toc import slugify
from mkdocs import utils
from mkdocs.commands.build import DuplicateFilter
from mkdocs.config.config_options import Type
from mkdocs.exceptions import ConfigurationError
from mkdocs.plugins import BasePlugin
# -----------------------------------------------------------------------------