Merge branch 'master' into feature/scrollable-content-tabs

This commit is contained in:
squidfunk 2021-09-26 11:29:17 +02:00
commit 3aa55dc732
539 changed files with 2374 additions and 737 deletions

BIN
.github/assets/sponsors/hummingbot.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -52,7 +52,7 @@ jobs:
run: npm install
- name: Check project
run: npm run lint
run: npm run check
- name: Build project
run: |

View File

@ -46,7 +46,8 @@ jobs:
pip install .
pip install \
mkdocs-minify-plugin>=0.3 \
mkdocs-redirects>=1.0
mkdocs-redirects>=1.0 \
mkdocs-rss-plugin>=0.17
- name: Install Insiders build
if: github.event.repository.fork == false

View File

@ -1,3 +1,67 @@
mkdocs-material-7.3.0 (2021-09-23)
* Added support for sticky navigation tabs
* Added support for section index pages
* Added support for removing generator notice
mkdocs-material-7.2.8 (2021-09-20)
* Fixed #3039: Search modal overlays menu on mobile (7.2.7 regression)
mkdocs-material-7.2.7+insiders-3.0.1 (2021-09-19)
* Added support for using literal h1-6 tags for search plugin
* Fixed search plugin breaking on void elements without slashes
* Fixed search plugin filtering link contents from headlines
* Fixed search plugin handling of multiple h1 headlines
* Fixed search plugin handling of missing h1 headlines
mkdocs-material-7.2.7 (2021-09-19)
* Updated Serbian and Serbo-Croatian translations
* Improved appearance of outline on details
* Fixed #2934: Scrollbar when header is hidden on some mobile browsers
* Fixed #3032: Anchor in details doesn't open on load (7.0.0 regression)
* Fixed back-to-top button being focusable when invisible
* Fixed broken admonition icons (removed in upstream)
mkdocs-material-7.2.6+insiders-3.0.0 (2021-09-13)
* Rewrite of MkDocs' search plugin
* Added support for rich search previews
* Added support for tokenizer with lookahead
* Improved search indexing performance (twice as fast)
* Improved search highlighting
mkdocs-material-7.2.6+insiders-2.13.3 (2021-09-01)
* Added support for disabling social card generation
mkdocs-material-7.2.6 (2021-09-01)
* Fixed rendering of blockquote elements (7.0.0 regression)
* Fixed #2973: Custom search worker setting ignored
mkdocs-material-7.2.5+insiders-2.13.2 (2021-08-25)
* Fixed #2965: Social plugin error when primary color is not defined
mkdocs-material-7.2.5 (2021-08-25)
* Updated Portuguese translations
* Fixed execution of RxJS teardown logic (7.2.3 regression)
* Fixed #2970: Search results show escaped characters (7.2.2 regression)
mkdocs-material-7.2.4+insiders-2.13.1 (2021-08-22)
* Fixed #2948: Social cards are not cached
* Fixed #2953: Mermaid.js diagrams can't be centered anymore
mkdocs-material-7.2.4 (2021-08-11)
* Fixed #2926: Version selector not working (7.2.3 regression)
* Fixed #2929: Missing CSS class for banner (consistency with Insiders)
mkdocs-material-7.2.3 (2021-08-09)
* Slight facelift of data tables, now closer to Material Design

View File

