Commit 426460eb authored by lihaochen's avatar lihaochen

initial commit

parents
This diff is collapsed.
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at conduct@quilljs.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
GEM
remote: https://rubygems.org/
specs:
activesupport (4.2.9)
i18n (~> 0.7)
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
addressable (2.5.2)
public_suffix (>= 2.0.2, < 4.0)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.11.1)
colorator (1.1.0)
commonmarker (0.17.7.1)
ruby-enum (~> 0.5)
concurrent-ruby (1.0.5)
ethon (0.11.0)
ffi (>= 1.3.0)
execjs (2.7.0)
faraday (0.13.1)
multipart-post (>= 1.2, < 3)
ffi (1.9.18)
foreman (0.84.0)
thor (~> 0.19.1)
forwardable-extended (2.6.0)
gemoji (3.0.0)
github-pages (172)
activesupport (= 4.2.9)
github-pages-health-check (= 1.3.5)
jekyll (= 3.6.2)
jekyll-avatar (= 0.5.0)
jekyll-coffeescript (= 1.0.2)
jekyll-commonmark-ghpages (= 0.1.3)
jekyll-default-layout (= 0.1.4)
jekyll-feed (= 0.9.2)
jekyll-gist (= 1.4.1)
jekyll-github-metadata (= 2.9.3)
jekyll-mentions (= 1.2.0)
jekyll-optional-front-matter (= 0.3.0)
jekyll-paginate (= 1.1.0)
jekyll-readme-index (= 0.2.0)
jekyll-redirect-from (= 0.12.1)
jekyll-relative-links (= 0.5.2)
jekyll-remote-theme (= 0.2.3)
jekyll-sass-converter (= 1.5.0)
jekyll-seo-tag (= 2.3.0)
jekyll-sitemap (= 1.1.1)
jekyll-swiss (= 0.4.0)
jekyll-theme-architect (= 0.1.0)
jekyll-theme-cayman (= 0.1.0)
jekyll-theme-dinky (= 0.1.0)
jekyll-theme-hacker (= 0.1.0)
jekyll-theme-leap-day (= 0.1.0)
jekyll-theme-merlot (= 0.1.0)
jekyll-theme-midnight (= 0.1.0)
jekyll-theme-minimal (= 0.1.0)
jekyll-theme-modernist (= 0.1.0)
jekyll-theme-primer (= 0.5.2)
jekyll-theme-slate (= 0.1.0)
jekyll-theme-tactile (= 0.1.0)
jekyll-theme-time-machine (= 0.1.0)
jekyll-titles-from-headings (= 0.5.0)
jemoji (= 0.8.1)
kramdown (= 1.14.0)
liquid (= 4.0.0)
listen (= 3.0.6)
mercenary (~> 0.3)
minima (= 2.1.1)
rouge (= 2.2.1)
terminal-table (~> 1.4)
github-pages-health-check (1.3.5)
addressable (~> 2.3)
net-dns (~> 0.8)
octokit (~> 4.0)
public_suffix (~> 2.0)
typhoeus (~> 0.7)
html-pipeline (2.7.1)
activesupport (>= 2)
nokogiri (>= 1.4)
i18n (0.9.1)
concurrent-ruby (~> 1.0)
jekyll (3.6.2)
addressable (~> 2.4)
colorator (~> 1.0)
jekyll-sass-converter (~> 1.0)
jekyll-watch (~> 1.1)
kramdown (~> 1.14)
liquid (~> 4.0)
mercenary (~> 0.3.3)
pathutil (~> 0.9)
rouge (>= 1.7, < 3)
safe_yaml (~> 1.0)
jekyll-avatar (0.5.0)
jekyll (~> 3.0)
jekyll-coffeescript (1.0.2)
coffee-script (~> 2.2)
coffee-script-source (~> 1.11.1)
jekyll-commonmark (1.1.0)
commonmarker (~> 0.14)
jekyll (>= 3.0, < 4.0)
jekyll-commonmark-ghpages (0.1.3)
commonmarker (~> 0.17.6)
jekyll-commonmark (~> 1)
rouge (~> 2)
jekyll-default-layout (0.1.4)
jekyll (~> 3.0)
jekyll-feed (0.9.2)
jekyll (~> 3.3)
jekyll-gist (1.4.1)
octokit (~> 4.2)
jekyll-github-metadata (2.9.3)
jekyll (~> 3.1)
octokit (~> 4.0, != 4.4.0)
jekyll-mentions (1.2.0)
activesupport (~> 4.0)
html-pipeline (~> 2.3)
jekyll (~> 3.0)
jekyll-optional-front-matter (0.3.0)
jekyll (~> 3.0)
jekyll-paginate (1.1.0)
jekyll-readme-index (0.2.0)
jekyll (~> 3.0)
jekyll-redirect-from (0.12.1)
jekyll (~> 3.3)
jekyll-relative-links (0.5.2)
jekyll (~> 3.3)
jekyll-remote-theme (0.2.3)
jekyll (~> 3.5)
rubyzip (>= 1.2.1, < 3.0)
typhoeus (>= 0.7, < 2.0)
jekyll-sass-converter (1.5.0)
sass (~> 3.4)
jekyll-seo-tag (2.3.0)
jekyll (~> 3.3)
jekyll-sitemap (1.1.1)
jekyll (~> 3.3)
jekyll-swiss (0.4.0)
jekyll-theme-architect (0.1.0)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-cayman (0.1.0)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-dinky (0.1.0)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-hacker (0.1.0)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-leap-day (0.1.0)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-merlot (0.1.0)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-midnight (0.1.0)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-minimal (0.1.0)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-modernist (0.1.0)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-primer (0.5.2)
jekyll (~> 3.5)
jekyll-github-metadata (~> 2.9)
jekyll-seo-tag (~> 2.2)
jekyll-theme-slate (0.1.0)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-tactile (0.1.0)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-theme-time-machine (0.1.0)
jekyll (~> 3.5)
jekyll-seo-tag (~> 2.0)
jekyll-titles-from-headings (0.5.0)
jekyll (~> 3.3)
jekyll-watch (1.5.1)
listen (~> 3.0)
jemoji (0.8.1)
activesupport (~> 4.0, >= 4.2.9)
gemoji (~> 3.0)
html-pipeline (~> 2.2)
jekyll (>= 3.0)
kramdown (1.14.0)
liquid (4.0.0)
listen (3.0.6)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9.7)
mercenary (0.3.6)
mini_portile2 (2.3.0)
minima (2.1.1)
jekyll (~> 3.3)
minitest (5.11.1)
multipart-post (2.0.0)
net-dns (0.8.0)
nokogiri (1.8.1)
mini_portile2 (~> 2.3.0)
octokit (4.8.0)
sawyer (~> 0.8.0, >= 0.5.3)
pathutil (0.16.1)
forwardable-extended (~> 2.6)
public_suffix (2.0.5)
rb-fsevent (0.10.2)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
rouge (2.2.1)
ruby-enum (0.7.1)
i18n
rubyzip (1.2.1)
safe_yaml (1.0.4)
sass (3.5.5)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
sawyer (0.8.1)
addressable (>= 2.3.5, < 2.6)
faraday (~> 0.8, < 1.0)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
thor (0.19.4)
thread_safe (0.3.6)
typhoeus (0.8.0)
ethon (>= 0.8.0)
tzinfo (1.2.4)
thread_safe (~> 0.1)
unicode-display_width (1.3.0)
PLATFORMS
ruby
DEPENDENCIES
foreman
github-pages (= 172)
BUNDLED WITH
1.16.1
Copyright (c) 2014, Jason Chen
Copyright (c) 2013, salesforce.com
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<h1 align="center">
<a href="https://quilljs.com/" title="Quill">Quill Rich Text Editor</a>
</h1>
<p align="center">
<a href="https://quilljs.com/" title="Quill"><img alt="Quill Logo" src="https://quilljs.com/assets/images/logo.svg" width="180"></a>
</p>
<p align="center">
<a title="Quickstart" href="#quickstart"><strong>Quickstart</strong></a>
&#x2022;
<a title="Documentation" href="https://quilljs.com/docs/"><strong>Documentation</strong></a>
&#x2022;
<a title="Development" href="https://github.com/quilljs/quill/blob/master/.github/DEVELOPMENT.md"><strong>Development</strong></a>
&#x2022;
<a title="Contributing" href="https://github.com/quilljs/quill/blob/master/.github/CONTRIBUTING.md"><strong>Contributing</strong></a>
&#x2022;
<a title="Interactive Playground" href="https://quilljs.com/playground/"><strong>Interactive Playground</strong></a>
</p>
<p align="center">
<a href="https://travis-ci.org/quilljs/quill" title="Build Status">
<img src="https://travis-ci.org/quilljs/quill.svg?branch=master" alt="Build Status">
</a>
<a href="https://npmjs.com/package/quill" title="Version">
<img src="https://img.shields.io/npm/v/quill.svg" alt="Version">
</a>
<a href="https://npmjs.com/package/quill" title="Downloads">
<img src="https://img.shields.io/npm/dm/quill.svg" alt="Downloads">
</a>
</p>
<p align="center">
<a href="https://saucelabs.com/u/quill" title="Test Status">
<img src="https://cdn.quilljs.com/badge.svg?v=2" alt="Test Status">
</a>
</p>
[QuillJS](https://quilljs.com/) is a modern rich text editor built for compatibility and extensibility. It was created by [Jason Chen](https://twitter.com/jhchen) and [Byron Milligan](https://twitter.com/byronmilligan) and open sourced by Salesforce.
To get started, check out the [Quill](https://quilljs.com/) website for documentation, guides, and live demos!
## Quickstart
Instantiate a new Quill object with a css selector for the div that should become the editor.
```html
<!-- Include Quill stylesheet -->
<link href="https://cdn.quilljs.com/1.0.0/quill.snow.css" rel="stylesheet">
<!-- Create the toolbar container -->
<div id="toolbar">
<button class="ql-bold">Bold</button>
<button class="ql-italic">Italic</button>
</div>
<!-- Create the editor container -->
<div id="editor">
<p>Hello World!</p>
</div>
<!-- Include the Quill library -->
<script src="https://cdn.quilljs.com/1.0.0/quill.js"></script>
<!-- Initialize Quill editor -->
<script>
var editor = new Quill('#editor', {
modules: { toolbar: '#toolbar' },
theme: 'snow'
});
</script>
```
Take a look at the [Quill](https://quilljs.com/) website for more documentation, guides and [live playground](https://quilljs.com/playground/)!
## Download
- [npm](https://www.npmjs.com/package/quill) - `npm install quill`
- tar - https://github.com/quilljs/quill/releases
### CDN
```html
<!-- Main Quill library -->
<script src="//cdn.quilljs.com/1.0.0/quill.js"></script>
<script src="//cdn.quilljs.com/1.0.0/quill.min.js"></script>
<!-- Theme included stylesheets -->
<link href="//cdn.quilljs.com/1.0.0/quill.snow.css" rel="stylesheet">
<link href="//cdn.quilljs.com/1.0.0/quill.bubble.css" rel="stylesheet">
<!-- Core build with no theme, formatting, non-essential modules -->
<link href="//cdn.quilljs.com/1.0.0/quill.core.css" rel="stylesheet">
<script src="//cdn.quilljs.com/1.0.0/quill.core.js"></script>
```
## Community
Get help or stay up to date.
- [Contribute](https://github.com/quilljs/quill/blob/develop/.github/CONTRIBUTING.md) on [Issues](https://github.com/quilljs/quill/issues)
- Follow [@jhchen](https://twitter.com/jhchen) and [@quilljs](https://twitter.com/quilljs) on Twitter
- Ask questions on [Stack Overflow](https://stackoverflow.com/questions/tagged/quill)
- If privacy is required, email support@quilljs.com
## License
BSD 3-clause
var desktop = {
'mac-chrome-latest' : ['OS X 10.12', 'chrome', '60.0'],
'mac-firefox-latest' : ['OS X 10.12', 'firefox', '54.0'],
'mac-safari-latest' : ['OS X 10.12', 'safari', '11.0'],
'mac-chrome-previous' : ['OS X 10.11', 'chrome', '59.0'],
'mac-firefox-previous' : ['OS X 10.11', 'firefox', '53.0'],
'mac-safari-previous' : ['OS X 10.11', 'safari', '10.0'],
'windows-chrome-latest' : ['Windows 10', 'chrome', '60.0'],
'windows-firefox-latest' : ['Windows 10', 'firefox', '54.0'],
'windows-edge-latest' : ['Windows 10', 'microsoftedge', '15.15063'],
'windows-ie-latest' : ['Windows 8.1', 'internet explorer', '11.0'],
'windows-chrome-previous' : ['Windows 8.1', 'chrome', '59.0'],
'windows-firefox-previous': ['Windows 8.1', 'firefox', '53.0'],
'windows-edge-previous' : ['Windows 10', 'microsoftedge', '14.14393'],
'linux-chrome-latest' : ['Linux', 'chrome', '48.0'],
'linux-firefox-latest' : ['Linux', 'firefox', '45.0'],
'linux-chrome-previous' : ['Linux', 'chrome', '47.0'],
'linux-firefox-previous' : ['Linux', 'firefox', '44.0']
};
var mobile = {
'ios-latest' : ['iPhone 7 Plus', 'iOS', '10.3', 'Safari'],
'ios-previous' : ['iPhone 6 Plus', 'iOS', '9.3', 'Safari'],
'android-latest' : ['Android GoogleAPI Emulator', 'Android', '7.1', 'Chrome'],
'android-previous' : ['Android GoogleAPI Emulator', 'Android', '6.0', 'Chrome']
};
Object.keys(desktop).forEach(function(key) {
module.exports[key] = {
base: 'SauceLabs',
browserName: desktop[key][1],
version: desktop[key][2],
platform: desktop[key][0]
};
});
Object.keys(mobile).forEach(function(key) {
module.exports[key] = {
base: 'SauceLabs',
browserName: mobile[key][3],
appiumVersion: '1.6.4',
deviceName: mobile[key][0],
deviceOrientation: 'portrait',
platformVersion: mobile[key][2],
platformName: mobile[key][1]
};
});
cdn: /
quill: quill.js
var browsers = require('./browsers');
var sauce = require('./sauce');
module.exports = function(config) {
config.set({
basePath: '../',
urlRoot: '/karma/',
port: process.env.npm_package_config_ports_karma,
files: [
{ pattern: 'dist/quill.snow.css', nocache: true },
{ pattern: 'dist/unit.js', nocache: true },
{ pattern: 'dist/*.map', included: false, served: true, nocache: true },
{ pattern: 'assets/favicon.png', included: false, served: true }
],
proxies: {
'/assets/': '/karma/base/assets/'
},
frameworks: ['jasmine'],
reporters: ['progress'],
colors: true,
autoWatch: false,
singleRun: true,
browsers: ['Chrome'],
client: {
useIframe: false
},
coverageReporter: {
dir: '.coverage',
reporters: [
{ type: 'text' },
{ type: 'html' }
]
},
sauceLabs: {
testName: 'quill-unit',
options: {
'public': 'public',
'record-screenshots': false
},
build: sauce.build,
username: sauce.username,
accessKey: sauce.accessKey,
tunnelIdentifier: sauce.tunnel
},
customLaunchers: browsers
});
if (process.env.TRAVIS) {
config.sauceLabs.startConnect = false;
config.transports = ['polling'];
config.browsers = [process.env.BROWSER];
config.browserDisconnectTimeout = 10000;
config.browserDisconnectTolerance = 3;
config.browserNoActivityTimeout = 60000;
config.captureTimeout = 120000;
// MS Edge does not work in an iframe
if (process.env.BROWSER.indexOf('ios') > -1 ||
process.env.BROWSER.indexOf('android') > -1 ||
process.env.BROWSER.indexOf('firefox') > -1) {
config.client.useIframe = true;
}
}
};
jekyll: jekyll serve -s ../docs -d ../docs/_site --port $npm_package_config_ports_jekyll -w --config ../docs/_config.yml,jekyll.yml
karma: karma start karma.config.js --no-single-run --no-browsers
webpack: webpack-dev-server --config webpack.config.js --env.dev
proxy: node proxy.js
\ No newline at end of file
var http = require('http');
var httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({});
var ports = {
proxy: parseInt(process.env.npm_package_config_ports_proxy),
jekyll: parseInt(process.env.npm_package_config_ports_jekyll),
karma: parseInt(process.env.npm_package_config_ports_karma),
webpack: parseInt(process.env.npm_package_config_ports_webpack)
};
var server = http.createServer(function(req, res) {
if (/\/\d+\.\d+\.\d+/.test(req.url) || req.url.startsWith('/karma/base/dist')) {
var target = 'http://localhost:' + ports.webpack + '/' + req.url.split('/').pop();
proxy.web(req, res, {
ignorePath: true,
target: target
});
} else if (req.url.startsWith('/karma') || req.url === '/assets/favicon.png') {
proxy.web(req, res, { ignorePath: false, target: { port: ports.karma } });
} else {
proxy.web(req, res, { ignorePath: false, target: { port: ports.jekyll } });
}
});
server.on('upgrade', function (req, socket, head) {
proxy.ws(req, socket, head);
});
proxy.on('error', function(e) {
console.error(e);
});
console.log('Proxy listening on ' + ports.proxy);
server.listen(ports.proxy);
var _ = require('lodash');
var os = require('os');
var options = {
username: process.env.SAUCE_USERNAME,
accessKey: process.env.SAUCE_ACCESS_KEY
};
if (process.env.TRAVIS) {
module.exports = {
build: process.env.TRAVIS_BUILD_ID,
tunnel: process.env.TRAVIS_JOB_NUMBER
};
} else {
var id = _.random(16*16*16*16).toString(16);
module.exports = {
build: os.hostname() + '-' + id,
tunnel: os.hostname() + '-tunnel-' + id
};
}
#!/bin/bash
VERSION="$1"
if [ -z "$VERSION" ]; then
echo "Version required."
exit
else
echo "Releasing $VERSION"
fi
rm -r .release
rm -r dist
mkdir .release
mkdir .release/quill
npm run build
webpack --config _develop/webpack.config.js --env.minimize
cp dist/quill.core.css dist/quill.bubble.css dist/quill.snow.css dist/quill.js dist/quill.core.js dist/quill.min.js dist/quill.min.js.map .release/quill/
cd .release
printf "cdn: .\nversion: ." > jekyll.yml
jekyll build -s ../docs -d _site --config ../docs/_config.yml,jekyll.yml
mkdir quill/examples
mv _site/standalone/bubble/index.html quill/examples/bubble.html
mv _site/standalone/snow/index.html quill/examples/snow.html
mv _site/standalone/full/index.html quill/examples/full.html
find quill/examples -type f -exec sed -i "" 's/\<link rel\="icon".*\>/ /g' {} \;
find quill/examples -type f -exec sed -i "" 's/href="\/\//href="https:\/\//g' {} \;
find quill/examples -type f -exec sed -i "" 's/src="\/\//src="https:\/\//g' {} \;
tar -czf quill.tar.gz quill
aws s3 cp quill/quill.js s3://cdn.quilljs.com/$VERSION/ --cache-control max-age=604800 --content-type "application/javascript; charset=utf-8" --profile quill
aws s3 cp quill/quill.min.js s3://cdn.quilljs.com/$VERSION/ --cache-control max-age=604800 --content-type "application/javascript; charset=utf-8" --profile quill
aws s3 cp quill/quill.core.js s3://cdn.quilljs.com/$VERSION/ --cache-control max-age=604800 --content-type "application/javascript; charset=utf-8" --profile quill
aws s3 cp quill/quill.bubble.css s3://cdn.quilljs.com/$VERSION/ --cache-control max-age=604800 --content-type "text/css; charset=utf-8" --profile quill
aws s3 cp quill/quill.core.css s3://cdn.quilljs.com/$VERSION/ --cache-control max-age=604800 --content-type "text/css; charset=utf-8" --profile quill
aws s3 cp quill/quill.snow.css s3://cdn.quilljs.com/$VERSION/ --cache-control max-age=604800 --content-type "text/css; charset=utf-8" --profile quill
aws s3 cp quill/quill.min.js.map s3://cdn.quilljs.com/$VERSION/ --cache-control max-age=604800 --content-type "application/json; charset=utf-8" --profile quill
aws s3 sync s3://cdn.quilljs.com/$VERSION/ s3://cdn.quilljs.com/latest/ --profile quill
cd ..
git tag v$VERSION -m "Version $VERSION"
git push origin v$VERSION
git push origin master
npm publish
#!/bin/bash
npm start &
webdriver-manager start 2> /dev/null &
sleep 20s
wdio _develop/wdio.config.js
EXIT_CODE=$?
FOREMAN_PID=$(pgrep foreman)
SELENIUM_PID=$(pgrep -f selenium-server-standalone)
kill -s SIGINT $FOREMAN_PID
kill -s SIGINT $SELENIUM_PID
echo "\n"
exit $EXIT_CODE
exports.config = {
specs: [
'./test/functional/epic.js'
],
exclude: [],
reporters: ['spec'],
maxInstances: 10,
capabilities: [{
browserName: 'chrome'
}],
sync: true,
logLevel: 'error',
coloredLogs: true,
baseUrl: 'http://localhost:' + process.env.npm_package_config_ports_proxy,
waitforTimeout: 10000,
connectionRetryTimeout: 90000,
connectionRetryCount: 3,
framework: 'jasmine',
jasmineNodeOpts: {
defaultTimeoutInterval: 10000,
expectationResultHandler: function(passed, assertion) {
if (passed) return;
this.saveScreenshot('./wd-' + this.desiredCapabilities.browserName + '-error.png');
}
}
}
var path = require('path');
var pkg = require('../package.json');
var webpack = require('webpack');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var bannerPack = new webpack.BannerPlugin({
banner:
'Quill Editor v' + pkg.version + '\n' +
'https://quilljs.com/\n' +
'Copyright (c) 2014, Jason Chen\n' +
'Copyright (c) 2013, salesforce.com',
entryOnly: true
});
var constantPack = new webpack.DefinePlugin({
QUILL_VERSION: JSON.stringify(pkg.version)
});
var source = [
'quill.js',
'core.js',
'blots',
'core',
'formats',
'modules',
'test',
'themes',
'ui'
].map(function(file) {
return path.resolve(__dirname, '..', file);
});
module.exports = function(env) {
let config = {
context: path.resolve(__dirname, '..'),
entry: {
'quill.js': ['./quill.js'],
'quill.core.js': ['./core.js'],
'quill.core': './assets/core.styl',
'quill.bubble': './assets/bubble.styl',
'quill.snow': './assets/snow.styl',
'unit.js': './test/unit.js'
},
output: {
filename: '[name]',
library: 'Quill',
libraryExport: 'default',
libraryTarget: 'umd',
path: path.resolve(__dirname, '../dist/')
},
resolve: {
alias: {
'parchment': path.resolve(__dirname, '../node_modules/parchment/src/parchment')
},
extensions: ['.js', '.styl', '.ts']
},
module: {
rules: [{
test: /\.js$/,
use: ['eslint-loader'],
include: source,
enforce: 'pre'
}, {
test: /\.ts$/,
use: [{
loader: 'ts-loader',
options: {
compilerOptions: {
declaration: false,
target: 'es5',
module: 'commonjs'
},
transpileOnly: true
}
}]
}, {
test: /\.styl$/,
include: [
path.resolve(__dirname, '../assets')
],
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: [
'css-loader',
'stylus-loader'
]
})
}, {
test: /\.svg$/,
include: [
path.resolve(__dirname, '../assets/icons')
],
use: [{
loader: 'html-loader',
options: {
minimize: true
}
}]
}, {
test: /\.js$/,
include: source,
use: [{
loader: 'babel-loader',
options: {
presets: ['es2015']
}
}]
}],
noParse: [
/\/node_modules\/clone\/clone\.js$/,
/\/node_modules\/eventemitter3\/index\.js$/,
/\/node_modules\/extend\/index\.js$/
]
},
plugins: [
bannerPack,
constantPack,
new ExtractTextPlugin({
filename: '[name].css',
allChunks: true
})
],
devServer: {
contentBase: path.resolve(__dirname, '../dist'),
hot: false,
port: process.env.npm_package_config_ports_webpack,
stats: 'minimal',
disableHostCheck: true
}
};
if (env && env.dev) {
config.module.rules = config.module.rules.slice(1); // Remove linter
config.module.rules[3].use[0].options = {
plugins: ['transform-es2015-modules-commonjs']
};
}
if (env && env.minimize) {
config.entry = {
'quill.min.js': './quill.js'
};
config.plugins.push(
new webpack.optimize.UglifyJsPlugin({
sourceMap: true
})
);
config.devtool = 'source-map';
}
if (env && env.coverage) {
config.module.rules[4].use[0].options = {
plugins: ['istanbul', 'transform-es2015-modules-commonjs']
};
}
return config;
};
// Styles shared between snow and bubble
controlHeight = 24px
inputPaddingWidth = 5px
inputPaddingHeight = 3px
colorItemMargin = 2px
colorItemSize = 16px
colorItemsPerRow = 7
.ql-{themeName}.ql-toolbar, .ql-{themeName} .ql-toolbar
&:after
clear: both
content: ''
display: table
button
background: none
border: none
cursor: pointer
display: inline-block
float: left
height: controlHeight
padding: inputPaddingHeight inputPaddingWidth
width: controlHeight + (inputPaddingWidth - inputPaddingHeight)*2
svg
float: left
height: 100%
&:active:hover
outline: none
input.ql-image[type=file]
display: none
button:hover, button:focus, button.ql-active,
.ql-picker-label:hover, .ql-picker-label.ql-active,
.ql-picker-item:hover, .ql-picker-item.ql-selected
color: activeColor
.ql-fill, .ql-stroke.ql-fill
fill: activeColor
.ql-stroke, .ql-stroke-miter
stroke: activeColor
// Fix for iOS not losing hover on touch
@media (pointer: coarse)
.ql-{themeName}.ql-toolbar, .ql-{themeName} .ql-toolbar
button:hover:not(.ql-active)
color: inactiveColor
.ql-fill, .ql-stroke.ql-fill
fill: inactiveColor
.ql-stroke, .ql-stroke-miter
stroke: inactiveColor
.ql-{themeName}
box-sizing: border-box
*
box-sizing: border-box
.ql-hidden
display: none
.ql-out-bottom, .ql-out-top
visibility: hidden
.ql-tooltip
position: absolute
transform: translateY(10px)
a
cursor: pointer
text-decoration: none
.ql-tooltip.ql-flip
transform: translateY(-10px)
.ql-formats
&:after
clear: both
content: ''
display: table
display: inline-block
vertical-align: middle
.ql-stroke
fill: none
stroke: inactiveColor
stroke-linecap: round
stroke-linejoin: round
stroke-width: 2
.ql-stroke-miter
fill: none
stroke: inactiveColor
stroke-miterlimit: 10
stroke-width: 2
.ql-fill, .ql-stroke.ql-fill
fill: inactiveColor
.ql-empty
fill: none
.ql-even
fill-rule: evenodd
.ql-thin, .ql-stroke.ql-thin
stroke-width: 1
.ql-transparent
opacity: 0.4
.ql-direction
svg:last-child
display: none
.ql-direction.ql-active
svg:last-child
display: inline
svg:first-child
display: none
.ql-editor
h1
font-size: 2em
h2
font-size: 1.5em
h3
font-size: 1.17em
h4
font-size: 1em
h5
font-size: 0.83em
h6
font-size: 0.67em
a
text-decoration: underline
blockquote
border-left: 4px solid #ccc
margin-bottom: 5px
margin-top: 5px
padding-left: 16px
code, pre
background-color: #f0f0f0
border-radius: 3px
pre
white-space: pre-wrap
margin-bottom: 5px
margin-top: 5px
padding: 5px 10px
code
font-size: 85%
padding: 2px 4px
pre.ql-syntax
background-color: #23241f
color: #f8f8f2;
overflow: visible
img
max-width: 100%
.ql-picker
color: inactiveColor
display: inline-block
float: left
font-size: 14px
font-weight: 500
height: controlHeight
position: relative
vertical-align: middle
.ql-picker-label
cursor: pointer
display: inline-block
height: 100%
padding-left: 8px
padding-right: 2px
position: relative
width: 100%
&::before
display: inline-block
line-height: 22px
.ql-picker-options
background-color: backgroundColor
display: none
min-width: 100%
padding: 4px 8px
position: absolute
white-space: nowrap
.ql-picker-item
cursor: pointer
display: block
padding-bottom: 5px
padding-top: 5px
.ql-picker.ql-expanded
.ql-picker-label
color: borderColor
z-index: 2
.ql-fill
fill: borderColor
.ql-stroke
stroke: borderColor
.ql-picker-options
display: block
margin-top: -1px
top: 100%
z-index: 1
.ql-color-picker, .ql-icon-picker
width: controlHeight + 4
.ql-picker-label
padding: 2px 4px
svg
right: 4px
.ql-icon-picker
.ql-picker-options
padding: 4px 0px
.ql-picker-item
height: controlHeight
width: controlHeight
padding: 2px 4px
.ql-color-picker
.ql-picker-options
padding: inputPaddingHeight inputPaddingWidth
width: (colorItemSize + 2*colorItemMargin) * colorItemsPerRow + 2*inputPaddingWidth + 2 // +2 for the border
.ql-picker-item
border: 1px solid transparent
float: left
height: colorItemSize
margin: colorItemMargin
padding: 0px
width: colorItemSize
.ql-picker:not(.ql-color-picker):not(.ql-icon-picker)
svg
position: absolute
margin-top: -9px
right: 0
top: 50%
width: 18px
.ql-picker.ql-header, .ql-picker.ql-font, .ql-picker.ql-size
.ql-picker-label[data-label]:not([data-label='']),
.ql-picker-item[data-label]:not([data-label=''])
&::before
content: attr(data-label)
.ql-picker.ql-header
width: 98px
.ql-picker-label::before,
.ql-picker-item::before
content: 'Normal'
for num in (1..6)
.ql-picker-label[data-value=\"{num}\"]::before,
.ql-picker-item[data-value=\"{num}\"]::before
content: 'Heading ' + num
.ql-picker-item[data-value="1"]::before
font-size: 2em
.ql-picker-item[data-value="2"]::before
font-size: 1.5em
.ql-picker-item[data-value="3"]::before
font-size: 1.17em
.ql-picker-item[data-value="4"]::before
font-size: 1em
.ql-picker-item[data-value="5"]::before
font-size: 0.83em
.ql-picker-item[data-value="6"]::before
font-size: 0.67em
.ql-picker.ql-font
width: 108px
.ql-picker-label::before,
.ql-picker-item::before
content: 'Sans Serif'
.ql-picker-label[data-value=serif]::before,
.ql-picker-item[data-value=serif]::before
content: 'Serif'
.ql-picker-label[data-value=monospace]::before,
.ql-picker-item[data-value=monospace]::before
content: 'Monospace'
.ql-picker-item[data-value=serif]::before
font-family: Georgia, Times New Roman, serif;
.ql-picker-item[data-value=monospace]::before
font-family: Monaco, Courier New, monospace;
.ql-picker.ql-size
width: 98px
.ql-picker-label::before,
.ql-picker-item::before
content: 'Normal'
.ql-picker-label[data-value=small]::before,
.ql-picker-item[data-value=small]::before
content: 'Small'
.ql-picker-label[data-value=large]::before,
.ql-picker-item[data-value=large]::before
content: 'Large'
.ql-picker-label[data-value=huge]::before,
.ql-picker-item[data-value=huge]::before
content: 'Huge'
.ql-picker-item[data-value=small]::before
font-size: 10px
.ql-picker-item[data-value=large]::before
font-size: 18px
.ql-picker-item[data-value=huge]::before
font-size: 32px
.ql-color-picker.ql-background
.ql-picker-item
background-color: #fff;
.ql-color-picker.ql-color
.ql-picker-item
background-color: #000;
themeName = 'bubble'
activeColor = #fff
borderColor = #777
backgroundColor = #444
inactiveColor = #ccc
shadowColor = #ddd
textColor = #fff
@import './core'
@import './base'
@import './bubble/*'
.ql-container.ql-bubble:not(.ql-disabled)
a
position: relative
white-space: nowrap
a::before
background-color: #444
border-radius: 15px
top: -5px
font-size: 12px
color: #fff
content: attr(href)
font-weight: normal
overflow: hidden
padding: 5px 15px
text-decoration: none
z-index: 1
a::after
border-top: 6px solid #444
border-left: 6px solid transparent
border-right: 6px solid transparent
top: 0
content: " "
height: 0
width: 0
a::before, a::after
left: 0
margin-left: 50%
position: absolute
transform: translate(-50%, -100%)
transition: visibility 0s ease 200ms
visibility: hidden
a:hover::before, a:hover::after
visibility: visible
arrowWidth = 6px
.ql-bubble
.ql-toolbar
.ql-formats
margin: 8px 12px 8px 0px
.ql-formats:first-child
margin-left: 12px
.ql-color-picker
svg
margin: 1px
.ql-picker-item.ql-selected, .ql-picker-item:hover
border-color: activeColor
arrowWidth = 6px
.ql-bubble
.ql-tooltip
background-color: backgroundColor
border-radius: 25px
color: textColor
.ql-tooltip-arrow
border-left: arrowWidth solid transparent
border-right: arrowWidth solid transparent
content: " "
display: block
left: 50%
margin-left: -1 * arrowWidth
position: absolute
.ql-tooltip:not(.ql-flip) .ql-tooltip-arrow
border-bottom: arrowWidth solid backgroundColor
top: -1 * arrowWidth
.ql-tooltip.ql-flip .ql-tooltip-arrow
border-top: arrowWidth solid backgroundColor
bottom: -1 * arrowWidth
.ql-tooltip.ql-editing
.ql-tooltip-editor
display: block
.ql-formats
visibility: hidden
.ql-tooltip-editor
display: none
input[type=text]
background: transparent
border: none
color: textColor
font-size: 13px
height: 100%
outline: none
padding: 10px 20px
position: absolute
width: 100%
a
&:before
color: inactiveColor
content: "\00D7"
font-size: 16px
font-weight: bold
top: 10px
position: absolute
right: 20px
// Styles necessary for Quill
LIST_STYLE = decimal lower-alpha lower-roman
LIST_STYLE_WIDTH = 1.2em
LIST_STYLE_MARGIN = 0.3em
LIST_STYLE_OUTER_WIDTH = LIST_STYLE_MARGIN + LIST_STYLE_WIDTH
MAX_INDENT = 9
resets(arr)
unquote('list-' + join(' list-', arr))
.ql-container
box-sizing: border-box
font-family: Helvetica, Arial, sans-serif
font-size: 13px
height: 100%
margin: 0px
position: relative
.ql-container.ql-disabled
.ql-tooltip
visibility: hidden
.ql-editor
ul[data-checked] > li::before
pointer-events: none
.ql-clipboard
left: -100000px
height: 1px
overflow-y: hidden
position: absolute
top: 50%
p
margin: 0
padding: 0
.ql-editor
box-sizing: border-box
line-height: 1.42
height: 100%
outline: none
overflow-y: auto
padding: 12px 15px
tab-size: 4
-moz-tab-size: 4
text-align: left
white-space: pre-wrap
word-wrap: break-word
> *
cursor: text
p, ol, ul, pre, blockquote, h1, h2, h3, h4, h5, h6
margin: 0
padding: 0
counter-reset: resets(1..MAX_INDENT)
ol, ul
padding-left: 1.5em
ol > li, ul > li
list-style-type: none
ul > li::before
content: '\2022'
ul[data-checked=true],
ul[data-checked=false]
pointer-events: none
> li *
pointer-events: all
> li::before
color: #777
cursor: pointer
pointer-events: all
ul[data-checked=true] > li::before
content: '\2611'
ul[data-checked=false] > li::before
content: '\2610'
li::before
display: inline-block
white-space: nowrap
width: LIST_STYLE_WIDTH
li:not(.ql-direction-rtl)::before
margin-left: -1*LIST_STYLE_OUTER_WIDTH
margin-right: LIST_STYLE_MARGIN
text-align: right
li.ql-direction-rtl::before
margin-left: LIST_STYLE_MARGIN
margin-right: -1*LIST_STYLE_OUTER_WIDTH
ol, ul
li:not(.ql-direction-rtl)
padding-left: LIST_STYLE_OUTER_WIDTH
li.ql-direction-rtl
padding-right: LIST_STYLE_OUTER_WIDTH
ol
li
counter-reset: resets(1..MAX_INDENT)
counter-increment: unquote('list-0')
&:before
content: unquote('counter(list-0, ' + LIST_STYLE[0] + ')') '. '
for num in (1..MAX_INDENT)
li.ql-indent-{num}
counter-increment: unquote('list-' + num)
&:before
content: unquote('counter(list-' + num + ', ' + LIST_STYLE[num%3] + ')') '. '
if (num < MAX_INDENT)
li.ql-indent-{num}
counter-reset: resets((num+1)..MAX_INDENT)
for num in (1..MAX_INDENT)
.ql-indent-{num}:not(.ql-direction-rtl)
padding-left: (3*num)em
li.ql-indent-{num}:not(.ql-direction-rtl)
padding-left: (3*num + LIST_STYLE_OUTER_WIDTH)em
.ql-indent-{num}.ql-direction-rtl.ql-align-right
padding-right: (3*num)em
li.ql-indent-{num}.ql-direction-rtl.ql-align-right
padding-right: (3*num + LIST_STYLE_OUTER_WIDTH)em
.ql-video
display: block
max-width: 100%
.ql-video.ql-align-center
margin: 0 auto
.ql-video.ql-align-right
margin: 0 0 0 auto
.ql-bg-black
background-color: rgb(0,0,0)
.ql-bg-red
background-color: rgb(230,0,0)
.ql-bg-orange
background-color: rgb(255,153,0)
.ql-bg-yellow
background-color: rgb(255,255,0)
.ql-bg-green
background-color: rgb(0,138,0)
.ql-bg-blue
background-color: rgb(0,102,204)
.ql-bg-purple
background-color: rgb(153,51,255)
.ql-color-white
color: rgb(255,255,255)
.ql-color-red
color: rgb(230,0,0)
.ql-color-orange
color: rgb(255,153,0)
.ql-color-yellow
color: rgb(255,255,0)
.ql-color-green
color: rgb(0,138,0)
.ql-color-blue
color: rgb(0,102,204)
.ql-color-purple
color: rgb(153,51,255)
.ql-font-serif
font-family: Georgia, Times New Roman, serif
.ql-font-monospace
font-family: Monaco, Courier New, monospace
.ql-size-small
font-size: 0.75em
.ql-size-large
font-size: 1.5em
.ql-size-huge
font-size: 2.5em
.ql-direction-rtl
direction: rtl
text-align: inherit
.ql-align-center
text-align: center
.ql-align-justify
text-align: justify
.ql-align-right
text-align: right
.ql-editor.ql-blank::before
color: rgba(0,0,0,0.6)
content: attr(data-placeholder)
font-style: italic
left: 15px
pointer-events: none
position: absolute
right: 15px
<svg viewbox="0 0 18 18">
<line class="ql-stroke" x1="15" x2="3" y1="9" y2="9"></line>
<line class="ql-stroke" x1="14" x2="4" y1="14" y2="14"></line>
<line class="ql-stroke" x1="12" x2="6" y1="4" y2="4"></line>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<line class="ql-stroke" x1="15" x2="3" y1="9" y2="9"></line>
<line class="ql-stroke" x1="15" x2="3" y1="14" y2="14"></line>
<line class="ql-stroke" x1="15" x2="3" y1="4" y2="4"></line>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<line class="ql-stroke" x1="3" x2="15" y1="9" y2="9"></line>
<line class="ql-stroke" x1="3" x2="13" y1="14" y2="14"></line>
<line class="ql-stroke" x1="3" x2="9" y1="4" y2="4"></line>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<line class="ql-stroke" x1="15" x2="3" y1="9" y2="9"></line>
<line class="ql-stroke" x1="15" x2="5" y1="14" y2="14"></line>
<line class="ql-stroke" x1="15" x2="9" y1="4" y2="4"></line>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<path class="ql-stroke" d="M6.6,11.4L9,9a1.456,1.456,0,0,1,2.059,2.059L7.971,14.147a2.912,2.912,0,0,1-4.118-4.118l6.177-6.177a2.912,2.912,0,0,1,4.118,4.118"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<ellipse class="ql-fill" cx="10.5" cy="14" rx="2.5" ry="2"></ellipse>
<path class="ql-stroke" d="M12,14V3c0,1.5,3,2.021,3,5"></path>
<path class="ql-fill" d="M7,4A5,5,0,0,0,7,14a3.191,3.191,0,0,1,3-2.957V5.023A4.955,4.955,0,0,0,7,4ZM4.06,8.412a0.5,0.5,0,0,1-.49.4,0.485,0.485,0,0,1-.1-0.01,0.5,0.5,0,0,1-.393-0.588A3.98,3.98,0,0,1,6.216,5.079a0.5,0.5,0,0,1,.2.98A2.985,2.985,0,0,0,4.06,8.412ZM7,10A1,1,0,1,1,8,9,1,1,0,0,1,7,10Z"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<line class="ql-stroke" x1="3" x2="15" y1="15" y2="15"></line>
<path class="ql-fill ql-stroke" d="M9,8H9a3,3,0,0,1,3,3v0a0,0,0,0,1,0,0H6a0,0,0,0,1,0,0v0A3,3,0,0,1,9,8Z"></path>
<path class="ql-even ql-fill" d="M11,5.01C11,6.021,10,9,9,9S7,6.021,7,5.01c0-1.651.292-2.99,2-2.99S11,3.359,11,5.01Z"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<g class="ql-fill ql-color-label">
<polygon points="6 6.868 6 6 5 6 5 7 5.942 7 6 6.868"></polygon>
<rect height="1" width="1" x="4" y="4"></rect>
<polygon points="6.817 5 6 5 6 6 6.38 6 6.817 5"></polygon>
<rect height="1" width="1" x="2" y="6"></rect>
<rect height="1" width="1" x="3" y="5"></rect>
<rect height="1" width="1" x="4" y="7"></rect>
<polygon points="4 11.439 4 11 3 11 3 12 3.755 12 4 11.439"></polygon>
<rect height="1" width="1" x="2" y="12"></rect>
<rect height="1" width="1" x="2" y="9"></rect>
<rect height="1" width="1" x="2" y="15"></rect>
<polygon points="4.63 10 4 10 4 11 4.192 11 4.63 10"></polygon>
<rect height="1" width="1" x="3" y="8"></rect>
<path d="M10.832,4.2L11,4.582V4H10.708A1.948,1.948,0,0,1,10.832,4.2Z"></path>
<path d="M7,4.582L7.168,4.2A1.929,1.929,0,0,1,7.292,4H7V4.582Z"></path>
<path d="M8,13H7.683l-0.351.8a1.933,1.933,0,0,1-.124.2H8V13Z"></path>
<rect height="1" width="1" x="12" y="2"></rect>
<rect height="1" width="1" x="11" y="3"></rect>
<path d="M9,3H8V3.282A1.985,1.985,0,0,1,9,3Z"></path>
<rect height="1" width="1" x="2" y="3"></rect>
<rect height="1" width="1" x="6" y="2"></rect>
<rect height="1" width="1" x="3" y="2"></rect>
<rect height="1" width="1" x="5" y="3"></rect>
<rect height="1" width="1" x="9" y="2"></rect>
<rect height="1" width="1" x="15" y="14"></rect>
<polygon points="13.447 10.174 13.469 10.225 13.472 10.232 13.808 11 14 11 14 10 13.37 10 13.447 10.174"></polygon>
<rect height="1" width="1" x="13" y="7"></rect>
<rect height="1" width="1" x="15" y="5"></rect>
<rect height="1" width="1" x="14" y="6"></rect>
<rect height="1" width="1" x="15" y="8"></rect>
<rect height="1" width="1" x="14" y="9"></rect>
<path d="M3.775,14H3v1H4V14.314A1.97,1.97,0,0,1,3.775,14Z"></path>
<rect height="1" width="1" x="14" y="3"></rect>
<polygon points="12 6.868 12 6 11.62 6 12 6.868"></polygon>
<rect height="1" width="1" x="15" y="2"></rect>
<rect height="1" width="1" x="12" y="5"></rect>
<rect height="1" width="1" x="13" y="4"></rect>
<polygon points="12.933 9 13 9 13 8 12.495 8 12.933 9"></polygon>
<rect height="1" width="1" x="9" y="14"></rect>
<rect height="1" width="1" x="8" y="15"></rect>
<path d="M6,14.926V15H7V14.316A1.993,1.993,0,0,1,6,14.926Z"></path>
<rect height="1" width="1" x="5" y="15"></rect>
<path d="M10.668,13.8L10.317,13H10v1h0.792A1.947,1.947,0,0,1,10.668,13.8Z"></path>
<rect height="1" width="1" x="11" y="15"></rect>
<path d="M14.332,12.2a1.99,1.99,0,0,1,.166.8H15V12H14.245Z"></path>
<rect height="1" width="1" x="14" y="15"></rect>
<rect height="1" width="1" x="15" y="11"></rect>
</g>
<polyline class="ql-stroke" points="5.5 13 9 5 12.5 13"></polyline>
<line class="ql-stroke" x1="11.63" x2="6.38" y1="11" y2="11"></line>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<rect class="ql-fill ql-stroke" height="3" width="3" x="4" y="5"></rect>
<rect class="ql-fill ql-stroke" height="3" width="3" x="11" y="5"></rect>
<path class="ql-even ql-fill ql-stroke" d="M7,8c0,4.031-3,5-3,5"></path>
<path class="ql-even ql-fill ql-stroke" d="M14,8c0,4.031-3,5-3,5"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<path class="ql-stroke" d="M5,4H9.5A2.5,2.5,0,0,1,12,6.5v0A2.5,2.5,0,0,1,9.5,9H5A0,0,0,0,1,5,9V4A0,0,0,0,1,5,4Z"></path>
<path class="ql-stroke" d="M5,9h5.5A2.5,2.5,0,0,1,13,11.5v0A2.5,2.5,0,0,1,10.5,14H5a0,0,0,0,1,0,0V9A0,0,0,0,1,5,9Z"></path>
</svg>
\ No newline at end of file
<svg class="" viewbox="0 0 18 18">
<line class="ql-stroke" x1="5" x2="13" y1="3" y2="3"></line>
<line class="ql-stroke" x1="6" x2="9.35" y1="12" y2="3"></line>
<line class="ql-stroke" x1="11" x2="15" y1="11" y2="15"></line>
<line class="ql-stroke" x1="15" x2="11" y1="11" y2="15"></line>
<rect class="ql-fill" height="1" rx="0.5" ry="0.5" width="7" x="2" y="14"></rect>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<polyline class="ql-even ql-stroke" points="5 7 3 9 5 11"></polyline>
<polyline class="ql-even ql-stroke" points="13 7 15 9 13 11"></polyline>
<line class="ql-stroke" x1="10" x2="8" y1="5" y2="13"></line>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<line class="ql-color-label ql-stroke ql-transparent" x1="3" x2="15" y1="15" y2="15"></line>
<polyline class="ql-stroke" points="5.5 11 9 3 12.5 11"></polyline>
<line class="ql-stroke" x1="11.63" x2="6.38" y1="9" y2="9"></line>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<path class="ql-stroke" d="M9,3C5.686,3,3,5.239,3,8a4.669,4.669,0,0,0,2,3.719V15l3.094-2.063A7.186,7.186,0,0,0,9,13c3.314,0,6-2.239,6-5S12.314,3,9,3Z"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<polygon class="ql-stroke ql-fill" points="3 11 5 9 3 7 3 11"></polygon>
<line class="ql-stroke ql-fill" x1="15" x2="11" y1="4" y2="4"></line>
<path class="ql-fill" d="M11,3a3,3,0,0,0,0,6h1V3H11Z"></path>
<rect class="ql-fill" height="11" width="1" x="11" y="4"></rect>
<rect class="ql-fill" height="11" width="1" x="13" y="4"></rect>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<polygon class="ql-stroke ql-fill" points="15 12 13 10 15 8 15 12"></polygon>
<line class="ql-stroke ql-fill" x1="9" x2="5" y1="4" y2="4"></line>
<path class="ql-fill" d="M5,3A3,3,0,0,0,5,9H6V3H5Z"></path>
<rect class="ql-fill" height="11" width="1" x="5" y="4"></rect>
<rect class="ql-fill" height="11" width="1" x="7" y="4"></rect>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<polygon class="ql-stroke" points="7 11 9 13 11 11 7 11"></polygon>
<polygon class="ql-stroke" points="7 7 9 5 11 7 7 7"></polygon>
</svg>
\ No newline at end of file
<svg viewBox="0 0 18 18">
<path class="ql-fill" d="M14.60284,8.5036A2.48315,2.48315,0,0,0,14.71429,7.8a2.34494,2.34494,0,0,0-2.28571-2.4,2.19651,2.19651,0,0,0-1.3631.48358A4.01147,4.01147,0,0,0,7.28571,3a4.1037,4.1037,0,0,0-4,4.2,4.40682,4.40682,0,0,0,.07642.79553A3.57444,3.57444,0,0,0,1,11.4,3.51743,3.51743,0,0,0,4.42859,15h9.42853A3.22436,3.22436,0,0,0,17,11.7,3.26609,3.26609,0,0,0,14.60284,8.5036ZM6.85352,10.64648a.49995.49995,0,1,1-.707.707l-1-1a.49982.49982,0,0,1,0-.707l1-1a.49995.49995,0,0,1,.707.707L6.207,10ZM9.48535,8.12109l-1,4A.5.5,0,0,1,8,12.5a.51952.51952,0,0,1-.12109-.01465.50066.50066,0,0,1-.36426-.60645l1-4a.50023.50023,0,0,1,.9707.24219Zm2.36816,2.23242-1,1a.49995.49995,0,0,1-.707-.707L10.793,10l-.64648-.64648a.49995.49995,0,0,1,.707-.707l1,1A.49982.49982,0,0,1,11.85352,10.35352Z"/>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<circle class="ql-fill" cx="7" cy="7" r="1"></circle>
<circle class="ql-fill" cx="11" cy="7" r="1"></circle>
<path class="ql-stroke" d="M7,10a2,2,0,0,0,4,0H7Z"></path>
<circle class="ql-stroke" cx="9" cy="9" r="6"></circle>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<path class="ql-fill" d="M14,16H4a1,1,0,0,1,0-2H14A1,1,0,0,1,14,16Z"/>
<path class="ql-fill" d="M14,4H4A1,1,0,0,1,4,2H14A1,1,0,0,1,14,4Z"/>
<rect class="ql-fill" x="3" y="6" width="12" height="6" rx="1" ry="1"/>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<path class="ql-fill" d="M13,16H5a1,1,0,0,1,0-2h8A1,1,0,0,1,13,16Z"/>
<path class="ql-fill" d="M13,4H5A1,1,0,0,1,5,2h8A1,1,0,0,1,13,4Z"/>
<rect class="ql-fill" x="2" y="6" width="14" height="6" rx="1" ry="1"/>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<path class="ql-fill" d="M15,8H13a1,1,0,0,1,0-2h2A1,1,0,0,1,15,8Z"/>
<path class="ql-fill" d="M15,12H13a1,1,0,0,1,0-2h2A1,1,0,0,1,15,12Z"/>
<path class="ql-fill" d="M15,16H5a1,1,0,0,1,0-2H15A1,1,0,0,1,15,16Z"/>
<path class="ql-fill" d="M15,4H5A1,1,0,0,1,5,2H15A1,1,0,0,1,15,4Z"/>
<rect class="ql-fill" x="2" y="6" width="8" height="6" rx="1" ry="1"/>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<path class="ql-fill" d="M5,8H3A1,1,0,0,1,3,6H5A1,1,0,0,1,5,8Z"/>
<path class="ql-fill" d="M5,12H3a1,1,0,0,1,0-2H5A1,1,0,0,1,5,12Z"/>
<path class="ql-fill" d="M13,16H3a1,1,0,0,1,0-2H13A1,1,0,0,1,13,16Z"/>
<path class="ql-fill" d="M13,4H3A1,1,0,0,1,3,2H13A1,1,0,0,1,13,4Z"/>
<rect class="ql-fill" x="8" y="6" width="8" height="6" rx="1" ry="1" transform="translate(24 18) rotate(-180)"/>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<polyline class="ql-stroke" points="3.5 14 7 4 10.5 14"></polyline>
<line class="ql-stroke" x1="9.45" x2="4.55" y1="11" y2="11"></line>
<path class="ql-fill" d="M13.636,5.013a4.016,4.016,0,0,0-1.863.472,0.42,0.42,0,0,0-.179.629l0.112,0.214a0.418,0.418,0,0,0,.625.191,2.557,2.557,0,0,1,1.183-.326A0.933,0.933,0,0,1,14.573,7.2V7.338H14.339c-1.272,0-3.325.281-3.325,1.954A1.75,1.75,0,0,0,12.9,11.011a2.072,2.072,0,0,0,1.785-1.078h0.022a1.132,1.132,0,0,0-.022.247V10.4a0.412,0.412,0,0,0,.457.472h0.379A0.416,0.416,0,0,0,15.99,10.4V7.293A2.121,2.121,0,0,0,13.636,5.013Zm0.948,3.4a1.452,1.452,0,0,1-1.305,1.505,0.775,0.775,0,0,1-.859-0.753c0-.854,1.216-0.966,1.93-0.966h0.234V8.416Z"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<path class="ql-fill" d="M11.759,2.482a2.561,2.561,0,0,0-3.53.607A7.656,7.656,0,0,0,6.8,6.2C6.109,9.188,5.275,14.677,4.15,14.927a1.545,1.545,0,0,0-1.3-.933A0.922,0.922,0,0,0,2,15.036S1.954,16,4.119,16s3.091-2.691,3.7-5.553c0.177-.826.36-1.726,0.554-2.6L8.775,6.2c0.381-1.421.807-2.521,1.306-2.676a1.014,1.014,0,0,0,1.02.56A0.966,0.966,0,0,0,11.759,2.482Z"></path>
<rect class="ql-fill" height="1.6" rx="0.8" ry="0.8" width="5" x="5.15" y="6.2"></rect>
<path class="ql-fill" d="M13.663,12.027a1.662,1.662,0,0,1,.266-0.276q0.193,0.069.456,0.138a2.1,2.1,0,0,0,.535.069,1.075,1.075,0,0,0,.767-0.3,1.044,1.044,0,0,0,.314-0.8,0.84,0.84,0,0,0-.238-0.619,0.8,0.8,0,0,0-.594-0.239,1.154,1.154,0,0,0-.781.3,4.607,4.607,0,0,0-.781,1q-0.091.15-.218,0.346l-0.246.38c-0.068-.288-0.137-0.582-0.212-0.885-0.459-1.847-2.494-.984-2.941-0.8-0.482.2-.353,0.647-0.094,0.529a0.869,0.869,0,0,1,1.281.585c0.217,0.751.377,1.436,0.527,2.038a5.688,5.688,0,0,1-.362.467,2.69,2.69,0,0,1-.264.271q-0.221-.08-0.471-0.147a2.029,2.029,0,0,0-.522-0.066,1.079,1.079,0,0,0-.768.3A1.058,1.058,0,0,0,9,15.131a0.82,0.82,0,0,0,.832.852,1.134,1.134,0,0,0,.787-0.3,5.11,5.11,0,0,0,.776-0.993q0.141-.219.215-0.34c0.046-.076.122-0.194,0.223-0.346a2.786,2.786,0,0,0,.918,1.726,2.582,2.582,0,0,0,2.376-.185c0.317-.181.212-0.565,0-0.494A0.807,0.807,0,0,1,14.176,15a5.159,5.159,0,0,1-.913-2.446l0,0Q13.487,12.24,13.663,12.027Z"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<line class="ql-stroke" x1="7" x2="6" y1="3" y2="15"></line>
<line class="ql-stroke" x1="12" x2="11" y1="3" y2="15"></line>
<line class="ql-stroke" x1="3.75" x2="14.75" y1="7" y2="7"></line>
<line class="ql-stroke" x1="3.25" x2="14.25" y1="11" y2="11"></line>
</svg>
\ No newline at end of file
<svg viewBox="0 0 18 18">
<path class="ql-fill" d="M16.73975,13.81445v.43945a.54085.54085,0,0,1-.605.60547H11.855a.58392.58392,0,0,1-.64893-.60547V14.0127c0-2.90527,3.39941-3.42187,3.39941-4.55469a.77675.77675,0,0,0-.84717-.78125,1.17684,1.17684,0,0,0-.83594.38477c-.2749.26367-.561.374-.85791.13184l-.4292-.34082c-.30811-.24219-.38525-.51758-.1543-.81445a2.97155,2.97155,0,0,1,2.45361-1.17676,2.45393,2.45393,0,0,1,2.68408,2.40918c0,2.45312-3.1792,2.92676-3.27832,3.93848h2.79443A.54085.54085,0,0,1,16.73975,13.81445ZM9,3A.99974.99974,0,0,0,8,4V8H3V4A1,1,0,0,0,1,4V14a1,1,0,0,0,2,0V10H8v4a1,1,0,0,0,2,0V4A.99974.99974,0,0,0,9,3Z"/>
</svg>
\ No newline at end of file
<svg viewBox="0 0 18 18">
<path class="ql-fill" d="M16.65186,12.30664a2.6742,2.6742,0,0,1-2.915,2.68457,3.96592,3.96592,0,0,1-2.25537-.6709.56007.56007,0,0,1-.13232-.83594L11.64648,13c.209-.34082.48389-.36328.82471-.1543a2.32654,2.32654,0,0,0,1.12256.33008c.71484,0,1.12207-.35156,1.12207-.78125,0-.61523-.61621-.86816-1.46338-.86816H13.2085a.65159.65159,0,0,1-.68213-.41895l-.05518-.10937a.67114.67114,0,0,1,.14307-.78125l.71533-.86914a8.55289,8.55289,0,0,1,.68213-.7373V8.58887a3.93913,3.93913,0,0,1-.748.05469H11.9873a.54085.54085,0,0,1-.605-.60547V7.59863a.54085.54085,0,0,1,.605-.60547h3.75146a.53773.53773,0,0,1,.60547.59375v.17676a1.03723,1.03723,0,0,1-.27539.748L14.74854,10.0293A2.31132,2.31132,0,0,1,16.65186,12.30664ZM9,3A.99974.99974,0,0,0,8,4V8H3V4A1,1,0,0,0,1,4V14a1,1,0,0,0,2,0V10H8v4a1,1,0,0,0,2,0V4A.99974.99974,0,0,0,9,3Z"/>
</svg>
\ No newline at end of file
<svg viewBox="0 0 18 18">
<path class="ql-fill" d="M10,4V14a1,1,0,0,1-2,0V10H3v4a1,1,0,0,1-2,0V4A1,1,0,0,1,3,4V8H8V4a1,1,0,0,1,2,0Zm7.05371,7.96582v.38477c0,.39648-.165.60547-.46191.60547h-.47314v1.29785a.54085.54085,0,0,1-.605.60547h-.69336a.54085.54085,0,0,1-.605-.60547V12.95605H11.333a.5412.5412,0,0,1-.60547-.60547v-.15332a1.199,1.199,0,0,1,.22021-.748l2.56348-4.05957a.7819.7819,0,0,1,.72607-.39648h1.27637a.54085.54085,0,0,1,.605.60547v3.7627h.33008A.54055.54055,0,0,1,17.05371,11.96582ZM14.28125,8.7207h-.022a4.18969,4.18969,0,0,1-.38525.81348l-1.188,1.80469v.02246h1.5293V9.60059A7.04058,7.04058,0,0,1,14.28125,8.7207Z"/>
</svg>
\ No newline at end of file
<svg viewBox="0 0 18 18">
<path class="ql-fill" d="M16.74023,12.18555a2.75131,2.75131,0,0,1-2.91553,2.80566,3.908,3.908,0,0,1-2.25537-.68164.54809.54809,0,0,1-.13184-.8252L11.73438,13c.209-.34082.48389-.36328.8252-.1543a2.23757,2.23757,0,0,0,1.1001.33008,1.01827,1.01827,0,0,0,1.1001-.96777c0-.61621-.53906-.97949-1.25439-.97949a2.15554,2.15554,0,0,0-.64893.09961,1.15209,1.15209,0,0,1-.814.01074l-.12109-.04395a.64116.64116,0,0,1-.45117-.71484l.231-3.00391a.56666.56666,0,0,1,.62744-.583H15.541a.54085.54085,0,0,1,.605.60547v.43945a.54085.54085,0,0,1-.605.60547H13.41748l-.04395.72559a1.29306,1.29306,0,0,1-.04395.30859h.022a2.39776,2.39776,0,0,1,.57227-.07715A2.53266,2.53266,0,0,1,16.74023,12.18555ZM9,3A.99974.99974,0,0,0,8,4V8H3V4A1,1,0,0,0,1,4V14a1,1,0,0,0,2,0V10H8v4a1,1,0,0,0,2,0V4A.99974.99974,0,0,0,9,3Z"/>
</svg>
\ No newline at end of file
<svg viewBox="0 0 18 18">
<path class="ql-fill" d="M14.51758,9.64453a1.85627,1.85627,0,0,0-1.24316.38477H13.252a1.73532,1.73532,0,0,1,1.72754-1.4082,2.66491,2.66491,0,0,1,.5498.06641c.35254.05469.57227.01074.70508-.40723l.16406-.5166a.53393.53393,0,0,0-.373-.75977,4.83723,4.83723,0,0,0-1.17773-.14258c-2.43164,0-3.7627,2.17773-3.7627,4.43359,0,2.47559,1.60645,3.69629,3.19043,3.69629A2.70585,2.70585,0,0,0,16.96,12.19727,2.43861,2.43861,0,0,0,14.51758,9.64453Zm-.23047,3.58691c-.67187,0-1.22168-.81445-1.22168-1.45215,0-.47363.30762-.583.72559-.583.96875,0,1.27734.59375,1.27734,1.12207A.82182.82182,0,0,1,14.28711,13.23145ZM10,4V14a1,1,0,0,1-2,0V10H3v4a1,1,0,0,1-2,0V4A1,1,0,0,1,3,4V8H8V4a1,1,0,0,1,2,0Z"/>
</svg>
\ No newline at end of file
<svg viewBox="0 0 18 18">
<path class="ql-fill" d="M10,4V14a1,1,0,0,1-2,0V10H3v4a1,1,0,0,1-2,0V4A1,1,0,0,1,3,4V8H8V4a1,1,0,0,1,2,0Zm6.06787,9.209H14.98975V7.59863a.54085.54085,0,0,0-.605-.60547h-.62744a1.01119,1.01119,0,0,0-.748.29688L11.645,8.56641a.5435.5435,0,0,0-.022.8584l.28613.30762a.53861.53861,0,0,0,.84717.0332l.09912-.08789a1.2137,1.2137,0,0,0,.2417-.35254h.02246s-.01123.30859-.01123.60547V13.209H12.041a.54085.54085,0,0,0-.605.60547v.43945a.54085.54085,0,0,0,.605.60547h4.02686a.54085.54085,0,0,0,.605-.60547v-.43945A.54085.54085,0,0,0,16.06787,13.209Z"/>
</svg>
\ No newline at end of file
<svg viewBox="0 0 18 18">
<path class="ql-fill" d="M15,12v2a.99942.99942,0,0,1-1,1H4a.99942.99942,0,0,1-1-1V12a1,1,0,0,1,2,0v1h8V12a1,1,0,0,1,2,0ZM14,3H4A.99942.99942,0,0,0,3,4V6A1,1,0,0,0,5,6V5h8V6a1,1,0,0,0,2,0V4A.99942.99942,0,0,0,14,3Z"/>
<path class="ql-fill" d="M15,10H3A1,1,0,0,1,3,8H15a1,1,0,0,1,0,2Z"/>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<rect class="ql-stroke" height="10" width="12" x="3" y="4"></rect>
<circle class="ql-fill" cx="6" cy="7" r="1"></circle>
<polyline class="ql-even ql-fill" points="5 12 5 11 7 9 8 10 11 7 13 9 13 12 5 12"></polyline>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<line class="ql-stroke" x1="3" x2="15" y1="14" y2="14"></line>
<line class="ql-stroke" x1="3" x2="15" y1="4" y2="4"></line>
<line class="ql-stroke" x1="9" x2="15" y1="9" y2="9"></line>
<polyline class="ql-fill ql-stroke" points="3 7 3 11 5 9 3 7"></polyline>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<line class="ql-stroke" x1="7" x2="13" y1="4" y2="4"></line>
<line class="ql-stroke" x1="5" x2="11" y1="14" y2="14"></line>
<line class="ql-stroke" x1="8" x2="10" y1="14" y2="4"></line>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<line class="ql-stroke" x1="7" x2="11" y1="7" y2="11"></line>
<path class="ql-even ql-stroke" d="M8.9,4.577a3.476,3.476,0,0,1,.36,4.679A3.476,3.476,0,0,1,4.577,8.9C3.185,7.5,2.035,6.4,4.217,4.217S7.5,3.185,8.9,4.577Z"></path>
<path class="ql-even ql-stroke" d="M13.423,9.1a3.476,3.476,0,0,0-4.679-.36,3.476,3.476,0,0,0,.36,4.679c1.392,1.392,2.5,2.542,4.679.36S14.815,10.5,13.423,9.1Z"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<line class="ql-stroke" x1="6" x2="15" y1="4" y2="4"></line>
<line class="ql-stroke" x1="6" x2="15" y1="9" y2="9"></line>
<line class="ql-stroke" x1="6" x2="15" y1="14" y2="14"></line>
<line class="ql-stroke" x1="3" x2="3" y1="4" y2="4"></line>
<line class="ql-stroke" x1="3" x2="3" y1="9" y2="9"></line>
<line class="ql-stroke" x1="3" x2="3" y1="14" y2="14"></line>
</svg>
\ No newline at end of file
<svg class="" viewbox="0 0 18 18">
<line class="ql-stroke" x1="9" x2="15" y1="4" y2="4"></line>
<polyline class="ql-stroke" points="3 4 4 5 6 3"></polyline>
<line class="ql-stroke" x1="9" x2="15" y1="14" y2="14"></line>
<polyline class="ql-stroke" points="3 14 4 15 6 13"></polyline>
<line class="ql-stroke" x1="9" x2="15" y1="9" y2="9"></line>
<polyline class="ql-stroke" points="3 9 4 10 6 8"></polyline>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<line class="ql-stroke" x1="7" x2="15" y1="4" y2="4"></line>
<line class="ql-stroke" x1="7" x2="15" y1="9" y2="9"></line>
<line class="ql-stroke" x1="7" x2="15" y1="14" y2="14"></line>
<line class="ql-stroke ql-thin" x1="2.5" x2="4.5" y1="5.5" y2="5.5"></line>
<path class="ql-fill" d="M3.5,6A0.5,0.5,0,0,1,3,5.5V3.085l-0.276.138A0.5,0.5,0,0,1,2.053,3c-0.124-.247-0.023-0.324.224-0.447l1-.5A0.5,0.5,0,0,1,4,2.5v3A0.5,0.5,0,0,1,3.5,6Z"></path>
<path class="ql-stroke ql-thin" d="M4.5,10.5h-2c0-.234,1.85-1.076,1.85-2.234A0.959,0.959,0,0,0,2.5,8.156"></path>
<path class="ql-stroke ql-thin" d="M2.5,14.846a0.959,0.959,0,0,0,1.85-.109A0.7,0.7,0,0,0,3.75,14a0.688,0.688,0,0,0,.6-0.736,0.959,0.959,0,0,0-1.85-.109"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<path class="ql-stroke" d="M12,5c0,1.1-2,4-2,4S8,6.1,8,5A2,2,0,0,1,12,5Z"></path>
<path class="ql-fill" d="M15.472,2.118a1,1,0,0,0-1.026.05l-1.067.712A3.944,3.944,0,0,1,14,4.869h0v7.6L12,13.8l-2.445-1.63a1,1,0,0,0-1.109,0L6,13.8,4,12.465v-7.6L5.445,5.832a0.992,0.992,0,0,0,.717.144A3.742,3.742,0,0,1,6,5a3.956,3.956,0,0,1,.258-1.374L6,3.8,3.555,2.168A1,1,0,0,0,2,3V13a1,1,0,0,0,.445.832l3,2a1,1,0,0,0,1.109,0L9,14.2l2.445,1.63a1,1,0,0,0,1.109,0l3-2A1,1,0,0,0,16,13V3A1,1,0,0,0,15.472,2.118Z"></path>
<path class="ql-fill" d="M12.092,14.938a4.2,4.2,0,0,0-1.936-3.032c-1.125-.656-2.425.738-2.75-0.687A2.036,2.036,0,0,0,5.688,9.656,2.878,2.878,0,0,0,3,8.653V13l3,2,3-2,3,2Z"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<circle class="ql-stroke" cx="9" cy="9" r="2"></circle>
<path class="ql-stroke" d="M11,14.651A6,6,0,1,1,15,9a2,2,0,0,1-4,0V7"></path>
</svg>
\ No newline at end of file
<svg viewBox="0 0 18 18">
<path class="ql-fill" d="M6,9.5A1.5,1.5,0,1,1,4.5,8,1.5,1.5,0,0,1,6,9.5ZM9.5,8A1.5,1.5,0,1,0,11,9.5,1.5,1.5,0,0,0,9.5,8Zm5,0A1.5,1.5,0,1,0,16,9.5,1.5,1.5,0,0,0,14.5,8Z"/>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<line class="ql-stroke" x1="3" x2="15" y1="14" y2="14"></line>
<line class="ql-stroke" x1="3" x2="15" y1="4" y2="4"></line>
<line class="ql-stroke" x1="9" x2="15" y1="9" y2="9"></line>
<polyline class="ql-stroke" points="5 7 5 11 3 9 5 7"></polyline>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<polygon class="ql-fill ql-stroke" points="12 10 14 12 16 10 12 10"></polygon>
<path class="ql-stroke" d="M9.91,13.91A4.6,4.6,0,0,1,9,14a5,5,0,1,1,5-5"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<polyline class="ql-stroke" points="3.5 14 7 4 10.5 14"></polyline>
<line class="ql-stroke" x1="9.45" x2="4.55" y1="11" y2="11"></line>
<rect class="ql-fill" height="5" rx="0.5" ry="0.5" transform="translate(20 -7) rotate(90)" width="1" x="13" y="4"></rect>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<polyline class="ql-stroke" points="3.5 14 7 4 10.5 14"></polyline>
<line class="ql-stroke" x1="9.45" x2="4.55" y1="11" y2="11"></line>
<rect class="ql-fill" height="5" rx="0.5" ry="0.5" width="1" x="13" y="4"></rect>
<rect class="ql-fill" height="5" rx="0.5" ry="0.5" transform="translate(20 -7) rotate(90)" width="1" x="13" y="4"></rect>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<polyline class="ql-stroke" points="3.5 14 7 4 10.5 14"></polyline>
<line class="ql-stroke" x1="9.45" x2="4.55" y1="11" y2="11"></line>
<path class="ql-fill" d="M12.09,7.55l1.7-1.473a0.337,0.337,0,0,1,.429,0l1.7,1.473A0.261,0.261,0,0,1,15.7,8H12.3A0.261,0.261,0,0,1,12.09,7.55Z"></path>
<path class="ql-fill" d="M12.09,10.45l1.7,1.473a0.337,0.337,0,0,0,.429,0l1.7-1.473A0.261,0.261,0,0,0,15.7,10H12.3A0.261,0.261,0,0,0,12.09,10.45Z"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<line class="ql-stroke" x1="10" x2="15" y1="4" y2="4"></line>
<line class="ql-stroke" x1="10" x2="15" y1="9" y2="9"></line>
<line class="ql-stroke" x1="10" x2="15" y1="14" y2="14"></line>
<polygon class="ql-fill ql-stroke" points="3 5 5 3 7 5 3 5"></polygon>
<line class="ql-stroke" x1="5" x2="5" y1="7" y2="5"></line>
<polygon class="ql-fill ql-stroke" points="3 13 5 15 7 13 3 13"></polygon>
<line class="ql-stroke" x1="5" x2="5" y1="11" y2="13"></line>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<path class="ql-stroke" d="M5,8a4,4,0,0,0,8,0"></path>
<line class="ql-stroke" x1="6" x2="12" y1="15" y2="15"></line>
<line class="ql-stroke" x1="9" x2="9" y1="12" y2="15"></line>
<rect class="ql-fill" height="8" rx="2" ry="2" width="4" x="7" y="2"></rect>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<line class="ql-stroke ql-thin" x1="15.5" x2="2.5" y1="8.5" y2="9.5"></line>
<path class="ql-fill" d="M9.007,8C6.542,7.791,6,7.519,6,6.5,6,5.792,7.283,5,9,5c1.571,0,2.765.679,2.969,1.309a1,1,0,0,0,1.9-.617C13.356,4.106,11.354,3,9,3,6.2,3,4,4.538,4,6.5a3.2,3.2,0,0,0,.5,1.843Z"></path>
<path class="ql-fill" d="M8.984,10C11.457,10.208,12,10.479,12,11.5c0,0.708-1.283,1.5-3,1.5-1.571,0-2.765-.679-2.969-1.309a1,1,0,1,0-1.9.617C4.644,13.894,6.646,15,9,15c2.8,0,5-1.538,5-3.5a3.2,3.2,0,0,0-.5-1.843Z"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<path class="ql-fill" d="M15.5,15H13.861a3.858,3.858,0,0,0,1.914-2.975,1.8,1.8,0,0,0-1.6-1.751A1.921,1.921,0,0,0,12.021,11.7a0.50013,0.50013,0,1,0,.957.291h0a0.914,0.914,0,0,1,1.053-.725,0.81,0.81,0,0,1,.744.762c0,1.076-1.16971,1.86982-1.93971,2.43082A1.45639,1.45639,0,0,0,12,15.5a0.5,0.5,0,0,0,.5.5h3A0.5,0.5,0,0,0,15.5,15Z"/>
<path class="ql-fill" d="M9.65,5.241a1,1,0,0,0-1.409.108L6,7.964,3.759,5.349A1,1,0,0,0,2.192,6.59178Q2.21541,6.6213,2.241,6.649L4.684,9.5,2.241,12.35A1,1,0,0,0,3.71,13.70722q0.02557-.02768.049-0.05722L6,11.036,8.241,13.65a1,1,0,1,0,1.567-1.24277Q9.78459,12.3777,9.759,12.35L7.316,9.5,9.759,6.651A1,1,0,0,0,9.65,5.241Z"/>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<path class="ql-fill" d="M15.5,7H13.861a4.015,4.015,0,0,0,1.914-2.975,1.8,1.8,0,0,0-1.6-1.751A1.922,1.922,0,0,0,12.021,3.7a0.5,0.5,0,1,0,.957.291,0.917,0.917,0,0,1,1.053-.725,0.81,0.81,0,0,1,.744.762c0,1.077-1.164,1.925-1.934,2.486A1.423,1.423,0,0,0,12,7.5a0.5,0.5,0,0,0,.5.5h3A0.5,0.5,0,0,0,15.5,7Z"/>
<path class="ql-fill" d="M9.651,5.241a1,1,0,0,0-1.41.108L6,7.964,3.759,5.349a1,1,0,1,0-1.519,1.3L4.683,9.5,2.241,12.35a1,1,0,1,0,1.519,1.3L6,11.036,8.241,13.65a1,1,0,0,0,1.519-1.3L7.317,9.5,9.759,6.651A1,1,0,0,0,9.651,5.241Z"/>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<rect class="ql-stroke-miter" height="12" width="12" x="3" y="3"></rect>
<line class="ql-stroke-miter" x1="9" x2="9" y1="3" y2="15"></line>
<line class="ql-stroke-miter" x1="15" x2="3" y1="9" y2="9"></line>
</svg>
<svg viewbox="0 0 18 18">
<g class="ql-fill ql-transparent">
<rect height="2" transform="translate(18 -12) rotate(90)" width="2" x="14" y="2"></rect>
<rect height="2" transform="translate(21 -9) rotate(90)" width="2" x="14" y="5"></rect>
<rect height="2" transform="translate(24 -6) rotate(90)" width="2" x="14" y="8"></rect>
<rect height="2" transform="translate(30 0) rotate(90)" width="2" x="14" y="14"></rect>
<rect height="2" transform="translate(27 -3) rotate(90)" width="2" x="14" y="11"></rect>
<rect height="2" transform="translate(6 0) rotate(90)" width="2" x="2" y="2"></rect>
<rect height="2" transform="translate(9 3) rotate(90)" width="2" x="2" y="5"></rect>
<rect height="2" transform="translate(12 6) rotate(90)" width="2" x="2" y="8"></rect>
<rect height="2" transform="translate(18 12) rotate(90)" width="2" x="2" y="14"></rect>
<rect height="2" transform="translate(15 9) rotate(90)" width="2" x="2" y="11"></rect>
</g>
<line class="ql-stroke-miter" x1="2" x2="16" y1="15" y2="15"></line>
<g class="ql-fill ql-transparent">
<rect height="2" width="2" x="5" y="2"></rect>
<rect height="2" width="2" x="8" y="2"></rect>
<rect height="2" width="2" x="11" y="2"></rect>
<rect height="2" width="2" x="5" y="14"></rect>
<rect height="2" width="2" x="8" y="14"></rect>
<rect height="2" width="2" x="8" y="11"></rect>
<rect height="2" width="2" x="8" y="8"></rect>
<rect height="2" width="2" x="8" y="5"></rect>
<rect height="2" transform="translate(15 3) rotate(90)" width="2" x="5" y="8"></rect>
<rect height="2" transform="translate(21 -3) rotate(90)" width="2" x="11" y="8"></rect>
<rect height="2" width="2" x="11" y="14"></rect>
</g>
</svg>
<svg viewbox="0 0 18 18">
<g class="ql-fill ql-transparent">
<rect height="2" transform="translate(30 6) rotate(180)" width="2" x="14" y="2"></rect>
<rect height="2" transform="translate(24 6) rotate(180)" width="2" x="11" y="2"></rect>
<rect height="2" transform="translate(18 6) rotate(180)" width="2" x="8" y="2"></rect>
<rect height="2" transform="translate(6 6) rotate(180)" width="2" x="2" y="2"></rect>
<rect height="2" transform="translate(12 6) rotate(180)" width="2" x="5" y="2"></rect>
<rect height="2" transform="translate(30 30) rotate(180)" width="2" x="14" y="14"></rect>
<rect height="2" transform="translate(24 30) rotate(180)" width="2" x="11" y="14"></rect>
<rect height="2" transform="translate(18 30) rotate(180)" width="2" x="8" y="14"></rect>
<rect height="2" transform="translate(6 30) rotate(180)" width="2" x="2" y="14"></rect>
<rect height="2" transform="translate(12 30) rotate(180)" width="2" x="5" y="14"></rect>
</g>
<line class="ql-stroke-miter" x1="3" x2="3" y1="16" y2="2"></line>
<g class="ql-fill ql-transparent">
<rect height="2" transform="translate(3 27) rotate(-90)" width="2" x="14" y="11"></rect>
<rect height="2" transform="translate(6 24) rotate(-90)" width="2" x="14" y="8"></rect>
<rect height="2" transform="translate(9 21) rotate(-90)" width="2" x="14" y="5"></rect>
<rect height="2" transform="translate(-9 15) rotate(-90)" width="2" x="2" y="11"></rect>
<rect height="2" transform="translate(-6 12) rotate(-90)" width="2" x="2" y="8"></rect>
<rect height="2" transform="translate(-3 15) rotate(-90)" width="2" x="5" y="8"></rect>
<rect height="2" transform="translate(0 18) rotate(-90)" width="2" x="8" y="8"></rect>
<rect height="2" transform="translate(3 21) rotate(-90)" width="2" x="11" y="8"></rect>
<rect height="2" transform="translate(18 24) rotate(180)" width="2" x="8" y="11"></rect>
<rect height="2" transform="translate(18 12) rotate(180)" width="2" x="8" y="5"></rect>
<rect height="2" transform="translate(-3 9) rotate(-90)" width="2" x="2" y="5"></rect>
</g>
</svg>
<svg viewbox="0 0 18 18">
<g class="ql-fill ql-transparent">
<rect height="2" width="2" x="2" y="2"></rect>
<rect height="2" width="2" x="5" y="2"></rect>
<rect height="2" width="2" x="8" y="2"></rect>
<rect height="2" width="2" x="14" y="2"></rect>
<rect height="2" width="2" x="11" y="2"></rect>
<rect height="2" width="2" x="2" y="14"></rect>
<rect height="2" width="2" x="5" y="14"></rect>
<rect height="2" width="2" x="8" y="14"></rect>
<rect height="2" width="2" x="14" y="14"></rect>
<rect height="2" width="2" x="11" y="14"></rect>
<rect height="2" transform="translate(-9 15) rotate(-90)" width="2" x="2" y="11"></rect>
<rect height="2" transform="translate(-6 12) rotate(-90)" width="2" x="2" y="8"></rect>
<rect height="2" transform="translate(-3 9) rotate(-90)" width="2" x="2" y="5"></rect>
<rect height="2" transform="translate(3 27) rotate(-90)" width="2" x="14" y="11"></rect>
<rect height="2" transform="translate(6 24) rotate(-90)" width="2" x="14" y="8"></rect>
<rect height="2" transform="translate(3 21) rotate(-90)" width="2" x="11" y="8"></rect>
<rect height="2" transform="translate(0 18) rotate(-90)" width="2" x="8" y="8"></rect>
<rect height="2" transform="translate(-3 15) rotate(-90)" width="2" x="5" y="8"></rect>
<rect height="2" width="2" x="8" y="11"></rect>
<rect height="2" width="2" x="8" y="5"></rect>
<rect height="2" transform="translate(9 21) rotate(-90)" width="2" x="14" y="5"></rect>
</g>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<defs>
<style>
.cls-1{opacity:0.4;}
.cls-2{fill:#444;}
.cls-3{fill:none;stroke:#444;stroke-miterlimit:10;stroke-width:2px;}
</style>
</defs>
<g class="ql-fill ql-transparent">
<rect height="2" width="2" x="2" y="2"></rect>
<rect height="2" width="2" x="5" y="2"></rect>
<rect height="2" width="2" x="8" y="2"></rect>
<rect height="2" width="2" x="14" y="2"></rect>
<rect height="2" width="2" x="11" y="2"></rect>
<rect height="2" width="2" x="2" y="14"></rect>
<rect height="2" width="2" x="5" y="14"></rect>
<rect height="2" width="2" x="8" y="14"></rect>
</g>
<rect class="ql-stroke-miter" height="12" width="12" x="3" y="3"></rect>
<g class="ql-fill ql-transparent">
<rect height="2" width="2" x="14" y="14"></rect>
<rect height="2" width="2" x="11" y="14"></rect>
<rect height="2" transform="translate(-9 15) rotate(-90)" width="2" x="2" y="11"></rect>
<rect height="2" transform="translate(-6 12) rotate(-90)" width="2" x="2" y="8"></rect>
<rect height="2" transform="translate(-3 9) rotate(-90)" width="2" x="2" y="5"></rect>
<rect height="2" transform="translate(3 27) rotate(-90)" width="2" x="14" y="11"></rect>
<rect height="2" transform="translate(6 24) rotate(-90)" width="2" x="14" y="8"></rect>
<rect height="2" transform="translate(3 21) rotate(-90)" width="2" x="11" y="8"></rect>
<rect height="2" transform="translate(0 18) rotate(-90)" width="2" x="8" y="8"></rect>
<rect height="2" transform="translate(-3 15) rotate(-90)" width="2" x="5" y="8"></rect>
<rect height="2" width="2" x="8" y="11"></rect>
<rect height="2" width="2" x="8" y="5"></rect>
<rect height="2" transform="translate(9 21) rotate(-90)" width="2" x="14" y="5"></rect>
</g>
</svg>
<svg viewbox="0 0 18 18">
<g class="ql-fill ql-transparent">
<rect height="2" width="2" x="2" y="2"></rect>
<rect height="2" width="2" x="5" y="2"></rect>
<rect height="2" width="2" x="8" y="2"></rect>
<rect height="2" width="2" x="14" y="2"></rect>
<rect height="2" width="2" x="11" y="2"></rect>
<rect height="2" width="2" x="2" y="14"></rect>
<rect height="2" width="2" x="5" y="14"></rect>
<rect height="2" width="2" x="8" y="14"></rect>
<rect height="2" width="2" x="14" y="14"></rect>
<rect height="2" width="2" x="11" y="14"></rect>
</g>
<line class="ql-stroke-miter" x1="15" x2="15" y1="16" y2="2"></line>
<g class="ql-fill ql-transparent">
<rect height="2" transform="translate(-9 15) rotate(-90)" width="2" x="2" y="11"></rect>
<rect height="2" transform="translate(-6 12) rotate(-90)" width="2" x="2" y="8"></rect>
<rect height="2" transform="translate(-3 9) rotate(-90)" width="2" x="2" y="5"></rect>
<rect height="2" transform="translate(3 27) rotate(-90)" width="2" x="14" y="11"></rect>
<rect height="2" transform="translate(6 24) rotate(-90)" width="2" x="14" y="8"></rect>
<rect height="2" transform="translate(3 21) rotate(-90)" width="2" x="11" y="8"></rect>
<rect height="2" transform="translate(0 18) rotate(-90)" width="2" x="8" y="8"></rect>
<rect height="2" transform="translate(-3 15) rotate(-90)" width="2" x="5" y="8"></rect>
<rect height="2" width="2" x="8" y="11"></rect>
<rect height="2" width="2" x="8" y="5"></rect>
<rect height="2" transform="translate(9 21) rotate(-90)" width="2" x="14" y="5"></rect>
</g>
</svg>
<svg viewbox="0 0 18 18">
<g class="ql-fill ql-transparent">
<rect height="2" transform="translate(-12 18) rotate(-90)" width="2" x="2" y="14"></rect>
<rect height="2" transform="translate(-9 15) rotate(-90)" width="2" x="2" y="11"></rect>
<rect height="2" transform="translate(-6 12) rotate(-90)" width="2" x="2" y="8"></rect>
<rect height="2" transform="translate(0 6) rotate(-90)" width="2" x="2" y="2"></rect>
<rect height="2" transform="translate(-3 9) rotate(-90)" width="2" x="2" y="5"></rect>
<rect height="2" transform="translate(0 30) rotate(-90)" width="2" x="14" y="14"></rect>
<rect height="2" transform="translate(3 27) rotate(-90)" width="2" x="14" y="11"></rect>
<rect height="2" transform="translate(6 24) rotate(-90)" width="2" x="14" y="8"></rect>
<rect height="2" transform="translate(12 18) rotate(-90)" width="2" x="14" y="2"></rect>
<rect height="2" transform="translate(9 21) rotate(-90)" width="2" x="14" y="5"></rect>
</g>
<line class="ql-stroke-miter" x1="16" x2="2" y1="3" y2="3"></line>
<g class="ql-fill ql-transparent">
<rect height="2" transform="translate(24 30) rotate(-180)" width="2" x="11" y="14"></rect>
<rect height="2" transform="translate(18 30) rotate(-180)" width="2" x="8" y="14"></rect>
<rect height="2" transform="translate(12 30) rotate(-180)" width="2" x="5" y="14"></rect>
<rect height="2" transform="translate(24 6) rotate(-180)" width="2" x="11" y="2"></rect>
<rect height="2" transform="translate(18 6) rotate(-180)" width="2" x="8" y="2"></rect>
<rect height="2" transform="translate(18 12) rotate(-180)" width="2" x="8" y="5"></rect>
<rect height="2" transform="translate(18 18) rotate(-180)" width="2" x="8" y="8"></rect>
<rect height="2" transform="translate(18 24) rotate(-180)" width="2" x="8" y="11"></rect>
<rect height="2" transform="translate(3 21) rotate(-90)" width="2" x="11" y="8"></rect>
<rect height="2" transform="translate(-3 15) rotate(-90)" width="2" x="5" y="8"></rect>
<rect height="2" transform="translate(12 6) rotate(-180)" width="2" x="5" y="2"></rect>
</g>
</svg>
<svg viewbox="0 0 18 18">
<path class="ql-fill" d="M15.707,7l1.146-1.146a0.5,0.5,0,1,0-.707-0.707L15,6.293,13.854,5.146a0.5,0.5,0,0,0-.707.707L14.293,7,13.146,8.146a0.5,0.5,0,1,0,.707.707L15,7.707l1.146,1.146a0.5,0.5,0,1,0,.707-0.707Z"></path>
<path class="ql-fill" d="M6,5H3A1,1,0,0,0,2,6V8A1,1,0,0,0,3,9H6V5Z"></path>
<path class="ql-fill" d="M10,5H7V9h3a1,1,0,0,0,1-1V6A1,1,0,0,0,10,5Z"></path>
<g class="ql-fill ql-transparent">
<path d="M8,11h4V9a1,1,0,0,0-1-1H8v3Z"></path>
<path d="M7,11V8H4A1,1,0,0,0,3,9v2H7Z"></path>
<path d="M7,12H3v2a1,1,0,0,0,1,1H7V12Z"></path>
<path d="M8,12v3h3a1,1,0,0,0,1-1V12H8Z"></path>
<path d="M8,6h3a1,1,0,0,0,1-1V3a1,1,0,0,0-1-1H8V6Z"></path>
<path d="M4,6H7V2H4A1,1,0,0,0,3,3V5A1,1,0,0,0,4,6Z"></path>
</g>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<g class="ql-fill ql-transparent">
<rect height="10" rx="1" ry="1" width="4" x="2" y="6"></rect>
<rect height="10" rx="1" ry="1" width="4" x="12" y="6"></rect>
</g>
<rect class="ql-fill" height="8" rx="1" ry="1" width="4" x="7" y="2"></rect>
<path class="ql-fill" d="M9.707,13l1.146-1.146a0.5,0.5,0,0,0-.707-0.707L9,12.293,7.854,11.146a0.5,0.5,0,0,0-.707.707L8.293,13,7.146,14.146a0.5,0.5,0,1,0,.707.707L9,13.707l1.146,1.146a0.5,0.5,0,0,0,.707-0.707Z"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<g class="ql-fill ql-stroke ql-thin ql-transparent">
<rect height="3" rx="0.5" ry="0.5" width="7" x="4.5" y="2.5"></rect>
<rect height="3" rx="0.5" ry="0.5" width="7" x="4.5" y="12.5"></rect>
</g>
<rect class="ql-fill ql-stroke ql-thin" height="3" rx="0.5" ry="0.5" width="7" x="8.5" y="7.5"></rect>
<line class="ql-stroke ql-thin" x1="6.5" x2="3.5" y1="7.5" y2="10.5"></line>
<line class="ql-stroke ql-thin" x1="3.5" x2="6.5" y1="7.5" y2="10.5"></line>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<g class="ql-fill ql-transparent">
<path d="M11,11h4V9a1,1,0,0,0-1-1H11v3Z"></path>
<path d="M10,11V8H7A1,1,0,0,0,6,9v2h4Z"></path>
<path d="M10,12H6v2a1,1,0,0,0,1,1h3V12Z"></path>
<path d="M11,12v3h3a1,1,0,0,0,1-1V12H11Z"></path>
<path d="M11,6h3a1,1,0,0,0,1-1V3a1,1,0,0,0-1-1H11V6Z"></path>
<path d="M7,6h3V2H7A1,1,0,0,0,6,3V5A1,1,0,0,0,7,6Z"></path>
</g>
<path class="ql-fill" d="M5,6H4V5a0.5,0.5,0,0,0-.854-0.354l-2,2a0.5,0.5,0,0,0,0,.707l2,2A0.5,0.5,0,0,0,3.5,9.5a0.494,0.494,0,0,0,.191-0.038A0.5,0.5,0,0,0,4,9V8H5A1,1,0,0,0,5,6Z"></path>
<path class="ql-fill" d="M15,5H12V9h3a1,1,0,0,0,1-1V6A1,1,0,0,0,15,5Z"></path>
<path class="ql-fill" d="M11,5H8A1,1,0,0,0,7,6V8A1,1,0,0,0,8,9h3V5Z"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<g class="ql-fill ql-transparent">
<rect height="10" rx="1" ry="1" width="4" x="12" y="2"></rect>
<rect height="10" rx="1" ry="1" width="4" x="2" y="2"></rect>
</g>
<path class="ql-fill" d="M11.354,4.146l-2-2a0.5,0.5,0,0,0-.707,0l-2,2A0.5,0.5,0,0,0,7,5H8V6a1,1,0,0,0,2,0V5h1A0.5,0.5,0,0,0,11.354,4.146Z"></path>
<rect class="ql-fill" height="8" rx="1" ry="1" width="4" x="7" y="8"></rect>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<g class="ql-fill ql-stroke ql-thin ql-transparent">
<rect height="3" rx="0.5" ry="0.5" width="7" x="4.5" y="2.5"></rect>
<rect height="3" rx="0.5" ry="0.5" width="7" x="4.5" y="12.5"></rect>
</g>
<rect class="ql-fill ql-stroke ql-thin" height="3" rx="0.5" ry="0.5" width="7" x="8.5" y="7.5"></rect>
<polygon class="ql-fill ql-stroke ql-thin" points="4.5 11 2.5 9 4.5 7 4.5 11"></polygon>
<line class="ql-stroke" x1="6" x2="4" y1="9" y2="9"></line>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<rect class="ql-stroke" height="4" width="12" x="3" y="7"></rect>
<path class="ql-fill ql-transparent" d="M2,2V16H16V2H2ZM14,14H10V11H8v3H4V4H8V7h2V4h4V14Z"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<rect class="ql-stroke" height="4" width="12" x="3" y="7"></rect>
<path class="ql-fill ql-transparent" d="M2,2V16H16V2H2ZM14,14H10V11H8v3H4V4H8V7h2V4h4V14Z"></path>
<line class="ql-stroke" x1="12" x2="12" y1="11" y2="7"></line>
<line class="ql-stroke" x1="9" x2="9" y1="11" y2="7"></line>
<line class="ql-stroke" x1="6" x2="6" y1="11" y2="7"></line>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<rect class="ql-stroke" height="12" width="12" x="3" y="3"></rect>
<rect class="ql-fill" height="2" width="3" x="5" y="5"></rect>
<rect class="ql-fill" height="2" width="4" x="9" y="5"></rect>
<g class="ql-fill ql-transparent">
<rect height="2" width="3" x="5" y="8"></rect>
<rect height="2" width="4" x="9" y="8"></rect>
<rect height="2" width="3" x="5" y="11"></rect>
<rect height="2" width="4" x="9" y="11"></rect>
</g>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<path class="ql-stroke" d="M5,3V9a4.012,4.012,0,0,0,4,4H9a4.012,4.012,0,0,0,4-4V3"></path>
<rect class="ql-fill" height="1" rx="0.5" ry="0.5" width="12" x="3" y="15"></rect>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<polygon class="ql-fill ql-stroke" points="6 10 4 12 2 10 6 10"></polygon>
<path class="ql-stroke" d="M8.09,13.91A4.6,4.6,0,0,0,9,14,5,5,0,1,0,4,9"></path>
</svg>
\ No newline at end of file
<svg viewbox="0 0 18 18">
<rect class="ql-stroke" height="12" width="12" x="3" y="3"></rect>
<rect class="ql-fill" height="12" width="1" x="5" y="3"></rect>
<rect class="ql-fill" height="12" width="1" x="12" y="3"></rect>
<rect class="ql-fill" height="2" width="8" x="5" y="8"></rect>
<rect class="ql-fill" height="1" width="3" x="3" y="5"></rect>
<rect class="ql-fill" height="1" width="3" x="3" y="7"></rect>
<rect class="ql-fill" height="1" width="3" x="3" y="10"></rect>
<rect class="ql-fill" height="1" width="3" x="3" y="12"></rect>
<rect class="ql-fill" height="1" width="3" x="12" y="5"></rect>
<rect class="ql-fill" height="1" width="3" x="12" y="7"></rect>
<rect class="ql-fill" height="1" width="3" x="12" y="10"></rect>
<rect class="ql-fill" height="1" width="3" x="12" y="12"></rect>
</svg>
\ No newline at end of file
themeName = 'snow'
activeColor = #06c
borderColor = #ccc
backgroundColor = #fff
inactiveColor = #444
shadowColor = #ddd
textColor = #444
@import './core'
@import './base'
@import './snow/*'
.ql-snow
a
color: activeColor
.ql-container.ql-snow
border: 1px solid borderColor
.ql-toolbar.ql-snow
border: 1px solid borderColor
box-sizing: border-box
font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif
padding: 8px
.ql-formats
margin-right: 15px
.ql-picker-label
border: 1px solid transparent
.ql-picker-options
border: 1px solid transparent
box-shadow: rgba(0,0,0,0.2) 0 2px 8px
.ql-picker.ql-expanded
.ql-picker-label
border-color: borderColor
.ql-picker-options
border-color: borderColor
.ql-color-picker
.ql-picker-item.ql-selected, .ql-picker-item:hover
border-color: #000
.ql-toolbar.ql-snow + .ql-container.ql-snow
border-top: 0px;
tooltipMargin = 8px
.ql-snow
.ql-tooltip
background-color: #fff
border: 1px solid borderColor
box-shadow: 0px 0px 5px shadowColor
color: textColor
padding: 5px 12px
white-space: nowrap
&::before
content: "Visit URL:"
line-height: 26px
margin-right: tooltipMargin
input[type=text]
display: none
border: 1px solid borderColor
font-size: 13px
height: 26px
margin: 0px
padding: 3px 5px
width: 170px
a.ql-preview
display: inline-block
max-width: 200px
overflow-x: hidden
text-overflow: ellipsis
vertical-align: top
a.ql-action::after
border-right: 1px solid borderColor
content: 'Edit'
margin-left: tooltipMargin*2
padding-right: tooltipMargin
a.ql-remove::before
content: 'Remove'
margin-left: tooltipMargin
a
line-height: 26px
.ql-tooltip.ql-editing
a.ql-preview, a.ql-remove
display: none
input[type=text]
display: inline-block
a.ql-action::after
border-right: 0px
content: 'Save'
padding-right: 0px
.ql-tooltip[data-mode=link]::before
content: "Enter link:"
.ql-tooltip[data-mode=formula]::before
content: "Enter formula:"
.ql-tooltip[data-mode=video]::before
content: "Enter video:"
import extend from 'extend';
import Delta from 'quill-delta';
import Parchment from 'parchment';
import Break from './break';
import Inline from './inline';
import TextBlot from './text';
const NEWLINE_LENGTH = 1;
class BlockEmbed extends Parchment.Embed {
attach() {
super.attach();
this.attributes = new Parchment.Attributor.Store(this.domNode);
}
delta() {
return new Delta().insert(this.value(), extend(this.formats(), this.attributes.values()));
}
format(name, value) {
let attribute = Parchment.query(name, Parchment.Scope.BLOCK_ATTRIBUTE);
if (attribute != null) {
this.attributes.attribute(attribute, value);
}
}
formatAt(index, length, name, value) {
this.format(name, value);
}
insertAt(index, value, def) {
if (typeof value === 'string' && value.endsWith('\n')) {
let block = Parchment.create(Block.blotName);
this.parent.insertBefore(block, index === 0 ? this : this.next);
block.insertAt(0, value.slice(0, -1));
} else {
super.insertAt(index, value, def);
}
}
}
BlockEmbed.scope = Parchment.Scope.BLOCK_BLOT;
// It is important for cursor behavior BlockEmbeds use tags that are block level elements
class Block extends Parchment.Block {
constructor(domNode) {
super(domNode);
this.cache = {};
}
delta() {
if (this.cache.delta == null) {
this.cache.delta = this.descendants(Parchment.Leaf).reduce((delta, leaf) => {
if (leaf.length() === 0) {
return delta;
} else {
return delta.insert(leaf.value(), bubbleFormats(leaf));
}
}, new Delta()).insert('\n', bubbleFormats(this));
}
return this.cache.delta;
}
deleteAt(index, length) {
super.deleteAt(index, length);
this.cache = {};
}
formatAt(index, length, name, value) {
if (length <= 0) return;
if (Parchment.query(name, Parchment.Scope.BLOCK)) {
if (index + length === this.length()) {
this.format(name, value);
}
} else {
super.formatAt(index, Math.min(length, this.length() - index - 1), name, value);
}
this.cache = {};
}
insertAt(index, value, def) {
if (def != null) return super.insertAt(index, value, def);
if (value.length === 0) return;
let lines = value.split('\n');
let text = lines.shift();
if (text.length > 0) {
if (index < this.length() - 1 || this.children.tail == null) {
super.insertAt(Math.min(index, this.length() - 1), text);
} else {
this.children.tail.insertAt(this.children.tail.length(), text);
}
this.cache = {};
}
let block = this;
lines.reduce(function(index, line) {
block = block.split(index, true);
block.insertAt(0, line);
return line.length;
}, index + text.length);
}
insertBefore(blot, ref) {
let head = this.children.head;
super.insertBefore(blot, ref);
if (head instanceof Break) {
head.remove();
}
this.cache = {};
}
length() {
if (this.cache.length == null) {
this.cache.length = super.length() + NEWLINE_LENGTH;
}
return this.cache.length;
}
moveChildren(target, ref) {
super.moveChildren(target, ref);
this.cache = {};
}
optimize(context) {
super.optimize(context);
this.cache = {};
}
path(index) {
return super.path(index, true);
}
removeChild(child) {
super.removeChild(child);
this.cache = {};
}
split(index, force = false) {
if (force && (index === 0 || index >= this.length() - NEWLINE_LENGTH)) {
let clone = this.clone();
if (index === 0) {
this.parent.insertBefore(clone, this);
return this;
} else {
this.parent.insertBefore(clone, this.next);
return clone;
}
} else {
let next = super.split(index, force);
this.cache = {};
return next;
}
}
}
Block.blotName = 'block';
Block.tagName = 'P';
Block.defaultChild = 'break';
Block.allowedChildren = [Inline, Parchment.Embed, TextBlot];
function bubbleFormats(blot, formats = {}) {
if (blot == null) return formats;
if (typeof blot.formats === 'function') {
formats = extend(formats, blot.formats());
}
if (blot.parent == null || blot.parent.blotName == 'scroll' || blot.parent.statics.scope !== blot.statics.scope) {
return formats;
}
return bubbleFormats(blot.parent, formats);
}
export { bubbleFormats, BlockEmbed, Block as default };
import Parchment from 'parchment';
class Break extends Parchment.Embed {
static value() {
return undefined;
}
insertInto(parent, ref) {
if (parent.children.length === 0) {
super.insertInto(parent, ref);
} else {
this.remove();
}
}
length() {
return 0;
}
value() {
return '';
}
}
Break.blotName = 'break';
Break.tagName = 'BR';
export default Break;
import Parchment from 'parchment';
import Block, { BlockEmbed } from './block';
class Container extends Parchment.Container { }
Container.allowedChildren = [Block, BlockEmbed, Container];
export default Container;
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment