Merge branch 'main' into merge-26.2.2

This commit is contained in:
Veronica Berglyd Olsen
2026-10-11 19:30:07 +02:00
179 changed files with 10588 additions and 4917 deletions

View File

@@ -3,3 +3,7 @@
# Crowdin Personal Access Token scoped to at least `project.report` (Read only)
# Needed for `qtlimport --credits-since`
CROWDIN_REPORT_READ_TOKEN=
# Path for long-term cached files, like downloaded icon packs
# Used by `icons` unless `--work-dir` is set
CACHE_DIR=

View File

@@ -0,0 +1,68 @@
name: Bug Report
description: Report a bug or issue.
title: "[Bug] "
labels: ["bug", "triage"]
type: bug
body:
- type: markdown
attributes:
value: >
Thank you for taking the time to fill out this bug report.
Note that issues without a description will not be considered.
Please also check if an issue already exists on this problem.
- type: textarea
id: description
attributes:
label: Bug Description
description: Provide a clear and concise description of what happened.
placeholder: Tell us what you see.
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: Steps to Reproduce
description: Explain what to do to reproduce the issue.
placeholder: Tell us what to do.
validations:
required: true
- type: input
id: version
attributes:
label: Version
description: What version of novelWriter are you running?
placeholder: "e.g. 26.2"
validations:
required: true
- type: input
id: os
attributes:
label: Operating System
description: What operating system are you running?
placeholder: "e.g. Windows 11, macOS 26, Ubuntu 26.04"
validations:
required: true
- type: textarea
id: logs
attributes:
label: Log or Error Output
description: >
If the error dialog popped up, copy/paste the content here.
Or provide relevant log output from the console.
render: shell
validations:
required: false
- type: upload
id: screenshots
attributes:
label: Upload Screenshots
description: If applicable, add screenshots to help explain your problem.
validations:
required: false
accept: ".png,.jpg,.gif"

View File

@@ -0,0 +1,39 @@
name: Suggest Improvement
description: Suggest something that can be improved.
title: "[Improve] "
labels: ["enhancement", "triage"]
type: feature
body:
- type: markdown
attributes:
value: >
Thank you for taking the time to fill out this feature request.
Note that feature requests without a description will not be considered.
Please also check if a request already exists for this feature.
- type: textarea
id: problem
attributes:
label: The Problem
description: Explain the problem you're facing.
placeholder: Tell us about the issue.
validations:
required: true
- type: textarea
id: description
attributes:
label: Your Suggestion
description: Provide a clear and concise description of what you'd like to see.
placeholder: Tell us what you need.
validations:
required: true
- type: upload
id: screenshots
attributes:
label: Upload Screenshots
description: If applicable, add screenshots to help explain your suggestion.
validations:
required: false
accept: ".png,.jpg,.gif"

30
.github/ISSUE_TEMPLATE/03-feature.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: Feature Request
description: Suggest a new feature you'd like added.
title: "[Feat] "
labels: ["enhancement", "triage"]
type: feature
body:
- type: markdown
attributes:
value: >
Thank you for taking the time to fill out this feature request.
Note that feature requests without a description will not be considered.
Please also check if a request already exists for this feature.
- type: textarea
id: description
attributes:
label: Your Suggestion
description: Provide a clear and concise description of what you'd like to see.
placeholder: Tell us what you need.
validations:
required: true
- type: upload
id: screenshots
attributes:
label: Upload Screenshots
description: If applicable, add screenshots to help explain your idea.
validations:
required: false
accept: ".png,.jpg,.gif"

View File

@@ -1,24 +0,0 @@
---
name: Bug Report
about: Create a report to help us improve
title: ""
labels: bug
---
**Note**: Issues without a description will not be considered.
Please also check if an issue already exists on this problem.
Please provide a description covering the following points, if applicable:
* A clear and concise description of what the bug is.
* Steps to reproduce the behaviour.
* A clear and concise description of what you expected to happen.
* If applicable, add screenshots to help explain your problem.
* If the error dialog popped up, copy/paste the content here.
Please also *always* include the following information:
* The operating system you are using, and if Linux, also the distro.
* The version of novelWriter you are using.
* How and from where you installed novelWriter.
Issues without this required information will be closed.

5
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: GitHub Community Support
url: https://github.com/saga-soft/novelWriter/discussions
about: Please ask and answer questions here.

View File

@@ -1,15 +0,0 @@
---
name: Feature Request
about: Suggest an idea for this project
title: ""
labels: enhancement
---
**Note**: Feature requests without a description will not be considered.
Please also check if an issue already exists on this feature.
Please provide a description covering the following points, if applicable:
* A clear and concise description of what the problem is. Ex. I'm always frustrated when ...
* A clear and concise description of what you want to happen.
* A clear and concise description of any alternative solutions or features you've considered.
* If applicable, add screenshots to help explain your request.

View File

@@ -1,17 +1,14 @@
<!--
Please check the following before you make a pull request:
* The branch you are making the pull request from (in your own fork) has a unique and descriptive
name. Do not make a pull request directly from your copy of `main` or `release`.
* Make sure your contribution follows the style guide and other requirements mentioned in the
CONTRIBUTING.md file in the repository.
* Fill in the Summary section below, and if relevant, mention the issue numbers related to the PR.
-->
### Summary
### Related Issue(s)
<!-- i.e. Closes #1234 -->
### Submitter's Checklist
* [ ] I am familiar with, and have followed, the [Contributing Guide](https://github.com/saga-soft/novelWriter/blob/main/CONTRIBUTING.md)
* [ ] I am familiar with, and have followed, the [AI Policy](https://github.com/saga-soft/novelWriter/blob/main/AI_POLICY.md)
### Reviewer's Checklist
* [ ] The header of all files contain a reference to the repository license

View File

@@ -11,6 +11,8 @@ on:
concurrency:
group: auto-approve-${{ github.event.pull_request.number }}
permissions: {}
jobs:
approve:
name: Approve Owner PRs

View File

@@ -5,9 +5,6 @@ on: workflow_dispatch
jobs:
buildAssets:
uses: ./.github/workflows/part_assets.yml
with:
icons-free: true
icons-non-free: true
permissions:
contents: read

View File

@@ -5,9 +5,6 @@ on: workflow_dispatch
jobs:
buildAssets:
uses: ./.github/workflows/part_assets.yml
with:
icons-free: true
icons-non-free: true
permissions:
contents: read

View File

@@ -47,9 +47,6 @@ on:
jobs:
buildAssets:
uses: ./.github/workflows/part_assets.yml
with:
icons-free: true
icons-non-free: true
permissions:
contents: read

View File

@@ -5,9 +5,6 @@ on: workflow_dispatch
jobs:
buildAssets:
uses: ./.github/workflows/part_assets.yml
with:
icons-free: true
icons-non-free: true
permissions:
contents: read

26
.github/workflows/build_pypi.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: Build PyPI
on:
workflow_dispatch:
inputs:
publish:
required: false
description: "Publish to PyPI?"
type: boolean
default: false
jobs:
buildAssets:
uses: ./.github/workflows/part_assets.yml
permissions:
contents: read
buildAndPublish-PyPI:
name: PyPI Package
needs: buildAssets
uses: ./.github/workflows/part_pypi.yml
with:
publish: ${{ inputs.publish }}
permissions:
id-token: write
contents: read

View File

@@ -5,9 +5,6 @@ on: workflow_dispatch
jobs:
buildAssets:
uses: ./.github/workflows/part_assets.yml
with:
icons-free: true
icons-non-free: true
permissions:
contents: read

View File

@@ -2,13 +2,6 @@ name: Part Assets
on:
workflow_call:
inputs:
icons-free:
required: true
type: boolean
icons-non-free:
required: true
type: boolean
jobs:
buildAssets:
@@ -26,7 +19,7 @@ jobs:
sudo apt-get install -y qttools5-dev-tools latexmk texlive texlive-latex-extra
- name: Install UV and Python
uses: astral-sh/setup-uv@v10.0.1
uses: astral-sh/setup-uv@v10.2.0
with:
python-version: "3.14"
enable-cache: true
@@ -39,16 +32,6 @@ jobs:
run: |
uv run --no-sync pkgutils.py build-assets
- name: Build Free Icons
if: ${{ inputs.icons-free }}
run: |
uv run --no-sync pkgutils.py icons free
- name: Build Non-Free Icons
if: ${{ inputs.icons-non-free }}
run: |
uv run --no-sync pkgutils.py icons non-free
- name: Upload Artifacts
uses: actions/upload-artifact@v7
with:
@@ -57,6 +40,5 @@ jobs:
novelwriter/assets/manual*.pdf
novelwriter/assets/sample.zip
novelwriter/assets/i18n/*.qm
novelwriter/assets/icons/*.icons
if-no-files-found: error
retention-days: 14

View File

@@ -16,7 +16,7 @@ jobs:
uses: actions/checkout@v7
- name: Install UV and Python
uses: astral-sh/setup-uv@v10.0.1
uses: astral-sh/setup-uv@v10.2.0
with:
python-version: "3.14"
enable-cache: true

66
.github/workflows/part_pypi.yml vendored Normal file
View File

@@ -0,0 +1,66 @@
name: Part PyPI
on:
workflow_call:
inputs:
publish:
required: false
type: boolean
default: false
jobs:
buildPackage:
name: Build PyPI Package
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout Source
uses: actions/checkout@v7
- name: Download Assets Artifact
uses: actions/download-artifact@v8
with:
name: nw-assets
path: novelwriter/assets
- name: Install UV and Python
uses: astral-sh/setup-uv@v10.2.0
with:
python-version: "3.14"
enable-cache: true
- name: Build Package
run: uv run pkgutils.py build-pypi
- name: Upload Artifacts
uses: actions/upload-artifact@v7
with:
name: nw-pypi
path: |
dist_pypi/*.whl
dist_pypi/*.tar.gz
if-no-files-found: error
retention-days: 14
publishPackage:
name: Publish to PyPI
needs: buildPackage
if: ${{ inputs.publish }}
runs-on: ubuntu-latest
environment: pypi
permissions:
id-token: write
contents: read
steps:
- name: Download Package Artifact
uses: actions/download-artifact@v8
with:
name: nw-pypi
path: dist_pypi
- name: Install UV
uses: astral-sh/setup-uv@v10.2.0
- name: Publish Package
run: uv publish dist_pypi/*

View File

@@ -21,7 +21,7 @@ jobs:
uses: actions/checkout@v7
- name: Install UV and Python
uses: astral-sh/setup-uv@v10.0.1
uses: astral-sh/setup-uv@v10.2.0
with:
enable-cache: true

View File

@@ -37,7 +37,7 @@ jobs:
sudo apt install qttools5-dev-tools
- name: Install UV and Python
uses: astral-sh/setup-uv@v10.0.1
uses: astral-sh/setup-uv@v10.2.0
with:
python-version: ${{ matrix.python-version }}
enable-cache: true
@@ -81,7 +81,7 @@ jobs:
brew install enchant
- name: Install UV and Python
uses: astral-sh/setup-uv@v10.0.1
uses: astral-sh/setup-uv@v10.2.0
with:
python-version: "3.14"
enable-cache: true
@@ -123,7 +123,7 @@ jobs:
uses: actions/checkout@v7
- name: Install UV and Python
uses: astral-sh/setup-uv@v10.0.1
uses: astral-sh/setup-uv@v10.2.0
with:
python-version: "3.14"
enable-cache: true
@@ -171,7 +171,7 @@ jobs:
merge-multiple: true
- name: Install UV
uses: astral-sh/setup-uv@v10.0.1
uses: astral-sh/setup-uv@v10.2.0
- name: Combine Coverage Data
run: |
@@ -223,7 +223,7 @@ jobs:
merge-multiple: true
- name: Install UV
uses: astral-sh/setup-uv@v10.0.1
uses: astral-sh/setup-uv@v10.2.0
- name: Combine Coverage Data
run: |

4
.gitignore vendored
View File

@@ -22,10 +22,6 @@ setup.iss
i18n/*.qm
i18n/*.qph
# Icons Themes Except Material Symbols
/novelwriter/assets/icons/*.icons
!/novelwriter/assets/icons/material_*.icons
# Documentation
/docs/build/
/docs/source/locales/**/*.mo

59
AI_POLICY.md Normal file
View File

@@ -0,0 +1,59 @@
# AI Policy
This is the AI policy of novelWriter and associated projects.
### Code Contributions
We consider code to be creative work, and we have a strong preference for feature contributions designed by actual
humans over the average and mediocre output of agentic and generative AI.
While we do not have a strict No-AI policy, we want to limit its use in this project. In general, we expect any
contributed code to hold up to maintainability and stability standards so that our users can rely on the software for
their creative work. This implies careful review, thorough test coverage, and beta testing of all features before they
reach live users. The requirements on code that isn't shipped to the user are less strict. This includes unit tests and
build tooling.
We recognise that AI tools can be useful in a developer's toolbox, alongside other tools that can edit or add code. In
addition to read-only operations, it is generally fine to use them for boilerplate, fixes, and otherwise editing and
extending existing code. However, you must not contribute fully or predominantly AI-generated features or other
bulk-generated code. This applies especially to core functionality.
In general, so-called vibe coding does not meet our code quality requirements, so this project is not suitable for such
contributions in any case. The licensing implications around generated code are also unclear, as AI models are trained
on material without consent or concern for original licensing.
No AI automation or agentic tools are used anywhere in this project on GitHub. Do not use your AI agents on your
contributions on GitHub either. Commits listed in any way as authored by, signed off by, or assisted by, AI tools are
explicitly not allowed. Pull requests containing such commits will be rejected. You should also not commit AI-specific
files into the code repository. Most of the common ones are in the git ignore file.
### Design Work
No design work generated by AI for novelWriter will be accepted. We do not control how third-party work like icon
libraries are created, but any artwork added to the app must be made by actual people.
### Translation Work
This project uses Crowdin to host the translation files for the user interface. Crowdin has a lot of AI integration and
tooling, which we do not use. The Crowdin translation interface provides AI translated suggestions, which the
translators may choose to use. All translations are proofread and approved by speakers of the respective languages.
### Application Features
We do not believe creative writing and generative AI go together. Therefore, there will not be any tooling or features
added to this project that will generate text for you. Language models have a real use case in text analysis that
predates generative AI, and such supportive tools **may** be in scope depending on how intrusive they are.
### Discussions and Comments
Please refrain from using AI to generate or respond to discussions, issues, and pull requests. Especially do not use AI
tools to generate long and verbose issue reports. It is OK to use AI for translations of comments or for accessibility
reasons. All text in the code or posted to this project must be in English.
*Last updated on 2026-10-03.*

View File

@@ -1,49 +0,0 @@
# Code of Conduct
## Purpose
This repository should be welcoming and safe for everyone participating in good faith.
All contributors and participants must be treated with respect, regardless of characteristics such
as race, ethnicity, caste, colour, age, physical characteristics, neurodiversity, disability, sex
or gender, gender identity or expression, sexual orientation, language, philosophy or religion,
national or social origin, socio-economic position, level of education, or other status.
## Expected Behaviour
1. Be respectful and constructive in pull requests, issues, discussions, and comments
2. Focus critique on ideas and code, not people
3. Assume good faith, and communicate clearly and honestly
4. Accept feedback gracefully and take responsibility for your contributions
## Unacceptable Behaviour
1. Harassment, abuse, intimidation, or threats
2. Insults, personal attacks, or demeaning language
3. Discrimination, stereotyping, or hateful conduct
4. Sexualised or otherwise inappropriate conduct
5. Sharing private or identifying information without permission
6. Impersonation, deliberate misrepresentation, or other deceptive behaviour
7. Spam or promotional content unrelated to the project
## Scope
This Code of Conduct applies to interactions in this GitHub repository, including pull requests,
issues, discussions, reviews, and comments.
## Reporting
If you believe this Code of Conduct has been violated, contact the repository owner via
[github.com/vkbo](https://github.com/vkbo).
## Enforcement
Moderation options on GitHub are limited. Depending on severity and pattern of behaviour, the owner
may edit or delete content, close or lock threads, and block users from further participation.
Content that may violate GitHub platform rules may also be reported to GitHub for review.
## Attribution
This document is adapted from the Contributor Covenant 3.0:
[https://www.contributor-covenant.org/version/3/0/](https://www.contributor-covenant.org/version/3/0/).

View File

@@ -1,21 +1,23 @@
# Contributing Guide
See also [CODE_OF_CONDUCT](CODE_OF_CONDUCT.md).
See also our [Code of Conduct](https://github.com/saga-soft/novelWriter?tab=coc-ov-file#code-of-conduct)
and our [AI Policy](https://github.com/saga-soft/novelWriter/blob/main/AI_POLICY.md).
When contributing to this repository, please first discuss the change you wish to make with the
owner. Either via the issue tracker or on the discussions page. Especially if it is regarding new
features. If you just want to make a minor correction, like fix a typo or similar, feel free to
just make a pull request directly.
maintainers. For new and complex ideas, it is better to open a discussion before adding a new
feature request. If you just want to make a minor correction, like fix a typo or similar, feel free
to just make a pull request directly.
**The following contributions are welcome:**
* Bugfixes for new or existing bugs. Please also report new bugs in the issue tracker even if you
also provide a fix. It makes it easier to keep track of what has been fixed and when.
also provide a fix. It makes it easier to keep track of what has been fixed and when and to
populate our changelog.
* Translations made via the [Crowdin project page](https://crowdin.com/project/novelwriter).
* Translations of the documentation. These need to use Sphinx i18n tooling. Please start a
discussion before beginning such work as it requires some coordination.
* Improvements to the documentation. Particularly if the documentation is unclear. Please don't
make any larger changes to the documentation without discussing them with the maintainer first.
make any larger changes to the documentation without discussing them with a maintainer first.
* Adaptations, installation or packaging features targeting specific operating systems.
* Using AI as a coding assistant is fine as long as the code is of good quality and the scope of
change is small, but do not generate large chunks of code. Generated code is not only hard to
@@ -46,7 +48,8 @@ uv sync
```
Many tasks, like building assets from source, are handled by the `pkgutils.py` helper tool.
This tool requires no dependencies, so you can either run it directly with Python, or `uv run`.
This tool requires no dependencies for most commands, so you can either run it directly with
Python, or using `uv run`.
```bash
python pkgutils.py --help
@@ -58,10 +61,10 @@ The translation files needed at runtime can be built with:
python pkgutils.py qtlrelease
```
Material design icons are included with the source. Optional icon themes can be built with:
Default icon themes can be updated with:
```bash
python pkgutils.py icons optional
python pkgutils.py icons default
```
@@ -72,7 +75,7 @@ python pkgutils.py icons optional
code has branches that only runs on some OSes, they only need to be covered when test are run on
that OS. The test suite runs on Linux, Windows and MacOS.
* It is ok to use `pragma` comments with `no cover` and `no branch` if the code is not expected to
touch those areas or branches.
touch those areas or branches at runtime.
A helper script is provided for running tests. It simplifies coverage reporting and a few other
things. Run the following to see all details:
@@ -81,13 +84,21 @@ things. Run the following to see all details:
uv run run_tests.py --help
```
For instance, this command will run all tests off screen (`-o`), generate a coverage XML report for
your code editor (`-r`), and produce a terminal report with all missing lines and branches (`-l`).
```bash
uv run run_tests.py -orl
```
## Picking the Correct Branch for a Pull Request
Pre-releases are made from the `main` branch, and full releases are made from the `release` branch.
If you are submitting a fix to a current release you must do so from the `release` branch. If you
make such a fix on the `main` branch, **it cannot be included in a patch release**. This also
applies to the documentation for the latest release published on the main website.
Pre-releases are generally made from the `main` branch, and full releases are always made from the
`release` branch. If you are submitting a fix to a current release you must do so from the
`release` branch. If you make such a fix on the `main` branch, **it cannot be included in a patch
release**. This also applies to the documentation for the latest release published on the main
website.
New features are only added in full releases, so a feature pull request must be made to the `main`
branch. However, if the `main` branch is very close to a new full release, pull requests may not be
@@ -95,7 +106,7 @@ merged until the release is completed.
This project uses GitHub milestones to plan releases, and only pull requests included in the
current release cycle will be merged to `main`. Milestone tickets are not set in stone and are
often moved to other milestones.
often moved to the next milestones.
### Pull Request Check List
@@ -107,9 +118,10 @@ Make sure the pull request follows these rules:
branch. The same applies to the `release` branch.
* Please provide a description of the changes in the pull request under the summary section of the
pull request template, and reference any related issues by providing the issue number. Do not
post links to issue numbers as that breaks the integration. Stating the issue number is enough.
* Do not change the version number.
* Make sure the formatting and linting tools have been run before the pull request is made.
post links to issue numbers as that breaks the integration. Stating the issue number on the form
`Closes #1234` is enough.
* Do not change the version number. This is done during the release process.
* Make sure the formatting and linting tools have been run locally before the pull request is made.
## Code Style
@@ -141,6 +153,6 @@ uv run pyright
* All comments and docstrings in the code must be in English.
* All text presented to the user must be wrapped in calls to Qt's translation framework, and the
spelling of this text *must* be British English. US English spelling *is not allowed* for these
strings.
spelling of this text **must** be British English. US English spelling **is not allowed** for
these strings. A US English translation is provided via the translation framework.
* Commit descriptions and pull requests must also be in English.

View File

@@ -62,16 +62,11 @@ The following libraries are dependencies of novelWriter:
## Icon Themes
The default icon theme is a subset of icons from:
The default icon themes are subsets of icons from:
* **Material Symbols** by Google Inc (Apache 2.0)
Additional icon themes may or may not be bundled with novelWriter, depending on license
constraints. These themes include a subset of icons from:
* **Font Awesome** by Fonticons Inc (CC BY 4.0)
* **Remix** by RemixIcon (Apache 2.0 w/non-free clause)
* **Fluent UI** by Microsoft (MIT License)
* **Lucide** by Cole Bemis and Lucide Contributors (ISC License)
* **Material Symbols** by Google Inc (Apache 2.0)
## Colour Themes

View File

@@ -41,8 +41,8 @@ _This project is developed and maintained with care by actual humans._
## Implementation
novelWriter is written in Python and uses Qt6 with PyQt6 Python binding as the UI framework. It is
released on Linux, Windows and MacOS. It can in principle run on any Operating System that also
novelWriter is written in Python and uses Qt6 with PyQt6 Python binding as the UI framework. It
runs on Linux, Windows and MacOS. It can in principle run on any Operating System that also
supports Qt, PyQt and Python.
<p align="center">
@@ -57,17 +57,18 @@ You can make a feature request in the [issues tracker](https://github.com/saga-s
or if the idea isn't fully formed, start a [discussion](https://github.com/saga-soft/novelWriter/discussions).
Please also don't make pull requests to reformat or rewrite existing code unless there is a very
good reason for doing so. Please do not submit AI generated content.
See our [AI Policy](https://github.com/saga-soft/novelWriter/blob/main/AI_POLICY.md) for details.
Fixes and patches are welcome. Contributions related to packaging and installing novelWriter will
also be appreciated, but please make an issue or a discussion topic first. Before contributing any
code, please also read the full
code, please read the full
[Contributing Guide](https://github.com/saga-soft/novelWriter/blob/main/CONTRIBUTING.md).
Project credits are available in [CREDITS.md](https://github.com/saga-soft/novelWriter/blob/main/CREDITS.md).
**Note:** New features and pre-releases are made on the `main` branch. Full releases are made from
the `release` branch. So if you're submitting a fix to a current release, **including changes to
documentation**, they must be made to the `release` branch.
**Note:** New features and most pre-releases are made on the `main` branch. Full releases are made
from the `release` branch. So if you're submitting a fix to a current release, **including changes
to documentation**, they must be made to the `release` branch.
### Translations

View File

@@ -34,7 +34,7 @@ Main Window Shortcuts
":kbd:`Ctrl+Shift+T`", "Switch focus to the outline view"
":kbd:`Ctrl+Shift+W`", "Close the current project"
":kbd:`Shift+F1`", "Open the local user manual (PDF) if it is available"
":kbd:`Shift+F6`", "Open the **Project Details** dialog"
":kbd:`Shift+F8`", "Toggle tree pane visibility"
Project Tree Shortcuts
@@ -157,7 +157,7 @@ a key or key combination for the inserted content.
":kbd:`Ctrl+K`, :kbd:`_`", "Insert a long dash (em dash)"
":kbd:`Ctrl+K`, :kbd:`.`", "Insert an ellipsis"
":kbd:`Ctrl+K`, :kbd:`'`", "Insert a modifier apostrophe"
":kbd:`Ctrl+K`, :kbd:`*`", "Insert a list bullet"
":kbd:`Ctrl+K`, :kbd:`*`", "Insert a bullet symbol"
":kbd:`Ctrl+K`, :kbd:`%`", "Insert a per mille symbol"
":kbd:`Ctrl+K`, :kbd:`~`", "Insert a figure dash (same width as a number)"
":kbd:`Ctrl+K`, :kbd:`−`", "Insert a short dash (en dash)"

View File

@@ -23,6 +23,7 @@ For all counts, the following rules apply.
#. Any line starting with ``%`` or ``@`` is ignored.
#. Trailing white spaces are ignored, including line breaks.
#. Leading ``>`` and trailing ``<`` are ignored with any spaces next to them.
#. Leading list markers ``*`` and ``#.`` are ignored.
#. Valid shortcodes and other commands wrapped in brackets ``[]`` are ignored.
#. In-line Markdown syntax in text paragraphs is treated as part of the text.

View File

@@ -7,11 +7,7 @@ Basic Formatting
.. _Markdown: https://en.wikipedia.org/wiki/Markdown
The basic text formatting syntax of novelWriter is based on Markdown_. It is only a subset of the
Markdown syntax though. Lists, images, and links are not supported.
That said, URLs in the text should automatically be highlighted and become clickable. However, only
URLs starting with "http" or "https" are recognised. In the editor, you must hold down the
:kbd:`Ctrl` key when clicking a URL to follow it.
Markdown syntax though. Images are not supported, and list support is limited.
.. _docs_usage_basics_paragraphs:
@@ -102,6 +98,65 @@ In general, the following rules apply:
.. tip::
novelWriter supports standard escape syntax for the emphasis markup characters in case the
editor misunderstands your intended usage of them. That is, ``\*``, ``\_`` and ``\~`` will
generate a plain ``*``, ``_`` and ``~``, respectively, without interpreting them as part of the
markup.
editor misunderstands your intended usage of them. That is, ``\*``, ``\_``, ``\#`` and ``\~``
will generate a plain ``*``, ``_``, ``#`` and ``~``, respectively, without interpreting them as
part of the markup.
.. _docs_usage_basics_links:
Markdown Links
==============
Bare URLs in the text should automatically be highlighted and become clickable. However, only
URLs starting with "http", "https" or "file" are recognised. In the editor, you must hold down the
:kbd:`Ctrl` key when clicking a URL to follow it.
You can also use Markdown URL formatting to make them clickable text.
:bdg-info:`Example`
.. code-block:: md
Text with a [link](https://example.com) in it.
It can also link to a [local file](file:///path/to/a/file) on your computer.
.. note::
A link can't contain spaces or parentheses. Replace them with ``%20``, ``%28`` and ``%29``. The
link dialog from the link button in the format toolbar does this for you.
.. _docs_usage_basics_lists:
Markdown Lists
==============
novelWriter supports single level lists with either bullet or numbered style. Nested lists are not
currently supported. The editor will highlight the list marker when it is correctly used. When you
press :kbd:`Enter` on a list item, the next line gets the same marker. Pressing :kbd:`Enter` on an
empty item removes the marker and ends the list.
List items in the same list must be kept together. An empty line closes the list object, so you
must add a blank line before starting the next text paragraph. A blank line before the list is not
strictly required, but recommended for clarity.
Numbered lists always start at 1 and count up until the list ends. A new list starts at 1 again.
:bdg-info:`Example`
.. code-block:: md
Bullet point list:
* List item 1
* List item 2
* List item 3
Numbered list:
#. List item 1
#. List item 2
#. List item 3

View File

@@ -229,8 +229,8 @@ Electronic Publication E-book (EPub)
Standard/Extended Markdown
The Markdown format comes in both Standard and Extended flavour. The *only* difference in terms
of novelWriter functionality is the support for strike through text, which is not supported by
the Standard flavour.
of novelWriter functionality is the support for strike through and highlighted text, which is
not supported by the Standard flavour.
novelWriter Markup
This is simply a concatenation of the project documents selected by the filters into a ``.txt``

View File

@@ -34,9 +34,7 @@ right-clicking it and selecting the **Remove Project** option.
Project-specific settings are available in **Project Settings** in the **Project** menu. See
further details below in the :ref:`docs_ui_projects_settings` section.
Details about the project's novel text, including word counts, and a table of contents with word
and page counts, is available through the **Novel Details** dialog. Statistics about the project
is also available in the **Manuscript Build** tool.
Statistics about the project are available in the **Manuscript Build** tool.
Template Projects

View File

@@ -602,6 +602,26 @@
<source>Project Note</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Note</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Story Structure</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Story</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Synopsis</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Root Folder</source>
@@ -657,61 +677,11 @@
<source>Focus</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Story</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Mentions</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Level</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Document</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Line</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Status</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Chars</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Words</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Pars</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>POV</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Synopsis</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>Open Document (.odt)</source>
@@ -1675,6 +1645,11 @@
<source>Markdown Highlight</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/editor/edittoolbar.py"/>
<source>Markdown Link</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/editor/edittoolbar.py"/>
<source>Shortcode Bold</source>
@@ -1728,11 +1703,6 @@
<source>Show Comments</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/editor/footer.py"/>
<source>Synopsis</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/editor/footer.py"/>
<source>Show Synopsis Comments</source>
@@ -1841,6 +1811,24 @@
<translation type="unfinished"/>
</message>
</context>
<context>
<name>GuiEditLink</name>
<message>
<location filename="../novelwriter/dialogs/editlink.py"/>
<source>Link</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/dialogs/editlink.py"/>
<source>Link Text</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/dialogs/editlink.py"/>
<source>URL</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>GuiItemDetails</name>
<message>
@@ -2032,11 +2020,6 @@
<source>Project Settings</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/mainmenu.py"/>
<source>Novel Details</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/mainmenu.py"/>
<source>Rename Item</source>
@@ -2159,7 +2142,7 @@
</message>
<message>
<location filename="../novelwriter/gui/mainmenu.py"/>
<source>Go to Outline</source>
<source>Go to Story View</source>
<translation type="unfinished"/>
</message>
<message>
@@ -2427,6 +2410,11 @@
<source>Highlight</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/mainmenu.py"/>
<source>Link</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/mainmenu.py"/>
<source>Wrap Double Quotes</source>
@@ -2847,24 +2835,6 @@
<translation type="unfinished"/>
</message>
</context>
<context>
<name>GuiNovelDetails</name>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Novel Details</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Overview</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Contents</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>GuiNovelToolBar</name>
<message>
@@ -2932,84 +2902,20 @@
</message>
</context>
<context>
<name>GuiOutlineDetails</name>
<name>GuiOutlineViewSettings</name>
<message>
<location filename="../novelwriter/gui/outline.py"/>
<source>Title</source>
<location filename="../novelwriter/story/outline.py"/>
<source>Outline View Settings</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/outline.py"/>
<source>Chapter</source>
<location filename="../novelwriter/story/outline.py"/>
<source>Content</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/outline.py"/>
<source>Scene</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/outline.py"/>
<source>Section</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/outline.py"/>
<source>Document</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/outline.py"/>
<source>Status</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/outline.py"/>
<source>Synopsis</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/outline.py"/>
<source>Title Details</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/outline.py"/>
<source>Reference Tags</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>GuiOutlineHeaderMenu</name>
<message>
<location filename="../novelwriter/gui/outline.py"/>
<source>Select Columns</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>GuiOutlineToolBar</name>
<message>
<location filename="../novelwriter/gui/outline.py"/>
<source>Outline of</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/outline.py"/>
<source>Refresh</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/outline.py"/>
<source>Export CSV</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>GuiOutlineTree</name>
<message>
<location filename="../novelwriter/gui/outline.py"/>
<source>Save Outline As</source>
<location filename="../novelwriter/story/outline.py"/>
<source>General</source>
<translation type="unfinished"/>
</message>
</context>
@@ -3195,11 +3101,6 @@
<source>How often the document is automatically saved.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py"/>
<source>seconds</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py"/>
<source>Save project interval</source>
@@ -3305,11 +3206,6 @@
<source>User activity includes typing and changing the content.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py"/>
<source>minutes</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py"/>
<source>Writing</source>
@@ -3330,11 +3226,6 @@
<source>Set to 0 to disable this feature.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py"/>
<source>px</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/dialogs/preferences.py"/>
<source>Maximum text width in "Focus Mode"</source>
@@ -4000,7 +3891,7 @@
</message>
<message>
<location filename="../novelwriter/gui/sidebar.py"/>
<source>Novel Outline View</source>
<source>Story View</source>
<translation type="unfinished"/>
</message>
<message>
@@ -4008,11 +3899,6 @@
<source>Switch Colour Theme</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/sidebar.py"/>
<source>Novel Details</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/gui/sidebar.py"/>
<source>Writing Statistics</source>
@@ -4029,6 +3915,102 @@
<translation type="unfinished"/>
</message>
</context>
<context>
<name>GuiStorySettingsBase</name>
<message>
<location filename="../novelwriter/story/storyviewbase.py"/>
<source>Name</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyviewbase.py"/>
<source>Do you want to save your changes to '{0}'?</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>GuiStoryView</name>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Story View</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Export the story view data</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Manage Views</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Add a new view</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Delete current view</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Duplicate current view</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Edit current view</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Refresh</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Refresh current view</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Highlight Reference</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Delete view '{0}'?</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Save Outline As</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Title</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Document</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Line</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storyview.py"/>
<source>Status</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>GuiWelcome</name>
<message>
@@ -4384,6 +4366,14 @@
<translation type="unfinished"/>
</message>
</context>
<context>
<name>OutlineModel</name>
<message>
<location filename="../novelwriter/models/outlinemodel.py"/>
<source>Page {0}</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>ProjectBuilder</name>
<message>
@@ -4598,6 +4588,137 @@
<translation type="unfinished"/>
</message>
</context>
<context>
<name>StoryViews</name>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Outline</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Appearance</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Use syntax colours</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Row height</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Documents</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Show partitions</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Show chapters</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Show scenes</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Show sections</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Progression</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Show story progression</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Count per page</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Clear double page</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Relative to project target</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Columns</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Characters</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Plot</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>World</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/story/storysettings.py"/>
<source>Comments</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>Units</name>
<message>
<location filename="../novelwriter/constants.py"/>
<source>characters</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>words</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>lines</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>px</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>seconds</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/constants.py"/>
<source>minutes</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>VersionInfoWidget</name>
<message>
@@ -4637,60 +4758,45 @@
</message>
</context>
<context>
<name>_ContentsPage</name>
<name>_ColumnsPage</name>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Table of Contents</source>
<location filename="../novelwriter/story/outline.py"/>
<source>Column</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Title</source>
<location filename="../novelwriter/story/outline.py"/>
<source>Columns</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Words</source>
<location filename="../novelwriter/story/outline.py"/>
<source>Content</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Pages</source>
<location filename="../novelwriter/story/outline.py"/>
<source>Add to column</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Page</source>
<location filename="../novelwriter/story/outline.py"/>
<source>Remove from column</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Progress</source>
<location filename="../novelwriter/story/outline.py"/>
<source>Rename column</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Words per page</source>
<location filename="../novelwriter/story/outline.py"/>
<source>Add column</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>First page offset</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Chapters on odd pages</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Untitled</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>END</source>
<location filename="../novelwriter/story/outline.py"/>
<source>Remove column</source>
<translation type="unfinished"/>
</message>
</context>
@@ -5096,59 +5202,6 @@
<translation type="unfinished"/>
</message>
</context>
<context>
<name>_OverviewPage</name>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Project</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Name</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Revisions</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Editing Time</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Word Count</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>In Novels</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>In Notes</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Selected Novel</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Chapters</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../novelwriter/tools/noveldetails.py"/>
<source>Scenes</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>_PreviewWidget</name>
<message>

View File

@@ -49,9 +49,9 @@ __license__ = "GPLv3"
__author__ = "Veronica Berglyd Olsen"
__maintainer__ = "Veronica Berglyd Olsen"
__email__ = "code@vkbo.net"
__version__ = "26.2.2"
__hexversion__ = "0x260202f0"
__date__ = "2026-10-11"
__version__ = "26.3a0"
__hexversion__ = "0x260300a0"
__date__ = "2026-07-30"
__status__ = "Stable"
__domain__ = "novelwriter.io"
# fmt: on

View File

@@ -0,0 +1,144 @@
# This file is automatically generated. Do not edit.
# Meta
meta:name = Fluent UI - Filled
meta:author = Microsoft
meta:license = MIT
# Icons
icon:alert_error = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M9.04173 19.003H14.9583C14.7196 20.4211 13.486 21.5015 12 21.5015C10.514 21.5015 9.28037 20.4211 9.04173 19.003ZM12 2.00391C16.1421 2.00391 19.5 5.36177 19.5 9.50391V13.5024L20.9183 16.6625C20.9732 16.7848 21.0016 16.9174 21.0016 17.0515C21.0016 17.5762 20.5763 18.0015 20.0516 18.0015H3.95219C3.8184 18.0015 3.68613 17.9733 3.56402 17.9186C3.08515 17.7042 2.87073 17.1422 3.08511 16.6633L4.50001 13.5028L4.50011 9.49099L4.50453 9.24107C4.6436 5.21035 7.95588 2.00391 12 2.00391Z" /></svg>
icon:alert_info = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12.0016 1.99902C17.5253 1.99902 22.0031 6.47687 22.0031 12.0006C22.0031 17.5243 17.5253 22.0021 12.0016 22.0021C6.47785 22.0021 2 17.5243 2 12.0006C2 6.47687 6.47785 1.99902 12.0016 1.99902ZM12 10.5C11.5858 10.5 11.25 10.8358 11.25 11.25V16.25C11.25 16.6642 11.5858 17 12 17C12.4142 17 12.75 16.6642 12.75 16.25V11.25C12.75 10.8358 12.4142 10.5 12 10.5ZM12 9C12.5523 9 13 8.55228 13 8C13 7.44772 12.5523 7 12 7C11.4477 7 11 7.44772 11 8C11 8.55228 11.4477 9 12 9Z" /></svg>
icon:alert_question = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 2C17.523 2 22 6.478 22 12C22 17.522 17.523 22 12 22C6.477 22 2 17.522 2 12C2 6.478 6.477 2 12 2ZM12 15.5C11.4477 15.5 11 15.9477 11 16.5C11 17.0523 11.4477 17.5 12 17.5C12.5523 17.5 13 17.0523 13 16.5C13 15.9477 12.5523 15.5 12 15.5ZM12 6.75C10.4812 6.75 9.25 7.98122 9.25 9.5C9.25 9.91421 9.58579 10.25 10 10.25C10.3797 10.25 10.6935 9.96785 10.7432 9.60177L10.75 9.5C10.75 8.80964 11.3096 8.25 12 8.25C12.6904 8.25 13.25 8.80964 13.25 9.5C13.25 10.0388 13.115 10.3053 12.6051 10.8322L12.4697 10.9697C11.5916 11.8478 11.25 12.4171 11.25 13.5C11.25 13.9142 11.5858 14.25 12 14.25C12.4142 14.25 12.75 13.9142 12.75 13.5C12.75 12.9612 12.885 12.6947 13.3949 12.1678L13.5303 12.0303C14.4084 11.1522 14.75 10.5829 14.75 9.5C14.75 7.98122 13.5188 6.75 12 6.75Z" /></svg>
icon:alert_warn = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M9.13841 3.70704C10.3662 1.43109 13.6314 1.43093 14.8591 3.70704L21.6023 16.209C22.7698 18.3741 21.2018 21.0016 18.7419 21.002H5.25462C2.79479 21.0016 1.22676 18.3741 2.39426 16.209L9.13841 3.70704ZM12.0007 15C11.4486 15.0002 11.0008 15.4479 11.0007 16C11.0007 16.5522 11.4486 16.9998 12.0007 17C12.5528 16.9998 13.0007 16.5522 13.0007 16C13.0006 15.4479 12.5528 15.0002 12.0007 15ZM12.0007 7.50001C11.5867 7.50019 11.2508 7.83598 11.2507 8.25001V12.75C11.2507 13.1641 11.5867 13.4998 12.0007 13.5C12.4148 13.4998 12.7507 13.1641 12.7507 12.75V8.25001C12.7506 7.83599 12.4147 7.50021 12.0007 7.50001Z" /></svg>
icon:cls_archive = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3 4.5C3 3.67157 3.67157 3 4.5 3H19.5C20.3284 3 21 3.67157 21 4.5V6C21 6.82843 20.3284 7.5 19.5 7.5H4.5C3.67157 7.5 3 6.82843 3 6V4.5ZM4 9H20V17.25C20 19.3211 18.3211 21 16.25 21H7.75C5.67893 21 4 19.3211 4 17.25V9ZM10.25 11C9.83579 11 9.5 11.3358 9.5 11.75C9.5 12.1642 9.83579 12.5 10.25 12.5H13.75C14.1642 12.5 14.5 12.1642 14.5 11.75C14.5 11.3358 14.1642 11 13.75 11H10.25Z" /></svg>
icon:cls_character = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M8.75 6.25C8.75 4.45507 10.2051 3 12 3C13.7949 3 15.25 4.45507 15.25 6.25C15.25 8.04493 13.7949 9.5 12 9.5C10.2051 9.5 8.75 8.04493 8.75 6.25ZM5 5C3.34315 5 2 6.34315 2 8C2 9.65685 3.34315 11 5 11C6.65685 11 8 9.65685 8 8C8 6.34315 6.65685 5 5 5ZM19 5C17.3431 5 16 6.34315 16 8C16 9.65685 17.3431 11 19 11C20.6569 11 22 9.65685 22 8C22 6.34315 20.6569 5 19 5ZM9.25 11C8.2835 11 7.5 11.7835 7.5 12.75V16.5C7.5 18.9853 9.51472 21 12 21C14.4853 21 16.5 18.9853 16.5 16.5V12.75C16.5 11.7835 15.7165 11 14.75 11H9.25ZM6.60996 11.9776C6.53838 12.2227 6.5 12.4819 6.5 12.7501V16.5001C6.5 18.2242 7.29337 19.7631 8.53496 20.7715C8.45229 20.7989 8.36834 20.824 8.28317 20.8468C5.88257 21.49 3.41505 20.0654 2.77182 17.6648L2.06006 15.0085C1.80992 14.075 2.36394 13.1154 3.2975 12.8652L6.60996 11.9776ZM15.4654 20.7712C16.7068 19.7628 17.5 18.2241 17.5 16.5001V12.7501C17.5 12.4818 17.4616 12.2224 17.3899 11.9773L20.7037 12.8652C21.6373 13.1154 22.1913 14.075 21.9411 15.0085L21.2294 17.6648C20.5861 20.0654 18.1186 21.49 15.718 20.8468C15.6326 20.8239 15.5483 20.7987 15.4654 20.7712Z" /></svg>
icon:cls_custom = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M10.7878 3.10215C11.283 2.09877 12.7138 2.09876 13.209 3.10215L15.567 7.87987L20.8395 8.64601C21.9468 8.80691 22.3889 10.1677 21.5877 10.9487L17.7724 14.6676L18.6731 19.9189C18.8622 21.0217 17.7047 21.8627 16.7143 21.342L11.9984 18.8627L7.28252 21.342C6.29213 21.8627 5.13459 21.0217 5.32374 19.9189L6.2244 14.6676L2.40916 10.9487C1.60791 10.1677 2.05005 8.80691 3.15735 8.64601L8.42988 7.87987L10.7878 3.10215Z" /></svg>
icon:cls_entity = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4 4.25C4 3.00736 5.00736 2 6.25 2H14.25C15.4926 2 16.5 3.00736 16.5 4.25V9.5H17.75C18.9926 9.5 20 10.5074 20 11.75V21.25C20 21.6642 19.6642 22 19.25 22H16.5V18.25C16.5 17.5596 15.9404 17 15.25 17H8.75C8.05964 17 7.5 17.5596 7.5 18.25V22H4.75C4.33579 22 4 21.6642 4 21.25V4.25ZM15 18.5V22H12.75V18.5H15ZM11.25 18.5V22H9V18.5H11.25ZM7.5 6.5C7.5 7.05228 7.94772 7.5 8.5 7.5C9.05229 7.5 9.5 7.05228 9.5 6.5C9.5 5.94772 9.05229 5.5 8.5 5.5C7.94772 5.5 7.5 5.94772 7.5 6.5ZM8.5 12.5C7.94772 12.5 7.5 12.9477 7.5 13.5C7.5 14.0523 7.94772 14.5 8.5 14.5C9.05229 14.5 9.5 14.0523 9.5 13.5C9.5 12.9477 9.05229 12.5 8.5 12.5ZM8.5 9C7.94772 9 7.5 9.44771 7.5 10C7.5 10.5523 7.94772 11 8.5 11C9.05229 11 9.5 10.5523 9.5 10C9.5 9.44771 9.05229 9 8.5 9ZM12 5.5C11.4477 5.5 11 5.94772 11 6.5C11 7.05228 11.4477 7.5 12 7.5C12.5523 7.5 13 7.05228 13 6.5C13 5.94772 12.5523 5.5 12 5.5ZM12 12.5C11.4477 12.5 11 12.9477 11 13.5C11 14.0523 11.4477 14.5 12 14.5C12.5523 14.5 13 14.0523 13 13.5C13 12.9477 12.5523 12.5 12 12.5ZM15.5 12.5C14.9477 12.5 14.5 12.9477 14.5 13.5C14.5 14.0523 14.9477 14.5 15.5 14.5C16.0523 14.5 16.5 14.0523 16.5 13.5C16.5 12.9477 16.0523 12.5 15.5 12.5ZM12 9C11.4477 9 11 9.44771 11 10C11 10.5523 11.4477 11 12 11C12.5523 11 13 10.5523 13 10C13 9.44771 12.5523 9 12 9Z" /></svg>
icon:cls_none = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M14 4C14 4.55228 13.5523 5 13 5L11 5C10.4477 5 10 4.55228 10 4C10 3.44772 10.4477 3 11 3H13C13.5523 3 14 3.44772 14 4ZM5 11C5 10.4477 4.55228 10 4 10C3.44772 10 3 10.4477 3 11V13C3 13.5523 3.44772 14 4 14C4.55228 14 5 13.5523 5 13V11ZM19 11C19 10.4477 19.4477 10 20 10C20.5523 10 21 10.4477 21 11V13C21 13.5523 20.5523 14 20 14C19.4477 14 19 13.5523 19 13V11ZM13 21C13.5523 21 14 20.5523 14 20C14 19.4477 13.5523 19 13 19H11C10.4477 19 10 19.4477 10 20C10 20.5523 10.4477 21 11 21H13ZM7 4C7 3.44772 6.55228 3 6 3C4.34315 3 3 4.34315 3 6C3 6.55228 3.44772 7 4 7C4.55228 7 5 6.55228 5 6C5 5.44772 5.44772 5 6 5C6.55228 5 7 4.55228 7 4ZM18 3C17.4477 3 17 3.44772 17 4C17 4.55228 17.4477 5 18 5C18.5523 5 19 5.44772 19 6C19 6.55228 19.4477 7 20 7C20.5523 7 21 6.55228 21 6C21 4.34315 19.6569 3 18 3ZM7 20C7 20.5523 6.55228 21 6 21C4.34315 21 3 19.6569 3 18C3 17.4477 3.44772 17 4 17C4.55228 17 5 17.4477 5 18C5 18.5523 5.44772 19 6 19C6.55228 19 7 19.4477 7 20ZM18 21C17.4477 21 17 20.5523 17 20C17 19.4477 17.4477 19 18 19C18.5523 19 19 18.5523 19 18C19 17.4477 19.4477 17 20 17C20.5523 17 21 17.4477 21 18C21 19.6569 19.6569 21 18 21Z" /></svg>
icon:cls_novel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.5 2C5.11929 2 4 3.11929 4 4.5V19.5C4 20.8807 5.11929 22 6.5 22H19.75C20.1642 22 20.5 21.6642 20.5 21.25C20.5 20.8358 20.1642 20.5 19.75 20.5H6.5C5.94772 20.5 5.5 20.0523 5.5 19.5H19.75C20.1642 19.5 20.5 19.1642 20.5 18.75V4.5C20.5 3.11929 19.3807 2 18 2H6.5ZM8 5H16C16.5523 5 17 5.44772 17 6V7C17 7.55228 16.5523 8 16 8H8C7.44772 8 7 7.55228 7 7V6C7 5.44772 7.44772 5 8 5Z" /></svg>
icon:cls_object = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M8.99998 4.5V10.7382C8.99998 11.1132 8.90628 11.4822 8.72739 11.8117L7.53944 14H16.4605L15.2726 11.8117C15.0937 11.4822 15 11.1132 15 10.7382V4.5H16C16.4142 4.5 16.75 4.16421 16.75 3.75C16.75 3.33579 16.4142 3 16 3H8C7.58579 3 7.25 3.33579 7.25 3.75C7.25 4.16421 7.58579 4.5 8 4.5H8.99998ZM17.2748 15.5H6.72515L5.14269 18.415C4.50968 19.5811 5.35388 20.9999 6.68068 20.9999H17.3193C18.6461 20.9999 19.4903 19.5811 18.8573 18.415L17.2748 15.5Z" /></svg>
icon:cls_plot = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M13 2C14.364 2 15.4697 3.10572 15.4697 4.4697L15.469 5H19C19.5523 5 20 5.44772 20 6L19.999 9.499L18.4697 9.5C17.1603 9.5 16.0889 10.519 16.0053 11.8073L16 11.9697V12.0303C16 13.3397 17.019 14.4111 18.3073 14.4947L18.4697 14.5L19.999 14.499L20 18.0029C20 18.5552 19.5523 19.0029 19 19.0029L15.469 19.002L15.4697 19.5303C15.4697 20.8943 14.364 22 13 22C11.636 22 10.5303 20.8943 10.5303 19.5303L10.53 19.002L7 19.0029C6.44772 19.0029 6 18.5552 6 18.0029L5.999 14.471L5.4697 14.4712C4.10572 14.4712 3 13.3654 3 12.0015C3 10.6375 4.10572 9.53177 5.4697 9.53177L5.999 9.531L6 6C6 5.44772 6.44772 5 7 5H10.53L10.5303 4.4697C10.5303 3.10572 11.636 2 13 2Z" /></svg>
icon:cls_template = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.0802 6.62997C16.0102 6.52997 15.9302 6.43997 15.8502 6.35997H15.8402C15.5302 6.04997 15.1502 5.80997 14.7302 5.66997L13.3502 5.21997C13.2502 5.17997 13.1502 5.10997 13.0902 5.01997C13.0202 4.92997 12.9902 4.81997 12.9902 4.70997C12.9902 4.59997 13.0202 4.48997 13.0902 4.39997C13.1502 4.30997 13.2402 4.23997 13.3502 4.19997L14.7302 3.74997C15.1502 3.60997 15.5202 3.36997 15.8302 3.05997C16.1202 2.75997 16.3502 2.38997 16.5002 1.98997V1.95997L16.9502 0.579971C16.9902 0.479971 17.0602 0.379971 17.1502 0.319971C17.2402 0.249971 17.3502 0.219971 17.4602 0.219971C17.5702 0.219971 17.6802 0.259971 17.7702 0.319971C17.8602 0.379971 17.9302 0.469971 17.9702 0.579971L18.4202 1.95997C18.5602 2.37997 18.8002 2.75997 19.1102 3.06997C19.4202 3.38997 19.8002 3.61997 20.2202 3.75997L21.6002 4.20997H21.6302C21.7302 4.24997 21.8202 4.31997 21.8902 4.40997C21.9602 4.49997 21.9902 4.60997 21.9902 4.71997C21.9902 4.82997 21.9602 4.93997 21.8902 5.02997C21.8302 5.11997 21.7402 5.18997 21.6302 5.22997L20.2502 5.67997C19.8302 5.81997 19.4502 6.05997 19.1402 6.36997C18.8202 6.67997 18.5902 7.05997 18.4502 7.47997L17.9902 8.85997V8.88997C17.9502 8.97997 17.8802 9.05997 17.8002 9.11997C17.7102 9.18997 17.6002 9.21997 17.4902 9.21997C17.3802 9.21997 17.2702 9.18997 17.1802 9.11997C17.0902 9.05997 17.0202 8.96997 16.9802 8.85997L16.5302 7.47997C16.4302 7.16997 16.2802 6.87997 16.0802 6.62997ZM23.7802 10.43L23.0102 10.19C22.7702 10.11 22.5602 9.97997 22.3902 9.80997C22.2202 9.62997 22.0902 9.41997 22.0102 9.18997L21.7602 8.42997C21.7402 8.36997 21.7002 8.31997 21.6502 8.27997C21.6002 8.23997 21.5402 8.21997 21.4802 8.21997C21.4202 8.21997 21.3602 8.23997 21.3102 8.27997C21.2602 8.31997 21.2202 8.36997 21.2002 8.42997L20.9502 9.18997C20.8802 9.41997 20.7502 9.62997 20.5802 9.79997C20.4102 9.96997 20.2002 10.1 19.9702 10.18L19.2002 10.43C19.1402 10.45 19.0902 10.49 19.0502 10.54C19.0102 10.59 18.9902 10.65 18.9902 10.71C18.9902 10.77 19.0102 10.83 19.0502 10.88C19.0902 10.93 19.1402 10.97 19.2002 10.99L19.9702 11.24C20.2002 11.31 20.4202 11.45 20.5902 11.62C20.7602 11.79 20.8902 12.01 20.9702 12.24L21.2202 13C21.2402 13.06 21.2802 13.11 21.3302 13.15C21.3802 13.19 21.4402 13.21 21.5002 13.21C21.5602 13.21 21.6202 13.19 21.6702 13.15C21.7202 13.11 21.7602 13.06 21.7802 13L22.0302 12.24C22.1102 12 22.2402 11.79 22.4102 11.62C22.5902 11.45 22.8002 11.32 23.0302 11.24L23.8002 10.99C23.8602 10.97 23.9102 10.93 23.9502 10.88C23.9902 10.83 24 10.77 24 10.71C24 10.65 23.9902 10.59 23.9502 10.54C23.9107 10.4906 23.8438 10.4609 23.7802 10.43ZM19.54 12.71L19.8 13.51C19.85 13.65 19.92 13.76 20 13.88V19.96C20 21.2 18.99 22.21 17.75 22.21H6.25C5.01 22.21 4 21.2 4 19.96V4.45996C4 3.21996 5.01 2.20996 6.25 2.20996H14.51C14.44 2.24996 14.36 2.28996 14.29 2.31996L12.87 2.77996C12.47 2.92996 12.12 3.17996 11.88 3.52996C11.63 3.87996 11.5 4.27996 11.5 4.70996C11.5 5.13996 11.63 5.54996 11.87 5.88996C11.9477 6.00225 12.0479 6.09216 12.1446 6.17902C12.1598 6.19272 12.175 6.20634 12.19 6.21996H7.75C7.34 6.21996 7 6.55996 7 6.96996C7 7.37996 7.34 7.71996 7.75 7.71996H14.99C15.0011 7.73935 15.0129 7.75873 15.0249 7.77833C15.0562 7.8295 15.0883 7.88212 15.11 7.93996L15.57 9.34996C15.71 9.74996 15.97 10.09 16.32 10.34C16.67 10.58 17.08 10.71 17.5 10.71C17.5 11.08 17.61 11.44 17.83 11.75C18.05 12.06 18.35 12.28 18.74 12.42L19.54 12.71ZM7.75 17.71H16.25C16.66 17.71 17 17.37 17 16.96C17 16.55 16.66 16.21 16.25 16.21H7.75C7.34 16.21 7 16.55 7 16.96C7 17.37 7.34 17.71 7.75 17.71ZM7.75 12.71H16.25C16.66 12.71 17 12.37 17 11.96C17 11.55 16.66 11.21 16.25 11.21H7.75C7.34 11.21 7 11.55 7 11.96C7 12.37 7.34 12.71 7.75 12.71Z" /></svg>
icon:cls_timeline = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M15.2505 13.0003C16.217 13.0003 17.0005 13.7838 17.0005 14.7503V19.2536C17.0005 20.2201 16.217 21.0036 15.2505 21.0036H3.75048C2.78398 21.0036 2.00048 20.2201 2.00048 19.2536V14.7503C2.00048 13.7838 2.78398 13.0003 3.75048 13.0003H15.2505ZM21.001 14.8959L21.0005 20.2503C21.0005 20.6646 20.6647 21.0003 20.2505 21.0003C19.8708 21.0003 19.557 20.7182 19.5073 20.3521L19.5005 20.2503L19.5003 14.9066C19.7338 14.965 19.9782 14.9959 20.2298 14.9959C20.4964 14.9959 20.7549 14.9611 21.001 14.8959ZM20.2507 10.0923C21.3045 10.0923 22.1588 10.9465 22.1588 12.0003C22.1588 13.0541 21.3045 13.9084 20.2507 13.9084C19.1969 13.9084 18.3427 13.0541 18.3427 12.0003C18.3427 10.9465 19.1969 10.0923 20.2507 10.0923ZM15.2461 2.99707C16.2126 2.99707 16.9961 3.78057 16.9961 4.74707V9.25034C16.9961 10.2168 16.2126 11.0003 15.2461 11.0003H3.74609C2.7796 11.0003 1.99609 10.2168 1.99609 9.25034V4.74707C1.99609 3.8289 2.7032 3.07588 3.60257 3.00287L3.74609 2.99707H15.2461ZM20.2511 3.00034C20.6308 3.00034 20.9446 3.28249 20.9943 3.64857L21.0011 3.75034L21.001 9.09599C20.7549 9.03071 20.4964 8.99592 20.2298 8.99592C19.9782 8.99592 19.7338 9.02689 19.5003 9.08522L19.5011 3.75034C19.5011 3.33613 19.8369 3.00034 20.2511 3.00034Z" /></svg>
icon:cls_trash = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3.80337 5.59931C3.59559 3.67733 5.10137 2 7.03455 2H16.9649C18.8981 2 20.4038 3.67733 20.196 5.59932L18.6401 19.9918C18.5166 21.1342 17.5522 22 16.4031 22H7.59629C6.44725 22 5.48282 21.1342 5.35932 19.9918L3.80337 5.59931ZM5.30226 4.99743H18.6972C18.576 4.15965 17.8545 3.5 16.9649 3.5H7.03455C6.14494 3.5 5.42342 4.15965 5.30226 4.99743ZM11.7926 10.4094C11.8916 10.2614 12.1092 10.2614 12.2082 10.4094L12.8771 11.4092C13.1074 11.7535 13.5732 11.8459 13.9175 11.6155C14.2617 11.3852 14.3541 10.9194 14.1238 10.5751L13.455 9.57537C12.7619 8.53945 11.2389 8.53945 10.5459 9.57537L9.87706 10.5751C9.64674 10.9194 9.73912 11.3852 10.0834 11.6155C10.4277 11.8459 10.8935 11.7535 11.1238 11.4092L11.7926 10.4094ZM9.89355 13.628C10.1067 13.2729 9.99149 12.8122 9.6363 12.5991C9.28112 12.3859 8.82042 12.5011 8.60731 12.8563L8.24318 13.4632C7.44335 14.7962 8.40358 16.4922 9.95817 16.4922H10.7504C11.1646 16.4922 11.5004 16.1564 11.5004 15.7422C11.5004 15.328 11.1646 14.9922 10.7504 14.9922H9.95817C9.56952 14.9922 9.32946 14.5682 9.52942 14.2349L9.89355 13.628ZM14.3673 12.5988C14.012 12.8117 13.8965 13.2723 14.1094 13.6276L14.4734 14.2352C14.673 14.5685 14.433 14.9922 14.0445 14.9922H13.2504C12.8362 14.9922 12.5004 15.328 12.5004 15.7422C12.5004 16.1564 12.8362 16.4922 13.2504 16.4922H14.0445C15.5984 16.4922 16.5588 14.7974 15.7602 13.4644L15.3962 12.8567C15.1833 12.5014 14.7227 12.3859 14.3673 12.5988Z" /></svg>
icon:cls_world = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M8.90435 16.5008H12.5224C12.5076 16.6652 12.5001 16.8317 12.5001 17C12.5001 18.201 12.9567 19.361 13.7723 20.4875C13.2316 21.4465 12.615 21.999 12.0001 21.999C10.8031 21.999 9.59951 19.9051 8.9624 16.7953L8.90435 16.5008ZM8.67404 15.0009H12.8746C13.3659 13.7422 14.3076 12.7089 15.5015 12.099L15.5016 12.0005C15.5016 11.3147 15.4748 10.6459 15.4246 10.0002H8.57558L8.54234 10.4887C8.51361 10.9814 8.49853 11.4862 8.49853 12.0005C8.49853 13.0476 8.56099 14.0551 8.67404 15.0009ZM18.0001 11.5C19.5425 11.5 20.9367 12.1349 21.9354 13.1577C21.9792 12.778 22.0016 12.3919 22.0016 12.0005C22.0016 11.3155 21.9328 10.6465 21.8016 10.0002L16.9315 10.0008L16.9703 10.6567C16.9848 10.9647 16.9943 11.2763 16.9988 11.5909C17.3234 11.5312 17.6581 11.5 18.0001 11.5ZM3.06589 16.501L7.37153 16.5008C7.7363 18.583 8.35458 20.3545 9.16372 21.5942C6.60088 20.8373 4.46722 19.0825 3.21224 16.7799L3.06589 16.501ZM2.1986 10.0002L7.06862 10.0008C7.02238 10.6508 6.99854 11.319 6.99854 12.0005C6.99854 12.8299 7.03385 13.6396 7.10188 14.4207L7.159 15.0009H2.45637C2.1589 14.0537 1.99854 13.0458 1.99854 12.0005C1.99854 11.3155 2.0674 10.6465 2.1986 10.0002ZM14.9444 2.57707L14.8365 2.40684C17.8548 3.29781 20.2788 5.57442 21.372 8.50016L16.7811 8.50045C16.4656 6.08353 15.8246 4.00785 14.9444 2.57707ZM9.04186 2.44365L9.16364 2.40688C8.28288 3.75639 7.62827 5.736 7.28061 8.06062L7.21905 8.50045L2.62816 8.50016C3.70663 5.6139 6.08022 3.35936 9.04186 2.44365ZM12.0001 2.00195C13.3189 2.00195 14.6457 4.5437 15.2141 8.1854L15.2609 8.5002H8.73926C9.27868 4.69102 10.6436 2.00195 12.0001 2.00195ZM22.5001 17C22.5001 14.5147 20.4853 12.5 18.0001 12.5C15.5148 12.5 13.5001 14.5147 13.5001 17C13.5001 18.8626 14.9199 20.8149 17.7001 22.9C17.8778 23.0333 18.1223 23.0333 18.3001 22.9C21.0803 20.8149 22.5001 18.8626 22.5001 17ZM16.5001 17C16.5001 16.1716 17.1716 15.5 18.0001 15.5C18.8285 15.5 19.5001 16.1716 19.5001 17C19.5001 17.8284 18.8285 18.5 18.0001 18.5C17.1716 18.5 16.5001 17.8284 16.5001 17Z" /></svg>
icon:key_pov = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M11.3981 19.0744C10.0254 17.7017 9.73295 15.6579 10.5207 13.9992H4.25278C3.01076 13.9992 2.00391 15.0061 2.00391 16.2481V17.1681C2.00391 17.7401 2.18231 18.298 2.51427 18.7639C4.05643 20.9282 6.5794 22.0004 10.0004 22.0004C11.4131 22.0004 12.673 21.8175 13.7742 21.4504L11.3981 19.0744ZM10.0004 2.00391C12.7618 2.00391 15.0004 4.24248 15.0004 7.00391C15.0004 9.76533 12.7618 12.0039 10.0004 12.0039C7.23894 12.0039 5.00036 9.76533 5.00036 7.00391C5.00036 4.24248 7.23894 2.00391 10.0004 2.00391ZM17.0439 22.9952C16.8519 22.9953 16.6599 22.922 16.5135 22.7756L12.1052 18.3673C10.7514 17.0134 10.7514 14.8184 12.1052 13.4646C13.4591 12.1108 15.6541 12.1108 17.0079 13.4646L17.0439 13.5006L17.0799 13.4646C18.4337 12.1108 20.6287 12.1108 21.9826 13.4646C23.3364 14.8184 23.3364 17.0134 21.9826 18.3673L17.5743 22.7756C17.4279 22.922 17.2359 22.9953 17.0439 22.9952Z" /></svg>
icon:key_focus = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M17.5004 12.0003C20.5379 12.0003 23.0004 14.4627 23.0004 17.5003C23.0004 20.5378 20.5379 23.0003 17.5004 23.0003C14.4628 23.0003 12.0004 20.5378 12.0004 17.5003C12.0004 14.4627 14.4628 12.0003 17.5004 12.0003ZM12.0226 13.9996C11.3755 15.01 11.0004 16.2113 11.0004 17.5003C11.0004 19.1306 11.6006 20.6207 12.5921 21.7618C11.7966 21.9219 10.9317 22.0013 10.0004 22.0013C6.5794 22.0013 4.05643 20.9292 2.51427 18.7648C2.18231 18.2989 2.00391 17.7411 2.00391 17.169V16.2491C2.00391 15.007 3.01076 14.0002 4.25278 14.0002L12.0226 13.9996ZM14.8539 17.1467C14.6587 16.9514 14.3421 16.9514 14.1468 17.1467C13.9515 17.342 13.9515 17.6586 14.1468 17.8538L16.1468 19.8538C16.3421 20.0491 16.6587 20.0491 16.8539 19.8538L20.8539 15.8538C21.0492 15.6586 21.0492 15.342 20.8539 15.1467C20.6587 14.9514 20.3421 14.9514 20.1468 15.1467L16.5004 18.7931L14.8539 17.1467ZM10.0004 2.00488C12.7618 2.00488 15.0004 4.24346 15.0004 7.00488C15.0004 9.76631 12.7618 12.0049 10.0004 12.0049C7.23894 12.0049 5.00036 9.76631 5.00036 7.00488C5.00036 4.24346 7.23894 2.00488 10.0004 2.00488Z" /></svg>
icon:key_mention = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12.5008 16C12.5008 15.2889 12.6493 14.6124 12.9169 13.9999H4.25278C3.01076 13.9999 2.00391 15.0068 2.00391 16.2488V17.1688C2.00391 17.7409 2.18231 18.2987 2.51427 18.7646C4.05643 20.9289 6.5794 22.0011 10.0004 22.0011C10.67 22.0011 11.3053 21.96 11.9057 21.8777C11.8906 21.8713 11.8755 21.8646 11.8604 21.8576C11.1153 21.5074 10.7917 20.6221 11.1353 19.874C11.2479 19.6287 11.4314 19.4552 11.5161 19.3757C11.6183 19.2799 11.7511 19.1679 11.8898 19.0508L12.5006 18.5354L12.5008 16ZM10.0004 2.00464C12.7618 2.00464 15.0004 4.24321 15.0004 7.00464C15.0004 9.76606 12.7618 12.0046 10.0004 12.0046C7.23894 12.0046 5.00036 9.76606 5.00036 7.00464C5.00036 4.24321 7.23894 2.00464 10.0004 2.00464ZM17.5025 12C15.2934 12 13.5025 13.7909 13.5025 16L13.5023 19L12.5539 19.8004C12.2462 20.06 12.0923 20.1899 12.0457 20.2913C11.9312 20.5407 12.0391 20.8358 12.2875 20.9525C12.3885 21 12.5898 21 12.9925 21H22.0121C22.4148 21 22.6162 21 22.7172 20.9525C22.9656 20.8358 23.0735 20.5407 22.9589 20.2913C22.9123 20.1899 22.7584 20.06 22.4507 19.8003L21.5025 19V16C21.5025 13.7909 19.7116 12 17.5025 12ZM19.0025 22C18.7842 22.5826 18.195 23 17.5025 23C16.81 23 16.2208 22.5826 16.0025 22H19.0025Z" /></svg>
icon:cmn_general = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 28 28" fill="#000000"><path d="M22.248 4C24.3191 4 25.998 5.67893 25.998 7.75V20.25C25.998 22.3211 24.3191 24 22.248 24H5.75195C3.68089 24 2.00195 22.3211 2.00195 20.25V7.75C2.00195 5.67893 3.68089 4 5.75195 4H22.248ZM11.0303 15.2197C10.7374 14.9268 10.2626 14.9268 9.96973 15.2197L8.5 16.6895L8.03027 16.2197C7.73738 15.9268 7.26262 15.9268 6.96973 16.2197C6.67683 16.5126 6.67683 16.9874 6.96973 17.2803L7.96973 18.2803C8.11038 18.4209 8.30109 18.5 8.5 18.5C8.69891 18.5 8.88962 18.4209 9.03027 18.2803L11.0303 16.2803C11.3232 15.9874 11.3232 15.5126 11.0303 15.2197ZM13.5 16C13.0858 16 12.75 16.3358 12.75 16.75C12.75 17.1642 13.0858 17.5 13.5 17.5H20.5C20.9142 17.5 21.25 17.1642 21.25 16.75C21.25 16.3358 20.9142 16 20.5 16H13.5ZM11.0303 9.71973C10.7374 9.42683 10.2626 9.42683 9.96973 9.71973L8.5 11.1895L8.03027 10.7197C7.73738 10.4268 7.26262 10.4268 6.96973 10.7197C6.67683 11.0126 6.67683 11.4874 6.96973 11.7803L7.96973 12.7803C8.11038 12.9209 8.30109 13 8.5 13C8.69891 13 8.88962 12.9209 9.03027 12.7803L11.0303 10.7803C11.3232 10.4874 11.3232 10.0126 11.0303 9.71973ZM13.5 10.5C13.0858 10.5 12.75 10.8358 12.75 11.25C12.75 11.6642 13.0858 12 13.5 12H20.5C20.9142 12 21.25 11.6642 21.25 11.25C21.25 10.8358 20.9142 10.5 20.5 10.5H13.5Z" /></svg>
icon:cmn_note = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M5.25 3C3.45507 3 2 4.45507 2 6.25V14.75C2 16.5449 3.45508 18 5.25 18H6V20.75C6 21.7801 7.17595 22.368 8 21.75L13 18H18.75C20.5449 18 22 16.5449 22 14.75V6.25C22 4.45507 20.5449 3 18.75 3H5.25Z" /></svg>
icon:cmn_story = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.0883 6.41228C16.016 6.31886 15.9377 6.2298 15.8539 6.14569C15.5417 5.83255 15.1606 5.59666 14.741 5.45683L13.3632 5.00939C13.257 4.97196 13.165 4.90253 13.1 4.81068C13.0349 4.71883 13 4.60908 13 4.49656C13 4.38404 13.0349 4.27429 13.1 4.18244C13.165 4.09058 13.257 4.02116 13.3632 3.98372L14.741 3.53628C15.1547 3.39352 15.5299 3.15705 15.837 2.84537C16.1357 2.54224 16.3623 2.17595 16.5 1.77372L16.5114 1.73963L16.9592 0.362894C16.9967 0.256782 17.0662 0.164895 17.1581 0.0998993C17.25 0.0349035 17.3598 0 17.4724 0C17.5851 0 17.6949 0.0349035 17.7868 0.0998993C17.8787 0.164895 17.9482 0.256782 17.9857 0.362894L18.4335 1.73963C18.5727 2.15819 18.8077 2.53853 19.1198 2.85041C19.432 3.1623 19.8126 3.39715 20.2315 3.53628L21.6093 3.98372L21.6368 3.99061C21.743 4.02804 21.835 4.09747 21.9 4.18932C21.9651 4.28117 22 4.39092 22 4.50344C22 4.61596 21.9651 4.72571 21.9 4.81756C21.835 4.90942 21.743 4.97884 21.6368 5.01628L20.259 5.46372C19.8402 5.60285 19.4595 5.8377 19.1474 6.14959C18.8353 6.46147 18.6003 6.84181 18.461 7.26037L18.0132 8.63711C18.0092 8.64855 18.0048 8.65983 18 8.67093C17.9605 8.76273 17.8964 8.84212 17.8144 8.9001C17.7224 8.9651 17.6126 9 17.5 9C17.3874 9 17.2776 8.9651 17.1856 8.9001C17.0937 8.8351 17.0242 8.74322 16.9868 8.63711L16.539 7.26037C16.4378 6.95331 16.2851 6.66664 16.0883 6.41228ZM23.7829 10.2132L23.0175 9.9646C22.7848 9.8873 22.5733 9.75683 22.3999 9.58356C22.2265 9.41029 22.0959 9.199 22.0186 8.96646L21.7698 8.20161C21.749 8.14266 21.7104 8.09161 21.6593 8.0555C21.6083 8.01939 21.5473 8 21.4847 8C21.4221 8 21.3611 8.01939 21.31 8.0555C21.259 8.09161 21.2204 8.14266 21.1996 8.20161L20.9508 8.96646C20.875 9.19736 20.7467 9.40761 20.5761 9.58076C20.4055 9.75392 20.1971 9.88529 19.9672 9.9646L19.2018 10.2132C19.1428 10.234 19.0917 10.2725 19.0555 10.3236C19.0194 10.3746 19 10.4356 19 10.4981C19 10.5606 19.0194 10.6216 19.0555 10.6726C19.0917 10.7236 19.1428 10.7622 19.2018 10.783L19.9672 11.0316C20.2003 11.1093 20.412 11.2403 20.5855 11.4143C20.7589 11.5882 20.8893 11.8003 20.9661 12.0335L21.2149 12.7984C21.2357 12.8573 21.2743 12.9084 21.3254 12.9445C21.3764 12.9806 21.4374 13 21.5 13C21.5626 13 21.6236 12.9806 21.6746 12.9445C21.7257 12.9084 21.7643 12.8573 21.7851 12.7984L22.0339 12.0335C22.1113 11.801 22.2418 11.5897 22.4152 11.4164C22.5886 11.2432 22.8001 11.1127 23.0328 11.0354L23.7982 10.7868C23.8572 10.766 23.9083 10.7275 23.9445 10.6764C23.9806 10.6254 24 10.5644 24 10.5019C24 10.4394 23.9806 10.3784 23.9445 10.3274C23.9083 10.2764 23.8572 10.2378 23.7982 10.217L23.7829 10.2132ZM12.0716 4H4.75C3.23122 4 2 5.23122 2 6.75V17.25C2 18.7688 3.23122 20 4.75 20H19.25C20.7688 20 22 18.7688 22 17.25V13.931C21.8315 14.0086 21.6474 14.0495 21.46 14.0495C21.191 14.0495 20.9288 13.9654 20.71 13.809C20.4837 13.6479 20.3126 13.421 20.22 13.159L19.98 12.399C19.9517 12.3126 19.9038 12.2339 19.84 12.169C19.7755 12.1097 19.701 12.0623 19.62 12.029L18.83 11.779C18.5755 11.6879 18.3554 11.5202 18.2 11.299C18.0419 11.0811 17.9578 10.8183 17.96 10.549C17.959 10.3168 18.0212 10.0886 18.14 9.88903C17.9298 9.99699 17.6963 10.0519 17.46 10.049C17.1418 10.048 16.8314 9.9504 16.57 9.76903C16.3049 9.57754 16.1057 9.3085 16 8.99903L15.59 7.54903C15.5237 7.35123 15.4258 7.16549 15.3 6.99903L15.12 6.89903C14.9156 6.70079 14.6697 6.55049 14.4 6.45903L13 5.99903C12.6977 5.86818 12.4454 5.64387 12.28 5.35903C12.0986 5.09759 12.001 4.78722 12 4.46903C12.0004 4.3091 12.0248 4.15108 12.0716 4ZM6 8.75C6 8.33579 6.33579 8 6.75 8H11.25C11.6642 8 12 8.33579 12 8.75C12 9.16421 11.6642 9.5 11.25 9.5H6.75C6.33579 9.5 6 9.16421 6 8.75ZM6 11.75C6 11.3358 6.33579 11 6.75 11H15.25C15.6642 11 16 11.3358 16 11.75C16 12.1642 15.6642 12.5 15.25 12.5H6.75C6.33579 12.5 6 12.1642 6 11.75ZM6.75 15.5C6.33579 15.5 6 15.1642 6 14.75C6 14.3358 6.33579 14 6.75 14H13.25C13.6642 14 14 14.3358 14 14.75C14 15.1642 13.6642 15.5 13.25 15.5H6.75Z" /></svg>
icon:prj_folder = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M2 8V6.25C2 4.45507 3.45507 3 5.25 3H8.12868C8.72542 3 9.29771 3.23705 9.71967 3.65901L11.25 5.18934L8.65901 7.78033C8.51836 7.92098 8.32759 8 8.12868 8H2ZM2 9.5V17.75C2 19.5449 3.45507 21 5.25 21H18.75C20.5449 21 22 19.5449 22 17.75V8.75C22 6.95507 20.5449 5.5 18.75 5.5H13.0607L9.71967 8.84099C9.29771 9.26295 8.72542 9.5 8.12868 9.5H2Z" /></svg>
icon:prj_document = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 2C5.00736 2 4 3.00736 4 4.25V19.75C4 20.9926 5.00736 22 6.25 22H17.75C18.9926 22 20 20.9926 20 19.75V4.25C20 3.00736 18.9926 2 17.75 2H6.25ZM7.75 6H16.25C16.6642 6 17 6.33579 17 6.75C17 7.16421 16.6642 7.5 16.25 7.5H7.75C7.33579 7.5 7 7.16421 7 6.75C7 6.33579 7.33579 6 7.75 6ZM7 16.75C7 16.3358 7.33579 16 7.75 16H16.25C16.6642 16 17 16.3358 17 16.75C17 17.1642 16.6642 17.5 16.25 17.5H7.75C7.33579 17.5 7 17.1642 7 16.75ZM7.75 11H16.25C16.6642 11 17 11.3358 17 11.75C17 12.1642 16.6642 12.5 16.25 12.5H7.75C7.33579 12.5 7 12.1642 7 11.75C7 11.3358 7.33579 11 7.75 11Z" /></svg>
icon:prj_title = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 2C5.00736 2 4 3.00736 4 4.25V19.75C4 20.9926 5.00736 22 6.25 22H17.75C18.9926 22 20 20.9926 20 19.75V4.25C20 3.00736 18.9926 2 17.75 2H6.25ZM7.75 6H16.25C16.6642 6 17 6.33579 17 6.75C17 7.16421 16.6642 7.5 16.25 7.5H7.75C7.33579 7.5 7 7.16421 7 6.75C7 6.33579 7.33579 6 7.75 6ZM7 16.75C7 16.3358 7.33579 16 7.75 16H16.25C16.6642 16 17 16.3358 17 16.75C17 17.1642 16.6642 17.5 16.25 17.5H7.75C7.33579 17.5 7 17.1642 7 16.75ZM7.75 11H16.25C16.6642 11 17 11.3358 17 11.75C17 12.1642 16.6642 12.5 16.25 12.5H7.75C7.33579 12.5 7 12.1642 7 11.75C7 11.3358 7.33579 11 7.75 11Z" /></svg>
icon:prj_chapter = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 2C5.00736 2 4 3.00736 4 4.25V19.75C4 20.9926 5.00736 22 6.25 22H17.75C18.9926 22 20 20.9926 20 19.75V4.25C20 3.00736 18.9926 2 17.75 2H6.25ZM7.75 6H16.25C16.6642 6 17 6.33579 17 6.75C17 7.16421 16.6642 7.5 16.25 7.5H7.75C7.33579 7.5 7 7.16421 7 6.75C7 6.33579 7.33579 6 7.75 6ZM7 16.75C7 16.3358 7.33579 16 7.75 16H16.25C16.6642 16 17 16.3358 17 16.75C17 17.1642 16.6642 17.5 16.25 17.5H7.75C7.33579 17.5 7 17.1642 7 16.75ZM7.75 11H16.25C16.6642 11 17 11.3358 17 11.75C17 12.1642 16.6642 12.5 16.25 12.5H7.75C7.33579 12.5 7 12.1642 7 11.75C7 11.3358 7.33579 11 7.75 11Z" /></svg>
icon:prj_scene = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 2C5.00736 2 4 3.00736 4 4.25V19.75C4 20.9926 5.00736 22 6.25 22H17.75C18.9926 22 20 20.9926 20 19.75V4.25C20 3.00736 18.9926 2 17.75 2H6.25ZM7.75 6H16.25C16.6642 6 17 6.33579 17 6.75C17 7.16421 16.6642 7.5 16.25 7.5H7.75C7.33579 7.5 7 7.16421 7 6.75C7 6.33579 7.33579 6 7.75 6ZM7 16.75C7 16.3358 7.33579 16 7.75 16H16.25C16.6642 16 17 16.3358 17 16.75C17 17.1642 16.6642 17.5 16.25 17.5H7.75C7.33579 17.5 7 17.1642 7 16.75ZM7.75 11H16.25C16.6642 11 17 11.3358 17 11.75C17 12.1642 16.6642 12.5 16.25 12.5H7.75C7.33579 12.5 7 12.1642 7 11.75C7 11.3358 7.33579 11 7.75 11Z" /></svg>
icon:prj_note = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.25 2C16.6642 2 17 2.33579 17 2.75V4H17.75C18.9926 4 20 5.00736 20 6.25V16H16.25C15.0074 16 14 17.0074 14 18.25V22H6.25C5.00736 22 4 20.9926 4 19.75V6.25C4 5.00736 5.00736 4 6.25 4H7V2.75C7 2.33579 7.33579 2 7.75 2C8.16421 2 8.5 2.33579 8.5 2.75V4H11.25V2.75C11.25 2.33579 11.5858 2 12 2C12.4142 2 12.75 2.33579 12.75 2.75V4H15.5V2.75C15.5 2.33579 15.8358 2 16.25 2ZM19.7607 17.5C19.7032 17.5894 19.6369 17.6737 19.5605 17.75L15.75 21.5605C15.6737 21.6369 15.5894 21.7032 15.5 21.7607V18.25C15.5 17.8358 15.8358 17.5 16.25 17.5H19.7607ZM8.25 16C7.83579 16 7.5 16.3358 7.5 16.75C7.5 17.1642 7.83579 17.5 8.25 17.5H11.25L11.3271 17.4961C11.7051 17.4575 12 17.1382 12 16.75C12 16.3618 11.7051 16.0425 11.3271 16.0039L11.25 16H8.25ZM8.25 12C7.83579 12 7.5 12.3358 7.5 12.75C7.5 13.1642 7.83579 13.5 8.25 13.5H15.75C16.1642 13.5 16.5 13.1642 16.5 12.75C16.5 12.3358 16.1642 12 15.75 12H8.25ZM8.25 8C7.83579 8 7.5 8.33579 7.5 8.75C7.5 9.16421 7.83579 9.5 8.25 9.5H15.75C16.1642 9.5 16.5 9.16421 16.5 8.75C16.5 8.33579 16.1642 8 15.75 8H8.25Z" /></svg>
icon:fmt_align_center = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4 6C4 5.44772 4.44772 5 5 5H19C19.5523 5 20 5.44772 20 6C20 6.55228 19.5523 7 19 7H5C4.44772 7 4 6.55228 4 6ZM6 18C6 17.4477 6.44772 17 7 17H17C17.5523 17 18 17.4477 18 18C18 18.5523 17.5523 19 17 19H7C6.44772 19 6 18.5523 6 18ZM3 11C2.44772 11 2 11.4477 2 12C2 12.5523 2.44772 13 3 13H21C21.5523 13 22 12.5523 22 12C22 11.4477 21.5523 11 21 11H3Z" /></svg>
icon:fmt_align_left = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M2 6C2 5.44772 2.44772 5 3 5H18C18.5523 5 19 5.44772 19 6C19 6.55228 18.5523 7 18 7H3C2.44772 7 2 6.55228 2 6ZM2 18C2 17.4477 2.44772 17 3 17H14C14.5523 17 15 17.4477 15 18C15 18.5523 14.5523 19 14 19H3C2.44772 19 2 18.5523 2 18ZM3 11C2.44772 11 2 11.4477 2 12C2 12.5523 2.44772 13 3 13H21C21.5523 13 22 12.5523 22 12C22 11.4477 21.5523 11 21 11H3Z" /></svg>
icon:fmt_align_right = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M5 6C5 5.44772 5.44772 5 6 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H6C5.44772 7 5 6.55228 5 6ZM9 18C9 17.4477 9.44772 17 10 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H10C9.44772 19 9 18.5523 9 18ZM3 11C2.44772 11 2 11.4477 2 12C2 12.5523 2.44772 13 3 13H21C21.5523 13 22 12.5523 22 12C22 11.4477 21.5523 11 21 11H3Z" /></svg>
icon:fmt_bold = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6 5.75C6 4.7835 6.7835 4 7.75 4H12.499C15.3222 4 17.25 6.33994 17.25 8.75C17.25 9.68107 16.9624 10.602 16.4465 11.3815C17.3691 12.2393 18 13.4703 18 15C18 18.1333 15.3234 20 13 20H7.75C6.7835 20 6 19.2165 6 18.25L6 5.75ZM9.5 13.4999V16.5H13C13.3118 16.5 13.7105 16.3622 14.0242 16.0786C14.3122 15.8182 14.5 15.4643 14.5 15C14.5 14.1123 13.7547 13.4999 13 13.4999H9.5ZM9.5 9.99994H12.5C13.215 9.99994 13.75 9.40784 13.75 8.75C13.75 8.0932 13.2143 7.5 12.499 7.5H9.5V9.99994Z" /></svg>
icon:fmt_italic = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M19 4C19.5523 4 20 4.44772 20 5C20 5.55228 19.5523 6 19 6H15.4395L10.8887 18H14C14.5523 18 15 18.4477 15 19C15 19.5523 14.5523 20 14 20H5C4.44772 20 4 19.5523 4 19C4 18.4477 4.44772 18 5 18H8.75L13.3018 6H10C9.44772 6 9 5.55228 9 5C9 4.44772 9.44772 4 10 4H19Z" /></svg>
icon:fmt_link = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M9 7C9.55228 7 10 7.44772 10 8C10 8.51284 9.61396 8.93551 9.11662 8.99327L9 9H7C5.34315 9 4 10.3431 4 12C4 13.5977 5.24892 14.9037 6.82373 14.9949L7 15H9C9.55228 15 10 15.4477 10 16C10 16.5128 9.61396 16.9355 9.11662 16.9933L9 17H7C4.23858 17 2 14.7614 2 12C2 9.31125 4.12231 7.11818 6.78311 7.00462L7 7H9ZM17 7C19.7614 7 22 9.23858 22 12C22 14.6888 19.8777 16.8818 17.2169 16.9954L17 17H15C14.4477 17 14 16.5523 14 16C14 15.4872 14.386 15.0645 14.8834 15.0067L15 15H17C18.6569 15 20 13.6569 20 12C20 10.4023 18.7511 9.09634 17.1763 9.00509L17 9H15C14.4477 9 14 8.55228 14 8C14 7.48716 14.386 7.06449 14.8834 7.00673L15 7H17ZM7 11H17C17.5523 11 18 11.4477 18 12C18 12.5128 17.614 12.9355 17.1166 12.9933L17 13H7C6.44772 13 6 12.5523 6 12C6 11.4872 6.38604 11.0645 6.88338 11.0067L7 11H17H7Z" /></svg>
icon:fmt_list_o = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.0001 2.75007C6.0001 2.39585 5.75227 2.08992 5.40576 2.0164C5.06011 1.94307 4.7103 2.12094 4.5658 2.44311L4.56426 2.44645C4.56226 2.45075 4.55842 2.45889 4.55275 2.47049C4.5414 2.49373 4.52282 2.53063 4.49704 2.57815C4.44527 2.67364 4.36584 2.80953 4.2594 2.96255C4.04176 3.27544 3.73538 3.62496 3.35275 3.86399C3.00144 4.08344 2.89456 4.54613 3.11401 4.89743C3.33346 5.24873 3.79615 5.35562 4.14746 5.13616C4.27205 5.05833 4.38956 4.97481 4.5001 4.88772V7.25007C4.5001 7.66429 4.83589 8.00007 5.2501 8.00007C5.66431 8.00007 6.0001 7.66429 6.0001 7.25007V2.75007ZM19.4995 18.0001H10.9995L10.8829 18.0068C10.3856 18.0646 9.99951 18.4872 9.99951 19.0001C9.99951 19.5524 10.4472 20.0001 10.9995 20.0001H19.4995L19.6161 19.9933C20.1135 19.9356 20.4995 19.5129 20.4995 19.0001C20.4995 18.4478 20.0518 18.0001 19.4995 18.0001ZM19.4995 11.5001H10.9995L10.8829 11.5068C10.3856 11.5646 9.99951 11.9872 9.99951 12.5001C9.99951 13.0524 10.4472 13.5001 10.9995 13.5001H19.4995L19.6161 13.4933C20.1135 13.4356 20.4995 13.0129 20.4995 12.5001C20.4995 11.9478 20.0518 11.5001 19.4995 11.5001ZM19.4995 5.00008H10.9995L10.8829 5.0068C10.3856 5.06457 9.99951 5.48724 9.99951 6.00008C9.99951 6.55236 10.4472 7.00008 10.9995 7.00008H19.4995L19.6161 6.99335C20.1135 6.93558 20.4995 6.51291 20.4995 6.00008C20.4995 5.44779 20.0518 5.00008 19.4995 5.00008ZM5.15093 10.52C4.84957 10.4668 4.47444 10.5864 4.28031 10.7805C3.98741 11.0733 3.51253 11.0733 3.21965 10.7804C2.92677 10.4875 2.92678 10.0127 3.21969 9.71977C3.77556 9.16393 4.65044 8.90848 5.41157 9.04278C5.809 9.11291 6.2173 9.29717 6.52722 9.64842C6.8426 10.0058 7 10.4727 7 11.0001C7 11.6195 6.72895 12.0801 6.39406 12.4206C6.1163 12.7029 5.76315 12.9311 5.48826 13.1087L5.40874 13.1602C5.21348 13.2871 5.05428 13.3971 4.92686 13.5001H6.25C6.66421 13.5001 7 13.8359 7 14.2501C7 14.6643 6.6642 15.0001 6.24999 15.0001H3.75C3.33579 15.0001 3 14.6643 3 14.2501C3 12.9365 3.98385 12.2972 4.57505 11.913L4.63522 11.8739C4.95259 11.6678 5.16843 11.5275 5.32469 11.3687C5.45855 11.2326 5.5 11.1307 5.5 11.0001C5.5 10.7775 5.43865 10.6819 5.40247 10.6409C5.36083 10.5937 5.28475 10.5436 5.15093 10.52ZM2.96967 21.2804C2.96967 21.2804 3.06251 21.3641 2.97426 21.2849L2.97962 21.2902L2.9929 21.3028C3.00287 21.3122 3.01509 21.3233 3.02956 21.336C3.05848 21.3613 3.09653 21.3928 3.14375 21.4282C3.2381 21.499 3.36996 21.5861 3.53959 21.6709C3.88131 21.8418 4.37043 22.0001 5 22.0001C5.63921 22.0001 6.19596 21.8187 6.60132 21.4606C7.00922 21.1001 7.21163 20.6032 7.19553 20.1011C7.18219 19.6847 7.02903 19.3054 6.76986 19.0001C7.02903 18.6948 7.18219 18.3155 7.19553 17.8991C7.21163 17.3969 7.00922 16.9 6.60132 16.5396C6.19596 16.1814 5.63921 16.0001 5 16.0001C4.37043 16.0001 3.88131 16.1584 3.53959 16.3293C3.36996 16.4141 3.2381 16.5012 3.14375 16.572C3.09653 16.6074 3.05848 16.6389 3.02956 16.6642C3.01509 16.6768 3.00287 16.688 2.9929 16.6973L2.97962 16.71L2.97423 16.7152L2.97189 16.7176L2.97091 16.7185L2.96967 16.7197C2.67678 17.0126 2.67678 17.4875 2.96967 17.7804C3.2586 18.0693 3.72462 18.0732 4.01834 17.7921C4.0217 17.7892 4.03018 17.7821 4.04375 17.772C4.0744 17.749 4.13004 17.7111 4.21041 17.6709C4.36869 17.5918 4.62957 17.5001 5 17.5001C5.36079 17.5001 5.53601 17.6 5.60812 17.6637C5.67768 17.7251 5.69823 17.7907 5.6963 17.8511C5.69423 17.9156 5.66403 18.0028 5.57278 18.0819C5.4845 18.1585 5.30962 18.2501 5 18.2501C4.58579 18.2501 4.25 18.5859 4.25 19.0001C4.25 19.4143 4.58579 19.7501 5 19.7501C5.30962 19.7501 5.4845 19.8417 5.57278 19.9183C5.66403 19.9974 5.69423 20.0845 5.6963 20.1491C5.69823 20.2094 5.67768 20.275 5.60812 20.3365C5.53601 20.4002 5.36079 20.5001 5 20.5001C4.62957 20.5001 4.36869 20.4084 4.21041 20.3293C4.13004 20.2891 4.0744 20.2512 4.04375 20.2282C4.03018 20.218 4.0217 20.2109 4.01834 20.208C3.72462 19.9269 3.2586 19.9308 2.96967 20.2197C2.67678 20.5126 2.67678 20.9875 2.96967 21.2804ZM2.97189 16.7176L2.97091 16.7185C2.9776 16.713 3.17182 16.5516 2.97189 16.7176Z" /></svg>
icon:fmt_list_u = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3.49942 16.5006C4.32752 16.5006 4.99883 17.1719 4.99883 18C4.99883 18.8281 4.32752 19.4994 3.49942 19.4994C2.67131 19.4994 2 18.8281 2 18C2 17.1719 2.67131 16.5006 3.49942 16.5006ZM7.50034 17H21.0035C21.5558 17 22.0035 17.4477 22.0035 18C22.0035 18.5128 21.6174 18.9355 21.1201 18.9933L21.0035 19H7.50034C6.94805 19 6.50034 18.5523 6.50034 18C6.50034 17.4872 6.88638 17.0645 7.38372 17.0067L7.50034 17H21.0035H7.50034ZM3.49942 10.5006C4.32752 10.5006 4.99883 11.1719 4.99883 12C4.99883 12.8281 4.32752 13.4994 3.49942 13.4994C2.67131 13.4994 2 12.8281 2 12C2 11.1719 2.67131 10.5006 3.49942 10.5006ZM7.50034 11H21.0035C21.5558 11 22.0035 11.4477 22.0035 12C22.0035 12.5128 21.6174 12.9355 21.1201 12.9933L21.0035 13H7.50034C6.94805 13 6.50034 12.5523 6.50034 12C6.50034 11.4872 6.88638 11.0645 7.38372 11.0067L7.50034 11H21.0035H7.50034ZM3.49942 4.50781C4.32752 4.50781 4.99883 5.17912 4.99883 6.00723C4.99883 6.83533 4.32752 7.50664 3.49942 7.50664C2.67131 7.50664 2 6.83533 2 6.00723C2 5.17912 2.67131 4.50781 3.49942 4.50781ZM7.50034 5.00082H21.0035C21.5558 5.00082 22.0035 5.44854 22.0035 6.00082C22.0035 6.51366 21.6174 6.93633 21.1201 6.9941L21.0035 7.00082H7.50034C6.94805 7.00082 6.50034 6.55311 6.50034 6.00082C6.50034 5.48799 6.88638 5.06532 7.38372 5.00755L7.50034 5.00082H21.0035H7.50034Z" /></svg>
icon:fmt_mark = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.38181 14H4C2.89543 14 2 14.8954 2 16V20C2 21.1046 2.89543 22 4 22H20C21.1046 22 22 21.1046 22 20V16C22 14.8954 21.1046 14 20 14H13.546L12.2298 15.314C11.8499 15.6932 11.3821 15.9725 10.868 16.1268L6.57499 17.4154C5.51705 17.733 4.40199 17.1328 4.08444 16.0748C3.96796 15.6868 3.97208 15.2725 4.09626 14.8868L4.38181 14ZM18.6479 2.94403C19.9043 4.20118 19.9036 6.23878 18.6465 7.49513L11.5233 14.6063C11.2603 14.8688 10.9364 15.0622 10.5805 15.169L6.28749 16.4576C5.75853 16.6164 5.201 16.3163 5.04222 15.7873C4.98398 15.5933 4.98604 15.3862 5.04813 15.1933L6.40953 10.9653C6.51917 10.6248 6.70841 10.3153 6.96156 10.0626L14.0944 2.94144C15.3527 1.68518 17.391 1.68634 18.6479 2.94403Z" /></svg>
icon:fmt_size = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M15.5 3C15.9193 3.00003 16.2939 3.26171 16.4385 3.65527L21.9385 18.6553C22.1285 19.1736 21.8629 19.7481 21.3447 19.9385C20.8264 20.1285 20.2519 19.8629 20.0615 19.3447L18.6514 15.5H12.3486L10.9385 19.3447C10.7951 19.7349 10.4255 19.9959 10.0098 20C9.59383 20.004 9.21913 19.75 9.06836 19.3623L8.34375 17.5H4.65625L3.93164 19.3623C3.73147 19.877 3.15241 20.1318 2.63769 19.9316C2.12296 19.7315 1.86818 19.1524 2.06836 18.6377L5.56836 9.6377L5.63379 9.5C5.81037 9.19391 6.13905 9 6.5 9C6.91239 9.00003 7.28217 9.25334 7.43164 9.6377L9.97168 16.1709L14.5615 3.65527L14.626 3.51465C14.8002 3.20066 15.1329 3 15.5 3ZM5.43359 15.5H7.56641L6.5 12.7578L5.43359 15.5ZM13.0811 13.5H17.919L15.5 6.90332L13.0811 13.5Z" /></svg>
icon:fmt_strike = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M13.8479 11.4999H19.5007C20.0529 11.4999 20.5007 11.9477 20.5007 12.4999C20.5007 13.0522 20.0529 13.4999 19.5007 13.4999H17.1138C17.7748 14.2749 18.1124 15.1749 18.1124 16.1845C18.1124 19.1135 14.8316 21.0993 11.0788 20.6632C8.75106 20.3927 7.11436 19.4443 6.25235 17.8307C5.99211 17.3436 6.0447 16.8151 6.5 16.4998C6.9553 16.1845 7.75616 16.4012 8.0164 16.8883C8.54932 17.8859 9.6199 18.4802 11.3097 18.6766C13.8964 18.9772 16.1124 17.7667 16.1124 16.1845C16.1124 15.0862 15.5649 14.245 14.005 13.4999H5C4.44772 13.4999 4 13.0522 4 12.4999C4 11.9477 4.44772 11.4999 5 11.4999H13.812C13.8307 11.4997 13.8318 11.4997 13.8479 11.4999ZM6.98666 9.69482C6.88193 9.53666 6.78286 9.36983 6.68906 9.18547C6.38864 8.59492 6.22083 7.97058 6.25419 7.34979C6.41352 4.38519 9.18805 2.63683 12.8562 3.06312C15.1166 3.32582 16.8455 4.14703 18.0031 5.54979C18.3546 5.97576 18.276 6.59827 17.85 6.94979C17.424 7.30131 16.8015 7.27576 16.45 6.84979C15.6372 5.86479 14.3821 5.25391 12.6253 5.04975C10.0647 4.75216 8.25383 5.76788 8.25383 7.37319C8.25383 8.08696 8.49272 8.59298 9.01563 9.18294C9.24071 9.43689 9.66268 9.70847 10.2815 9.99769H7.1922C7.08082 9.83451 7.0123 9.73355 6.98666 9.69482Z" /></svg>
icon:fmt_subscript = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.7593 5.65081C17.1187 5.23148 17.0701 4.60018 16.6508 4.24076C16.2315 3.88134 15.6002 3.9299 15.2408 4.34923L10 10.4634L4.75932 4.34923C4.3999 3.9299 3.7686 3.88134 3.34928 4.24076C2.92995 4.60018 2.88139 5.23148 3.24081 5.65081L8.68297 12L3.24076 18.3492C2.88134 18.7686 2.9299 19.3999 3.34923 19.7593C3.76855 20.1187 4.39985 20.0701 4.75927 19.6508L10 13.5366L15.0695 19.4509C15.2184 18.622 15.5894 17.9787 16.0124 17.4778L11.3171 12L16.7593 5.65081ZM18.7358 14.75C18.3494 14.75 18 15.1146 18 15.5227C18 16.075 17.5523 16.5227 17 16.5227C16.4477 16.5227 16 16.075 16 15.5227C16 14.1581 17.1023 12.75 18.7358 12.75C19.6657 12.75 20.5787 13.1848 21.0961 13.9803C21.6437 14.8221 21.6423 15.8979 21.0445 16.9156C20.7375 17.4381 20.3217 17.8239 19.9387 18.1264C19.7464 18.2782 19.5499 18.4185 19.3711 18.5449L19.293 18.6001C19.1396 18.7083 19.0011 18.806 18.867 18.907C18.706 19.0281 18.5697 19.1403 18.4562 19.25H20.4506C21.0028 19.25 21.4506 19.6977 21.4506 20.25C21.4506 20.8023 21.0028 21.25 20.4506 21.25H17.0164L17.0082 21.25L17 21.25C16.4477 21.25 16 20.8023 16 20.25C16 18.7329 16.9019 17.8827 17.6644 17.3089C17.8251 17.188 17.9916 17.0705 18.1437 16.9633L18.2168 16.9116C18.394 16.7864 18.5523 16.6728 18.6991 16.5569C18.9941 16.3239 19.193 16.1188 19.32 15.9025C19.59 15.443 19.4967 15.1893 19.4196 15.0708C19.3124 14.9061 19.0683 14.75 18.7358 14.75Z" /></svg>
icon:fmt_superscript = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M18.7358 3.75C18.3494 3.75 18 4.11459 18 4.52273C18 5.07501 17.5523 5.52273 17 5.52273C16.4477 5.52273 16 5.07501 16 4.52273C16 3.15814 17.1023 1.75 18.7358 1.75C19.6657 1.75 20.5787 2.18484 21.0961 2.98029C21.6437 3.82206 21.6423 4.89795 21.0445 5.91563C20.7375 6.43806 20.3217 6.82388 19.9387 7.12638C19.7464 7.27821 19.5499 7.41849 19.3711 7.54486L19.293 7.60005C19.1396 7.70832 19.0011 7.80601 18.867 7.90698C18.706 8.02812 18.5697 8.14034 18.4562 8.25H20.4506C21.0028 8.25 21.4506 8.69772 21.4506 9.25C21.4506 9.80229 21.0028 10.25 20.4506 10.25H17.0164L17.0082 10.25L17 10.25C16.4477 10.25 16 9.80228 16 9.25C16 7.73289 16.9019 6.8827 17.6644 6.30893C17.8251 6.18796 17.9916 6.07051 18.1437 5.96325L18.2168 5.91163C18.394 5.78641 18.5523 5.67278 18.6991 5.55686C18.9941 5.32385 19.193 5.11876 19.32 4.90255C19.59 4.44296 19.4967 4.1893 19.4196 4.07084C19.3124 3.90607 19.0683 3.75 18.7358 3.75ZM11.3171 12L15.7172 6.8666C15.8502 6.67034 15.9942 6.49206 16.1423 6.33C15.4965 6.02298 15.0413 5.38002 15.0027 4.627L10 10.4634L4.75932 4.34923C4.3999 3.9299 3.7686 3.88134 3.34928 4.24076C2.92995 4.60018 2.88139 5.23148 3.24081 5.65081L8.68296 12L3.24076 18.3492C2.88134 18.7686 2.9299 19.3999 3.34923 19.7593C3.76855 20.1187 4.39985 20.0701 4.75927 19.6508L10 13.5366L15.2408 19.6508C15.6002 20.0701 16.2315 20.1187 16.6509 19.7593C17.0702 19.3999 17.1187 18.7686 16.7593 18.3492L11.3171 12Z" /></svg>
icon:fmt_toolbar = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 20 20" fill="#000000"><path d="M16 17.5C16 17.7761 16.2239 18 16.5 18C16.7761 18 17 17.7761 17 17.5V2.5C17 2.22386 16.7761 2 16.5 2C16.2239 2 16 2.22386 16 2.5V17.5Z" /><path d="M10 4C8.89543 4 8 4.89543 8 6V14C8 15.1046 8.89543 16 10 16H12C13.1046 16 14 15.1046 14 14V6C14 4.89543 13.1046 4 12 4H10Z" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.00001 4.5C6.00001 3.94772 6.44774 3.5 7.00002 3.5C7.5523 3.5 8.00001 3.94771 8.00001 4.5V10.501C7.99662 13.9635 9.31945 15.5 12.2471 15.5C15.1751 15.5 16.5 13.9629 16.5 10.5V4.5C16.5 3.94772 16.9477 3.5 17.5 3.5C18.0523 3.5 18.5 3.94771 18.5 4.5V10.5C18.5 15.0391 16.3203 17.5 12.2471 17.5C8.17356 17.5 5.99557 15.0386 6.00001 10.5V4.5ZM7.00001 21C6.44772 21 6.00001 20.5523 6.00001 20C6.00001 19.4477 6.44772 19 7.00001 19H17.5C18.0523 19 18.5 19.4477 18.5 20C18.5 20.5523 18.0523 21 17.5 21H7.00001Z" /></svg>
icon:search = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M15.8432 17.3679C14.4988 18.392 12.8204 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11C19 12.8768 18.3537 14.6027 17.2715 15.9672L21.6982 20.2841C22.0936 20.6697 22.1015 21.3028 21.7159 21.6982C21.3303 22.0936 20.6972 22.1015 20.3018 21.7159L15.8432 17.3679ZM17 11C17 7.68629 14.3137 5 11 5C7.68629 5 5 7.68629 5 11C5 14.3137 7.68629 17 11 17C14.3137 17 17 14.3137 17 11Z" /></svg>
icon:search_auto = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M11.4048 9.46478L2.69814 18.1785C1.81212 19.0652 1.81262 20.5022 2.69924 21.3883C3.58585 22.2743 5.02284 22.2738 5.90895 21.3871L14.6148 12.6748L11.4048 9.46478ZM16.8518 15.0068L16.75 15C16.3703 15 16.0565 15.2822 16.0068 15.6482L16 15.75V16.5H15.25C14.8703 16.5 14.5565 16.7822 14.5068 17.1482L14.5 17.25C14.5 17.6297 14.7822 17.9435 15.1482 17.9932L15.25 18H16V18.75C16 19.1297 16.2822 19.4435 16.6482 19.4932L16.75 19.5C17.1297 19.5 17.4435 19.2178 17.4932 18.8518L17.5 18.75V18H18.25C18.6297 18 18.9435 17.7178 18.9932 17.3518L19 17.25C19 16.8703 18.7178 16.5565 18.3518 16.5068L18.25 16.5H17.5V15.75C17.5 15.3703 17.2178 15.0565 16.8518 15.0068L16.75 15L16.8518 15.0068ZM13.3136 7.56538L13.1775 7.69092L12.4658 8.40378L15.6758 11.6138L16.3879 10.9003C17.2654 10.0213 17.2651 8.59738 16.3868 7.71848L16.2304 7.5715C15.3931 6.85388 14.1533 6.85191 13.3136 7.56538ZM6.85177 5.00685L6.75 5C6.3703 5 6.05651 5.28215 6.00685 5.64823L6 5.75V6.5H5.25C4.8703 6.5 4.55651 6.78215 4.50685 7.14823L4.5 7.25C4.5 7.6297 4.78215 7.94349 5.14823 7.99315L5.25 8H6V8.75C6 9.1297 6.28215 9.44349 6.64823 9.49315L6.75 9.5C7.1297 9.5 7.44349 9.21785 7.49315 8.85177L7.5 8.75V8H8.25C8.6297 8 8.94349 7.71785 8.99315 7.35177L9 7.25C9 6.8703 8.71785 6.55651 8.35177 6.50685L8.25 6.5H7.5V5.75C7.5 5.3703 7.21785 5.05651 6.85177 5.00685L6.75 5L6.85177 5.00685ZM18.8518 3.00685L18.75 3C18.3703 3 18.0565 3.28215 18.0068 3.64823L18 3.75V4.5H17.25C16.8703 4.5 16.5565 4.78215 16.5068 5.14823L16.5 5.25C16.5 5.6297 16.7822 5.94349 17.1482 5.99315L17.25 6H18V6.75C18 7.1297 18.2822 7.44349 18.6482 7.49315L18.75 7.5C19.1297 7.5 19.4435 7.21785 19.4932 6.85177L19.5 6.75V6H20.25C20.6297 6 20.9435 5.71785 20.9932 5.35177L21 5.25C21 4.8703 20.7178 4.55651 20.3518 4.50685L20.25 4.5H19.5V3.75C19.5 3.3703 19.2178 3.05651 18.8518 3.00685L18.75 3L18.8518 3.00685Z" /></svg>
icon:search_cancel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.2097 4.3871L4.29289 4.29289C4.65338 3.93241 5.22061 3.90468 5.6129 4.2097L5.70711 4.29289L12 10.585L18.2929 4.29289C18.6834 3.90237 19.3166 3.90237 19.7071 4.29289C20.0976 4.68342 20.0976 5.31658 19.7071 5.70711L13.415 12L19.7071 18.2929C20.0676 18.6534 20.0953 19.2206 19.7903 19.6129L19.7071 19.7071C19.3466 20.0676 18.7794 20.0953 18.3871 19.7903L18.2929 19.7071L12 13.415L5.70711 19.7071C5.31658 20.0976 4.68342 20.0976 4.29289 19.7071C3.90237 19.3166 3.90237 18.6834 4.29289 18.2929L10.585 12L4.29289 5.70711C3.93241 5.34662 3.90468 4.77939 4.2097 4.3871L4.29289 4.29289L4.2097 4.3871Z" /></svg>
icon:search_case = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.5142 2.7501C16.9323 2.75603 17.3026 3.0215 17.4425 3.41559L22.9425 18.9156C23.1271 19.4361 22.8549 20.0077 22.3344 20.1924C21.8139 20.3771 21.2423 20.1049 21.0576 19.5844L19.7857 16L12.8304 16L11.4326 19.611C11.2332 20.126 10.6541 20.3819 10.139 20.1826C9.62399 19.9832 9.36808 19.404 9.56746 18.889L15.5675 3.38901C15.7184 2.99904 16.0961 2.74417 16.5142 2.7501ZM16.4593 6.62545L13.6046 14L19.076 14L16.4593 6.62545ZM8.25 20.2604C7.79939 20.2604 7.41867 19.9625 7.29352 19.5529C6.40302 20.0157 5.55589 20.2604 4.75 20.2604C2.77954 20.2604 1.25 18.8599 1.25 16.7604C1.25 15.8382 1.56906 15.0234 2.16035 14.4079C2.75035 13.7938 3.59693 13.3929 4.62959 13.2677C5.48568 13.1638 6.35256 13.21 7.22644 13.4026C7.18035 13.0648 7.06388 12.8244 6.88899 12.6546C6.65902 12.4314 6.28535 12.2882 5.70034 12.2591C4.75405 12.2121 4.148 12.3504 3.82178 12.5791C3.3696 12.8962 2.74598 12.7867 2.42888 12.3345C2.11179 11.8823 2.22131 11.2587 2.6735 10.9416C3.39111 10.4384 4.34684 10.2302 5.50465 10.2515L5.50864 10.2516L5.79966 10.2616C6.82486 10.3126 7.66878 10.6349 8.26882 11.2072C8.87029 11.7809 9.20249 12.5827 9.24525 13.5444L9.24544 13.55L9.25 13.7604V19.2604C9.25 19.7668 8.87372 20.185 8.38538 20.2513L8.37699 20.2524L8.2584 20.2604H8.25ZM4.87041 15.2895C4.29054 15.3598 3.88858 15.5454 3.63341 15.7967C3.38209 16.0442 3.25 16.3779 3.25 16.7967C3.25 17.2894 3.40867 17.6583 3.66052 17.9041C3.91333 18.1508 4.28388 18.2967 4.75 18.2967C5.35855 18.2967 6.14677 18.0129 7.11197 17.3755L7.249 17.282V15.5105L7.12728 15.4742C6.3497 15.2606 5.59939 15.201 4.87041 15.2895Z" /></svg>
icon:search_loop = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M14.7123 2.28878L14.6251 2.21113C14.2326 1.90052 13.6607 1.92641 13.2981 2.28878L13.2204 2.37594C12.9096 2.76818 12.9355 3.33963 13.2981 3.702L14.597 4.99899L8.99921 4.99919L8.75859 5.00325C5.00445 5.12998 2 8.21112 2 11.9935C2 13.4382 2.43833 14.7806 3.18863 15.8918C3.37024 16.1432 3.666 16.3068 4 16.3068C4.55228 16.3068 5 15.8594 5 15.3075C5 15.0914 4.93132 14.8912 4.81525 14.7288L4.68008 14.5107C4.24775 13.7716 4 12.9114 4 11.9935C4 9.23444 6.23822 6.99779 8.99921 6.99779L14.595 6.99758L13.2981 8.29497L13.2204 8.38213C12.9096 8.77438 12.9355 9.34582 13.2981 9.7082C13.6886 10.0984 14.3218 10.0984 14.7123 9.7082L17.7175 6.7051L17.7952 6.61794C18.106 6.2257 18.0801 5.65425 17.7175 5.29188L14.7123 2.28878ZM20.7865 8.06013C20.6034 7.82751 20.3191 7.67811 20 7.67811C19.4477 7.67811 19 8.12551 19 8.67741C19 8.88559 19.0637 9.0789 19.1717 9.23841C19.6952 10.0282 20 10.9753 20 11.9935C20 14.7525 17.7618 16.9892 15.0008 16.9892L9.415 16.9886L10.7087 15.6972L10.7923 15.6025C11.0733 15.2408 11.0713 14.7307 10.7864 14.3712L10.7087 14.284L10.6139 14.2004C10.252 13.9196 9.7415 13.9216 9.38169 14.2063L9.29447 14.284L6.28926 17.2871L6.20562 17.3818C5.92465 17.7435 5.92663 18.2536 6.21156 18.6132L6.28926 18.7003L9.29447 21.7034L9.38867 21.7865C9.78097 22.0913 10.3482 22.0636 10.7087 21.7034C11.0713 21.341 11.0972 20.7696 10.7864 20.3773L10.7087 20.2902L9.405 18.9872L15.0008 18.9878L15.2414 18.9837C18.9956 18.857 22 15.7759 22 11.9935C22 10.5336 21.5524 9.17809 20.7868 8.05666L20.7865 8.06013Z" /></svg>
icon:search_preserve = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M8.4427 3.41559C8.30286 3.0215 7.93257 2.75603 7.51445 2.7501C7.09632 2.74417 6.71866 2.99904 6.5677 3.38901L0.567701 18.889C0.368329 19.404 0.624231 19.9832 1.13927 20.1826C1.65432 20.3819 2.23347 20.126 2.43284 19.611L3.83064 16L10.786 16L12.0578 19.5844C12.2425 20.1049 12.8142 20.3771 13.3347 20.1924C13.8552 20.0077 14.1274 19.4361 13.9427 18.9156L8.4427 3.41559ZM4.60484 14L7.4595 6.62545L10.0763 14L4.60484 14ZM16 3C16.5523 3 17 3.44772 17 4V11.6187C17.5883 11.2252 18.2714 11 19 11C21.2091 11 23 13.0707 23 15.625C23 18.1793 21.2091 20.25 19 20.25C18.2467 20.25 17.5421 20.0092 16.9405 19.5906C16.8012 19.9752 16.4327 20.25 16 20.25C15.4477 20.25 15 19.8023 15 19.25V4C15 3.44772 15.4477 3 16 3ZM19 18.25C19.8419 18.25 21 17.3572 21 15.625C21 13.8928 19.8419 13 19 13C18.1581 13 17 13.8928 17 15.625C17 17.3572 18.1581 18.25 19 18.25Z" /></svg>
icon:search_project = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 2V8C12 9.10457 12.8954 10 14 10H20V20C20 21.1046 19.1046 22 18 22H11.1904C12.3112 20.8321 13 19.2465 13 17.5C13 13.9101 10.0899 11 6.5 11C5.6141 11 4.76959 11.1772 4 11.4982V4C4 2.89543 4.89543 2 6 2H12ZM13.5 2.5V8C13.5 8.27614 13.7239 8.5 14 8.5H19.5L13.5 2.5ZM12 17.5C12 20.5376 9.53757 23 6.5 23C3.46243 23 1 20.5376 1 17.5C1 14.4624 3.46243 12 6.5 12C9.53757 12 12 14.4624 12 17.5ZM7 14.5C7 14.2239 6.77614 14 6.5 14C6.22386 14 6 14.2239 6 14.5V19.2929L4.35355 17.6464C4.15829 17.4512 3.84171 17.4512 3.64645 17.6464C3.45118 17.8417 3.45118 18.1583 3.64645 18.3536L6.14645 20.8536C6.34171 21.0488 6.65829 21.0488 6.85355 20.8536L9.35355 18.3536C9.54882 18.1583 9.54882 17.8417 9.35355 17.6464C9.15829 17.4512 8.84171 17.4512 8.64645 17.6464L7 19.2929V14.5Z" /></svg>
icon:search_regex = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 20 20" fill="#000000"><path d="M12.2461 4.75C12.2461 4.33579 11.9103 4 11.4961 4C11.0819 4 10.7461 4.33579 10.7461 4.75V6.60778L8.98197 6.03458C8.58802 5.90658 8.16491 6.12216 8.03691 6.51611C7.90891 6.91005 8.1245 7.33316 8.51844 7.46116L10.2865 8.03564L9.19336 9.54021C8.94989 9.87531 9.02418 10.3443 9.35928 10.5878C9.69439 10.8313 10.1634 10.757 10.4069 10.4219L11.4979 8.92017L12.589 10.4219C12.8325 10.757 13.3015 10.8313 13.6366 10.5878C13.9717 10.3443 14.046 9.87531 13.8025 9.54021L12.7101 8.03666L14.4813 7.46116C14.8753 7.33316 15.0909 6.91005 14.9629 6.51611C14.8349 6.12216 14.4118 5.90658 14.0178 6.03458L12.2461 6.61024V4.75ZM6.5 16C7.32843 16 8 15.3284 8 14.5C8 13.6716 7.32843 13 6.5 13C5.67157 13 5 13.6716 5 14.5C5 15.3284 5.67157 16 6.5 16Z" /></svg>
icon:search_replace = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M20.9519 3.0481C19.5543 1.65058 17.2885 1.65064 15.8911 3.04825L14.9995 3.93991L20.0602 9.00057L20.952 8.10861C22.3493 6.71112 22.3493 4.4455 20.9519 3.0481ZM3.94103 14.9997L13.9389 5.00064L18.9996 10.0613L9.00191 20.0601C8.59546 20.4666 8.08418 20.7523 7.52498 20.8855L2.92373 21.981C2.67037 22.0413 2.40385 21.9659 2.21968 21.7817C2.03552 21.5976 1.96009 21.3311 2.02041 21.0777L3.116 16.4762C3.2491 15.9172 3.5347 15.4061 3.94103 14.9997ZM2.75 3H14.5252L13.0254 4.5H2.75C2.33579 4.5 2 4.16421 2 3.75C2 3.33579 2.33579 3 2.75 3ZM2.75 7H10.5257L9.02584 8.5H2.75C2.33579 8.5 2 8.16421 2 7.75C2 7.33579 2.33579 7 2.75 7ZM2.75 11H6.52613L5.02631 12.5H2.75C2.33579 12.5 2 12.1642 2 11.75C2 11.3358 2.33579 11 2.75 11Z" /></svg>
icon:search_word = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 20 20" fill="#000000"><path d="M19 15.75V16.25C18.9995 16.714 18.8149 17.1588 18.4869 17.4869C18.1588 17.8149 17.714 17.9995 17.25 18H2.75C2.28603 17.9995 1.84122 17.8149 1.51315 17.4869C1.18507 17.1588 1.00053 16.714 1 16.25V15.75C1 15.5511 1.07902 15.3603 1.21967 15.2197C1.36032 15.079 1.55109 15 1.75 15C1.94891 15 2.13968 15.079 2.28033 15.2197C2.42098 15.3603 2.5 15.5511 2.5 15.75V16.25C2.5 16.3163 2.52634 16.3799 2.57322 16.4268C2.62011 16.4737 2.6837 16.5 2.75 16.5H17.25C17.3163 16.5 17.3799 16.4737 17.4268 16.4268C17.4737 16.3799 17.5 16.3163 17.5 16.25V15.75C17.5 15.5511 17.579 15.3603 17.7197 15.2197C17.8603 15.079 18.0511 15 18.25 15C18.4489 15 18.6397 15.079 18.7803 15.2197C18.921 15.3603 19 15.5511 19 15.75ZM3.833 10.376C4.58876 9.90847 5.47418 9.69473 6.36 9.766C6.73088 9.78595 7.09912 9.84018 7.46 9.928C7.43978 9.76562 7.37873 9.61101 7.28254 9.47863C7.18636 9.34625 7.05819 9.24041 6.91 9.171C6.51527 8.99061 6.08217 8.91024 5.649 8.937C5.28112 8.94435 4.91825 9.02385 4.581 9.171C4.49288 9.21506 4.39695 9.24133 4.29868 9.24831C4.20041 9.2553 4.10173 9.24286 4.00827 9.2117C3.9148 9.18055 3.82839 9.13129 3.75397 9.06674C3.67954 9.00219 3.61856 8.92362 3.5745 8.8355C3.53044 8.74738 3.50417 8.65145 3.49719 8.55318C3.4902 8.45491 3.50264 8.35623 3.5338 8.26277C3.56495 8.1693 3.61421 8.08289 3.67876 8.00847C3.74331 7.93404 3.82188 7.87306 3.91 7.829C4.4405 7.58398 5.01579 7.45088 5.6 7.438C6.28548 7.4015 6.96929 7.53586 7.59 7.829C8.05813 8.07902 8.44181 8.46196 8.69272 8.92961C8.94362 9.39726 9.05054 9.9287 9 10.457V14.5C9.00743 14.6989 8.93553 14.8926 8.80013 15.0385C8.66473 15.1844 8.47691 15.2706 8.278 15.278C8.07909 15.2854 7.88537 15.2135 7.73947 15.0781C7.59357 14.9427 7.50743 14.7549 7.5 14.556C7.07528 14.8496 6.5942 15.0518 6.08725 15.1497C5.5803 15.2477 5.05852 15.2393 4.555 15.125C4.05938 14.9973 3.61222 14.7268 3.2691 14.347C2.92598 13.9672 2.70204 13.495 2.62511 12.989C2.54819 12.483 2.62167 11.9656 2.83642 11.501C3.05117 11.0364 3.39772 10.6452 3.833 10.376ZM4.944 13.676C5.41934 13.7311 5.90094 13.6688 6.34657 13.4944C6.79221 13.3201 7.18826 13.039 7.5 12.676V11.5C7.10744 11.366 6.69823 11.2869 6.284 11.265C5.71974 11.2111 5.15291 11.3375 4.665 11.626C4.47034 11.7351 4.31302 11.9003 4.21349 12.1C4.11396 12.2998 4.07683 12.5248 4.10692 12.7459C4.13702 12.9671 4.23295 13.174 4.38223 13.3399C4.53152 13.5057 4.72726 13.6229 4.944 13.676ZM11 14.5V4C11 3.80109 11.079 3.61032 11.2197 3.46967C11.3603 3.32902 11.5511 3.25 11.75 3.25C11.9489 3.25 12.1397 3.32902 12.2803 3.46967C12.421 3.61032 12.5 3.80109 12.5 4V8.657C12.9868 8.23715 13.6072 8.00426 14.25 8C15.11 8.07126 15.9072 8.47866 16.4688 9.13386C17.0304 9.78905 17.3111 10.6392 17.25 11.5C17.3111 12.3608 17.0304 13.2109 16.4688 13.8661C15.9072 14.5213 15.11 14.9287 14.25 15C13.6073 14.9952 12.9871 14.7624 12.5 14.343V14.5C12.5 14.6989 12.421 14.8897 12.2803 15.0303C12.1397 15.171 11.9489 15.25 11.75 15.25C11.5511 15.25 11.3603 15.171 11.2197 15.0303C11.079 14.8897 11 14.6989 11 14.5ZM12.75 11.5C12.6923 11.9627 12.8164 12.4298 13.0961 12.8029C13.3759 13.176 13.7896 13.4259 14.25 13.5C14.7104 13.4259 15.1241 13.176 15.4039 12.8029C15.6836 12.4298 15.8077 11.9627 15.75 11.5C15.8077 11.0373 15.6836 10.5702 15.4039 10.1971C15.1241 9.82405 14.7104 9.57413 14.25 9.5C13.7896 9.57413 13.3759 9.82405 13.0961 10.1971C12.8164 10.5702 12.6923 11.0373 12.75 11.5Z" /></svg>
icon:bullet-off = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 22.0021C17.5237 22.0021 22.0015 17.5243 22.0015 12.0006C22.0015 6.47687 17.5237 1.99902 12 1.99902C6.47626 1.99902 1.99841 6.47687 1.99841 12.0006C1.99841 17.5243 6.47626 22.0021 12 22.0021ZM12 20.5021C7.30469 20.5021 3.49841 16.6959 3.49841 12.0006C3.49841 7.3053 7.30469 3.49902 12 3.49902C16.6952 3.49902 20.5015 7.3053 20.5015 12.0006C20.5015 16.6959 16.6952 20.5021 12 20.5021Z" /></svg>
icon:bullet-on = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 1.99902C17.5237 1.99902 22.0015 6.47687 22.0015 12.0006C22.0015 17.5243 17.5237 22.0021 12 22.0021C6.47626 22.0021 1.99841 17.5243 1.99841 12.0006C1.99841 6.47687 6.47626 1.99902 12 1.99902ZM12 3.49902C7.30469 3.49902 3.49841 7.3053 3.49841 12.0006C3.49841 16.6959 7.30469 20.5021 12 20.5021C16.6952 20.5021 20.5015 16.6959 20.5015 12.0006C20.5015 7.3053 16.6952 3.49902 12 3.49902ZM11.9965 5.99902C15.3092 5.99902 17.9946 8.68447 17.9946 11.9971C17.9946 15.3098 15.3092 17.9953 11.9965 17.9953C8.68386 17.9953 5.99841 15.3098 5.99841 11.9971C5.99841 8.68447 8.68386 5.99902 11.9965 5.99902Z" /></svg>
icon:unfold-hide = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M9 17.8983C9 18.9722 10.2649 19.5462 11.0731 18.839L17.3838 13.3172C18.1806 12.6199 18.1806 11.3804 17.3838 10.6831L11.0731 5.16132C10.2649 4.45412 9 5.02809 9 6.10204V17.8983Z" /></svg>
icon:unfold-show = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.10204 8C5.0281 8 4.45412 9.2649 5.16132 10.0731L10.6831 16.3838C11.3804 17.1806 12.6199 17.1806 13.3172 16.3838L18.839 10.0731C19.5462 9.2649 18.9722 8 17.8983 8H6.10204Z" /></svg>
icon:sb_build = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M18.4923 2.33034L21.671 5.50911C22.5497 6.38779 22.5497 7.81241 21.671 8.69109L19.0866 11.275C20.1696 11.4375 21 12.3718 21 13.5V18.75C21 19.9926 19.9926 21 18.75 21H5.25C4.00736 21 3 19.9926 3 18.75V5.25001C3 4.00736 4.00736 3.00001 5.25 3.00001H10.5C11.6289 3.00001 12.5637 3.83146 12.7253 4.91541L15.3103 2.33034C16.189 1.45166 17.6136 1.45166 18.4923 2.33034ZM4.5 18.75C4.5 19.1642 4.83579 19.5 5.25 19.5L11.249 19.4993L11.25 12.75L4.5 12.7493V18.75ZM12.749 19.4993L18.75 19.5C19.1642 19.5 19.5 19.1642 19.5 18.75V13.5C19.5 13.0858 19.1642 12.75 18.75 12.75L12.749 12.7493V19.4993ZM10.5 4.50001H5.25C4.83579 4.50001 4.5 4.83579 4.5 5.25001V11.2493H11.25V5.25001C11.25 4.83579 10.9142 4.50001 10.5 4.50001ZM12.75 9.30933V11.25L14.69 11.2493L12.75 9.30933Z" /></svg>
icon:sb_novel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.5 2C5.11929 2 4 3.11929 4 4.5V19.5C4 20.8807 5.11929 22 6.5 22H19.75C20.1642 22 20.5 21.6642 20.5 21.25C20.5 20.8358 20.1642 20.5 19.75 20.5H6.5C5.94772 20.5 5.5 20.0523 5.5 19.5H19.75C20.1642 19.5 20.5 19.1642 20.5 18.75V4.5C20.5 3.11929 19.3807 2 18 2H6.5ZM8 5H16C16.5523 5 17 5.44772 17 6V7C17 7.55228 16.5523 8 16 8H8C7.44772 8 7 7.55228 7 7V6C7 5.44772 7.44772 5 8 5Z" /></svg>
icon:sb_project = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 20 20" fill="#000000"><path d="M8 7H15.5C16.3284 7 17 6.32843 17 5.5V4.5C17 3.67157 16.3284 3 15.5 3H8V7ZM7 3H4.5C3.67157 3 3 3.67157 3 4.5V5.5C3 6.32843 3.67157 7 4.5 7H7V3ZM10 12H15.5C16.3284 12 17 11.3284 17 10.5V9.5C17 8.67157 16.3284 8 15.5 8H10V12ZM9 8H6.5C5.67157 8 5 8.67157 5 9.5V10.5C5 11.3284 5.67157 12 6.5 12H9V8ZM15.5 17H10V13H15.5C16.3284 13 17 13.6716 17 14.5V15.5C17 16.3284 16.3284 17 15.5 17ZM6.5 13H9V17H6.5C5.67157 17 5 16.3284 5 15.5V14.5C5 13.6716 5.67157 13 6.5 13Z" /></svg>
icon:sb_search = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M15.8432 17.3679C14.4988 18.392 12.8204 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11C19 12.8768 18.3537 14.6027 17.2715 15.9672L21.6982 20.2841C22.0936 20.6697 22.1015 21.3028 21.7159 21.6982C21.3303 22.0936 20.6972 22.1015 20.3018 21.7159L15.8432 17.3679ZM17 11C17 7.68629 14.3137 5 11 5C7.68629 5 5 7.68629 5 11C5 14.3137 7.68629 17 11 17C14.3137 17 17 14.3137 17 11Z" /></svg>
icon:sb_stats = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M21 18.251C21 17.0089 19.9931 16.002 18.7509 16.002H5.24908C4.00695 16.002 3 17.0089 3 18.251C3 19.4932 4.00695 20.5001 5.24908 20.5001H18.7509C19.9931 20.5001 21 19.4932 21 18.251ZM17 11.751C17 10.5089 15.9931 9.50195 14.7509 9.50195L5.24908 9.50195C4.00695 9.50195 3 10.5089 3 11.751C3 12.9932 4.00695 14.0001 5.24908 14.0001H14.7509C15.9931 14.0001 17 12.9932 17 11.751ZM13 5.25104C13 4.0089 11.9931 3.00195 10.7509 3.00195L5.24908 3.00195C4.00695 3.00195 3 4.0089 3 5.25104C3 6.49317 4.00695 7.50012 5.24908 7.50012L10.7509 7.50012C11.9931 7.50012 13 6.49317 13 5.25104Z" /></svg>
icon:sb_story = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.25 4C3.00736 4 2 5.00736 2 6.25V8.75C2 9.99264 3.00736 11 4.25 11H6.75C7.99264 11 9 9.99264 9 8.75V6.25C9 5.00736 7.99264 4 6.75 4H4.25ZM11.25 5C10.8358 5 10.5 5.33579 10.5 5.75C10.5 6.16421 10.8358 6.5 11.25 6.5H21.25C21.6642 6.5 22 6.16421 22 5.75C22 5.33579 21.6642 5 21.25 5H11.25ZM11.25 8C10.8358 8 10.5 8.33579 10.5 8.75C10.5 9.16421 10.8358 9.5 11.25 9.5H18.25C18.6642 9.5 19 9.16421 19 8.75C19 8.33579 18.6642 8 18.25 8H11.25ZM4.25 13C3.00736 13 2 14.0074 2 15.25V17.75C2 18.9926 3.00736 20 4.25 20H6.75C7.99264 20 9 18.9926 9 17.75V15.25C9 14.0074 7.99264 13 6.75 13H4.25ZM11.25 14C10.8358 14 10.5 14.3358 10.5 14.75C10.5 15.1642 10.8358 15.5 11.25 15.5H21.25C21.6642 15.5 22 15.1642 22 14.75C22 14.3358 21.6642 14 21.25 14H11.25ZM11.25 17C10.8358 17 10.5 17.3358 10.5 17.75C10.5 18.1642 10.8358 18.5 11.25 18.5H18.25C18.6642 18.5 19 18.1642 19 17.75C19 17.3358 18.6642 17 18.25 17H11.25Z" /></svg>
icon:theme_light = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 2C12.4142 2 12.75 2.33579 12.75 2.75V4.25C12.75 4.66421 12.4142 5 12 5C11.5858 5 11.25 4.66421 11.25 4.25V2.75C11.25 2.33579 11.5858 2 12 2ZM17 12C17 14.7614 14.7614 17 12 17C9.23858 17 7 14.7614 7 12C7 9.23858 9.23858 7 12 7C14.7614 7 17 9.23858 17 12ZM21.25 12.75C21.6642 12.75 22 12.4142 22 12C22 11.5858 21.6642 11.25 21.25 11.25H19.75C19.3358 11.25 19 11.5858 19 12C19 12.4142 19.3358 12.75 19.75 12.75H21.25ZM12 19C12.4142 19 12.75 19.3358 12.75 19.75V21.25C12.75 21.6642 12.4142 22 12 22C11.5858 22 11.25 21.6642 11.25 21.25V19.75C11.25 19.3358 11.5858 19 12 19ZM4.25 12.75C4.66421 12.75 5 12.4142 5 12C5 11.5858 4.66421 11.25 4.25 11.25H2.75C2.33579 11.25 2 11.5858 2 12C2 12.4142 2.33579 12.75 2.75 12.75H4.25ZM4.21967 4.22004C4.51256 3.92715 4.98744 3.92715 5.28033 4.22004L6.78033 5.72004C7.07322 6.01294 7.07322 6.48781 6.78033 6.7807C6.48744 7.0736 6.01256 7.0736 5.71967 6.7807L4.21967 5.2807C3.92678 4.98781 3.92678 4.51294 4.21967 4.22004ZM5.28033 19.7807C4.98744 20.0736 4.51256 20.0736 4.21967 19.7807C3.92678 19.4878 3.92678 19.0129 4.21967 18.72L5.71967 17.22C6.01256 16.9271 6.48744 16.9271 6.78033 17.22C7.07322 17.5129 7.07322 17.9878 6.78033 18.2807L5.28033 19.7807ZM19.7803 4.22004C19.4874 3.92715 19.0126 3.92715 18.7197 4.22004L17.2197 5.72004C16.9268 6.01294 16.9268 6.48781 17.2197 6.7807C17.5126 7.0736 17.9874 7.0736 18.2803 6.7807L19.7803 5.2807C20.0732 4.98781 20.0732 4.51294 19.7803 4.22004ZM18.7197 19.7807C19.0126 20.0736 19.4874 20.0736 19.7803 19.7807C20.0732 19.4878 20.0732 19.0129 19.7803 18.72L18.2803 17.22C17.9874 16.9271 17.5126 16.9271 17.2197 17.22C16.9268 17.5129 16.9268 17.9878 17.2197 18.2807L18.7197 19.7807Z" /></svg>
icon:theme_dark = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M20.0258 17.0014C17.2639 21.7851 11.1471 23.4241 6.3634 20.6622C5.06068 19.9101 3.964 18.8926 3.12872 17.6797C2.84945 17.2741 3.0301 16.7141 3.49369 16.5482C7.26112 15.1997 9.27892 13.6372 10.4498 11.4021C11.6825 9.04908 12.001 6.47162 11.1387 2.93862C11.0195 2.45008 11.4053 1.98492 11.9075 2.01186C13.4645 2.09539 14.9856 2.54263 16.3649 3.33903C21.1486 6.10088 22.7876 12.2177 20.0258 17.0014Z" /></svg>
icon:theme_auto = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22ZM12 20V4C16.4183 4 20 7.58172 20 12C20 16.4183 16.4183 20 12 20Z" /></svg>
icon:btn_ok = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 3C4.45507 3 3 4.45508 3 6.25V17.75C3 19.5449 4.45508 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM16.2802 9.78034L11.2802 14.7801C10.9873 15.073 10.5124 15.073 10.2196 14.7801L8.21576 12.7763C7.92287 12.4834 7.92287 12.0085 8.21576 11.7157C8.50865 11.4228 8.98353 11.4228 9.27642 11.7157L10.7499 13.1891L15.2196 8.71966C15.5125 8.42677 15.9873 8.42678 16.2802 8.71968C16.5731 9.01258 16.5731 9.48746 16.2802 9.78034Z" /></svg>
icon:btn_cancel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 3C4.45507 3 3 4.45508 3 6.25V17.75C3 19.5449 4.45508 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM8.21967 8.21967C8.51256 7.92678 8.98744 7.92678 9.28033 8.21967L12 10.9393L14.7197 8.21967C15.0126 7.92678 15.4874 7.92678 15.7803 8.21967C16.0732 8.51256 16.0732 8.98744 15.7803 9.28033L13.0607 12L15.7803 14.7197C16.0732 15.0126 16.0732 15.4874 15.7803 15.7803C15.4874 16.0732 15.0126 16.0732 14.7197 15.7803L12 13.0607L9.28033 15.7803C8.98744 16.0732 8.51256 16.0732 8.21967 15.7803C7.92678 15.4874 7.92678 15.0126 8.21967 14.7197L10.9393 12L8.21967 9.28033C7.92678 8.98744 7.92678 8.51256 8.21967 8.21967Z" /></svg>
icon:btn_yes = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 3C4.45507 3 3 4.45508 3 6.25V17.75C3 19.5449 4.45508 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM16.2802 9.78034L11.2802 14.7801C10.9873 15.073 10.5124 15.073 10.2196 14.7801L8.21576 12.7763C7.92287 12.4834 7.92287 12.0085 8.21576 11.7157C8.50865 11.4228 8.98353 11.4228 9.27642 11.7157L10.7499 13.1891L15.2196 8.71966C15.5125 8.42677 15.9873 8.42678 16.2802 8.71968C16.5731 9.01258 16.5731 9.48746 16.2802 9.78034Z" /></svg>
icon:btn_no = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 3C4.45507 3 3 4.45508 3 6.25V17.75C3 19.5449 4.45508 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM8.21967 8.21967C8.51256 7.92678 8.98744 7.92678 9.28033 8.21967L12 10.9393L14.7197 8.21967C15.0126 7.92678 15.4874 7.92678 15.7803 8.21967C16.0732 8.51256 16.0732 8.98744 15.7803 9.28033L13.0607 12L15.7803 14.7197C16.0732 15.0126 16.0732 15.4874 15.7803 15.7803C15.4874 16.0732 15.0126 16.0732 14.7197 15.7803L12 13.0607L9.28033 15.7803C8.98744 16.0732 8.51256 16.0732 8.21967 15.7803C7.92678 15.4874 7.92678 15.0126 8.21967 14.7197L10.9393 12L8.21967 9.28033C7.92678 8.98744 7.92678 8.51256 8.21967 8.21967Z" /></svg>
icon:btn_open = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 5C5.55964 5 5 5.55964 5 6.25V17.75C5 18.4404 5.55964 19 6.25 19H17.75C18.4404 19 19 18.4404 19 17.75V14C19 13.4477 19.4477 13 20 13C20.5523 13 21 13.4477 21 14V17.75C21 19.5449 19.5449 21 17.75 21H6.25C4.45507 21 3 19.5449 3 17.75V6.25C3 4.45507 4.45507 3 6.25 3H10C10.5523 3 11 3.44772 11 4C11 4.55228 10.5523 5 10 5H6.25ZM14 5C13.4477 5 13 4.55228 13 4C13 3.44772 13.4477 3 14 3H20C20.5523 3 21 3.44772 21 4V10C21 10.5523 20.5523 11 20 11C19.4477 11 19 10.5523 19 10V6.41421L14.7071 10.7071C14.3166 11.0976 13.6834 11.0976 13.2929 10.7071C12.9024 10.3166 12.9024 9.68342 13.2929 9.29289L17.5858 5H14Z" /></svg>
icon:btn_close = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM15.5303 8.46967L15.4462 8.39705C15.1852 8.2034 14.827 8.20101 14.5636 8.38988L14.4697 8.46967L12 10.939L9.53033 8.46967L9.44621 8.39705C9.18522 8.2034 8.82701 8.20101 8.56362 8.38988L8.46967 8.46967L8.39705 8.55379C8.2034 8.81478 8.20101 9.17299 8.38988 9.43638L8.46967 9.53033L10.939 12L8.46967 14.4697L8.39705 14.5538C8.2034 14.8148 8.20101 15.173 8.38988 15.4364L8.46967 15.5303L8.55379 15.6029C8.81478 15.7966 9.17299 15.799 9.43638 15.6101L9.53033 15.5303L12 13.061L14.4697 15.5303L14.5538 15.6029C14.8148 15.7966 15.173 15.799 15.4364 15.6101L15.5303 15.5303L15.6029 15.4462C15.7966 15.1852 15.799 14.827 15.6101 14.5636L15.5303 14.4697L13.061 12L15.5303 9.53033L15.6029 9.44621C15.7966 9.18522 15.799 8.82701 15.6101 8.56362L15.5303 8.46967L15.4462 8.39705L15.5303 8.46967Z" /></svg>
icon:btn_save = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.75 3H5.75C4.23122 3 3 4.23122 3 5.75V18.25C3 19.7688 4.23122 21 5.75 21H6V15C6 13.7574 7.00736 12.75 8.25 12.75H15.75C16.9926 12.75 18 13.7574 18 15V21H18.25C19.7688 21 21 19.7688 21 18.25V8.28553C21 7.42358 20.6576 6.59693 20.0481 5.98744L18.0126 3.9519C17.4114 3.35079 16.5991 3.00947 15.75 3.00019V7.5C15.75 8.74264 14.7426 9.75 13.5 9.75H9C7.75736 9.75 6.75 8.74264 6.75 7.5V3ZM14.25 3V7.5C14.25 7.91421 13.9142 8.25 13.5 8.25H9C8.58579 8.25 8.25 7.91421 8.25 7.5V3H14.25ZM16.5 21V15C16.5 14.5858 16.1642 14.25 15.75 14.25H8.25C7.83579 14.25 7.5 14.5858 7.5 15V21H16.5Z" /></svg>
icon:btn_browse = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M5.25 3C3.45507 3 2 4.45507 2 6.25V15.1618L4.04451 11.6206C4.8037 10.3057 6.20674 9.49561 7.72512 9.49561L20 9.49561V8.75C20 6.95507 18.5449 5.5 16.75 5.5H11.5607L9.71967 3.65901C9.29771 3.23705 8.72542 3 8.12868 3H5.25ZM7.72512 10.9956L20.7445 10.9956C22.4765 10.9956 23.5591 12.8706 22.6931 14.3706L19.6569 19.6294C19.1657 20.4802 18.2578 21.0044 17.2753 21.0044H4.25594C2.52389 21.0044 1.44136 19.1294 2.30738 17.6294L5.34355 12.3706C5.83479 11.5198 6.74264 10.9956 7.72512 10.9956Z" /></svg>
icon:btn_list = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3 6.25C3 4.45507 4.45507 3 6.25 3H17.75C19.5449 3 21 4.45507 21 6.25V17.75C21 19.5449 19.5449 21 17.75 21H6.25C4.45507 21 3 19.5449 3 17.75V6.25ZM7.75 9.25C8.30228 9.25 8.75 8.80228 8.75 8.25C8.75 7.69772 8.30228 7.25 7.75 7.25C7.19772 7.25 6.75 7.69772 6.75 8.25C6.75 8.80228 7.19772 9.25 7.75 9.25ZM11.25 7.5C10.8358 7.5 10.5 7.83579 10.5 8.25C10.5 8.66421 10.8358 9 11.25 9H16.75C17.1642 9 17.5 8.66421 17.5 8.25C17.5 7.83579 17.1642 7.5 16.75 7.5H11.25ZM11.2501 11.25C10.8358 11.25 10.5001 11.5858 10.5001 12C10.5001 12.4142 10.8358 12.75 11.2501 12.75H16.7499C17.1642 12.75 17.4999 12.4142 17.4999 12C17.4999 11.5858 17.1642 11.25 16.7499 11.25H11.2501ZM10.5001 15.75C10.5001 16.1642 10.8358 16.5 11.2501 16.5H16.7499C17.1642 16.5 17.4999 16.1642 17.4999 15.75C17.4999 15.3358 17.1642 15 16.7499 15H11.2501C10.8358 15 10.5001 15.3358 10.5001 15.75ZM8.75 12C8.75 11.4477 8.30228 11 7.75 11C7.19772 11 6.75 11.4477 6.75 12C6.75 12.5523 7.19772 13 7.75 13C8.30228 13 8.75 12.5523 8.75 12ZM7.75 16.75C8.30228 16.75 8.75 16.3023 8.75 15.75C8.75 15.1977 8.30228 14.75 7.75 14.75C7.19772 14.75 6.75 15.1977 6.75 15.75C6.75 16.3023 7.19772 16.75 7.75 16.75Z" /></svg>
icon:btn_new = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3 6.25C3 4.45507 4.45507 3 6.25 3H17.75C19.5449 3 21 4.45507 21 6.25V17.75C21 19.5449 19.5449 21 17.75 21H6.25C4.45507 21 3 19.5449 3 17.75V6.25ZM12.75 7.75C12.75 7.33579 12.4142 7 12 7C11.5858 7 11.25 7.33579 11.25 7.75V11.25H7.75C7.33579 11.25 7 11.5858 7 12C7 12.4142 7.33579 12.75 7.75 12.75H11.25V16.25C11.25 16.6642 11.5858 17 12 17C12.4142 17 12.75 16.6642 12.75 16.25V12.75H16.25C16.6642 12.75 17 12.4142 17 12C17 11.5858 16.6642 11.25 16.25 11.25H12.75V7.75Z" /></svg>
icon:btn_create = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.0883 6.41228C16.016 6.31886 15.9377 6.2298 15.8539 6.14569C15.5417 5.83255 15.1606 5.59666 14.741 5.45683L13.3632 5.00939C13.257 4.97196 13.165 4.90253 13.1 4.81068C13.0349 4.71883 13 4.60908 13 4.49656C13 4.38404 13.0349 4.27429 13.1 4.18244C13.165 4.09058 13.257 4.02116 13.3632 3.98372L14.741 3.53628C15.1547 3.39352 15.5299 3.15705 15.837 2.84537C16.1357 2.54224 16.3623 2.17595 16.5 1.77372L16.5114 1.73963L16.9592 0.362894C16.9967 0.256782 17.0662 0.164895 17.1581 0.0998993C17.25 0.0349035 17.3598 0 17.4724 0C17.5851 0 17.6949 0.0349035 17.7868 0.0998993C17.8787 0.164895 17.9482 0.256782 17.9857 0.362894L18.4335 1.73963C18.5727 2.15819 18.8077 2.53853 19.1198 2.85041C19.432 3.1623 19.8126 3.39715 20.2315 3.53628L21.6093 3.98372L21.6368 3.99061C21.743 4.02804 21.835 4.09747 21.9 4.18932C21.9651 4.28117 22 4.39092 22 4.50344C22 4.61596 21.9651 4.72571 21.9 4.81756C21.835 4.90942 21.743 4.97884 21.6368 5.01628L20.259 5.46372C19.8402 5.60285 19.4595 5.8377 19.1474 6.14959C18.8353 6.46147 18.6003 6.84181 18.461 7.26037L18.0132 8.63711C18.0092 8.64855 18.0048 8.65983 18 8.67093C17.9605 8.76273 17.8964 8.84212 17.8144 8.9001C17.7224 8.9651 17.6126 9 17.5 9C17.3874 9 17.2776 8.9651 17.1856 8.9001C17.0937 8.8351 17.0242 8.74322 16.9868 8.63711L16.539 7.26037C16.4378 6.95331 16.2851 6.66664 16.0883 6.41228ZM23.7829 10.2132L23.0175 9.9646C22.7848 9.8873 22.5733 9.75683 22.3999 9.58356C22.2265 9.41029 22.0959 9.199 22.0186 8.96646L21.7698 8.20161C21.749 8.14266 21.7104 8.09161 21.6593 8.0555C21.6083 8.01939 21.5473 8 21.4847 8C21.4221 8 21.3611 8.01939 21.31 8.0555C21.259 8.09161 21.2204 8.14266 21.1996 8.20161L20.9508 8.96646C20.875 9.19736 20.7467 9.40761 20.5761 9.58076C20.4055 9.75392 20.1971 9.88529 19.9672 9.9646L19.2018 10.2132C19.1428 10.234 19.0917 10.2725 19.0555 10.3236C19.0194 10.3746 19 10.4356 19 10.4981C19 10.5606 19.0194 10.6216 19.0555 10.6726C19.0917 10.7236 19.1428 10.7622 19.2018 10.783L19.9672 11.0316C20.2003 11.1093 20.412 11.2403 20.5855 11.4143C20.7589 11.5882 20.8893 11.8003 20.9661 12.0335L21.2149 12.7984C21.2357 12.8573 21.2743 12.9084 21.3254 12.9445C21.3764 12.9806 21.4374 13 21.5 13C21.5626 13 21.6236 12.9806 21.6746 12.9445C21.7257 12.9084 21.7643 12.8573 21.7851 12.7984L22.0339 12.0335C22.1113 11.801 22.2418 11.5897 22.4152 11.4164C22.5886 11.2432 22.8001 11.1127 23.0328 11.0354L23.7982 10.7868C23.8572 10.766 23.9083 10.7275 23.9445 10.6764C23.9806 10.6254 24 10.5644 24 10.5019C24 10.4394 23.9806 10.3784 23.9445 10.3274C23.9083 10.2764 23.8572 10.2378 23.7982 10.217L23.7829 10.2132ZM6.25 2H15.2078C14.9931 2.25522 14.7082 2.45227 14.39 2.55903L13.05 2.99903C12.4247 3.22211 12.0018 3.80273 12 4.46903C12.0011 4.83576 12.1397 5.20487 12.369 5.5H7.74689C7.33439 5.5 7 5.83579 7 6.25C7 6.66421 7.33439 7 7.74689 7H13.7531C14.0851 7 14.3664 6.78254 14.4637 6.48175C14.9569 6.66659 15.4216 7.0466 15.59 7.54903L16 8.99903C16.2128 9.62184 16.8014 10.047 17.46 10.049C17.4664 10.0491 17.4729 10.0491 17.4793 10.0491C17.4862 10.0491 17.4931 10.0491 17.5 10.049V17.25C17.5 18.4926 16.4926 19.5 15.25 19.5H6.25C5.00736 19.5 4 18.4926 4 17.25V4.25C4 3.00736 5.00736 2 6.25 2ZM20.0009 12.4652L19.98 12.399C19.8642 12.0456 19.4335 11.9365 19.0739 11.8454C18.9866 11.8233 18.9034 11.8023 18.83 11.779C18.7115 11.7366 18.6007 11.6763 18.5005 11.6021L18.5009 17.25C18.5009 19.0449 17.0458 20.5 15.2509 20.5H6.62891C6.93778 21.3739 7.77121 22 8.75088 22H15.2509C17.8742 22 20.0009 19.8734 20.0009 17.25V12.4652ZM13.7531 14.5H7.74689C7.33439 14.5 7 14.8358 7 15.25C7 15.6642 7.33439 16 7.74689 16H13.7531C14.1656 16 14.5 15.6642 14.5 15.25C14.5 14.8358 14.1656 14.5 13.7531 14.5ZM7.74689 10C7.33439 10 7 10.3358 7 10.75C7 11.1642 7.33439 11.5 7.74689 11.5H13.7531C14.1656 11.5 14.5 11.1642 14.5 10.75C14.5 10.3358 14.1656 10 13.7531 10H7.74689Z" /></svg>
icon:btn_reset = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M7.20711 2.54289C7.59763 2.93342 7.59763 3.56658 7.20711 3.95711L5.41421 5.75H13.25C17.6683 5.75 21.25 9.33172 21.25 13.75C21.25 18.1683 17.6683 21.75 13.25 21.75C8.83172 21.75 5.25 18.1683 5.25 13.75C5.25 13.1977 5.69772 12.75 6.25 12.75C6.80228 12.75 7.25 13.1977 7.25 13.75C7.25 17.0637 9.93629 19.75 13.25 19.75C16.5637 19.75 19.25 17.0637 19.25 13.75C19.25 10.4363 16.5637 7.75 13.25 7.75H5.41421L7.20711 9.54289C7.59763 9.93342 7.59763 10.5666 7.20711 10.9571C6.81658 11.3476 6.18342 11.3476 5.79289 10.9571L2.29289 7.45711C1.90237 7.06658 1.90237 6.43342 2.29289 6.04289L5.79289 2.54289C6.18342 2.15237 6.81658 2.15237 7.20711 2.54289Z" /></svg>
icon:btn_insert = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M13 3C13 2.44772 12.5523 2 12 2C11.4477 2 11 2.44772 11 3V15.0858L7.70711 11.7929C7.31658 11.4024 6.68342 11.4024 6.29289 11.7929C5.90237 12.1834 5.90237 12.8166 6.29289 13.2071L11.2929 18.2071C11.6834 18.5976 12.3166 18.5976 12.7071 18.2071L17.7071 13.2071C18.0976 12.8166 18.0976 12.1834 17.7071 11.7929C17.3166 11.4024 16.6834 11.4024 16.2929 11.7929L13 15.0858V3ZM5 20C4.44772 20 4 20.4477 4 21C4 21.5523 4.44772 22 5 22H19C19.5523 22 20 21.5523 20 21C20 20.4477 19.5523 20 19 20H5Z" /></svg>
icon:btn_apply = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 3C4.45507 3 3 4.45508 3 6.25V17.75C3 19.5449 4.45508 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM16.2802 9.78034L11.2802 14.7801C10.9873 15.073 10.5124 15.073 10.2196 14.7801L8.21576 12.7763C7.92287 12.4834 7.92287 12.0085 8.21576 11.7157C8.50865 11.4228 8.98353 11.4228 9.27642 11.7157L10.7499 13.1891L15.2196 8.71966C15.5125 8.42677 15.9873 8.42678 16.2802 8.71968C16.5731 9.01258 16.5731 9.48746 16.2802 9.78034Z" /></svg>
icon:btn_build = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M18.4923 2.33034L21.671 5.50911C22.5497 6.38779 22.5497 7.81241 21.671 8.69109L19.0866 11.275C20.1696 11.4375 21 12.3718 21 13.5V18.75C21 19.9926 19.9926 21 18.75 21H5.25C4.00736 21 3 19.9926 3 18.75V5.25001C3 4.00736 4.00736 3.00001 5.25 3.00001H10.5C11.6289 3.00001 12.5637 3.83146 12.7253 4.91541L15.3103 2.33034C16.189 1.45166 17.6136 1.45166 18.4923 2.33034ZM4.5 18.75C4.5 19.1642 4.83579 19.5 5.25 19.5L11.249 19.4993L11.25 12.75L4.5 12.7493V18.75ZM12.749 19.4993L18.75 19.5C19.1642 19.5 19.5 19.1642 19.5 18.75V13.5C19.5 13.0858 19.1642 12.75 18.75 12.75L12.749 12.7493V19.4993ZM10.5 4.50001H5.25C4.83579 4.50001 4.5 4.83579 4.5 5.25001V11.2493H11.25V5.25001C11.25 4.83579 10.9142 4.50001 10.5 4.50001ZM12.75 9.30933V11.25L14.69 11.2493L12.75 9.30933Z" /></svg>
icon:btn_print = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M18 17.5V18.75C18 19.9926 16.9926 21 15.75 21H8.25C7.00736 21 6 19.9926 6 18.75V17.499L4.25 17.5001C3.00736 17.5001 2 16.4927 2 15.2501V9.25358C2 7.45865 3.45507 6.00358 5.25 6.00358L5.999 6.003L6 5.25C6 4.00736 7.00736 3 8.25 3H15.7525C16.9951 3 18.0025 4.00736 18.0025 5.25L18.002 6.003L18.7525 6.00358C20.5469 6.00533 22.0011 7.45877 22.0038 9.25244L22.0071 15.2497C22.009 16.4918 21.0021 17.5002 19.7591 17.5009L18 17.5ZM15.75 13.5H8.25C7.83579 13.5 7.5 13.8358 7.5 14.25V18.75C7.5 19.1642 7.83579 19.5 8.25 19.5H15.75C16.1642 19.5 16.5 19.1642 16.5 18.75V14.25C16.5 13.8358 16.1642 13.5 15.75 13.5ZM15.7525 4.5H8.25C7.83579 4.5 7.5 4.83579 7.5 5.25L7.499 6.003H16.502L16.5025 5.25C16.5025 4.83579 16.1667 4.5 15.7525 4.5Z" /></svg>
icon:btn_preview = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M11.9999 9.00462C14.209 9.00462 15.9999 10.7955 15.9999 13.0046C15.9999 15.2138 14.209 17.0046 11.9999 17.0046C9.79073 17.0046 7.99987 15.2138 7.99987 13.0046C7.99987 10.7955 9.79073 9.00462 11.9999 9.00462ZM11.9999 5.5C16.6134 5.5 20.596 8.65001 21.701 13.0644C21.8016 13.4662 21.5574 13.8735 21.1556 13.9741C20.7537 14.0746 20.3465 13.8305 20.2459 13.4286C19.307 9.67796 15.9212 7 11.9999 7C8.07681 7 4.68997 9.68026 3.75273 13.4332C3.65237 13.835 3.24523 14.0794 2.84336 13.9791C2.44149 13.8787 2.19707 13.4716 2.29743 13.0697C3.40052 8.65272 7.38436 5.5 11.9999 5.5Z" /></svg>
icon:add = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M11.8834 3.00673L12 3C12.5128 3 12.9355 3.38604 12.9933 3.88338L13 4V11H20C20.5128 11 20.9355 11.386 20.9933 11.8834L21 12C21 12.5128 20.614 12.9355 20.1166 12.9933L20 13H13V20C13 20.5128 12.614 20.9355 12.1166 20.9933L12 21C11.4872 21 11.0645 20.614 11.0067 20.1166L11 20V13H4C3.48716 13 3.06449 12.614 3.00673 12.1166L3 12C3 11.4872 3.38604 11.0645 3.88338 11.0067L4 11H11V4C11 3.48716 11.386 3.06449 11.8834 3.00673L12 3L11.8834 3.00673Z" /></svg>
icon:bookmarks = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.19094 21.8547C5.6948 22.2117 5.00293 21.8571 5.00293 21.2459V6.25C5.00293 4.45507 6.458 3 8.25293 3H15.7513C17.5462 3 19.0013 4.45507 19.0013 6.25V21.2459C19.0013 21.8571 18.3094 22.2117 17.8133 21.8547L12.0021 17.6738L6.19094 21.8547Z" /></svg>
icon:browse = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M5.25 3C3.45507 3 2 4.45507 2 6.25V15.1618L4.04451 11.6206C4.8037 10.3057 6.20674 9.49561 7.72512 9.49561L20 9.49561V8.75C20 6.95507 18.5449 5.5 16.75 5.5H11.5607L9.71967 3.65901C9.29771 3.23705 8.72542 3 8.12868 3H5.25ZM7.72512 10.9956L20.7445 10.9956C22.4765 10.9956 23.5591 12.8706 22.6931 14.3706L19.6569 19.6294C19.1657 20.4802 18.2578 21.0044 17.2753 21.0044H4.25594C2.52389 21.0044 1.44136 19.1294 2.30738 17.6294L5.34355 12.3706C5.83479 11.5198 6.74264 10.9956 7.72512 10.9956Z" /></svg>
icon:build_settings = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M17.7499 2.00098C18.9407 2.00098 19.9155 2.92614 19.9947 4.09693L19.9999 4.25098V14.3785C19.8794 14.4591 19.7651 14.5526 19.6587 14.659L16.2504 18.0673L15.3417 17.1579C14.9254 16.7413 14.3865 16.522 13.8411 16.5H16.2499C16.6642 16.5 16.9999 16.1642 16.9999 15.75C16.9999 15.3358 16.6642 15 16.2499 15H11.2461C10.8319 15 10.4961 15.3358 10.4961 15.75C10.4961 16.1642 10.8319 16.5 11.2461 16.5H13.6589C13.1141 16.5219 12.5758 16.7407 12.1597 17.1565C11.2806 18.0348 11.28 19.4594 12.1583 20.3385L13.8175 21.999H6.25C5.05914 21.999 4.08436 21.0739 4.00519 19.9031L4 19.749V4.25098C4 3.06011 4.92516 2.08533 6.09595 2.00617L6.25 2.00098H17.7499ZM9 7.75162C9 7.19933 8.55228 6.75162 8 6.75162C7.44772 6.75162 7 7.19933 7 7.75162C7 8.3039 7.44772 8.75162 8 8.75162C8.55228 8.75162 9 8.3039 9 7.75162ZM11.2461 7C10.8319 7 10.4961 7.33579 10.4961 7.75C10.4961 8.16421 10.8319 8.5 11.2461 8.5H16.2499C16.6642 8.5 16.9999 8.16421 16.9999 7.75C16.9999 7.33579 16.6642 7 16.2499 7H11.2461ZM10.4961 11.75C10.4961 12.1642 10.8319 12.5 11.2461 12.5H16.2499C16.6642 12.5 16.9999 12.1642 16.9999 11.75C16.9999 11.3358 16.6642 11 16.2499 11H11.2461C10.8319 11 10.4961 11.3358 10.4961 11.75ZM9 11.75C9 11.1977 8.55228 10.75 8 10.75C7.44772 10.75 7 11.1977 7 11.75C7 12.3023 7.44772 12.75 8 12.75C8.55228 12.75 9 12.3023 9 11.75ZM9 15.748C9 15.1957 8.55228 14.748 8 14.748C7.44772 14.748 7 15.1957 7 15.748C7 16.3003 7.44772 16.748 8 16.748C8.55228 16.748 9 16.3003 9 15.748ZM16.2499 20.1891L20.7194 15.7197C21.0122 15.4268 21.4871 15.4268 21.78 15.7197C22.0729 16.0126 22.0729 16.4874 21.78 16.7803L16.78 21.7803C16.7636 21.7968 16.7464 21.8124 16.7286 21.8272C16.6043 21.9304 16.4496 21.9909 16.2876 21.999C16.2749 21.9997 16.2622 22 16.2495 22C16.2369 22 16.2243 21.9997 16.2118 21.999C16.0266 21.9897 15.8508 21.9119 15.7191 21.7801L13.2198 19.2786C12.927 18.9856 12.9269 18.5104 13.2199 18.2176C13.5129 17.9248 13.9878 17.925 14.2806 18.2181L16.2499 20.1891Z" /></svg>
icon:calendar = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M21 8.5V17.75C21 19.5449 19.5449 21 17.75 21H6.25C4.45507 21 3 19.5449 3 17.75V8.5H21ZM13.9951 10.6953C13.3311 10.6953 12.8037 10.8727 12.4131 11.2275C12.0225 11.5824 11.8271 12.0625 11.8271 12.668C11.8271 13.0163 11.9159 13.3263 12.0933 13.5981C12.2707 13.87 12.5124 14.084 12.8184 14.2402C12.4538 14.403 12.1706 14.6357 11.9688 14.9385C11.7669 15.2412 11.666 15.583 11.666 15.9639C11.666 16.5856 11.8784 17.0804 12.3032 17.4482C12.728 17.8161 13.2936 18 14 18C14.7031 18 15.2663 17.8169 15.6895 17.4507C16.1126 17.0845 16.3242 16.5889 16.3242 15.9639C16.3242 15.5863 16.2241 15.2477 16.0239 14.9482C15.8237 14.6488 15.5381 14.4128 15.167 14.2402C15.4762 14.084 15.7204 13.87 15.8994 13.5981C16.0785 13.3263 16.168 13.0163 16.168 12.668C16.168 12.0625 15.9727 11.5824 15.582 11.2275C15.1914 10.8727 14.6624 10.6953 13.9951 10.6953ZM10.2197 10.7686H10.0684L7.29492 11.7891V12.79L9.03809 12.1943V17.9023H10.2197V10.7686ZM13.9902 14.7285C14.3353 14.7285 14.6128 14.8368 14.8228 15.0532C15.0327 15.2697 15.1377 15.5537 15.1377 15.9053C15.1377 16.2666 15.0376 16.5482 14.8374 16.75C14.6372 16.9518 14.3581 17.0527 14 17.0527C13.6419 17.0527 13.3612 16.9486 13.1577 16.7402C12.9543 16.5319 12.8525 16.2536 12.8525 15.9053C12.8525 15.5505 12.9559 15.2656 13.1626 15.0508C13.3693 14.8359 13.6452 14.7285 13.9902 14.7285ZM13.9951 11.6475C14.2979 11.6475 14.5387 11.7476 14.7178 11.9478C14.8968 12.148 14.9863 12.4027 14.9863 12.7119C14.9863 13.0374 14.8976 13.2962 14.7202 13.4883C14.5428 13.6803 14.3027 13.7764 14 13.7764C13.6973 13.7764 13.4572 13.6803 13.2798 13.4883C13.1024 13.2962 13.0137 13.0374 13.0137 12.7119C13.0137 12.3831 13.1016 12.1235 13.2773 11.9331C13.4531 11.7427 13.6924 11.6475 13.9951 11.6475ZM17.75 3C19.5449 3 21 4.45507 21 6.25V7H3V6.25C3 4.45507 4.45507 3 6.25 3H17.75Z" /></svg>
icon:cancel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM15.5303 8.46967L15.4462 8.39705C15.1852 8.2034 14.827 8.20101 14.5636 8.38988L14.4697 8.46967L12 10.939L9.53033 8.46967L9.44621 8.39705C9.18522 8.2034 8.82701 8.20101 8.56362 8.38988L8.46967 8.46967L8.39705 8.55379C8.2034 8.81478 8.20101 9.17299 8.38988 9.43638L8.46967 9.53033L10.939 12L8.46967 14.4697L8.39705 14.5538C8.2034 14.8148 8.20101 15.173 8.38988 15.4364L8.46967 15.5303L8.55379 15.6029C8.81478 15.7966 9.17299 15.799 9.43638 15.6101L9.53033 15.5303L12 13.061L14.4697 15.5303L14.5538 15.6029C14.8148 15.7966 15.173 15.799 15.4364 15.6101L15.5303 15.5303L15.6029 15.4462C15.7966 15.1852 15.799 14.827 15.6101 14.5636L15.5303 14.4697L13.061 12L15.5303 9.53033L15.6029 9.44621C15.7966 9.18522 15.799 8.82701 15.6101 8.56362L15.5303 8.46967L15.4462 8.39705L15.5303 8.46967Z" /></svg>
icon:checked = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 3C4.45507 3 3 4.45508 3 6.25V17.75C3 19.5449 4.45508 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM16.2802 9.78034L11.2802 14.7801C10.9873 15.073 10.5124 15.073 10.2196 14.7801L8.21576 12.7763C7.92287 12.4834 7.92287 12.0085 8.21576 11.7157C8.50865 11.4228 8.98353 11.4228 9.27642 11.7157L10.7499 13.1891L15.2196 8.71966C15.5125 8.42677 15.9873 8.42678 16.2802 8.71968C16.5731 9.01258 16.5731 9.48746 16.2802 9.78034Z" /></svg>
icon:chevron_down = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.29289 8.29289C4.68342 7.90237 5.31658 7.90237 5.70711 8.29289L12 14.5858L18.2929 8.29289C18.6834 7.90237 19.3166 7.90237 19.7071 8.29289C20.0976 8.68342 20.0976 9.31658 19.7071 9.70711L12.7071 16.7071C12.3166 17.0976 11.6834 17.0976 11.2929 16.7071L4.29289 9.70711C3.90237 9.31658 3.90237 8.68342 4.29289 8.29289Z" /></svg>
icon:chevron_left = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M15.7071 4.29289C16.0976 4.68342 16.0976 5.31658 15.7071 5.70711L9.41421 12L15.7071 18.2929C16.0976 18.6834 16.0976 19.3166 15.7071 19.7071C15.3166 20.0976 14.6834 20.0976 14.2929 19.7071L7.29289 12.7071C6.90237 12.3166 6.90237 11.6834 7.29289 11.2929L14.2929 4.29289C14.6834 3.90237 15.3166 3.90237 15.7071 4.29289Z" /></svg>
icon:chevron_right = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M8.29289 4.29289C7.90237 4.68342 7.90237 5.31658 8.29289 5.70711L14.5858 12L8.29289 18.2929C7.90237 18.6834 7.90237 19.3166 8.29289 19.7071C8.68342 20.0976 9.31658 20.0976 9.70711 19.7071L16.7071 12.7071C17.0976 12.3166 17.0976 11.6834 16.7071 11.2929L9.70711 4.29289C9.31658 3.90237 8.68342 3.90237 8.29289 4.29289Z" /></svg>
icon:chevron_up = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.29289 15.7071C4.68342 16.0976 5.31658 16.0976 5.70711 15.7071L12 9.41421L18.2929 15.7071C18.6834 16.0976 19.3166 16.0976 19.7071 15.7071C20.0976 15.3166 20.0976 14.6834 19.7071 14.2929L12.7071 7.29289C12.3166 6.90237 11.6834 6.90237 11.2929 7.29289L4.29289 14.2929C3.90237 14.6834 3.90237 15.3166 4.29289 15.7071Z" /></svg>
icon:close = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.2097 4.3871L4.29289 4.29289C4.65338 3.93241 5.22061 3.90468 5.6129 4.2097L5.70711 4.29289L12 10.585L18.2929 4.29289C18.6834 3.90237 19.3166 3.90237 19.7071 4.29289C20.0976 4.68342 20.0976 5.31658 19.7071 5.70711L13.415 12L19.7071 18.2929C20.0676 18.6534 20.0953 19.2206 19.7903 19.6129L19.7071 19.7071C19.3466 20.0676 18.7794 20.0953 18.3871 19.7903L18.2929 19.7071L12 13.415L5.70711 19.7071C5.31658 20.0976 4.68342 20.0976 4.29289 19.7071C3.90237 19.3166 3.90237 18.6834 4.29289 18.2929L10.585 12L4.29289 5.70711C3.93241 5.34662 3.90468 4.77939 4.2097 4.3871L4.29289 4.29289L4.2097 4.3871Z" /></svg>
icon:copy = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M8.5 13.75C8.5 16.0972 10.4028 18 12.75 18H14.4893C14.3616 19.6781 12.9608 21 11.25 21H6.25C4.45507 21 3 19.5449 3 17.75V10.25C3 8.45507 4.45507 7 6.25 7H8.5V13.75ZM15.75 15.5C16.1642 15.5 16.5 15.8358 16.5 16.25C16.5 16.6642 16.1642 17 15.75 17H14.75C14.3358 17 14 16.6642 14 16.25C14 15.8358 14.3358 15.5 14.75 15.5H15.75ZM10.3477 14C10.7332 14.0002 11.0447 14.2979 11.2393 14.6309C11.3912 14.8908 11.609 15.108 11.8691 15.2598C12.2023 15.4543 12.5 15.7665 12.5 16.1523C12.4999 16.6039 12.1092 16.9675 11.6826 16.8193C10.7468 16.4941 10.0059 15.7532 9.68066 14.8174C9.53257 14.391 9.89627 14 10.3477 14ZM20.1523 14C20.6037 14 20.9674 14.391 20.8193 14.8174C20.4941 15.7532 19.7532 16.4941 18.8174 16.8193C18.3908 16.9675 18.0001 16.6039 18 16.1523C18 15.7665 18.2977 15.4543 18.6309 15.2598C18.891 15.108 19.1088 14.8908 19.2607 14.6309C19.4553 14.2979 19.7668 14.0002 20.1523 14ZM10.25 8.5C10.6642 8.5 11 8.83579 11 9.25V11.75C11 12.1642 10.6642 12.5 10.25 12.5C9.83579 12.5 9.5 12.1642 9.5 11.75V9.25C9.5 8.83579 9.83579 8.5 10.25 8.5ZM20.25 8.5C20.6642 8.5 21 8.83579 21 9.25V11.75C21 12.1642 20.6642 12.5 20.25 12.5C19.8358 12.5 19.5 12.1642 19.5 11.75V9.25C19.5 8.83579 19.8358 8.5 20.25 8.5ZM11.6826 3.17969C12.1092 3.03149 12.4999 3.39512 12.5 3.84668C12.5 4.23268 12.2016 4.54479 11.8682 4.73926C11.3488 5.0423 11 5.60509 11 6.25C11 6.66421 10.6642 7 10.25 7C9.83579 7 9.5 6.66421 9.5 6.25C9.5 4.82902 10.4121 3.62127 11.6826 3.17969ZM18 3.84668C18.0001 3.39512 18.3908 3.03149 18.8174 3.17969C20.0879 3.62127 21 4.82902 21 6.25C21 6.66421 20.6642 7 20.25 7C19.8358 7 19.5 6.66421 19.5 6.25C19.5 5.60509 19.1512 5.0423 18.6318 4.73926C18.2984 4.54479 18 4.23268 18 3.84668ZM15.75 3C16.1642 3 16.5 3.33579 16.5 3.75C16.5 4.16421 16.1642 4.5 15.75 4.5H14.75C14.3358 4.5 14 4.16421 14 3.75C14 3.33579 14.3358 3 14.75 3H15.75Z" /></svg>
icon:document_add = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 8V2H6C4.89543 2 4 2.89543 4 4V10.0732C4.15109 10.0243 4.30961 9.99805 4.47 9.99805C5.11747 9.99805 5.72434 10.4385 5.94 11.049L6.5 12.449C6.68462 12.9888 7.1228 13.4272 7.66 13.619C7.79977 13.6639 7.94787 13.7045 8.099 13.746C8.70485 13.9123 9.35927 14.0919 9.72 14.609C9.90137 14.8705 9.99901 15.1808 10 15.499C10.0396 16.1838 9.6445 16.7691 9 16.999C8.84505 17.0481 8.68797 17.0943 8.53053 17.1406C8.1942 17.2395 7.85615 17.3389 7.5337 17.4677C7.62249 17.8487 7.94092 17.9465 8.29964 18H9V18.1147C9.09918 18.1439 9.19088 18.1832 9.27 18.239C9.49354 18.4007 9.66128 18.6278 9.75 18.889L10 19.649C10.04 19.8139 10.1667 19.9529 10.33 19.999C10.4105 20.0288 10.491 20.0573 10.5707 20.0855C11.2986 20.3432 11.9604 20.5775 11.9604 21.549C11.9604 21.7039 11.9326 21.8566 11.879 22H18C19.1046 22 20 21.1046 20 20V10H14C12.8954 10 12 9.10457 12 8ZM13.5 8V2.5L19.5 8.5H14C13.7239 8.5 13.5 8.27614 13.5 8ZM3.08828 17.4123C3.01598 17.3189 2.93772 17.2298 2.85387 17.1457C2.54169 16.8326 2.16058 16.5967 1.74097 16.4568L0.363172 16.0094C0.256979 15.972 0.165021 15.9025 0.0999761 15.8107C0.0349307 15.7188 0 15.6091 0 15.4966C0 15.384 0.0349307 15.2743 0.0999761 15.1824C0.165021 15.0906 0.256979 15.0212 0.363172 14.9837L1.74097 14.5363C2.15474 14.3935 2.52987 14.1571 2.837 13.8454C3.13572 13.5422 3.36226 13.1759 3.5 12.7737L3.51143 12.7396L3.95922 11.3629C3.99668 11.2568 4.06616 11.1649 4.15808 11.0999C4.25 11.0349 4.35984 11 4.47244 11C4.58505 11 4.69489 11.0349 4.78681 11.0999C4.87873 11.1649 4.94821 11.2568 4.98567 11.3629L5.43346 12.7396C5.5727 13.1582 5.80772 13.5385 6.11985 13.8504C6.43198 14.1623 6.8126 14.3971 7.23148 14.5363L8.60927 14.9837L8.63683 14.9906C8.74302 15.028 8.83498 15.0975 8.90002 15.1893C8.96507 15.2812 9 15.3909 9 15.5034C9 15.616 8.96507 15.7257 8.90002 15.8176C8.83498 15.9094 8.74302 15.9788 8.63683 16.0163L7.25903 16.4637C6.84016 16.6029 6.45953 16.8377 6.1474 17.1496C5.83528 17.4615 5.60025 17.8418 5.46101 18.2604L5.01323 19.6371C5.00919 19.6486 5.00477 19.6598 5 19.6709C4.96052 19.7627 4.89637 19.8421 4.81436 19.9001C4.72244 19.9651 4.61261 20 4.5 20C4.38739 20 4.27756 19.9651 4.18564 19.9001C4.09372 19.8351 4.02423 19.7432 3.98677 19.6371L3.53899 18.2604C3.43782 17.9533 3.28514 17.6666 3.08828 17.4123ZM10.7829 21.2132L10.0175 20.9646C9.78478 20.8873 9.57332 20.7568 9.39992 20.5836C9.22651 20.4103 9.09594 20.199 9.01859 19.9665L8.76982 19.2016C8.74901 19.1427 8.7104 19.0916 8.65934 19.0555C8.60827 19.0194 8.54725 19 8.48469 19C8.42213 19 8.36111 19.0194 8.31004 19.0555C8.25898 19.0916 8.22038 19.1427 8.19956 19.2016L7.9508 19.9665C7.87498 20.1974 7.74675 20.4076 7.57611 20.5808C7.40548 20.7539 7.19708 20.8853 6.9672 20.9646L6.20176 21.2132C6.14277 21.234 6.09168 21.2725 6.05554 21.3236C6.01941 21.3746 6 21.4356 6 21.4981C6 21.5606 6.01941 21.6216 6.05554 21.6726C6.09168 21.7236 6.14277 21.7622 6.20176 21.783L6.9672 22.0316C7.20032 22.1093 7.41205 22.2403 7.58548 22.4143C7.75891 22.5882 7.88926 22.8003 7.9661 23.0335L8.21487 23.7984C8.23569 23.8573 8.27429 23.9084 8.32535 23.9445C8.37642 23.9806 8.43744 24 8.5 24C8.56256 24 8.62358 23.9806 8.67465 23.9445C8.72571 23.9084 8.76431 23.8573 8.78513 23.7984L9.0339 23.0335C9.11125 22.801 9.24182 22.5897 9.41522 22.4164C9.58863 22.2432 9.80009 22.1127 10.0328 22.0354L10.7982 21.7868C10.8572 21.766 10.9083 21.7275 10.9445 21.6764C10.9806 21.6254 11 21.5644 11 21.5019C11 21.4394 10.9806 21.3784 10.9445 21.3274C10.9083 21.2764 10.8572 21.2378 10.7982 21.217L10.7829 21.2132Z" /></svg>
icon:document = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 2V8C12 9.10457 12.8954 10 14 10H20V20C20 21.1046 19.1046 22 18 22H6C4.89543 22 4 21.1046 4 20V4C4 2.89543 4.89543 2 6 2H12ZM13.5 2.5V8C13.5 8.27614 13.7239 8.5 14 8.5H19.5L13.5 2.5Z" /></svg>
icon:edit = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M15.8911 3.04825C17.2885 1.65064 19.5543 1.65058 20.9519 3.0481C22.3493 4.4455 22.3493 6.71112 20.952 8.10861L20.0602 9.00057L14.9995 3.93991L15.8911 3.04825ZM13.9389 5.00064L3.94103 14.9997C3.5347 15.4061 3.2491 15.9172 3.116 16.4762L2.02041 21.0777C1.96009 21.3311 2.03552 21.5976 2.21968 21.7817C2.40385 21.9659 2.67037 22.0413 2.92373 21.981L7.52498 20.8855C8.08418 20.7523 8.59546 20.4666 9.00191 20.0601L18.9996 10.0613L13.9389 5.00064Z" /></svg>
icon:exclude = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM15.5303 8.46967L15.4462 8.39705C15.1852 8.2034 14.827 8.20101 14.5636 8.38988L14.4697 8.46967L12 10.939L9.53033 8.46967L9.44621 8.39705C9.18522 8.2034 8.82701 8.20101 8.56362 8.38988L8.46967 8.46967L8.39705 8.55379C8.2034 8.81478 8.20101 9.17299 8.38988 9.43638L8.46967 9.53033L10.939 12L8.46967 14.4697L8.39705 14.5538C8.2034 14.8148 8.20101 15.173 8.38988 15.4364L8.46967 15.5303L8.55379 15.6029C8.81478 15.7966 9.17299 15.799 9.43638 15.6101L9.53033 15.5303L12 13.061L14.4697 15.5303L14.5538 15.6029C14.8148 15.7966 15.173 15.799 15.4364 15.6101L15.5303 15.5303L15.6029 15.4462C15.7966 15.1852 15.799 14.827 15.6101 14.5636L15.5303 14.4697L13.061 12L15.5303 9.53033L15.6029 9.44621C15.7966 9.18522 15.799 8.82701 15.6101 8.56362L15.5303 8.46967L15.4462 8.39705L15.5303 8.46967Z" /></svg>
icon:export = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M2.75 4.50391C3.1297 4.50391 3.44349 4.78606 3.49315 5.15214L3.5 5.25391V18.7525C3.5 19.1667 3.16421 19.5025 2.75 19.5025C2.3703 19.5025 2.05651 19.2204 2.00685 18.8543L2 18.7525V5.25391C2 4.83969 2.33579 4.50391 2.75 4.50391ZM15.2098 6.38704L15.293 6.29284C15.6535 5.9324 16.2207 5.90473 16.613 6.20979L16.7072 6.29299L21.7038 11.2906C22.064 11.651 22.0919 12.2178 21.7873 12.6101L21.7042 12.7043L16.7076 17.7077C16.3173 18.0985 15.6842 18.099 15.2934 17.7087C14.9326 17.3485 14.9045 16.7813 15.2093 16.3888L15.2924 16.2945L18.581 12.9999L6 13C5.48716 13 5.06449 12.614 5.00673 12.1166L5 12C5 11.4872 5.38604 11.0645 5.88338 11.0068L6 11L18.584 10.9999L15.2928 7.70706C14.9324 7.34654 14.9047 6.7793 15.2098 6.38704L15.293 6.29284L15.2098 6.38704Z" /></svg>
icon:filter = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M10 16H14C14.5523 16 15 16.4477 15 17C15 17.5128 14.614 17.9355 14.1166 17.9933L14 18H10C9.44772 18 9 17.5523 9 17C9 16.4872 9.38604 16.0645 9.88338 16.0067L10 16H14H10ZM8 11H16C16.5523 11 17 11.4477 17 12C17 12.5128 16.614 12.9355 16.1166 12.9933L16 13H8C7.44772 13 7 12.5523 7 12C7 11.4872 7.38604 11.0645 7.88338 11.0067L8 11H16H8ZM5 6H19C19.5523 6 20 6.44772 20 7C20 7.51284 19.614 7.93551 19.1166 7.99327L19 8H5C4.44772 8 4 7.55228 4 7C4 6.48716 4.38604 6.06449 4.88338 6.00673L5 6H19H5Z" /></svg>
icon:fit_height = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6 3C5.44772 3 5 3.44772 5 4C5 4.55228 5.44772 5 6 5H18C18.5523 5 19 4.55228 19 4C19 3.44772 18.5523 3 18 3H6ZM10.3545 13.701L10.4526 13.7856L11.252 14.5859V12.6289L11.25 12.6032V9.41407L10.4507 10.2144L10.3526 10.299L10.3452 10.3045C9.9535 10.5951 9.39806 10.5631 9.04288 10.2079C8.6877 9.85275 8.65566 9.29731 8.94627 8.90564L8.95177 8.89823L9.03636 8.80024L11.3905 6.44343C11.5696 6.16991 11.8949 6 12.2509 6C12.5739 6 12.8697 6.13942 13.0558 6.3679L13.0614 6.37469L13.1068 6.43924L15.4653 8.80024L15.5498 8.89823L15.5553 8.90564C15.8138 9.25403 15.817 9.73134 15.5649 10.0829L15.5589 10.0912L15.46 10.2077L15.3542 10.299L15.3468 10.3045C14.9984 10.563 14.5211 10.5662 14.1696 10.3141L14.1612 10.3081L14.0517 10.2151L13.25 9.4135V11.371L13.252 11.3966V14.5865L14.0465 13.7921C14.4017 13.4369 14.9571 13.4049 15.3488 13.6955L15.3562 13.701L15.4542 13.7856L15.4607 13.7921C15.8159 14.1473 15.8479 14.7027 15.5573 15.0944L15.5518 15.1018L15.4672 15.1998L13.1133 17.5562C12.9344 17.8299 12.609 18 12.2529 18C11.8969 18 11.5715 17.8301 11.3925 17.5566L9.04485 15.2063C8.65432 14.8158 8.65432 14.1826 9.04485 13.7921C9.40003 13.4369 9.95547 13.4049 10.3471 13.6955L10.3545 13.701ZM5 20C5 19.4477 5.44772 19 6 19H18C18.5523 19 19 19.4477 19 20C19 20.5523 18.5523 21 18 21H6C5.44772 21 5 20.5523 5 20Z" /></svg>
icon:fit_width = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3 18C3 18.5523 3.44772 19 4 19C4.55228 19 5 18.5523 5 18V6C5 5.44772 4.55228 5 4 5C3.44772 5 3 5.44772 3 6V18ZM19 18C19 18.5523 19.4477 19 20 19C20.5523 19 21 18.5523 21 18V6C21 5.44772 20.5523 5 20 5C19.4477 5 19 5.44772 19 6V18ZM13.7856 13.7992L13.701 13.8973L13.6955 13.9047C13.4049 14.2964 13.4369 14.8518 13.7921 15.207C14.1826 15.5975 14.8158 15.5975 15.2063 15.207L17.5566 12.8594C17.8301 12.6803 18 12.355 18 11.999C18 11.6429 17.8299 11.3175 17.5562 11.1385L15.1998 8.78465L15.1018 8.70006L15.0944 8.69456C14.7027 8.40395 14.1473 8.43599 13.7921 8.79117L13.7856 8.79765L13.701 8.89568L13.6955 8.9031C13.4049 9.29476 13.4369 9.8502 13.7921 10.2054L14.5865 10.9999H11.3966L11.3742 11.0016H9.4135L10.2151 10.1999L10.3081 10.0904L10.3141 10.0821C10.5662 9.73051 10.563 9.25321 10.3045 8.90482L10.299 8.89741L10.2077 8.79165L10.0912 8.69269L10.0829 8.68671C9.73134 8.43463 9.25403 8.43778 8.90564 8.69628L8.89823 8.70178L8.80024 8.78637L6.43924 11.1448L6.37469 11.1903L6.3679 11.1958C6.13942 11.3819 6 11.6778 6 12.0007C6 12.3567 6.16991 12.6821 6.44343 12.8611L8.80024 15.2153L8.89823 15.2999L8.90564 15.3054C9.29731 15.596 9.85275 15.5639 10.2079 15.2087C10.5631 14.8536 10.5951 14.2981 10.3045 13.9065L10.299 13.899L10.2144 13.801L9.41407 13.0016H12.6032L12.6257 12.9999H14.5859L13.7856 13.7992Z" /></svg>
icon:folder = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M2 8V6.25C2 4.45507 3.45507 3 5.25 3H8.12868C8.72542 3 9.29771 3.23705 9.71967 3.65901L11.25 5.18934L8.65901 7.78033C8.51836 7.92098 8.32759 8 8.12868 8H2ZM2 9.5V17.75C2 19.5449 3.45507 21 5.25 21H18.75C20.5449 21 22 19.5449 22 17.75V8.75C22 6.95507 20.5449 5.5 18.75 5.5H13.0607L9.71967 8.84099C9.29771 9.26295 8.72542 9.5 8.12868 9.5H2Z" /></svg>
icon:font = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M7.00081 2C7.42132 2.00002 7.79689 2.2631 7.94058 2.65829L10.8223 10.5839L9.71152 13.382L9.20904 12H4.79171L3.94005 14.3418C3.75129 14.8608 3.17752 15.1285 2.65849 14.9398C2.13947 14.751 1.87173 14.1772 2.06049 13.6582L6.06099 2.65822C6.20471 2.26304 6.5803 1.99998 7.00081 2ZM5.51908 10H8.48186L7.00065 5.92618L5.51908 10ZM15.3677 6.52794C15.2168 6.1467 14.8484 5.89624 14.4384 5.89606C14.0284 5.89587 13.6598 6.14601 13.5085 6.52711L8.15106 20.0233L8.00024 20.0233C7.44795 20.0233 7.00024 20.471 7.00024 21.0233C7.00025 21.5756 7.44797 22.0233 8.00025 22.0233L8.80975 22.0233C8.82311 22.0236 8.83645 22.0236 8.84976 22.0233L11.0003 22.0233C11.5525 22.0233 12.0002 21.5756 12.0002 21.0233C12.0002 20.471 11.5525 20.0233 11.0002 20.0233L10.3029 20.0233L11.1061 17.9999H17.7587L18.5598 20.0233L18.0002 20.0233C17.448 20.0233 17.0002 20.471 17.0002 21.0233C17.0002 21.5756 17.4479 22.0233 18.0002 22.0233L20.0143 22.0234C20.0257 22.0236 20.0372 22.0236 20.0486 22.0234L21.0088 22.0234C21.5611 22.0234 22.0088 21.5757 22.0088 21.0234C22.0089 20.4711 21.5611 20.0234 21.0089 20.0234L20.7108 20.0234L15.3677 6.52794ZM16.9668 15.9999H11.9L14.4367 9.6095L16.9668 15.9999Z" /></svg>
icon:import = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M21.25 4.5C21.6297 4.5 21.9435 4.78215 21.9932 5.14823L22 5.25V18.75C22 19.1642 21.6642 19.5 21.25 19.5C20.8703 19.5 20.5565 19.2178 20.5069 18.8518L20.5 18.75V5.25C20.5 4.83579 20.8358 4.5 21.25 4.5ZM12.2098 6.38702L12.293 6.29282C12.6535 5.93237 13.2207 5.9047 13.613 6.20977L13.7072 6.29297L18.7038 11.2906C19.064 11.6509 19.0919 12.2178 18.7873 12.6101L18.7042 12.7043L13.7076 17.7077C13.3173 18.0985 12.6842 18.0989 12.2934 17.7087C11.9327 17.3484 11.9045 16.7812 12.2093 16.3887L12.2924 16.2945L15.581 13H3C2.48716 13 2.06449 12.614 2.00673 12.1166L2 12C2 11.4872 2.38604 11.0645 2.88338 11.0067L3 11H15.584L12.2928 7.70703C11.9324 7.34651 11.9047 6.77928 12.2098 6.38702L12.293 6.29282L12.2098 6.38702Z" /></svg>
icon:language = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M9.56258 7.50543L9.61862 7.62215L14.9259 20.6267C15.1346 21.1381 14.8892 21.7217 14.3779 21.9304C13.903 22.1242 13.3658 21.9265 13.1244 21.4879L13.0741 21.3824L11.693 17.999H5.40701L3.91608 21.4056C3.71043 21.8754 3.18729 22.1078 2.70853 21.9612L2.599 21.9206C2.1292 21.715 1.89681 21.1918 2.04333 20.7131L2.08394 20.6036L7.77668 7.59899C8.11338 6.82981 9.1713 6.80444 9.56258 7.50543ZM19 2C19.5128 2 19.9355 2.38604 19.9933 2.88338L20 3L19.9998 7H21C21.5128 7 21.9355 7.38604 21.9933 7.88338L22 8C22 8.51284 21.614 8.93551 21.1166 8.99327L21 9H19.9998L20 16C20 16.5128 19.614 16.9355 19.1166 16.9933L19 17C18.4872 17 18.0645 16.614 18.0067 16.1166L18 16V3C18 2.44772 18.4477 2 19 2ZM8.66047 10.5674L6.28201 15.999H10.877L8.66047 10.5674ZM11 2H16C16.5128 2 16.9355 2.38604 16.9933 2.88338L17 3V5.97488C17 8.18401 15.2091 9.97488 13 9.97488C12.4477 9.97488 12 9.52716 12 8.97488C12 8.42259 12.4477 7.97488 13 7.97488C14.0544 7.97488 14.9182 7.159 14.9945 6.12414L15 5.97488V4H11C10.4477 4 10 3.55228 10 3C10 2.48716 10.386 2.06449 10.8834 2.00673L11 2H16H11Z" /></svg>
icon:lines = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3 17H15C15.5523 17 16 17.4477 16 18C16 18.5128 15.614 18.9355 15.1166 18.9933L15 19H3C2.44772 19 2 18.5523 2 18C2 17.4872 2.38604 17.0645 2.88338 17.0067L3 17H15H3ZM3 11H21C21.5523 11 22 11.4477 22 12C22 12.5128 21.614 12.9355 21.1166 12.9933L21 13H3C2.44772 13 2 12.5523 2 12C2 11.4872 2.38604 11.0645 2.88338 11.0067L3 11H21H3ZM3 5H18C18.5523 5 19 5.44772 19 6C19 6.51284 18.614 6.93551 18.1166 6.99327L18 7H3C2.44772 7 2 6.55228 2 6C2 5.48716 2.38604 5.06449 2.88338 5.00673L3 5H18H3Z" /></svg>
icon:link = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M9 7C9.55228 7 10 7.44772 10 8C10 8.51284 9.61396 8.93551 9.11662 8.99327L9 9H7C5.34315 9 4 10.3431 4 12C4 13.5977 5.24892 14.9037 6.82373 14.9949L7 15H9C9.55228 15 10 15.4477 10 16C10 16.5128 9.61396 16.9355 9.11662 16.9933L9 17H7C4.23858 17 2 14.7614 2 12C2 9.31125 4.12231 7.11818 6.78311 7.00462L7 7H9ZM17 7C19.7614 7 22 9.23858 22 12C22 14.6888 19.8777 16.8818 17.2169 16.9954L17 17H15C14.4477 17 14 16.5523 14 16C14 15.4872 14.386 15.0645 14.8834 15.0067L15 15H17C18.6569 15 20 13.6569 20 12C20 10.4023 18.7511 9.09634 17.1763 9.00509L17 9H15C14.4477 9 14 8.55228 14 8C14 7.48716 14.386 7.06449 14.8834 7.00673L15 7H17ZM7 11H17C17.5523 11 18 11.4477 18 12C18 12.5128 17.614 12.9355 17.1166 12.9933L17 13H7C6.44772 13 6 12.5523 6 12C6 11.4872 6.38604 11.0645 6.88338 11.0067L7 11H17H7Z" /></svg>
icon:list = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3.49942 16.5006C4.32752 16.5006 4.99883 17.1719 4.99883 18C4.99883 18.8281 4.32752 19.4994 3.49942 19.4994C2.67131 19.4994 2 18.8281 2 18C2 17.1719 2.67131 16.5006 3.49942 16.5006ZM7.50034 17H21.0035C21.5558 17 22.0035 17.4477 22.0035 18C22.0035 18.5128 21.6174 18.9355 21.1201 18.9933L21.0035 19H7.50034C6.94805 19 6.50034 18.5523 6.50034 18C6.50034 17.4872 6.88638 17.0645 7.38372 17.0067L7.50034 17H21.0035H7.50034ZM3.49942 10.5006C4.32752 10.5006 4.99883 11.1719 4.99883 12C4.99883 12.8281 4.32752 13.4994 3.49942 13.4994C2.67131 13.4994 2 12.8281 2 12C2 11.1719 2.67131 10.5006 3.49942 10.5006ZM7.50034 11H21.0035C21.5558 11 22.0035 11.4477 22.0035 12C22.0035 12.5128 21.6174 12.9355 21.1201 12.9933L21.0035 13H7.50034C6.94805 13 6.50034 12.5523 6.50034 12C6.50034 11.4872 6.88638 11.0645 7.38372 11.0067L7.50034 11H21.0035H7.50034ZM3.49942 4.50781C4.32752 4.50781 4.99883 5.17912 4.99883 6.00723C4.99883 6.83533 4.32752 7.50664 3.49942 7.50664C2.67131 7.50664 2 6.83533 2 6.00723C2 5.17912 2.67131 4.50781 3.49942 4.50781ZM7.50034 5.00082H21.0035C21.5558 5.00082 22.0035 5.44854 22.0035 6.00082C22.0035 6.51366 21.6174 6.93633 21.1201 6.9941L21.0035 7.00082H7.50034C6.94805 7.00082 6.50034 6.55311 6.50034 6.00082C6.50034 5.48799 6.88638 5.06532 7.38372 5.00755L7.50034 5.00082H21.0035H7.50034Z" /></svg>
icon:margin_bottom = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4 3C4 3.55228 4.44772 4 5 4H19C19.5523 4 20 3.55228 20 3C20 2.44772 19.5523 2 19 2H5C4.44772 2 4 2.44772 4 3ZM4 21C4 21.5523 4.44772 22 5 22H6.75C7.30228 22 7.75 21.5523 7.75 21C7.75 20.4477 7.30228 20 6.75 20H5C4.44772 20 4 20.4477 4 21ZM9.25 21C9.25 21.5523 9.69772 22 10.25 22H13.75C14.3023 22 14.75 21.5523 14.75 21C14.75 20.4477 14.3023 20 13.75 20H10.25C9.69772 20 9.25 20.4477 9.25 21ZM16.25 21C16.25 21.5523 16.6977 22 17.25 22H19C19.5523 22 20 21.5523 20 21C20 20.4477 19.5523 20 19 20H17.25C16.6977 20 16.25 20.4477 16.25 21ZM17.7071 13.7071L12.7071 18.7071C12.3166 19.0976 11.6834 19.0976 11.2929 18.7071L6.29289 13.7071C5.90237 13.3166 5.90237 12.6834 6.29289 12.2929C6.68342 11.9024 7.31658 11.9024 7.70711 12.2929L11 15.5858V6C11 5.44771 11.4477 5 12 5C12.5523 5 13 5.44771 13 6V15.5858L16.2929 12.2929C16.6834 11.9024 17.3166 11.9024 17.7071 12.2929C18.0976 12.6834 18.0976 13.3166 17.7071 13.7071Z" /></svg>
icon:margin_inner = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M5.81768 7.51895C5.41393 7.89578 5.39211 8.52857 5.76894 8.93232L7.69878 11H3C2.44772 11 2 11.4477 2 12C2 12.5523 2.44772 13 3 13H7.69878L5.76894 15.0677C5.39211 15.4714 5.41393 16.1042 5.81768 16.4811C6.22143 16.8579 6.85422 16.8361 7.23106 16.4323L10.7288 12.6848C10.747 12.6654 10.7644 12.6453 10.7811 12.6245C10.8179 12.5786 10.85 12.5302 10.8775 12.48C10.9556 12.3375 11 12.1739 11 12C11 11.7551 10.9119 11.5307 10.7658 11.3568C10.7542 11.3432 10.7424 11.3298 10.7302 11.3167L7.23106 7.56769C6.85422 7.16393 6.22143 7.14211 5.81768 7.51895ZM18.1823 7.51895C18.5861 7.89578 18.6079 8.52857 18.2311 8.93232L16.3012 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H16.3012L18.2311 15.0677C18.6079 15.4714 18.5861 16.1042 18.1823 16.4811C17.7786 16.8579 17.1458 16.8361 16.7689 16.4323L13.2711 12.6846C13.2538 12.6662 13.2372 12.6472 13.2214 12.6275C13.1836 12.5807 13.1506 12.5313 13.1225 12.48C13.0444 12.3375 13 12.1739 13 12C13 11.7572 13.0865 11.5347 13.2304 11.3615C13.2432 11.3461 13.2564 11.3311 13.2701 11.3165L16.7689 7.56769C17.1458 7.16393 17.7786 7.14211 18.1823 7.51895Z" /></svg>
icon:margin_left = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3 4C2.44772 4 2 4.44772 2 5V6.75C2 7.30228 2.44772 7.75 3 7.75C3.55229 7.75 4 7.30228 4 6.75L4 5C4 4.44772 3.55229 4 3 4ZM3 9.25C2.44772 9.25 2 9.69772 2 10.25V13.75C2 14.3023 2.44772 14.75 3 14.75C3.55229 14.75 4 14.3023 4 13.75L4 10.25C4 9.69772 3.55229 9.25 3 9.25ZM3 16.25C2.44772 16.25 2 16.6977 2 17.25V19C2 19.5523 2.44772 20 3 20C3.55228 20 4 19.5523 4 19L4 17.25C4 16.6977 3.55228 16.25 3 16.25ZM21 4C20.4477 4 20 4.44772 20 5V19C20 19.5523 20.4477 20 21 20C21.5523 20 22 19.5523 22 19V5C22 4.44772 21.5523 4 21 4ZM5.29289 12.7071C4.90237 12.3166 4.90237 11.6834 5.29289 11.2929L10.2929 6.29289C10.6834 5.90237 11.3166 5.90237 11.7071 6.29289C12.0976 6.68342 12.0976 7.31658 11.7071 7.70711L8.41421 11L18 11C18.5523 11 19 11.4477 19 12C19 12.5523 18.5523 13 18 13L8.41421 13L11.7071 16.2929C12.0976 16.6834 12.0976 17.3166 11.7071 17.7071C11.3166 18.0976 10.6834 18.0976 10.2929 17.7071L5.29289 12.7071Z" /></svg>
icon:margin_outer = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M7.18232 7.51895C7.58607 7.89578 7.60789 8.52857 7.23106 8.93232L5.30122 11H10C10.5523 11 11 11.4477 11 12C11 12.5523 10.5523 13 10 13H5.30122L7.23106 15.0677C7.60789 15.4714 7.58607 16.1042 7.18232 16.4811C6.77857 16.8579 6.14578 16.8361 5.76894 16.4323L2.27111 12.6846C2.25382 12.6662 2.23722 12.6472 2.22136 12.6275C2.18356 12.5807 2.15061 12.5313 2.1225 12.48C2.04441 12.3375 2 12.1739 2 12C2 11.7572 2.0865 11.5347 2.23037 11.3615C2.24317 11.3461 2.25641 11.3311 2.27009 11.3165L5.76894 7.56769C6.14578 7.16393 6.77857 7.14211 7.18232 7.51895ZM16.8177 7.51895C16.4139 7.89578 16.3921 8.52857 16.7689 8.93232L18.6988 11H14C13.4477 11 13 11.4477 13 12C13 12.5523 13.4477 13 14 13H18.6988L16.7689 15.0677C16.3921 15.4714 16.4139 16.1042 16.8177 16.4811C17.2214 16.8579 17.8542 16.8361 18.2311 16.4323L21.7288 12.6848C21.747 12.6654 21.7644 12.6453 21.7811 12.6245C21.8179 12.5786 21.85 12.5302 21.8775 12.48C21.9556 12.3375 22 12.1739 22 12C22 11.7551 21.9119 11.5307 21.7658 11.3568C21.7542 11.3432 21.7424 11.3298 21.7302 11.3167L18.2311 7.56769C17.8542 7.16393 17.2214 7.14211 16.8177 7.51895Z" /></svg>
icon:margin_right = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3 4C3.55228 4 4 4.44772 4 5L4 19C4 19.5523 3.55229 20 3 20C2.44772 20 2 19.5523 2 19V5C2 4.44772 2.44772 4 3 4ZM21 4C21.5523 4 22 4.44772 22 5V6.75C22 7.30228 21.5523 7.75 21 7.75C20.4477 7.75 20 7.30228 20 6.75V5C20 4.44772 20.4477 4 21 4ZM21 9.25C21.5523 9.25 22 9.69772 22 10.25V13.75C22 14.3023 21.5523 14.75 21 14.75C20.4477 14.75 20 14.3023 20 13.75V10.25C20 9.69772 20.4477 9.25 21 9.25ZM21 16.25C21.5523 16.25 22 16.6977 22 17.25V19C22 19.5523 21.5523 20 21 20C20.4477 20 20 19.5523 20 19V17.25C20 16.6977 20.4477 16.25 21 16.25ZM18.7071 12.7071C19.0976 12.3166 19.0976 11.6834 18.7071 11.2929L13.7071 6.29289C13.3166 5.90237 12.6834 5.90237 12.2929 6.29289C11.9024 6.68342 11.9024 7.31658 12.2929 7.70711L15.5858 11L6 11C5.44772 11 5 11.4477 5 12C5 12.5523 5.44772 13 6 13L15.5858 13L12.2929 16.2929C11.9024 16.6834 11.9024 17.3166 12.2929 17.7071C12.6834 18.0976 13.3166 18.0976 13.7071 17.7071L18.7071 12.7071Z" /></svg>
icon:margin_top = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4 3C4 2.44772 4.44772 2 5 2H6.75C7.30228 2 7.75 2.44772 7.75 3C7.75 3.55228 7.30228 4 6.75 4H5C4.44772 4 4 3.55228 4 3ZM9.25 3C9.25 2.44772 9.69772 2 10.25 2H13.75C14.3023 2 14.75 2.44772 14.75 3C14.75 3.55228 14.3023 4 13.75 4H10.25C9.69772 4 9.25 3.55228 9.25 3ZM16.25 3C16.25 2.44772 16.6977 2 17.25 2H19C19.5523 2 20 2.44772 20 3C20 3.55228 19.5523 4 19 4H17.25C16.6977 4 16.25 3.55228 16.25 3ZM4 21C4 20.4477 4.44772 20 5 20H19C19.5523 20 20 20.4477 20 21C20 21.5523 19.5523 22 19 22H5C4.44772 22 4 21.5523 4 21ZM12.7071 5.29289C12.3166 4.90237 11.6834 4.90237 11.2929 5.29289L6.29289 10.2929C5.90237 10.6834 5.90237 11.3166 6.29289 11.7071C6.68342 12.0976 7.31658 12.0976 7.70711 11.7071L11 8.41421V18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18V8.41421L16.2929 11.7071C16.6834 12.0976 17.3166 12.0976 17.7071 11.7071C18.0976 11.3166 18.0976 10.6834 17.7071 10.2929L12.7071 5.29289Z" /></svg>
icon:maximise = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M19.5 3.5C20.0523 3.5 20.5 3.94772 20.5 4.5V12C20.5 12.5523 20.0523 13 19.5 13C18.9477 13 18.5 12.5523 18.5 12V6.91406L6.91406 18.5H12C12.5523 18.5 13 18.9477 13 19.5C13 20.0523 12.5523 20.5 12 20.5H4.5C3.94772 20.5 3.5 20.0523 3.5 19.5V12C3.5 11.4477 3.94772 11 4.5 11C5.05228 11 5.5 11.4477 5.5 12V17.0859L17.0859 5.5H12C11.4477 5.5 11 5.05228 11 4.5C11 3.94772 11.4477 3.5 12 3.5H19.5Z" /></svg>
icon:minimise = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M10.4976 12.5052C11.0105 12.5052 11.4331 12.8913 11.4909 13.3886L11.4976 13.5052V21.0091C11.4976 21.5614 11.0499 22.0091 10.4976 22.0091C9.98478 22.0091 9.56211 21.6231 9.50435 21.1257L9.49762 21.0091L9.49709 15.916L3.70662 21.7077C3.34614 22.0682 2.77891 22.0959 2.38662 21.7909L2.29241 21.7077C1.93193 21.3472 1.9042 20.78 2.20922 20.3877L2.29241 20.2935L8.08009 14.505L2.99609 14.5052C2.44381 14.5052 1.99609 14.0575 1.99609 13.5052C1.99609 12.9924 2.38213 12.5697 2.87947 12.5119L2.99609 12.5052H10.4976ZM13.4986 2C14.0115 2 14.4341 2.38604 14.4919 2.88338L14.4986 3L14.4981 8.087L20.2924 2.29348C20.6529 1.93299 21.2201 1.90527 21.6124 2.21029L21.7066 2.29348C22.0671 2.65396 22.0948 3.22119 21.7898 3.61348L21.7066 3.70769L15.9101 9.503L21.0001 9.50389C21.5524 9.50389 22.0001 9.95161 22.0001 10.5039C22.0001 11.0167 21.6141 11.4394 21.1168 11.4972L21.0001 11.5039H13.4986C12.9858 11.5039 12.5631 11.1179 12.5053 10.6205L12.4986 10.5039V3C12.4986 2.44772 12.9463 2 13.4986 2Z" /></svg>
icon:more_arrow = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M9 17.8983C9 18.9722 10.2649 19.5462 11.0731 18.839L17.3838 13.3172C18.1806 12.6199 18.1806 11.3804 17.3838 10.6831L11.0731 5.16132C10.2649 4.45412 9 5.02809 9 6.10204V17.8983Z" /></svg>
icon:more_vertical = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 8C10.8954 8 10 7.10457 10 6C10 4.89543 10.8954 4 12 4C13.1046 4 14 4.89543 14 6C14 7.10457 13.1046 8 12 8ZM12 14C10.8954 14 10 13.1046 10 12C10 10.8954 10.8954 10 12 10C13.1046 10 14 10.8954 14 12C14 13.1046 13.1046 14 12 14ZM10 18C10 19.1046 10.8954 20 12 20C13.1046 20 14 19.1046 14 18C14 16.8954 13.1046 16 12 16C10.8954 16 10 16.8954 10 18Z" /></svg>
icon:noncheckable = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3 6.25C3 4.45508 4.45507 3 6.25 3H17.75C19.5449 3 21 4.45507 21 6.25V17.75C21 19.5449 19.5449 21 17.75 21H6.25C4.45508 21 3 19.5449 3 17.75V6.25Z" /></svg>
icon:panel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 3C4.45507 3 3 4.45507 3 6.25V17.75C3 19.5449 4.45507 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM4.5 6.25C4.5 5.2835 5.2835 4.5 6.25 4.5H17.75C18.7165 4.5 19.5 5.2835 19.5 6.25V12H4.5V6.25Z" /></svg>
icon:pin = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M21.0682 7.75765L16.2425 2.93189C14.9152 1.60462 12.6777 1.96772 11.8382 3.6466L9.40281 8.51748C9.31512 8.69287 9.16223 8.82694 8.97688 8.89096L4.81061 10.3302C3.93791 10.6317 3.682 11.7427 4.33487 12.3956L7.43936 15.5001L3.00008 19.9394L3 21.0001H4.06074L8.50002 16.5607L11.6045 19.6653C12.2574 20.3181 13.3684 20.0622 13.6699 19.1895L15.1092 15.0232C15.1732 14.8379 15.3073 14.685 15.4826 14.5973L20.3535 12.1619C22.0324 11.3224 22.3955 9.08491 21.0682 7.75765Z" /></svg>
icon:project_copy = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M13 6.75V2H8.75C7.50736 2 6.5 3.00736 6.5 4.25V17.25C6.5 18.4926 7.50736 19.5 8.75 19.5H17.75C18.9926 19.5 20 18.4926 20 17.25V9H15.25C14.0074 9 13 7.99264 13 6.75ZM14.5 6.75V2.5L19.5 7.5H15.25C14.8358 7.5 14.5 7.16421 14.5 6.75ZM5.5028 4.62701C4.62745 4.9351 4 5.76926 4 6.74997V17.2542C4 19.8775 6.12665 22.0042 8.75 22.0042H15.2444C16.224 22.0042 17.0573 21.3782 17.3663 20.5044L8.75 20.5042C6.95507 20.5042 5.5 19.0491 5.5 17.2542L5.5028 4.62701Z" /></svg>
icon:quote = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M8 5C9.62875 5 10.9526 6.29802 10.9971 7.91602C11.0002 7.94363 11.0029 7.97156 11.0029 8C11.0029 10.9327 9.936 13.3818 8.88965 15.0811C8.3651 15.9329 7.84001 16.6051 7.44434 17.0664C7.24631 17.2973 7.0797 17.4767 6.96094 17.5996C6.9017 17.6609 6.85398 17.7081 6.82031 17.7412C6.80346 17.7578 6.78999 17.771 6.78027 17.7803C6.77548 17.7849 6.77151 17.7892 6.76855 17.792C6.76721 17.7933 6.76558 17.794 6.76465 17.7949L6.76367 17.7969C6.46146 18.08 5.98635 18.0648 5.70312 17.7627C5.41997 17.4605 5.4352 16.9863 5.7373 16.7031C5.73816 16.7023 5.73972 16.7006 5.74219 16.6982C5.74761 16.693 5.75709 16.6841 5.76953 16.6719C5.79442 16.6474 5.83279 16.6084 5.88281 16.5566C5.98286 16.4531 6.12878 16.2961 6.30566 16.0898C6.6604 15.6762 7.1363 15.067 7.6123 14.2939C8.19982 13.3398 8.77816 12.1484 9.1377 10.7754C8.78672 10.9194 8.40287 11 8 11C6.34315 11 5 9.65685 5 8C5 6.34315 6.34315 5 8 5ZM16 5C17.6288 5 18.9526 6.29802 18.9971 7.91602C19.0002 7.94363 19.0029 7.97156 19.0029 8C19.0029 10.9327 17.936 13.3818 16.8896 15.0811C16.3651 15.9329 15.84 16.6051 15.4443 17.0664C15.2463 17.2973 15.0797 17.4767 14.9609 17.5996C14.9017 17.6609 14.854 17.7081 14.8203 17.7412C14.8035 17.7578 14.79 17.771 14.7803 17.7803C14.7755 17.7849 14.7715 17.7892 14.7686 17.792C14.7672 17.7933 14.7656 17.794 14.7646 17.7949L14.7637 17.7969C14.4615 18.08 13.9863 18.0648 13.7031 17.7627C13.42 17.4605 13.4352 16.9863 13.7373 16.7031C13.7382 16.7023 13.7397 16.7006 13.7422 16.6982C13.7476 16.693 13.7571 16.6841 13.7695 16.6719C13.7944 16.6474 13.8328 16.6084 13.8828 16.5566C13.9829 16.4531 14.1288 16.2961 14.3057 16.0898C14.6604 15.6762 15.1363 15.067 15.6123 14.2939C16.1998 13.3398 16.7782 12.1484 17.1377 10.7754C16.7867 10.9194 16.4029 11 16 11C14.3431 11 13 9.65685 13 8C13 6.34315 14.3431 5 16 5Z" /></svg>
icon:refresh = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M5 12C5 8.13401 8.13401 5 12 5C13.32 5 14.5542 5.36484 15.608 6H15C14.4477 6 14 6.44772 14 7C14 7.55228 14.4477 8 15 8H18C18.5523 8 19 7.55228 19 7C19 6 19 5 19 4C19 3.44772 18.5523 3 18 3C17.4477 3 17 3.44772 17 4V4.51575C15.5702 3.5588 13.85 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21C16.9706 21 21 16.9706 21 12C21 11.6199 20.9764 11.2448 20.9304 10.8763C20.8621 10.3282 20.3624 9.93935 19.8144 10.0077C19.2663 10.076 18.8775 10.5757 18.9458 11.1237C18.9815 11.4104 19 11.7028 19 12C19 15.866 15.866 19 12 19C8.13401 19 5 15.866 5 12Z" /></svg>
icon:remove = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3.99609 13H19.9996C20.5519 13 20.9996 12.5523 20.9996 12C20.9996 11.4477 20.5519 11 19.9996 11H3.99609C3.44381 11 2.99609 11.4477 2.99609 12C2.99609 12.5523 3.44381 13 3.99609 13Z" /></svg>
icon:revert = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M19 12C19 8.13401 15.866 5 12 5C10.68 5 9.4458 5.36484 8.39202 6H9C9.55228 6 10 6.44772 10 7C10 7.55228 9.55228 8 9 8H6C5.44772 8 5 7.55228 5 7C5 6 5 5 5 4C5 3.44772 5.44772 3 6 3C6.55228 3 7 3.44772 7 4V4.51575C8.42985 3.5588 10.15 3 12 3C16.9706 3 21 7.02944 21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 11.6199 3.02362 11.2448 3.06958 10.8763C3.13792 10.3282 3.63759 9.93935 4.18563 10.0077C4.73367 10.076 5.12255 10.5757 5.05421 11.1237C5.01846 11.4104 5 11.7028 5 12C5 15.866 8.13401 19 12 19C15.866 19 19 15.866 19 12Z" /></svg>
icon:settings = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12.0122 2.25C12.7462 2.25846 13.4773 2.34326 14.1937 2.50304C14.5064 2.57279 14.7403 2.83351 14.7758 3.15196L14.946 4.67881C15.0231 5.37986 15.615 5.91084 16.3206 5.91158C16.5103 5.91188 16.6979 5.87238 16.8732 5.79483L18.2738 5.17956C18.5651 5.05159 18.9055 5.12136 19.1229 5.35362C20.1351 6.43464 20.8889 7.73115 21.3277 9.14558C21.4223 9.45058 21.3134 9.78203 21.0564 9.9715L19.8149 10.8866C19.4607 11.1468 19.2516 11.56 19.2516 11.9995C19.2516 12.4389 19.4607 12.8521 19.8157 13.1129L21.0582 14.0283C21.3153 14.2177 21.4243 14.5492 21.3297 14.8543C20.8911 16.2685 20.1377 17.5649 19.1261 18.6461C18.9089 18.8783 18.5688 18.9483 18.2775 18.8206L16.8712 18.2045C16.4688 18.0284 16.0068 18.0542 15.6265 18.274C15.2463 18.4937 14.9933 18.8812 14.945 19.3177L14.7759 20.8444C14.741 21.1592 14.5122 21.4182 14.204 21.4915C12.7556 21.8361 11.2465 21.8361 9.79803 21.4915C9.48991 21.4182 9.26105 21.1592 9.22618 20.8444L9.05736 19.32C9.00777 18.8843 8.75434 18.498 8.37442 18.279C7.99451 18.06 7.5332 18.0343 7.1322 18.2094L5.72557 18.8256C5.43422 18.9533 5.09403 18.8833 4.87678 18.6509C3.86462 17.5685 3.11119 16.2705 2.6732 14.8548C2.57886 14.5499 2.68786 14.2186 2.94485 14.0293L4.18818 13.1133C4.54232 12.8531 4.75147 12.4399 4.75147 12.0005C4.75147 11.561 4.54232 11.1478 4.18771 10.8873L2.94516 9.97285C2.6878 9.78345 2.5787 9.45178 2.67337 9.14658C3.11212 7.73215 3.86594 6.43564 4.87813 5.35462C5.09559 5.12236 5.43594 5.05259 5.72724 5.18056L7.12762 5.79572C7.53056 5.97256 7.9938 5.94585 8.37577 5.72269C8.75609 5.50209 9.00929 5.11422 9.05817 4.67764L9.22824 3.15196C9.26376 2.83335 9.49786 2.57254 9.8108 2.50294C10.5281 2.34342 11.26 2.25865 12.0122 2.25ZM11.9997 8.99995C10.3428 8.99995 8.9997 10.3431 8.9997 12C8.9997 13.6568 10.3428 15 11.9997 15C13.6565 15 14.9997 13.6568 14.9997 12C14.9997 10.3431 13.6565 8.99995 11.9997 8.99995Z" /></svg>
icon:stats = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M18.251 3C17.0089 3 16.002 4.00695 16.002 5.24908V18.7509C16.002 19.9931 17.0089 21 18.251 21C19.4932 21 20.5001 19.9931 20.5001 18.7509V5.24908C20.5001 4.00695 19.4932 3 18.251 3ZM11.751 7C10.5089 7 9.50195 8.00695 9.50195 9.24908V18.7509C9.50195 19.9931 10.5089 21 11.751 21C12.9932 21 14.0001 19.9931 14.0001 18.7509V9.24908C14.0001 8.00695 12.9932 7 11.751 7ZM5.25104 11C4.0089 11 3.00195 12.0069 3.00195 13.2491V18.7509C3.00195 19.9931 4.0089 21 5.25104 21C6.49317 21 7.50012 19.9931 7.50012 18.7509V13.2491C7.50012 12.0069 6.49317 11 5.25104 11Z" /></svg>
icon:text = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M2 6C2 5.44772 2.44772 5 3 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H3C2.44772 7 2 6.55228 2 6ZM2 18C2 17.4477 2.44772 17 3 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H3C2.44772 19 2 18.5523 2 18ZM3 11C2.44772 11 2 11.4477 2 12C2 12.5523 2.44772 13 3 13H21C21.5523 13 22 12.5523 22 12C22 11.4477 21.5523 11 21 11H3Z" /></svg>
icon:timer_off = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3.28034 2.21968C2.98745 1.92678 2.51257 1.92677 2.21968 2.21966C1.92678 2.51255 1.92677 2.98743 2.21966 3.28032L6.21321 7.27395C4.54413 8.82598 3.5 11.041 3.5 13.5C3.5 18.1944 7.30558 22 12 22C14.4589 22 16.6739 20.9559 18.2259 19.2869L20.7194 21.7805C21.0123 22.0734 21.4872 22.0734 21.7801 21.7805C22.073 21.4876 22.073 21.0127 21.7801 20.7198L3.28034 2.21968ZM12.6164 13.6773C12.481 13.8723 12.2554 14 12 14C11.6203 14 11.3065 13.7178 11.2568 13.3518L11.25 13.25V12.3108L12.6164 13.6773ZM12.75 8.74999V9.56816L19.8784 16.6967C20.2792 15.7099 20.5 14.6307 20.5 13.5C20.5 8.80557 16.6944 4.99999 12 4.99999C10.8693 4.99999 9.79024 5.22076 8.80345 5.62153L11.4367 8.25482C11.5741 8.09858 11.7756 7.99999 12 7.99999C12.3797 7.99999 12.6935 8.28215 12.7432 8.64822L12.75 8.74999ZM19.1704 5.12259L19.2517 5.18424L20.4008 6.18424C20.7132 6.45616 20.7461 6.9299 20.4742 7.24235C20.2249 7.52878 19.8061 7.58026 19.4973 7.3774L19.416 7.31575L18.267 6.31575C17.9545 6.04383 17.9217 5.57009 18.1936 5.25763C18.4428 4.97121 18.8617 4.91973 19.1704 5.12259ZM14.25 2.49999C14.6642 2.49999 15 2.83578 15 3.24999C15 3.62969 14.7178 3.94348 14.3518 3.99315L14.25 3.99999H9.75C9.33579 3.99999 9 3.66421 9 3.24999C9 2.8703 9.28215 2.5565 9.64823 2.50684L9.75 2.49999H14.25Z" /></svg>
icon:timer = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 5C16.6944 5 20.5 8.80558 20.5 13.5C20.5 18.1944 16.6944 22 12 22C7.30558 22 3.5 18.1944 3.5 13.5C3.5 8.80558 7.30558 5 12 5ZM12 8C11.6203 8 11.3065 8.28215 11.2568 8.64823L11.25 8.75V13.25L11.2568 13.3518C11.3065 13.7178 11.6203 14 12 14C12.3797 14 12.6935 13.7178 12.7432 13.3518L12.75 13.25V8.75L12.7432 8.64823C12.6935 8.28215 12.3797 8 12 8ZM19.1704 5.1226L19.2517 5.18424L20.4008 6.18424C20.7132 6.45617 20.7461 6.9299 20.4742 7.24236C20.2249 7.52878 19.8061 7.58026 19.4973 7.3774L19.416 7.31576L18.267 6.31576C17.9545 6.04383 17.9217 5.5701 18.1936 5.25764C18.4428 4.97122 18.8617 4.91974 19.1704 5.1226ZM14.25 2.5C14.6642 2.5 15 2.83579 15 3.25C15 3.6297 14.7178 3.94349 14.3518 3.99315L14.25 4H9.75C9.33579 4 9 3.66421 9 3.25C9 2.8703 9.28215 2.55651 9.64823 2.50685L9.75 2.5H14.25Z" /></svg>
icon:unchecked = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 3C4.45507 3 3 4.45508 3 6.25V17.75C3 19.5449 4.45508 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM8.21967 8.21967C8.51256 7.92678 8.98744 7.92678 9.28033 8.21967L12 10.9393L14.7197 8.21967C15.0126 7.92678 15.4874 7.92678 15.7803 8.21967C16.0732 8.51256 16.0732 8.98744 15.7803 9.28033L13.0607 12L15.7803 14.7197C16.0732 15.0126 16.0732 15.4874 15.7803 15.7803C15.4874 16.0732 15.0126 16.0732 14.7197 15.7803L12 13.0607L9.28033 15.7803C8.98744 16.0732 8.51256 16.0732 8.21967 15.7803C7.92678 15.4874 7.92678 15.0126 8.21967 14.7197L10.9393 12L8.21967 9.28033C7.92678 8.98744 7.92678 8.51256 8.21967 8.21967Z" /></svg>
icon:view = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M11.9999 9.00462C14.209 9.00462 15.9999 10.7955 15.9999 13.0046C15.9999 15.2138 14.209 17.0046 11.9999 17.0046C9.79073 17.0046 7.99987 15.2138 7.99987 13.0046C7.99987 10.7955 9.79073 9.00462 11.9999 9.00462ZM11.9999 5.5C16.6134 5.5 20.596 8.65001 21.701 13.0644C21.8016 13.4662 21.5574 13.8735 21.1556 13.9741C20.7537 14.0746 20.3465 13.8305 20.2459 13.4286C19.307 9.67796 15.9212 7 11.9999 7C8.07681 7 4.68997 9.68026 3.75273 13.4332C3.65237 13.835 3.24523 14.0794 2.84336 13.9791C2.44149 13.8787 2.19707 13.4716 2.29743 13.0697C3.40052 8.65272 7.38436 5.5 11.9999 5.5Z" /></svg>

View File

@@ -0,0 +1,144 @@
# This file is automatically generated. Do not edit.
# Meta
meta:name = Fluent UI - Regular
meta:author = Microsoft
meta:license = MIT
# Icons
icon:alert_error = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12.0001 1.99609C16.05 1.99609 19.3568 5.19084 19.4959 9.24515L19.5001 9.49609V13.5931L20.8801 16.7491C20.9492 16.907 20.9848 17.0775 20.9848 17.2499C20.9848 17.9402 20.4252 18.4999 19.7348 18.4999L15.0001 18.5014C15.0001 20.1582 13.657 21.5014 12.0001 21.5014C10.4024 21.5014 9.09645 20.2524 9.0052 18.6776L8.99966 18.4991L4.27498 18.4999C4.10364 18.4999 3.93413 18.4646 3.77697 18.3964C3.14377 18.1213 2.85342 17.3851 3.12846 16.7519L4.50011 13.594V9.49599C4.50071 5.3412 7.8522 1.99609 12.0001 1.99609ZM13.4997 18.4991L10.5001 18.5014C10.5001 19.3298 11.1717 20.0014 12.0001 20.0014C12.7798 20.0014 13.4206 19.4065 13.4932 18.6458L13.4997 18.4991ZM12.0001 3.49609C8.67995 3.49609 6.00059 6.17035 6.00011 9.49609V13.9057L4.65613 16.9999H19.3526L18.0001 13.9067L18.0002 9.50895L17.9965 9.28375C17.8854 6.05027 15.2417 3.49609 12.0001 3.49609Z" /></svg>
icon:alert_info = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12.0016 1.99902C17.5253 1.99902 22.0031 6.47687 22.0031 12.0006C22.0031 17.5243 17.5253 22.0021 12.0016 22.0021C6.47785 22.0021 2 17.5243 2 12.0006C2 6.47687 6.47785 1.99902 12.0016 1.99902ZM12.0016 3.49902C7.30627 3.49902 3.5 7.3053 3.5 12.0006C3.5 16.6959 7.30627 20.5021 12.0016 20.5021C16.6968 20.5021 20.5031 16.6959 20.5031 12.0006C20.5031 7.3053 16.6968 3.49902 12.0016 3.49902ZM12 10.5C12.4142 10.5 12.75 10.8358 12.75 11.25V16.25C12.75 16.6642 12.4142 17 12 17C11.5858 17 11.25 16.6642 11.25 16.25V11.25C11.25 10.8358 11.5858 10.5 12 10.5ZM12 9C12.5523 9 13 8.55229 13 8C13 7.44772 12.5523 7 12 7C11.4477 7 11 7.44772 11 8C11 8.55229 11.4477 9 12 9Z" /></svg>
icon:alert_question = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 2C17.523 2 22 6.478 22 12C22 17.522 17.523 22 12 22C6.477 22 2 17.522 2 12C2 6.478 6.477 2 12 2ZM12 3.667C7.405 3.667 3.667 7.405 3.667 12C3.667 16.595 7.405 20.333 12 20.333C16.595 20.333 20.333 16.595 20.333 12C20.333 7.405 16.595 3.667 12 3.667ZM12 15.5C12.5523 15.5 13 15.9477 13 16.5C13 17.0523 12.5523 17.5 12 17.5C11.4477 17.5 11 17.0523 11 16.5C11 15.9477 11.4477 15.5 12 15.5ZM12 6.75C13.5188 6.75 14.75 7.98122 14.75 9.5C14.75 10.5108 14.4525 11.074 13.6989 11.8586L13.5303 12.0303C12.9084 12.6522 12.75 12.9163 12.75 13.5C12.75 13.9142 12.4142 14.25 12 14.25C11.5858 14.25 11.25 13.9142 11.25 13.5C11.25 12.4892 11.5475 11.926 12.3011 11.1414L12.4697 10.9697C13.0916 10.3478 13.25 10.0837 13.25 9.5C13.25 8.80964 12.6904 8.25 12 8.25C11.3528 8.25 10.8205 8.74187 10.7565 9.37219L10.75 9.5C10.75 9.91421 10.4142 10.25 10 10.25C9.58579 10.25 9.25 9.91421 9.25 9.5C9.25 7.98122 10.4812 6.75 12 6.75Z" /></svg>
icon:alert_warn = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M9.13848 3.70711C10.3664 1.43126 13.6315 1.43104 14.8592 3.70711L21.6024 16.209C22.7697 18.374 21.2016 21.0014 18.742 21.002H5.25469C2.79486 21.0017 1.22681 18.3742 2.39433 16.209L9.13848 3.70711ZM13.5389 4.41902C12.8779 3.1935 11.119 3.19371 10.4578 4.41902L3.71464 16.921C3.08599 18.0867 3.93027 19.5017 5.25469 19.502H18.742C20.0661 19.5014 20.9105 18.0866 20.2821 16.921L13.5389 4.41902ZM11.9998 15.0001C12.5521 15.0001 12.9998 15.4478 12.9998 16.0001C12.9998 16.5523 12.5521 17.0001 11.9998 17.0001C11.4477 16.9999 10.9999 16.5522 10.9998 16.0001C10.9998 15.4479 11.4476 15.0002 11.9998 15.0001ZM11.9998 7.50007C12.414 7.50007 12.7498 7.83586 12.7498 8.25007V12.7501C12.7498 13.1642 12.414 13.5001 11.9998 13.5001C11.5857 13.4999 11.2499 13.1642 11.2498 12.7501V8.25007C11.2498 7.83593 11.5857 7.5002 11.9998 7.50007Z" /></svg>
icon:cls_archive = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M10.25 11C9.83579 11 9.5 11.3358 9.5 11.75C9.5 12.1642 9.83579 12.5 10.25 12.5H13.75C14.1642 12.5 14.5 12.1642 14.5 11.75C14.5 11.3358 14.1642 11 13.75 11H10.25ZM3 5.25C3 4.00736 4.00736 3 5.25 3H18.75C19.9926 3 21 4.00736 21 5.25V6.75C21 7.5301 20.603 8.21748 20 8.62111V17.25C20 19.3211 18.3211 21 16.25 21H7.75C5.67893 21 4 19.3211 4 17.25V8.62111C3.39701 8.21748 3 7.5301 3 6.75V5.25ZM5.5 9V17.25C5.5 18.4926 6.50736 19.5 7.75 19.5H16.25C17.4926 19.5 18.5 18.4926 18.5 17.25V9H5.5ZM5.25 4.5C4.83579 4.5 4.5 4.83579 4.5 5.25V6.75C4.5 7.16421 4.83579 7.5 5.25 7.5H18.75C19.1642 7.5 19.5 7.16421 19.5 6.75V5.25C19.5 4.83579 19.1642 4.5 18.75 4.5H5.25Z" /></svg>
icon:cls_character = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 4.5C11.0335 4.5 10.25 5.2835 10.25 6.25C10.25 7.2165 11.0335 8 12 8C12.9665 8 13.75 7.2165 13.75 6.25C13.75 5.2835 12.9665 4.5 12 4.5ZM8.75 6.25C8.75 4.45507 10.2051 3 12 3C13.7949 3 15.25 4.45507 15.25 6.25C15.25 8.04493 13.7949 9.5 12 9.5C10.2051 9.5 8.75 8.04493 8.75 6.25ZM5 6.5C4.17157 6.5 3.5 7.17157 3.5 8C3.5 8.82843 4.17157 9.5 5 9.5C5.82843 9.5 6.5 8.82843 6.5 8C6.5 7.17157 5.82843 6.5 5 6.5ZM2 8C2 6.34315 3.34315 5 5 5C6.65685 5 8 6.34315 8 8C8 9.65685 6.65685 11 5 11C3.34315 11 2 9.65685 2 8ZM17.5 8C17.5 7.17157 18.1716 6.5 19 6.5C19.8284 6.5 20.5 7.17157 20.5 8C20.5 8.82843 19.8284 9.5 19 9.5C18.1716 9.5 17.5 8.82843 17.5 8ZM19 5C17.3431 5 16 6.34315 16 8C16 9.65685 17.3431 11 19 11C20.6569 11 22 9.65685 22 8C22 6.34315 20.6569 5 19 5ZM7.5 12.75C7.5 11.7835 8.2835 11 9.25 11H14.75C15.7165 11 16.5 11.7835 16.5 12.75V16.5C16.5 18.9853 14.4853 21 12 21C9.51472 21 7.5 18.9853 7.5 16.5V12.75ZM9.25 12.5C9.11193 12.5 9 12.6119 9 12.75V16.5C9 18.1569 10.3431 19.5 12 19.5C13.6569 19.5 15 18.1569 15 16.5V12.75C15 12.6119 14.8881 12.5 14.75 12.5H9.25ZM6.60996 11.9776C6.53838 12.2227 6.5 12.4819 6.5 12.7501V13.56L3.68573 14.3141C3.55236 14.3498 3.47322 14.4869 3.50895 14.6203L4.22071 17.2766C4.60374 18.7061 5.9571 19.6165 7.38228 19.489C7.69735 19.9748 8.08697 20.4077 8.53496 20.7715C8.45229 20.7989 8.36834 20.824 8.28317 20.8468C5.88257 21.49 3.41505 20.0654 2.77182 17.6648L2.06006 15.0085C1.80992 14.075 2.36394 13.1154 3.2975 12.8652L6.60996 11.9776ZM15.4654 20.7712C15.5483 20.7987 15.6326 20.8239 15.718 20.8468C18.1186 21.49 20.5861 20.0654 21.2294 17.6648L21.9411 15.0085C22.1913 14.075 21.6373 13.1154 20.7037 12.8652L17.3899 11.9773C17.4616 12.2224 17.5 12.4818 17.5 12.7501V13.5597L20.3155 14.3141C20.4488 14.3498 20.528 14.4869 20.4923 14.6203L19.7805 17.2766C19.3974 18.7065 18.0434 19.617 16.6178 19.4889C16.3028 19.9746 15.9133 20.4074 15.4654 20.7712Z" /></svg>
icon:cls_custom = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M10.7878 3.10215C11.283 2.09877 12.7138 2.09876 13.209 3.10215L15.567 7.87987L20.8395 8.64601C21.9468 8.80691 22.3889 10.1677 21.5877 10.9487L17.7724 14.6676L18.6731 19.9189C18.8622 21.0217 17.7047 21.8627 16.7143 21.342L11.9984 18.8627L7.28252 21.342C6.29213 21.8627 5.13459 21.0217 5.32374 19.9189L6.2244 14.6676L2.40916 10.9487C1.60791 10.1677 2.05005 8.80691 3.15735 8.64601L8.42988 7.87987L10.7878 3.10215ZM11.9984 4.03854L9.74008 8.61443C9.54344 9.01288 9.16332 9.28904 8.72361 9.35294L3.67382 10.0867L7.32788 13.6486C7.64606 13.9587 7.79125 14.4055 7.71614 14.8435L6.85353 19.8729L11.3702 17.4983C11.7635 17.2915 12.2333 17.2915 12.6266 17.4983L17.1433 19.8729L16.2807 14.8435C16.2056 14.4055 16.3508 13.9587 16.6689 13.6486L20.323 10.0867L15.2732 9.35294C14.8335 9.28904 14.4534 9.01288 14.2568 8.61443L11.9984 4.03854Z" /></svg>
icon:cls_entity = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 3.5C5.83579 3.5 5.5 3.83579 5.5 4.25V20.5H7.5V17.75C7.5 17.0596 8.05964 16.5 8.75 16.5H15.25C15.9404 16.5 16.5 17.0596 16.5 17.75V20.5H18.5V11.75C18.5 11.3358 18.1642 11 17.75 11H15.75C15.3358 11 15 10.6642 15 10.25V4.25C15 3.83579 14.6642 3.5 14.25 3.5H6.25ZM9 18V20.5H11.25V18H9ZM12.75 18V20.5H15V18H12.75ZM19.25 22H4.75C4.33579 22 4 21.6642 4 21.25V4.25C4 3.00736 5.00736 2 6.25 2H14.25C15.4926 2 16.5 3.00736 16.5 4.25V9.5H17.75C18.9926 9.5 20 10.5074 20 11.75V21.25C20 21.6642 19.6642 22 19.25 22ZM7.5 6.5C7.5 5.94772 7.94772 5.5 8.5 5.5C9.05229 5.5 9.5 5.94772 9.5 6.5C9.5 7.05228 9.05229 7.5 8.5 7.5C7.94772 7.5 7.5 7.05228 7.5 6.5ZM8.5 12.5C7.94772 12.5 7.5 12.9477 7.5 13.5C7.5 14.0523 7.94772 14.5 8.5 14.5C9.05229 14.5 9.5 14.0523 9.5 13.5C9.5 12.9477 9.05229 12.5 8.5 12.5ZM8.5 9C7.94772 9 7.5 9.44771 7.5 10C7.5 10.5523 7.94772 11 8.5 11C9.05229 11 9.5 10.5523 9.5 10C9.5 9.44771 9.05229 9 8.5 9ZM12 5.5C11.4477 5.5 11 5.94772 11 6.5C11 7.05228 11.4477 7.5 12 7.5C12.5523 7.5 13 7.05228 13 6.5C13 5.94772 12.5523 5.5 12 5.5ZM12 12.5C11.4477 12.5 11 12.9477 11 13.5C11 14.0523 11.4477 14.5 12 14.5C12.5523 14.5 13 14.0523 13 13.5C13 12.9477 12.5523 12.5 12 12.5ZM15.5 12.5C14.9477 12.5 14.5 12.9477 14.5 13.5C14.5 14.0523 14.9477 14.5 15.5 14.5C16.0523 14.5 16.5 14.0523 16.5 13.5C16.5 12.9477 16.0523 12.5 15.5 12.5ZM12 9C11.4477 9 11 9.44771 11 10C11 10.5523 11.4477 11 12 11C12.5523 11 13 10.5523 13 10C13 9.44771 12.5523 9 12 9Z" /></svg>
icon:cls_none = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M14 3.75C14 4.16421 13.6642 4.5 13.25 4.5L10.75 4.5C10.3358 4.5 10 4.16421 10 3.75C10 3.33579 10.3358 3 10.75 3H13.25C13.6642 3 14 3.33579 14 3.75ZM4.5 10.75C4.5 10.3358 4.16421 10 3.75 10C3.33579 10 3 10.3358 3 10.75V13.25C3 13.6642 3.33579 14 3.75 14C4.16421 14 4.5 13.6642 4.5 13.25V10.75ZM19.5 10.75C19.5 10.3358 19.8358 10 20.25 10C20.6642 10 21 10.3358 21 10.75V13.25C21 13.6642 20.6642 14 20.25 14C19.8358 14 19.5 13.6642 19.5 13.25V10.75ZM13.25 21C13.6642 21 14 20.6642 14 20.25C14 19.8358 13.6642 19.5 13.25 19.5H10.75C10.3358 19.5 10 19.8358 10 20.25C10 20.6642 10.3358 21 10.75 21H13.25ZM7 3.75C7 3.33579 6.66421 3 6.25 3H5.75C4.23122 3 3 4.23122 3 5.75V6.25C3 6.66421 3.33579 7 3.75 7C4.16421 7 4.5 6.66421 4.5 6.25V5.75C4.5 5.05964 5.05964 4.5 5.75 4.5H6.25C6.66421 4.5 7 4.16421 7 3.75ZM17.75 3C17.3358 3 17 3.33579 17 3.75C17 4.16421 17.3358 4.5 17.75 4.5H18.25C18.9404 4.5 19.5 5.05964 19.5 5.75V6.25C19.5 6.66421 19.8358 7 20.25 7C20.6642 7 21 6.66421 21 6.25V5.75C21 4.23122 19.7688 3 18.25 3H17.75ZM7 20.25C7 20.6642 6.66421 21 6.25 21H5.75C4.23122 21 3 19.7688 3 18.25V17.75C3 17.3358 3.33579 17 3.75 17C4.16421 17 4.5 17.3358 4.5 17.75V18.25C4.5 18.9404 5.05964 19.5 5.75 19.5H6.25C6.66421 19.5 7 19.8358 7 20.25ZM17.75 21C17.3358 21 17 20.6642 17 20.25C17 19.8358 17.3358 19.5 17.75 19.5H18.25C18.9404 19.5 19.5 18.9404 19.5 18.25V17.75C19.5 17.3358 19.8358 17 20.25 17C20.6642 17 21 17.3358 21 17.75V18.25C21 19.7688 19.7688 21 18.25 21H17.75Z" /></svg>
icon:cls_novel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M7 6C7 5.44772 7.44772 5 8 5H16C16.5523 5 17 5.44772 17 6V8C17 8.55228 16.5523 9 16 9H8C7.44772 9 7 8.55228 7 8V6ZM8.5 7.5H15.5V6.5H8.5V7.5ZM4 4.5C4 3.11929 5.11929 2 6.5 2H18C19.3807 2 20.5 3.11929 20.5 4.5V18.75C20.5 19.1642 20.1642 19.5 19.75 19.5H5.5C5.5 20.0523 5.94772 20.5 6.5 20.5H19.75C20.1642 20.5 20.5 20.8358 20.5 21.25C20.5 21.6642 20.1642 22 19.75 22H6.5C5.11929 22 4 20.8807 4 19.5V4.5ZM5.5 18H19V4.5C19 3.94772 18.5523 3.5 18 3.5H6.5C5.94772 3.5 5.5 3.94772 5.5 4.5V18Z" /></svg>
icon:cls_object = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M8 4.5H8.99998V10.7382C8.99998 11.1132 8.90628 11.4822 8.72739 11.8117L5.14269 18.415C4.50968 19.5811 5.35388 20.9999 6.68068 20.9999H17.3193C18.6461 20.9999 19.4903 19.5811 18.8573 18.415L15.2726 11.8117C15.0937 11.4822 15 11.1132 15 10.7382V4.5H16C16.4142 4.5 16.75 4.16421 16.75 3.75C16.75 3.33579 16.4142 3 16 3H8C7.58579 3 7.25 3.33579 7.25 3.75C7.25 4.16421 7.58579 4.5 8 4.5ZM10.5 10.7382V4.5H13.5V10.7382C13.5 11.3631 13.6561 11.9781 13.9543 12.5273L14.7537 14H9.24621L10.0457 12.5273C10.3438 11.9781 10.5 11.3631 10.5 10.7382ZM8.43192 15.5H15.568L17.539 19.1307C17.6294 19.2973 17.5088 19.4999 17.3193 19.4999H6.68068C6.49114 19.4999 6.37054 19.2973 6.46097 19.1307L8.43192 15.5Z" /></svg>
icon:cls_plot = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M13 2.00423C14.5977 2.00423 15.9037 3.25315 15.994 4.82327L15.999 4.999L18.25 5C19.1172 5 19.837 5.63072 19.9758 6.45858L19.9942 6.60663L20 6.75018L19.9991 10.5012L18.0015 10.5013C17.2579 10.5013 16.6353 11.0445 16.5215 11.7403L16.5062 11.8725L16.5015 12.0013C16.5015 12.7449 17.0446 13.3675 17.7405 13.4813L17.8727 13.4965L18.0014 13.5013L19.9991 13.5012L20 17.2526C20 18.1708 19.2929 18.9238 18.3934 18.9968L18.2499 19.0026L15.999 19.002L15.9949 19.1747C15.9106 20.6305 14.7881 21.8078 13.3567 21.9774L13.1763 21.9933L13 21.9984C11.4023 21.9984 10.0963 20.7495 10.0051 19.1779L10 19.002L7.75 19.0026C6.88283 19.0026 6.16298 18.3719 6.02417 17.5443L6.0058 17.3963L6 17.2528L5.999 15.001L5.836 14.9962C4.38017 14.9119 3.20285 13.7894 3.03326 12.3581L3.01736 12.1776L3.01227 12.0013C3.01227 10.4036 4.26119 9.09765 5.83593 9.0064L5.999 9.001L6 6.75C6 5.88283 6.63072 5.16298 7.45831 5.02418L7.60631 5.0058L7.74981 5L9.999 4.999L10.0051 4.82796C10.0894 3.37214 11.2119 2.19482 12.6432 2.02523L12.8237 2.00933L13 2.00423ZM13 3.50423C12.2203 3.50423 11.5795 4.09912 11.5069 4.86039L11.5 5.00497L11.4985 6.49904L7.75 6.5C7.63165 6.5 7.53251 6.58223 7.5066 6.69279L7.5 6.75018L7.49909 10.5012L6.01227 10.5013C5.18384 10.5013 4.51227 11.1729 4.51227 12.0013C4.51227 12.781 5.10716 13.4218 5.86775 13.4944L6.01219 13.5013L7.49909 13.5012L7.5 17.2526C7.5 17.371 7.58223 17.4701 7.69261 17.496L7.7499 17.5026L11.4985 17.5021L11.5 18.9984C11.5 19.8268 12.1716 20.4984 13 20.4984C13.7797 20.4984 14.4204 19.9035 14.4931 19.1434L14.5 18.9991L14.4985 17.5021L18.25 17.5026C18.3683 17.5026 18.4675 17.4204 18.4934 17.3101L18.5 17.2528L18.499 15L17.9762 15.0009L17.7968 14.9944C16.2855 14.8922 15.0927 13.6769 15.0068 12.1532L15.0019 11.976L15.0084 11.7967C15.1105 10.2854 16.3258 9.09259 17.827 9.00631L18.0014 9.00131L18.499 9.001L18.5 6.75C18.5 6.65532 18.4474 6.57294 18.3697 6.5305L18.3072 6.5066L18.2498 6.5L14.4985 6.49904L14.5 5.00423C14.5 4.17581 13.8284 3.50423 13 3.50423Z" /></svg>
icon:cls_template = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.25 11H7.75C7.34 11 7 11.34 7 11.75C7 12.16 7.34 12.5 7.75 12.5H16.25C16.66 12.5 17 12.16 17 11.75C17 11.34 16.66 11 16.25 11ZM16.25 15.5H7.75C7.34 15.5 7 15.84 7 16.25C7 16.66 7.34 17 7.75 17H16.25C16.66 17 17 16.66 17 16.25C17 15.84 16.66 15.5 16.25 15.5ZM7 7.25001C7 7.66001 7.34 8.00001 7.75 8.00001H15.2L15.11 7.72001C15.06 7.58001 14.99 7.45001 14.9 7.33001C14.86 7.28001 14.83 7.24001 14.79 7.20001C14.64 7.05001 14.46 6.94001 14.27 6.88001L13.1 6.50001H7.75C7.34 6.50001 7 6.84001 7 7.25001ZM19.8 13.29L19.54 12.5L18.74 12.21C18.65 12.18 18.58 12.13 18.5 12.09V19.75C18.5 20.16 18.16 20.5 17.75 20.5H6.25C5.84 20.5 5.5 20.16 5.5 19.75V4.25001C5.5 3.84001 5.84 3.50001 6.25 3.50001H11.78C11.81 3.44001 11.83 3.37001 11.87 3.31001C12.11 2.97001 12.45 2.71001 12.86 2.57001L14.27 2.11001C14.34 2.08001 14.42 2.04001 14.49 2.00001H6.25C5.01 2.00001 4 3.01001 4 4.25001V19.75C4 20.99 5.01 22 6.25 22H17.75C18.99 22 20 20.99 20 19.75V13.67C19.92 13.55 19.85 13.43 19.8 13.29ZM15.85 6.15001C15.93 6.23001 16.01 6.32001 16.08 6.42001C16.28 6.67001 16.43 6.96001 16.53 7.27001L16.98 8.65001C17.02 8.76001 17.09 8.85001 17.18 8.91001C17.27 8.98001 17.38 9.01001 17.49 9.01001C17.6 9.01001 17.71 8.98001 17.8 8.91001C17.88 8.85001 17.95 8.77001 17.99 8.68001V8.65001L18.45 7.27001C18.59 6.85001 18.82 6.47001 19.14 6.16001C19.45 5.85001 19.83 5.61001 20.25 5.47001L21.63 5.02001C21.74 4.98001 21.83 4.91001 21.89 4.82001C21.96 4.73001 21.99 4.62001 21.99 4.51001C21.99 4.40001 21.96 4.29001 21.89 4.20001C21.82 4.11001 21.73 4.04001 21.63 4.00001H21.6L20.22 3.55001C19.8 3.41001 19.42 3.18001 19.11 2.86001C18.8 2.55001 18.56 2.17001 18.42 1.75001L17.97 0.37001C17.93 0.26001 17.86 0.17001 17.77 0.11001C17.68 0.0500098 17.57 0.0100098 17.46 0.0100098C17.35 0.0100098 17.24 0.0400098 17.15 0.11001C17.06 0.17001 16.99 0.27001 16.95 0.37001L16.5 1.75001V1.78001C16.35 2.18001 16.12 2.55001 15.83 2.85001C15.52 3.16001 15.15 3.40001 14.73 3.54001L13.35 3.99001C13.24 4.03001 13.15 4.10001 13.09 4.19001C13.02 4.28001 12.99 4.39001 12.99 4.50001C12.99 4.61001 13.02 4.72001 13.09 4.81001C13.15 4.90001 13.25 4.97001 13.35 5.01001L14.73 5.46001C15.15 5.60001 15.53 5.84001 15.84 6.15001H15.85ZM23.78 10.22C23.8438 10.22 23.9105 10.2806 23.95 10.33C23.99 10.38 24 10.44 24 10.5C24 10.56 23.99 10.62 23.95 10.67C23.91 10.72 23.86 10.76 23.8 10.78L23.03 11.03C22.8 11.11 22.59 11.24 22.41 11.41C22.24 11.58 22.11 11.79 22.03 12.03L21.78 12.79C21.76 12.85 21.72 12.9 21.67 12.94C21.62 12.98 21.56 13 21.5 13C21.44 13 21.38 12.98 21.33 12.94C21.28 12.9 21.24 12.85 21.22 12.79L20.97 12.03C20.89 11.8 20.76 11.58 20.59 11.41C20.42 11.24 20.2 11.1 19.97 11.03L19.2 10.78C19.14 10.76 19.09 10.72 19.05 10.67C19.01 10.62 18.99 10.56 18.99 10.5C18.99 10.44 19.01 10.38 19.05 10.33C19.09 10.28 19.14 10.24 19.2 10.22L19.97 9.97001C20.2 9.89001 20.41 9.76001 20.58 9.59001C20.75 9.42001 20.88 9.21001 20.95 8.98001L21.2 8.22001C21.22 8.16001 21.26 8.11001 21.31 8.07001C21.36 8.03001 21.42 8.01001 21.48 8.01001C21.54 8.01001 21.6 8.03001 21.65 8.07001C21.7 8.11001 21.74 8.16001 21.76 8.22001L22.01 8.98001C22.09 9.21001 22.22 9.42001 22.39 9.60001C22.56 9.77001 22.77 9.90001 23.01 9.98001L23.78 10.22Z" /></svg>
icon:cls_timeline = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M15.2505 13C16.217 13 17.0005 13.7835 17.0005 14.75V19.25C17.0005 20.2165 16.217 21 15.2505 21H3.75048C2.78398 21 2.00048 20.2165 2.00048 19.25V14.75C2.00048 13.7835 2.78398 13 3.75048 13H15.2505ZM21.0008 14.8989L21.0005 20.25C21.0005 20.6642 20.6647 21 20.2505 21C19.8708 21 19.557 20.7178 19.5073 20.3518L19.5005 20.25L19.5001 14.9117C19.7324 14.9694 19.9754 15 20.2255 15C20.4936 15 20.7535 14.9648 21.0008 14.8989ZM15.2505 14.5H3.75048C3.61241 14.5 3.50048 14.6119 3.50048 14.75V19.25C3.50048 19.3881 3.61241 19.5 3.75048 19.5H15.2505C15.3886 19.5 15.5005 19.3881 15.5005 19.25V14.75C15.5005 14.6119 15.3886 14.5 15.2505 14.5ZM20.2503 10.0919C21.3041 10.0919 22.1583 10.9462 22.1583 12C22.1583 13.0538 21.3041 13.9081 20.2503 13.9081C19.1965 13.9081 18.3422 13.0538 18.3422 12C18.3422 10.9462 19.1965 10.0919 20.2503 10.0919ZM15.2461 3C16.2126 3 16.9961 3.7835 16.9961 4.75V9.25C16.9961 10.2165 16.2126 11 15.2461 11H3.74609C2.7796 11 1.99609 10.2165 1.99609 9.25V4.75C1.99609 3.83183 2.7032 3.07881 3.60257 3.0058L3.74609 3H15.2461ZM15.2461 4.5H3.74609L3.68877 4.5066C3.57833 4.53251 3.49609 4.63165 3.49609 4.75V9.25C3.49609 9.38807 3.60802 9.5 3.74609 9.5H15.2461C15.3842 9.5 15.4961 9.38807 15.4961 9.25V4.75C15.4961 4.61193 15.3842 4.5 15.2461 4.5ZM20.2505 3C20.6302 3 20.944 3.28215 20.9937 3.64823L21.0005 3.75L21.0008 9.10113C20.7535 9.03516 20.4936 9 20.2255 9C19.9754 9 19.7324 9.03061 19.5001 9.08829L19.5005 3.75C19.5005 3.33579 19.8363 3 20.2505 3Z" /></svg>
icon:cls_trash = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M7.03454 3.5C6.13437 3.5 5.4063 4.17543 5.2982 5.02738C5.36232 5.00954 5.4299 5 5.49971 5H18.4997C18.5695 5 18.6371 5.00954 18.7012 5.02738C18.5931 4.17543 17.8651 3.5 16.9649 3.5H7.03454ZM6.85063 19.8306C6.8918 20.2114 7.21327 20.5 7.59629 20.5H16.4031C16.7861 20.5 17.1076 20.2114 17.1488 19.8306L18.5905 6.49456C18.5608 6.49815 18.5304 6.5 18.4997 6.5H5.49971C5.46897 6.5 5.43866 6.49815 5.4089 6.49456L6.85063 19.8306ZM3.80337 5.59932C3.59559 3.67734 5.10136 2 7.03454 2H16.9649C18.8981 2 20.4038 3.67733 20.196 5.59932L18.6401 19.9918C18.5166 21.1342 17.5522 22 16.4031 22H7.59629C6.44725 22 5.48282 21.1342 5.35932 19.9918L3.80337 5.59932ZM11.7919 10.4094C11.8909 10.2614 12.1085 10.2614 12.2075 10.4094L12.8763 11.4092C13.1067 11.7535 13.5725 11.8459 13.9167 11.6156C14.261 11.3852 14.3534 10.9194 14.1231 10.5752L13.4542 9.57538C12.7612 8.53947 11.2382 8.53946 10.5452 9.57538L9.87634 10.5752C9.64602 10.9194 9.7384 11.3852 10.0827 11.6156C10.427 11.8459 10.8928 11.7535 11.1231 11.4092L11.7919 10.4094ZM9.63558 12.5991C9.99077 12.8122 10.1059 13.2729 9.89283 13.6281L9.5287 14.2349C9.32874 14.5682 9.5688 14.9922 9.95745 14.9922H10.7497C11.1639 14.9922 11.4997 15.328 11.4997 15.7422C11.4997 16.1564 11.1639 16.4922 10.7497 16.4922H9.95745C8.40286 16.4922 7.44263 14.7962 8.24246 13.4632L8.60659 12.8563C8.8197 12.5011 9.2804 12.386 9.63558 12.5991ZM14.1087 13.6276C13.8958 13.2723 14.0113 12.8117 14.3666 12.5988C14.722 12.3859 15.1826 12.5014 15.3954 12.8568L15.7594 13.4644C16.558 14.7974 15.5977 16.4922 14.0437 16.4922H13.2497C12.8355 16.4922 12.4997 16.1564 12.4997 15.7422C12.4997 15.328 12.8355 14.9922 13.2497 14.9922H14.0437C14.4322 14.9922 14.6723 14.5685 14.4727 14.2352L14.1087 13.6276Z" /></svg>
icon:cls_world = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12.0001 1.99805C17.5238 1.99805 22.0016 6.47589 22.0016 11.9996C22.0016 12.391 21.9792 12.7771 21.9354 13.1568C21.5198 12.7312 21.0358 12.3728 20.5011 12.0993C20.5014 12.0661 20.5016 12.0329 20.5016 11.9996C20.5016 11.3102 20.4196 10.64 20.2647 9.99811L16.9067 9.99897C16.9566 10.5166 16.9874 11.0482 16.9977 11.5902C16.4685 11.6876 15.9659 11.8608 15.5014 12.0981L15.5016 11.9996C15.5016 11.309 15.465 10.6393 15.397 9.99901H8.60316C8.53514 10.6393 8.49853 11.309 8.49853 11.9996C8.49853 13.0591 8.58468 14.0694 8.73827 14.9997H12.8748C12.6906 15.4714 12.5697 15.9747 12.5225 16.4993H9.06118C9.71322 18.9135 10.8466 20.5011 12.0001 20.5011C12.455 20.5011 12.9067 20.2542 13.3271 19.8071C13.688 20.4229 14.1594 21.0286 14.7259 21.6252C13.8594 21.8701 12.945 22.0011 12.0001 22.0011C6.47638 22.0011 1.99854 17.5233 1.99854 11.9996C1.99854 6.47589 6.47638 1.99805 12.0001 1.99805ZM7.5084 16.4999L4.78591 16.4998C5.74425 18.0328 7.1777 19.2384 8.88008 19.9104C8.3578 19.0906 7.92681 18.0643 7.60981 16.8949L7.5084 16.4999ZM7.09351 9.99895H3.7359L3.73115 10.0162C3.57906 10.6525 3.49854 11.3166 3.49854 11.9996C3.49854 13.0558 3.69112 14.0669 4.0431 14.9999L7.21626 14.9995C7.07396 14.0504 6.99854 13.0422 6.99854 11.9996C6.99854 11.3156 7.031 10.6464 7.09351 9.99895ZM8.88114 4.08875L8.85823 4.09747C6.81092 4.91218 5.1549 6.49949 4.25023 8.49935L7.29835 8.49972C7.61171 6.74693 8.15855 5.221 8.88114 4.08875ZM12.0001 3.49805L11.8844 3.50335C10.619 3.6191 9.39651 5.62107 8.8288 8.4993H15.1714C14.6052 5.62914 13.388 3.63033 12.1264 3.50436L12.0001 3.49805ZM15.1201 4.08881L15.2269 4.2629C15.8961 5.37537 16.4043 6.83525 16.7018 8.49972L19.7499 8.49935C18.8853 6.58795 17.3343 5.05341 15.4113 4.21008L15.1201 4.08881ZM22.5001 16.9991C22.5001 14.5138 20.4853 12.4991 18.0001 12.4991C15.5148 12.4991 13.5001 14.5138 13.5001 16.9991C13.5001 18.8617 14.9199 20.8139 17.7001 22.8991C17.8778 23.0324 18.1223 23.0324 18.3001 22.8991C21.0803 20.8139 22.5001 18.8617 22.5001 16.9991ZM16.5001 16.9991C16.5001 16.1707 17.1716 15.4991 18.0001 15.4991C18.8285 15.4991 19.5001 16.1707 19.5001 16.9991C19.5001 17.8275 18.8285 18.4991 18.0001 18.4991C17.1716 18.4991 16.5001 17.8275 16.5001 16.9991Z" /></svg>
icon:key_pov = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M10.1092 15.4992C10.1572 14.9841 10.2943 14.4758 10.5207 13.9992H4.25278C3.01076 13.9992 2.00391 15.0061 2.00391 16.2481V16.8258C2.00391 17.7185 2.32242 18.582 2.90219 19.2609C4.46849 21.0952 6.8545 22.0004 10.0004 22.0004C11.4131 22.0004 12.6729 21.8178 13.7743 21.4506L12.5593 20.2356C11.7962 20.4118 10.9441 20.5004 10.0004 20.5004C7.26206 20.5004 5.29618 19.7546 4.04287 18.2869C3.69502 17.8795 3.50391 17.3614 3.50391 16.8258V16.2481C3.50391 15.8345 3.83919 15.4992 4.25278 15.4992H10.1092ZM10.0004 2.00391C12.7618 2.00391 15.0004 4.24248 15.0004 7.00391C15.0004 9.76533 12.7618 12.0039 10.0004 12.0039C7.23894 12.0039 5.00036 9.76533 5.00036 7.00391C5.00036 4.24248 7.23894 2.00391 10.0004 2.00391ZM10.0004 3.50391C8.06737 3.50391 6.50036 5.07091 6.50036 7.00391C6.50036 8.9369 8.06737 10.5039 10.0004 10.5039C11.9334 10.5039 13.5004 8.9369 13.5004 7.00391C13.5004 5.07091 11.9334 3.50391 10.0004 3.50391ZM17.0439 22.996C16.8519 22.9961 16.6599 22.9228 16.5135 22.7764L12.1052 18.3681C10.7514 17.0142 10.7514 14.8192 12.1052 13.4654C13.4591 12.1116 15.6541 12.1116 17.0079 13.4654L17.0439 13.5014L17.0799 13.4654C18.4337 12.1116 20.6287 12.1116 21.9826 13.4654C23.3364 14.8192 23.3364 17.0142 21.9826 18.3681L17.5743 22.7764C17.4279 22.9228 17.2359 22.9961 17.0439 22.996Z" /></svg>
icon:key_focus = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M17.5004 12.0003C20.5379 12.0003 23.0004 14.4627 23.0004 17.5003C23.0004 20.5378 20.5379 23.0003 17.5004 23.0003C14.4628 23.0003 12.0004 20.5378 12.0004 17.5003C12.0004 14.4627 14.4628 12.0003 17.5004 12.0003ZM14.8539 17.1467C14.6587 16.9514 14.3421 16.9514 14.1468 17.1467C13.9515 17.342 13.9515 17.6586 14.1468 17.8538L16.1468 19.8538C16.3421 20.0491 16.6587 20.0491 16.8539 19.8538L20.8539 15.8538C21.0492 15.6586 21.0492 15.342 20.8539 15.1467C20.6587 14.9514 20.3421 14.9514 20.1468 15.1467L16.5004 18.7931L14.8539 17.1467ZM12.0226 13.9996C11.7259 14.4629 11.4864 14.9663 11.314 15.4999L4.25278 15.5002C3.83919 15.5002 3.50391 15.8355 3.50391 16.2491V16.8267C3.50391 17.3624 3.69502 17.8805 4.04287 18.2878C5.29618 19.7555 7.26206 20.5013 10.0004 20.5013C10.5968 20.5013 11.1567 20.4659 11.6806 20.3954C11.9258 20.8903 12.2333 21.3489 12.5921 21.7618C11.7966 21.922 10.9317 22.0013 10.0004 22.0013C6.8545 22.0013 4.46849 21.0962 2.90219 19.2619C2.32242 18.583 2.00391 17.7195 2.00391 16.8267V16.2491C2.00391 15.007 3.01076 14.0002 4.25278 14.0002L12.0226 13.9996ZM10.0004 2.00488C12.7618 2.00488 15.0004 4.24346 15.0004 7.00488C15.0004 9.76631 12.7618 12.0049 10.0004 12.0049C7.23894 12.0049 5.00036 9.76631 5.00036 7.00488C5.00036 4.24346 7.23894 2.00488 10.0004 2.00488ZM10.0004 3.50488C8.06737 3.50488 6.50036 5.07189 6.50036 7.00488C6.50036 8.93788 8.06737 10.5049 10.0004 10.5049C11.9334 10.5049 13.5004 8.93788 13.5004 7.00488C13.5004 5.07189 11.9334 3.50488 10.0004 3.50488Z" /></svg>
icon:key_mention = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12.5255 15.4999C12.578 14.9714 12.7128 14.4671 12.9169 13.9999H4.25278C3.01076 13.9999 2.00391 15.0068 2.00391 16.2488V16.8265C2.00391 17.7193 2.32242 18.5828 2.90219 19.2617C4.46849 21.0959 6.8545 22.0011 10.0004 22.0011C10.6701 22.0011 11.3055 21.9601 11.9059 21.8778C11.8907 21.8714 11.8756 21.8647 11.8604 21.8576C11.3065 21.5973 10.9855 21.0412 10.9984 20.4656C10.6779 20.4893 10.3452 20.5011 10.0004 20.5011C7.26206 20.5011 5.29618 19.7553 4.04287 18.2876C3.69502 17.8802 3.50391 17.3622 3.50391 16.8265V16.2488C3.50391 15.8352 3.83919 15.4999 4.25278 15.4999H12.5255ZM10.0004 2.00464C12.7618 2.00464 15.0004 4.24321 15.0004 7.00464C15.0004 9.76606 12.7618 12.0046 10.0004 12.0046C7.23894 12.0046 5.00036 9.76606 5.00036 7.00464C5.00036 4.24321 7.23894 2.00464 10.0004 2.00464ZM10.0004 3.50464C8.06737 3.50464 6.50036 5.07164 6.50036 7.00464C6.50036 8.93764 8.06737 10.5046 10.0004 10.5046C11.9334 10.5046 13.5004 8.93764 13.5004 7.00464C13.5004 5.07164 11.9334 3.50464 10.0004 3.50464ZM17.5025 12C15.2934 12 13.5025 13.7909 13.5025 16L13.5023 19L12.5539 19.8004C12.2462 20.06 12.0923 20.1899 12.0457 20.2913C11.9312 20.5407 12.0391 20.8358 12.2875 20.9525C12.3885 21 12.5898 21 12.9925 21H22.0121C22.4148 21 22.6162 21 22.7172 20.9525C22.9656 20.8358 23.0735 20.5407 22.9589 20.2913C22.9123 20.1899 22.7584 20.06 22.4507 19.8003L21.5025 19V16C21.5025 13.7909 19.7116 12 17.5025 12ZM19.0025 22C18.7842 22.5826 18.195 23 17.5025 23C16.81 23 16.2208 22.5826 16.0025 22H19.0025Z" /></svg>
icon:cmn_general = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 28 28" fill="#000000"><path d="M9.96973 15.2197C10.2626 14.9268 10.7374 14.9268 11.0303 15.2197C11.3232 15.5126 11.3232 15.9874 11.0303 16.2803L9.03027 18.2803C8.88962 18.4209 8.69891 18.5 8.5 18.5C8.30109 18.5 8.11038 18.4209 7.96973 18.2803L6.96973 17.2803C6.67683 16.9874 6.67683 16.5126 6.96973 16.2197C7.26262 15.9268 7.73738 15.9268 8.03027 16.2197L8.5 16.6895L9.96973 15.2197ZM20.5 16C20.9142 16 21.25 16.3358 21.25 16.75C21.25 17.1642 20.9142 17.5 20.5 17.5H13.5C13.0858 17.5 12.75 17.1642 12.75 16.75C12.75 16.3358 13.0858 16 13.5 16H20.5ZM9.96973 9.71973C10.2626 9.42683 10.7374 9.42683 11.0303 9.71973C11.3232 10.0126 11.3232 10.4874 11.0303 10.7803L9.03027 12.7803C8.88962 12.9209 8.69891 13 8.5 13C8.30109 13 8.11038 12.9209 7.96973 12.7803L6.96973 11.7803C6.67683 11.4874 6.67683 11.0126 6.96973 10.7197C7.26262 10.4268 7.73738 10.4268 8.03027 10.7197L8.5 11.1895L9.96973 9.71973ZM20.5 10.5C20.9142 10.5 21.25 10.8358 21.25 11.25C21.25 11.6642 20.9142 12 20.5 12H13.5C13.0858 12 12.75 11.6642 12.75 11.25C12.75 10.8358 13.0858 10.5 13.5 10.5H20.5ZM22.248 4C24.3191 4 25.998 5.67893 25.998 7.75V20.25C25.998 22.3211 24.3191 24 22.248 24H5.75195C3.68089 24 2.00195 22.3211 2.00195 20.25V7.75C2.00195 5.67893 3.68089 4 5.75195 4H22.248ZM5.75195 5.5C4.50931 5.5 3.50195 6.50736 3.50195 7.75V20.25C3.50195 21.4926 4.50931 22.5 5.75195 22.5H22.248C23.4907 22.5 24.498 21.4926 24.498 20.25V7.75C24.498 6.50736 23.4907 5.5 22.248 5.5H5.75195Z" /></svg>
icon:cmn_note = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M5.25 18C3.45507 18 2 16.5449 2 14.75V6.25C2 4.45507 3.45507 3 5.25 3H18.75C20.5449 3 22 4.45507 22 6.25V14.75C22 16.5449 20.5449 18 18.75 18H13.0125L7.99868 21.7507C7.44585 22.1642 6.6625 22.0512 6.24901 21.4984C6.08736 21.2822 6 21.0196 6 20.7499L5.99921 18H5.25ZM12.5135 16.5H18.75C19.7165 16.5 20.5 15.7165 20.5 14.75V6.25C20.5 5.2835 19.7165 4.5 18.75 4.5H5.25C4.2835 4.5 3.5 5.2835 3.5 6.25V14.75C3.5 15.7165 4.2835 16.5 5.25 16.5H7.49879L7.499 17.2498L7.49986 20.2506L12.5135 16.5Z" /></svg>
icon:cmn_story = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.0883 6.41228C16.016 6.31886 15.9377 6.2298 15.8539 6.14569C15.5417 5.83255 15.1606 5.59666 14.741 5.45683L13.3632 5.00939C13.257 4.97196 13.165 4.90253 13.1 4.81068C13.0349 4.71883 13 4.60908 13 4.49656C13 4.38404 13.0349 4.27429 13.1 4.18244C13.165 4.09058 13.257 4.02116 13.3632 3.98372L14.741 3.53628C15.1547 3.39352 15.5299 3.15705 15.837 2.84537C16.1357 2.54224 16.3623 2.17595 16.5 1.77372L16.5114 1.73963L16.9592 0.362894C16.9967 0.256782 17.0662 0.164895 17.1581 0.0998993C17.25 0.0349035 17.3598 0 17.4724 0C17.5851 0 17.6949 0.0349035 17.7868 0.0998993C17.8787 0.164895 17.9482 0.256782 17.9857 0.362894L18.4335 1.73963C18.5727 2.15819 18.8077 2.53853 19.1198 2.85041C19.432 3.1623 19.8126 3.39715 20.2315 3.53628L21.6093 3.98372L21.6368 3.99061C21.743 4.02804 21.835 4.09747 21.9 4.18932C21.9651 4.28117 22 4.39092 22 4.50344C22 4.61596 21.9651 4.72571 21.9 4.81756C21.835 4.90942 21.743 4.97884 21.6368 5.01628L20.259 5.46372C19.8402 5.60285 19.4595 5.8377 19.1474 6.14959C18.8353 6.46147 18.6003 6.84181 18.461 7.26037L18.0132 8.63711C18.0092 8.64855 18.0048 8.65983 18 8.67093C17.9605 8.76273 17.8964 8.84212 17.8144 8.9001C17.7224 8.9651 17.6126 9 17.5 9C17.3874 9 17.2776 8.9651 17.1856 8.9001C17.0937 8.8351 17.0242 8.74322 16.9868 8.63711L16.539 7.26037C16.4378 6.95331 16.2851 6.66664 16.0883 6.41228ZM23.7829 10.2132L23.0175 9.9646C22.7848 9.8873 22.5733 9.75683 22.3999 9.58356C22.2265 9.41029 22.0959 9.199 22.0186 8.96646L21.7698 8.20161C21.749 8.14266 21.7104 8.09161 21.6593 8.0555C21.6083 8.01939 21.5473 8 21.4847 8C21.4221 8 21.3611 8.01939 21.31 8.0555C21.259 8.09161 21.2204 8.14266 21.1996 8.20161L20.9508 8.96646C20.875 9.19736 20.7467 9.40761 20.5761 9.58076C20.4055 9.75392 20.1971 9.88529 19.9672 9.9646L19.2018 10.2132C19.1428 10.234 19.0917 10.2725 19.0555 10.3236C19.0194 10.3746 19 10.4356 19 10.4981C19 10.5606 19.0194 10.6216 19.0555 10.6726C19.0917 10.7236 19.1428 10.7622 19.2018 10.783L19.9672 11.0316C20.2003 11.1093 20.412 11.2403 20.5855 11.4143C20.7589 11.5882 20.8893 11.8003 20.9661 12.0335L21.2149 12.7984C21.2357 12.8573 21.2743 12.9084 21.3254 12.9445C21.3764 12.9806 21.4374 13 21.5 13C21.5626 13 21.6236 12.9806 21.6746 12.9445C21.7257 12.9084 21.7643 12.8573 21.7851 12.7984L22.0339 12.0335C22.1113 11.801 22.2418 11.5897 22.4152 11.4164C22.5886 11.2432 22.8001 11.1127 23.0328 11.0354L23.7982 10.7868C23.8572 10.766 23.9083 10.7275 23.9445 10.6764C23.9806 10.6254 24 10.5644 24 10.5019C24 10.4394 23.9806 10.3784 23.9445 10.3274C23.9083 10.2764 23.8572 10.2378 23.7982 10.217L23.7829 10.2132ZM12.0716 4H4.75C3.23122 4 2 5.23122 2 6.75V17.25C2 18.7688 3.23122 20 4.75 20H19.25C20.7688 20 22 18.7688 22 17.25V13.931C21.8315 14.0086 21.6474 14.0495 21.46 14.0495C21.191 14.0495 20.9288 13.9654 20.71 13.809C20.6334 13.7545 20.5631 13.6924 20.5 13.6239V17.25C20.5 17.9404 19.9404 18.5 19.25 18.5H4.75C4.05964 18.5 3.5 17.9404 3.5 17.25V6.75C3.5 6.05964 4.05964 5.5 4.75 5.5H12.3725C12.3392 5.4549 12.3083 5.40785 12.28 5.35903C12.0986 5.09759 12.001 4.78722 12 4.46903C12.0004 4.3091 12.0248 4.15108 12.0716 4ZM6 8.75C6 8.33579 6.33579 8 6.75 8H11.25C11.6642 8 12 8.33579 12 8.75C12 9.16421 11.6642 9.5 11.25 9.5H6.75C6.33579 9.5 6 9.16421 6 8.75ZM6.75 11C6.33579 11 6 11.3358 6 11.75C6 12.1642 6.33579 12.5 6.75 12.5H15.25C15.6642 12.5 16 12.1642 16 11.75C16 11.3358 15.6642 11 15.25 11H6.75ZM6 14.75C6 14.3358 6.33579 14 6.75 14H13.25C13.6642 14 14 14.3358 14 14.75C14 15.1642 13.6642 15.5 13.25 15.5H6.75C6.33579 15.5 6 15.1642 6 14.75Z" /></svg>
icon:prj_folder = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3.5 6.25V8H8.12868C8.32759 8 8.51836 7.92098 8.65901 7.78033L10.1893 6.25L8.65901 4.71967C8.51836 4.57902 8.32759 4.5 8.12868 4.5H5.25C4.2835 4.5 3.5 5.2835 3.5 6.25ZM2 6.25C2 4.45507 3.45507 3 5.25 3H8.12868C8.72542 3 9.29771 3.23705 9.71967 3.65901L11.5607 5.5H18.75C20.5449 5.5 22 6.95507 22 8.75V17.75C22 19.5449 20.5449 21 18.75 21H5.25C3.45507 21 2 19.5449 2 17.75V6.25ZM3.5 9.5V17.75C3.5 18.7165 4.2835 19.5 5.25 19.5H18.75C19.7165 19.5 20.5 18.7165 20.5 17.75V8.75C20.5 7.7835 19.7165 7 18.75 7H11.5607L9.71967 8.84099C9.29771 9.26295 8.72542 9.5 8.12868 9.5H3.5Z" /></svg>
icon:prj_document = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 2C5.00736 2 4 3.00736 4 4.25V19.75C4 20.9926 5.00736 22 6.25 22H17.75C18.9926 22 20 20.9926 20 19.75V4.25C20 3.00736 18.9926 2 17.75 2H6.25ZM5.5 4.25C5.5 3.83579 5.83579 3.5 6.25 3.5H17.75C18.1642 3.5 18.5 3.83579 18.5 4.25V19.75C18.5 20.1642 18.1642 20.5 17.75 20.5H6.25C5.83579 20.5 5.5 20.1642 5.5 19.75V4.25ZM7.75 6.5C7.33579 6.5 7 6.83579 7 7.25C7 7.66421 7.33579 8 7.75 8H16.25C16.6642 8 17 7.66421 17 7.25C17 6.83579 16.6642 6.5 16.25 6.5H7.75ZM7 16.25C7 15.8358 7.33579 15.5 7.75 15.5H16.25C16.6642 15.5 17 15.8358 17 16.25C17 16.6642 16.6642 17 16.25 17H7.75C7.33579 17 7 16.6642 7 16.25ZM7.75 11C7.33579 11 7 11.3358 7 11.75C7 12.1642 7.33579 12.5 7.75 12.5H16.25C16.6642 12.5 17 12.1642 17 11.75C17 11.3358 16.6642 11 16.25 11H7.75Z" /></svg>
icon:prj_title = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 2C5.00736 2 4 3.00736 4 4.25V19.75C4 20.9926 5.00736 22 6.25 22H17.75C18.9926 22 20 20.9926 20 19.75V4.25C20 3.00736 18.9926 2 17.75 2H6.25ZM5.5 4.25C5.5 3.83579 5.83579 3.5 6.25 3.5H17.75C18.1642 3.5 18.5 3.83579 18.5 4.25V19.75C18.5 20.1642 18.1642 20.5 17.75 20.5H6.25C5.83579 20.5 5.5 20.1642 5.5 19.75V4.25ZM7.75 6.5C7.33579 6.5 7 6.83579 7 7.25C7 7.66421 7.33579 8 7.75 8H16.25C16.6642 8 17 7.66421 17 7.25C17 6.83579 16.6642 6.5 16.25 6.5H7.75ZM7 16.25C7 15.8358 7.33579 15.5 7.75 15.5H16.25C16.6642 15.5 17 15.8358 17 16.25C17 16.6642 16.6642 17 16.25 17H7.75C7.33579 17 7 16.6642 7 16.25ZM7.75 11C7.33579 11 7 11.3358 7 11.75C7 12.1642 7.33579 12.5 7.75 12.5H16.25C16.6642 12.5 17 12.1642 17 11.75C17 11.3358 16.6642 11 16.25 11H7.75Z" /></svg>
icon:prj_chapter = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 2C5.00736 2 4 3.00736 4 4.25V19.75C4 20.9926 5.00736 22 6.25 22H17.75C18.9926 22 20 20.9926 20 19.75V4.25C20 3.00736 18.9926 2 17.75 2H6.25ZM5.5 4.25C5.5 3.83579 5.83579 3.5 6.25 3.5H17.75C18.1642 3.5 18.5 3.83579 18.5 4.25V19.75C18.5 20.1642 18.1642 20.5 17.75 20.5H6.25C5.83579 20.5 5.5 20.1642 5.5 19.75V4.25ZM7.75 6.5C7.33579 6.5 7 6.83579 7 7.25C7 7.66421 7.33579 8 7.75 8H16.25C16.6642 8 17 7.66421 17 7.25C17 6.83579 16.6642 6.5 16.25 6.5H7.75ZM7 16.25C7 15.8358 7.33579 15.5 7.75 15.5H16.25C16.6642 15.5 17 15.8358 17 16.25C17 16.6642 16.6642 17 16.25 17H7.75C7.33579 17 7 16.6642 7 16.25ZM7.75 11C7.33579 11 7 11.3358 7 11.75C7 12.1642 7.33579 12.5 7.75 12.5H16.25C16.6642 12.5 17 12.1642 17 11.75C17 11.3358 16.6642 11 16.25 11H7.75Z" /></svg>
icon:prj_scene = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 2C5.00736 2 4 3.00736 4 4.25V19.75C4 20.9926 5.00736 22 6.25 22H17.75C18.9926 22 20 20.9926 20 19.75V4.25C20 3.00736 18.9926 2 17.75 2H6.25ZM5.5 4.25C5.5 3.83579 5.83579 3.5 6.25 3.5H17.75C18.1642 3.5 18.5 3.83579 18.5 4.25V19.75C18.5 20.1642 18.1642 20.5 17.75 20.5H6.25C5.83579 20.5 5.5 20.1642 5.5 19.75V4.25ZM7.75 6.5C7.33579 6.5 7 6.83579 7 7.25C7 7.66421 7.33579 8 7.75 8H16.25C16.6642 8 17 7.66421 17 7.25C17 6.83579 16.6642 6.5 16.25 6.5H7.75ZM7 16.25C7 15.8358 7.33579 15.5 7.75 15.5H16.25C16.6642 15.5 17 15.8358 17 16.25C17 16.6642 16.6642 17 16.25 17H7.75C7.33579 17 7 16.6642 7 16.25ZM7.75 11C7.33579 11 7 11.3358 7 11.75C7 12.1642 7.33579 12.5 7.75 12.5H16.25C16.6642 12.5 17 12.1642 17 11.75C17 11.3358 16.6642 11 16.25 11H7.75Z" /></svg>
icon:prj_note = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.25 2C16.6642 2 17 2.33579 17 2.75V4H17.75C18.9926 4 20 5.00736 20 6.25V16.6895C20 17.0872 19.8418 17.4687 19.5605 17.75L15.75 21.5605C15.4687 21.8418 15.0872 22 14.6895 22H6.25C5.00736 22 4 20.9926 4 19.75V6.25C4 5.00736 5.00736 4 6.25 4H7V2.75C7 2.33579 7.33579 2 7.75 2C8.16421 2 8.5 2.33579 8.5 2.75V4H11.25V2.75C11.25 2.33579 11.5858 2 12 2C12.4142 2 12.75 2.33579 12.75 2.75V4H15.5V2.75C15.5 2.33579 15.8358 2 16.25 2ZM6.25 5.5C5.83579 5.5 5.5 5.83579 5.5 6.25V19.75C5.5 20.1642 5.83579 20.5 6.25 20.5H14V18.25C14 17.0074 15.0074 16 16.25 16H18.5V6.25C18.5 5.83579 18.1642 5.5 17.75 5.5H6.25ZM16.25 17.5C15.8358 17.5 15.5 17.8358 15.5 18.25V19.6895L17.6895 17.5H16.25ZM11.3271 16.0039C11.7051 16.0425 12 16.3618 12 16.75C12 17.1382 11.7051 17.4575 11.3271 17.4961L11.25 17.5H8.25C7.83579 17.5 7.5 17.1642 7.5 16.75C7.5 16.3358 7.83579 16 8.25 16H11.25L11.3271 16.0039ZM15.75 12C16.1642 12 16.5 12.3358 16.5 12.75C16.5 13.1642 16.1642 13.5 15.75 13.5H8.25C7.83579 13.5 7.5 13.1642 7.5 12.75C7.5 12.3358 7.83579 12 8.25 12H15.75ZM15.75 8C16.1642 8 16.5 8.33579 16.5 8.75C16.5 9.16421 16.1642 9.5 15.75 9.5H8.25C7.83579 9.5 7.5 9.16421 7.5 8.75C7.5 8.33579 7.83579 8 8.25 8H15.75Z" /></svg>
icon:fmt_align_center = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4 5.75C4 5.33579 4.33579 5 4.75 5H19.25C19.6642 5 20 5.33579 20 5.75C20 6.16421 19.6642 6.5 19.25 6.5H4.75C4.33579 6.5 4 6.16421 4 5.75ZM6 18.75C6 18.3358 6.33579 18 6.75 18H17.25C17.6642 18 18 18.3358 18 18.75C18 19.1642 17.6642 19.5 17.25 19.5H6.75C6.33579 19.5 6 19.1642 6 18.75ZM2.75 11.5C2.33579 11.5 2 11.8358 2 12.25C2 12.6642 2.33579 13 2.75 13H21.25C21.6642 13 22 12.6642 22 12.25C22 11.8358 21.6642 11.5 21.25 11.5H2.75Z" /></svg>
icon:fmt_align_left = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M2 5.75C2 5.33579 2.33579 5 2.75 5H18.25C18.6642 5 19 5.33579 19 5.75C19 6.16421 18.6642 6.5 18.25 6.5H2.75C2.33579 6.5 2 6.16421 2 5.75ZM2 18.75C2 18.3358 2.33579 18 2.75 18H13.25C13.6642 18 14 18.3358 14 18.75C14 19.1642 13.6642 19.5 13.25 19.5H2.75C2.33579 19.5 2 19.1642 2 18.75ZM2.75 11.5C2.33579 11.5 2 11.8358 2 12.25C2 12.6642 2.33579 13 2.75 13H21.25C21.6642 13 22 12.6642 22 12.25C22 11.8358 21.6642 11.5 21.25 11.5H2.75Z" /></svg>
icon:fmt_align_right = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M5 5.75C5 5.33579 5.33579 5 5.75 5H21.25C21.6642 5 22 5.33579 22 5.75C22 6.16421 21.6642 6.5 21.25 6.5H5.75C5.33579 6.5 5 6.16421 5 5.75ZM10 18.75C10 18.3358 10.3358 18 10.75 18H21.25C21.6642 18 22 18.3358 22 18.75C22 19.1642 21.6642 19.5 21.25 19.5H10.75C10.3358 19.5 10 19.1642 10 18.75ZM2.75 11.5C2.33579 11.5 2 11.8358 2 12.25C2 12.6642 2.33579 13 2.75 13H21.25C21.6642 13 22 12.6642 22 12.25C22 11.8358 21.6642 11.5 21.25 11.5H2.75Z" /></svg>
icon:fmt_bold = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.93514 4.43963C7.21647 4.15815 7.59813 4 7.99609 4H12.3795C15.0161 4 16.9995 6.18211 16.9995 8.62541C16.9995 9.60205 16.6828 10.5367 16.1341 11.307C17.211 12.134 17.9995 13.4274 17.9995 15.12C17.9995 18.2315 15.301 20 13.1195 20H7.99951C7.17108 20 6.49951 19.3284 6.49951 18.5L6.49609 5.50082C6.49588 5.10285 6.65382 4.72111 6.93514 4.43963ZM9.49869 10.2499H12.3795C13.2824 10.2499 13.9995 9.49051 13.9995 8.62541C13.9995 7.76 13.2814 7 12.3795 7H9.49691L9.49869 10.2499ZM9.49951 13.2499V17H13.1195C13.9927 17 14.9995 16.2464 14.9995 15.12C14.9995 13.9901 14.0248 13.2499 13.1195 13.2499H9.49951Z" /></svg>
icon:fmt_italic = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M18.75 4C19.1642 4 19.5 4.33579 19.5 4.75C19.5 5.16421 19.1642 5.5 18.75 5.5H15.2676L10.3359 18.5H13.75C14.1642 18.5 14.5 18.8358 14.5 19.25C14.5 19.6642 14.1642 20 13.75 20H5.25C4.83579 20 4.5 19.6642 4.5 19.25C4.5 18.8358 4.83579 18.5 5.25 18.5H8.73242L13.6641 5.5H10.25C9.83579 5.5 9.5 5.16421 9.5 4.75C9.5 4.33579 9.83579 4 10.25 4H18.75Z" /></svg>
icon:fmt_link = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M9.25 7C9.66421 7 10 7.33579 10 7.75C10 8.12656 9.72249 8.4383 9.36083 8.49187L9.25 8.5H7C5.067 8.5 3.5 10.067 3.5 12C3.5 13.864 4.95707 15.3876 6.79435 15.4941L7 15.5H9.25C9.66421 15.5 10 15.8358 10 16.25C10 16.6266 9.72249 16.9383 9.36083 16.9919L9.25 17H7C4.23858 17 2 14.7614 2 12C2 9.32226 4.10496 7.13615 6.75045 7.00612L7 7H9.25ZM17 7C19.7614 7 22 9.23858 22 12C22 14.6777 19.895 16.8638 17.2495 16.9939L17 17H14.75C14.3358 17 14 16.6642 14 16.25C14 15.8734 14.2775 15.5617 14.6392 15.5081L14.75 15.5H17C18.933 15.5 20.5 13.933 20.5 12C20.5 10.136 19.0429 8.6124 17.2057 8.50594L17 8.5H14.75C14.3358 8.5 14 8.16421 14 7.75C14 7.37344 14.2775 7.0617 14.6392 7.00813L14.75 7H17ZM7 11.25H17C17.4142 11.25 17.75 11.5858 17.75 12C17.75 12.3797 17.4678 12.6935 17.1018 12.7432L17 12.75H7C6.58579 12.75 6.25 12.4142 6.25 12C6.25 11.6203 6.53215 11.3065 6.89823 11.2568L7 11.25H17H7Z" /></svg>
icon:fmt_list_o = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.0001 2.75007C6.0001 2.39585 5.75227 2.08992 5.40576 2.0164C5.06011 1.94307 4.7103 2.12094 4.5658 2.44311L4.56426 2.44645C4.56226 2.45075 4.55842 2.45889 4.55275 2.47049C4.5414 2.49373 4.52282 2.53063 4.49704 2.57815C4.44527 2.67364 4.36584 2.80953 4.2594 2.96255C4.04176 3.27544 3.73538 3.62496 3.35275 3.86399C3.00144 4.08344 2.89456 4.54613 3.11401 4.89743C3.33346 5.24873 3.79615 5.35562 4.14746 5.13616C4.27205 5.05833 4.38956 4.97481 4.5001 4.88772V7.25007C4.5001 7.66429 4.83589 8.00007 5.2501 8.00007C5.66431 8.00007 6.0001 7.66429 6.0001 7.25007V2.75007ZM20.4995 18.7501C20.4995 18.3359 20.1637 18.0001 19.7495 18.0001H10.7495C10.3353 18.0001 9.99951 18.3359 9.99951 18.7501C9.99951 19.1643 10.3353 19.5001 10.7495 19.5001H19.7495C20.1637 19.5001 20.4995 19.1643 20.4995 18.7501ZM20.4995 12.2437C20.4995 11.8295 20.1637 11.4937 19.7495 11.4937H10.7495C10.3353 11.4937 9.99951 11.8295 9.99951 12.2437C9.99951 12.658 10.3353 12.9937 10.7495 12.9937H19.7495C20.1637 12.9937 20.4995 12.658 20.4995 12.2437ZM20.4995 5.75008C20.4995 5.33586 20.1637 5.00008 19.7495 5.00008H10.7495C10.3353 5.00008 9.99951 5.33586 9.99951 5.75008C9.99951 6.16429 10.3353 6.50008 10.7495 6.50008H19.7495C20.1637 6.50008 20.4995 6.16429 20.4995 5.75008ZM5.15093 10.52C4.84957 10.4668 4.47444 10.5864 4.28031 10.7805C3.98741 11.0733 3.51253 11.0733 3.21965 10.7804C2.92677 10.4875 2.92678 10.0127 3.21969 9.71977C3.77556 9.16393 4.65044 8.90848 5.41157 9.04278C5.809 9.11291 6.2173 9.29717 6.52722 9.64842C6.8426 10.0058 7 10.4727 7 11.0001C7 11.6195 6.72895 12.0801 6.39406 12.4206C6.1163 12.7029 5.76315 12.9311 5.48826 13.1087L5.40874 13.1602C5.21348 13.2871 5.05428 13.3971 4.92686 13.5001H6.25C6.66421 13.5001 7 13.8359 7 14.2501C7 14.6643 6.6642 15.0001 6.24999 15.0001H3.75C3.33579 15.0001 3 14.6643 3 14.2501C3 12.9365 3.98385 12.2972 4.57505 11.913L4.63522 11.8739C4.95259 11.6678 5.16843 11.5275 5.32469 11.3687C5.45855 11.2326 5.5 11.1307 5.5 11.0001C5.5 10.7775 5.43865 10.6819 5.40247 10.6409C5.36083 10.5937 5.28475 10.5436 5.15093 10.52ZM2.96967 21.2804C2.96967 21.2804 3.06251 21.3641 2.97426 21.2849L2.97962 21.2902L2.9929 21.3028C3.00287 21.3122 3.01509 21.3233 3.02956 21.336C3.05848 21.3613 3.09653 21.3928 3.14375 21.4282C3.2381 21.499 3.36996 21.5861 3.53959 21.6709C3.88131 21.8418 4.37043 22.0001 5 22.0001C5.63921 22.0001 6.19596 21.8187 6.60132 21.4606C7.00922 21.1001 7.21163 20.6032 7.19553 20.1011C7.18219 19.6847 7.02903 19.3054 6.76986 19.0001C7.02903 18.6948 7.18219 18.3155 7.19553 17.8991C7.21163 17.3969 7.00922 16.9 6.60132 16.5396C6.19596 16.1814 5.63921 16.0001 5 16.0001C4.37043 16.0001 3.88131 16.1584 3.53959 16.3293C3.36996 16.4141 3.2381 16.5012 3.14375 16.572C3.09653 16.6074 3.05848 16.6389 3.02956 16.6642C3.01509 16.6768 3.00287 16.688 2.9929 16.6973L2.97962 16.71L2.97423 16.7152L2.97189 16.7176L2.97091 16.7185L2.96967 16.7197C2.67678 17.0126 2.67678 17.4875 2.96967 17.7804C3.2586 18.0693 3.72462 18.0732 4.01834 17.7921C4.0217 17.7892 4.03018 17.7821 4.04375 17.772C4.0744 17.749 4.13004 17.7111 4.21041 17.6709C4.36869 17.5918 4.62957 17.5001 5 17.5001C5.36079 17.5001 5.53601 17.6 5.60812 17.6637C5.67768 17.7251 5.69823 17.7907 5.6963 17.8511C5.69423 17.9156 5.66403 18.0028 5.57278 18.0819C5.4845 18.1585 5.30962 18.2501 5 18.2501C4.58579 18.2501 4.25 18.5859 4.25 19.0001C4.25 19.4143 4.58579 19.7501 5 19.7501C5.30962 19.7501 5.4845 19.8417 5.57278 19.9183C5.66403 19.9974 5.69423 20.0845 5.6963 20.1491C5.69823 20.2094 5.67768 20.275 5.60812 20.3365C5.53601 20.4002 5.36079 20.5001 5 20.5001C4.62957 20.5001 4.36869 20.4084 4.21041 20.3293C4.13004 20.2891 4.0744 20.2512 4.04375 20.2282C4.03018 20.218 4.0217 20.2109 4.01834 20.208C3.72462 19.9269 3.2586 19.9308 2.96967 20.2197C2.67678 20.5126 2.67678 20.9875 2.96967 21.2804ZM2.97189 16.7176L2.97091 16.7185C2.9776 16.713 3.17182 16.5516 2.97189 16.7176Z" /></svg>
icon:fmt_list_u = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3.24929 17.5C3.93925 17.5 4.49858 18.0593 4.49858 18.7493C4.49858 19.4393 3.93925 19.9986 3.24929 19.9986C2.55933 19.9986 2 19.4393 2 18.7493C2 18.0593 2.55933 17.5 3.24929 17.5ZM6.75 18H21.25C21.6642 18 22 18.3358 22 18.75C22 19.1297 21.7178 19.4435 21.3518 19.4932L21.25 19.5H6.75C6.33579 19.5 6 19.1642 6 18.75C6 18.3703 6.28215 18.0565 6.64823 18.0068L6.75 18H21.25H6.75ZM3.24929 11C3.93925 11 4.49858 11.5593 4.49858 12.2493C4.49858 12.9393 3.93925 13.4986 3.24929 13.4986C2.55933 13.4986 2 12.9393 2 12.2493C2 11.5593 2.55933 11 3.24929 11ZM6.75 11.5H21.25C21.6642 11.5 22 11.8358 22 12.25C22 12.6297 21.7178 12.9435 21.3518 12.9932L21.25 13H6.75C6.33579 13 6 12.6642 6 12.25C6 11.8703 6.28215 11.5565 6.64823 11.5068L6.75 11.5H21.25H6.75ZM3.24929 4.5C3.93925 4.5 4.49858 5.05933 4.49858 5.74929C4.49858 6.43925 3.93925 6.99858 3.24929 6.99858C2.55933 6.99858 2 6.43925 2 5.74929C2 5.05933 2.55933 4.5 3.24929 4.5ZM6.75 5H21.25C21.6642 5 22 5.33579 22 5.75C22 6.1297 21.7178 6.44349 21.3518 6.49315L21.25 6.5H6.75C6.33579 6.5 6 6.16421 6 5.75C6 5.3703 6.28215 5.05651 6.64823 5.00685L6.75 5H21.25H6.75Z" /></svg>
icon:fmt_mark = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.38091 14.0028C3.0555 14.0649 2 15.1592 2 16.5V19.5C2 20.8807 3.11929 22 4.5 22H19.5C20.8807 22 22 20.8807 22 19.5V16.5C22 15.1193 20.8807 14 19.5 14H13.546L12.2298 15.314C12.1647 15.379 12.0971 15.441 12.027 15.5H19.5C20.0523 15.5 20.5 15.9477 20.5 16.5V19.5C20.5 20.0523 20.0523 20.5 19.5 20.5H4.5C3.94772 20.5 3.5 20.0523 3.5 19.5V16.5C3.5 16.1281 3.70304 15.8036 4.00432 15.6313C3.98783 15.3809 4.01852 15.1283 4.09626 14.8868L4.38091 14.0028ZM18.6479 2.94403C19.9043 4.20118 19.9036 6.23878 18.6465 7.49513L11.5233 14.6063C11.2603 14.8688 10.9364 15.0622 10.5805 15.169L6.28749 16.4576C5.75853 16.6164 5.201 16.3163 5.04222 15.7873C4.98398 15.5933 4.98604 15.3862 5.04813 15.1933L6.40953 10.9653C6.51917 10.6248 6.70841 10.3153 6.96156 10.0626L14.0944 2.94144C15.3527 1.68518 17.391 1.68634 18.6479 2.94403ZM15.1542 4.00297L8.02135 11.1241C7.93697 11.2084 7.87388 11.3115 7.83734 11.425L6.76756 14.7474L10.1493 13.7323C10.2679 13.6967 10.3759 13.6323 10.4635 13.5448L17.5855 6.43477C18.2573 5.76338 18.2577 4.67553 17.5869 4.00435C16.9154 3.33242 15.8265 3.3318 15.1542 4.00297Z" /></svg>
icon:fmt_size = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M10.212 17.11L15.0434 3.49912C15.2657 2.87274 16.1126 2.83594 16.4083 3.38866L16.457 3.4992L21.957 18.9997C22.0955 19.3901 21.8913 19.8188 21.501 19.9573C21.1431 20.0843 20.7531 19.9233 20.5838 19.5949L20.5434 19.5013L18.946 15H12.552L10.9726 19.4521C10.9201 19.6396 10.7955 19.8048 10.6175 19.9045L10.5253 19.9482C10.1721 20.0875 9.77668 19.9401 9.59619 19.6178L9.55249 19.5256L8.556 17H4.443L3.44768 19.5209C3.30809 19.874 2.93033 20.0621 2.57164 19.9737L2.47447 19.9426C2.12137 19.803 1.93328 19.4253 2.02168 19.0666L2.05272 18.9694L5.80633 9.47427C6.04172 8.87883 6.84884 8.84415 7.15104 9.36975L7.20152 9.47487L10.212 17.11L15.0434 3.49912L10.212 17.11ZM6.50294 11.7923L5.036 15.5H7.964L6.50294 11.7923ZM15.7501 5.99248L13.084 13.5H18.414L15.7501 5.99248Z" /></svg>
icon:fmt_strike = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.75 12.0002H19.2507C19.6649 12.0002 20.0007 12.3359 20.0007 12.7502C20.0007 13.1299 19.7185 13.4437 19.3524 13.4933L19.2507 13.5002L16.2763 13.5001C17.1552 14.3132 17.6124 15.2931 17.6124 16.4347C17.6124 19.2599 14.3804 21.0745 10.8577 20.6651C8.6233 20.4054 7.04896 19.5095 6.22285 17.9632C6.02767 17.5978 6.16562 17.1434 6.53097 16.9482C6.89632 16.7531 7.35071 16.891 7.54589 17.2564C8.11607 18.3236 9.2483 18.968 11.0308 19.1751C13.7738 19.4939 16.1124 18.1809 16.1124 16.4347C16.1124 15.2627 15.3072 14.3077 13.547 13.5485L13.431 13.5L4.75 13.5002C4.3703 13.5002 4.05651 13.218 4.00685 12.8519L4 12.7502C4 12.3705 4.28215 12.0567 4.64823 12.007L4.75 12.0002H19.2507H4.75ZM6.26098 8.12336C6.41313 5.29223 9.08273 3.65466 12.5845 4.06162C14.7732 4.31598 16.4484 5.11481 17.5674 6.47091C17.8311 6.79039 17.7858 7.2631 17.4663 7.52674C17.1469 7.79038 16.6742 7.74512 16.4105 7.42564C15.5584 6.393 14.2394 5.76405 12.4113 5.55159C9.69368 5.23576 7.76098 6.35648 7.76098 8.12336C7.76098 8.89538 7.99478 9.47149 8.59075 10.1045L8.71896 10.2372C8.81323 10.3327 8.91566 10.4324 8.96956 10.4763L9 10.4979H7.08082L7.05613 10.4589C6.91314 10.2526 6.1997 9.26354 6.26098 8.12336Z" /></svg>
icon:fmt_subscript = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.4881 4.43057C16.8026 4.70014 16.839 5.17361 16.5695 5.48811L10.9879 12L16.0202 17.871C15.7183 18.2808 15.4653 18.7768 15.3381 19.3802L10.0001 13.1524L4.56946 19.4881C4.29989 19.8026 3.82641 19.839 3.51192 19.5695C3.19743 19.2999 3.161 18.8264 3.43057 18.5119L9.01225 12L3.43066 5.48812C3.1611 5.17363 3.19752 4.70015 3.51201 4.43058C3.82651 4.16102 4.29998 4.19744 4.56955 4.51193L10.0001 10.8475L15.4306 4.51192C15.7001 4.19743 16.1736 4.161 16.4881 4.43057ZM17.75 15.5227C17.75 14.995 18.1935 14.5 18.7358 14.5C19.1429 14.5 19.4707 14.6909 19.6292 14.9345C19.765 15.1434 19.8466 15.4998 19.5356 16.0292C19.3861 16.2837 19.16 16.5114 18.854 16.7531C18.7016 16.8735 18.5385 16.9904 18.3611 17.1158L18.2873 17.1679C18.1351 17.2753 17.9721 17.3902 17.8147 17.5087C17.0711 18.0683 16.25 18.8536 16.25 20.25C16.25 20.6642 16.5858 21 17 21L17.0082 21L17.0164 21H20.4506C20.8648 21 21.2006 20.6642 21.2006 20.25C21.2006 19.8358 20.8648 19.5 20.4506 19.5H17.9377C18.0984 19.2182 18.3606 18.9752 18.7166 18.7072C18.8541 18.6038 18.996 18.5036 19.1493 18.3955L19.2269 18.3407C19.4054 18.2145 19.5972 18.0775 19.7837 17.9302C20.1557 17.6364 20.5445 17.2731 20.8289 16.789C21.3858 15.8411 21.3753 14.868 20.8865 14.1166C20.4204 13.4 19.591 13 18.7358 13C17.2582 13 16.25 14.2777 16.25 15.5227C16.25 15.9369 16.5858 16.2727 17 16.2727C17.4142 16.2727 17.75 15.9369 17.75 15.5227Z" /></svg>
icon:fmt_superscript = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M18.7358 3.5C18.1935 3.5 17.75 3.99503 17.75 4.52273C17.75 4.93694 17.4142 5.27273 17 5.27273C16.5858 5.27273 16.25 4.93694 16.25 4.52273C16.25 3.27769 17.2582 2 18.7358 2C19.591 2 20.4204 2.39999 20.8865 3.11661C21.3753 3.86797 21.3858 4.84107 20.8289 5.789C20.5445 6.27315 20.1557 6.63637 19.7837 6.93019C19.5972 7.07753 19.4054 7.21448 19.2269 7.34071L19.1493 7.3955C18.996 7.50364 18.8541 7.60378 18.7166 7.70723C18.3606 7.97516 18.0984 8.21821 17.9377 8.5H20.4506C20.8648 8.5 21.2006 8.83579 21.2006 9.25C21.2006 9.66421 20.8648 10 20.4506 10H17.0164L17.0082 9.99996L17 10C16.5858 10 16.25 9.66421 16.25 9.25C16.25 7.85365 17.0711 7.06828 17.8147 6.50868C17.9721 6.39023 18.1351 6.27527 18.2873 6.16787L18.3611 6.11579C18.5385 5.99042 18.7016 5.87346 18.854 5.75305C19.16 5.51135 19.3861 5.28367 19.5356 5.02918C19.8466 4.49984 19.765 4.1434 19.6292 3.93452C19.4707 3.69092 19.1429 3.5 18.7358 3.5ZM15.26 4.71092C15.3199 5.27162 15.6447 5.75312 16.1068 6.02791L10.9879 11.9999L16.5696 18.5119C16.8392 18.8264 16.8028 19.2999 16.4883 19.5695C16.1738 19.839 15.7003 19.8026 15.4307 19.4881L10.0001 13.1524L4.56946 19.4881C4.29989 19.8026 3.82641 19.839 3.51192 19.5695C3.19743 19.2999 3.161 18.8264 3.43057 18.5119L9.01228 11.9999L3.43073 5.48811C3.16116 5.17361 3.19758 4.70014 3.51208 4.43057C3.82657 4.161 4.30005 4.19743 4.56961 4.51192L10.0001 10.8475L15.26 4.71092Z" /></svg>
icon:fmt_toolbar = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 20 20" fill="#000000"><path d="M16.5 18C16.2239 18 16 17.7761 16 17.5V2.5C16 2.22386 16.2239 2 16.5 2C16.7761 2 17 2.22386 17 2.5V17.5C17 17.7761 16.7761 18 16.5 18Z" /><path d="M10 4C8.89543 4 8 4.89543 8 6V14C8 15.1046 8.89543 16 10 16H12C13.1046 16 14 15.1046 14 14V6C14 4.89543 13.1046 4 12 4H10ZM9 6C9 5.44772 9.44772 5 10 5H12C12.5523 5 13 5.44772 13 6V14C13 14.5523 12.5523 15 12 15H10C9.44772 15 9 14.5523 9 14V6Z" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.75001 19H17.25C17.6642 19 18 19.3358 18 19.75C18 20.1297 17.7179 20.4435 17.3518 20.4932L17.25 20.5H6.75001C6.33579 20.5 6.00001 20.1642 6.00001 19.75C6.00001 19.3703 6.28216 19.0565 6.64824 19.0068L6.75001 19H17.25H6.75001ZM17.25 4C17.6297 4 17.9435 4.28215 17.9932 4.64823L18 4.75V10.75C18 15.1437 15.9371 17.5 11.9971 17.5C8.14241 17.5 6.08619 15.2446 6.00265 11.0336L6 10.75V4.75C6 4.33579 6.33579 4 6.75001 4C7.1297 4 7.44349 4.28215 7.49315 4.64823L7.5 4.75V10.7507C7.49647 14.3568 8.93346 16 11.9971 16C14.9824 16 16.4251 14.4395 16.4972 11.0235L16.5 10.75V4.75C16.5 4.33579 16.8358 4 17.25 4Z" /></svg>
icon:search = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.1017 17.1624C14.717 18.3101 12.9391 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11C19 12.9391 18.3101 14.717 17.1624 16.1018L21.7803 20.7197C22.0732 21.0126 22.0732 21.4874 21.7803 21.7803C21.4874 22.0732 21.0125 22.0732 20.7196 21.7803L16.1017 17.1624ZM17.5 11C17.5 7.41015 14.5899 4.5 11 4.5C7.41015 4.5 4.5 7.41015 4.5 11C4.5 14.5899 7.41015 17.5 11 17.5C14.5899 17.5 17.5 14.5899 17.5 11Z" /></svg>
icon:search_auto = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M13.3136 7.56538L13.1775 7.69092L2.69814 18.1785C1.81212 19.0652 1.81262 20.5022 2.69924 21.3883C3.58585 22.2743 5.02284 22.2738 5.90895 21.3871L16.3879 10.9003C17.2654 10.0213 17.2651 8.59738 16.3868 7.71848L16.2304 7.5715C15.3931 6.85388 14.1533 6.85191 13.3136 7.56538ZM12.466 10.526L13.554 11.614L4.84792 20.3268C4.54743 20.6275 4.06019 20.6277 3.75956 20.3273C3.45889 20.0268 3.45872 19.5395 3.75919 19.2388L12.466 10.526ZM16.8518 15.0068L16.75 15C16.3703 15 16.0565 15.2822 16.0068 15.6482L16 15.75V16.5H15.25C14.8703 16.5 14.5565 16.7822 14.5068 17.1482L14.5 17.25C14.5 17.6297 14.7822 17.9435 15.1482 17.9932L15.25 18H16V18.75C16 19.1297 16.2822 19.4435 16.6482 19.4932L16.75 19.5C17.1297 19.5 17.4435 19.2178 17.4932 18.8518L17.5 18.75V18H18.25C18.6297 18 18.9435 17.7178 18.9932 17.3518L19 17.25C19 16.8703 18.7178 16.5565 18.3518 16.5068L18.25 16.5H17.5V15.75C17.5 15.3703 17.2178 15.0565 16.8518 15.0068L16.75 15L16.8518 15.0068ZM15.2987 8.75163L15.326 8.77899C15.619 9.07214 15.6191 9.54731 15.3266 9.84034L14.615 10.553L13.526 9.464L14.2556 8.73467C14.5496 8.45867 15.0115 8.46427 15.2987 8.75163ZM6.85177 5.00685L6.75 5C6.3703 5 6.05651 5.28215 6.00685 5.64823L6 5.75V6.5H5.25C4.8703 6.5 4.55651 6.78215 4.50685 7.14823L4.5 7.25C4.5 7.6297 4.78215 7.94349 5.14823 7.99315L5.25 8H6V8.75C6 9.1297 6.28215 9.44349 6.64823 9.49315L6.75 9.5C7.1297 9.5 7.44349 9.21785 7.49315 8.85177L7.5 8.75V8H8.25C8.6297 8 8.94349 7.71785 8.99315 7.35177L9 7.25C9 6.8703 8.71785 6.55651 8.35177 6.50685L8.25 6.5H7.5V5.75C7.5 5.3703 7.21785 5.05651 6.85177 5.00685L6.75 5L6.85177 5.00685ZM18.8518 3.00685L18.75 3C18.3703 3 18.0565 3.28215 18.0068 3.64823L18 3.75V4.5H17.25C16.8703 4.5 16.5565 4.78215 16.5068 5.14823L16.5 5.25C16.5 5.6297 16.7822 5.94349 17.1482 5.99315L17.25 6H18V6.75C18 7.1297 18.2822 7.44349 18.6482 7.49315L18.75 7.5C19.1297 7.5 19.4435 7.21785 19.4932 6.85177L19.5 6.75V6H20.25C20.6297 6 20.9435 5.71785 20.9932 5.35177L21 5.25C21 4.8703 20.7178 4.55651 20.3518 4.50685L20.25 4.5H19.5V3.75C19.5 3.3703 19.2178 3.05651 18.8518 3.00685L18.75 3L18.8518 3.00685Z" /></svg>
icon:search_cancel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.39705 4.55379L4.46967 4.46967C4.73594 4.2034 5.1526 4.1792 5.44621 4.39705L5.53033 4.46967L12 10.939L18.4697 4.46967C18.7626 4.17678 19.2374 4.17678 19.5303 4.46967C19.8232 4.76256 19.8232 5.23744 19.5303 5.53033L13.061 12L19.5303 18.4697C19.7966 18.7359 19.8208 19.1526 19.6029 19.4462L19.5303 19.5303C19.2641 19.7966 18.8474 19.8208 18.5538 19.6029L18.4697 19.5303L12 13.061L5.53033 19.5303C5.23744 19.8232 4.76256 19.8232 4.46967 19.5303C4.17678 19.2374 4.17678 18.7626 4.46967 18.4697L10.939 12L4.46967 5.53033C4.2034 5.26406 4.1792 4.8474 4.39705 4.55379L4.46967 4.46967L4.39705 4.55379Z" /></svg>
icon:search_case = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.5106 3.00008C16.8242 3.00452 17.1019 3.20362 17.2068 3.49919L22.7068 18.9992C22.8453 19.3896 22.6411 19.8183 22.2508 19.9568C21.8604 20.0953 21.4317 19.8912 21.2931 19.5008L19.8735 15.5L12.7558 15.5L11.1994 19.5207C11.0499 19.907 10.6155 20.099 10.2292 19.9494C9.84293 19.7999 9.651 19.3655 9.80053 18.9793L15.8005 3.47925C15.9137 3.18678 16.197 2.99563 16.5106 3.00008ZM16.4694 5.90659L13.3364 14L19.3412 14L16.4694 5.90659ZM5.50005 10.5014L5.78725 10.5113C7.74783 10.6088 8.91466 11.7373 8.9955 13.5555L9 13.7604V19.2604C9 19.6401 8.71785 19.9539 8.35177 20.0035L8.25 20.0104C7.8703 20.0104 7.55651 19.7282 7.50685 19.3621L7.5 19.2604L7.49865 19.156C6.51108 19.7214 5.59755 20.0104 4.75 20.0104C2.91158 20.0104 1.5 18.7159 1.5 16.7604C1.5 15.036 2.68843 13.7549 4.6597 13.5158C5.592 13.4028 6.53953 13.4736 7.49853 13.7255C7.4887 12.6184 6.94255 12.0706 5.71275 12.0095C4.75051 11.9616 4.07429 12.0967 3.67825 12.3744C3.33911 12.6123 2.87139 12.5301 2.63357 12.191C2.39576 11.8518 2.47789 11.3841 2.81703 11.1463C3.47484 10.685 4.37072 10.4807 5.50005 10.5014ZM7.499 15.3241L7.19613 15.2338C6.38875 15.0117 5.60483 14.9486 4.8403 15.0413C3.60791 15.1908 3 15.8461 3 16.7967C3 17.8934 3.7124 18.5467 4.75 18.5467C5.43032 18.5467 6.26848 18.2324 7.25129 17.583L7.499 17.4141V15.3241Z" /></svg>
icon:search_loop = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M14.6102 2.47047L14.5334 2.4031C14.2394 2.17855 13.818 2.20101 13.5495 2.47047L13.4824 2.54755C13.2587 2.84259 13.281 3.26552 13.5495 3.53498L15.521 5.5118H8.5L8.26687 5.51592C4.785 5.63911 2 8.51085 2 12.0354C2 13.7259 2.6407 15.2663 3.6917 16.4252L3.76407 16.4947C3.89496 16.6065 4.06463 16.674 4.25 16.674C4.66421 16.674 5 16.337 5 15.9213C5 15.7481 4.9417 15.5885 4.84373 15.4613L4.64439 15.2306C3.92953 14.3627 3.5 13.2494 3.5 12.0354C3.5 9.26396 5.73858 7.01725 8.5 7.01725H15.381L13.5495 8.85754L13.4824 8.93463C13.2587 9.22967 13.281 9.6526 13.5495 9.92206C13.8424 10.216 14.3173 10.216 14.6102 9.92206L17.7922 6.72852L17.8593 6.65144C18.083 6.3564 18.0606 5.93347 17.7922 5.66401L14.6102 2.47047ZM20.23 7.57108C20.0999 7.46224 19.9326 7.39677 19.75 7.39677C19.3358 7.39677 19 7.73378 19 8.14949C19 8.33618 19.0677 8.507 19.1791 8.63722C19.9992 9.53109 20.5 10.7246 20.5 12.0354C20.5 14.8069 18.2614 17.0536 15.5 17.0536H8.558L10.4634 15.1425L10.5365 15.0573C10.7339 14.7897 10.7319 14.4206 10.5305 14.155L10.4634 14.0779L10.3785 14.0045C10.1119 13.8065 9.74409 13.8085 9.47951 14.0106L9.40271 14.0779L6.22073 17.2715L6.14756 17.3566C5.95023 17.6242 5.95224 17.9934 6.15361 18.2589L6.22073 18.336L9.40271 21.5295L9.48683 21.6024C9.78044 21.8211 10.1971 21.7968 10.4634 21.5295C10.7319 21.2601 10.7542 20.8371 10.5305 20.5421L10.4634 20.465L8.564 18.559H15.5L15.7331 18.5549C19.215 18.4317 22 15.56 22 12.0354C22 10.342 21.3571 8.79923 20.3029 7.63965L20.23 7.57108Z" /></svg>
icon:search_preserve = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M15.75 3C15.3358 3 15 3.33579 15 3.75V19.25C15 19.6642 15.3358 20 15.75 20C16.1642 20 16.5 19.6642 16.5 19.25V19.013C17.1848 19.6306 18.0541 20 19 20C21.2091 20 23 17.9853 23 15.5C23 13.0147 21.2091 11 19 11C18.0541 11 17.1848 11.3694 16.5 11.987V3.75C16.5 3.33579 16.1642 3 15.75 3ZM16.5 15.5C16.5 13.6722 17.7805 12.5 19 12.5C20.2195 12.5 21.5 13.6722 21.5 15.5C21.5 17.3278 20.2195 18.5 19 18.5C17.7805 18.5 16.5 17.3278 16.5 15.5ZM7.76083 3.00008C8.07443 3.00452 8.35214 3.20362 8.45702 3.49919L13.957 18.9992C14.0955 19.3896 13.8914 19.8183 13.501 19.9568C13.1106 20.0953 12.6819 19.8912 12.5434 19.5008L11.1237 15.5L4.00605 15.5L2.44963 19.5207C2.3001 19.907 1.86574 20.099 1.47946 19.9494C1.09317 19.7999 0.901247 19.3655 1.05078 18.9793L7.05078 3.47925C7.16399 3.18678 7.44724 2.99563 7.76083 3.00008ZM7.71962 5.90659L4.58669 14L10.5915 14L7.71962 5.90659Z" /></svg>
icon:search_project = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6 2C4.89543 2 4 2.89543 4 4V11.4982C4.47417 11.3004 4.97679 11.1572 5.5 11.0764V4C5.5 3.72386 5.72386 3.5 6 3.5H12V8C12 9.10457 12.8954 10 14 10H18.5V20C18.5 20.2761 18.2761 20.5 18 20.5H12.2678C11.9806 21.051 11.6168 21.5557 11.1904 22H18C19.1046 22 20 21.1046 20 20V9.82777C20 9.29733 19.7893 8.78863 19.4142 8.41355L13.5864 2.58579C13.2114 2.21071 12.7027 2 12.1722 2H6ZM17.3793 8.5H14C13.7239 8.5 13.5 8.27614 13.5 8V4.62066L17.3793 8.5ZM12 17.5C12 20.5376 9.53757 23 6.5 23C3.46243 23 1 20.5376 1 17.5C1 14.4624 3.46243 12 6.5 12C9.53757 12 12 14.4624 12 17.5ZM7 14.5C7 14.2239 6.77614 14 6.5 14C6.22386 14 6 14.2239 6 14.5V19.2929L4.35355 17.6464C4.15829 17.4512 3.84171 17.4512 3.64645 17.6464C3.45118 17.8417 3.45118 18.1583 3.64645 18.3536L6.14645 20.8536C6.34171 21.0488 6.65829 21.0488 6.85355 20.8536L9.35355 18.3536C9.54882 18.1583 9.54882 17.8417 9.35355 17.6464C9.15829 17.4512 8.84171 17.4512 8.64645 17.6464L7 19.2929V14.5Z" /></svg>
icon:search_regex = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 20 20" fill="#000000"><path d="M11.9961 4.49609C11.9961 4.21995 11.7722 3.99609 11.4961 3.99609C11.22 3.99609 10.9961 4.21995 10.9961 4.49609V6.96133L8.65464 6.20054C8.39202 6.11521 8.10994 6.25894 8.02461 6.52156C7.93927 6.78419 8.083 7.06627 8.34563 7.1516L10.6904 7.91346L9.23928 9.91074C9.07697 10.1341 9.1265 10.4468 9.3499 10.6091C9.57331 10.7714 9.88599 10.7219 10.0483 10.4985L11.4978 8.50339L12.9474 10.4985C13.1097 10.7219 13.4224 10.7714 13.6458 10.6091C13.8692 10.4468 13.9187 10.1341 13.7564 9.91074L12.306 7.91449L14.654 7.1516C14.9166 7.06627 15.0603 6.78419 14.975 6.52156C14.8897 6.25894 14.6076 6.11521 14.345 6.20054L11.9961 6.96373V4.49609ZM6 15.9995C6.55228 15.9995 7 15.5518 7 14.9995C7 14.4472 6.55228 13.9995 6 13.9995C5.44772 13.9995 5 14.4472 5 14.9995C5 15.5518 5.44772 15.9995 6 15.9995Z" /></svg>
icon:search_replace = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M15.8911 3.04825C17.2885 1.65064 19.5543 1.65058 20.9519 3.0481C22.3493 4.4455 22.3493 6.71112 20.952 8.10861L9.00191 20.0601C8.59546 20.4666 8.08418 20.7523 7.52498 20.8855L2.92373 21.981C2.67037 22.0413 2.40385 21.9659 2.21968 21.7817C2.03552 21.5976 1.96009 21.3311 2.02041 21.0777L3.116 16.4762C3.2491 15.9172 3.5347 15.4061 3.94103 14.9997L15.8911 3.04825ZM19.8912 4.10876C19.0795 3.29705 17.7634 3.29709 16.9518 4.10884L16.0606 5.00012L19 7.93946L19.8913 7.04801C20.7029 6.23632 20.7028 4.9204 19.8912 4.10876ZM17.9394 9.00018L15 6.06084L5.00175 16.0603C4.79168 16.2704 4.64402 16.5346 4.57521 16.8237L3.76191 20.2395L7.17755 19.4263C7.46668 19.3574 7.73104 19.2097 7.94119 18.9995L17.9394 9.00018ZM2.75 3H14.5252L13.0254 4.5H2.75C2.33579 4.5 2 4.16421 2 3.75C2 3.33579 2.33579 3 2.75 3ZM2.75 7H10.5257L9.02584 8.5H2.75C2.33579 8.5 2 8.16421 2 7.75C2 7.33579 2.33579 7 2.75 7ZM2.75 11H6.52613L5.02631 12.5H2.75C2.33579 12.5 2 12.1642 2 11.75C2 11.3358 2.33579 11 2.75 11Z" /></svg>
icon:search_word = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 20 20" fill="#000000"><path d="M11.5 15C11.6326 15 11.7598 14.9473 11.8536 14.8536C11.9473 14.7598 12 14.6326 12 14.5V14.109C12.2551 14.3859 12.5641 14.6077 12.908 14.7609C13.252 14.9141 13.6235 14.9955 14 15C14.86 14.9287 15.6572 14.5213 16.2188 13.8661C16.7804 13.2109 17.0611 12.3608 17 11.5C17.0611 10.6392 16.7804 9.78905 16.2188 9.13386C15.6572 8.47866 14.86 8.07126 14 8C13.6235 8.00453 13.252 8.08589 12.908 8.2391C12.5641 8.39231 12.2551 8.61414 12 8.891V4C12 3.86739 11.9473 3.74021 11.8536 3.64645C11.7598 3.55268 11.6326 3.5 11.5 3.5C11.3674 3.5 11.2402 3.55268 11.1464 3.64645C11.0527 3.74021 11 3.86739 11 4V14.5C11 14.6326 11.0527 14.7598 11.1464 14.8536C11.2402 14.9473 11.3674 15 11.5 15ZM14 9C14.5939 9.07282 15.1357 9.3752 15.5095 9.84242C15.8832 10.3096 16.0593 10.9046 16 11.5C16.0593 12.0954 15.8832 12.6904 15.5095 13.1576C15.1357 13.6248 14.5939 13.9272 14 14C13.4061 13.9272 12.8643 13.6248 12.4905 13.1576C12.1168 12.6904 11.9407 12.0954 12 11.5C11.9407 10.9046 12.1168 10.3096 12.4905 9.84242C12.8643 9.3752 13.4061 9.07282 14 9V9ZM4.871 14.884C5.41876 14.9954 5.98459 14.9817 6.52634 14.8441C7.0681 14.7064 7.57182 14.4483 8 14.089V14.5C8 14.6326 8.05268 14.7598 8.14645 14.8536C8.24021 14.9473 8.36739 15 8.5 15C8.63261 15 8.75979 14.9473 8.85355 14.8536C8.94732 14.7598 9 14.6326 9 14.5V10.462C9.05051 9.97915 8.95614 9.49219 8.72889 9.06316C8.50165 8.63414 8.15183 8.28249 7.724 8.053C7.14128 7.77817 6.49931 7.65273 5.856 7.688C5.31 7.70105 4.7724 7.82524 4.276 8.053C4.15745 8.11241 4.06736 8.21648 4.02554 8.34232C3.98372 8.46815 3.9936 8.60545 4.053 8.724C4.11241 8.84255 4.21648 8.93264 4.34232 8.97446C4.46815 9.01628 4.60545 9.0064 4.724 8.947C5.09296 8.7838 5.49064 8.69543 5.894 8.687C6.36902 8.65897 6.84364 8.74826 7.276 8.947C7.51352 9.07043 7.70909 9.26154 7.83797 9.49615C7.96684 9.73077 8.02323 9.99833 8 10.265C7.54548 10.1242 7.07519 10.0406 6.6 10.016C5.76806 9.94784 4.93608 10.1468 4.225 10.584C3.82951 10.8263 3.51414 11.1797 3.31826 11.6001C3.12239 12.0205 3.05467 12.4893 3.12358 12.948C3.19248 13.4067 3.39495 13.8349 3.70572 14.1792C4.01648 14.5235 4.42177 14.7686 4.871 14.884V14.884ZM4.777 11.417C5.30955 11.1 5.92887 10.96 6.546 11.017C7.04389 11.0422 7.53464 11.1462 8 11.325V12.789C7.65336 13.2014 7.20918 13.5207 6.7078 13.7179C6.20641 13.9151 5.66372 13.9838 5.129 13.918C4.86531 13.8528 4.62715 13.7102 4.44518 13.5086C4.2632 13.3069 4.14572 13.0554 4.10787 12.7864C4.07001 12.5175 4.1135 12.2433 4.23275 11.9993C4.352 11.7552 4.54154 11.5524 4.777 11.417V11.417ZM19 16V16.5C19 16.8978 18.842 17.2794 18.5607 17.5607C18.2794 17.842 17.8978 18 17.5 18H2.5C2.10218 18 1.72064 17.842 1.43934 17.5607C1.15803 17.2794 1 16.8978 1 16.5V16C1 15.8674 1.05268 15.7402 1.14645 15.6464C1.24021 15.5527 1.36739 15.5 1.5 15.5C1.63261 15.5 1.75979 15.5527 1.85355 15.6464C1.94732 15.7402 2 15.8674 2 16V16.5C2 16.6326 2.05268 16.7598 2.14645 16.8536C2.24021 16.9473 2.36739 17 2.5 17H17.5C17.6326 17 17.7598 16.9473 17.8536 16.8536C17.9473 16.7598 18 16.6326 18 16.5V16C18 15.8674 18.0527 15.7402 18.1464 15.6464C18.2402 15.5527 18.3674 15.5 18.5 15.5C18.6326 15.5 18.7598 15.5527 18.8536 15.6464C18.9473 15.7402 19 15.8674 19 16Z" /></svg>
icon:bullet-off = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 22.0021C17.5237 22.0021 22.0015 17.5243 22.0015 12.0006C22.0015 6.47687 17.5237 1.99902 12 1.99902C6.47626 1.99902 1.99841 6.47687 1.99841 12.0006C1.99841 17.5243 6.47626 22.0021 12 22.0021ZM12 20.5021C7.30469 20.5021 3.49841 16.6959 3.49841 12.0006C3.49841 7.3053 7.30469 3.49902 12 3.49902C16.6952 3.49902 20.5015 7.3053 20.5015 12.0006C20.5015 16.6959 16.6952 20.5021 12 20.5021Z" /></svg>
icon:bullet-on = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 1.99902C17.5237 1.99902 22.0015 6.47687 22.0015 12.0006C22.0015 17.5243 17.5237 22.0021 12 22.0021C6.47626 22.0021 1.99841 17.5243 1.99841 12.0006C1.99841 6.47687 6.47626 1.99902 12 1.99902ZM12 3.49902C7.30469 3.49902 3.49841 7.3053 3.49841 12.0006C3.49841 16.6959 7.30469 20.5021 12 20.5021C16.6952 20.5021 20.5015 16.6959 20.5015 12.0006C20.5015 7.3053 16.6952 3.49902 12 3.49902ZM11.9965 5.99902C15.3092 5.99902 17.9946 8.68447 17.9946 11.9971C17.9946 15.3098 15.3092 17.9953 11.9965 17.9953C8.68386 17.9953 5.99841 15.3098 5.99841 11.9971C5.99841 8.68447 8.68386 5.99902 11.9965 5.99902Z" /></svg>
icon:unfold-hide = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M11.0731 18.839C10.2649 19.5462 9 18.9722 9 17.8983L9 6.10204C9 5.02809 10.2649 4.45412 11.0731 5.16132L17.3838 10.6831C18.1806 11.3804 18.1806 12.6199 17.3838 13.3172L11.0731 18.839ZM10.5 17.3473L16.396 12.1883C16.5099 12.0887 16.5099 11.9116 16.396 11.812L10.5 6.65298L10.5 17.3473Z" /></svg>
icon:unfold-show = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M5.16132 10.0731C4.45412 9.2649 5.0281 8 6.10204 8H17.8983C18.9722 8 19.5462 9.2649 18.839 10.0731L13.3172 16.3838C12.6199 17.1806 11.3804 17.1806 10.6831 16.3838L5.16132 10.0731ZM6.65298 9.5L11.812 15.396C11.9116 15.5099 12.0887 15.5099 12.1883 15.396L17.3473 9.5H6.65298Z" /></svg>
icon:sb_build = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M18.4923 2.33088L21.671 5.50966C22.5497 6.38834 22.5497 7.81296 21.671 8.69164L19.0866 11.2756C20.1696 11.438 21 12.3723 21 13.5006V18.7506C21 19.9932 19.9926 21.0006 18.75 21.0006H5.25C4.00736 21.0006 3 19.9932 3 18.7506V5.25055C3 4.00791 4.00736 3.00055 5.25 3.00055H10.5C11.6289 3.00055 12.5637 3.83201 12.7253 4.91596L15.3103 2.33088C16.189 1.45221 17.6136 1.45221 18.4923 2.33088ZM4.5 18.7506C4.5 19.1648 4.83579 19.5006 5.25 19.5006L11.249 19.4999L11.25 12.7506L4.5 12.7499V18.7506ZM12.749 19.4999L18.75 19.5006C19.1642 19.5006 19.5 19.1648 19.5 18.7506V13.5006C19.5 13.0863 19.1642 12.7506 18.75 12.7506L12.749 12.7499V19.4999ZM10.5 4.50055H5.25C4.83579 4.50055 4.5 4.83634 4.5 5.25055V11.2499H11.25V5.25055C11.25 4.83634 10.9142 4.50055 10.5 4.50055ZM12.75 9.30988V11.2506L14.69 11.2499L12.75 9.30988ZM16.3709 3.39154L13.1922 6.57032C12.8993 6.86321 12.8993 7.33808 13.1922 7.63098L16.3709 10.8097C16.6638 11.1026 17.1387 11.1026 17.4316 10.8097L20.6104 7.63098C20.9033 7.33808 20.9033 6.86321 20.6104 6.57032L17.4316 3.39154C17.1387 3.09865 16.6638 3.09865 16.3709 3.39154Z" /></svg>
icon:sb_novel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M7 6C7 5.44772 7.44772 5 8 5H16C16.5523 5 17 5.44772 17 6V8C17 8.55228 16.5523 9 16 9H8C7.44772 9 7 8.55228 7 8V6ZM8.5 7.5H15.5V6.5H8.5V7.5ZM4 4.5C4 3.11929 5.11929 2 6.5 2H18C19.3807 2 20.5 3.11929 20.5 4.5V18.75C20.5 19.1642 20.1642 19.5 19.75 19.5H5.5C5.5 20.0523 5.94772 20.5 6.5 20.5H19.75C20.1642 20.5 20.5 20.8358 20.5 21.25C20.5 21.6642 20.1642 22 19.75 22H6.5C5.11929 22 4 20.8807 4 19.5V4.5ZM5.5 18H19V4.5C19 3.94772 18.5523 3.5 18 3.5H6.5C5.94772 3.5 5.5 3.94772 5.5 4.5V18Z" /></svg>
icon:sb_project = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 20 20" fill="#000000"><path d="M5 3C3.89543 3 3 3.89543 3 5V6C3 7.10457 3.89543 8 5 8H5.26756C5.09739 8.29417 5 8.63571 5 9V11C5 11.5973 5.26188 12.1335 5.67709 12.5C5.26188 12.8665 5 13.4027 5 14V15C5 16.1046 5.89543 17 7 17H15C16.1046 17 17 16.1046 17 15V14C17 13.4027 16.7381 12.8665 16.3229 12.5C16.7381 12.1335 17 11.5973 17 11V9C17 8.40265 16.7381 7.86647 16.3229 7.5C16.7381 7.13353 17 6.59735 17 6V5C17 3.89543 16.1046 3 15 3H5ZM15 12H10V8H15C15.5523 8 16 8.44772 16 9V11C16 11.5523 15.5523 12 15 12ZM9 8V12H7C6.44772 12 6 11.5523 6 11V9C6 8.44772 6.44772 8 7 8H9ZM10 13H15C15.5523 13 16 13.4477 16 14V15C16 15.5523 15.5523 16 15 16H10V13ZM9 13V16H7C6.44772 16 6 15.5523 6 15V14C6 13.4477 6.44772 13 7 13H9ZM8 7V4H15C15.5523 4 16 4.44772 16 5V6C16 6.55228 15.5523 7 15 7H8ZM7 7H5C4.44772 7 4 6.55228 4 6V5C4 4.44772 4.44772 4 5 4H7V7Z" /></svg>
icon:sb_search = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.1017 17.1624C14.717 18.3101 12.9391 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11C19 12.9391 18.3101 14.717 17.1624 16.1018L21.7803 20.7197C22.0732 21.0126 22.0732 21.4874 21.7803 21.7803C21.4874 22.0732 21.0125 22.0732 20.7196 21.7803L16.1017 17.1624ZM17.5 11C17.5 7.41015 14.5899 4.5 11 4.5C7.41015 4.5 4.5 7.41015 4.5 11C4.5 14.5899 7.41015 17.5 11 17.5C14.5899 17.5 17.5 14.5899 17.5 11Z" /></svg>
icon:sb_stats = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M21 18.251C21 17.0089 19.9931 16.002 18.7509 16.002H5.24908C4.00695 16.002 3 17.0089 3 18.251C3 19.4932 4.00695 20.5001 5.24908 20.5001H18.7509C19.9931 20.5001 21 19.4932 21 18.251ZM17 11.751C17 10.5089 15.9931 9.50195 14.7509 9.50195L5.24908 9.50195C4.00695 9.50195 3 10.5089 3 11.751C3 12.9932 4.00695 14.0001 5.24908 14.0001H14.7509C15.9931 14.0001 17 12.9932 17 11.751ZM13 5.25104C13 4.0089 11.9931 3.00195 10.7509 3.00195L5.24908 3.00195C4.00695 3.00195 3 4.0089 3 5.25104C3 6.49317 4.00695 7.50012 5.24908 7.50012L10.7509 7.50012C11.9931 7.50012 13 6.49317 13 5.25104ZM19.5 18.251C19.5 18.6647 19.1646 19.0001 18.7509 19.0001H5.24908C4.83538 19.0001 4.5 18.6647 4.5 18.251C4.5 17.8373 4.83538 17.502 5.24908 17.502H18.7509C19.1646 17.502 19.5 17.8373 19.5 18.251ZM15.5 11.751C15.5 12.1647 15.1646 12.5001 14.7509 12.5001H5.24908C4.83538 12.5001 4.5 12.1647 4.5 11.751C4.5 11.3373 4.83538 11.002 5.24908 11.002H14.7509C15.1646 11.002 15.5 11.3373 15.5 11.751ZM11.5 5.25104C11.5 5.66474 11.1646 6.00012 10.7509 6.00012L5.24908 6.00012C4.83538 6.00012 4.5 5.66474 4.5 5.25104C4.5 4.83733 4.83538 4.50195 5.24908 4.50195L10.7509 4.50195C11.1646 4.50195 11.5 4.83733 11.5 5.25104Z" /></svg>
icon:sb_story = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.25 4C3.00736 4 2 5.00736 2 6.25V8.75C2 9.99264 3.00736 11 4.25 11H6.75C7.99264 11 9 9.99264 9 8.75V6.25C9 5.00736 7.99264 4 6.75 4H4.25ZM3.5 6.25C3.5 5.83579 3.83579 5.5 4.25 5.5H6.75C7.16421 5.5 7.5 5.83579 7.5 6.25V8.75C7.5 9.16421 7.16421 9.5 6.75 9.5H4.25C3.83579 9.5 3.5 9.16421 3.5 8.75V6.25ZM11.25 5C10.8358 5 10.5 5.33579 10.5 5.75C10.5 6.16421 10.8358 6.5 11.25 6.5H21.25C21.6642 6.5 22 6.16421 22 5.75C22 5.33579 21.6642 5 21.25 5H11.25ZM11.25 8C10.8358 8 10.5 8.33579 10.5 8.75C10.5 9.16421 10.8358 9.5 11.25 9.5H18.25C18.6642 9.5 19 9.16421 19 8.75C19 8.33579 18.6642 8 18.25 8H11.25ZM4.25 13C3.00736 13 2 14.0074 2 15.25V17.75C2 18.9926 3.00736 20 4.25 20H6.75C7.99264 20 9 18.9926 9 17.75V15.25C9 14.0074 7.99264 13 6.75 13H4.25ZM3.5 15.25C3.5 14.8358 3.83579 14.5 4.25 14.5H6.75C7.16421 14.5 7.5 14.8358 7.5 15.25V17.75C7.5 18.1642 7.16421 18.5 6.75 18.5H4.25C3.83579 18.5 3.5 18.1642 3.5 17.75V15.25ZM11.25 14C10.8358 14 10.5 14.3358 10.5 14.75C10.5 15.1642 10.8358 15.5 11.25 15.5H21.25C21.6642 15.5 22 15.1642 22 14.75C22 14.3358 21.6642 14 21.25 14H11.25ZM11.25 17C10.8358 17 10.5 17.3358 10.5 17.75C10.5 18.1642 10.8358 18.5 11.25 18.5H18.25C18.6642 18.5 19 18.1642 19 17.75C19 17.3358 18.6642 17 18.25 17H11.25Z" /></svg>
icon:theme_light = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 2C12.4142 2 12.75 2.33579 12.75 2.75V4.25C12.75 4.66421 12.4142 5 12 5C11.5858 5 11.25 4.66421 11.25 4.25V2.75C11.25 2.33579 11.5858 2 12 2ZM12 17C14.7614 17 17 14.7614 17 12C17 9.23858 14.7614 7 12 7C9.23858 7 7 9.23858 7 12C7 14.7614 9.23858 17 12 17ZM12 15.5C10.067 15.5 8.5 13.933 8.5 12C8.5 10.067 10.067 8.5 12 8.5C13.933 8.5 15.5 10.067 15.5 12C15.5 13.933 13.933 15.5 12 15.5ZM21.25 12.75C21.6642 12.75 22 12.4142 22 12C22 11.5858 21.6642 11.25 21.25 11.25H19.75C19.3358 11.25 19 11.5858 19 12C19 12.4142 19.3358 12.75 19.75 12.75H21.25ZM12 19C12.4142 19 12.75 19.3358 12.75 19.75V21.25C12.75 21.6642 12.4142 22 12 22C11.5858 22 11.25 21.6642 11.25 21.25V19.75C11.25 19.3358 11.5858 19 12 19ZM4.25 12.75C4.66421 12.75 5 12.4142 5 12C5 11.5858 4.66421 11.25 4.25 11.25H2.75C2.33579 11.25 2 11.5858 2 12C2 12.4142 2.33579 12.75 2.75 12.75H4.25ZM4.21967 4.22004C4.51256 3.92715 4.98744 3.92715 5.28033 4.22004L6.78033 5.72004C7.07322 6.01294 7.07322 6.48781 6.78033 6.7807C6.48744 7.0736 6.01256 7.0736 5.71967 6.7807L4.21967 5.2807C3.92678 4.98781 3.92678 4.51294 4.21967 4.22004ZM5.28033 19.7807C4.98744 20.0736 4.51256 20.0736 4.21967 19.7807C3.92678 19.4878 3.92678 19.0129 4.21967 18.72L5.71967 17.22C6.01256 16.9271 6.48744 16.9271 6.78033 17.22C7.07322 17.5129 7.07322 17.9878 6.78033 18.2807L5.28033 19.7807ZM19.7803 4.22004C19.4874 3.92715 19.0126 3.92715 18.7197 4.22004L17.2197 5.72004C16.9268 6.01294 16.9268 6.48781 17.2197 6.7807C17.5126 7.0736 17.9874 7.0736 18.2803 6.7807L19.7803 5.2807C20.0732 4.98781 20.0732 4.51294 19.7803 4.22004ZM18.7197 19.7807C19.0126 20.0736 19.4874 20.0736 19.7803 19.7807C20.0732 19.4878 20.0732 19.0129 19.7803 18.72L18.2803 17.22C17.9874 16.9271 17.5126 16.9271 17.2197 17.22C16.9268 17.5129 16.9268 17.9878 17.2197 18.2807L18.7197 19.7807Z" /></svg>
icon:theme_dark = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M20.0258 17.0014C17.2639 21.7851 11.1471 23.4241 6.3634 20.6622C5.06068 19.9101 3.964 18.8926 3.12872 17.6797C2.84945 17.2741 3.0301 16.7141 3.49369 16.5482C7.26112 15.1997 9.27892 13.6372 10.4498 11.4021C11.6825 9.04908 12.001 6.47162 11.1387 2.93862C11.0195 2.45008 11.4053 1.98492 11.9075 2.01186C13.4645 2.09539 14.9856 2.54263 16.3649 3.33903C21.1486 6.10088 22.7876 12.2177 20.0258 17.0014ZM11.7785 12.0981C10.5272 14.4867 8.46706 16.1972 4.96104 17.597C5.5693 18.2929 6.29275 18.8894 7.1134 19.3632C11.1796 21.7108 16.3791 20.3176 18.7267 16.2514C21.0744 12.1852 19.6812 6.98571 15.6149 4.63807C14.7379 4.1317 13.7951 3.79168 12.8228 3.62253C13.4699 7.00652 13.0525 9.66622 11.7785 12.0981Z" /></svg>
icon:theme_auto = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22ZM12 20.5V3.5C16.6944 3.5 20.5 7.30558 20.5 12C20.5 16.6944 16.6944 20.5 12 20.5Z" /></svg>
icon:btn_ok = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.2802 9.78034C16.5731 9.48746 16.5731 9.01258 16.2802 8.71968C15.9873 8.42678 15.5125 8.42677 15.2196 8.71966L10.7499 13.1891L9.27642 11.7157C8.98353 11.4228 8.50865 11.4228 8.21576 11.7157C7.92287 12.0085 7.92287 12.4834 8.21576 12.7763L10.2196 14.7801C10.5124 15.073 10.9873 15.073 11.2802 14.7801L16.2802 9.78034ZM6.25 3C4.45507 3 3 4.45507 3 6.25V17.75C3 19.5449 4.45507 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM4.5 6.25C4.5 5.2835 5.2835 4.5 6.25 4.5H17.75C18.7165 4.5 19.5 5.2835 19.5 6.25V17.75C19.5 18.7165 18.7165 19.5 17.75 19.5H6.25C5.2835 19.5 4.5 18.7165 4.5 17.75V6.25Z" /></svg>
icon:btn_cancel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M8.21967 8.21967C8.51256 7.92678 8.98744 7.92678 9.28033 8.21967L12 10.9393L14.7197 8.21967C15.0126 7.92678 15.4874 7.92678 15.7803 8.21967C16.0732 8.51256 16.0732 8.98744 15.7803 9.28033L13.0607 12L15.7803 14.7197C16.0732 15.0126 16.0732 15.4874 15.7803 15.7803C15.4874 16.0732 15.0126 16.0732 14.7197 15.7803L12 13.0607L9.28033 15.7803C8.98744 16.0732 8.51256 16.0732 8.21967 15.7803C7.92678 15.4874 7.92678 15.0126 8.21967 14.7197L10.9393 12L8.21967 9.28033C7.92678 8.98744 7.92678 8.51256 8.21967 8.21967ZM6.25 3C4.45507 3 3 4.45507 3 6.25V17.75C3 19.5449 4.45507 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM4.5 6.25C4.5 5.2835 5.2835 4.5 6.25 4.5H17.75C18.7165 4.5 19.5 5.2835 19.5 6.25V17.75C19.5 18.7165 18.7165 19.5 17.75 19.5H6.25C5.2835 19.5 4.5 18.7165 4.5 17.75V6.25Z" /></svg>
icon:btn_yes = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.2802 9.78034C16.5731 9.48746 16.5731 9.01258 16.2802 8.71968C15.9873 8.42678 15.5125 8.42677 15.2196 8.71966L10.7499 13.1891L9.27642 11.7157C8.98353 11.4228 8.50865 11.4228 8.21576 11.7157C7.92287 12.0085 7.92287 12.4834 8.21576 12.7763L10.2196 14.7801C10.5124 15.073 10.9873 15.073 11.2802 14.7801L16.2802 9.78034ZM6.25 3C4.45507 3 3 4.45507 3 6.25V17.75C3 19.5449 4.45507 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM4.5 6.25C4.5 5.2835 5.2835 4.5 6.25 4.5H17.75C18.7165 4.5 19.5 5.2835 19.5 6.25V17.75C19.5 18.7165 18.7165 19.5 17.75 19.5H6.25C5.2835 19.5 4.5 18.7165 4.5 17.75V6.25Z" /></svg>
icon:btn_no = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M8.21967 8.21967C8.51256 7.92678 8.98744 7.92678 9.28033 8.21967L12 10.9393L14.7197 8.21967C15.0126 7.92678 15.4874 7.92678 15.7803 8.21967C16.0732 8.51256 16.0732 8.98744 15.7803 9.28033L13.0607 12L15.7803 14.7197C16.0732 15.0126 16.0732 15.4874 15.7803 15.7803C15.4874 16.0732 15.0126 16.0732 14.7197 15.7803L12 13.0607L9.28033 15.7803C8.98744 16.0732 8.51256 16.0732 8.21967 15.7803C7.92678 15.4874 7.92678 15.0126 8.21967 14.7197L10.9393 12L8.21967 9.28033C7.92678 8.98744 7.92678 8.51256 8.21967 8.21967ZM6.25 3C4.45507 3 3 4.45507 3 6.25V17.75C3 19.5449 4.45507 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM4.5 6.25C4.5 5.2835 5.2835 4.5 6.25 4.5H17.75C18.7165 4.5 19.5 5.2835 19.5 6.25V17.75C19.5 18.7165 18.7165 19.5 17.75 19.5H6.25C5.2835 19.5 4.5 18.7165 4.5 17.75V6.25Z" /></svg>
icon:btn_open = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.24992 4.5C5.28344 4.5 4.49996 5.2835 4.49996 6.25V17.75C4.49996 18.7165 5.28344 19.5 6.24992 19.5H17.7496C18.7161 19.5 19.4996 18.7165 19.4996 17.75V13.75C19.4996 13.3358 19.8354 13 20.2496 13C20.6638 13 20.9995 13.3358 20.9995 13.75V17.75C20.9995 19.5449 19.5445 21 17.7496 21H6.24992C4.45504 21 3 19.5449 3 17.75V6.25C3 4.45507 4.45504 3 6.24992 3H10.2498C10.664 3 10.9998 3.33579 10.9998 3.75C10.9998 4.16421 10.664 4.5 10.2498 4.5H6.24992ZM12.9997 3.75C12.9997 3.33579 13.3355 3 13.7497 3H20.25C20.6642 3 21 3.33579 21 3.75V10.25C21 10.6642 20.6642 11 20.25 11C19.8358 11 19.5 10.6642 19.5 10.25V5.56074L14.28 10.7804C13.9871 11.0732 13.5123 11.0732 13.2194 10.7803C12.9265 10.4874 12.9265 10.0125 13.2194 9.71964L18.4395 4.5H13.7497C13.3355 4.5 12.9997 4.16421 12.9997 3.75Z" /></svg>
icon:btn_close = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 3.5C7.30558 3.5 3.5 7.30558 3.5 12C3.5 16.6944 7.30558 20.5 12 20.5C16.6944 20.5 20.5 16.6944 20.5 12C20.5 7.30558 16.6944 3.5 12 3.5ZM15.4462 8.39705L15.5303 8.46967C15.7966 8.73594 15.8208 9.1526 15.6029 9.44621L15.5303 9.53033L13.061 12L15.5303 14.4697C15.7966 14.7359 15.8208 15.1526 15.6029 15.4462L15.5303 15.5303C15.2641 15.7966 14.8474 15.8208 14.5538 15.6029L14.4697 15.5303L12 13.061L9.53033 15.5303C9.26406 15.7966 8.8474 15.8208 8.55379 15.6029L8.46967 15.5303C8.2034 15.2641 8.1792 14.8474 8.39705 14.5538L8.46967 14.4697L10.939 12L8.46967 9.53033C8.2034 9.26406 8.1792 8.8474 8.39705 8.55379L8.46967 8.46967C8.73594 8.2034 9.1526 8.1792 9.44621 8.39705L9.53033 8.46967L12 10.939L14.4697 8.46967C14.7359 8.2034 15.1526 8.1792 15.4462 8.39705Z" /></svg>
icon:btn_save = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3 5.75C3 4.23122 4.23122 3 5.75 3H15.7145C16.5764 3 17.4031 3.34241 18.0126 3.9519L20.0481 5.98744C20.6576 6.59693 21 7.42358 21 8.28553V18.25C21 19.7688 19.7688 21 18.25 21H5.75C4.23122 21 3 19.7688 3 18.25V5.75ZM5.75 4.5C5.05964 4.5 4.5 5.05964 4.5 5.75V18.25C4.5 18.9404 5.05964 19.5 5.75 19.5H6V14.25C6 13.0074 7.00736 12 8.25 12H15.75C16.9926 12 18 13.0074 18 14.25V19.5H18.25C18.9404 19.5 19.5 18.9404 19.5 18.25V8.28553C19.5 7.8214 19.3156 7.37629 18.9874 7.0481L16.9519 5.01256C16.6918 4.75246 16.3582 4.58269 16 4.52344V7.25C16 8.49264 14.9926 9.5 13.75 9.5H9.25C8.00736 9.5 7 8.49264 7 7.25V4.5H5.75ZM16.5 19.5V14.25C16.5 13.8358 16.1642 13.5 15.75 13.5H8.25C7.83579 13.5 7.5 13.8358 7.5 14.25V19.5H16.5ZM8.5 4.5V7.25C8.5 7.66421 8.83579 8 9.25 8H13.75C14.1642 8 14.5 7.66421 14.5 7.25V4.5H8.5Z" /></svg>
icon:btn_browse = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3.50014 6.25C3.50014 5.2835 4.28364 4.5 5.25014 4.5H8.12882C8.32773 4.5 8.5185 4.57902 8.65915 4.71967L10.7198 6.78033C10.8605 6.92098 11.0512 7 11.2501 7H16.7501C17.7166 7 18.5001 7.7835 18.5001 8.75C18.5001 8.83602 18.5146 8.91866 18.5413 8.99561L8.71867 8.99561C7.37893 8.99561 6.14095 9.71035 5.47108 10.8706L3.50014 14.2844V6.25ZM2.00036 17.7883C2.02089 19.5656 3.468 21 5.25014 21H11.0001C11.0292 21 11.058 20.9983 11.0862 20.9951H16.2812C17.6209 20.9951 18.8589 20.2804 19.5288 19.1201L22.5596 13.8706C23.7748 11.7657 22.3337 9.14964 19.9567 9.00214C19.9848 8.92334 20.0001 8.83846 20.0001 8.75C20.0001 6.95507 18.5451 5.5 16.7501 5.5H11.5608L9.71981 3.65901C9.29786 3.23705 8.72556 3 8.12882 3H5.25014C3.45522 3 2.00014 4.45507 2.00014 6.25V17.71C1.9999 17.7362 1.99997 17.7623 2.00036 17.7883ZM8.71867 10.4956L19.745 10.4956C21.0921 10.4956 21.9341 11.9539 21.2605 13.1206L18.2297 18.3701C17.8278 19.0663 17.085 19.4951 16.2812 19.4951H5.25485C3.9077 19.4951 3.06573 18.0368 3.7393 16.8701L6.77011 11.6206C7.17204 10.9245 7.91482 10.4956 8.71867 10.4956Z" /></svg>
icon:btn_list = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M7.75 9.25C8.30228 9.25 8.75 8.80228 8.75 8.25C8.75 7.69772 8.30228 7.25 7.75 7.25C7.19772 7.25 6.75 7.69772 6.75 8.25C6.75 8.80228 7.19772 9.25 7.75 9.25ZM11.25 7.5C10.8358 7.5 10.5 7.83579 10.5 8.25C10.5 8.66421 10.8358 9 11.25 9H16.75C17.1642 9 17.5 8.66421 17.5 8.25C17.5 7.83579 17.1642 7.5 16.75 7.5H11.25ZM11.2501 11.25C10.8358 11.25 10.5001 11.5858 10.5001 12C10.5001 12.4142 10.8358 12.75 11.2501 12.75H16.7499C17.1642 12.75 17.4999 12.4142 17.4999 12C17.4999 11.5858 17.1642 11.25 16.7499 11.25H11.2501ZM10.5001 15.75C10.5001 15.3358 10.8358 15 11.2501 15H16.7499C17.1642 15 17.4999 15.3358 17.4999 15.75C17.4999 16.1642 17.1642 16.5 16.7499 16.5H11.2501C10.8358 16.5 10.5001 16.1642 10.5001 15.75ZM8.75 12C8.75 12.5523 8.30228 13 7.75 13C7.19772 13 6.75 12.5523 6.75 12C6.75 11.4477 7.19772 11 7.75 11C8.30228 11 8.75 11.4477 8.75 12ZM7.75 16.75C8.30228 16.75 8.75 16.3023 8.75 15.75C8.75 15.1977 8.30228 14.75 7.75 14.75C7.19772 14.75 6.75 15.1977 6.75 15.75C6.75 16.3023 7.19772 16.75 7.75 16.75ZM6.25 3C4.45507 3 3 4.45507 3 6.25V17.75C3 19.5449 4.45507 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM4.5 6.25C4.5 5.2835 5.2835 4.5 6.25 4.5H17.75C18.7165 4.5 19.5 5.2835 19.5 6.25V17.75C19.5 18.7165 18.7165 19.5 17.75 19.5H6.25C5.2835 19.5 4.5 18.7165 4.5 17.75V6.25Z" /></svg>
icon:btn_new = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 7C12.4142 7 12.75 7.33579 12.75 7.75V11.25H16.25C16.6642 11.25 17 11.5858 17 12C17 12.4142 16.6642 12.75 16.25 12.75H12.75V16.25C12.75 16.6642 12.4142 17 12 17C11.5858 17 11.25 16.6642 11.25 16.25V12.75H7.75C7.33579 12.75 7 12.4142 7 12C7 11.5858 7.33579 11.25 7.75 11.25H11.25V7.75C11.25 7.33579 11.5858 7 12 7ZM3 6.25C3 4.45507 4.45507 3 6.25 3H17.75C19.5449 3 21 4.45507 21 6.25V17.75C21 19.5449 19.5449 21 17.75 21H6.25C4.45507 21 3 19.5449 3 17.75V6.25ZM6.25 4.5C5.2835 4.5 4.5 5.2835 4.5 6.25V17.75C4.5 18.7165 5.2835 19.5 6.25 19.5H17.75C18.7165 19.5 19.5 18.7165 19.5 17.75V6.25C19.5 5.2835 18.7165 4.5 17.75 4.5H6.25Z" /></svg>
icon:btn_create = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.0883 6.41228C16.016 6.31886 15.9377 6.2298 15.8539 6.14569C15.5417 5.83255 15.1606 5.59666 14.741 5.45683L13.3632 5.00939C13.257 4.97196 13.165 4.90253 13.1 4.81068C13.0349 4.71883 13 4.60908 13 4.49656C13 4.38404 13.0349 4.27429 13.1 4.18244C13.165 4.09058 13.257 4.02116 13.3632 3.98372L14.741 3.53628C15.1547 3.39352 15.5299 3.15705 15.837 2.84537C16.1357 2.54224 16.3623 2.17595 16.5 1.77372L16.5114 1.73963L16.9592 0.362894C16.9967 0.256782 17.0662 0.164895 17.1581 0.0998993C17.25 0.0349035 17.3598 0 17.4724 0C17.5851 0 17.6949 0.0349035 17.7868 0.0998993C17.8787 0.164895 17.9482 0.256782 17.9857 0.362894L18.4335 1.73963C18.5727 2.15819 18.8077 2.53853 19.1198 2.85041C19.432 3.1623 19.8126 3.39715 20.2315 3.53628L21.6093 3.98372L21.6368 3.99061C21.743 4.02804 21.835 4.09747 21.9 4.18932C21.9651 4.28117 22 4.39092 22 4.50344C22 4.61596 21.9651 4.72571 21.9 4.81756C21.835 4.90942 21.743 4.97884 21.6368 5.01628L20.259 5.46372C19.8402 5.60285 19.4595 5.8377 19.1474 6.14959C18.8353 6.46147 18.6003 6.84181 18.461 7.26037L18.0132 8.63711C18.0092 8.64855 18.0048 8.65983 18 8.67093C17.9605 8.76273 17.8964 8.84212 17.8144 8.9001C17.7224 8.9651 17.6126 9 17.5 9C17.3874 9 17.2776 8.9651 17.1856 8.9001C17.0937 8.8351 17.0242 8.74322 16.9868 8.63711L16.539 7.26037C16.4378 6.95331 16.2851 6.66664 16.0883 6.41228ZM23.7829 10.2132L23.0175 9.9646C22.7848 9.8873 22.5733 9.75683 22.3999 9.58356C22.2265 9.41029 22.0959 9.199 22.0186 8.96646L21.7698 8.20161C21.749 8.14266 21.7104 8.09161 21.6593 8.0555C21.6083 8.01939 21.5473 8 21.4847 8C21.4221 8 21.3611 8.01939 21.31 8.0555C21.259 8.09161 21.2204 8.14266 21.1996 8.20161L20.9508 8.96646C20.875 9.19736 20.7467 9.40761 20.5761 9.58076C20.4055 9.75392 20.1971 9.88529 19.9672 9.9646L19.2018 10.2132C19.1428 10.234 19.0917 10.2725 19.0555 10.3236C19.0194 10.3746 19 10.4356 19 10.4981C19 10.5606 19.0194 10.6216 19.0555 10.6726C19.0917 10.7236 19.1428 10.7622 19.2018 10.783L19.9672 11.0316C20.2003 11.1093 20.412 11.2403 20.5855 11.4143C20.7589 11.5882 20.8893 11.8003 20.9661 12.0335L21.2149 12.7984C21.2357 12.8573 21.2743 12.9084 21.3254 12.9445C21.3764 12.9806 21.4374 13 21.5 13C21.5626 13 21.6236 12.9806 21.6746 12.9445C21.7257 12.9084 21.7643 12.8573 21.7851 12.7984L22.0339 12.0335C22.1113 11.801 22.2418 11.5897 22.4152 11.4164C22.5886 11.2432 22.8001 11.1127 23.0328 11.0354L23.7982 10.7868C23.8572 10.766 23.9083 10.7275 23.9445 10.6764C23.9806 10.6254 24 10.5644 24 10.5019C24 10.4394 23.9806 10.3784 23.9445 10.3274C23.9083 10.2764 23.8572 10.2378 23.7982 10.217L23.7829 10.2132ZM6.25 2H15.2078C14.9931 2.25522 14.7082 2.45227 14.39 2.55903L13.05 2.99903C12.7655 3.10053 12.5229 3.27606 12.3428 3.5H6.25C5.86167 3.5 5.54228 3.79513 5.50387 4.17332C5.50131 4.19853 5.5 4.22411 5.5 4.25V17.25C5.5 17.6642 5.83579 18 6.25 18H15.25C15.6642 18 16 17.6642 16 17.25V8.99903C16.2128 9.62184 16.8014 10.047 17.46 10.049C17.4733 10.0492 17.4867 10.0492 17.5 10.049L17.5 17.25C17.5 18.4926 16.4926 19.5 15.25 19.5H6.25C5.00736 19.5 4 18.4926 4 17.25V4.25C4 3.00736 5.00736 2 6.25 2ZM7.74689 5.5H12.369C12.5368 5.7159 12.7532 5.89221 13 5.99903L14.4 6.45903C14.4213 6.46624 14.4425 6.47382 14.4637 6.48175C14.3664 6.78254 14.0851 7 13.7531 7H7.74689C7.33439 7 7 6.66421 7 6.25C7 5.83579 7.33439 5.5 7.74689 5.5ZM20.0009 12.4652L19.98 12.399C19.8642 12.0456 19.4335 11.9365 19.0739 11.8454C18.9866 11.8233 18.9034 11.8023 18.83 11.779C18.7115 11.7366 18.6007 11.6763 18.5005 11.6021L18.5009 17.25C18.5009 19.0449 17.0458 20.5 15.2509 20.5H6.62891C6.93778 21.3739 7.77121 22 8.75088 22H15.2509C17.8742 22 20.0009 19.8734 20.0009 17.25V12.4652ZM7 15.25C7 14.8358 7.33439 14.5 7.74689 14.5H13.7531C14.1656 14.5 14.5 14.8358 14.5 15.25C14.5 15.6642 14.1656 16 13.7531 16H7.74689C7.33439 16 7 15.6642 7 15.25ZM7.74689 10C7.33439 10 7 10.3358 7 10.75C7 11.1642 7.33439 11.5 7.74689 11.5H13.7531C14.1656 11.5 14.5 11.1642 14.5 10.75C14.5 10.3358 14.1656 10 13.7531 10H7.74689Z" /></svg>
icon:btn_reset = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.78033 2.71967C7.07322 3.01256 7.07322 3.48744 6.78033 3.78033L4.56066 6H13.25C17.5302 6 21 9.46979 21 13.75C21 18.0302 17.5302 21.5 13.25 21.5C8.96979 21.5 5.5 18.0302 5.5 13.75C5.5 13.3358 5.83579 13 6.25 13C6.66421 13 7 13.3358 7 13.75C7 17.2018 9.79822 20 13.25 20C16.7018 20 19.5 17.2018 19.5 13.75C19.5 10.2982 16.7018 7.5 13.25 7.5H4.56066L6.78033 9.71967C7.07322 10.0126 7.07322 10.4874 6.78033 10.7803C6.48744 11.0732 6.01256 11.0732 5.71967 10.7803L2.21967 7.28033C1.92678 6.98744 1.92678 6.51256 2.21967 6.21967L5.71967 2.71967C6.01256 2.42678 6.48744 2.42678 6.78033 2.71967Z" /></svg>
icon:btn_insert = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M18.2498 20.5009C18.664 20.5008 19 20.8365 19 21.2507C19 21.6649 18.6644 22.0008 18.2502 22.0009L5.25022 22.0047C4.836 22.0048 4.5 21.6691 4.5 21.2549C4.5 20.8407 4.83557 20.5048 5.24978 20.5047L18.2498 20.5009ZM11.6482 2.01271L11.75 2.00586C12.1297 2.00586 12.4435 2.28801 12.4932 2.65409L12.5 2.75586L12.499 16.4409L16.2208 12.7205C16.4871 12.4543 16.9038 12.4301 17.1974 12.648L17.2815 12.7206C17.5477 12.9869 17.5719 13.4036 17.354 13.6972L17.2814 13.7813L12.2837 18.7779C12.0176 19.044 11.6012 19.0683 11.3076 18.8507L11.2235 18.7782L6.22003 13.7816C5.92694 13.4889 5.92661 13.014 6.21931 12.7209C6.48539 12.4545 6.90204 12.43 7.1958 12.6477L7.27997 12.7202L10.999 16.4339L11 2.75586C11 2.37616 11.2822 2.06237 11.6482 2.01271L11.75 2.00586L11.6482 2.01271Z" /></svg>
icon:btn_apply = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.2802 9.78034C16.5731 9.48746 16.5731 9.01258 16.2802 8.71968C15.9873 8.42678 15.5125 8.42677 15.2196 8.71966L10.7499 13.1891L9.27642 11.7157C8.98353 11.4228 8.50865 11.4228 8.21576 11.7157C7.92287 12.0085 7.92287 12.4834 8.21576 12.7763L10.2196 14.7801C10.5124 15.073 10.9873 15.073 11.2802 14.7801L16.2802 9.78034ZM6.25 3C4.45507 3 3 4.45507 3 6.25V17.75C3 19.5449 4.45507 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM4.5 6.25C4.5 5.2835 5.2835 4.5 6.25 4.5H17.75C18.7165 4.5 19.5 5.2835 19.5 6.25V17.75C19.5 18.7165 18.7165 19.5 17.75 19.5H6.25C5.2835 19.5 4.5 18.7165 4.5 17.75V6.25Z" /></svg>
icon:btn_build = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M18.4923 2.33088L21.671 5.50966C22.5497 6.38834 22.5497 7.81296 21.671 8.69164L19.0866 11.2756C20.1696 11.438 21 12.3723 21 13.5006V18.7506C21 19.9932 19.9926 21.0006 18.75 21.0006H5.25C4.00736 21.0006 3 19.9932 3 18.7506V5.25055C3 4.00791 4.00736 3.00055 5.25 3.00055H10.5C11.6289 3.00055 12.5637 3.83201 12.7253 4.91596L15.3103 2.33088C16.189 1.45221 17.6136 1.45221 18.4923 2.33088ZM4.5 18.7506C4.5 19.1648 4.83579 19.5006 5.25 19.5006L11.249 19.4999L11.25 12.7506L4.5 12.7499V18.7506ZM12.749 19.4999L18.75 19.5006C19.1642 19.5006 19.5 19.1648 19.5 18.7506V13.5006C19.5 13.0863 19.1642 12.7506 18.75 12.7506L12.749 12.7499V19.4999ZM10.5 4.50055H5.25C4.83579 4.50055 4.5 4.83634 4.5 5.25055V11.2499H11.25V5.25055C11.25 4.83634 10.9142 4.50055 10.5 4.50055ZM12.75 9.30988V11.2506L14.69 11.2499L12.75 9.30988ZM16.3709 3.39154L13.1922 6.57032C12.8993 6.86321 12.8993 7.33808 13.1922 7.63098L16.3709 10.8097C16.6638 11.1026 17.1387 11.1026 17.4316 10.8097L20.6104 7.63098C20.9033 7.33808 20.9033 6.86321 20.6104 6.57032L17.4316 3.39154C17.1387 3.09865 16.6638 3.09865 16.3709 3.39154Z" /></svg>
icon:btn_print = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M15.7525 3C16.9951 3 18.0025 4.00736 18.0025 5.25L18.002 6.003L18.7525 6.00358C20.5469 6.00533 22.0011 7.45877 22.0038 9.25244L22.0071 15.2497C22.009 16.4918 21.0021 17.5002 19.7591 17.5009L18 17.5V18.75C18 19.9926 16.9926 21 15.75 21H8.25C7.00736 21 6 19.9926 6 18.75L6.00091 17.5L4.25 17.5001C3.00736 17.5001 2 16.4927 2 15.2501V9.25358C2 7.45865 3.45507 6.00358 5.25 6.00358L5.999 6.003L6 5.25C6 4.00736 7.00736 3 8.25 3H15.7525ZM15.75 13.5H8.25C7.83579 13.5 7.5 13.8358 7.5 14.25V18.75C7.5 19.1642 7.83579 19.5 8.25 19.5H15.75C16.1642 19.5 16.5 19.1642 16.5 18.75V14.25C16.5 13.8358 16.1642 13.5 15.75 13.5ZM18.7518 7.50358H5.25C4.2835 7.50358 3.5 8.28708 3.5 9.25358V15.2501C3.5 15.6643 3.83579 16.0001 4.25 16.0001L6 16V14.25C6 13.0074 7.00736 12 8.25 12H15.75C16.9926 12 18 13.0074 18 14.25L18.0009 16.0001L19.7827 16.0005C20.1855 15.9874 20.5077 15.6567 20.5071 15.2512L20.5038 9.25398C20.5024 8.28801 19.7185 7.50452 18.7518 7.50358ZM15.7525 4.5H8.25C7.83579 4.5 7.5 4.83579 7.5 5.25L7.499 6.003H16.502L16.5025 5.25C16.5025 4.83579 16.1667 4.5 15.7525 4.5Z" /></svg>
icon:btn_preview = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M11.9999 9.00462C14.209 9.00462 15.9999 10.7955 15.9999 13.0046C15.9999 15.2138 14.209 17.0046 11.9999 17.0046C9.79073 17.0046 7.99987 15.2138 7.99987 13.0046C7.99987 10.7955 9.79073 9.00462 11.9999 9.00462ZM11.9999 10.5046C10.6192 10.5046 9.49987 11.6239 9.49987 13.0046C9.49987 14.3853 10.6192 15.5046 11.9999 15.5046C13.3806 15.5046 14.4999 14.3853 14.4999 13.0046C14.4999 11.6239 13.3806 10.5046 11.9999 10.5046ZM11.9999 5.5C16.6134 5.5 20.596 8.65001 21.701 13.0644C21.8016 13.4662 21.5574 13.8735 21.1556 13.9741C20.7537 14.0746 20.3465 13.8305 20.2459 13.4286C19.307 9.67796 15.9212 7 11.9999 7C8.07681 7 4.68997 9.68026 3.75273 13.4332C3.65237 13.835 3.24523 14.0794 2.84336 13.9791C2.44149 13.8787 2.19707 13.4716 2.29743 13.0697C3.40052 8.65272 7.38436 5.5 11.9999 5.5Z" /></svg>
icon:add = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 3.25C12.4142 3.25 12.75 3.58579 12.75 4V11.25H20C20.4142 11.25 20.75 11.5858 20.75 12C20.75 12.4142 20.4142 12.75 20 12.75H12.75V20C12.75 20.4142 12.4142 20.75 12 20.75C11.5858 20.75 11.25 20.4142 11.25 20V12.75H4C3.58579 12.75 3.25 12.4142 3.25 12C3.25 11.5858 3.58579 11.25 4 11.25H11.25V4C11.25 3.58579 11.5858 3.25 12 3.25Z" /></svg>
icon:bookmarks = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.19094 21.8547C5.6948 22.2117 5.00293 21.8571 5.00293 21.2459V6.25C5.00293 4.45507 6.458 3 8.25293 3H15.7513C17.5462 3 19.0013 4.45507 19.0013 6.25V21.2459C19.0013 21.8571 18.3094 22.2117 17.8133 21.8547L12.0021 17.6738L6.19094 21.8547ZM17.5013 6.25C17.5013 5.2835 16.7178 4.5 15.7513 4.5H8.25293C7.28643 4.5 6.50293 5.2835 6.50293 6.25V19.7824L11.5641 16.141C11.8258 15.9528 12.1785 15.9528 12.4401 16.141L17.5013 19.7824V6.25Z" /></svg>
icon:browse = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3.50014 6.25C3.50014 5.2835 4.28364 4.5 5.25014 4.5H8.12882C8.32773 4.5 8.5185 4.57902 8.65915 4.71967L10.7198 6.78033C10.8605 6.92098 11.0512 7 11.2501 7H16.7501C17.7166 7 18.5001 7.7835 18.5001 8.75C18.5001 8.83602 18.5146 8.91866 18.5413 8.99561L8.71867 8.99561C7.37893 8.99561 6.14095 9.71035 5.47108 10.8706L3.50014 14.2844V6.25ZM2.00036 17.7883C2.02089 19.5656 3.468 21 5.25014 21H11.0001C11.0292 21 11.058 20.9983 11.0862 20.9951H16.2812C17.6209 20.9951 18.8589 20.2804 19.5288 19.1201L22.5596 13.8706C23.7748 11.7657 22.3337 9.14964 19.9567 9.00214C19.9848 8.92334 20.0001 8.83846 20.0001 8.75C20.0001 6.95507 18.5451 5.5 16.7501 5.5H11.5608L9.71981 3.65901C9.29786 3.23705 8.72556 3 8.12882 3H5.25014C3.45522 3 2.00014 4.45507 2.00014 6.25V17.71C1.9999 17.7362 1.99997 17.7623 2.00036 17.7883ZM8.71867 10.4956L19.745 10.4956C21.0921 10.4956 21.9341 11.9539 21.2605 13.1206L18.2297 18.3701C17.8278 19.0663 17.085 19.4951 16.2812 19.4951H5.25485C3.9077 19.4951 3.06573 18.0368 3.7393 16.8701L6.77011 11.6206C7.17204 10.9245 7.91482 10.4956 8.71867 10.4956Z" /></svg>
icon:build_settings = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M19.9947 4.09693C19.9155 2.92614 18.9407 2.00098 17.7499 2.00098H6.25L6.09595 2.00617C4.92516 2.08533 4 3.06011 4 4.25098V19.749L4.00519 19.9031C4.08436 21.0739 5.05914 21.999 6.25 21.999H13.8175L12.3188 20.499H6.25L6.14823 20.4922C5.78215 20.4425 5.5 20.1287 5.5 19.749V4.25098L5.50685 4.14921C5.55651 3.78313 5.8703 3.50098 6.25 3.50098H17.7499L17.8516 3.50782C18.2177 3.55749 18.4999 3.87128 18.4999 4.25098V15.8178L19.6587 14.659C19.7651 14.5526 19.8794 14.4591 19.9999 14.3785V4.25098L19.9947 4.09693ZM16.2876 21.999C16.2749 21.9997 16.2622 22 16.2495 22C16.2369 22 16.2243 21.9997 16.2118 21.999C16.0266 21.9897 15.8508 21.9119 15.7191 21.7801L13.2194 19.2783C12.9267 18.9853 12.9269 18.5104 13.2199 18.2176C13.5129 17.9248 13.9878 17.925 14.2806 18.2181L16.2499 20.1891L20.7194 15.7197C21.0122 15.4268 21.4871 15.4268 21.78 15.7197C22.0729 16.0126 22.0729 16.4874 21.78 16.7803L16.78 21.7803C16.6483 21.912 16.4727 21.9897 16.2876 21.999ZM13.8413 16.5C13.7805 16.4976 13.7195 16.4976 13.6587 16.5H11.2461C10.8319 16.5 10.4961 16.1642 10.4961 15.75C10.4961 15.3358 10.8319 15 11.2461 15H16.2499C16.6642 15 16.9999 15.3358 16.9999 15.75C16.9999 16.1642 16.6642 16.5 16.2499 16.5H13.8413ZM9 7.75162C9 8.3039 8.55229 8.75162 8 8.75162C7.44772 8.75162 7 8.3039 7 7.75162C7 7.19933 7.44772 6.75162 8 6.75162C8.55229 6.75162 9 7.19933 9 7.75162ZM10.4961 7.75001C10.4961 7.3358 10.8319 7.00001 11.2461 7.00001H16.2499C16.6642 7.00001 16.9999 7.3358 16.9999 7.75001C16.9999 8.16422 16.6642 8.50001 16.2499 8.50001H11.2461C10.8319 8.50001 10.4961 8.16422 10.4961 7.75001ZM11.2461 11C10.8319 11 10.4961 11.3358 10.4961 11.75C10.4961 12.1642 10.8319 12.5 11.2461 12.5H16.2499C16.6642 12.5 16.9999 12.1642 16.9999 11.75C16.9999 11.3358 16.6642 11 16.2499 11H11.2461ZM8 12.75C8.55229 12.75 9 12.3023 9 11.75C9 11.1977 8.55229 10.75 8 10.75C7.44772 10.75 7 11.1977 7 11.75C7 12.3023 7.44772 12.75 8 12.75ZM9 15.748C9 16.3003 8.55229 16.748 8 16.748C7.44772 16.748 7 16.3003 7 15.748C7 15.1957 7.44772 14.748 8 14.748C8.55229 14.748 9 15.1957 9 15.748Z" /></svg>
icon:calendar = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M17.75 3C19.5449 3 21 4.45507 21 6.25V17.75C21 19.5449 19.5449 21 17.75 21H6.25C4.45507 21 3 19.5449 3 17.75V6.25C3 4.45507 4.45507 3 6.25 3H17.75ZM19.5 8.5H4.5V17.75C4.5 18.7165 5.2835 19.5 6.25 19.5H17.75C18.7165 19.5 19.5 18.7165 19.5 17.75V8.5ZM13.9951 10.1953C14.6624 10.1953 15.1914 10.3727 15.582 10.7275C15.9727 11.0824 16.168 11.5625 16.168 12.168C16.168 12.5163 16.0785 12.8263 15.8994 13.0981C15.7204 13.37 15.4762 13.584 15.167 13.7402C15.5381 13.9128 15.8237 14.1488 16.0239 14.4482C16.2241 14.7477 16.3242 15.0863 16.3242 15.4639C16.3242 16.0889 16.1126 16.5845 15.6895 16.9507C15.2663 17.3169 14.7031 17.5 14 17.5C13.2936 17.5 12.728 17.3161 12.3032 16.9482C11.8784 16.5804 11.666 16.0856 11.666 15.4639C11.666 15.083 11.7669 14.7412 11.9688 14.4385C12.1706 14.1357 12.4538 13.903 12.8184 13.7402C12.5124 13.584 12.2707 13.37 12.0933 13.0981C11.9159 12.8263 11.8271 12.5163 11.8271 12.168C11.8271 11.5625 12.0225 11.0824 12.4131 10.7275C12.8037 10.3727 13.3311 10.1953 13.9951 10.1953ZM10.2197 10.2686V17.4023H9.03809V11.6943L7.29492 12.29V11.2891L10.0684 10.2686H10.2197ZM13.9902 14.2285C13.6452 14.2285 13.3693 14.3359 13.1626 14.5508C12.9559 14.7656 12.8525 15.0505 12.8525 15.4053C12.8525 15.7536 12.9543 16.0319 13.1577 16.2402C13.3612 16.4486 13.6419 16.5527 14 16.5527C14.3581 16.5527 14.6372 16.4518 14.8374 16.25C15.0376 16.0482 15.1377 15.7666 15.1377 15.4053C15.1377 15.0537 15.0327 14.7697 14.8228 14.5532C14.6128 14.3368 14.3353 14.2285 13.9902 14.2285ZM13.9951 11.1475C13.6924 11.1475 13.4531 11.2427 13.2773 11.4331C13.1016 11.6235 13.0137 11.8831 13.0137 12.2119C13.0137 12.5374 13.1024 12.7962 13.2798 12.9883C13.4572 13.1803 13.6973 13.2764 14 13.2764C14.3027 13.2764 14.5428 13.1803 14.7202 12.9883C14.8976 12.7962 14.9863 12.5374 14.9863 12.2119C14.9863 11.9027 14.8968 11.648 14.7178 11.4478C14.5387 11.2476 14.2979 11.1475 13.9951 11.1475ZM17.75 4.5H6.25C5.2835 4.5 4.5 5.2835 4.5 6.25V7H19.5V6.25C19.5 5.2835 18.7165 4.5 17.75 4.5Z" /></svg>
icon:cancel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 3.5C7.30558 3.5 3.5 7.30558 3.5 12C3.5 16.6944 7.30558 20.5 12 20.5C16.6944 20.5 20.5 16.6944 20.5 12C20.5 7.30558 16.6944 3.5 12 3.5ZM15.4462 8.39705L15.5303 8.46967C15.7966 8.73594 15.8208 9.1526 15.6029 9.44621L15.5303 9.53033L13.061 12L15.5303 14.4697C15.7966 14.7359 15.8208 15.1526 15.6029 15.4462L15.5303 15.5303C15.2641 15.7966 14.8474 15.8208 14.5538 15.6029L14.4697 15.5303L12 13.061L9.53033 15.5303C9.26406 15.7966 8.8474 15.8208 8.55379 15.6029L8.46967 15.5303C8.2034 15.2641 8.1792 14.8474 8.39705 14.5538L8.46967 14.4697L10.939 12L8.46967 9.53033C8.2034 9.26406 8.1792 8.8474 8.39705 8.55379L8.46967 8.46967C8.73594 8.2034 9.1526 8.1792 9.44621 8.39705L9.53033 8.46967L12 10.939L14.4697 8.46967C14.7359 8.2034 15.1526 8.1792 15.4462 8.39705Z" /></svg>
icon:checked = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.2802 9.78034C16.5731 9.48746 16.5731 9.01258 16.2802 8.71968C15.9873 8.42678 15.5125 8.42677 15.2196 8.71966L10.7499 13.1891L9.27642 11.7157C8.98353 11.4228 8.50865 11.4228 8.21576 11.7157C7.92287 12.0085 7.92287 12.4834 8.21576 12.7763L10.2196 14.7801C10.5124 15.073 10.9873 15.073 11.2802 14.7801L16.2802 9.78034ZM6.25 3C4.45507 3 3 4.45507 3 6.25V17.75C3 19.5449 4.45507 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM4.5 6.25C4.5 5.2835 5.2835 4.5 6.25 4.5H17.75C18.7165 4.5 19.5 5.2835 19.5 6.25V17.75C19.5 18.7165 18.7165 19.5 17.75 19.5H6.25C5.2835 19.5 4.5 18.7165 4.5 17.75V6.25Z" /></svg>
icon:chevron_down = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.21967 8.46967C4.51256 8.17678 4.98744 8.17678 5.28033 8.46967L12 15.1893L18.7197 8.46967C19.0126 8.17678 19.4874 8.17678 19.7803 8.46967C20.0732 8.76256 20.0732 9.23744 19.7803 9.53033L12.5303 16.7803C12.2374 17.0732 11.7626 17.0732 11.4697 16.7803L4.21967 9.53033C3.92678 9.23744 3.92678 8.76256 4.21967 8.46967Z" /></svg>
icon:chevron_left = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M15.5303 4.21967C15.8232 4.51256 15.8232 4.98744 15.5303 5.28033L8.81066 12L15.5303 18.7197C15.8232 19.0126 15.8232 19.4874 15.5303 19.7803C15.2374 20.0732 14.7626 20.0732 14.4697 19.7803L7.21967 12.5303C6.92678 12.2374 6.92678 11.7626 7.21967 11.4697L14.4697 4.21967C14.7626 3.92678 15.2374 3.92678 15.5303 4.21967Z" /></svg>
icon:chevron_right = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M8.46967 4.21967C8.17678 4.51256 8.17678 4.98744 8.46967 5.28033L15.1893 12L8.46967 18.7197C8.17678 19.0126 8.17678 19.4874 8.46967 19.7803C8.76256 20.0732 9.23744 20.0732 9.53033 19.7803L16.7803 12.5303C17.0732 12.2374 17.0732 11.7626 16.7803 11.4697L9.53033 4.21967C9.23744 3.92678 8.76256 3.92678 8.46967 4.21967Z" /></svg>
icon:chevron_up = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.21967 15.5303C4.51256 15.8232 4.98744 15.8232 5.28033 15.5303L12 8.81066L18.7197 15.5303C19.0126 15.8232 19.4874 15.8232 19.7803 15.5303C20.0732 15.2374 20.0732 14.7626 19.7803 14.4697L12.5303 7.21967C12.2374 6.92678 11.7626 6.92678 11.4697 7.21967L4.21967 14.4697C3.92678 14.7626 3.92678 15.2374 4.21967 15.5303Z" /></svg>
icon:close = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.39705 4.55379L4.46967 4.46967C4.73594 4.2034 5.1526 4.1792 5.44621 4.39705L5.53033 4.46967L12 10.939L18.4697 4.46967C18.7626 4.17678 19.2374 4.17678 19.5303 4.46967C19.8232 4.76256 19.8232 5.23744 19.5303 5.53033L13.061 12L19.5303 18.4697C19.7966 18.7359 19.8208 19.1526 19.6029 19.4462L19.5303 19.5303C19.2641 19.7966 18.8474 19.8208 18.5538 19.6029L18.4697 19.5303L12 13.061L5.53033 19.5303C5.23744 19.8232 4.76256 19.8232 4.46967 19.5303C4.17678 19.2374 4.17678 18.7626 4.46967 18.4697L10.939 12L4.46967 5.53033C4.2034 5.26406 4.1792 4.8474 4.39705 4.55379L4.46967 4.46967L4.39705 4.55379Z" /></svg>
icon:copy = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M8.5 8.5H6.25C5.2835 8.5 4.5 9.2835 4.5 10.25V17.75C4.5 18.7165 5.2835 19.5 6.25 19.5H11.25C12.1315 19.5 12.8591 18.8479 12.9805 18H14.4893C14.3616 19.6781 12.9608 21 11.25 21H6.25C4.45507 21 3 19.5449 3 17.75V10.25C3 8.45507 4.45507 7 6.25 7H8.5V8.5ZM15.75 15.5C16.1642 15.5 16.5 15.8358 16.5 16.25C16.5 16.6642 16.1642 17 15.75 17H14.75C14.3358 17 14 16.6642 14 16.25C14 15.8358 14.3358 15.5 14.75 15.5H15.75ZM10.3477 14C10.7332 14.0002 11.0447 14.2979 11.2393 14.6309C11.3912 14.8908 11.609 15.108 11.8691 15.2598C12.2023 15.4543 12.5 15.7665 12.5 16.1523C12.4999 16.6039 12.1092 16.9675 11.6826 16.8193C10.7468 16.4941 10.0059 15.7532 9.68066 14.8174C9.53257 14.391 9.89627 14 10.3477 14ZM20.1523 14C20.6037 14 20.9674 14.391 20.8193 14.8174C20.4941 15.7532 19.7532 16.4941 18.8174 16.8193C18.3908 16.9675 18.0001 16.6039 18 16.1523C18 15.7665 18.2977 15.4543 18.6309 15.2598C18.891 15.108 19.1088 14.8908 19.2607 14.6309C19.4553 14.2979 19.7668 14.0002 20.1523 14ZM10.25 8.5C10.6642 8.5 11 8.83579 11 9.25V11.75C11 12.1642 10.6642 12.5 10.25 12.5C9.83579 12.5 9.5 12.1642 9.5 11.75V9.25C9.5 8.83579 9.83579 8.5 10.25 8.5ZM20.25 8.5C20.6642 8.5 21 8.83579 21 9.25V11.75C21 12.1642 20.6642 12.5 20.25 12.5C19.8358 12.5 19.5 12.1642 19.5 11.75V9.25C19.5 8.83579 19.8358 8.5 20.25 8.5ZM11.6826 3.17969C12.1092 3.03149 12.4999 3.39512 12.5 3.84668C12.5 4.23268 12.2016 4.54479 11.8682 4.73926C11.3488 5.0423 11 5.60509 11 6.25C11 6.66421 10.6642 7 10.25 7C9.83579 7 9.5 6.66421 9.5 6.25C9.5 4.82902 10.4121 3.62127 11.6826 3.17969ZM18 3.84668C18.0001 3.39512 18.3908 3.03149 18.8174 3.17969C20.0879 3.62127 21 4.82902 21 6.25C21 6.66421 20.6642 7 20.25 7C19.8358 7 19.5 6.66421 19.5 6.25C19.5 5.60509 19.1512 5.0423 18.6318 4.73926C18.2984 4.54479 18 4.23268 18 3.84668ZM15.75 3C16.1642 3 16.5 3.33579 16.5 3.75C16.5 4.16421 16.1642 4.5 15.75 4.5H14.75C14.3358 4.5 14 4.16421 14 3.75C14 3.33579 14.3358 3 14.75 3H15.75Z" /></svg>
icon:document_add = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4 4C4 2.89543 4.89543 2 6 2H12.1722C12.7027 2 13.2114 2.21071 13.5864 2.58579L19.4142 8.41355C19.7893 8.78863 20 9.29733 20 9.82777V20C20 21.1046 19.1046 22 18 22H11.879C11.9326 21.8566 11.9604 21.7039 11.9604 21.549C11.9604 21.0242 11.7672 20.7145 11.4748 20.5H18C18.2761 20.5 18.5 20.2761 18.5 20V10H14C12.8954 10 12 9.10457 12 8V3.5H6C5.72386 3.5 5.5 3.72386 5.5 4V10.4011C5.21848 10.1508 4.85128 9.99805 4.47 9.99805C4.30961 9.99805 4.15109 10.0243 4 10.0732V4ZM14 8.5H17.3793L13.5 4.62066V8C13.5 8.27614 13.7239 8.5 14 8.5ZM3.08828 17.4123C3.01598 17.3189 2.93772 17.2298 2.85387 17.1457C2.54169 16.8326 2.16058 16.5967 1.74097 16.4568L0.363172 16.0094C0.256979 15.972 0.165021 15.9025 0.0999761 15.8107C0.0349307 15.7188 0 15.6091 0 15.4966C0 15.384 0.0349307 15.2743 0.0999761 15.1824C0.165021 15.0906 0.256979 15.0212 0.363172 14.9837L1.74097 14.5363C2.15474 14.3935 2.52987 14.1571 2.837 13.8454C3.13572 13.5422 3.36226 13.1759 3.5 12.7737L3.51143 12.7396L3.95922 11.3629C3.99668 11.2568 4.06616 11.1649 4.15808 11.0999C4.25 11.0349 4.35984 11 4.47244 11C4.58505 11 4.69489 11.0349 4.78681 11.0999C4.87873 11.1649 4.94821 11.2568 4.98567 11.3629L5.43346 12.7396C5.5727 13.1582 5.80772 13.5385 6.11985 13.8504C6.43198 14.1623 6.8126 14.3971 7.23148 14.5363L8.60927 14.9837L8.63683 14.9906C8.74302 15.028 8.83498 15.0975 8.90002 15.1893C8.96507 15.2812 9 15.3909 9 15.5034C9 15.616 8.96507 15.7257 8.90002 15.8176C8.83498 15.9094 8.74302 15.9788 8.63683 16.0163L7.25903 16.4637C6.84016 16.6029 6.45953 16.8377 6.1474 17.1496C5.83528 17.4615 5.60025 17.8418 5.46101 18.2604L5.01323 19.6371C5.00919 19.6486 5.00477 19.6598 5 19.6709C4.96052 19.7627 4.89637 19.8421 4.81436 19.9001C4.72244 19.9651 4.61261 20 4.5 20C4.38739 20 4.27756 19.9651 4.18564 19.9001C4.09372 19.8351 4.02423 19.7432 3.98677 19.6371L3.53899 18.2604C3.43782 17.9533 3.28514 17.6666 3.08828 17.4123ZM10.7829 21.2132L10.0175 20.9646C9.78478 20.8873 9.57332 20.7568 9.39992 20.5836C9.22651 20.4103 9.09594 20.199 9.01859 19.9665L8.76982 19.2016C8.74901 19.1427 8.7104 19.0916 8.65934 19.0555C8.60827 19.0194 8.54725 19 8.48469 19C8.42213 19 8.36111 19.0194 8.31004 19.0555C8.25898 19.0916 8.22038 19.1427 8.19956 19.2016L7.9508 19.9665C7.87498 20.1974 7.74675 20.4076 7.57611 20.5808C7.40548 20.7539 7.19708 20.8853 6.9672 20.9646L6.20176 21.2132C6.14277 21.234 6.09168 21.2725 6.05554 21.3236C6.01941 21.3746 6 21.4356 6 21.4981C6 21.5606 6.01941 21.6216 6.05554 21.6726C6.09168 21.7236 6.14277 21.7622 6.20176 21.783L6.9672 22.0316C7.20032 22.1093 7.41205 22.2403 7.58548 22.4143C7.75891 22.5882 7.88926 22.8003 7.9661 23.0335L8.21487 23.7984C8.23569 23.8573 8.27429 23.9084 8.32535 23.9445C8.37642 23.9806 8.43744 24 8.5 24C8.56256 24 8.62358 23.9806 8.67465 23.9445C8.72571 23.9084 8.76431 23.8573 8.78513 23.7984L9.0339 23.0335C9.11125 22.801 9.24182 22.5897 9.41522 22.4164C9.58863 22.2432 9.80009 22.1127 10.0328 22.0354L10.7982 21.7868C10.8572 21.766 10.9083 21.7275 10.9445 21.6764C10.9806 21.6254 11 21.5644 11 21.5019C11 21.4394 10.9806 21.3784 10.9445 21.3274C10.9083 21.2764 10.8572 21.2378 10.7982 21.217L10.7829 21.2132Z" /></svg>
icon:document = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6 2C4.89543 2 4 2.89543 4 4V20C4 21.1046 4.89543 22 6 22H18C19.1046 22 20 21.1046 20 20V9.82777C20 9.29733 19.7893 8.78863 19.4142 8.41355L13.5864 2.58579C13.2114 2.21071 12.7027 2 12.1722 2H6ZM5.5 4C5.5 3.72386 5.72386 3.5 6 3.5H12V8C12 9.10457 12.8954 10 14 10H18.5V20C18.5 20.2761 18.2761 20.5 18 20.5H6C5.72386 20.5 5.5 20.2761 5.5 20V4ZM17.3793 8.5H14C13.7239 8.5 13.5 8.27614 13.5 8V4.62066L17.3793 8.5Z" /></svg>
icon:edit = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M20.9519 3.0481C19.5543 1.65058 17.2885 1.65064 15.8911 3.04825L3.94103 14.9997C3.5347 15.4061 3.2491 15.9172 3.116 16.4762L2.02041 21.0777C1.96009 21.3311 2.03552 21.5976 2.21968 21.7817C2.40385 21.9659 2.67037 22.0413 2.92373 21.981L7.52498 20.8855C8.08418 20.7523 8.59546 20.4666 9.00191 20.0601L20.952 8.10861C22.3493 6.71112 22.3493 4.4455 20.9519 3.0481ZM16.9518 4.10884C17.7634 3.29709 19.0795 3.29705 19.8912 4.10876C20.7028 4.9204 20.7029 6.23632 19.8913 7.04801L19 7.93946L16.0606 5.00012L16.9518 4.10884ZM15 6.06084L17.9394 9.00018L7.94119 18.9995C7.73104 19.2097 7.46668 19.3574 7.17755 19.4263L3.76191 20.2395L4.57521 16.8237C4.64402 16.5346 4.79168 16.2704 5.00175 16.0603L15 6.06084Z" /></svg>
icon:exclude = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 3.5C7.30558 3.5 3.5 7.30558 3.5 12C3.5 16.6944 7.30558 20.5 12 20.5C16.6944 20.5 20.5 16.6944 20.5 12C20.5 7.30558 16.6944 3.5 12 3.5ZM15.4462 8.39705L15.5303 8.46967C15.7966 8.73594 15.8208 9.1526 15.6029 9.44621L15.5303 9.53033L13.061 12L15.5303 14.4697C15.7966 14.7359 15.8208 15.1526 15.6029 15.4462L15.5303 15.5303C15.2641 15.7966 14.8474 15.8208 14.5538 15.6029L14.4697 15.5303L12 13.061L9.53033 15.5303C9.26406 15.7966 8.8474 15.8208 8.55379 15.6029L8.46967 15.5303C8.2034 15.2641 8.1792 14.8474 8.39705 14.5538L8.46967 14.4697L10.939 12L8.46967 9.53033C8.2034 9.26406 8.1792 8.8474 8.39705 8.55379L8.46967 8.46967C8.73594 8.2034 9.1526 8.1792 9.44621 8.39705L9.53033 8.46967L12 10.939L14.4697 8.46967C14.7359 8.2034 15.1526 8.1792 15.4462 8.39705Z" /></svg>
icon:export = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M2.7525 4.5C3.1322 4.5 3.44594 4.78227 3.49554 5.14836L3.50237 5.25014L3.5 18.2542C3.49992 18.6684 3.16408 19.0041 2.74986 19.0041C2.37017 19.0041 2.05642 18.7218 2.00683 18.3557L2 18.2539L2.00237 5.24986C2.00244 4.83565 2.33829 4.5 2.7525 4.5ZM15.6471 6.30373L15.7197 6.21961C15.986 5.95338 16.4027 5.92921 16.6963 6.1471L16.7804 6.21972L21.777 11.2174C22.0431 11.4835 22.0674 11.8999 21.8498 12.1935L21.7773 12.2776L16.7807 17.2811C16.488 17.5742 16.0131 17.5745 15.72 17.2818C15.4536 17.0157 15.4291 16.5991 15.6467 16.3053L15.7193 16.2211L19.43 12.504L5.75295 12.5049C5.37326 12.5049 5.05946 12.2228 5.0098 11.8567L5.00295 11.7549C5.00295 11.3752 5.28511 11.0615 5.65118 11.0118L5.75295 11.0049L19.443 11.004L15.7196 7.28028C15.4534 7.01398 15.4292 6.59732 15.6471 6.30373L15.7197 6.21961L15.6471 6.30373Z" /></svg>
icon:filter = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M13.5 16C13.9142 16 14.25 16.3358 14.25 16.75C14.25 17.1642 13.9142 17.5 13.5 17.5H10.5C10.0858 17.5 9.75 17.1642 9.75 16.75C9.75 16.3358 10.0858 16 10.5 16H13.5ZM16.5 11C16.9142 11 17.25 11.3358 17.25 11.75C17.25 12.1642 16.9142 12.5 16.5 12.5H7.5C7.08579 12.5 6.75 12.1642 6.75 11.75C6.75 11.3358 7.08579 11 7.5 11H16.5ZM19.5 6C19.9142 6 20.25 6.33579 20.25 6.75C20.25 7.16421 19.9142 7.5 19.5 7.5H4.5C4.08579 7.5 3.75 7.16421 3.75 6.75C3.75 6.33579 4.08579 6 4.5 6H19.5Z" /></svg>
icon:fit_height = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M5.75 3C5.33579 3 5 3.33579 5 3.75C5 4.16421 5.33579 4.5 5.75 4.5H18.25C18.6642 4.5 19 4.16421 19 3.75C19 3.33579 18.6642 3 18.25 3H5.75ZM9.22162 14.2188C9.48789 13.9526 9.90455 13.9284 10.1982 14.1462L10.2823 14.2188L11.502 15.44V12.3691L11.5 12.3437V8.56L10.2803 9.78115L10.1962 9.85377C9.9026 10.0716 9.48594 10.0474 9.21967 9.78115C8.9534 9.51488 8.9292 9.09822 9.14705 8.80461L9.21967 8.72049L11.5871 6.35039C11.7128 6.14201 11.9629 6 12.2509 6C12.503 6 12.726 6.10886 12.862 6.27578L12.9148 6.35073L15.282 8.72049L15.3546 8.80461C15.5482 9.0656 15.5506 9.42381 15.3618 9.6872L15.282 9.78115L15.1979 9.85377C14.9369 10.0474 14.5787 10.0498 14.3153 9.86094L14.2213 9.78115L13 8.56V11.6308L13.002 11.6562V15.44L14.2233 14.2188C14.4895 13.9526 14.9062 13.9284 15.1998 14.1462L15.2839 14.2188C15.5502 14.4851 15.5744 14.9018 15.3565 15.1954L15.2839 15.2795L12.9167 17.6493C12.7911 17.8578 12.541 18 12.2529 18C11.9649 18 11.7147 17.858 11.589 17.6496L9.22162 15.2795C8.92873 14.9866 8.92873 14.5117 9.22162 14.2188ZM5 20.25C5 19.8358 5.33579 19.5 5.75 19.5H18.25C18.6642 19.5 19 19.8358 19 20.25C19 20.6642 18.6642 21 18.25 21H5.75C5.33579 21 5 20.6642 5 20.25Z" /></svg>
icon:fit_width = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3 18.25C3 18.6642 3.33579 19 3.75 19C4.16421 19 4.5 18.6642 4.5 18.25V5.75C4.5 5.33579 4.16421 5 3.75 5C3.33579 5 3 5.33579 3 5.75V18.25ZM19.5 18.25C19.5 18.6642 19.8358 19 20.25 19C20.6642 19 21 18.6642 21 18.25V5.75C21 5.33579 20.6642 5 20.25 5C19.8358 5 19.5 5.33579 19.5 5.75V18.25ZM14.1462 14.0535C13.9284 14.3472 13.9526 14.7638 14.2188 15.0301C14.5117 15.323 14.9866 15.323 15.2795 15.0301L17.6496 12.6627C17.858 12.537 18 12.2869 18 11.9988C18 11.7107 17.8578 11.4606 17.6493 11.335L15.2795 8.96778L15.1954 8.89517C14.9018 8.67731 14.4851 8.70152 14.2188 8.96778L14.1462 9.0519C13.9284 9.34551 13.9526 9.76218 14.2188 10.0284L15.44 11.2498H11.6562L11.6308 11.2517H8.56L9.78115 10.0304L9.86094 9.93645C10.0498 9.67306 10.0474 9.31484 9.85377 9.05386L9.78115 8.96974L9.6872 8.88995C9.42381 8.70108 9.0656 8.70347 8.80461 8.89712L8.72049 8.96974L6.35073 11.337L6.27578 11.3897C6.10886 11.5257 6 11.7487 6 12.0008C6 12.2888 6.14201 12.5389 6.35039 12.6646L8.72049 15.032L8.80461 15.1047C9.09822 15.3225 9.51488 15.2983 9.78115 15.032C10.0474 14.7658 10.0716 14.3491 9.85377 14.0555L9.78115 13.9714L8.56 12.7517H12.3437L12.3691 12.7498H15.44L14.2188 13.9694L14.1462 14.0535Z" /></svg>
icon:folder = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3.5 6.25V8H8.12868C8.32759 8 8.51836 7.92098 8.65901 7.78033L10.1893 6.25L8.65901 4.71967C8.51836 4.57902 8.32759 4.5 8.12868 4.5H5.25C4.2835 4.5 3.5 5.2835 3.5 6.25ZM2 6.25C2 4.45507 3.45507 3 5.25 3H8.12868C8.72542 3 9.29771 3.23705 9.71967 3.65901L11.5607 5.5H18.75C20.5449 5.5 22 6.95507 22 8.75V17.75C22 19.5449 20.5449 21 18.75 21H5.25C3.45507 21 2 19.5449 2 17.75V6.25ZM3.5 9.5V17.75C3.5 18.7165 4.2835 19.5 5.25 19.5H18.75C19.7165 19.5 20.5 18.7165 20.5 17.75V8.75C20.5 7.7835 19.7165 7 18.75 7H11.5607L9.71967 8.84099C9.29771 9.26295 8.72542 9.5 8.12868 9.5H3.5Z" /></svg>
icon:font = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M7.00072 2C7.31463 2.00001 7.59531 2.19551 7.70416 2.48994L10.6559 10.4745C10.6602 10.4853 10.6642 10.4962 10.668 10.5072L10.8905 11.109L10.0624 13.195L9.43613 11.5008H4.56447L3.4517 14.5101C3.30804 14.8986 2.87663 15.0971 2.48813 14.9534C2.09963 14.8098 1.90114 14.3784 2.0448 13.9899L3.33266 10.5071C3.33643 10.4961 3.34046 10.4852 3.34473 10.4744L6.29724 2.48988C6.40611 2.19546 6.68682 1.99999 7.00072 2ZM5.11914 10.0008H8.8816L7.0006 4.91271L5.11914 10.0008ZM13.8066 6.47329C13.92 6.18746 14.1965 5.99986 14.504 6C14.8115 6.00014 15.0878 6.18799 15.201 6.47391L20.7559 20.5042L21.2499 20.5042C21.6641 20.5042 21.9999 20.84 21.9998 21.2542C21.9998 21.6684 21.664 22.0042 21.2498 22.0042L20.2597 22.0042C20.2561 22.0042 20.2524 22.0043 20.2487 22.0043C20.2435 22.0043 20.2382 22.0043 20.2329 22.0042L18.7507 22.0041C18.3364 22.0041 18.0007 21.6683 18.0007 21.2541C18.0007 20.8399 18.3365 20.5041 18.7507 20.5041L19.1426 20.5041L17.9532 17.5H11.0433L9.85074 20.5042L10.2499 20.5042C10.6641 20.5042 10.9999 20.84 10.9998 21.2542C10.9998 21.6684 10.664 22.0042 10.2498 22.0042L8.75991 22.0042C8.75663 22.0042 8.75335 22.0043 8.75006 22.0043C8.74401 22.0043 8.73795 22.0043 8.73188 22.0042L7.75065 22.0041C7.33644 22.0041 7.00066 21.6683 7.00067 21.2541C7.00068 20.8399 7.33648 20.5041 7.75069 20.5041L8.23689 20.5041L13.8066 6.47329ZM17.3593 16L14.5027 8.78508L11.6387 16H17.3593Z" /></svg>
icon:import = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M21.2498 4.5C21.6295 4.5 21.9433 4.78215 21.993 5.14823L21.9998 5.25V18.2541C21.9998 18.6683 21.664 19.0041 21.2498 19.0041C20.8701 19.0041 20.5563 18.7219 20.5066 18.3558L20.4998 18.2541V5.25C20.4998 4.83579 20.8356 4.5 21.2498 4.5ZM12.6469 6.30373L12.7195 6.21961C12.9858 5.95338 13.4025 5.92921 13.6961 6.1471L13.7802 6.21972L18.7768 11.2174C19.0429 11.4835 19.0672 11.8999 18.8496 12.1935L18.7771 12.2776L13.7805 17.2811C13.4878 17.5742 13.0129 17.5745 12.7198 17.2818C12.4534 17.0157 12.4289 16.5991 12.6465 16.3053L12.7191 16.2211L16.43 12.504L2.75 12.5049C2.3703 12.5049 2.05651 12.2228 2.00685 11.8567L2 11.7549C2 11.3753 2.28215 11.0615 2.64823 11.0118L2.75 11.0049L16.443 11.004L12.7194 7.28028C12.4532 7.01398 12.429 6.59732 12.6469 6.30373L12.7195 6.21961L12.6469 6.30373Z" /></svg>
icon:language = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M9.34045 6.37226L9.38917 6.4766L14.9493 20.9766C15.0972 21.3624 14.9104 21.7974 14.532 21.9482C14.1852 22.0865 13.7978 21.9379 13.6217 21.6151L13.5791 21.5228L12.1461 17.7857L5.05932 17.7859L4.96527 17.7798L3.4185 21.5398C3.26139 21.9217 2.83032 22.1015 2.45568 21.9413C2.11227 21.7945 1.93548 21.4129 2.02941 21.0561L2.06182 20.9596L8.02575 6.45964C8.26631 5.87479 9.04862 5.84994 9.34045 6.37226ZM18.7457 2.00293C19.1254 2.00293 19.4392 2.28508 19.4888 2.65116L19.4957 2.75293L19.4954 7.49893L21.2457 7.4997C21.6254 7.4997 21.9392 7.78185 21.9888 8.14793L21.9957 8.2497C21.9957 8.62939 21.7135 8.94319 21.3475 8.99285L21.2457 8.9997L19.4954 8.99893L19.4957 16.2497C19.4957 16.6294 19.2135 16.9432 18.8475 16.9929L18.7457 16.9997C18.366 16.9997 18.0522 16.7175 18.0025 16.3515L17.9957 16.2497V2.75293C17.9957 2.33872 18.3315 2.00293 18.7457 2.00293ZM8.81111 8.74708L5.64895 16.2857H11.7589L8.81111 8.74708ZM10.7477 2.00293H16.2455C16.6252 2.00293 16.939 2.28508 16.9887 2.65116L16.9955 2.75293V5.75663C16.9955 8.10121 15.0949 10.0019 12.7503 10.0019C12.3361 10.0019 12.0003 9.66609 12.0003 9.25187C12.0003 8.83766 12.3361 8.50187 12.7503 8.50187C14.2103 8.50187 15.4041 7.36214 15.4905 5.92386L15.4955 5.75663V3.50293H10.7477C10.3335 3.50293 9.99775 3.16714 9.99775 2.75293C9.99775 2.37323 10.2799 2.05944 10.646 2.00978L10.7477 2.00293H16.2455H10.7477Z" /></svg>
icon:lines = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M2 5.75C2 5.33579 2.33579 5 2.75 5H18.25C18.6642 5 19 5.33579 19 5.75C19 6.16421 18.6642 6.5 18.25 6.5H2.75C2.33579 6.5 2 6.16421 2 5.75ZM2 17.75C2 17.3358 2.33579 17 2.75 17H15.25C15.6642 17 16 17.3358 16 17.75C16 18.1642 15.6642 18.5 15.25 18.5H2.75C2.33579 18.5 2 18.1642 2 17.75ZM2.75 11C2.33579 11 2 11.3358 2 11.75C2 12.1642 2.33579 12.5 2.75 12.5H21.25C21.6642 12.5 22 12.1642 22 11.75C22 11.3358 21.6642 11 21.25 11H2.75Z" /></svg>
icon:link = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M9.25 7C9.66421 7 10 7.33579 10 7.75C10 8.12656 9.72249 8.4383 9.36083 8.49187L9.25 8.5H7C5.067 8.5 3.5 10.067 3.5 12C3.5 13.864 4.95707 15.3876 6.79435 15.4941L7 15.5H9.25C9.66421 15.5 10 15.8358 10 16.25C10 16.6266 9.72249 16.9383 9.36083 16.9919L9.25 17H7C4.23858 17 2 14.7614 2 12C2 9.32226 4.10496 7.13615 6.75045 7.00612L7 7H9.25ZM17 7C19.7614 7 22 9.23858 22 12C22 14.6777 19.895 16.8638 17.2495 16.9939L17 17H14.75C14.3358 17 14 16.6642 14 16.25C14 15.8734 14.2775 15.5617 14.6392 15.5081L14.75 15.5H17C18.933 15.5 20.5 13.933 20.5 12C20.5 10.136 19.0429 8.6124 17.2057 8.50594L17 8.5H14.75C14.3358 8.5 14 8.16421 14 7.75C14 7.37344 14.2775 7.0617 14.6392 7.00813L14.75 7H17ZM7 11.25H17C17.4142 11.25 17.75 11.5858 17.75 12C17.75 12.3797 17.4678 12.6935 17.1018 12.7432L17 12.75H7C6.58579 12.75 6.25 12.4142 6.25 12C6.25 11.6203 6.53215 11.3065 6.89823 11.2568L7 11.25H17H7Z" /></svg>
icon:list = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3.24929 17.5C3.93925 17.5 4.49858 18.0593 4.49858 18.7493C4.49858 19.4393 3.93925 19.9986 3.24929 19.9986C2.55933 19.9986 2 19.4393 2 18.7493C2 18.0593 2.55933 17.5 3.24929 17.5ZM6.75 18H21.25C21.6642 18 22 18.3358 22 18.75C22 19.1297 21.7178 19.4435 21.3518 19.4932L21.25 19.5H6.75C6.33579 19.5 6 19.1642 6 18.75C6 18.3703 6.28215 18.0565 6.64823 18.0068L6.75 18H21.25H6.75ZM3.24929 11C3.93925 11 4.49858 11.5593 4.49858 12.2493C4.49858 12.9393 3.93925 13.4986 3.24929 13.4986C2.55933 13.4986 2 12.9393 2 12.2493C2 11.5593 2.55933 11 3.24929 11ZM6.75 11.5H21.25C21.6642 11.5 22 11.8358 22 12.25C22 12.6297 21.7178 12.9435 21.3518 12.9932L21.25 13H6.75C6.33579 13 6 12.6642 6 12.25C6 11.8703 6.28215 11.5565 6.64823 11.5068L6.75 11.5H21.25H6.75ZM3.24929 4.5C3.93925 4.5 4.49858 5.05933 4.49858 5.74929C4.49858 6.43925 3.93925 6.99858 3.24929 6.99858C2.55933 6.99858 2 6.43925 2 5.74929C2 5.05933 2.55933 4.5 3.24929 4.5ZM6.75 5H21.25C21.6642 5 22 5.33579 22 5.75C22 6.1297 21.7178 6.44349 21.3518 6.49315L21.25 6.5H6.75C6.33579 6.5 6 6.16421 6 5.75C6 5.3703 6.28215 5.05651 6.64823 5.00685L6.75 5H21.25H6.75Z" /></svg>
icon:margin_bottom = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.5 2.75C4.5 3.16421 4.83579 3.5 5.25 3.5H18.25C18.6642 3.5 19 3.16421 19 2.75C19 2.33579 18.6642 2 18.25 2H5.25C4.83579 2 4.5 2.33579 4.5 2.75ZM4.5 21.25C4.5 21.6642 4.83579 22 5.25 22H6.11667C6.53088 22 6.86667 21.6642 6.86667 21.25C6.86667 20.8358 6.53088 20.5 6.11667 20.5H5.25C4.83579 20.5 4.5 20.8358 4.5 21.25ZM7.96667 21.25C7.96667 21.6642 8.30245 22 8.71667 22H10.45C10.8642 22 11.2 21.6642 11.2 21.25C11.2 20.8358 10.8642 20.5 10.45 20.5H8.71667C8.30245 20.5 7.96667 20.8358 7.96667 21.25ZM12.3 21.25C12.3 21.6642 12.6358 22 13.05 22H14.7833C15.1975 22 15.5333 21.6642 15.5333 21.25C15.5333 20.8358 15.1975 20.5 14.7833 20.5H13.05C12.6358 20.5 12.3 20.8358 12.3 21.25ZM16.6333 21.25C16.6333 21.6642 16.9691 22 17.3833 22H18.25C18.6642 22 19 21.6642 19 21.25C19 20.8358 18.6642 20.5 18.25 20.5H17.3833C16.9691 20.5 16.6333 20.8358 16.6333 21.25ZM12.2803 18.7803C11.9874 19.0732 11.5126 19.0732 11.2197 18.7803L6.21967 13.7803C5.92678 13.4874 5.92678 13.0126 6.21967 12.7197C6.51256 12.4268 6.98744 12.4268 7.28033 12.7197L11 16.4393V5.75C11 5.33579 11.3358 5 11.75 5C12.1642 5 12.5 5.33579 12.5 5.75V16.4393L16.2197 12.7197C16.5126 12.4268 16.9874 12.4268 17.2803 12.7197C17.5732 13.0126 17.5732 13.4874 17.2803 13.7803L12.2803 18.7803Z" /></svg>
icon:margin_inner = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.23826 7.45171C5.93545 7.73434 5.91908 8.20893 6.20171 8.51174L8.52409 11H2.75C2.33579 11 2 11.3358 2 11.75C2 12.1642 2.33579 12.5 2.75 12.5H8.52409L6.20171 14.9883C5.91908 15.2911 5.93545 15.7657 6.23826 16.0483C6.54107 16.3309 7.01567 16.3146 7.29829 16.0117L10.7983 12.2617C11.0672 11.9736 11.0672 11.5264 10.7983 11.2383L7.29829 7.48826C7.01567 7.18545 6.54107 7.16909 6.23826 7.45171ZM17.7617 7.45171C18.0646 7.73434 18.0809 8.20893 17.7983 8.51174L15.4759 11H21.25C21.6642 11 22 11.3358 22 11.75C22 12.1642 21.6642 12.5 21.25 12.5H15.4759L17.7983 14.9883C18.0809 15.2911 18.0646 15.7657 17.7617 16.0483C17.4589 16.3309 16.9843 16.3146 16.7017 16.0117L13.2017 12.2617C12.9328 11.9736 12.9328 11.5264 13.2017 11.2383L16.7017 7.48826C16.9843 7.18545 17.4589 7.16909 17.7617 7.45171Z" /></svg>
icon:margin_left = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M2.75 4.5C2.33579 4.5 2 4.83579 2 5.25V6.11667C2 6.53088 2.33579 6.86667 2.75 6.86667C3.16421 6.86667 3.5 6.53088 3.5 6.11667L3.5 5.25C3.5 4.83579 3.16421 4.5 2.75 4.5ZM2.75 7.96667C2.33579 7.96667 2 8.30245 2 8.71667V10.45C2 10.8642 2.33579 11.2 2.75 11.2C3.16421 11.2 3.5 10.8642 3.5 10.45V8.71667C3.5 8.30245 3.16421 7.96667 2.75 7.96667ZM2.75 12.3C2.33579 12.3 2 12.6358 2 13.05V14.7833C2 15.1975 2.33579 15.5333 2.75 15.5333C3.16421 15.5333 3.5 15.1975 3.5 14.7833L3.5 13.05C3.5 12.6358 3.16421 12.3 2.75 12.3ZM2.75 16.6333C2.33579 16.6333 2 16.9691 2 17.3833V18.25C2 18.6642 2.33579 19 2.75 19C3.16421 19 3.5 18.6642 3.5 18.25V17.3833C3.5 16.9691 3.16421 16.6333 2.75 16.6333ZM21.25 4.5C20.8358 4.5 20.5 4.83579 20.5 5.25V18.25C20.5 18.6642 20.8358 19 21.25 19C21.6642 19 22 18.6642 22 18.25V5.25C22 4.83579 21.6642 4.5 21.25 4.5ZM5.21967 12.2803C4.92678 11.9874 4.92678 11.5126 5.21967 11.2197L10.2197 6.21967C10.5126 5.92678 10.9874 5.92678 11.2803 6.21967C11.5732 6.51256 11.5732 6.98744 11.2803 7.28033L7.56066 11L18.25 11C18.6642 11 19 11.3358 19 11.75C19 12.1642 18.6642 12.5 18.25 12.5L7.56066 12.5L11.2803 16.2197C11.5732 16.5126 11.5732 16.9874 11.2803 17.2803C10.9874 17.5732 10.5126 17.5732 10.2197 17.2803L5.21967 12.2803Z" /></svg>
icon:margin_outer = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.76174 7.45171C7.06455 7.73434 7.08092 8.20893 6.79829 8.51174L4.47591 11H10.25C10.6642 11 11 11.3358 11 11.75C11 12.1642 10.6642 12.5 10.25 12.5H4.47591L6.79829 14.9883C7.08092 15.2911 7.06455 15.7657 6.76174 16.0483C6.45893 16.3309 5.98433 16.3146 5.70171 16.0117L2.20171 12.2617C1.93276 11.9736 1.93276 11.5264 2.20171 11.2383L5.70171 7.48826C5.98433 7.18545 6.45893 7.16909 6.76174 7.45171ZM17.2383 7.45171C16.9354 7.73434 16.9191 8.20893 17.2017 8.51174L19.5241 11H13.75C13.3358 11 13 11.3358 13 11.75C13 12.1642 13.3358 12.5 13.75 12.5H19.5241L17.2017 14.9883C16.9191 15.2911 16.9354 15.7657 17.2383 16.0483C17.5411 16.3309 18.0157 16.3146 18.2983 16.0117L21.7983 12.2617C22.0672 11.9736 22.0672 11.5264 21.7983 11.2383L18.2983 7.48826C18.0157 7.18545 17.5411 7.16909 17.2383 7.45171Z" /></svg>
icon:margin_right = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M2.75 4.5C3.16421 4.5 3.5 4.83579 3.5 5.25L3.5 18.25C3.5 18.6642 3.16421 19 2.75 19C2.33579 19 2 18.6642 2 18.25V5.25C2 4.83579 2.33579 4.5 2.75 4.5ZM21.25 4.5C21.6642 4.5 22 4.83579 22 5.25V6.11667C22 6.53088 21.6642 6.86667 21.25 6.86667C20.8358 6.86667 20.5 6.53088 20.5 6.11667V5.25C20.5 4.83579 20.8358 4.5 21.25 4.5ZM21.25 7.96667C21.6642 7.96667 22 8.30245 22 8.71667V10.45C22 10.8642 21.6642 11.2 21.25 11.2C20.8358 11.2 20.5 10.8642 20.5 10.45V8.71667C20.5 8.30245 20.8358 7.96667 21.25 7.96667ZM21.25 12.3C21.6642 12.3 22 12.6358 22 13.05V14.7833C22 15.1975 21.6642 15.5333 21.25 15.5333C20.8358 15.5333 20.5 15.1975 20.5 14.7833V13.05C20.5 12.6358 20.8358 12.3 21.25 12.3ZM21.25 16.6333C21.6642 16.6333 22 16.9691 22 17.3833V18.25C22 18.6642 21.6642 19 21.25 19C20.8358 19 20.5 18.6642 20.5 18.25V17.3833C20.5 16.9691 20.8358 16.6333 21.25 16.6333ZM18.7803 12.2803C19.0732 11.9874 19.0732 11.5126 18.7803 11.2197L13.7803 6.21967C13.4874 5.92678 13.0126 5.92678 12.7197 6.21967C12.4268 6.51256 12.4268 6.98744 12.7197 7.28033L16.4393 11L5.75 11C5.33579 11 5 11.3358 5 11.75C5 12.1642 5.33579 12.5 5.75 12.5L16.4393 12.5L12.7197 16.2197C12.4268 16.5126 12.4268 16.9874 12.7197 17.2803C13.0126 17.5732 13.4874 17.5732 13.7803 17.2803L18.7803 12.2803Z" /></svg>
icon:margin_top = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M4.5 2.75C4.5 2.33579 4.83579 2 5.25 2H6.11667C6.53088 2 6.86667 2.33579 6.86667 2.75C6.86667 3.16421 6.53088 3.5 6.11667 3.5H5.25C4.83579 3.5 4.5 3.16421 4.5 2.75ZM7.96667 2.75C7.96667 2.33579 8.30245 2 8.71667 2H10.45C10.8642 2 11.2 2.33579 11.2 2.75C11.2 3.16421 10.8642 3.5 10.45 3.5H8.71667C8.30245 3.5 7.96667 3.16421 7.96667 2.75ZM12.3 2.75C12.3 2.33579 12.6358 2 13.05 2H14.7833C15.1975 2 15.5333 2.33579 15.5333 2.75C15.5333 3.16421 15.1975 3.5 14.7833 3.5H13.05C12.6358 3.5 12.3 3.16421 12.3 2.75ZM16.6333 2.75C16.6333 2.33579 16.9691 2 17.3833 2H18.25C18.6642 2 19 2.33579 19 2.75C19 3.16421 18.6642 3.5 18.25 3.5H17.3833C16.9691 3.5 16.6333 3.16421 16.6333 2.75ZM4.5 21.25C4.5 20.8358 4.83579 20.5 5.25 20.5H18.25C18.6642 20.5 19 20.8358 19 21.25C19 21.6642 18.6642 22 18.25 22H5.25C4.83579 22 4.5 21.6642 4.5 21.25ZM12.2803 5.21967C11.9874 4.92678 11.5126 4.92678 11.2197 5.21967L6.21967 10.2197C5.92678 10.5126 5.92678 10.9874 6.21967 11.2803C6.51256 11.5732 6.98744 11.5732 7.28033 11.2803L11 7.56066V18.25C11 18.6642 11.3358 19 11.75 19C12.1642 19 12.5 18.6642 12.5 18.25V7.56066L16.2197 11.2803C16.5126 11.5732 16.9874 11.5732 17.2803 11.2803C17.5732 10.9874 17.5732 10.5126 17.2803 10.2197L12.2803 5.21967Z" /></svg>
icon:maximise = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M19.25 4C19.6642 4 20 4.33579 20 4.75V12.25C20 12.6642 19.6642 13 19.25 13C18.8358 13 18.5 12.6642 18.5 12.25V6.56055L6.56055 18.5H12.25C12.6642 18.5 13 18.8358 13 19.25C13 19.6642 12.6642 20 12.25 20H4.75C4.33579 20 4 19.6642 4 19.25V11.75C4 11.3358 4.33579 11 4.75 11C5.16421 11 5.5 11.3358 5.5 11.75V17.4395L17.4395 5.5H11.75C11.3358 5.5 11 5.16421 11 4.75C11 4.33579 11.3358 4 11.75 4H19.25Z" /></svg>
icon:minimise = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M10.25 13C10.6642 13 11 13.3358 11 13.75V21.25C11 21.6642 10.6642 22 10.25 22C9.83579 22 9.5 21.6642 9.5 21.25V15.5605L3.28027 21.7803C2.98738 22.0732 2.51262 22.0732 2.21973 21.7803C1.92683 21.4874 1.92683 21.0126 2.21973 20.7197L8.43945 14.5H2.75C2.33579 14.5 2 14.1642 2 13.75C2 13.3358 2.33579 13 2.75 13H10.25ZM20.7197 2.21973C21.0126 1.92683 21.4874 1.92683 21.7803 2.21973C22.0732 2.51262 22.0732 2.98738 21.7803 3.28027L15.5605 9.5H21.25C21.6642 9.5 22 9.83579 22 10.25C22 10.6642 21.6642 11 21.25 11H13.75C13.3358 11 13 10.6642 13 10.25V2.75C13 2.33579 13.3358 2 13.75 2C14.1642 2 14.5 2.33579 14.5 2.75V8.43945L20.7197 2.21973Z" /></svg>
icon:more_arrow = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M11.0731 18.839C10.2649 19.5462 9 18.9722 9 17.8983L9 6.10204C9 5.02809 10.2649 4.45412 11.0731 5.16132L17.3838 10.6831C18.1806 11.3804 18.1806 12.6199 17.3838 13.3172L11.0731 18.839ZM10.5 17.3473L16.396 12.1883C16.5099 12.0887 16.5099 11.9116 16.396 11.812L10.5 6.65298L10.5 17.3473Z" /></svg>
icon:more_vertical = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 7.75C11.0335 7.75 10.25 6.9665 10.25 6C10.25 5.0335 11.0335 4.25 12 4.25C12.9665 4.25 13.75 5.0335 13.75 6C13.75 6.9665 12.9665 7.75 12 7.75ZM12 13.75C11.0335 13.75 10.25 12.9665 10.25 12C10.25 11.0335 11.0335 10.25 12 10.25C12.9665 10.25 13.75 11.0335 13.75 12C13.75 12.9665 12.9665 13.75 12 13.75ZM10.25 18C10.25 18.9665 11.0335 19.75 12 19.75C12.9665 19.75 13.75 18.9665 13.75 18C13.75 17.0335 12.9665 16.25 12 16.25C11.0335 16.25 10.25 17.0335 10.25 18Z" /></svg>
icon:noncheckable = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3 6.25C3 4.45507 4.45507 3 6.25 3H17.75C19.5449 3 21 4.45507 21 6.25V17.75C21 19.5449 19.5449 21 17.75 21H6.25C4.45507 21 3 19.5449 3 17.75V6.25ZM6.25 4.5C5.2835 4.5 4.5 5.2835 4.5 6.25V17.75C4.5 18.7165 5.2835 19.5 6.25 19.5H17.75C18.7165 19.5 19.5 18.7165 19.5 17.75V6.25C19.5 5.2835 18.7165 4.5 17.75 4.5H6.25Z" /></svg>
icon:panel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M6.25 3C4.45507 3 3 4.45507 3 6.25V17.75C3 19.5449 4.45507 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM4.5 6.25C4.5 5.2835 5.2835 4.5 6.25 4.5H17.75C18.7165 4.5 19.5 5.2835 19.5 6.25V12H4.5V6.25Z" /></svg>
icon:pin = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M16.2425 2.93189L21.0682 7.75765C22.3955 9.08491 22.0324 11.3224 20.3535 12.1619L15.4826 14.5973C15.3073 14.685 15.1732 14.8379 15.1092 15.0232L13.6699 19.1895C13.3684 20.0622 12.2574 20.3181 11.6045 19.6653L8.50002 16.5607L4.06074 21.0001H3L3.00008 19.9394L7.43936 15.5001L4.33487 12.3956C3.682 11.7427 3.93791 10.6317 4.81061 10.3302L8.97688 8.89096C9.16223 8.82694 9.31512 8.69287 9.40281 8.51748L11.8382 3.6466C12.6777 1.96772 14.9152 1.60462 16.2425 2.93189ZM20.0076 8.81831L15.1818 3.99255C14.5785 3.38924 13.5614 3.55429 13.1799 4.31742L10.7445 9.18829C10.4814 9.71446 10.0227 10.1167 9.46666 10.3087L5.67812 11.6175L12.3826 18.322L13.6914 14.5335C13.8835 13.9774 14.2857 13.5188 14.8118 13.2557L19.6827 10.8202C20.4458 10.4387 20.6109 9.42161 20.0076 8.81831Z" /></svg>
icon:project_copy = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M5.5028 4.62704L5.5 6.75V17.2542C5.5 19.0491 6.95507 20.5042 8.75 20.5042L17.3663 20.5045C17.0573 21.3782 16.224 22.0042 15.2444 22.0042H8.75C6.12665 22.0042 4 19.8776 4 17.2542V6.75C4 5.76929 4.62745 4.93512 5.5028 4.62704ZM13.1284 2C13.7254 2 14.2979 2.23723 14.7199 2.65947L19.3383 7.28054C19.7599 7.70246 19.9968 8.27455 19.9968 8.87107V17.2542C19.9968 18.4969 18.9895 19.5042 17.7468 19.5042H8.75241C7.50977 19.5042 6.50241 18.4969 6.50241 17.2542V4.25C6.50241 3.00736 7.50977 2 8.75241 2H13.1284ZM12.9994 3.5H8.75241C8.33819 3.5 8.00241 3.83579 8.00241 4.25V17.2542C8.00241 17.6684 8.33819 18.0042 8.75241 18.0042H17.7468C18.161 18.0042 18.4968 17.6684 18.4968 17.2542L18.4964 9.003L15.25 9.00389C14.0591 9.00389 13.0844 8.07873 13.0052 6.90794L13 6.75389L12.9994 3.5ZM14.4994 4.561L14.5 6.75389C14.5 7.13359 14.7822 7.44738 15.1482 7.49704L15.25 7.50389L17.4404 7.503L14.4994 4.561Z" /></svg>
icon:quote = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M8 5C9.62875 5 10.9526 6.29802 10.9971 7.91602C11.0002 7.94363 11.0029 7.97156 11.0029 8C11.0029 10.9327 9.936 13.3818 8.88965 15.0811C8.3651 15.9329 7.84001 16.6051 7.44434 17.0664C7.24631 17.2973 7.0797 17.4767 6.96094 17.5996C6.9017 17.6609 6.85398 17.7081 6.82031 17.7412C6.80346 17.7578 6.78999 17.771 6.78027 17.7803C6.77548 17.7849 6.77151 17.7892 6.76855 17.792C6.76721 17.7933 6.76558 17.794 6.76465 17.7949L6.76367 17.7969C6.46146 18.08 5.98635 18.0648 5.70312 17.7627C5.41997 17.4605 5.4352 16.9863 5.7373 16.7031C5.73816 16.7023 5.73972 16.7006 5.74219 16.6982C5.74761 16.693 5.75709 16.6841 5.76953 16.6719C5.79442 16.6474 5.83279 16.6084 5.88281 16.5566C5.98286 16.4531 6.12878 16.2961 6.30566 16.0898C6.6604 15.6762 7.1363 15.067 7.6123 14.2939C8.19982 13.3398 8.77816 12.1484 9.1377 10.7754C8.78672 10.9194 8.40287 11 8 11C6.34315 11 5 9.65685 5 8C5 6.34315 6.34315 5 8 5ZM16 5C17.6288 5 18.9526 6.29802 18.9971 7.91602C19.0002 7.94363 19.0029 7.97156 19.0029 8C19.0029 10.9327 17.936 13.3818 16.8896 15.0811C16.3651 15.9329 15.84 16.6051 15.4443 17.0664C15.2463 17.2973 15.0797 17.4767 14.9609 17.5996C14.9017 17.6609 14.854 17.7081 14.8203 17.7412C14.8035 17.7578 14.79 17.771 14.7803 17.7803C14.7755 17.7849 14.7715 17.7892 14.7686 17.792C14.7672 17.7933 14.7656 17.794 14.7646 17.7949L14.7637 17.7969C14.4615 18.08 13.9863 18.0648 13.7031 17.7627C13.42 17.4605 13.4352 16.9863 13.7373 16.7031C13.7382 16.7023 13.7397 16.7006 13.7422 16.6982C13.7476 16.693 13.7571 16.6841 13.7695 16.6719C13.7944 16.6474 13.8328 16.6084 13.8828 16.5566C13.9829 16.4531 14.1288 16.2961 14.3057 16.0898C14.6604 15.6762 15.1363 15.067 15.6123 14.2939C16.1998 13.3398 16.7782 12.1484 17.1377 10.7754C16.7867 10.9194 16.4029 11 16 11C14.3431 11 13 9.65685 13 8C13 6.34315 14.3431 5 16 5ZM8 6.5C7.17157 6.5 6.5 7.17157 6.5 8C6.5 8.82843 7.17157 9.5 8 9.5C8.82843 9.5 9.5 8.82843 9.5 8C9.5 7.17157 8.82843 6.5 8 6.5ZM16 6.5C15.1716 6.5 14.5 7.17157 14.5 8C14.5 8.82843 15.1716 9.5 16 9.5C16.8284 9.5 17.5 8.82843 17.5 8C17.5 7.17157 16.8284 6.5 16 6.5Z" /></svg>
icon:refresh = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 4.5C7.85786 4.5 4.5 7.85786 4.5 12C4.5 16.1421 7.85786 19.5 12 19.5C16.1421 19.5 19.5 16.1421 19.5 12C19.5 11.6236 19.4723 11.2538 19.4188 10.8923C19.3515 10.4382 19.6839 10 20.1429 10C20.5138 10 20.839 10.2562 20.8953 10.6228C20.9642 11.0718 21 11.5317 21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C14.3051 3 16.4077 3.86656 18 5.29168V4.25C18 3.83579 18.3358 3.5 18.75 3.5C19.1642 3.5 19.5 3.83579 19.5 4.25V7.25C19.5 7.66421 19.1642 8 18.75 8H15.75C15.3358 8 15 7.66421 15 7.25C15 6.83579 15.3358 6.5 15.75 6.5H17.0991C15.7609 5.25883 13.9691 4.5 12 4.5Z" /></svg>
icon:remove = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3.75391 12.5H20.2458C20.66 12.5 20.9958 12.1642 20.9958 11.75C20.9958 11.3358 20.66 11 20.2458 11H3.75391C3.33969 11 3.00391 11.3358 3.00391 11.75C3.00391 12.1642 3.33969 12.5 3.75391 12.5Z" /></svg>
icon:revert = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 4.5C16.1421 4.5 19.5 7.85786 19.5 12C19.5 16.1421 16.1421 19.5 12 19.5C7.85786 19.5 4.5 16.1421 4.5 12C4.5 11.6236 4.52772 11.2538 4.58123 10.8923C4.64845 10.4382 4.31609 10 3.85708 10C3.48623 10 3.161 10.2562 3.10471 10.6228C3.03576 11.0718 3 11.5317 3 12C3 16.9706 7.02944 21 12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C9.69494 3 7.59227 3.86656 6 5.29168V4.25C6 3.83579 5.66421 3.5 5.25 3.5C4.83579 3.5 4.5 3.83579 4.5 4.25V7.25C4.5 7.66421 4.83579 8 5.25 8H8.25C8.66421 8 9 7.66421 9 7.25C9 6.83579 8.66421 6.5 8.25 6.5H6.90093C8.23907 5.25883 10.0309 4.5 12 4.5Z" /></svg>
icon:settings = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12.0122 2.25C12.7462 2.25846 13.4773 2.34326 14.1937 2.50304C14.5064 2.57279 14.7403 2.83351 14.7758 3.15196L14.946 4.67881C15.0231 5.37986 15.615 5.91084 16.3206 5.91158C16.5103 5.91188 16.6979 5.87238 16.8732 5.79483L18.2738 5.17956C18.5651 5.05159 18.9055 5.12136 19.1229 5.35362C20.1351 6.43464 20.8889 7.73115 21.3277 9.14558C21.4223 9.45058 21.3134 9.78203 21.0564 9.9715L19.8149 10.8866C19.4607 11.1468 19.2516 11.56 19.2516 11.9995C19.2516 12.4389 19.4607 12.8521 19.8157 13.1129L21.0582 14.0283C21.3153 14.2177 21.4243 14.5492 21.3297 14.8543C20.8911 16.2685 20.1377 17.5649 19.1261 18.6461C18.9089 18.8783 18.5688 18.9483 18.2775 18.8206L16.8712 18.2045C16.4688 18.0284 16.0068 18.0542 15.6265 18.274C15.2463 18.4937 14.9933 18.8812 14.945 19.3177L14.7759 20.8444C14.741 21.1592 14.5122 21.4182 14.204 21.4915C12.7556 21.8361 11.2465 21.8361 9.79803 21.4915C9.48991 21.4182 9.26105 21.1592 9.22618 20.8444L9.05736 19.32C9.00777 18.8843 8.75434 18.498 8.37442 18.279C7.99451 18.06 7.5332 18.0343 7.1322 18.2094L5.72557 18.8256C5.43422 18.9533 5.09403 18.8833 4.87678 18.6509C3.86462 17.5685 3.11119 16.2705 2.6732 14.8548C2.57886 14.5499 2.68786 14.2186 2.94485 14.0293L4.18818 13.1133C4.54232 12.8531 4.75147 12.4399 4.75147 12.0005C4.75147 11.561 4.54232 11.1478 4.18771 10.8873L2.94516 9.97285C2.6878 9.78345 2.5787 9.45178 2.67337 9.14658C3.11212 7.73215 3.86594 6.43564 4.87813 5.35462C5.09559 5.12236 5.43594 5.05259 5.72724 5.18056L7.12762 5.79572C7.53056 5.97256 7.9938 5.94585 8.37577 5.72269C8.75609 5.50209 9.00929 5.11422 9.05817 4.67764L9.22824 3.15196C9.26376 2.83335 9.49786 2.57254 9.8108 2.50294C10.5281 2.34342 11.26 2.25865 12.0122 2.25ZM12.0124 3.7499C11.5583 3.75524 11.1056 3.79443 10.6578 3.86702L10.5489 4.84418C10.4471 5.75368 9.92003 6.56102 9.13042 7.01903C8.33597 7.48317 7.36736 7.53903 6.52458 7.16917L5.62629 6.77456C5.05436 7.46873 4.59914 8.25135 4.27852 9.09168L5.07632 9.67879C5.81513 10.2216 6.25147 11.0837 6.25147 12.0005C6.25147 12.9172 5.81513 13.7793 5.0771 14.3215L4.27805 14.9102C4.59839 15.752 5.05368 16.5361 5.626 17.2316L6.53113 16.8351C7.36923 16.4692 8.33124 16.5227 9.12353 16.9794C9.91581 17.4361 10.4443 18.2417 10.548 19.1526L10.657 20.1365C11.5466 20.2878 12.4555 20.2878 13.3451 20.1365L13.4541 19.1527C13.5549 18.2421 14.0828 17.4337 14.876 16.9753C15.6692 16.5168 16.6332 16.463 17.4728 16.8305L18.3772 17.2267C18.949 16.5323 19.4041 15.7495 19.7247 14.909L18.9267 14.3211C18.1879 13.7783 17.7516 12.9162 17.7516 11.9995C17.7516 11.0827 18.1879 10.2206 18.9258 9.67847L19.7227 9.09109C19.4021 8.25061 18.9468 7.46784 18.3748 6.77356L17.4783 7.16737C17.113 7.32901 16.7178 7.4122 16.3187 7.41158C14.849 7.41004 13.6155 6.30355 13.4551 4.84383L13.3462 3.8667C12.9007 3.7942 12.4526 3.75512 12.0124 3.7499ZM11.9997 8.24995C14.0708 8.24995 15.7497 9.92888 15.7497 12C15.7497 14.071 14.0708 15.75 11.9997 15.75C9.92863 15.75 8.2497 14.071 8.2497 12C8.2497 9.92888 9.92863 8.24995 11.9997 8.24995ZM11.9997 9.74995C10.7571 9.74995 9.7497 10.7573 9.7497 12C9.7497 13.2426 10.7571 14.25 11.9997 14.25C13.2423 14.25 14.2497 13.2426 14.2497 12C14.2497 10.7573 13.2423 9.74995 11.9997 9.74995Z" /></svg>
icon:stats = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M18.251 3C17.0089 3 16.002 4.00695 16.002 5.24908V18.7509C16.002 19.9931 17.0089 21 18.251 21C19.4932 21 20.5001 19.9931 20.5001 18.7509V5.24908C20.5001 4.00695 19.4932 3 18.251 3ZM11.751 7C10.5089 7 9.50195 8.00695 9.50195 9.24908V18.7509C9.50195 19.9931 10.5089 21 11.751 21C12.9932 21 14.0001 19.9931 14.0001 18.7509V9.24908C14.0001 8.00695 12.9932 7 11.751 7ZM5.25104 11C4.0089 11 3.00195 12.0069 3.00195 13.2491V18.7509C3.00195 19.9931 4.0089 21 5.25104 21C6.49317 21 7.50012 19.9931 7.50012 18.7509V13.2491C7.50012 12.0069 6.49317 11 5.25104 11ZM18.251 4.5C18.6647 4.5 19.0001 4.83538 19.0001 5.24908V18.7509C19.0001 19.1646 18.6647 19.5 18.251 19.5C17.8373 19.5 17.502 19.1646 17.502 18.7509V5.24908C17.502 4.83538 17.8373 4.5 18.251 4.5ZM11.751 8.5C12.1647 8.5 12.5001 8.83537 12.5001 9.24908V18.7509C12.5001 19.1646 12.1647 19.5 11.751 19.5C11.3373 19.5 11.002 19.1646 11.002 18.7509V9.24908C11.002 8.83537 11.3373 8.5 11.751 8.5ZM5.25104 12.5C5.66474 12.5 6.00012 12.8354 6.00012 13.2491V18.7509C6.00012 19.1646 5.66474 19.5 5.25104 19.5C4.83733 19.5 4.50195 19.1646 4.50195 18.7509V13.2491C4.50195 12.8354 4.83733 12.5 5.25104 12.5Z" /></svg>
icon:text = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M2 5.75C2 5.33579 2.33579 5 2.75 5H21.25C21.6642 5 22 5.33579 22 5.75C22 6.16421 21.6642 6.5 21.25 6.5H2.75C2.33579 6.5 2 6.16421 2 5.75ZM2 18.75C2 18.3358 2.33579 18 2.75 18H21.25C21.6642 18 22 18.3358 22 18.75C22 19.1642 21.6642 19.5 21.25 19.5H2.75C2.33579 19.5 2 19.1642 2 18.75ZM2.75 11.5C2.33579 11.5 2 11.8358 2 12.25C2 12.6642 2.33579 13 2.75 13H21.25C21.6642 13 22 12.6642 22 12.25C22 11.8358 21.6642 11.5 21.25 11.5H2.75Z" /></svg>
icon:timer_off = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M3.28034 2.21968C2.98745 1.92678 2.51257 1.92677 2.21968 2.21966C1.92678 2.51255 1.92677 2.98743 2.21966 3.28032L6.21321 7.27395C4.54413 8.82598 3.5 11.041 3.5 13.5C3.5 18.1944 7.30558 22 12 22C14.4589 22 16.6739 20.9559 18.2259 19.2869L20.7194 21.7805C21.0123 22.0734 21.4872 22.0734 21.7801 21.7805C22.073 21.4876 22.073 21.0127 21.7801 20.7198L3.28034 2.21968ZM17.1644 18.2254C15.8846 19.6233 14.0447 20.5 12 20.5C8.13401 20.5 5 17.366 5 13.5C5 11.4553 5.8767 9.61529 7.27471 8.33547L11.25 12.3108V13.25L11.2568 13.3518C11.3065 13.7178 11.6203 14 12 14C12.2554 14 12.481 13.8723 12.6164 13.6773L17.1644 18.2254ZM11.4367 8.25482L12.75 9.56816V8.74999L12.7432 8.64822C12.6935 8.28215 12.3797 7.99999 12 7.99999C11.7756 7.99999 11.5741 8.09858 11.4367 8.25482ZM19 13.5C19 14.203 18.8964 14.8817 18.7036 15.5219L19.8784 16.6967C20.2792 15.7099 20.5 14.6307 20.5 13.5C20.5 8.80557 16.6944 4.99999 12 4.99999C10.8693 4.99999 9.79024 5.22076 8.80345 5.62153L9.97828 6.79638C10.6184 6.6036 11.2971 6.49999 12 6.49999C15.866 6.49999 19 9.634 19 13.5ZM19.1472 5.1137L19.2298 5.17355L20.3882 6.13772C20.7066 6.40271 20.7498 6.87561 20.4849 7.19398C20.2419 7.48581 19.8243 7.54649 19.5112 7.35047L19.4286 7.29063L18.2702 6.32645C17.9518 6.06146 17.9086 5.58856 18.1735 5.27019C18.4165 4.97836 18.8341 4.91768 19.1472 5.1137ZM14.25 2.49999C14.6642 2.49999 15 2.83578 15 3.24999C15 3.62969 14.7178 3.94348 14.3518 3.99315L14.25 3.99999H9.75C9.33579 3.99999 9 3.66421 9 3.24999C9 2.8703 9.28215 2.5565 9.64823 2.50684L9.75 2.49999H14.25Z" /></svg>
icon:timer = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M12 5C16.6944 5 20.5 8.80558 20.5 13.5C20.5 18.1944 16.6944 22 12 22C7.30558 22 3.5 18.1944 3.5 13.5C3.5 8.80558 7.30558 5 12 5ZM12 6.5C8.13401 6.5 5 9.63401 5 13.5C5 17.366 8.13401 20.5 12 20.5C15.866 20.5 19 17.366 19 13.5C19 9.63401 15.866 6.5 12 6.5ZM12 8C12.3797 8 12.6935 8.28215 12.7432 8.64823L12.75 8.75V13.25C12.75 13.6642 12.4142 14 12 14C11.6203 14 11.3065 13.7178 11.2568 13.3518L11.25 13.25V8.75C11.25 8.33579 11.5858 8 12 8ZM19.1472 5.11371L19.2298 5.17355L20.3882 6.13773C20.7066 6.40272 20.7498 6.87562 20.4849 7.19398C20.2419 7.48581 19.8243 7.54649 19.5112 7.35047L19.4286 7.29063L18.2702 6.32645C17.9518 6.06146 17.9086 5.58856 18.1735 5.2702C18.4165 4.97837 18.8341 4.91769 19.1472 5.11371ZM14.25 2.5C14.6642 2.5 15 2.83579 15 3.25C15 3.6297 14.7178 3.94349 14.3518 3.99315L14.25 4H9.75C9.33579 4 9 3.66421 9 3.25C9 2.8703 9.28215 2.55651 9.64823 2.50685L9.75 2.5H14.25Z" /></svg>
icon:unchecked = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M8.21967 8.21967C8.51256 7.92678 8.98744 7.92678 9.28033 8.21967L12 10.9393L14.7197 8.21967C15.0126 7.92678 15.4874 7.92678 15.7803 8.21967C16.0732 8.51256 16.0732 8.98744 15.7803 9.28033L13.0607 12L15.7803 14.7197C16.0732 15.0126 16.0732 15.4874 15.7803 15.7803C15.4874 16.0732 15.0126 16.0732 14.7197 15.7803L12 13.0607L9.28033 15.7803C8.98744 16.0732 8.51256 16.0732 8.21967 15.7803C7.92678 15.4874 7.92678 15.0126 8.21967 14.7197L10.9393 12L8.21967 9.28033C7.92678 8.98744 7.92678 8.51256 8.21967 8.21967ZM6.25 3C4.45507 3 3 4.45507 3 6.25V17.75C3 19.5449 4.45507 21 6.25 21H17.75C19.5449 21 21 19.5449 21 17.75V6.25C21 4.45507 19.5449 3 17.75 3H6.25ZM4.5 6.25C4.5 5.2835 5.2835 4.5 6.25 4.5H17.75C18.7165 4.5 19.5 5.2835 19.5 6.25V17.75C19.5 18.7165 18.7165 19.5 17.75 19.5H6.25C5.2835 19.5 4.5 18.7165 4.5 17.75V6.25Z" /></svg>
icon:view = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24" fill="#000000"><path d="M11.9999 9.00462C14.209 9.00462 15.9999 10.7955 15.9999 13.0046C15.9999 15.2138 14.209 17.0046 11.9999 17.0046C9.79073 17.0046 7.99987 15.2138 7.99987 13.0046C7.99987 10.7955 9.79073 9.00462 11.9999 9.00462ZM11.9999 10.5046C10.6192 10.5046 9.49987 11.6239 9.49987 13.0046C9.49987 14.3853 10.6192 15.5046 11.9999 15.5046C13.3806 15.5046 14.4999 14.3853 14.4999 13.0046C14.4999 11.6239 13.3806 10.5046 11.9999 10.5046ZM11.9999 5.5C16.6134 5.5 20.596 8.65001 21.701 13.0644C21.8016 13.4662 21.5574 13.8735 21.1556 13.9741C20.7537 14.0746 20.3465 13.8305 20.2459 13.4286C19.307 9.67796 15.9212 7 11.9999 7C8.07681 7 4.68997 9.68026 3.75273 13.4332C3.65237 13.835 3.24523 14.0794 2.84336 13.9791C2.44149 13.8787 2.19707 13.4716 2.29743 13.0697C3.40052 8.65272 7.38436 5.5 11.9999 5.5Z" /></svg>

View File

@@ -0,0 +1,144 @@
# This file is automatically generated. Do not edit.
# Meta
meta:name = Lucide
meta:author = Cole Bemis, Lucide Contributors
meta:license = ISC/MIT License
# Icons
icon:alert_error = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" /><path d="M12 8v4" /><path d="M12 16h.01" /></svg>
icon:alert_info = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><path d="M12 16v-4" /><path d="M12 8h.01" /></svg>
icon:alert_question = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719" /><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" /><path d="M12 17h.01" /></svg>
icon:alert_warn = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" /><path d="M12 9v4" /><path d="M12 17h.01" /></svg>
icon:cls_archive = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="5" x="2" y="3" rx="1" /><path d="M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8" /><path d="M10 12h4" /></svg>
icon:cls_character = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" /><path d="M16 3.128a4 4 0 0 1 0 7.744" /><path d="M22 21v-2a4 4 0 0 0-3-3.87" /><circle cx="9" cy="7" r="4" /></svg>
icon:cls_custom = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z" /></svg>
icon:cls_entity = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 21v-3a2 2 0 0 0-4 0v3" /><path d="M18 12h.01" /><path d="M18 16h.01" /><path d="M22 7a1 1 0 0 0-1-1h-2a2 2 0 0 1-1.143-.359L13.143 2.36a2 2 0 0 0-2.286-.001L6.143 5.64A2 2 0 0 1 5 6H3a1 1 0 0 0-1 1v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2z" /><path d="M6 12h.01" /><path d="M6 16h.01" /><circle cx="12" cy="10" r="2" /></svg>
icon:cls_none = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="18" x="3" y="3" rx="2" /></svg>
icon:cls_novel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20" /></svg>
icon:cls_object = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m15 12-9.373 9.373a1 1 0 0 1-3.001-3L12 9" /><path d="m18 15 4-4" /><path d="m21.5 11.5-1.914-1.914A2 2 0 0 1 19 8.172v-.344a2 2 0 0 0-.586-1.414l-1.657-1.657A6 6 0 0 0 12.516 3H9l1.243 1.243A6 6 0 0 1 12 8.485V10l2 2h1.172a2 2 0 0 1 1.414.586L18.5 14.5" /></svg>
icon:cls_plot = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 18a2 2 0 0 0-4 0" /><path d="m19 11-2.11-6.657a2 2 0 0 0-2.752-1.148l-1.276.61A2 2 0 0 1 12 4H8.5a2 2 0 0 0-1.925 1.456L5 11" /><path d="M2 11h20" /><circle cx="17" cy="18" r="3" /><circle cx="7" cy="18" r="3" /></svg>
icon:cls_template = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 17h1.5" /><path d="M12 22h1.5" /><path d="M12 2h1.5" /><path d="M17.5 22H19a1 1 0 0 0 1-1" /><path d="M17.5 2H19a1 1 0 0 1 1 1v1.5" /><path d="M20 14v3h-2.5" /><path d="M20 8.5V10" /><path d="M4 10V8.5" /><path d="M4 19.5V14" /><path d="M4 4.5A2.5 2.5 0 0 1 6.5 2H8" /><path d="M8 22H6.5a1 1 0 0 1 0-5H8" /></svg>
icon:cls_timeline = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" /><path d="M3 3v5h5" /><path d="M12 7v5l4 2" /></svg>
icon:cls_trash = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 11v6" /><path d="M14 11v6" /><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6" /><path d="M3 6h18" /><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" /></svg>
icon:cls_world = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.54 15H17a2 2 0 0 0-2 2v4.54" /><path d="M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17" /><path d="M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05" /><circle cx="12" cy="12" r="10" /></svg>
icon:key_pov = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16.051 12.616a1 1 0 0 1 1.909.024l.737 1.452a1 1 0 0 0 .737.535l1.634.256a1 1 0 0 1 .588 1.806l-1.172 1.168a1 1 0 0 0-.282.866l.259 1.613a1 1 0 0 1-1.541 1.134l-1.465-.75a1 1 0 0 0-.912 0l-1.465.75a1 1 0 0 1-1.539-1.133l.258-1.613a1 1 0 0 0-.282-.866l-1.156-1.153a1 1 0 0 1 .572-1.822l1.633-.256a1 1 0 0 0 .737-.535z" /><path d="M8 15H7a4 4 0 0 0-4 4v2" /><circle cx="10" cy="7" r="4" /></svg>
icon:key_focus = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m16 11 2 2 4-4" /><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" /><circle cx="9" cy="7" r="4" /></svg>
icon:key_mention = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" /><circle cx="9" cy="7" r="4" /><line x1="19" x2="19" y1="8" y2="14" /><line x1="22" x2="16" y1="11" y2="11" /></svg>
icon:cmn_general = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 17 5-5-5-5" /><path d="m13 17 5-5-5-5" /></svg>
icon:cmn_note = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z" /><path d="M7 11h10" /><path d="M7 15h6" /><path d="M7 7h8" /></svg>
icon:cmn_story = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z" /><path d="M20 2v4" /><path d="M22 4h-4" /><circle cx="4" cy="20" r="2" /></svg>
icon:prj_folder = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" /></svg>
icon:prj_document = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="M10 9H8" /><path d="M16 13H8" /><path d="M16 17H8" /></svg>
icon:prj_title = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="M10 9H8" /><path d="M16 13H8" /><path d="M16 17H8" /></svg>
icon:prj_chapter = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="M10 9H8" /><path d="M16 13H8" /><path d="M16 17H8" /></svg>
icon:prj_scene = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="M10 9H8" /><path d="M16 13H8" /><path d="M16 17H8" /></svg>
icon:prj_note = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="m9 15 2 2 4-4" /></svg>
icon:fmt_align_center = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 5H3" /><path d="M17 12H7" /><path d="M19 19H5" /></svg>
icon:fmt_align_left = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 5H3" /><path d="M15 12H3" /><path d="M17 19H3" /></svg>
icon:fmt_align_right = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 5H3" /><path d="M21 12H9" /><path d="M21 19H7" /></svg>
icon:fmt_bold = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8" /></svg>
icon:fmt_italic = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="19" x2="10" y1="4" y2="4" /><line x1="14" x2="5" y1="20" y2="20" /><line x1="15" x2="9" y1="4" y2="20" /></svg>
icon:fmt_link = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" /><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" /></svg>
icon:fmt_list_o = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11 5h10" /><path d="M11 12h10" /><path d="M11 19h10" /><path d="M4 4h1v5" /><path d="M4 9h2" /><path d="M6.5 20H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02" /></svg>
icon:fmt_list_u = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 5h.01" /><path d="M3 12h.01" /><path d="M3 19h.01" /><path d="M8 5h13" /><path d="M8 12h13" /><path d="M8 19h13" /></svg>
icon:fmt_mark = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m9 11-6 6v3h9l3-3" /><path d="m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4" /></svg>
icon:fmt_size = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m15 16 2.536-7.328a1.02 1.02 1 0 1 1.928 0L22 16" /><path d="M15.697 14h5.606" /><path d="m2 16 4.039-9.69a.5.5 0 0 1 .923 0L11 16" /><path d="M3.304 13h6.392" /></svg>
icon:fmt_strike = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 4H9a3 3 0 0 0-2.83 4" /><path d="M14 12a4 4 0 0 1 0 8H6" /><line x1="4" x2="20" y1="12" y2="12" /></svg>
icon:fmt_subscript = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m4 5 8 8" /><path d="m12 5-8 8" /><path d="M20 19h-4c0-1.5.44-2 1.5-2.5S20 15.33 20 14c0-.47-.17-.93-.48-1.29a2.11 2.11 0 0 0-2.62-.44c-.42.24-.74.62-.9 1.07" /></svg>
icon:fmt_superscript = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m4 19 8-8" /><path d="m12 19-8-8" /><path d="M20 12h-4c0-1.5.442-2 1.5-2.5S20 8.334 20 7.002c0-.472-.17-.93-.484-1.29a2.105 2.105 0 0 0-2.617-.436c-.42.239-.738.614-.899 1.06" /></svg>
icon:fmt_toolbar = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="18" x="3" y="3" rx="2" /><path d="M9 14v1" /><path d="M9 19v2" /><path d="M9 3v2" /><path d="M9 9v1" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 4v6a6 6 0 0 0 12 0V4" /><line x1="4" x2="20" y1="20" y2="20" /></svg>
icon:search = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21 21-4.34-4.34" /><circle cx="11" cy="11" r="8" /></svg>
icon:search_auto = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 3H8" /><path d="m15.007 5.008 3.987 3.986" /><path d="M20 15v4" /><path d="M21.174 6.813a2.82 2.82 0 0 0-3.986-3.987L3.842 16.175a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z" /><path d="M22 17h-4" /><path d="M4 5v4" /><path d="M6 7H2" /><path d="M9 2v2" /></svg>
icon:search_cancel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18" /><path d="m6 6 12 12" /></svg>
icon:search_case = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m2 16 4.039-9.69a.5.5 0 0 1 .923 0L11 16" /><path d="M22 9v7" /><path d="M3.304 13h6.392" /><circle cx="18.5" cy="12.5" r="3.5" /></svg>
icon:search_loop = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m2 9 3-3 3 3" /><path d="M13 18H7a2 2 0 0 1-2-2V6" /><path d="m22 15-3 3-3-3" /><path d="M11 6h6a2 2 0 0 1 2 2v10" /></svg>
icon:search_preserve = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m15 16 2.536-7.328a1.02 1.02 1 0 1 1.928 0L22 16" /><path d="M15.697 14h5.606" /><path d="m2 16 4.039-9.69a.5.5 0 0 1 .923 0L11 16" /><path d="M3.304 13h6.392" /></svg>
icon:search_project = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11 22H5.5a1 1 0 0 1 0-5h4.501" /><path d="m21 22-1.879-1.878" /><path d="M3 19.5v-15A2.5 2.5 0 0 1 5.5 2H18a1 1 0 0 1 1 1v8" /><circle cx="17" cy="18" r="3" /></svg>
icon:search_regex = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 3v10" /><path d="m12.67 5.5 8.66 5" /><path d="m12.67 10.5 8.66-5" /><path d="M9 17a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2v-2z" /></svg>
icon:search_replace = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 4a1 1 0 0 1 1-1" /><path d="M15 10a1 1 0 0 1-1-1" /><path d="M21 4a1 1 0 0 0-1-1" /><path d="M21 9a1 1 0 0 1-1 1" /><path d="m3 7 3 3 3-3" /><path d="M6 10V5a2 2 0 0 1 2-2h2" /><rect x="3" y="14" width="7" height="7" rx="1" /></svg>
icon:search_word = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="7" cy="12" r="3" /><path d="M10 9v6" /><circle cx="17" cy="12" r="3" /><path d="M14 7v8" /><path d="M22 17v1c0 .5-.5 1-1 1H3c-.5 0-1-.5-1-1v-1" /></svg>
icon:bullet-off = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /></svg>
icon:bullet-on = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.801 10A10 10 0 1 1 17 3.335" /><path d="m9 11 3 3L22 4" /></svg>
icon:unfold-hide = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m9 18 6-6-6-6" /></svg>
icon:unfold-show = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6" /></svg>
icon:sb_build = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 22V7a1 1 0 0 0-1-1H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5a1 1 0 0 0-1-1H2" /><rect x="14" y="2" width="8" height="8" rx="1" /></svg>
icon:sb_novel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20" /></svg>
icon:sb_project = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z" /><path d="M20 21a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.9a1 1 0 0 1-.88-.55l-.42-.85a1 1 0 0 0-.92-.6H13a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z" /><path d="M3 5a2 2 0 0 0 2 2h3" /><path d="M3 3v13a2 2 0 0 0 2 2h3" /></svg>
icon:sb_search = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11 22H5.5a1 1 0 0 1 0-5h4.501" /><path d="m21 22-1.879-1.878" /><path d="M3 19.5v-15A2.5 2.5 0 0 1 5.5 2H18a1 1 0 0 1 1 1v8" /><circle cx="17" cy="18" r="3" /></svg>
icon:sb_stats = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3v16a2 2 0 0 0 2 2h16" /><rect x="7" y="13" width="9" height="4" rx="1" /><rect x="7" y="5" width="12" height="4" rx="1" /></svg>
icon:sb_story = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="7" height="7" x="3" y="3" rx="1" /><rect width="7" height="7" x="3" y="14" rx="1" /><path d="M14 4h7" /><path d="M14 9h7" /><path d="M14 15h7" /><path d="M14 20h7" /></svg>
icon:theme_light = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4" /><path d="M12 2v2" /><path d="M12 20v2" /><path d="m4.93 4.93 1.41 1.41" /><path d="m17.66 17.66 1.41 1.41" /><path d="M2 12h2" /><path d="M20 12h2" /><path d="m6.34 17.66-1.41 1.41" /><path d="m19.07 4.93-1.41 1.41" /></svg>
icon:theme_dark = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401" /></svg>
icon:theme_auto = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><path d="M12 18a6 6 0 0 0 0-12v12z" /></svg>
icon:btn_ok = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.801 10A10 10 0 1 1 17 3.335" /><path d="m9 11 3 3L22 4" /></svg>
icon:btn_cancel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><line x1="9" x2="15" y1="15" y2="9" /></svg>
icon:btn_yes = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.801 10A10 10 0 1 1 17 3.335" /><path d="m9 11 3 3L22 4" /></svg>
icon:btn_no = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><path d="M8 12h8" /></svg>
icon:btn_open = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h6" /><path d="m21 3-9 9" /><path d="M15 3h6v6" /></svg>
icon:btn_close = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><path d="m15 9-6 6" /><path d="m9 9 6 6" /></svg>
icon:btn_save = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z" /><path d="M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7" /><path d="M7 3v4a1 1 0 0 0 1 1h7" /></svg>
icon:btn_browse = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2" /></svg>
icon:btn_list = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 5h.01" /><path d="M3 12h.01" /><path d="M3 19h.01" /><path d="M8 5h13" /><path d="M8 12h13" /><path d="M8 19h13" /></svg>
icon:btn_new = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><path d="M8 12h8" /><path d="M12 8v8" /></svg>
icon:btn_create = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z" /><path d="M20 2v4" /><path d="M22 4h-4" /><circle cx="4" cy="20" r="2" /></svg>
icon:btn_reset = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" /><path d="M3 3v5h5" /></svg>
icon:btn_insert = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3v12" /><path d="m8 11 4 4 4-4" /><path d="M8 5H4a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-4" /></svg>
icon:btn_apply = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 10.656V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.344" /><path d="m9 11 3 3L22 4" /></svg>
icon:btn_build = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 22V7a1 1 0 0 0-1-1H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5a1 1 0 0 0-1-1H2" /><rect x="14" y="2" width="8" height="8" rx="1" /></svg>
icon:btn_print = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2" /><path d="M6 9V3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v6" /><rect x="6" y="14" width="12" height="8" rx="1" /></svg>
icon:btn_preview = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0" /><circle cx="12" cy="12" r="3" /></svg>
icon:add = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14" /><path d="M12 5v14" /></svg>
icon:bookmarks = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z" /></svg>
icon:browse = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2" /></svg>
icon:build_settings = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 8a1 1 0 0 1-1-1V2a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8z" /><path d="M20 8v12a2 2 0 0 1-2 2h-4.182" /><path d="m3.305 19.53.923-.382" /><path d="M4 10.592V4a2 2 0 0 1 2-2h8" /><path d="m4.228 16.852-.924-.383" /><path d="m5.852 15.228-.383-.923" /><path d="m5.852 20.772-.383.924" /><path d="m8.148 15.228.383-.923" /><path d="m8.53 21.696-.382-.924" /><path d="m9.773 16.852.922-.383" /><path d="m9.773 19.148.922.383" /><circle cx="7" cy="18" r="3" /></svg>
icon:calendar = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8 2v3" /><path d="M16 2v3" /><rect x="3" y="3" width="18" height="18" rx="2" /><path d="M3 9h18" /></svg>
icon:cancel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><line x1="9" x2="15" y1="15" y2="9" /></svg>
icon:checked = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.801 10A10 10 0 1 1 17 3.335" /><path d="m9 11 3 3L22 4" /></svg>
icon:chevron_down = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14" /><path d="m19 12-7 7-7-7" /></svg>
icon:chevron_left = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7" /><path d="M19 12H5" /></svg>
icon:chevron_right = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14" /><path d="m12 5 7 7-7 7" /></svg>
icon:chevron_up = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m5 12 7-7 7 7" /><path d="M12 19V5" /></svg>
icon:close = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18" /><path d="m6 6 12 12" /></svg>
icon:copy = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="14" height="14" x="8" y="8" rx="2" ry="2" /><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" /></svg>
icon:document_add = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11.35 22H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v5.35" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="M14 19h6" /><path d="M17 16v6" /></svg>
icon:document = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="M10 9H8" /><path d="M16 13H8" /><path d="M16 17H8" /></svg>
icon:edit = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z" /><path d="m15 5 4 4" /></svg>
icon:exclude = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><path d="M4.929 4.929 19.07 19.071" /></svg>
icon:export = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4.226 20.925A2 2 0 0 0 6 22h12a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v3.127" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="m5 11-3 3" /><path d="m5 17-3-3h10" /></svg>
icon:filter = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z" /></svg>
icon:fit_height = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m7 15 5 5 5-5" /><path d="m7 9 5-5 5 5" /></svg>
icon:fit_width = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m9 7-5 5 5 5" /><path d="m15 7 5 5-5 5" /></svg>
icon:folder = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" /></svg>
icon:font = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 4v16" /><path d="M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2" /><path d="M9 20h6" /></svg>
icon:import = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 11V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-1" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="M2 15h10" /><path d="m9 18 3-3-3-3" /></svg>
icon:language = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m5 8 6 6" /><path d="m4 14 6-6 2-3" /><path d="M2 5h12" /><path d="M7 2h1" /><path d="m22 22-5-10-5 10" /><path d="M14 18h6" /></svg>
icon:lines = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11 5h10" /><path d="M11 12h10" /><path d="M11 19h10" /><path d="M4 4h1v5" /><path d="M4 9h2" /><path d="M6.5 20H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02" /></svg>
icon:link = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" /><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" /></svg>
icon:list = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 5h.01" /><path d="M3 12h.01" /><path d="M3 19h.01" /><path d="M8 5h13" /><path d="M8 12h13" /><path d="M8 19h13" /></svg>
icon:margin_bottom = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 17V3" /><path d="m6 11 6 6 6-6" /><path d="M19 21H5" /></svg>
icon:margin_inner = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12h6" /><path d="M22 12h-6" /><path d="M12 2v2" /><path d="M12 8v2" /><path d="M12 14v2" /><path d="M12 20v2" /><path d="m19 9-3 3 3 3" /><path d="m5 15 3-3-3-3" /></svg>
icon:margin_left = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 19V5" /><path d="m13 6-6 6 6 6" /><path d="M7 12h14" /></svg>
icon:margin_outer = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 12h6" /><path d="M8 12H2" /><path d="M12 2v2" /><path d="M12 8v2" /><path d="M12 14v2" /><path d="M12 20v2" /><path d="m19 15 3-3-3-3" /><path d="m5 9-3 3 3 3" /></svg>
icon:margin_right = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 12H3" /><path d="m11 18 6-6-6-6" /><path d="M21 5v14" /></svg>
icon:margin_top = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 3h14" /><path d="m18 13-6-6-6 6" /><path d="M12 7v14" /></svg>
icon:maximise = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m15 15 6 6" /><path d="m15 9 6-6" /><path d="M21 16v5h-5" /><path d="M21 8V3h-5" /><path d="M3 16v5h5" /><path d="m3 21 6-6" /><path d="M3 8V3h5" /><path d="M9 9 3 3" /></svg>
icon:minimise = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3v3a2 2 0 0 1-2 2H3" /><path d="M21 8h-3a2 2 0 0 1-2-2V3" /><path d="M3 16h3a2 2 0 0 1 2 2v3" /><path d="M16 21v-3a2 2 0 0 1 2-2h3" /></svg>
icon:more_arrow = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m9 18 6-6-6-6" /></svg>
icon:more_vertical = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1" /><circle cx="12" cy="5" r="1" /><circle cx="12" cy="19" r="1" /></svg>
icon:noncheckable = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /></svg>
icon:panel = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="18" x="3" y="3" rx="2" /><path d="M9 3v18" /><path d="M9 15h12" /></svg>
icon:pin = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 17v5" /><path d="M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z" /></svg>
icon:project_copy = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 7a2 2 0 0 0-2 2v11" /><path d="M5.803 18H5a2 2 0 0 0 0 4h9.5a.5.5 0 0 0 .5-.5V21" /><path d="M9 15V4a2 2 0 0 1 2-2h9.5a.5.5 0 0 1 .5.5v14a.5.5 0 0 1-.5.5H11a2 2 0 0 1 0-4h10" /></svg>
icon:quote = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z" /><path d="M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z" /></svg>
icon:refresh = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8" /><path d="M21 3v5h-5" /><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" /><path d="M8 16H3v5" /></svg>
icon:remove = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14" /></svg>
icon:revert = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 14 4 9l5-5" /><path d="M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11" /></svg>
icon:settings = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915" /><circle cx="12" cy="12" r="3" /></svg>
icon:stats = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3v16a2 2 0 0 0 2 2h16" /><path d="M7 11.207a.5.5 0 0 1 .146-.353l2-2a.5.5 0 0 1 .708 0l3.292 3.292a.5.5 0 0 0 .708 0l4.292-4.292a.5.5 0 0 1 .854.353V16a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z" /></svg>
icon:text = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="M10 9H8" /><path d="M16 13H8" /><path d="M16 17H8" /></svg>
icon:timer_off = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 2h4" /><path d="M4.6 11a8 8 0 0 0 1.7 8.7 8 8 0 0 0 8.7 1.7" /><path d="M7.4 7.4a8 8 0 0 1 10.3 1 8 8 0 0 1 .9 10.2" /><path d="m2 2 20 20" /><path d="M12 12v-2" /></svg>
icon:timer = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="10" x2="14" y1="2" y2="2" /><line x1="12" x2="15" y1="14" y2="11" /><circle cx="12" cy="14" r="8" /></svg>
icon:unchecked = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><path d="m15 9-6 6" /><path d="m9 9 6 6" /></svg>
icon:view = <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="-1 -1 26 26" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0" /><circle cx="12" cy="12" r="3" /></svg>

View File

@@ -22,21 +22,33 @@ icon:cls_template = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:cls_timeline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M320-160h320v-120q0-66-47-113t-113-47q-66 0-113 47t-47 113v120Zm160-360q66 0 113-47t47-113v-120H320v120q0 66 47 113t113 47ZM200-80q-17 0-28.5-11.5T160-120q0-17 11.5-28.5T200-160h40v-120q0-61 28.5-114.5T348-480q-51-32-79.5-85.5T240-680v-120h-40q-17 0-28.5-11.5T160-840q0-17 11.5-28.5T200-880h560q17 0 28.5 11.5T800-840q0 17-11.5 28.5T760-800h-40v120q0 61-28.5 114.5T612-480q51 32 79.5 85.5T720-280v120h40q17 0 28.5 11.5T800-120q0 17-11.5 28.5T760-80H200Z" /></svg>
icon:cls_trash = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M280-120q-33 0-56.5-23.5T200-200v-520q-17 0-28.5-11.5T160-760q0-17 11.5-28.5T200-800h160q0-17 11.5-28.5T400-840h160q17 0 28.5 11.5T600-800h160q17 0 28.5 11.5T800-760q0 17-11.5 28.5T760-720v520q0 33-23.5 56.5T680-120H280Zm120-160q17 0 28.5-11.5T440-320v-280q0-17-11.5-28.5T400-640q-17 0-28.5 11.5T360-600v280q0 17 11.5 28.5T400-280Zm160 0q17 0 28.5-11.5T600-320v-280q0-17-11.5-28.5T560-640q-17 0-28.5 11.5T520-600v280q0 17 11.5 28.5T560-280Z" /></svg>
icon:cls_world = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-7-.5-14.5T799-507q-5 29-27 48t-52 19h-80q-33 0-56.5-23.5T560-520v-40H400v-80q0-33 23.5-56.5T480-720h40q0-23 12.5-40.5T563-789q-20-5-40.5-8t-42.5-3q-134 0-227 93t-93 227h200q66 0 113 47t47 113v40H400v110q20 5 39.5 7.5T480-160Z" /></svg>
icon:key_pov = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-480q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47ZM240-160q-33 0-56.5-23.5T160-240v-32q0-34 17.5-62.5T224-378q50-25 99.5-39.5T427-437q23-2 37 17t9 43q-1 5-1 9.5v9.5q0 30 10.5 59.5T519-243l16 15q19 19 8.5 43.5T506-160H240Zm448-28L576-300q-13-13-18.5-28t-5.5-30q0-32 23-57t59-25q28 0 44 13t38 35q20-20 36.5-34t45.5-14q37 0 59.5 25.5T880-357q0 15-6 30t-18 27L744-188q-12 12-28 12t-28-12Z" /></svg>
icon:key_focus = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m702-593 141-142q12-12 28.5-12t28.5 12q12 12 12 28.5T900-678L730-508q-12 12-28 12t-28-12l-85-85q-12-12-12-28.5t12-28.5q12-12 28-12t28 12l57 57ZM360-480q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47ZM40-240v-32q0-34 17.5-62.5T104-378q62-31 126-46.5T360-440q66 0 130 15.5T616-378q29 15 46.5 43.5T680-272v32q0 33-23.5 56.5T600-160H120q-33 0-56.5-23.5T40-240Z" /></svg>
icon:key_mention = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M720-520h-80q-17 0-28.5-11.5T600-560q0-17 11.5-28.5T640-600h80v-80q0-17 11.5-28.5T760-720q17 0 28.5 11.5T800-680v80h80q17 0 28.5 11.5T920-560q0 17-11.5 28.5T880-520h-80v80q0 17-11.5 28.5T760-400q-17 0-28.5-11.5T720-440v-80Zm-360 40q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47ZM40-240v-32q0-34 17.5-62.5T104-378q62-31 126-46.5T360-440q66 0 130 15.5T616-378q29 15 46.5 43.5T680-272v32q0 33-23.5 56.5T600-160H120q-33 0-56.5-23.5T40-240Z" /></svg>
icon:cmn_general = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-240q-17 0-28.5-11.5T120-280q0-17 11.5-28.5T160-320h400q17 0 28.5 11.5T600-280q0 17-11.5 28.5T560-240H160Zm0-200q-17 0-28.5-11.5T120-480q0-17 11.5-28.5T160-520h640q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H160Zm0-200q-17 0-28.5-11.5T120-680q0-17 11.5-28.5T160-720h640q17 0 28.5 11.5T840-680q0 17-11.5 28.5T800-640H160Z" /></svg>
icon:cmn_note = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m240-240-92 92q-19 19-43.5 8.5T80-177v-623q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240Zm40-160h240q17 0 28.5-11.5T560-440q0-17-11.5-28.5T520-480H280q-17 0-28.5 11.5T240-440q0 17 11.5 28.5T280-400Zm0-120h400q17 0 28.5-11.5T720-560q0-17-11.5-28.5T680-600H280q-17 0-28.5 11.5T240-560q0 17 11.5 28.5T280-520Zm0-120h400q17 0 28.5-11.5T720-680q0-17-11.5-28.5T680-720H280q-17 0-28.5 11.5T240-680q0 17 11.5 28.5T280-640Z" /></svg>
icon:cmn_story = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M267-200q-48 0-71-41.5t3-81.5l101-157-101-157q-26-40-3-81.5t71-41.5h333q20 0 37.5 9t28.5 25l141 200q15 21 15 46t-15 46L666-234q-11 16-28.5 25t-37.5 9H267Z" /></svg>
icon:prj_folder = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h207q16 0 30.5 6t25.5 17l57 57h320q33 0 56.5 23.5T880-640v400q0 33-23.5 56.5T800-160H160Z" /></svg>
icon:prj_document = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h407q16 0 30.5 6t25.5 17l154 154q11 11 17 25.5t6 30.5v407q0 33-23.5 56.5T760-120H200Zm400-640v120q0 17 11.5 28.5T640-600h120L600-760Zm40 480q17 0 28.5-11.5T680-320q0-17-11.5-28.5T640-360H320q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280h320ZM440-600q17 0 28.5-11.5T480-640q0-17-11.5-28.5T440-680H320q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600h120Zm200 160q17 0 28.5-11.5T680-480q0-17-11.5-28.5T640-520H320q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440h320Z" /></svg>
icon:prj_title = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h407q16 0 30.5 6t25.5 17l154 154q11 11 17 25.5t6 30.5v407q0 33-23.5 56.5T760-120H200Zm400-640v120q0 17 11.5 28.5T640-600h120L600-760Zm40 480q17 0 28.5-11.5T680-320q0-17-11.5-28.5T640-360H320q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280h320ZM440-600q17 0 28.5-11.5T480-640q0-17-11.5-28.5T440-680H320q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600h120Zm200 160q17 0 28.5-11.5T680-480q0-17-11.5-28.5T640-520H320q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440h320Z" /></svg>
icon:prj_chapter = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h407q16 0 30.5 6t25.5 17l154 154q11 11 17 25.5t6 30.5v407q0 33-23.5 56.5T760-120H200Zm400-640v120q0 17 11.5 28.5T640-600h120L600-760Zm40 480q17 0 28.5-11.5T680-320q0-17-11.5-28.5T640-360H320q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280h320ZM440-600q17 0 28.5-11.5T480-640q0-17-11.5-28.5T440-680H320q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600h120Zm200 160q17 0 28.5-11.5T680-480q0-17-11.5-28.5T640-520H320q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440h320Z" /></svg>
icon:prj_scene = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h407q16 0 30.5 6t25.5 17l154 154q11 11 17 25.5t6 30.5v407q0 33-23.5 56.5T760-120H200Zm400-640v120q0 17 11.5 28.5T640-600h120L600-760Zm40 480q17 0 28.5-11.5T680-320q0-17-11.5-28.5T640-360H320q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280h320ZM440-600q17 0 28.5-11.5T480-640q0-17-11.5-28.5T440-680H320q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600h120Zm200 160q17 0 28.5-11.5T680-480q0-17-11.5-28.5T640-520H320q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440h320Z" /></svg>
icon:prj_note = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m560-200 200-200H600q-17 0-28.5 11.5T560-360v160Zm-360 80q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v367q0 16-6 30.5T817-337L623-143q-11 11-25.5 17t-30.5 6H200Zm120-280h120q17 0 28.5-11.5T480-440q0-17-11.5-28.5T440-480H320q-17 0-28.5 11.5T280-440q0 17 11.5 28.5T320-400Zm0-160h320q17 0 28.5-11.5T680-600q0-17-11.5-28.5T640-640H320q-17 0-28.5 11.5T280-600q0 17 11.5 28.5T320-560Z" /></svg>
icon:fmt_align_center = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-120q-17 0-28.5-11.5T120-160q0-17 11.5-28.5T160-200h640q17 0 28.5 11.5T840-160q0 17-11.5 28.5T800-120H160Zm160-160q-17 0-28.5-11.5T280-320q0-17 11.5-28.5T320-360h320q17 0 28.5 11.5T680-320q0 17-11.5 28.5T640-280H320ZM160-440q-17 0-28.5-11.5T120-480q0-17 11.5-28.5T160-520h640q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H160Zm160-160q-17 0-28.5-11.5T280-640q0-17 11.5-28.5T320-680h320q17 0 28.5 11.5T680-640q0 17-11.5 28.5T640-600H320ZM160-760q-17 0-28.5-11.5T120-800q0-17 11.5-28.5T160-840h640q17 0 28.5 11.5T840-800q0 17-11.5 28.5T800-760H160Z" /></svg>
icon:fmt_align_left = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-120q-17 0-28.5-11.5T120-160q0-17 11.5-28.5T160-200h640q17 0 28.5 11.5T840-160q0 17-11.5 28.5T800-120H160Zm0-160q-17 0-28.5-11.5T120-320q0-17 11.5-28.5T160-360h400q17 0 28.5 11.5T600-320q0 17-11.5 28.5T560-280H160Zm0-160q-17 0-28.5-11.5T120-480q0-17 11.5-28.5T160-520h640q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H160Zm0-160q-17 0-28.5-11.5T120-640q0-17 11.5-28.5T160-680h400q17 0 28.5 11.5T600-640q0 17-11.5 28.5T560-600H160Zm0-160q-17 0-28.5-11.5T120-800q0-17 11.5-28.5T160-840h640q17 0 28.5 11.5T840-800q0 17-11.5 28.5T800-760H160Z" /></svg>
icon:fmt_align_right = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-760q-17 0-28.5-11.5T120-800q0-17 11.5-28.5T160-840h640q17 0 28.5 11.5T840-800q0 17-11.5 28.5T800-760H160Zm240 160q-17 0-28.5-11.5T360-640q0-17 11.5-28.5T400-680h400q17 0 28.5 11.5T840-640q0 17-11.5 28.5T800-600H400ZM160-440q-17 0-28.5-11.5T120-480q0-17 11.5-28.5T160-520h640q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H160Zm240 160q-17 0-28.5-11.5T360-320q0-17 11.5-28.5T400-360h400q17 0 28.5 11.5T840-320q0 17-11.5 28.5T800-280H400ZM160-120q-17 0-28.5-11.5T120-160q0-17 11.5-28.5T160-200h640q17 0 28.5 11.5T840-160q0 17-11.5 28.5T800-120H160Z" /></svg>
icon:fmt_bold = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M352-200q-33 0-56.5-23.5T272-280v-400q0-33 23.5-56.5T352-760h141q65 0 120 40t55 111q0 51-23 78.5T602-491q25 11 55.5 41t30.5 90q0 89-65 124.5T501-200H352Zm41-112h104q48 0 58.5-24.5T566-372q0-11-10.5-35.5T494-432H393v120Zm0-228h93q33 0 48-17t15-38q0-24-17-39t-44-15h-95v109Z" /></svg>
icon:fmt_italic = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M250-200q-21 0-35.5-14.5T200-250q0-21 14.5-35.5T250-300h110l120-360H370q-21 0-35.5-14.5T320-710q0-21 14.5-35.5T370-760h300q21 0 35.5 14.5T720-710q0 21-14.5 35.5T670-660h-90L460-300h90q21 0 35.5 14.5T600-250q0 21-14.5 35.5T550-200H250Z" /></svg>
icon:fmt_link = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M280-280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h120q17 0 28.5 11.5T440-640q0 17-11.5 28.5T400-600H280q-50 0-85 35t-35 85q0 50 35 85t85 35h120q17 0 28.5 11.5T440-320q0 17-11.5 28.5T400-280H280Zm80-160q-17 0-28.5-11.5T320-480q0-17 11.5-28.5T360-520h240q17 0 28.5 11.5T640-480q0 17-11.5 28.5T600-440H360Zm200 160q-17 0-28.5-11.5T520-320q0-17 11.5-28.5T560-360h120q50 0 85-35t35-85q0-50-35-85t-85-35H560q-17 0-28.5-11.5T520-640q0-17 11.5-28.5T560-680h120q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H560Z" /></svg>
icon:fmt_list_o = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M150-80q-13 0-21.5-8.5T120-110q0-13 8.5-21.5T150-140h70v-30h-30q-13 0-21.5-8.5T160-200q0-13 8.5-21.5T190-230h30v-30h-70q-13 0-21.5-8.5T120-290q0-13 8.5-21.5T150-320h90q17 0 28.5 11.5T280-280v40q0 17-11.5 28.5T240-200q17 0 28.5 11.5T280-160v40q0 17-11.5 28.5T240-80h-90Zm0-280q-13 0-21.5-8.5T120-390v-80q0-17 11.5-28.5T160-510h60v-30h-70q-13 0-21.5-8.5T120-570q0-13 8.5-21.5T150-600h90q17 0 28.5 11.5T280-560v70q0 17-11.5 28.5T240-450h-60v30h70q13 0 21.5 8.5T280-390q0 13-8.5 21.5T250-360H150Zm60-280q-13 0-21.5-8.5T180-670v-150h-30q-13 0-21.5-8.5T120-850q0-13 8.5-21.5T150-880h60q13 0 21.5 8.5T240-850v180q0 13-8.5 21.5T210-640Zm190 440q-17 0-28.5-11.5T360-240q0-17 11.5-28.5T400-280h400q17 0 28.5 11.5T840-240q0 17-11.5 28.5T800-200H400Zm0-240q-17 0-28.5-11.5T360-480q0-17 11.5-28.5T400-520h400q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H400Zm0-240q-17 0-28.5-11.5T360-720q0-17 11.5-28.5T400-760h400q17 0 28.5 11.5T840-720q0 17-11.5 28.5T800-680H400Z" /></svg>
icon:fmt_list_u = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M400-200q-17 0-28.5-11.5T360-240q0-17 11.5-28.5T400-280h400q17 0 28.5 11.5T840-240q0 17-11.5 28.5T800-200H400Zm0-240q-17 0-28.5-11.5T360-480q0-17 11.5-28.5T400-520h400q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H400Zm0-240q-17 0-28.5-11.5T360-720q0-17 11.5-28.5T400-760h400q17 0 28.5 11.5T840-720q0 17-11.5 28.5T800-680H400ZM200-160q-33 0-56.5-23.5T120-240q0-33 23.5-56.5T200-320q33 0 56.5 23.5T280-240q0 33-23.5 56.5T200-160Zm0-240q-33 0-56.5-23.5T120-480q0-33 23.5-56.5T200-560q33 0 56.5 23.5T280-480q0 33-23.5 56.5T200-400Zm0-240q-33 0-56.5-23.5T120-720q0-33 23.5-56.5T200-800q33 0 56.5 23.5T280-720q0 33-23.5 56.5T200-640Z" /></svg>
icon:fmt_mark = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160 0q-33 0-56.5-23.5T80-80q0-33 23.5-56.5T160-160h640q33 0 56.5 23.5T880-80q0 33-23.5 56.5T800 0H160Zm264-640 216 217-160 160q-24 24-56.5 24T367-263l-5 4q-11 9-24 14t-27 5H189q-14 0-19.5-12t4.5-22l92-91q-24-24-25-57.5t23-57.5l160-160Zm56-57 160-159q24-24 56.5-24t56.5 24l104 103q24 24 24 56.5T857-640L697-480 480-697Z" /></svg>
icon:fmt_size = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M560-680H420q-25 0-42.5-17.5T360-740q0-25 17.5-42.5T420-800h400q25 0 42.5 17.5T880-740q0 25-17.5 42.5T820-680H680v460q0 25-17.5 42.5T620-160q-25 0-42.5-17.5T560-220v-460ZM200-480h-60q-25 0-42.5-17.5T80-540q0-25 17.5-42.5T140-600h240q25 0 42.5 17.5T440-540q0 25-17.5 42.5T380-480h-60v260q0 25-17.5 42.5T260-160q-25 0-42.5-17.5T200-220v-260Z" /></svg>
icon:fmt_strike = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M486-160q-63 0-116.5-33.5T285-283q-9-16-2.5-33.5T306-343q18-10 37.5-3.5T374-322q18 30 48.5 48t65.5 18q44 0 76.5-27t32.5-69q0-20 14-34t34-14q20 0 34.5 14t14.5 34v12q0 79-62.5 129.5T486-160ZM120-480q-17 0-28.5-11.5T80-520q0-17 11.5-28.5T120-560h720q17 0 28.5 11.5T880-520q0 17-11.5 28.5T840-480H120Zm208-165q-17-10-23-29.5t4-36.5q25-47 72-71t101-24q48 0 90.5 20t71.5 58q11 14 7 32t-19 29q-17 12-36.5 9T562-677q-15-17-35-25t-43-8q-27 0-52 11t-38 34q-10 18-29.5 24t-36.5-4Z" /></svg>
icon:fmt_subscript = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M800-160q-17 0-28.5-11.5T760-200v-40q0-17 11.5-28.5T800-280h80v-40H780q-8 0-14-6t-6-14q0-8 6-14t14-6h100q17 0 28.5 11.5T920-320v40q0 17-11.5 28.5T880-240h-80v40h100q8 0 14 6t6 14q0 8-6 14t-14 6H800Zm-483-80q-27 0-39.5-23t1.5-46l141-222-128-201q-14-22-1.5-45t38.5-23q12 0 22 5.5t16 15.5l111 179h4l110-179q6-10 16.5-15.5T630-800q27 0 39 23t-2 46L539-531l142 222q14 23 1 46t-39 23q-12 0-22-5.5T605-261L482-457h-4L355-261q-6 10-16.5 15.5T317-240Z" /></svg>
icon:fmt_superscript = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M800-600q-17 0-28.5-11.5T760-640v-40q0-17 11.5-28.5T800-720h80v-40H780q-8 0-14-6t-6-14q0-8 6-14t14-6h100q17 0 28.5 11.5T920-760v40q0 17-11.5 28.5T880-680h-80v40h100q8 0 14 6t6 14q0 8-6 14t-14 6H800ZM317-160q-27 0-39.5-23t1.5-46l141-222-128-201q-14-22-1.5-45t38.5-23q12 0 22 5.5t16 15.5l111 179h4l110-179q6-10 16.5-15.5T630-720q27 0 39 23t-2 46L539-451l142 222q14 23 1 46t-39 23q-12 0-22-5.5T605-181L482-377h-4L355-181q-6 10-16.5 15.5T317-160Z" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M240-120q-17 0-28.5-11.5T200-160q0-17 11.5-28.5T240-200h480q17 0 28.5 11.5T760-160q0 17-11.5 28.5T720-120H240Zm240-160q-101 0-157-63t-56-167v-279q0-21 15.5-36t36.5-15q21 0 36 15t15 36v285q0 56 28 91t82 35q54 0 82-35t28-91v-285q0-21 15.5-36t36.5-15q21 0 36 15t15 36v279q0 104-56 167t-157 63Z" /></svg>
icon:fmt_toolbar = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M240-200q-17 0-28.5-11.5T200-240q0-17 11.5-28.5T240-280h480q17 0 28.5 11.5T760-240q0 17-11.5 28.5T720-200H240Zm54-208 137-368q4-11 13.5-17.5T466-800h28q12 0 21.5 6.5T529-776l137 369q6 17-4 32t-28 15q-11 0-20.5-6.5T600-384l-30-88H392l-32 89q-4 11-13 17t-20 6q-19 0-29.5-15.5T294-408Zm120-128h132l-64-182h-4l-64 182Z" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M240-120q-17 0-28.5-11.5T200-160q0-17 11.5-28.5T240-200h480q17 0 28.5 11.5T760-160q0 17-11.5 28.5T720-120H240Zm240-160q-101 0-157-63t-56-167v-279q0-21 15.5-36t36.5-15q21 0 36 15t15 36v285q0 56 28 91t82 35q54 0 82-35t28-91v-285q0-21 15.5-36t36.5-15q21 0 36 15t15 36v279q0 104-56 167t-157 63Z" /></svg>
icon:search = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M380-320q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l224 224q11 11 11 28t-11 28q-11 11-28 11t-28-11L532-372q-30 24-69 38t-83 14Zm0-80q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z" /></svg>
icon:search_auto = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m646-438-86 138q-11 17-30.5 14T505-309l-28-112-273 273q-11 11-27.5 11.5T148-148q-11-11-11-28t11-28l273-274-112-28q-20-5-23-24.5t14-30.5l138-85-12-163q-2-20 16-29t33 4l125 105 151-61q19-8 33 6t6 33l-61 151 105 124q13 15 4 33t-29 16l-163-11ZM134-706q-6-6-6-14t6-14l52-52q6-6 14-6t14 6l52 52q6 6 6 14t-6 14l-52 52q-6 6-14 6t-14-6l-52-52Zm572 572-52-52q-6-6-6-14t6-14l52-52q6-6 14-6t14 6l52 52q6 6 6 14t-6 14l-52 52q-6 6-14 6t-14-6Z" /></svg>
icon:search_cancel = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-424 284-228q-11 11-28 11t-28-11q-11-11-11-28t11-28l196-196-196-196q-11-11-11-28t11-28q11-11 28-11t28 11l196 196 196-196q11-11 28-11t28 11q11 11 11 28t-11 28L536-480l196 196q11 11 11 28t-11 28q-11 11-28 11t-28-11L480-424Z" /></svg>
@@ -52,12 +64,11 @@ icon:bullet-on = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:unfold-hide = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M420-308q-8 0-14-5.5t-6-14.5v-304q0-9 6-14.5t14-5.5q2 0 14 6l145 145q5 5 7 10t2 11q0 6-2 11t-7 10L434-314q-3 3-6.5 4.5T420-308Z" /></svg>
icon:unfold-show = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M459-381 314-526q-3-3-4.5-6.5T308-540q0-8 5.5-14t14.5-6h304q9 0 14.5 6t5.5 14q0 2-6 14L501-381q-5 5-10 7t-11 2q-6 0-11-2t-10-7Z" /></svg>
icon:sb_build = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M760-252v72q0 8 6 14t14 6q8 0 14-6t6-14v-120q0-8-6-14t-14-6H660q-8 0-14 6t-6 14q0 8 6 14t14 6h72l-98 98q-6 6-6 14t6 14q6 6 14 6t14-6l98-98ZM720-40q-83 0-141.5-58.5T520-240q0-83 58.5-141.5T720-440q83 0 141.5 58.5T920-240q0 83-58.5 141.5T720-40ZM320-600h320q17 0 28.5-11.5T680-640q0-17-11.5-28.5T640-680H320q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v218q0 18-15 28t-32 4q-17-5-35.5-7.5T720-520q-11 0-20.5.5T680-517q-9-2-20-2.5t-20-.5H320q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440h205q-18 17-32.5 37T467-360H320q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280h123q-2 10-2.5 19.5T440-240q0 20 2 38t7 35q5 17-5 32t-27 15H200Z" /></svg>
icon:sb_details = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M400-200q-17 0-28.5-11.5T360-240q0-17 11.5-28.5T400-280h400q17 0 28.5 11.5T840-240q0 17-11.5 28.5T800-200H400Zm0-240q-17 0-28.5-11.5T360-480q0-17 11.5-28.5T400-520h400q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H400Zm0-240q-17 0-28.5-11.5T360-720q0-17 11.5-28.5T400-760h400q17 0 28.5 11.5T840-720q0 17-11.5 28.5T800-680H400ZM200-160q-33 0-56.5-23.5T120-240q0-33 23.5-56.5T200-320q33 0 56.5 23.5T280-240q0 33-23.5 56.5T200-160Zm0-240q-33 0-56.5-23.5T120-480q0-33 23.5-56.5T200-560q33 0 56.5 23.5T280-480q0 33-23.5 56.5T200-400Zm0-240q-33 0-56.5-23.5T120-720q0-33 23.5-56.5T200-800q33 0 56.5 23.5T280-720q0 33-23.5 56.5T200-640Z" /></svg>
icon:sb_novel = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M320-320q17 0 28.5-11.5T360-360v-400q0-17-11.5-28.5T320-800q-17 0-28.5 11.5T280-760v400q0 17 11.5 28.5T320-320ZM760-80H240q-50 0-85-35t-35-85v-560q0-50 35-85t85-35h272q-34 35-53 81t-19 99q0 103 69.5 177T680-441v121q0 33-23.5 56.5T600-240H240q-17 0-28.5 11.5T200-200q0 17 11.5 28.5T240-160h520v-287q22-5 42-13.5t38-20.5v321q0 33-23.5 56.5T760-80Zm-60-400q0-92 64-156t156-64q-92 0-156-64t-64-156q0 92-64 156t-156 64q92 0 156 64t64 156Z" /></svg>
icon:sb_outline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M320-600q17 0 28.5-11.5T360-640q0-17-11.5-28.5T320-680q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600Zm0 160q17 0 28.5-11.5T360-480q0-17-11.5-28.5T320-520q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440Zm0 160q17 0 28.5-11.5T360-320q0-17-11.5-28.5T320-360q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h407q16 0 30.5 6t25.5 17l154 154q11 11 17 25.5t6 30.5v407q0 33-23.5 56.5T760-120H200Zm400-640v120q0 17 11.5 28.5T640-600h120L600-760Z" /></svg>
icon:sb_project = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M560-120v-66q0-8 3-15.5t9-13.5l209-208q9-9 20-13t22-4q12 0 23 4.5t20 13.5l37 37q8 9 12.5 20t4.5 22q0 11-4 22.5T903-300L695-92q-6 6-13.5 9T666-80h-66q-17 0-28.5-11.5T560-120Zm263-184 37-39-37-37-38 38 38 38ZM160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h207q16 0 30.5 6t25.5 17l57 57h320q33 0 56.5 23.5T880-640v83q0 18-14.5 29t-33.5 8h-11q-28 0-52.5 10T724-480L503-259q-11 11-17 25.5t-6 30.5v3q0 17-11.5 28.5T440-160H160Z" /></svg>
icon:sb_search = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M380-320q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l224 224q11 11 11 28t-11 28q-11 11-28 11t-28-11L532-372q-30 24-69 38t-83 14Zm0-80q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z" /></svg>
icon:sb_stats = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M680-160q-17 0-28.5-11.5T640-200v-200q0-17 11.5-28.5T680-440h80q17 0 28.5 11.5T800-400v200q0 17-11.5 28.5T760-160h-80Zm-240 0q-17 0-28.5-11.5T400-200v-560q0-17 11.5-28.5T440-800h80q17 0 28.5 11.5T560-760v560q0 17-11.5 28.5T520-160h-80Zm-240 0q-17 0-28.5-11.5T160-200v-360q0-17 11.5-28.5T200-600h80q17 0 28.5 11.5T320-560v360q0 17-11.5 28.5T280-160h-80Z" /></svg>
icon:sb_story = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M320-600q17 0 28.5-11.5T360-640q0-17-11.5-28.5T320-680q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600Zm0 160q17 0 28.5-11.5T360-480q0-17-11.5-28.5T320-520q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440Zm0 160q17 0 28.5-11.5T360-320q0-17-11.5-28.5T320-360q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h407q16 0 30.5 6t25.5 17l154 154q11 11 17 25.5t6 30.5v407q0 33-23.5 56.5T760-120H200Zm400-640v120q0 17 11.5 28.5T640-600h120L600-760Z" /></svg>
icon:theme_light = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-280q-83 0-141.5-58.5T280-480q0-83 58.5-141.5T480-680q83 0 141.5 58.5T680-480q0 83-58.5 141.5T480-280ZM80-440q-17 0-28.5-11.5T40-480q0-17 11.5-28.5T80-520h80q17 0 28.5 11.5T200-480q0 17-11.5 28.5T160-440H80Zm720 0q-17 0-28.5-11.5T760-480q0-17 11.5-28.5T800-520h80q17 0 28.5 11.5T920-480q0 17-11.5 28.5T880-440h-80ZM480-760q-17 0-28.5-11.5T440-800v-80q0-17 11.5-28.5T480-920q17 0 28.5 11.5T520-880v80q0 17-11.5 28.5T480-760Zm0 720q-17 0-28.5-11.5T440-80v-80q0-17 11.5-28.5T480-200q17 0 28.5 11.5T520-160v80q0 17-11.5 28.5T480-40ZM226-678l-43-42q-12-11-11.5-28t11.5-29q12-12 29-12t28 12l42 43q11 12 11 28t-11 28q-11 12-27.5 11.5T226-678Zm494 495-42-43q-11-12-11-28.5t11-27.5q11-12 27.5-11.5T734-282l43 42q12 11 11.5 28T777-183q-12 12-29 12t-28-12Zm-42-495q-12-11-11.5-27.5T678-734l42-43q11-12 28-11.5t29 11.5q12 12 12 29t-12 28l-43 42q-12 11-28 11t-28-11ZM183-183q-12-12-12-29t12-28l43-42q12-11 28.5-11t27.5 11q12 11 11.5 27.5T282-226l-42 43q-11 12-28 11.5T183-183Z" /></svg>
icon:theme_dark = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-120q-151 0-255.5-104.5T120-480q0-138 90-239.5T440-838q13-2 23 3.5t16 14.5q6 9 6.5 21t-7.5 23q-17 26-25.5 55t-8.5 61q0 90 63 153t153 63q31 0 61.5-9t54.5-25q11-7 22.5-6.5T819-479q10 5 15.5 15t3.5 24q-14 138-117.5 229T480-120Z" /></svg>
icon:theme_auto = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm40-83q119-15 199.5-104.5T800-480q0-123-80.5-212.5T520-797v634Z" /></svg>
@@ -107,7 +118,9 @@ icon:lines = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:link = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M280-280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h120q17 0 28.5 11.5T440-640q0 17-11.5 28.5T400-600H280q-50 0-85 35t-35 85q0 50 35 85t85 35h120q17 0 28.5 11.5T440-320q0 17-11.5 28.5T400-280H280Zm80-160q-17 0-28.5-11.5T320-480q0-17 11.5-28.5T360-520h240q17 0 28.5 11.5T640-480q0 17-11.5 28.5T600-440H360Zm200 160q-17 0-28.5-11.5T520-320q0-17 11.5-28.5T560-360h120q50 0 85-35t35-85q0-50-35-85t-85-35H560q-17 0-28.5-11.5T520-640q0-17 11.5-28.5T560-680h120q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H560Z" /></svg>
icon:list = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M400-200q-17 0-28.5-11.5T360-240q0-17 11.5-28.5T400-280h400q17 0 28.5 11.5T840-240q0 17-11.5 28.5T800-200H400Zm0-240q-17 0-28.5-11.5T360-480q0-17 11.5-28.5T400-520h400q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H400Zm0-240q-17 0-28.5-11.5T360-720q0-17 11.5-28.5T400-760h400q17 0 28.5 11.5T840-720q0 17-11.5 28.5T800-680H400ZM200-160q-33 0-56.5-23.5T120-240q0-33 23.5-56.5T200-320q33 0 56.5 23.5T280-240q0 33-23.5 56.5T200-160Zm0-240q-33 0-56.5-23.5T120-480q0-33 23.5-56.5T200-560q33 0 56.5 23.5T280-480q0 33-23.5 56.5T200-400Zm0-240q-33 0-56.5-23.5T120-720q0-33 23.5-56.5T200-800q33 0 56.5 23.5T280-720q0 33-23.5 56.5T200-640Z" /></svg>
icon:margin_bottom = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-120q-17 0-28.5-11.5T160-160q0-17 11.5-28.5T200-200h560q17 0 28.5 11.5T800-160q0 17-11.5 28.5T760-120H200Zm280-177q-8 0-15-2.5t-13-8.5L308-452q-11-11-11-28t11-28q11-11 28-11t28 11l76 76v-368q0-17 11.5-28.5T480-840q17 0 28.5 11.5T520-800v368l76-76q11-11 28-11t28 11q11 11 11 28t-11 28L508-308q-6 6-13 8.5t-15 2.5Z" /></svg>
icon:margin_inner = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m712-440 36 36q11 11 11 28t-11 28q-11 11-28 11t-28-11L588-452q-6-6-8.5-13t-2.5-15q0-8 2.5-15t8.5-13l104-104q11-11 28-11t28 11q11 11 11 28t-11 28l-36 36h128q17 0 28.5 11.5T880-480q0 17-11.5 28.5T840-440H712ZM520-200q0 17-11.5 28.5T480-160q-17 0-28.5-11.5T440-200v-560q0-17 11.5-28.5T480-800q17 0 28.5 11.5T520-760v560ZM248-440H120q-17 0-28.5-11.5T80-480q0-17 11.5-28.5T120-520h128l-36-36q-11-11-11-28t11-28q11-11 28-11t28 11l104 104q6 6 8.5 13t2.5 15q0 8-2.5 15t-8.5 13L268-348q-11 11-28 11t-28-11q-11-11-11-28t11-28l36-36Z" /></svg>
icon:margin_left = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120-240q-17 0-28.5-11.5T80-280v-400q0-17 11.5-28.5T120-720q17 0 28.5 11.5T160-680v400q0 17-11.5 28.5T120-240Zm273-200 115 115q12 12 12 28.5T508-268q-12 11-28.5 11T452-268L268-452q-6-6-8.5-13t-2.5-15q0-8 2.5-15t8.5-13l184-184q11-11 28-11t28 11q12 12 11.5 28.5T508-636L393-520h447q17 0 28.5 11.5T880-480q0 17-11.5 28.5T840-440H393Z" /></svg>
icon:margin_outer = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M727-440H520v-80h207l-75-75q-11-12-11.5-28.5T652-652q12-12 28-12t28 12l144 144q6 6 8.5 13t2.5 15q0 8-2.5 15t-8.5 13L708-308q-12 12-28 12t-28-12q-12-12-12-28.5t12-28.5l75-75Zm-494 0 75 75q11 12 11.5 28.5T308-308q-12 12-28 12t-28-12L108-452q-6-6-8.5-13T97-480q0-8 2.5-15t8.5-13l144-144q12-12 28-12t28 12q12 12 12 28.5T308-595l-75 75h207v80H233Z" /></svg>
icon:margin_right = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M840-240q-17 0-28.5-11.5T800-280v-400q0-17 11.5-28.5T840-720q17 0 28.5 11.5T880-680v400q0 17-11.5 28.5T840-240ZM567-440H120q-17 0-28.5-11.5T80-480q0-17 11.5-28.5T120-520h447L452-636q-11-11-11.5-27.5T452-692q11-11 28-11t28 11l184 184q6 6 8.5 13t2.5 15q0 8-2.5 15t-8.5 13L508-268q-11 11-27.5 11T452-268q-12-12-12-28.5t12-28.5l115-115Z" /></svg>
icon:margin_top = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-760q-17 0-28.5-11.5T160-800q0-17 11.5-28.5T200-840h560q17 0 28.5 11.5T800-800q0 17-11.5 28.5T760-760H200Zm280 640q-17 0-28.5-11.5T440-160v-368l-76 76q-11 11-28 11t-28-11q-11-11-11-28t11-28l144-144q6-6 13-8.5t15-2.5q8 0 15 2.5t13 8.5l144 144q11 11 11 28t-11 28q-11 11-28 11t-28-11l-76-76v368q0 17-11.5 28.5T480-120Z" /></svg>
icon:maximise = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-200h80q17 0 28.5 11.5T320-160q0 17-11.5 28.5T280-120H160q-17 0-28.5-11.5T120-160v-120q0-17 11.5-28.5T160-320q17 0 28.5 11.5T200-280v80Zm560 0v-80q0-17 11.5-28.5T800-320q17 0 28.5 11.5T840-280v120q0 17-11.5 28.5T800-120H680q-17 0-28.5-11.5T640-160q0-17 11.5-28.5T680-200h80ZM200-760v80q0 17-11.5 28.5T160-640q-17 0-28.5-11.5T120-680v-120q0-17 11.5-28.5T160-840h120q17 0 28.5 11.5T320-800q0 17-11.5 28.5T280-760h-80Zm560 0h-80q-17 0-28.5-11.5T640-800q0-17 11.5-28.5T680-840h120q17 0 28.5 11.5T840-800v120q0 17-11.5 28.5T800-640q-17 0-28.5-11.5T760-680v-80Z" /></svg>

View File

@@ -22,21 +22,33 @@ icon:cls_template = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:cls_timeline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M312.31-160h335.38v-120q0-70.62-48.54-120.69-48.53-50.08-119.15-50.08t-119.15 50.16Q312.31-350.44 312.31-280v120ZM480-509.23q70.62 0 119.15-50.16 48.54-50.17 48.54-120.61v-120H312.31v120q0 70.62 48.54 120.69 48.53 50.08 119.15 50.08ZM220-120q-8.5 0-14.25-5.76T200-140.03q0-8.51 5.75-14.24T220-160h52.31v-120q0-74.08 45.42-131.42 45.42-57.35 116.42-68.58-71-12-116.42-68.96-45.42-56.96-45.42-131.04v-120H220q-8.5 0-14.25-5.76T200-820.03q0-8.51 5.75-14.24T220-840h520q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T740-800h-52.31v120q0 74.08-45.42 131.04Q596.85-492 525.85-480q71 11.23 116.42 68.58 45.42 57.34 45.42 131.42v120H740q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T740-120H220Z" /></svg>
icon:cls_trash = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M304.62-160q-26.66 0-45.64-18.98T240-224.62V-720h-20q-8.5 0-14.25-5.76T200-740.03q0-8.51 5.75-14.24T220-760h140q0-12.38 9.19-21.58 9.19-9.19 21.58-9.19h178.46q12.39 0 21.58 9.19Q600-772.38 600-760h140q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T740-720h-20v495.38q0 26.66-18.98 45.64T655.38-160H304.62Zm107.71-120q8.52 0 14.25-5.75t5.73-14.25v-320q0-8.5-5.76-14.25T412.28-640q-8.51 0-14.24 5.75T392.31-620v320q0 8.5 5.76 14.25 5.75 5.75 14.26 5.75Zm135.39 0q8.51 0 14.24-5.75t5.73-14.25v-320q0-8.5-5.76-14.25-5.75-5.75-14.26-5.75-8.52 0-14.25 5.75T527.69-620v320q0 8.5 5.76 14.25t14.27 5.75Z" /></svg>
icon:cls_world = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480.13-120q-74.67 0-140.41-28.34-65.73-28.34-114.36-76.92-48.63-48.58-76.99-114.26Q120-405.19 120-479.87q0-74.67 28.34-140.41 28.34-65.73 76.92-114.36 48.58-48.63 114.26-76.99Q405.19-840 479.87-840q74.67 0 140.41 28.34 65.73 28.34 114.36 76.92 48.63 48.58 76.99 114.26Q840-554.81 840-480.13q0 74.67-28.34 140.41-28.34 65.73-76.92 114.36-48.58 48.63-114.26 76.99Q554.81-120 480.13-120Zm-.13-40q134 0 227-93t93-227q0-7-.12-14.12-.11-7.11-.88-13.65-2.69 26.69-21.23 44.15-18.54 17.47-45.46 17.47H630.77q-27.92 0-47.81-19.86-19.88-19.85-19.88-47.73v-33.79H427.69v-67.59q0-27.88 19.89-47.92 19.88-20.04 47.8-20.04h33.85v-30.77q0-29.15 19.04-45.88 19.04-16.73 45.5-19.27-26.92-10.38-55.18-15.69Q510.33-800 480-800q-134 0-227 93t-93 227v11.54q0 5.38.77 11.54H340q56.77 0 96.08 39.3 39.3 39.31 39.3 95.73v34.2H373.85v109.23q24.61 8.84 51.42 13.65Q452.08-160 480-160Z" /></svg>
icon:key_pov = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-504.62q-49.5 0-84.75-35.25T360-624.62q0-49.5 35.25-84.75T480-744.62q49.5 0 84.75 35.25T600-624.62q0 49.5-35.25 84.75T480-504.62ZM241.54-215.38q-17.62 0-29.58-11.97Q200-239.31 200-256.92v-24.31q0-24.77 14.42-46.35 14.43-21.57 38.81-33.5 47.94-22.86 95.39-36.12 47.46-13.26 95.3-16.72 10.7-1.23 17.77 7 7.08 8.23 5.93 19.92-.24 1.15-.24 2.19v2.19q0 30.77 10.5 60.27 10.5 29.5 37.27 56.27l3.7 3.46q12.84 12.85 6.19 30.04-6.66 17.2-25.96 17.2H241.54ZM678.77-238l-95.85-95.85q-11.46-11.46-15.8-23.89-4.35-12.44-4.35-24.88 0-27.19 19.33-48.44 19.33-21.25 49.59-21.25 24.05 0 37.8 11.08 13.74 11.08 31.89 29.23 17.7-17.69 31.63-29 13.94-11.31 38.43-11.31 31.25 0 49.91 21.27Q840-409.77 840-382.56q0 12.75-4.85 25.5-4.84 12.75-15.13 23.04L724-238q-9.69 9.69-22.62 9.69-12.92 0-22.61-9.69Z" /></svg>
icon:key_focus = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m702-564.54 155.62-155.84q5.84-5.85 13.88-5.85 8.04 0 14.65 5.85 6.62 5.84 6.23 14.26-.38 8.43-6.23 14.27L724.62-531.08q-9.7 9.7-22.62 9.7-12.92 0-22.62-9.7l-76.53-76.54q-5.85-5.84-6.23-13.5-.39-7.65 6.23-14.26 5.84-5.85 14.15-5.85t14.15 5.85L702-564.54Zm-342 59.92q-49.85 0-84.92-35.07Q240-574.77 240-624.62q0-49.84 35.08-84.92 35.07-35.08 84.92-35.08t84.92 35.08Q480-674.46 480-624.62q0 49.85-35.08 84.93-35.07 35.07-84.92 35.07ZM80-256.92v-24.31q0-24.77 14.42-46.35 14.43-21.57 38.81-33.5 56.62-27.15 113.31-40.73 56.69-13.57 113.46-13.57 56.77 0 113.46 13.57 56.69 13.58 113.31 40.73 24.38 11.93 38.81 33.5Q640-306 640-281.23v24.31q0 17.61-11.96 29.57-11.96 11.97-29.58 11.97H121.54q-17.62 0-29.58-11.97Q80-239.31 80-256.92Z" /></svg>
icon:key_mention = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M730-540H630q-8.5 0-14.25-5.76T610-560.03q0-8.51 5.75-14.24T630-580h100v-100q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T770-680v100h100q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T870-540H770v100q0 8.5-5.76 14.25T749.97-420q-8.51 0-14.24-5.75T730-440v-100Zm-370 35.38q-49.5 0-84.75-35.25T240-624.62q0-49.5 35.25-84.75T360-744.62q49.5 0 84.75 35.25T480-624.62q0 49.5-35.25 84.75T360-504.62ZM80-256.92v-24.31q0-24.77 14.42-46.35 14.43-21.57 38.81-33.5 56.62-27.15 113.31-40.73 56.69-13.57 113.46-13.57 56.77 0 113.46 13.57 56.69 13.58 113.31 40.73 24.38 11.93 38.81 33.5Q640-306 640-281.23v24.31q0 17.61-11.96 29.57-11.96 11.97-29.58 11.97H121.54q-17.62 0-29.58-11.97Q80-239.31 80-256.92Z" /></svg>
icon:cmn_general = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M180-269.23q-8.5 0-14.25-5.76T160-289.26q0-8.51 5.75-14.24t14.25-5.73h360q8.5 0 14.25 5.76 5.75 5.75 5.75 14.27 0 8.51-5.75 14.24T540-269.23H180ZM180-460q-8.5 0-14.25-5.76T160-480.03q0-8.51 5.75-14.24T180-500h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H180Zm0-190.77q-8.5 0-14.25-5.76-5.75-5.75-5.75-14.27 0-8.51 5.75-14.24t14.25-5.73h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-650.77H180Z" /></svg>
icon:cmn_note = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m243.08-280-68.16 68.15q-15.15 15.16-35.04 6.85Q120-213.32 120-234.69v-540.69q0-27.62 18.5-46.12Q157-840 184.62-840h590.76q27.62 0 46.12 18.5Q840-803 840-775.38v430.76q0 27.62-18.5 46.12Q803-280 775.38-280h-532.3ZM280-420h240q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T520-460H280q-8.5 0-14.25 5.76T260-439.97q0 8.51 5.75 14.24T280-420Zm0-120h400q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T680-580H280q-8.5 0-14.25 5.76T260-559.97q0 8.51 5.75 14.24T280-540Zm0-120h400q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T680-700H280q-8.5 0-14.25 5.76T260-679.97q0 8.51 5.75 14.24T280-660Z" /></svg>
icon:cmn_story = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M236.23-240q-24.92 0-36.77-21.5-11.84-21.5 1.85-42.27l104.07-163.15q3.85-6.16 3.85-13.08t-3.85-13.08L201.31-656.23q-13.69-20.77-1.85-42.27 11.85-21.5 36.77-21.5h348.39q21.53 0 40.57 9.77t31.58 27.31l116.38 165.38q11.93 17.16 11.93 37.54t-11.93 37.54L653.69-275.54q-11.77 16.77-30.04 26.16-18.27 9.38-39.03 9.38H236.23Z" /></svg>
icon:prj_folder = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M184.62-200q-27.62 0-46.12-18.5Q120-237 120-264.62v-430.76q0-27.62 18.5-46.12Q157-760 184.62-760H357q12.92 0 25.12 5.23 12.19 5.23 20.88 13.92L463.85-680h311.53q27.62 0 46.12 18.5Q840-643 840-615.38v350.76q0 27.62-18.5 46.12Q803-200 775.38-200H184.62Z" /></svg>
icon:prj_document = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M224.62-160q-27.62 0-46.12-18.5Q160-197 160-224.62v-510.76q0-27.62 18.5-46.12Q197-800 224.62-800h371.61q13.27 0 25.29 5.23t20.71 13.92l138.62 138.62q8.69 8.69 13.92 20.71Q800-609.5 800-596.23v371.61q0 27.62-18.5 46.12Q763-160 735.38-160H224.62ZM600-760v127.69q0 13.73 9.29 23.02t23.02 9.29H760L600-760Zm40 440q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T640-360H320q-8.5 0-14.25 5.76T300-339.97q0 8.51 5.75 14.24T320-320h320ZM460-600q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T460-640H320q-8.5 0-14.25 5.76T300-619.97q0 8.51 5.75 14.24T320-600h140Zm180 140q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T640-500H320q-8.5 0-14.25 5.76T300-479.97q0 8.51 5.75 14.24T320-460h320Z" /></svg>
icon:prj_title = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M224.62-160q-27.62 0-46.12-18.5Q160-197 160-224.62v-510.76q0-27.62 18.5-46.12Q197-800 224.62-800h371.61q13.27 0 25.29 5.23t20.71 13.92l138.62 138.62q8.69 8.69 13.92 20.71Q800-609.5 800-596.23v371.61q0 27.62-18.5 46.12Q763-160 735.38-160H224.62ZM600-760v127.69q0 13.73 9.29 23.02t23.02 9.29H760L600-760Zm40 440q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T640-360H320q-8.5 0-14.25 5.76T300-339.97q0 8.51 5.75 14.24T320-320h320ZM460-600q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T460-640H320q-8.5 0-14.25 5.76T300-619.97q0 8.51 5.75 14.24T320-600h140Zm180 140q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T640-500H320q-8.5 0-14.25 5.76T300-479.97q0 8.51 5.75 14.24T320-460h320Z" /></svg>
icon:prj_chapter = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M224.62-160q-27.62 0-46.12-18.5Q160-197 160-224.62v-510.76q0-27.62 18.5-46.12Q197-800 224.62-800h371.61q13.27 0 25.29 5.23t20.71 13.92l138.62 138.62q8.69 8.69 13.92 20.71Q800-609.5 800-596.23v371.61q0 27.62-18.5 46.12Q763-160 735.38-160H224.62ZM600-760v127.69q0 13.73 9.29 23.02t23.02 9.29H760L600-760Zm40 440q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T640-360H320q-8.5 0-14.25 5.76T300-339.97q0 8.51 5.75 14.24T320-320h320ZM460-600q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T460-640H320q-8.5 0-14.25 5.76T300-619.97q0 8.51 5.75 14.24T320-600h140Zm180 140q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T640-500H320q-8.5 0-14.25 5.76T300-479.97q0 8.51 5.75 14.24T320-460h320Z" /></svg>
icon:prj_scene = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M224.62-160q-27.62 0-46.12-18.5Q160-197 160-224.62v-510.76q0-27.62 18.5-46.12Q197-800 224.62-800h371.61q13.27 0 25.29 5.23t20.71 13.92l138.62 138.62q8.69 8.69 13.92 20.71Q800-609.5 800-596.23v371.61q0 27.62-18.5 46.12Q763-160 735.38-160H224.62ZM600-760v127.69q0 13.73 9.29 23.02t23.02 9.29H760L600-760Zm40 440q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T640-360H320q-8.5 0-14.25 5.76T300-339.97q0 8.51 5.75 14.24T320-320h320ZM460-600q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T460-640H320q-8.5 0-14.25 5.76T300-619.97q0 8.51 5.75 14.24T320-600h140Zm180 140q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T640-500H320q-8.5 0-14.25 5.76T300-479.97q0 8.51 5.75 14.24T320-460h320Z" /></svg>
icon:prj_note = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m560-200 200-200H592.31q-13.73 0-23.02 9.29T560-367.69V-200Zm-335.38 40q-26.66 0-45.64-18.98T160-224.62v-510.76q0-26.66 18.98-45.64T224.62-800h510.76q26.66 0 45.64 18.98T800-735.38v320.07q0 13.27-5.23 25.29t-13.92 20.71L590.69-179.15q-8.69 8.69-20.71 13.92-12.02 5.23-25.29 5.23H224.62Zm110.76-261.54H460q8.5 0 14.25-5.76 5.75-5.75 5.75-14.27 0-8.51-5.75-14.24T460-461.54H335.38q-8.5 0-14.25 5.76t-5.75 14.27q0 8.51 5.75 14.24t14.25 5.73Zm0-158.46h289.24q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T624.62-620H335.38q-8.5 0-14.25 5.76t-5.75 14.27q0 8.51 5.75 14.24t14.25 5.73Z" /></svg>
icon:fmt_align_center = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M180-160q-8.5 0-14.25-5.76T160-180.03q0-8.51 5.75-14.24T180-200h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-160H180Zm160-150q-8.5 0-14.25-5.76T320-330.03q0-8.51 5.75-14.24T340-350h280q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T620-310H340ZM180-460q-8.5 0-14.25-5.76T160-480.03q0-8.51 5.75-14.24T180-500h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H180Zm160-150q-8.5 0-14.25-5.76T320-630.03q0-8.51 5.75-14.24T340-650h280q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T620-610H340ZM180-760q-8.5 0-14.25-5.76T160-780.03q0-8.51 5.75-14.24T180-800h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-760H180Z" /></svg>
icon:fmt_align_left = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M180-160q-8.5 0-14.25-5.76T160-180.03q0-8.51 5.75-14.24T180-200h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-160H180Zm0-150q-8.5 0-14.25-5.76T160-330.03q0-8.51 5.75-14.24T180-350h360q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T540-310H180Zm0-150q-8.5 0-14.25-5.76T160-480.03q0-8.51 5.75-14.24T180-500h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H180Zm0-150q-8.5 0-14.25-5.76T160-630.03q0-8.51 5.75-14.24T180-650h360q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T540-610H180Zm0-150q-8.5 0-14.25-5.76T160-780.03q0-8.51 5.75-14.24T180-800h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-760H180Z" /></svg>
icon:fmt_align_right = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M180-760q-8.5 0-14.25-5.76T160-780.03q0-8.51 5.75-14.24T180-800h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-760H180Zm240 150q-8.5 0-14.25-5.76T400-630.03q0-8.51 5.75-14.24T420-650h360q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-610H420ZM180-460q-8.5 0-14.25-5.76T160-480.03q0-8.51 5.75-14.24T180-500h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H180Zm240 150q-8.5 0-14.25-5.76T400-330.03q0-8.51 5.75-14.24T420-350h360q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-310H420ZM180-160q-8.5 0-14.25-5.76T160-180.03q0-8.51 5.75-14.24T180-200h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-160H180Z" /></svg>
icon:fmt_bold = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M356.62-230q-17.62 0-29.58-11.96-11.96-11.96-11.96-29.58v-416.92q0-17.62 11.96-29.58Q339-730 356.62-730H483q57.31 0 101.15 36.15Q628-657.69 628-599.77q0 38.69-20.31 67.73-20.31 29.04-50.31 42.58 36.54 10.23 62.04 42.92t25.5 78.85q0 64.38-48.07 101.04Q548.77-230 491-230H356.62Zm9.46-47.38h122.46q46.46 0 75.04-27.97 28.57-27.96 28.57-65.11 0-37.16-28.57-65.12-28.58-27.96-75.73-27.96H366.08v186.16Zm0-232.62h114.54q39.92 0 67.61-24.69 27.69-24.69 27.69-61.85 0-37.84-28.15-62.08-28.15-24.23-66.69-24.23h-115V-510Z" /></svg>
icon:fmt_italic = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M253.85-230q-9.37 0-15.84-6.49-6.47-6.49-6.47-15.88 0-9.4 6.47-15.82 6.47-6.43 15.84-6.43h123.07l139.23-410.76H393.08q-9.37 0-15.84-6.49-6.47-6.49-6.47-15.89 0-9.39 6.47-15.82 6.47-6.42 15.84-6.42h287.69q9.37 0 15.84 6.49 6.47 6.49 6.47 15.88 0 9.4-6.47 15.82-6.47 6.43-15.84 6.43H562.31L423.08-274.62h118.46q9.37 0 15.84 6.49 6.47 6.49 6.47 15.89 0 9.39-6.47 15.82-6.47 6.42-15.84 6.42H253.85Z" /></svg>
icon:fmt_link = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M283.08-316.92q-67.68 0-115.38-47.69Q120-412.3 120-479.96t47.7-115.39q47.7-47.73 115.38-47.73h121.54q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24t-14.25 5.73H282.99q-50.68 0-86.84 36.16Q160-530.77 160-480t36.15 86.92q36.16 36.16 86.84 36.16h121.63q8.5 0 14.25 5.75 5.75 5.76 5.75 14.27 0 8.52-5.75 14.25t-14.25 5.73H283.08ZM360-460q-8.5 0-14.25-5.76T340-480.03q0-8.51 5.75-14.24T360-500h240q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T600-460H360Zm195.38 143.08q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73h121.63q50.68 0 86.84-36.16Q800-429.23 800-480t-36.15-86.92q-36.16-36.16-86.84-36.16H555.38q-8.5 0-14.25-5.75-5.75-5.76-5.75-14.27 0-8.52 5.75-14.25t14.25-5.73h121.54q67.68 0 115.38 47.69Q840-547.7 840-480.04t-47.7 115.39q-47.7 47.73-115.38 47.73H555.38Z" /></svg>
icon:fmt_list_o = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M177.69-120q-7.66 0-12.68-5-5.01-5.01-5.01-12.66t5.01-12.69q5.02-5.03 12.68-5.03H260V-210h-42.31q-7.66 0-12.68-5-5.01-5.01-5.01-12.66t5.01-12.69q5.02-5.03 12.68-5.03H260V-300h-82.31q-7.66 0-12.68-5-5.01-5.01-5.01-12.66t5.01-12.69q5.02-5.03 12.68-5.03h90q11.77 0 19.73 7.96 7.96 7.96 7.96 19.73v55.38q0 11.77-7.96 19.73-7.96 7.96-19.73 7.96 11.77 0 19.73 7.97 7.96 7.96 7.96 19.73v49.23q0 11.77-7.96 19.73-7.96 7.96-19.73 7.96h-90Zm6.93-252.31q-9.93 0-17.27-7.34Q160-387 160-396.92V-470q0-11.77 7.96-19.73 7.96-7.96 19.73-7.96H260v-54.62h-82.31q-7.66 0-12.68-5-5.01-5-5.01-12.65 0-7.66 5.01-12.69 5.02-5.04 12.68-5.04h90q11.77 0 19.73 7.96 7.96 7.96 7.96 19.73v70q0 11.77-7.96 19.73-7.96 7.96-19.73 7.96h-72.31v54.62h82.31q7.67 0 12.68 5t5.01 12.65q0 7.66-5.01 12.69-5.01 5.04-12.68 5.04h-93.07Zm53.11-252.31q-7.65 0-12.69-5.01-5.04-5.01-5.04-12.68v-162.31h-42.31q-7.66 0-12.68-5-5.01-5-5.01-12.65t5.01-12.69q5.02-5.04 12.68-5.04h53.85q9.92 0 16.88 6.96 6.96 6.96 6.96 16.89v173.84q0 7.67-5 12.68t-12.65 5.01ZM404.62-220q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-220H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-700H404.62Z" /></svg>
icon:fmt_list_u = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M404.62-220q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-220H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-700H404.62ZM213.08-186.92q-21.9 0-37.49-15.59Q160-218.11 160-240t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-458.11 160-480t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-698.11 160-720t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Z" /></svg>
icon:fmt_mark = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120 0q-16.08 0-28.04-11.58Q80-23.15 80-40q0-16.08 11.96-28.04T120-80h720q16.08 0 28.04 11.58Q880-56.85 880-40q0 16.08-11.96 28.04T840 0H120Zm307.85-600.77 160.61 160.85-155.38 155.38q-19.39 19.39-45.35 19.39t-45.35-19.39l-7.69-7.69-27.31 27.08q-8.69 8.23-20.53 13.23-11.85 5-24.31 5h-45.85q-10.92 0-14.88-10.08-3.96-10.08 3.73-17.77l73.54-73.31-6.16-6.15q-19.38-19.39-19.61-45.58-.23-26.19 19.15-45.57l155.39-155.39Zm28.3-28.54 182.31-182.07q19.39-19.39 45.35-19.39t45.34 19.39l70.16 69.92q19.38 19.38 19.38 45.34 0 25.97-19.38 45.35L617-468.46 456.15-629.31Z" /></svg>
icon:fmt_size = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M593.08-710H420.77q-10.26 0-17.44-7.21-7.18-7.2-7.18-17.5 0-10.29 7.18-17.79t17.44-7.5h394.61q10.26 0 17.44 7.21 7.18 7.2 7.18 17.5 0 10.29-7.18 17.79t-17.44 7.5h-172.3v485.38q0 10.26-7.21 17.44-7.2 7.18-17.5 7.18-10.29 0-17.79-7.4-7.5-7.41-7.5-17.98V-710ZM238.46-513.85h-93.84q-10.26 0-17.44-7.2-7.18-7.21-7.18-17.5 0-10.3 7.18-17.8t17.44-7.5h236.92q10.25 0 17.43 7.21t7.18 17.5q0 10.29-7.18 17.79t-17.43 7.5h-93.85v289.23q0 10.26-7.2 17.44-7.21 7.18-17.5 7.18-10.3 0-17.41-7.18-7.12-7.18-7.12-17.44v-289.23Z" /></svg>
icon:fmt_strike = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M486-184.62q-56.85 0-104.96-30.03-48.12-30.04-75.27-80.66-3.62-7.54-.58-15.81 3.04-8.26 10.81-11.88 8-3.85 16.73-.81t13.58 11.04q21.84 39.23 58.88 61.85 37.04 22.61 81.27 22.61 55.54 0 98.04-31.61 42.5-31.62 42.5-82.85 0-13.08-2.31-26.15-2.31-13.08-9.23-24.62-2.31-8.46 2.46-15.54 4.77-7.07 13.23-9.38 8.47-2.31 16.04 2.46 7.58 4.77 9.89 13.23 8.46 13.77 11.15 30.23 2.69 16.46 2.69 32.54 0 69-55.96 112.19T486-184.62ZM120-500q-8.54 0-14.27-5.73T100-520q0-8.54 5.73-14.27T120-540h720q8.54 0 14.27 5.73T860-520q0 8.54-5.73 14.27T840-500H120Zm211.85-121.15q-8.54-2.31-13-9.89-4.47-7.58-2.16-16.11 4.23-58.54 53.16-94.85 48.92-36.31 112.15-36.31 42.62 0 80.12 18.08 37.5 18.08 62.65 51.46 4.85 7.08 3.54 15.46-1.31 8.39-8.62 13.23-7.77 5.08-16.5 3.62t-15.04-9q-18.84-24.69-46.53-36.92-27.7-12.24-59.16-12.24-47.77 0-84.69 26.77-36.92 26.77-39.92 71.31-2.31 8.77-9.89 13.23-7.58 4.46-16.11 2.16Z" /></svg>
icon:fmt_subscript = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M767.69-200q-13.73 0-23.02-9.29t-9.29-23.02v-30.77q0-13.73 9.29-23.02 9.29-9.28 23.02-9.28H840v-33.85h-89.23q-6.15 0-10.77-4.62-4.62-4.61-4.62-10.77 0-6.15 4.62-10.76 4.62-4.62 10.77-4.62h87.69q13.73 0 23.02 9.29t9.29 23.02v30.77q0 13.73-9.29 23.02-9.29 9.28-23.02 9.28h-72.31v33.85h89.23q6.16 0 10.77 4.62 4.62 4.61 4.62 10.77 0 6.15-4.62 10.76-4.61 4.62-10.77 4.62h-87.69Zm-447.36-64.62q-13.15 0-19.24-11.07-6.09-11.08.99-22.54l145.61-225.08-131.84-203.31q-7.08-11.23-.99-22.3Q320.95-760 333.62-760q5.84 0 10.52 2.68 4.67 2.68 7.48 7.55l127.15 197.46h.92l129.23-198.23q2.76-4.5 7.57-6.98 4.82-2.48 10.22-2.48 13.27 0 19.16 11.08 5.9 11.07-1.18 22.54L510.54-523.31l147.38 225.08q7.08 11.46.81 22.54-6.27 11.07-18.81 11.07-5.68 0-10.42-2.67-4.73-2.68-7.58-7.56l-142.23-218.3h-.92l-140.69 218.3q-2.76 4.88-7.57 7.56-4.82 2.67-10.18 2.67Z" /></svg>
icon:fmt_superscript = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M767.69-600q-13.73 0-23.02-9.29t-9.29-23.02v-30.77q0-13.73 9.29-23.02 9.29-9.28 23.02-9.28H840v-33.85h-89.23q-6.15 0-10.77-4.62-4.62-4.61-4.62-10.77 0-6.15 4.62-10.76 4.62-4.62 10.77-4.62h87.69q13.73 0 23.02 9.29t9.29 23.02v30.77q0 13.73-9.29 23.02-9.29 9.28-23.02 9.28h-72.31v33.85h89.23q6.16 0 10.77 4.62 4.62 4.61 4.62 10.77 0 6.15-4.62 10.76-4.61 4.62-10.77 4.62h-87.69ZM320.33-200q-13.15 0-19.24-11.08-6.09-11.07.99-22.54l145.61-225.07L315.85-662q-7.08-11.23-.99-22.31 6.09-11.07 18.76-11.07 5.84 0 10.52 2.67 4.67 2.68 7.48 7.56l127.15 197.46h.92l129.23-198.23q2.76-4.51 7.57-6.99 4.82-2.47 10.22-2.47 13.27 0 19.16 11.07 5.9 11.08-1.18 22.54L510.54-458.69l147.38 225.07q7.08 11.47.81 22.54Q652.46-200 639.92-200q-5.68 0-10.42-2.68-4.73-2.68-7.58-7.55L479.69-428.54h-.92L338.08-210.23q-2.76 4.87-7.57 7.55-4.82 2.68-10.18 2.68Z" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M247.69-190q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73h464.62q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T712.31-190H247.69ZM480-317.69q-85.62 0-134.31-50.31T297-504.62v-279.76q0-9.29 6.84-15.91 6.85-6.63 16.12-6.63 9.27 0 15.81 6.63 6.54 6.62 6.54 15.91v281.15q0 65.23 36.46 103.31 36.46 38.07 101.23 38.07 64.77 0 101.23-38.07 36.46-38.08 36.46-103.31v-281.15q0-9.29 6.85-15.91 6.84-6.63 16.11-6.63t15.81 6.63q6.54 6.62 6.54 15.91v279.76q0 86.31-48.69 136.62T480-317.69Z" /></svg>
icon:fmt_toolbar = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M240-218.46q-8.54 0-14.27-5.73T220-238.46q0-8.54 5.73-14.27t14.27-5.73h480q8.54 0 14.27 5.73t5.73 14.27q0 8.54-5.73 14.27T720-218.46H240Zm74-176.46 142.38-374.93q2.47-5.61 6.97-8.65t10.34-3.04h14.16q5.84 0 10.34 3.42 4.5 3.43 6.96 9.04l139.31 374.39q2.92 9.31-2.08 17.38-5 8.08-15.3 8.08-6.39 0-10.89-3.04-4.5-3.04-6.96-9.42l-36.92-101.08H386.62l-37.39 101.31q-2.46 5.61-6.85 8.92-4.38 3.31-10.76 3.31-10.54 0-15.66-8.19-5.11-8.2-1.96-17.5Zm85.38-122.62h159.7l-76.31-211.23h-4l-79.39 211.23Z" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M247.69-190q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73h464.62q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T712.31-190H247.69ZM480-317.69q-85.62 0-134.31-50.31T297-504.62v-279.76q0-9.29 6.84-15.91 6.85-6.63 16.12-6.63 9.27 0 15.81 6.63 6.54 6.62 6.54 15.91v281.15q0 65.23 36.46 103.31 36.46 38.07 101.23 38.07 64.77 0 101.23-38.07 36.46-38.08 36.46-103.31v-281.15q0-9.29 6.85-15.91 6.84-6.63 16.11-6.63t15.81 6.63q6.54 6.62 6.54 15.91v279.76q0 86.31-48.69 136.62T480-317.69Z" /></svg>
icon:search = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M381.54-350.77q-95.92 0-162.58-66.65-66.65-66.66-66.65-162.58 0-95.92 66.65-162.58 66.66-66.65 162.58-66.65 95.92 0 162.58 66.65 66.65 66.66 66.65 162.58 0 41.69-14.77 80.69t-38.77 66.69l236.31 236.31q5.61 5.62 6 13.77.38 8.16-6 14.54-6.39 6.38-14.16 6.38-7.76 0-14.15-6.38L528.92-404.31q-30 25.54-69 39.54t-78.38 14Zm0-40q79.61 0 134.42-54.81 54.81-54.8 54.81-134.42 0-79.62-54.81-134.42-54.81-54.81-134.42-54.81-79.62 0-134.42 54.81-54.81 54.8-54.81 134.42 0 79.62 54.81 134.42 54.8 54.81 134.42 54.81Z" /></svg>
icon:search_auto = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m642.92-468-80.61 130.31q-6.39 10.07-18.96 8.61-12.58-1.46-15.27-13.77L497-469.46 202.46-174.15q-5.61 5.61-13.65 6.11t-14.66-6.11q-6.38-6.39-6.38-14.16 0-7.77 6.38-14.15L469.46-498l-125.84-31.08q-12.31-2.69-14.16-14.88-1.84-12.19 8.23-18.58L468-642.92l-11.23-153q-1.23-12.31 9.46-18.23 10.69-5.93 20.31 2.46l117.31 98.84 141.77-57.92q11.3-4.92 20.3 4.08t4.08 20.31l-57.15 141.76 98.84 117.08q8.39 9.62 2.85 20.69-5.54 11.08-17.85 9.85l-153.77-11ZM171.69-727.54q-5.23-5.23-5.23-11.69 0-6.46 5.23-11.69l28.16-28.16q5.23-5.23 11.69-5.23 6.46 0 11.69 5.23l28.15 28.16q5.24 5.23 5.24 11.69 0 6.46-5.24 11.69l-28.15 28.16q-5.23 5.23-11.69 5.23-6.46 0-11.69-5.23l-28.16-28.16Zm555.85 555.85-28.16-28.16q-5.23-5.23-5.23-11.69 0-6.46 5.23-11.69l28.16-28.15q5.23-5.24 11.69-5.24 6.46 0 11.69 5.24l28.16 28.15q5.23 5.23 5.23 11.69 0 6.46-5.23 11.69l-28.16 28.16q-5.23 5.23-11.69 5.23-6.46 0-11.69-5.23Z" /></svg>
icon:search_cancel = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-451.69 270.15-241.85q-5.61 5.62-13.77 6-8.15.39-14.53-6-6.39-6.38-6.39-14.15 0-7.77 6.39-14.15L451.69-480 241.85-689.85q-5.62-5.61-6-13.77-.39-8.15 6-14.53 6.38-6.39 14.15-6.39 7.77 0 14.15 6.39L480-508.31l209.85-209.84q5.61-5.62 13.77-6 8.15-.39 14.53 6 6.39 6.38 6.39 14.15 0 7.77-6.39 14.15L508.31-480l209.84 209.85q5.62 5.61 6 13.77.39 8.15-6 14.53-6.38 6.39-14.15 6.39-7.77 0-14.15-6.39L480-451.69Z" /></svg>
@@ -52,12 +64,11 @@ icon:bullet-on = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:unfold-hide = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M436.4-350.31q-6.71 0-11.55-4.44-4.85-4.44-4.85-11.71v-227.08q0-7.27 4.95-11.71 4.95-4.44 11.55-4.44 1.65 0 11.35 5.23l107.07 107.08q3.7 3.69 5.7 7.97 2 4.28 2 9.41t-2 9.41q-2 4.28-5.7 7.98L447.83-355.52q-2.21 2.21-5.15 3.71-2.93 1.5-6.28 1.5Z" /></svg>
icon:unfold-show = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M462.61-405.08 355.52-512.17q-2.21-2.21-3.71-5.15-1.5-2.93-1.5-6.28 0-6.71 4.44-11.55 4.44-4.85 11.71-4.85h227.08q7.27 0 11.71 4.95 4.44 4.95 4.44 11.55 0 1.65-5.23 11.35L497.38-405.08q-3.69 3.7-7.97 5.7-4.28 2-9.41 2t-9.41-2q-4.28-2-7.98-5.7Z" /></svg>
icon:sb_build = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M763.85-257.38V-190q0 6.15 4.61 10.77 4.62 4.61 10.77 4.61 6.15 0 10.77-4.61 4.62-4.62 4.62-10.77v-103.85q0-6.46-4.85-11.3-4.85-4.85-11.31-4.85H674.62q-6.16 0-10.77 4.62-4.62 4.61-4.62 10.76 0 6.16 4.62 10.77 4.61 4.62 10.77 4.62H742l-90.31 90.31q-4.46 4.46-4.84 10.54-.39 6.07 4.84 11.3 4.74 4.46 11.07 4.46 6.32 0 10.78-4.46l90.31-90.3ZM720-75.38q-66.85 0-113.42-46.58Q560-168.54 560-235.38q0-66.85 46.58-113.43 46.57-46.57 113.42-46.57t113.42 46.57Q880-302.23 880-235.38q0 66.84-46.58 113.42Q786.85-75.38 720-75.38ZM320-610.77h320q8.5 0 14.25-5.76 5.75-5.75 5.75-14.27 0-8.51-5.75-14.24T640-650.77H320q-8.5 0-14.25 5.76T300-630.74q0 8.51 5.75 14.24t14.25 5.73ZM224.62-160q-26.66 0-45.64-18.98T160-224.62v-510.76q0-26.66 18.98-45.64T224.62-800h510.76q26.66 0 45.64 18.98T800-735.38v200.3q0 15.09-11.15 23.47-11.16 8.38-25.85 5.46-10.08-2.7-20.95-3.66-10.88-.96-22.05-.96-20.23 0-39.35 3.19-19.11 3.2-37.57 9.04-4.5-.97-10-1.22-5.5-.24-10-.24H320q-8.5 0-14.25 5.76T300-479.97q0 8.51 5.75 14.24T320-460h243.46q-30.31 20.85-53.27 48.92-22.96 28.08-37.81 61.85H320q-8.5 0-14.25 5.76-5.75 5.75-5.75 14.27 0 8.51 5.75 14.24t14.25 5.73h138.38q-4.3 16.92-6.73 34.11-2.42 17.2-2.42 35.12 0 10 .46 21.08.46 11.07 2.39 22.69 1.92 13.92-6.21 25.08Q437.74-160 423.92-160h-199.3Z" /></svg>
icon:sb_details = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M404.62-220q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-220H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-700H404.62ZM213.08-186.92q-21.9 0-37.49-15.59Q160-218.11 160-240t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-458.11 160-480t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-698.11 160-720t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Z" /></svg>
icon:sb_novel = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M315.41-295.38q8.51 0 14.24-5.75t5.73-14.25V-780q0-8.5-5.75-14.25-5.76-5.75-14.27-5.75t-14.24 5.75q-5.74 5.75-5.74 14.25v464.62q0 8.5 5.76 14.25t14.27 5.75ZM735.38-120H249.23q-37.18 0-63.2-26.03Q160-172.05 160-209.23v-541.54q0-37.18 26.03-63.2Q212.05-840 249.23-840h221.23q-19.38 30.38-30.31 65.62-10.92 35.23-10.92 74.38 0 103.77 67.58 179.69 67.57 75.93 167.81 88.54V-320q0 26.65-18.99 45.63-18.98 18.99-45.63 18.99H249.23q-20.08 0-34.65 13.67Q200-228.04 200-207.83t14.58 34.02Q229.15-160 249.23-160h486.15q10.77 0 17.7-6.92 6.92-6.93 6.92-17.7v-251.61q11.23-2.69 20.85-5.81 9.61-3.11 19.15-7.42v264.5q0 27.19-18.98 46.08Q762.04-120 735.38-120ZM700-500q0-83.64 58.18-141.82Q816.36-700 900-700q-83.64 0-141.82-58.18Q700-816.36 700-900q0 83.64-58.18 141.82Q583.64-700 500-700q83.64 0 141.82 58.18Q700-583.64 700-500Z" /></svg>
icon:sb_outline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M320-607.69q13.15 0 22.73-9.58t9.58-22.73q0-13.15-9.58-22.73T320-672.31q-13.15 0-22.73 9.58T287.69-640q0 13.15 9.58 22.73t22.73 9.58Zm0 160q13.15 0 22.73-9.58t9.58-22.73q0-13.15-9.58-22.73T320-512.31q-13.15 0-22.73 9.58T287.69-480q0 13.15 9.58 22.73t22.73 9.58Zm0 160q13.15 0 22.73-9.58t9.58-22.73q0-13.15-9.58-22.73T320-352.31q-13.15 0-22.73 9.58T287.69-320q0 13.15 9.58 22.73t22.73 9.58ZM224.62-160q-27.62 0-46.12-18.5Q160-197 160-224.62v-510.76q0-27.62 18.5-46.12Q197-800 224.62-800h371.61q12.92 0 25.12 5.23 12.19 5.23 20.88 13.92l138.62 138.62q8.69 8.69 13.92 20.88 5.23 12.2 5.23 25.12v371.61q0 27.62-18.5 46.12Q763-160 735.38-160H224.62ZM600-760v127.69q0 13.93 9.19 23.12 9.19 9.19 23.12 9.19H760L600-760Z" /></svg>
icon:sb_project = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M569.23-152.31v-42.92q0-6.46 2.23-12.04 2.23-5.58 7.46-10.81l203.62-202.61q5.92-5.16 12.31-7.62 6.38-2.46 12.77-2.46 6.61 0 13.38 2.58 6.77 2.57 11.92 7.73l37 37.77q4.93 5.92 7.5 12.31Q880-364 880-357.62q0 6.39-2.08 12.89-2.07 6.5-8 12.42L667.31-129.69q-5.23 5.23-10.81 7.46-5.58 2.23-12.04 2.23h-42.92q-13.92 0-23.12-9.19-9.19-9.19-9.19-23.12Zm238.39-167.07 37-38.24-37-37.76-38 38 38 38ZM184.62-200q-27.62 0-46.12-18.5Q120-237 120-264.62v-430.76q0-27.62 18.5-46.12Q157-760 184.62-760H357q12.92 0 25.12 5.23 12.19 5.23 20.88 13.92L463.85-680h311.53q27.62 0 46.12 18.5Q840-643 840-615.38v61.46q0 12.61-9.88 20.92-9.89 8.31-22.74 6.85H804.85q-22.62 0-44.43 8.46-21.8 8.46-40.27 24.61L493-266.69q-8.69 8.69-13.92 20.5t-5.23 24.73v.69q0 8.54-6.12 14.65-6.11 6.12-14.65 6.12H184.62Z" /></svg>
icon:sb_search = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M381.54-350.77q-95.92 0-162.58-66.65-66.65-66.66-66.65-162.58 0-95.92 66.65-162.58 66.66-66.65 162.58-66.65 95.92 0 162.58 66.65 66.65 66.66 66.65 162.58 0 41.69-14.77 80.69t-38.77 66.69l236.31 236.31q5.61 5.62 6 13.77.38 8.16-6 14.54-6.39 6.38-14.16 6.38-7.76 0-14.15-6.38L528.92-404.31q-30 25.54-69 39.54t-78.38 14Zm0-40q79.61 0 134.42-54.81 54.81-54.8 54.81-134.42 0-79.62-54.81-134.42-54.81-54.81-134.42-54.81-79.62 0-134.42 54.81-54.81 54.8-54.81 134.42 0 79.62 54.81 134.42 54.8 54.81 134.42 54.81Z" /></svg>
icon:sb_stats = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M672.31-200q-13.73 0-23.02-9.29T640-232.31V-360q0-13.73 9.29-23.02t23.02-9.29h55.38q13.73 0 23.02 9.29T760-360v127.69q0 13.73-9.29 23.02T727.69-200h-55.38Zm-220 0q-13.73 0-23.02-9.29T420-232.31v-495.38q0-13.73 9.29-23.02t23.02-9.29h55.38q13.73 0 23.02 9.29t9.29 23.02v495.38q0 13.73-9.29 23.02T507.69-200h-55.38Zm-220 0q-13.73 0-23.02-9.29T200-232.31v-302.7q0-14.3 9.29-23.49 9.29-9.19 23.02-9.19h55.38q13.73 0 23.02 9.29 9.29 9.28 9.29 23.02v302.7q0 14.3-9.29 23.49-9.29 9.19-23.02 9.19h-55.38Z" /></svg>
icon:sb_story = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M320-607.69q13.15 0 22.73-9.58t9.58-22.73q0-13.15-9.58-22.73T320-672.31q-13.15 0-22.73 9.58T287.69-640q0 13.15 9.58 22.73t22.73 9.58Zm0 160q13.15 0 22.73-9.58t9.58-22.73q0-13.15-9.58-22.73T320-512.31q-13.15 0-22.73 9.58T287.69-480q0 13.15 9.58 22.73t22.73 9.58Zm0 160q13.15 0 22.73-9.58t9.58-22.73q0-13.15-9.58-22.73T320-352.31q-13.15 0-22.73 9.58T287.69-320q0 13.15 9.58 22.73t22.73 9.58ZM224.62-160q-27.62 0-46.12-18.5Q160-197 160-224.62v-510.76q0-27.62 18.5-46.12Q197-800 224.62-800h371.61q12.92 0 25.12 5.23 12.19 5.23 20.88 13.92l138.62 138.62q8.69 8.69 13.92 20.88 5.23 12.2 5.23 25.12v371.61q0 27.62-18.5 46.12Q763-160 735.38-160H224.62ZM600-760v127.69q0 13.93 9.19 23.12 9.19 9.19 23.12 9.19H760L600-760Z" /></svg>
icon:theme_light = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-320q-66.85 0-113.42-46.58Q320-413.15 320-480t46.58-113.42Q413.15-640 480-640t113.42 46.58Q640-546.85 640-480t-46.58 113.42Q546.85-320 480-320ZM80-460q-8.5 0-14.25-5.76T60-480.03q0-8.51 5.75-14.24T80-500h100q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T180-460H80Zm700 0q-8.5 0-14.25-5.76T760-480.03q0-8.51 5.75-14.24T780-500h100q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T880-460H780ZM479.97-760q-8.51 0-14.24-5.75T460-780v-100q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T500-880v100q0 8.5-5.76 14.25T479.97-760Zm0 700q-8.51 0-14.24-5.75T460-80v-100q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T500-180v100q0 8.5-5.76 14.25T479.97-60ZM254.46-678.77l-57.61-55.85q-5.85-5.61-5.73-13.76.11-8.16 5.96-14.77 6.38-6.62 14.15-6.62 7.77 0 14.15 6.62L282-706.31q6.38 6.62 6.38 14.16 0 7.53-6 14.15t-13.65 6.12q-7.65-.5-14.27-6.89Zm480.16 481.92L678-253.69q-6.38-6.62-6.38-14.27 0-7.66 6.38-14.04 5.23-6.62 13.08-6.12 7.84.5 14.46 6.89l57.61 55.85q5.85 5.61 5.73 13.76-.11 8.16-5.96 14.77-6.38 6.62-14.15 6.62-7.77 0-14.15-6.62ZM678-677.62q-6.62-6-6.12-13.65t6.89-14.27l55.85-57.61q5.61-5.85 13.76-5.73 8.16.11 14.77 5.96 6.62 6.38 6.62 14.15 0 7.77-6.62 14.15L706.31-678q-6.62 6.38-14.16 6.38-7.53 0-14.15-6ZM196.85-196.68q-6.62-6.78-6.62-14.55 0-7.77 6.62-14.15L253.69-282q6.62-6.38 14.27-6.38 7.66 0 14.04 6.38 5.85 5.23 5.35 13.08-.5 7.84-6.12 14.46l-55.85 57.61q-6.38 6.62-14.15 6.5-7.77-.11-14.38-6.33Z" /></svg>
icon:theme_dark = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M482.31-160Q349-160 255.65-253.35 162.31-346.69 162.31-480q0-98.77 56.54-181.42 56.53-82.66 160.38-118.89 12.23-4.31 21.46-2.27 9.23 2.04 15.23 7.96 6 5.93 7.66 15.24 1.65 9.3-2.5 19.53-7.77 19.08-11.27 38.85-3.5 19.77-3.5 41 0 106.92 74.54 181.46Q555.38-404 662.31-404q27.92 0 51.11-5.92 23.2-5.93 39.5-9.62 8.7-1.61 15.96.42 7.27 2.04 11.66 7.04 4.61 5 6.27 12.31 1.65 7.31-1.89 16.69-28.61 98-112.11 160.54Q589.31-160 482.31-160Z" /></svg>
icon:theme_auto = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480.13-120q-74.67 0-140.41-28.34-65.73-28.34-114.36-76.92-48.63-48.58-76.99-114.26Q120-405.19 120-479.87q0-74.67 28.34-140.41 28.34-65.73 76.92-114.36 48.58-48.63 114.26-76.99Q405.19-840 479.87-840q74.67 0 140.41 28.34 65.73 28.34 114.36 76.92 48.63 48.58 76.99 114.26Q840-554.81 840-480.13q0 74.67-28.34 140.41-28.34 65.73-76.92 114.36-48.58 48.63-114.26 76.99Q554.81-120 480.13-120ZM500-160.69q123.62-8.08 211.81-98.35T800-480q0-130.69-87.42-220.19-87.43-89.5-212.58-99.12v638.62Z" /></svg>
@@ -107,7 +118,9 @@ icon:lines = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:link = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M283.08-316.92q-67.68 0-115.38-47.69Q120-412.3 120-479.96t47.7-115.39q47.7-47.73 115.38-47.73h121.54q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24t-14.25 5.73H282.99q-50.68 0-86.84 36.16Q160-530.77 160-480t36.15 86.92q36.16 36.16 86.84 36.16h121.63q8.5 0 14.25 5.75 5.75 5.76 5.75 14.27 0 8.52-5.75 14.25t-14.25 5.73H283.08ZM360-460q-8.5 0-14.25-5.76T340-480.03q0-8.51 5.75-14.24T360-500h240q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T600-460H360Zm195.38 143.08q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73h121.63q50.68 0 86.84-36.16Q800-429.23 800-480t-36.15-86.92q-36.16-36.16-86.84-36.16H555.38q-8.5 0-14.25-5.75-5.75-5.76-5.75-14.27 0-8.52 5.75-14.25t14.25-5.73h121.54q67.68 0 115.38 47.69Q840-547.7 840-480.04t-47.7 115.39q-47.7 47.73-115.38 47.73H555.38Z" /></svg>
icon:list = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M404.62-220q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-220H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-700H404.62ZM213.08-186.92q-21.9 0-37.49-15.59Q160-218.11 160-240t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-458.11 160-480t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-698.11 160-720t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Z" /></svg>
icon:margin_bottom = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M220-160q-8.5 0-14.25-5.76T200-180.03q0-8.51 5.75-14.24T220-200h520q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T740-160H220Zm259.9-160.85q-6.36 0-11.82-2.11-5.46-2.12-10.7-7.35L321.85-465.85q-5.62-5.61-6-13.77-.39-8.15 6-14.53 6.38-6.39 14.15-6.39 7.77 0 14.15 6.39L460-384.31V-780q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T500-780v395.69l109.85-109.84q5.61-5.62 13.77-6 8.15-.39 14.53 6 6.39 6.38 6.39 14.15 0 7.77-6.39 14.15L502.62-330.31q-5.24 5.23-10.8 7.35-5.56 2.11-11.92 2.11Z" /></svg>
icon:margin_inner = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m632-460 69.85 69.85q5.61 5.61 6 13.77.38 8.15-6 14.53-6.39 6.39-14.16 6.39-7.77 0-14.15-6.39l-95.27-95.27q-5.5-5.5-7.62-11.06-2.11-5.56-2.11-11.92t2.11-11.82q2.12-5.46 7.62-10.96l95.27-95.27q5.61-5.62 13.77-6 8.15-.39 14.54 6 6.38 6.38 6.38 14.15 0 7.77-6.38 14.15L632-500h188q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T820-460H632ZM500-220q0 8.5-5.76 14.25T479.97-200q-8.51 0-14.24-5.75T460-220v-520q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T500-740v520ZM328-460H140q-8.5 0-14.25-5.76T120-480.03q0-8.51 5.75-14.24T140-500h188l-69.85-69.85q-5.61-5.61-6-13.77-.38-8.15 6-14.53 6.39-6.39 14.16-6.39 7.77 0 14.15 6.39l95.27 95.27q5.5 5.5 7.62 11.06 2.11 5.56 2.11 11.92t-2.11 11.82q-2.12 5.46-7.62 10.96l-95.27 95.27q-5.61 5.62-13.77 6-8.15.39-14.54-6-6.38-6.38-6.38-14.15 0-7.77 6.38-14.15L328-460Z" /></svg>
icon:margin_left = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M139.97-260q-8.51 0-14.24-5.75T120-280v-400q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T160-680v400q0 8.5-5.76 14.25T139.97-260Zm191.49-200 149.62 149.62q5.84 5.84 6.23 14.26.38 8.43-6.23 14.27-5.85 5.62-13.89 5.62-8.04 0-13.65-5.62L278-457.38q-5.23-5.24-7.35-10.8-2.11-5.56-2.11-11.92t2.11-11.82q2.12-5.46 7.35-10.7l174.77-175.53q5.36-5.62 13.64-5.62 8.28 0 13.76 5.48 5.98 5.98 6.25 14.02.27 8.04-5.34 13.65L332.23-500H820q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T820-460H331.46Z" /></svg>
icon:margin_outer = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M763.15-459.23H520V-500h243.15L654.31-608.85q-5.62-5.84-6.12-14.27-.5-8.42 6.12-14.26 5.84-5.85 14.15-5.47 8.31.39 14.16 6.23l134.76 134.77q5.24 5.23 7.35 10.7 2.12 5.46 2.12 11.92t-2.12 11.92q-2.11 5.46-7.35 10.69L681.85-321.08q-5.85 5.85-13.39 5.85-7.54 0-14.15-5.85-6.62-5.84-6.62-14.27 0-8.42 6.62-15.03l108.84-108.85Zm-567.07 0 110.38 110.38q5.62 5.85 5.35 13.89-.27 8.04-6.12 13.88-5.84 5.85-13.38 5.85-7.54 0-13.39-5.85l-136.3-135.54q-5.24-5.23-7.35-10.69-2.12-5.46-2.12-11.92t2.12-11.92q2.11-5.47 7.35-10.7l135.53-135.53q5.85-5.85 13.77-5.85 7.93 0 13.77 5.85 6.62 5.84 6.23 14.26-.38 8.43-6.23 14.27L196.85-500H440v40.77H196.08Z" /></svg>
icon:margin_right = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M819.97-260q-8.51 0-14.24-5.75T800-280v-400q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T840-680v400q0 8.5-5.76 14.25T819.97-260ZM628.54-460H140q-8.5 0-14.25-5.76T120-480.03q0-8.51 5.75-14.24T140-500h487.77L478.92-650.62q-5.61-5.61-5.34-13.26.27-7.66 6.11-13.64 5.36-5.48 13.64-5.48 8.29 0 13.9 5.62L682-502.62q5.23 5.24 7.35 10.8 2.11 5.56 2.11 11.92t-2.11 11.82q-2.12 5.46-7.35 10.7L506.46-281.85q-5.42 5.62-13.56 5.62-8.13 0-13.98-5.62-6.61-5.84-6.23-14.27.39-8.42 6.23-14.26L628.54-460Z" /></svg>
icon:margin_top = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M220-760q-8.5 0-14.25-5.76T200-780.03q0-8.51 5.75-14.24T220-800h520q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T740-760H220Zm259.97 600q-8.51 0-14.24-5.75T460-180v-395.69L350.15-465.85q-6.38 6.39-14.15 6.39-7.77 0-14.15-6.39-6.39-6.38-6-14.53.38-8.16 6-13.77l135.53-135.54q5.24-5.23 10.8-7.35 5.56-2.11 11.92-2.11t11.82 2.11q5.46 2.12 10.7 7.35l135.53 135.54q6.39 6.38 6.39 14.15 0 7.77-6.39 14.15-6.38 6.39-14.53 6-8.16-.38-13.77-6L500-575.69V-180q0 8.5-5.76 14.25T479.97-160Z" /></svg>
icon:maximise = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-200h116.92q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T316.92-160H192.31q-13.73 0-23.02-9.29T160-192.31v-124.61q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75t5.73 14.25V-200Zm560.77 0v-116.92q0-8.5 5.76-14.25 5.75-5.75 14.27-5.75 8.51 0 14.24 5.75t5.73 14.25v124.61q0 13.73-9.29 23.02T768.46-160H643.85q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73h116.92ZM200-760v116.92q0 8.5-5.76 14.25t-14.27 5.75q-8.51 0-14.24-5.75T160-643.08v-124.61q0-13.73 9.29-23.02t23.02-9.29h124.61q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T316.92-760H200Zm560.77 0H643.85q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73h124.61q13.73 0 23.02 9.29t9.29 23.02v124.61q0 8.5-5.76 14.25t-14.27 5.75q-8.51 0-14.24-5.75t-5.73-14.25V-760Z" /></svg>

View File

@@ -22,21 +22,33 @@ icon:cls_template = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:cls_timeline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M320-160h320v-120q0-66-47-113t-113-47q-66 0-113 47t-47 113v120Zm160-360q66 0 113-47t47-113v-120H320v120q0 66 47 113t113 47ZM200-80q-17 0-28.5-11.5T160-120q0-17 11.5-28.5T200-160h40v-120q0-61 28.5-114.5T348-480q-51-32-79.5-85.5T240-680v-120h-40q-17 0-28.5-11.5T160-840q0-17 11.5-28.5T200-880h560q17 0 28.5 11.5T800-840q0 17-11.5 28.5T760-800h-40v120q0 61-28.5 114.5T612-480q51 32 79.5 85.5T720-280v120h40q17 0 28.5 11.5T800-120q0 17-11.5 28.5T760-80H200Z" /></svg>
icon:cls_trash = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M280-120q-33 0-56.5-23.5T200-200v-520q-17 0-28.5-11.5T160-760q0-17 11.5-28.5T200-800h160q0-17 11.5-28.5T400-840h160q17 0 28.5 11.5T600-800h160q17 0 28.5 11.5T800-760q0 17-11.5 28.5T760-720v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM400-280q17 0 28.5-11.5T440-320v-280q0-17-11.5-28.5T400-640q-17 0-28.5 11.5T360-600v280q0 17 11.5 28.5T400-280Zm160 0q17 0 28.5-11.5T600-320v-280q0-17-11.5-28.5T560-640q-17 0-28.5 11.5T520-600v280q0 17 11.5 28.5T560-280ZM280-720v520-520Z" /></svg>
icon:cls_world = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-7-.5-14.5T799-507q-5 29-27 48t-52 19h-80q-33 0-56.5-23.5T560-520v-40H400v-80q0-33 23.5-56.5T480-720h40q0-23 12.5-40.5T563-789q-20-5-40.5-8t-42.5-3q-134 0-227 93t-93 227h200q66 0 113 47t47 113v40H400v110q20 5 39.5 7.5T480-160Z" /></svg>
icon:key_pov = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-240ZM224-378q62-31 126-46.5T480-440q4 0 7-.5t7 .5q17 4 25.5 19t3.5 32q-5 17-19.5 23.5T472-360q-54-3-107.5 12.5T260-306q-9 5-14.5 14t-5.5 20v32h266q20 0 30 12.5t10 27.5q0 15-10 27.5T506-160H240q-33 0-56.5-23.5T160-240v-32q0-34 17.5-62.5T224-378Zm256-102q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47Zm0-80q33 0 56.5-23.5T560-640q0-33-23.5-56.5T480-720q-33 0-56.5 23.5T400-640q0 33 23.5 56.5T480-560Zm0-80Zm236 248q20-20 36.5-34t45.5-14q37 0 59.5 25.5T880-357q0 15-6 30t-18 27L744-188q-12 12-28 12t-28-12L576-300q-13-13-18.5-28t-5.5-30q0-32 23-57t59-25q28 0 44 13t38 35Z" /></svg>
icon:key_focus = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m702-593 141-142q12-12 28.5-12t28.5 12q12 12 12 28.5T900-678L730-508q-12 12-28 12t-28-12l-85-85q-12-12-12-28.5t12-28.5q12-12 28-12t28 12l57 57ZM360-480q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47ZM40-240v-32q0-34 17.5-62.5T104-378q62-31 126-46.5T360-440q66 0 130 15.5T616-378q29 15 46.5 43.5T680-272v32q0 33-23.5 56.5T600-160H120q-33 0-56.5-23.5T40-240Zm80 0h480v-32q0-11-5.5-20T580-306q-54-27-109-40.5T360-360q-56 0-111 13.5T140-306q-9 5-14.5 14t-5.5 20v32Zm240-320q33 0 56.5-23.5T440-640q0-33-23.5-56.5T360-720q-33 0-56.5 23.5T280-640q0 33 23.5 56.5T360-560Zm0 260Zm0-340Z" /></svg>
icon:key_mention = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M720-520h-80q-17 0-28.5-11.5T600-560q0-17 11.5-28.5T640-600h80v-80q0-17 11.5-28.5T760-720q17 0 28.5 11.5T800-680v80h80q17 0 28.5 11.5T920-560q0 17-11.5 28.5T880-520h-80v80q0 17-11.5 28.5T760-400q-17 0-28.5-11.5T720-440v-80Zm-360 40q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47ZM40-240v-32q0-34 17.5-62.5T104-378q62-31 126-46.5T360-440q66 0 130 15.5T616-378q29 15 46.5 43.5T680-272v32q0 33-23.5 56.5T600-160H120q-33 0-56.5-23.5T40-240Zm80 0h480v-32q0-11-5.5-20T580-306q-54-27-109-40.5T360-360q-56 0-111 13.5T140-306q-9 5-14.5 14t-5.5 20v32Zm240-320q33 0 56.5-23.5T440-640q0-33-23.5-56.5T360-720q-33 0-56.5 23.5T280-640q0 33 23.5 56.5T360-560Zm0-80Zm0 400Z" /></svg>
icon:cmn_general = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-240q-17 0-28.5-11.5T120-280q0-17 11.5-28.5T160-320h400q17 0 28.5 11.5T600-280q0 17-11.5 28.5T560-240H160Zm0-200q-17 0-28.5-11.5T120-480q0-17 11.5-28.5T160-520h640q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H160Zm0-200q-17 0-28.5-11.5T120-680q0-17 11.5-28.5T160-720h640q17 0 28.5 11.5T840-680q0 17-11.5 28.5T800-640H160Z" /></svg>
icon:cmn_note = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m240-240-92 92q-19 19-43.5 8.5T80-177v-623q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240Zm-34-80h594v-480H160v525l46-45Zm-46 0v-480 480Zm120-80h240q17 0 28.5-11.5T560-440q0-17-11.5-28.5T520-480H280q-17 0-28.5 11.5T240-440q0 17 11.5 28.5T280-400Zm0-120h400q17 0 28.5-11.5T720-560q0-17-11.5-28.5T680-600H280q-17 0-28.5 11.5T240-560q0 17 11.5 28.5T280-520Zm0-120h400q17 0 28.5-11.5T720-680q0-17-11.5-28.5T680-720H280q-17 0-28.5 11.5T240-680q0 17 11.5 28.5T280-640Z" /></svg>
icon:cmn_story = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M267-200q-48 0-71-41.5t3-81.5l101-157-101-157q-26-40-3-81.5t71-41.5h333q20 0 37.5 9t28.5 25l141 200q15 21 15 46t-15 46L666-234q-11 16-28.5 25t-37.5 9H267Zm333-80 142-200-142-200H266l102 156q13 20 13 44t-13 44L266-280h334Zm-96-200Z" /></svg>
icon:prj_folder = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h207q16 0 30.5 6t25.5 17l57 57h320q33 0 56.5 23.5T880-640v400q0 33-23.5 56.5T800-160H160Zm0-80h640v-400H447l-80-80H160v480Zm0 0v-480 480Z" /></svg>
icon:prj_document = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h407q16 0 30.5 6t25.5 17l154 154q11 11 17 25.5t6 30.5v407q0 33-23.5 56.5T760-120H200Zm0-80h560v-400H640q-17 0-28.5-11.5T600-640v-120H200v560Zm440-80q17 0 28.5-11.5T680-320q0-17-11.5-28.5T640-360H320q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280h320ZM440-600q17 0 28.5-11.5T480-640q0-17-11.5-28.5T440-680H320q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600h120Zm200 160q17 0 28.5-11.5T680-480q0-17-11.5-28.5T640-520H320q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440h320ZM200-760v160-160 560-560Z" /></svg>
icon:prj_title = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h407q16 0 30.5 6t25.5 17l154 154q11 11 17 25.5t6 30.5v407q0 33-23.5 56.5T760-120H200Zm0-80h560v-400H640q-17 0-28.5-11.5T600-640v-120H200v560Zm440-80q17 0 28.5-11.5T680-320q0-17-11.5-28.5T640-360H320q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280h320ZM440-600q17 0 28.5-11.5T480-640q0-17-11.5-28.5T440-680H320q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600h120Zm200 160q17 0 28.5-11.5T680-480q0-17-11.5-28.5T640-520H320q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440h320ZM200-760v160-160 560-560Z" /></svg>
icon:prj_chapter = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h407q16 0 30.5 6t25.5 17l154 154q11 11 17 25.5t6 30.5v407q0 33-23.5 56.5T760-120H200Zm0-80h560v-400H640q-17 0-28.5-11.5T600-640v-120H200v560Zm440-80q17 0 28.5-11.5T680-320q0-17-11.5-28.5T640-360H320q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280h320ZM440-600q17 0 28.5-11.5T480-640q0-17-11.5-28.5T440-680H320q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600h120Zm200 160q17 0 28.5-11.5T680-480q0-17-11.5-28.5T640-520H320q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440h320ZM200-760v160-160 560-560Z" /></svg>
icon:prj_scene = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h407q16 0 30.5 6t25.5 17l154 154q11 11 17 25.5t6 30.5v407q0 33-23.5 56.5T760-120H200Zm0-80h560v-400H640q-17 0-28.5-11.5T600-640v-120H200v560Zm440-80q17 0 28.5-11.5T680-320q0-17-11.5-28.5T640-360H320q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280h320ZM440-600q17 0 28.5-11.5T480-640q0-17-11.5-28.5T440-680H320q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600h120Zm200 160q17 0 28.5-11.5T680-480q0-17-11.5-28.5T640-520H320q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440h320ZM200-760v160-160 560-560Z" /></svg>
icon:prj_note = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-200h360v-160q0-17 11.5-28.5T600-400h160v-360H200v560Zm0 80q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v367q0 16-6 30.5T817-337L623-143q-11 11-25.5 17t-30.5 6H200Zm240-280H320q-17 0-28.5-11.5T280-440q0-17 11.5-28.5T320-480h120q17 0 28.5 11.5T480-440q0 17-11.5 28.5T440-400Zm200-160H320q-17 0-28.5-11.5T280-600q0-17 11.5-28.5T320-640h320q17 0 28.5 11.5T680-600q0 17-11.5 28.5T640-560ZM200-200v-560 560Z" /></svg>
icon:fmt_align_center = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-120q-17 0-28.5-11.5T120-160q0-17 11.5-28.5T160-200h640q17 0 28.5 11.5T840-160q0 17-11.5 28.5T800-120H160Zm160-160q-17 0-28.5-11.5T280-320q0-17 11.5-28.5T320-360h320q17 0 28.5 11.5T680-320q0 17-11.5 28.5T640-280H320ZM160-440q-17 0-28.5-11.5T120-480q0-17 11.5-28.5T160-520h640q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H160Zm160-160q-17 0-28.5-11.5T280-640q0-17 11.5-28.5T320-680h320q17 0 28.5 11.5T680-640q0 17-11.5 28.5T640-600H320ZM160-760q-17 0-28.5-11.5T120-800q0-17 11.5-28.5T160-840h640q17 0 28.5 11.5T840-800q0 17-11.5 28.5T800-760H160Z" /></svg>
icon:fmt_align_left = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-120q-17 0-28.5-11.5T120-160q0-17 11.5-28.5T160-200h640q17 0 28.5 11.5T840-160q0 17-11.5 28.5T800-120H160Zm0-160q-17 0-28.5-11.5T120-320q0-17 11.5-28.5T160-360h400q17 0 28.5 11.5T600-320q0 17-11.5 28.5T560-280H160Zm0-160q-17 0-28.5-11.5T120-480q0-17 11.5-28.5T160-520h640q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H160Zm0-160q-17 0-28.5-11.5T120-640q0-17 11.5-28.5T160-680h400q17 0 28.5 11.5T600-640q0 17-11.5 28.5T560-600H160Zm0-160q-17 0-28.5-11.5T120-800q0-17 11.5-28.5T160-840h640q17 0 28.5 11.5T840-800q0 17-11.5 28.5T800-760H160Z" /></svg>
icon:fmt_align_right = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-760q-17 0-28.5-11.5T120-800q0-17 11.5-28.5T160-840h640q17 0 28.5 11.5T840-800q0 17-11.5 28.5T800-760H160Zm240 160q-17 0-28.5-11.5T360-640q0-17 11.5-28.5T400-680h400q17 0 28.5 11.5T840-640q0 17-11.5 28.5T800-600H400ZM160-440q-17 0-28.5-11.5T120-480q0-17 11.5-28.5T160-520h640q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H160Zm240 160q-17 0-28.5-11.5T360-320q0-17 11.5-28.5T400-360h400q17 0 28.5 11.5T840-320q0 17-11.5 28.5T800-280H400ZM160-120q-17 0-28.5-11.5T120-160q0-17 11.5-28.5T160-200h640q17 0 28.5 11.5T840-160q0 17-11.5 28.5T800-120H160Z" /></svg>
icon:fmt_bold = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M352-200q-33 0-56.5-23.5T272-280v-400q0-33 23.5-56.5T352-760h141q65 0 120 40t55 111q0 51-23 78.5T602-491q25 11 55.5 41t30.5 90q0 89-65 124.5T501-200H352Zm41-112h104q48 0 58.5-24.5T566-372q0-11-10.5-35.5T494-432H393v120Zm0-228h93q33 0 48-17t15-38q0-24-17-39t-44-15h-95v109Z" /></svg>
icon:fmt_italic = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M250-200q-21 0-35.5-14.5T200-250q0-21 14.5-35.5T250-300h110l120-360H370q-21 0-35.5-14.5T320-710q0-21 14.5-35.5T370-760h300q21 0 35.5 14.5T720-710q0 21-14.5 35.5T670-660h-90L460-300h90q21 0 35.5 14.5T600-250q0 21-14.5 35.5T550-200H250Z" /></svg>
icon:fmt_link = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M280-280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h120q17 0 28.5 11.5T440-640q0 17-11.5 28.5T400-600H280q-50 0-85 35t-35 85q0 50 35 85t85 35h120q17 0 28.5 11.5T440-320q0 17-11.5 28.5T400-280H280Zm80-160q-17 0-28.5-11.5T320-480q0-17 11.5-28.5T360-520h240q17 0 28.5 11.5T640-480q0 17-11.5 28.5T600-440H360Zm200 160q-17 0-28.5-11.5T520-320q0-17 11.5-28.5T560-360h120q50 0 85-35t35-85q0-50-35-85t-85-35H560q-17 0-28.5-11.5T520-640q0-17 11.5-28.5T560-680h120q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H560Z" /></svg>
icon:fmt_list_o = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M150-80q-13 0-21.5-8.5T120-110q0-13 8.5-21.5T150-140h70v-30h-30q-13 0-21.5-8.5T160-200q0-13 8.5-21.5T190-230h30v-30h-70q-13 0-21.5-8.5T120-290q0-13 8.5-21.5T150-320h90q17 0 28.5 11.5T280-280v40q0 17-11.5 28.5T240-200q17 0 28.5 11.5T280-160v40q0 17-11.5 28.5T240-80h-90Zm0-280q-13 0-21.5-8.5T120-390v-80q0-17 11.5-28.5T160-510h60v-30h-70q-13 0-21.5-8.5T120-570q0-13 8.5-21.5T150-600h90q17 0 28.5 11.5T280-560v70q0 17-11.5 28.5T240-450h-60v30h70q13 0 21.5 8.5T280-390q0 13-8.5 21.5T250-360H150Zm60-280q-13 0-21.5-8.5T180-670v-150h-30q-13 0-21.5-8.5T120-850q0-13 8.5-21.5T150-880h60q13 0 21.5 8.5T240-850v180q0 13-8.5 21.5T210-640Zm190 440q-17 0-28.5-11.5T360-240q0-17 11.5-28.5T400-280h400q17 0 28.5 11.5T840-240q0 17-11.5 28.5T800-200H400Zm0-240q-17 0-28.5-11.5T360-480q0-17 11.5-28.5T400-520h400q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H400Zm0-240q-17 0-28.5-11.5T360-720q0-17 11.5-28.5T400-760h400q17 0 28.5 11.5T840-720q0 17-11.5 28.5T800-680H400Z" /></svg>
icon:fmt_list_u = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M400-200q-17 0-28.5-11.5T360-240q0-17 11.5-28.5T400-280h400q17 0 28.5 11.5T840-240q0 17-11.5 28.5T800-200H400Zm0-240q-17 0-28.5-11.5T360-480q0-17 11.5-28.5T400-520h400q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H400Zm0-240q-17 0-28.5-11.5T360-720q0-17 11.5-28.5T400-760h400q17 0 28.5 11.5T840-720q0 17-11.5 28.5T800-680H400ZM200-160q-33 0-56.5-23.5T120-240q0-33 23.5-56.5T200-320q33 0 56.5 23.5T280-240q0 33-23.5 56.5T200-160Zm0-240q-33 0-56.5-23.5T120-480q0-33 23.5-56.5T200-560q33 0 56.5 23.5T280-480q0 33-23.5 56.5T200-400Zm0-240q-33 0-56.5-23.5T120-720q0-33 23.5-56.5T200-800q33 0 56.5 23.5T280-720q0 33-23.5 56.5T200-640Z" /></svg>
icon:fmt_mark = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160 0q-33 0-56.5-23.5T80-80q0-33 23.5-56.5T160-160h640q33 0 56.5 23.5T880-80q0 33-23.5 56.5T800 0H160Zm424-480L480-584 320-424l103 104 161-160Zm-47-160 103 103 160-159-104-104-159 160Zm-84-29 216 216-189 190q-24 24-56.5 24T367-263l-5 4q-11 9-24 14t-27 5H189q-14 0-19.5-12t4.5-22l92-91q-24-24-25-57.5t23-57.5l189-189Zm0 0 187-187q24-24 56.5-24t56.5 24l104 103q24 24 24 56.5T857-640L669-453 453-669Z" /></svg>
icon:fmt_size = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M560-680H420q-25 0-42.5-17.5T360-740q0-25 17.5-42.5T420-800h400q25 0 42.5 17.5T880-740q0 25-17.5 42.5T820-680H680v460q0 25-17.5 42.5T620-160q-25 0-42.5-17.5T560-220v-460ZM200-480h-60q-25 0-42.5-17.5T80-540q0-25 17.5-42.5T140-600h240q25 0 42.5 17.5T440-540q0 25-17.5 42.5T380-480h-60v260q0 25-17.5 42.5T260-160q-25 0-42.5-17.5T200-220v-260Z" /></svg>
icon:fmt_strike = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M486-160q-63 0-116.5-33.5T285-283q-9-16-2.5-33.5T306-343q18-10 37.5-3.5T374-322q18 30 48.5 48t65.5 18q44 0 76.5-27t32.5-69q0-20 14-34t34-14q20 0 34.5 14t14.5 34v12q0 79-62.5 129.5T486-160ZM120-480q-17 0-28.5-11.5T80-520q0-17 11.5-28.5T120-560h720q17 0 28.5 11.5T880-520q0 17-11.5 28.5T840-480H120Zm208-165q-17-10-23-29.5t4-36.5q25-47 72-71t101-24q48 0 90.5 20t71.5 58q11 14 7 32t-19 29q-17 12-36.5 9T562-677q-15-17-35-25t-43-8q-27 0-52 11t-38 34q-10 18-29.5 24t-36.5-4Z" /></svg>
icon:fmt_subscript = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M800-160q-17 0-28.5-11.5T760-200v-40q0-17 11.5-28.5T800-280h80v-40H780q-8 0-14-6t-6-14q0-8 6-14t14-6h100q17 0 28.5 11.5T920-320v40q0 17-11.5 28.5T880-240h-80v40h100q8 0 14 6t6 14q0 8-6 14t-14 6H800Zm-483-80q-27 0-39.5-23t1.5-46l141-222-128-201q-14-22-1.5-45t38.5-23q12 0 22 5.5t16 15.5l111 179h4l110-179q6-10 16.5-15.5T630-800q27 0 39 23t-2 46L539-531l142 222q14 23 1 46t-39 23q-12 0-22-5.5T605-261L482-457h-4L355-261q-6 10-16.5 15.5T317-240Z" /></svg>
icon:fmt_superscript = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M800-600q-17 0-28.5-11.5T760-640v-40q0-17 11.5-28.5T800-720h80v-40H780q-8 0-14-6t-6-14q0-8 6-14t14-6h100q17 0 28.5 11.5T920-760v40q0 17-11.5 28.5T880-680h-80v40h100q8 0 14 6t6 14q0 8-6 14t-14 6H800ZM317-160q-27 0-39.5-23t1.5-46l141-222-128-201q-14-22-1.5-45t38.5-23q12 0 22 5.5t16 15.5l111 179h4l110-179q6-10 16.5-15.5T630-720q27 0 39 23t-2 46L539-451l142 222q14 23 1 46t-39 23q-12 0-22-5.5T605-181L482-377h-4L355-181q-6 10-16.5 15.5T317-160Z" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M240-120q-17 0-28.5-11.5T200-160q0-17 11.5-28.5T240-200h480q17 0 28.5 11.5T760-160q0 17-11.5 28.5T720-120H240Zm240-160q-101 0-157-63t-56-167v-279q0-21 15.5-36t36.5-15q21 0 36 15t15 36v285q0 56 28 91t82 35q54 0 82-35t28-91v-285q0-21 15.5-36t36.5-15q21 0 36 15t15 36v279q0 104-56 167t-157 63Z" /></svg>
icon:fmt_toolbar = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M240-200q-17 0-28.5-11.5T200-240q0-17 11.5-28.5T240-280h480q17 0 28.5 11.5T760-240q0 17-11.5 28.5T720-200H240Zm54-208 137-368q4-11 13.5-17.5T466-800h28q12 0 21.5 6.5T529-776l137 369q6 17-4 32t-28 15q-11 0-20.5-6.5T600-384l-30-88H392l-32 89q-4 11-13 17t-20 6q-19 0-29.5-15.5T294-408Zm120-128h132l-64-182h-4l-64 182Z" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M240-120q-17 0-28.5-11.5T200-160q0-17 11.5-28.5T240-200h480q17 0 28.5 11.5T760-160q0 17-11.5 28.5T720-120H240Zm240-160q-101 0-157-63t-56-167v-279q0-21 15.5-36t36.5-15q21 0 36 15t15 36v285q0 56 28 91t82 35q54 0 82-35t28-91v-285q0-21 15.5-36t36.5-15q21 0 36 15t15 36v279q0 104-56 167t-157 63Z" /></svg>
icon:search = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M380-320q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l224 224q11 11 11 28t-11 28q-11 11-28 11t-28-11L532-372q-30 24-69 38t-83 14Zm0-80q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z" /></svg>
icon:search_auto = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m646-438-86 138q-11 17-30.5 14T505-309l-28-112-273 273q-11 11-27.5 11.5T148-148q-11-11-11-28t11-28l273-274-112-28q-20-5-23-24.5t14-30.5l138-85-12-163q-2-20 16-29t33 4l125 105 151-61q19-8 33 6t6 33l-61 151 105 124q13 15 4 33t-29 16l-163-11ZM134-706q-6-6-6-14t6-14l52-52q6-6 14-6t14 6l52 52q6 6 6 14t-6 14l-52 52q-6 6-14 6t-14-6l-52-52Zm421 263 48-79 93 7-60-71 35-86-86 35-71-59 7 92-79 49 90 22 23 90Zm151 309-52-52q-6-6-6-14t6-14l52-52q6-6 14-6t14 6l52 52q6 6 6 14t-6 14l-52 52q-6 6-14 6t-14-6ZM569-570Z" /></svg>
icon:search_cancel = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-424 284-228q-11 11-28 11t-28-11q-11-11-11-28t11-28l196-196-196-196q-11-11-11-28t11-28q11-11 28-11t28 11l196 196 196-196q11-11 28-11t28 11q11 11 11 28t-11 28L536-480l196 196q11 11 11 28t-11 28q-11 11-28 11t-28-11L480-424Z" /></svg>
@@ -52,12 +64,11 @@ icon:bullet-on = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:unfold-hide = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M420-308q-8 0-14-5.5t-6-14.5v-304q0-9 6-14.5t14-5.5q2 0 14 6l145 145q5 5 7 10t2 11q0 6-2 11t-7 10L434-314q-3 3-6.5 4.5T420-308Z" /></svg>
icon:unfold-show = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M459-381 314-526q-3-3-4.5-6.5T308-540q0-8 5.5-14t14.5-6h304q9 0 14.5 6t5.5 14q0 2-6 14L501-381q-5 5-10 7t-11 2q-6 0-11-2t-10-7Z" /></svg>
icon:sb_build = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M760-252v72q0 8 6 14t14 6q8 0 14-6t6-14v-120q0-8-6-14t-14-6H660q-8 0-14 6t-6 14q0 8 6 14t14 6h72l-98 98q-6 6-6 14t6 14q6 6 14 6t14-6l98-98ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v200q0 17-11.5 28.5T800-520q-17 0-28.5-11.5T760-560v-200H200v560h200q17 0 28.5 11.5T440-160q0 17-11.5 28.5T400-120H200Zm0-120v40-560 243-3 280Zm80-80q0 17 11.5 28.5T320-280h83q17 0 28.5-11.5T443-320q0-17-11.5-28.5T403-360h-83q-17 0-28.5 11.5T280-320Zm0-160q0 17 11.5 28.5T320-440h200q17 0 28.5-11.5T560-480q0-17-11.5-28.5T520-520H320q-17 0-28.5 11.5T280-480Zm0-160q0 17 11.5 28.5T320-600h320q17 0 28.5-11.5T680-640q0-17-11.5-28.5T640-680H320q-17 0-28.5 11.5T280-640ZM720-40q-83 0-141.5-58.5T520-240q0-83 58.5-141.5T720-440q83 0 141.5 58.5T920-240q0 83-58.5 141.5T720-40Z" /></svg>
icon:sb_details = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M400-200q-17 0-28.5-11.5T360-240q0-17 11.5-28.5T400-280h400q17 0 28.5 11.5T840-240q0 17-11.5 28.5T800-200H400Zm0-240q-17 0-28.5-11.5T360-480q0-17 11.5-28.5T400-520h400q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H400Zm0-240q-17 0-28.5-11.5T360-720q0-17 11.5-28.5T400-760h400q17 0 28.5 11.5T840-720q0 17-11.5 28.5T800-680H400ZM200-160q-33 0-56.5-23.5T120-240q0-33 23.5-56.5T200-320q33 0 56.5 23.5T280-240q0 33-23.5 56.5T200-160Zm0-240q-33 0-56.5-23.5T120-480q0-33 23.5-56.5T200-560q33 0 56.5 23.5T280-480q0 33-23.5 56.5T200-400Zm0-240q-33 0-56.5-23.5T120-720q0-33 23.5-56.5T200-800q33 0 56.5 23.5T280-720q0 33-23.5 56.5T200-640Z" /></svg>
icon:sb_novel = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-313q10-3 19.5-5t20.5-2h40v-480h-40q-17 0-28.5 11.5T200-760v447Zm40 233q-50 0-85-35t-35-85v-560q0-50 35-85t85-35h240q17 0 28.5 11.5T520-840q0 17-11.5 28.5T480-800H360v480h240v-80q0-17 11.5-28.5T640-440q17 0 28.5 11.5T680-400v160H240q-17 0-28.5 11.5T200-200q0 17 11.5 28.5T240-160h520v-280q0-17 11.5-28.5T800-480q17 0 28.5 11.5T840-440v280q0 33-23.5 56.5T760-80H240Zm-40-233v-487 487Zm500-167q0-92 64-156t156-64q-92 0-156-64t-64-156q0 92-64 156t-156 64q92 0 156 64t64 156Z" /></svg>
icon:sb_outline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M320-600q17 0 28.5-11.5T360-640q0-17-11.5-28.5T320-680q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600Zm0 160q17 0 28.5-11.5T360-480q0-17-11.5-28.5T320-520q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440Zm0 160q17 0 28.5-11.5T360-320q0-17-11.5-28.5T320-360q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h407q16 0 30.5 6t25.5 17l154 154q11 11 17 25.5t6 30.5v407q0 33-23.5 56.5T760-120H200Zm0-80h560v-400H640q-17 0-28.5-11.5T600-640v-120H200v560Zm0-560v160-160 560-560Z" /></svg>
icon:sb_project = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-240v-480 480Zm0 80q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h207q16 0 30.5 6t25.5 17l57 57h320q33 0 56.5 23.5T880-640v80q0 17-11.5 28.5T840-520q-17 0-28.5-11.5T800-560v-80H447l-80-80H160v480h280q17 0 28.5 11.5T480-200q0 17-11.5 28.5T440-160H160Zm400 40v-66q0-8 3-15.5t9-13.5l209-208q9-9 20-13t22-4q12 0 23 4.5t20 13.5l37 37q8 9 12.5 20t4.5 22q0 11-4 22.5T903-300L695-92q-6 6-13.5 9T666-80h-66q-17 0-28.5-11.5T560-120Zm300-223-37-37 37 37ZM620-140h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19Z" /></svg>
icon:sb_search = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M380-320q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l224 224q11 11 11 28t-11 28q-11 11-28 11t-28-11L532-372q-30 24-69 38t-83 14Zm0-80q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z" /></svg>
icon:sb_stats = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M680-160q-17 0-28.5-11.5T640-200v-200q0-17 11.5-28.5T680-440h80q17 0 28.5 11.5T800-400v200q0 17-11.5 28.5T760-160h-80Zm-240 0q-17 0-28.5-11.5T400-200v-560q0-17 11.5-28.5T440-800h80q17 0 28.5 11.5T560-760v560q0 17-11.5 28.5T520-160h-80Zm-240 0q-17 0-28.5-11.5T160-200v-360q0-17 11.5-28.5T200-600h80q17 0 28.5 11.5T320-560v360q0 17-11.5 28.5T280-160h-80Z" /></svg>
icon:sb_story = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M320-600q17 0 28.5-11.5T360-640q0-17-11.5-28.5T320-680q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600Zm0 160q17 0 28.5-11.5T360-480q0-17-11.5-28.5T320-520q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440Zm0 160q17 0 28.5-11.5T360-320q0-17-11.5-28.5T320-360q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h407q16 0 30.5 6t25.5 17l154 154q11 11 17 25.5t6 30.5v407q0 33-23.5 56.5T760-120H200Zm0-80h560v-400H640q-17 0-28.5-11.5T600-640v-120H200v560Zm0-560v160-160 560-560Z" /></svg>
icon:theme_light = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-360q50 0 85-35t35-85q0-50-35-85t-85-35q-50 0-85 35t-35 85q0 50 35 85t85 35Zm0 80q-83 0-141.5-58.5T280-480q0-83 58.5-141.5T480-680q83 0 141.5 58.5T680-480q0 83-58.5 141.5T480-280ZM80-440q-17 0-28.5-11.5T40-480q0-17 11.5-28.5T80-520h80q17 0 28.5 11.5T200-480q0 17-11.5 28.5T160-440H80Zm720 0q-17 0-28.5-11.5T760-480q0-17 11.5-28.5T800-520h80q17 0 28.5 11.5T920-480q0 17-11.5 28.5T880-440h-80ZM480-760q-17 0-28.5-11.5T440-800v-80q0-17 11.5-28.5T480-920q17 0 28.5 11.5T520-880v80q0 17-11.5 28.5T480-760Zm0 720q-17 0-28.5-11.5T440-80v-80q0-17 11.5-28.5T480-200q17 0 28.5 11.5T520-160v80q0 17-11.5 28.5T480-40ZM226-678l-43-42q-12-11-11.5-28t11.5-29q12-12 29-12t28 12l42 43q11 12 11 28t-11 28q-11 12-27.5 11.5T226-678Zm494 495-42-43q-11-12-11-28.5t11-27.5q11-12 27.5-11.5T734-282l43 42q12 11 11.5 28T777-183q-12 12-29 12t-28-12Zm-42-495q-12-11-11.5-27.5T678-734l42-43q11-12 28-11.5t29 11.5q12 12 12 29t-12 28l-43 42q-12 11-28 11t-28-11ZM183-183q-12-12-12-29t12-28l43-42q12-11 28.5-11t27.5 11q12 11 11.5 27.5T282-226l-42 43q-11 12-28 11.5T183-183Zm297-297Z" /></svg>
icon:theme_dark = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-120q-151 0-255.5-104.5T120-480q0-138 90-239.5T440-838q13-2 23 3.5t16 14.5q6 9 6.5 21t-7.5 23q-17 26-25.5 55t-8.5 61q0 90 63 153t153 63q31 0 61.5-9t54.5-25q11-7 22.5-6.5T819-479q10 5 15.5 15t3.5 24q-14 138-117.5 229T480-120Zm0-80q88 0 158-48.5T740-375q-20 5-40 8t-40 3q-123 0-209.5-86.5T364-660q0-20 3-40t8-40q-78 32-126.5 102T200-480q0 116 82 198t198 82Zm-10-270Z" /></svg>
icon:theme_auto = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm40-83q119-15 199.5-104.5T800-480q0-123-80.5-212.5T520-797v634Z" /></svg>
@@ -107,7 +118,9 @@ icon:lines = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:link = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M280-280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h120q17 0 28.5 11.5T440-640q0 17-11.5 28.5T400-600H280q-50 0-85 35t-35 85q0 50 35 85t85 35h120q17 0 28.5 11.5T440-320q0 17-11.5 28.5T400-280H280Zm80-160q-17 0-28.5-11.5T320-480q0-17 11.5-28.5T360-520h240q17 0 28.5 11.5T640-480q0 17-11.5 28.5T600-440H360Zm200 160q-17 0-28.5-11.5T520-320q0-17 11.5-28.5T560-360h120q50 0 85-35t35-85q0-50-35-85t-85-35H560q-17 0-28.5-11.5T520-640q0-17 11.5-28.5T560-680h120q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H560Z" /></svg>
icon:list = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M400-200q-17 0-28.5-11.5T360-240q0-17 11.5-28.5T400-280h400q17 0 28.5 11.5T840-240q0 17-11.5 28.5T800-200H400Zm0-240q-17 0-28.5-11.5T360-480q0-17 11.5-28.5T400-520h400q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440H400Zm0-240q-17 0-28.5-11.5T360-720q0-17 11.5-28.5T400-760h400q17 0 28.5 11.5T840-720q0 17-11.5 28.5T800-680H400ZM200-160q-33 0-56.5-23.5T120-240q0-33 23.5-56.5T200-320q33 0 56.5 23.5T280-240q0 33-23.5 56.5T200-160Zm0-240q-33 0-56.5-23.5T120-480q0-33 23.5-56.5T200-560q33 0 56.5 23.5T280-480q0 33-23.5 56.5T200-400Zm0-240q-33 0-56.5-23.5T120-720q0-33 23.5-56.5T200-800q33 0 56.5 23.5T280-720q0 33-23.5 56.5T200-640Z" /></svg>
icon:margin_bottom = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-120q-17 0-28.5-11.5T160-160q0-17 11.5-28.5T200-200h560q17 0 28.5 11.5T800-160q0 17-11.5 28.5T760-120H200Zm280-177q-8 0-15-2.5t-13-8.5L308-452q-11-11-11-28t11-28q11-11 28-11t28 11l76 76v-368q0-17 11.5-28.5T480-840q17 0 28.5 11.5T520-800v368l76-76q11-11 28-11t28 11q11 11 11 28t-11 28L508-308q-6 6-13 8.5t-15 2.5Z" /></svg>
icon:margin_inner = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m712-440 36 36q11 11 11 28t-11 28q-11 11-28 11t-28-11L588-452q-6-6-8.5-13t-2.5-15q0-8 2.5-15t8.5-13l104-104q11-11 28-11t28 11q11 11 11 28t-11 28l-36 36h128q17 0 28.5 11.5T880-480q0 17-11.5 28.5T840-440H712ZM520-200q0 17-11.5 28.5T480-160q-17 0-28.5-11.5T440-200v-560q0-17 11.5-28.5T480-800q17 0 28.5 11.5T520-760v560ZM248-440H120q-17 0-28.5-11.5T80-480q0-17 11.5-28.5T120-520h128l-36-36q-11-11-11-28t11-28q11-11 28-11t28 11l104 104q6 6 8.5 13t2.5 15q0 8-2.5 15t-8.5 13L268-348q-11 11-28 11t-28-11q-11-11-11-28t11-28l36-36Z" /></svg>
icon:margin_left = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120-240q-17 0-28.5-11.5T80-280v-400q0-17 11.5-28.5T120-720q17 0 28.5 11.5T160-680v400q0 17-11.5 28.5T120-240Zm273-200 115 115q12 12 12 28.5T508-268q-12 11-28.5 11T452-268L268-452q-6-6-8.5-13t-2.5-15q0-8 2.5-15t8.5-13l184-184q11-11 28-11t28 11q12 12 11.5 28.5T508-636L393-520h447q17 0 28.5 11.5T880-480q0 17-11.5 28.5T840-440H393Z" /></svg>
icon:margin_outer = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M727-440H520v-80h207l-75-75q-11-12-11.5-28.5T652-652q12-12 28-12t28 12l144 144q6 6 8.5 13t2.5 15q0 8-2.5 15t-8.5 13L708-308q-12 12-28 12t-28-12q-12-12-12-28.5t12-28.5l75-75Zm-494 0 75 75q11 12 11.5 28.5T308-308q-12 12-28 12t-28-12L108-452q-6-6-8.5-13T97-480q0-8 2.5-15t8.5-13l144-144q12-12 28-12t28 12q12 12 12 28.5T308-595l-75 75h207v80H233Z" /></svg>
icon:margin_right = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M840-240q-17 0-28.5-11.5T800-280v-400q0-17 11.5-28.5T840-720q17 0 28.5 11.5T880-680v400q0 17-11.5 28.5T840-240ZM567-440H120q-17 0-28.5-11.5T80-480q0-17 11.5-28.5T120-520h447L452-636q-11-11-11.5-27.5T452-692q11-11 28-11t28 11l184 184q6 6 8.5 13t2.5 15q0 8-2.5 15t-8.5 13L508-268q-11 11-27.5 11T452-268q-12-12-12-28.5t12-28.5l115-115Z" /></svg>
icon:margin_top = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-760q-17 0-28.5-11.5T160-800q0-17 11.5-28.5T200-840h560q17 0 28.5 11.5T800-800q0 17-11.5 28.5T760-760H200Zm280 640q-17 0-28.5-11.5T440-160v-368l-76 76q-11 11-28 11t-28-11q-11-11-11-28t11-28l144-144q6-6 13-8.5t15-2.5q8 0 15 2.5t13 8.5l144 144q11 11 11 28t-11 28q-11 11-28 11t-28-11l-76-76v368q0 17-11.5 28.5T480-120Z" /></svg>
icon:maximise = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-200h80q17 0 28.5 11.5T320-160q0 17-11.5 28.5T280-120H160q-17 0-28.5-11.5T120-160v-120q0-17 11.5-28.5T160-320q17 0 28.5 11.5T200-280v80Zm560 0v-80q0-17 11.5-28.5T800-320q17 0 28.5 11.5T840-280v120q0 17-11.5 28.5T800-120H680q-17 0-28.5-11.5T640-160q0-17 11.5-28.5T680-200h80ZM200-760v80q0 17-11.5 28.5T160-640q-17 0-28.5-11.5T120-680v-120q0-17 11.5-28.5T160-840h120q17 0 28.5 11.5T320-800q0 17-11.5 28.5T280-760h-80Zm560 0h-80q-17 0-28.5-11.5T640-800q0-17 11.5-28.5T680-840h120q17 0 28.5 11.5T840-800v120q0 17-11.5 28.5T800-640q-17 0-28.5-11.5T760-680v-80Z" /></svg>

View File

@@ -22,21 +22,33 @@ icon:cls_template = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:cls_timeline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M312.31-160h335.38v-120q0-70.62-48.54-120.69-48.53-50.08-119.15-50.08t-119.15 50.16Q312.31-350.44 312.31-280v120ZM480-509.23q70.62 0 119.15-50.16 48.54-50.17 48.54-120.61v-120H312.31v120q0 70.62 48.54 120.69 48.53 50.08 119.15 50.08ZM220-120q-8.5 0-14.25-5.76T200-140.03q0-8.51 5.75-14.24T220-160h52.31v-120q0-74.08 45.42-131.42 45.42-57.35 116.42-68.58-71-12-116.42-68.96-45.42-56.96-45.42-131.04v-120H220q-8.5 0-14.25-5.76T200-820.03q0-8.51 5.75-14.24T220-840h520q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T740-800h-52.31v120q0 74.08-45.42 131.04Q596.85-492 525.85-480q71 11.23 116.42 68.58 45.42 57.34 45.42 131.42v120H740q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T740-120H220Z" /></svg>
icon:cls_trash = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M304.62-160q-26.66 0-45.64-18.98T240-224.62V-720h-20q-8.5 0-14.25-5.76T200-740.03q0-8.51 5.75-14.24T220-760h140q0-12.38 9.19-21.58 9.19-9.19 21.58-9.19h178.46q12.39 0 21.58 9.19Q600-772.38 600-760h140q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T740-720h-20v495.38q0 26.66-18.98 45.64T655.38-160H304.62ZM680-720H280v495.38q0 10.77 6.92 17.7 6.93 6.92 17.7 6.92h350.76q10.77 0 17.7-6.92 6.92-6.93 6.92-17.7V-720ZM412.33-280q8.52 0 14.25-5.75t5.73-14.25v-320q0-8.5-5.76-14.25T412.28-640q-8.51 0-14.24 5.75T392.31-620v320q0 8.5 5.76 14.25 5.75 5.75 14.26 5.75Zm135.39 0q8.51 0 14.24-5.75t5.73-14.25v-320q0-8.5-5.76-14.25-5.75-5.75-14.26-5.75-8.52 0-14.25 5.75T527.69-620v320q0 8.5 5.76 14.25t14.27 5.75ZM280-720v520-520Z" /></svg>
icon:cls_world = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480.13-120q-74.67 0-140.41-28.34-65.73-28.34-114.36-76.92-48.63-48.58-76.99-114.26Q120-405.19 120-479.87q0-74.67 28.34-140.41 28.34-65.73 76.92-114.36 48.58-48.63 114.26-76.99Q405.19-840 479.87-840q74.67 0 140.41 28.34 65.73 28.34 114.36 76.92 48.63 48.58 76.99 114.26Q840-554.81 840-480.13q0 74.67-28.34 140.41-28.34 65.73-76.92 114.36-48.58 48.63-114.26 76.99Q554.81-120 480.13-120Zm-.13-40q134 0 227-93t93-227q0-7-.12-14.12-.11-7.11-.88-13.65-2.69 26.69-21.23 44.15-18.54 17.47-45.46 17.47H630.77q-27.92 0-47.81-19.86-19.88-19.85-19.88-47.73v-33.79H427.69v-67.59q0-27.88 19.89-47.92 19.88-20.04 47.8-20.04h33.85v-30.77q0-29.15 19.04-45.88 19.04-16.73 45.5-19.27-26.92-10.38-55.18-15.69Q510.33-800 480-800q-134 0-227 93t-93 227v11.54q0 5.38.77 11.54H340q56.77 0 96.08 39.3 39.3 39.31 39.3 95.73v34.2H373.85v109.23q24.61 8.84 51.42 13.65Q452.08-160 480-160Z" /></svg>
icon:key_pov = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M470-255.38Zm-216.77-105.7q54.31-25.61 108.31-39.19 54-13.58 108.46-15.11.15 3.84.08 7.19-.08 3.34 2.38 6.65 4.69 2.46 8.19 6.31 3.5 3.85 2.35 9.31-1.15 5.46-5.65 8.11-4.5 2.66-9.97 2.43-50.15.84-99.42 13.65T272.31-326q-15.16 8.08-23.73 19.77-8.58 11.69-8.58 25v25.85h278.31q10 0 15 6.2 5 6.21 5 13.66 0 7.44-5 13.79-5 6.35-15 6.35H241.54q-17.62 0-29.58-11.97Q200-239.31 200-256.92v-24.31q0-24.77 14.42-46.35 14.43-21.57 38.81-33.5ZM480-504.62q-49.5 0-84.75-35.25T360-624.62q0-49.5 35.25-84.75T480-744.62q49.5 0 84.75 35.25T600-624.62q0 49.5-35.25 84.75T480-504.62Zm0-40q33 0 56.5-23.5t23.5-56.5q0-33-23.5-56.5t-56.5-23.5q-33 0-56.5 23.5t-23.5 56.5q0 33 23.5 56.5t56.5 23.5Zm0-80ZM701.38-412q17.7-17.69 31.63-29 13.94-11.31 38.43-11.31 31.25 0 49.91 21.27Q840-409.77 840-382.56q0 12.75-4.85 25.5-4.84 12.75-15.13 23.04L724-238q-9.69 9.69-22.62 9.69-12.92 0-22.61-9.69l-95.85-95.85q-11.46-11.46-15.8-23.89-4.35-12.44-4.35-24.88 0-27.19 19.33-48.44 19.33-21.25 49.59-21.25 24.05 0 37.8 11.08 13.74 11.08 31.89 29.23Z" /></svg>
icon:key_focus = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m702-564.54 155.62-155.84q5.84-5.85 13.88-5.85 8.04 0 14.65 5.85 6.62 5.84 6.23 14.26-.38 8.43-6.23 14.27L724.62-531.08q-9.7 9.7-22.62 9.7-12.92 0-22.62-9.7l-76.53-76.54q-5.85-5.84-6.23-13.5-.39-7.65 6.23-14.26 6.12-5.85 14.29-5.85 8.17 0 14.01 5.85L702-564.54Zm-342 59.92q-49.5 0-84.75-35.25T240-624.62q0-49.5 35.25-84.75T360-744.62q49.5 0 84.75 35.25T480-624.62q0 49.5-35.25 84.75T360-504.62ZM80-256.92v-24.31q0-24.77 14.42-46.35 14.43-21.57 38.81-33.5 56.62-27.15 113.31-40.73 56.69-13.57 113.46-13.57 56.77 0 113.46 13.57 56.69 13.58 113.31 40.73 24.38 11.93 38.81 33.5Q640-306 640-281.23v24.31q0 17.61-11.96 29.57-11.96 11.97-29.58 11.97H121.54q-17.62 0-29.58-11.97Q80-239.31 80-256.92Zm40 1.54h480v-25.85q0-13.31-8.58-25-8.57-11.69-23.73-19.77-49.38-23.92-101.83-36.65-52.45-12.73-105.86-12.73t-105.86 12.73Q201.69-349.92 152.31-326q-15.16 8.08-23.73 19.77-8.58 11.69-8.58 25v25.85Zm240-289.24q33 0 56.5-23.5t23.5-56.5q0-33-23.5-56.5t-56.5-23.5q-33 0-56.5 23.5t-23.5 56.5q0 33 23.5 56.5t56.5 23.5Zm0 229.24Zm0-309.24Z" /></svg>
icon:key_mention = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M730-540H630q-8.5 0-14.25-5.76T610-560.03q0-8.51 5.75-14.24T630-580h100v-100q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T770-680v100h100q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T870-540H770v100q0 8.5-5.76 14.25T749.97-420q-8.51 0-14.24-5.75T730-440v-100Zm-370 35.38q-49.5 0-84.75-35.25T240-624.62q0-49.5 35.25-84.75T360-744.62q49.5 0 84.75 35.25T480-624.62q0 49.5-35.25 84.75T360-504.62ZM80-256.92v-24.31q0-24.77 14.42-46.35 14.43-21.57 38.81-33.5 56.62-27.15 113.31-40.73 56.69-13.57 113.46-13.57 56.77 0 113.46 13.57 56.69 13.58 113.31 40.73 24.38 11.93 38.81 33.5Q640-306 640-281.23v24.31q0 17.61-11.96 29.57-11.96 11.97-29.58 11.97H121.54q-17.62 0-29.58-11.97Q80-239.31 80-256.92Zm40 1.54h480v-25.85q0-13.31-8.58-25-8.57-11.69-23.73-19.77-49.38-23.92-101.83-36.65-52.45-12.73-105.86-12.73t-105.86 12.73Q201.69-349.92 152.31-326q-15.16 8.08-23.73 19.77-8.58 11.69-8.58 25v25.85Zm240-289.24q33 0 56.5-23.5t23.5-56.5q0-33-23.5-56.5t-56.5-23.5q-33 0-56.5 23.5t-23.5 56.5q0 33 23.5 56.5t56.5 23.5Zm0-80Zm0 369.24Z" /></svg>
icon:cmn_general = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M180-269.23q-8.5 0-14.25-5.76T160-289.26q0-8.51 5.75-14.24t14.25-5.73h360q8.5 0 14.25 5.76 5.75 5.75 5.75 14.27 0 8.51-5.75 14.24T540-269.23H180ZM180-460q-8.5 0-14.25-5.76T160-480.03q0-8.51 5.75-14.24T180-500h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H180Zm0-190.77q-8.5 0-14.25-5.76-5.75-5.75-5.75-14.27 0-8.51 5.75-14.24t14.25-5.73h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-650.77H180Z" /></svg>
icon:cmn_note = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m243.08-280-68.16 68.15q-15.15 15.16-35.04 6.97-19.88-8.2-19.88-29.81v-540.69q0-27.62 18.5-46.12Q157-840 184.62-840h590.76q27.62 0 46.12 18.5Q840-803 840-775.38v430.76q0 27.62-18.5 46.12Q803-280 775.38-280h-532.3ZM226-320h549.38q9.24 0 16.93-7.69 7.69-7.69 7.69-16.93v-430.76q0-9.24-7.69-16.93-7.69-7.69-16.93-7.69H184.62q-9.24 0-16.93 7.69-7.69 7.69-7.69 16.93v521.15L226-320Zm-66 0v-480 480Zm120-100h240q8.54 0 14.27-5.73T540-440q0-8.54-5.73-14.27T520-460H280q-8.54 0-14.27 5.73T260-440q0 8.54 5.73 14.27T280-420Zm0-120h400q8.54 0 14.27-5.73T700-560q0-8.54-5.73-14.27T680-580H280q-8.54 0-14.27 5.73T260-560q0 8.54 5.73 14.27T280-540Zm0-120h400q8.54 0 14.27-5.73T700-680q0-8.54-5.73-14.27T680-700H280q-8.54 0-14.27 5.73T260-680q0 8.54 5.73 14.27T280-660Z" /></svg>
icon:cmn_story = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M236.23-240q-24.92 0-36.77-21.5-11.84-21.5 1.85-42.27l104.07-163.15q3.85-6.16 3.85-13.08t-3.85-13.08L201.31-656.23q-13.69-20.77-1.85-42.27 11.85-21.5 36.77-21.5h348.39q21.53 0 40.57 9.77t31.58 27.31l116.38 165.38q11.93 17.16 11.93 37.54t-11.93 37.54L653.69-275.54q-11.77 16.77-30.04 26.16-18.27 9.38-39.03 9.38H236.23Zm386.85-60 118.15-165.38q4.62-6.16 4.62-14.62 0-8.46-4.62-14.62L623.08-660q-6.93-9.23-16.16-14.62-9.23-5.38-22.3-5.38H232.15l107.39 164.46q10.69 16.16 10.69 35.54t-10.69 35.54L232.15-280h352.47q11.53 0 21.53-5.38 10-5.39 16.93-14.62ZM490.15-480Z" /></svg>
icon:prj_folder = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M184.62-200q-27.62 0-46.12-18.5Q120-237 120-264.62v-430.76q0-27.62 18.5-46.12Q157-760 184.62-760H357q12.92 0 25.12 5.23 12.19 5.23 20.88 13.92L463.85-680h311.53q27.62 0 46.12 18.5Q840-643 840-615.38v350.76q0 27.62-18.5 46.12Q803-200 775.38-200H184.62Zm0-40h590.76q10.77 0 17.7-6.92 6.92-6.93 6.92-17.7v-350.76q0-10.77-6.92-17.7-6.93-6.92-17.7-6.92H447.77l-73.08-73.08q-3.84-3.84-8.07-5.38-4.24-1.54-8.85-1.54H184.62q-10.77 0-17.7 6.92-6.92 6.93-6.92 17.7v430.76q0 10.77 6.92 17.7 6.93 6.92 17.7 6.92ZM160-240v-480 480Z" /></svg>
icon:prj_document = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M224.62-160q-27.62 0-46.12-18.5Q160-197 160-224.62v-510.76q0-27.62 18.5-46.12Q197-800 224.62-800h371.61q12.92 0 25.12 5.23 12.19 5.23 20.88 13.92l138.62 138.62q8.69 8.69 13.92 20.88 5.23 12.2 5.23 25.12v371.61q0 27.62-18.5 46.12Q763-160 735.38-160H224.62Zm0-40h510.76q10.77 0 17.7-6.92 6.92-6.93 6.92-17.7V-600H632.31q-13.93 0-23.12-9.19-9.19-9.19-9.19-23.12V-760H224.62q-10.77 0-17.7 6.92-6.92 6.93-6.92 17.7v510.76q0 10.77 6.92 17.7 6.93 6.92 17.7 6.92ZM640-320q8.54 0 14.27-5.73T660-340q0-8.54-5.73-14.27T640-360H320q-8.54 0-14.27 5.73T300-340q0 8.54 5.73 14.27T320-320h320ZM460-600q8.54 0 14.27-5.73T480-620q0-8.54-5.73-14.27T460-640H320q-8.54 0-14.27 5.73T300-620q0 8.54 5.73 14.27T320-600h140Zm180 140q8.54 0 14.27-5.73T660-480q0-8.54-5.73-14.27T640-500H320q-8.54 0-14.27 5.73T300-480q0 8.54 5.73 14.27T320-460h320ZM200-760v160-160 560-560Z" /></svg>
icon:prj_title = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M224.62-160q-27.62 0-46.12-18.5Q160-197 160-224.62v-510.76q0-27.62 18.5-46.12Q197-800 224.62-800h371.61q12.92 0 25.12 5.23 12.19 5.23 20.88 13.92l138.62 138.62q8.69 8.69 13.92 20.88 5.23 12.2 5.23 25.12v371.61q0 27.62-18.5 46.12Q763-160 735.38-160H224.62Zm0-40h510.76q10.77 0 17.7-6.92 6.92-6.93 6.92-17.7V-600H632.31q-13.93 0-23.12-9.19-9.19-9.19-9.19-23.12V-760H224.62q-10.77 0-17.7 6.92-6.92 6.93-6.92 17.7v510.76q0 10.77 6.92 17.7 6.93 6.92 17.7 6.92ZM640-320q8.54 0 14.27-5.73T660-340q0-8.54-5.73-14.27T640-360H320q-8.54 0-14.27 5.73T300-340q0 8.54 5.73 14.27T320-320h320ZM460-600q8.54 0 14.27-5.73T480-620q0-8.54-5.73-14.27T460-640H320q-8.54 0-14.27 5.73T300-620q0 8.54 5.73 14.27T320-600h140Zm180 140q8.54 0 14.27-5.73T660-480q0-8.54-5.73-14.27T640-500H320q-8.54 0-14.27 5.73T300-480q0 8.54 5.73 14.27T320-460h320ZM200-760v160-160 560-560Z" /></svg>
icon:prj_chapter = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M224.62-160q-27.62 0-46.12-18.5Q160-197 160-224.62v-510.76q0-27.62 18.5-46.12Q197-800 224.62-800h371.61q12.92 0 25.12 5.23 12.19 5.23 20.88 13.92l138.62 138.62q8.69 8.69 13.92 20.88 5.23 12.2 5.23 25.12v371.61q0 27.62-18.5 46.12Q763-160 735.38-160H224.62Zm0-40h510.76q10.77 0 17.7-6.92 6.92-6.93 6.92-17.7V-600H632.31q-13.93 0-23.12-9.19-9.19-9.19-9.19-23.12V-760H224.62q-10.77 0-17.7 6.92-6.92 6.93-6.92 17.7v510.76q0 10.77 6.92 17.7 6.93 6.92 17.7 6.92ZM640-320q8.54 0 14.27-5.73T660-340q0-8.54-5.73-14.27T640-360H320q-8.54 0-14.27 5.73T300-340q0 8.54 5.73 14.27T320-320h320ZM460-600q8.54 0 14.27-5.73T480-620q0-8.54-5.73-14.27T460-640H320q-8.54 0-14.27 5.73T300-620q0 8.54 5.73 14.27T320-600h140Zm180 140q8.54 0 14.27-5.73T660-480q0-8.54-5.73-14.27T640-500H320q-8.54 0-14.27 5.73T300-480q0 8.54 5.73 14.27T320-460h320ZM200-760v160-160 560-560Z" /></svg>
icon:prj_scene = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M224.62-160q-27.62 0-46.12-18.5Q160-197 160-224.62v-510.76q0-27.62 18.5-46.12Q197-800 224.62-800h371.61q12.92 0 25.12 5.23 12.19 5.23 20.88 13.92l138.62 138.62q8.69 8.69 13.92 20.88 5.23 12.2 5.23 25.12v371.61q0 27.62-18.5 46.12Q763-160 735.38-160H224.62Zm0-40h510.76q10.77 0 17.7-6.92 6.92-6.93 6.92-17.7V-600H632.31q-13.93 0-23.12-9.19-9.19-9.19-9.19-23.12V-760H224.62q-10.77 0-17.7 6.92-6.92 6.93-6.92 17.7v510.76q0 10.77 6.92 17.7 6.93 6.92 17.7 6.92ZM640-320q8.54 0 14.27-5.73T660-340q0-8.54-5.73-14.27T640-360H320q-8.54 0-14.27 5.73T300-340q0 8.54 5.73 14.27T320-320h320ZM460-600q8.54 0 14.27-5.73T480-620q0-8.54-5.73-14.27T460-640H320q-8.54 0-14.27 5.73T300-620q0 8.54 5.73 14.27T320-600h140Zm180 140q8.54 0 14.27-5.73T660-480q0-8.54-5.73-14.27T640-500H320q-8.54 0-14.27 5.73T300-480q0 8.54 5.73 14.27T320-460h320ZM200-760v160-160 560-560Z" /></svg>
icon:prj_note = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M224.62-200H560v-167.69q0-13.73 9.29-23.02t23.02-9.29H760v-335.38q0-10.77-6.92-17.7-6.93-6.92-17.7-6.92H224.62q-10.77 0-17.7 6.92-6.92 6.93-6.92 17.7v510.76q0 10.77 6.92 17.7 6.93 6.92 17.7 6.92Zm0 40q-26.66 0-45.64-18.98T160-224.62v-510.76q0-26.66 18.98-45.64T224.62-800h510.76q26.66 0 45.64 18.98T800-735.38v320.07q0 13.27-5.23 25.29t-13.92 20.71L590.69-179.15q-8.69 8.69-20.71 13.92-12.02 5.23-25.29 5.23H224.62ZM460-421.54H335.38q-8.5 0-14.25-5.76-5.75-5.75-5.75-14.27 0-8.51 5.75-14.24t14.25-5.73H460q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T460-421.54ZM624.62-580H335.38q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73h289.24q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T624.62-580ZM200-200v-560 560Z" /></svg>
icon:fmt_align_center = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M180-160q-8.5 0-14.25-5.76T160-180.03q0-8.51 5.75-14.24T180-200h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-160H180Zm160-150q-8.5 0-14.25-5.76T320-330.03q0-8.51 5.75-14.24T340-350h280q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T620-310H340ZM180-460q-8.5 0-14.25-5.76T160-480.03q0-8.51 5.75-14.24T180-500h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H180Zm160-150q-8.5 0-14.25-5.76T320-630.03q0-8.51 5.75-14.24T340-650h280q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T620-610H340ZM180-760q-8.5 0-14.25-5.76T160-780.03q0-8.51 5.75-14.24T180-800h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-760H180Z" /></svg>
icon:fmt_align_left = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M180-160q-8.5 0-14.25-5.76T160-180.03q0-8.51 5.75-14.24T180-200h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-160H180Zm0-150q-8.5 0-14.25-5.76T160-330.03q0-8.51 5.75-14.24T180-350h360q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T540-310H180Zm0-150q-8.5 0-14.25-5.76T160-480.03q0-8.51 5.75-14.24T180-500h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H180Zm0-150q-8.5 0-14.25-5.76T160-630.03q0-8.51 5.75-14.24T180-650h360q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T540-610H180Zm0-150q-8.5 0-14.25-5.76T160-780.03q0-8.51 5.75-14.24T180-800h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-760H180Z" /></svg>
icon:fmt_align_right = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M180-760q-8.5 0-14.25-5.76T160-780.03q0-8.51 5.75-14.24T180-800h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-760H180Zm240 150q-8.5 0-14.25-5.76T400-630.03q0-8.51 5.75-14.24T420-650h360q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-610H420ZM180-460q-8.5 0-14.25-5.76T160-480.03q0-8.51 5.75-14.24T180-500h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H180Zm240 150q-8.5 0-14.25-5.76T400-330.03q0-8.51 5.75-14.24T420-350h360q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-310H420ZM180-160q-8.5 0-14.25-5.76T160-180.03q0-8.51 5.75-14.24T180-200h600q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-160H180Z" /></svg>
icon:fmt_bold = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M356.62-230q-17.62 0-29.58-11.96-11.96-11.96-11.96-29.58v-416.92q0-17.62 11.96-29.58Q339-730 356.62-730H483q57.31 0 101.15 36.15Q628-657.69 628-599.77q0 38.69-20.31 67.73-20.31 29.04-50.31 42.58 36.54 10.23 62.04 42.92t25.5 78.85q0 64.38-48.07 101.04Q548.77-230 491-230H356.62Zm9.46-47.38h122.46q46.46 0 75.04-27.97 28.57-27.96 28.57-65.11 0-37.16-28.57-65.12-28.58-27.96-75.73-27.96H366.08v186.16Zm0-232.62h114.54q39.92 0 67.61-24.69 27.69-24.69 27.69-61.85 0-37.84-28.15-62.08-28.15-24.23-66.69-24.23h-115V-510Z" /></svg>
icon:fmt_italic = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M253.85-230q-9.37 0-15.84-6.49-6.47-6.49-6.47-15.88 0-9.4 6.47-15.82 6.47-6.43 15.84-6.43h123.07l139.23-410.76H393.08q-9.37 0-15.84-6.49-6.47-6.49-6.47-15.89 0-9.39 6.47-15.82 6.47-6.42 15.84-6.42h287.69q9.37 0 15.84 6.49 6.47 6.49 6.47 15.88 0 9.4-6.47 15.82-6.47 6.43-15.84 6.43H562.31L423.08-274.62h118.46q9.37 0 15.84 6.49 6.47 6.49 6.47 15.89 0 9.39-6.47 15.82-6.47 6.42-15.84 6.42H253.85Z" /></svg>
icon:fmt_link = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M283.08-316.92q-67.68 0-115.38-47.69Q120-412.3 120-479.96t47.7-115.39q47.7-47.73 115.38-47.73h121.54q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24t-14.25 5.73H282.99q-50.68 0-86.84 36.16Q160-530.77 160-480t36.15 86.92q36.16 36.16 86.84 36.16h121.63q8.5 0 14.25 5.75 5.75 5.76 5.75 14.27 0 8.52-5.75 14.25t-14.25 5.73H283.08ZM360-460q-8.5 0-14.25-5.76T340-480.03q0-8.51 5.75-14.24T360-500h240q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T600-460H360Zm195.38 143.08q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73h121.63q50.68 0 86.84-36.16Q800-429.23 800-480t-36.15-86.92q-36.16-36.16-86.84-36.16H555.38q-8.5 0-14.25-5.75-5.75-5.76-5.75-14.27 0-8.52 5.75-14.25t14.25-5.73h121.54q67.68 0 115.38 47.69Q840-547.7 840-480.04t-47.7 115.39q-47.7 47.73-115.38 47.73H555.38Z" /></svg>
icon:fmt_list_o = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M177.69-120q-7.66 0-12.68-5-5.01-5.01-5.01-12.66t5.01-12.69q5.02-5.03 12.68-5.03H260V-210h-42.31q-7.66 0-12.68-5-5.01-5.01-5.01-12.66t5.01-12.69q5.02-5.03 12.68-5.03H260V-300h-82.31q-7.66 0-12.68-5-5.01-5.01-5.01-12.66t5.01-12.69q5.02-5.03 12.68-5.03h90q11.77 0 19.73 7.96 7.96 7.96 7.96 19.73v55.38q0 11.77-7.96 19.73-7.96 7.96-19.73 7.96 11.77 0 19.73 7.97 7.96 7.96 7.96 19.73v49.23q0 11.77-7.96 19.73-7.96 7.96-19.73 7.96h-90Zm6.93-252.31q-9.93 0-17.27-7.34Q160-387 160-396.92V-470q0-11.77 7.96-19.73 7.96-7.96 19.73-7.96H260v-54.62h-82.31q-7.66 0-12.68-5-5.01-5-5.01-12.65 0-7.66 5.01-12.69 5.02-5.04 12.68-5.04h90q11.77 0 19.73 7.96 7.96 7.96 7.96 19.73v70q0 11.77-7.96 19.73-7.96 7.96-19.73 7.96h-72.31v54.62h82.31q7.67 0 12.68 5t5.01 12.65q0 7.66-5.01 12.69-5.01 5.04-12.68 5.04h-93.07Zm53.11-252.31q-7.65 0-12.69-5.01-5.04-5.01-5.04-12.68v-162.31h-42.31q-7.66 0-12.68-5-5.01-5-5.01-12.65t5.01-12.69q5.02-5.04 12.68-5.04h53.85q9.92 0 16.88 6.96 6.96 6.96 6.96 16.89v173.84q0 7.67-5 12.68t-12.65 5.01ZM404.62-220q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-220H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-700H404.62Z" /></svg>
icon:fmt_list_u = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M404.62-220q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-220H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-700H404.62ZM213.08-186.92q-21.9 0-37.49-15.59Q160-218.11 160-240t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-458.11 160-480t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-698.11 160-720t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Z" /></svg>
icon:fmt_mark = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120 0q-16.08 0-28.04-11.58Q80-23.15 80-40q0-16.08 11.96-28.04T120-80h720q16.08 0 28.04 11.58Q880-56.85 880-40q0 16.08-11.96 28.04T840 0H120Zm440.15-468.46-104-104-155.38 155.38q-6.92 6.93-6.92 16.93t6.92 16.92l69.92 70.15q6.93 6.93 16.93 6.93t16.92-6.93l155.61-155.38Zm-75.46-132.31L588.46-497 770-678.31q6.92-6.92 6.92-17.69 0-10.77-6.92-17.69l-68.62-68.62q-6.92-6.92-17.69-6.92-10.77 0-17.69 6.92L484.69-600.77Zm-42.46-14.38 160.62 160.61-169.77 170q-19.39 19.39-45.35 19.39t-45.35-19.39l-7.69-7.69-27.31 27.08q-8.69 8.23-20.53 13.23-11.85 5-24.31 5h-45.85q-10.92 0-14.88-10.08-3.96-10.08 3.73-17.77l73.54-73.31-6.16-6.15q-19.38-19.39-19.61-45.58-.23-26.19 19.15-45.57l169.77-169.77Zm0 0 196.23-196.23q19.39-19.39 45.35-19.39t45.34 19.39l70.16 69.92q19.38 19.38 19.38 45.34 0 25.97-19.38 45.35L602.85-454.54 442.23-615.15Z" /></svg>
icon:fmt_size = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M593.08-710H420.77q-10.26 0-17.44-7.21-7.18-7.2-7.18-17.5 0-10.29 7.18-17.79t17.44-7.5h394.61q10.26 0 17.44 7.21 7.18 7.2 7.18 17.5 0 10.29-7.18 17.79t-17.44 7.5h-172.3v485.38q0 10.26-7.21 17.44-7.2 7.18-17.5 7.18-10.29 0-17.79-7.4-7.5-7.41-7.5-17.98V-710ZM238.46-513.85h-93.84q-10.26 0-17.44-7.2-7.18-7.21-7.18-17.5 0-10.3 7.18-17.8t17.44-7.5h236.92q10.25 0 17.43 7.21t7.18 17.5q0 10.29-7.18 17.79t-17.43 7.5h-93.85v289.23q0 10.26-7.2 17.44-7.21 7.18-17.5 7.18-10.3 0-17.41-7.18-7.12-7.18-7.12-17.44v-289.23Z" /></svg>
icon:fmt_strike = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M486-184.62q-56.85 0-104.96-30.03-48.12-30.04-75.27-80.66-3.62-7.54-.58-15.81 3.04-8.26 10.81-11.88 8-3.85 16.73-.81t13.58 11.04q21.84 39.23 58.88 61.85 37.04 22.61 81.27 22.61 55.54 0 98.04-31.61 42.5-31.62 42.5-82.85 0-13.08-2.31-26.15-2.31-13.08-9.23-24.62-2.31-8.46 2.46-15.54 4.77-7.07 13.23-9.38 8.47-2.31 16.04 2.46 7.58 4.77 9.89 13.23 8.46 13.77 11.15 30.23 2.69 16.46 2.69 32.54 0 69-55.96 112.19T486-184.62ZM120-500q-8.54 0-14.27-5.73T100-520q0-8.54 5.73-14.27T120-540h720q8.54 0 14.27 5.73T860-520q0 8.54-5.73 14.27T840-500H120Zm211.85-121.15q-8.54-2.31-13-9.89-4.47-7.58-2.16-16.11 4.23-58.54 53.16-94.85 48.92-36.31 112.15-36.31 42.62 0 80.12 18.08 37.5 18.08 62.65 51.46 4.85 7.08 3.54 15.46-1.31 8.39-8.62 13.23-7.77 5.08-16.5 3.62t-15.04-9q-18.84-24.69-46.53-36.92-27.7-12.24-59.16-12.24-47.77 0-84.69 26.77-36.92 26.77-39.92 71.31-2.31 8.77-9.89 13.23-7.58 4.46-16.11 2.16Z" /></svg>
icon:fmt_subscript = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M767.69-200q-13.73 0-23.02-9.29t-9.29-23.02v-30.77q0-13.73 9.29-23.02 9.29-9.28 23.02-9.28H840v-33.85h-89.23q-6.15 0-10.77-4.62-4.62-4.61-4.62-10.77 0-6.15 4.62-10.76 4.62-4.62 10.77-4.62h87.69q13.73 0 23.02 9.29t9.29 23.02v30.77q0 13.73-9.29 23.02-9.29 9.28-23.02 9.28h-72.31v33.85h89.23q6.16 0 10.77 4.62 4.62 4.61 4.62 10.77 0 6.15-4.62 10.76-4.61 4.62-10.77 4.62h-87.69Zm-447.36-64.62q-13.15 0-19.24-11.07-6.09-11.08.99-22.54l145.61-225.08-131.84-203.31q-7.08-11.23-.99-22.3Q320.95-760 333.62-760q5.84 0 10.52 2.68 4.67 2.68 7.48 7.55l127.15 197.46h.92l129.23-198.23q2.76-4.5 7.57-6.98 4.82-2.48 10.22-2.48 13.27 0 19.16 11.08 5.9 11.07-1.18 22.54L510.54-523.31l147.38 225.08q7.08 11.46.81 22.54-6.27 11.07-18.81 11.07-5.68 0-10.42-2.67-4.73-2.68-7.58-7.56l-142.23-218.3h-.92l-140.69 218.3q-2.76 4.88-7.57 7.56-4.82 2.67-10.18 2.67Z" /></svg>
icon:fmt_superscript = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M767.69-600q-13.73 0-23.02-9.29t-9.29-23.02v-30.77q0-13.73 9.29-23.02 9.29-9.28 23.02-9.28H840v-33.85h-89.23q-6.15 0-10.77-4.62-4.62-4.61-4.62-10.77 0-6.15 4.62-10.76 4.62-4.62 10.77-4.62h87.69q13.73 0 23.02 9.29t9.29 23.02v30.77q0 13.73-9.29 23.02-9.29 9.28-23.02 9.28h-72.31v33.85h89.23q6.16 0 10.77 4.62 4.62 4.61 4.62 10.77 0 6.15-4.62 10.76-4.61 4.62-10.77 4.62h-87.69ZM320.33-200q-13.15 0-19.24-11.08-6.09-11.07.99-22.54l145.61-225.07L315.85-662q-7.08-11.23-.99-22.31 6.09-11.07 18.76-11.07 5.84 0 10.52 2.67 4.67 2.68 7.48 7.56l127.15 197.46h.92l129.23-198.23q2.76-4.51 7.57-6.99 4.82-2.47 10.22-2.47 13.27 0 19.16 11.07 5.9 11.08-1.18 22.54L510.54-458.69l147.38 225.07q7.08 11.47.81 22.54Q652.46-200 639.92-200q-5.68 0-10.42-2.68-4.73-2.68-7.58-7.55L479.69-428.54h-.92L338.08-210.23q-2.76 4.87-7.57 7.55-4.82 2.68-10.18 2.68Z" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M247.69-190q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73h464.62q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T712.31-190H247.69ZM480-317.69q-85.62 0-134.31-50.31T297-504.62v-279.76q0-9.29 6.84-15.91 6.85-6.63 16.12-6.63 9.27 0 15.81 6.63 6.54 6.62 6.54 15.91v281.15q0 65.23 36.46 103.31 36.46 38.07 101.23 38.07 64.77 0 101.23-38.07 36.46-38.08 36.46-103.31v-281.15q0-9.29 6.85-15.91 6.84-6.63 16.11-6.63t15.81 6.63q6.54 6.62 6.54 15.91v279.76q0 86.31-48.69 136.62T480-317.69Z" /></svg>
icon:fmt_toolbar = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M240-218.46q-8.54 0-14.27-5.73T220-238.46q0-8.54 5.73-14.27t14.27-5.73h480q8.54 0 14.27 5.73t5.73 14.27q0 8.54-5.73 14.27T720-218.46H240Zm74-176.46 142.38-374.93q2.47-5.61 6.97-8.65t10.34-3.04h14.16q5.84 0 10.34 3.42 4.5 3.43 6.96 9.04l139.31 374.39q2.92 9.31-2.08 17.38-5 8.08-15.3 8.08-6.39 0-10.89-3.04-4.5-3.04-6.96-9.42l-36.92-101.08H386.62l-37.39 101.31q-2.46 5.61-6.85 8.92-4.38 3.31-10.76 3.31-10.54 0-15.66-8.19-5.11-8.2-1.96-17.5Zm85.38-122.62h159.7l-76.31-211.23h-4l-79.39 211.23Z" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M247.69-190q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73h464.62q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T712.31-190H247.69ZM480-317.69q-85.62 0-134.31-50.31T297-504.62v-279.76q0-9.29 6.84-15.91 6.85-6.63 16.12-6.63 9.27 0 15.81 6.63 6.54 6.62 6.54 15.91v281.15q0 65.23 36.46 103.31 36.46 38.07 101.23 38.07 64.77 0 101.23-38.07 36.46-38.08 36.46-103.31v-281.15q0-9.29 6.85-15.91 6.84-6.63 16.11-6.63t15.81 6.63q6.54 6.62 6.54 15.91v279.76q0 86.31-48.69 136.62T480-317.69Z" /></svg>
icon:search = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M381.54-350.77q-95.92 0-162.58-66.65-66.65-66.66-66.65-162.58 0-95.92 66.65-162.58 66.66-66.65 162.58-66.65 95.92 0 162.58 66.65 66.65 66.66 66.65 162.58 0 41.69-14.77 80.69t-38.77 66.69l236.31 236.31q5.61 5.62 6 13.77.38 8.16-6 14.54-6.39 6.38-14.16 6.38-7.76 0-14.15-6.38L528.92-404.31q-30 25.54-69 39.54t-78.38 14Zm0-40q79.61 0 134.42-54.81 54.81-54.8 54.81-134.42 0-79.62-54.81-134.42-54.81-54.81-134.42-54.81-79.62 0-134.42 54.81-54.81 54.8-54.81 134.42 0 79.62 54.81 134.42 54.8 54.81 134.42 54.81Z" /></svg>
icon:search_auto = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m642.92-468-80.61 130.31q-6.39 10.07-18.96 8.61-12.58-1.46-15.27-13.77L497-469.46 202.46-174.15q-5.61 5.61-13.65 6.11t-14.66-6.11q-6.38-6.39-6.38-14.16 0-7.77 6.38-14.15L469.46-498l-125.84-31.08q-12.31-2.69-14.16-14.88-1.84-12.19 8.23-18.58L468-642.92l-11.23-153q-1.23-12.31 9.46-18.23 10.69-5.93 20.31 2.46l117.31 98.84 141.77-57.92q11.3-4.92 20.3 4.08t4.08 20.31l-57.15 141.76 98.84 117.08q8.39 9.62 2.85 20.69-5.54 11.08-17.85 9.85l-153.77-11ZM171.69-727.54q-5.23-5.23-5.23-11.69 0-6.46 5.23-11.69l28.16-28.16q5.23-5.23 11.69-5.23 6.46 0 11.69 5.23l28.15 28.16q5.24 5.23 5.24 11.69 0 6.46-5.24 11.69l-28.15 28.16q-5.23 5.23-11.69 5.23-6.46 0-11.69-5.23l-28.16-28.16ZM555-402.23l66.46-107.46 126.08 9.31L666-597.54l47.31-116.77L596.54-667l-97.16-81.31 9.31 125.85L402-555.77l122.31 30.46L555-402.23Zm172.54 230.54-28.16-28.16q-5.23-5.23-5.23-11.69 0-6.46 5.23-11.69l28.16-28.15q5.23-5.24 11.69-5.24 6.46 0 11.69 5.24l28.16 28.15q5.23 5.23 5.23 11.69 0 6.46-5.23 11.69l-28.16 28.16q-5.23 5.23-11.69 5.23-6.46 0-11.69-5.23ZM575.15-575.38Z" /></svg>
icon:search_cancel = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-451.69 270.15-241.85q-5.61 5.62-13.77 6-8.15.39-14.53-6-6.39-6.38-6.39-14.15 0-7.77 6.39-14.15L451.69-480 241.85-689.85q-5.62-5.61-6-13.77-.39-8.15 6-14.53 6.38-6.39 14.15-6.39 7.77 0 14.15 6.39L480-508.31l209.85-209.84q5.61-5.62 13.77-6 8.15-.39 14.53 6 6.39 6.38 6.39 14.15 0 7.77-6.39 14.15L508.31-480l209.84 209.85q5.62 5.61 6 13.77.39 8.15-6 14.53-6.38 6.39-14.15 6.39-7.77 0-14.15-6.39L480-451.69Z" /></svg>
@@ -52,12 +64,11 @@ icon:bullet-on = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:unfold-hide = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M436.4-350.31q-6.71 0-11.55-4.44-4.85-4.44-4.85-11.71v-227.08q0-7.27 4.95-11.71 4.95-4.44 11.55-4.44 1.65 0 11.35 5.23l107.07 107.08q3.7 3.69 5.7 7.97 2 4.28 2 9.41t-2 9.41q-2 4.28-5.7 7.98L447.83-355.52q-2.21 2.21-5.15 3.71-2.93 1.5-6.28 1.5Z" /></svg>
icon:unfold-show = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M462.61-405.08 355.52-512.17q-2.21-2.21-3.71-5.15-1.5-2.93-1.5-6.28 0-6.71 4.44-11.55 4.44-4.85 11.71-4.85h227.08q7.27 0 11.71 4.95 4.44 4.95 4.44 11.55 0 1.65-5.23 11.35L497.38-405.08q-3.69 3.7-7.97 5.7-4.28 2-9.41 2t-9.41-2q-4.28-2-7.98-5.7Z" /></svg>
icon:sb_build = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M763.85-257.38V-190q0 6.15 4.61 10.77 4.62 4.61 10.77 4.61 6.15 0 10.77-4.61 4.62-4.62 4.62-10.77v-103.85q0-6.46-4.85-11.3-4.85-4.85-11.31-4.85H674.62q-6.16 0-10.77 4.62-4.62 4.61-4.62 10.76 0 6.16 4.62 10.77 4.61 4.62 10.77 4.62H742l-90.31 90.31q-4.46 4.46-4.84 10.54-.39 6.07 4.84 11.3 4.74 4.46 11.07 4.46 6.32 0 10.78-4.46l90.31-90.3ZM224.62-160q-26.66 0-45.64-18.98T160-224.62v-510.76q0-26.66 18.98-45.64T224.62-800h510.76q26.66 0 45.64 18.98T800-735.38v204.61q0 8.5-5.76 14.25t-14.27 5.75q-8.51 0-14.24-5.75T760-530.77v-204.61q0-9.24-7.69-16.93-7.69-7.69-16.93-7.69H224.62q-9.24 0-16.93 7.69-7.69 7.69-7.69 16.93v510.76q0 9.24 7.69 16.93 7.69 7.69 16.93 7.69h204.61q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T429.23-160H224.62ZM200-239.73V-200v-560V-507.77v-3 271.04Zm100-89.47q0 8.51 5.75 14.24t14.25 5.73h118.38q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24t-14.25-5.73H320q-8.5 0-14.25 5.76-5.75 5.75-5.75 14.27Zm0-150.77q0 8.51 5.75 14.24T320-460h259.23q8.5 0 14.25-5.76t5.75-14.27q0-8.51-5.75-14.24T579.23-500H320q-8.5 0-14.25 5.76T300-479.97Zm0-150.77q0 8.51 5.75 14.24t14.25 5.73h320q8.5 0 14.25-5.76 5.75-5.75 5.75-14.27 0-8.51-5.75-14.24T640-650.77H320q-8.5 0-14.25 5.76T300-630.74ZM720-75.38q-66.85 0-113.42-46.58Q560-168.54 560-235.38q0-66.85 46.58-113.43 46.57-46.57 113.42-46.57t113.42 46.57Q880-302.23 880-235.38q0 66.84-46.58 113.42Q786.85-75.38 720-75.38Z" /></svg>
icon:sb_details = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M404.62-220q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-220H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-700H404.62ZM213.08-186.92q-21.9 0-37.49-15.59Q160-218.11 160-240t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-458.11 160-480t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-698.11 160-720t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Z" /></svg>
icon:sb_novel = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-279.15q10.77-6.85 22.95-11.54 12.18-4.69 26.28-4.69h46.15V-800h-46.15q-20.92 0-35.08 14.58Q200-770.85 200-750.77v471.62ZM249.23-120q-37.18 0-63.2-25.58Q160-171.15 160-207.69v-543.08q0-37.18 26.03-63.2Q212.05-840 249.23-840H520q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T520-800H335.38v504.62h289.24V-440q0-8.5 5.75-14.25 5.76-5.75 14.27-5.75t14.24 5.75q5.74 5.75 5.74 14.25v184.62H249.23q-20.08 0-34.65 13.67Q200-228.04 200-207.83t14.58 34.02Q229.15-160 249.23-160h486.15q10.77 0 17.7-6.92 6.92-6.93 6.92-17.7V-480q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T800-480v295.38q0 26.66-18.98 45.64T735.38-120H249.23ZM200-279.15V-800v520.85ZM700-500q0-83.64 58.18-141.82Q816.36-700 900-700q-83.64 0-141.82-58.18Q700-816.36 700-900q0 83.64-58.18 141.82Q583.64-700 500-700q83.64 0 141.82 58.18Q700-583.64 700-500Z" /></svg>
icon:sb_outline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M320-607.69q13.15 0 22.73-9.58t9.58-22.73q0-13.15-9.58-22.73T320-672.31q-13.15 0-22.73 9.58T287.69-640q0 13.15 9.58 22.73t22.73 9.58Zm0 160q13.15 0 22.73-9.58t9.58-22.73q0-13.15-9.58-22.73T320-512.31q-13.15 0-22.73 9.58T287.69-480q0 13.15 9.58 22.73t22.73 9.58Zm0 160q13.15 0 22.73-9.58t9.58-22.73q0-13.15-9.58-22.73T320-352.31q-13.15 0-22.73 9.58T287.69-320q0 13.15 9.58 22.73t22.73 9.58ZM224.62-160q-27.62 0-46.12-18.5Q160-197 160-224.62v-510.76q0-27.62 18.5-46.12Q197-800 224.62-800h371.61q12.92 0 25.12 5.23 12.19 5.23 20.88 13.92l138.62 138.62q8.69 8.69 13.92 20.88 5.23 12.2 5.23 25.12v371.61q0 27.62-18.5 46.12Q763-160 735.38-160H224.62Zm0-40h510.76q10.77 0 17.7-6.92 6.92-6.93 6.92-17.7V-600H632.31q-13.93 0-23.12-9.19-9.19-9.19-9.19-23.12V-760H224.62q-10.77 0-17.7 6.92-6.92 6.93-6.92 17.7v510.76q0 10.77 6.92 17.7 6.93 6.92 17.7 6.92ZM200-760v160-160 560-560Z" /></svg>
icon:sb_project = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-240v-480 480Zm24.62 40q-27.62 0-46.12-18.5Q120-237 120-264.62v-430.76q0-27.62 18.5-46.12Q157-760 184.62-760H357q12.92 0 25.12 5.23 12.19 5.23 20.88 13.92L463.85-680h311.53q27.62 0 46.12 18.5Q840-643 840-615.38v67.69q0 8.54-5.73 14.27T820-527.69q-8.54 0-14.27-5.73T800-547.69v-67.69q0-9.24-7.69-16.93-7.69-7.69-16.93-7.69H447.77l-80-80H184.62q-10.77 0-17.7 6.92-6.92 6.93-6.92 17.7v430.76q0 9.24 7.69 16.93 7.69 7.69 16.93 7.69h269.23q8.53 0 14.27 5.73 5.73 5.73 5.73 14.27t-5.73 14.27q-5.74 5.73-14.27 5.73H184.62Zm384.61 47.69v-42.92q0-6.46 2.23-12.04 2.23-5.58 7.46-10.81l203.62-202.61q5.92-5.93 12.31-8 6.38-2.08 12.77-2.08 6.61 0 13.38 2.58 6.77 2.57 11.92 7.73l37 37.77q4.93 5.92 7.5 12.31Q880-364 880-357.62q0 6.39-2.46 12.89-2.46 6.5-7.62 12.42L667.31-129.69q-5.23 5.23-10.81 7.46-5.58 2.23-12.04 2.23h-42.92q-13.92 0-23.12-9.19-9.19-9.19-9.19-23.12Zm275.39-205.31-37-37.76 37 37.76Zm-240 202.24h38l138.69-138.93-18.77-19-18.23-19.54-139.69 139.47v38Zm157.92-157.93-18.23-19.54 37 38.54-18.77-19Z" /></svg>
icon:sb_search = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M381.54-350.77q-95.92 0-162.58-66.65-66.65-66.66-66.65-162.58 0-95.92 66.65-162.58 66.66-66.65 162.58-66.65 95.92 0 162.58 66.65 66.65 66.66 66.65 162.58 0 41.69-14.77 80.69t-38.77 66.69l236.31 236.31q5.61 5.62 6 13.77.38 8.16-6 14.54-6.39 6.38-14.16 6.38-7.76 0-14.15-6.38L528.92-404.31q-30 25.54-69 39.54t-78.38 14Zm0-40q79.61 0 134.42-54.81 54.81-54.8 54.81-134.42 0-79.62-54.81-134.42-54.81-54.81-134.42-54.81-79.62 0-134.42 54.81-54.81 54.8-54.81 134.42 0 79.62 54.81 134.42 54.8 54.81 134.42 54.81Z" /></svg>
icon:sb_stats = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M672.31-200q-13.73 0-23.02-9.29T640-232.31V-360q0-13.73 9.29-23.02t23.02-9.29h55.38q13.73 0 23.02 9.29T760-360v127.69q0 13.73-9.29 23.02T727.69-200h-55.38Zm-220 0q-13.73 0-23.02-9.29T420-232.31v-495.38q0-13.73 9.29-23.02t23.02-9.29h55.38q13.73 0 23.02 9.29t9.29 23.02v495.38q0 13.73-9.29 23.02T507.69-200h-55.38Zm-220 0q-13.73 0-23.02-9.29T200-232.31v-302.7q0-14.3 9.29-23.49 9.29-9.19 23.02-9.19h55.38q13.73 0 23.02 9.29 9.29 9.28 9.29 23.02v302.7q0 14.3-9.29 23.49-9.29 9.19-23.02 9.19h-55.38Z" /></svg>
icon:sb_story = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M320-607.69q13.15 0 22.73-9.58t9.58-22.73q0-13.15-9.58-22.73T320-672.31q-13.15 0-22.73 9.58T287.69-640q0 13.15 9.58 22.73t22.73 9.58Zm0 160q13.15 0 22.73-9.58t9.58-22.73q0-13.15-9.58-22.73T320-512.31q-13.15 0-22.73 9.58T287.69-480q0 13.15 9.58 22.73t22.73 9.58Zm0 160q13.15 0 22.73-9.58t9.58-22.73q0-13.15-9.58-22.73T320-352.31q-13.15 0-22.73 9.58T287.69-320q0 13.15 9.58 22.73t22.73 9.58ZM224.62-160q-27.62 0-46.12-18.5Q160-197 160-224.62v-510.76q0-27.62 18.5-46.12Q197-800 224.62-800h371.61q12.92 0 25.12 5.23 12.19 5.23 20.88 13.92l138.62 138.62q8.69 8.69 13.92 20.88 5.23 12.2 5.23 25.12v371.61q0 27.62-18.5 46.12Q763-160 735.38-160H224.62Zm0-40h510.76q10.77 0 17.7-6.92 6.92-6.93 6.92-17.7V-600H632.31q-13.93 0-23.12-9.19-9.19-9.19-9.19-23.12V-760H224.62q-10.77 0-17.7 6.92-6.92 6.93-6.92 17.7v510.76q0 10.77 6.92 17.7 6.93 6.92 17.7 6.92ZM200-760v160-160 560-560Z" /></svg>
icon:theme_light = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-360q50 0 85-35t35-85q0-50-35-85t-85-35q-50 0-85 35t-35 85q0 50 35 85t85 35Zm0 40q-66.85 0-113.42-46.58Q320-413.15 320-480t46.58-113.42Q413.15-640 480-640t113.42 46.58Q640-546.85 640-480t-46.58 113.42Q546.85-320 480-320ZM80-460q-8.5 0-14.25-5.76T60-480.03q0-8.51 5.75-14.24T80-500h100q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T180-460H80Zm700 0q-8.5 0-14.25-5.76T760-480.03q0-8.51 5.75-14.24T780-500h100q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T880-460H780ZM479.97-760q-8.51 0-14.24-5.75T460-780v-100q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T500-880v100q0 8.5-5.76 14.25T479.97-760Zm0 700q-8.51 0-14.24-5.75T460-80v-100q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T500-180v100q0 8.5-5.76 14.25T479.97-60ZM254.46-678.77l-57.61-55.85q-5.85-5.61-5.73-13.76.11-8.16 5.96-14.77 6.38-6.62 14.15-6.62 7.77 0 14.15 6.62L282-706.31q6.38 6.62 6.38 14.16 0 7.53-6 14.15t-13.65 6.12q-7.65-.5-14.27-6.89Zm480.16 481.92L678-253.69q-6.38-6.62-6.38-14.27 0-7.66 6.38-14.04 5.23-6.62 13.08-6.12 7.84.5 14.46 6.89l57.61 55.85q5.85 5.61 5.73 13.76-.11 8.16-5.96 14.77-6.38 6.62-14.15 6.62-7.77 0-14.15-6.62ZM678-677.62q-6.62-6-6.12-13.65t6.89-14.27l55.85-57.61q5.61-5.85 13.76-5.73 8.16.11 14.77 5.96 6.62 6.38 6.62 14.15 0 7.77-6.62 14.15L706.31-678q-6.62 6.38-14.16 6.38-7.53 0-14.15-6ZM196.85-196.68q-6.62-6.78-6.62-14.55 0-7.77 6.62-14.15L253.69-282q6.62-6.38 14.27-6.38 7.66 0 14.04 6.38 5.85 5.23 5.35 13.08-.5 7.84-6.12 14.46l-55.85 57.61q-6.38 6.62-14.15 6.5-7.77-.11-14.38-6.33ZM480-480Z" /></svg>
icon:theme_dark = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M482.31-160Q349-160 255.65-253.35 162.31-346.69 162.31-480q0-98.77 56.54-181.42 56.53-82.66 160.38-118.89 12.23-4.31 21.46-2.27 9.23 2.04 15.23 7.96 6 5.93 7.66 15.24 1.65 9.3-2.5 19.53-7.77 19.08-11.27 38.66t-3.5 41.19q0 106.67 74.66 181.33Q555.64-404 662.31-404q27.92 0 51.11-5.92 23.2-5.93 39.5-9.62 8.7-1.61 15.96.42 7.27 2.04 11.54 7.04 4.73 5 6.39 12.31 1.65 7.31-1.89 16.69-28.61 98-112.11 160.54Q589.31-160 482.31-160Zm0-40q88 0 158-48.5t102-126.5q-20 5-40 8t-40 3q-123 0-209.5-86.5T366.31-660q0-20 3-40t8-40q-78 32-126.5 102t-48.5 158q0 116 82 198t198 82Zm-10-270Z" /></svg>
icon:theme_auto = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480.13-120q-74.67 0-140.41-28.34-65.73-28.34-114.36-76.92-48.63-48.58-76.99-114.26Q120-405.19 120-479.87q0-74.67 28.34-140.41 28.34-65.73 76.92-114.36 48.58-48.63 114.26-76.99Q405.19-840 479.87-840q74.67 0 140.41 28.34 65.73 28.34 114.36 76.92 48.63 48.58 76.99 114.26Q840-554.81 840-480.13q0 74.67-28.34 140.41-28.34 65.73-76.92 114.36-48.58 48.63-114.26 76.99Q554.81-120 480.13-120ZM500-160.69q123.62-8.08 211.81-98.35T800-480q0-130.69-87.42-220.19-87.43-89.5-212.58-99.12v638.62Z" /></svg>
@@ -107,7 +118,9 @@ icon:lines = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:link = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M283.08-316.92q-67.68 0-115.38-47.69Q120-412.3 120-479.96t47.7-115.39q47.7-47.73 115.38-47.73h121.54q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24t-14.25 5.73H282.99q-50.68 0-86.84 36.16Q160-530.77 160-480t36.15 86.92q36.16 36.16 86.84 36.16h121.63q8.5 0 14.25 5.75 5.75 5.76 5.75 14.27 0 8.52-5.75 14.25t-14.25 5.73H283.08ZM360-460q-8.5 0-14.25-5.76T340-480.03q0-8.51 5.75-14.24T360-500h240q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T600-460H360Zm195.38 143.08q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73h121.63q50.68 0 86.84-36.16Q800-429.23 800-480t-36.15-86.92q-36.16-36.16-86.84-36.16H555.38q-8.5 0-14.25-5.75-5.75-5.76-5.75-14.27 0-8.52 5.75-14.25t14.25-5.73h121.54q67.68 0 115.38 47.69Q840-547.7 840-480.04t-47.7 115.39q-47.7 47.73-115.38 47.73H555.38Z" /></svg>
icon:list = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M404.62-220q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-220H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-460H404.62Zm0-240q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73H780q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T780-700H404.62ZM213.08-186.92q-21.9 0-37.49-15.59Q160-218.11 160-240t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-458.11 160-480t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-698.11 160-720t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Z" /></svg>
icon:margin_bottom = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M220-160q-8.5 0-14.25-5.76T200-180.03q0-8.51 5.75-14.24T220-200h520q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T740-160H220Zm259.9-160.85q-6.36 0-11.82-2.11-5.46-2.12-10.7-7.35L321.85-465.85q-5.62-5.61-6-13.77-.39-8.15 6-14.53 6.38-6.39 14.15-6.39 7.77 0 14.15 6.39L460-384.31V-780q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T500-780v395.69l109.85-109.84q5.61-5.62 13.77-6 8.15-.39 14.53 6 6.39 6.38 6.39 14.15 0 7.77-6.39 14.15L502.62-330.31q-5.24 5.23-10.8 7.35-5.56 2.11-11.92 2.11Z" /></svg>
icon:margin_inner = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m632-460 69.85 69.85q5.61 5.61 6 13.77.38 8.15-6 14.53-6.39 6.39-14.16 6.39-7.77 0-14.15-6.39l-95.27-95.27q-5.5-5.5-7.62-11.06-2.11-5.56-2.11-11.92t2.11-11.82q2.12-5.46 7.62-10.96l95.27-95.27q5.61-5.62 13.77-6 8.15-.39 14.54 6 6.38 6.38 6.38 14.15 0 7.77-6.38 14.15L632-500h188q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T820-460H632ZM500-220q0 8.5-5.76 14.25T479.97-200q-8.51 0-14.24-5.75T460-220v-520q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T500-740v520ZM328-460H140q-8.5 0-14.25-5.76T120-480.03q0-8.51 5.75-14.24T140-500h188l-69.85-69.85q-5.61-5.61-6-13.77-.38-8.15 6-14.53 6.39-6.39 14.16-6.39 7.77 0 14.15 6.39l95.27 95.27q5.5 5.5 7.62 11.06 2.11 5.56 2.11 11.92t-2.11 11.82q-2.12 5.46-7.62 10.96l-95.27 95.27q-5.61 5.62-13.77 6-8.15.39-14.54-6-6.38-6.38-6.38-14.15 0-7.77 6.38-14.15L328-460Z" /></svg>
icon:margin_left = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M139.97-260q-8.51 0-14.24-5.75T120-280v-400q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T160-680v400q0 8.5-5.76 14.25T139.97-260Zm191.49-200 149.62 149.62q5.84 5.84 6.23 14.26.38 8.43-6.23 14.27-5.85 5.62-13.89 5.62-8.04 0-13.65-5.62L278-457.38q-5.23-5.24-7.35-10.8-2.11-5.56-2.11-11.92t2.11-11.82q2.12-5.46 7.35-10.7l174.77-175.53q5.36-5.62 13.64-5.62 8.28 0 13.76 5.48 5.98 5.98 6.25 14.02.27 8.04-5.34 13.65L332.23-500H820q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T820-460H331.46Z" /></svg>
icon:margin_outer = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M763.15-459.23H520V-500h243.15L654.31-608.85q-5.62-5.84-6.12-14.27-.5-8.42 6.12-14.26 5.84-5.85 14.15-5.47 8.31.39 14.16 6.23l134.76 134.77q5.24 5.23 7.35 10.7 2.12 5.46 2.12 11.92t-2.12 11.92q-2.11 5.46-7.35 10.69L681.85-321.08q-5.85 5.85-13.39 5.85-7.54 0-14.15-5.85-6.62-5.84-6.62-14.27 0-8.42 6.62-15.03l108.84-108.85Zm-567.07 0 110.38 110.38q5.62 5.85 5.35 13.89-.27 8.04-6.12 13.88-5.84 5.85-13.38 5.85-7.54 0-13.39-5.85l-136.3-135.54q-5.24-5.23-7.35-10.69-2.12-5.46-2.12-11.92t2.12-11.92q2.11-5.47 7.35-10.7l135.53-135.53q5.85-5.85 13.77-5.85 7.93 0 13.77 5.85 6.62 5.84 6.23 14.26-.38 8.43-6.23 14.27L196.85-500H440v40.77H196.08Z" /></svg>
icon:margin_right = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M819.97-260q-8.51 0-14.24-5.75T800-280v-400q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75T840-680v400q0 8.5-5.76 14.25T819.97-260ZM628.54-460H140q-8.5 0-14.25-5.76T120-480.03q0-8.51 5.75-14.24T140-500h487.77L478.92-650.62q-5.61-5.61-5.34-13.26.27-7.66 6.11-13.64 5.36-5.48 13.64-5.48 8.29 0 13.9 5.62L682-502.62q5.23 5.24 7.35 10.8 2.11 5.56 2.11 11.92t-2.11 11.82q-2.12 5.46-7.35 10.7L506.46-281.85q-5.42 5.62-13.56 5.62-8.13 0-13.98-5.62-6.61-5.84-6.23-14.27.39-8.42 6.23-14.26L628.54-460Z" /></svg>
icon:margin_top = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M220-760q-8.5 0-14.25-5.76T200-780.03q0-8.51 5.75-14.24T220-800h520q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T740-760H220Zm259.97 600q-8.51 0-14.24-5.75T460-180v-395.69L350.15-465.85q-6.38 6.39-14.15 6.39-7.77 0-14.15-6.39-6.39-6.38-6-14.53.38-8.16 6-13.77l135.53-135.54q5.24-5.23 10.8-7.35 5.56-2.11 11.92-2.11t11.82 2.11q5.46 2.12 10.7 7.35l135.53 135.54q6.39 6.38 6.39 14.15 0 7.77-6.39 14.15-6.38 6.39-14.53 6-8.16-.38-13.77-6L500-575.69V-180q0 8.5-5.76 14.25T479.97-160Z" /></svg>
icon:maximise = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-200h116.92q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T316.92-160H192.31q-13.73 0-23.02-9.29T160-192.31v-124.61q0-8.5 5.76-14.25t14.27-5.75q8.51 0 14.24 5.75t5.73 14.25V-200Zm560.77 0v-116.92q0-8.5 5.76-14.25 5.75-5.75 14.27-5.75 8.51 0 14.24 5.75t5.73 14.25v124.61q0 13.73-9.29 23.02T768.46-160H643.85q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73h116.92ZM200-760v116.92q0 8.5-5.76 14.25t-14.27 5.75q-8.51 0-14.24-5.75T160-643.08v-124.61q0-13.73 9.29-23.02t23.02-9.29h124.61q8.5 0 14.25 5.76t5.75 14.27q0 8.51-5.75 14.24T316.92-760H200Zm560.77 0H643.85q-8.5 0-14.25-5.76t-5.75-14.27q0-8.51 5.75-14.24t14.25-5.73h124.61q13.73 0 23.02 9.29t9.29 23.02v124.61q0 8.5-5.76 14.25t-14.27 5.75q-8.51 0-14.24-5.75t-5.73-14.25V-760Z" /></svg>

View File

@@ -22,21 +22,33 @@ icon:cls_template = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:cls_timeline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M320-160h320v-120q0-66-47-113t-113-47q-66 0-113 47t-47 113v120Zm160-360q66 0 113-47t47-113v-120H320v120q0 66 47 113t113 47ZM160-80v-80h80v-120q0-61 28.5-114.5T348-480q-51-32-79.5-85.5T240-680v-120h-80v-80h640v80h-80v120q0 61-28.5 114.5T612-480q51 32 79.5 85.5T720-280v120h80v80H160Z" /></svg>
icon:cls_trash = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-120v-600h-40v-80h200v-40h240v40h200v80h-40v600H200Zm80-80h400v-520H280v520Zm80-80h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z" /></svg>
icon:cls_world = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-7-.5-14.5T799-507q-5 29-27 48t-52 19h-80q-33 0-56.5-23.5T560-520v-40H400v-80q0-33 23.5-56.5T480-720h40q0-23 12.5-40.5T563-789q-20-5-40.5-8t-42.5-3q-134 0-227 93t-93 227h200q66 0 113 47t47 113v40H400v110q20 5 39.5 7.5T480-160Z" /></svg>
icon:key_pov = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-240Zm-320 80v-112q0-34 17.5-62.5T224-378q62-31 126-46.5T480-440h14q-11 18-16.5 38.5T472-360q-54 1-107.5 14.5T260-306q-9 5-14.5 14t-5.5 20v32h283l80 80H160Zm320-320q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47Zm0-80q33 0 56.5-23.5T560-640q0-33-23.5-56.5T480-720q-33 0-56.5 23.5T400-640q0 33 23.5 56.5T480-560Zm0-80Zm236 480L576-300q-13-13-18.5-28t-5.5-30q0-32 23-57t59-25q28 0 44 13t38 35q20-20 36.5-34t45.5-14q37 0 59.5 25.5T880-357q0 15-6 30t-18 27L716-160Z" /></svg>
icon:key_focus = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M702-480 560-622l57-56 85 85 170-170 56 57-226 226Zm-342 0q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47ZM40-160v-112q0-34 17.5-62.5T104-378q62-31 126-46.5T360-440q66 0 130 15.5T616-378q29 15 46.5 43.5T680-272v112H40Zm80-80h480v-32q0-11-5.5-20T580-306q-54-27-109-40.5T360-360q-56 0-111 13.5T140-306q-9 5-14.5 14t-5.5 20v32Zm240-320q33 0 56.5-23.5T440-640q0-33-23.5-56.5T360-720q-33 0-56.5 23.5T280-640q0 33 23.5 56.5T360-560Zm0 260Zm0-340Z" /></svg>
icon:key_mention = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M720-400v-120H600v-80h120v-120h80v120h120v80H800v120h-80Zm-360-80q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47ZM40-160v-112q0-34 17.5-62.5T104-378q62-31 126-46.5T360-440q66 0 130 15.5T616-378q29 15 46.5 43.5T680-272v112H40Zm80-80h480v-32q0-11-5.5-20T580-306q-54-27-109-40.5T360-360q-56 0-111 13.5T140-306q-9 5-14.5 14t-5.5 20v32Zm240-320q33 0 56.5-23.5T440-640q0-33-23.5-56.5T360-720q-33 0-56.5 23.5T280-640q0 33 23.5 56.5T360-560Zm0-80Zm0 400Z" /></svg>
icon:cmn_general = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120-240v-80h480v80H120Zm0-200v-80h720v80H120Zm0-200v-80h720v80H120Z" /></svg>
icon:cmn_note = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M80-80v-800h800v640H240L80-80Zm126-240h594v-480H160v525l46-45Zm-46 0v-480 480Zm80-80h320v-80H240v80Zm0-120h480v-80H240v80Zm0-120h480v-80H240v80Z" /></svg>
icon:cmn_story = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m120-200 180-280-180-280h522l198 280-198 280H120Zm146-80h334l142-200-142-200H266l130 200-130 200Zm130-200L266-680l130 200-130 200 130-200Z" /></svg>
icon:prj_folder = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M80-160v-640h320l80 80h400v560H80Zm80-80h640v-400H447l-80-80H160v480Zm0 0v-480 480Z" /></svg>
icon:prj_document = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120-120v-720h520l200 200v520H120Zm80-80h560v-400H600v-160H200v560Zm80-80h400v-80H280v80Zm0-320h200v-80H280v80Zm0 160h400v-80H280v80Zm-80-320v160-160 560-560Z" /></svg>
icon:prj_title = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120-120v-720h520l200 200v520H120Zm80-80h560v-400H600v-160H200v560Zm80-80h400v-80H280v80Zm0-320h200v-80H280v80Zm0 160h400v-80H280v80Zm-80-320v160-160 560-560Z" /></svg>
icon:prj_chapter = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120-120v-720h520l200 200v520H120Zm80-80h560v-400H600v-160H200v560Zm80-80h400v-80H280v80Zm0-320h200v-80H280v80Zm0 160h400v-80H280v80Zm-80-320v160-160 560-560Z" /></svg>
icon:prj_scene = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120-120v-720h520l200 200v520H120Zm80-80h560v-400H600v-160H200v560Zm80-80h400v-80H280v80Zm0-320h200v-80H280v80Zm0 160h400v-80H280v80Zm-80-320v160-160 560-560Z" /></svg>
icon:prj_note = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-200h360v-200h200v-360H200v560Zm-80 80v-720h720v480L600-120H120Zm160-280v-80h200v80H280Zm0-160v-80h400v80H280Zm-80 360v-560 560Z" /></svg>
icon:fmt_align_center = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120-120v-80h720v80H120Zm160-160v-80h400v80H280ZM120-440v-80h720v80H120Zm160-160v-80h400v80H280ZM120-760v-80h720v80H120Z" /></svg>
icon:fmt_align_left = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120-120v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Z" /></svg>
icon:fmt_align_right = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120-760v-80h720v80H120Zm240 160v-80h480v80H360ZM120-440v-80h720v80H120Zm240 160v-80h480v80H360ZM120-120v-80h720v80H120Z" /></svg>
icon:fmt_bold = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M272-200v-560h221q65 0 120 40t55 111q0 51-23 78.5T602-491q25 11 55.5 41t30.5 90q0 89-65 124.5T501-200H272Zm121-112h104q48 0 58.5-24.5T566-372q0-11-10.5-35.5T494-432H393v120Zm0-228h93q33 0 48-17t15-38q0-24-17-39t-44-15h-95v109Z" /></svg>
icon:fmt_italic = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-200v-100h160l120-360H320v-100h400v100H580L460-300h140v100H200Z" /></svg>
icon:fmt_link = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M440-280H280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h160v80H280q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h320v80H320Zm200 160v-80h160q50 0 85-35t35-85q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H520Z" /></svg>
icon:fmt_list_o = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120-80v-60h100v-30h-60v-60h60v-30H120v-60h160v90l-40 30 40 30v90H120Zm0-280v-150h100v-30H120v-60h160v150H180v30h100v60H120Zm60-280v-180h-60v-60h120v240h-60Zm180 440v-80h480v80H360Zm0-240v-80h480v80H360Zm0-240v-80h480v80H360Z" /></svg>
icon:fmt_list_u = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M360-200v-80h480v80H360Zm0-240v-80h480v80H360Zm0-240v-80h480v80H360ZM200-160q-33 0-56.5-23.5T120-240q0-33 23.5-56.5T200-320q33 0 56.5 23.5T280-240q0 33-23.5 56.5T200-160Zm0-240q-33 0-56.5-23.5T120-480q0-33 23.5-56.5T200-560q33 0 56.5 23.5T280-480q0 33-23.5 56.5T200-400Zm0-240q-33 0-56.5-23.5T120-720q0-33 23.5-56.5T200-800q33 0 56.5 23.5T280-720q0 33-23.5 56.5T200-640Z" /></svg>
icon:fmt_mark = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M80 0v-160h800V0H80Zm504-480-52-52-52-52-160 160 103 104 161-160Zm-47-160 52 51 51 52 160-159-104-104-159 160ZM140-240l126-126-30-29v-57l217-217 216 216-217 217h-56l-30-30-26 26H140Zm313-429 244-244 217 217-245 243-216-216Z" /></svg>
icon:fmt_size = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M560-160v-520H360v-120h520v120H680v520H560Zm-360 0v-320H80v-120h360v120H320v320H200Z" /></svg>
icon:fmt_strike = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M486-160q-76 0-135-45t-85-123l88-38q14 48 48.5 79t85.5 31q42 0 76-20t34-64q0-18-7-33t-19-27h112q5 14 7.5 28.5T694-340q0 86-61.5 133T486-160ZM80-480v-80h800v80H80Zm402-326q66 0 115.5 32.5T674-674l-88 39q-9-29-33.5-52T484-710q-41 0-68 18.5T386-640h-96q2-69 54.5-117.5T482-806Z" /></svg>
icon:fmt_subscript = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M760-160v-120h120v-40H760v-40h160v120H800v40h120v40H760Zm-525-80 185-291-172-269h106l124 200h4l123-200h107L539-531l186 291H618L482-457h-4L342-240H235Z" /></svg>
icon:fmt_superscript = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M760-600v-120h120v-40H760v-40h160v120H800v40h120v40H760ZM235-160l185-291-172-269h106l124 200h4l123-200h107L539-451l186 291H618L482-377h-4L342-160H235Z" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-120v-80h560v80H200Zm280-160q-101 0-157-63t-56-167v-330h103v336q0 56 28 91t82 35q54 0 82-35t28-91v-336h103v330q0 104-56 167t-157 63Z" /></svg>
icon:fmt_toolbar = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-200v-80h560v80H200Zm76-160 164-440h80l164 440h-76l-38-112H392l-40 112h-76Zm138-176h132l-64-182h-4l-64 182Z" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-120v-80h560v80H200Zm280-160q-101 0-157-63t-56-167v-330h103v336q0 56 28 91t82 35q54 0 82-35t28-91v-336h103v330q0 104-56 167t-157 63Z" /></svg>
icon:search = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z" /></svg>
icon:search_auto = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m176-120-56-56 301-302-181-45 198-123-17-234 179 151 216-88-87 217 151 178-234-16-124 198-45-181-301 301Zm24-520-80-80 80-80 80 80-80 80Zm355 197 48-79 93 7-60-71 35-86-86 35-71-59 7 92-79 49 90 22 23 90Zm165 323-80-80 80-80 80 80-80 80ZM569-570Z" /></svg>
icon:search_cancel = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z" /></svg>
@@ -52,12 +64,11 @@ icon:bullet-on = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:unfold-hide = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M400-280v-400l200 200-200 200Z" /></svg>
icon:unfold-show = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-360 280-560h400L480-360Z" /></svg>
icon:sb_build = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m648-140 112-112v92h40v-160H640v40h92L620-168l28 28Zm-528 20v-720h720v348q-19-9-39-15.5t-41-9.5v-243H200v560h242q3 22 9.5 42t15.5 38H120Zm80-120v40-560 243-3 280Zm80-40h163q3-21 9.5-41t14.5-39H280v80Zm0-160h244q32-30 71.5-50t84.5-27v-3H280v80Zm0-160h400v-80H280v80ZM720-40q-83 0-141.5-58.5T520-240q0-83 58.5-141.5T720-440q83 0 141.5 58.5T920-240q0 83-58.5 141.5T720-40Z" /></svg>
icon:sb_details = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M360-200v-80h480v80H360Zm0-240v-80h480v80H360Zm0-240v-80h480v80H360ZM200-160q-33 0-56.5-23.5T120-240q0-33 23.5-56.5T200-320q33 0 56.5 23.5T280-240q0 33-23.5 56.5T200-160Zm0-240q-33 0-56.5-23.5T120-480q0-33 23.5-56.5T200-560q33 0 56.5 23.5T280-480q0 33-23.5 56.5T200-400Zm0-240q-33 0-56.5-23.5T120-720q0-33 23.5-56.5T200-800q33 0 56.5 23.5T280-720q0 33-23.5 56.5T200-640Z" /></svg>
icon:sb_novel = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-313q10-3 19.5-5t20.5-2h40v-480h-40q-17 0-28.5 11.5T200-760v447Zm40 233q-50 0-85-35t-35-85v-560q0-50 35-85t85-35h280v80H360v480h240v-120h80v200H240q-17 0-28.5 11.5T200-200q0 17 11.5 28.5T240-160h520v-320h80v400H240Zm-40-233v-487 487Zm500-167q0-92 64-156t156-64q-92 0-156-64t-64-156q0 92-64 156t-156 64q92 0 156 64t64 156Z" /></svg>
icon:sb_outline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M280-600h80v-80h-80v80Zm0 160h80v-80h-80v80Zm0 160h80v-80h-80v80ZM120-120v-720h520l200 200v520H120Zm80-80h560v-400H600v-160H200v560Zm0-560v160-160 560-560Z" /></svg>
icon:sb_project = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-240v-480 480Zm-80 80v-640h320l80 80h400v86l-80 79v-85H447l-80-80H160v480h324l-4 4v76H80Zm480 80v-123l263-262 123 122L683-80H560Zm300-263-37-37 37 37ZM620-140h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19Z" /></svg>
icon:sb_search = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z" /></svg>
icon:sb_stats = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M640-160v-280h160v280H640Zm-240 0v-640h160v640H400Zm-240 0v-440h160v440H160Z" /></svg>
icon:sb_story = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M280-600h80v-80h-80v80Zm0 160h80v-80h-80v80Zm0 160h80v-80h-80v80ZM120-120v-720h520l200 200v520H120Zm80-80h560v-400H600v-160H200v560Zm0-560v160-160 560-560Z" /></svg>
icon:theme_light = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-360q50 0 85-35t35-85q0-50-35-85t-85-35q-50 0-85 35t-35 85q0 50 35 85t85 35Zm0 80q-83 0-141.5-58.5T280-480q0-83 58.5-141.5T480-680q83 0 141.5 58.5T680-480q0 83-58.5 141.5T480-280ZM200-440H40v-80h160v80Zm720 0H760v-80h160v80ZM440-760v-160h80v160h-80Zm0 720v-160h80v160h-80ZM256-650l-101-97 57-59 96 100-52 56Zm492 496-97-101 53-55 101 97-57 59Zm-98-550 97-101 59 57-100 96-56-52ZM154-212l101-97 55 53-97 101-59-57Zm326-268Z" /></svg>
icon:theme_dark = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-120q-150 0-255-105T120-480q0-150 105-255t255-105q14 0 27.5 1t26.5 3q-41 29-65.5 75.5T444-660q0 90 63 153t153 63q55 0 101-24.5t75-65.5q2 13 3 26.5t1 27.5q0 150-105 255T480-120Zm0-80q88 0 158-48.5T740-375q-20 5-40 8t-40 3q-123 0-209.5-86.5T364-660q0-20 3-40t8-40q-78 32-126.5 102T200-480q0 116 82 198t198 82Zm-10-270Z" /></svg>
icon:theme_auto = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm40-83q119-15 199.5-104.5T800-480q0-123-80.5-212.5T520-797v634Z" /></svg>
@@ -107,7 +118,9 @@ icon:lines = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:link = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M440-280H280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h160v80H280q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h320v80H320Zm200 160v-80h160q50 0 85-35t35-85q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H520Z" /></svg>
icon:list = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M360-200v-80h480v80H360Zm0-240v-80h480v80H360Zm0-240v-80h480v80H360ZM200-160q-33 0-56.5-23.5T120-240q0-33 23.5-56.5T200-320q33 0 56.5 23.5T280-240q0 33-23.5 56.5T200-160Zm0-240q-33 0-56.5-23.5T120-480q0-33 23.5-56.5T200-560q33 0 56.5 23.5T280-480q0 33-23.5 56.5T200-400Zm0-240q-33 0-56.5-23.5T120-720q0-33 23.5-56.5T200-800q33 0 56.5 23.5T280-720q0 33-23.5 56.5T200-640Z" /></svg>
icon:margin_bottom = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-120v-80h640v80H160Zm320-160L280-480l56-56 104 104v-408h80v408l104-104 56 56-200 200Z" /></svg>
icon:margin_inner = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M720-320 560-480l160-160 56 56-63 64h167v80H713l63 64-56 56ZM440-160v-640h80v640h-80ZM240-320l-56-56 63-64H80v-80h167l-63-64 56-56 160 160-160 160Z" /></svg>
icon:margin_left = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-240H80v-480h80v480Zm320 0L240-480l240-240 56 56-143 144h487v80H393l144 144-57 56Z" /></svg>
icon:margin_outer = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m680-280-56-56 103-104H520v-80h207L624-624l56-56 200 200-200 200Zm-400 0L80-480l200-200 56 56-103 104h207v80H233l103 104-56 56Z" /></svg>
icon:margin_right = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M800-240v-480h80v480h-80Zm-320 0-57-56 144-144H80v-80h487L424-664l56-56 240 240-240 240Z" /></svg>
icon:margin_top = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-760v-80h640v80H160Zm280 640v-408L336-424l-56-56 200-200 200 200-56 56-104-104v408h-80Z" /></svg>
icon:maximise = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120-120v-200h80v120h120v80H120Zm520 0v-80h120v-120h80v200H640ZM120-640v-200h200v80H200v120h-80Zm640 0v-120H640v-80h200v200h-80Z" /></svg>

View File

@@ -22,21 +22,33 @@ icon:cls_template = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:cls_timeline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M312.31-160h335.38v-120q0-70.62-48.54-120.69-48.53-50.08-119.15-50.08t-119.15 50.08Q312.31-350.62 312.31-280v120ZM480-509.23q70.62 0 119.15-50.08 48.54-50.07 48.54-120.69v-120H312.31v120q0 70.62 48.54 120.69 48.53 50.08 119.15 50.08ZM200-120v-40h72.31v-120q0-74.08 45.42-131.42 45.42-57.35 116.42-68.58-71-12-116.42-68.96-45.42-56.96-45.42-131.04v-120H200v-40h560v40h-72.31v120q0 74.08-45.42 131.04Q596.85-492 525.85-480q71 11.23 116.42 68.58 45.42 57.34 45.42 131.42v120H760v40H200Z" /></svg>
icon:cls_trash = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M240-160v-560h-40v-40h160v-30.77h240V-760h160v40h-40v560H240Zm40-40h400v-520H280v520Zm112.31-80h40v-360h-40v360Zm135.38 0h40v-360h-40v360ZM280-720v520-520Z" /></svg>
icon:cls_world = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480.13-120q-74.67 0-140.41-28.34-65.73-28.34-114.36-76.92-48.63-48.58-76.99-114.26Q120-405.19 120-479.87q0-74.67 28.34-140.41 28.34-65.73 76.92-114.36 48.58-48.63 114.26-76.99Q405.19-840 479.87-840q74.67 0 140.41 28.34 65.73 28.34 114.36 76.92 48.63 48.58 76.99 114.26Q840-554.81 840-480.13q0 74.67-28.34 140.41-28.34 65.73-76.92 114.36-48.58 48.63-114.26 76.99Q554.81-120 480.13-120Zm-.13-40q134 0 227-93t93-227q0-7-.12-14.12-.11-7.11-.88-13.65-2.69 26.69-21.23 44.15-18.54 17.47-45.46 17.47H630.77q-27.92 0-47.81-19.86-19.88-19.85-19.88-47.73v-33.79H427.69v-67.59q0-27.88 19.89-47.92 19.88-20.04 47.8-20.04h33.85v-30.77q0-29.15 19.04-45.88 19.04-16.73 45.5-19.27-26.92-10.38-55.18-15.69Q510.33-800 480-800q-134 0-227 93t-93 227v11.54q0 5.38.77 11.54H340q56.77 0 96.08 39.3 39.3 39.31 39.3 95.73v34.2H373.85v109.23q24.61 8.84 51.42 13.65Q452.08-160 480-160Z" /></svg>
icon:key_pov = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M470-255.38Zm-270 40v-65.85q0-24.77 14.42-46.35 14.43-21.57 38.81-33.5 54.31-25.61 108.31-39.19 54-13.58 108.46-15.11.15 3.84.85 6.92.69 3.08 1.61 6.92-2.54 6.03-3.81 12.9t-1.27 13.26q-50.92 1.76-99.8 14.11-48.89 12.35-95.27 35.27-15.16 8.08-23.73 19.77-8.58 11.69-8.58 25v25.85h286.85l40 40H200Zm280-289.24q-49.5 0-84.75-35.25T360-624.62q0-49.5 35.25-84.75T480-744.62q49.5 0 84.75 35.25T600-624.62q0 49.5-35.25 84.75T480-504.62Zm0-40q33 0 56.5-23.5t23.5-56.5q0-33-23.5-56.5t-56.5-23.5q-33 0-56.5 23.5t-23.5 56.5q0 33 23.5 56.5t56.5 23.5Zm0-80Zm221.38 409.24L582.92-333.85q-11.46-11.46-15.8-23.89-4.35-12.44-4.35-24.88 0-27.19 19.33-48.44 19.33-21.25 49.59-21.25 24.05 0 37.8 11.08 13.74 11.08 31.89 29.23 17.7-17.69 31.63-29 13.94-11.31 38.43-11.31 31.25 0 49.91 21.27Q840-409.77 840-382.56q0 12.75-4.85 25.5-4.84 12.75-15.3 23.21L701.38-215.38Z" /></svg>
icon:key_focus = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M702-508.46 588.46-622 617-649.54l85 85 170-170L900.31-706 702-508.46Zm-342 3.84q-49.5 0-84.75-35.25T240-624.62q0-49.5 35.25-84.75T360-744.62q49.5 0 84.75 35.25T480-624.62q0 49.5-35.25 84.75T360-504.62ZM80-215.38v-65.85q0-24.77 14.42-46.35 14.43-21.57 38.81-33.5 56.62-27.15 113.31-40.73 56.69-13.57 113.46-13.57 56.77 0 113.46 13.57 56.69 13.58 113.31 40.73 24.38 11.93 38.81 33.5Q640-306 640-281.23v65.85H80Zm40-40h480v-25.85q0-13.31-8.58-25-8.57-11.69-23.73-19.77-49.38-23.92-101.83-36.65-52.45-12.73-105.86-12.73t-105.86 12.73Q201.69-349.92 152.31-326q-15.16 8.08-23.73 19.77-8.58 11.69-8.58 25v25.85Zm240-289.24q33 0 56.5-23.5t23.5-56.5q0-33-23.5-56.5t-56.5-23.5q-33 0-56.5 23.5t-23.5 56.5q0 33 23.5 56.5t56.5 23.5Zm0 229.24Zm0-309.24Z" /></svg>
icon:key_mention = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M730-420v-120H610v-40h120v-120h40v120h120v40H770v120h-40Zm-370-84.62q-49.5 0-84.75-35.25T240-624.62q0-49.5 35.25-84.75T360-744.62q49.5 0 84.75 35.25T480-624.62q0 49.5-35.25 84.75T360-504.62ZM80-215.38v-65.85q0-24.77 14.42-46.35 14.43-21.57 38.81-33.5 56.62-27.15 113.31-40.73 56.69-13.57 113.46-13.57 56.77 0 113.46 13.57 56.69 13.58 113.31 40.73 24.38 11.93 38.81 33.5Q640-306 640-281.23v65.85H80Zm40-40h480v-25.85q0-13.31-8.58-25-8.57-11.69-23.73-19.77-49.38-23.92-101.83-36.65-52.45-12.73-105.86-12.73t-105.86 12.73Q201.69-349.92 152.31-326q-15.16 8.08-23.73 19.77-8.58 11.69-8.58 25v25.85Zm240-289.24q33 0 56.5-23.5t23.5-56.5q0-33-23.5-56.5t-56.5-23.5q-33 0-56.5 23.5t-23.5 56.5q0 33 23.5 56.5t56.5 23.5Zm0-80Zm0 369.24Z" /></svg>
icon:cmn_general = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-269.23v-40h400v40H160ZM160-460v-40h640v40H160Zm0-190.77v-40h640v40H160Z" /></svg>
icon:cmn_note = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120-156.92V-840h720v560H243.08L120-156.92ZM226-320h574v-480H160v545.77L226-320Zm-66 0v-480 480Zm100-100h280v-40H260v40Zm0-120h440v-40H260v40Zm0-120h440v-40H260v40Z" /></svg>
icon:cmn_story = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m160-240 153.85-240L160-720h470.46L800-480 628.15-240H160Zm72.15-40h376.31l142.77-200-142.77-200H232.15l130 200-130 200Zm130-200-130-200 130 200-130 200 130-200Z" /></svg>
icon:prj_folder = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M120-200v-560h263.85l80 80H840v480H120Zm40-40h640v-400H447.77l-80-80H160v480Zm0 0v-480 480Z" /></svg>
icon:prj_document = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-160v-640h463.08L800-623.08V-160H160Zm40-40h560v-400H600v-160H200v560Zm100-120h360v-40H300v40Zm0-280h180v-40H300v40Zm0 140h360v-40H300v40ZM200-760v160-160 560-560Z" /></svg>
icon:prj_title = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-160v-640h463.08L800-623.08V-160H160Zm40-40h560v-400H600v-160H200v560Zm100-120h360v-40H300v40Zm0-280h180v-40H300v40Zm0 140h360v-40H300v40ZM200-760v160-160 560-560Z" /></svg>
icon:prj_chapter = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-160v-640h463.08L800-623.08V-160H160Zm40-40h560v-400H600v-160H200v560Zm100-120h360v-40H300v40Zm0-280h180v-40H300v40Zm0 140h360v-40H300v40ZM200-760v160-160 560-560Z" /></svg>
icon:prj_scene = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-160v-640h463.08L800-623.08V-160H160Zm40-40h560v-400H600v-160H200v560Zm100-120h360v-40H300v40Zm0-280h180v-40H300v40Zm0 140h360v-40H300v40ZM200-760v160-160 560-560Z" /></svg>
icon:prj_note = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-200h360v-200h200v-360H200v560Zm-40 40v-640h640v411.54L571.54-160H160Zm155.38-261.54v-40H480v40H315.38Zm0-158.46v-40h329.24v40H315.38ZM200-200v-560 560Z" /></svg>
icon:fmt_align_center = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-160v-40h640v40H160Zm160-150v-40h320v40H320ZM160-460v-40h640v40H160Zm160-150v-40h320v40H320ZM160-760v-40h640v40H160Z" /></svg>
icon:fmt_align_left = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-160v-40h640v40H160Zm0-150v-40h400v40H160Zm0-150v-40h640v40H160Zm0-150v-40h400v40H160Zm0-150v-40h640v40H160Z" /></svg>
icon:fmt_align_right = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-760v-40h640v40H160Zm240 150v-40h400v40H400ZM160-460v-40h640v40H160Zm240 150v-40h400v40H400ZM160-160v-40h640v40H160Z" /></svg>
icon:fmt_bold = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M315.08-230v-500H483q57.31 0 101.15 36.15Q628-657.69 628-599.77q0 38.69-20.31 67.73-20.31 29.04-50.31 42.58 36.54 10.23 62.04 42.92t25.5 78.85q0 64.38-48.07 101.04Q548.77-230 491-230H315.08Zm51-47.38h122.46q46.46 0 75.04-27.97 28.57-27.96 28.57-65.11 0-37.16-28.57-65.12-28.58-27.96-75.73-27.96H366.08v186.16Zm0-232.62h114.54q39.92 0 67.61-24.69 27.69-24.69 27.69-61.85 0-37.84-28.15-62.08-28.15-24.23-66.69-24.23h-115V-510Z" /></svg>
icon:fmt_italic = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M231.54-230v-44.62h145.38l139.23-410.76H370.77V-730h332.31v44.62H562.31L423.08-274.62h140.77V-230H231.54Z" /></svg>
icon:fmt_link = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M424.62-316.92H283.08q-67.68 0-115.38-47.69Q120-412.3 120-479.96t47.7-115.39q47.7-47.73 115.38-47.73h141.54v40H283.08q-50.77 0-86.93 36.16Q160-530.77 160-480t36.15 86.92q36.16 36.16 86.93 36.16h141.54v40ZM340-460v-40h280v40H340Zm195.38 143.08v-40h141.54q50.77 0 86.93-36.16Q800-429.23 800-480t-36.15-86.92q-36.16-36.16-86.93-36.16H535.38v-40h141.54q67.68 0 115.38 47.69Q840-547.7 840-480.04t-47.7 115.39q-47.7 47.73-115.38 47.73H535.38Z" /></svg>
icon:fmt_list_o = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-120v-35.38h100V-210h-60v-35.38h60V-300H160v-35.38h135.38v90l-27.69 20.76L295.38-210v90H160Zm0-252.31v-125.38h100v-54.62H160v-35.38h135.38v125.38h-100v54.62h100v35.38H160Zm60-252.31v-180h-60V-840h95.38v215.38H220ZM384.62-220v-40H800v40H384.62Zm0-240v-40H800v40H384.62Zm0-240v-40H800v40H384.62Z" /></svg>
icon:fmt_list_u = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M384.62-220v-40H800v40H384.62Zm0-240v-40H800v40H384.62Zm0-240v-40H800v40H384.62ZM213.08-186.92q-21.9 0-37.49-15.59Q160-218.11 160-240t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-458.11 160-480t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-698.11 160-720t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Z" /></svg>
icon:fmt_mark = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M80 0v-80h800V0H80Zm480.15-468.46-52-52-52-52-172.3 172.31 103.77 104 172.53-172.31Zm-75.46-132.31 52 51.77 51.77 52 199.23-199-104-104-199 199.23Zm-307 353.85 101.39-101.39-29.23-29v-45.46l192.38-192.38 160.62 160.61-192.39 192.39h-45.23l-30.77-30.77-46 46H177.69Zm264.54-368.23 241.69-241.7L844.77-696 602.85-454.54 442.23-615.15Z" /></svg>
icon:fmt_size = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M593.08-200v-510H396.15v-50H840v50H643.08v510h-50Zm-354.62 0v-313.85H120v-50h286.15v50H287.69V-200h-49.23Z" /></svg>
icon:fmt_strike = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M486-184.62q-65.23 0-115-35-49.77-35-74.23-96.07l40.31-17.23q19.38 45.69 56.57 75.15 37.2 29.46 92.81 29.46 51.23 0 96-26.92T627.23-340q0-27.23-7.38-45.31-7.39-18.07-21.7-34.69h52q9.62 12.46 15.2 32.73 5.57 20.27 5.57 47.27 0 74.46-55.34 114.92-55.35 40.46-129.58 40.46ZM100-500v-40h760v40H100Zm382-278.31q53.69 0 92.04 22.89 38.34 22.88 65.34 70.65l-39.53 18.23q-15.16-27.46-44.27-47.77-29.12-20.31-73.12-20.31-61.77 0-96.46 34.27-34.69 34.27-29.23 80.35h-43.69q-6.46-61.31 40.65-109.81 47.12-48.5 128.27-48.5Z" /></svg>
icon:fmt_subscript = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M735.38-200v-95.38H840v-33.85H735.38V-360h135.39v95.38H766.15v33.85h104.62V-200H735.38Zm-455-64.62 167.31-258.69L294.15-760h51.39l133.23 207.69h.92L615-760h51.62L510.54-523.31l169.08 258.69H628L479.69-493.15h-.92L332-264.62h-51.62Z" /></svg>
icon:fmt_superscript = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M735.38-600v-95.38H840v-33.85H735.38V-760h135.39v95.38H766.15v33.85h104.62V-600H735.38Zm-455 400 167.31-258.69-153.54-236.69h51.39l133.23 207.69h.92L615-695.38h51.62L510.54-458.69 679.62-200H628L479.69-428.54h-.92L332-200h-51.62Z" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M227.69-190v-40h504.62v40H227.69ZM480-317.69q-85.62 0-134.31-50.31T297-504.62v-302.3h45.31v303.69q0 65.23 36.46 103.31 36.46 38.07 101.23 38.07 64.77 0 101.23-38.07 36.46-38.08 36.46-103.31v-303.69H663v302.3q0 86.31-48.69 136.62T480-317.69Z" /></svg>
icon:fmt_toolbar = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M220-218.46v-40h520v40H220Zm84.46-150.77 156.31-412.31h40L654-369.23h-40.62l-41.07-113.54H386.62l-41.54 113.54h-40.62Zm94.92-148.31h159.7l-76.31-211.23h-4l-79.39 211.23Z" /></svg>
icon:fmt_underline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M227.69-190v-40h504.62v40H227.69ZM480-317.69q-85.62 0-134.31-50.31T297-504.62v-302.3h45.31v303.69q0 65.23 36.46 103.31 36.46 38.07 101.23 38.07 64.77 0 101.23-38.07 36.46-38.08 36.46-103.31v-303.69H663v302.3q0 86.31-48.69 136.62T480-317.69Z" /></svg>
icon:search = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M779.38-153.85 528.92-404.31q-30 25.54-69 39.54t-78.38 14q-96.1 0-162.67-66.53-66.56-66.53-66.56-162.57 0-96.05 66.53-162.71 66.53-66.65 162.57-66.65 96.05 0 162.71 66.56Q610.77-676.1 610.77-580q0 41.69-14.77 80.69t-38.77 66.69l250.46 250.47-28.31 28.3ZM381.54-390.77q79.61 0 134.42-54.81 54.81-54.8 54.81-134.42 0-79.62-54.81-134.42-54.81-54.81-134.42-54.81-79.62 0-134.42 54.81-54.81 54.8-54.81 134.42 0 79.62 54.81 134.42 54.8 54.81 134.42 54.81Z" /></svg>
icon:search_auto = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M188.31-160 160-188.31 469.46-498l-168.69-41.15L468-642.92 453.31-840l150.54 127.15L786-787l-73.15 182.38L840-454.31 642.92-468l-104 167.23L497-469.46 188.31-160Zm23.23-527.69L160-739.23l51.54-51.54 51.54 51.54-51.54 51.54ZM555-402.23l66.46-107.46 126.08 9.31L666-597.54l47.31-116.77L596.54-667l-97.16-81.31 9.31 125.85L402-555.77l122.31 30.46L555-402.23ZM739.23-160l-51.54-51.54 51.54-51.54 51.54 51.54L739.23-160ZM575.15-575.38Z" /></svg>
icon:search_cancel = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M256-227.69 227.69-256l224-224-224-224L256-732.31l224 224 224-224L732.31-704l-224 224 224 224L704-227.69l-224-224-224 224Z" /></svg>
@@ -52,12 +64,11 @@ icon:bullet-on = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:unfold-hide = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M420-327.69v-304.62L572.31-480 420-327.69Z" /></svg>
icon:unfold-show = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-387.69 327.69-540h304.62L480-387.69Z" /></svg>
icon:sb_build = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m662.62-156.15 101.23-101.23v82.76h30.77V-310H659.23v30.77H742L640.77-178l21.85 21.85ZM160-160v-640h640v302.62q-10.54-3.62-20.15-5.89-9.62-2.27-19.85-4.5V-760H200v560h251.23q1.46 11.23 3.73 20.85 2.27 9.61 5.89 19.15H160Zm40-80v40-560 252.23-3V-240Zm100-69.23h158.38q2.24-10.23 6.04-19.85 3.81-9.61 7.96-20.15H300v40ZM300-460h263.23q19.69-13.85 38.81-23.46 19.11-9.62 41.04-15.08V-500H300v40Zm0-150.77h360v-40H300v40ZM720-75.38q-66.85 0-113.42-46.58Q560-168.54 560-235.38q0-66.85 46.58-113.43 46.57-46.57 113.42-46.57t113.42 46.57Q880-302.23 880-235.38q0 66.84-46.58 113.42Q786.85-75.38 720-75.38Z" /></svg>
icon:sb_details = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M384.62-220v-40H800v40H384.62Zm0-240v-40H800v40H384.62Zm0-240v-40H800v40H384.62ZM213.08-186.92q-21.9 0-37.49-15.59Q160-218.11 160-240t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-458.11 160-480t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-698.11 160-720t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Z" /></svg>
icon:sb_novel = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-279.15q10.77-6.85 22.95-11.54 12.18-4.69 26.28-4.69h46.15V-800h-46.15q-20.92 0-35.08 14.58Q200-770.85 200-750.77v471.62ZM249.23-120q-37.18 0-63.2-25.58Q160-171.15 160-207.69v-543.08q0-37.18 26.03-63.2Q212.05-840 249.23-840H540v40H335.38v504.62h289.24V-460h40v204.62H249.23q-20.08 0-34.65 13.67Q200-228.04 200-207.83t14.58 34.02Q229.15-160 249.23-160H760v-340h40v380H249.23ZM200-279.15V-800v520.85ZM700-500q0-83.64 58.18-141.82Q816.36-700 900-700q-83.64 0-141.82-58.18Q700-816.36 700-900q0 83.64-58.18 141.82Q583.64-700 500-700q83.64 0 141.82 58.18Q700-583.64 700-500Z" /></svg>
icon:sb_outline = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M287.69-607.69h64.62v-64.62h-64.62v64.62Zm0 160h64.62v-64.62h-64.62v64.62Zm0 160h64.62v-64.62h-64.62v64.62ZM160-160v-640h463.08L800-623.08V-160H160Zm40-40h560v-400H600v-160H200v560Zm0-560v160-160 560-560Z" /></svg>
icon:sb_project = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-240v-480 480Zm-40 40v-560h263.85l80 80h378.46v66L800-572.69V-640H447.77l-80-80H160v480h314.77l-.92.92V-200H120Zm449.23 80v-88.38l238.39-237.39 87.61 88.15L657.62-120h-88.39Zm275.39-237.62-37-37.76 37 37.76Zm-240 202.24h38l138.69-138.93-18.77-19-18.23-19.54-139.69 139.47v38Zm157.92-157.93-18.23-19.54 37 38.54-18.77-19Z" /></svg>
icon:sb_search = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M779.38-153.85 528.92-404.31q-30 25.54-69 39.54t-78.38 14q-96.1 0-162.67-66.53-66.56-66.53-66.56-162.57 0-96.05 66.53-162.71 66.53-66.65 162.57-66.65 96.05 0 162.71 66.56Q610.77-676.1 610.77-580q0 41.69-14.77 80.69t-38.77 66.69l250.46 250.47-28.31 28.3ZM381.54-390.77q79.61 0 134.42-54.81 54.81-54.8 54.81-134.42 0-79.62-54.81-134.42-54.81-54.81-134.42-54.81-79.62 0-134.42 54.81-54.81 54.8-54.81 134.42 0 79.62 54.81 134.42 54.8 54.81 134.42 54.81Z" /></svg>
icon:sb_stats = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M640-200v-192.31h120V-200H640Zm-220 0v-560h120v560H420Zm-220 0v-367.69h120V-200H200Z" /></svg>
icon:sb_story = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M287.69-607.69h64.62v-64.62h-64.62v64.62Zm0 160h64.62v-64.62h-64.62v64.62Zm0 160h64.62v-64.62h-64.62v64.62ZM160-160v-640h463.08L800-623.08V-160H160Zm40-40h560v-400H600v-160H200v560Zm0-560v160-160 560-560Z" /></svg>
icon:theme_light = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480-360q50 0 85-35t35-85q0-50-35-85t-85-35q-50 0-85 35t-35 85q0 50 35 85t85 35Zm0 40q-66.85 0-113.42-46.58Q320-413.15 320-480t46.58-113.42Q413.15-640 480-640t113.42 46.58Q640-546.85 640-480t-46.58 113.42Q546.85-320 480-320ZM200-460H60v-40h140v40Zm700 0H760v-40h140v40ZM460-760v-140h40v140h-40Zm0 700v-140h40v140h-40ZM269.85-663.85l-86.39-83.92 27.77-29.77 84.46 85.39-25.84 28.3Zm478.92 481.39-84.69-85.62 26.07-28.07 86.39 83.92-27.77 29.77Zm-84.92-507.69 83.92-86.39 29.77 27.77-85.39 84.46-28.3-25.84ZM182.46-211.23l85.62-84.69 26.54 26.07-83.16 87.16-29-28.54ZM480-480Z" /></svg>
icon:theme_dark = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M482.31-160q-133.34 0-226.67-93.33-93.33-93.34-93.33-226.67 0-121.54 79.23-210.77t196.15-105.38q3.23 0 6.35.23 3.11.23 6.11.69-20.23 28.23-32.03 62.81-11.81 34.57-11.81 72.42 0 106.67 74.66 181.33Q555.64-404 662.31-404q38.07 0 72.54-11.81 34.46-11.81 61.92-32.04.46 3 .69 6.12.23 3.11.23 6.35-15.38 116.92-104.61 196.15T482.31-160Zm0-40q88 0 158-48.5t102-126.5q-20 5-40 8t-40 3q-123 0-209.5-86.5T366.31-660q0-20 3-40t8-40q-78 32-126.5 102t-48.5 158q0 116 82 198t198 82Zm-10-270Z" /></svg>
icon:theme_auto = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M480.13-120q-74.67 0-140.41-28.34-65.73-28.34-114.36-76.92-48.63-48.58-76.99-114.26Q120-405.19 120-479.87q0-74.67 28.34-140.41 28.34-65.73 76.92-114.36 48.58-48.63 114.26-76.99Q405.19-840 479.87-840q74.67 0 140.41 28.34 65.73 28.34 114.36 76.92 48.63 48.58 76.99 114.26Q840-554.81 840-480.13q0 74.67-28.34 140.41-28.34 65.73-76.92 114.36-48.58 48.63-114.26 76.99Q554.81-120 480.13-120ZM500-160.69q123.62-8.08 211.81-98.35T800-480q0-130.69-87.42-220.19-87.43-89.5-212.58-99.12v638.62Z" /></svg>
@@ -107,7 +118,9 @@ icon:lines = <svg xmlns="http://www.w3.org/2000/svg" height="128" view
icon:link = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M424.62-316.92H283.08q-67.68 0-115.38-47.69Q120-412.3 120-479.96t47.7-115.39q47.7-47.73 115.38-47.73h141.54v40H283.08q-50.77 0-86.93 36.16Q160-530.77 160-480t36.15 86.92q36.16 36.16 86.93 36.16h141.54v40ZM340-460v-40h280v40H340Zm195.38 143.08v-40h141.54q50.77 0 86.93-36.16Q800-429.23 800-480t-36.15-86.92q-36.16-36.16-86.93-36.16H535.38v-40h141.54q67.68 0 115.38 47.69Q840-547.7 840-480.04t-47.7 115.39q-47.7 47.73-115.38 47.73H535.38Z" /></svg>
icon:list = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M384.62-220v-40H800v40H384.62Zm0-240v-40H800v40H384.62Zm0-240v-40H800v40H384.62ZM213.08-186.92q-21.9 0-37.49-15.59Q160-218.11 160-240t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-458.11 160-480t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Zm0-240q-21.9 0-37.49-15.59Q160-698.11 160-720t15.59-37.49q15.59-15.59 37.49-15.59 21.89 0 37.48 15.59 15.59 15.6 15.59 37.49t-15.59 37.49q-15.59 15.59-37.48 15.59Z" /></svg>
icon:margin_bottom = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-160v-40h560v40H200Zm280-147.69L307.69-480 336-508.31l124 124V-800h40v415.69l124-124L652.31-480 480-307.69Z" /></svg>
icon:margin_inner = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M687.69-347.69 555.38-480l132.31-132.31L716-584l-83.77 84H840v40H632.23L716-376l-28.31 28.31ZM460-200v-560h40v560h-40ZM272.31-347.69 244-376l83.77-84H120v-40h207.77L244-584l28.31-28.31L404.62-480 272.31-347.69Z" /></svg>
icon:margin_left = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-260h-40v-440h40v440Zm306.92-8.46L255.38-480l211.54-211.54L494.46-664 332.23-500H840v40H331.46l164 164-28.54 27.54Z" /></svg>
icon:margin_outer = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="m668.46-307.69-29.08-27.54 123.77-124H520V-500h243.15l-123-123.23 28.31-27.54L840-479.23 668.46-307.69Zm-376.15 0L120-479.23l171.54-171.54 28.31 27.54-123 123.23H440v40.77H196.08l123.77 124-27.54 27.54Z" /></svg>
icon:margin_right = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M800-260v-440h40v440h-40Zm-306.92-8.46L464.54-296l164-164H120v-40h507.77L465.54-664l27.54-27.54L704.62-480 493.08-268.46Z" /></svg>
icon:margin_top = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M200-760v-40h560v40H200Zm260 600v-415.69l-124 124L307.69-480 480-652.31 652.31-480 624-451.69l-124-124V-160h-40Z" /></svg>
icon:maximise = <svg xmlns="http://www.w3.org/2000/svg" height="128" viewBox="0 -960 960 960" width="128" fill="#000000"><path d="M160-160v-176.92h40V-200h136.92v40H160Zm463.85 0v-40h136.92v-136.92h40V-160H623.85ZM160-623.08V-800h176.92v40H200v136.92h-40Zm600.77 0V-760H623.85v-40h176.92v176.92h-40Z" /></svg>

View File

@@ -76,19 +76,12 @@
<h3>Icon Themes</h3>
<p>The default icon theme is a subset of icons from:</p>
<p>The default icon themes are subsets of icons from:</p>
<ul>
<li><b>Material Symbols</b> by Google Inc (Apache 2.0)</li>
</ul>
<p>Additional icon themes may or may not be bundled with novelWriter, depending on license
constraints. These themes include a subset of icons from:</p>
<ul>
<li><b>Font Awesome</b> by Fonticons Inc (CC BY 4.0)</li>
<li><b>Remix</b> by RemixIcon (Apache 2.0 w/non-free clause)</li>
<li><b>Fluent UI</b> by Microsoft (MIT License)</li>
<li><b>Lucide</b> by Cole Bemis and Lucide Contributors (ISC License)</li>
<li><b>Material Symbols</b> by Google Inc (Apache 2.0)</li>
</ul>
<h3>Colour Themes</h3>

View File

@@ -185,7 +185,6 @@ class Config:
"osType",
"osUnknown",
"osWindows",
"outlinePanePos",
"prefsWinSize",
"scaleHeadings",
"scrollPastEnd",
@@ -212,6 +211,7 @@ class Config:
"singleStarBold",
"spellLanguage",
"stopWhenIdle",
"storyPanePos",
"tabWidth",
"textFont",
"textMargin",
@@ -321,8 +321,8 @@ class Config:
self.fontWinSize = [700, 550] # Last size of the Font dialog
self.mainPanePos = [300, 800] # Last position of the main window splitter
self.viewPanePos = [500, 150] # Last position of the document viewer splitter
self.outlinePanePos = [500, 150] # Last position of the outline panel splitter
self.searchPanePos = [150, 500] # Last position of the project search splitter
self.storyPanePos = [300, 800] # Last position of the story panel splitter
self.moveMainWin = True # Move main window to the screen middle on startup
# Project Settings
@@ -829,8 +829,8 @@ class Config:
self.fontWinSize = parser.getIntList(sec, "fontSelect", self.fontWinSize)
self.mainPanePos = parser.getIntList(sec, "mainPane", self.mainPanePos)
self.viewPanePos = parser.getIntList(sec, "viewPane", self.viewPanePos)
self.outlinePanePos = parser.getIntList(sec, "outlinePane", self.outlinePanePos)
self.searchPanePos = parser.getIntList(sec, "searchPane", self.searchPanePos)
self.storyPanePos = parser.getIntList(sec, "storyPane", self.storyPanePos)
self.moveMainWin = parser.getBool(sec, "moveMainWin", self.moveMainWin)
# Project
@@ -973,8 +973,8 @@ class Config:
"fontSelect": self.fontWinSize,
"mainPane": self.mainPanePos,
"viewPane": self.viewPanePos,
"outlinePane": self.outlinePanePos,
"searchPane": self.searchPanePos,
"storyPane": self.storyPanePos,
"moveMainWin": self.moveMainWin,
}
@@ -1212,7 +1212,7 @@ class RecentProjects:
class RecentPaths:
"""A record of recently used file paths."""
KEYS: Final[list[str]] = ["default", "project", "import", "outline", "stats"]
KEYS: Final[list[str]] = ["default", "project", "import", "story", "stats"]
def __init__(self, config: Config) -> None:
self._conf = config

View File

@@ -21,11 +21,20 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
from __future__ import annotations
from typing import Final
from typing import ClassVar
from PyQt6.QtCore import QT_TRANSLATE_NOOP, QCoreApplication
from novelwriter.enum import nwBuildFmt, nwComment, nwItemClass, nwItemLayout, nwOutline, nwStatusShape, nwTheme
from novelwriter.enum import (
nwBuildFmt,
nwComment,
nwItemClass,
nwItemLayout,
nwStatusShape,
nwStdLabel,
nwStdUnit,
nwTheme,
)
def trConst(text: str) -> str:
@@ -38,6 +47,16 @@ def trStats(text: str) -> str:
return QCoreApplication.translate("Stats", text)
def trLabel(label: nwStdLabel) -> str:
"""Return a translated standard label."""
return QCoreApplication.translate("Constant", nwLabels.STANDARD_LABEL.get(label, ""))
def trUnit(unit: nwStdUnit) -> str:
"""Return a translated standard unit."""
return QCoreApplication.translate("Unit", nwLabels.UNIT_LABELS.get(unit, ""))
class nwConst:
"""Various Constants."""
@@ -70,7 +89,7 @@ class nwConst:
class nwRegEx:
"""Common RegExes."""
URL = r"\bhttps?://(?:www\.|(?!www))[\w/()@:%_\+-.~#!?&=]+\b"
URL = r"\b(?:https?|file)://(?:www\.|(?!www))[\w/()@:%_\+-.~#!?&=]+\b"
WORDS = r"\b[^\s\-\+\/–—\[\]:]+\b" # noqa: RUF001
BREAK = r"(?i)(?<!\\)(\[br\]\n?)"
FMT_IT = r"(?<![\w\\])(_)(?![\s_])(.+?)(?<![\s\\])(\1)(?!\w)"
@@ -78,6 +97,7 @@ class nwRegEx:
FMT_B2 = r"(?<![\w\\])(\*{2})(?![\s\*])(.+?)(?<![\s\\])(\1)(?!\w)"
FMT_ST = r"(?<![\w\\])(~{2})(?![\s~])(.+?)(?<![\s\\])(\1)(?!\w)"
FMT_HL = r"(?<![\w\\])(={2})(?![\s=])(.+?)(?<![\s\\])(\1)(?!\w)"
FMT_LN = r"(?<!\\)(\[)([^\[\]]+)(?<!\\)(\]\()([^\s()]+)(?<!\\)(\))"
FMT_SC = r"(?i)(?<!\\)(\[(?:b|/b|i|/i|s|/s|u|/u|m|/m|sup|/sup|sub|/sub|br)\])"
FMT_SV = r"(?i)(?<!\\)(\[(?:footnote|field):)(.+?)(?<!\\)(\])"
@@ -104,7 +124,7 @@ class nwShortcode:
FOOTNOTE_B = "[footnote:"
FIELD_B = "[field:"
COMMENT_STYLES: Final[dict[nwComment, str]] = {
COMMENT_STYLES: ClassVar[dict[nwComment, str]] = {
nwComment.FOOTNOTE: "[footnote:{0}]",
nwComment.COMMENT: "[comment:{0}]",
}
@@ -116,13 +136,14 @@ class nwStyles:
"""Style Settings for Headings."""
H_VALID = ("H0", "H1", "H2", "H3", "H4")
H_LEVEL: Final[dict[str, int]] = {"H0": 0, "H1": 1, "H2": 2, "H3": 3, "H4": 4}
H_SIZES: Final[dict[int, float]] = {0: 2.50, 1: 2.00, 2: 1.75, 3: 1.50, 4: 1.25}
H_LEVEL: ClassVar[dict[str, int]] = {"H0": 0, "H1": 1, "H2": 2, "H3": 3, "H4": 4}
H_SIZES: ClassVar[dict[int, float]] = {0: 2.50, 1: 2.00, 2: 1.75, 3: 1.50, 4: 1.25}
H_MARKERS = ("# ", "## ", "### ", "#### ", "#! ", "##! ", "###! ")
T_NORMAL = 1.0
T_SMALL = 0.8
T_LABEL: Final[dict[str, str]] = {
T_LABEL: ClassVar[dict[str, str]] = {
"H0": QT_TRANSLATE_NOOP("Constant", "Title"),
"H1": QT_TRANSLATE_NOOP("Constant", "Heading 1 (Partition)"),
"H2": QT_TRANSLATE_NOOP("Constant", "Heading 2 (Chapter)"),
@@ -131,7 +152,7 @@ class nwStyles:
"TT": QT_TRANSLATE_NOOP("Constant", "Text Paragraph"),
"SP": QT_TRANSLATE_NOOP("Constant", "Scene Separator"),
}
T_MARGIN: Final[dict[str, tuple[float, float]]] = {
T_MARGIN: ClassVar[dict[str, tuple[float, float]]] = {
"H0": (1.50, 0.60), # Title margins (top, bottom)
"H1": (1.50, 0.60), # Heading 1 margins (top, bottom)
"H2": (1.50, 0.60), # Heading 2 margins (top, bottom)
@@ -160,10 +181,11 @@ class nwFiles:
# Project Meta Files
BUILDS_FILE = "builds.json"
DICT_FILE = "userdict.json"
INDEX_FILE = "index.json"
OPTS_FILE = "options.json"
DICT_FILE = "userdict.json"
SESS_FILE = "sessions.jsonl"
VIEWS_FILE = "views.json"
class nwKeyWords:
@@ -183,7 +205,7 @@ class nwKeyWords:
MENTION_KEY = "@mention"
# Note: The order here affects the order of menu entries
ALL_KEYS: Final[list[str]] = [
ALL_KEYS: ClassVar[list[str]] = [
TAG_KEY,
POV_KEY,
FOCUS_KEY,
@@ -197,7 +219,7 @@ class nwKeyWords:
STORY_KEY,
MENTION_KEY,
]
CAN_CREATE: Final[list[str]] = [
CAN_CREATE: ClassVar[list[str]] = [
POV_KEY,
FOCUS_KEY,
CHAR_KEY,
@@ -208,7 +230,7 @@ class nwKeyWords:
ENTITY_KEY,
CUSTOM_KEY,
]
CAN_LOOKUP: Final[list[str]] = [
CAN_LOOKUP: ClassVar[list[str]] = [
POV_KEY,
FOCUS_KEY,
CHAR_KEY,
@@ -223,10 +245,10 @@ class nwKeyWords:
]
# Set of Valid Keys
VALID_KEYS: Final[set[str]] = set(ALL_KEYS)
VALID_KEYS: ClassVar[set[str]] = set(ALL_KEYS)
# Map from Keys to Item Class
KEY_CLASS: Final[dict[str, nwItemClass]] = {
KEY_CLASS: ClassVar[dict[str, nwItemClass]] = {
POV_KEY: nwItemClass.CHARACTER,
FOCUS_KEY: nwItemClass.CHARACTER,
CHAR_KEY: nwItemClass.CHARACTER,
@@ -239,11 +261,26 @@ class nwKeyWords:
STORY_KEY: nwItemClass.NOVEL,
}
# Map to Class Icons
KEY_ICON: ClassVar[dict[str, str]] = {
POV_KEY: "key_pov:root",
FOCUS_KEY: "key_focus:root",
CHAR_KEY: "cls_character:root",
PLOT_KEY: "cls_plot:root",
TIME_KEY: "cls_timeline:root",
WORLD_KEY: "cls_world:root",
OBJECT_KEY: "cls_object:root",
ENTITY_KEY: "cls_entity:root",
CUSTOM_KEY: "cls_custom:root",
STORY_KEY: "cls_novel:root",
MENTION_KEY: "key_mention:root",
}
class nwLists:
"""Various Lists."""
USER_CLASSES: Final[list[nwItemClass]] = [
USER_CLASSES: ClassVar[list[nwItemClass]] = [
nwItemClass.CHARACTER,
nwItemClass.PLOT,
nwItemClass.WORLD,
@@ -272,7 +309,7 @@ class nwStats:
DIALOG_RATIO = "dialogRatio"
# Note: The order here affects the order of menu entries
ALL_FIELDS: Final[list[str]] = [
ALL_FIELDS: ClassVar[list[str]] = [
WORDS,
WORDS_TEXT,
WORDS_TITLE,
@@ -290,7 +327,7 @@ class nwStats:
class nwLabels:
"""Various Common GUI Labels."""
CLASS_NAME: Final[dict[nwItemClass, str]] = {
CLASS_NAME: ClassVar[dict[nwItemClass, str]] = {
nwItemClass.NO_CLASS: QT_TRANSLATE_NOOP("Constant", "None"),
nwItemClass.NOVEL: QT_TRANSLATE_NOOP("Constant", "Novel"),
nwItemClass.PLOT: QT_TRANSLATE_NOOP("Constant", "Plot"),
@@ -304,7 +341,7 @@ class nwLabels:
nwItemClass.TEMPLATE: QT_TRANSLATE_NOOP("Constant", "Templates"),
nwItemClass.TRASH: QT_TRANSLATE_NOOP("Constant", "Trash"),
}
CLASS_ICON: Final[dict[nwItemClass, str]] = {
CLASS_ICON: ClassVar[dict[nwItemClass, str]] = {
nwItemClass.NO_CLASS: "cls_none:root",
nwItemClass.NOVEL: "cls_novel:root",
nwItemClass.PLOT: "cls_plot:root",
@@ -318,12 +355,18 @@ class nwLabels:
nwItemClass.TEMPLATE: "cls_template:root",
nwItemClass.TRASH: "cls_trash:root",
}
LAYOUT_NAME: Final[dict[nwItemLayout, str]] = {
LAYOUT_NAME: ClassVar[dict[nwItemLayout, str]] = {
nwItemLayout.NO_LAYOUT: QT_TRANSLATE_NOOP("Constant", "None"),
nwItemLayout.DOCUMENT: QT_TRANSLATE_NOOP("Constant", "Novel Document"),
nwItemLayout.NOTE: QT_TRANSLATE_NOOP("Constant", "Project Note"),
}
ITEM_DESCRIPTION: Final[dict[str, str]] = {
STANDARD_LABEL: ClassVar[dict[nwStdLabel, str]] = {
nwStdLabel.NOTE: QT_TRANSLATE_NOOP("Constant", "Note"),
nwStdLabel.STORY_STRUCTURE: QT_TRANSLATE_NOOP("Constant", "Story Structure"),
nwStdLabel.STORY: QT_TRANSLATE_NOOP("Constant", "Story"),
nwStdLabel.SYNOPSIS: QT_TRANSLATE_NOOP("Constant", "Synopsis"),
}
ITEM_DESCRIPTION: ClassVar[dict[str, str]] = {
"none": QT_TRANSLATE_NOOP("Constant", "None"),
"root": QT_TRANSLATE_NOOP("Constant", "Root Folder"),
"folder": QT_TRANSLATE_NOOP("Constant", "Folder"),
@@ -334,11 +377,11 @@ class nwLabels:
"doc_h4": QT_TRANSLATE_NOOP("Constant", "Novel Section"),
"note": QT_TRANSLATE_NOOP("Constant", "Project Note"),
}
ACTIVE_NAME: Final[dict[bool, str]] = {
ACTIVE_NAME: ClassVar[dict[bool, str]] = {
True: QT_TRANSLATE_NOOP("Constant", "Active"),
False: QT_TRANSLATE_NOOP("Constant", "Inactive"),
}
KEY_NAME: Final[dict[str, str]] = {
KEY_NAME: ClassVar[dict[str, str]] = {
nwKeyWords.TAG_KEY: QT_TRANSLATE_NOOP("Constant", "Tag"),
nwKeyWords.POV_KEY: QT_TRANSLATE_NOOP("Constant", "Point of View"),
nwKeyWords.FOCUS_KEY: QT_TRANSLATE_NOOP("Constant", "Focus"),
@@ -352,7 +395,7 @@ class nwLabels:
nwKeyWords.STORY_KEY: QT_TRANSLATE_NOOP("Constant", "Story"),
nwKeyWords.MENTION_KEY: QT_TRANSLATE_NOOP("Constant", "Mentions"),
}
KEY_SHORTCUT: Final[dict[str, str]] = {
KEY_SHORTCUT: ClassVar[dict[str, str]] = {
nwKeyWords.TAG_KEY: "Ctrl+K, G",
nwKeyWords.POV_KEY: "Ctrl+K, V",
nwKeyWords.FOCUS_KEY: "Ctrl+K, F",
@@ -366,29 +409,7 @@ class nwLabels:
nwKeyWords.STORY_KEY: "Ctrl+K, N",
nwKeyWords.MENTION_KEY: "Ctrl+K, M",
}
OUTLINE_COLS: Final[dict[nwOutline, str]] = {
nwOutline.TITLE: QT_TRANSLATE_NOOP("Constant", "Title"),
nwOutline.LEVEL: QT_TRANSLATE_NOOP("Constant", "Level"),
nwOutline.LABEL: QT_TRANSLATE_NOOP("Constant", "Document"),
nwOutline.LINE: QT_TRANSLATE_NOOP("Constant", "Line"),
nwOutline.STATUS: QT_TRANSLATE_NOOP("Constant", "Status"),
nwOutline.CCOUNT: QT_TRANSLATE_NOOP("Constant", "Chars"),
nwOutline.WCOUNT: QT_TRANSLATE_NOOP("Constant", "Words"),
nwOutline.PCOUNT: QT_TRANSLATE_NOOP("Constant", "Pars"),
nwOutline.POV: QT_TRANSLATE_NOOP("Constant", "POV"),
nwOutline.FOCUS: QT_TRANSLATE_NOOP("Constant", "Focus"),
nwOutline.CHAR: KEY_NAME[nwKeyWords.CHAR_KEY],
nwOutline.PLOT: KEY_NAME[nwKeyWords.PLOT_KEY],
nwOutline.WORLD: KEY_NAME[nwKeyWords.WORLD_KEY],
nwOutline.TIME: KEY_NAME[nwKeyWords.TIME_KEY],
nwOutline.OBJECT: KEY_NAME[nwKeyWords.OBJECT_KEY],
nwOutline.ENTITY: KEY_NAME[nwKeyWords.ENTITY_KEY],
nwOutline.CUSTOM: KEY_NAME[nwKeyWords.CUSTOM_KEY],
nwOutline.STORY: KEY_NAME[nwKeyWords.STORY_KEY],
nwOutline.MENTION: KEY_NAME[nwKeyWords.MENTION_KEY],
nwOutline.SYNOP: QT_TRANSLATE_NOOP("Constant", "Synopsis"),
}
STATS_NAME: Final[dict[str, str]] = {
STATS_NAME: ClassVar[dict[str, str]] = {
nwStats.CHARS: QT_TRANSLATE_NOOP("Stats", "Characters"),
nwStats.CHARS_TEXT: QT_TRANSLATE_NOOP("Stats", "Characters in text"),
nwStats.CHARS_TITLE: QT_TRANSLATE_NOOP("Stats", "Characters in headings"),
@@ -403,11 +424,19 @@ class nwLabels:
nwStats.WORDS_TITLE: QT_TRANSLATE_NOOP("Stats", "Words in headings"),
nwStats.DIALOG_RATIO: QT_TRANSLATE_NOOP("Stats", "Dialogue"),
}
STATS_DISPLAY: Final[dict[str, str]] = {
STATS_DISPLAY: ClassVar[dict[str, str]] = {
nwStats.CHARS: QT_TRANSLATE_NOOP("Stats", "Characters: {0} ({1})"),
nwStats.WORDS: QT_TRANSLATE_NOOP("Stats", "Words: {0} ({1})"),
}
BUILD_FMT: Final[dict[nwBuildFmt, str]] = {
UNIT_LABELS: ClassVar[dict[nwStdUnit, str]] = {
nwStdUnit.CHARS: QT_TRANSLATE_NOOP("Units", "characters"),
nwStdUnit.WORDS: QT_TRANSLATE_NOOP("Units", "words"),
nwStdUnit.LINES: QT_TRANSLATE_NOOP("Units", "lines"),
nwStdUnit.PIXELS: QT_TRANSLATE_NOOP("Units", "px"),
nwStdUnit.SECONDS: QT_TRANSLATE_NOOP("Units", "seconds"),
nwStdUnit.MINUTES: QT_TRANSLATE_NOOP("Units", "minutes"),
}
BUILD_FMT: ClassVar[dict[nwBuildFmt, str]] = {
nwBuildFmt.ODT: QT_TRANSLATE_NOOP("Constant", "Open Document (.odt)"),
nwBuildFmt.FODT: QT_TRANSLATE_NOOP("Constant", "Flat Open Document (.fodt)"),
nwBuildFmt.DOCX: QT_TRANSLATE_NOOP("Constant", "Microsoft Word Document (.docx)"),
@@ -420,7 +449,7 @@ class nwLabels:
nwBuildFmt.J_HTML: QT_TRANSLATE_NOOP("Constant", "JSON + HTML 5 (.json)"),
nwBuildFmt.J_NWD: QT_TRANSLATE_NOOP("Constant", "JSON + novelWriter Markup (.json)"),
}
BUILD_EXT: Final[dict[nwBuildFmt, str]] = {
BUILD_EXT: ClassVar[dict[nwBuildFmt, str]] = {
nwBuildFmt.ODT: ".odt",
nwBuildFmt.FODT: ".fodt",
nwBuildFmt.DOCX: ".docx",
@@ -433,7 +462,7 @@ class nwLabels:
nwBuildFmt.J_HTML: ".json",
nwBuildFmt.J_NWD: ".json",
}
SHAPES_PLAIN: Final[dict[nwStatusShape, str]] = {
SHAPES_PLAIN: ClassVar[dict[nwStatusShape, str]] = {
nwStatusShape.SQUARE: QT_TRANSLATE_NOOP("Constant", "Square"),
nwStatusShape.TRIANGLE: QT_TRANSLATE_NOOP("Constant", "Triangle"),
nwStatusShape.NABLA: QT_TRANSLATE_NOOP("Constant", "Nabla"),
@@ -443,41 +472,41 @@ class nwLabels:
nwStatusShape.STAR: QT_TRANSLATE_NOOP("Constant", "Star"),
nwStatusShape.PACMAN: QT_TRANSLATE_NOOP("Constant", "Pacman"),
}
SHAPES_CIRCLE: Final[dict[nwStatusShape, str]] = {
SHAPES_CIRCLE: ClassVar[dict[nwStatusShape, str]] = {
nwStatusShape.CIRCLE_Q: QT_TRANSLATE_NOOP("Constant", "1/4 Circle"),
nwStatusShape.CIRCLE_H: QT_TRANSLATE_NOOP("Constant", "Half Circle"),
nwStatusShape.CIRCLE_T: QT_TRANSLATE_NOOP("Constant", "3/4 Circle"),
nwStatusShape.CIRCLE: QT_TRANSLATE_NOOP("Constant", "Full Circle"),
}
SHAPES_BARS: Final[dict[nwStatusShape, str]] = {
SHAPES_BARS: ClassVar[dict[nwStatusShape, str]] = {
nwStatusShape.BARS_1: QT_TRANSLATE_NOOP("Constant", "1 Bar"),
nwStatusShape.BARS_2: QT_TRANSLATE_NOOP("Constant", "2 Bars"),
nwStatusShape.BARS_3: QT_TRANSLATE_NOOP("Constant", "3 Bars"),
nwStatusShape.BARS_4: QT_TRANSLATE_NOOP("Constant", "4 Bars"),
}
SHAPES_BLOCKS: Final[dict[nwStatusShape, str]] = {
SHAPES_BLOCKS: ClassVar[dict[nwStatusShape, str]] = {
nwStatusShape.BLOCK_1: QT_TRANSLATE_NOOP("Constant", "1 Block"),
nwStatusShape.BLOCK_2: QT_TRANSLATE_NOOP("Constant", "2 Blocks"),
nwStatusShape.BLOCK_3: QT_TRANSLATE_NOOP("Constant", "3 Blocks"),
nwStatusShape.BLOCK_4: QT_TRANSLATE_NOOP("Constant", "4 Blocks"),
}
FILE_FILTERS: Final[dict[str, str]] = {
FILE_FILTERS: ClassVar[dict[str, str]] = {
"*.txt": QT_TRANSLATE_NOOP("Constant", "Text files"),
"*.md": QT_TRANSLATE_NOOP("Constant", "Markdown files"),
"*.csv": QT_TRANSLATE_NOOP("Constant", "CSV files"),
"*": QT_TRANSLATE_NOOP("Constant", "All files"),
}
UNIT_NAME: Final[dict[str, str]] = {
PAGE_UNIT_NAME: ClassVar[dict[str, str]] = {
"mm": QT_TRANSLATE_NOOP("Constant", "Millimetres"),
"cm": QT_TRANSLATE_NOOP("Constant", "Centimetres"),
"in": QT_TRANSLATE_NOOP("Constant", "Inches"),
}
UNIT_SCALE: Final[dict[str, float]] = {
PAGE_UNIT_SCALE: ClassVar[dict[str, float]] = {
"mm": 1.0,
"cm": 10.0,
"in": 25.4,
}
PAPER_NAME: Final[dict[str, str]] = {
PAPER_NAME: ClassVar[dict[str, str]] = {
"A4": QT_TRANSLATE_NOOP("Constant", "A4"),
"A5": QT_TRANSLATE_NOOP("Constant", "A5"),
"A6": QT_TRANSLATE_NOOP("Constant", "A6"),
@@ -485,7 +514,7 @@ class nwLabels:
"Letter": QT_TRANSLATE_NOOP("Constant", "US Letter"),
"Custom": QT_TRANSLATE_NOOP("Constant", "Custom"),
}
PAPER_SIZE: Final[dict[str, tuple[float, float]]] = {
PAPER_SIZE: ClassVar[dict[str, tuple[float, float]]] = {
"A4": (210.0, 297.0),
"A5": (148.0, 210.0),
"A6": (105.0, 148.0),
@@ -493,7 +522,7 @@ class nwLabels:
"Letter": (215.9, 279.4),
"Custom": (-1.0, -1.0),
}
THEME_COLORS: Final[dict[str, str]] = {
THEME_COLORS: ClassVar[dict[str, str]] = {
"default": QT_TRANSLATE_NOOP("Constant", "Foreground Colour"),
"base": QT_TRANSLATE_NOOP("Constant", "Background Colour"),
"faded": QT_TRANSLATE_NOOP("Constant", "Faded Colour"),
@@ -505,27 +534,37 @@ class nwLabels:
"blue": QT_TRANSLATE_NOOP("Constant", "Blue"),
"purple": QT_TRANSLATE_NOOP("Constant", "Purple"),
}
THEME_MODE_ICON: Final[dict[nwTheme, str]] = {
THEME_MODE_ICON: ClassVar[dict[nwTheme, str]] = {
nwTheme.AUTO: "theme_auto:sidebar",
nwTheme.LIGHT: "theme_light:sidebar",
nwTheme.DARK: "theme_dark:sidebar",
}
THEME_MODE_LABEL: Final[dict[nwTheme, str]] = {
THEME_MODE_LABEL: ClassVar[dict[nwTheme, str]] = {
nwTheme.AUTO: QT_TRANSLATE_NOOP("Constant", "System Theme"),
nwTheme.LIGHT: QT_TRANSLATE_NOOP("Constant", "Light Theme"),
nwTheme.DARK: QT_TRANSLATE_NOOP("Constant", "Dark Theme"),
}
BACKUP_INTERVAL: Final[dict[str, str]] = {
COMMENT_ICON: ClassVar[dict[nwComment, str]] = {
nwComment.PLAIN: "cmn_general:faded",
nwComment.IGNORE: "cmn_general:disabled",
nwComment.SYNOPSIS: "cmn_general:note",
nwComment.SHORT: "cmn_general:note",
nwComment.NOTE: "cmn_note:note",
nwComment.FOOTNOTE: "cmn_note:active",
nwComment.COMMENT: "cmn_general:faded",
nwComment.STORY: "cmn_story:note",
}
BACKUP_INTERVAL: ClassVar[dict[str, str]] = {
"session": QT_TRANSLATE_NOOP("Constant", "Per Session"),
"day": QT_TRANSLATE_NOOP("Constant", "Per Day"),
"week": QT_TRANSLATE_NOOP("Constant", "Per Week"),
"month": QT_TRANSLATE_NOOP("Constant", "Per Month"),
}
FILTER_GROUPS: Final[dict[str, str]] = {
FILTER_GROUPS: ClassVar[dict[str, str]] = {
"documents": QT_TRANSLATE_NOOP("Constant", "Document Filters"),
"content": QT_TRANSLATE_NOOP("Constant", "Content Filters"),
}
FILTER_TYPES: Final[dict[str, str]] = {
FILTER_TYPES: ClassVar[dict[str, str]] = {
"novel": QT_TRANSLATE_NOOP("Constant", "Novel documents"),
"notes": QT_TRANSLATE_NOOP("Constant", "Project notes"),
"inactive": QT_TRANSLATE_NOOP("Constant", "Inactive documents"),
@@ -551,7 +590,7 @@ class nwHeadFmt:
CHAR_FOCUS = "{Char:Focus}"
HRULE = "----"
PAGE_HEADERS: Final[list[str]] = [
PAGE_HEADERS: ClassVar[list[str]] = [
TITLE,
CH_NUM,
CH_WORD,
@@ -576,7 +615,7 @@ class nwQuotes:
Source: https://en.wikipedia.org/wiki/Quotation_mark
"""
SYMBOLS: Final[dict[str, str]] = {
SYMBOLS: ClassVar[dict[str, str]] = {
"\u0027": QT_TRANSLATE_NOOP("Constant", "Straight single quotation mark"),
"\u0022": QT_TRANSLATE_NOOP("Constant", "Straight double quotation mark"),
"\u2018": QT_TRANSLATE_NOOP("Constant", "Left single quotation mark"),
@@ -598,14 +637,14 @@ class nwQuotes:
"\u300f": QT_TRANSLATE_NOOP("Constant", "Right white corner bracket"),
}
DASHES: Final[dict[str, str]] = {
DASHES: ClassVar[dict[str, str]] = {
"": QT_TRANSLATE_NOOP("Constant", "None"),
"\u2013": QT_TRANSLATE_NOOP("Constant", "Short dash"),
"\u2014": QT_TRANSLATE_NOOP("Constant", "Long dash"),
"\u2015": QT_TRANSLATE_NOOP("Constant", "Horizontal bar"),
}
ALLOWED: Final[list[str]] = [
ALLOWED: ClassVar[list[str]] = [
"\u0027",
"\u0022",
"\u2018",
@@ -754,7 +793,7 @@ class nwUnicode:
H_DIVIDE = "&divide;"
# Unicode symbols expected to be used on the UI
UI_SYMBOLS: Final[list[str]] = [
UI_SYMBOLS: ClassVar[list[str]] = [
U_QUOT,
U_APOS,
U_LAQUO,
@@ -806,7 +845,7 @@ class nwUnicode:
class nwHtmlUnicode:
"""Unicode to HTML Map."""
U_TO_H: Final[dict[str, str]] = {
U_TO_H: ClassVar[dict[str, str]] = {
# Quotes
nwUnicode.U_QUOT: nwUnicode.H_QUOT,
nwUnicode.U_APOS: nwUnicode.H_APOS,

View File

@@ -40,7 +40,7 @@ from novelwriter.common import (
jsonEncode,
safeExists,
)
from novelwriter.constants import nwFiles, nwKeyWords, nwStyles
from novelwriter.constants import nwFiles, nwKeyWords
from novelwriter.core.indexdata import NOTE_TYPES, TT_NONE, IndexHeading, IndexNode, T_NoteTypes
from novelwriter.enum import nwComment, nwItemClass, nwItemLayout, nwItemType, nwNovelExtra
from novelwriter.error import logException
@@ -91,14 +91,12 @@ class Index:
"""
__slots__ = (
"_indexChange",
"_indexRevision",
"_indexUpgrade",
"_itemIndex",
"_novelExtra",
"_novelModels",
"_project",
"_rootChange",
"_tagsIndex",
)
@@ -116,9 +114,7 @@ class Index:
self._novelExtra = nwNovelExtra.HIDDEN
# Track Changes
self._indexChange = 0.0
self._indexRevision = 0
self._rootChange = {}
def __repr__(self) -> str:
"""Return a string representation of the index."""
@@ -166,12 +162,10 @@ class Index:
##
def clear(self) -> None:
"""Clear the index dictionaries and time stamps."""
"""Clear the index dictionaries."""
self._tagsIndex.clear()
self._itemIndex.clear()
self._indexChange = 0.0
self._indexRevision += 1 # We must not reset the revision number
self._rootChange = {}
SHARED.emitIndexCleared(self._project)
def rebuild(self) -> None:
@@ -195,6 +189,7 @@ class Index:
for tTag in delTags:
del self._tagsIndex[tTag]
del self._itemIndex[tHandle]
self._indexRevision += 1
SHARED.emitIndexChangedTags(self._project, [], delTags)
def reIndexHandle(self, tHandle: str | None) -> None:
@@ -215,18 +210,6 @@ class Index:
else:
self._tagsIndex.updateClass(tHandle, item.itemClass.name)
def indexChangedSince(self, checkTime: int | float) -> bool:
"""Check if the index has changed since a given time."""
return self._indexChange > float(checkTime)
def rootChangedSince(self, rootHandle: str | None, checkTime: int | float) -> bool:
"""Check if the index has changed since a given time for a
given root item.
"""
if isinstance(rootHandle, str):
return self._rootChange.get(rootHandle, self._indexChange) > float(checkTime)
return False
def refreshNovelModel(self, tHandle: str | None) -> None:
"""Refresh a novel model."""
if tHandle and (model := self.getNovelModel(tHandle)):
@@ -291,7 +274,6 @@ class Index:
logger.warning("Item '%s' is not in the index", fHandle)
self.reIndexHandle(fHandle)
self._indexChange = time()
SHARED.emitIndexAvailable(self._project)
logger.debug("Index loaded in %.3f ms", (time() - tStart) * 1000)
@@ -381,11 +363,7 @@ class Index:
if tItem.itemClass == nwItemClass.NOVEL and not blockSignal and not self.updateNovelModelData(tItem):
self.refreshNovelModel(tItem.itemRoot)
# Update timestamps for index changes
nowTime = time()
self._indexChange = nowTime
self._indexRevision += 1
self._rootChange[tItem.itemRoot] = nowTime
if not blockSignal:
if changedRefs := sorted(oldRefs | self._itemRefHandles(tHandle)):
SHARED.emitIndexChangedRefs(self._project, changedRefs)
@@ -410,7 +388,7 @@ class Index:
continue
if line.startswith("#"):
hDepth, hText = processHeading(line)
hDepth, hText, hMod = processHeading(line)
if hDepth == "H0":
continue
@@ -418,7 +396,7 @@ class Index:
nwItem.setMainHeading(hDepth)
canSetHead = False
cTitle = self._itemIndex.addItemHeading(tHandle, n, hDepth, hText)
cTitle = self._itemIndex.addItemHeading(tHandle, n, hDepth, hText, hMod)
if cTitle != TT_NONE: # pragma: no branch
if nTitle > 0:
# We have a new title, so we need to count the words of the previous one
@@ -465,7 +443,7 @@ class Index:
"""Scan an inactive document for meta data."""
for line in text.splitlines():
if line.startswith("#"):
hDepth, _ = processHeading(line)
hDepth, _, _ = processHeading(line)
if hDepth != "H0":
nwItem.setMainHeading(hDepth)
break
@@ -490,7 +468,7 @@ class Index:
"""
isValid, tBits, _ = self.scanThis(line)
if not isValid or len(tBits) < 2:
logger.warning("Skipping keyword with %d value(s) in '%s'", len(tBits), tHandle)
logger.warning("Skipping keyword with %d value(s) in '%s'", len(tBits) - 1, tHandle)
return
if tBits[0] not in nwKeyWords.VALID_KEYS:
@@ -645,6 +623,14 @@ class Index:
yield from tItem.items()
return
def iterNovelStructure(
self, rHandle: str | None = None, activeOnly: bool = True
) -> Iterable[tuple[str, str, IndexHeading]]:
"""Iterate over all items and headers in the novel structure for
a given root handle, or for all if root handle is None.
"""
yield from self._itemIndex.iterNovelStructure(rHandle=rHandle, activeOnly=activeOnly)
def getStoryKeys(self) -> set[str]:
"""Return all story structure keys."""
return self._itemIndex.allStoryKeys()
@@ -653,60 +639,6 @@ class Index:
"""Return all note comment keys."""
return self._itemIndex.allNoteKeys()
def novelStructure(
self, rootHandle: str | None = None, activeOnly: bool = True
) -> Iterable[tuple[str, str, str, IndexHeading]]:
"""Iterate over all titles in the novel, in the correct order as
they appear in the tree view and in the respective document
files, but skipping all note files.
"""
structure = self._itemIndex.iterNovelStructure(rHandle=rootHandle, activeOnly=activeOnly)
for tHandle, sTitle, hItem in structure:
yield f"{tHandle}:{sTitle}", tHandle, sTitle, hItem
return
def getNovelWordCount(self, rootHandle: str | None = None, activeOnly: bool = True) -> int:
"""Count the number of words in one or all novel roots."""
return sum(
hItem.wordCount
for _, _, hItem in self._itemIndex.iterNovelStructure(rHandle=rootHandle, activeOnly=activeOnly)
)
def getNovelTitleCounts(self, rootHandle: str | None = None, activeOnly: bool = True) -> list[int]:
"""Count the number of titles in one or all novel roots."""
hCount = [0, 0, 0, 0, 0]
for _, _, hItem in self._itemIndex.iterNovelStructure(rHandle=rootHandle, activeOnly=activeOnly):
iLevel = nwStyles.H_LEVEL.get(hItem.level, 0)
hCount[iLevel] += 1
return hCount
def getTableOfContents(
self,
rHandle: str | None,
maxDepth: int,
activeOnly: bool = True,
) -> list[tuple[str, int, str, int]]:
"""Generate a table of contents up to a maximum depth."""
tOrder = []
tData = {}
pKey = None
for tHandle, sTitle, hItem in self._itemIndex.iterNovelStructure(rHandle=rHandle, activeOnly=activeOnly):
tKey = f"{tHandle}:{sTitle}"
iLevel = nwStyles.H_LEVEL.get(hItem.level, 0)
if iLevel > maxDepth:
if pKey in tData:
tData[pKey]["words"] += hItem.wordCount
else:
pKey = tKey
tOrder.append(tKey)
tData[tKey] = {
"level": iLevel,
"title": hItem.title,
"words": hItem.wordCount,
}
return [(tKey, tData[tKey]["level"], tData[tKey]["title"], tData[tKey]["words"]) for tKey in tOrder]
def getCounts(self, tHandle: str, sTitle: str | None = None) -> tuple[int, int, int]:
"""Return the counts for a file, or a section of a file,
starting at title sTitle if it is provided.
@@ -725,21 +657,6 @@ class Index:
return 0, 0, 0
def getReferences(self, tHandle: str, sTitle: str | None = None) -> dict[str, list[str]]:
"""Extract all tags and references made in a file, and
optionally title section.
"""
refs = {x: [] for x in nwKeyWords.VALID_KEYS}
for rTitle, hItem in self._itemIndex.iterItemHeaders(tHandle):
if sTitle is None or sTitle == rTitle:
for aTag, refTypes in hItem.references.items():
for refType in refTypes:
if refType in refs: # pragma: no branch
refs[refType].append(self._tagsIndex.tagName(aTag))
if tag := hItem.tag:
refs[nwKeyWords.TAG_KEY] = [self._tagsIndex.tagName(tag)]
return refs
def getReferenceForHeader(self, tHandle: str, nHead: int, keyClass: str) -> list[str]:
"""Get the display names for a tags class for insertion into a
heading by one of the build classes.
@@ -970,12 +887,13 @@ class IndexCache:
which provides lookup capabilities and caching for shared data.
"""
__slots__ = ("note", "story", "tags")
__slots__ = ("keys", "note", "story", "tags")
def __init__(self, tagsIndex: TagsIndex) -> None:
self.tags: TagsIndex = tagsIndex
self.story: set[str] = set()
self.note: set[str] = set()
self.keys: set[str] = set()
# The Item Index Objects
@@ -1039,12 +957,6 @@ class ItemIndex:
return self._items[tHandle].allTags()
return []
def iterItemHeaders(self, tHandle: str) -> Iterable[tuple[str, IndexHeading]]:
"""Iterate over all item headers of an item."""
if tHandle in self._items:
yield from self._items[tHandle].items()
return
def iterAllHeaders(self) -> Iterable[tuple[str, str, IndexHeading]]:
"""Iterate through all items and headings in the index."""
for tHandle, tItem in self._items.items():
@@ -1053,7 +965,9 @@ class ItemIndex:
return
def iterNovelStructure(
self, rHandle: str | None = None, activeOnly: bool = False
self,
rHandle: str | None = None,
activeOnly: bool = False,
) -> Iterable[tuple[str, str, IndexHeading]]:
"""Iterate over all items and headers in the novel structure for
a given root handle, or for all if root handle is None.
@@ -1079,12 +993,12 @@ class ItemIndex:
# Setters
##
def addItemHeading(self, tHandle: str, lineNo: int, level: str, text: str) -> str:
def addItemHeading(self, tHandle: str, lineNo: int, level: str, text: str, mod: bool) -> str:
"""Add a heading to an item."""
if tHandle in self._items:
tItem = self._items[tHandle]
sTitle = tItem.nextHeading()
tItem.addHeading(IndexHeading(self._cache, sTitle, lineNo, level, text))
tItem.addHeading(IndexHeading(self._cache, sTitle, lineNo, level, text, mod))
return sTitle
return TT_NONE
@@ -1118,12 +1032,9 @@ class ItemIndex:
def genNewNoteKey(self, tHandle: str, style: T_NoteTypes) -> str:
"""Generate a new notes key for a given item."""
if style in NOTE_TYPES and (item := self._items.get(tHandle)):
keys = set()
for entry in self._items.values():
keys.update(entry.noteKeys(style))
for _ in range(MAX_RETRY):
key = style[:1] + "".join(random.choices(KEY_SOURCE, k=4))
if key not in keys:
if key not in self._cache.keys:
item.addNoteKey(style, key)
return key
return "err"

View File

@@ -23,6 +23,7 @@ from __future__ import annotations
import logging
from collections import defaultdict
from typing import TYPE_CHECKING, Literal
from novelwriter import CONFIG
@@ -39,6 +40,7 @@ if TYPE_CHECKING:
logger = logging.getLogger(__name__)
T_NoteTypes = Literal["footnotes", "comments"]
T_IndexHeadRefs = dict[str, list[str]]
TT_NONE = "T0000" # Default title key
NOTE_TYPES: list[T_NoteTypes] = ["footnotes", "comments"]
@@ -61,7 +63,7 @@ class IndexNode:
self._handle = tHandle
self._item = nwItem
self._headings: dict[str, IndexHeading] = {TT_NONE: IndexHeading(self._cache, TT_NONE)}
self._notes: dict[str, set[str]] = {}
self._notes: dict[str, set[str]] = defaultdict(set)
self._count = 0
def __repr__(self) -> str:
@@ -129,8 +131,7 @@ class IndexNode:
def addNoteKey(self, style: T_NoteTypes, key: str) -> None:
"""Add a note key to the index."""
if style not in self._notes:
self._notes[style] = set()
self._cache.keys.add(key)
self._notes[style].add(key)
##
@@ -184,7 +185,8 @@ class IndexNode:
raise ValueError("The notes style is invalid")
if not isListInstance(keys, str):
raise ValueError("The notes keys must be a list of strings")
self._notes[style] = set(keys)
self._notes[style].update(keys)
self._cache.keys.update(keys)
else:
raise KeyError("Index node contains an invalid key")
@@ -197,14 +199,23 @@ class IndexHeading:
of all references made under the heading.
"""
__slots__ = ("_cache", "_comments", "_counts", "_key", "_level", "_line", "_refs", "_tag", "_title")
__slots__ = ("_cache", "_comments", "_counts", "_key", "_level", "_line", "_mod", "_refs", "_tag", "_title")
def __init__(self, cache: IndexCache, key: str, line: int = 0, level: str = "H0", title: str = "") -> None:
def __init__(
self,
cache: IndexCache,
key: str,
line: int = 0,
level: str = "H0",
title: str = "",
mod: bool = False,
) -> None:
self._cache = cache
self._key = key
self._line = line
self._level = level
self._title = title
self._mod = mod
self._counts: tuple[int, int, int] = (0, 0, 0)
self._tag = ""
self._refs: dict[str, set[str]] = {}
@@ -220,50 +231,67 @@ class IndexHeading:
@property
def key(self) -> str:
"""Return the heading key."""
return self._key
@property
def line(self) -> int:
"""Return the heading line number."""
return self._line
@property
def level(self) -> str:
"""Return the heading level key."""
return self._level
@property
def title(self) -> str:
"""Return the heading title text."""
return self._title
@property
def modified(self) -> bool:
"""Return True if the heading is a modified heading type."""
return self._mod
@property
def mainCount(self) -> int:
"""Return the main count stats for the heading."""
return self._counts[0 if CONFIG.useCharCount else 1]
@property
def charCount(self) -> int:
"""Return the heading character count."""
return self._counts[0]
@property
def wordCount(self) -> int:
"""Return the heading word count."""
return self._counts[1]
@property
def paraCount(self) -> int:
"""Return the heading paragraph count."""
return self._counts[2]
@property
def synopsis(self) -> str:
"""Return the heading synopsis."""
return self._comments.get("summary", "")
@property
def comments(self) -> dict[str, str]:
"""Return the heading comments."""
return self._comments
@property
def tag(self) -> str:
"""Return the heading tag."""
return self._tag
@property
def references(self) -> dict[str, set[str]]:
"""Return the heading references."""
return self._refs
##
@@ -313,6 +341,7 @@ class IndexHeading:
if keyword in nwKeyWords.VALID_KEYS:
tag = tag.lower()
if tag not in self._refs:
# This is deliberate since using defaultdict for _refs is unsafe
self._refs[tag] = set()
self._refs[tag].add(keyword)
@@ -320,7 +349,7 @@ class IndexHeading:
# Getters
##
def getReferences(self) -> dict[str, list[str]]:
def getReferences(self) -> T_IndexHeadRefs:
"""Extract all tags and references for this heading."""
refs = {x: [] for x in nwKeyWords.VALID_KEYS}
for tag, types in self._refs.items():
@@ -353,6 +382,7 @@ class IndexHeading:
data["meta"] = {
"level": self._level,
"title": self._title,
"mod": self._mod,
"line": self._line,
"tag": self._tag,
"counts": self._counts,
@@ -370,9 +400,12 @@ class IndexHeading:
if key == "meta":
self.setLevel(entry.get("level", "H0"))
self._title = str(entry.get("title", ""))
self._mod = bool(entry.get("mod", False))
self._tag = str(entry.get("tag", ""))
self.setLine(entry.get("line", 0))
self.setCounts(entry.get("counts", [0, 0, 0]))
if not entry.keys() >= {"level", "title", "line", "mod", "tag", "counts"}:
raise KeyError("Heading meta is missing keys")
elif key == "refs":
for tag, value in entry.items():
if not isinstance(tag, str):

View File

@@ -63,9 +63,6 @@ VALID_MAP: dict[str, set[str]] = {
"intoFolder",
"docHierarchy",
},
"GuiOutline": {
"columnState",
},
"GuiProjectSettings": {
"winWidth",
"winHeight",
@@ -110,26 +107,13 @@ VALID_MAP: dict[str, set[str]] = {
"colWidths",
"hideInactive",
},
"GuiNovelDetails": {
"winWidth",
"winHeight",
"widthCol0",
"widthCol1",
"widthCol2",
"widthCol3",
"widthCol4",
"wordsPerPage",
"countFrom",
"clearDouble",
"novelRoot",
},
"GuiOutlineDetails": {
"detailsWidth",
"tagsWidth",
},
"GuiProjectSearch": {
"searchFilters",
},
"GuiStorySettings": {
"winWidth",
"winHeight",
},
}

View File

@@ -43,7 +43,7 @@ from novelwriter.common import (
minmax,
safeIsFile,
)
from novelwriter.constants import nwLabels, trConst
from novelwriter.constants import nwLabels, nwStyles, trConst
from novelwriter.core.index import Index
from novelwriter.core.options import OptionState
from novelwriter.core.projectdata import ProjectData
@@ -173,11 +173,6 @@ class NWProject:
"""Return the project lock information."""
return self._storage.lockStatus
@property
def currentEditTime(self) -> int:
"""Return total edit time, including the current session."""
return self._data.editTime + round(time() - self._session.start)
@property
def currentTotalCount(self) -> int:
"""Return the current total word count from the tree."""
@@ -268,12 +263,7 @@ class NWProject:
logger.debug("Populating '%s' with text from '%s'", tHandle, sHandle)
text = self._storage.getDocumentText(sHandle)
if (
newTitle
and (lines := text.split("\n"))
and lines
and lines[0].startswith(("# ", "## ", "### ", "#### ", "#! ", "##! ", "###! "))
):
if newTitle and (lines := text.split("\n")) and lines and lines[0].startswith(nwStyles.H_MARKERS):
prefix, _, _ = lines[0].partition(" ")
lines[0] = f"{prefix} {newTitle}"
text = "\n".join(lines)

View File

@@ -47,7 +47,7 @@ if TYPE_CHECKING:
logger = logging.getLogger(__name__)
T_LastHandle = Literal["editor", "viewer", "novel", "outline"]
T_LastHandle = Literal["editor", "viewer", "novel", "story"]
class ProjectData:
@@ -129,7 +129,7 @@ class ProjectData:
"editor": None,
"viewer": None,
"novel": None,
"outline": None,
"story": None,
}
self._autoReplace: dict[str, str] = {}
self._titleFormat: dict[str, str] = {

View File

@@ -27,7 +27,7 @@ import re
from typing import TYPE_CHECKING
from novelwriter import SHARED
from novelwriter.constants import nwConst
from novelwriter.constants import nwConst, nwStyles
if TYPE_CHECKING:
from collections.abc import Iterable
@@ -147,7 +147,7 @@ class DocSearch:
if line.strip():
overwrite = 0
temp = line.rstrip("\n")
if line[0] == "#":
if line.startswith(nwStyles.H_MARKERS):
overwrite = 0 if self._textHeadings else len(temp)
elif line[0] == "@":
overwrite = 0 if self._textMeta else len(temp)

View File

@@ -21,7 +21,6 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
from __future__ import annotations
import json
import logging
from enum import Enum
@@ -474,9 +473,6 @@ class _LegacyStorage:
self._convertOldLogFile( # Changed in 2.1 Beta 1
path / "meta" / "sessionStats.log", path / "meta" / nwFiles.SESS_FILE
)
self._convertOldOptionsFile( # Changed in 2.1 Beta 1
path / "meta" / "guiOptions.json", path / "meta" / nwFiles.OPTS_FILE
)
# Delete removed files
remove = [
@@ -576,42 +572,6 @@ class _LegacyStorage:
return
def _convertOldOptionsFile(self, optsOld: Path, optsNew: Path) -> None:
"""Convert the old options state file format to new format."""
if optsNew.exists() or not optsOld.exists():
# If the new file already exists, we won't overwrite it
return
try:
data = {}
logger.info("Converting: %s", optsOld)
with open(optsOld, mode="r", encoding="utf-8") as fObj:
data = json.load(fObj)
if "GuiOutline" in data:
# Convert Outline Values
state = {}
outline = data.get("GuiOutline", {})
hidden = outline.get("columnHidden", {})
width = outline.get("columnWidth", {})
for key in outline.get("headerOrder", []):
state[key] = [hidden.get(key, False), width.get(key, 100)]
data["GuiOutline"]["columnState"] = state
with open(optsNew, mode="w", encoding="utf-8") as fObj:
json.dump({"novelWriter.guiOptions": data}, fObj, indent=2)
# If we're here, we remove the old file, and then we reload
# the converted file and save it again
optsOld.unlink()
self._project.options.loadSettings()
self._project.options.saveSettings()
except Exception:
logger.error("Failed to convert old options file")
logException()
return
class _LegacyDocuments:
"""Core: Legacy Document Format Converter."""

View File

@@ -0,0 +1,105 @@
"""
novelWriter - Edit Link Dialog
==============================
This file is a part of novelWriter
Copyright (C) 2026 Veronica Berglyd Olsen and novelWriter contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
""" # noqa
from __future__ import annotations
import logging
from PyQt6.QtWidgets import QDialogButtonBox, QFormLayout, QLineEdit, QVBoxLayout, QWidget
from novelwriter import SHARED
from novelwriter.enum import nwStandardButton
from novelwriter.extensions.modified import NDialog
from novelwriter.types import QtAccepted, QtRoleAccept, QtRoleReject
logger = logging.getLogger(__name__)
URL_ESCAPE = str.maketrans({" ": "%20", "(": "%28", ")": "%29"})
class GuiEditLink(NDialog):
"""GUI: Edit Markdown Link Dialog."""
def __init__(self, parent: QWidget, text: str = "", url: str = "") -> None:
super().__init__(parent=parent)
logger.debug("Create: GuiEditLink")
self.setObjectName("GuiEditLink")
self.setWindowTitle(self.tr("Link"))
self.edtText = QLineEdit(self)
self.edtText.setMinimumWidth(220)
self.edtText.setText(text)
self.edtUrl = QLineEdit(self)
self.edtUrl.setMinimumWidth(220)
self.edtUrl.setText(url)
(self.edtUrl if text else self.edtText).setFocus()
self.formBox = QFormLayout()
self.formBox.addRow(self.tr("Link Text"), self.edtText)
self.formBox.addRow(self.tr("URL"), self.edtUrl)
# Buttons
self.btnOk = SHARED.theme.getStandardButton(nwStandardButton.OK, self)
self.btnOk.clicked.connect(self.accept)
self.btnCancel = SHARED.theme.getStandardButton(nwStandardButton.CANCEL, self)
self.btnCancel.clicked.connect(self.reject)
self.btnBox = QDialogButtonBox(self)
self.btnBox.addButton(self.btnOk, QtRoleAccept)
self.btnBox.addButton(self.btnCancel, QtRoleReject)
# Assemble
self.outerBox = QVBoxLayout()
self.outerBox.setSpacing(12)
self.outerBox.addLayout(self.formBox, 1)
self.outerBox.addWidget(self.btnBox, 0)
self.setLayout(self.outerBox)
logger.debug("Ready: GuiEditLink")
def __del__(self) -> None: # pragma: no cover
"""Class destructor."""
logger.debug("Delete: GuiEditLink")
@property
def linkText(self) -> str:
return self.edtText.text().strip()
@property
def linkUrl(self) -> str:
"""Return the URL with characters the link syntax can't hold encoded."""
return self.edtUrl.text().strip().translate(URL_ESCAPE)
@classmethod
def getLink(cls, parent: QWidget, text: str = "", url: str = "") -> tuple[str, str, bool]:
"""Pop the dialog and return the result."""
dialog = cls(parent, text=text, url=url)
dialog.exec()
linkText = dialog.linkText
linkUrl = dialog.linkUrl
accepted = dialog.result() == QtAccepted
dialog.softDelete()
return linkText, linkUrl, accepted

View File

@@ -42,9 +42,9 @@ from PyQt6.QtWidgets import (
from novelwriter import CONFIG, SHARED
from novelwriter.common import compact, describeFont, processDialogSymbols, qtAddAction, uniqueCompact
from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT, DEF_ICONS, DEF_TREECOL
from novelwriter.constants import nwLabels, nwQuotes, nwUnicode, trConst
from novelwriter.constants import nwLabels, nwQuotes, nwUnicode, trConst, trUnit
from novelwriter.dialogs.quotes import GuiQuoteSelect
from novelwriter.enum import nwStandardButton, nwToolButton
from novelwriter.enum import nwStandardButton, nwStdUnit, nwToolButton
from novelwriter.extensions.configlayout import NColorLabel, NScrollableForm
from novelwriter.extensions.modified import NComboBox, NDialog, NDoubleSpinBox, NIconButton, NSpinBox
from novelwriter.extensions.pagedsidebar import NPagedSideBar
@@ -168,6 +168,10 @@ class GuiPreferences(NDialog):
self._guiFont = CONFIG.guiFont
self._textFont = CONFIG.textFont
trPx = trUnit(nwStdUnit.PIXELS)
trSec = trUnit(nwStdUnit.SECONDS)
trMin = trUnit(nwStdUnit.MINUTES)
# Label
self.sidebar.addLabel(self.tr("General"))
@@ -385,7 +389,7 @@ class GuiPreferences(NDialog):
self.tr("Save document interval"),
self.autoSaveDoc,
self.tr("How often the document is automatically saved."),
unit=self.tr("seconds"),
unit=trSec,
)
# Project Save Timer
@@ -396,7 +400,7 @@ class GuiPreferences(NDialog):
self.tr("Save project interval"),
self.autoSaveProj,
self.tr("How often the project is automatically saved."),
unit=self.tr("seconds"),
unit=trSec,
)
# Ask before exiting novelWriter
@@ -494,7 +498,7 @@ class GuiPreferences(NDialog):
self.tr("Editor inactive time before pausing timer"),
self.userIdleTime,
self.tr("User activity includes typing and changing the content."),
unit=self.tr("minutes"),
unit=trMin,
)
# Label
@@ -516,7 +520,7 @@ class GuiPreferences(NDialog):
self.tr('Maximum text width in "Normal Mode"'),
self.textWidth,
self.tr("Set to 0 to disable this feature."),
unit=self.tr("px"),
unit=trPx,
)
# Max Text Width in Focus Mode
@@ -527,7 +531,7 @@ class GuiPreferences(NDialog):
self.tr('Maximum text width in "Focus Mode"'),
self.focusWidth,
self.tr("The maximum width cannot be disabled."),
unit=self.tr("px"),
unit=trPx,
)
# Focus Mode Footer
@@ -556,7 +560,7 @@ class GuiPreferences(NDialog):
self.tr("Minimum text margin"),
self.textMargin,
self.tr("Applies to both document editor and viewer."),
unit=self.tr("px"),
unit=trPx,
)
# Tab Width
@@ -567,7 +571,7 @@ class GuiPreferences(NDialog):
self.tr("Tab width"),
self.tabWidth,
self.tr("The width of a tab key press in the editor and viewer."),
unit=self.tr("px"),
unit=trPx,
)
# Line Height
@@ -627,7 +631,7 @@ class GuiPreferences(NDialog):
self.tr("Cursor width"),
self.cursorWidth,
self.tr("The width of the text cursor of the editor."),
unit=self.tr("px"),
unit=trPx,
)
# Scale Headings

View File

@@ -49,9 +49,9 @@ from PyQt6.QtWidgets import (
from novelwriter import CONFIG, SHARED
from novelwriter.common import formatFileFilter, qtAddAction, qtLambda, simplified
from novelwriter.constants import nwLabels, trConst, trStats
from novelwriter.constants import nwLabels, trConst, trUnit
from novelwriter.core.status import CUSTOM_COL, ItemStatus, StatusEntry
from novelwriter.enum import nwItemClass, nwStandardButton, nwStatusShape, nwToolButton
from novelwriter.enum import nwItemClass, nwStandardButton, nwStatusShape, nwStdUnit, nwToolButton
from novelwriter.extensions.configlayout import NColorLabel, NFixedPage, NScrollableForm
from novelwriter.extensions.modified import NComboBox, NDialog, NIconButton, NSpinBox
from novelwriter.extensions.pagedsidebar import NPagedSideBar
@@ -425,7 +425,7 @@ class _GoalsPage(NScrollableForm):
@pyqtSlot(bool)
def _updateCountMode(self, checked: bool) -> None:
"""Update the unit label when the count mode is changed."""
unit = trStats("Characters" if checked else "Words")
unit = trUnit(nwStdUnit.CHARS if checked else nwStdUnit.WORDS)
self.setUnitText("targetCount", unit)
self.setUnitText("dailyGoal", unit)

View File

@@ -36,6 +36,7 @@ from PyQt6.QtCore import (
QRect,
Qt,
QTimer,
QUrl,
QVariant,
pyqtSignal,
pyqtSlot,
@@ -76,6 +77,7 @@ from novelwriter.common import (
from novelwriter.constants import nwConst, nwKeyWords, nwShortcode, nwStyles, nwUnicode
from novelwriter.core.document import ProjectDocument
from novelwriter.dialogs.editlabel import GuiEditLabel
from novelwriter.dialogs.editlink import GuiEditLink
from novelwriter.editor.completer import CommandCompleter
from novelwriter.editor.editordocument import GuiTextDocument
from novelwriter.editor.editsearch import GuiDocEditSearch
@@ -100,6 +102,7 @@ from novelwriter.extensions.eventfilters import WheelEventFilter
from novelwriter.formats.fromqdoc import FromQTextDocument
from novelwriter.text.autoreplace import TextAutoReplace
from novelwriter.text.formats import processHeading
from novelwriter.text.patterns import REGEX_PATTERNS
from novelwriter.tools.lipsum import GuiLipsum
from novelwriter.types import (
QAnimDeleteWhenStopped,
@@ -154,6 +157,13 @@ T_SelCache = dict[int, tuple[T_TextCheckList, T_Selections]]
MOVE_KEYS = (QtKeyLeft, QtKeyRight, QtKeyUp, QtKeyDown, QtKeyPageUp, QtKeyPageDown)
ENTER_KEYS = (QtKeyReturn, QtKeyEnter)
BLOCK_TEXT_ONLY = (
nwDocAction.ALIGN_L,
nwDocAction.ALIGN_C,
nwDocAction.ALIGN_R,
nwDocAction.INDENT_L,
nwDocAction.INDENT_R,
)
class _SelectAction(Enum):
@@ -1031,6 +1041,8 @@ class GuiDocEditor(QTextEdit):
self._toggleFormat(2, "~")
elif action == nwDocAction.MD_MARK and not noFormat:
self._toggleFormat(2, "=")
elif action == nwDocAction.MD_LINK and not noFormat:
self._formatLink()
elif action == nwDocAction.S_QUOTE:
self._wrapSelection(CONFIG.fmtSQuoteOpen, CONFIG.fmtSQuoteClose)
elif action == nwDocAction.D_QUOTE:
@@ -1053,6 +1065,10 @@ class GuiDocEditor(QTextEdit):
self._iterFormatBlocks(nwDocAction.BLOCK_IGN)
elif action == nwDocAction.BLOCK_TXT:
self._iterFormatBlocks(nwDocAction.BLOCK_TXT)
elif action == nwDocAction.BLOCK_LST_U:
self._iterFormatBlocks(nwDocAction.BLOCK_LST_U)
elif action == nwDocAction.BLOCK_LST_O:
self._iterFormatBlocks(nwDocAction.BLOCK_LST_O)
elif action == nwDocAction.BLOCK_TTL:
self._formatBlock(nwDocAction.BLOCK_TTL)
elif action == nwDocAction.BLOCK_UNN:
@@ -1065,16 +1081,8 @@ class GuiDocEditor(QTextEdit):
self._replaceQuotes('"', CONFIG.fmtDQuoteOpen, CONFIG.fmtDQuoteClose)
elif action == nwDocAction.RM_BREAKS:
self._removeInParLineBreaks()
elif action == nwDocAction.ALIGN_L and not noFormat:
self._formatBlock(nwDocAction.ALIGN_L)
elif action == nwDocAction.ALIGN_C and not noFormat:
self._formatBlock(nwDocAction.ALIGN_C)
elif action == nwDocAction.ALIGN_R and not noFormat:
self._formatBlock(nwDocAction.ALIGN_R)
elif action == nwDocAction.INDENT_L and not noFormat:
self._formatBlock(nwDocAction.INDENT_L)
elif action == nwDocAction.INDENT_R and not noFormat:
self._formatBlock(nwDocAction.INDENT_R)
elif action in BLOCK_TEXT_ONLY and not (noFormat and len(self._selectedBlocks(cursor)) < 2):
self._iterFormatBlocks(action)
elif action == nwDocAction.SC_ITALIC and not noFormat:
self._wrapSelection(nwShortcode.ITALIC_O, nwShortcode.ITALIC_C)
elif action == nwDocAction.SC_BOLD and not noFormat:
@@ -1452,6 +1460,8 @@ class GuiDocEditor(QTextEdit):
if document is not None:
text = FromQTextDocument(document).convertText().strip("\n")
elif urls := source.urls():
text = "\n".join(url.toString(QUrl.ComponentFormattingOption.FullyEncoded) for url in urls)
elif source.hasText():
text = source.text()
else:
@@ -1907,7 +1917,7 @@ class GuiDocEditor(QTextEdit):
and (item := self._nwItem)
and (parent := item.itemParent)
):
heading, title = processHeading(text.partition("\n")[0])
heading, title, _ = processHeading(text.partition("\n")[0])
label, dlgOk = GuiEditLabel.getLabel(
self,
text=title or f"{item.itemName} (1)",
@@ -2373,7 +2383,10 @@ class GuiDocEditor(QTextEdit):
"""Process the formatting of a single text block."""
# Remove existing format first, if any
if text.startswith("@"):
logger.error("Cannot apply block format to keyword/value line")
logger.debug("Cannot apply block format to keyword/value line")
return nwDocAction.NO_ACTION, "", 0
elif action in BLOCK_TEXT_ONLY and text.startswith(nwStyles.H_MARKERS):
logger.debug("Cannot apply text block format to heading")
return nwDocAction.NO_ACTION, "", 0
elif text.startswith("%~"):
temp = text[2:].lstrip()
@@ -2388,27 +2401,25 @@ class GuiDocEditor(QTextEdit):
elif text.startswith("# "):
temp = text[2:]
offset = 2
elif text.startswith("## "):
elif text.startswith(("## ", "#! ", ">> ")):
temp = text[3:]
offset = 3
elif text.startswith("### "):
elif text.startswith(("### ", "##! ")):
temp = text[4:]
offset = 4
elif text.startswith("#### "):
elif text.startswith(("#### ", "###! ")):
temp = text[5:]
offset = 5
elif text.startswith("#! "):
temp = text[3:]
offset = 3
elif text.startswith("##! "):
temp = text[4:]
offset = 4
elif text.startswith("###! "):
temp = text[5:]
offset = 5
elif text.startswith(">> "):
elif text.startswith("* ") and text[2:].strip("* "):
temp = text[2:]
offset = 2
if toggle and action == nwDocAction.BLOCK_LST_U:
action = nwDocAction.BLOCK_TXT
elif text.startswith("#. "):
temp = text[3:]
offset = 3
if toggle and action == nwDocAction.BLOCK_LST_O:
action = nwDocAction.BLOCK_TXT
elif (text.startswith("> ") and action != nwDocAction.INDENT_R) or text.startswith(">>"):
temp = text[2:]
offset = 2
@@ -2428,6 +2439,16 @@ class GuiDocEditor(QTextEdit):
temp = temp[:-1]
# Apply new format
if toggle and action in (nwDocAction.ALIGN_L, nwDocAction.ALIGN_C, nwDocAction.ALIGN_R):
isRight = text.startswith(">>")
isLeft = text.endswith("<<")
if (
(action == nwDocAction.ALIGN_L and isLeft and not isRight)
or (action == nwDocAction.ALIGN_C and isLeft and isRight)
or (action == nwDocAction.ALIGN_R and isRight and not isLeft)
):
action = nwDocAction.BLOCK_TXT
if action == nwDocAction.BLOCK_COM:
text = f"% {temp}"
offset -= 2
@@ -2455,6 +2476,12 @@ class GuiDocEditor(QTextEdit):
elif action == nwDocAction.BLOCK_HSC:
text = f"###! {temp}"
offset -= 5
elif action == nwDocAction.BLOCK_LST_U:
text = f"* {temp}"
offset -= 2
elif action == nwDocAction.BLOCK_LST_O:
text = f"#. {temp}"
offset -= 3
elif action == nwDocAction.ALIGN_L:
text = f"{temp} <<"
elif action == nwDocAction.ALIGN_C:
@@ -2501,6 +2528,51 @@ class GuiDocEditor(QTextEdit):
return True
def _formatLink(self) -> None:
"""Format a link under the cursor, or insert a new one. An
existing bare URL or Markdown link at the cursor is detected via
the block's TextBlockData, and used to pre-fill the edit dialog.
"""
cursor = self.textCursor()
block = cursor.block()
text = ""
url = ""
posS = posE = cursor.position()
if cursor.hasSelection():
posS = cursor.selectionStart()
posE = cursor.selectionEnd()
text = cursor.selectedText()
if isinstance(data := block.userData(), TextBlockData):
check = cursor.position() - block.position()
for start, end, mData, mType in data.metaData:
if mType in ("url", "link") and start <= check <= end:
posS = block.position() + start
posE = block.position() + end
url = mData
text = ""
if mType == "link":
linkCursor = QTextCursor(self._qDocument)
linkCursor.setPosition(posS)
linkCursor.setPosition(posE, QtKeepAnchor)
if m := REGEX_PATTERNS.markdownLink.match(linkCursor.selectedText()): # pragma: no branch
text, url = m.group(2), m.group(4)
break
newText, newUrl, dlgOk = GuiEditLink.getLink(self, text=text, url=url)
if not dlgOk or not newUrl:
return
result = f"[{newText}]({newUrl})" if newText else newUrl
cursor.setPosition(posS)
cursor.setPosition(posE, QtKeepAnchor)
cursor.beginEditBlock()
cursor.insertText(result)
cursor.endEditBlock()
self.setTextCursor(cursor)
def _iterFormatBlocks(self, action: nwDocAction) -> bool:
"""Iterate over all selected blocks and apply format. If no
selection is made, just forward the call to the single block
@@ -2525,6 +2597,11 @@ class GuiDocEditor(QTextEdit):
cursor.endEditBlock()
# Reselect the affected blocks so the action can be repeated
cursor.setPosition(blocks[0].position())
cursor.setPosition(blocks[-1].position() + blocks[-1].length() - 1, QtKeepAnchor)
self.setTextCursor(cursor)
return True
def _selectedBlocks(self, cursor: QTextCursor) -> list[QTextBlock]:
@@ -2938,25 +3015,36 @@ class GuiDocEditor(QTextEdit):
##
def _dispatchKeyPress(self, event: QKeyEvent) -> None:
"""Send a key event on to the base class for regular handling,
except for a plain Return/Enter press, which is handled
directly instead.
"""Send a key event to the base class, except plain Return.
Qt's own Return handling (QWidgetTextControlPrivate::
insertParagraphSeparator) resets the current block's format to
a bare default and swallows the keypress whenever the cursor
is on an empty block whose format isn't already default. That
heuristic exists so rich-text users can hit Enter twice to
escape a list/heading/quote, but every block here always
carries a non-default line height, so it fires on every
ordinary blank-line paragraph break and silently eats every
second Return. novelWriter never uses Qt's native list/heading
block formatting, so the heuristic serves no purpose here, and
can be bypassed entirely by inserting the new block directly.
Qt's Return handling swallows the keypress on empty blocks with
a non-default format, which all blocks have here due to line
height, so new blocks are inserted directly. List markers are
carried over to the new block.
"""
if event.key() in ENTER_KEYS and event.modifiers() == QtModNone:
cursor = self.textCursor()
cursor.insertBlock()
block = self._qDocument.findBlock(cursor.selectionStart())
text = block.text()
marker = ""
if text.startswith("* ") and text[2:].strip("* "):
marker = "* "
elif text.startswith("#. ") and text[3:].strip():
marker = "#. "
cursor.beginEditBlock()
if text.startswith(("* ", "#. ")) and text.rstrip() in ("*", "#.") and not cursor.hasSelection():
# Enter on an empty item clears the marker and ends the list (see #1460)
cursor.setPosition(block.position())
cursor.setPosition(block.position() + block.length() - 1, QtKeepAnchor)
cursor.removeSelectedText()
else:
inMarker = cursor.selectionStart() - block.position() < len(marker)
cursor.insertBlock()
if marker and not inMarker:
cursor.insertText(marker)
cursor.endEditBlock()
self.setTextCursor(cursor)
self.ensureCursorVisible(centre=False)
event.accept()

View File

@@ -76,6 +76,10 @@ class GuiDocToolBar(QWidget):
self.tbMarkMD.setToolTip(self.tr("Markdown Highlight"))
self.tbMarkMD.clicked.connect(qtWeakLambda(self._emitDocAction, nwDocAction.MD_MARK))
self.tbLinkMD = NFlatIconButton(self, iSz, "fmt_link:markdown")
self.tbLinkMD.setToolTip(self.tr("Markdown Link"))
self.tbLinkMD.clicked.connect(qtWeakLambda(self._emitDocAction, nwDocAction.MD_LINK))
self.tbBold = NFlatIconButton(self, iSz, "fmt_bold:shortcode")
self.tbBold.setToolTip(self.tr("Shortcode Bold"))
self.tbBold.clicked.connect(qtWeakLambda(self._emitDocAction, nwDocAction.SC_BOLD))
@@ -104,6 +108,26 @@ class GuiDocToolBar(QWidget):
self.tbSubscript.setToolTip(self.tr("Shortcode Subscript"))
self.tbSubscript.clicked.connect(qtWeakLambda(self._emitDocAction, nwDocAction.SC_SUB))
self.tbListU = NFlatIconButton(self, iSz, "fmt_list_u:action")
self.tbListU.setToolTip(self.tr("Format as Bullet List"))
self.tbListU.clicked.connect(qtWeakLambda(self._emitDocAction, nwDocAction.BLOCK_LST_U))
self.tbListO = NFlatIconButton(self, iSz, "fmt_list_o:action")
self.tbListO.setToolTip(self.tr("Format as Numbered List"))
self.tbListO.clicked.connect(qtWeakLambda(self._emitDocAction, nwDocAction.BLOCK_LST_O))
self.tbAlignLeft = NFlatIconButton(self, iSz, "fmt_align_left:action")
self.tbAlignLeft.setToolTip(self.tr("Align Left"))
self.tbAlignLeft.clicked.connect(qtWeakLambda(self._emitDocAction, nwDocAction.ALIGN_L))
self.tbAlignCenter = NFlatIconButton(self, iSz, "fmt_align_center:action")
self.tbAlignCenter.setToolTip(self.tr("Align Centre"))
self.tbAlignCenter.clicked.connect(qtWeakLambda(self._emitDocAction, nwDocAction.ALIGN_C))
self.tbAlignRight = NFlatIconButton(self, iSz, "fmt_align_right:action")
self.tbAlignRight.setToolTip(self.tr("Align Right"))
self.tbAlignRight.clicked.connect(qtWeakLambda(self._emitDocAction, nwDocAction.ALIGN_R))
# Assemble
# ========
@@ -112,7 +136,8 @@ class GuiDocToolBar(QWidget):
self.outerBox.addWidget(self.tbItalicMD)
self.outerBox.addWidget(self.tbStrikeMD)
self.outerBox.addWidget(self.tbMarkMD)
self.outerBox.addSpacing(4)
self.outerBox.addWidget(self.tbLinkMD)
self.outerBox.addSpacing(8)
self.outerBox.addWidget(self.tbBold)
self.outerBox.addWidget(self.tbItalic)
self.outerBox.addWidget(self.tbStrike)
@@ -120,6 +145,13 @@ class GuiDocToolBar(QWidget):
self.outerBox.addWidget(self.tbMark)
self.outerBox.addWidget(self.tbSuperscript)
self.outerBox.addWidget(self.tbSubscript)
self.outerBox.addSpacing(8)
self.outerBox.addWidget(self.tbListU)
self.outerBox.addWidget(self.tbListO)
self.outerBox.addSpacing(8)
self.outerBox.addWidget(self.tbAlignLeft)
self.outerBox.addWidget(self.tbAlignCenter)
self.outerBox.addWidget(self.tbAlignRight)
self.outerBox.setContentsMargins(4, 4, 4, 4)
self.outerBox.setSpacing(4)

View File

@@ -31,8 +31,8 @@ from PyQt6.QtWidgets import QHBoxLayout, QLabel, QWidget
from novelwriter import CONFIG, SHARED
from novelwriter.common import qtWeakLambda
from novelwriter.constants import nwLabels, nwStats, trStats
from novelwriter.enum import nwVimMode
from novelwriter.constants import nwLabels, nwStats, trLabel, trStats
from novelwriter.enum import nwStdLabel, nwVimMode
from novelwriter.extensions.modified import NFlatIconButton, NFlatIconTextButton
from novelwriter.types import QtAlignLeftTop, QtBlack
@@ -294,7 +294,7 @@ class GuiDocViewFooter(QWidget):
self.showComments.toggled.connect(self._doToggleComments)
# Show Synopsis
self.showSynopsis = NFlatIconTextButton(self, iSz, "toggle-bullet:action", self.tr("Synopsis"))
self.showSynopsis = NFlatIconTextButton(self, iSz, "toggle-bullet:action", trLabel(nwStdLabel.SYNOPSIS))
self.showSynopsis.setToolTip(self.tr("Show Synopsis Comments"))
self.showSynopsis.setCheckable(True)
self.showSynopsis.setChecked(CONFIG.viewSynopsis)

View File

@@ -198,6 +198,19 @@ class GuiDocHighlighter(QSyntaxHighlighter):
self._txtRules.append((rxRule, hlRule))
self._cmnRules.append((rxRule, hlRule))
# Markdown Link
rxRule = REGEX_PATTERNS.markdownLink
hlRule = {
1: self._hStyles["markup"],
2: self._hStyles["value"],
3: self._hStyles["markup"],
4: self._hStyles["link"],
5: self._hStyles["markup"],
}
self._minRules.append((rxRule, hlRule))
self._txtRules.append((rxRule, hlRule))
self._cmnRules.append((rxRule, hlRule))
# Shortcodes
rxRule = REGEX_PATTERNS.shortcodePlain
hlRule = {
@@ -404,6 +417,20 @@ class GuiDocHighlighter(QSyntaxHighlighter):
self.setFormat(0, pos, self._hStyles["modifier"])
self.setFormat(pos, length, self._hStyles["note"])
elif text.startswith("* ") and text[2:].strip("* "): # Unordered Lists
self.setCurrentBlockState(BLOCK_TEXT)
rules = self._cmnRules
self.setFormat(0, 2, self._hStyles["code"])
offset = 2
elif text.startswith("#. ") and text[3:].strip(): # Ordered Lists
self.setCurrentBlockState(BLOCK_TEXT)
rules = self._cmnRules
self.setFormat(0, 3, self._hStyles["code"])
offset = 3
elif text.startswith("["): # Special Command
self.setCurrentBlockState(BLOCK_TEXT)
rules = self._txtRules if self._isNovel else self._minRules

View File

@@ -29,6 +29,7 @@ from novelwriter import SHARED
from novelwriter.text.patterns import REGEX_PATTERNS
RX_URL = REGEX_PATTERNS.url
RX_LINK = REGEX_PATTERNS.markdownLink
RX_WORDS = REGEX_PATTERNS.wordSplit
RX_FMT_SC = REGEX_PATTERNS.shortcodePlain
RX_FMT_SV = REGEX_PATTERNS.shortcodeValue
@@ -112,8 +113,9 @@ class TextBlockData(QTextBlockUserData):
def checkData(self) -> tuple[str, str, int, list[int] | None]:
"""Return a snapshot of the text for external spell and format
checking. The spell text has shortcodes and URLs stripped, while
the format text is the raw, unmodified block text.
checking. The spell text has shortcodes, URLs and Markdown link
syntax stripped, while the format text is the raw, unmodified
block text.
"""
return self._text, self._rawText, self._offset, self._utf16Map
@@ -147,7 +149,18 @@ class TextBlockData(QTextBlockUserData):
pad = " " * (e - s)
text = f"{text[:s]}{pad}{text[e:]}"
if "http" in text:
if "](" in text:
# Strip Markdown links
for res in RX_LINK.finditer(text, offset):
if (s := res.start(0)) >= 0 and (e := res.end(0)) >= 0: # pragma: no branch
ts, te = res.start(2), res.end(2)
text = f"{text[:s]}{' ' * (ts - s)}{text[ts:te]}{' ' * (e - te)}{text[e:]}"
if utf16Map:
s = utf16Map[s]
e = utf16Map[e]
self._metaData.append((s, e, res.group(4), "link"))
if "://" in text:
# Strip URLs
for res in RX_URL.finditer(text, offset):
if (s := res.start(0)) >= 0 and (e := res.end(0)) >= 0: # pragma: no branch

View File

@@ -436,7 +436,7 @@ class GuiDocViewer(QTextBrowser):
self.loadDocumentTagRequest.emit(bits[2], nwDocMode.VIEW)
elif link.startswith("#"):
self.navigateTo(link)
elif link.startswith("http"):
elif link.startswith(("http", "file")):
QDesktopServices.openUrl(QUrl(url))
@pyqtSlot()

View File

@@ -42,7 +42,8 @@ from novelwriter import SHARED
from novelwriter.common import checkInt, qtAddAction
from novelwriter.constants import nwLabels, nwLists, nwStyles, trConst
from novelwriter.enum import nwChange, nwDocMode, nwItemClass
from novelwriter.extensions.modified import NFlatIconButton, NTabWidget
from novelwriter.extensions.modified import NFlatIconButton
from novelwriter.extensions.tabwidget import NTabWidget
from novelwriter.types import QtDecorationRole, QtHeaderFixed, QtHeaderToContents, QtUserRole
if TYPE_CHECKING:

View File

@@ -97,39 +97,42 @@ class nwDocAction(Enum):
MD_BOLD = 7
MD_STRIKE = 8
MD_MARK = 9
S_QUOTE = 10
D_QUOTE = 11
SEL_ALL = 12
SEL_PARA = 13
BLOCK_H1 = 14
BLOCK_H2 = 15
BLOCK_H3 = 16
BLOCK_H4 = 17
BLOCK_COM = 18
BLOCK_IGN = 19
BLOCK_TXT = 20
BLOCK_TTL = 21
BLOCK_UNN = 22
BLOCK_HSC = 23
REPL_SNG = 24
REPL_DBL = 25
RM_BREAKS = 26
ALIGN_L = 27
ALIGN_C = 28
ALIGN_R = 29
INDENT_L = 30
INDENT_R = 31
SC_ITALIC = 32
SC_BOLD = 33
SC_STRIKE = 34
SC_ULINE = 35
SC_MARK = 36
SC_SUP = 37
SC_SUB = 38
MOVE_TEXT = 39
ZOOM_IN = 40
ZOOM_OUT = 41
ZOOM_RESET = 42
MD_LINK = 10
S_QUOTE = 11
D_QUOTE = 12
SEL_ALL = 13
SEL_PARA = 14
BLOCK_H1 = 15
BLOCK_H2 = 16
BLOCK_H3 = 17
BLOCK_H4 = 18
BLOCK_COM = 19
BLOCK_IGN = 20
BLOCK_TXT = 21
BLOCK_LST_U = 22
BLOCK_LST_O = 23
BLOCK_TTL = 24
BLOCK_UNN = 25
BLOCK_HSC = 26
REPL_SNG = 27
REPL_DBL = 28
RM_BREAKS = 29
ALIGN_L = 30
ALIGN_C = 31
ALIGN_R = 32
INDENT_L = 33
INDENT_R = 34
SC_ITALIC = 35
SC_BOLD = 36
SC_STRIKE = 37
SC_ULINE = 38
SC_MARK = 39
SC_SUP = 40
SC_SUB = 41
MOVE_TEXT = 42
ZOOM_IN = 43
ZOOM_OUT = 44
ZOOM_RESET = 45
class nwDocInsert(Enum):
@@ -156,7 +159,7 @@ class nwView(Enum):
EDITOR = 0
PROJECT = 1
NOVEL = 2
OUTLINE = 3
STORY = 3
SEARCH = 4
@@ -165,7 +168,7 @@ class nwFocus(Enum):
TREE = 1
DOCUMENT = 2
OUTLINE = 3
STORY = 3
class nwTheme(Enum):
@@ -176,31 +179,6 @@ class nwTheme(Enum):
DARK = 2
class nwOutline(Enum):
"""Enum: Project Outline Columns."""
TITLE = 0
LEVEL = 1
LABEL = 2
LINE = 3
STATUS = 4
CCOUNT = 5
WCOUNT = 6
PCOUNT = 7
POV = 8
FOCUS = 9
CHAR = 10
PLOT = 11
TIME = 12
WORLD = 13
OBJECT = 14
ENTITY = 15
CUSTOM = 16
STORY = 17
MENTION = 18
SYNOP = 19
class nwNovelExtra(Enum):
"""Enum: Novel View Extra Columns."""
@@ -303,3 +281,23 @@ class nwState(Enum):
NORMAL = 0
INACTIVE = 1
ERROR = 2
class nwStdLabel(Enum):
"""Enum: Standard Labels."""
NOTE = 0
STORY = 1
STORY_STRUCTURE = 2
SYNOPSIS = 3
class nwStdUnit(Enum):
"""Enum: Standard Units."""
CHARS = 0
WORDS = 1
LINES = 2
PIXELS = 3
SECONDS = 4
MINUTES = 5

View File

@@ -91,6 +91,7 @@ class NScrollableForm(QScrollArea):
self._indent = 12
self._sections: dict[int, QLabel] = {}
self._editableLabel: dict[str, QLabel] = {}
self._editableHelp: dict[str, NColorLabel] = {}
self._editableUnit: dict[str, QLabel] = {}
self._index: dict[str, QWidget] = {}
@@ -125,6 +126,11 @@ class NScrollableForm(QScrollArea):
self._helpCol = color
self._fontScale = scale
def setLabelText(self, key: str, text: str) -> None:
"""Set the text for the label."""
if qLabel := self._editableLabel.get(key):
qLabel.setText(text)
def setHelpText(self, key: str, text: str) -> None:
"""Set the text for the help label."""
if qHelp := self._editableHelp.get(key):
@@ -195,11 +201,13 @@ class NScrollableForm(QScrollArea):
qWidget.setLayout(wBox)
else:
qWidget = widget
qWidget.setAccessibleName(label)
qLabel = QLabel(label or "", self)
qLabel.setIndent(self._indent)
qLabel.setBuddy(qWidget)
qWidget.setAccessibleName(label)
if editable:
self._editableLabel[editable] = qLabel
if helpText:
qHelp = NColorLabel(
@@ -259,6 +267,7 @@ class NColorLabel(QLabel):
"""
HELP_SCALE = DEFAULT_SCALE
NORMAL_SCALE = 1.0
HEADER_SCALE = 1.25
_state = None

View File

@@ -26,7 +26,7 @@ import logging
from typing import TYPE_CHECKING
from PyQt6.QtCore import QEvent, QModelIndex, QSize, Qt, pyqtSignal, pyqtSlot
from PyQt6.QtGui import QPainter, QPaintEvent, QPalette
from PyQt6.QtGui import QKeySequence, QPainter, QPaintEvent, QPalette
from PyQt6.QtWidgets import (
QApplication,
QComboBox,
@@ -40,8 +40,6 @@ from PyQt6.QtWidgets import (
QSplitter,
QSplitterHandle,
QStyleOptionToolButton,
QTabBar,
QTabWidget,
QToolButton,
QTreeView,
QWidget,
@@ -67,7 +65,7 @@ from novelwriter.types import (
if TYPE_CHECKING:
from enum import Enum
from PyQt6.QtGui import QFont, QMouseEvent, QWheelEvent
from PyQt6.QtGui import QFont, QKeyEvent, QMouseEvent, QWheelEvent
from novelwriter.guimain import GuiMain
@@ -101,6 +99,13 @@ class NToolDialog(NDialog):
if CONFIG.osDarwin: # pragma: no cover
self.setWindowFlag(Qt.WindowType.Tool)
def keyPressEvent(self, event: QKeyEvent) -> None:
"""Close on escape via closeEvent, which QDialog.reject bypasses."""
if event.matches(QKeySequence.StandardKey.Cancel):
self.close()
else:
super().keyPressEvent(event)
def activateDialog(self) -> None:
"""Activate dialog on various operating systems."""
self.show()
@@ -235,6 +240,10 @@ class NComboBox(QComboBox):
# platforms and allows for scrolling of long lists of items
self.setStyleSheet("QComboBox {combobox-popup: 0;}")
def setMinCharsWidth(self, count: int) -> None:
"""Set a fixed with for a certain amount of characters."""
self.setMinimumWidth(count * SHARED.theme.textNWidth + 25)
class NSpinBox(QSpinBox):
"""Custom: Modified QSpinBox.
@@ -392,7 +401,7 @@ class NFlatIconButton(QToolButton):
"""Set an icon from the current theme."""
self._icon = icon
if self._iconToggle:
self.setIcon(SHARED.theme.getToggleIcon(icon, self.iconSize().width(), self.iconSize().height()))
self.setIcon(SHARED.theme.getToggleIcon(icon))
else:
self.setIcon(SHARED.theme.getIcon(icon))
@@ -450,7 +459,7 @@ class NFlatIconTextButton(QToolButton):
"""Set an icon from the current theme."""
self._icon = icon
if self._iconToggle:
self.setIcon(SHARED.theme.getToggleIcon(icon, self.iconSize().width(), self.iconSize().height()))
self.setIcon(SHARED.theme.getToggleIcon(icon))
else:
self.setIcon(SHARED.theme.getIcon(icon))
@@ -484,67 +493,6 @@ class NFlatIconTextButton(QToolButton):
painter.drawText(textRect, QtAlignLeftMiddle, text)
class NTabWidget(QTabWidget):
"""Custom: Modified QTabWidget.
A tab widget that highlights the currently selected tab's label
using the app theme.
"""
def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent)
self.setTabBar(NTabBar(self))
self.setDocumentMode(True)
def refreshTheme(self) -> None:
"""Refresh the tab colours for theme updates."""
if tabBar := self.tabBar(): # pragma: no branch
tabBar.update()
class NTabBar(QTabBar):
"""Custom: Modified QTabBar.
A tab bar that highlights the currently selected tab's label
using the app theme.
"""
def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent)
self.setDrawBase(False)
def tabSizeHint(self, index: int) -> QSize:
"""Reduce the tab height by shrinking the margin above and below the text."""
size = super().tabSizeHint(index)
return QSize(size.width(), size.height() - 4)
def paintEvent(self, event: QPaintEvent | None) -> None:
"""Highlight the currently selected tab with the theme highlight colour."""
painter = QPainter(self)
palette = self.palette()
selected = self.currentIndex()
for i in range(self.count()):
if not self.isTabVisible(i):
continue
rect = self.tabRect(i)
rR = rect.right()
rL = rect.left()
rT = rect.top()
if rR < 0 or rL > self.width():
continue
if i == selected:
painter.fillRect(rect, SHARED.theme.activeBase)
painter.setPen(SHARED.theme.accentText)
painter.drawLine(rL, rT, rR, rT)
else:
painter.setPen(palette.text().color())
painter.drawText(rect, QtAlignCenter, self.tabText(i))
class NClickableLabel(QLabel):
"""Custom: Clickable QLabel."""

View File

@@ -0,0 +1,172 @@
"""
novelWriter - Custom Widget: Tab Widget
=======================================
This file is a part of novelWriter
Copyright (C) 2026 Veronica Berglyd Olsen and novelWriter contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
""" # noqa
from __future__ import annotations
from typing import TYPE_CHECKING
from PyQt6.QtCore import QSize
from PyQt6.QtGui import QPainter, QPaintEvent
from PyQt6.QtWidgets import QApplication, QTabBar, QTabWidget, QWidget
from novelwriter import SHARED
from novelwriter.types import QtAlignCenter, QtMouseLeft
if TYPE_CHECKING:
from PyQt6.QtCore import QRect
from PyQt6.QtGui import QColor, QMouseEvent
class NTabWidget(QTabWidget):
"""Custom: Modified QTabWidget.
A tab widget that highlights the currently selected tab's label
using the app theme.
"""
def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent)
self.setTabBar(NTabBar(self))
self.setDocumentMode(True)
def refreshTheme(self) -> None:
"""Refresh the tab colours for theme updates."""
if (tabBar := self.tabBar()) is not None: # pragma: no branch
tabBar.update()
class NTabBar(QTabBar):
"""Custom: Modified QTabBar.
A tab bar that highlights the currently selected tab's label
using the app theme.
"""
__slots__ = ("_dragDist", "_dragGrab", "_dragIndex", "_dragStart", "_dragWidth", "_dragX")
def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent)
self.setDrawBase(False)
# Drag State
self._dragIndex = -1
self._dragStart = 0
self._dragGrab = 0
self._dragWidth = 0
self._dragDist = 0
self._dragX = -1
def tabSizeHint(self, index: int) -> QSize:
"""Reduce the tab height by shrinking the margin above and below the text."""
size = super().tabSizeHint(index)
return QSize(size.width(), size.height() - 4)
def mousePressEvent(self, event: QMouseEvent) -> None:
"""Record the start of a potential tab drag."""
super().mousePressEvent(event)
if self.isMovable() and event.button() == QtMouseLeft:
pos = event.position().toPoint()
index = self.tabAt(pos)
rect = self.tabRect(index)
self._dragIndex = index
self._dragStart = pos.x()
self._dragGrab = pos.x() - rect.left()
self._dragWidth = rect.width()
self._dragDist = QApplication.startDragDistance()
self._dragX = -1
def mouseMoveEvent(self, event: QMouseEvent) -> None:
"""Drag the pressed tab, replacing Qt's drag, which our custom
painting cannot follow.
"""
if self._dragIndex < 0 or not self.isMovable():
super().mouseMoveEvent(event)
return
if not (event.buttons() & QtMouseLeft):
self._endDrag()
return
x = event.position().toPoint().x()
if x == self._dragX or (self._dragX < 0 and abs(x - self._dragStart) < self._dragDist):
return
self._dragX = x
left = x - self._dragGrab
index = self._dragIndex
if left > self.tabRect(index).left():
right = left + self._dragWidth
last = self.count() - 1
while index < last and right > self.tabRect(index + 1).center().x():
self.moveTab(index, index + 1)
index += 1
else:
while index > 0 and left < self.tabRect(index - 1).center().x():
self.moveTab(index, index - 1)
index -= 1
self._dragIndex = index
self.update()
def mouseReleaseEvent(self, event: QMouseEvent) -> None:
"""End a tab drag."""
self._endDrag()
super().mouseReleaseEvent(event)
def paintEvent(self, event: QPaintEvent | None) -> None:
"""Highlight the currently selected tab with the theme highlight colour."""
painter = QPainter(self)
palette = self.palette()
textCol = palette.text().color()
selected = self.currentIndex()
count = self.count()
width = self.width()
drag = self._dragIndex if self._dragX >= 0 and 0 <= self._dragIndex < count else -1
for i in range(count):
if i == drag or not self.isTabVisible(i):
continue
rect = self.tabRect(i)
if rect.right() >= 0 and rect.left() <= width:
self._drawTab(painter, rect, i, i == selected, textCol)
# The dragged tab is drawn last at the cursor, leaving its slot empty
if drag >= 0:
rect = self.tabRect(drag)
rect.moveLeft(max(0, min(self._dragX - self._dragGrab, width - rect.width())))
if drag != selected:
painter.fillRect(rect, palette.window())
self._drawTab(painter, rect, drag, drag == selected, textCol)
def _drawTab(self, painter: QPainter, rect: QRect, index: int, selected: bool, textCol: QColor) -> None:
"""Draw a single tab."""
if selected:
painter.fillRect(rect, SHARED.theme.activeBase)
painter.setPen(SHARED.theme.accentText)
painter.drawLine(rect.left(), rect.top(), rect.right(), rect.top())
else:
painter.setPen(textCol)
painter.drawText(rect, QtAlignCenter, self.tabText(index))
def _endDrag(self) -> None:
"""Reset the drag state."""
if self._dragX >= 0:
self.update()
self._dragIndex = -1
self._dragX = -1

View File

@@ -34,6 +34,7 @@ ESCAPES = {
r"\_": "_",
r"\[": "[",
r"\]": "]",
r"\#": "#",
r"\ ": "",
}
RX_ESC = re.compile("|".join([re.escape(k) for k in ESCAPES]), flags=re.DOTALL)
@@ -117,13 +118,15 @@ class BlockTyp(IntEnum):
HEAD3 = 6 # Heading 3 or Section
HEAD4 = 7 # Heading 4
TEXT = 8 # Text line
SEP = 9 # Scene separator
HRULE = 10 # Horizontal rule
SKIP = 11 # Paragraph break
SUMMARY = 12 # Synopsis/short comment
NOTE = 13 # Note
COMMENT = 14 # Comment
KEYWORD = 15 # Tag/reference keywords
LIST_U = 9 # List item
LIST_O = 10 # Ordered list item
SEP = 11 # Scene separator
HRULE = 12 # Horizontal rule
SKIP = 13 # Paragraph break
SUMMARY = 14 # Synopsis/short comment
NOTE = 15 # Note
COMMENT = 16 # Comment
KEYWORD = 17 # Tag/reference keywords
class BlockFmt(Flag):
@@ -144,6 +147,8 @@ class BlockFmt(Flag):
IND_L = 0x0100 # Left indentation
IND_R = 0x0200 # Right indentation
IND_T = 0x0400 # Text indentation
LIST_S = 0x0800 # List start
LIST_E = 0x1000 # List end
# Masks
ALIGNED = LEFT | RIGHT | CENTRE | JUSTIFY

View File

@@ -33,9 +33,9 @@ from PyQt6.QtCore import QMargins, QSize
from novelwriter import __version__
from novelwriter.common import firstFloat, xmlElement, xmlSubElem
from novelwriter.constants import nwHeadFmt, nwStyles
from novelwriter.constants import nwHeadFmt, nwStyles, nwUnicode
from novelwriter.formats.shared import BlockFmt, BlockTyp, T_Formats, TextFmt, stripEscape
from novelwriter.formats.tokenizer import COMMENT_BLOCKS, Tokenizer
from novelwriter.formats.tokenizer import COMMENT_BLOCKS, LIST_BLOCKS, Tokenizer
from novelwriter.types import QtBlack, QtHexRgb
if TYPE_CHECKING:
@@ -137,6 +137,7 @@ S_SEP = "Separator"
S_META = "MetaText"
S_HEAD = "Header"
S_FNOTE = "FootnoteText"
S_LIST = "ListParagraph"
class DocXXmlRel(NamedTuple):
@@ -197,6 +198,9 @@ class ToDocX(Tokenizer):
"_fontSize",
"_headerFormat",
"_mHorLine",
"_mirrorMargins",
"_numLists",
"_pageGutter",
"_pageMargins",
"_pageOffset",
"_pageSize",
@@ -219,7 +223,10 @@ class ToDocX(Tokenizer):
self._fontSize = 12.0
self._pageSize = QSize(_mmToSz(210.0), _mmToSz(297.0))
self._pageMargins = QMargins(_mmToSz(20.0), _mmToSz(20.0), _mmToSz(20.0), _mmToSz(20.0))
self._pageGutter = 0
self._mirrorMargins = False
self._mHorLine = _mmToSz(42.5 / 20.0)
self._numLists: list[bool] = []
# Data Variables
self._pars: list[DocXParagraph] = []
@@ -233,11 +240,23 @@ class ToDocX(Tokenizer):
# Setters
##
def setPageLayout(self, width: float, height: float, top: float, bottom: float, left: float, right: float) -> None:
def setPageLayout(
self,
width: float,
height: float,
top: float,
bottom: float,
left: float,
right: float,
gutter: float,
mirrored: bool,
) -> None:
"""Set the document page size and margins in millimetres."""
self._pageSize = QSize(_mmToSz(width), _mmToSz(height))
self._pageMargins = QMargins(_mmToSz(left), _mmToSz(top), _mmToSz(right), _mmToSz(bottom))
self._mHorLine = _mmToSz((width - left - right) / 80.0)
self._pageGutter = _mmToSz(gutter)
self._mHorLine = _mmToSz((width - left - right - gutter) / 80.0)
self._mirrorMargins = mirrored
def setHeaderFormat(self, value: str, offset: int) -> None:
"""Set the document header format."""
@@ -310,6 +329,12 @@ class ToDocX(Tokenizer):
elif tType == BlockTyp.HEAD4:
self._processFragments(par, S_HEAD4, tText, tFormat)
elif tType in LIST_BLOCKS:
if tStyle & BlockFmt.LIST_S:
self._numLists.append(tType == BlockTyp.LIST_O)
par.setNumbering(len(self._numLists), 0)
self._processFragments(par, S_LIST, tText, tFormat)
elif tType == BlockTyp.SEP:
self._processFragments(par, S_SEP, tText)
@@ -345,6 +370,8 @@ class ToDocX(Tokenizer):
self._settingsXml()
if self._usedNotes:
self._footnotesXml()
if self._numLists:
self._numberingXml()
def saveDocument(self, path: Path) -> None:
"""Save the data to a .docx file."""
@@ -646,6 +673,19 @@ class ToDocX(Tokenizer):
)
)
# Add List Paragraph
styles.append(
DocXParStyle(
name="List Paragraph",
styleId=S_LIST,
size=fSz,
basedOn=S_NORM,
before=fSz * self._marginText[0],
after=fSz * self._marginText[1],
line=fSz * self._lineHeight,
)
)
# Add Separator
styles.append(
DocXParStyle(
@@ -1024,7 +1064,7 @@ class ToDocX(Tokenizer):
_wTag("left"): str(self._pageMargins.left()),
_wTag("header"): str(self._pageMargins.top() - int(35.0 * self._fontSize)),
_wTag("footer"): "0",
_wTag("gutter"): "0",
_wTag("gutter"): str(self._pageGutter),
},
)
xmlSubElem(
@@ -1062,6 +1102,51 @@ class ToDocX(Tokenizer):
return rId
def _numberingXml(self) -> str:
"""Populate numbering.xml."""
rId = self._nextRelId()
xRoot = xmlElement(_wTag("numbering"))
self._rels["numbering.xml"] = DocXXmlRel(
rId=rId,
relType=f"{RELS_BASE}/numbering",
)
self._files["numbering.xml"] = DocXXmlFile(
xml=xRoot,
path="word",
contentType=f"{WORD_BASE}.numbering+xml",
)
fSz = 20.0 * self._fontSize
for aId, (numFmt, hang) in enumerate((("bullet", 1.0), ("decimal", 1.5))):
xAbst = xmlSubElem(xRoot, _wTag("abstractNum"), attrib={_wTag("abstractNumId"): str(aId)})
xmlSubElem(xAbst, _wTag("multiLevelType"), attrib={W_VAL: "hybridMultilevel"})
for level in range(9):
lvlText = nwUnicode.U_BULL if aId == 0 else f"%{level + 1}."
xLvl = xmlSubElem(xAbst, _wTag("lvl"), attrib={_wTag("ilvl"): str(level)})
xmlSubElem(xLvl, _wTag("start"), attrib={W_VAL: "1"})
xmlSubElem(xLvl, _wTag("numFmt"), attrib={W_VAL: numFmt})
xmlSubElem(xLvl, _wTag("lvlText"), attrib={W_VAL: lvlText})
xmlSubElem(xLvl, _wTag("lvlJc"), attrib={W_VAL: "left"})
pPr = xmlSubElem(xLvl, _wTag("pPr"))
xmlSubElem(
pPr,
_wTag("ind"),
attrib={
_wTag("left"): str(int(2.0 * fSz * (level + 1))),
_wTag("hanging"): str(int(hang * fSz)),
},
)
# Word continues numbering across instances unless restarted
for numId, ordered in enumerate(self._numLists, start=1):
xNum = xmlSubElem(xRoot, _wTag("num"), attrib={_wTag("numId"): str(numId)})
xmlSubElem(xNum, _wTag("abstractNumId"), attrib={W_VAL: "1" if ordered else "0"})
if ordered:
xOvr = xmlSubElem(xNum, _wTag("lvlOverride"), attrib={_wTag("ilvl"): "0"})
xmlSubElem(xOvr, _wTag("startOverride"), attrib={W_VAL: "1"})
return rId
def _fontTableXml(self) -> str:
"""Populate fontTable.xml."""
rId = self._nextRelId()
@@ -1107,6 +1192,9 @@ class ToDocX(Tokenizer):
contentType=f"{WORD_BASE}.settings+xml",
)
if self._mirrorMargins:
xSet = xmlSubElem(xRoot, _wTag("mirrorMargins"))
xSet = xmlSubElem(xRoot, _wTag("footnotePr"))
xmlSubElem(xSet, _wTag("numFmt"), attrib={W_VAL: "decimal"})
@@ -1153,6 +1241,7 @@ class DocXParagraph:
"_footnoteRef",
"_indentFirst",
"_leftMargin",
"_numbering",
"_rightMargin",
"_style",
"_textAlign",
@@ -1171,6 +1260,7 @@ class DocXParagraph:
self._breakBefore = False
self._breakAfter = False
self._footnoteRef = False
self._numbering: tuple[int, int] | None = None
self._borders: dict[str, DocXBorder] = {}
##
@@ -1227,6 +1317,10 @@ class DocXParagraph:
"""Set page break after flag."""
self._breakAfter = state
def setNumbering(self, numId: int, level: int) -> None:
"""Set list numbering instance and level."""
self._numbering = (numId, level)
def setIsFootnote(self, state: bool) -> None:
"""Set is footnote flag."""
self._footnoteRef = state
@@ -1256,6 +1350,10 @@ class DocXParagraph:
# Paragraph
pPr = xmlSubElem(xP, _wTag("pPr"))
xmlSubElem(pPr, _wTag("pStyle"), attrib={W_VAL: style.styleId})
if numbering := self._numbering:
xNum = xmlSubElem(pPr, _wTag("numPr"))
xmlSubElem(xNum, _wTag("ilvl"), attrib={W_VAL: str(numbering[1])})
xmlSubElem(xNum, _wTag("numId"), attrib={W_VAL: str(numbering[0])})
if self._topMargin is not None or self._bottomMargin is not None:
xmlSubElem(
pPr,

View File

@@ -31,9 +31,9 @@ from zipfile import ZIP_DEFLATED, ZipFile
from novelwriter.common import xmlElement, xmlIndent, xmlSubElem
from novelwriter.constants import nwUnicode
from novelwriter.formats.shared import BlockTyp
from novelwriter.formats.shared import BlockFmt, BlockTyp
from novelwriter.formats.tohtml import ToHtml
from novelwriter.formats.tokenizer import COMMENT_BLOCKS
from novelwriter.formats.tokenizer import COMMENT_BLOCKS, LIST_BLOCKS
if TYPE_CHECKING:
from pathlib import Path
@@ -119,10 +119,16 @@ class ToEPub(ToHtml):
tText, tFmt = self._processHtmlEntities(tText, tFmt)
hStyle = self._genInlineStyles(tStyle)
if tStyle & BlockFmt.LIST_S:
self._section.text.append("<ol>" if tType == BlockTyp.LIST_O else "<ul>")
# Process Text Type
if tType == BlockTyp.TEXT:
self._section.text.append(f"<p{hStyle}>{self._formatText(tText, tFmt)}</p>")
elif tType in LIST_BLOCKS:
self._section.text.append(f"<li{hStyle}>{self._formatText(tText, tFmt)}</li>")
elif tType == BlockTyp.TITLE and self._isFront:
tHead = tText.replace("\n", self._brTag)
self._section.text.append(f"<h1{hStyle}>{tHead}</h1>")
@@ -176,6 +182,9 @@ class ToEPub(ToHtml):
else: # pragma: no cover
pass
if tStyle & BlockFmt.LIST_E:
self._section.text.append("</ol>" if tType == BlockTyp.LIST_O else "</ul>")
def closeDocument(self) -> None:
"""Run close document tasks."""
# Generate section names and IDs, and prune empty ones

View File

@@ -30,7 +30,7 @@ from typing import TYPE_CHECKING
from novelwriter.common import formatTimeStamp
from novelwriter.constants import nwHtmlUnicode
from novelwriter.formats.shared import BlockFmt, BlockTyp, T_Formats, TextFmt, stripEscape
from novelwriter.formats.tokenizer import COMMENT_BLOCKS, Tokenizer
from novelwriter.formats.tokenizer import COMMENT_BLOCKS, LIST_BLOCKS, Tokenizer
from novelwriter.types import FONT_STYLE, FONT_WEIGHTS, QtHexRgb
if TYPE_CHECKING:
@@ -131,6 +131,9 @@ class ToHtml(Tokenizer):
tText, tFmt = self._processHtmlEntities(tText, tFmt)
hStyle = self._genInlineStyles(tStyle)
if tStyle & BlockFmt.LIST_S:
lines.append("<ol>\n" if tType == BlockTyp.LIST_O else "<ul>\n")
aNm = ""
if self._linkHeadings and tMeta:
aNm = f"<a name='{tMeta}'></a>"
@@ -139,6 +142,9 @@ class ToHtml(Tokenizer):
if tType == BlockTyp.TEXT:
lines.append(f"<p{hStyle}>{self._formatText(tText, tFmt)}</p>\n")
elif tType in LIST_BLOCKS:
lines.append(f"<li{hStyle}>{self._formatText(tText, tFmt)}</li>\n")
elif tType in (BlockTyp.TITLE, BlockTyp.PART):
tHead = tText.replace("\n", self._brTag)
lines.append(f"<p class='title'{hStyle}>{aNm}{tHead}</p>\n")
@@ -178,6 +184,9 @@ class ToHtml(Tokenizer):
else: # pragma: no cover
pass
if tStyle & BlockFmt.LIST_E:
lines.append("</ol>\n" if tType == BlockTyp.LIST_O else "</ul>\n")
self._pages.append("".join(lines))
def closeDocument(self) -> None:
@@ -350,6 +359,14 @@ class ToHtml(Tokenizer):
"margin-top": f"{mtH4:.2f}em",
"margin-bottom": f"{mbH4:.2f}em",
},
"ul, ol": {
"margin-top": f"{mtTT:.2f}em",
"margin-bottom": f"{mbTT:.2f}em",
},
"li": {
"text-align": self._defaultAlign,
"line-height": f"{lHeight}%",
},
".title": {
"font-size": f"{fSz0:.2f}em",
"font-weight": f"{hW}",

View File

@@ -85,6 +85,7 @@ HEADING_BLOCKS = [
COMMENT_BLOCKS = (BlockTyp.COMMENT, BlockTyp.SUMMARY, BlockTyp.NOTE)
META_BLOCKS = (BlockTyp.COMMENT, BlockTyp.SUMMARY, BlockTyp.NOTE, BlockTyp.KEYWORD)
SKIP_INDENT = [*HEADING_BLOCKS, BlockTyp.SEP, BlockTyp.SKIP, BlockTyp.HRULE]
LIST_BLOCKS = (BlockTyp.LIST_U, BlockTyp.LIST_O)
B_EMPTY: T_Block = (BlockTyp.EMPTY, "", "", [], BlockFmt.NONE)
@@ -872,7 +873,19 @@ class Tokenizer(ABC):
alnRight = False
indLeft = False
indRight = False
if bLine.startswith(">>"):
tType = BlockTyp.TEXT
hDialog = isNovel
if bLine.startswith("* ") and (temp := bLine[2:].lstrip(" ")).strip("* "):
tType = BlockTyp.LIST_U
bLine = temp
hDialog = False
elif bLine.startswith("#. ") and (temp := bLine[3:].lstrip(" ")):
tType = BlockTyp.LIST_O
bLine = temp
hDialog = False
elif bLine.startswith(">>"):
alnRight = True
bLine = bLine[2:].lstrip(" ")
elif bLine.startswith(">"):
@@ -899,8 +912,8 @@ class Tokenizer(ABC):
tStyle |= BlockFmt.IND_R
# Process formats
tLine, tFmt = self._extractFormats(bLine, hDialog=isNovel)
tBlocks.append((BlockTyp.TEXT, "", tLine, tFmt, tStyle))
tLine, tFmt = self._extractFormats(bLine, hDialog=hDialog)
tBlocks.append((tType, "", tLine, tFmt, tStyle))
# If we have content, turn off the first page flag
if self._isFirst and len(tBlocks) > 1:
@@ -953,7 +966,7 @@ class Tokenizer(ABC):
addEmptyLine = False
sBlocks.append((cBlock[0], cBlock[1], cBlock[2], cBlock[3], aStyle))
elif cBlock[0] == BlockTyp.TEXT:
elif cBlock[0] in (BlockTyp.TEXT, BlockTyp.LIST_U, BlockTyp.LIST_O):
# Combine lines from the same paragraph
pLines.append(cBlock)
addEmptyLine = False
@@ -987,19 +1000,33 @@ class Tokenizer(ABC):
else: # pragma: no cover
pass
pType = pLines[0][0]
if pType in LIST_BLOCKS:
cStyle &= ~(BlockFmt.ALIGNED | BlockFmt.IND_L | BlockFmt.IND_R) # Strip align and indent
if not (sBlocks and sBlocks[-1][0] == pType and not sBlocks[-1][4] & BlockFmt.LIST_E):
cStyle |= BlockFmt.LIST_S
else:
cStyle |= BlockFmt.Z_TOP
if nBlock[0] != pType:
cStyle |= BlockFmt.LIST_E
else:
cStyle |= BlockFmt.Z_BTM
if nLines: # pragma: no branch
isAligned = cStyle & BlockFmt.ALIGNED
if firstIndent and not (self._noIndent or isAligned):
# If paragraph indentation is enabled, not temporarily
# turned off, and the block is not aligned, we add the
# text indentation flag
if firstIndent and pType not in LIST_BLOCKS and not (self._noIndent or isAligned):
# If paragraph indentation is enabled, not a list,
# not temporarily turned off, and the block is not
# aligned, we add the text indentation flag
cStyle |= BlockFmt.IND_T
if doJustify and not isAligned:
cStyle |= BlockFmt.JUSTIFY
sBlocks.append((BlockTyp.TEXT, pLines[0][1], pTxt, tFmt, cStyle))
addEmptyLine = lineMargins
sBlocks.append((pType, pLines[0][1], pTxt, tFmt, cStyle))
addEmptyLine = lineMargins and (pType not in LIST_BLOCKS or bool(cStyle & BlockFmt.LIST_E))
# Reset buffer and make sure text indent is on for next pass
pLines = []
@@ -1072,7 +1099,7 @@ class Tokenizer(ABC):
nChars = len(tText)
nWChars = len("".join(tWords))
if tType == BlockTyp.TEXT:
if tType in (BlockTyp.TEXT, BlockTyp.LIST_U, BlockTyp.LIST_O):
tPWords = tText.split()
nPWords = len(tPWords)
nPChars = len(tText)
@@ -1240,10 +1267,20 @@ class Tokenizer(ABC):
for res in regEx.finditer(text):
temp.extend((res.start(n), res.end(n), fmt, "") for n, fmt in enumerate(fmts) if fmt > 0)
# Match URLs
# Match Markdown Links
links: list[tuple[int, int]] = []
for res in REGEX_PATTERNS.markdownLink.finditer(text):
links.append((res.start(0), res.end(0)))
temp.append((res.start(1), res.end(1), TextFmt.STRIP, ""))
temp.append((res.start(2), 0, TextFmt.HRF_B, res.group(4)))
temp.append((res.end(2), 0, TextFmt.HRF_E, ""))
temp.append((res.start(3), res.end(5), TextFmt.STRIP, ""))
# Match Bare URLs
for res in REGEX_PATTERNS.url.finditer(text):
temp.append((res.start(0), 0, TextFmt.HRF_B, res.group(0)))
temp.append((res.end(0), 0, TextFmt.HRF_E, ""))
if not any(a <= res.start(0) and res.end(0) <= b for a, b in links):
temp.append((res.start(0), 0, TextFmt.HRF_B, res.group(0)))
temp.append((res.end(0), 0, TextFmt.HRF_E, ""))
# Match Shortcodes
temp.extend(
@@ -1273,7 +1310,7 @@ class Tokenizer(ABC):
temp.append((res.start(0), 0, TextFmt.COL_B, "altdialog"))
temp.append((res.end(0), 0, TextFmt.COL_E, "endaltdialog"))
# Post-process text and format
# Post-Process Text and Format
result = text
formats = []
for pos, end, fmt, meta in sorted(temp, key=lambda x: x[0], reverse=True):

View File

@@ -106,11 +106,26 @@ class ToMarkdown(Tokenizer):
cSkip = ""
lines = []
nItem = 0
for tType, _, tText, tFormat, tStyle in self._blocks:
if tType == BlockTyp.TEXT:
tTemp = self._formatText(tText, tFormat, mTags).replace("\n", " \n")
lines.append(f"{tTemp}\n\n")
elif tType == BlockTyp.LIST_U:
tTemp = self._formatText(tText, tFormat, mTags).replace("\n", " \n ")
lines.append(f"* {tTemp}\n")
if tStyle & BlockFmt.LIST_E:
lines.append("\n")
elif tType == BlockTyp.LIST_O:
nItem = 1 if tStyle & BlockFmt.LIST_S else nItem + 1
tPre = f"{nItem}. "
tTemp = self._formatText(tText, tFormat, mTags).replace("\n", " \n" + " " * len(tPre))
lines.append(f"{tPre}{tTemp}\n")
if tStyle & BlockFmt.LIST_E:
lines.append("\n")
elif tType in (BlockTyp.TITLE, BlockTyp.PART):
tHead = tText.replace("\n", " - ")
lines.append(f"{tHead}\n")

View File

@@ -26,16 +26,16 @@ import xml.etree.ElementTree as ET
from datetime import datetime
from hashlib import sha256
from typing import TYPE_CHECKING, Final, Literal, NamedTuple
from typing import TYPE_CHECKING, ClassVar, Literal, NamedTuple
from zipfile import ZIP_DEFLATED, ZipFile
from PyQt6.QtGui import QColor, QFont
from novelwriter import __version__
from novelwriter.common import xmlElement, xmlIndent, xmlSubElem
from novelwriter.constants import nwHeadFmt, nwStyles
from novelwriter.constants import nwHeadFmt, nwStyles, nwUnicode
from novelwriter.formats.shared import BlockFmt, BlockTyp, TextFmt, stripEscape
from novelwriter.formats.tokenizer import COMMENT_BLOCKS, Tokenizer
from novelwriter.formats.tokenizer import COMMENT_BLOCKS, LIST_BLOCKS, META_BLOCKS, Tokenizer
from novelwriter.types import FONT_STYLE, QtHexRgb
if TYPE_CHECKING:
@@ -88,6 +88,9 @@ TAG_SPC = _mkTag("text", "s")
TAG_NSPC = _mkTag("text", "c")
TAG_TAB = _mkTag("text", "tab")
TAG_SPAN = _mkTag("text", "span")
TAG_LIST = _mkTag("text", "list")
TAG_ITEM = _mkTag("text", "list-item")
TAG_STNM = _mkTag("text", "style-name")
# Formatting Codes
X_BLD = 0x001 # Bold format
@@ -124,6 +127,9 @@ S_TEXT = "Text_20_body"
S_META = "Text_20_Meta"
S_HNF = "Header_20_and_20_Footer"
S_NUM = "N0"
S_LIST = "List"
S_BULL = "List_20_Bullet"
S_NUMB = "Numbering_20_123"
# Font Data
FONT_WEIGHT_NUM = ["100", "200", "300", "400", "500", "600", "700", "800", "900"]
@@ -161,12 +167,14 @@ class ToOdt(Tokenizer):
"_headerFormat",
"_isFlat",
"_mDocBtm",
"_mDocGutter",
"_mDocHeight",
"_mDocLeft",
"_mDocRight",
"_mDocTop",
"_mDocWidth",
"_mHorLine",
"_mMirrored",
"_mainPara",
"_nNote",
"_pageOffset",
@@ -237,6 +245,8 @@ class ToOdt(Tokenizer):
self._mDocBtm = "2.000cm"
self._mDocLeft = "2.000cm"
self._mDocRight = "2.000cm"
self._mDocGutter = "0.000cm"
self._mMirrored = False
# Horizontal Line Margin
self._mHorLine = "4.250cm" # Quarter of the text width
@@ -245,15 +255,27 @@ class ToOdt(Tokenizer):
# Setters
##
def setPageLayout(self, width: float, height: float, top: float, bottom: float, left: float, right: float) -> None:
def setPageLayout(
self,
width: float,
height: float,
top: float,
bottom: float,
left: float,
right: float,
gutter: float,
mirrored: bool,
) -> None:
"""Set the document page size and margins in millimetres."""
self._mDocWidth = f"{width / 10.0:.3f}cm"
self._mDocHeight = f"{height / 10.0:.3f}cm"
self._mDocTop = f"{top / 10.0:.3f}cm"
self._mDocBtm = f"{bottom / 10.0:.3f}cm"
self._mDocLeft = f"{left / 10.0:.3f}cm"
self._mDocLeft = f"{(left + gutter) / 10.0:.3f}cm"
self._mDocRight = f"{right / 10.0:.3f}cm"
self._mHorLine = f"{(width - left - right) / 40.0:.3f}cm" # Quarter of the text width
self._mDocGutter = f"{gutter / 10.0:.3f}cm"
self._mMirrored = mirrored
self._mHorLine = f"{(width - left - right - gutter) / 40.0:.3f}cm" # Quarter of the text width
def setHeaderFormat(self, value: str, offset: int) -> None:
"""Set the document header format."""
@@ -390,11 +412,13 @@ class ToOdt(Tokenizer):
self._pageStyles()
self._defaultStyles()
self._useableStyles()
self._writeHeader()
self._writeHeaderStyle()
self._writeListStyle()
def doConvert(self) -> None:
"""Convert the list of text tokens into XML elements."""
xText = self._xText
xList = None
for tType, _, tText, tFormat, tStyle in self._blocks:
# Styles
oStyle = ODTParagraphStyle("New")
@@ -412,10 +436,10 @@ class ToOdt(Tokenizer):
if tStyle & BlockFmt.PBA:
oStyle.setBreakAfter("page")
if tStyle & BlockFmt.Z_BTM:
oStyle.setMarginBottom("0.000cm")
if tStyle & BlockFmt.Z_TOP:
oStyle.setMarginTop("0.000cm")
if tStyle & (BlockFmt.Z_TOP | BlockFmt.Z_BTM):
mTop, mBtm = self._marginMeta if tType in META_BLOCKS else self._marginText
oStyle.setMarginTop("0.000cm" if tStyle & BlockFmt.Z_TOP else self._emToCm(mTop))
oStyle.setMarginBottom("0.000cm" if tStyle & BlockFmt.Z_BTM else self._emToCm(mBtm))
if tStyle & BlockFmt.IND_L:
oStyle.setMarginLeft(self._fBlockIndent)
@@ -435,6 +459,13 @@ class ToOdt(Tokenizer):
# Title must be text:p
self._addTextPar(xText, S_TITLE, oStyle, tText, isHead=False)
elif tType in LIST_BLOCKS:
if xList is None or tStyle & BlockFmt.LIST_S:
sList = S_NUMB if tType == BlockTyp.LIST_O else S_BULL
xList = ET.SubElement(xText, TAG_LIST, attrib={TAG_STNM: sList})
xItem = ET.SubElement(xList, TAG_ITEM)
self._addTextPar(xItem, S_LIST, oStyle, tText, tFmt=tFormat)
elif tType == BlockTyp.HEAD1:
self._addTextPar(xText, S_HEAD1, oStyle, tText, isHead=True, oLevel="1")
@@ -763,7 +794,10 @@ class ToOdt(Tokenizer):
xPage = ET.SubElement(
self._xAuto if self._isFlat else self._xAut2,
_mkTag("style", "page-layout"),
attrib={_mkTag("style", "name"): "PM1"},
attrib={
_mkTag("style", "name"): "PM1",
_mkTag("style", "page-usage"): "mirrored" if self._mMirrored else "all",
},
)
ET.SubElement(
xPage,
@@ -775,6 +809,7 @@ class ToOdt(Tokenizer):
_mkTag("fo", "margin-bottom"): self._mDocBtm,
_mkTag("fo", "margin-left"): self._mDocLeft,
_mkTag("fo", "margin-right"): self._mDocRight,
_mkTag("loext", "margin-gutter"): self._mDocGutter,
},
)
@@ -972,6 +1007,14 @@ class ToOdt(Tokenizer):
style.packXML(self._xStyl)
self._mainPara[style.name] = style
# Add List Style
style = ODTParagraphStyle(S_LIST)
style.setDisplayName("List")
style.setParentStyleName(S_TEXT)
style.setClass("list")
style.packXML(self._xStyl)
self._mainPara[style.name] = style
# Add Separator Style
style = ODTParagraphStyle(S_SEP)
style.setDisplayName("Separator")
@@ -1094,7 +1137,7 @@ class ToOdt(Tokenizer):
style.packXML(self._xStyl)
self._mainPara[style.name] = style
def _writeHeader(self) -> None:
def _writeHeaderStyle(self) -> None:
"""Write the header elements."""
xPage = ET.SubElement(
self._xMast,
@@ -1131,6 +1174,55 @@ class ToOdt(Tokenizer):
xHead = ET.SubElement(xPage, _mkTag("style", "header-first"))
xPar = ET.SubElement(xHead, _mkTag("text", "p"), attrib={_mkTag("text", "style-name"): "Header"})
def _writeListStyle(self) -> None:
"""Write the list styles."""
for sName, sDisplay, sHang in ((S_BULL, "List Bullet", 1.0), (S_NUMB, "Numbering 123", 1.5)):
xList = ET.SubElement(
self._xStyl,
_mkTag("text", "list-style"),
attrib={
_mkTag("style", "name"): sName,
_mkTag("style", "display-name"): sDisplay,
},
)
bIndent = self._emToCm(sHang)
for level in range(1, 11):
if sName == S_BULL:
xLevel = ET.SubElement(
xList,
_mkTag("text", "list-level-style-bullet"),
attrib={
_mkTag("text", "level"): str(level),
_mkTag("text", "bullet-char"): nwUnicode.U_BULL,
},
)
else:
xLevel = ET.SubElement(
xList,
_mkTag("text", "list-level-style-number"),
attrib={
_mkTag("text", "level"): str(level),
_mkTag("style", "num-suffix"): ".",
_mkTag("style", "num-format"): "1",
},
)
xProp = ET.SubElement(
xLevel,
_mkTag("style", "list-level-properties"),
attrib={_mkTag("text", "list-level-position-and-space-mode"): "label-alignment"},
)
tIndent = self._emToCm(2.0 * level)
ET.SubElement(
xProp,
_mkTag("style", "list-level-label-alignment"),
attrib={
_mkTag("text", "label-followed-by"): "listtab",
_mkTag("text", "list-tab-stop-position"): tIndent,
_mkTag("fo", "text-indent"): f"-{bIndent}",
_mkTag("fo", "margin-left"): tIndent,
},
)
# Auto-Style Classes
# ==================
@@ -1144,11 +1236,11 @@ class ODTParagraphStyle:
__slots__ = ("_mAttr", "_name", "_pAttr", "_tAttr")
VALID_ALIGN: Final[list[str]] = ["start", "center", "end", "justify", "left", "right"]
VALID_BREAK: Final[list[str]] = ["auto", "page", "even-page", "odd-page", "inherit"]
VALID_LEVEL: Final[list[str]] = ["1", "2", "3", "4"]
VALID_CLASS: Final[list[str]] = ["text", "chapter", "extra", "html"]
VALID_WEIGHT: Final[list[str]] = ["normal", "bold", *FONT_WEIGHT_NUM]
VALID_ALIGN: ClassVar[list[str]] = ["start", "center", "end", "justify", "left", "right"]
VALID_BREAK: ClassVar[list[str]] = ["auto", "page", "even-page", "odd-page", "inherit"]
VALID_LEVEL: ClassVar[list[str]] = ["1", "2", "3", "4"]
VALID_CLASS: ClassVar[list[str]] = ["text", "chapter", "extra", "html", "list"]
VALID_WEIGHT: ClassVar[list[str]] = ["normal", "bold", *FONT_WEIGHT_NUM]
def __init__(self, name: str) -> None:
@@ -1391,13 +1483,13 @@ class ODTTextStyle:
__slots__ = ("_name", "_tAttr")
VALID_WEIGHT: Final[list[str]] = ["normal", "bold", *FONT_WEIGHT_NUM]
VALID_STYLE: Final[list[str]] = ["normal", "italic", "oblique"]
VALID_POS: Final[list[str]] = ["super", "sub"]
VALID_LSTYLE: Final[list[str]] = ["none", "solid"]
VALID_LTYPE: Final[list[str]] = ["single", "double"]
VALID_LWIDTH: Final[list[str]] = ["auto"]
VALID_LCOL: Final[list[str]] = ["font-color"]
VALID_WEIGHT: ClassVar[list[str]] = ["normal", "bold", *FONT_WEIGHT_NUM]
VALID_STYLE: ClassVar[list[str]] = ["normal", "italic", "oblique"]
VALID_POS: ClassVar[list[str]] = ["super", "sub"]
VALID_LSTYLE: ClassVar[list[str]] = ["none", "solid"]
VALID_LTYPE: ClassVar[list[str]] = ["single", "double"]
VALID_LWIDTH: ClassVar[list[str]] = ["auto"]
VALID_LCOL: ClassVar[list[str]] = ["font-color"]
def __init__(self, name: str) -> None:
self._name = name

View File

@@ -38,6 +38,7 @@ from PyQt6.QtGui import (
QTextDocument,
QTextFrameFormat,
QTextLength,
QTextListFormat,
QTextTableCellFormat,
QTextTableFormat,
)
@@ -46,7 +47,7 @@ from PyQt6.QtPrintSupport import QPrinter
from novelwriter import __version__
from novelwriter.constants import nwUnicode
from novelwriter.formats.shared import BlockFmt, BlockTyp, T_Formats, TextFmt, stripEscape
from novelwriter.formats.tokenizer import HEADING_BLOCKS, META_BLOCKS, Tokenizer
from novelwriter.formats.tokenizer import HEADING_BLOCKS, LIST_BLOCKS, META_BLOCKS, Tokenizer
from novelwriter.types import (
QtAlignAbsolute,
QtAlignCenter,
@@ -106,6 +107,8 @@ class ToQTextDocument(Tokenizer):
"_hWeight",
"_iHead",
"_init",
"_listFmtO",
"_listFmtU",
"_mHead",
"_mIndent",
"_mMeta",
@@ -161,6 +164,8 @@ class ToQTextDocument(Tokenizer):
self._tIndent = 1.0
self._blockFmt = QTextBlockFormat()
self._charFmt = QTextCharFormat()
self._listFmtU = QTextListFormat()
self._listFmtO = QTextListFormat()
##
# Properties
@@ -175,7 +180,17 @@ class ToQTextDocument(Tokenizer):
# Setters
##
def setPageLayout(self, width: float, height: float, top: float, bottom: float, left: float, right: float) -> None:
def setPageLayout(
self,
width: float,
height: float,
top: float,
bottom: float,
left: float,
right: float,
gutter: float,
mirrored: bool,
) -> None:
"""Set the document page size and margins in millimetres."""
self._pageSize = QPageSize(QSizeF(width, height), QPageSize.Unit.Millimeter)
self._pageMargins = QMarginsF(left, top, right, bottom)
@@ -271,6 +286,8 @@ class ToQTextDocument(Tokenizer):
self._mIndent = mPx * 2.0
self._tIndent = mPx * self._firstWidth
self._document.setIndentWidth(self._mIndent)
# Text Formats
self._blockFmt.setTopMargin(self._mText[0])
self._blockFmt.setBottomMargin(self._mText[1])
@@ -280,6 +297,12 @@ class ToQTextDocument(Tokenizer):
self._charFmt.setBackground(QtTransparent)
self._charFmt.setForeground(self._theme.text)
self._listFmtU.setStyle(QTextListFormat.Style.ListDisc)
self._listFmtU.setIndent(1)
self._listFmtO.setStyle(QTextListFormat.Style.ListDecimal)
self._listFmtO.setIndent(1)
self._init = True
def doConvert(self) -> None:
@@ -291,6 +314,7 @@ class ToQTextDocument(Tokenizer):
cursor = QTextCursor(self._document)
cursor.movePosition(QtMoveEnd)
qList = None
for tType, tMeta, tText, tFormat, tStyle in self._blocks:
bFmt = QTextBlockFormat(self._blockFmt)
if tType in META_BLOCKS:
@@ -331,6 +355,15 @@ class ToQTextDocument(Tokenizer):
newBlock(cursor, bFmt)
self._insertFragments(tText, tFormat, cursor, self._charFmt)
elif tType in LIST_BLOCKS:
newBlock(cursor, bFmt)
cursor.setBlockCharFormat(self._charFmt)
if qList is None or tStyle & BlockFmt.LIST_S:
qList = cursor.createList(self._listFmtO if tType == BlockTyp.LIST_O else self._listFmtU)
else:
qList.add(cursor.block())
self._insertFragments(tText, tFormat, cursor, self._charFmt)
elif tType in HEADING_BLOCKS:
bFmt, cFmt = self._genHeadStyle(tType, tMeta, bFmt)
for tPart in tText.split("\n"):

View File

@@ -208,11 +208,6 @@ class GuiMainMenu(QMenuBar):
self.aProjectSettings.setShortcut("Ctrl+Shift+,")
self.aProjectSettings.triggered.connect(self.mainGui.showProjectSettingsDialog)
# Project > Novel Details
self.aNovelDetails = qtAddAction(self.projMenu, self.tr("Novel Details"))
self.aNovelDetails.setShortcut("Shift+F6")
self.aNovelDetails.triggered.connect(self.mainGui.showNovelDetailsDialog)
# Project > Separator
self.projMenu.addSeparator()
@@ -359,11 +354,16 @@ class GuiMainMenu(QMenuBar):
self.aFocusDocument.setShortcut("Ctrl+E")
self.aFocusDocument.triggered.connect(qtWeakLambda(self._emitFocusChange, nwFocus.DOCUMENT))
# View > Outline
self.aFocusOutline = qtAddAction(self.viewMenu, self.tr("Go to Outline"))
self.aFocusOutline.setShortcut("Ctrl+Shift+T")
self.aFocusOutline.triggered.connect(qtWeakLambda(self._emitFocusChange, nwFocus.OUTLINE))
self.mainGui.addAction(self.aFocusOutline)
# View > Story View
self.aFocusStory = qtAddAction(self.viewMenu, self.tr("Go to Story View"))
self.aFocusStory.setShortcut("Ctrl+Shift+T")
self.aFocusStory.triggered.connect(qtWeakLambda(self._emitFocusChange, nwFocus.STORY))
self.mainGui.addAction(self.aFocusStory)
# View > Show/Hide Tree View
self.aHideTreePane = qtAddAction(self.viewMenu, self.tr("Show/Hide Tree View"))
self.aHideTreePane.setShortcut("Shift+F8")
self.aHideTreePane.triggered.connect(self.mainGui.toggleTreePane)
# View > Separator
self.viewMenu.addSeparator()
@@ -662,6 +662,11 @@ class GuiMainMenu(QMenuBar):
self.aFmtMark.triggered.connect(qtWeakLambda(self._emitDocAction, nwDocAction.MD_MARK))
self.mainGui.addAction(self.aFmtStrike)
# Format > Link
self.aFmtLink = qtAddAction(self.fmtMenu, self.tr("Link"))
self.aFmtLink.triggered.connect(qtWeakLambda(self._emitDocAction, nwDocAction.MD_LINK))
self.mainGui.addAction(self.aFmtLink)
# Edit > Separator
self.fmtMenu.addSeparator()
@@ -792,6 +797,17 @@ class GuiMainMenu(QMenuBar):
# Format > Separator
self.fmtMenu.addSeparator()
# Format > Bullet List
self.aFmtListU = qtAddAction(self.fmtMenu, self.tr("Bullet List"))
self.aFmtListU.triggered.connect(qtWeakLambda(self._emitDocAction, nwDocAction.BLOCK_LST_U))
# Format > Numbered List
self.aFmtListO = qtAddAction(self.fmtMenu, self.tr("Numbered List"))
self.aFmtListO.triggered.connect(qtWeakLambda(self._emitDocAction, nwDocAction.BLOCK_LST_O))
# Format > Separator
self.fmtMenu.addSeparator()
# Format > Comment
self.aFmtComment = qtAddAction(self.fmtMenu, self.tr("Toggle Comment"))
self.aFmtComment.setShortcut("Ctrl+/")

View File

@@ -42,8 +42,8 @@ from PyQt6.QtWidgets import (
from novelwriter import CONFIG, SHARED
from novelwriter.common import minmax, qtAddAction, qtAddMenu, qtWeakLambda
from novelwriter.constants import nwKeyWords, nwLabels, trConst
from novelwriter.enum import nwChange, nwDocMode, nwNovelExtra, nwOutline
from novelwriter.constants import nwKeyWords, nwLabels, trConst, trLabel
from novelwriter.enum import nwChange, nwDocMode, nwNovelExtra, nwStdLabel
from novelwriter.extensions.modified import NFlatIconButton, NTreeView
from novelwriter.extensions.novelselector import NovelSelector
from novelwriter.models.novelmodel import NovelModel
@@ -558,7 +558,7 @@ class GuiNovelTree(NTreeView):
if head := SHARED.project.index.getItemHeading(tHandle, sTitle):
logger.debug("Generating meta data tooltip for '%s:%s'", tHandle, sTitle)
if synopsis := head.synopsis:
label = trConst(nwLabels.OUTLINE_COLS[nwOutline.SYNOP])
label = trLabel(nwStdLabel.SYNOPSIS)
synopsis = f"<p><b>{label}:</b> {synopsis}</p>"
lines: list[str] = []

File diff suppressed because it is too large Load Diff

View File

@@ -44,7 +44,7 @@ logger = logging.getLogger(__name__)
class GuiSideBar(QWidget):
"""GUI: Main Window SideBar."""
requestViewChange = pyqtSignal(nwView)
requestViewChange = pyqtSignal(nwView, bool)
def __init__(self, mainGui: GuiMain) -> None:
super().__init__(parent=mainGui)
@@ -71,18 +71,14 @@ class GuiSideBar(QWidget):
self.tbSearch.setToolTip("{0} [Ctrl+Shift+F]".format(self.tr("Project Search")))
self.tbSearch.clicked.connect(qtWeakLambda(self._emitViewChange, nwView.SEARCH))
self.tbOutline = NFlatIconButton(self, iSz, "sb_outline:sidebar", 0.25)
self.tbOutline.setToolTip("{0} [Ctrl+Shift+T]".format(self.tr("Novel Outline View")))
self.tbOutline.clicked.connect(qtWeakLambda(self._emitViewChange, nwView.OUTLINE))
self.tbStory = NFlatIconButton(self, iSz, "sb_story:sidebar", 0.25)
self.tbStory.setToolTip("{0} [Ctrl+Shift+T]".format(self.tr("Story View")))
self.tbStory.clicked.connect(qtWeakLambda(self._emitViewChange, nwView.STORY))
self.tbTheme = NFlatIconButton(self, iSz, "", 0.25)
self.tbTheme.setToolTip(self.tr("Switch Colour Theme"))
self.tbTheme.clicked.connect(self._cycleColorTheme)
self.tbDetails = NFlatIconButton(self, iSz, "sb_details:sidebar", 0.25)
self.tbDetails.setToolTip("{0} [Shift+F6]".format(self.tr("Novel Details")))
self.tbDetails.clicked.connect(self.mainGui.showNovelDetailsDialog)
self.tbStats = NFlatIconButton(self, iSz, "sb_stats:sidebar", 0.25)
self.tbStats.setToolTip("{0} [F6]".format(self.tr("Writing Statistics")))
self.tbStats.clicked.connect(self.mainGui.showWritingStatsDialog)
@@ -108,10 +104,9 @@ class GuiSideBar(QWidget):
self.outerBox.addWidget(self.tbProject)
self.outerBox.addWidget(self.tbNovel)
self.outerBox.addWidget(self.tbSearch)
self.outerBox.addWidget(self.tbOutline)
self.outerBox.addWidget(self.tbStory)
self.outerBox.addWidget(self.tbBuild)
self.outerBox.addStretch(1)
self.outerBox.addWidget(self.tbDetails)
self.outerBox.addWidget(self.tbStats)
self.outerBox.addWidget(self.tbTheme)
self.outerBox.addWidget(self.tbSettings)
@@ -131,9 +126,8 @@ class GuiSideBar(QWidget):
self.tbProject.refreshTheme()
self.tbNovel.refreshTheme()
self.tbSearch.refreshTheme()
self.tbOutline.refreshTheme()
self.tbStory.refreshTheme()
self.tbBuild.refreshTheme()
self.tbDetails.refreshTheme()
self.tbStats.refreshTheme()
self.tbTheme.refreshTheme()
self.tbSettings.refreshTheme()
@@ -162,7 +156,7 @@ class GuiSideBar(QWidget):
@pyqtSlot(nwView)
def _emitViewChange(self, view: nwView) -> None:
"""Forward a view change request."""
self.requestViewChange.emit(view)
self.requestViewChange.emit(view, True)
##
# Internal Functions

View File

@@ -352,6 +352,19 @@ class GuiTheme:
logger.warning("No colour named '%s'", name)
return self._svgColors.get("default", b"#000000")
def getStructureColor(self, hLevel: int) -> QColor:
"""Return a structure color."""
match hLevel:
case 1:
name = "title"
case 2:
name = "chapter"
case 3:
name = "scene"
case _:
name = "file"
return QColor(self._qColors.get(name) or QtTransparent)
##
# Theme Methods
##
@@ -818,6 +831,7 @@ class GuiIcons:
"_allThemes",
"_headerDec",
"_headerDecNarrow",
"_iconSize",
"_meta",
"_noIcon",
"_qIcons",
@@ -845,6 +859,7 @@ class GuiIcons:
self._qIcons: dict[str, QIcon] = {}
self._headerDec: list[QPixmap] = []
self._headerDecNarrow: list[QPixmap] = []
self._iconSize = QSize() # The icon size of the theme
# None Icon
self._noIcon = QIcon(str(CONFIG.assetPath("icons") / "none.svg"))
@@ -855,6 +870,7 @@ class GuiIcons:
self._qIcons = {}
self._headerDec = []
self._headerDecNarrow = []
self._iconSize = QSize()
self._meta = ThemeMeta()
##
@@ -917,6 +933,14 @@ class GuiIcons:
logException()
return
# All icons in a theme are assumed to have the same size
for svg in self._svgData.values():
pixmap = QPixmap()
if pixmap.loadFromData(svg, "svg"):
self._iconSize = pixmap.size()
logger.debug("Theme icon size is %dx%d px", self._iconSize.width(), self._iconSize.height())
break
# Populate generated icons cache
CONFIG.splashMessage("Generating additional icons ...")
self.getHeaderDecoration(0)
@@ -928,29 +952,27 @@ class GuiIcons:
# Access Functions
##
def getIcon(self, name: str, width: int = 24, height: int = 24) -> QIcon:
def getIcon(self, name: str) -> QIcon:
"""Return an icon from the icon buffer, or load it."""
color = "default"
if ":" in name:
name, _, color = name.partition(":")
variant = f"{name}-{color}" if color else name
if (key := f"{variant}-{width}x{height}") in self._qIcons:
name, _, color = name.partition(":")
color = color or "default"
key = f"{name}-{color}"
if key in self._qIcons:
return self._qIcons[key]
else:
icon = self._loadIcon(name, color, width, height)
icon = self._loadIcon(name, color)
self._qIcons[key] = icon
logger.debug("Icon: %s", key)
return icon
def getToggleIcon(self, name: str, width: int, height: int) -> QIcon:
"""Return a toggle icon from the icon buffer, or load it."""
def getToggleIcon(self, name: str) -> QIcon:
"""Return a toggle icon built from the icon buffer."""
key, _, color = name.partition(":")
if key in self.TOGGLE_ICON_KEYS:
pix0 = self.getPixmap(f"{self.TOGGLE_ICON_KEYS[key][0]}:{color}", width, height)
pix1 = self.getPixmap(f"{self.TOGGLE_ICON_KEYS[key][1]}:{color}", width, height)
on, off = self.TOGGLE_ICON_KEYS[key]
icon = QIcon()
icon.addPixmap(pix0, QtIconNormal, QtIconOn)
icon.addPixmap(pix1, QtIconNormal, QtIconOff)
icon.addPixmap(self.getIcon(f"{on}:{color}").pixmap(self._iconSize, 1.0), QtIconNormal, QtIconOn)
icon.addPixmap(self.getIcon(f"{off}:{color}").pixmap(self._iconSize, 1.0), QtIconNormal, QtIconOff)
return icon
return self._noIcon
@@ -993,10 +1015,8 @@ class GuiIcons:
return name
def getPixmap(self, name: str, width: int, height: int) -> QPixmap:
"""Return an icon from the icon buffer as a QPixmap. If it
doesn't exist, return an empty QPixmap.
"""
return self.getIcon(name, width, height).pixmap(width, height, QtIconNormal)
"""Return an icon from the icon buffer as a QPixmap."""
return self.getIcon(name).pixmap(width, height, QtIconNormal)
def getStandardButton(self, button: nwStandardButton, parent: QWidget) -> NPushButton:
"""Return a standard button with icon and text."""
@@ -1079,7 +1099,7 @@ class GuiIcons:
# Internal Functions
##
def _loadIcon(self, name: str, color: str | None = None, w: int = 24, h: int = 24) -> QIcon:
def _loadIcon(self, name: str, color: str | None = None) -> QIcon:
"""Load an icon from the assets themes folder. This function is
guaranteed to return a QIcon.
"""
@@ -1092,8 +1112,7 @@ class GuiIcons:
if svg := self._svgData.get(name, b""):
if fill := self._theme.getRawBaseColor(color or "default"): # pragma: no branch
svg = svg.replace(b"#000000", fill)
pixmap = QPixmap(w, h)
pixmap.fill(QtTransparent)
pixmap = QPixmap()
pixmap.loadFromData(svg, "svg")
return QIcon(pixmap)

View File

@@ -59,14 +59,13 @@ from novelwriter.extensions.progressbars import NProgressSimple
from novelwriter.gui.itemdetails import GuiItemDetails
from novelwriter.gui.mainmenu import GuiMainMenu
from novelwriter.gui.noveltree import GuiNovelView
from novelwriter.gui.outline import GuiOutlineView
from novelwriter.gui.projtree import GuiProjectView
from novelwriter.gui.search import GuiProjectSearch
from novelwriter.gui.sidebar import GuiSideBar
from novelwriter.gui.statusbar import GuiMainStatus
from novelwriter.manuscript.manuscript import GuiManuscript
from novelwriter.story.storyview import GuiStoryView
from novelwriter.tools.dictionaries import GuiDictionaries
from novelwriter.tools.noveldetails import GuiNovelDetails
from novelwriter.tools.welcome import GuiWelcome
from novelwriter.tools.writingstats import GuiWritingStats
@@ -105,6 +104,7 @@ class GuiMain(QMainWindow):
# Internal Variables
self._lastTotalCount = 0
self._switchingDocument = False
self._treePaneHidden = False
# Initialise UserData Instance
SHARED.initSharedData(self)
@@ -130,7 +130,7 @@ class GuiMain(QMainWindow):
self.docViewer = GuiDocViewer(self)
self.docViewerPanel = GuiDocViewerPanel(self)
self.itemDetails = GuiItemDetails(self)
self.outlineView = GuiOutlineView(self)
self.storyView = GuiStoryView(self)
self.mainMenu = GuiMainMenu(self)
self.sideBar = GuiSideBar(self)
@@ -179,14 +179,13 @@ class GuiMain(QMainWindow):
self.splitMain.setSizes([max(s, 100) for s in CONFIG.mainPanePos])
self.splitMain.setCollapsible(0, False)
self.splitMain.setCollapsible(1, False)
self.splitMain.setStretchFactor(1, 0)
self.splitMain.setStretchFactor(0, 0)
self.splitMain.setStretchFactor(1, 1)
# Main Stack : Editor / Outline
# Main Stack : Editor / Story View
self.mainStack = QStackedWidget(self)
self.mainStack.addWidget(self.splitMain)
self.mainStack.addWidget(self.outlineView)
self.mainStack.currentChanged.connect(self._mainStackChanged)
self.mainStack.addWidget(self.storyView)
# Editor / Viewer Default State
self.splitView.setVisible(False)
@@ -222,6 +221,7 @@ class GuiMain(QMainWindow):
SHARED.focusModeChanged.connect(self._focusModeChanged)
SHARED.indexAvailable.connect(self.docViewerPanel.indexHasAppeared)
SHARED.indexAvailable.connect(self.storyView.indexHasAppeared)
SHARED.indexChangedRefs.connect(self.docViewerPanel.updateChangedRefs)
SHARED.indexChangedTags.connect(self.docEditor.updateChangedTags)
SHARED.indexChangedTags.connect(self.docViewer.updateChangedTags)
@@ -236,9 +236,9 @@ class GuiMain(QMainWindow):
SHARED.projectStatusChanged.connect(self.mainStatus.updateProjectStatus)
SHARED.projectStatusMessage.connect(self.mainStatus.setStatusMessage)
SHARED.rootFolderChanged.connect(self.novelView.updateRootItem)
SHARED.rootFolderChanged.connect(self.outlineView.updateRootItem)
SHARED.rootFolderChanged.connect(self.projSearch.updateRootItem)
SHARED.rootFolderChanged.connect(self.projView.updateRootItem)
SHARED.rootFolderChanged.connect(self.storyView.updateRootItem)
SHARED.spellLanguageChanged.connect(self.docEditor.processSpellCheckChange)
SHARED.spellLanguageChanged.connect(self.mainStatus.setLanguage)
SHARED.statusLabelsChanged.connect(self.docViewerPanel.updateStatusLabels)
@@ -288,9 +288,6 @@ class GuiMain(QMainWindow):
self.docViewerPanel.loadDocumentTagRequest.connect(self._followTag)
self.docViewerPanel.openDocumentRequest.connect(self._openDocument)
self.outlineView.loadDocumentTagRequest.connect(self._followTag)
self.outlineView.openDocumentRequest.connect(self._openDocument)
# OS Theme Support
# ================
@@ -416,7 +413,7 @@ class GuiMain(QMainWindow):
self.closeViewerPanel(byUser=False)
self.docViewerPanel.closeProjectTasks()
self.outlineView.closeProjectTasks()
self.storyView.closeProjectTasks()
self.novelView.closeProjectTasks()
self.projView.closeProjectTasks()
self.projSearch.closeProjectTasks()
@@ -489,7 +486,7 @@ class GuiMain(QMainWindow):
self.mainStatus.initProjectSettings()
self.projView.openProjectTasks()
self.novelView.openProjectTasks()
self.outlineView.openProjectTasks()
self.storyView.openProjectTasks()
self.projSearch.openProjectTasks()
self.docViewerPanel.openProjectTasks()
self._updateStatusWordCount()
@@ -725,8 +722,6 @@ class GuiMain(QMainWindow):
self.projView.projTree.openSelectedItem()
elif self.novelView.treeHasFocus():
self.novelView.novelTree.openSelectedItem()
elif self.outlineView.treeHasFocus():
self.outlineView.outlineTree.openSelectedItem()
else:
logger.warning("No item selected")
@@ -778,14 +773,6 @@ class GuiMain(QMainWindow):
dialog.newProjectSettingsReady.connect(self._processProjectSettingsChanges)
dialog.exec()
@pyqtSlot()
def showNovelDetailsDialog(self) -> None:
"""Open the novel details dialog."""
if SHARED.hasProject:
dialog = GuiNovelDetails(self)
dialog.activateDialog()
dialog.updateValues()
@pyqtSlot()
def showBuildManuscriptDialog(self) -> None:
"""Open the build manuscript dialog."""
@@ -857,8 +844,8 @@ class GuiMain(QMainWindow):
logger.info("Exiting novelWriter")
if not SHARED.focusMode:
CONFIG.mainPanePos = self.splitMain.sizes()
CONFIG.outlinePanePos = self.outlineView.splitSizes()
if not self.treePane.isHidden(): # Note: not the same as isVisible()
CONFIG.mainPanePos = self.splitMain.sizes()
CONFIG.searchPanePos = self.projSearch.splitSizes()
if self.docViewerPanel.isVisible():
CONFIG.viewPanePos = self.splitView.sizes()
@@ -925,7 +912,7 @@ class GuiMain(QMainWindow):
self.projView.updateTheme()
self.novelView.updateTheme()
self.projSearch.updateTheme()
self.outlineView.updateTheme()
self.storyView.updateTheme()
self.itemDetails.updateTheme()
self.mainStatus.updateTheme()
SHARED.project.tree.refreshAllItems()
@@ -961,6 +948,12 @@ class GuiMain(QMainWindow):
"""Toggle full screen mode."""
self.setWindowState(self.windowState() ^ Qt.WindowState.WindowFullScreen)
@pyqtSlot()
def toggleTreePane(self) -> None:
"""Toggle the tree pane visibility."""
if self.mainStack.currentWidget() == self.splitMain and not SHARED.focusMode:
self.treePane.setVisible(not self.treePane.isVisible())
@pyqtSlot()
def closeDocEditor(self) -> None:
"""Close the document editor. This does not hide the editor."""
@@ -1003,6 +996,7 @@ class GuiMain(QMainWindow):
"""
if focusMode:
logger.debug("Activating Focus Mode")
self._treePaneHidden = self.treePane.isHidden()
self._changeView(nwView.EDITOR)
self.docEditor.setFocus()
else:
@@ -1010,7 +1004,7 @@ class GuiMain(QMainWindow):
cursorVisible = self.docEditor.cursorIsVisible()
isVisible = not focusMode
self.treePane.setVisible(isVisible)
self.treePane.setVisible(isVisible and not self._treePaneHidden)
self.mainStatus.setVisible(isVisible)
self.mainMenu.setVisible(isVisible)
self.sideBar.setVisible(isVisible)
@@ -1052,10 +1046,10 @@ class GuiMain(QMainWindow):
self._changeView(nwView.EDITOR, exitFocus=True)
if (vM and ((vP and fP) or (vN and not fN))) or (not vM and vN):
self._changeView(nwView.NOVEL, exitFocus=True)
self._changeView(nwView.NOVEL, exitFocus=True, forceVisible=True)
self.novelView.setTreeFocus()
else:
self._changeView(nwView.PROJECT, exitFocus=True)
self._changeView(nwView.PROJECT, exitFocus=True, forceVisible=True)
self.projView.setTreeFocus()
elif paneNo == nwFocus.DOCUMENT:
@@ -1068,9 +1062,8 @@ class GuiMain(QMainWindow):
else:
self.docEditor.setFocus()
elif paneNo == nwFocus.OUTLINE:
self._changeView(nwView.OUTLINE, exitFocus=True)
self.outlineView.setTreeFocus()
elif paneNo == nwFocus.STORY:
self._changeView(nwView.STORY, exitFocus=True)
@pyqtSlot(GuiNeedsUpdate)
def _processConfigChanges(self, update: GuiNeedsUpdate) -> None:
@@ -1097,7 +1090,6 @@ class GuiMain(QMainWindow):
self.docViewer.initViewport()
self.projView.initViewport()
self.novelView.initViewport()
self.outlineView.initViewport()
if update.spelling:
SHARED.updateSpellCheckLanguage(reload=True)
@@ -1107,6 +1099,7 @@ class GuiMain(QMainWindow):
self.docViewer.initSettings()
self.projSearch.initSettings()
self.storyView.initSettings()
self.mainStatus.initSettings()
# Force update of word count
@@ -1187,29 +1180,54 @@ class GuiMain(QMainWindow):
self.docViewer.reloadText()
@pyqtSlot(nwView)
def _changeView(self, view: nwView, exitFocus: bool = False) -> None:
"""Handle the requested change of view from the GuiViewBar."""
@pyqtSlot(nwView, bool)
def _changeView(
self,
view: nwView,
isSideBar: bool = False,
*,
exitFocus: bool = False,
forceVisible: bool = False,
) -> None:
"""Handle the requested change of view."""
if exitFocus:
SHARED.setFocusMode(False)
isMain = self.mainStack.currentWidget() == self.splitMain
isSame = False
canToggle = False
if view == nwView.EDITOR:
# Only change the main stack, but not the project stack
self.mainStack.setCurrentWidget(self.splitMain)
elif view == nwView.PROJECT:
isSame = isMain and self.projStack.currentWidget() == self.projView
canToggle = True
self.mainStack.setCurrentWidget(self.splitMain)
self.projStack.setCurrentWidget(self.projView)
elif view == nwView.NOVEL:
isSame = isMain and self.projStack.currentWidget() == self.novelView
canToggle = True
self.mainStack.setCurrentWidget(self.splitMain)
self.projStack.setCurrentWidget(self.novelView)
elif view == nwView.SEARCH:
isSame = isMain and self.projStack.currentWidget() == self.projSearch
canToggle = True
self.mainStack.setCurrentWidget(self.splitMain)
self.projStack.setCurrentWidget(self.projSearch)
self.projSearch.beginSearch(self.docEditor.getSelectedText() if self.docEditor.anyFocus() else "")
elif view == nwView.OUTLINE:
self.mainStack.setCurrentWidget(self.outlineView)
elif view == nwView.STORY:
self.mainStack.setCurrentWidget(self.storyView)
self.storyView.viewStory()
else: # pragma: no cover
pass
if canToggle:
if forceVisible or not isSame:
self.treePane.setVisible(True)
elif isSideBar:
self.treePane.setVisible(not self.treePane.isVisible())
# Set active status
isMain = self.mainStack.currentWidget() == self.splitMain
isNovel = self.projStack.currentWidget() == self.novelView
@@ -1310,12 +1328,6 @@ class GuiMain(QMainWindow):
self.mainStatus.setProjectStats(cTotal, cTotal - iTotal)
self.mainStatus.updateGoals(data.targetLastCount, data.dailyProgress)
@pyqtSlot(int)
def _mainStackChanged(self, index: int) -> None:
"""Process main window tab change."""
if self.mainStack.widget(index) == self.outlineView and SHARED.hasProject:
self.outlineView.refreshTree()
@pyqtSlot(int)
def _projStackChanged(self, index: int) -> None:
"""Process project view tab change."""

View File

@@ -74,6 +74,7 @@ SETTINGS_TEMPLATE: dict[str, tuple[type, T_BuildValue]] = {
"headings.breakPart": (bool, True),
"headings.breakChapter": (bool, True),
"headings.breakScene": (bool, False),
"text.includeBodyText": (bool, True),
"text.includeSynopsis": (bool, False),
"text.includeComments": (bool, False),
@@ -82,6 +83,7 @@ SETTINGS_TEMPLATE: dict[str, tuple[type, T_BuildValue]] = {
"text.includeKeywords": (bool, False),
"text.ignoredKeywords": (str, ""),
"text.addNoteHeadings": (bool, True),
"format.textFont": (str, CONFIG.textFont.toString()),
"format.lineHeight": (float, 1.15),
"format.justifyText": (bool, False),
@@ -124,9 +126,13 @@ SETTINGS_TEMPLATE: dict[str, tuple[type, T_BuildValue]] = {
"format.bottomMargin": (float, 2.0),
"format.leftMargin": (float, 2.0),
"format.rightMargin": (float, 2.0),
"format.gutterMargin": (float, 0.0),
"format.mirrorMargins": (bool, False),
"doc.pageHeader": (str, nwHeadFmt.DOC_AUTO),
"doc.pageCountOffset": (int, 0),
"doc.metaLanguage": (str, ""),
"html.addStyles": (bool, True),
"html.preserveTabs": (bool, False),
}
@@ -187,7 +193,11 @@ SETTINGS_LABELS = {
"format.grpPage": QT_TRANSLATE_NOOP("Builds", "Page Layout"),
"format.pageUnit": QT_TRANSLATE_NOOP("Builds", "Unit"),
"format.pageSize": QT_TRANSLATE_NOOP("Builds", "Page size"),
"format.pageMargins": QT_TRANSLATE_NOOP("Builds", "Page margins"),
"format.pageMarginsTB": QT_TRANSLATE_NOOP("Builds", "Top and bottom margins"),
"format.pageMarginsLR": QT_TRANSLATE_NOOP("Builds", "Left and right margins"),
"format.pageMarginsIO": QT_TRANSLATE_NOOP("Builds", "Inner and outer margins"),
"format.gutterMargin": QT_TRANSLATE_NOOP("Builds", "Gutter margin"),
"format.mirrorMargins": QT_TRANSLATE_NOOP("Builds", "Mirror margins"),
"doc": QT_TRANSLATE_NOOP("Builds", "Document Style"),
"doc.pageHeader": QT_TRANSLATE_NOOP("Builds", "Page header"),
@@ -220,12 +230,26 @@ class FilterMode(Enum):
class BuildSettings:
"""Core: Build Settings Class.
"""Manuscript: Build Settings Class.
This class manages the build settings for a Manuscript build job.
The settings can be packed/unpacked to/from a dictionary for JSON.
"""
__slots__ = (
"_build",
"_changed",
"_excluded",
"_format",
"_included",
"_name",
"_order",
"_path",
"_settings",
"_skipRoot",
"_uuid",
)
def __init__(self) -> None:
self._name = ""
self._uuid = str(uuid.uuid4())
@@ -521,7 +545,7 @@ class BuildSettings:
class BuildCollection:
"""Core: Build Collection Class.
"""Manuscript: Build Collection Class.
This object holds all the build setting objects defined by the given
project. The build settings are saved as a single JSON file in the
@@ -609,17 +633,17 @@ class BuildCollection:
buildsFile = self._project.storage.getMetaFile(nwFiles.BUILDS_FILE)
if not isinstance(buildsFile, Path):
return False
if not safeExists(buildsFile):
return True
data = {}
if safeExists(buildsFile):
logger.debug("Loading builds file")
try:
with open(buildsFile, mode="r", encoding="utf-8") as inFile:
data = json.load(inFile)
except Exception:
logger.error("Failed to load builds file")
logException()
return False
logger.debug("Loading builds file")
try:
with open(buildsFile, mode="r", encoding="utf-8") as inFile:
data = json.load(inFile)
except Exception:
logger.error("Failed to load builds file")
logException()
return False
if not isinstance(data, dict):
logger.error("Builds file is not a JSON object")

View File

@@ -52,7 +52,7 @@ logger = logging.getLogger(__name__)
class DocumentBuilder:
"""Core: Manuscript Document Build Class.
"""Manuscript: Manuscript Document Build Class.
This is the core tool that assembles a project and outputs a
manuscript, based on a build definition object (BuildSettings).
@@ -347,7 +347,7 @@ class DocumentBuilder:
)
if isinstance(bldObj, ToOdt | ToDocX | ToQTextDocument):
scale = nwLabels.UNIT_SCALE.get(self._build.getStr("format.pageUnit"), 1.0)
scale = nwLabels.PAGE_UNIT_SCALE.get(self._build.getStr("format.pageUnit"), 1.0)
pW, pH = nwLabels.PAPER_SIZE.get(self._build.getStr("format.pageSize"), (-1.0, -1.0))
bldObj.setPageLayout(
pW if pW > 0.0 else scale * self._build.getFloat("format.pageWidth"),
@@ -356,6 +356,8 @@ class DocumentBuilder:
scale * self._build.getFloat("format.bottomMargin"),
scale * self._build.getFloat("format.leftMargin"),
scale * self._build.getFloat("format.rightMargin"),
scale * self._build.getFloat("format.gutterMargin"),
self._build.getBool("format.mirrorMargins"),
)
bldObj.setLineForMargin(self._build.getBool("format.lineForMargin"))

View File

@@ -60,9 +60,10 @@ from novelwriter import CONFIG, SHARED
from novelwriter.common import formatInt, formatPercent, fuzzyTime
from novelwriter.constants import nwHeadFmt, nwLabels, nwStats, nwUnicode, trStats
from novelwriter.enum import nwStandardButton
from novelwriter.extensions.modified import NFlatIconButton, NTabWidget, NToolDialog
from novelwriter.extensions.modified import NFlatIconButton, NToolDialog
from novelwriter.extensions.progressbars import NProgressCircle
from novelwriter.extensions.switch import NSwitch
from novelwriter.extensions.tabwidget import NTabWidget
from novelwriter.formats.tokenizer import HeadingFormatter
from novelwriter.formats.toqdoc import ToQTextDocument
from novelwriter.manuscript.buildsettings import BuildCollection, BuildSettings

View File

@@ -1377,7 +1377,7 @@ class _FormattingTab(NScrollableForm):
# Unit
self.pageUnit = NComboBox(self)
for key, name in nwLabels.UNIT_NAME.items():
for key, name in nwLabels.PAGE_UNIT_NAME.items():
self.pageUnit.addItem(trConst(name), key)
self.addRow(self._build.getLabel("format.pageUnit"), self.pageUnit)
@@ -1422,14 +1422,30 @@ class _FormattingTab(NScrollableForm):
self.pixPMR = QLabel(self)
self.addRow(
self._build.getLabel("format.pageMargins"),
self._build.getLabel("format.pageMarginsTB"),
[self.pixPMT, self.topMargin, iSp, self.pixPMB, self.bottomMargin],
)
self.addRow(
"",
[self.pixPML, self.leftMargin, iSp, self.pixPMR, self.rightMargin],
editable="pageMarginsHorizontal",
)
# Page Gutter
self.gutterMargin = NDoubleSpinBox(self)
self.gutterMargin.setFixedNumbersWidth(5)
self.addRow(
self._build.getLabel("format.gutterMargin"),
self.gutterMargin,
)
# Mirror Margins
self.mirrorMargins = NSwitch(self, height=iPx)
self.mirrorMargins.clicked.connect(self._updateMirrorMarginsState)
self.addRow(self._build.getLabel("format.mirrorMargins"), self.mirrorMargins)
# Document Style
# ==============
@@ -1529,8 +1545,7 @@ class _FormattingTab(NScrollableForm):
self.pixPSH.setPixmap(SHARED.theme.getPixmap("fit_height", iPx, iPx))
self.pixPSW.setPixmap(SHARED.theme.getPixmap("fit_width", iPx, iPx))
self.pixPML.setPixmap(SHARED.theme.getPixmap("margin_left", iPx, iPx))
self.pixPMR.setPixmap(SHARED.theme.getPixmap("margin_right", iPx, iPx))
self._updateMirrorMarginsState()
self.pageSize.updateStyle()
self.pageUnit.updateStyle()
@@ -1616,7 +1631,7 @@ class _FormattingTab(NScrollableForm):
index = self.pageUnit.findData(pageUnit)
if index >= 0:
self.pageUnit.setCurrentIndex(index)
self._unitScale = nwLabels.UNIT_SCALE.get(pageUnit, 1.0)
self._unitScale = nwLabels.PAGE_UNIT_SCALE.get(pageUnit, 1.0)
self._changeUnit(index)
self.pageWidth.setValue(self._build.getFloat("format.pageWidth"))
@@ -1625,6 +1640,10 @@ class _FormattingTab(NScrollableForm):
self.bottomMargin.setValue(self._build.getFloat("format.bottomMargin"))
self.leftMargin.setValue(self._build.getFloat("format.leftMargin"))
self.rightMargin.setValue(self._build.getFloat("format.rightMargin"))
self.gutterMargin.setValue(self._build.getFloat("format.gutterMargin"))
self.mirrorMargins.setChecked(self._build.getBool("format.mirrorMargins"))
self._updateMirrorMarginsState()
pageSize = self._build.getStr("format.pageSize")
index = self.pageSize.findData(pageSize)
@@ -1715,6 +1734,8 @@ class _FormattingTab(NScrollableForm):
self._build.setValue("format.bottomMargin", self.bottomMargin.value())
self._build.setValue("format.leftMargin", self.leftMargin.value())
self._build.setValue("format.rightMargin", self.rightMargin.value())
self._build.setValue("format.gutterMargin", self.gutterMargin.value())
self._build.setValue("format.mirrorMargins", self.mirrorMargins.isChecked())
# Documents
metaLanguage = processLangCode(self.metaLanguage.text())
@@ -1746,7 +1767,7 @@ class _FormattingTab(NScrollableForm):
def _changeUnit(self, index: int) -> None:
"""Process current unit change to recalculate sizes."""
newUnit = self.pageUnit.itemData(index)
newScale = nwLabels.UNIT_SCALE.get(newUnit, 1.0)
newScale = nwLabels.PAGE_UNIT_SCALE.get(newUnit, 1.0)
reScale = self._unitScale / newScale
pageWidth = self.pageWidth.value() * reScale
@@ -1755,6 +1776,7 @@ class _FormattingTab(NScrollableForm):
bottomMargin = self.bottomMargin.value() * reScale
leftMargin = self.leftMargin.value() * reScale
rightMargin = self.rightMargin.value() * reScale
gutterMargin = self.gutterMargin.value() * reScale
isMM = newUnit == "mm"
nDec = 1 if isMM else 2
@@ -1799,6 +1821,11 @@ class _FormattingTab(NScrollableForm):
self.rightMargin.setMaximum(mMax)
self.rightMargin.setValue(rightMargin)
self.gutterMargin.setDecimals(nDec)
self.gutterMargin.setSingleStep(nStep)
self.gutterMargin.setMaximum(mMax)
self.gutterMargin.setValue(gutterMargin)
self._unitScale = newScale
self._changePageSize(self.pageSize.currentIndex())
@@ -1822,6 +1849,17 @@ class _FormattingTab(NScrollableForm):
if (index := self.pageSize.findData("Custom")) >= 0: # pragma: no branch
self.pageSize.setCurrentIndex(index)
@pyqtSlot()
def _updateMirrorMarginsState(self) -> None:
"""Update horizontal margin label and icons."""
state = self.mirrorMargins.isChecked()
iPx = SHARED.theme.baseIconHeight
self.pixPML.setPixmap(SHARED.theme.getPixmap("margin_inner" if state else "margin_left", iPx, iPx))
self.pixPMR.setPixmap(SHARED.theme.getPixmap("margin_outer" if state else "margin_right", iPx, iPx))
self.setLabelText(
"pageMarginsHorizontal", self._build.getLabel("format.pageMarginsIO" if state else "format.pageMarginsLR")
)
@pyqtSlot()
def _resetPageHeader(self) -> None:
"""Reset the document header format to default."""

View File

@@ -0,0 +1,355 @@
"""
novelWriter - Outline Model
===========================
This file is a part of novelWriter
Copyright (C) 2026 Veronica Berglyd Olsen and novelWriter contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
""" # noqa
from __future__ import annotations
import logging
import math
from typing import TYPE_CHECKING, NamedTuple
from PyQt6.QtCore import QAbstractTableModel, QModelIndex, Qt
from PyQt6.QtGui import QColor
from novelwriter import CONFIG, SHARED
from novelwriter.common import formatPercent
from novelwriter.constants import nwLabels, nwStats, nwStyles, nwUnicode, trConst, trLabel, trStats
from novelwriter.enum import nwStdLabel
from novelwriter.story.storysettings import COMMENT_SYNOPSIS
from novelwriter.types import QtDisplayRole, QtTransparent
if TYPE_CHECKING:
from novelwriter.core.index import Index
from novelwriter.core.indexdata import IndexHeading
logger = logging.getLogger(__name__)
NODE_FLAGS = Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable
class _TrCache(NamedTuple):
sWords: str
sChars: str
sPage: str
sSynopsis: str
sStory: str
sNote: str
sKeys: dict[str, str]
class NodeStyle(NamedTuple):
"""Core: Outline Node Style Class."""
border: QColor
background: QColor
highlight: QColor
BLANK_STYLE = NodeStyle(QtTransparent, QtTransparent, QtTransparent)
class OutlineNode:
"""Core: Outline Model Node Class.
A single heading row, holding copies of the values for display.
"""
__slots__ = (
"_chars",
"_columns",
"_entries",
"_handle",
"_heading",
"_key",
"_level",
"_lists",
"_progress",
"_style",
"_title",
"_tr",
"_words",
)
def __init__(
self,
handle: str,
key: str,
heading: IndexHeading | None,
tr: _TrCache,
style: NodeStyle,
columns: list[tuple[str, ...]] | None = None,
) -> None:
self._handle = handle
self._key = key
self._heading: IndexHeading | None = heading
self._tr: _TrCache = tr
self._columns = columns or []
# Parsed Data
self._level = 0
self._title = ""
self._words = ""
self._chars = ""
self._progress = ""
self._lists: dict[str, list[str]] = {}
self._entries: list[list[tuple[str, str, str, str]]] = []
self._style = style
self.refresh()
##
# Properties
##
@property
def handle(self) -> str:
"""The handle of the document the heading belongs to."""
return self._handle
@property
def key(self) -> str:
"""The heading key within its document."""
return self._key
@property
def title(self) -> str:
"""The heading title."""
return self._title
@property
def level(self) -> int:
"""The heading level."""
return self._level
@property
def counts(self) -> str:
"""The word or character count, as set in the preferences."""
return self._chars if CONFIG.useCharCount else self._words
@property
def progress(self) -> str:
"""The page and story progress of the heading, if set."""
return self._progress
@property
def style(self) -> NodeStyle:
"""The style for the heading's structural level."""
return self._style
##
# Data Access
##
def refSpans(self, keyword: str, tags: set[str]) -> list[tuple[int, int]]:
"""Return the start and length of the given tag keys in refs."""
spans = []
pos = 0
for name in self._lists.get(keyword, ()):
if name.lower() in tags:
spans.append((pos, len(name)))
pos += len(name) + 2
return spans
def entries(self, column: int) -> list[tuple[str, str, str, str]]:
"""Return the key, label, short label and text of the entries
of a column. The short label is used when an icon is shown.
"""
return self._entries[column] if 0 <= column < len(self._entries) else []
##
# Data Maintenance
##
def setProgress(self, page: int, fraction: float) -> None:
"""Set the page number and word count progress fraction."""
self._progress = f"{self._tr.sPage.format(f'{page:n}')} ({formatPercent(fraction, prec=1)})"
def refresh(self) -> None:
"""Refresh data values."""
tr = self._tr
if h := self._heading:
self._level = nwStyles.H_LEVEL.get(h.level, 0)
self._title = h.title
self._words = f"{h.wordCount:n} {tr.sWords}"
self._chars = f"{h.charCount:n} {tr.sChars}"
self._lists = {k: v for k, v in h.getReferences().items() if v}
kinds = {"story": tr.sStory, "note": tr.sNote}
lookup = {k: (tr.sKeys.get(k, k), "", ", ".join(v)) for k, v in self._lists.items()}
lookup[COMMENT_SYNOPSIS] = (tr.sSynopsis, "", h.synopsis)
# Comment keys are matched regardless of spelling
for key, text in h.comments.items():
kind, _, name = key.partition(".")
if kind in kinds and name:
name = name.title()
lookup[key.lower()] = (f"{kinds[kind]} ({name})", name, text)
self._entries = []
for keys in self._columns:
entries = []
for key in keys:
label, short, text = lookup.get(key, ("", "", ""))
if text:
entries.append((key, label, short, nwUnicode.U_LSEP.join(t for t in text.split("\n") if t)))
self._entries.append(entries)
class OutlineModel(QAbstractTableModel):
"""Core: Outline Model Class.
A flat list of the headings of a novel, in story order.
"""
__slots__ = ("_fixed", "_headers", "_labels", "_nodes", "_styles")
C_TITLE = 0
C_COLUMNS = 1
def __init__(self) -> None:
super().__init__()
self._fixed = [trLabel(nwStdLabel.STORY)]
self._headers = self._fixed.copy()
self._labels = _TrCache(
sWords=trStats(nwLabels.STATS_NAME[nwStats.WORDS]),
sChars=trStats(nwLabels.STATS_NAME[nwStats.CHARS]),
sPage=self.tr("Page {0}"),
sSynopsis="",
sStory="",
sNote="",
sKeys={k: trConst(v) for k, v in nwLabels.KEY_NAME.items()},
)
# Colours
theme = SHARED.theme
self._styles: dict[int, NodeStyle] = {}
for key in nwStyles.H_LEVEL.values():
color = theme.getStructureColor(key)
border = QColor(color)
border.setAlphaF(0.7)
background = QColor(color)
background.setAlphaF(0.1)
highlight = QColor(color)
highlight.setAlphaF(0.2)
self._styles[key] = NodeStyle(border, background, highlight)
self._nodes: list[OutlineNode] = []
def __del__(self) -> None: # pragma: no cover
"""Class destructor."""
logger.debug("Delete: OutlineModel")
##
# Model Interface
##
def rowCount(self, parent: QModelIndex) -> int:
"""Return the number of rows."""
return 0 if parent.isValid() else len(self._nodes)
def columnCount(self, parent: QModelIndex) -> int:
"""Return the number of columns."""
return 0 if parent.isValid() else len(self._headers)
def data(self, index: QModelIndex, role: Qt.ItemDataRole) -> None:
"""Return display data for a node."""
return
def headerData(self, section: int, orientation: Qt.Orientation, role: Qt.ItemDataRole) -> str | None:
"""Return the header labels for the outline columns."""
if orientation == Qt.Orientation.Horizontal and role == QtDisplayRole:
return self._headers[section] if 0 <= section < len(self._headers) else None
return None
def flags(self, index: QModelIndex) -> Qt.ItemFlag:
"""Return flags for a node."""
return NODE_FLAGS if index.isValid() else Qt.ItemFlag.NoItemFlags
##
# Data Access
##
def node(self, index: QModelIndex) -> OutlineNode | None:
"""Return the node for a given model index."""
if index.isValid() and 0 <= (row := index.row()) < len(self._nodes):
return self._nodes[row]
return None
##
# Methods
##
def clear(self) -> None:
"""Clear the outline."""
self.beginResetModel()
self._nodes = []
self.endResetModel()
def buildOutline(
self,
index: Index,
rootHandle: str | None,
levels: set[int],
countPerPage: int = 0,
clearDouble: bool = False,
target: int = 0,
useChars: bool = False,
columns: list[tuple[str, tuple[str, ...]]] | None = None,
) -> None:
"""Rebuild the outline for the given heading levels and columns.
If count per page is set, the page and progress of each heading
is added, with partitions and chapters starting on a new page.
"""
self.beginResetModel()
columns = columns or []
keys = [k for _, k in columns]
labels = self._labels._replace(
sSynopsis=trLabel(nwStdLabel.SYNOPSIS),
sStory=trLabel(nwStdLabel.STORY_STRUCTURE),
sNote=trLabel(nwStdLabel.NOTE),
)
nodes: list[OutlineNode] = []
progress: list[tuple[OutlineNode, int, int]] = []
count = 0
pages = 0
start = 0
for tHandle, sTitle, hItem in index.iterNovelStructure(rHandle=rootHandle):
level = nwStyles.H_LEVEL.get(hItem.level, 0)
if countPerPage > 0 and level <= 2:
span = math.ceil((count - start) / countPerPage)
pages += span + span % 2 if clearDouble else span
start = count
if level in levels and not (level == 1 and hItem.modified):
style = self._styles.get(level, BLANK_STYLE)
node = OutlineNode(tHandle, sTitle, hItem, labels, style, keys)
nodes.append(node)
if countPerPage > 0:
progress.append((node, pages + 1 + (count - start) // countPerPage, count))
count += hItem.charCount if useChars else hItem.wordCount
total = max(count, target)
for node, page, before in progress:
node.setProgress(page, before / total if total else 0.0)
self._nodes = nodes
self._headers = self._fixed + [name for name, _ in columns]
self.endResetModel()

1079
novelwriter/story/outline.py Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,575 @@
"""
novelWriter - Story View Settings
=================================
This file is a part of novelWriter
Copyright (C) 2026 Veronica Berglyd Olsen and novelWriter contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
""" # noqa
from __future__ import annotations
import json
import logging
import random
import uuid
from pathlib import Path
from typing import TYPE_CHECKING, Any, NamedTuple, Self
from PyQt6.QtCore import QT_TRANSLATE_NOOP, QCoreApplication
from novelwriter.common import checkUuid, jsonEncode, safeExists
from novelwriter.constants import nwFiles, nwKeyWords
from novelwriter.enum import nwComment
from novelwriter.error import logException
from novelwriter.text.formats import MODIFIERS
if TYPE_CHECKING:
from collections.abc import Iterable
from novelwriter.core.project import NWProject
logger = logging.getLogger(__name__)
T_ViewValue = str | int | float | bool
COMMENT_SYNOPSIS = "synopsis"
MAX_COLUMN_KEYS = 5
# The Settings Template
# =====================
# Each entry contains a tuple on the form: (type, default)
# fmt: off
SETTINGS_TEMPLATE: dict[str, tuple[type, T_ViewValue]] = {
"outline.syntaxColors": (bool, False),
"outline.rowLines": (int, 3),
"outline.commentIcons": (bool, False),
"outline.referenceIcons": (bool, False),
"outline.showParts": (bool, True),
"outline.showScenes": (bool, True),
"outline.showChapters": (bool, True),
"outline.showSections": (bool, False),
"outline.showProgress": (bool, True),
"outline.countPerPage": (int, 350),
"outline.clearDoublePage": (bool, True),
"outline.useTargetCount": (bool, True),
}
SETTINGS_LABELS = {
"outline.defaultName": QT_TRANSLATE_NOOP("StoryViews", "Outline"),
"outline.grpAppearance": QT_TRANSLATE_NOOP("StoryViews", "Appearance"),
"outline.syntaxColors": QT_TRANSLATE_NOOP("StoryViews", "Use syntax colours"),
"outline.rowLines": QT_TRANSLATE_NOOP("StoryViews", "Row height"),
"outline.commentIcons": QT_TRANSLATE_NOOP("StoryViews", "Show icons for comment types"),
"outline.referenceIcons": QT_TRANSLATE_NOOP("StoryViews", "Show icons for reference types"),
"outline.grpDocuments": QT_TRANSLATE_NOOP("StoryViews", "Documents"),
"outline.showParts": QT_TRANSLATE_NOOP("StoryViews", "Show partitions"),
"outline.showChapters": QT_TRANSLATE_NOOP("StoryViews", "Show chapters"),
"outline.showScenes": QT_TRANSLATE_NOOP("StoryViews", "Show scenes"),
"outline.showSections": QT_TRANSLATE_NOOP("StoryViews", "Show sections"),
"outline.grpProgress": QT_TRANSLATE_NOOP("StoryViews", "Progression"),
"outline.showProgress": QT_TRANSLATE_NOOP("StoryViews", "Show story progression"),
"outline.countPerPage": QT_TRANSLATE_NOOP("StoryViews", "Count per page"),
"outline.clearDoublePage": QT_TRANSLATE_NOOP("StoryViews", "Clear double page"),
"outline.useTargetCount": QT_TRANSLATE_NOOP("StoryViews", "Relative to project target"),
"outline.pgColumns": QT_TRANSLATE_NOOP("StoryViews", "Columns"),
"outline.defCharacters": QT_TRANSLATE_NOOP("StoryViews", "Characters"),
"outline.defPlot": QT_TRANSLATE_NOOP("StoryViews", "Plot"),
"outline.defWorld": QT_TRANSLATE_NOOP("StoryViews", "World"),
"outline.defComments": QT_TRANSLATE_NOOP("StoryViews", "Comments"),
}
# fmt: on
def newColumnID() -> str:
"""Generate a new outline column ID."""
# We assume collisions won't happen since there will be very few
# columns, but if it happens the user will get a weird overwritten
# column bug, and should probably play the lottery
return f"{random.getrandbits(32):08x}"
def isColumnKey(key: str) -> bool:
"""Check if a key is a valid outline column key."""
if key in nwKeyWords.CAN_LOOKUP:
return True
modifier, _, name = key.partition(".")
match MODIFIERS.get(modifier):
case nwComment.SYNOPSIS:
return not name
case nwComment.STORY | nwComment.NOTE:
return bool(name)
return False
class StoryViewSettings:
"""Story: Story View Settings Class.
The settings of a single story view, packed to and from JSON.
"""
__slots__ = ("_changed", "_name", "_order", "_prefix", "_settings", "_state", "_stateChanged", "_uuid")
KIND = "none"
def __init__(self) -> None:
self._prefix = f"{self.KIND}."
self._changed = False
self._stateChanged = False
self._name = self.defaultName
self._uuid = str(uuid.uuid4())
self._order = 0
self._settings = {k: v[1] for k, v in SETTINGS_TEMPLATE.items() if k.startswith(self._prefix)}
self._state: dict[str, Any] = {}
@classmethod
def fromDict(cls, data: dict) -> StoryViewSettings | None:
"""Create a story view settings object from a dict."""
match data.get("kind"):
case "outline":
new = OutlineViewSettings()
case _:
return None
new.unpack(data)
return new
##
# Properties
##
@property
def name(self) -> str:
"""Return the story view name."""
return self._name
@property
def defaultName(self) -> str:
"""Return the story view default name."""
return QCoreApplication.translate("StoryViews", SETTINGS_LABELS.get(f"{self.KIND}.defaultName", "None"))
@property
def viewID(self) -> str:
"""Return the view ID as a UUID."""
return self._uuid
@property
def order(self) -> int:
"""Return the story view order."""
return self._order
@property
def changed(self) -> bool:
"""The changed status of the story view."""
return self._changed
@property
def stateChanged(self) -> bool:
"""The changed status of the story view state."""
return self._stateChanged
##
# Setters
##
def setName(self, name: str) -> None:
"""Set the story view display name."""
self._name = str(name)
def setViewID(self, value: str | uuid.UUID) -> None:
"""Set a UUID view ID, or generate one if invalid."""
self._uuid = checkUuid(value, "") or str(uuid.uuid4())
def setOrder(self, value: int) -> None:
"""Set the story view order."""
if isinstance(value, int):
self._order = value
def setState(self, key: str, value: Any) -> None:
"""Set a JSON compatible view state value, validated by the view."""
old = self._state.get(key)
if isinstance(value, dict) and isinstance(old, dict):
# Dict equality ignores order, which is part of the state
changed = list(value.items()) != list(old.items())
else:
changed = value != old
if changed:
self._state[key] = value
self._stateChanged = True
def setValue(self, key: str, value: T_ViewValue) -> None:
"""Set a specific value for a story view setting."""
if (d := SETTINGS_TEMPLATE.get(key)) and isinstance(value, d[0]):
self._changed |= value != self._settings[key]
self._settings[key] = value
##
# Getters
##
@staticmethod
def getLabel(key: str) -> str:
"""Extract the GUI label for a specific setting."""
return QCoreApplication.translate("StoryViews", SETTINGS_LABELS.get(key, "ERROR"))
def getState(self, key: str) -> Any:
"""Return a view state value, or None if not set."""
return self._state.get(key)
def getBool(self, key: str) -> bool:
"""Type safe value access for bools."""
value = self._settings.get(key, SETTINGS_TEMPLATE.get(key, (None, None))[1])
return bool(value)
def getInt(self, key: str) -> int:
"""Type safe value access for integers."""
value = self._settings.get(key, SETTINGS_TEMPLATE.get(key, (None, None))[1])
return int(value) if isinstance(value, int | float) else 0
##
# Methods
##
def resetChangedState(self) -> None:
"""Reset the changed status of the settings object."""
self._changed = False
self._stateChanged = False
def updateSettings(self, source: StoryViewSettings) -> None:
"""Update the name and settings values from another object."""
self._name = source.name
self._settings = source._settings.copy()
def copy(self) -> Self:
"""Return an identical copy of the settings."""
new = type(self)()
new.unpack(self.pack())
return new
def pack(self) -> dict:
"""Pack all content into a JSON compatible dictionary."""
logger.debug("Collecting story view setting for '%s'", self._name)
return {
"kind": self.KIND,
"name": self._name,
"uuid": self._uuid,
"order": self._order,
"settings": self._settings.copy(),
"state": self._state.copy(),
}
def unpack(self, data: dict) -> None:
"""Unpack a dictionary and populate the class."""
settings = data.get("settings", {})
state = data.get("state", {})
self.setName(data.get("name", ""))
self.setViewID(data.get("uuid", ""))
self.setOrder(data.get("order", 0))
self._settings = {k: v[1] for k, v in SETTINGS_TEMPLATE.items() if k.startswith(self._prefix)}
if isinstance(settings, dict):
for key, value in settings.items():
if isinstance(key, str) and key.startswith(self._prefix) and isinstance(value, T_ViewValue):
self.setValue(key, value)
self._state = state.copy() if isinstance(state, dict) else {}
self._changed = False
self._stateChanged = False
@classmethod
def duplicate(cls, source: StoryViewSettings) -> StoryViewSettings:
"""Make a copy of another story view."""
new = source.copy()
new.setViewID("")
new.setName(f"{source.name} 2")
return new
class OutlineColumn(NamedTuple):
"""Story: Outline Column."""
cid: str
name: str
keys: tuple[str, ...]
class OutlineViewSettings(StoryViewSettings):
"""Story: Outline View Settings Class."""
__slots__ = ("_columns",)
KIND = "outline"
def __init__(self) -> None:
super().__init__()
self._columns = self._defaultColumns()
##
# Properties
##
@property
def columns(self) -> list[OutlineColumn]:
"""Return the outline columns."""
return self._columns.copy()
##
# Setters
##
def setColumns(self, columns: list[OutlineColumn]) -> None:
"""Set the outline columns. A new order alone is not a change."""
columns = self._checkColumns([{"id": c.cid, "name": c.name, "keys": c.keys} for c in columns])
self._changed |= set(columns) != set(self._columns)
self._columns = columns
##
# Methods
##
def updateSettings(self, source: StoryViewSettings) -> None:
"""Update the name, settings values and outline columns."""
super().updateSettings(source)
if isinstance(source, OutlineViewSettings): # pragma: no branch
self._columns = source.columns
def pack(self) -> dict:
"""Pack all content into a JSON compatible dictionary."""
data = super().pack()
data["columns"] = [{"id": c.cid, "name": c.name, "keys": list(c.keys)} for c in self._columns]
return data
def unpack(self, data: dict) -> None:
"""Unpack a dictionary and populate the class."""
super().unpack(data)
columns = data.get("columns")
if isinstance(columns, list):
self._columns = self._checkColumns([c for c in columns if isinstance(c, dict)])
else:
self._columns = self._defaultColumns()
##
# Internal Functions
##
def _defaultColumns(self) -> list[OutlineColumn]:
"""Return the default outline columns."""
return [
OutlineColumn(
newColumnID(),
self.getLabel("outline.defCharacters"),
(nwKeyWords.POV_KEY, nwKeyWords.FOCUS_KEY, nwKeyWords.CHAR_KEY),
),
OutlineColumn(
newColumnID(),
self.getLabel("outline.defPlot"),
(nwKeyWords.PLOT_KEY, nwKeyWords.TIME_KEY),
),
OutlineColumn(
newColumnID(),
self.getLabel("outline.defWorld"),
(nwKeyWords.WORLD_KEY,),
),
OutlineColumn(
newColumnID(),
self.getLabel("outline.defComments"),
(COMMENT_SYNOPSIS,),
),
]
@staticmethod
def _checkColumns(entries: list[dict]) -> list[OutlineColumn]:
"""Return valid outline columns, with unique IDs and keys."""
columns = []
ids = set()
used = set()
for entry in entries:
cid = entry.get("id")
name = entry.get("name")
keys = entry.get("keys")
if not isinstance(name, str) or not isinstance(keys, list | tuple):
continue
if not isinstance(cid, str) or not cid or cid in ids:
cid = newColumnID()
valid = []
for key in keys:
if isinstance(key, str) and isColumnKey(key := key.lower()) and key not in used:
valid.append(key)
used.add(key)
ids.add(cid)
columns.append(OutlineColumn(cid, name, tuple(valid[:MAX_COLUMN_KEYS])))
return columns
class StoryViewCollection:
"""Story: Story View Collection Class.
All story views of a project, saved as a single JSON file.
"""
def __init__(self, project: NWProject) -> None:
self._project = project
self._lastView = ""
self._highlight = ""
self._views: dict[str, StoryViewSettings] = {}
self._unknown: dict[str, dict] = {}
self._loadCollection()
def __len__(self) -> int:
"""Return the number of story views."""
return len(self._views)
##
# Properties
##
@property
def lastView(self) -> str:
"""Return the last active view ID."""
return self._lastView
@property
def highlight(self) -> str:
"""Return the highlighted reference tag key."""
return self._highlight
##
# Getters
##
def getStoryView(self, viewID: str) -> StoryViewSettings | None:
"""Get a specific story views settings object."""
return self._views.get(viewID, None)
##
# Setters
##
def setStoryView(self, view: StoryViewSettings) -> None:
"""Set story views settings data in the collection."""
if isinstance(view, StoryViewSettings):
self._views[view.viewID] = view
self._saveCollection()
def setStoryViewsState(self, lastView: str, highlight: str, order: list[str]) -> None:
"""Set the last view, the highlight and the view order, and save
if anything changed.
"""
changed = (
lastView != self._lastView
or highlight != self._highlight
or any(v.stateChanged for v in self._views.values())
)
self._lastView = lastView
self._highlight = highlight
for i, key in enumerate(order):
if (view := self._views.get(key)) and view.order != i:
view.setOrder(i)
changed = True
if changed:
self._saveCollection()
for view in self._views.values():
view.resetChangedState()
##
# Methods
##
def removeStoryView(self, viewID: str) -> None:
"""Remove a story view from the collection."""
self._views.pop(viewID, None)
self._saveCollection()
def storyViews(self) -> Iterable[StoryViewSettings]:
"""Iterate over all available story views."""
yield from sorted(self._views.values(), key=lambda x: x.order)
##
# Internal Functions
##
def _loadCollection(self) -> bool:
"""Load story view collections file."""
viewsFile = self._project.storage.getMetaFile(nwFiles.VIEWS_FILE)
if not isinstance(viewsFile, Path):
return False
if not safeExists(viewsFile):
return True
logger.debug("Loading story views file")
try:
with open(viewsFile, mode="r", encoding="utf-8") as inFile:
data = json.load(inFile)
except Exception:
logger.error("Failed to load story views file")
logException()
return False
if not isinstance(data, dict):
logger.error("Story views file is not a JSON object")
return False
views = data.get("novelWriter.storyViews", None)
if not isinstance(views, dict):
logger.error("No novelWriter.storyViews in the story views file")
return False
for key, entry in views.items():
if key == "lastView":
self._lastView = str(entry)
elif key == "highlight":
self._highlight = str(entry)
elif isinstance(entry, dict):
if view := StoryViewSettings.fromDict(entry):
self._views[view.viewID] = view
else:
# Preserve views from newer versions
logger.warning("Unknown story view kind '%s'", entry.get("kind"))
self._unknown[key] = entry
return True
def _saveCollection(self) -> bool:
"""Save story view collections file."""
viewsFile = self._project.storage.getMetaFile(nwFiles.VIEWS_FILE)
if not isinstance(viewsFile, Path):
return False
logger.debug("Saving story views file")
try:
data: dict[str, str | dict] = {
"lastView": self._lastView,
"highlight": self._highlight,
}
data.update(self._unknown)
data.update({k: v.pack() for k, v in self._views.items()})
with open(viewsFile, mode="w+", encoding="utf-8") as outFile:
outFile.write(jsonEncode({"novelWriter.storyViews": data}, nmax=4))
except Exception:
logger.error("Failed to save story views file")
logException()
return False
return True

View File

@@ -0,0 +1,534 @@
"""
novelWriter - GUI Story View
============================
This file is a part of novelWriter
Copyright (C) 2026 Veronica Berglyd Olsen and novelWriter contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
""" # noqa
from __future__ import annotations
import csv
import logging
from enum import Enum
from typing import TYPE_CHECKING
from PyQt6.QtCore import Qt, pyqtSlot
from PyQt6.QtWidgets import QComboBox, QCompleter, QFileDialog, QHBoxLayout, QVBoxLayout, QWidget
from novelwriter import CONFIG, SHARED
from novelwriter.common import formatFileFilter
from novelwriter.constants import nwKeyWords, nwLabels, nwStats, trConst, trLabel, trStats
from novelwriter.enum import nwItemClass, nwStdLabel
from novelwriter.extensions.configlayout import NColorLabel
from novelwriter.extensions.modified import NComboBox, NIconButton, NPushButton
from novelwriter.extensions.novelselector import NovelSelector
from novelwriter.extensions.tabwidget import NTabWidget
from novelwriter.story.outline import GuiStoryOutlineView
from novelwriter.story.storysettings import OutlineViewSettings, StoryViewCollection, StoryViewSettings
from novelwriter.story.storyviewbase import GuiStorySettingsBase, GuiStoryViewBase
if TYPE_CHECKING:
from collections.abc import Iterable
from novelwriter.enum import nwChange
logger = logging.getLogger(__name__)
VIEW_CLASSES: dict[type[StoryViewSettings], type[GuiStoryViewBase]] = {
OutlineViewSettings: GuiStoryOutlineView,
}
class GuiStoryView(QWidget):
"""GUI: Project Story View."""
def __init__(self, parent: QWidget) -> None:
super().__init__(parent)
logger.debug("Create: GuiStoryView")
self._views: StoryViewCollection | None = None
self._stale: set[str] = set()
self._highlight: set[str] = set()
self._tagsRevision = -1
icnSize = SHARED.theme.baseIconSize
# Story View
self.titleLabel = NColorLabel(
self.tr("Story View"),
self,
color=SHARED.theme.helpText,
scale=NColorLabel.HEADER_SCALE,
bold=True,
)
self.novelValue = NovelSelector(self)
self.novelValue.setIncludeAll(True)
self.novelValue.setMinimumWidth(200)
self.novelValue.novelSelectionChanged.connect(self._novelValueChanged)
self.exportData = NIconButton(self, icnSize, "export:action")
self.exportData.setToolTip(self.tr("Export the story view data"))
self.exportData.clicked.connect(self._exportData)
# Manage Views
self.manageLabel = NColorLabel(
self.tr("Manage Views"),
self,
color=SHARED.theme.helpText,
scale=NColorLabel.NORMAL_SCALE,
bold=True,
)
# Tabs
self.tabMain = NTabWidget(self)
self.tabMain.setMovable(True)
self.tabMain.currentChanged.connect(self._currentViewChanged)
self.addView = NIconButton(self, icnSize, "add:add")
self.addView.setToolTip(self.tr("Add a new view"))
self.addView.clicked.connect(self._addNewView)
self.delView = NIconButton(self, icnSize, "remove:remove")
self.delView.setToolTip(self.tr("Delete current view"))
self.delView.clicked.connect(self._deleteCurrentView)
self.copyView = NIconButton(self, icnSize, "copy:action")
self.copyView.setToolTip(self.tr("Duplicate current view"))
self.copyView.clicked.connect(self._copyCurrentView)
self.editView = NIconButton(self, icnSize, "edit:change")
self.editView.setToolTip(self.tr("Edit current view"))
self.editView.clicked.connect(self._editCurrentView)
self.refreshView = NPushButton(self, self.tr("Refresh"), icnSize, "refresh:change")
self.refreshView.setToolTip(self.tr("Refresh current view"))
self.refreshView.clicked.connect(self._refreshRequested)
# Highlight
self.highlightLabel = NColorLabel(
self.tr("Highlight Reference"),
self,
color=SHARED.theme.helpText,
scale=NColorLabel.NORMAL_SCALE,
bold=True,
)
self.highlightValue = NComboBox(self)
self.highlightValue.setEditable(True)
self.highlightValue.setInsertPolicy(QComboBox.InsertPolicy.NoInsert)
self.highlightValue.setMinCharsWidth(22)
self.highlightValue.setIconSize(icnSize)
self.highlightValue.currentIndexChanged.connect(self._highlightChanged)
if view := self.highlightValue.view(): # pragma: no branch
view.setIconSize(icnSize)
if completer := self.highlightValue.completer(): # pragma: no branch
completer.setCompletionMode(QCompleter.CompletionMode.PopupCompletion)
completer.setFilterMode(Qt.MatchFlag.MatchContains)
if popup := completer.popup(): # pragma: no branch
popup.setIconSize(icnSize)
if lineEdit := self.highlightValue.lineEdit(): # pragma: no branch
lineEdit.setClearButtonEnabled(True)
lineEdit.textChanged.connect(self._highlightTextChanged)
lineEdit.editingFinished.connect(self._highlightEditingFinished)
# Assemble
self.topBox = QHBoxLayout()
self.topBox.addWidget(self.titleLabel)
self.topBox.addSpacing(8)
self.topBox.addWidget(self.novelValue)
self.topBox.addSpacing(8)
self.topBox.addWidget(self.exportData)
self.topBox.addSpacing(32)
self.topBox.addWidget(self.manageLabel)
self.topBox.addSpacing(8)
self.topBox.addWidget(self.addView)
self.topBox.addWidget(self.delView)
self.topBox.addWidget(self.copyView)
self.topBox.addWidget(self.editView)
self.topBox.addSpacing(8)
self.topBox.addWidget(self.refreshView)
self.topBox.addSpacing(32)
self.topBox.addWidget(self.highlightLabel)
self.topBox.addSpacing(8)
self.topBox.addWidget(self.highlightValue)
self.topBox.addStretch(1)
self.topBox.setContentsMargins(4, 4, 0, 0)
self.topBox.setSpacing(4)
self.outerBox = QVBoxLayout()
self.outerBox.addLayout(self.topBox)
self.outerBox.addWidget(self.tabMain)
self.outerBox.setContentsMargins(0, 0, 0, 0)
self.outerBox.setSpacing(8)
self.setLayout(self.outerBox)
self._setProjectControls(False)
logger.debug("Ready: GuiStoryView")
##
# Methods
##
def updateTheme(self) -> None:
"""Update theme elements."""
self.titleLabel.setTextColors(color=SHARED.theme.helpText)
self.manageLabel.setTextColors(color=SHARED.theme.helpText)
self.highlightLabel.setTextColors(color=SHARED.theme.helpText)
self.novelValue.updateTheme()
self.refreshView.refreshTheme()
self.exportData.refreshTheme()
self.addView.refreshTheme()
self.delView.refreshTheme()
self.copyView.refreshTheme()
self.editView.refreshTheme()
self.tabMain.refreshTheme()
if self._views is not None:
self._refreshTagList(force=True)
for view in self._iterViews():
view.updateTheme()
for dialog in self._iterSettingsDialogs():
dialog.updateTheme()
def initSettings(self) -> None:
"""Apply changes to the preferences."""
for view in self._iterViews():
view.initSettings()
def openProjectTasks(self) -> None:
"""Run open project tasks. The views are loaded in viewStory."""
self.novelValue.refreshNovelList()
self.novelValue.setHandle(SHARED.project.data.getLastHandle("story"))
self._setProjectControls(True)
def closeProjectTasks(self) -> None:
"""Run closing project tasks."""
if self._views is not None:
for widget in self._iterViews():
widget.saveViewState()
current = self.tabMain.currentWidget()
lastView = current.settings.viewID if isinstance(current, GuiStoryViewBase) else ""
highlight = next(iter(self._highlight), "")
self._views.setStoryViewsState(lastView, highlight, [v.settings.viewID for v in self._iterViews()])
while self.tabMain.count() > 0:
self._removeTab(0)
# Tabs are removed first so that saving from a dialog rebuilds nothing
self._closeSettingsDialogs()
self._views = None
self._stale.clear()
self._highlight = set()
self._tagsRevision = -1
self.highlightValue.blockSignals(True)
self.highlightValue.clear()
self.highlightValue.blockSignals(False)
# Clearing must not emit a change, as it would reset the last handle
self.novelValue.blockSignals(True)
self.novelValue.clear()
self.novelValue.blockSignals(False)
self._setProjectControls(False)
def viewStory(self) -> None:
"""Load the views if needed, and refresh the current view."""
if self._views is None and SHARED.hasProject:
self._loadViews()
self._refreshCurrentView()
##
# Public Slots
##
@pyqtSlot()
def indexHasAppeared(self) -> None:
"""Refresh the current view when the index is loaded or rebuilt."""
self._refreshCurrentView()
@pyqtSlot(str, Enum)
def updateRootItem(self, tHandle: str, change: nwChange) -> None:
"""Refresh the novel selector when a root folder changes."""
self.novelValue.refreshNovelList()
##
# Private Slots
##
@pyqtSlot(str)
def _novelValueChanged(self, tHandle: str) -> None:
"""Rebuild the current view for the newly selected novel folder."""
SHARED.project.data.setLastHandle(tHandle or None, "story")
self._refreshCurrentView()
@pyqtSlot()
def _refreshRequested(self) -> None:
"""Force a rebuild of the current view."""
self._refreshCurrentView(force=True)
@pyqtSlot(int)
def _currentViewChanged(self, index: int) -> None:
"""Refresh the view that was switched to."""
self._refreshCurrentView()
@pyqtSlot(int)
def _highlightChanged(self, index: int) -> None:
"""Highlight the selected reference in all views."""
tag = self.highlightValue.itemData(index)
self._highlight = {tag} if tag else set()
for view in self._iterViews():
view.setHighlight(self._highlight)
@pyqtSlot(str)
def _highlightTextChanged(self, text: str) -> None:
"""Clear the highlight when the text is cleared."""
if not text and self.highlightValue.currentIndex() > 0:
self.highlightValue.setCurrentIndex(0)
@pyqtSlot()
def _highlightEditingFinished(self) -> None:
"""Revert text that does not match a reference."""
combo = self.highlightValue
if combo.findText(combo.currentText()) < 0:
combo.setEditText(combo.itemText(combo.currentIndex()))
@pyqtSlot()
def _addNewView(self) -> None:
"""Add a new outline view."""
self._addView(OutlineViewSettings())
@pyqtSlot()
def _copyCurrentView(self) -> None:
"""Duplicate the current view."""
if isinstance(current := self.tabMain.currentWidget(), GuiStoryViewBase):
self._addView(StoryViewSettings.duplicate(current.settings))
@pyqtSlot()
def _deleteCurrentView(self) -> None:
"""Delete the current view."""
if (
self._views is not None
and isinstance(current := self.tabMain.currentWidget(), GuiStoryViewBase)
and SHARED.question(self.tr("Delete view '{0}'?").format(current.settings.name))
):
self._closeSettingsDialogs(current.settings.viewID)
self._views.removeStoryView(current.settings.viewID)
self._stale.discard(current.settings.viewID)
self._removeTab(self.tabMain.currentIndex())
@pyqtSlot()
def _editCurrentView(self) -> None:
"""Open or activate the settings dialog for the current view."""
if isinstance(current := self.tabMain.currentWidget(), GuiStoryViewBase) and (
dialogClass := current.settingsDialog()
):
viewID = current.settings.viewID
for dialog in self._iterSettingsDialogs():
if dialog.viewID == viewID:
dialog.activateDialog()
return
current.saveViewState()
dialog = dialogClass(SHARED.mainGui, current.settings)
dialog.newSettingsReady.connect(self._applyViewSettings)
dialog.activateDialog()
@pyqtSlot(StoryViewSettings)
def _applyViewSettings(self, settings: StoryViewSettings) -> None:
"""Save new settings from a settings dialog."""
if self._views is not None and (view := self._views.getStoryView(settings.viewID)):
rebuild = settings.changed
view.updateSettings(settings)
self._views.setStoryView(view)
for widget in self._iterViews():
if widget.settings is view:
self.tabMain.setTabText(self.tabMain.indexOf(widget), view.name)
if rebuild:
self._stale.add(view.viewID)
self._refreshCurrentView()
@pyqtSlot()
def _exportData(self) -> None:
"""Export the story outline data as a CSV file."""
name = CONFIG.lastPath("outline") / f"{SHARED.project.data.fileSafeName}.csv"
if path := QFileDialog.getSaveFileName(
self, self.tr("Save Outline As"), str(name), formatFileFilter(["*.csv", "*"])
)[0]:
CONFIG.setLastPath("outline", path)
logger.info("Writing CSV file: %s", path)
with open(path, mode="w", newline="", encoding="utf-8") as csvFile:
writer = csv.writer(csvFile, dialect="excel", quoting=csv.QUOTE_ALL)
writer.writerows(self._dumpNovelData(self.novelValue.handle))
##
# Internal Functions
##
def _loadViews(self) -> None:
"""Load the views collection and populate the tabs."""
views = StoryViewCollection(SHARED.project)
if len(views) == 0:
views.setStoryView(OutlineViewSettings())
self._views = views
self._highlight = {views.highlight} if views.highlight else set()
# The current view is refreshed by the caller, not on tab change
self.tabMain.blockSignals(True)
for view in views.storyViews():
index = self._addTab(view)
if view.viewID == views.lastView:
self.tabMain.setCurrentIndex(index)
self.tabMain.blockSignals(False)
def _addView(self, view: StoryViewSettings) -> None:
"""Add a new view to the collection, and switch to it."""
if self._views is not None:
view.setOrder(max((v.order for v in self._views.storyViews()), default=-1) + 1)
self._views.setStoryView(view)
if (index := self._addTab(view)) >= 0: # pragma: no branch
self.tabMain.setCurrentIndex(index)
def _addTab(self, view: StoryViewSettings) -> int:
"""Add a tab for a view, and return its index."""
if viewClass := VIEW_CLASSES.get(type(view)):
widget = viewClass(self, view)
widget.setHighlight(self._highlight)
return self.tabMain.addTab(widget, view.name)
return -1
def _removeTab(self, index: int) -> None:
"""Remove a tab and release its widget."""
if widget := self.tabMain.widget(index): # pragma: no branch
self.tabMain.removeTab(index)
widget.setParent(None)
def _setProjectControls(self, enabled: bool) -> None:
"""Enable or disable the controls that need an open project."""
self.exportData.setEnabled(enabled)
self.addView.setEnabled(enabled)
self.delView.setEnabled(enabled)
self.copyView.setEnabled(enabled)
self.editView.setEnabled(enabled)
self.refreshView.setEnabled(enabled)
self.highlightValue.setEnabled(enabled)
if not enabled:
self.novelValue.setEnabled(False)
def _closeSettingsDialogs(self, viewID: str | None = None) -> None:
"""Close all settings dialogs, or discard the one for a view."""
for dialog in self._iterSettingsDialogs():
if viewID is None:
dialog.close()
elif dialog.viewID == viewID:
dialog.discardAndClose()
def _iterSettingsDialogs(self) -> Iterable[GuiStorySettingsBase]:
"""Iterate over the open view settings dialogs."""
for obj in SHARED.mainGui.children():
if isinstance(obj, GuiStorySettingsBase):
yield obj
def _iterViews(self) -> Iterable[GuiStoryViewBase]:
"""Iterate over the view widgets in tab order."""
for i in range(self.tabMain.count()):
if isinstance(view := self.tabMain.widget(i), GuiStoryViewBase): # pragma: no branch
yield view
def _refreshCurrentView(self, force: bool = False) -> None:
"""Refresh the current view, if loaded and visible."""
if (
self._views is not None
and self.isVisible()
and isinstance(current := self.tabMain.currentWidget(), GuiStoryViewBase)
):
viewID = current.settings.viewID
current.refresh(self.novelValue.handle, force=force or viewID in self._stale)
self._stale.discard(viewID)
self._refreshTagList()
def _refreshTagList(self, force: bool = False) -> None:
"""Rebuild the highlight list if the index has changed."""
index = SHARED.project.index
if force or index.indexRevision != self._tagsRevision:
self._tagsRevision = index.indexRevision
current = next(iter(self._highlight), "")
combo = self.highlightValue
combo.blockSignals(True)
combo.clear()
combo.addItem("", "")
for tag, name, tClass, _, _ in sorted(index.getTagsData(), key=lambda x: x[1].lower()):
iClass = nwItemClass.__members__.get(tClass, nwItemClass.NO_CLASS)
combo.addItem(SHARED.theme.getIcon(nwLabels.CLASS_ICON[iClass]), name, tag)
combo.setCurrentData(current, "")
combo.blockSignals(False)
if combo.currentData() != current:
self._highlightChanged(combo.currentIndex())
def _dumpNovelData(self, rootHandle: str | None) -> list[list[str | int]]:
"""Dump all novel data into a table."""
project = SHARED.project
index = project.index
sLabel = trLabel(nwStdLabel.STORY_STRUCTURE)
nLabel = trLabel(nwStdLabel.NOTE)
sKeys = sorted(index.getStoryKeys())
nKeys = sorted(index.getNoteKeys())
sMatch = [f"story.{k}" for k in sKeys]
nMatch = [f"note.{k}" for k in nKeys]
sHeaders = [f"{sLabel} ({k})" for k in sKeys]
nHeaders = [f"{nLabel} ({k})" for k in nKeys]
data: list[list[str | int]] = [
[
"H",
self.tr("Title"),
self.tr("Document"),
self.tr("Line"),
self.tr("Status"),
trStats(nwLabels.STATS_NAME[nwStats.CHARS]),
trStats(nwLabels.STATS_NAME[nwStats.WORDS]),
trStats(nwLabels.STATS_NAME[nwStats.PARAGRAPHS]),
*(trConst(nwLabels.KEY_NAME[k]) for k in nwKeyWords.CAN_LOOKUP),
trLabel(nwStdLabel.SYNOPSIS),
*sHeaders,
*nHeaders,
]
]
for tHandle, _, hItem in index.iterNovelStructure(rHandle=rootHandle, activeOnly=True):
if hItem.level != "H0" and (nwItem := project.tree[tHandle]):
refs = hItem.getReferences()
comments = hItem.comments
data.append([
hItem.level,
hItem.title,
nwItem.itemName,
hItem.line,
nwItem.getImportStatus()[0],
hItem.charCount,
hItem.wordCount,
hItem.paraCount,
*(", ".join(refs[k]) for k in nwKeyWords.CAN_LOOKUP),
hItem.synopsis,
*(comments.get(k, "") for k in sMatch),
*(comments.get(k, "") for k in nMatch),
])
return data

View File

@@ -0,0 +1,360 @@
"""
novelWriter - GUI Story View Base
=================================
This file is a part of novelWriter
Copyright (C) 2026 Veronica Berglyd Olsen and novelWriter contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
""" # noqa
from __future__ import annotations
import logging
from typing import TYPE_CHECKING
from PyQt6.QtCore import QEvent, pyqtSignal, pyqtSlot
from PyQt6.QtWidgets import (
QAbstractButton,
QDialogButtonBox,
QHBoxLayout,
QLabel,
QLineEdit,
QStackedWidget,
QVBoxLayout,
QWidget,
)
from novelwriter import SHARED
from novelwriter.common import simplified
from novelwriter.enum import nwStandardButton
from novelwriter.extensions.configlayout import NColorLabel, NScrollableForm
from novelwriter.extensions.modified import NToolDialog
from novelwriter.extensions.pagedsidebar import NPagedSideBar
from novelwriter.story.storysettings import StoryViewSettings
from novelwriter.types import QtRoleAccept, QtRoleDestruct
if TYPE_CHECKING:
from novelwriter.guimain import GuiMain
logger = logging.getLogger(__name__)
class GuiStoryViewBase(QWidget):
"""GUI: Story View Base Class.
The base class for the views on the Story View tabs. Subclasses add
their content to the outer layout and implement refresh.
"""
def __init__(self, parent: QWidget, settings: StoryViewSettings) -> None:
super().__init__(parent)
self._settings = settings
self.outerBox = QVBoxLayout()
self.outerBox.setContentsMargins(0, 0, 0, 0)
self.outerBox.setSpacing(0)
self.setLayout(self.outerBox)
##
# Properties
##
@property
def settings(self) -> StoryViewSettings:
"""Return the view settings object."""
return self._settings
##
# Methods
##
def updateTheme(self) -> None:
"""Update theme elements."""
def initSettings(self) -> None:
"""Apply changes to the preferences."""
def refresh(self, rootHandle: str | None, force: bool = False) -> None:
"""Refresh the view content."""
def saveViewState(self) -> None:
"""Save the view state to the settings object."""
def setHighlight(self, tags: set[str]) -> None:
"""Set the reference tag keys to highlight."""
def settingsDialog(self) -> type[GuiStorySettingsBase] | None:
"""Return the settings dialog class of the view, if any."""
return None
class GuiStorySettingsBase(NToolDialog):
"""GUI: Story View Settings Dialog Base.
Subclasses build the settings form with section identifiers from
FORM_SECTION and up, and can add pages with identifiers below it.
"""
FORM_SECTION = 10
newSettingsReady = pyqtSignal(StoryViewSettings)
def __init__(self, parent: GuiMain, settings: StoryViewSettings) -> None:
super().__init__(parent)
logger.debug("Create: GuiStorySettings")
self.setObjectName("GuiStorySettings")
self._settings = settings.copy()
self._savedName = settings.name
self._discard = False
self._pages: dict[int, QWidget] = {}
self._before: list[tuple[int, str]] = []
self._after: list[tuple[int, str]] = []
self._beforeLabel = ""
self._afterLabel = ""
options = SHARED.project.options
self.setMinimumSize(600, 400)
self.resize(
options.getInt("GuiStorySettings", "winWidth", 650),
options.getInt("GuiStorySettings", "winHeight", 550),
)
# Title
self.titleLabel = NColorLabel(
"Title",
self,
color=SHARED.theme.helpText,
scale=NColorLabel.HEADER_SCALE,
indent=4,
)
# Settings Name
self.nameLabel = QLabel(self.tr("Name"), self)
self.viewName = QLineEdit(self)
self.viewName.setText(self._settings.name)
# SideBar
self.sidebar = NPagedSideBar(self)
self.sidebar.setLabelColor(SHARED.theme.helpText)
# Settings Form
self.form = NScrollableForm(self)
self.sidebar.buttonClicked.connect(self._stackPageSelected)
# Content
self.toolStack = QStackedWidget(self)
# Buttons
self.btnSave = SHARED.theme.getStandardButton(nwStandardButton.SAVE, self)
self.btnClose = SHARED.theme.getStandardButton(nwStandardButton.CLOSE, self)
self.btnBox = QDialogButtonBox(self)
self.btnBox.addButton(self.btnSave, QtRoleAccept)
self.btnBox.addButton(self.btnClose, QtRoleDestruct)
self.btnBox.clicked.connect(self._dialogButtonClicked)
# Assemble
self.topBox = QHBoxLayout()
self.topBox.addWidget(self.titleLabel)
self.topBox.addStretch(1)
self.topBox.addWidget(self.nameLabel)
self.topBox.addWidget(self.viewName, 1)
self.mainBox = QHBoxLayout()
self.mainBox.addWidget(self.sidebar)
self.mainBox.addWidget(self.toolStack)
self.mainBox.setContentsMargins(0, 0, 0, 0)
self.outerBox = QVBoxLayout()
self.outerBox.addLayout(self.topBox)
self.outerBox.addLayout(self.mainBox)
self.outerBox.addWidget(self.btnBox)
self.outerBox.setSpacing(12)
self.setLayout(self.outerBox)
self._buildContent()
self.loadSettings()
self.updateTheme(init=True)
logger.debug("Ready: GuiStorySettings")
def __del__(self) -> None: # pragma: no cover
"""Class destructor."""
logger.debug("Delete: GuiStorySettings")
def updateTheme(self, *, init: bool = False) -> None:
"""Update theme elements."""
logger.debug("Theme Update: GuiStorySettings")
if not init:
self.btnSave.refreshTheme()
self.btnClose.refreshTheme()
self.titleLabel.setTextColors(color=SHARED.theme.helpText)
self.sidebar.setLabelColor(SHARED.theme.helpText)
def discardAndClose(self) -> None:
"""Close the dialog without saving or asking to save changes."""
self._discard = True
self.close()
##
# Properties
##
@property
def viewID(self) -> str:
"""Return the view ID of the settings being edited."""
return self._settings.viewID
##
# Setters
##
def setTitle(self, title: str) -> None:
"""Set the dialog title."""
self.setWindowTitle(title)
self.titleLabel.setText(title)
self.sidebar.setAccessibleName(title)
##
# Methods
##
def addPage(self, page: QWidget, title: str, pageId: int, after: bool = False) -> None:
"""Add a page before or after the settings form."""
self._pages[pageId] = page
if after:
self._after.append((pageId, title))
else:
self._before.append((pageId, title))
def setPageLabel(self, label: str, after: bool = False) -> None:
"""Set a sidebar label above the pages before or after the form."""
if after:
self._afterLabel = label
else:
self._beforeLabel = label
##
# Overload
##
def buildPages(self) -> None:
"""Overload this to add pages with addPage."""
def buildForm(self) -> None:
"""Overload this to build the form."""
def loadSettings(self) -> None:
"""Overload this to load settings."""
def saveSettings(self) -> None:
"""Overload this to save settings."""
##
# Events
##
def closeEvent(self, event: QEvent) -> None:
"""Apply changes and ask to save them when closing."""
logger.debug("Closing: GuiStorySettings")
if not self._discard:
self._applyChanges()
self._askToSave()
self._saveWindowState()
event.accept()
self.softDelete()
##
# Private Slots
##
@pyqtSlot("QAbstractButton*")
def _dialogButtonClicked(self, button: QAbstractButton) -> None:
"""Handle button clicks from the dialog button box."""
if button == self.btnSave:
self._applyChanges()
self._emitSettings()
self.close()
elif button == self.btnClose:
self.close()
else: # pragma: no cover
pass
@pyqtSlot(int)
def _stackPageSelected(self, pageId: int) -> None:
"""Switch to the page, or scroll to the form section."""
if page := self._pages.get(pageId):
self.toolStack.setCurrentWidget(page)
else:
self.toolStack.setCurrentWidget(self.form)
self.form.scrollToSection(pageId)
##
# Internal Functions
##
def _buildContent(self) -> None:
"""Build the pages and the form, in sidebar order."""
self.buildPages()
if self._before and self._beforeLabel:
self.sidebar.addLabel(self._beforeLabel)
for pageId, title in self._before:
self.sidebar.addButton(title, pageId)
self.toolStack.addWidget(self._pages[pageId])
self.buildForm()
self.toolStack.addWidget(self.form)
if self._after and self._afterLabel:
self.sidebar.addLabel(self._afterLabel)
for pageId, title in self._after:
self.sidebar.addButton(title, pageId)
self.toolStack.addWidget(self._pages[pageId])
if self._before:
self.sidebar.setSelected(self._before[0][0])
def _askToSave(self) -> None:
"""Ask to save unsaved changes, if any."""
if self._settings.changed:
if SHARED.question(self.tr("Do you want to save your changes to '{0}'?").format(self._settings.name)):
self._emitSettings()
self._settings.resetChangedState()
elif self._settings.name != self._savedName:
# A rename does not need a rebuild, so save it without asking
self._emitSettings()
def _saveWindowState(self) -> None:
"""Save the dialog window size."""
logger.debug("Saving State: GuiStorySettings")
options = SHARED.project.options
options.setValue("GuiStorySettings", "winWidth", self.width())
options.setValue("GuiStorySettings", "winHeight", self.height())
options.saveSettings()
def _applyChanges(self) -> None:
"""Apply the name and the form values to the settings."""
self._settings.setName(simplified(self.viewName.text()) or self._settings.defaultName)
self.saveSettings()
def _emitSettings(self) -> None:
"""Emit the settings and reset the changed state."""
self._savedName = self._settings.name
self.newSettingsReady.emit(self._settings)
self._settings.resetChangedState()

View File

@@ -50,10 +50,14 @@ def preProcessText(text: str, keepHeaders: bool = True) -> list[str]:
for line in text.splitlines():
line = line.rstrip()
if line:
if line[0] in ignore:
if line[0] in ignore and line[:3] != "#. ":
continue
if line[0] == ">":
line = line.lstrip(">").lstrip(" ")
elif line[:2] == "* ":
line = line[2:]
elif line[:3] == "#. ":
line = line[3:]
if line: # Above block can return empty line (Issue #1816)
if line[-1] == "<":
line = line.rstrip("<").rstrip(" ")

View File

@@ -1,6 +1,6 @@
"""
novelWriter - Text Comments
===========================
novelWriter - Text Formats
==========================
This file is a part of novelWriter
Copyright (C) 2025 Veronica Berglyd Olsen and novelWriter contributors
@@ -67,20 +67,20 @@ def processComment(text: str) -> tuple[nwComment, str, str, int, int]:
return nwComment.PLAIN, "", check, 0, 0
def processHeading(line: str) -> tuple[str, str]:
def processHeading(line: str) -> tuple[str, str, bool]:
"""Split a heading into its heading level and text value."""
if line.startswith("# "):
return "H1", line[2:].strip()
return "H1", line[2:].strip(), False
elif line.startswith("## "):
return "H2", line[3:].strip()
return "H2", line[3:].strip(), False
elif line.startswith("### "):
return "H3", line[4:].strip()
return "H3", line[4:].strip(), False
elif line.startswith("#### "):
return "H4", line[5:].strip()
return "H4", line[5:].strip(), False
elif line.startswith("#! "):
return "H1", line[3:].strip()
return "H1", line[3:].strip(), True
elif line.startswith("##! "):
return "H2", line[4:].strip()
return "H2", line[4:].strip(), True
elif line.startswith("###! "):
return "H3", line[5:].strip()
return "H0", ""
return "H3", line[5:].strip(), True
return "H0", "", False

View File

@@ -42,6 +42,7 @@ class RegExPatterns:
_rxBold2 = re.compile(nwRegEx.FMT_B2)
_rxStrike = re.compile(nwRegEx.FMT_ST)
_rxMark = re.compile(nwRegEx.FMT_HL)
_rxLink = re.compile(nwRegEx.FMT_LN)
_rxSCPlain = re.compile(nwRegEx.FMT_SC)
_rxSCValue = re.compile(nwRegEx.FMT_SV)
@@ -80,6 +81,11 @@ class RegExPatterns:
"""Markdown highlight style."""
return self._rxMark
@property
def markdownLink(self) -> re.Pattern:
"""Markdown link style."""
return self._rxLink
@property
def shortcodePlain(self) -> re.Pattern:
"""Plain shortcode style."""

View File

@@ -1,506 +0,0 @@
"""
novelWriter - GUI Novel Info
============================
This file is a part of novelWriter
Copyright (C) 2024 Veronica Berglyd Olsen and novelWriter contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
""" # noqa
from __future__ import annotations
import logging
import math
from typing import TYPE_CHECKING
from PyQt6.QtCore import pyqtSlot
from PyQt6.QtWidgets import (
QAbstractItemView,
QDialogButtonBox,
QFormLayout,
QGridLayout,
QHBoxLayout,
QLabel,
QSpinBox,
QStackedWidget,
QTreeWidget,
QTreeWidgetItem,
QVBoxLayout,
QWidget,
)
from novelwriter import SHARED
from novelwriter.common import formatPercent, formatTime, numberToRoman
from novelwriter.enum import nwStandardButton
from novelwriter.extensions.configlayout import NColorLabel, NFixedPage, NScrollablePage
from novelwriter.extensions.modified import NNonBlockingDialog
from novelwriter.extensions.novelselector import NovelSelector
from novelwriter.extensions.pagedsidebar import NPagedSideBar
from novelwriter.extensions.switch import NSwitch
from novelwriter.types import QtAlignRight, QtDecorationRole, QtFontSemiBold, QtRoleDestruct
if TYPE_CHECKING:
from PyQt6.QtGui import QCloseEvent
logger = logging.getLogger(__name__)
class GuiNovelDetails(NNonBlockingDialog):
"""GUI: Novel Details Tool."""
PAGE_OVERVIEW = 1
PAGE_CONTENTS = 2
def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent)
logger.debug("Create: GuiNovelDetails")
self.setObjectName("GuiNovelDetails")
self.setWindowTitle(self.tr("Novel Details"))
options = SHARED.project.options
self.setMinimumSize(500, 400)
self.resize(
options.getInt("GuiNovelDetails", "winWidth", 650),
options.getInt("GuiNovelDetails", "winHeight", 500),
)
# Title
self.titleLabel = NColorLabel(
self.tr("Novel Details"),
self,
color=SHARED.theme.helpText,
scale=NColorLabel.HEADER_SCALE,
indent=4,
)
# Novel Selector
self.novelSelector = NovelSelector(self)
self.novelSelector.refreshNovelList()
self.novelSelector.setHandle(
options.getString("GuiNovelDetails", "novelRoot", self.novelSelector.firstHandle or "")
)
# SideBar
self.sidebar = NPagedSideBar(self)
self.sidebar.setLabelColor(SHARED.theme.helpText)
self.sidebar.setAccessibleName(self.titleLabel.text())
self.sidebar.addButton(self.tr("Overview"), self.PAGE_OVERVIEW)
self.sidebar.addButton(self.tr("Contents"), self.PAGE_CONTENTS)
self.sidebar.setSelected(self.PAGE_OVERVIEW)
self.sidebar.buttonClicked.connect(self._sidebarClicked)
# Content
self.overviewPage = _OverviewPage(self)
self.contentsPage = _ContentsPage(self)
self.mainStack = QStackedWidget(self)
self.mainStack.addWidget(self.overviewPage)
self.mainStack.addWidget(self.contentsPage)
# Buttons
self.btnClose = SHARED.theme.getStandardButton(nwStandardButton.CLOSE, self)
self.btnClose.clicked.connect(self.closeDialog)
self.btnBox = QDialogButtonBox(self)
self.btnBox.addButton(self.btnClose, QtRoleDestruct)
# Assemble
self.topBox = QHBoxLayout()
self.topBox.addWidget(self.titleLabel)
self.topBox.addStretch(1)
self.topBox.addWidget(self.novelSelector, 1)
self.mainBox = QHBoxLayout()
self.mainBox.addWidget(self.sidebar)
self.mainBox.addWidget(self.mainStack)
self.mainBox.setContentsMargins(0, 0, 0, 0)
self.outerBox = QVBoxLayout()
self.outerBox.addLayout(self.topBox)
self.outerBox.addLayout(self.mainBox)
self.outerBox.addWidget(self.btnBox)
self.outerBox.setSpacing(8)
self.setLayout(self.outerBox)
self.setSizeGripEnabled(True)
# Connect Signals
self.novelSelector.novelSelectionChanged.connect(self.overviewPage.novelValueChanged)
self.novelSelector.novelSelectionChanged.connect(self.contentsPage.novelValueChanged)
logger.debug("Ready: GuiNovelDetails")
def __del__(self) -> None: # pragma: no cover
"""Class destructor."""
logger.debug("Delete: GuiNovelDetails")
##
# Methods
##
def updateValues(self) -> None:
"""Load the dialogs initial values."""
if handle := self.novelSelector.handle:
self.overviewPage.updateProjectData()
self.overviewPage.novelValueChanged(handle)
self.contentsPage.novelValueChanged(handle)
##
# Events
##
def closeEvent(self, event: QCloseEvent) -> None:
"""Capture the user closing the window and save settings."""
self._saveSettings()
event.accept()
self.softDelete()
##
# Private Slots
##
@pyqtSlot(int)
def _sidebarClicked(self, pageId: int) -> None:
"""Process a user request to switch page."""
if pageId == self.PAGE_OVERVIEW:
self.mainStack.setCurrentWidget(self.overviewPage)
elif pageId == self.PAGE_CONTENTS:
self.mainStack.setCurrentWidget(self.contentsPage)
##
# Internal Functions
##
def _saveSettings(self) -> None:
"""Save the user GUI settings."""
logger.debug("Saving State: GuiNovelDetails")
novelRoot = self.novelSelector.handle
options = SHARED.project.options
options.setValue("GuiNovelDetails", "winWidth", self.width())
options.setValue("GuiNovelDetails", "winHeight", self.height())
options.setValue("GuiNovelDetails", "novelRoot", novelRoot)
self.contentsPage.saveSettings()
class _OverviewPage(NScrollablePage):
def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent)
# Project Info
self.projLabel = NColorLabel(
self.tr("Project"), self, color=SHARED.theme.helpText, scale=NColorLabel.HEADER_SCALE
)
self.projName = QLabel("", self)
self.projWords = QLabel("", self)
self.projNovels = QLabel("", self)
self.projNotes = QLabel("", self)
self.projRevisions = QLabel("", self)
self.projEditTime = QLabel("", self)
self.projForm = QFormLayout()
self.projForm.addRow(self.tr("Name"), self.projName)
self.projForm.addRow(self.tr("Revisions"), self.projRevisions)
self.projForm.addRow(self.tr("Editing Time"), self.projEditTime)
self.projForm.addRow(self.tr("Word Count"), self.projWords)
self.projForm.addRow(f"\u2026 {self.tr('In Novels')}", self.projNovels)
self.projForm.addRow(f"\u2026 {self.tr('In Notes')}", self.projNotes)
self.projForm.setContentsMargins(8, 0, 0, 0)
self.projForm.setHorizontalSpacing(24)
self.projForm.setVerticalSpacing(4)
# Novel Info
self.novelLabel = NColorLabel(
self.tr("Selected Novel"),
self,
color=SHARED.theme.helpText,
scale=NColorLabel.HEADER_SCALE,
)
self.novelName = QLabel("", self)
self.novelWords = QLabel("", self)
self.novelChapters = QLabel("", self)
self.novelScenes = QLabel("", self)
self.novelForm = QFormLayout()
self.novelForm.addRow(self.tr("Name"), self.novelName)
self.novelForm.addRow(self.tr("Word Count"), self.novelWords)
self.novelForm.addRow(self.tr("Chapters"), self.novelChapters)
self.novelForm.addRow(self.tr("Scenes"), self.novelScenes)
self.novelForm.setContentsMargins(8, 0, 0, 0)
self.novelForm.setHorizontalSpacing(24)
self.novelForm.setVerticalSpacing(4)
# Assemble
self.outerBox = QVBoxLayout()
self.outerBox.addWidget(self.projLabel)
self.outerBox.addLayout(self.projForm)
self.outerBox.addWidget(self.novelLabel)
self.outerBox.addLayout(self.novelForm)
self.outerBox.setSpacing(16)
self.outerBox.addStretch(1)
self.setCentralLayout(self.outerBox)
##
# Methods
##
def updateProjectData(self) -> None:
"""Load information about the project."""
project = SHARED.project
project.updateCounts()
wcNovel, wcNotes, _, _ = project.data.currCounts
self.projName.setText(project.data.name)
self.projRevisions.setText(f"{project.data.saveCount:n}")
self.projEditTime.setText(formatTime(project.currentEditTime))
self.projWords.setText(f"{wcNovel + wcNotes:n}")
self.projNovels.setText(f"{wcNovel:n}")
self.projNotes.setText(f"{wcNotes:n}")
##
# Public Slots
##
@pyqtSlot(str)
def novelValueChanged(self, tHandle: str) -> None:
"""Refresh the data for the selected novel."""
project = SHARED.project
if nwItem := project.tree[tHandle]:
self.novelName.setText(nwItem.itemName)
nwCount = project.index.getNovelWordCount(rootHandle=tHandle)
self.novelWords.setText(f"{nwCount:n}")
hCounts = project.index.getNovelTitleCounts(rootHandle=tHandle)
self.novelChapters.setText(f"{hCounts[2]:n}")
self.novelScenes.setText(f"{hCounts[3]:n}")
class _ContentsPage(NFixedPage):
C_TITLE = 0
C_WORDS = 1
C_PAGES = 2
C_PAGE = 3
C_PROG = 4
def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent)
self._data = []
self._currentRoot = None
iPx = SHARED.theme.baseIconHeight
iSz = SHARED.theme.baseIconSize
options = SHARED.project.options
# Title
self.contentLabel = NColorLabel(
self.tr("Table of Contents"),
self,
color=SHARED.theme.helpText,
scale=NColorLabel.HEADER_SCALE,
)
# Contents Tree
self.tocTree = QTreeWidget(self)
self.tocTree.setIconSize(iSz)
self.tocTree.setIndentation(0)
self.tocTree.setColumnCount(6)
self.tocTree.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection)
self.tocTree.setHeaderLabels([
self.tr("Title"),
self.tr("Words"),
self.tr("Pages"),
self.tr("Page"),
self.tr("Progress"),
"",
])
treeHeadItem = self.tocTree.headerItem()
if treeHeadItem: # pragma: no branch
treeHeadItem.setTextAlignment(self.C_WORDS, QtAlignRight)
treeHeadItem.setTextAlignment(self.C_PAGES, QtAlignRight)
treeHeadItem.setTextAlignment(self.C_PAGE, QtAlignRight)
treeHeadItem.setTextAlignment(self.C_PROG, QtAlignRight)
if header := self.tocTree.header(): # pragma: no branch
header.setStretchLastSection(True)
header.setMinimumSectionSize(12)
wCol0 = options.getInt("GuiNovelDetails", "widthCol0", 200)
wCol1 = options.getInt("GuiNovelDetails", "widthCol1", 60)
wCol2 = options.getInt("GuiNovelDetails", "widthCol2", 60)
wCol3 = options.getInt("GuiNovelDetails", "widthCol3", 60)
wCol4 = options.getInt("GuiNovelDetails", "widthCol4", 90)
self.tocTree.setColumnWidth(0, wCol0)
self.tocTree.setColumnWidth(1, wCol1)
self.tocTree.setColumnWidth(2, wCol2)
self.tocTree.setColumnWidth(3, wCol3)
self.tocTree.setColumnWidth(4, wCol4)
self.tocTree.setColumnWidth(5, 12)
# Options
wordsPerPage = options.getInt("GuiNovelDetails", "wordsPerPage", 350)
countFrom = options.getInt("GuiNovelDetails", "countFrom", 1)
clearDouble = options.getBool("GuiNovelDetails", "clearDouble", True)
self.wpValue = QSpinBox(self)
self.wpValue.setMinimum(10)
self.wpValue.setMaximum(1000)
self.wpValue.setSingleStep(10)
self.wpValue.setValue(wordsPerPage)
self.wpValue.valueChanged.connect(self._populateTree)
self.wpLabel = QLabel(self.tr("Words per page"), self)
self.wpLabel.setBuddy(self.wpValue)
self.poValue = QSpinBox(self)
self.poValue.setMinimum(1)
self.poValue.setMaximum(9999)
self.poValue.setSingleStep(1)
self.poValue.setValue(countFrom)
self.poValue.valueChanged.connect(self._populateTree)
self.poLabel = QLabel(self.tr("First page offset"), self)
self.poLabel.setBuddy(self.poValue)
self.dblValue = NSwitch(self, height=iPx)
self.dblValue.setChecked(clearDouble)
self.dblValue.clicked.connect(self._populateTree)
self.dblLabel = QLabel(self.tr("Chapters on odd pages"), self)
self.dblLabel.setBuddy(self.dblValue)
self.optionsBox = QGridLayout()
self.optionsBox.addWidget(self.wpLabel, 0, 0)
self.optionsBox.addWidget(self.wpValue, 0, 1)
self.optionsBox.addWidget(self.dblLabel, 0, 3)
self.optionsBox.addWidget(self.dblValue, 0, 4)
self.optionsBox.addWidget(self.poLabel, 1, 0)
self.optionsBox.addWidget(self.poValue, 1, 1)
self.optionsBox.setHorizontalSpacing(12)
self.optionsBox.setVerticalSpacing(4)
self.optionsBox.setColumnStretch(2, 1)
# Assemble
self.outerBox = QVBoxLayout()
self.outerBox.addWidget(self.contentLabel)
self.outerBox.addWidget(self.tocTree)
self.outerBox.addLayout(self.optionsBox)
self.setCentralLayout(self.outerBox)
def saveSettings(self) -> None:
"""Save the user GUI settings."""
options = SHARED.project.options
options.setValue("GuiNovelDetails", "widthCol0", self.tocTree.columnWidth(0))
options.setValue("GuiNovelDetails", "widthCol1", self.tocTree.columnWidth(1))
options.setValue("GuiNovelDetails", "widthCol2", self.tocTree.columnWidth(2))
options.setValue("GuiNovelDetails", "widthCol3", self.tocTree.columnWidth(3))
options.setValue("GuiNovelDetails", "widthCol4", self.tocTree.columnWidth(4))
options.setValue("GuiNovelDetails", "wordsPerPage", self.wpValue.value())
options.setValue("GuiNovelDetails", "countFrom", self.poValue.value())
options.setValue("GuiNovelDetails", "clearDouble", self.dblValue.isChecked())
##
# Public Slots
##
@pyqtSlot(str)
def novelValueChanged(self, tHandle: str) -> None:
"""Refresh the tree with another root item."""
if tHandle != self._currentRoot:
self._prepareData(tHandle)
self._populateTree()
self._currentRoot = tHandle
##
# Private Slots
##
@pyqtSlot()
def _populateTree(self) -> None:
"""Set the content of the chapter/page tree."""
dblPages = self.dblValue.isChecked()
wpPage = self.wpValue.value()
fstPage = self.poValue.value() - 1
pTotal = 0
tPages = 1
entries = []
for _, tLevel, tTitle, wCount in self._data:
pCount = math.ceil(wCount / wpPage)
if dblPages:
pCount += pCount % 2
pTotal += pCount
entries.append((tLevel, tTitle, wCount, pCount))
pMax = pTotal - fstPage
self.tocTree.clear()
for tLevel, tTitle, wCount, pCount in entries:
newItem = QTreeWidgetItem()
if tPages <= fstPage:
progPage = numberToRoman(tPages, True)
progText = ""
else:
cPage = tPages - fstPage
progPage = f"{cPage:n}"
progText = formatPercent(cPage - 1, divisor=pMax, prec=1)
hDec = SHARED.theme.getHeaderDecoration(tLevel)
if tTitle.strip() == "":
tTitle = self.tr("Untitled")
newItem.setData(self.C_TITLE, QtDecorationRole, hDec)
newItem.setText(self.C_TITLE, tTitle)
newItem.setText(self.C_WORDS, f"{wCount:n}")
newItem.setText(self.C_PAGES, f"{pCount:n}")
newItem.setText(self.C_PAGE, progPage)
newItem.setText(self.C_PROG, progText)
newItem.setTextAlignment(self.C_WORDS, QtAlignRight)
newItem.setTextAlignment(self.C_PAGES, QtAlignRight)
newItem.setTextAlignment(self.C_PAGE, QtAlignRight)
newItem.setTextAlignment(self.C_PROG, QtAlignRight)
# Make pages and titles/partitions stand out
if tLevel < 2:
bFont = newItem.font(self.C_TITLE)
if tLevel == 0:
bFont.setItalic(True)
else:
bFont.setWeight(QtFontSemiBold)
bFont.setUnderline(True)
newItem.setFont(self.C_TITLE, bFont)
tPages += pCount
self.tocTree.addTopLevelItem(newItem)
##
# Internal Functions
##
def _prepareData(self, rootHandle: str | None) -> None:
"""Extract the information from the project index."""
logger.debug("Populating ToC from handle '%s'", rootHandle)
self._data = SHARED.project.index.getTableOfContents(rootHandle, 2)
self._data.append(("", 0, self.tr("END"), 0))

View File

@@ -194,6 +194,7 @@ QtSizeMinimumExpanding = QSizePolicy.Policy.MinimumExpanding
QtHeaderStretch = QHeaderView.ResizeMode.Stretch
QtHeaderToContents = QHeaderView.ResizeMode.ResizeToContents
QtHeaderFixed = QHeaderView.ResizeMode.Fixed
QtHeaderInteractive = QHeaderView.ResizeMode.Interactive
# Scroll Bar Policy

View File

@@ -2,300 +2,9 @@
"""
novelWriter - Packaging Utils
=============================
This file is a part of novelWriter
Copyright (C) 2019 Veronica Berglyd Olsen and novelWriter contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
""" # noqa
from __future__ import annotations
import argparse
import datetime
import shutil
import sys
import utils.assets
import utils.build_appimage
import utils.build_binary
import utils.build_debian
import utils.build_flatpak
import utils.build_pypi
import utils.build_windows
import utils.docs
import utils.icon_themes
from utils.common import (
ROOT_DIR,
SETUP_DIR,
extractReqs,
extractVersion,
isStableVersion,
log,
readFile,
stripVersion,
writeFile,
)
OS_LINUX = sys.platform.startswith("linux")
OS_DARWIN = sys.platform.startswith("darwin")
OS_WIN = sys.platform.startswith("win32")
def printVersion(args: argparse.Namespace) -> None:
"""Print the novelWriter version and exit."""
print(extractVersion(beQuiet=True)[0], end=None)
def printChannel(args: argparse.Namespace) -> None:
"""Print 'stable' or 'pre' depending on the release channel, and exit."""
print("stable" if isStableVersion() else "pre", end=None)
def cleanBuildDirs(args: argparse.Namespace) -> None:
"""Recursively delete the 'build' and 'dist' folders."""
log("")
log("[b]Cleaning up build environment ...[e]")
log("")
folders = [
ROOT_DIR / ".flatpak-builder",
ROOT_DIR / "build_bin",
ROOT_DIR / "build",
ROOT_DIR / "dist_appimage",
ROOT_DIR / "dist_bin",
ROOT_DIR / "dist_deb",
ROOT_DIR / "dist_doc",
ROOT_DIR / "dist_flathub",
ROOT_DIR / "dist_flatpak",
ROOT_DIR / "dist_pypi",
ROOT_DIR / "dist",
ROOT_DIR / "novelWriter.egg-info",
]
for folder in folders:
if folder.is_dir():
try:
shutil.rmtree(folder)
log(f"[cg]Deleted:[e] {folder}")
except OSError:
log(f"[cr]Failed:[e] {folder}")
else:
log(f"[cy]Missing:[e] {folder}")
log("")
def genMacOSPlist(args: argparse.Namespace) -> None:
"""Set necessary values for .plist file for MacOS build."""
outDir = SETUP_DIR / "macos"
numVers = stripVersion(extractVersion()[0])
copyrightYear = datetime.datetime.now().year
# These keys are no longer used but are present for compatibility
pkgVersMaj, pkgVersMin = numVers.split(".")[:2]
plistXML = readFile(outDir / "Info.plist.template").format(
macosBundleSVers=numVers,
macosBundleVers=numVers,
macosBundleVersMajor=pkgVersMaj,
macosBundleVersMinor=pkgVersMin,
macosBundleCopyright=f"Copyright {copyrightYear}, Veronica Berglyd Olsen",
)
log(f"[b]Writing Info.plist to {outDir}/Info.plist[e]")
writeFile(outDir / "Info.plist", plistXML)
def genReqFiles(args: argparse.Namespace) -> None:
"""Generate requirements.txt file from pyproject.toml."""
select = [s.strip().lower() for s in args.groups] if args.groups else ["app"]
(ROOT_DIR / "requirements.txt").write_text("\n".join(extractReqs(select)), encoding="utf-8")
import utils.main
if __name__ == "__main__":
"""Parse command line options and run the commands."""
parser = argparse.ArgumentParser(
usage="pkgutils.py [command] [--flags]",
description=(
"This tool provides setup and build commands for installing or distributing "
"novelWriter as a package on Linux, Mac and Windows, as well as developer tools "
"for internationalisation."
),
)
parsers = parser.add_subparsers()
# Version
cmdVersion = parsers.add_parser("version", help="Print the novelWriter version.")
cmdVersion.set_defaults(func=printVersion)
# Release Channel
cmdChannel = parsers.add_parser("channel", help="Print 'stable' or 'pre' depending on the release channel.")
cmdChannel.set_defaults(func=printChannel)
# Additional Builds
# =================
# Build Icons
styles = ", ".join(["all", "default", "optional", "free", "non_free", *utils.icon_themes.ICON_SOURCES.keys()])
cmdIcons = parsers.add_parser("icons", help="Build icon theme files from upstream sources.")
cmdIcons.add_argument("style", help=f"What icon style to build: {styles}")
cmdIcons.add_argument("--work-dir", help="Working directory.", default="build_icons")
cmdIcons.set_defaults(func=utils.icon_themes.main)
# Import Translations
cmdImportTS = parsers.add_parser("qtlimport", help="Import updated i18n files from a Crowdin zip file.")
cmdImportTS.add_argument("file", help="Path to zip file from Crowdin")
cmdImportTS.add_argument("--threshold", type=float, default=75.0, help="Minimum translation percentage.")
cmdImportTS.add_argument("--credits-since", metavar="DATE", help="Print translator credits since DATE.")
cmdImportTS.set_defaults(func=utils.assets.importI18nUpdates)
# Update i18n Sources
cmdUpdateTS = parsers.add_parser(
"qtlupdate",
help=(
"Update translation files for internationalisation. "
"The files to be updated must be provided as arguments. "
"New files can be created by giving a 'nw_<lang>.ts' file name "
"where <lang> is a valid language code."
),
)
cmdUpdateTS.add_argument("files", nargs="+")
cmdUpdateTS.set_defaults(func=utils.assets.updateTranslationSources)
# Build i18n Files
cmdBuildQM = parsers.add_parser("qtlrelease", help="Build the language files for internationalisation.")
cmdBuildQM.set_defaults(func=utils.assets.buildTranslationAssets)
# Update Docs i18n Sources
cmdUpdateDocsPo = parsers.add_parser(
"docs-lupdate",
help=(
"Update translation files for internationalisation of the docs. "
"The langauges to be updated can be added as arguments, "
"or set to all to update all existing translations."
),
)
cmdUpdateDocsPo.add_argument("lang", nargs="+")
cmdUpdateDocsPo.set_defaults(func=utils.docs.updateDocsTranslationSources)
# Build PDF Docs
cmdBuildPdfDocs = parsers.add_parser("docs-pdf", help="Build the PDF manual files.")
cmdBuildPdfDocs.add_argument("lang", nargs="+")
cmdBuildPdfDocs.set_defaults(func=utils.docs.buildPdfDocAssets)
# Build HTML Docs
cmdBuildHtmlDocs = parsers.add_parser("docs-html", help="Build the HTML docs.")
cmdBuildHtmlDocs.add_argument("lang", nargs="+", help="Language codes to generate docs for.")
cmdBuildHtmlDocs.set_defaults(func=utils.docs.buildHtmlDocs)
# Build Sample
cmdBuildSample = parsers.add_parser("sample", help="Build the sample project zip file and add it to assets.")
cmdBuildSample.set_defaults(func=utils.assets.buildSampleZip)
# Clean Assets
cmdCleanAssets = parsers.add_parser("clean-assets", help="Delete assets built by docs-pdf, sample and qtlrelease.")
cmdCleanAssets.set_defaults(func=utils.assets.cleanBuiltAssets)
# Build Assets
cmdBuildAssets = parsers.add_parser(
"build-assets", help="Build all assets. Includes docs-pdf, sample and qtlrelease."
)
cmdBuildAssets.set_defaults(func=utils.assets.buildAllAssets)
# Python Packaging
# ================
# Build Debian Package
distros = ", ".join(utils.build_debian.DISTRO_TARGETS.keys())
cmdBuildDeb = parsers.add_parser(
"build-deb", help="Build .deb packages for publishing. Add --sign to sign package."
)
cmdBuildDeb.add_argument("distro", help=f"Release to build for: {distros}.")
cmdBuildDeb.add_argument("--sign", action="store_true", help="Sign the package.")
cmdBuildDeb.add_argument("--build", type=int, help="Set build number, appended to the distro suffix.")
cmdBuildDeb.add_argument("--install-source", help="Override the install source in meta.toml.")
cmdBuildDeb.set_defaults(func=utils.build_debian.debian)
# Print Debian Build Dependencies
cmdDebDepends = parsers.add_parser("build-deb-depends", help="Print the apt package dependencies.")
cmdDebDepends.add_argument("distro", help=f"Release to build for: {distros}.")
cmdDebDepends.set_defaults(func=utils.build_debian.printDebDepends)
# Build Ubuntu Packages for Launchpad
cmdBuildUbuntu = parsers.add_parser(
"build-ubuntu", help="Build source packages for Launchpad. Add --sign to sign package."
)
cmdBuildUbuntu.add_argument("--sign", action="store_true", help="Sign the package.")
cmdBuildUbuntu.add_argument("--build", type=int, help="Set build number.")
cmdBuildUbuntu.set_defaults(func=utils.build_debian.launchpad)
# Build AppImage
# See https://github.com/pypa/manylinux
# See https://python-appimage.readthedocs.io/en/latest/#available-python-appimages
cmdBuildAppImage = parsers.add_parser("build-appimage", help="Build an AppImage.")
cmdBuildAppImage.add_argument("linux", help="Manylinux version, e.g. manylinux_2_28")
cmdBuildAppImage.add_argument("arch", help="Architecture, e.g. x86_64")
cmdBuildAppImage.add_argument("python", help="Python version, e.g. 3.13")
cmdBuildAppImage.set_defaults(func=utils.build_appimage.appImage)
# Build Flatpak
cmdBuildFlatpak = parsers.add_parser("build-flatpak", help="Build a Flatpak image for direct download.")
cmdBuildFlatpak.set_defaults(func=utils.build_flatpak.flatpak)
# Build Flathub Submission Files
cmdBuildFlathub = parsers.add_parser(
"build-flathub", help="Generate the manifest and support files for a Flathub submission."
)
cmdBuildFlathub.add_argument("path", nargs="?", help="Path to copy the generated files into.")
cmdBuildFlathub.set_defaults(func=utils.build_flatpak.flathub)
# Build PyPI Packages
cmdBuildPypi = parsers.add_parser("build-pypi", help="Build sdist and wheel packages for PyPI.")
cmdBuildPypi.set_defaults(func=utils.build_pypi.pypi)
# Build Windows Inno Setup Installer
cmdBuildSetupExe = parsers.add_parser(
"build-win-exe", help="Build a setup.exe file with Python embedded for Windows."
)
cmdBuildSetupExe.set_defaults(func=utils.build_windows.main)
# Build Binary
cmdBuildBinary = parsers.add_parser("build-bin", help="Build a standalone binary package.")
cmdBuildBinary.set_defaults(func=utils.build_binary.main)
# Build Clean
cmdBuildClean = parsers.add_parser("build-clean", help="Recursively delete all build folders.")
cmdBuildClean.set_defaults(func=cleanBuildDirs)
# Generate MacOS PList File
cmdGenMacOSPlist = parsers.add_parser("gen-plist", help="Generate an Info.plist for use in a MacOS Bundle.")
cmdGenMacOSPlist.set_defaults(func=genMacOSPlist)
# Generate Requirement File
cmdGenReq = parsers.add_parser("gen-req", help="Generate a requirements.txt file for pip.")
cmdGenReq.add_argument(
"groups",
nargs="*",
help=(
"Groups to generate for, or 'all' to generate for all groups. "
"Use 'app' to generate for just the core application. "
"Defaults to 'app' if none are specified."
),
)
cmdGenReq.set_defaults(func=genReqFiles)
args = parser.parse_args()
args.func(args)
utils.main.main()

View File

@@ -7,7 +7,7 @@ name = "novelWriter"
authors = [{ name = "Veronica Berglyd Olsen", email = "code@vkbo.net" }]
description = "A plain text editor for planning and writing novels"
readme = { file = "setup/description_pypi.md", content-type = "text/markdown" }
license = "GPL-3.0-or-later AND Apache-2.0 AND CC-BY-4.0 AND ISC"
license = "GPL-3.0-or-later AND Apache-2.0 AND ISC AND MIT"
license-files = ["LICENSE.md"]
dynamic = ["version"]
requires-python = ">=3.11"
@@ -174,7 +174,6 @@ markers = [
"base: Base classes tests",
"core: Core classes tests",
"gui: GUI classes tests",
"opt_assets: Include optional asset tests",
]
[tool.coverage.run]

View File

@@ -15,6 +15,7 @@ if __name__ == "__main__":
"""Parse command line options and run the commands."""
parser = argparse.ArgumentParser(usage="run_tests.py [--flags]")
parser.add_argument("-o", action="store_true", help="Run off screen")
parser.add_argument("-v", type=int, default=3, help="Verbosity level (0-3)")
parser.add_argument("-r", action="store_true", help="Generate xml coverage report")
parser.add_argument("--html", action="store_true", help="Generate html coverage report")
parser.add_argument("-t", action="store_true", help="Generate terminal coverage report")
@@ -39,7 +40,17 @@ if __name__ == "__main__":
else:
cmd = [sys.executable, "-m"]
cmd += ["pytest", "-vv"]
cmd += ["pytest"]
match args.v:
case 0:
cmd += ["-q"]
case 1:
pass
case 2:
cmd += ["-v"]
case 3:
cmd += ["-vv"]
if args.o:
env["QT_QPA_PLATFORM"] = "offscreen"
if args.failed:

View File

@@ -4,9 +4,9 @@ parent = "6a2d6d5f4f401"
handle = "636b6aa9b697b"
class = "NOVEL"
layout = "DOCUMENT"
textHash = "c1a75b18145e49e5e71b5284f66a261207da37d0"
textHash = "99a15da53995781c1dba62ed10742a35ee59d2ec"
createdDate = "Unknown"
updatedDate = "2025-06-16 12:49:10"
updatedDate = "2026-10-10 19:23:24"
+++
### Making a Scene
@@ -29,7 +29,17 @@ In addition, the editor supports automatic formatting of “quotes”, both doub
If you have the need for it, you can also add text that can be automatically replaced by other text when you generate a preview or export the project. Now, let’s auto-replace this A with <A>, and this C with <C>. While <E> is just <E>. Press Ctrl+R to see what this looks like in the view pane. The list of auto-replaced text is set in Project Settings.
You can also add URLs like http://www.example.com to the text.
You can add URLs with custom link text like [Example](http://www.example.com) to the text, and a single level of list items using a * and a space as a list marker, like this:
* List item 1
* List item 2
* List item 3
Ordered lists use the #. notation:
#. List item 1
#. List item 2
#. List item 3
The editor also supports non breaking spaces, and the spell checker accepts long dashes—like this—as valid word separators. Regular dashes are also supported – and can be automatically inserted when typing two hyphens.
@@ -56,3 +66,4 @@ This text is left-aligned. <<
You can indent a paragraph from both the left and right margin with ‘>’ and ‘<’ symbols.
> This paragraph is indented from both the left margin and the right margin. This is useful for when you want to quote a large chunk of text for instance. <

View File

@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="26.2.2" hexVersion="0x260202f0" fileVersion="1.6" fileRevision="0" timeStamp="2026-10-11 00:58:24">
<project id="e2be99af-f9bf-4403-857a-c3d1ac25abea" saveCount="2395" autoCount="430" editTime="111214" indexRevision="748">
<novelWriterXML appVersion="26.3a0" hexVersion="0x260300a0" fileVersion="1.6" fileRevision="0" timeStamp="2026-10-10 19:31:35">
<project id="e2be99af-f9bf-4403-857a-c3d1ac25abea" saveCount="2426" autoCount="437" editTime="112643" indexRevision="554">
<name>Sample Project</name>
<author>Jane Smith</author>
</project>
@@ -8,8 +8,8 @@
<doBackup>no</doBackup>
<language>en_GB</language>
<spellChecking auto="yes">None</spellChecking>
<projectTarget date="None" last="1137" mode="words">15000</projectTarget>
<dailyTarget auto="no" last="0" date="2026-10-11">1000</dailyTarget>
<projectTarget date="None" last="1183" mode="words">15000</projectTarget>
<dailyTarget auto="no" last="46" date="2026-10-10">1000</dailyTarget>
<targetSkipRoots>
<entry>d2d81f4831814</entry>
</targetSkipRoots>
@@ -17,7 +17,7 @@
<entry key="editor">636b6aa9b697b</entry>
<entry key="viewer">636b6aa9b697b</entry>
<entry key="novel">7031beac91f75</entry>
<entry key="outline">7031beac91f75</entry>
<entry key="story">7031beac91f75</entry>
</lastHandle>
<autoReplace>
<entry key="A">B</entry>
@@ -42,7 +42,7 @@
<entry key="i56be10" count="1" color="purple" shape="BLOCK_4">Main</entry>
</importance>
</settings>
<content items="38" novelWords="5561" notesWords="601" novelChars="29419" notesChars="3295">
<content items="38" novelWords="5607" notesWords="601" novelChars="29631" notesChars="3295">
<item handle="7031beac91f75" parent="None" root="7031beac91f75" order="0" type="ROOT" class="NOVEL">
<meta expanded="yes" />
<name status="sc24b8f" import="ia857f0">Novel</name>
@@ -64,7 +64,7 @@
<name status="sf24ce6" import="ia857f0" active="yes">Basic Formatting</name>
</item>
<item handle="636b6aa9b697b" parent="6a2d6d5f4f401" root="7031beac91f75" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta expanded="no" heading="H3" charCount="3003" wordCount="530" paraCount="16" cursorPos="944" />
<meta expanded="no" heading="H3" charCount="3215" wordCount="576" paraCount="19" cursorPos="19" />
<name status="s90e6c9" import="ia857f0" active="yes">Making a Scene</name>
</item>
<item handle="bc0cbd2a407f3" parent="6a2d6d5f4f401" root="7031beac91f75" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">

View File

@@ -34,29 +34,6 @@ License: Apache-2.0
See the License for the specific language governing permissions and
limitations under the License.
Files: novelwriter/assets/icons/remix_*
Copyright: RemixIcon
License: Apache-2.0
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
.
http://www.apache.org/licenses/LICENSE-2.0
.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Files: novelwriter/assets/icons/font_awesome.*
Copyright: Fonticons Inc
License: CC-BY-4.0
This work is licensed under Creative Commons Attribution 4.0
International. To view a copy of this license, visit
.
https://creativecommons.org/licenses/by/4.0/
Files: novelwriter/assets/icons/lucide.*
Copyright: Cole Bemis, Lucide Contributors
License: ISC
@@ -76,3 +53,25 @@ License: ISC
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
Files: novelwriter/assets/icons/fluentui_*
Copyright: 2020, Microsoft Corporation
License: MIT
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
.
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

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