@ -40,33 +40,40 @@ COPY setup.py setup.py
# Perform build and cleanup artifacts and caches
RUN \
apk upgrade --update-cache -a && \
apk upgrade --update-cache -a \
&& \
apk add --no-cache \
git \
git-fast-import \
openssh \
&& apk add --no-cache --virtual .build gcc musl-dev \
&& pip install --no-cache-dir . \
&& \
if [ "${WITH_PLUGINS}" = "true" ]; then \
pip install --no-cache-dir \
"mkdocs-minify-plugin>=0.3" \
"mkdocs-redirects>=1.0"; \
fi \
&& apk del .build gcc musl-dev \
&& \
for theme in mkdocs readthedocs; do \
rm -rf ${PACKAGES}/mkdocs/themes/$theme; \
ln -s \
${PACKAGES}/material \
${PACKAGES}/mkdocs/themes/$theme; \
done \
&& rm -rf /tmp/* /root/.cache \
&& \
find ${PACKAGES} \
-type f \
-path "*/__pycache__/*" \
-exec rm -f {} \;
&& \
apk add --no-cache --virtual .build \
gcc \
musl-dev \
&& \
pip install --no-cache-dir . \
&& \
if [ "${WITH_PLUGINS}" = "true" ]; then \
pip install --no-cache-dir \
"mkdocs-minify-plugin>=0.3" \
"mkdocs-redirects>=1.0"; \
fi \
&& \
apk del .build \
&& \
for theme in mkdocs readthedocs; do \
rm -rf ${PACKAGES}/mkdocs/themes/$theme; \
ln -s \
${PACKAGES}/material \
${PACKAGES}/mkdocs/themes/$theme; \
done \
&& \
rm -rf /tmp/* /root/.cache \
&& \
find ${PACKAGES} \
-type f \
-path "*/__pycache__/*" \
-exec rm -f {} \;
# Set working directory
WORKDIR /docs

View File

@ -34,9 +34,6 @@
src="https://img.shields.io/docker/pulls/squidfunk/mkdocs-material"
alt="Docker Pulls"
/></a>
<a href="https://squidfunk.github.io/mkdocs-material/insiders/"><img
src="https://img.shields.io/static/v1?label=%E2%86%92&message=insiders&color=e91e63"
/></a>
</p>
<p align="center">
@ -53,13 +50,30 @@
<p align="center">
<em>
A demo is worth a thousand words — check it out at
Check out the demo
<a
href="https://squidfunk.github.io/mkdocs-material/"
>squidfunk.github.io/mkdocs-material</a>.
</em>
</p>
<h2></h2>
<p>&nbsp;</p>
<p id="premium-sponsors" align="center"><strong>Special thanks</strong> to our <strong>premium sponsors</strong>:</p>
<p>&nbsp;</p>
<p align="center">
<a href="https://hummingbot.io/" target=_blank><img
src="https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/hummingbot.png" height="40"
/></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://docs.baslerweb.com/" target=_blank><img
src="https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/basler.png" height="40"
/></a>&nbsp;&nbsp;
<a href="https://cirrus-ci.org/" target=_blank><img
src="https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/cirrus-ci.svg" height="40"
/></a>
</p>
<p>&nbsp;</p>
## Features
* **It's just Markdown ...** — write your technical documentation in Markdown
@ -124,24 +138,15 @@ For other installation methods, configuration options, and a demo, visit
[1]: https://squidfunk.github.io/mkdocs-material/
## Premium Sponsors
<p>
<a href="https://docs.baslerweb.com/" target=_blank><img
src="https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/basler.png" width="155"
/></a>
<a href="https://cirrus-ci.org/" target=_blank><img
src="https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/cirrus-ci.svg" width="155"
/></a>
</p>
## Trusted by ...
### ... leading companies
### ... leading organizations
[Atlassian](https://atlassian-labs.github.io/data-center-helm-charts/),
[Atlassian](https://atlassian.github.io/data-center-helm-charts/),
[AWS](https://aws.github.io/copilot-cli/),
[Binance](https://docs.binance.org/),
[Bloomberg](https://bloomberg.github.io/selekt/),
[CERN](http://abpcomputing.web.cern.ch/),
[Datadog](https://datadoghq.dev/integrations-core/),
[Google](https://google.github.io/accompanist/),
[ING](https://ing-bank.github.io/baker/),
@ -157,6 +162,7 @@ For other installation methods, configuration options, and a demo, visit
### ... and successful Open Source projects
[Arduino](https://arduino.github.io/arduino-cli/),
[AutoKeras](https://autokeras.com/),
[BFE](https://www.bfe-networks.net/),
[Crystal](https://crystal-lang.org/reference/),

View File

@ -0,0 +1,649 @@
---
template: overrides/main.html
description: >
How we rebuilt client-side search, delivering a better user experience while
making it faster and smaller at the same time
disqus: mkdocs-material
search:
exclude: true
---
# Search: better, faster, smaller
__This is the story of how we managed to completely rebuild client-side search,
delivering a significantly better user experience while making it faster and
smaller at the same time.__
<aside class="mdx-author" markdown="1">
![@squidfunk][1]
<span>__Martin Donath__ · @squidfunk</span>
<span>
:octicons-calendar-24: September 13, 2021 ·
:octicons-clock-24: 15 min read
</span>
</aside>
[1]: https://avatars.githubusercontent.com/u/932156
---
The [search][2] of Material for MkDocs is by far one of its best and most-loved
assets: [multilingual][3], [offline-capable][4], and most importantly: _all
client-side_. It provides a solution to empower the users of your documentation
to find what they're searching for instantly without the headache of managing
additional servers. However, even though several iterations have been made,
there's still some room for improvement, which is why we rebuilt the search
plugin and integration from the ground up. This article shines some light on the
internals of the new search, why it's much more powerful than the previous
version, and what's about to come.
_The next section discusses the architecture and issues of the current search
implementation. If you immediately want to learn what's new, skip to the
[section just after that][5]._
[2]: ../../setup/setting-up-site-search.md
[3]: ../../setup/setting-up-site-search.md#lang
[4]: ../../setup/setting-up-site-search.md#offline-search
[5]: #whats-new
## Architecture
Material for MkDocs uses [lunr][6] together with [lunr-languages][7] to
implement its client-side search capabilities. When a documentation page is
loaded and JavaScript is available, the search index as generated by the
[built-in search plugin][8] during the build process is requested from the
server:
``` ts
const index$ = document.forms.namedItem("search")
? __search?.index || requestJSON<SearchIndex>(
new URL("search/search_index.json", config.base)
)
: NEVER
```
[6]: https://lunrjs.com
[7]: https://github.com/MihaiValentin/lunr-languages
[8]: ../../setup/setting-up-site-search.md#built-in-search
### Search index
The search index includes a stripped-down version of all pages. Let's take a
look at an example to understand precisely what the search index contains from
the original Markdown file:
??? example "Expand to inspect example"
=== "`docs/page.md`"
```` markdown
# Example
## Text
It's very easy to make some words **bold** and other words *italic*
with Markdown. You can even add [links](#), or even `code`:
```
if (isAwesome) {
return true
}
```
## Lists
Sometimes you want numbered lists:
1. One
2. Two
3. Three
Sometimes you want bullet points:
* Start a line with a star
* Profit!
````
=== "`search_index.json`"
``` json
{
"config": {
"indexing": "full",
"lang": [
"en"
],
"min_search_length": 3,
"prebuild_index": false,
"separator": "[\\s\\-]+"
},
"docs": [
{
"location": "page/",
"title": "Example",
"text": "Example Text It's very easy to make some words bold and other words italic with Markdown. You can even add links , or even code : if (isAwesome) { return true } Lists Sometimes you want numbered lists: One Two Three Sometimes you want bullet points: Start a line with a star Profit!"
},
{
"location": "page/#example",
"title": "Example",
"text": ""
},
{
"location": "page/#text",
"title": "Text",
"text": "It's very easy to make some words bold and other words italic with Markdown. You can even add links , or even code : if (isAwesome) { return true }"
},
{
"location": "page/#lists",
"title": "Lists",
"text": "Sometimes you want numbered lists: One Two Three Sometimes you want bullet points: Start a line with a star Profit!"
}
]
}
```
If we inspect the search index, we immediately see several problems:
1. __All content is included twice__: the search index contains one entry
with the entire contents of the page, and one entry for each section of
the page, i.e., each block preceded by a headline or subheadline. This
significantly contributes to the size of the search index.
2. __All structure is lost__: when the search index is built, all structural
information like HTML tags and attributes are stripped from the content.
While this approach works well for paragraphs and inline formatting, it
might be problematic for lists and code blocks. An excerpt:
```
… links , or even code : if (isAwesome) { … } Lists Sometimes you want …
```
- __Context__: for an untrained eye, the result can look like gibberish, as
it's not immediately apparent what classifies as text and what as code.
Furthermore, it's not clear that `Lists` is a headline as it's merged
with the code block before and the paragraph after it.
- __Punctuation__: inline elements like links that are immediately followed
by punctuation are separated by whitespace (see `,` and `:` in the
excerpt). This is because all extracted text is joined with a whitespace
character during the construction of the search index.
It's not difficult to see that it can be quite challenging to implement a good
search experience for theme authors, which is why Material for MkDocs (up to
now) did some [monkey patching][9] to be able to render slightly more
meaningful search previews.
### Search worker
The actual search functionality is implemented as part of a web worker[^1],
which creates and manages the [lunr][6] search index. When search is
initialized, the following steps are taken:
[^1]:
Prior to [version 5.0][10], search was carried out in the main thread which
locked up the browser, rendering it unusable. This problem was first
reported in #904 and, after some back and forth, fixed and released in
version 5.0.
1. __Linking sections with pages__: The search index is parsed, and each section
is linked to its parent page. The parent page itself is _not indexed_, as it
would lead to duplicate results, so only the sections remain. Linking is
necessary, as search results are grouped by page.
2. __Tokenization__: The `title` and `text` values of each section are split
into tokens by using the [separator][11] as configured in `mkdocs.yml`.
Tokenization itself is carried out by [lunr's default tokenizer][12], which
doesn't allow for lookahead or separators spanning multiple characters.
> Why is this important and a big deal? We will see later how much more we
> can achieve with a tokenizer that is capable of separating strings with
> lookahead.
3. __Indexing__: As a final step, each section is indexed. When querying the
index, if a search query includes one of the tokens as returned by step 2.,
the section is considered to be part of the search result and passed to the
main thread.
Now, that's basically how the search worker operates. Sure, there's a little
more magic involved, e.g., search results are [post-processed][13] and
[rescored][14] to account for some shortcomings of [lunr][6], but in general,
this is how data gets into and out of the index.
[9]: https://github.com/squidfunk/mkdocs-material/blob/ec7ccd2b2d15dd033740f388912f7be7738feec2/src/assets/javascripts/integrations/search/document/index.ts#L68-L71
[10]: https://squidfunk.github.io/mkdocs-material/upgrading/#upgrading-from-4x-to-5x
[11]: ../../setup/setting-up-site-search.md#separator
[12]: https://github.com/olivernn/lunr.js/blob/aa5a878f62a6bba1e8e5b95714899e17e8150b38/lunr.js#L413-L456
[13]: https://github.com/squidfunk/mkdocs-material/blob/ec7ccd2b2d15dd033740f388912f7be7738feec2/src/assets/javascripts/integrations/search/_/index.ts#L249-L272
[14]: https://github.com/squidfunk/mkdocs-material/blob/ec7ccd2b2d15dd033740f388912f7be7738feec2/src/assets/javascripts/integrations/search/_/index.ts#L274-L275
### Search previews
Users should be able to quickly scan and evaluate the relevance of a search
result in the given context, which is why a concise summary with highlighted
occurrences of the search terms found is an essential part of a great search
experience.
This is where the current search preview generation falls short, as some of the
search previews appear not to include any occurrence of any of the search
terms. This was due to the fact that search previews were [truncated after a
maximum of 320 characters][15], as can be seen here:
<figure markdown="1">
![Search previews][16]
<figcaption markdown="1">
The first two results look like they're not relevant, as they don't seem to
include the query string the user just searched for. Yet, they are.
</figcaption>
</figure>
A better solution to this problem has been on the roadmap for a very, very long
time, but in order to solve this once and for all, several factors need to be
carefully considered:
1. __Word boundaries__: some themes[^2] for static site generators generate
search previews by expanding the text left and right next to an occurrence,
stopping at a whitespace character when enough words have been consumed. A
preview might look like this:
```
… channels, e.g., or which can be configured via mkdocs.yml …
```
While this may work for languages that use whitespace as a separator
between words, it breaks down for languages like Japanese or Chinese[^3],
as they have non-whitespace word boundaries and use dedicated segmenters to
split strings into tokens.
[^2]:
At the time of writing, [Just the Docs][17] and [Docusaurus][18] use this
method for generating search previews. Note that the latter also integrates
with Algolia, which is a fully managed server-based solution.
[^3]:
China and Japan are both within the top 5 countries of origin of users of
Material for MkDocs.
[15]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/javascripts/templates/search/index.tsx#L90
[16]: search-better-faster-smaller/search-preview.png
[17]: https://pmarsceill.github.io/just-the-docs/
[18]: https://github.com/lelouch77/docusaurus-lunr-search
2. __Context-awareness__: Although whitespace doesn't work for all languages,
one could argue that it could be a good enough solution. Unfortunately, this
is not necessarily true for code blocks, as the removal of whitespace might
change meaning in some languages.
3. __Structure__: Preserving structural information is not a must, but
apparently beneficial to build more meaningful search previews which allow
for a quick evaluation of relevance. If a word occurrence is part of a code
block, it should be rendered as a code block.
## What's new?
After we built a solid understanding of the problem space and before we dive
into the internals of our new search implementation to see which of the
problems it already solves, a quick overview of what features and improvements
it brings:
- __Better__: support for [rich search previews][19], preserving the structural
information of code blocks, inline code, and lists, so they are rendered
as-is, as well as [lookahead tokenization][20],
[more accurate highlighting][21], and improved stability of typeahead. Also,
a [slightly better UX][22].
- __Faster__ and __smaller__: significant decrease in search index size of up
to 48% due to improved extraction and construction techniques, resulting in a
search experience that is up to 95% faster, which is particularly helpful for
large documentation projects.
_Note that our new search implementation is currently 'Insiders only', which
means that it is reserved for sponsors because it's those sponsors that make
features like this possible._
[:octicons-heart-fill-24:{ .mdx-heart } &nbsp; I want to become a sponsor](../../insiders/index.md){ .md-button .md-button--primary }
[19]: #rich-search-previews
[20]: #tokenizer-lookahead
[21]: #accurate-highlighting
[22]: #user-interface
### Rich search previews
As we rebuilt the search plugin from scratch, we reworked the construction of
the search index to preserve the structural information of code blocks, inline
code, as well as unordered and ordered lists. Using the example from the
[search index][23] section, here's how it looks:
=== "Now"
![Search preview now][24]
=== "Before"
![Search preview before][25]
Now, __code blocks are first-class citizens of search previews__, and even
inline code formatting is preserved. Let's take a look at the new structure of
the search index to understand why:
??? example "Expand to inspect search index"
=== "Now"
``` json
{
...
"docs": [
{
"location": "page/",
"title": "Example",
"text": ""
},
{
"location": "page/#text",
"title": "Text",
"text": "<p>It's very easy to make some words bold and other words italic with Markdown. You can even add links, or even <code>code</code>:</p> <pre><code>if (isAwesome){\n return true\n}\n</code></pre>"
},
{
"location": "page/#lists",
"title": "Lists",
"text": "<p>Sometimes you want numbered lists:</p> <ol> <li>One</li> <li>Two</li> <li>Three</li> </ol> <p>Sometimes you want bullet points:</p> <ul> <li>Start a line with a star</li> <li>Profit!</li> </ul>"
}
]
}
```
=== "Before"
``` json
{
...
"docs": [
{
"location": "page/",
"title": "Example",
"text": "Example Text It's very easy to make some words bold and other words italic with Markdown. You can even add links , or even code : if (isAwesome) { return true } Lists Sometimes you want numbered lists: One Two Three Sometimes you want bullet points: Start a line with a star Profit!"
},
{
"location": "page/#example",
"title": "Example",
"text": ""
},
{
"location": "page/#text",
"title": "Text",
"text": "It's very easy to make some words bold and other words italic with Markdown. You can even add links , or even code : if (isAwesome) { return true }"
},
{
"location": "page/#lists",
"title": "Lists",
"text": "Sometimes you want numbered lists: One Two Three Sometimes you want bullet points: Start a line with a star Profit!"
}
]
}
```
If we inspect the search index again, we can see how the situation improved:
1. __Content is included only once__: the search index does not include the
content of the page twice, as only the sections of a page are part of the
search index. This leads to a significant reduction in size, fewer bytes to
transfer, and a smaller search index.
2. __Some structure is preserved__: each section of the search index includes a
small subset of HTML to provide the necessary structure to allow for more
sophisticated search previews. Revisiting our example from before, let's
look at an excerpt:
=== "Now"
``` html
… links, or even <code>code</code>:</p> <pre><code>if (isAwesome){ … }\n</code></pre>
```
=== "Before"
```
… links , or even code : if (isAwesome) { … }
```
The punctuation issue is gone, as no additional whitespace is inserted, and
the preserved markup yields additional context to make scanning search
results more effective.
On to the next step in the process: __tokenization__.
[23]: #search-index
[24]: search-better-faster-smaller/search-preview-now.png
[25]: search-better-faster-smaller/search-preview-before.png
### Tokenizer lookahead
The [default tokenizer][12] of [lunr][6] uses a regular expression to split a
given string by matching each character against the [separator][11] as defined
in `mkdocs.yml`. This doesn't allow for more complex separators based on
lookahead or multiple characters.
Fortunately, __our new search implementation provides an advanced tokenizer__
that doesn't have these shortcomings and supports more complex regular
expressions. As a result, Material for MkDocs just changed its own separator
configuration to the following value:
```
[\s\-,:!=\[\]()"/]+|(?!\b)(?=[A-Z][a-z])|\.(?!\d)|&[lg]t;
```
While the first part up to the first `|` contains a list of single control
characters at which the string should be split, the following three sections
explain the remainder of the regular expression.[^4]
[^4]:
As a fun fact: the [separator default value][26] of the search plugin being
`[\s\-]+` always has been kind of irritating, as it suggests that multiple
characters can be considered being a separator. However, the `+` is
completely irrelevant, as regular expression groups involving multiple
characters were never supported by [lunr's default tokenizer][12].
[26]: https://www.mkdocs.org/user-guide/configuration/#separator
#### Case changes
Many programming languages use `PascalCase` or `camelCase` naming conventions.
When a user searches for the term `case`, it's quite natural to expect for
`PascalCase` and `camelCase` to show up. By adding the following match group to
the separator, this can now be achieved with ease:
```
(?!\b)(?=[A-Z][a-z])
```
This regular expression is a combination of a negative lookahead (`\b`, i.e.,
not a word boundary) and a positive lookahead (`[A-Z][a-z]`, i.e., an uppercase
character followed by a lowercase character), and has the following behavior:
- `PascalCase` :octicons-arrow-right-24: `Pascal`, `Case`
- `camelCase` :octicons-arrow-right-24: `camel`, `Case`
- `UPPERCASE` :octicons-arrow-right-24: `UPPERCASE`
Searching for [:octicons-search-24: searchHighlight][27] now brings up the
section discussing the `search.highlight` feature flag, which also demonstrates
that this even works for search queries now![^5]
[^5]:
Previously, the search query was not correctly tokenized due to the way
[lunr][6] treats wildcards, as it disables the pipeline for search terms
that contain wildcards. In order to provide a good typeahead experience,
Material for MkDocs adds wildcards to the end of each search term not
explicitly preceded with `+` or `-`, effectively disabling tokenization.
[27]: ?q=searchHighlight
#### Version numbers
Indexing version numbers is another problem that can be solved with a small
lookahead. Usually, `.` should be considered a separator to split words like
`search.highlight`. However, splitting version numbers at `.` will make them
undiscoverable. Thus, the following expression:
```
\.(?!\d)
```
This regular expression matches a `.` only if not immediately followed by a
digit `\d`, which leaves version numbers discoverable. Searching for
[:octicons-search-24: 7.2.6][28] brings up the [7.2.6][29] release notes.
[28]: ?q=7.2.6
[29]: ../../changelog.md#726-_-september-1-2021
#### HTML/XML tags
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;`. Now, adding the
following expression to the separator allows for just that:
```
&[lg]t;
```
Searching for [:octicons-search-24: custom search worker script][30] brings up
the section on [custom search][31] and matches the `script` tag among the other
search terms discovered.
---
_We've only just begun to scratch the surface of the new possibilities
tokenizer lookahead brings. If you found other useful expressions, you're
invited to share them in the comment section._
[30]: ?q=custom+search+worker+script
[31]: ../../setup/setting-up-site-search.md#custom-search
### Accurate highlighting
Highlighting is the last step in the process of search and involves the
highlighting of all search term occurrences in a given search result. For a
long time, highlighting was implemented through dynamically generated
[regular expressions][32].[^6]
This approach has some problems with non-whitespace languages like Japanese or
Chinese[^3] since it only works if the highlighted term is at a word boundary.
However, Asian languages are tokenized using a [dedicated segmenter][33], which
cannot be modeled with regular expressions.
[^6]:
Using the separator as defined in `mkdocs.yml`, a regular expression was
constructed that was trying to mimic the tokenizer. As an example, the
search query `search highlight` was transformed into the rather cumbersome
regular expression `(^|<separator>)(search|highlight)`, which only matches
at word boundaries.
Now, as a direct result of the [new tokenization approach][34], __our new
search implementation uses token positions for highlighting__, making it
exactly as powerful as tokenization:
1. __Word boundaries__: as the new highlighter uses token positions, word
boundaries are equal to token boundaries. This means that more complex cases
of tokenization (e.g., [case changes][35], [version numbers][36], [HTML/XML
tags][37]), are now all highlighted accurately.
2. __Context-awareness__: as the new search index preserves some of the
structural information of the original document, the content of a section is
now divided into separate content blocks paragraphs, code blocks, and
lists.
Now, only the content blocks that actually contain occurrences of one of
the search terms are considered for inclusion into the search preview. If a
term only occurs in a code block, it's the code block that gets rendered,
see, for example, the results of [:octicons-search-24: twitter][38].
[32]: https://github.com/squidfunk/mkdocs-material/blob/ec7ccd2b2d15dd033740f388912f7be7738feec2/src/assets/javascripts/integrations/search/highlighter/index.ts#L61-L91
[33]: http://chasen.org/~taku/software/TinySegmenter/
[34]: #tokenizer-lookahead
[35]: #case-changes
[36]: #version-numbers
[37]: #htmlxml-tags
[38]: ?q=twitter
### Benchmarks
We conducted two benchmarks one with the documentation of Material for MkDocs
itself, and one with a very massive corpus of Markdown files with more than
800,000 words a size most documentation projects will likely never
reach:
<figure markdown="1">
| | Before | Now | Relative |
| ----------------------- | -------: | -------------: | -----------: |
| __Material for MkDocs__ | | | |
| Index size | 573 kB | __335 kB__ | __42%__ |
| Index size (`gzip`) | 105 kB | __78 kB__ | __27%__ |
| Indexing time[^7] | 265 ms | __177 ms__ | __34%__ |
| __KJV Markdown[^8]__ | | | |
| Index size | 8.2 MB | __4.4 MB__ | __47%__ |
| Index size (`gzip`) | 2.3 MB | __1.2 MB__ | __48%__ |
| Indexing time | 2,700 ms | __1,390 ms__ | __48%__ |
<figcaption>
<p>Benchmark results</p>
</figcaption>
</figure>
[^7]:
Smallest value of ten distinct runs.
[^8]:
We agnostically use [KJV Markdown][39] as a tool for testing to learn how
Material for MkDocs behaves on large corpora, as it's a very large set of
Markdown files with over 800k words.
The results show that indexing time, which is the time that it takes to set up
the search when the page is loaded, has dropped by up to 48%, which means __the
new search is up to 95% faster__. This is a significant improvement,
particularly relevant for large documentation projects.
While 1,3s still may sound like a long time, using the new client-side search
together with [instant loading][40] only creates the search index on the initial
page load. When navigating, the search index is preserved across pages, so the
cost does only have to be paid once.
[39]: https://github.com/arleym/kjv-markdown
[40]: ../../setup/setting-up-navigation.md#instant-loading
### User interface
Additionally, some small improvements have been made, most prominently the
__more results on this page__ button, which now sticks to the top of the search
result list when open. This enables the user to jump out of the list more
quickly.
## What's next?
Our new search implementation is a big improvement to Material for MkDocs. It
solves some long-standing issues which needed to be tackled for years. Yet,
it's only the start of a search experience that is going to get better and
better. Next up:
- __Context-aware search summarization__: currently, the first two matching
content blocks are rendered as a search preview. With the new tokenization
technique, we laid the groundwork for more sophisticated shortening and
summarization methods, which we're tackling next.
- __User interface improvements__: as we now gained full control over the
search plugin, we can now add meaningful metadata to provide more context and
a better experience. We'll explore some of those paths in the future.
If you've made it this far, thank you for your time and interest in Material
for MkDocs! This is the first blog article that I decided to write after a
short [Twitter survey][41] made me to. You're invited to [leave a comment][42]
to share your experiences with the new search implementation.
[41]: https://twitter.com/squidfunk/status/1434477478823743488
[42]: #__comments

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

27
docs/blog/index.md Normal file
View File

@ -0,0 +1,27 @@
---
template: overrides/main.html
search:
exclude: true
---
# Blog
<h2>Search: better, faster, smaller</h2>
__This is the story of how we managed to completely rebuild client-side search,
delivering a significantly better user experience while making it faster and
smaller at the same time.__
The search of Material for MkDocs is by far one of its best and most-loved
assets: multilingual, offline-capable, and most importantly: _all client-side_.
It provides a solution to empower the users of your documentation to find what
they're searching for instantly without the headache of managing additional
servers. However, even though several iterations have been made, there's still
some room for improvement, which is why we rebuilt the search plugin and
integration from the ground up. This article shines some light on the internals
of the new search, why it's much more powerful than the previous version, and
what's about to come.
[Continue reading :octicons-arrow-right-24:][1]{ .md-button }
[1]: 2021/search-better-faster-smaller.md

View File

@ -6,6 +6,41 @@ template: overrides/main.html
## Material for MkDocs
### 7.3.0 <small>_ September 23, 2021</small>
- Added support for sticky navigation tabs
- Added support for section index pages
- Added support for removing generator notice
### 7.2.8 <small>_ September 20, 2021</small>
- Fixed #3039: Search modal overlays menu on mobile (7.2.7 regression)
### 7.2.7 <small>_ September 19, 2021</small>
- Updated Serbian and Serbo-Croatian translations
- Improved appearance of outline on details
- Fixed #2934: Scrollbar when header is hidden on some mobile browsers
- Fixed #3032: Anchor in details doesn't open on load (7.0.0 regression)
- Fixed back-to-top button being focusable when invisible
- Fixed broken admonition icons (removed in upstream)
### 7.2.6 <small>_ September 1, 2021</small>
- Fixed rendering of `blockquote` elements (7.0.0 regression)
- Fixed #2973: Custom search worker setting ignored
### 7.2.5 <small>_ August 25, 2021</small>
- Updated Portuguese translations
- Fixed execution of RxJS teardown logic (7.2.3 regression)
- Fixed #2970: Search results show escaped characters (7.2.2 regression)
### 7.2.4 <small>_ August 11, 2021</small>
- Fixed #2926: Version selector not working (7.2.3 regression)
- Fixed #2929: Missing CSS class for banner (consistency with Insiders)
### 7.2.3 <small>_ August 9, 2021</small>
- Slight facelift of data tables, now closer to Material Design

View File

@ -79,9 +79,22 @@ The following plugins are bundled with the Docker image:
The new image can be used exactly like the official image.
!!! info ":material-apple: Apple Silicon (M1) and :fontawesome-brands-raspberry-pi: Raspberry Pi"
The official Docker image is only available for `linux/amd64`. We recommend
the [third-party image][11] by @afritzler if you want to run Material for
MkDocs via Docker on `arm64` or `armv7`, as it is automatically built on
every release:
```
docker pull ghcr.io/afritzler/mkdocs-material
```
[11]: https://github.com/afritzler/mkdocs-material
### with git
Material for MkDocs can be directly used from [GitHub][11] by cloning the
Material for MkDocs can be directly used from [GitHub][12] by cloning the
repository into a subfolder of your project root which might be useful if you
want to use the very latest version:
@ -96,4 +109,4 @@ from `git`, you must install all required dependencies yourself:
pip install -r mkdocs-material/requirements.txt
```
[11]: https://github.com/squidfunk/mkdocs-material
[12]: https://github.com/squidfunk/mkdocs-material

View File

@ -6,6 +6,35 @@ template: overrides/main.html
## Material for MkDocs Insiders
### 3.0.1 <small>_ September 19, 2021</small>
- Added support for using literal `h1-6` tags for search plugin
- Fixed search plugin breaking on void elements without slashes
- Fixed search plugin filtering link contents from headlines
- Fixed search plugin handling of multiple `h1` headlines
- Fixed search plugin handling of missing `h1` headlines
### 3.0.0 <small>_ September 13, 2021</small>
- Rewrite of MkDocs' search plugin
- Added support for rich search previews
- Added support for tokenizer with lookahead
- Improved search indexing performance (twice as fast)
- Improved search highlighting
### 2.13.3 <small>_ September 1, 2021</small>
- Added support for disabling social card generation
### 2.13.2 <small>_ August 25, 2021</small>
- Fixed #2965: Social plugin error when primary color is not defined
### 2.13.1 <small>_ August 21, 2021</small>
- Fixed #2948: Social cards are not cached
- Fixed #2953: Mermaid.js diagrams can't be centered anymore
### 2.13.0 <small>_ August 7, 2021</small>
- Added support for custom colors in social cards

View File

@ -98,6 +98,26 @@ You can cancel your sponsorship anytime.[^4]
[:octicons-heart-fill-24:{ .mdx-heart } &nbsp; Join our <span class="mdx-sponsorship-count" data-mdx-component="sponsorship-count"></span> awesome sponsors][5]{ .md-button .md-button--primary .mdx-sponsorship-button }
<hr />
<div class="mdx-premium" markdown="1">
**Special thanks** to our **premium sponsors**:
[![Hummingbot]](https://hummingbot.io/){ target=_blank }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
[![Basler]](https://docs.baslerweb.com/){ target=_blank }
&nbsp;&nbsp;
[![Cirrus CI]](https://cirrus-ci.org/){ target=_blank }
</div>
[Hummingbot]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/hummingbot.png
[Basler]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/basler.png
[Cirrus CI]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/.github/assets/sponsors/cirrus-ci.svg
<hr />
<div class="mdx-sponsorship" data-mdx-component="sponsorship" hidden>
<div class="mdx-sponsorship__list"></div>
<small>
@ -117,9 +137,13 @@ The following features are currently exclusively available to sponsors:
<div class="mdx-columns" markdown="1">
- [x] [Social cards :material-new-box:][34]
- [x] [Cookie consent :material-new-box:][33]
- [x] [Linking content tabs :material-new-box:][32]
- [x] [Brand new search plugin :material-new-box:][35]
- [x] [Rich search previews :material-new-box:][36]
- [x] [Tokenizer with lookahead :material-new-box:][37]
- [x] [Advanced search highlighting :material-new-box:][38]
- [x] [Social cards][34]
- [x] [Cookie consent][33]
- [x] [Linking content tabs][32]
- [x] [Boosting pages in search][30]
- [x] [Tags (with search integration)][29]
- [x] [Stay on page when switching versions][28]
@ -127,10 +151,7 @@ The following features are currently exclusively available to sponsors:
- [x] [Custom admonition icons][31]
- [x] [Code block annotations][25]
- [x] [Anchor tracking ][24]
- [x] [Section index pages][22]
- [x] [Sticky navigation tabs][21]
- [x] [Mermaid.js integration][27]
- [x] [Remove generator notice][23]
</div>
@ -148,16 +169,6 @@ Following is a list of funding goals. When a funding goal is hit, the features
that are tied to it are merged back into Material for MkDocs and released to
the public for general availability.
#### $ 3,000 Caribbean Red
- [x] [Sticky navigation tabs][21]
- [x] [Section index pages][22]
- [x] [Remove generator notice][23]
[21]: ../setup/setting-up-navigation.md#sticky-navigation-tabs
[22]: ../setup/setting-up-navigation.md#section-index-pages
[23]: ../setup/setting-up-the-footer.md#remove-generator
#### $ 4,000 Ghost Pepper
- [x] [Anchor tracking][24]
@ -191,8 +202,8 @@ the public for general availability.
#### $ 7,000 Royal Gold
- [x] [Cookie consent][33]
- [ ] Improved search result summaries
- [ ] List of last searches
- [ ] Exclude pages from search
- [ ] Link cards
[33]: ../setup/setting-up-site-analytics.md#cookie-consent
@ -204,18 +215,30 @@ the public for general availability.
[34]: ../setup/setting-up-social-cards.md
#### Future
#### $ 10,000 Carolina Reaper
- [ ] [Material for MkDocs Live Edit][35]
- [ ] New layouts and styles
- [ ] Code block palette toggle
- [ ] Native lightbox integration
- [ ] Table of contents auto-collapse
- [x] [Brand new search plugin][35]
- [x] [Rich search previews][36]
- [x] [Tokenizer with lookahead][37]
- [x] [Advanced search highlighting][38]
[35]: https://twitter.com/squidfunk/status/1338252230265360391
[35]: ../blog/2021/search-better-faster-smaller.md
[36]: ../blog/2021/search-better-faster-smaller.md#rich-search-previews
[37]: ../blog/2021/search-better-faster-smaller.md#tokenizer-lookahead
[38]: ../blog/2021/search-better-faster-smaller.md#accurate-highlighting
### Goals completed
#### $ 3,000 Caribbean Red
- [x] [Sticky navigation tabs][21]
- [x] [Section index pages][22]
- [x] [Remove generator notice][23]
[21]: ../setup/setting-up-navigation.md#sticky-navigation-tabs
[22]: ../setup/setting-up-navigation.md#section-index-pages
[23]: ../setup/setting-up-the-footer.md#remove-generator
#### $ 2,500 Biquinho Vermelho
- [x] [Search suggestions][18]
@ -277,17 +300,17 @@ implemented behind feature flags; all configuration changes are
backward-compatible. This means that your users will be able to build the
documentation locally with Material for MkDocs and when they push their changes,
it can be built with Insiders (e.g. as part of GitHub Actions). Thus, it's
recommended to [install Insiders][36] only in CI, as you don't want to expose
recommended to [install Insiders][39] only in CI, as you don't want to expose
your `GH_TOKEN` to users.
[36]: ../publishing-your-site.md#github-pages
[39]: ../publishing-your-site.md#github-pages
### 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][37]. If for some reason you cannot do that, you could
yearly billing cycle][40]. 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).
@ -295,7 +318,7 @@ If you have any problems or further questions, don't hesitate to contact me at
sponsors@squidfunk.com. Note that one-time payments are not eligible for
Insiders, but of course, very appreciated.
[37]: https://docs.github.com/en/github/setting-up-and-managing-billing-and-payments-on-github/changing-the-duration-of-your-billing-cycle
[40]: https://docs.github.com/en/github/setting-up-and-managing-billing-and-payments-on-github/changing-the-duration-of-your-billing-cycle
### Terms
@ -304,7 +327,7 @@ commercial project. Can we use Insiders under the same terms and conditions?_
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][38]. However, we kindly ask you to respect the following
by the [MIT license][41]. However, we kindly ask you to respect the following
guidelines:
- Please __don't distribute the source code__ of Insiders. You may freely use
@ -315,7 +338,7 @@ guidelines:
- If you cancel your subscription, you're removed as a collaborator and will
miss out on 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][39].
[GitHub deletes private forks][42].
[38]: ../license.md
[39]: https://docs.github.com/en/github/setting-up-and-managing-your-github-user-account/removing-a-collaborator-from-a-personal-repository
[41]: ../license.md
[42]: https://docs.github.com/en/github/setting-up-and-managing-your-github-user-account/removing-a-collaborator-from-a-personal-repository

View File

@ -76,7 +76,7 @@ and embed them into any other file.
_Example_:
=== "docs/page.md"
=== "`docs/page.md`"
```` markdown
The HTML specification is maintained by the W3C.
@ -84,7 +84,7 @@ _Example_:
--8<-- "includes/abbreviations.md"
````
=== "includes/abbreviations.md"
=== "`includes/abbreviations.md`"
```` markdown
*[HTML]: Hyper Text Markup Language

View File

@ -53,7 +53,7 @@ configuring syntax highlighting of code blocks:
respective stylesheet and JavaScript from a [CDN][9] serving
Highlight.js in `mkdocs.yml`:
=== "docs/javascripts/config.js"
=== "`docs/javascripts/config.js`"
``` js
document$.subscribe(() => {
@ -61,7 +61,7 @@ configuring syntax highlighting of code blocks:
})
```
=== "mkdocs.yml"
=== "`mkdocs.yml`"
``` yaml
extra_javascript:

View File

@ -120,7 +120,7 @@ If you want to make data tables sortable, you can add [tablesort][5], which is
natively integrated with Material for MkDocs and will also work with [instant
loading][6] via [additional JavaScript][2]:
=== "docs/javascripts/tables.js"
=== "`docs/javascripts/tables.js`"
``` js
document$.subscribe(function() {
@ -131,7 +131,7 @@ loading][6] via [additional JavaScript][2]:
})
```
=== "mkdocs.yml"
=== "`mkdocs.yml`"
``` yaml
extra_javascript:

View File

@ -110,19 +110,19 @@ _Example_:
```
- :material-account-circle: `.icons/material/account-circle.svg`
- :fontawesome-regular-laugh-wink: `.icons/fontawesome/regular/laugh-wink.svg`
- :octicons-repo-push-24: `.icons/octicons/repo-push-24.svg`
- :octicons-repo-push-16: `.icons/octicons/repo-push-16.svg`
```
_Result_:
- :material-account-circle: [`.icons/material/account-circle.svg`][14]
- :fontawesome-regular-laugh-wink: [`.icons/fontawesome/regular/laugh-wink.svg`][15]
- :octicons-repo-push-24: [`.icons/octicons/repo-push-24.svg`][16]
- :octicons-repo-push-16: [`.icons/octicons/repo-push-16.svg`][16]
[13]: #emoji
[14]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/material/.icons/material/account-circle.svg
[15]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/material/.icons/fontawesome/regular/laugh-wink.svg
[16]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/material/.icons/octicons/repo-push-24.svg
[16]: https://raw.githubusercontent.com/squidfunk/mkdocs-material/master/material/.icons/octicons/repo-push-16.svg
#### with colors

View File

@ -85,6 +85,25 @@ extra:
## Customization
### Displaying the metadata
Sometimes it's useful to be able to display the medatada in the page body, e.g.
print the name of the page author at the bottom of the page. To achieve that,
you can [extend the theme][7] by adding the following contents to `main.html`:
``` html
{% extends "base.html" %}
{% block content %}
{{ super() }}
{% if page and page.meta and page.meta.author %}
<p><small>Author: {{ page.meta.author }}</small></p>
{% endif %}
{% endblock %}
```
[7]: ../customization.md#extending-the-theme
### Custom meta tags
#### on all pages
@ -94,12 +113,13 @@ In order to add custom `meta` tags to your document, you can [extend the theme
policies for search engines:
``` html
{% extends "base.html" %}
{% block extrahead %}
<meta property="robots" content="noindex, nofollow" />
{% endblock %}
```
[7]: ../customization.md#extending-the-theme
[8]: ../customization.md#overriding-blocks-recommended
#### on a single page
@ -109,6 +129,8 @@ values for different pages, you can use the `page.meta` object inside your
template override, e.g.:
``` html
{% extends "base.html" %}
{% block extrahead %}
{% if page and page.meta and page.meta.robots %}
<meta property="robots" content="{{ page.meta.robots }}" />

View File

@ -70,13 +70,13 @@ storage and management.
_Example_:
=== "docs/page.md"
=== "`docs/page.md`"
```` markdown
The unit price is {{ unit.price }}
````
=== "mkdocs.yml"
=== "`mkdocs.yml`"
``` yaml
extra:
@ -109,13 +109,13 @@ In your Markdown file, include snippets with Jinja's [`include`][4] function:
_Example_:
=== "snippets/definitions.md"
=== "`snippets/definitions.md`"
``` markdown
The unit price is {{ page.meta.unit.price }}
```
=== "docs/page-1.md"
=== "`docs/page-1.md`"
``` markdown
---
@ -126,7 +126,7 @@ _Example_:
{% include "definitions.md" %}
```
=== "docs/page-2.md"
=== "`docs/page-2.md`"
``` markdown
---

View File

@ -77,6 +77,8 @@ In order to integrate another JavaScript-based comment system provider, you can
[extend the theme][7] and [override the `disqus` block][8]:
``` html
{% extends "base.html" %}
{% block disqus %}
<!-- Add custom comment system integration here -->
{% endblock %}

View File

@ -178,7 +178,7 @@ Click on a tile to change the directionality:
[:octicons-file-code-24: Source][1] ·
:octicons-mortar-board-24: Difficulty: _easy_
If you want to customize some of the translations for your language, just follow
If you want to customize some of the translations for a language, just follow
the guide on [theme extension][9] and create a new partial in
`partials/languages`, e.g. `en-custom.html`. Next, look up the translation you
want to change in the [base translation][1] and add it to the partial.
@ -186,9 +186,14 @@ want to change in the [base translation][1] and add it to the partial.
Let's say you want to change "__Table of contents__" to "__On this page__":
``` html
{% macro t(key) %}{{ {
<!-- Use en language as fallback -->
{% import "partials/languages/en.html" as fallback %}
{% macro override(key) %}{{ {
"toc.title": "On this page"
}[key] }}{% endmacro %}
<!-- Re-export the translation macro for mkbuild-material to use -->
{% macro t(key) %}{{ override(key) or fallback.t(key) }}{% endmacro %}
```
Then, add the following lines to `mkdocs.yml`:

View File

@ -43,9 +43,9 @@ _Material for MkDocs is the only MkDocs theme offering this feature._
### Anchor tracking
[:octicons-file-code-24: Source][9] ·
[:octicons-file-code-24: Source][6] ·
:octicons-unlock-24: Feature flag ·
[:octicons-heart-fill-24:{ .mdx-heart } Insiders only][9]{ .mdx-insiders }
[:octicons-heart-fill-24:{ .mdx-heart } Insiders only][6]{ .mdx-insiders }
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
@ -57,9 +57,11 @@ theme:
- navigation.tracking
```
[6]: ../insiders/index.md
### Navigation tabs
[:octicons-file-code-24: Source][6] · :octicons-unlock-24: Feature flag
[:octicons-file-code-24: Source][7] · :octicons-unlock-24: Feature flag
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
@ -82,22 +84,21 @@ theme:
=== "With tabs"
[![With tabs][7]][7]
[![With tabs][8]][8]
=== "Without tabs"
[![Without tabs][8]][8]
[![Without tabs][9]][9]
[6]: https://github.com/squidfunk/mkdocs-material/blob/master/src/partials/tabs.html
[7]: ../assets/screenshots/navigation-tabs.png
[8]: ../assets/screenshots/navigation.png
[7]: https://github.com/squidfunk/mkdocs-material/blob/master/src/partials/tabs.html
[8]: ../assets/screenshots/navigation-tabs.png
[9]: ../assets/screenshots/navigation.png
#### Sticky navigation tabs
[:octicons-file-code-24: Source][9] ·
[:octicons-file-code-24: Source][10] ·
:octicons-unlock-24: Feature flag ·
:octicons-beaker-24: Experimental ·
[:octicons-heart-fill-24:{ .mdx-heart } Insiders only][9]{ .mdx-insiders }
:octicons-beaker-24: Experimental
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
@ -112,19 +113,19 @@ theme:
=== "With sticky tabs"
[![With sticky tabs][10]][10]
[![With sticky tabs][11]][11]
=== "Without sticky tabs"
[![Without sticky tabs][11]][11]
[![Without sticky tabs][12]][12]
[9]: ../insiders/index.md
[10]: ../assets/screenshots/navigation-tabs-sticky.png
[11]: ../assets/screenshots/navigation-tabs-collapsed.png
[10]: https://github.com/squidfunk/mkdocs-material/blob/master/src/partials/header.html
[11]: ../assets/screenshots/navigation-tabs-sticky.png
[12]: ../assets/screenshots/navigation-tabs-collapsed.png
### Navigation sections
[:octicons-file-code-24: Source][12] ·
[:octicons-file-code-24: Source][13] ·
:octicons-unlock-24: Feature flag
When _sections_ are enabled, top-level sections are rendered as groups in the
@ -139,14 +140,14 @@ theme:
=== "With sections"
[![With sections][13]][13]
[![With sections][14]][14]
=== "Without sections"
[![Without sections][8]][8]
[![Without sections][9]][9]
[12]: https://github.com/squidfunk/mkdocs-material/blob/master/src/partials/nav-item.html
[13]: ../assets/screenshots/navigation-sections.png
[13]: https://github.com/squidfunk/mkdocs-material/blob/master/src/partials/nav-item.html
[14]: ../assets/screenshots/navigation-sections.png
Both feature flags, _tabs_ and _sections_, can be combined with each other. If
both feature flags are enabled, sections are rendered for level 2 navigation
@ -154,7 +155,7 @@ items.
### Navigation expansion
[:octicons-file-code-24: Source][12] ·
[:octicons-file-code-24: Source][13] ·
:octicons-unlock-24: Feature flag
When _expansion_ is enabled, the left sidebar will expand all collapsible
@ -169,20 +170,19 @@ theme:
=== "With expansion"
[![With expansion][14]][14]
[![With expansion][15]][15]
=== "Without expansion"
[![Without expansion][8]][8]
[![Without expansion][9]][9]
[14]: ../assets/screenshots/navigation-expand.png
[15]: ../assets/screenshots/navigation-expand.png
### Section index pages
[:octicons-file-code-24: Source][9] ·
[:octicons-file-code-24: Source][16] ·
:octicons-unlock-24: Feature flag ·
:octicons-beaker-24: Experimental ·
[:octicons-heart-fill-24:{ .mdx-heart } Insiders only][9]{ .mdx-insiders }
:octicons-beaker-24: Experimental
When _section index pages_ are enabled, documents can be directly attached to
sections, which is particularly useful for providing overview pages. Add the
@ -196,11 +196,11 @@ theme:
=== "With section index pages"
[![With expansion][15]][15]
[![With expansion][17]][17]
=== "Without section index pages"
[![Without expansion][16]][16]
[![Without expansion][18]][18]
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
@ -216,23 +216,16 @@ nav:
```
_This feature flag can be combined with all other feature flags, e.g. [tabs][1]
and [sections][2], except for table of contents [navigation integration][17].
Note that it doesn't rely on third-party plugins[^2]._
and [sections][2], except for table of contents [navigation integration][19]._
[^2]:
If you don't want to use the native integration, the
[mkdocs-section-index][18] plugin might be an alternative. However, note
that this plugin may not be compatible with all navigation-related features
offered by Material for MkDocs.
[15]: ../assets/screenshots/navigation-index-on.png
[16]: ../assets/screenshots/navigation-index-off.png
[17]: #navitation-intergation
[18]: https://github.com/oprypin/mkdocs-section-index
[16]: https://github.com/squidfunk/mkdocs-material/blob/master/src/partials/nav-item.html
[17]: ../assets/screenshots/navigation-index-on.png
[18]: ../assets/screenshots/navigation-index-off.png
[19]: #navigation-integration
### Back-to-top button
[:octicons-file-code-24: Source][19] ·
[:octicons-file-code-24: Source][20] ·
:octicons-unlock-24: Feature flag
A _back-to-top button_ can be shown when the user, after scrolling down, starts
@ -245,11 +238,10 @@ theme:
- navigation.top
```
[![back-to-top button][20]][20]
[![back-to-top button][21]][21]
[19]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/stylesheets/main/layout/_top.scss
[20]: ../assets/screenshots/back-to-top.png
[21]: https://squidfunk.github.io/mkdocs-material-insiders/setup/setting-up-navigation/#back-to-top-button
[20]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/stylesheets/main/layout/_top.scss
[21]: ../assets/screenshots/back-to-top.png
### Table of contents
@ -287,7 +279,7 @@ customize its appearance:
: :octicons-milestone-24: Default: `headerid.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][24]:
like for example those from [Python Markdown Extensions][25]:
=== "Unicode"
@ -358,7 +350,7 @@ theme:
=== "Separate table of contents"
[![Separate table of contents][7]][7]
[![Separate table of contents][8]][8]
[26]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/stylesheets/main/layout/_nav.scss
[27]: ../assets/screenshots/toc-integrate.png

View File

@ -17,8 +17,13 @@ with some effort, search can be made available [offline][1].
### Built-in search
!!! danger "[Search: better, faster, smaller](../blog/2021/search-better-faster-smaller.md)"
We rebuilt the search plugin and integration from the ground up, introducing [rich search previews](../blog/2021/search-better-faster-smaller.md#rich-search-previews), much better [tokenizer support](../blog/2021/search-better-faster-smaller.md#tokenizer-lookahead), [more accurate highlighting](../blog/2021/search-better-faster-smaller.md#accurate-highlighting) and much more. Read the [blog article](../blog/2021/search-better-faster-smaller.md) to learn more about our new search implementation. Start using it immediately by [becoming a sponsor][20]!
[:octicons-file-code-24: Source][2] ·
[:octicons-cpu-24: Plugin][3]
[:octicons-cpu-24: Plugin][3] ·
[:octicons-heart-fill-24:{ .mdx-heart } Better in Insiders][20]{ .mdx-insiders }
The [built-in search plugin][3] integrates seamlessly with Material for MkDocs,
adding multilingual client-side search with [lunr][4] and [lunr-languages][5].
@ -152,7 +157,7 @@ theme:
- search.suggest
```
Searching for [:octicons-search-24: ^^search su^^][9] yields ^^search suggestions^^ as a suggestion:
Searching for [:octicons-search-24: search su][9] yields ^^search suggestions^^ as a suggestion:
[![Search suggestions][10]][10]
@ -176,13 +181,10 @@ theme:
- search.highlight
```
Searching for [:octicons-search-24: ^^code blocks^^][12] yields:
Searching for [:octicons-search-24: code blocks][12] yields:
[![Search highlighting][13]][13]
</figcaption>
</figure>
[11]: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/javascripts/components/search/highlight/index.ts
[12]: ../reference/code-blocks.md?h=code+blocks
[13]: ../assets/screenshots/search-highlighting.png
@ -312,6 +314,8 @@ customize the `transform` function, you can do this by [overriding the
`config` block][24]:
``` html
{% extends "base.html" %}
{% block config %}
{{ super() }}
<script>

View File

@ -105,8 +105,7 @@ copyright: Copyright &copy; 2016 - 2020 Martin Donath
### Remove generator
[:octicons-file-code-24: Source][4] ·
[:octicons-heart-fill-24:{ .mdx-heart } Insiders only][4]{ .mdx-insiders }
[:octicons-file-code-24: Source][3]
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 setting
@ -117,6 +116,18 @@ extra:
generator: false
```
!!! info "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 it, 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][4] the project. __Thank you__
:octicons-heart-fill-24:{ .mdx-heart .mdx-insiders }
[4]: ../insiders/index.md
## Customization

View File

@ -42,6 +42,8 @@ an announcement bar, [extend the theme][4] and [override the `announce`
block][5], which is empty by default:
``` html
{% extends "base.html" %}
{% block announce %}
<!-- Add your announcement here, including arbitrary HTML -->
{% endblock %}

View File

@ -76,6 +76,8 @@ visits any other version than the latest version. Using [theme extension][8],
you can [define the `outdated` block][9]:
``` html
{% extends "base.html" %}
{% block outdated %}
You're not viewing the latest version.
<a href="{{ '../' ~ base_url }}"> <!-- (1) -->

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 4c-.6 0-1 .4-1 1v1h-1.5l-1.4-3c-.1-.2-.2-.4-.4-.5-.5-.5-1.3-.6-2-.3l-.7.2-.7-.3c-.7-.3-1.5-.2-2 .3-.2.2-.3.4-.4.6L7.5 6H6V5c0-.6-.4-1-1-1s-1 .4-1 1v1c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V5c0-.5-.4-1-1-1M4 22v-3c0-2.67 5.33-4 8-4s8 1.33 8 4v3H4m14.1-1.9V19c0-.64-3.13-2.1-6.1-2.1S5.9 18.36 5.9 19v1.1h12.2M16 9v1c0 2.21-1.79 4-4 4s-4-1.79-4-4V9h2v1a2 2 0 1 0 4 0V9h2z"/></svg>

After

Width:  |  Height:  |  Size: 443 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4m0-6a2 2 0 1 1 0 4c-1.11 0-2-.89-2-2s.9-2 2-2m-.73 14H2v-3c0-2.67 5.33-4 8-4 1.04 0 2.5.21 3.86.61-.86.34-1.66.81-2.36 1.39-.5-.06-1-.1-1.5-.1-2.97 0-6.1 1.46-6.1 2.1v1.1h5.32c-.02.05-.05.1-.08.15l-.29.75.29.75c.04.08.09.16.13.25M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1 0-5 2.5 2.5 0 0 1 0 5z"/></svg>

After

Width:  |  Height:  |  Size: 542 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6 8c0-2.21 1.79-4 4-4s4 1.79 4 4-1.79 4-4 4-4-1.79-4-4m3.14 11.75L8.85 19l.29-.75c.7-1.75 1.94-3.11 3.47-4.03-.82-.14-1.69-.22-2.61-.22-4.42 0-8 1.79-8 4v2h7.27c-.04-.09-.09-.17-.13-.25M17 18c-.56 0-1 .44-1 1s.44 1 1 1 1-.44 1-1-.44-1-1-1m6 1c-.94 2.34-3.27 4-6 4s-5.06-1.66-6-4c.94-2.34 3.27-4 6-4s5.06 1.66 6 4m-3.5 0a2.5 2.5 0 0 0-5 0 2.5 2.5 0 0 0 5 0z"/></svg>

After

Width:  |  Height:  |  Size: 435 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17 21 1.8 1.8c.5.5 1.2.1 1.2-.5V18l2.8-3.4A1 1 0 0 0 22 13h-7c-.8 0-1.3 1-.8 1.6L17 18v3m-2-1H2v-3c0-2.7 5.3-4 8-4 .6 0 1.3.1 2.1.2-.2.6-.1 1.3.1 1.9-.7-.1-1.5-.2-2.2-.2-3 0-6.1 1.5-6.1 2.1v1.1h10.6l.5.6V20m-5-8c2.2 0 4-1.8 4-4s-1.8-4-4-4-4 1.8-4 4 1.8 4 4 4m0-6c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2z"/></svg>

After

Width:  |  Height:  |  Size: 385 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 4c2.2 0 4 1.8 4 4s-1.8 4-4 4-4-1.8-4-4 1.8-4 4-4m7 17 1.8 1.8c.5.5 1.2.1 1.2-.5V18l2.8-3.4A1 1 0 0 0 22 13h-7c-.8 0-1.3 1-.8 1.6L17 18v3m-2-2.3-2.3-2.8c-.4-.5-.6-1.1-.6-1.7-.7-.2-1.4-.2-2.1-.2-4.4 0-8 1.8-8 4v2h13v-1.3z"/></svg>

After

Width:  |  Height:  |  Size: 301 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 10c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4m0-6c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2m6.39 8.56C16.71 11.7 14.53 11 12 11s-4.71.7-6.39 1.56A2.97 2.97 0 0 0 4 15.22V22h2v-6.78c0-.38.2-.72.5-.88C7.71 13.73 9.63 13 12 13c.76 0 1.47.07 2.13.2l-1.55 3.3H9.75C8.23 16.5 7 17.73 7 19.25S8.23 22 9.75 22H18c1.1 0 2-.9 2-2v-4.78c0-1.12-.61-2.15-1.61-2.66M10.94 20H9.75c-.41 0-.75-.34-.75-.75s.34-.75.75-.75h1.89l-.7 1.5M18 20h-4.85l2.94-6.27c.54.2 1.01.41 1.41.61.3.16.5.5.5.88V20z"/></svg>

After

Width:  |  Height:  |  Size: 570 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8 6c0-2.21 1.79-4 4-4s4 1.79 4 4-1.79 4-4 4-4-1.79-4-4m9 16h1c1.1 0 2-.9 2-2v-4.78c0-1.12-.61-2.15-1.61-2.66-.43-.22-.89-.43-1.39-.62V22m-4.66-5L15 11.33c-.93-.21-1.93-.33-3-.33-2.53 0-4.71.7-6.39 1.56A2.97 2.97 0 0 0 4 15.22V22h2.34c-.22-.45-.34-.96-.34-1.5C6 18.57 7.57 17 9.5 17h2.84M10 22l1.41-3H9.5c-.83 0-1.5.67-1.5 1.5S8.67 22 9.5 22h.5z"/></svg>

After

Width:  |  Height:  |  Size: 423 B

View File

Before

Width:  |  Height:  |  Size: 450 B

After

Width:  |  Height:  |  Size: 450 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21.8 14.5c-.5-.8-1.7-1.1-3.7-1.1-.7 0-1.4 0-2.1.1-.5-.3-1-.6-1.4-.9-1-.8-1.9-2.3-2.6-4.1 0 0 0-.1.1-.2.5-2.1 1-4.7 0-5.8-.3-.3-.6-.4-1-.4h-.4c-.6 0-1.1.6-1.3 1.2-.6 2.1-.2 3.3.4 5.2-.4 1.5-.9 3.1-1.8 4.8-.5 1.1-1.1 2.1-1.5 2.9-.6.3-1.1.6-1.4.8-1.9 1.2-2.9 2.6-3 3.4-.1.3-.1.6 0 .8v.1l.8.5c.2.1.5.2.7.2 1.3 0 2.8-1.5 4.8-5 .1 0 .2-.1.3-.1 1.7-.5 3.7-.9 6.5-1.2 1.6.8 3.6 1.2 4.8 1.2.7 0 1.2-.2 1.5-.5.3-.3.4-.7.5-1.1 0-.3 0-.6-.2-.8M3.4 20.9c.1-.6.8-1.7 2-2.7.2-.1.4-.3.8-.5-1.2 1.9-2.1 2.9-2.8 3.2m7.4-17.7c.1-.1.1-.2.2-.2l.2.1c.3.4.3.9.1 1.8v.3c-.1.4-.1.8-.3 1.3-.4-1.5-.4-2.6-.2-3.3m-2 12.6-.2.1c.1-.5.5-1.1.8-1.7.7-1.4 1.3-2.7 1.6-3.9.7 1.5 1.5 2.6 2.5 3.5.2.2.4.4.7.5-1.4.2-3.3.7-5.4 1.5m12.1-.1h-.4c-.7 0-1.9-.3-3.1-.8.1-.2.3-.2.4-.2 2.3 0 2.9.4 3.1.6.1.1.1.1.1.2s0 .1-.1.2z"/></svg>

Before

Width:  |  Height:  |  Size: 858 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.58 3H22v16.67L14.58 3M9.42 3H2v16.67L9.42 3M12 9.17l4.67 10.5H13.5l-1.33-3.34H8.75L12 9.17z"/></svg>

Before

Width:  |  Height:  |  Size: 173 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m-1.57 19.87v-1.96c0-.69-.43-1.34-1.08-1.61-2.44-1.04-4.18-3.47-4.18-6.3 0-3.74 3.05-6.83 6.83-6.83 3.78 0 6.83 3.09 6.83 6.83 0 4.43-3.44 8.61-8.4 9.87z"/></svg>

Before

Width:  |  Height:  |  Size: 306 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.93 17.09c-.18.16-.43.17-.63.06-.89-.74-1.05-1.08-1.54-1.79-1.47 1.5-2.51 1.95-4.42 1.95-2.25 0-4.01-1.39-4.01-4.17 0-2.18 1.17-3.64 2.86-4.38 1.46-.64 3.49-.76 5.04-.93V7.5c0-.66.05-1.41-.33-1.96-.32-.49-.95-.7-1.5-.7-1.02 0-1.93.53-2.15 1.61-.05.24-.25.48-.47.49l-2.6-.28c-.22-.05-.46-.22-.4-.56.6-3.15 3.45-4.1 6-4.1 1.3 0 3 .35 4.03 1.33C17.11 4.55 17 6.18 17 7.95v4.17c0 1.25.5 1.81 1 2.48.17.25.21.54 0 .71l-2.06 1.78h-.01m-2.7-6.53V10c-1.94 0-3.99.39-3.99 2.67 0 1.16.61 1.95 1.63 1.95.76 0 1.43-.47 1.86-1.22.52-.93.5-1.8.5-2.84m6.93 8.98C18 21.14 14.82 22 12.1 22c-3.81 0-7.25-1.41-9.85-3.76-.2-.18-.02-.43.25-.29 2.78 1.63 6.25 2.61 9.83 2.61 2.41 0 5.07-.5 7.51-1.53.37-.16.66.24.32.51m.91-1.04c-.28-.36-1.85-.17-2.57-.08-.19.02-.22-.16-.03-.3 1.24-.88 3.29-.62 3.53-.33.24.3-.07 2.35-1.24 3.32-.18.16-.35.07-.26-.11.26-.67.85-2.14.57-2.5z"/></svg>

Before

Width:  |  Height:  |  Size: 931 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M22.78 17.91c.16.25.22.51.22.79 0 .38-.13.69-.43.94s-.63.36-1.01.36h-2.48L12.42 8h-.84L4.92 20H2.39c-.47 0-.86-.2-1.17-.62-.31-.42-.33-.88-.05-1.38l9.61-16.31C11.09 1.22 11.5 1 12 1c.53 0 .92.22 1.17.69l9.61 16.22m-18 4.4L12 9.38l7.22 12.93-.72.69-6.5-2.66L5.44 23l-.66-.69z"/></svg>

Before

Width:  |  Height:  |  Size: 352 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15 9a1 1 0 0 1-1-1 1 1 0 0 1 1-1 1 1 0 0 1 1 1 1 1 0 0 1-1 1M9 9a1 1 0 0 1-1-1 1 1 0 0 1 1-1 1 1 0 0 1 1 1 1 1 0 0 1-1 1m7.12-4.63 2.1-2.1-.82-.83-2.31 2.31C14.16 3.28 13.11 3 12 3c-1.12 0-2.16.28-3.09.75L6.6 1.44l-.82.83 2.1 2.1C6.14 5.64 5 7.68 5 10v1h14v-1c0-2.32-1.14-4.36-2.88-5.63M5 16c0 3.86 3.13 7 7 7a7 7 0 0 0 7-7v-4H5v4z"/></svg>

Before

Width:  |  Height:  |  Size: 410 B

View File

Before

Width:  |  Height:  |  Size: 214 B

After

Width:  |  Height:  |  Size: 214 B

View File

Before

Width:  |  Height:  |  Size: 215 B

After

Width:  |  Height:  |  Size: 215 B

View File

Before

Width:  |  Height:  |  Size: 378 B

After

Width:  |  Height:  |  Size: 378 B

View File

Before

Width:  |  Height:  |  Size: 419 B

After

Width:  |  Height:  |  Size: 419 B

View File

Before

Width:  |  Height:  |  Size: 250 B

After

Width:  |  Height:  |  Size: 250 B

View File

Before

Width:  |  Height:  |  Size: 257 B

After

Width:  |  Height:  |  Size: 257 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21.7 18.6v-1l1.1-.8c.1-.1.2-.2.1-.3l-1-1.7c0-.1-.2-.1-.3-.1l-1.2.5c-.3-.2-.6-.4-.9-.5l-.2-1.3c0-.1-.1-.2-.2-.2h-2c-.2 0-.3.1-.3.2l-.2 1.3c-.3.2-.5.3-.8.5l-1.2-.5c-.1 0-.2 0-.3.1l-1 1.7c0 .1 0 .2.1.3l1.1.8v1l-1.1.8c-.1.1-.2.2-.1.3l1 1.7c.1.1.2.1.3.1l1.2-.5c.2.2.5.4.8.5l.2 1.3c.1.1.2.2.3.2h2c.1 0 .2-.1.2-.2l.2-1.3c.3-.2.5-.3.8-.5l1.2.4c.1 0 .2 0 .3-.1l1-1.7c.1-.1.1-.2 0-.2l-1.1-.8m-3.7.9c-.8 0-1.5-.7-1.5-1.5s.7-1.5 1.5-1.5 1.5.7 1.5 1.5-.7 1.5-1.5 1.5M12.3 22H3c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h18c1.1 0 2 .9 2 2v9.1c-.6-.6-1.3-1.1-2-1.4V6H3v14h8.3c.2.7.5 1.4 1 2z"/></svg>

After

Width:  |  Height:  |  Size: 644 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21.7 18.6v-1l1.1-.8c.1-.1.2-.2.1-.3l-1-1.7c0-.1-.2-.1-.3-.1l-1.2.5c-.3-.2-.6-.4-.9-.5l-.2-1.3c0-.1-.1-.2-.2-.2h-2c-.2 0-.3.1-.3.2l-.2 1.3c-.3.2-.5.3-.8.5l-1.2-.5c-.1 0-.2 0-.3.1l-1 1.7c0 .1 0 .2.1.3l1.1.8v1l-1.1.8c-.1.1-.2.2-.1.3l1 1.7c.1.1.2.1.3.1l1.2-.5c.2.2.5.4.8.5l.2 1.3c.1.1.2.2.3.2h2c.1 0 .2-.1.2-.2l.2-1.3c.3-.2.5-.3.8-.5l1.2.4c.1 0 .2 0 .3-.1l1-1.7c.1-.1.1-.2 0-.2l-1.1-.8m-3.7.9c-.8 0-1.5-.7-1.5-1.5s.7-1.5 1.5-1.5 1.5.7 1.5 1.5-.7 1.5-1.5 1.5m-6.71.5H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5.68a7.03 7.03 0 0 0-2-.6V8H5v10h6c0 .7.11 1.37.29 2z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21.7 18.6v-1l1.1-.8c.1-.1.2-.2.1-.3l-1-1.7c0-.1-.2-.1-.3-.1l-1.2.5c-.3-.2-.6-.4-.9-.5l-.2-1.3c0-.1-.1-.2-.2-.2h-2c-.2 0-.3.1-.3.2l-.2 1.3c-.3.2-.5.3-.8.5l-1.2-.5c-.1 0-.2 0-.3.1l-1 1.7c0 .1 0 .2.1.3l1.1.8v1l-1.1.8c-.1.1-.2.2-.1.3l1 1.7c.1.1.2.1.3.1l1.2-.5c.2.2.5.4.8.5l.2 1.3c.1.1.2.2.3.2h2c.1 0 .2-.1.2-.2l.2-1.3c.3-.2.5-.3.8-.5l1.2.4c.1 0 .2 0 .3-.1l1-1.7c.1-.1.1-.2 0-.2l-1.1-.8m-3.7.9c-.8 0-1.5-.7-1.5-1.5s.7-1.5 1.5-1.5 1.5.7 1.5 1.5-.7 1.5-1.5 1.5M11 18c0-3.9 3.1-7 7-7 2 0 3.7.8 5 2.1V4c0-1.1-.9-2-2-2H3c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h9.3c-.8-1.1-1.3-2.5-1.3-4M3 4h18v3H3V4z"/></svg>

Before

Width:  |  Height:  |  Size: 643 B

After

Width:  |  Height:  |  Size: 662 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11 20v2H3c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h18c1.1 0 2 .9 2 2v8.1l-.2-.2c-.5-.5-1.1-.8-1.8-.8V6H3v14h8m10.4-6.7 1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2s.3.1.4.2m-.3 3.6-6 6.1H13v-2.1l6.1-6.1 2 2.1z"/></svg>

After

Width:  |  Height:  |  Size: 289 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m11 20.1 8.2-8.2c.5-.5 1.1-.8 1.8-.8s1.3.3 1.8.8l.2.2V4c0-1.1-.9-2-2-2H3c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h8v-1.9M3 4h18v3H3V4m18 9.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1-2.1-2z"/></svg>

After

Width:  |  Height:  |  Size: 324 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8 12h9.76l-2.5-2.5 1.41-1.42L21.59 13l-4.92 4.92-1.41-1.42 2.5-2.5H8v-2m11-9a2 2 0 0 1 2 2v4.67l-2-2V7H5v12h14v-.67l2-2V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h14z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9 12h9.8l-2.5-2.5 1.4-1.4 4.9 4.9-4.9 4.9-1.4-1.4 2.5-2.5H9v-2m12 5.4V20H3V6h18v2.6l2 2V4c0-1.1-.9-2-2-2H3c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-4.6l-2 2z"/></svg>

Before

Width:  |  Height:  |  Size: 251 B

After

Width:  |  Height:  |  Size: 247 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M1 12h9.76l-2.5-2.5 1.41-1.42L14.59 13l-4.92 4.92-1.41-1.42 2.5-2.5H1v-2m18-9a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-3h2v3h14V7H5v3H3V5a2 2 0 0 1 2-2h14z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M1 12h9.8L8.3 9.5l1.4-1.4 4.9 4.9-4.9 4.9-1.4-1.4 2.5-2.5H1v-2M21 2H3c-1.1 0-2 .9-2 2v6.1h2V6h18v14H3v-4H1v4c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2"/></svg>

Before

Width:  |  Height:  |  Size: 240 B

After

Width:  |  Height:  |  Size: 235 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 2H3c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2m0 18H3V6h18v14z"/></svg>

After

Width:  |  Height:  |  Size: 169 B

View File

Before

Width:  |  Height:  |  Size: 344 B

After

Width:  |  Height:  |  Size: 344 B

View File

Before

Width:  |  Height:  |  Size: 351 B

After

Width:  |  Height:  |  Size: 351 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 0H3C1.9 0 1 .9 1 2v16c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V2c0-1.1-.9-2-2-2m0 18H3V4h18v14M7 22h2v2H7v-2m4 0h2v2h-2v-2m4 0h2v2h-2v-2"/></svg>

After

Width:  |  Height:  |  Size: 209 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 22h2v2H7v-2m4 0h2v2h-2v-2m4 0h2v2h-2v-2M5 4h14a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2m0 4v10h14V8H5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 0H3C1.9 0 1 .9 1 2v16c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V2c0-1.1-.9-2-2-2m0 5H3V2h18v3M7 22h2v2H7v-2m4 0h2v2h-2v-2m4 0h2v2h-2v-2"/></svg>

Before

Width:  |  Height:  |  Size: 204 B

After

Width:  |  Height:  |  Size: 207 B

View File

Before

Width:  |  Height:  |  Size: 414 B

After

Width:  |  Height:  |  Size: 414 B

View File

Before

Width:  |  Height:  |  Size: 419 B

After

Width:  |  Height:  |  Size: 419 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h14m0 14V8H5v10h14z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 2H3c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2m0 5H3V4h18v3z"/></svg>

Before

Width:  |  Height:  |  Size: 165 B

After

Width:  |  Height:  |  Size: 167 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.5 11c.28 0 .5.22.5.5V13H9v-1.5c0-.28.22-.5.5-.5h5m4 1c.5 0 1 .07 1.5.18V10h-2v2.03c.17-.03.33-.03.5-.03M6 19v-9H4v11h8.5c-.26-.62-.41-1.3-.47-2H6M21 9H3V3h18v6m-2-4H5v2h14V5m4 13.5c0 2.5-2 4.5-4.5 4.5S14 21 14 18.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5m-3 2.58L15.92 17c-.27.42-.42.94-.42 1.5 0 1.66 1.34 3 3 3 .56 0 1.08-.15 1.5-.42m1.5-2.58c0-1.66-1.34-3-3-3-.56 0-1.08.15-1.5.42L21.08 20c.27-.42.42-.94.42-1.5z"/></svg>

After

Width:  |  Height:  |  Size: 485 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.5 12c.5 0 1 .07 1.5.18V8H4v13h8.5a6.5 6.5 0 0 1 6-9M9 13v-1.5c0-.28.22-.5.5-.5h5c.28 0 .5.22.5.5V13H9m12-6H3V3h18v4m-2.5 7C16 14 14 16 14 18.5s2 4.5 4.5 4.5 4.5-2 4.5-4.5-2-4.5-4.5-4.5m0 7.5c-1.66 0-3-1.34-3-3 0-.56.15-1.08.42-1.5L20 21.08c-.42.27-.94.42-1.5.42m2.58-1.5L17 15.92c.42-.27.94-.42 1.5-.42 1.66 0 3 1.34 3 3 0 .56-.15 1.08-.42 1.5z"/></svg>

After

Width:  |  Height:  |  Size: 426 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 3H3v6h18V3m-2 4H5V5h14v2m-4.5 4c.28 0 .5.22.5.5V13H9v-1.5c0-.28.22-.5.5-.5h5m3.5 2.09V10h2v3.09c-.33-.05-.66-.09-1-.09-.34 0-.67.04-1 .09M13 19c0 .7.13 1.37.35 2H4V10h2v9h7m9.5-1.75L17.75 22 15 19l1.16-1.16 1.59 1.59 3.59-3.59 1.16 1.41z"/></svg>

After

Width:  |  Height:  |  Size: 319 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 13c.34 0 .67.04 1 .09V8H4v13h9.35c-.22-.63-.35-1.3-.35-2 0-3.31 2.69-6 6-6M9 13v-1.5c0-.28.22-.5.5-.5h5c.28 0 .5.22.5.5V13H9m12-6H3V3h18v4m1.5 10.25L17.75 22 15 19l1.16-1.16 1.59 1.59 3.59-3.59 1.16 1.41z"/></svg>

After

Width:  |  Height:  |  Size: 286 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 2H2v6h18V2m-2 4H4V4h14v2m-2 3c-1.31 0-2.54.37-3.59 1H8.5c-.28 0-.5.22-.5.5V12h2.26A6.94 6.94 0 0 0 9 16c0 .7.11 1.37.29 2H5V9H3v11h7.26c1.27 1.81 3.36 3 5.74 3 3.87 0 7-3.13 7-7s-3.13-7-7-7m0 12c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m.5-4.75 2.86 1.69-.75 1.22L15 17v-5h1.5v4.25z"/></svg>

After

Width:  |  Height:  |  Size: 374 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 6H2V2h18v4m-3.5 6H15v5l3.61 2.16.75-1.22-2.86-1.69V12m6.5 4c0 3.87-3.13 7-7 7-2.38 0-4.47-1.19-5.74-3H3V7h16v2.68c2.36 1.13 4 3.53 4 6.32M8 12h2.26c.57-.81 1.3-1.5 2.15-2H8.5c-.28 0-.5.22-.5.5V12m13 4c0-2.76-2.24-5-5-5s-5 2.24-5 5 2.24 5 5 5 5-2.24 5-5z"/></svg>

After

Width:  |  Height:  |  Size: 335 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 12.08V10h2v2.08c-.33-.05-.66-.08-1-.08-.34 0-.67.03-1 .08M9.5 11c-.28 0-.5.22-.5.5V13h6v-1.5c0-.28-.22-.5-.5-.5h-5M6 19v-9H4v11h8.3c-.19-.63-.3-1.3-.3-2H6M21 9H3V3h18v6m-2-4H5v2h14V5m4.8 15.4c.1 0 .1.1 0 .2l-1 1.7c-.1.1-.2.1-.3.1l-1.2-.4c-.3.2-.5.3-.8.5l-.2 1.3c0 .1-.1.2-.2.2h-2c-.1 0-.2-.1-.3-.2l-.2-1.3c-.3-.1-.6-.3-.8-.5l-1.2.5c-.1 0-.2 0-.3-.1l-1-1.7c-.1-.1 0-.2.1-.3l1.1-.8v-1l-1.1-.8c-.1-.1-.1-.2-.1-.3l1-1.7c.1-.1.2-.1.3-.1l1.2.5c.3-.2.5-.3.8-.5l.2-1.3c0-.1.1-.2.3-.2h2c.1 0 .2.1.2.2l.2 1.3c.3.1.6.3.9.5l1.2-.5c.1 0 .3 0 .3.1l1 1.7c.1.1 0 .2-.1.3l-1.1.8v1l1.1.8M20.5 19c0-.8-.7-1.5-1.5-1.5s-1.5.7-1.5 1.5.7 1.5 1.5 1.5 1.5-.7 1.5-1.5z"/></svg>

After

Width:  |  Height:  |  Size: 724 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 7H3V3h18v4m-9 12c0 .7.11 1.37.3 2H4V8h16v4.08c-.33-.05-.66-.08-1-.08-3.87 0-7 3.13-7 7m3-6v-1.5c0-.28-.22-.5-.5-.5h-5c-.28 0-.5.22-.5.5V13h6m8.8 7.4c.1 0 .1.1 0 .2l-1 1.7c-.1.1-.2.1-.3.1l-1.2-.4c-.3.2-.5.3-.8.5l-.2 1.3c0 .1-.1.2-.2.2h-2c-.1 0-.2-.1-.3-.2l-.2-1.3c-.3-.1-.6-.3-.8-.5l-1.2.5c-.1 0-.2 0-.3-.1l-1-1.7c-.1-.1 0-.2.1-.3l1.1-.8v-1l-1.1-.8c-.1-.1-.1-.2-.1-.3l1-1.7c.1-.1.2-.1.3-.1l1.2.5c.3-.2.5-.3.8-.5l.2-1.3c0-.1.1-.2.3-.2h2c.1 0 .2.1.2.2l.2 1.3c.3.1.6.3.9.5l1.2-.5c.1 0 .3 0 .3.1l1 1.7c.1.1 0 .2-.1.3l-1.1.8v1l1.1.8M20.5 19c0-.8-.7-1.5-1.5-1.5s-1.5.7-1.5 1.5.7 1.5 1.5 1.5 1.5-.7 1.5-1.5z"/></svg>

After

Width:  |  Height:  |  Size: 681 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 12.13V10h2v.3c-.22.12-.43.26-.61.44L18 12.13M9.5 11c-.28 0-.5.22-.5.5V13h6v-1.5c0-.28-.22-.5-.5-.5h-5M6 10H4v11h7v-1.87l.13-.13H6v-9m15-1H3V3h18v6m-2-4H5v2h14V5m-6 14.96V22h2.04l6.13-6.12-2.04-2.05L13 19.96m9.85-6.49-1.32-1.32c-.2-.2-.53-.2-.72 0l-.98.98 2.04 2.04.98-.98c.2-.19.2-.52 0-.72z"/></svg>

After

Width:  |  Height:  |  Size: 373 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 10.3V8H4v13h7v-1.87l8.39-8.39c.18-.18.39-.32.61-.44M15 13H9v-1.5c0-.28.22-.5.5-.5h5c.28 0 .5.22.5.5V13m6-6H3V3h18v4m1.85 7.19-.98.98-2.04-2.04.98-.98c.19-.2.52-.2.72 0l1.32 1.32c.2.2.2.53 0 .72m-3.72-.36 2.04 2.04L15.04 22H13v-2.04l6.13-6.13z"/></svg>

After

Width:  |  Height:  |  Size: 324 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.5 11c.28 0 .5.22.5.5V13H9v-1.5c0-.28.22-.5.5-.5h5m5.5 2.55V10h-2v3.06c.69.08 1.36.25 2 .49M21 9H3V3h18v6m-2-4H5v2h14V5M8.85 19H6v-9H4v11h5.78c-.24-.39-.46-.81-.64-1.25L8.85 19M17 18c-.56 0-1 .44-1 1s.44 1 1 1 1-.44 1-1-.44-1-1-1m6 1c-.94 2.34-3.27 4-6 4s-5.06-1.66-6-4c.94-2.34 3.27-4 6-4s5.06 1.66 6 4m-3.5 0a2.5 2.5 0 0 0-5 0 2.5 2.5 0 0 0 5 0z"/></svg>

After

Width:  |  Height:  |  Size: 428 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 7H3V3h18v4M9.14 19.75c.18.44.4.86.64 1.25H4V8h16v5.55c-.94-.36-1.95-.55-3-.55-3.5 0-6.57 2.06-7.86 5.25l-.29.75.29.75M9 13h6v-1.5c0-.28-.22-.5-.5-.5h-5c-.28 0-.5.22-.5.5V13m8 5c-.56 0-1 .44-1 1s.44 1 1 1 1-.44 1-1-.44-1-1-1m6 1c-.94 2.34-3.27 4-6 4s-5.06-1.66-6-4c.94-2.34 3.27-4 6-4s5.06 1.66 6 4m-3.5 0a2.5 2.5 0 0 0-5 0 2.5 2.5 0 0 0 5 0z"/></svg>

After

Width:  |  Height:  |  Size: 423 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.5 11c.17 0 .32.09.41.22-.35.54-.57 1.14-.65 1.78H9v-1.5c0-.28.22-.5.5-.5h5M13 19H6v-9H4v11h9.03c-.03-.1-.03-.2-.03-.3V19m8-10H3V3h18v6m-2-4H5v2h14V5m2.8 11h-4.3v-2.5c0-.8.7-1.3 1.5-1.3s1.5.5 1.5 1.3v.5h1.3v-.5c0-1.4-1.4-2.5-2.8-2.5s-2.8 1.1-2.8 2.5V16c-.6 0-1.2.6-1.2 1.2v3.5c0 .7.6 1.3 1.2 1.3h5.5c.7 0 1.3-.6 1.3-1.2v-3.5c0-.7-.6-1.3-1.2-1.3z"/></svg>

After

Width:  |  Height:  |  Size: 426 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 7H3V3h18v4m-2 2c.34 0 .68.04 1 .11V8H4v13h9.03c-.03-.1-.03-.2-.03-.3v-3.5c0-.96.5-1.86 1.2-2.46V13.5c0-.17.04-.33.06-.5H9v-1.5c0-.28.22-.5.5-.5h5c.17 0 .32.09.41.22A4.887 4.887 0 0 1 19 9m2.8 7h-4.3v-2.5c0-.8.7-1.3 1.5-1.3s1.5.5 1.5 1.3v.5h1.3v-.5c0-1.4-1.4-2.5-2.8-2.5s-2.8 1.1-2.8 2.5V16c-.6 0-1.2.6-1.2 1.2v3.5c0 .7.6 1.3 1.2 1.3h5.5c.7 0 1.3-.6 1.3-1.2v-3.5c0-.7-.6-1.3-1.2-1.3z"/></svg>

After

Width:  |  Height:  |  Size: 464 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15 12.06c-.21.29-.36.61-.5.94H9v-1.5c0-.28.22-.5.5-.5h5c.28 0 .5.22.5.5v.56M21 9H3V3h18v6m-2-4H5v2h14V5m-6 14H6v-9H4v11h9.03c-.03-.1-.03-.2-.03-.3V19m10-1.7v3.5c0 .6-.6 1.2-1.3 1.2h-5.5c-.6 0-1.2-.6-1.2-1.3v-3.5c0-.6.6-1.2 1.2-1.2v-1.5c0-1.4 1.4-2.5 2.8-2.5s2.8 1.1 2.8 2.5V16c.6 0 1.2.6 1.2 1.3m-2.5-2.8c0-.8-.7-1.3-1.5-1.3s-1.5.5-1.5 1.3V16h3v-1.5z"/></svg>

After

Width:  |  Height:  |  Size: 429 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 7H3V3h18v4M9.5 11h5c.28 0 .5.22.5.5v.56A4.922 4.922 0 0 1 19 10c.34 0 .68.04 1 .11V8H4v13h9.03c-.03-.1-.03-.2-.03-.3v-3.5c0-.96.5-1.86 1.2-2.46v-.24c0-.5.12-1.03.3-1.5H9v-1.5c0-.28.22-.5.5-.5M23 17.3v3.5c0 .6-.6 1.2-1.3 1.2h-5.5c-.6 0-1.2-.6-1.2-1.3v-3.5c0-.6.6-1.2 1.2-1.2v-1.5c0-1.4 1.4-2.5 2.8-2.5s2.8 1.1 2.8 2.5V16c.6 0 1.2.6 1.2 1.3m-2.5-2.8c0-.8-.7-1.3-1.5-1.3s-1.5.5-1.5 1.3V16h3v-1.5z"/></svg>

After

Width:  |  Height:  |  Size: 475 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.5 11c.22 0 .4.14.47.33A5.43 5.43 0 0 0 13.63 13H9v-1.5c0-.28.22-.5.5-.5h5M21 9H3V3h18v6m-2-4H5v2h14V5M6 19v-9H4v11h11.19c-.41-.6-.83-1.28-1.19-2H6m16-3.5c0 2.6-3.5 6.5-3.5 6.5S15 18.1 15 15.5c0-1.9 1.6-3.5 3.5-3.5s3.5 1.6 3.5 3.5m-2.3.1c0-.6-.6-1.2-1.2-1.2s-1.2.5-1.2 1.2c0 .6.5 1.2 1.2 1.2s1.3-.6 1.2-1.2z"/></svg>

After

Width:  |  Height:  |  Size: 388 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 7H3V3h18v4m-7.37 6H9v-1.5c0-.28.22-.5.5-.5h5c.22 0 .4.14.47.33.96-.83 2.2-1.33 3.53-1.33.5 0 1 .08 1.5.22V8H4v13h11.19C14.12 19.43 13 17.35 13 15.5c0-.89.23-1.74.63-2.5M22 15.5c0 2.6-3.5 6.5-3.5 6.5S15 18.1 15 15.5c0-1.9 1.6-3.5 3.5-3.5s3.5 1.6 3.5 3.5m-2.3.1c0-.6-.6-1.2-1.2-1.2s-1.2.5-1.2 1.2c0 .6.5 1.2 1.2 1.2s1.3-.6 1.2-1.2z"/></svg>

After

Width:  |  Height:  |  Size: 411 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 19c0 .7.13 1.37.35 2H4V10h2v9h7m6-6c.34 0 .67.04 1 .09V10h-2v3.09c.33-.05.66-.09 1-.09m-9.5-2c-.28 0-.5.22-.5.5V13h6v-1.5c0-.28-.22-.5-.5-.5h-5M21 9H3V3h18v6m-2-4H5v2h14V5m-4 13v2h8v-2h-8z"/></svg>

After

Width:  |  Height:  |  Size: 270 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 13c.34 0 .67.04 1 .09V8H4v13h9.35c-.22-.63-.35-1.3-.35-2 0-3.31 2.69-6 6-6M9 13v-1.5c0-.28.22-.5.5-.5h5c.28 0 .5.22.5.5V13H9m12-6H3V3h18v4m2 11v2h-8v-2h8z"/></svg>

After

Width:  |  Height:  |  Size: 236 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 3H3v6h18V3m-2 4H5V5h14v2m-1 4v-1h2v1h-2m-3.5 0c.28 0 .5.22.5.5V13H9v-1.5c0-.28.22-.5.5-.5h5m-1.24 8c-.17.47-.26.97-.26 1.5 0 .17 0 .34.03.5H4V10h2v9h7.26M22 13v2h-2v5.5a2.5 2.5 0 0 1-5 0 2.5 2.5 0 0 1 3.5-2.29V13H22z"/></svg>

After

Width:  |  Height:  |  Size: 298 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.5 16.11V11H20V8H4v13h9.03c-.03-.16-.03-.33-.03-.5 0-2.14 1.5-3.93 3.5-4.39M9 13v-1.5c0-.28.22-.5.5-.5h5c.28 0 .5.22.5.5V13H9m12-6H3V3h18v4m1 6v2h-2v5.5a2.5 2.5 0 0 1-5 0 2.5 2.5 0 0 1 3.5-2.29V13H22z"/></svg>

After

Width:  |  Height:  |  Size: 281 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m8.2 5-2-2H21v6h-8.8l-2-2H19V5H8.2M20 16.8V10h-2v4.8l2 2m0 2.55v-.01l-2-2v.01L9.66 9l-2-2-1.53-1.53-3.74-3.74L1.11 3 3 4.89V9h4.11l10 10H6v-9H4v11h15.11l1.73 1.73 1.27-1.27L20 19.35z"/></svg>

After

Width:  |  Height:  |  Size: 260 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m10.2 7-4-4H21v4H10.2M20 8h-8.8l8.8 8.8V8m0 11.35v-.01L8.66 8l-1-1-5.27-5.27L1.11 3 3 4.89V7h2.11l1 1H4v13h15.11l1.73 1.73 1.27-1.27L20 19.35z"/></svg>

After

Width:  |  Height:  |  Size: 220 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 13.09V10h2v3.09c-.33-.05-.66-.09-1-.09-.34 0-.67.04-1 .09M9.5 11c-.28 0-.5.22-.5.5V13h6v-1.5c0-.28-.22-.5-.5-.5h-5M21 9H3V3h18v6m-2-4H5v2h14V5M6 19v-9H4v11h9.35c-.22-.63-.35-1.3-.35-2H6m14-1v-3h-2v3h-3v2h3v3h2v-3h3v-2h-3z"/></svg>

After

Width:  |  Height:  |  Size: 303 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 7H3V3h18v4m-8 12c0 .7.13 1.37.35 2H4V8h16v5.09c-.33-.05-.66-.09-1-.09-3.31 0-6 2.69-6 6m2-6v-1.5c0-.28-.22-.5-.5-.5h-5c-.28 0-.5.22-.5.5V13h6m5 5v-3h-2v3h-3v2h3v3h2v-3h3v-2h-3z"/></svg>

After

Width:  |  Height:  |  Size: 258 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 12.03V10h2v2.18c-.5-.11-1-.18-1.5-.18-.17 0-.33 0-.5.03M9.5 11c-.28 0-.5.22-.5.5V13h6v-1.5c0-.28-.22-.5-.5-.5h-5M6 19v-9H4v11h8.5c-.26-.62-.41-1.3-.47-2H6M21 9H3V3h18v6m-2-4H5v2h14V5m3 13.5v-4l-1.17 1.17A3.99 3.99 0 0 0 18 14.5c-2.21 0-4 1.79-4 4s1.79 4 4 4c1.68 0 3.12-1.03 3.71-2.5H20a2.5 2.5 0 1 1-.23-3.27L18 18.5h4z"/></svg>

After

Width:  |  Height:  |  Size: 402 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.5 12c.5 0 1 .07 1.5.18V8H4v13h8.5a6.5 6.5 0 0 1 6-9M9 13v-1.5c0-.28.22-.5.5-.5h5c.28 0 .5.22.5.5V13H9m12-6H3V3h18v4m-3 11.5 1.77-1.77A2.5 2.5 0 1 0 20 20h1.71A3.991 3.991 0 0 1 18 22.5c-2.21 0-4-1.79-4-4s1.79-4 4-4c1.11 0 2.11.45 2.83 1.17L22 14.5v4h-4z"/></svg>

After

Width:  |  Height:  |  Size: 335 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 13.09V10h2v3.09c-.33-.05-.66-.09-1-.09-.34 0-.67.04-1 .09M14.5 11h-5c-.28 0-.5.22-.5.5V13h6v-1.5c0-.28-.22-.5-.5-.5M6 19v-9H4v11h9.35c-.22-.63-.35-1.3-.35-2H6M21 9H3V3h18v6m-2-4H5v2h14V5m3.54 11.88-1.42-1.41L19 17.59l-2.12-2.12-1.41 1.41L17.59 19l-2.12 2.12 1.41 1.42L19 20.41l2.12 2.13 1.42-1.42L20.41 19l2.13-2.12z"/></svg>

After

Width:  |  Height:  |  Size: 398 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 7H3V3h18v4m-8 12c0 .7.13 1.37.35 2H4V8h16v5.09c-.33-.05-.66-.09-1-.09-3.31 0-6 2.69-6 6m2-6v-1.5c0-.28-.22-.5-.5-.5h-5c-.28 0-.5.22-.5.5V13h6m7.54 3.88-1.42-1.41L19 17.59l-2.12-2.12-1.41 1.41L17.59 19l-2.12 2.12 1.41 1.42L19 20.41l2.12 2.13 1.42-1.42L20.41 19l2.13-2.12z"/></svg>

After

Width:  |  Height:  |  Size: 352 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.04 10c-.4.25-.78.55-1.14.9-.33.34-.63.71-.87 1.1H8v-1.5c0-.28.22-.5.5-.5h4.54M20 8H2V2h18v6m-2-4H4v2h14V4M5 18V9H3v11h8.82a6.44 6.44 0 0 1-1.32-2H5m18.39 3L22 22.39l-3.12-3.07c-.69.43-1.51.68-2.38.68-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5c0 .88-.25 1.71-.69 2.4l3.08 3.1M19 15.5a2.5 2.5 0 0 0-5 0 2.5 2.5 0 0 0 5 0z"/></svg>

After

Width:  |  Height:  |  Size: 406 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 6H2V2h18v4m-8.97 6H8v-1.5c0-.28.22-.5.5-.5h4.54c1.8-1.13 4.03-1.3 5.96-.5V7H3v13h8.82c-2.12-2.2-2.38-5.5-.79-8m12.36 9L22 22.39l-3.12-3.07c-.69.43-1.51.68-2.38.68-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5c0 .88-.25 1.71-.69 2.4l3.08 3.1M19 15.5a2.5 2.5 0 0 0-5 0 2.5 2.5 0 0 0 5 0z"/></svg>

After

Width:  |  Height:  |  Size: 369 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 2v6h18V2H3m16 4H5V4h14v2m-1 3h2v11H4V9h2v9h12V9m-3 1.5V12H9v-1.5c0-.28.22-.5.5-.5h5c.28 0 .5.22.5.5M7 22h2v2H7v-2m4 0h2v2h-2v-2m4 0h2v2h-2v-2z"/></svg>

After

Width:  |  Height:  |  Size: 223 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 2v4H3V2h18M4 7h16v13H4V7m5 5h6v-1.5c0-.28-.22-.5-.5-.5h-5c-.28 0-.5.22-.5.5V12M7 24h2v-2H7v2m4 0h2v-2h-2v2m4 0h2v-2h-2v2z"/></svg>

After

Width:  |  Height:  |  Size: 203 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 13.09V10h2v3.09c-.33-.05-.66-.09-1-.09-.34 0-.67.04-1 .09M9.5 11c-.28 0-.5.22-.5.5V13h6v-1.5c0-.28-.22-.5-.5-.5h-5M6 19v-9H4v11h9.35c-.22-.63-.35-1.3-.35-2H6M21 9H3V3h18v6m-2-4H5v2h14V5m4 12.89-2.89-.25L19 15l-1.13 2.64-2.87.25 2.18 1.88-.68 2.81 2.5-1.49 2.45 1.49-.65-2.81 2.2-1.88z"/></svg>

After

Width:  |  Height:  |  Size: 366 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 7H3V3h18v4m-8 12c0 .7.13 1.37.35 2H4V8h16v5.09c-.33-.05-.66-.09-1-.09-3.31 0-6 2.69-6 6m2-6v-1.5c0-.28-.22-.5-.5-.5h-5c-.28 0-.5.22-.5.5V13h6m8 4.89-2.89-.25L19 15l-1.13 2.64-2.87.25 2.18 1.88-.68 2.81 2.5-1.49 2.45 1.49-.65-2.81 2.2-1.88z"/></svg>

After

Width:  |  Height:  |  Size: 321 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 11.18V10h2v1.03c-.16-.03-.33-.03-.5-.03-.5 0-1 .07-1.5.18m-3 .32c0-.28-.22-.5-.5-.5h-5c-.28 0-.5.22-.5.5V13h5.82l.18-.18V11.5M6 19v-9H4v11h10.03c-.39-.61-.68-1.28-.85-2H6M21 9H3V3h18v6m-2-4H5v2h14V5m0 8.5V12l-2.25 2.25L19 16.5V15a2.5 2.5 0 0 1 2.5 2.5c0 .4-.09.78-.26 1.12l1.09 1.09c.42-.63.67-1.39.67-2.21 0-2.21-1.79-4-4-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5c0-.4.09-.78.26-1.12l-1.09-1.09c-.42.63-.67 1.39-.67 2.21 0 2.21 1.79 4 4 4V23l2.25-2.25L19 18.5V20z"/></svg>

After

Width:  |  Height:  |  Size: 534 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 7H3V3h18v4M9.5 11h5c.28 0 .5.22.5.5v1.32A6.444 6.444 0 0 1 19.5 11c.17 0 .34 0 .5.03V8H4v13h10.03A6.42 6.42 0 0 1 13 17.5c0-1.75.69-3.33 1.82-4.5H9v-1.5c0-.28.22-.5.5-.5m9.5 2.5V12l-2.25 2.25L19 16.5V15a2.5 2.5 0 0 1 2.5 2.5c0 .4-.09.78-.26 1.12l1.09 1.09c.42-.63.67-1.39.67-2.21 0-2.21-1.79-4-4-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5c0-.4.09-.78.26-1.12l-1.09-1.09c-.42.63-.67 1.39-.67 2.21 0 2.21 1.79 4 4 4V23l2.25-2.25L19 18.5V20z"/></svg>

After

Width:  |  Height:  |  Size: 507 B

Some files were not shown because too many files have changed in this diff Show More