Major rewrite, no more separate CDN

This commit is contained in:
Vjacheslav Trushkin 2017-12-04 22:00:22 +02:00
parent fdc00aaa8a
commit ccfc7e6d31
18 changed files with 2385 additions and 405 deletions

1
.gitignore vendored
View File

@ -5,4 +5,5 @@ package-lock.json
region.txt
.reload
*.log
_debug*.*
.ssl/ssl.*

View File

@ -4,3 +4,5 @@
node_modules
npm-debug.log
tests
debug
_debug*.*

227
app.js
View File

@ -11,14 +11,19 @@
// True if server should include default icons set
const serveDefaultIcons = true;
// Directory with json files for custom icon sets
// Directories with json files for custom icon sets
// Use simple-svg-tools package to create json collections
const customIconsDirectory = 'json';
const customIconDirectories = ['json'];
// HTTP port
// Run ssl.js for SSL support
const port = process.env.PORT || 3000;
// Cache configuration
const cache = 604800, // cache time in seconds
cacheMin = cache, // minimum cache refresh time in seconds
cachePrivate = false; // True if cache is private. Used in Cache-Control header in response
/*
* Main stuff
*/
@ -30,13 +35,11 @@ const fs = require('fs'),
// Debug stuff
version = JSON.parse(fs.readFileSync('package.json', 'utf8')).version,
// CDN stuff
cdn = require('simple-svg-cdn');
// Included files
Collections = require('./src/collections'),
// Cache time
const cache = 604800; // cache time in seconds
const cacheMin = cache; // minimum cache refresh time in seconds
const cachePrivate = false; // True if cache is private
// Query parser
parseQuery = require('./src/query');
// Region file to easy identify server in CDN
let region = '';
@ -64,56 +67,118 @@ if (reloadKey.length < 8 || reloadKey.length > 64) {
// Icons module
const icons = serveDefaultIcons ? require('simple-svg-icons') : null;
// Collections list
let collections = null,
loading = true;
/**
* Load icons
*
* @returns {Promise}
*/
function loadIcons() {
cdn.clearCollections();
console.log('Loading collections at ' + (new Date()).toString());
return new Promise((fulfill, reject) => {
let t = Date.now(),
newCollections = new Collections(console.log);
// Load default collections
if (icons !== null) {
Object.keys(icons.collections()).forEach(prefix => {
let filename = icons.locate(prefix),
data;
try {
data = fs.readFileSync(filename, 'utf8');
data = JSON.parse(data);
cdn.deOptimize(data);
} catch (err) {
console.log(err);
return;
}
console.log('Added premade collection: ' + prefix);
cdn.addCollection(prefix, data);
console.log('Loading collections at ' + (new Date()).toString());
// Load default collections
if (icons !== null) {
Object.keys(icons.collections()).forEach(prefix => {
newCollections.addFile(icons.locate(prefix));
});
}
// Add collections from "json" directory
customIconDirectories.forEach(dir => {
newCollections.addDirectory(dir);
});
}
// Add collections from "json" directory
let files;
try {
files = fs.readdirSync(customIconsDirectory);
} catch (err) {
files = [];
}
files.forEach(file => {
let list = file.split('.');
if (list.length !== 2 || list[1] !== 'json') {
newCollections.load().then(() => {
console.log('Loaded in ' + (Date.now() - t) + 'ms');
fulfill(newCollections);
}).catch(err => {
reject(err);
});
});
}
/**
* Parse request
*
* @param {string} prefix
* @param {string} query
* @param {string} ext
* @param {object} req
* @param {object} res
*/
function parseRequest(prefix, query, ext, req, res) {
function parse() {
let result = 404,
collection = collections.find(prefix);
if (collection !== null) {
result = parseQuery(collection, query, ext, req.query);
}
if (typeof result === 'number') {
res.sendStatus(result);
return;
}
try {
let data = fs.readFileSync(customIconsDirectory + '/' + file, 'utf8');
data = JSON.parse(data);
cdn.deOptimize(data);
console.log('Added custom collection: ' + list[0]);
cdn.addCollection(list[0], data);
} catch (err) {
}
});
// Sort collections
cdn.sortPrefixes();
// Send cache header
if (
cache &&
(req.get('Pragma') === void 0 || req.get('Pragma').indexOf('no-cache') === -1) &&
(req.get('Cache-Control') === void 0 || req.get('Cache-Control').indexOf('no-cache') === -1)
) {
res.set('Cache-Control', (cachePrivate ? 'private' : 'public') + ', max-age=' + cache + ', min-refresh=' + cacheMin);
if (!cachePrivate) {
res.set('Pragma', 'cache');
}
}
// Check for download
if (result.filename !== void 0 && (req.query.download === '1' || req.query.download === 'true')) {
res.set('Content-Disposition', 'attachment; filename="' + result.filename + '"');
}
// Send data
res.type(result.type).send(result.body);
}
// Parse query
if (collections === null) {
// This means script is still loading
// Attempt to parse query every 100ms for up to 2 seconds
let attempts = 0,
timer = setInterval(function() {
attempts ++;
if (collections === null) {
if (attempts > 20) {
clearInterval(timer);
res.sendStatus(503);
}
} else {
clearInterval(timer);
parse();
}
}, 100);
} else {
parse();
}
}
// Load icons
loadIcons();
loadIcons().then(newCollections => {
collections = newCollections;
loading = false;
}).catch(err => {
console.log('Fatal error loading collections:', err);
loading = false;
});
// Disable X-Powered-By header
app.disable('x-powered-by');
@ -127,43 +192,39 @@ app.options('/*', (req, res) => {
res.send(200);
});
// GET request
app.get(/\/([a-z0-9\-\/]+)\.(js|json|svg)$/, (req, res) => {
let parts = req.params[0].split('/'),
result = 404;
// GET 3 part request
app.get(/^\/([a-z0-9-]+)\/([a-z0-9-]+)\.(js|json|svg)$/, (req, res) => {
// prefix/icon.svg
// prefix/icons.json
parseRequest(req.params[0], req.params[1], req.params[2], req, res);
});
if (parts.length) {
let collection = cdn.getCollection(parts[0]);
// GET 2 part JS/JSON request
app.get(/^\/([a-z0-9-]+)\.(js|json)$/, (req, res) => {
// prefix.json
parseRequest(req.params[0], 'icons', req.params[1], req, res);
});
if (collection !== null) {
result = cdn.parseQuery(collection, parts, req.params[1], req.query);
}
}
// GET 2 part SVG request
app.get(/^\/([a-z0-9:-]+)\.svg$/, (req, res) => {
let parts = req.params[0].split(':');
if (typeof result === 'number') {
res.sendStatus(result);
if (parts.length === 2) {
// prefix:icon.svg
parseRequest(parts[0], parts[1], 'svg', req, res);
return;
}
// Send cache header
if (
cache &&
(req.get('Pragma') === void 0 || req.get('Pragma').indexOf('no-cache') === -1) &&
(req.get('Cache-Control') === void 0 || req.get('Cache-Control').indexOf('no-cache') === -1)
) {
res.set('Cache-Control', (cachePrivate ? 'private' : 'public') + ', max-age=' + cache + ', min-refresh=' + cacheMin);
if (!cachePrivate) {
res.set('Pragma', 'cache');
if (parts.length === 1) {
parts = parts[0].split('-');
if (parts.length > 1) {
// prefix-icon.svg
parseRequest(parts.shift(), parts.join('-'), 'svg', req, res);
return;
}
}
// Check for download
if (result.filename !== void 0 && (req.query.download === '1' || req.query.download === 'true')) {
res.set('Content-Disposition', 'attachment; filename="' + result.filename + '"');
}
// Send data
res.type(result.type).send(result.body);
res.sendStatus(404);
});
// Debug information and AWS health check
@ -180,7 +241,19 @@ app.get('/version', (req, res) => {
app.get('/reload', (req, res) => {
if (reloadKey.length && req.query && req.query.key && req.query.key === reloadKey) {
// Reload collections
process.nextTick(loadIcons);
process.nextTick(() => {
if (loading) {
return;
}
loading = true;
loadIcons().then(newCollections => {
collections = newCollections;
loading = false;
}).catch(err => {
console.log('Fatal error loading collections:', err);
loading = false;
});
});
}
res.sendStatus(200);

View File

@ -1,619 +1,616 @@
{
"icons": {
"arty-stroke-16-arc-180": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M64 24c22.143 0 40 17.906 40 40s-17.863 40-40 40h-8\" class=\"animation-delay-0 animation-duration-11 animate-stroke stroke-length-153\"/><path d=\"M40 104l16 16\" class=\"animation-delay-9 animation-duration-2 animate-stroke stroke-length-30\"/><path d=\"M40 104l16-16\" class=\"animation-delay-9 animation-duration-2 animate-stroke stroke-length-30\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-arc-180": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M64 24c22.143 0 40 17.906 40 40s-17.863 40-40 40h-8\" class=\"animation-delay-0 animation-duration-11 animate-stroke stroke-length-153\"/><path d=\"M40 104l16 16\" class=\"animation-delay-9 animation-duration-2 animate-stroke stroke-length-30\"/><path d=\"M40 104l16-16\" class=\"animation-delay-9 animation-duration-2 animate-stroke stroke-length-30\"/></g>"
},
"arty-stroke-16-arc-270": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M64 24c22.143 0 40 17.906 40 40s-17.863 40-40 40-40-17.906-40-40v-8\" class=\"animation-delay-0 animation-duration-12 animate-stroke stroke-length-230\"/><path d=\"M24 40L8 56\" class=\"animation-delay-10 animation-duration-1 animate-stroke stroke-length-30\"/><path d=\"M24 40l16 16\" class=\"animation-delay-10 animation-duration-1 animate-stroke stroke-length-30\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-arc-270": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M64 24c22.143 0 40 17.906 40 40s-17.863 40-40 40-40-17.906-40-40v-8\" class=\"animation-delay-0 animation-duration-12 animate-stroke stroke-length-230\"/><path d=\"M24 40L8 56\" class=\"animation-delay-10 animation-duration-1 animate-stroke stroke-length-30\"/><path d=\"M24 40l16 16\" class=\"animation-delay-10 animation-duration-1 animate-stroke stroke-length-30\"/></g>"
},
"arty-stroke-16-arc-90": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\" stroke-linecap=\"round\"><path d=\"M64 24c22.143 0 40 17.906 40 40v8\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-102\"/><path d=\"M104 88l16-16\" class=\"animation-delay-8 animation-duration-3 animate-stroke stroke-length-30\"/><path d=\"M104 88L88 72\" class=\"animation-delay-8 animation-duration-3 animate-stroke stroke-length-30\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-arc-90": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\" stroke-linecap=\"round\"><path d=\"M64 24c22.143 0 40 17.906 40 40v8\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-102\"/><path d=\"M104 88l16-16\" class=\"animation-delay-8 animation-duration-3 animate-stroke stroke-length-30\"/><path d=\"M104 88L88 72\" class=\"animation-delay-8 animation-duration-3 animate-stroke stroke-length-30\"/></g>"
},
"arty-stroke-16-arrow-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M120 64H16\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-153\"/><path d=\"M8 64l40 40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M8 64l40-40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-arrow-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M120 64H16\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-153\"/><path d=\"M8 64l40 40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M8 64l40-40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/></g>"
},
"arty-stroke-16-arrows-from-2-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M48 80H16\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M48 80v32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M80 48V16\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M80 48h32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 120l36-36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M120 8L84 44\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-arrows-from-2-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M48 80H16\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M48 80v32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M80 48V16\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M80 48h32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 120l36-36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M120 8L84 44\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/></g>"
},
"arty-stroke-16-arrows-from-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M48 48V16\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M80 80v32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M80 48V16\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M48 80v32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M80 80h32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M48 48H16\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M48 80H16\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M80 48h32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 120l36-36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M120 8L84 44\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M120 120L84 84\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M8 8l36 36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-arrows-from-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M48 48V16\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M80 80v32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M80 48V16\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M48 80v32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M80 80h32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M48 48H16\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M48 80H16\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M80 48h32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 120l36-36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M120 8L84 44\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M120 120L84 84\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M8 8l36 36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/></g>"
},
"arty-stroke-16-arrows-horizontal": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M56 88h56\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M72 40H16\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M120 88L96 64\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 88l-24 24\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 40l24-24\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 40l24 24\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-arrows-horizontal": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M56 88h56\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M72 40H16\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M120 88L96 64\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 88l-24 24\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 40l24-24\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 40l24 24\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/></g>"
},
"arty-stroke-16-arrows-to-2-corners": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 120V88\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 120h32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 8H88\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 8v32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M52 76l-36 36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M76 52l36-36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-arrows-to-2-corners": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 120V88\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 120h32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 8H88\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 8v32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M52 76l-36 36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M76 52l36-36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/></g>"
},
"arty-stroke-16-arrows-to-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 120V88\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 8v32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 120V88\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 8v32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 120h32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 8H88\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 120H88\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 8h32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M48 80l-36 36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M80 48l36-36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M80 80l36 36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M48 48L12 12\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-arrows-to-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 120V88\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 8v32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 120V88\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 8v32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 120h32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 8H88\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 120H88\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 8h32\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M48 80l-36 36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M80 48l36-36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M80 80l36 36\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M48 48L12 12\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/></g>"
},
"arty-stroke-16-caret-up-outline": {
"body": "<path d=\"M38 74l26-26 26 26z\" stroke-linecap=\"round\" stroke-width=\"12\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/>",
"width": 128,
"height": 128
"arty-animated:16-caret-up-outline": {
"body": "<path d=\"M38 74l26-26 26 26z\" stroke-linecap=\"round\" stroke-width=\"12\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/>"
},
"arty-stroke-16-caret-up": {
"body": "<path d=\"M24 80l40-40 40 40z\" fill=\"currentColor\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/>",
"width": 128,
"height": 128
"arty-animated:16-caret-up": {
"body": "<path d=\"M24 80l40-40 40 40z\" fill=\"currentColor\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/>"
},
"arty-stroke-16-carets-vertical-outline": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"12\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M38 78l26 26 26-26z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/><path d=\"M38 50l26-26 26 26z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-carets-vertical-outline": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"12\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M38 78l26 26 26-26z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/><path d=\"M38 50l26-26 26 26z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/></g>"
},
"arty-stroke-16-carets-vertical": {
"body": "<g fill=\"currentColor\" fill-rule=\"evenodd\"><path d=\"M24 72l40 40 40-40z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/><path d=\"M24 56l40-40 40 40z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-carets-vertical": {
"body": "<g fill=\"currentColor\" fill-rule=\"evenodd\"><path d=\"M24 72l40 40 40-40z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/><path d=\"M24 56l40-40 40 40z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/></g>"
},
"arty-stroke-16-chevron-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M40 64l48-48\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-102\"/><path d=\"M40 64l48 48\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-102\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-chevron-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M40 64l48-48\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-102\"/><path d=\"M40 64l48 48\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-102\"/></g>"
},
"arty-stroke-16-close": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 8l112 112\" class=\"animation-delay-0 animation-duration-6 animate-stroke stroke-length-230\"/><path d=\"M8 120L120 8\" class=\"animation-delay-6 animation-duration-6 animate-stroke stroke-length-230\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-close": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 8l112 112\" class=\"animation-delay-0 animation-duration-6 animate-stroke stroke-length-230\"/><path d=\"M8 120L120 8\" class=\"animation-delay-6 animation-duration-6 animate-stroke stroke-length-230\"/></g>"
},
"arty-stroke-16-confirm": {
"body": "<path d=\"M8 64l48 48 64-96\" stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-230\"/>",
"width": 128,
"height": 128
"arty-animated:16-confirm": {
"body": "<path d=\"M8 64l48 48 64-96\" stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-230\"/>"
},
"arty-stroke-16-double-arrow-horizontal": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M64 64h48\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M64 64H16\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M120 64L96 40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 64L96 88\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 64l24-24\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 64l24 24\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-double-arrow-horizontal": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M64 64h48\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M64 64H16\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-68\"/><path d=\"M120 64L96 40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M120 64L96 88\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 64l24-24\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 64l24 24\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/></g>"
},
"arty-stroke-16-drop-outline": {
"body": "<path d=\"M64 8S24 54 24 82c0 22 16 38 40 38s40-16 40-38c0-28-40-74-40-74z\" stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-345\"/>",
"width": 128,
"height": 128
"arty-animated:16-drop-outline": {
"body": "<path d=\"M64 8S24 54 24 82c0 22 16 38 40 38s40-16 40-38c0-28-40-74-40-74z\" stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-345\"/>"
},
"arty-stroke-16-drop": {
"body": "<g fill=\"none\" fill-rule=\"evenodd\"><path d=\"M64 8S24 54 24 82c0 22 16 38 40 38s40-16 40-38c0-28-40-74-40-74z\" stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-345\"/><path d=\"M64 8S24 54 24 82c0 12.676 5.311 23.36 14.404 30.139l57.8-56.002C84.565 33.594 64 8 64 8z\" fill=\"currentColor\" class=\"animation-delay-9 animation-duration-4 animate-fill\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-drop": {
"body": "<g fill=\"none\" fill-rule=\"evenodd\"><path d=\"M64 8S24 54 24 82c0 22 16 38 40 38s40-16 40-38c0-28-40-74-40-74z\" stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-345\"/><path d=\"M64 8S24 54 24 82c0 12.676 5.311 23.36 14.404 30.139l57.8-56.002C84.565 33.594 64 8 64 8z\" fill=\"currentColor\" class=\"animation-delay-9 animation-duration-4 animate-fill\"/></g>"
},
"arty-stroke-16-filters": {
"body": "<g stroke=\"currentColor\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M24 8v40\" stroke-width=\"16\" class=\"animation-delay-0 animation-duration-3 animate-stroke stroke-length-45\"/><path d=\"M24 104v16\" stroke-width=\"16\" class=\"animation-delay-3 animation-duration-1 animate-stroke stroke-length-20\"/><path d=\"M12 76h24\" stroke-width=\"24\" class=\"animation-delay-4 animation-duration-2 animate-stroke stroke-length-30\"/><path d=\"M64 8v8\" stroke-width=\"16\" class=\"animation-delay-6 animation-duration-1 animate-stroke stroke-length-9\"/><path d=\"M64 72v48\" stroke-width=\"16\" class=\"animation-delay-6 animation-duration-3 animate-stroke stroke-length-68\"/><path d=\"M52 44h24\" stroke-width=\"24\" class=\"animation-delay-9 animation-duration-2 animate-stroke stroke-length-30\"/><path d=\"M104 8v48\" stroke-width=\"16\" class=\"animation-delay-11 animation-duration-3 animate-stroke stroke-length-68\"/><path d=\"M104 112v8\" stroke-width=\"16\" class=\"animation-delay-14 animation-duration-1 animate-stroke stroke-length-9\"/><path d=\"M92 84h24\" stroke-width=\"24\" class=\"animation-delay-15 animation-duration-2 animate-stroke stroke-length-30\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-filters": {
"body": "<g stroke=\"currentColor\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M24 8v40\" stroke-width=\"16\" class=\"animation-delay-0 animation-duration-3 animate-stroke stroke-length-45\"/><path d=\"M24 104v16\" stroke-width=\"16\" class=\"animation-delay-3 animation-duration-1 animate-stroke stroke-length-20\"/><path d=\"M12 76h24\" stroke-width=\"24\" class=\"animation-delay-4 animation-duration-2 animate-stroke stroke-length-30\"/><path d=\"M64 8v8\" stroke-width=\"16\" class=\"animation-delay-6 animation-duration-1 animate-stroke stroke-length-9\"/><path d=\"M64 72v48\" stroke-width=\"16\" class=\"animation-delay-6 animation-duration-3 animate-stroke stroke-length-68\"/><path d=\"M52 44h24\" stroke-width=\"24\" class=\"animation-delay-9 animation-duration-2 animate-stroke stroke-length-30\"/><path d=\"M104 8v48\" stroke-width=\"16\" class=\"animation-delay-11 animation-duration-3 animate-stroke stroke-length-68\"/><path d=\"M104 112v8\" stroke-width=\"16\" class=\"animation-delay-14 animation-duration-1 animate-stroke stroke-length-9\"/><path d=\"M92 84h24\" stroke-width=\"24\" class=\"animation-delay-15 animation-duration-2 animate-stroke stroke-length-30\"/></g>"
},
"arty-stroke-16-grid-3-outline": {
"body": "<g transform=\"translate(4 4)\" stroke=\"currentColor\" stroke-width=\"8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\"><circle cx=\"12\" cy=\"12\" r=\"12\" class=\"animation-delay-0 animation-duration-2 animate-fill\"/><circle cx=\"60\" cy=\"12\" r=\"12\" class=\"animation-delay-2 animation-duration-2 animate-fill\"/><circle cx=\"108\" cy=\"12\" r=\"12\" class=\"animation-delay-4 animation-duration-2 animate-fill\"/><circle cx=\"12\" cy=\"60\" r=\"12\" class=\"animation-delay-6 animation-duration-2 animate-fill\"/><circle cx=\"60\" cy=\"60\" r=\"12\" class=\"animation-delay-7 animation-duration-2 animate-fill\"/><circle cx=\"108\" cy=\"60\" r=\"12\" class=\"animation-delay-9 animation-duration-2 animate-fill\"/><circle cx=\"12\" cy=\"108\" r=\"12\" class=\"animation-delay-11 animation-duration-2 animate-fill\"/><circle cx=\"60\" cy=\"108\" r=\"12\" class=\"animation-delay-13 animation-duration-2 animate-fill\"/><circle cx=\"108\" cy=\"108\" r=\"12\" class=\"animation-delay-15 animation-duration-2 animate-fill\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-grid-3-outline": {
"body": "<g transform=\"translate(4 4)\" stroke=\"currentColor\" stroke-width=\"8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\"><circle cx=\"12\" cy=\"12\" r=\"12\" class=\"animation-delay-0 animation-duration-2 animate-fill\"/><circle cx=\"60\" cy=\"12\" r=\"12\" class=\"animation-delay-2 animation-duration-2 animate-fill\"/><circle cx=\"108\" cy=\"12\" r=\"12\" class=\"animation-delay-4 animation-duration-2 animate-fill\"/><circle cx=\"12\" cy=\"60\" r=\"12\" class=\"animation-delay-6 animation-duration-2 animate-fill\"/><circle cx=\"60\" cy=\"60\" r=\"12\" class=\"animation-delay-7 animation-duration-2 animate-fill\"/><circle cx=\"108\" cy=\"60\" r=\"12\" class=\"animation-delay-9 animation-duration-2 animate-fill\"/><circle cx=\"12\" cy=\"108\" r=\"12\" class=\"animation-delay-11 animation-duration-2 animate-fill\"/><circle cx=\"60\" cy=\"108\" r=\"12\" class=\"animation-delay-13 animation-duration-2 animate-fill\"/><circle cx=\"108\" cy=\"108\" r=\"12\" class=\"animation-delay-15 animation-duration-2 animate-fill\"/></g>"
},
"arty-stroke-16-grid-3": {
"body": "<g fill=\"currentColor\" fill-rule=\"evenodd\"><circle cx=\"16\" cy=\"16\" r=\"16\" class=\"animation-delay-0 animation-duration-2 animate-fill\"/><circle cx=\"64\" cy=\"16\" r=\"16\" class=\"animation-delay-2 animation-duration-2 animate-fill\"/><circle cx=\"112\" cy=\"16\" r=\"16\" class=\"animation-delay-4 animation-duration-2 animate-fill\"/><circle cx=\"16\" cy=\"64\" r=\"16\" class=\"animation-delay-6 animation-duration-2 animate-fill\"/><circle cx=\"64\" cy=\"64\" r=\"16\" class=\"animation-delay-7 animation-duration-2 animate-fill\"/><circle cx=\"112\" cy=\"64\" r=\"16\" class=\"animation-delay-9 animation-duration-2 animate-fill\"/><circle cx=\"16\" cy=\"112\" r=\"16\" class=\"animation-delay-11 animation-duration-2 animate-fill\"/><circle cx=\"64\" cy=\"112\" r=\"16\" class=\"animation-delay-13 animation-duration-2 animate-fill\"/><circle cx=\"112\" cy=\"112\" r=\"16\" class=\"animation-delay-15 animation-duration-2 animate-fill\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-grid-3": {
"body": "<g fill=\"currentColor\" fill-rule=\"evenodd\"><circle cx=\"16\" cy=\"16\" r=\"16\" class=\"animation-delay-0 animation-duration-2 animate-fill\"/><circle cx=\"64\" cy=\"16\" r=\"16\" class=\"animation-delay-2 animation-duration-2 animate-fill\"/><circle cx=\"112\" cy=\"16\" r=\"16\" class=\"animation-delay-4 animation-duration-2 animate-fill\"/><circle cx=\"16\" cy=\"64\" r=\"16\" class=\"animation-delay-6 animation-duration-2 animate-fill\"/><circle cx=\"64\" cy=\"64\" r=\"16\" class=\"animation-delay-7 animation-duration-2 animate-fill\"/><circle cx=\"112\" cy=\"64\" r=\"16\" class=\"animation-delay-9 animation-duration-2 animate-fill\"/><circle cx=\"16\" cy=\"112\" r=\"16\" class=\"animation-delay-11 animation-duration-2 animate-fill\"/><circle cx=\"64\" cy=\"112\" r=\"16\" class=\"animation-delay-13 animation-duration-2 animate-fill\"/><circle cx=\"112\" cy=\"112\" r=\"16\" class=\"animation-delay-15 animation-duration-2 animate-fill\"/></g>"
},
"arty-stroke-16-list-3-outline": {
"body": "<g transform=\"translate(4 4)\" stroke=\"currentColor\" stroke-width=\"8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\"><circle cx=\"12\" cy=\"12\" r=\"12\" class=\"animation-delay-0 animation-duration-3 animate-fill\"/><rect x=\"48\" width=\"72\" height=\"24\" rx=\"12\" class=\"animation-delay-3 animation-duration-3 animate-fill\"/><circle cx=\"12\" cy=\"60\" r=\"12\" class=\"animation-delay-5 animation-duration-3 animate-fill\"/><rect x=\"48\" y=\"48\" width=\"72\" height=\"24\" rx=\"12\" class=\"animation-delay-8 animation-duration-3 animate-fill\"/><circle cx=\"12\" cy=\"108\" r=\"12\" class=\"animation-delay-11 animation-duration-3 animate-fill\"/><rect x=\"48\" y=\"96\" width=\"72\" height=\"24\" rx=\"12\" class=\"animation-delay-13 animation-duration-3 animate-fill\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-list-3-outline": {
"body": "<g transform=\"translate(4 4)\" stroke=\"currentColor\" stroke-width=\"8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\"><circle cx=\"12\" cy=\"12\" r=\"12\" class=\"animation-delay-0 animation-duration-3 animate-fill\"/><rect x=\"48\" width=\"72\" height=\"24\" rx=\"12\" class=\"animation-delay-3 animation-duration-3 animate-fill\"/><circle cx=\"12\" cy=\"60\" r=\"12\" class=\"animation-delay-5 animation-duration-3 animate-fill\"/><rect x=\"48\" y=\"48\" width=\"72\" height=\"24\" rx=\"12\" class=\"animation-delay-8 animation-duration-3 animate-fill\"/><circle cx=\"12\" cy=\"108\" r=\"12\" class=\"animation-delay-11 animation-duration-3 animate-fill\"/><rect x=\"48\" y=\"96\" width=\"72\" height=\"24\" rx=\"12\" class=\"animation-delay-13 animation-duration-3 animate-fill\"/></g>"
},
"arty-stroke-16-list-3": {
"body": "<g fill=\"none\" fill-rule=\"evenodd\"><circle fill=\"currentColor\" cx=\"16\" cy=\"16\" r=\"16\" class=\"animation-delay-0 animation-duration-4 animate-fill\"/><path d=\"M64 16h48\" stroke=\"currentColor\" stroke-width=\"32\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-4 animation-duration-1 animate-stroke stroke-length-68\"/><circle fill=\"currentColor\" cx=\"16\" cy=\"64\" r=\"16\" class=\"animation-delay-5 animation-duration-4 animate-fill\"/><path d=\"M64 64h48\" stroke=\"currentColor\" stroke-width=\"32\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-1 animate-stroke stroke-length-68\"/><circle fill=\"currentColor\" cx=\"16\" cy=\"112\" r=\"16\" class=\"animation-delay-11 animation-duration-4 animate-fill\"/><path d=\"M64 112h48\" stroke=\"currentColor\" stroke-width=\"32\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-14 animation-duration-1 animate-stroke stroke-length-68\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-list-3": {
"body": "<g fill=\"none\" fill-rule=\"evenodd\"><circle fill=\"currentColor\" cx=\"16\" cy=\"16\" r=\"16\" class=\"animation-delay-0 animation-duration-4 animate-fill\"/><path d=\"M64 16h48\" stroke=\"currentColor\" stroke-width=\"32\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-4 animation-duration-1 animate-stroke stroke-length-68\"/><circle fill=\"currentColor\" cx=\"16\" cy=\"64\" r=\"16\" class=\"animation-delay-5 animation-duration-4 animate-fill\"/><path d=\"M64 64h48\" stroke=\"currentColor\" stroke-width=\"32\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-1 animate-stroke stroke-length-68\"/><circle fill=\"currentColor\" cx=\"16\" cy=\"112\" r=\"16\" class=\"animation-delay-11 animation-duration-4 animate-fill\"/><path d=\"M64 112h48\" stroke=\"currentColor\" stroke-width=\"32\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-14 animation-duration-1 animate-stroke stroke-length-68\"/></g>"
},
"arty-stroke-16-panel-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 64l32 32\" stroke-linejoin=\"round\" class=\"animation-delay-11 animation-duration-3 animate-stroke stroke-length-68\"/><path d=\"M8 64l32-32\" stroke-linejoin=\"round\" class=\"animation-delay-11 animation-duration-3 animate-stroke stroke-length-68\"/><path d=\"M92 64H16\" class=\"animation-delay-7 animation-duration-5 animate-stroke stroke-length-102\"/><path d=\"M120 8v112\" stroke-linejoin=\"round\" class=\"animation-delay-0 animation-duration-7 animate-stroke stroke-length-153\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-panel-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 64l32 32\" stroke-linejoin=\"round\" class=\"animation-delay-11 animation-duration-3 animate-stroke stroke-length-68\"/><path d=\"M8 64l32-32\" stroke-linejoin=\"round\" class=\"animation-delay-11 animation-duration-3 animate-stroke stroke-length-68\"/><path d=\"M92 64H16\" class=\"animation-delay-7 animation-duration-5 animate-stroke stroke-length-102\"/><path d=\"M120 8v112\" stroke-linejoin=\"round\" class=\"animation-delay-0 animation-duration-7 animate-stroke stroke-length-153\"/></g>"
},
"arty-stroke-16-search": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M52 76L8 120\" class=\"animation-delay-10 animation-duration-3 animate-stroke stroke-length-102\"/><path d=\"M51.92 76.364C44.558 69.06 40 58.965 40 48 40 25.909 57.857 8 80 8s40 17.909 40 40-17.86 40-40 40c-11.186 0-20.866-4.48-28.08-11.636z\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-345\"/></g>",
"width": 128,
"height": 128
"arty-animated:16-search": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M52 76L8 120\" class=\"animation-delay-10 animation-duration-3 animate-stroke stroke-length-102\"/><path d=\"M51.92 76.364C44.558 69.06 40 58.965 40 48 40 25.909 57.857 8 80 8s40 17.909 40 40-17.86 40-40 40c-11.186 0-20.866-4.48-28.08-11.636z\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-345\"/></g>"
},
"arty-stroke-20-arc-180": {
"arty-animated:20-arc-180": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M80 32c26.571 0 48 21.488 48 48s-21.435 48-48 48H64\" class=\"animation-delay-0 animation-duration-11 animate-stroke stroke-length-230\"/><path d=\"M48 128l24 24\" class=\"animation-delay-9 animation-duration-2 animate-stroke stroke-length-45\"/><path d=\"M48 128l24-24\" class=\"animation-delay-9 animation-duration-2 animate-stroke stroke-length-45\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-arc-270": {
"arty-animated:20-arc-270": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M80 32c26.571 0 48 21.488 48 48s-21.435 48-48 48-48-21.488-48-48V64\" class=\"animation-delay-0 animation-duration-11 animate-stroke stroke-length-345\"/><path d=\"M32 56L8 80\" class=\"animation-delay-9 animation-duration-2 animate-stroke stroke-length-45\"/><path d=\"M32 56l24 24\" class=\"animation-delay-9 animation-duration-2 animate-stroke stroke-length-45\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-arc-90": {
"arty-animated:20-arc-90": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\" stroke-linecap=\"round\"><path d=\"M80 32c26.571 0 48 21.488 48 48v16\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-102\"/><path d=\"M128 112l24-24\" class=\"animation-delay-7 animation-duration-4 animate-stroke stroke-length-45\"/><path d=\"M128 112l-24-24\" class=\"animation-delay-7 animation-duration-4 animate-stroke stroke-length-45\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-arrow-left": {
"arty-animated:20-arrow-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M152 80H16\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M8 80l48 48\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-102\"/><path d=\"M8 80l48-48\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-102\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-arrows-from-2-corners": {
"arty-animated:20-arrows-from-2-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M64 96H24\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M64 96v40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M96 64V24\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M96 64h40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 152l52-52\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M152 8l-52 52\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-arrows-from-corners": {
"arty-animated:20-arrows-from-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M64 64V24\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M96 96v40\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M96 64V24\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M64 96v40\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M96 96h40\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M64 64H24\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M64 96H24\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M96 64h40\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 152l52-52\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M152 8l-52 52\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M152 152l-52-52\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M8 8l52 52\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-arrows-horizontal": {
"arty-animated:20-arrows-horizontal": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M72 112h72\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M88 48H16\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M152 112l-32-32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M152 112l-32 32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M8 48l32-32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M8 48l32 32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-arrows-to-2-corners": {
"arty-animated:20-arrows-to-2-corners": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 152v-40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 152h40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M152 8h-40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M152 8v40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M68 92l-52 52\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M92 68l52-52\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-arrows-to-corners": {
"arty-animated:20-arrows-to-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 152v-40\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M152 8v40\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M152 152v-40\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 8v40\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 152h40\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M152 8h-40\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M152 152h-40\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M8 8h40\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-45\"/><path d=\"M64 96l-52 52\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M96 64l52-52\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M96 96l52 52\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M64 64L12 12\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-caret-up-outline": {
"body": "<path d=\"M46 90l34-34 34 34z\" stroke-width=\"12\" stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/>",
"arty-animated:20-caret-up-outline": {
"body": "<path d=\"M46 90l34-34 34 34z\" stroke-linecap=\"round\" stroke-width=\"12\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/>",
"width": 160,
"height": 160
},
"arty-stroke-20-caret-up": {
"arty-animated:20-caret-up": {
"body": "<path d=\"M32 96l48-48 48 48z\" fill=\"currentColor\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/>",
"width": 160,
"height": 160
},
"arty-stroke-20-carets-vertical-outline": {
"arty-animated:20-carets-vertical-outline": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"12\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M46 94l34 34 34-34z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/><path d=\"M46 66l34-34 34 34z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-carets-vertical": {
"arty-animated:20-carets-vertical": {
"body": "<g fill=\"currentColor\" fill-rule=\"evenodd\"><path d=\"M32 88l48 48 48-48z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/><path d=\"M32 72l48-48 48 48z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-chevron-left": {
"arty-animated:20-chevron-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M48 80l64-64\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-102\"/><path d=\"M48 80l64 64\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-102\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-close": {
"arty-animated:20-close": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 8l144 144\" class=\"animation-delay-0 animation-duration-6 animate-stroke stroke-length-230\"/><path d=\"M8 152L152 8\" class=\"animation-delay-6 animation-duration-6 animate-stroke stroke-length-230\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-confirm": {
"arty-animated:20-confirm": {
"body": "<path d=\"M8 80l64 64 80-128\" stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-345\"/>",
"width": 160,
"height": 160
},
"arty-stroke-20-double-arrow-horizontal": {
"arty-animated:20-double-arrow-horizontal": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M80 80h64\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M80 80H16\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M152 80l-32-32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M152 80l-32 32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M8 80l32-32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M8 80l32 32\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-panel-left": {
"arty-animated:20-panel-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 80l48 48\" stroke-linejoin=\"round\" class=\"animation-delay-11 animation-duration-3 animate-stroke stroke-length-102\"/><path d=\"M8 80l48-48\" stroke-linejoin=\"round\" class=\"animation-delay-11 animation-duration-3 animate-stroke stroke-length-102\"/><path d=\"M124 80H16\" class=\"animation-delay-6 animation-duration-5 animate-stroke stroke-length-153\"/><path d=\"M152 8v144\" stroke-linejoin=\"round\" class=\"animation-delay-0 animation-duration-6 animate-stroke stroke-length-230\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-20-search": {
"arty-animated:20-search": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M68 92L8 152\" class=\"animation-delay-10 animation-duration-3 animate-stroke stroke-length-102\"/><path d=\"M70.305 90.037C61.468 81.271 56 69.158 56 56c0-26.51 21.429-48 48-48s48 21.49 48 48-21.433 48-48 48c-13.423 0-25.039-5.376-33.695-13.963z\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-345\"/></g>",
"width": 160,
"height": 160
},
"arty-stroke-24-arc-180": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M96 32c35.429 0 64 28.65 64 64s-28.58 64-64 64H80\" class=\"animation-delay-0 animation-duration-11 animate-stroke stroke-length-345\"/><path d=\"M64 160l24 24\" class=\"animation-delay-9 animation-duration-2 animate-stroke stroke-length-45\"/><path d=\"M64 160l24-24\" class=\"animation-delay-9 animation-duration-2 animate-stroke stroke-length-45\"/></g>"
"arty-animated:24-arc-180": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M96 32c35.429 0 64 28.65 64 64s-28.58 64-64 64H80\" class=\"animation-delay-0 animation-duration-11 animate-stroke stroke-length-345\"/><path d=\"M64 160l24 24\" class=\"animation-delay-9 animation-duration-2 animate-stroke stroke-length-45\"/><path d=\"M64 160l24-24\" class=\"animation-delay-9 animation-duration-2 animate-stroke stroke-length-45\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-arc-270": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M96 32c35.429 0 64 28.65 64 64s-28.58 64-64 64-64-28.65-64-64V80\" class=\"animation-delay-0 animation-duration-12 animate-stroke stroke-length-500\"/><path d=\"M32 64L8 88\" class=\"animation-delay-10 animation-duration-1 animate-stroke stroke-length-45\"/><path d=\"M32 64l24 24\" class=\"animation-delay-10 animation-duration-1 animate-stroke stroke-length-45\"/></g>"
"arty-animated:24-arc-270": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M96 32c35.429 0 64 28.65 64 64s-28.58 64-64 64-64-28.65-64-64V80\" class=\"animation-delay-0 animation-duration-12 animate-stroke stroke-length-500\"/><path d=\"M32 64L8 88\" class=\"animation-delay-10 animation-duration-1 animate-stroke stroke-length-45\"/><path d=\"M32 64l24 24\" class=\"animation-delay-10 animation-duration-1 animate-stroke stroke-length-45\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-arc-90": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M96 32c35.429 0 64 28.65 64 64v16\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-153\"/><path d=\"M160 128l24-24\" class=\"animation-delay-8 animation-duration-3 animate-stroke stroke-length-45\"/><path d=\"M160 128l-24-24\" class=\"animation-delay-8 animation-duration-3 animate-stroke stroke-length-45\"/></g>"
"arty-animated:24-arc-90": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M96 32c35.429 0 64 28.65 64 64v16\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-153\"/><path d=\"M160 128l24-24\" class=\"animation-delay-8 animation-duration-3 animate-stroke stroke-length-45\"/><path d=\"M160 128l-24-24\" class=\"animation-delay-8 animation-duration-3 animate-stroke stroke-length-45\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-arrow-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M184 96H16\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-230\"/><path d=\"M8 96l56 56\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-102\"/><path d=\"M8 96l56-56\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-102\"/></g>"
"arty-animated:24-arrow-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M184 96H16\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-230\"/><path d=\"M8 96l56 56\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-102\"/><path d=\"M8 96l56-56\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-102\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-arrows-from-2-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M80 112H32\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M80 112v48\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M112 80V32\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M112 80h48\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M8 184l68-68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M184 8l-68 68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/></g>"
"arty-animated:24-arrows-from-2-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M80 112H32\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M80 112v48\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M112 80V32\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M112 80h48\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M8 184l68-68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M184 8l-68 68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-arrows-from-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M80 80V32\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M112 112v48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M112 80V32\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M80 112v48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M112 112h48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M80 80H32\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M80 112H32\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M112 80h48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M8 184l68-68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M184 8l-68 68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M184 184l-68-68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M8 8l68 68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/></g>"
"arty-animated:24-arrows-from-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M80 80V32\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M112 112v48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M112 80V32\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M80 112v48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M112 112h48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M80 80H32\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M80 112H32\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M112 80h48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M8 184l68-68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M184 8l-68 68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M184 184l-68-68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M8 8l68 68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-arrows-horizontal": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M88 144h88\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M104 64H16\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M184 144l-40-40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M184 144l-40 40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M8 64l40-40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M8 64l40 40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/></g>"
"arty-animated:24-arrows-horizontal": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M88 144h88\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M104 64H16\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M184 144l-40-40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M184 144l-40 40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M8 64l40-40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M8 64l40 40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-arrows-to-2-corners": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 184v-48\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M8 184h48\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M184 8h-48\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M184 8v48\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M84 108l-68 68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M108 84l68-68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/></g>"
"arty-animated:24-arrows-to-2-corners": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 184v-48\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M8 184h48\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M184 8h-48\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M184 8v48\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M84 108l-68 68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M108 84l68-68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-arrows-to-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 184v-48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M184 8v48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M184 184v-48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M8 8v48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M8 184h48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M184 8h-48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M184 184h-48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M8 8h48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M80 112l-68 68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M112 80l68-68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M112 112l68 68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M80 80L12 12\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/></g>"
"arty-animated:24-arrows-to-corners": {
"body": "<g stroke-linecap=\"round\" stroke=\"currentColor\" stroke-width=\"16\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 184v-48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M184 8v48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M184 184v-48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M8 8v48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M8 184h48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M184 8h-48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M184 184h-48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M8 8h48\" class=\"animation-delay-9 animation-duration-4 animate-stroke stroke-length-68\"/><path d=\"M80 112l-68 68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M112 80l68-68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M112 112l68 68\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/><path d=\"M80 80L12 12\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-153\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-caret-upcopy": {
"body": "<path d=\"M40 120l56-56 56 56z\" fill=\"currentColor\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/>"
"arty-animated:24-caret-up-outline": {
"body": "<path d=\"M54 114l42-42 42 42z\" stroke-linecap=\"round\" stroke-width=\"12\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/>",
"width": 192,
"height": 192
},
"arty-stroke-24-caret-up-outline": {
"body": "<path d=\"M54 114l42-42 42 42z\" stroke-width=\"12\" stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/>"
"arty-animated:24-caret-up": {
"body": "<path d=\"M40 120l56-56 56 56z\" fill=\"currentColor\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/>",
"width": 192,
"height": 192
},
"arty-stroke-24-caret-up": {
"body": "<path d=\"M40 120l56-56 56 56z\" fill=\"currentColor\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/>"
"arty-animated:24-carets-vertical-outline": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"12\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M54 109l42 42 42-42z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/><path d=\"M54 81l42-42 42 42z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-carets-vertical-outline": {
"body": "<g stroke-linecap=\"round\" stroke-width=\"12\" stroke=\"currentColor\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M54 110l42 42 42-42z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/><path d=\"M54 82l42-42 42 42z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/></g>"
"arty-animated:24-carets-vertical": {
"body": "<g fill=\"currentColor\" fill-rule=\"evenodd\"><path d=\"M40 104l56 56 56-56z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/><path d=\"M40 88l56-56 56 56z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-carets-vertical": {
"body": "<g fill=\"currentColor\" fill-rule=\"evenodd\"><path d=\"M40 104l56 56 56-56z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/><path d=\"M40 88l56-56 56 56z\" class=\"animation-delay-0 animation-duration-10 animate-fill\"/></g>"
"arty-animated:24-chevron-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M56 96l80-80\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-153\"/><path d=\"M56 96l80 80\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-153\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-chevron-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M56 96l80-80\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-153\"/><path d=\"M56 96l80 80\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-153\"/></g>"
"arty-animated:24-close": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 8l176 176\" class=\"animation-delay-0 animation-duration-6 animate-stroke stroke-length-345\"/><path d=\"M8 184L184 8\" class=\"animation-delay-6 animation-duration-6 animate-stroke stroke-length-345\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-close": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 8l176 176\" class=\"animation-delay-0 animation-duration-6 animate-stroke stroke-length-345\"/><path d=\"M8 184L184 8\" class=\"animation-delay-6 animation-duration-6 animate-stroke stroke-length-345\"/></g>"
"arty-animated:24-confirm": {
"body": "<path d=\"M8 104l72 64L184 24\" stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-345\"/>",
"width": 192,
"height": 192
},
"arty-stroke-24-confirm": {
"body": "<path d=\"M8 104l72 64L184 24\" stroke-linecap=\"round\" stroke-width=\"16\" stroke=\"currentColor\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-345\"/>"
"arty-animated:24-double-arrow-horizontal": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M96 96h80\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M96 96H16\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M184 96l-40-40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M184 96l-40 40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M8 96l40-40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M8 96l40 40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-double-arrow-horizontal": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M96 96h80\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M96 96H16\" class=\"animation-delay-0 animation-duration-8 animate-stroke stroke-length-102\"/><path d=\"M184 96l-40-40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M184 96l-40 40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M8 96l40-40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/><path d=\"M8 96l40 40\" stroke-linejoin=\"round\" class=\"animation-delay-8 animation-duration-5 animate-stroke stroke-length-68\"/></g>"
"arty-animated:24-drop-outline": {
"body": "<path d=\"M96 8S32 84 32 128c0 36 28 56 64 56s64-20 64-56C160 84 96 8 96 8z\" stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-500\"/>",
"width": 192,
"height": 192
},
"arty-stroke-24-drop-outline": {
"body": "<path d=\"M96 8S32 84 32 128c0 36 28 56 64 56s64-20 64-56C160 84 96 8 96 8z\" stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\" class=\"animation-delay-0 animation-duration-10 animate-stroke stroke-length-500\"/>"
"arty-animated:24-drop": {
"body": "<g fill=\"none\" fill-rule=\"evenodd\"><path d=\"M96 8S32 84 32 128c0 36 28 56 64 56s64-20 64-56C160 84 96 8 96 8z\" stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-500\"/><path d=\"M96 8S32 84 32 128c0 20.785 9.333 36.236 24.151 45.584l92.734-85.324C130.558 49.037 96 8 96 8z\" fill=\"currentColor\" class=\"animation-delay-9 animation-duration-4 animate-fill\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-drop": {
"body": "<g fill=\"none\" fill-rule=\"evenodd\"><path d=\"M96 8S32 84 32 128c0 36 28 56 64 56s64-20 64-56C160 84 96 8 96 8z\" stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-0 animation-duration-9 animate-stroke stroke-length-500\"/><path d=\"M96 8S32 84 32 128c0 20.785 9.333 36.236 24.151 45.584l92.734-85.324C130.558 49.037 96 8 96 8z\" fill=\"currentColor\" class=\"animation-delay-9 animation-duration-4 animate-fill\"/></g>"
"arty-animated:24-filters": {
"body": "<g stroke=\"currentColor\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M32 8v72\" stroke-width=\"16\" class=\"animation-delay-0 animation-duration-3 animate-stroke stroke-length-102\"/><path d=\"M32 136v48\" stroke-width=\"16\" class=\"animation-delay-3 animation-duration-2 animate-stroke stroke-length-68\"/><path d=\"M12 108h40\" stroke-width=\"24\" class=\"animation-delay-4 animation-duration-1 animate-stroke stroke-length-45\"/><path d=\"M96 8v24\" stroke-width=\"16\" class=\"animation-delay-6 animation-duration-1 animate-stroke stroke-length-30\"/><path d=\"M96 88v96\" stroke-width=\"16\" class=\"animation-delay-6 animation-duration-3 animate-stroke stroke-length-153\"/><path d=\"M76 60h40\" stroke-width=\"24\" class=\"animation-delay-10 animation-duration-1 animate-stroke stroke-length-45\"/><path d=\"M160 8v88\" stroke-width=\"16\" class=\"animation-delay-11 animation-duration-3 animate-stroke stroke-length-102\"/><path d=\"M160 152v32\" stroke-width=\"16\" class=\"animation-delay-14 animation-duration-1 animate-stroke stroke-length-45\"/><path d=\"M140 124h40\" stroke-width=\"24\" class=\"animation-delay-15 animation-duration-1 animate-stroke stroke-length-45\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-filters": {
"body": "<g stroke=\"currentColor\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M32 8v72\" stroke-width=\"16\" class=\"animation-delay-0 animation-duration-3 animate-stroke stroke-length-102\"/><path d=\"M32 136v48\" stroke-width=\"16\" class=\"animation-delay-3 animation-duration-2 animate-stroke stroke-length-68\"/><path d=\"M12 108h40\" stroke-width=\"24\" class=\"animation-delay-4 animation-duration-1 animate-stroke stroke-length-45\"/><path d=\"M96 8v24\" stroke-width=\"16\" class=\"animation-delay-6 animation-duration-1 animate-stroke stroke-length-30\"/><path d=\"M96 88v96\" stroke-width=\"16\" class=\"animation-delay-6 animation-duration-3 animate-stroke stroke-length-153\"/><path d=\"M76 60h40\" stroke-width=\"24\" class=\"animation-delay-10 animation-duration-1 animate-stroke stroke-length-45\"/><path d=\"M160 8v88\" stroke-width=\"16\" class=\"animation-delay-11 animation-duration-3 animate-stroke stroke-length-102\"/><path d=\"M160 152v32\" stroke-width=\"16\" class=\"animation-delay-14 animation-duration-1 animate-stroke stroke-length-45\"/><path d=\"M140 124h40\" stroke-width=\"24\" class=\"animation-delay-15 animation-duration-1 animate-stroke stroke-length-45\"/></g>"
"arty-animated:24-grid-3-outline": {
"body": "<g transform=\"translate(8 8)\" stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\"><circle cx=\"16\" cy=\"16\" r=\"16\" class=\"animation-delay-0 animation-duration-2 animate-fill\"/><circle cx=\"88\" cy=\"16\" r=\"16\" class=\"animation-delay-2 animation-duration-2 animate-fill\"/><circle cx=\"160\" cy=\"16\" r=\"16\" class=\"animation-delay-4 animation-duration-2 animate-fill\"/><circle cx=\"16\" cy=\"88\" r=\"16\" class=\"animation-delay-6 animation-duration-2 animate-fill\"/><circle cx=\"88\" cy=\"88\" r=\"16\" class=\"animation-delay-7 animation-duration-2 animate-fill\"/><circle cx=\"160\" cy=\"88\" r=\"16\" class=\"animation-delay-9 animation-duration-2 animate-fill\"/><circle cx=\"16\" cy=\"160\" r=\"16\" class=\"animation-delay-11 animation-duration-2 animate-fill\"/><circle cx=\"88\" cy=\"160\" r=\"16\" class=\"animation-delay-13 animation-duration-2 animate-fill\"/><circle cx=\"160\" cy=\"160\" r=\"16\" class=\"animation-delay-15 animation-duration-2 animate-fill\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-grid-3-outline": {
"body": "<g transform=\"translate(8 8)\" stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\" fill-rule=\"evenodd\"><circle cx=\"16\" cy=\"16\" r=\"16\" class=\"animation-delay-0 animation-duration-2 animate-fill\"/><circle cx=\"88\" cy=\"16\" r=\"16\" class=\"animation-delay-2 animation-duration-2 animate-fill\"/><circle cx=\"160\" cy=\"16\" r=\"16\" class=\"animation-delay-4 animation-duration-2 animate-fill\"/><circle cx=\"16\" cy=\"88\" r=\"16\" class=\"animation-delay-6 animation-duration-2 animate-fill\"/><circle cx=\"88\" cy=\"88\" r=\"16\" class=\"animation-delay-7 animation-duration-2 animate-fill\"/><circle cx=\"160\" cy=\"88\" r=\"16\" class=\"animation-delay-9 animation-duration-2 animate-fill\"/><circle cx=\"16\" cy=\"160\" r=\"16\" class=\"animation-delay-11 animation-duration-2 animate-fill\"/><circle cx=\"88\" cy=\"160\" r=\"16\" class=\"animation-delay-13 animation-duration-2 animate-fill\"/><circle cx=\"160\" cy=\"160\" r=\"16\" class=\"animation-delay-15 animation-duration-2 animate-fill\"/></g>"
"arty-animated:24-grid-3": {
"body": "<g fill=\"currentColor\" fill-rule=\"evenodd\"><circle cx=\"24\" cy=\"24\" r=\"24\" class=\"animation-delay-0 animation-duration-2 animate-fill\"/><circle cx=\"96\" cy=\"24\" r=\"24\" class=\"animation-delay-2 animation-duration-2 animate-fill\"/><circle cx=\"168\" cy=\"24\" r=\"24\" class=\"animation-delay-4 animation-duration-2 animate-fill\"/><circle cx=\"24\" cy=\"96\" r=\"24\" class=\"animation-delay-6 animation-duration-2 animate-fill\"/><circle cx=\"96\" cy=\"96\" r=\"24\" class=\"animation-delay-7 animation-duration-2 animate-fill\"/><circle cx=\"168\" cy=\"96\" r=\"24\" class=\"animation-delay-9 animation-duration-2 animate-fill\"/><circle cx=\"24\" cy=\"168\" r=\"24\" class=\"animation-delay-11 animation-duration-2 animate-fill\"/><circle cx=\"96\" cy=\"168\" r=\"24\" class=\"animation-delay-13 animation-duration-2 animate-fill\"/><circle cx=\"168\" cy=\"168\" r=\"24\" class=\"animation-delay-15 animation-duration-2 animate-fill\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-grid-3": {
"body": "<g fill=\"currentColor\" fill-rule=\"evenodd\"><circle cx=\"24\" cy=\"24\" r=\"24\" class=\"animation-delay-0 animation-duration-2 animate-fill\"/><circle cx=\"96\" cy=\"24\" r=\"24\" class=\"animation-delay-2 animation-duration-2 animate-fill\"/><circle cx=\"168\" cy=\"24\" r=\"24\" class=\"animation-delay-4 animation-duration-2 animate-fill\"/><circle cx=\"24\" cy=\"96\" r=\"24\" class=\"animation-delay-6 animation-duration-2 animate-fill\"/><circle cx=\"96\" cy=\"96\" r=\"24\" class=\"animation-delay-7 animation-duration-2 animate-fill\"/><circle cx=\"168\" cy=\"96\" r=\"24\" class=\"animation-delay-9 animation-duration-2 animate-fill\"/><circle cx=\"24\" cy=\"168\" r=\"24\" class=\"animation-delay-11 animation-duration-2 animate-fill\"/><circle cx=\"96\" cy=\"168\" r=\"24\" class=\"animation-delay-13 animation-duration-2 animate-fill\"/><circle cx=\"168\" cy=\"168\" r=\"24\" class=\"animation-delay-15 animation-duration-2 animate-fill\"/></g>"
"arty-animated:24-list-3-outline": {
"body": "<g transform=\"translate(8 8)\" stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><circle stroke-linejoin=\"round\" cx=\"16\" cy=\"16\" r=\"16\" class=\"animation-delay-0 animation-duration-3 animate-fill\"/><rect x=\"72\" width=\"104\" height=\"32\" rx=\"16\" class=\"animation-delay-3 animation-duration-3 animate-fill\"/><circle stroke-linejoin=\"round\" cx=\"16\" cy=\"88\" r=\"16\" class=\"animation-delay-5 animation-duration-3 animate-fill\"/><rect x=\"72\" y=\"72\" width=\"104\" height=\"32\" rx=\"16\" class=\"animation-delay-8 animation-duration-3 animate-fill\"/><circle stroke-linejoin=\"round\" cx=\"16\" cy=\"160\" r=\"16\" class=\"animation-delay-11 animation-duration-3 animate-fill\"/><rect x=\"72\" y=\"144\" width=\"104\" height=\"32\" rx=\"16\" class=\"animation-delay-13 animation-duration-3 animate-fill\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-list-3-outline": {
"body": "<g transform=\"translate(8 8)\" stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><circle stroke-linejoin=\"round\" cx=\"16\" cy=\"16\" r=\"16\" class=\"animation-delay-0 animation-duration-3 animate-fill\"/><rect x=\"72\" width=\"104\" height=\"32\" rx=\"16\" class=\"animation-delay-3 animation-duration-3 animate-fill\"/><circle stroke-linejoin=\"round\" cx=\"16\" cy=\"88\" r=\"16\" class=\"animation-delay-5 animation-duration-3 animate-fill\"/><rect x=\"72\" y=\"72\" width=\"104\" height=\"32\" rx=\"16\" class=\"animation-delay-8 animation-duration-3 animate-fill\"/><circle stroke-linejoin=\"round\" cx=\"16\" cy=\"160\" r=\"16\" class=\"animation-delay-11 animation-duration-3 animate-fill\"/><rect x=\"72\" y=\"144\" width=\"104\" height=\"32\" rx=\"16\" class=\"animation-delay-13 animation-duration-3 animate-fill\"/></g>"
"arty-animated:24-list-3": {
"body": "<g fill=\"none\" fill-rule=\"evenodd\"><circle fill=\"currentColor\" cx=\"24\" cy=\"24\" r=\"24\" class=\"animation-delay-0 animation-duration-4 animate-fill\"/><path d=\"M96 24h72\" stroke=\"currentColor\" stroke-width=\"48\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-4 animation-duration-1 animate-stroke stroke-length-102\"/><circle fill=\"currentColor\" cx=\"24\" cy=\"96\" r=\"24\" class=\"animation-delay-5 animation-duration-4 animate-fill\"/><path d=\"M96 96h72\" stroke=\"currentColor\" stroke-width=\"48\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-1 animate-stroke stroke-length-102\"/><circle fill=\"currentColor\" cx=\"24\" cy=\"168\" r=\"24\" class=\"animation-delay-11 animation-duration-4 animate-fill\"/><path d=\"M96 168h72\" stroke=\"currentColor\" stroke-width=\"48\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-14 animation-duration-1 animate-stroke stroke-length-102\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-list-3": {
"body": "<g fill=\"none\" fill-rule=\"evenodd\"><circle fill=\"currentColor\" cx=\"24\" cy=\"24\" r=\"24\" class=\"animation-delay-0 animation-duration-4 animate-fill\"/><path d=\"M96 24h72\" stroke=\"currentColor\" stroke-width=\"48\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-4 animation-duration-1 animate-stroke stroke-length-102\"/><circle fill=\"currentColor\" cx=\"24\" cy=\"96\" r=\"24\" class=\"animation-delay-5 animation-duration-4 animate-fill\"/><path d=\"M96 96h72\" stroke=\"currentColor\" stroke-width=\"48\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-9 animation-duration-1 animate-stroke stroke-length-102\"/><circle fill=\"currentColor\" cx=\"24\" cy=\"168\" r=\"24\" class=\"animation-delay-11 animation-duration-4 animate-fill\"/><path d=\"M96 168h72\" stroke=\"currentColor\" stroke-width=\"48\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"animation-delay-14 animation-duration-1 animate-stroke stroke-length-102\"/></g>"
"arty-animated:24-panel-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 96l64 64\" stroke-linejoin=\"round\" class=\"animation-delay-11 animation-duration-3 animate-stroke stroke-length-102\"/><path d=\"M8 96l64-64\" stroke-linejoin=\"round\" class=\"animation-delay-11 animation-duration-3 animate-stroke stroke-length-102\"/><path d=\"M156 96H16\" class=\"animation-delay-6 animation-duration-5 animate-stroke stroke-length-230\"/><path d=\"M184 8v176\" stroke-linejoin=\"round\" class=\"animation-delay-0 animation-duration-6 animate-stroke stroke-length-230\"/></g>",
"width": 192,
"height": 192
},
"arty-stroke-24-panel-left": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M8 96l64 64\" stroke-linejoin=\"round\" class=\"animation-delay-11 animation-duration-3 animate-stroke stroke-length-102\"/><path d=\"M8 96l64-64\" stroke-linejoin=\"round\" class=\"animation-delay-11 animation-duration-3 animate-stroke stroke-length-102\"/><path d=\"M156 96H16\" class=\"animation-delay-6 animation-duration-5 animate-stroke stroke-length-230\"/><path d=\"M184 8v176\" stroke-linejoin=\"round\" class=\"animation-delay-0 animation-duration-6 animate-stroke stroke-length-230\"/></g>"
},
"arty-stroke-24-search": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M72 120L8 184\" class=\"animation-delay-11 animation-duration-2 animate-stroke stroke-length-102\"/><path d=\"M75.073 117.383C63.29 105.695 56 89.544 56 72c0-35.346 28.571-64 64-64s64 28.654 64 64c0 35.346-28.577 64-64 64-17.897 0-33.385-7.167-44.927-18.617z\" class=\"animation-delay-0 animation-duration-11 animate-stroke stroke-length-500\"/></g>"
"arty-animated:24-search": {
"body": "<g stroke=\"currentColor\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M72 120L8 184\" class=\"animation-delay-11 animation-duration-2 animate-stroke stroke-length-102\"/><path d=\"M75.073 117.383C63.29 105.695 56 89.544 56 72c0-35.346 28.571-64 64-64s64 28.654 64 64c0 35.346-28.577 64-64 64-17.897 0-33.385-7.167-44.927-18.617z\" class=\"animation-delay-0 animation-duration-11 animate-stroke stroke-length-500\"/></g>",
"width": 192,
"height": 192
}
},
"aliases": {
"arty-stroke-16-arrow-right": {
"parent": "arty-stroke-16-arrow-left",
"arty-animated:16-arrow-right": {
"parent": "arty-animated:16-arrow-left",
"hFlip": true
},
"arty-stroke-16-arrow-up": {
"parent": "arty-stroke-16-arrow-left",
"arty-animated:16-arrow-up": {
"parent": "arty-animated:16-arrow-left",
"rotate": 1,
"vFlip": true
},
"arty-stroke-16-arrow-down": {
"parent": "arty-stroke-16-arrow-left",
"arty-animated:16-arrow-down": {
"parent": "arty-animated:16-arrow-left",
"rotate": 3
},
"arty-stroke-16-arrows-from-2-corners-rotated": {
"parent": "arty-stroke-16-arrows-from-2-corners",
"arty-animated:16-arrows-from-2-corners-rotated": {
"parent": "arty-animated:16-arrows-from-2-corners",
"hFlip": true
},
"arty-stroke-16-arrows-vertical": {
"parent": "arty-stroke-16-arrows-horizontal",
"arty-animated:16-arrows-vertical": {
"parent": "arty-animated:16-arrows-horizontal",
"rotate": 1
},
"arty-stroke-16-arrows-to-2-corners-rotated": {
"parent": "arty-stroke-16-arrows-to-2-corners",
"arty-animated:16-arrows-to-2-corners-rotated": {
"parent": "arty-animated:16-arrows-to-2-corners",
"hFlip": true
},
"arty-stroke-16-caret-down-outline": {
"parent": "arty-stroke-16-caret-up-outline",
"arty-animated:16-caret-down-outline": {
"parent": "arty-animated:16-caret-up-outline",
"vFlip": true
},
"arty-stroke-16-caret-left-outline": {
"parent": "arty-stroke-16-caret-up-outline",
"arty-animated:16-caret-left-outline": {
"parent": "arty-animated:16-caret-up-outline",
"rotate": 1,
"vFlip": true
},
"arty-stroke-16-caret-right-outline": {
"parent": "arty-stroke-16-caret-up-outline",
"arty-animated:16-caret-right-outline": {
"parent": "arty-animated:16-caret-up-outline",
"rotate": 1
},
"arty-stroke-16-caret-down": {
"parent": "arty-stroke-16-caret-up",
"arty-animated:16-caret-down": {
"parent": "arty-animated:16-caret-up",
"vFlip": true
},
"arty-stroke-16-caret-left": {
"parent": "arty-stroke-16-caret-up",
"arty-animated:16-caret-left": {
"parent": "arty-animated:16-caret-up",
"rotate": 1,
"vFlip": true
},
"arty-stroke-16-caret-right": {
"parent": "arty-stroke-16-caret-up",
"arty-animated:16-caret-right": {
"parent": "arty-animated:16-caret-up",
"rotate": 1
},
"arty-stroke-16-carets-horizontal-outline": {
"parent": "arty-stroke-16-carets-vertical-outline",
"arty-animated:16-carets-horizontal-outline": {
"parent": "arty-animated:16-carets-vertical-outline",
"rotate": 3
},
"arty-stroke-16-carets-horizontal": {
"parent": "arty-stroke-16-carets-vertical",
"arty-animated:16-carets-horizontal": {
"parent": "arty-animated:16-carets-vertical",
"rotate": 3
},
"arty-stroke-16-chevron-right": {
"parent": "arty-stroke-16-chevron-left",
"arty-animated:16-chevron-right": {
"parent": "arty-animated:16-chevron-left",
"hFlip": true
},
"arty-stroke-16-chevron-up": {
"parent": "arty-stroke-16-chevron-left",
"arty-animated:16-chevron-up": {
"parent": "arty-animated:16-chevron-left",
"rotate": 1,
"vFlip": true
},
"arty-stroke-16-chevron-down": {
"parent": "arty-stroke-16-chevron-left",
"arty-animated:16-chevron-down": {
"parent": "arty-animated:16-chevron-left",
"rotate": 3
},
"arty-stroke-16-double-arrow-vertical": {
"parent": "arty-stroke-16-double-arrow-horizontal",
"arty-animated:16-double-arrow-vertical": {
"parent": "arty-animated:16-double-arrow-horizontal",
"rotate": 1
},
"arty-stroke-16-filters-horizontal": {
"parent": "arty-stroke-16-filters",
"arty-animated:16-filters-horizontal": {
"parent": "arty-animated:16-filters",
"rotate": 3,
"hFlip": true
},
"arty-stroke-16-list-3-outline-rtl": {
"parent": "arty-stroke-16-list-3-outline",
"arty-animated:16-list-3-outline-rtl": {
"parent": "arty-animated:16-list-3-outline",
"hFlip": true
},
"arty-stroke-16-list-3-rtl": {
"parent": "arty-stroke-16-list-3",
"arty-animated:16-list-3-rtl": {
"parent": "arty-animated:16-list-3",
"hFlip": true
},
"arty-stroke-16-panel-right": {
"parent": "arty-stroke-16-panel-left",
"arty-animated:16-panel-right": {
"parent": "arty-animated:16-panel-left",
"hFlip": true
},
"arty-stroke-16-panel-up": {
"parent": "arty-stroke-16-panel-left",
"arty-animated:16-panel-up": {
"parent": "arty-animated:16-panel-left",
"rotate": 1,
"vFlip": true
},
"arty-stroke-16-panel-down": {
"parent": "arty-stroke-16-panel-left",
"arty-animated:16-panel-down": {
"parent": "arty-animated:16-panel-left",
"rotate": 3
},
"arty-stroke-16-search-rotated": {
"parent": "arty-stroke-16-search",
"arty-animated:16-search-rotated": {
"parent": "arty-animated:16-search",
"rotate": 3
},
"arty-stroke-20-arrow-right": {
"parent": "arty-stroke-20-arrow-left",
"arty-animated:20-arrow-right": {
"parent": "arty-animated:20-arrow-left",
"hFlip": true
},
"arty-stroke-20-arrow-up": {
"parent": "arty-stroke-20-arrow-left",
"arty-animated:20-arrow-up": {
"parent": "arty-animated:20-arrow-left",
"rotate": 1,
"vFlip": true
},
"arty-stroke-20-arrow-down": {
"parent": "arty-stroke-20-arrow-left",
"arty-animated:20-arrow-down": {
"parent": "arty-animated:20-arrow-left",
"rotate": 3
},
"arty-stroke-20-arrows-from-2-corners-rotated": {
"parent": "arty-stroke-20-arrows-from-2-corners",
"arty-animated:20-arrows-from-2-corners-rotated": {
"parent": "arty-animated:20-arrows-from-2-corners",
"hFlip": true
},
"arty-stroke-20-arrows-vertical": {
"parent": "arty-stroke-20-arrows-horizontal",
"arty-animated:20-arrows-vertical": {
"parent": "arty-animated:20-arrows-horizontal",
"rotate": 1
},
"arty-stroke-20-arrows-to-2-corners-rotated": {
"parent": "arty-stroke-20-arrows-to-2-corners",
"arty-animated:20-arrows-to-2-corners-rotated": {
"parent": "arty-animated:20-arrows-to-2-corners",
"hFlip": true
},
"arty-stroke-20-caret-down-outline": {
"parent": "arty-stroke-20-caret-up-outline",
"arty-animated:20-caret-down-outline": {
"parent": "arty-animated:20-caret-up-outline",
"vFlip": true
},
"arty-stroke-20-caret-left-outline": {
"parent": "arty-stroke-20-caret-up-outline",
"arty-animated:20-caret-left-outline": {
"parent": "arty-animated:20-caret-up-outline",
"rotate": 1,
"vFlip": true
},
"arty-stroke-20-caret-right-outline": {
"parent": "arty-stroke-20-caret-up-outline",
"arty-animated:20-caret-right-outline": {
"parent": "arty-animated:20-caret-up-outline",
"rotate": 1
},
"arty-stroke-20-caret-down": {
"parent": "arty-stroke-20-caret-up",
"arty-animated:20-caret-down": {
"parent": "arty-animated:20-caret-up",
"vFlip": true
},
"arty-stroke-20-caret-left": {
"parent": "arty-stroke-20-caret-up",
"arty-animated:20-caret-left": {
"parent": "arty-animated:20-caret-up",
"rotate": 1,
"vFlip": true
},
"arty-stroke-20-caret-right": {
"parent": "arty-stroke-20-caret-up",
"arty-animated:20-caret-right": {
"parent": "arty-animated:20-caret-up",
"rotate": 1
},
"arty-stroke-20-carets-horizontal-outline": {
"parent": "arty-stroke-20-carets-vertical-outline",
"arty-animated:20-carets-horizontal-outline": {
"parent": "arty-animated:20-carets-vertical-outline",
"rotate": 3
},
"arty-stroke-20-carets-horizontal": {
"parent": "arty-stroke-20-carets-vertical",
"arty-animated:20-carets-horizontal": {
"parent": "arty-animated:20-carets-vertical",
"rotate": 3
},
"arty-stroke-20-chevron-right": {
"parent": "arty-stroke-20-chevron-left",
"arty-animated:20-chevron-right": {
"parent": "arty-animated:20-chevron-left",
"hFlip": true
},
"arty-stroke-20-chevron-up": {
"parent": "arty-stroke-20-chevron-left",
"arty-animated:20-chevron-up": {
"parent": "arty-animated:20-chevron-left",
"rotate": 1,
"vFlip": true
},
"arty-stroke-20-chevron-down": {
"parent": "arty-stroke-20-chevron-left",
"arty-animated:20-chevron-down": {
"parent": "arty-animated:20-chevron-left",
"rotate": 3
},
"arty-stroke-20-double-arrow-vertical": {
"parent": "arty-stroke-20-double-arrow-horizontal",
"arty-animated:20-double-arrow-vertical": {
"parent": "arty-animated:20-double-arrow-horizontal",
"rotate": 1
},
"arty-stroke-20-panel-right": {
"parent": "arty-stroke-20-panel-left",
"arty-animated:20-panel-right": {
"parent": "arty-animated:20-panel-left",
"hFlip": true
},
"arty-stroke-20-panel-up": {
"parent": "arty-stroke-20-panel-left",
"arty-animated:20-panel-up": {
"parent": "arty-animated:20-panel-left",
"rotate": 1,
"vFlip": true
},
"arty-stroke-20-panel-down": {
"parent": "arty-stroke-20-panel-left",
"arty-animated:20-panel-down": {
"parent": "arty-animated:20-panel-left",
"rotate": 3
},
"arty-stroke-20-search-rotated": {
"parent": "arty-stroke-20-search",
"arty-animated:20-search-rotated": {
"parent": "arty-animated:20-search",
"rotate": 3
},
"arty-stroke-24-arrow-right": {
"parent": "arty-stroke-24-arrow-left",
"arty-animated:24-arrow-right": {
"parent": "arty-animated:24-arrow-left",
"hFlip": true
},
"arty-stroke-24-arrow-up": {
"parent": "arty-stroke-24-arrow-left",
"arty-animated:24-arrow-up": {
"parent": "arty-animated:24-arrow-left",
"rotate": 1,
"vFlip": true
},
"arty-stroke-24-arrow-down": {
"parent": "arty-stroke-24-arrow-left",
"arty-animated:24-arrow-down": {
"parent": "arty-animated:24-arrow-left",
"rotate": 3
},
"arty-stroke-24-arrows-from-2-corners-rotated": {
"parent": "arty-stroke-24-arrows-from-2-corners",
"arty-animated:24-arrows-from-2-corners-rotated": {
"parent": "arty-animated:24-arrows-from-2-corners",
"hFlip": true
},
"arty-stroke-24-arrows-vertical": {
"parent": "arty-stroke-24-arrows-horizontal",
"arty-animated:24-arrows-vertical": {
"parent": "arty-animated:24-arrows-horizontal",
"rotate": 1
},
"arty-stroke-24-arrows-to-2-corners-rotated": {
"parent": "arty-stroke-24-arrows-to-2-corners",
"arty-animated:24-arrows-to-2-corners-rotated": {
"parent": "arty-animated:24-arrows-to-2-corners",
"hFlip": true
},
"arty-stroke-24-caret-down-outline": {
"parent": "arty-stroke-24-caret-up-outline",
"arty-animated:24-caret-down-outline": {
"parent": "arty-animated:24-caret-up-outline",
"vFlip": true
},
"arty-stroke-24-caret-left-outline": {
"parent": "arty-stroke-24-caret-up-outline",
"arty-animated:24-caret-left-outline": {
"parent": "arty-animated:24-caret-up-outline",
"rotate": 1,
"vFlip": true
},
"arty-stroke-24-caret-right-outline": {
"parent": "arty-stroke-24-caret-up-outline",
"arty-animated:24-caret-right-outline": {
"parent": "arty-animated:24-caret-up-outline",
"rotate": 1
},
"arty-stroke-24-caret-down": {
"parent": "arty-stroke-24-caret-up",
"arty-animated:24-caret-down": {
"parent": "arty-animated:24-caret-up",
"vFlip": true
},
"arty-stroke-24-caret-left": {
"parent": "arty-stroke-24-caret-up",
"arty-animated:24-caret-left": {
"parent": "arty-animated:24-caret-up",
"rotate": 1,
"vFlip": true
},
"arty-stroke-24-caret-right": {
"parent": "arty-stroke-24-caret-up",
"arty-animated:24-caret-right": {
"parent": "arty-animated:24-caret-up",
"rotate": 1
},
"arty-stroke-24-carets-horizontal-outline": {
"parent": "arty-stroke-24-carets-vertical-outline",
"arty-animated:24-carets-horizontal-outline": {
"parent": "arty-animated:24-carets-vertical-outline",
"rotate": 3
},
"arty-stroke-24-carets-horizontal": {
"parent": "arty-stroke-24-carets-vertical",
"arty-animated:24-carets-horizontal": {
"parent": "arty-animated:24-carets-vertical",
"rotate": 3
},
"arty-stroke-24-chevron-right": {
"parent": "arty-stroke-24-chevron-left",
"arty-animated:24-chevron-right": {
"parent": "arty-animated:24-chevron-left",
"hFlip": true
},
"arty-stroke-24-chevron-up": {
"parent": "arty-stroke-24-chevron-left",
"arty-animated:24-chevron-up": {
"parent": "arty-animated:24-chevron-left",
"rotate": 1,
"vFlip": true
},
"arty-stroke-24-chevron-down": {
"parent": "arty-stroke-24-chevron-left",
"arty-animated:24-chevron-down": {
"parent": "arty-animated:24-chevron-left",
"rotate": 3
},
"arty-stroke-24-double-arrow-vertical": {
"parent": "arty-stroke-24-double-arrow-horizontal",
"arty-animated:24-double-arrow-vertical": {
"parent": "arty-animated:24-double-arrow-horizontal",
"rotate": 1
},
"arty-stroke-24-filters-horizontal": {
"parent": "arty-stroke-24-filters",
"arty-animated:24-filters-horizontal": {
"parent": "arty-animated:24-filters",
"rotate": 3,
"hFlip": true
},
"arty-stroke-24-list-3-outline-rtl": {
"parent": "arty-stroke-24-list-3-outline",
"arty-animated:24-list-3-outline-rtl": {
"parent": "arty-animated:24-list-3-outline",
"hFlip": true
},
"arty-stroke-24-list-3-rtl": {
"parent": "arty-stroke-24-list-3",
"arty-animated:24-list-3-rtl": {
"parent": "arty-animated:24-list-3",
"hFlip": true
},
"arty-stroke-24-panel-right": {
"parent": "arty-stroke-24-panel-left",
"arty-animated:24-panel-right": {
"parent": "arty-animated:24-panel-left",
"hFlip": true
},
"arty-stroke-24-panel-up": {
"parent": "arty-stroke-24-panel-left",
"arty-animated:24-panel-up": {
"parent": "arty-animated:24-panel-left",
"rotate": 1,
"vFlip": true
},
"arty-stroke-24-panel-down": {
"parent": "arty-stroke-24-panel-left",
"arty-animated:24-panel-down": {
"parent": "arty-animated:24-panel-left",
"rotate": 3
},
"arty-stroke-24-search-rotated": {
"parent": "arty-stroke-24-search",
"arty-animated:24-search-rotated": {
"parent": "arty-animated:24-search",
"rotate": 3
}
},
"width": 192,
"height": 192
"width": 128,
"height": 128
}

View File

@ -1,16 +1,20 @@
{
"name": "simple-svg-website-icons",
"version": "0.1.0",
"version": "1.0.0-beta1",
"description": "Node.js version of icons.simplesvg.com",
"main": "app.js",
"scripts": {
"start": "node app.js"
"start": "node app.js",
"test": "mocha tests/*_test.js"
},
"author": "Vjacheslav Trushkin",
"license": "MIT",
"dependencies": {
"express": "^4.16.2",
"simple-svg-cdn": "^0.3.2",
"simple-svg-icons": "git+https://github.com/simplesvg/icons.git"
},
"devDependencies": {
"chai": "^4.1.2",
"mocha": "^4.0.1"
}
}

277
src/collection.js Normal file
View File

@ -0,0 +1,277 @@
"use strict";
const fs = require('fs');
const defaultAttributes = {
left: 0,
top: 0,
width: 16,
height: 16,
rotate: 0,
hFlip: false,
vFlip: false
};
/**
* Class to represent one collection of icons
*/
class Collection {
/**
* Constructor
*
* @param {string} [prefix] Optional prefix
*/
constructor(prefix) {
this.prefix = typeof prefix === 'string' ? prefix : null;
this.loaded = false;
}
/**
* Load from JSON data
*
* @param {string|object} data
*/
loadJSON(data) {
if (typeof data === 'string') {
try {
data = JSON.parse(data);
} catch (err) {
return;
}
}
// Validate
if (typeof data !== 'object' || data.icons === void 0) {
return;
}
/** @var {{icons, aliases, prefix}} data **/
// DeOptimize
Object.keys(data).forEach(prop => {
switch (typeof data[prop]) {
case 'number':
case 'boolean':
let value = data[prop];
Object.keys(data.icons).forEach(key => {
if (data.icons[key][prop] === void 0) {
data.icons[key][prop] = value;
}
});
delete data[prop];
}
});
// Remove prefix from icons
if (data.prefix === void 0 || data.prefix === '') {
if (this.prefix === null) {
return;
}
let error = false,
sliceLength = this.prefix.length + 1;
['icons', 'aliases'].forEach(prop => {
if (error || data[prop] === void 0) {
return;
}
let newItems = {};
Object.keys(data[prop]).forEach(key => {
if (error || key.length <= sliceLength || key.slice(0, this.prefix.length) !== this.prefix) {
error = true;
return;
}
let newKey = key.slice(sliceLength);
if (data[prop][key].parent !== void 0) {
let parent = data[prop][key].parent;
if (parent.length <= sliceLength || parent.slice(0, this.prefix.length) !== this.prefix) {
error = true;
return;
}
data[prop][key].parent = parent.slice(sliceLength);
}
newItems[newKey] = data[prop][key];
});
data[prop] = newItems;
});
if (error) {
return;
}
} else {
this.prefix = data.prefix;
}
// Add aliases and icons
this.icons = data.icons;
this.aliases = data.aliases === void 0 ? {} : data.aliases;
this.loaded = true;
}
/**
* Load collection from file
*
* @param {string} file File or JSON
* @returns {Promise}
*/
loadFile(file) {
return new Promise((fulfill, reject) => {
// Load file
fs.readFile(file, 'utf8', (err, data) => {
if (err) {
reject(err);
} else {
this.loadJSON(data);
if (this.loaded) {
fulfill(this);
} else {
reject();
}
}
});
});
}
// Functions used by getIcons()
/**
* Check if icon has already been copied
*
* @param {string} name
* @returns {boolean}
* @private
*/
_copied(name) {
return !!(this._result.icons[name] || this._result.aliases[name]);
}
/**
* Copy icon
*
* @param {string} name
* @param {number} iteration
* @returns {boolean}
* @private
*/
_copy(name, iteration) {
if (this._copied(name) || iteration > 5) {
return true;
}
if (this.icons[name] !== void 0) {
this._result.icons[name] = this.icons[name];
return true;
}
if (this.aliases && this.aliases[name] !== void 0) {
if (!this._copy(this.aliases[name].parent, iteration + 1)) {
return false;
}
this._result.aliases[name] = this.aliases[name];
return true;
}
return false;
}
/**
* Get data for selected icons
* This function assumes collection has been loaded. Verification should be done during loading
*
* @param {Array} icons
* @returns {{icons: {}, aliases: {}}}
*/
getIcons(icons) {
this._result = {
prefix: this.prefix,
icons: {},
aliases: {}
};
icons.forEach(icon => this._copy(icon, 0));
return this._result;
}
// Functions used by getIcon()
/**
* Merge icon data with this._result
*
* @param {object} data
* @private
*/
_mergeIcon(data) {
Object.keys(data).forEach(key => {
if (this._result[key] === void 0) {
this._result[key] = data[key];
return;
}
// Merge transformations, ignore the rest because alias overwrites parent items's attributes
switch (key) {
case 'rotate':
this._result.rotate += data.rotate;
break;
case 'hFlip':
case 'vFlip':
this._result[key] = this._result[key] !== data[key];
}
});
}
/**
* Add missing properties to object
*
* @param {object} data
* @returns {object}
* @private
*/
static _addMissingAttributes(data) {
let item = Object.assign({}, defaultAttributes, data);
if (item.inlineTop === void 0) {
item.inlineTop = item.top;
}
if (item.inlineHeight === void 0) {
item.inlineHeight = item.height;
}
if (item.verticalAlign === void 0) {
// -0.143 if icon is designed for 14px height,
// otherwise assume icon is designed for 16px height
item.verticalAlign = item.height % 7 === 0 && item.height % 8 !== 0 ? -0.143 : -0.125;
}
return item;
}
/**
* Get icon data for SVG
* This function assumes collection has been loaded. Verification should be done during loading
*
* @param {string} name
* @returns {object|null}
*/
getIcon(name) {
if (this.icons[name] !== void 0) {
return Collection._addMissingAttributes(this.icons[name]);
}
// Alias
if (this.aliases[name] === void 0) {
return null;
}
this._result = Object.assign({}, this.aliases[name]);
let parent = this.aliases[name].parent,
iteration = 0;
while (iteration < 5) {
if (this.icons[parent] !== void 0) {
// Merge with icon
this._mergeIcon(this.icons[parent]);
return Collection._addMissingAttributes(this._result);
}
if (this.aliases[parent] === void 0) {
return null;
}
this._mergeIcon(this.aliases[parent]);
parent = this.aliases[parent].parent;
iteration ++;
}
return null;
}
}
module.exports = Collection;

178
src/collections.js Normal file
View File

@ -0,0 +1,178 @@
"use strict";
const fs = require('fs');
const Collection = require('./collection');
/**
* Class to represent collection of collections
*/
class Collections {
/**
* Constructor
*
* @param {boolean} [log] Optional function for logging loading process
*/
constructor(log) {
this._log = typeof log === 'function' ? log : null;
this.items = {};
this._loadQueue = [];
}
/**
* Add directory to loading queue
*
* @param {string} dir
*/
addDirectory(dir) {
this._loadQueue.push({
type: 'dir',
dir: dir.slice(-1) === '/' ? dir.slice(0, dir.length - 1) : dir
});
}
/**
* Add file to loading queue
*
* @param {string} filename
*/
addFile(filename) {
this._loadQueue.push({
type: 'file',
filename: filename
});
}
/**
* Load queue
*
* Promise will never reject because single file should not break app,
* it will log failures using "log" function from constructor
*
* @returns {Promise}
*/
load() {
return new Promise((fulfill, reject) => {
let promises = [];
this._loadQueue.forEach(item => {
switch (item.type) {
case 'dir':
promises.push(this._loadDir(item.dir));
break;
case 'file':
promises.push(this._loadFile(item.filename));
break;
}
});
Promise.all(promises).then(() => {
fulfill(this);
}).catch(err => {
reject(err);
});
});
}
/**
* Load directory
*
* @param {string} dir
* @returns {Promise}
* @private
*/
_loadDir(dir) {
return new Promise((fulfill, reject) => {
fs.readdir(dir, (err, files) => {
if (err) {
if (this._log !== null) {
this._log('Error loading directory: ' + dir);
}
fulfill(false);
} else {
let promises = [];
files.forEach(file => {
if (file.slice(-5) !== '.json') {
return;
}
promises.push(this._loadFile(dir + '/' + file));
});
// Load all promises
Promise.all(promises).then(res => {
fulfill(true);
}).catch(err => {
fulfill(false);
});
}
});
});
}
/**
* Load file
*
* @param {string} filename Full filename
* @returns {Promise}
*/
_loadFile(filename) {
return new Promise((fulfill, reject) => {
let file = filename.split('/').pop(),
fileParts = file.split('.');
if (fileParts.length !== 2) {
fulfill(false);
return;
}
let prefix = fileParts[0],
collection = new Collection(prefix);
collection.loadFile(filename).then(() => {
if (!collection.loaded) {
if (this._log !== null) {
this._log('Failed to load collection: ' + filename);
}
fulfill(false);
return;
}
if (collection.prefix !== prefix) {
if (this._log !== null) {
this._log('Collection prefix does not match: ' + collection.prefix + ' in file ' + file);
}
fulfill(false);
return;
}
let count = Object.keys(collection.icons).length;
if (!count) {
if (this._log !== null) {
this._log('Collection is empty: ' + file);
}
fulfill(false);
return;
}
this.items[prefix] = collection;
if (this._log !== null) {
this._log('Loaded collection ' + prefix + ' from ' + file + ' (' + count + ' icons)');
}
fulfill(true);
}).catch(() => {
fulfill(false);
});
});
}
/**
* Find collection
*
* @param {string} prefix
* @returns {Collection|null}
*/
find(prefix) {
return this.items[prefix] === void 0 ? null : this.items[prefix];
}
}
module.exports = Collections;

76
src/query.js Normal file
View File

@ -0,0 +1,76 @@
"use strict";
const generateSVG = require('./svg');
/**
* Regexp for checking callback attribute
*
* @type {RegExp}
* @private
*/
const _callbackMatch = /^[a-z0-9_.]+$/i;
/**
* Generate data for query
*
* @param {Collection} collection
* @param {string} query Query string after last / without extension
* @param {string} ext Extension
* @param {object} params Parameters
* @returns {number|object}
*/
module.exports = (collection, query, ext, params) => {
switch (ext) {
case 'svg':
// Generate SVG
// query = icon name
let icon = collection.getIcon(query);
if (icon === null) {
return 404;
}
return {
filename: query + '.svg',
type: 'image/svg+xml; charset=utf-8',
body: generateSVG(icon, params)
};
case 'js':
case 'json':
if (query !== 'icons' || typeof params.icons !== 'string') {
return 404;
}
let result = collection.getIcons(params.icons.split(','));
if (!Object.keys(result.icons).length) {
return 404;
}
if (!Object.keys(result.aliases).length) {
delete result.aliases;
}
result = JSON.stringify(result);
if (ext === 'js') {
let callback;
if (params.callback !== void 0) {
callback = params.callback;
if (!callback.match(_callbackMatch)) {
return 400;
}
} else {
callback = 'SimpleSVG._loaderCallback';
}
return {
type: 'application/javascript; charset=utf-8',
body: callback + '(' + result + ')'
};
}
return {
type: 'application/json; charset=utf-8',
body: result
};
default:
return 404;
}
};

64
src/svg-dimensions.js Normal file
View File

@ -0,0 +1,64 @@
/**
* This file is part of the simple-svg-cdn package.
*
* (c) Vjacheslav Trushkin <cyberalien@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
"use strict";
const _unitsSplit = /(-?[0-9.]*[0-9]+[0-9.]*)/g,
_unitsTest = /^-?[0-9.]*[0-9]+[0-9.]*$/g;
/**
* Calculate second dimension when only 1 dimension is set
*
* @param {string|number} size One dimension (such as width)
* @param {number} ratio Width/height ratio.
* If size == width, ratio = height/width
* If size == height, ratio = width/height
* @param {number} [precision] Floating number precision in result to minimize output. Default = 100
* @return {string|number|null} Another dimension, null on error
*/
module.exports = (size, ratio, precision) => {
if (ratio === 1) {
return size;
}
precision = precision === void 0 ? 100 : precision;
if (typeof size === 'number') {
return Math.ceil(size * ratio * precision) / precision;
}
// split code into sets of strings and numbers
let split = size.split(_unitsSplit);
if (split === null || !split.length) {
return null;
}
let results = [],
code = split.shift(),
isNumber = _unitsTest.test(code),
num;
while (true) {
if (isNumber) {
num = parseFloat(code);
if (isNaN(num)) {
results.push(code);
} else {
results.push(Math.ceil(num * ratio * precision) / precision);
}
} else {
results.push(code);
}
// next
code = split.shift();
if (code === void 0) {
return results.join('');
}
isNumber = !isNumber;
}
};

62
src/svg-ids.js Normal file
View File

@ -0,0 +1,62 @@
/**
* This file is part of the simple-svg-cdn package.
*
* (c) Vjacheslav Trushkin <cyberalien@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
"use strict";
/**
* Unique id counter
*
* @type {number}
*/
let idCounter = 0;
/**
* Replace IDs in SVG output with unique IDs
* Fast replacement without parsing XML, assuming commonly used patterns.
*
* @param {string} body
* @return {string}
*/
module.exports = body => {
let regex = /\sid="(\S+)"/g,
ids = [],
match, prefix;
function strReplace(search, replace, subject) {
let pos = 0;
while ((pos = subject.indexOf(search, pos)) !== -1) {
subject = subject.slice(0, pos) + replace + subject.slice(pos + search.length);
pos += replace.length;
}
return subject;
}
// Find all IDs
while (match = regex.exec(body)) {
ids.push(match[1]);
}
if (!ids.length) {
return body;
}
prefix = 'SimpleSVGId-' + Date.now().toString(16) + '-' + (Math.random() * 0x1000000 | 0).toString(16) + '-';
// Replace with unique ids
ids.forEach(function(id) {
let newID = prefix + idCounter;
idCounter ++;
body = strReplace('="' + id + '"', '="' + newID + '"', body);
body = strReplace('="#' + id + '"', '="#' + newID + '"', body);
body = strReplace('(#' + id + ')', '(#' + newID + ')', body);
});
return body;
};

272
src/svg.js Normal file
View File

@ -0,0 +1,272 @@
"use strict";
const replaceIDs = require('./svg-ids');
const calculateDimension = require('./svg-dimensions');
/**
* Get preserveAspectRatio attribute value
*
* @param {object} align
* @return {string}
* @private
*/
function _align(align) {
let result;
switch (align.horizontal) {
case 'left':
result = 'xMin';
break;
case 'right':
result = 'xMax';
break;
default:
result = 'xMid';
}
switch (align.vertical) {
case 'top':
result += 'YMin';
break;
case 'bottom':
result += 'YMax';
break;
default:
result += 'YMid';
}
result += align.slice ? ' slice' : ' meet';
return result;
}
/**
* Generate SVG
*
* @param {object} item Icon data
* @param {object} props Query string
* @returns {string}
*/
module.exports = (item, props) => {
// Set data
let align = {
horizontal: 'center',
vertical: 'middle',
slice: false
};
let transform = {
rotate: item.rotate,
hFlip: item.hFlip,
vFlip: item.vFlip
};
let style = '';
let attributes = {};
// Get width/height
let inline = props.inline === true || props.inline === 'true' || props.inline === '1';
let box = {
left: item.left,
top: inline ? item.inlineTop : item.top,
width: item.width,
height: inline ? item.inlineHeight : item.height
};
// Transformations
['hFlip', 'vFlip'].forEach(key => {
if (props[key] !== void 0 && (props[key] === true || props[key] === 'true' || props[key] === '1')) {
transform[key] = !transform[key];
}
});
if (props.flip !== void 0) {
props.flip.toLowerCase().split(/[\s,]+/).forEach(value => {
switch (value) {
case 'horizontal':
transform.hFlip = !transform.hFlip;
break;
case 'vertical':
transform.vFlip = !transform.vFlip;
}
});
}
if (props.rotate !== void 0) {
let value = props.rotate;
if (typeof value === 'number') {
transform.rotate += value;
} else if (typeof value === 'string') {
let units = value.replace(/^-?[0-9.]*/, '');
if (units === '') {
value = parseInt(value);
if (!isNaN(value)) {
transform.rotate += value;
}
} else if (units !== value) {
let split = false;
switch (units) {
case '%':
// 25% -> 1, 50% -> 2, ...
split = 25;
break;
case 'deg':
// 90deg -> 1, 180deg -> 2, ...
split = 90;
}
if (split) {
value = parseInt(value.slice(0, value.length - units.length));
if (!isNaN(value)) {
transform.rotate += Math.round(value / split);
}
}
}
}
}
// Apply transformations to box
let transformations = [],
tempValue;
if (transform.hFlip) {
if (transform.vFlip) {
transform.rotate += 2;
} else {
// Horizontal flip
transformations.push('translate(' + (box.width + box.left) + ' ' + (0 - box.top) + ')');
transformations.push('scale(-1 1)');
box.top = box.left = 0;
}
} else if (transform.vFlip) {
// Vertical flip
transformations.push('translate(' + (0 - box.left) + ' ' + (box.height + box.top) + ')');
transformations.push('scale(1 -1)');
box.top = box.left = 0;
}
switch (transform.rotate % 4) {
case 1:
// 90deg
tempValue = box.height / 2 + box.top;
transformations.unshift('rotate(90 ' + tempValue + ' ' + tempValue + ')');
// swap width/height and x/y
if (box.left !== 0 || box.top !== 0) {
tempValue = box.left;
box.left = box.top;
box.top = tempValue;
}
if (box.width !== box.height) {
tempValue = box.width;
box.width = box.height;
box.height = tempValue;
}
break;
case 2:
// 180deg
transformations.unshift('rotate(180 ' + (box.width / 2 + box.left) + ' ' + (box.height / 2 + box.top) + ')');
break;
case 3:
// 270deg
tempValue = box.width / 2 + box.left;
transformations.unshift('rotate(-90 ' + tempValue + ' ' + tempValue + ')');
// swap width/height and x/y
if (box.left !== 0 || box.top !== 0) {
tempValue = box.left;
box.left = box.top;
box.top = tempValue;
}
if (box.width !== box.height) {
tempValue = box.width;
box.width = box.height;
box.height = tempValue;
}
break;
}
// Calculate dimensions
// Values for width/height: null = default, 'auto' = from svg, false = do not set
// Default: if both values aren't set, height defaults to '1em', width is calculated from height
let customWidth = props.width ? props.width : null;
let customHeight = props.height ? props.height : null;
let width, height;
if (customWidth === null && customHeight === null) {
customHeight = '1em';
}
if (customWidth !== null && customHeight !== null) {
width = customWidth;
height = customHeight;
} else if (customWidth !== null) {
width = customWidth;
height = calculateDimension(width, box.height / box.width);
} else {
height = customHeight;
width = calculateDimension(height, box.width / box.height);
}
if (width !== false) {
attributes.width = width === 'auto' ? box.width : width;
}
if (height !== false) {
attributes.height = height === 'auto' ? box.height : height;
}
// Add vertical-align for inline icon
if (inline && item.verticalAlign !== 0) {
style += 'vertical-align: ' + item.verticalAlign + 'em;';
}
// Check custom alignment
if (props.align !== void 0) {
props.align.toLowerCase().split(/[\s,]+/).forEach(value => {
switch (value) {
case 'left':
case 'right':
case 'center':
align.horizontal = value;
break;
case 'top':
case 'bottom':
case 'middle':
align.vertical = value;
break;
case 'crop':
align.slice = true;
break;
case 'meet':
align.slice = false;
}
});
}
// Add 360deg transformation to style to prevent subpixel rendering bug
style += '-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);';
// Style attribute
attributes.style = style;
// Generate viewBox and preserveAspectRatio attributes
attributes.preserveAspectRatio = _align(align);
attributes.viewBox = box.left + ' ' + box.top + ' ' + box.width + ' ' + box.height;
// Generate body
let body = replaceIDs(item.body);
if (props.color !== void 0) {
body = body.replace(/currentColor/g, props.color);
}
if (transformations.length) {
body = '<g transform="' + transformations.join(' ') + '">' + body + '</g>';
}
let svg = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"';
Object.keys(attributes).forEach(attr => {
svg += ' ' + attr + '="' + attributes[attr] + '"';
});
svg += '>' + body + '</svg>';
return svg;
};

140
tests/collection_test.js Normal file
View File

@ -0,0 +1,140 @@
"use strict";
(() => {
const Collection = require('../src/collection');
const chai = require('chai'),
expect = chai.expect,
should = chai.should();
describe('Testing loading collection', () => {
it('loading collection with prefix', () => {
let data = {
prefix: 'foo',
icons: {
bar: {
body: '<bar />',
width: 20,
height: 20
},
baz: {
body: '<baz />',
width: 30,
height: 40
}
},
aliases: {
baz90: {
parent: 'baz',
rotate: 1
}
}
};
let collection = new Collection();
collection.loadJSON(data); // load as object
expect(collection.loaded).to.be.equal(true);
expect(collection.prefix).to.be.equal('foo');
expect(collection.icons.bar).to.be.eql(data.icons.bar);
});
it('loading collection without prefix', () => {
let data = {
icons: {
'foo-bar': {
body: '<bar />',
width: 20,
height: 20
},
'foo-baz': {
body: '<baz />',
width: 30,
height: 40
}
},
aliases: {
'foo-baz90': {
parent: 'foo-baz',
rotate: 1
}
}
};
let collection = new Collection('foo');
collection.loadJSON(JSON.stringify(data)); // load as string
expect(collection.loaded).to.be.equal(true);
expect(collection.prefix).to.be.equal('foo');
expect(Object.keys(collection.icons)).to.be.eql(['bar', 'baz']);
});
it('loading collection without detectable prefix', () => {
let data = {
icons: {
'foo-bar': {
body: '<bar />',
width: 20,
height: 20
},
'foo-baz': {
body: '<baz />',
width: 30,
height: 40
}
},
aliases: {
'foo-baz90': {
parent: 'foo-baz',
rotate: 1
}
}
};
let collection = new Collection();
collection.loadJSON(data);
expect(collection.loaded).to.be.equal(false);
expect(collection.prefix).to.be.equal(null);
});
it('optimized collection', () => {
let data = {
prefix: 'foo',
icons: {
bar: {
body: '<bar />',
height: 20
},
baz: {
body: '<baz />'
}
},
aliases: {
baz90: {
parent: 'baz',
rotate: 1
}
},
width: 30,
height: 40
};
let collection = new Collection();
collection.loadJSON(data);
expect(collection.loaded).to.be.equal(true);
expect(collection.prefix).to.be.equal('foo');
expect(collection.icons.bar).to.be.eql({
body: '<bar />',
height: 20,
width: 30
});
expect(collection.icons.baz).to.be.eql({
body: '<baz />',
width: 30,
height: 40
});
});
});
})();

107
tests/dimensions_test.js Normal file
View File

@ -0,0 +1,107 @@
"use strict";
(() => {
const calculateDimension = require('../src/svg-dimensions');
const chai = require('chai'),
expect = chai.expect,
should = chai.should();
describe('Testing dimensions function', () => {
it('numbers', () => {
let width = 48,
height = 36,
result;
// Get height knowing width
result = calculateDimension(width, height / width);
expect(result).to.be.equal(height);
// Get width knowing height
result = calculateDimension(height, width / height);
expect(result).to.be.equal(width);
// Get height for custom width
result = calculateDimension(24, height / width);
expect(result).to.be.equal(18);
result = calculateDimension(30, height / width);
expect(result).to.be.equal(22.5);
result = calculateDimension(99, height / width);
expect(result).to.be.equal(74.25);
// Get width for custom height
result = calculateDimension(18, width / height);
expect(result).to.be.equal(24);
result = calculateDimension(74.25, width / height);
expect(result).to.be.equal(99);
// Test floating numbers
result = calculateDimension(16, 10 / 9);
expect(result).to.be.equal(17.78);
result = calculateDimension(16, 10 / 9, 1000);
expect(result).to.be.equal(17.778);
});
it('strings', () => {
let width = 48,
height = 36,
result;
// Strings without units
result = calculateDimension('48', height / width);
expect(result).to.be.equal('36');
// Pixels
result = calculateDimension('48px', height / width);
expect(result).to.be.equal('36px');
// Percentages
result = calculateDimension('36%', width / height);
expect(result).to.be.equal('48%');
// em
result = calculateDimension('1em', height / width);
expect(result).to.be.equal('0.75em');
result = calculateDimension('1em', width / height);
expect(result).to.be.equal('1.34em');
result = calculateDimension('1em', width / height, 1000);
expect(result).to.be.equal('1.334em');
// custom units with space
result = calculateDimension('48 Whatever', height / width);
expect(result).to.be.equal('36 Whatever');
// numbers after unit should be parsed too
result = calculateDimension('48% + 5em', height / width);
expect(result).to.be.equal('36% + 3.75em');
// calc()
result = calculateDimension('calc(100% - 48px)', height / width);
expect(result).to.be.equal('calc(75% - 36px)');
// -webkit-calc()
result = calculateDimension('-webkit-calc(100% - 48px)', height / width);
expect(result).to.be.equal('-webkit-calc(75% - 36px)');
});
it('strings without units', () => {
let width = 48,
height = 36,
result;
// invalid number
result = calculateDimension('-.', height / width);
expect(result).to.be.equal('-.');
// variable
result = calculateDimension('@width', height / width);
expect(result).to.be.equal('@width');
});
});
})();

162
tests/get_icon_test.js Normal file
View File

@ -0,0 +1,162 @@
"use strict";
(() => {
const Collection = require('../src/collection');
const chai = require('chai'),
expect = chai.expect,
should = chai.should();
describe('Testing icon data', () => {
it('simple icon', () => {
let data = {
prefix: 'foo',
icons: {
icon1: {
body: '<icon1 />'
},
icon2: {
body: '<icon2 />',
width: 30,
left: -10,
top: -5
},
icon3: {
body: '<icon3 />'
},
icon4: {
body: '<icon4 />'
}
},
width: 20,
height: 20
};
let collection = new Collection();
collection.loadJSON(data);
expect(collection.loaded).to.be.equal(true);
expect(collection.getIcon('icon1')).to.be.eql({
body: '<icon1 />',
left: 0,
top: 0,
width: 20,
height: 20,
inlineHeight: 20,
hFlip: false,
vFlip: false,
rotate: 0,
inlineTop: 0,
verticalAlign: -0.125
});
expect(collection.getIcon('icon2')).to.be.eql({
body: '<icon2 />',
left: -10,
top: -5,
width: 30,
height: 20,
inlineHeight: 20,
hFlip: false,
vFlip: false,
rotate: 0,
inlineTop: -5,
verticalAlign: -0.125
});
});
it('alias', () => {
let data = {
prefix: 'foo',
icons: {
icon1: {
body: '<icon1 />'
},
icon2: {
body: '<icon2 />',
rotate: 3,
hFlip: true,
vFlip: true,
top: -3
},
icon3: {
body: '<icon3 />'
},
icon4: {
body: '<icon4 />'
}
},
aliases: {
alias1: {
parent: 'icon1',
rotate: 1
},
alias2: {
parent: 'icon2',
rotate: 2,
hFlip: true,
width: 30,
height: 28 // verticalAlign should be -1/7
},
alias3: {
parent: 'missing-icon'
},
alias4: {
parent: 'alias5'
},
alias5: {
parent: 'alias4'
}
},
width: 20,
height: 20
};
let collection = new Collection();
collection.loadJSON(data);
expect(collection.loaded).to.be.equal(true);
// Simple alias
expect(collection.getIcon('alias1')).to.be.eql({
body: '<icon1 />',
parent: 'icon1', // Leftover from merging objects
left: 0,
top: 0,
width: 20,
height: 20,
inlineHeight: 20,
hFlip: false,
vFlip: false,
rotate: 1,
inlineTop: 0,
verticalAlign: -0.125
});
// Alias with overwritten properties
expect(collection.getIcon('alias2')).to.be.eql({
body: '<icon2 />',
parent: 'icon2', // Leftover from merging objects
left: 0,
top: -3,
width: 30,
height: 28,
inlineHeight: 28, // same as height
hFlip: false,
vFlip: true,
rotate: 5,
inlineTop: -3, // same as top
verticalAlign: -0.143
});
// Alias that has no parent
expect(collection.getIcon('alias3')).to.be.equal(null);
// Infinite loop
expect(collection.getIcon('alias4')).to.be.equal(null);
// No such icon/alias
expect(collection.getIcon('whatever')).to.be.equal(null);
});
});
})();

194
tests/get_icons_test.js Normal file
View File

@ -0,0 +1,194 @@
"use strict";
(() => {
const Collection = require('../src/collection');
const chai = require('chai'),
expect = chai.expect,
should = chai.should();
describe('Testing icons list', () => {
it('several icons', () => {
let data = {
prefix: 'foo',
icons: {
icon1: {
body: '<icon1 />'
},
icon2: {
body: '<icon2 />'
},
icon3: {
body: '<icon3 />'
},
icon4: {
body: '<icon4 />'
}
},
aliases: {
alias1: {
parent: 'icon1',
rotate: 1
}
},
width: 20,
height: 20
};
let collection = new Collection();
collection.loadJSON(data);
expect(collection.loaded).to.be.equal(true);
expect(collection.getIcons(['icon1', 'icon3', 'icon20'])).to.be.eql({
prefix: 'foo',
icons: {
icon1: {
body: '<icon1 />',
width: 20,
height: 20
},
icon3: {
body: '<icon3 />',
width: 20,
height: 20
},
},
aliases: {}
});
});
it('icons and aliases', () => {
let data = {
prefix: 'foo',
icons: {
icon1: {
body: '<icon1 />'
},
icon2: {
body: '<icon2 />'
},
icon3: {
body: '<icon3 />'
},
icon4: {
body: '<icon4 />'
}
},
aliases: {
alias1: {
parent: 'icon1',
rotate: 1
}
},
width: 20,
height: 20
};
let collection = new Collection();
collection.loadJSON(data);
expect(collection.loaded).to.be.equal(true);
expect(collection.getIcons(['icon2', 'alias1'])).to.be.eql({
prefix: 'foo',
icons: {
icon1: {
body: '<icon1 />',
width: 20,
height: 20
},
icon2: {
body: '<icon2 />',
width: 20,
height: 20
}
},
aliases: {
alias1: {
parent: 'icon1',
rotate: 1
}
}
});
});
it('aliases only', () => {
let data = {
prefix: 'foo',
icons: {
icon1: {
body: '<icon1 />'
},
icon2: {
body: '<icon2 />'
},
icon3: {
body: '<icon3 />'
},
icon4: {
body: '<icon4 />'
}
},
aliases: {
alias1: {
parent: 'icon1',
rotate: 1
}
},
width: 20,
height: 20
};
let collection = new Collection();
collection.loadJSON(data);
expect(collection.loaded).to.be.equal(true);
expect(collection.getIcons(['icon20', 'alias1'])).to.be.eql({
prefix: 'foo',
icons: {
icon1: {
body: '<icon1 />',
width: 20,
height: 20
}
},
aliases: {
alias1: {
parent: 'icon1',
rotate: 1
}
}
});
});
it('nothing to return', () => {
let data = {
prefix: 'foo',
icons: {
icon1: {
body: '<icon1 />'
},
icon2: {
body: '<icon2 />'
},
icon3: {
body: '<icon3 />'
},
icon4: {
body: '<icon4 />'
}
},
width: 20,
height: 20
};
let collection = new Collection();
collection.loadJSON(data);
expect(collection.getIcons(['icon20', 'alias10'])).to.be.eql({
prefix: 'foo',
icons: {},
aliases: {}
});
});
});
})();

107
tests/query_split_test.js Normal file
View File

@ -0,0 +1,107 @@
"use strict";
(() => {
const chai = require('chai'),
expect = chai.expect,
should = chai.should();
describe('Testing splitting query string', () => {
it('3 part requests', () => {
const exp = /^\/([a-z0-9-]+)\/([a-z0-9-]+)\.(js|json|svg)$/;
function test(str) {
let result = str.match(exp);
if (!result) {
return null;
}
// Remove first parameter and named parameters that don't exist in Expression.js params
result.shift();
delete result.index;
delete result.input;
return result;
}
// SVG
expect(test('/foo/bar.svg')).to.be.eql(['foo', 'bar', 'svg']);
expect(test('/fa-pro/test-icon.svg')).to.be.eql(['fa-pro', 'test-icon', 'svg']);
// icons
expect(test('/foo/icons.js')).to.be.eql(['foo', 'icons', 'js']);
expect(test('/long-prefixed-v1/icons.json')).to.be.eql(['long-prefixed-v1', 'icons', 'json']);
// Too long
expect(test('/fa-pro/test/icon.svg')).to.be.equal(null);
// Upper case
expect(test('/SomePrefix/Test.SVG')).to.be.equal(null);
// Invalid characters
expect(test('/foo_bar/test.svg')).to.be.equal(null);
});
it('2 part js/json requests', () => {
const exp = /^\/([a-z0-9-]+)\.(js|json)$/;
function test(str) {
let result = str.match(exp);
if (!result) {
return null;
}
// Remove first parameter and named parameters that don't exist in Expression.js params
result.shift();
delete result.index;
delete result.input;
return result;
}
// icons
expect(test('/foo.js')).to.be.eql(['foo', 'js']);
expect(test('/long-prefixed-v1.json')).to.be.eql(['long-prefixed-v1', 'json']);
// Too long
expect(test('/fa-pro/icons.js')).to.be.equal(null);
// Upper case
expect(test('/SomePrefix.JSON')).to.be.equal(null);
// Invalid characters
expect(test('/foo_bar.json')).to.be.equal(null);
});
it('2 part svg requests', () => {
const exp = /^\/([a-z0-9:\-]+)\.svg$/;
function test(str) {
let result = str.match(exp);
if (!result) {
return null;
}
// Remove first parameter and named parameters that don't exist in Expression.js params
result.shift();
delete result.index;
delete result.input;
return result;
}
// icons
expect(test('/foo.svg')).to.be.eql(['foo']);
expect(test('/long-prefixed-v1.svg')).to.be.eql(['long-prefixed-v1']);
expect(test('/long-prefixed:icon-v1.svg')).to.be.eql(['long-prefixed:icon-v1']);
// Too long
expect(test('/fa-pro/icons.svg')).to.be.equal(null);
// Upper case
expect(test('/SomePrefix.SVG')).to.be.equal(null);
// Invalid characters
expect(test('/foo_bar.svg')).to.be.equal(null);
});
});
})();

112
tests/query_test.js Normal file
View File

@ -0,0 +1,112 @@
"use strict";
(() => {
const chai = require('chai'),
expect = chai.expect,
should = chai.should();
const Collection = require('../src/collection'),
parseQuery = require('../src/query');
let collection1 = new Collection('test');
collection1.loadJSON({
prefix: 'test',
icons: {
icon1: {
body: '<icon1 fill="currentColor" />',
width: 30
},
icon2: {
body: '<icon2 />'
}
},
aliases: {
alias1: {
parent: 'icon2',
hFlip: true
}
},
width: 24,
height: 24
});
let collection2 = new Collection('test2');
collection2.loadJSON({
icons: {
'test2-icon1': {
body: '<icon1 fill="currentColor" />',
width: 30
},
'test2-icon2': {
body: '<icon2 />'
},
'test2-icon3': {
body: '<defs><foo id="bar" /></defs><bar use="url(#bar)" fill="currentColor" stroke="currentColor" />'
}
},
aliases: {
'test2-alias1': {
parent: 'test2-icon2',
hFlip: true
}
},
width: 24,
height: 24
});
describe('Testing requests', () => {
it('icons list', () => {
// Simple query with prefix
expect(parseQuery(collection1, 'icons', 'js', {
icons: 'alias1'
})).to.be.eql({
type: 'application/javascript; charset=utf-8',
body: 'SimpleSVG._loaderCallback({"prefix":"test","icons":{"icon2":{"body":"<icon2 />","width":24,"height":24}},"aliases":{"alias1":{"parent":"icon2","hFlip":true}}})'
});
// Query collection without prefix, json
expect(parseQuery(collection2, 'icons', 'json', {
icons: 'alias1'
})).to.be.eql({
type: 'application/json; charset=utf-8',
body: '{"prefix":"test2","icons":{"icon2":{"body":"<icon2 />","width":24,"height":24}},"aliases":{"alias1":{"parent":"icon2","hFlip":true}}}'
});
// Custom callback
expect(parseQuery(collection1, 'icons', 'js', {
icons: 'icon1,icon2',
callback: 'console.log'
})).to.be.eql({
type: 'application/javascript; charset=utf-8',
body: 'console.log({"prefix":"test","icons":{"icon1":{"body":"<icon1 fill=\\"currentColor\\" />","width":30,"height":24},"icon2":{"body":"<icon2 />","width":24,"height":24}}})'
});
});
it('svg', () => {
// Simple icon
expect(parseQuery(collection1, 'icon1', 'svg', {
})).to.be.eql({
filename: 'icon1.svg',
type: 'image/svg+xml; charset=utf-8',
body: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1.25em" height="1em" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 30 24"><icon1 fill="currentColor" /></svg>'
});
// Icon with custom attributes
expect(parseQuery(collection2, 'alias1', 'svg', {
color: 'red'
})).to.be.eql({
filename: 'alias1.svg',
type: 'image/svg+xml; charset=utf-8',
body: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1em" height="1em" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><g transform="translate(24 0) scale(-1 1)"><icon2 /></g></svg>'
});
// Icon with id replacement
let result = parseQuery(collection2, 'icon3', 'svg', {
color: 'red',
rotate: '90deg'
}).body.replace(/SimpleSVGId-[0-9a-f]+-[0-9a-f]+-[0-9]+/g, 'some-id');
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1em" height="1em" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><g transform="rotate(90 12 12)"><defs><foo id="some-id" /></defs><bar use="url(#some-id)" fill="red" stroke="red" /></g></svg>');
});
});
})();

152
tests/svg_test.js Normal file
View File

@ -0,0 +1,152 @@
"use strict";
(() => {
const generateSVG = require('../src/svg');
const chai = require('chai'),
expect = chai.expect,
should = chai.should();
describe('Testing SVG generator', () => {
const defaultAttributes = {
left: 0,
top: 0,
rotate: 0,
hFlip: false,
vFlip: false
};
// Copy of function from src/svg
function addMissingAttributes(data) {
let item = Object.assign({}, defaultAttributes, data);
if (item.inlineHeight === void 0) {
item.inlineHeight = item.height;
}
if (item.inlineTop === void 0) {
item.inlineTop = item.top;
}
if (item.verticalAlign === void 0) {
// -0.143 if icon is designed for 14px height,
// otherwise assume icon is designed for 16px height
item.verticalAlign = item.height % 7 === 0 && item.height % 8 !== 0 ? -0.143 : -0.125;
}
return item;
}
it('simple SVG icon with default and custom dimensions', () => {
let data = addMissingAttributes({
body: '<body />',
width: 24,
height: 24
});
let result = generateSVG(data, {});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1em" height="1em" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><body /></svg>');
// Custom dimensions
result = generateSVG(data, {
width: 48
});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><body /></svg>');
result = generateSVG(data, {
height: 32
});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><body /></svg>');
});
it('custom colors and inline icon', () => {
let data = addMissingAttributes({
body: '<path d="whatever" fill="currentColor" />',
width: 20,
height: 24,
inlineHeight: 28,
inlineTop: -2
});
let result = generateSVG(data, {});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="0.84em" height="1em" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 20 24"><path d="whatever" fill="currentColor" /></svg>');
result = generateSVG(data, {
width: '48',
color: 'red'
});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="57.6" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 20 24"><path d="whatever" fill="red" /></svg>');
result = generateSVG(data, {
height: '100%',
inline: 'true'
});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="71.43%" height="100%" style="vertical-align: -0.125em;-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 -2 20 28"><path d="whatever" fill="currentColor" /></svg>');
});
it('custom alignment', () => {
let data = addMissingAttributes({
body: '<path d="whatever" fill="currentColor" />',
width: 20,
height: 24,
inlineHeight: 28,
inlineTop: -2
});
let result = generateSVG(data, {
align: 'top',
width: '50',
height: '50'
});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="50" height="50" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMin meet" viewBox="0 0 20 24"><path d="whatever" fill="currentColor" /></svg>');
result = generateSVG(data, {
align: 'left,bottom',
width: '50',
height: '50'
});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="50" height="50" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMinYMax meet" viewBox="0 0 20 24"><path d="whatever" fill="currentColor" /></svg>');
result = generateSVG(data, {
align: 'right,middle,crop',
width: '50',
height: '50'
});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="50" height="50" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMaxYMid slice" viewBox="0 0 20 24"><path d="whatever" fill="currentColor" /></svg>');
});
it('transformations', () => {
let data = addMissingAttributes({
body: '<body />',
width: 20,
height: 24
});
let result = generateSVG(data, {
rotate: 1
});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1.2em" height="1em" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 20"><g transform="rotate(90 12 12)"><body /></g></svg>');
result = generateSVG(data, {
rotate: '180deg'
});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="0.84em" height="1em" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 20 24"><g transform="rotate(180 10 12)"><body /></g></svg>');
result = generateSVG(data, {
rotate: '3'
});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1.2em" height="1em" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 20"><g transform="rotate(-90 10 10)"><body /></g></svg>');
result = generateSVG(data, {
rotate: '75%'
});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1.2em" height="1em" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 20"><g transform="rotate(-90 10 10)"><body /></g></svg>');
result = generateSVG(data, {
flip: 'Horizontal'
});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="0.84em" height="1em" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 20 24"><g transform="translate(20 0) scale(-1 1)"><body /></g></svg>');
result = generateSVG(data, {
flip: 'ignored, Vertical space-works-as-comma'
});
expect(result).to.be.equal('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="0.84em" height="1em" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 20 24"><g transform="translate(0 24) scale(1 -1)"><body /></g></svg>');
});
});
})();