Compare commits

...

60 Commits

Author SHA1 Message Date
codecalm e7e3195075 Release 3.0.0-beta 2024-02-19 00:59:15 +01:00
codecalm 53c320b014 icons images 2024-02-18 02:19:39 +01:00
codecalm ea39ab67ed build fixes 2024-02-18 01:16:26 +01:00
codecalm e4db65248b changelog update 2024-02-17 20:58:26 +01:00
codecalm 4ea7275ef8 build fixes 2024-02-17 20:31:53 +01:00
codecalm ad4f8659b0 update icons 2024-02-17 20:26:51 +01:00
codecalm 8391b90880 update icons unicode 2024-02-17 19:17:59 +01:00
codecalm d2099d6fc4 build fixes 2024-02-17 18:49:50 +01:00
codecalm 489afa542f iconfont build 2024-02-17 17:28:56 +01:00
codecalm 34dda0cb41 remove unused files 2024-02-16 01:29:26 +01:00
Paweł Kuna de1987b868
separate icons to `filled` and `outline` directories (#1002)
* separate icons to solid

* icons separate

* move icons

* init svg icons

* init svg icons

* separate icons

* separate icons

* optimize icons

* optimize icons

* random icons generate

* generate icons preview

* preview icons

* build

* optimize fix

* icons separate

* icons preview

* optimize icons

* 81 new icons: `filled/assembly`, `filled/asset`, `filled/baby-carriage`, `filled/barbell`, `filled/barrier-block`, `filled/bed-flat`, `filled/bone`, `filled/boom`, `filled/bow`, `filled/bowl-chopsticks`, `filled/bowl-spoon`, `filled/brand-spotify`, `filled/bread`, `filled/briefcase-2`, `filled/brightness-auto`, `filled/brightness`, `filled/building-broadcast-tower`, `filled/hexagon-letter-a`, `filled/hexagon-letter-b`, `filled/hexagon-letter-c`, `filled/hexagon-letter-d`, `filled/hexagon-letter-e`, `filled/hexagon-letter-f`, `filled/hexagon-letter-g`, `filled/hexagon-letter-h`, `filled/hexagon-letter-i`, `filled/hexagon-letter-j`, `filled/hexagon-letter-k`, `filled/hexagon-letter-l`, `filled/hexagon-letter-m`, `filled/hexagon-letter-n`, `filled/hexagon-letter-o`, `filled/hexagon-letter-p`, `filled/hexagon-letter-q`, `filled/hexagon-letter-r`, `filled/hexagon-letter-s`, `filled/hexagon-letter-t`, `filled/hexagon-letter-u`, `filled/hexagon-letter-v`, `filled/hexagon-letter-w`, `filled/hexagon-letter-x`, `filled/hexagon-letter-y`, `filled/hexagon-letter-z`, `filled/hexagon-minus`, `filled/hexagon-plus`, `filled/home`, `filled/ironing`, `filled/jetpack`, `filled/key`, `filled/layout-2`, `filled/layout-cards`, `filled/layout-dashboard`, `filled/layout-distribute-horizontal`, `filled/layout-distribute-vertical`, `filled/layout-grid`, `filled/layout-kanban`, `filled/layout-list`, `filled/layout-sidebar-right`, `filled/layout-sidebar`, `filled/layout`, `filled/lego`, `filled/lock`, `filled/lungs`, `filled/macro`, `filled/magnet`, `filled/man`, `filled/manual-gearbox`, `filled/woman`, `filled/xbox-a`, `filled/xbox-b`, `filled/xbox-x`, `filled/xbox-y`, `filled/zeppelin`, `filled/zoom-cancel`, `filled/zoom-code`, `filled/zoom-exclamation`, `filled/zoom-money`, `filled/zoom-out-area`, `filled/zoom-pan`, `filled/zoom-question`, `filled/zoom-scan`

Fixed icons: `filled/archive`, `filled/basket`, `outline/layout-dashboard`, `outline/zoom-pan`

* Fixed icon: `filled/biohazard`

* 4 new icons: `outline/border-bottom-plus`, `outline/border-left-plus`, `outline/border-right-plus`, `outline/border-top-plus`

* debug off

* build `@tabler/icons` package

* build `@tabler/icons` package

* build `@tabler/icons-eps` , `@tabler/icons-pdf`, `@tabler/icons-png`  package

* build `@tabler/icons-react` , `@tabler/icons-preact`, `@tabler/icons-svelte`, `@tabler/icons-vue`, `@tabler/icons-solidjs`  package

* build fixes
2024-02-16 01:25:55 +01:00
codecalm d3c3a49ea7 react native package fix 2024-02-09 18:04:41 +01:00
codecalm 04a8e474a1 Release 3.0.0-alpha.1 2024-02-09 17:53:07 +01:00
codecalm c7e0897281 4 new icons: `biohazard-filled`, `microphone-filled`, `microwave-filled`, `soup-filled`
Fixed icons: `bowl-filled`
2024-02-09 17:30:41 +01:00
codecalm 717dc828f1 icons fix 2024-02-09 14:25:17 +01:00
codecalm f443deab9a Fixed icons: `brand-graphql` 2024-02-09 14:13:13 +01:00
codecalm 67a2c09286 6 new icons: `cookie-filled`, `cookie-man-filled`, `copy-check-filled`, `copy-minus-filled`, `copy-plus-filled`, `copy-x-filled`
Fixed icons: `cookie-man`, `cookie`, `copy-check`, `copy-minus`, `copy-plus`, `copy-x`
2024-02-09 14:04:35 +01:00
codecalm 58b543e908 Fixed icons: `square-letter-a-filled`, `square-letter-b-filled`, `square-letter-c-filled`, `square-letter-d-filled`, `square-letter-e-filled`, `square-letter-f-filled`, `square-letter-g-filled`, `square-letter-h-filled`, `square-letter-i-filled`, `square-letter-j-filled`, `square-letter-k-filled`, `square-letter-l-filled`, `square-letter-m-filled`, `square-letter-n-filled`, `square-letter-o-filled`, `square-letter-p-filled`, `square-letter-q-filled`, `square-letter-r-filled`, `square-letter-s-filled`, `square-letter-t-filled`, `square-letter-u-filled`, `square-letter-v-filled`, `square-letter-w-filled`, `square-letter-x-filled`, `square-letter-y-filled`, `square-letter-z-filled` 2024-02-09 13:36:06 +01:00
codecalm c7b89b82e1 4 new icons: `transition-bottom-filled`, `transition-left-filled`, `transition-right-filled`, `transition-top-filled` 2024-02-09 13:28:46 +01:00
codecalm 99001e11e9 1 new icons: `contrast-2-filled`
Fixed icons: `contrast-2`
2024-02-09 12:49:47 +01:00
codecalm 157e90c08b 3 new icons: `cone-2-filled`, `cone-filled`, `contrast-filled` 2024-02-09 12:46:27 +01:00
codecalm 65eba73879 Fixed icons: `cookie-man`, `cookie`, `copy-check`, `copy-minus`, `copy-x`, `stack-2-filled`, `stack-3-filled`, `stack-filled` 2024-02-09 12:41:04 +01:00
codecalm 6caa1609ab 3 new icons: `stack-2-filled`, `stack-3-filled`, `stack-filled` 2024-02-09 12:16:51 +01:00
codecalm da623e6959 80 new icons: `circle-letter-a-filled`, `circle-letter-b-filled`, `circle-letter-c-filled`, `circle-letter-d-filled`, `circle-letter-e-filled`, `circle-letter-f-filled`, `circle-letter-g-filled`, `circle-letter-h-filled`, `circle-letter-i-filled`, `circle-letter-j-filled`, `circle-letter-k-filled`, `circle-letter-l-filled`, `circle-letter-letter-v-filled`, `circle-letter-m-filled`, `circle-letter-n-filled`, `circle-letter-o-filled`, `circle-letter-p-filled`, `circle-letter-q-filled`, `circle-letter-r-filled`, `circle-letter-s-filled`, `circle-letter-t-filled`, `circle-letter-u-filled`, `circle-letter-v-filled`, `circle-letter-w-filled`, `circle-letter-x-filled`, `circle-letter-y-filled`, `circle-letter-z-filled`, `square-letter-a-filled`, `square-letter-b-filled`, `square-letter-c-filled`, `square-letter-d-filled`, `square-letter-e-filled`, `square-letter-f-filled`, `square-letter-g-filled`, `square-letter-h-filled`, `square-letter-i-filled`, `square-letter-j-filled`, `square-letter-k-filled`, `square-letter-l-filled`, `square-letter-letter-v-filled`, `square-letter-m-filled`, `square-letter-n-filled`, `square-letter-o-filled`, `square-letter-p-filled`, `square-letter-q-filled`, `square-letter-r-filled`, `square-letter-s-filled`, `square-letter-t-filled`, `square-letter-u-filled`, `square-letter-v-filled`, `square-letter-w-filled`, `square-letter-x-filled`, `square-letter-y-filled`, `square-letter-z-filled`, `square-rounded-letter-a-filled`, `square-rounded-letter-b-filled`, `square-rounded-letter-c-filled`, `square-rounded-letter-d-filled`, `square-rounded-letter-e-filled`, `square-rounded-letter-f-filled`, `square-rounded-letter-g-filled`, `square-rounded-letter-h-filled`, `square-rounded-letter-i-filled`, `square-rounded-letter-j-filled`, `square-rounded-letter-k-filled`, `square-rounded-letter-l-filled`, `square-rounded-letter-m-filled`, `square-rounded-letter-n-filled`, `square-rounded-letter-o-filled`, `square-rounded-letter-p-filled`, `square-rounded-letter-q-filled`, `square-rounded-letter-r-filled`, `square-rounded-letter-s-filled`, `square-rounded-letter-t-filled`, `square-rounded-letter-u-filled`, `square-rounded-letter-v-filled`, `square-rounded-letter-w-filled`, `square-rounded-letter-x-filled`, `square-rounded-letter-y-filled`, `square-rounded-letter-z-filled` 2024-02-09 12:12:07 +01:00
codecalm 0c7ed4f0a5 7 new icons: `crop-1-1-filled`, `crop-16-9-filled`, `crop-3-2-filled`, `crop-5-4-filled`, `crop-7-5-filled`, `crop-landscape-filled`, `crop-portrait-filled` 2024-02-09 11:17:37 +01:00
codecalm 815c032512 25 new icons: `cash-banknote-filled`, `clock-hour-1-filled`, `clock-hour-10-filled`, `clock-hour-11-filled`, `clock-hour-12-filled`, `clock-hour-2-filled`, `clock-hour-3-filled`, `clock-hour-4-filled`, `clock-hour-5-filled`, `clock-hour-6-filled`, `clock-hour-7-filled`, `clock-hour-8-filled`, `clock-hour-9-filled`, `gps-filled`, `layout-align-bottom-filled`, `layout-align-center-filled`, `layout-align-left-filled`, `layout-align-middle-filled`, `layout-align-right-filled`, `layout-align-top-filled`, `radar-filled`, `relation-many-to-many-filled`, `relation-one-to-many-filled`, `relation-one-to-one-filled`, `section-filled`
Fixed icons: `ce-off`
2024-02-09 10:53:53 +01:00
codecalm fe7d27bddb 22 new icons: `badge-3d-filled`, `badge-4k-filled`, `badge-8k-filled`, `badge-ad-filled`, `badge-ar-filled`, `badge-cc-filled`, `badge-hd-filled`, `badge-sd-filled`, `badge-tm-filled`, `badge-vo-filled`, `badge-vr-filled`, `badge-wc-filled`, `boom`, `brand-astro`, `car-4wd`, `car-fan-1`, `car-fan-2`, `car-fan-3`, `car-fan-auto`, `car-fan`, `scan-position`, `typeface`
Fixed icons: `badge-3d`
2024-02-09 10:11:46 +01:00
codecalm e96d08fbe1 categories build fix 2024-02-09 00:10:46 +01:00
codecalm 62bdf809fe remove build files 2024-02-08 23:55:23 +01:00
codecalm 17afc8b8b9 turbo update 2024-02-08 23:55:03 +01:00
codecalm eea779cb6d Merge branch 'dev-v3-build-files' of https://github.com/tabler/tabler-icons into dev-v3 2024-02-08 23:49:21 +01:00
codecalm 44ce0d1945 remove build files 2024-02-08 23:48:33 +01:00
Paweł Kuna a60a6e4b3a
build files remove (#1000)
* init react-native package

* remove build files
2024-02-08 23:42:54 +01:00
codecalm c4f50fd726 Merge branch 'dev-v3' of https://github.com/tabler/tabler-icons into dev-v3-build-files 2024-02-08 23:39:37 +01:00
codecalm 27605b8f20 remove build files 2024-02-08 23:37:13 +01:00
Paweł Kuna c547243f6e
React Native new package (#999) 2024-02-08 23:08:55 +01:00
codecalm c56b2914a1 init react-native package 2024-02-08 23:06:35 +01:00
BG-Software-BG 2a2b0ec27d
Merge pull request #994 from tabler/dev-v3-fix-icon-names
Fix icon names
2024-02-06 20:59:38 +01:00
Bartłomiej Gawęda 4fc40a872f Rename 7 icons and add aliases for them 2024-02-03 09:38:10 +01:00
codecalm 048b3260a0 build v3 2024-02-02 21:29:07 +01:00
codecalm 9c06114f89 Merge branch 'master' of https://github.com/tabler/tabler-icons into dev-v3 2024-02-02 20:54:03 +01:00
codecalm 0a955dcc11 rollup plugins fix 2024-01-19 02:15:46 +01:00
codecalm a06ad58685 build fix 2024-01-19 00:31:14 +01:00
codecalm 99114f09e0 Release 3.0.0-alpha.0 2024-01-19 00:00:05 +01:00
codecalm 8f86652cdd iconfont cache 2024-01-18 23:40:42 +01:00
codecalm 28470c5e19 dependencies update 2024-01-18 20:55:28 +01:00
codecalm 904996e297 Merge branch 'master' of https://github.com/tabler/tabler-icons into dev-svelte-fix 2024-01-18 20:48:31 +01:00
codecalm 891eed9883 update gemfile 2024-01-05 16:23:20 +01:00
codecalm fb302d266e dependencies update 2024-01-05 16:13:04 +01:00
codecalm 6d818d9f28 add icons aliases 2024-01-05 03:51:24 +01:00
codecalm 6a9f04c0b1 build fixes 2024-01-05 03:33:23 +01:00
codecalm f8ed02ea0a build cleanup 2024-01-05 02:57:11 +01:00
codecalm fc3c0900ec add unit tests 2024-01-05 02:45:28 +01:00
codecalm c8314e1627 vue components 2024-01-05 01:29:27 +01:00
codecalm 74a674ea27 solidjs components 2024-01-05 01:19:48 +01:00
codecalm fbd67bad2e preact components 2024-01-05 00:53:35 +01:00
codecalm b4cc0d8dff react components 2024-01-04 23:57:54 +01:00
codecalm b5144b1fde build fix 2024-01-04 22:25:38 +01:00
codecalm ecf75d764b add missing svelte condition #941 2024-01-04 22:01:35 +01:00
codecalm 49c1224849 fix: fix icons svelte package 2024-01-04 21:58:10 +01:00
23437 changed files with 202089 additions and 474337 deletions

View File

@ -1,13 +1,8 @@
import fs from 'fs-extra'
import path from 'path'
import { PACKAGES_DIR, readSvgs } from './helpers.mjs'
import { PACKAGES_DIR, getAliases, toPascalCase, getAllIcons } from './helpers.mjs'
import { stringify } from 'svgson'
import prettier from 'prettier'
import bundleSize from '@atomico/rollup-plugin-sizes'
import { visualizer } from 'rollup-plugin-visualizer'
import license from 'rollup-plugin-license'
import esbuild from 'rollup-plugin-esbuild'
import prettier from "@prettier/sync"
/**
* Build icons
@ -15,30 +10,32 @@ import esbuild from 'rollup-plugin-esbuild'
* @param name
* @param componentTemplate
* @param indexIconTemplate
* @param typeDefinitionsTemplate
* @param indexTypeTemplate
* @param extension
* @param pretty
*/
export const buildIcons = ({
export const buildJsIcons = ({
name,
componentTemplate,
indexItemTemplate,
typeDefinitionsTemplate,
indexTypeTemplate,
aliasTemplate,
extension = 'js',
pretty = true,
key = true,
pascalCase = false
pascalCase = false,
pascalName = true,
indexFile = 'icons.ts'
}) => {
const DIST_DIR = path.resolve(PACKAGES_DIR, name),
svgFiles = readSvgs()
const DIST_DIR = path.resolve(PACKAGES_DIR, name);
const aliases = getAliases(),
allIcons = getAllIcons(false, true)
let index = []
let typings = []
Object.entries(allIcons).forEach(([type, icons]) => {
icons.forEach((icon, i) => {
process.stdout.write(`Building \`${name}\` ${type} ${i}/${icons.length}: ${icon.name.padEnd(42)}\r`)
svgFiles.forEach((svgFile, i) => {
const children = svgFile.obj.children
const children = icon.obj.children
.map(({
name,
attributes
@ -47,7 +44,7 @@ export const buildIcons = ({
attributes.key = `svg-${i}`
}
if(pascalCase) {
if (pascalCase) {
attributes.strokeWidth = attributes['stroke-width']
delete attributes['stroke-width']
}
@ -59,54 +56,51 @@ export const buildIcons = ({
return !attributes.d || attributes.d !== 'M0 0h24v24H0z'
})
// process.stdout.write(`Building ${i}/${svgFiles.length}: ${svgFile.name.padEnd(42)}\r`)
const iconName = `${icon.name}${type !== 'outline' ? `-${type}` : ''}`,
iconNamePascal = `${icon.namePascal}${type !== 'outline' ? toPascalCase(type) : ''}`
let component = componentTemplate({
name: svgFile.name,
namePascal: svgFile.namePascal,
children,
stringify,
svg: svgFile
let component = componentTemplate({
type,
name: iconName,
namePascal: iconNamePascal,
children,
stringify,
svg: icon.content
})
// Format component
const output = pretty ? prettier.format(component, {
singleQuote: true,
trailingComma: 'all',
parser: 'babel'
}) : component
let filePath = path.resolve(DIST_DIR, 'src/icons', `${pascalName ? iconNamePascal : iconName}.${extension}`)
fs.writeFileSync(filePath, output, 'utf-8')
index.push(indexItemTemplate({
type,
name: iconName,
namePascal: iconNamePascal
}))
})
const output = pretty ? prettier.format(component, {
singleQuote: true,
trailingComma: 'all',
parser: 'babel'
}) : component
let filePath = path.resolve(DIST_DIR, 'src/icons', `${svgFile.namePascal}.${extension}`)
fs.writeFileSync(filePath, output, 'utf-8')
index.push(indexItemTemplate({
name: svgFile.name,
namePascal: svgFile.namePascal
}))
typings.push(indexTypeTemplate({
name: svgFile.name,
namePascal: svgFile.namePascal
}))
})
fs.writeFileSync(path.resolve(DIST_DIR, `./src/icons.js`), index.join('\n'), 'utf-8')
fs.writeFileSync(path.resolve(DIST_DIR, `src/icons/${indexFile}`), index.join('\n'), 'utf-8')
fs.ensureDirSync(path.resolve(DIST_DIR, `./dist/`))
fs.writeFileSync(path.resolve(DIST_DIR, `./dist/tabler-${name}.d.ts`), typeDefinitionsTemplate() + '\n' + typings.join('\n'), 'utf-8')
}
export const getRollupPlugins = (pkg, minify) => {
return [
esbuild({
minify
}),
license({
banner: `${pkg.name} v${pkg.version} - ${pkg.license}`
}),
bundleSize(),
visualizer({
sourcemap: false,
filename: `stats/${pkg.name}${minify ? '-min' : ''}.html`
// Write aliases
let aliasesStr = '';
if (aliases && aliasTemplate) {
Object.entries(aliases).forEach(([from, to]) => {
aliasesStr += aliasTemplate({
from,
to,
fromPascal: toPascalCase(from),
toPascal: toPascalCase(to)
})
})
].filter(Boolean)
}
fs.writeFileSync(path.resolve(DIST_DIR, `./src/aliases.ts`), aliasesStr || `export {};`, 'utf-8')
}

View File

@ -4,15 +4,15 @@ import { printChangelog } from './helpers.mjs'
cp.exec('git status', function(err, ret) {
let newIcons = [], modifiedIcons = [], renamedIcons = []
ret.replace(/new file:\s+src\/_icons\/([a-z0-9-]+)\.svg/g, function(m, fileName) {
ret.replace(/new file:\s+icons\/([a-z0-9-\/]+)\.svg/g, function(m, fileName) {
newIcons.push(fileName)
})
ret.replace(/modified:\s+src\/_icons\/([a-z0-9-]+)\.svg/g, function(m, fileName) {
ret.replace(/modified:\s+icons\/([a-z0-9-\/]+)\.svg/g, function(m, fileName) {
modifiedIcons.push(fileName)
})
ret.replace(/renamed:\s+src\/_icons\/([a-z0-9-]+).svg -> src\/_icons\/([a-z0-9-]+).svg/g, function(m, fileNameBefore, fileNameAfter) {
ret.replace(/renamed:\s+icons\/([a-z0-9-\/]+).svg -> icons\/([a-z0-9-\/]+).svg/g, function(m, fileNameBefore, fileNameAfter) {
renamedIcons.push([fileNameBefore, fileNameAfter])
})

View File

@ -1,25 +1,28 @@
import { generateIconsPreview, getArgvs, getPackageJson, HOME_DIR } from './helpers.mjs'
import * as fs from 'fs'
import { generateIconsPreview, getAllIcons, getArgvs, getPackageJson, GITHUB_DIR } from './helpers.mjs'
import path from 'path'
const argv = getArgvs(),
p = getPackageJson()
p = getPackageJson()
const version = argv['new-version'] || `${p.version}`
if (version) {
const icons = JSON.parse(fs.readFileSync(`${HOME_DIR}/tags.json`))
const icons = getAllIcons()
const newIcons = Object
.entries(icons)
.filter(([name, value]) => {
return `${value.version}.0` === version
})
.map(([name, value]) => {
return `./icons/${name}.svg`
})
let newIcons = []
Object.entries(icons).forEach(([type, icons]) => {
icons.forEach(icon => {
if (icon.version) {
if (`${icon.version}.0` === version) {
console.log(`Add icon "${type}/${icon.name}" vith version "${icon.version}" to new icons list`)
newIcons.push(icon.path)
}
}
})
})
if (newIcons.length > 0) {
generateIconsPreview(newIcons, `.github/tabler-icons-${version}.svg`, {
generateIconsPreview(newIcons, path.join(GITHUB_DIR, `tabler-icons-${version}.svg`), {
columnsCount: 6,
paddingOuter: 24
})

View File

@ -6,19 +6,19 @@ const p = getPackageJson(),
version = argv['latest-version'] || `${p.version}`
if (version) {
cp.exec(`git diff ${version} HEAD --name-status src/_icons`, function(err, ret) {
cp.exec(`git diff ${version} HEAD --name-status ./icons`, function(err, ret) {
let newIcons = [], modifiedIcons = [], renamedIcons = []
ret.replace(/A\s+src\/_icons\/([a-z0-9-]+)\.svg/g, function(m, fileName) {
ret.replace(/A\s+icons\/([a-z0-9-]+)\.svg/g, function(m, fileName) {
newIcons.push(fileName)
})
ret.replace(/M\s+src\/_icons\/([a-z0-9-]+)\.svg/g, function(m, fileName) {
ret.replace(/M\s+icons\/([a-z0-9-]+)\.svg/g, function(m, fileName) {
modifiedIcons.push(fileName)
})
ret.replace(/R[0-9]+\s+src\/_icons\/([a-z0-9-]+)\.svg\s+src\/_icons\/([a-z0-9-]+).svg/g, function(m, fileNameBefore, fileNameAfter) {
ret.replace(/R[0-9]+\s+icons\/([a-z0-9-]+)\.svg\s+icons\/([a-z0-9-]+).svg/g, function(m, fileNameBefore, fileNameAfter) {
renamedIcons.push([fileNameBefore, fileNameAfter])
})

View File

@ -1,29 +0,0 @@
import glob from 'glob'
import fs from 'fs'
import path from 'path'
import { ICONS_SRC_DIR } from './helpers.mjs'
let unicodes = []
glob(path.join(ICONS_SRC_DIR, '*.svg'), {}, function(er, files) {
for (const i in files) {
const file = files[i]
let svgFile = fs.readFileSync(file).toString()
const matches = svgFile.match(/\nunicode: "?([a-f0-9.]+)"?/i)
if (matches[1]) {
const unicode = matches[1]
if (unicode && unicodes.indexOf(unicode) === -1) {
unicodes.push(unicode)
} else {
throw new Error(`Unicode ${unicode} in icon ${file} already exists!`)
}
} else {
throw new Error(`Icon ${file} don't have a unicode!`)
}
}
})

View File

@ -9,6 +9,31 @@ import { parseSync } from 'svgson'
import { optimize } from 'svgo'
import cp from 'child_process'
import minimist from 'minimist'
import matter from 'gray-matter'
import { globSync } from 'glob'
import { exec } from 'child_process'
export const iconTemplate = (type) => type === 'outline' ? `<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>` : `<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="currentColor"
>`
export const blankSquare = '<path stroke="none" d="M0 0h24v24H0z" fill="none"/>'
export const types = ['outline', 'filled']
export const getCurrentDirPath = () => {
return path.dirname(fileURLToPath(import.meta.url));
@ -16,9 +41,87 @@ export const getCurrentDirPath = () => {
export const HOME_DIR = resolve(getCurrentDirPath(), '..')
export const ICONS_SRC_DIR = resolve(HOME_DIR, 'src/_icons')
export const ICONS_DIR = resolve(HOME_DIR, 'icons')
export const ICONS_SRC_DIR = resolve(HOME_DIR, 'icons')
export const PACKAGES_DIR = resolve(HOME_DIR, 'packages')
export const GITHUB_DIR = resolve(HOME_DIR, '.github')
export const parseMatter = (icon) => {
const { data, content } = matter.read(icon, { delims: ['<!--', '-->'] })
return { data, content }
}
const getSvgContent = (svg, type, name) => {
return svg
.replace(/<svg([^>]+)>/, (m, m1) => {
return `<svg${m1} class="icon icon-tabler icons-tabler-${type} icon-tabler-${name}"\n>\n ${blankSquare}`
})
.trim()
}
export const getAllIcons = (withContent = false, withObject = false) => {
let icons = {}
const limit = process.env['ICONS_LIMIT'] || Infinity;
types.forEach(type => {
icons[type] = globSync(path.join(ICONS_SRC_DIR, `${type}/*.svg`))
.slice(0, limit)
.sort()
.map(i => {
const { data, content } = parseMatter(i),
name = basename(i, '.svg')
return {
name,
namePascal: toPascalCase(`icon ${name}`),
path: i,
category: data.category || '',
tags: data.tags || [],
version: data.version || '',
unicode: data.unicode || '',
...(withContent ? { content: getSvgContent(content, type, name) } : {}),
...(withObject ? { obj: parseSync(content.replace(blankSquare, '')) } : {})
}
})
.sort()
})
return icons
}
export const getAllIconsMerged = (withContent = false, withObject = false) => {
const allIcons = getAllIcons(true)
const icons = {};
allIcons.outline.forEach(icon => {
icons[icon.name] = {
name: icon.name,
category: icon.category || '',
tags: icon.tags || [],
styles: {
outline: {
version: icon.version || '',
unicode: icon.unicode || '',
...(withContent ? { content: icon.content } : {}),
...(withObject ? { obj: icon.obj } : {})
}
}
}
})
allIcons.filled.forEach(icon => {
if (icons[icon.name]) {
icons[icon.name].styles.filled = {
version: icon.version || '',
unicode: icon.unicode || '',
...(withContent ? { content: icon.content } : {}),
...(withObject ? { obj: icon.obj } : {})
}
}
})
return icons;
}
export const getArgvs = () => {
return minimist(process.argv.slice(2))
@ -28,6 +131,7 @@ export const getPackageDir = (packageName) => {
return `${PACKAGES_DIR}/${packageName}`
}
/**
* Return project package.json
* @returns {any}
@ -46,24 +150,39 @@ export const readSvgDirectory = (directory) => {
return fs.readdirSync(directory).filter((file) => path.extname(file) === '.svg')
}
export const readSvgs = () => {
const svgFiles = readSvgDirectory(ICONS_DIR)
export const getAliases = (groupped = false) => {
const allAliases = JSON.parse(fs.readFileSync(resolve(HOME_DIR, 'aliases.json'), 'utf-8'));
const allIcons = getAllIcons()
return svgFiles.map(svgFile => {
const name = basename(svgFile, '.svg'),
namePascal = toPascalCase(`icon ${name}`),
contents = readSvg(svgFile, ICONS_DIR).trim(),
path = resolve(ICONS_DIR, svgFile),
obj = parseSync(contents.replace('<path stroke="none" d="M0 0h24v24H0z" fill="none"/>', ''));
if (groupped) {
let aliases = [];
types.forEach(type => {
const icons = allIcons[type].map(i => i.name);
return {
name,
namePascal,
contents,
obj,
path
};
});
aliases[type] = {};
for (const [key, value] of Object.entries(allAliases[type])) {
if (icons.includes(value)) {
aliases[type][key] = value;
}
}
});
return aliases
} else {
let aliases = [];
types.forEach(type => {
const icons = allIcons[type].map(i => i.name);
for (const [key, value] of Object.entries(allAliases[type])) {
if (icons.includes(value)) {
aliases[`${key}${type !== 'outline' ? `-${type}` : ''}`] = `${value}${type !== 'outline' ? `-${type}` : ''}`;
}
}
});
return aliases
}
}
/**
@ -111,16 +230,14 @@ export const toPascalCase = (string) => {
return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);
}
export const addFloats = function(n1, n2) {
export const addFloats = function (n1, n2) {
return Math.round((parseFloat(n1) + parseFloat(n2)) * 1000) / 1000
}
export const optimizePath = function(path) {
export const optimizePath = function (path) {
let transformed = svgpath(path).rel().round(3).toString()
return svgParse(transformed).map(function(a) {
return svgParse(transformed).map(function (a) {
return a.join(' ')
}).join('')
}
@ -145,16 +262,16 @@ export const optimizeSVG = (data) => {
export function buildIconsObject(svgFiles, getSvg) {
return svgFiles
.map(svgFile => {
const name = path.basename(svgFile, '.svg');
const svg = getSvg(svgFile);
const contents = getSvgContents(svg);
return { name, contents };
})
.reduce((icons, icon) => {
icons[icon.name] = icon.contents;
return icons;
}, {});
.map(svgFile => {
const name = path.basename(svgFile, '.svg');
const svg = getSvg(svgFile);
const contents = getSvgContents(svg);
return { name, contents };
})
.reduce((icons, icon) => {
icons[icon.name] = icon.contents;
return icons;
}, {});
}
function getSvgContents(svg) {
@ -168,42 +285,54 @@ export const asyncForEach = async (array, callback) => {
}
}
export const createScreenshot = async (filePath) => {
await cp.exec(`rsvg-convert -x 2 -y 2 ${filePath} > ${filePath.replace('.svg', '.png')}`)
await cp.exec(`rsvg-convert -x 4 -y 4 ${filePath} > ${filePath.replace('.svg', '@2x.png')}`)
export const createScreenshot = (filePath, retina = true) => {
cp.execSync(`rsvg-convert -x 2 -y 2 ${filePath} > ${filePath.replace('.svg', '.png')}`)
if (retina) {
cp.execSync(`rsvg-convert -x 4 -y 4 ${filePath} > ${filePath.replace('.svg', '@2x.png')}`)
}
}
export const generateIconsPreview = async function(files, destFile, {
export const createSvgSymbol = (svg, name, stroke) => {
return svg.replace('<svg', `<symbol id="${name}"`)
.replace(' width="24" height="24"', '')
.replace(' stroke-width="2"', ` stroke-width="${stroke}"`)
.replace('</svg>', '</symbol>')
.replace(/\n\s+/g, ' ')
.replace(/<!--(.*?)-->/gis, '')
.trim()
}
export const generateIconsPreview = async function (files, destFile, {
columnsCount = 19,
paddingOuter = 7,
color = '#354052',
background = '#fff',
png = true
png = true,
stroke = 2,
retina = true
} = {}) {
const padding = 20,
iconSize = 24
iconSize = 24
const iconsCount = files.length,
rowsCount = Math.ceil(iconsCount / columnsCount),
width = columnsCount * (iconSize + padding) + 2 * paddingOuter - padding,
height = rowsCount * (iconSize + padding) + 2 * paddingOuter - padding
rowsCount = Math.ceil(iconsCount / columnsCount),
width = columnsCount * (iconSize + padding) + 2 * paddingOuter - padding,
height = rowsCount * (iconSize + padding) + 2 * paddingOuter - padding
let svgContentSymbols = '',
svgContentIcons = '',
x = paddingOuter,
y = paddingOuter
svgContentIcons = '',
x = paddingOuter,
y = paddingOuter
files.forEach(function(file, i) {
let name = path.basename(file, '.svg')
files.forEach(function (file, i) {
const name = file.replace(/^(.*)\/([^\/]+)\/([^.]+).svg$/g, '$2-$3');
let svgFile = fs.readFileSync(file),
svgFileContent = svgFile.toString()
svgFileContent = svgFile.toString()
svgFileContent = svgFileContent.replace('<svg xmlns="http://www.w3.org/2000/svg"', `<symbol id="${name}"`)
.replace(' width="24" height="24"', '')
.replace('</svg>', '</symbol>')
.replace(/\n\s+/g, '')
svgFileContent = createSvgSymbol(svgFileContent, name, stroke)
svgContentSymbols += `\t${svgFileContent}\n`
svgContentIcons += `\t<use xlink:href="#${name}" x="${x}" y="${y}" width="${iconSize}" height="${iconSize}" />\n`
@ -218,27 +347,29 @@ export const generateIconsPreview = async function(files, destFile, {
const svgContent = `<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 ${width} ${height}" width="${width}" height="${height}" style="color: ${color}"><rect x="0" y="0" width="${width}" height="${height}" fill="${background}"></rect>\n${svgContentSymbols}\n${svgContentIcons}\n</svg>`
console.log(destFile)
fs.writeFileSync(destFile, svgContent)
if (png) {
await createScreenshot(destFile)
await createScreenshot(destFile, retina)
}
}
export const printChangelog = function(newIcons, modifiedIcons, renamedIcons, pretty = false) {
export const printChangelog = function (newIcons, modifiedIcons, renamedIcons, pretty = false) {
if (newIcons.length > 0) {
if (pretty) {
console.log(`### ${newIcons.length} new icons:\n`)
console.log(`### ${newIcons.length} new icon${newIcons.length > 1 ? 's' : ''}:\n`)
newIcons.forEach(function(icon, i) {
newIcons.forEach(function (icon, i) {
console.log(`- \`${icon}\``)
})
} else {
let str = ''
str += `${newIcons.length} new icons: `
str += `${newIcons.length} new icon${newIcons.length > 1 ? 's' : ''}: `
newIcons.forEach(function(icon, i) {
newIcons.forEach(function (icon, i) {
str += `\`${icon}\``
if ((i + 1) <= newIcons.length - 1) {
@ -254,9 +385,9 @@ export const printChangelog = function(newIcons, modifiedIcons, renamedIcons, pr
if (modifiedIcons.length > 0) {
let str = ''
str += `Fixed icons: `
str += `Fixed icon${modifiedIcons.length > 1 ? 's' : ''}: `
modifiedIcons.forEach(function(icon, i) {
modifiedIcons.forEach(function (icon, i) {
str += `\`${icon}\``
if ((i + 1) <= modifiedIcons.length - 1) {
@ -271,7 +402,7 @@ export const printChangelog = function(newIcons, modifiedIcons, renamedIcons, pr
if (renamedIcons.length > 0) {
console.log(`Renamed icons: `)
renamedIcons.forEach(function(icon, i) {
renamedIcons.forEach(function (icon, i) {
console.log(`- \`${icon[0]}\` renamed to \`${icon[1]}\``)
})
}
@ -308,7 +439,7 @@ export const getCompileOptions = () => {
throw 'property includeCategories is not an array or string'
}
const tags = Object.entries(require('./tags.json'))
tempOptions.includeCategories.forEach(function(category) {
tempOptions.includeCategories.forEach(function (category) {
category = category.charAt(0).toUpperCase() + category.slice(1)
for (const [icon, data] of tags) {
if (data.category === category && compileOptions.includeIcons.indexOf(icon) === -1) {
@ -322,14 +453,14 @@ export const getCompileOptions = () => {
if (!Array.isArray(tempOptions.excludeIcons)) {
throw 'property excludeIcons is not an array'
}
compileOptions.includeIcons = compileOptions.includeIcons.filter(function(icon) {
compileOptions.includeIcons = compileOptions.includeIcons.filter(function (icon) {
return tempOptions.excludeIcons.indexOf(icon) === -1
})
}
if (typeof tempOptions.excludeOffIcons !== 'undefined' && tempOptions.excludeOffIcons) {
// Exclude `*-off` icons
compileOptions.includeIcons = compileOptions.includeIcons.filter(function(icon) {
compileOptions.includeIcons = compileOptions.includeIcons.filter(function (icon) {
return !icon.endsWith('-off')
})
}
@ -355,3 +486,46 @@ export const getCompileOptions = () => {
return compileOptions
}
export const convertIconsToImages = async (dir, extension, size = 240) => {
const icons = getAllIcons()
await asyncForEach(Object.entries(icons), async function ([type, svgFiles]) {
fs.mkdirSync(path.join(dir, `./${type}`), { recursive: true })
await asyncForEach(svgFiles, async function (file, i) {
const distPath = path.join(dir, `./${type}/${file.name}.${extension}`)
process.stdout.write(`Building \`icons/${extension}\` ${type} ${i}/${svgFiles.length}: ${file.name.padEnd(42)}\r`)
await new Promise((resolve, reject) => {
exec(`rsvg-convert -f ${extension} -h ${size} ${file.path} > ${distPath}`, (error) => {
error ? reject() : resolve()
})
})
})
})
}
export const getMaxUnicode = () => {
const files = globSync(path.join(ICONS_SRC_DIR, '**/*.svg'))
let maxUnicode = 0
files.forEach(function (file) {
const svgFile = fs.readFileSync(file).toString()
svgFile.replace(/unicode: "([a-f0-9.]+)"/i, function (m, unicode) {
const newUnicode = parseInt(unicode, 16)
if (newUnicode) {
maxUnicode = Math.max(maxUnicode, newUnicode)
}
})
})
console.log(`Max unicode: ${maxUnicode}`)
return maxUnicode
}

View File

@ -1,4 +1,4 @@
import glob from 'glob'
import { glob } from 'glob'
import fs from 'fs'
import { resolve, join, basename } from 'path'
import { ICONS_SRC_DIR } from './helpers.mjs'
@ -40,4 +40,4 @@ extensions.forEach(function (extension) {
}
}
})
})
})

View File

@ -1,28 +1,28 @@
import fs from 'fs'
import glob from 'glob'
import { glob } from 'glob'
import { resolve, basename } from 'path'
import { HOME_DIR, optimizeSVG } from './helpers.mjs'
import { HOME_DIR, optimizeSVG, iconTemplate, types } from './helpers.mjs'
types.forEach(type => {
const files = glob.sync(resolve(HOME_DIR, `./new/${type}/*.svg`))
const files = glob.sync(resolve(HOME_DIR, './new/*.svg'))
files.forEach(function(file, i) {
let fileData = fs.readFileSync(file).toString(),
files.forEach(function (file, i) {
let fileData = fs.readFileSync(file).toString(),
filename = basename(file, '.svg')
console.log(filename)
console.log(`${type}/${filename}`)
fileData = optimizeSVG(fileData)
fileData = optimizeSVG(fileData)
if (fileData.match(/transform="/)) {
throw new Error(`File ${file} has \`transform\` in code!!`)
}
if (fileData.match(/transform="/)) {
throw new Error(`File ${file} has \`transform\` in code!!`)
}
if (filename.match(/\s/)) {
throw new Error(`File ${file} has space in name!!`)
}
if (filename.match(/\s/)) {
throw new Error(`File ${file} has space in name!!`)
}
fileData = fileData.replace(/---/g, '')
fileData = fileData.replace(/---/g, '')
.replace(/fill="none"/g, '')
.replace(/fill="#D8D8D8"/gi, '')
.replace(/fill-rule="evenodd"/g, '')
@ -47,29 +47,38 @@ files.forEach(function(file, i) {
.replace(/<g[^>]*stroke="red"[^>]*>.*?<\/g>/gs, '')
.replace(/<svg\s+>/gs, '<svg>')
fileData = optimizeSVG(fileData)
fileData = optimizeSVG(fileData)
if (filename.match(/\-filled$/)) {
fileData = fileData
.replace(/\/>/g, ' stroke-width="0" fill="currentColor" />')
}
fileData = fileData.replace(/<svg>/g, '---\n---\n<svg>')
fileData = fileData.replace(/<svg>/g, `<!--\n-->\n${iconTemplate(type)}`)
if (fs.existsSync(`./src/_icons/${filename}.svg`)) {
const newFileData = fs.readFileSync(`./src/_icons/${filename}.svg`).toString()
const m = newFileData.match(/(---.*---)/gms)
if (m) {
fileData = fileData.replace('---\n---', m[0])
if (type == "filled") {
fileData = fileData
.replace('stroke-width="2"', '')
.replace('stroke-linecap="round"', '')
.replace('stroke-linejoin="round"', '')
.replace('stroke="currentColor"', '')
.replace('fill="none"', 'fill="currentColor"')
// remove empty lines
.replace(/^\s*[\r\n]/gm, '')
}
} else if (filename.match(/\-filled$/)) {
fileData = fileData
.replace(/---\n---/g, '---\ncategory: Filled\n---')
} else if (filename.match(/brand\-/)) {
fileData = fileData
.replace(/---\n---/g, '---\ncategory: Brand\n---')
}
fs.writeFileSync(`./src/_icons/${filename}.svg`, fileData)
if (fs.existsSync(`./icons/${type}/${filename}.svg`)) {
const newFileData = fs.readFileSync(`./icons/${type}/${filename}.svg`).toString()
const m = newFileData.match(/(<!--.*-->)/gms)
if (m) {
fileData = fileData.replace('<!--\n-->', m[0])
}
} else if (filename.match(/\-filled$/)) {
fileData = fileData
.replace(/<!--\n-->/g, '<!--\ncategory: Filled\n-->')
} else if (filename.match(/brand\-/)) {
fileData = fileData
.replace(/<!--\n-->/g, '<!--\ncategory: Brand\n-->')
}
fs.writeFileSync(`./icons/${type}/${filename}.svg`, fileData)
})
})

View File

@ -1,75 +1,104 @@
import glob from 'glob'
import { globSync } from 'glob'
import { readFileSync, writeFileSync } from 'fs'
import { join, basename } from 'path'
import { optimizePath, ICONS_SRC_DIR } from './helpers.mjs'
import { optimizePath, ICONS_SRC_DIR, iconTemplate, types } from './helpers.mjs'
types.forEach(type => {
const files = globSync(join(ICONS_SRC_DIR, type, '*.svg'))
glob(join(ICONS_SRC_DIR, '*.svg'), {}, function(er, files) {
files.forEach(function(file, i) {
files.forEach(function (file, i) {
console.log(`Optimize ${basename(file)}`);
// Read files
let svgFile = readFileSync(file),
svgFileContent = svgFile.toString()
svgFileContent = svgFile.toString()
// Optimize SVG
svgFileContent = svgFileContent.replace(/><\/(polyline|line|rect|circle|path|ellipse)>/g, '/>')
.replace(/rx="([^"]+)"\s+ry="\1"/g, 'rx="$1"')
.replace(/<path stroke="red" stroke-width="\.1"([^>]+)?\/>/g, '')
.replace(/<path[^>]+d="M0 0h24v24h-24z"[^>]+\/>/g, '')
.replace(/\s?\/>/g, ' />')
.replace(/\n\s*<(line|circle|path|polyline|rect|ellipse)/g, '\n <$1')
// .replace(/polyline points="([0-9.]+)\s([0-9.]+)\s([0-9.]+)\s([0-9.]+)"/g, 'line x1="$1" y1="$2" x2="$3" y2="$4"')
.replace(/<line x1="([^"]+)" y1="([^"]+)" x2="([^"]+)" y2="([^"]+)"\s*\/>/g, function(f, x1, y1, x2, y2) {
return `<path d="M${x1} ${y1}L${x2} ${y2}" />`
})
.replace(/<circle cx="([^"]+)" cy="([^"]+)" r="([^"]+)"\s+\/>/g, function(f, cx, cy, r) {
return `<path d="M ${cx} ${cy}m -${r} 0a ${r} ${r} 0 1 0 ${r * 2} 0a ${r} ${r} 0 1 0 ${r * -2} 0" />`
})
.replace(/<ellipse cx="([^"]+)" cy="([^"]+)" rx="([^"]+)"\s+\/>/g, function(f, cx, cy, rx) {
return `<ellipse cx="${cx}" cy="${cy}" rx="${rx}" ry="${rx}" />`
})
.replace(/<ellipse cx="([^"]+)" cy="([^"]+)" rx="([^"]+)" ry="([^"]+)"\s+\/>/g, function(f, cx, cy, rx, ry) {
return `<path d="M${cx} ${cy}m -${rx} 0a${rx} ${ry} 0 1 0 ${rx * 2} 0a ${rx} ${ry} 0 1 0 -${rx * 2} 0" />`
})
.replace(/<rect width="([^"]+)" height="([^"]+)" x="([^"]+)" y="([^"]+)" rx="([^"]+)"\s+\/>/g, function(f, width, height, x, y, rx) {
return `<rect x="${x}" y="${y}" width="${height}" height="${height}" rx="${rx}" />`
})
.replace(/<rect x="([^"]+)" y="([^"]+)" rx="([^"]+)" width="([^"]+)" height="([^"]+)"\s+\/>/g, function(f, x, y, rx, width, height) {
return `<rect x="${x}" y="${y}" width="${height}" height="${height}" rx="${rx}" />`
})
.replace(/<rect x="([^"]+)" y="([^"]+)" width="([^"]+)" height="([^"]+)" rx="([^"]+)"\s+\/>/g, function(f, x, y, width, height, rx) {
return `<path d="M ${x} ${y}m 0 ${rx}a${rx} ${rx} 0 0 1 ${rx} ${-rx}h${width - rx * 2}a${rx} ${rx} 0 0 1 ${rx} ${rx}v${height - rx * 2}a${rx} ${rx} 0 0 1 ${-rx} ${rx}h${-width + rx * 2}a${rx} ${rx} 0 0 1 ${-rx} ${-rx}Z" />`
})
.replace(/<rect x="([^"]+)" y="([^"]+)" width="([^"]+)" height="([^"]+)"\s+\/>/g, function(f, x, y, width, height) {
return `<path d="M ${x} ${y}h${width}v${height}h${-width}Z" />`
})
.replace(/<polyline points="([^"]+)\s?"\s+\/>/g, function(f, points) {
const path = points.split(' ').reduce(
(accumulator, currentValue, currentIndex) => `${accumulator}${currentIndex % 2 === 0 ? (currentIndex === 0 ? 'M' : 'L') : ''}${currentValue} `,
''
)
return `<path d="${path}" />`
})
.replace(/<path d="([^"]+)"/g, function(f, r1) {
r1 = optimizePath(r1)
.replace(/rx="([^"]+)"\s+ry="\1"/g, 'rx="$1"')
.replace(/<path stroke="red" stroke-width="\.1"([^>]+)?\/>/g, '')
.replace(/<path[^>]+d="M0 0h24v24h-24z"[^>]+\/>/g, '')
.replace(/\s?\/>/g, ' />')
.replace(/\n\s*<(line|circle|path|polyline|rect|ellipse)/g, '\n <$1')
// .replace(/polyline points="([0-9.]+)\s([0-9.]+)\s([0-9.]+)\s([0-9.]+)"/g, 'line x1="$1" y1="$2" x2="$3" y2="$4"')
.replace(/<line x1="([^"]+)" y1="([^"]+)" x2="([^"]+)" y2="([^"]+)"\s*\/>/g, function (f, x1, y1, x2, y2) {
return `<path d="M${x1} ${y1}L${x2} ${y2}" />`
})
.replace(/<circle cx="([^"]+)" cy="([^"]+)" r="([^"]+)"\s+\/>/g, function (f, cx, cy, r) {
return `<path d="M ${cx} ${cy}m -${r} 0a ${r} ${r} 0 1 0 ${r * 2} 0a ${r} ${r} 0 1 0 ${r * -2} 0" />`
})
.replace(/<ellipse cx="([^"]+)" cy="([^"]+)" rx="([^"]+)"\s+\/>/g, function (f, cx, cy, rx) {
return `<ellipse cx="${cx}" cy="${cy}" rx="${rx}" ry="${rx}" />`
})
.replace(/<ellipse cx="([^"]+)" cy="([^"]+)" rx="([^"]+)" ry="([^"]+)"\s+\/>/g, function (f, cx, cy, rx, ry) {
return `<path d="M${cx} ${cy}m -${rx} 0a${rx} ${ry} 0 1 0 ${rx * 2} 0a ${rx} ${ry} 0 1 0 -${rx * 2} 0" />`
})
.replace(/<rect width="([^"]+)" height="([^"]+)" x="([^"]+)" y="([^"]+)" rx="([^"]+)"\s+\/>/g, function (f, width, height, x, y, rx) {
return `<rect x="${x}" y="${y}" width="${width}" height="${height}" rx="${rx}" />`
})
.replace(/<rect x="([^"]+)" y="([^"]+)" rx="([^"]+)" width="([^"]+)" height="([^"]+)"\s+\/>/g, function (f, x, y, rx, width, height) {
return `<rect x="${x}" y="${y}" width="${height}" height="${height}" rx="${rx}" />`
})
.replace(/<rect x="([^"]+)" y="([^"]+)" width="([^"]+)" height="([^"]+)" rx="([^"]+)"\s+\/>/g, function (f, x, y, width, height, rx) {
return `<path d="M ${x} ${y}m 0 ${rx}a${rx} ${rx} 0 0 1 ${rx} ${-rx}h${width - rx * 2}a${rx} ${rx} 0 0 1 ${rx} ${rx}v${height - rx * 2}a${rx} ${rx} 0 0 1 ${-rx} ${rx}h${-width + rx * 2}a${rx} ${rx} 0 0 1 ${-rx} ${-rx}Z" />`
})
.replace(/<rect x="([^"]+)" y="([^"]+)" width="([^"]+)" height="([^"]+)"\s+\/>/g, function (f, x, y, width, height) {
return `<path d="M ${x} ${y}h${width}v${height}h${-width}Z" />`
})
.replace(/<polyline points="([^"]+)\s?"\s+\/>/g, function (f, points) {
const path = points.split(' ').reduce(
(accumulator, currentValue, currentIndex) => `${accumulator}${currentIndex % 2 === 0 ? (currentIndex === 0 ? 'M' : 'L') : ''}${currentValue} `,
''
)
return `<path d="${path}" />`
})
.replace(/<path d="([^"]+)"/g, function (f, r1) {
r1 = optimizePath(r1)
return `<path d="${r1}"`
})
.replace(/<path\s+d="([^"]+)"/g, function(f, d) {
return `<path d="${r1}"`
})
.replace(/<path\s+d="([^"]+)"/g, function (f, d) {
const d2 = d
.replace(/m0 0/g, (f, m) => ``)
.replace(/ 0\./g, ' .')
.replace(/ -0\./g, ' -.')
.replace(/([amcvhslAMCVHLS]) /g, '$1')
const d2 = d
.replace(/m0 0/g, (f, m) => ``)
.replace(/ 0\./g, ' .')
.replace(/ -0\./g, ' -.')
.replace(/([amcvhslAMCVHLS]) /g, '$1')
return `<path d="${d2}"`
})
.replace(/d="m/g, 'd="M')
.replace(/([Aa])\s?([0-9.]+)[\s,]([0-9.]+)[\s,]([0-9.]+)[\s,]?([0-1])[\s,]?([0-1])[\s,]?(-?[0-9.]+)[\s,]?(-?[0-9.]+)/gi, '$1$2 $3 $4 $5 $6 $7 $8')
.replace(/\n\s+\n+/g, '\n')
return `<path d="${d2}"`
})
.replace(/d="m/g, 'd="M')
.replace(/([Aa])\s?([0-9.]+)[\s,]([0-9.]+)[\s,]([0-9.]+)[\s,]?([0-1])[\s,]?([0-1])[\s,]?(-?[0-9.]+)[\s,]?(-?[0-9.]+)/gi, '$1$2 $3 $4 $5 $6 $7 $8')
.replace(/\n\s+\n+/g, '\n')
// Add icon template
svgFileContent = svgFileContent.replace(/<svg[^>]+>/, iconTemplate(type))
// Remove stroke and fill
if (file.match(/\/filled\//)) {
svgFileContent = svgFileContent
.replace(/stroke-width="0" fill="currentColor"/gm, '')
.replace('stroke-width="2"', '')
.replace('stroke-linecap="round"', '')
.replace('stroke-linejoin="round"', '')
.replace('stroke="currentColor"', '')
.replace('fill="none"', 'fill="currentColor"')
.replace(/^\s*[\r\n]/gm, '')
.replace(/\s{2,}\//g, ' /')
}
// Add comment if not exists
if (!svgFileContent.includes('<!--')) {
svgFileContent = '<!--\n-->\n' + svgFileContent
}
svgFileContent = svgFileContent.replace(/tags: \[([^]+)\]/, (m, tags) => {
tags = [...new Set(tags.split(',').map(t => t.trim()))].filter(t => t).join(', ')
return `tags: [${tags}]`
})
// Write files
if (svgFile.toString() !== svgFileContent) {
writeFileSync(file, svgFileContent)
}

View File

@ -1,10 +1,25 @@
import glob from 'glob'
import { generateIconsPreview } from './helpers.mjs'
import { globSync } from 'glob'
import { GITHUB_DIR, generateIconsPreview, ICONS_SRC_DIR, asyncForEach } from './helpers.mjs'
import path from 'path'
glob('icons/*.svg', {}, async function(er, files) {
await generateIconsPreview(files, '.github/icons.svg')
await generateIconsPreview(files, '.github/icons-dark.svg', {
const types = {
'-outline': 'outline',
'-filled': 'filled',
'': '**'
}
asyncForEach(Object.entries(types), async ([type, dir]) => {
const files = globSync(path.join(ICONS_SRC_DIR, `${dir}/*.svg`)).sort((a, b) => path.basename(a).localeCompare(path.basename(b)))
await generateIconsPreview(files, path.join(GITHUB_DIR, `preview/icons${type}.svg`), {
retina: false,
stroke: 1.5
})
await generateIconsPreview(files, path.join(GITHUB_DIR, `preview/icons${type}-dark.svg`), {
color: '#ffffff',
background: 'transparent'
background: 'transparent',
retina: false,
stroke: 1.5
})
})

View File

@ -1,21 +1,24 @@
import glob from 'glob'
import { generateIconsPreview } from './helpers.mjs'
import { globSync } from 'glob'
import { ICONS_SRC_DIR, generateIconsPreview, GITHUB_DIR } from './helpers.mjs'
import path from 'path'
glob('icons/*.svg', {}, async function (er, files) {
files = files.filter(file =>
!file.endsWith('-filled.svg')
&& !file.endsWith('-off.svg')
&& !file.startsWith('icons/number-')
&& !file.startsWith('icons/letter-')
);
let files = globSync(path.join(ICONS_SRC_DIR, 'outline/*.svg'))
files = files.sort(() => Math.random() - 0.5)
files = files.filter(file =>
!file.endsWith('-filled.svg')
&& !file.endsWith('-off.svg')
&& !file.includes('number-')
&& !file.includes('letter-')
&& !file.includes('loader')
&& !file.includes('small')
);
files = files.slice(0, 500)
files = files.sort(() => Math.random() - 0.5)
await generateIconsPreview(files, 'random-icons.svg', {
background: 'transparent',
columnsCount: 25,
png: false
})
files = files.slice(0, 500)
await generateIconsPreview(files, path.join(GITHUB_DIR, 'preview/random-icons.svg'), {
background: 'transparent',
columnsCount: 25,
stroke: 1.5
})

View File

@ -1,25 +1,31 @@
import fs from 'fs'
import { createScreenshot } from './helpers.mjs'
import { ICONS_SRC_DIR } from './helpers.mjs'
import path from 'path'
const icon = 'ghost',
strokes = ['.25', '.5', '.75', '1', '1.25', '1.5', '1.75', '2', '2.25', '2.5', '2.25'],
svgFileContent = fs.readFileSync(`icons/${icon}.svg`).toString(),
padding = 16,
paddingOuter = 3,
iconSize = 56,
width = 830,
height = iconSize + paddingOuter * 2
strokes = ['.25', '.5', '.75', '1', '1.25', '1.5', '1.75', '2', '2.25', '2.5', '2.25'],
svgFileContent = fs.readFileSync(path.join(ICONS_SRC_DIR, `outline/${icon}.svg`), 'utf-8'),
padding = 16,
paddingOuter = 3,
iconSize = 56,
width = 830,
height = iconSize + paddingOuter * 2
let svgContentSymbols = '',
svgContentIcons = '',
x = paddingOuter
svgContentIcons = '',
x = paddingOuter
strokes.forEach(function(stroke) {
let svgFileContentStroked = svgFileContent.replace('<svg xmlns="http://www.w3.org/2000/svg"', `<symbol id="icon-${stroke}"`)
.replace(' width="24" height="24"', '')
.replace(' stroke-width="2"', ` stroke-width="${stroke}"`)
.replace('</svg>', '</symbol>')
.replace(/\n\s+/g, '')
strokes.forEach(function (stroke) {
let svgFileContentStroked = createSvgSymbol(svgFileContent, `icon-${stroke}`, stroke)
svgFileContent
.replace('<svg', `<symbol id="icon-${stroke}"`)
.replace(' width="24" height="24"', '')
.replace(' stroke-width="2"', ` stroke-width="${stroke}"`)
.replace('</svg>', '</symbol>')
.replace(/\n\s+/g, ' ')
.replace(/<!--(.*?)-->/gis, '')
svgContentSymbols += `\t${svgFileContentStroked}\n`
svgContentIcons += `\t<use xlink:href="#icon-${stroke}" x="${x}" y="${paddingOuter}" width="${iconSize}" height="${iconSize}" />\n`

23
.build/rollup-plugins.mjs Normal file
View File

@ -0,0 +1,23 @@
import bundleSize from '@atomico/rollup-plugin-sizes'
import { visualizer } from 'rollup-plugin-visualizer'
import license from 'rollup-plugin-license'
import esbuild from 'rollup-plugin-esbuild'
export const getRollupPlugins = (pkg, minify) => {
return [
esbuild({
minify
}),
license({
banner: `@license ${pkg.name} v${pkg.version} - ${pkg.license}
This source code is licensed under the ${pkg.license} license.
See the LICENSE file in the root directory of this source tree.`
}),
bundleSize(),
visualizer({
sourcemap: false,
filename: `stats/${pkg.name}${minify ? '-min' : ''}.html`
})
].filter(Boolean)
}

View File

@ -1,47 +0,0 @@
import glob from 'glob'
import fs from 'fs'
import path from 'path'
import { ICONS_SRC_DIR } from './helpers.mjs'
const getMaxUnicode = () => {
const files = glob.sync(path.join(ICONS_SRC_DIR, '*.svg'))
let maxUnicode = 0
files.forEach(function(file) {
const svgFile = fs.readFileSync(file).toString()
svgFile.replace(/unicode: "([a-f0-9.]+)"/i, function(m, unicode) {
const newUnicode = parseInt(unicode, 16)
if (newUnicode) {
maxUnicode = Math.max(maxUnicode, newUnicode)
}
})
})
return maxUnicode
}
let maxUnicode = getMaxUnicode()
glob(path.join(ICONS_SRC_DIR, '*.svg'), {}, function(er, files) {
for (const i in files) {
const file = files[i]
let svgFile = fs.readFileSync(file).toString()
if (!svgFile.match(/\nunicode: "?([a-f0-9.]+)"?/i)) {
maxUnicode++
const unicode = maxUnicode.toString(16)
if (unicode) {
svgFile = svgFile.replace(/---\n<svg>/i, function(m) {
return `unicode: "${unicode}"\n${m}`
})
console.log(`Add unicode "${unicode}" to "${file}"`)
fs.writeFileSync(file, svgFile)
}
}
}
})

View File

@ -1,48 +0,0 @@
import cp from 'child_process'
import fs from 'fs'
import path from 'path'
import { getArgvs, getPackageJson, ICONS_SRC_DIR } from './helpers.mjs'
const p = getPackageJson()
const argv = getArgvs(),
version = argv['latest-version'] || `${p.version}`,
newVersion = argv['new-version'] || `${p.version}`
const setVersions = function(version, files) {
for (const i in files) {
const file = files[i],
filePath = path.join(ICONS_SRC_DIR, `${file}.svg`)
if (fs.existsSync(filePath)) {
let svgFile = fs.readFileSync(filePath).toString()
if (!svgFile.match(/version: ([0-9.]+)/i)) {
svgFile = svgFile.replace(/---\n<svg>/i, function(m) {
return `version: "${version}"\n${m}`
})
fs.writeFileSync(filePath, svgFile)
} else {
console.log(`File ${file} already has version`)
}
} else {
console.log(`File ${file} doesn't exists`)
}
}
}
if (version) {
cp.exec(`grep -RiL "version: " ${ICONS_SRC_DIR}/*.svg`, function(err, ret) {
let newIcons = []
ret.replace(/src\/_icons\/([a-z0-9-]+)\.svg/g, function(m, fileName) {
newIcons.push(fileName)
})
if (newIcons.length) {
setVersions(newVersion.replace(/\.0$/, ''), newIcons)
}
})
}

45
.build/update-icons.mjs Normal file
View File

@ -0,0 +1,45 @@
import { globSync, glob } from 'glob'
import fs from 'fs'
import path from 'path'
import { ICONS_SRC_DIR, getMaxUnicode, getArgvs, getPackageJson } from './helpers.mjs'
const p = getPackageJson(),
argv = getArgvs(),
newVersion = argv['new-version'] || `${p.version}`
console.log(argv);
const files = globSync(path.join(ICONS_SRC_DIR, '**/*.svg'))
let maxUnicode = getMaxUnicode()
files.forEach(function (file) {
let svgFile = fs.readFileSync(file).toString()
// Add unicode to svg files
if (!svgFile.match(/\nunicode: "?([a-f0-9.]+)"?/i)) {
maxUnicode++
const unicode = maxUnicode.toString(16)
if (unicode) {
svgFile = svgFile.replace(/-->\n<svg/i, function (m) {
return `unicode: "${unicode}"\n${m}`
})
console.log(`Add unicode "${unicode}" to "${file}"`)
fs.writeFileSync(file, svgFile, 'utf8')
}
}
if (newVersion) {
// Add version to svg files
if (!svgFile.match(/\nversion: "?([a-f0-9.]+)"?/i)) {
svgFile = svgFile.replace(/-->\n<svg/i, function (m) {
return `version: "${newVersion}"\n${m}`
})
console.log(`Add version "${newVersion}" to "${file}"`)
fs.writeFileSync(file, svgFile, 'utf8')
}
}
})

View File

@ -1,9 +1,9 @@
import { readFileSync, writeFileSync } from 'fs'
import glob from 'glob'
import { glob } from 'glob'
import { resolve } from 'path'
import { HOME_DIR } from './helpers.mjs'
import { HOME_DIR, ICONS_SRC_DIR } from './helpers.mjs'
let count = glob.sync(resolve(HOME_DIR, 'icons/*.svg')).length
let count = glob.sync(resolve(ICONS_SRC_DIR, '**/*.svg')).length
console.log('count', count);

84
.build/validate-icons.mjs Normal file
View File

@ -0,0 +1,84 @@
import { globSync } from 'glob'
import fs from 'fs'
import { basename } from 'path'
import { ICONS_SRC_DIR, iconTemplate, parseMatter, types, getArgvs } from './helpers.mjs'
import { join } from 'path'
let error = false
const outlineIconsNames = globSync(join(ICONS_SRC_DIR, 'outline/*.svg')).map(i => basename(i, '.svg')),
filledIconsNames = globSync(join(ICONS_SRC_DIR, 'filled/*.svg')).map(i => basename(i, '.svg')),
argvs = getArgvs();
let unicodes = []
const duplicateExists = (arr) => {
return new Set(arr).size !== arr.length
}
types.forEach(type => {
const icons = globSync(join(ICONS_SRC_DIR, type, '*.svg'))
icons.forEach((icon) => {
const iconContent = fs.readFileSync(icon, 'utf-8')
if (!iconContent.includes(iconTemplate(type))) {
console.log(`Icon ${icon} is not properly formatted`)
error = true
}
if (!iconContent.includes('<!--') || !iconContent.includes('-->')) {
console.log(`Icon ${icon} has no metadata`)
error = true
}
try {
const { data } = parseMatter(icon)
if (data.unicode) {
if (unicodes.indexOf(data.unicode) !== -1) {
console.log(`Icon ${icon} has duplicate unicode "${data.unicode}"`)
error = true
}
if (data.unicode.length !== 4) {
console.log(`Icon ${icon} has invalid unicode "${data.unicode}"`)
error = true
}
// check duplicates in tags
if (duplicateExists(data.tags || [])) {
console.log(`Icon ${icon} has duplicate tags`)
error = true
}
unicodes.push(data.unicode)
} else if (argvs.hard) {
console.log(`Icon ${icon} has no unicode`)
error = true
}
if (argvs.hard && !data.version) {
console.log(`Icon ${icon} has no version`)
error = true
}
} catch (e) {
console.log(`Icon ${icon} has invalid metadata`)
error = true
}
})
filledIconsNames.forEach((icon) => {
if (outlineIconsNames.indexOf(icon) === -1) {
console.log(`Icon ${icon} exists in filled version but doesn't exists in outline`)
error = true
}
})
})
if (error) {
process.exit(1)
} else {
console.log('All icons are valid')
process.exit(0)
}

View File

@ -11,10 +11,6 @@ zip.addLocalFolder(resolve(HOME_DIR, `packages/icons/icons/`), 'svg')
zip.addLocalFolder(resolve(HOME_DIR, `packages/icons-png/icons/`), 'png')
zip.addLocalFolder(resolve(HOME_DIR, `packages/icons-pdf/icons/`), 'pdf')
zip.addLocalFolder(resolve(HOME_DIR, `packages/icons-eps/icons/`), 'eps')
zip.addLocalFolder(resolve(HOME_DIR, `packages/icons-webfont/fonts`), 'webfont/fonts')
zip.addLocalFile(resolve(HOME_DIR, `packages/icons-webfont/tabler-icons.html`), 'webfont')
zip.addLocalFile(resolve(HOME_DIR, `packages/icons-webfont/tabler-icons.scss`), 'webfont')
zip.addLocalFile(resolve(HOME_DIR, `packages/icons-webfont/tabler-icons.css`), 'webfont')
zip.addLocalFile(resolve(HOME_DIR, `packages/icons-webfont/tabler-icons.min.css`), 'webfont')
zip.addLocalFolder(resolve(HOME_DIR, `packages/icons-webfont/dist`), 'webfont')
zip.writeZip(resolve(HOME_DIR, `packages-zip/tabler-icons-${p.version}.zip`));

11
.editorconfig Normal file
View File

@ -0,0 +1,11 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
quote_type = single
max_line_length = 100

38
.eleventy.js Normal file
View File

@ -0,0 +1,38 @@
const eleventySass = require("eleventy-sass");
const eleventyDirectoryOutputPlugin = require("@11ty/eleventy-plugin-directory-output");
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(eleventySass);
eleventyConfig.addPlugin(eleventyDirectoryOutputPlugin);
eleventyConfig.addWatchTarget("./src");
eleventyConfig.addWatchTarget("./icons");
eleventyConfig.setQuietMode(true);
eleventyConfig.addLiquidTag("include_cached", function (liquidEngine) {
return {
parse: function (tagToken, remainingTokens) {
this.str = tagToken.args;
},
render: async function (scope, hash) {
var str = await this.liquid.evalValue(this.str, scope);
return str;
}
};
});
eleventyConfig.addFilter("group_by", function (value) {
return value
});
return {
pathPrefix: "/",
dir: {
input: "src",
layouts: "_layouts",
includes: "_includes"
},
};
};

BIN
.github/icons-dark.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 MiB

14890
.github/icons-dark.svg vendored

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,37 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 830 62" width="830" height="62" style="color: #ffffff"><rect x="0" y="0" width="830" height="62" fill="transparent"></rect>
<symbol id="icon-.25" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width=".25" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-.5" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width=".5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-.75" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width=".75" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-1" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="1" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-1.25" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="1.25" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-1.5" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-1.75" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="1.75" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-2" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-2.25" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="2.25" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-2.5" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="2.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-2.25" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="2.25" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<use xlink:href="#icon-.25" x="3" y="3" width="56" height="56" />
<use xlink:href="#icon-.5" x="75" y="3" width="56" height="56" />
<use xlink:href="#icon-.75" x="147" y="3" width="56" height="56" />
<use xlink:href="#icon-1" x="219" y="3" width="56" height="56" />
<use xlink:href="#icon-1.25" x="291" y="3" width="56" height="56" />
<use xlink:href="#icon-1.5" x="363" y="3" width="56" height="56" />
<use xlink:href="#icon-1.75" x="435" y="3" width="56" height="56" />
<use xlink:href="#icon-2" x="507" y="3" width="56" height="56" />
<use xlink:href="#icon-2.25" x="579" y="3" width="56" height="56" />
<use xlink:href="#icon-2.5" x="651" y="3" width="56" height="56" />
<use xlink:href="#icon-2.25" x="723" y="3" width="56" height="56" />
</svg>

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

View File

@ -1,37 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 830 62" width="830" height="62" style="color: #354052"><rect x="0" y="0" width="830" height="62" fill="#fff"></rect>
<symbol id="icon-.25" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width=".25" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-.5" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width=".5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-.75" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width=".75" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-1" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="1" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-1.25" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="1.25" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-1.5" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-1.75" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="1.75" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-2" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-2.25" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="2.25" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-2.5" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="2.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<symbol id="icon-2.25" class="icon icon-tabler icon-tabler-ghost" viewBox="0 0 24 24" stroke-width="2.25" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7" /><path d="M10 10l.01 0" /><path d="M14 10l.01 0" /><path d="M10 14a3.5 3.5 0 0 0 4 0" />
</symbol>
<use xlink:href="#icon-.25" x="3" y="3" width="56" height="56" />
<use xlink:href="#icon-.5" x="75" y="3" width="56" height="56" />
<use xlink:href="#icon-.75" x="147" y="3" width="56" height="56" />
<use xlink:href="#icon-1" x="219" y="3" width="56" height="56" />
<use xlink:href="#icon-1.25" x="291" y="3" width="56" height="56" />
<use xlink:href="#icon-1.5" x="363" y="3" width="56" height="56" />
<use xlink:href="#icon-1.75" x="435" y="3" width="56" height="56" />
<use xlink:href="#icon-2" x="507" y="3" width="56" height="56" />
<use xlink:href="#icon-2.25" x="579" y="3" width="56" height="56" />
<use xlink:href="#icon-2.5" x="651" y="3" width="56" height="56" />
<use xlink:href="#icon-2.25" x="723" y="3" width="56" height="56" />
</svg>

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

BIN
.github/icons.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 MiB

14890
.github/icons.svg vendored

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

BIN
.github/packages/og-package-sprite.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
.github/preview/icons-dark.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

20464
.github/preview/icons-dark.svg vendored Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 2.7 MiB

BIN
.github/preview/icons-filled-dark.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

2296
.github/preview/icons-filled-dark.svg vendored Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 457 KiB

BIN
.github/preview/icons-filled.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

2296
.github/preview/icons-filled.svg vendored Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 457 KiB

BIN
.github/preview/icons-outline-dark.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

18172
.github/preview/icons-outline-dark.svg vendored Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 2.3 MiB

BIN
.github/preview/icons-outline.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

18172
.github/preview/icons-outline.svg vendored Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 2.3 MiB

BIN
.github/preview/icons.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

20464
.github/preview/icons.svg vendored Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 2.7 MiB

BIN
.github/preview/random-icons.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 KiB

2004
.github/preview/random-icons.svg vendored Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 249 KiB

BIN
.github/preview/random-icons@2x.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

View File

@ -1,58 +1,76 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 292 160" width="292" height="160" style="color: #354052"><rect x="0" y="0" width="292" height="160" fill="#fff"></rect>
<symbol id="border-corner-ios" class="icon icon-tabler icon-tabler-border-corner-ios" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 20c0 -6.559 0 -9.838 1.628 -12.162a9 9 0 0 1 2.21 -2.21c2.324 -1.628 5.602 -1.628 12.162 -1.628" />
<symbol id="outline-border-corner-ios" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M4 20c0 -6.559 0 -9.838 1.628 -12.162a9 9 0 0 1 2.21 -2.21c2.324 -1.628 5.602 -1.628 12.162 -1.628" />
</symbol>
<symbol id="brightness-auto" class="icon icon-tabler icon-tabler-brightness-auto" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M6 6h3.5l2.5 -2.5l2.5 2.5h3.5v3.5l2.5 2.5l-2.5 2.5v3.5h-3.5l-2.5 2.5l-2.5 -2.5h-3.5v-3.5l-2.5 -2.5l2.5 -2.5z" /><path d="M10 14.5v-3.5a2 2 0 1 1 4 0v3.5" /><path d="M10 13h4" />
<symbol id="outline-brightness-auto" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M6 6h3.5l2.5 -2.5l2.5 2.5h3.5v3.5l2.5 2.5l-2.5 2.5v3.5h-3.5l-2.5 2.5l-2.5 -2.5h-3.5v-3.5l-2.5 -2.5l2.5 -2.5z" /> <path d="M10 14.5v-3.5a2 2 0 1 1 4 0v3.5" /> <path d="M10 13h4" />
</symbol>
<symbol id="clipboard-smile" class="icon icon-tabler icon-tabler-clipboard-smile" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 13h.01" /><path d="M14 13h.01" /><path d="M10 16a3.5 3.5 0 0 0 4 0" /><path d="M9 5h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-12a2 2 0 0 0 -2 -2h-2" /><path d="M9 5a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z" />
<symbol id="outline-clipboard-smile" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M10 13h.01" /> <path d="M14 13h.01" /> <path d="M10 16a3.5 3.5 0 0 0 4 0" /> <path d="M9 5h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-12a2 2 0 0 0 -2 -2h-2" /> <path d="M9 5a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z" />
</symbol>
<symbol id="database-smile" class="icon icon-tabler icon-tabler-database-smile" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 14h.01" /><path d="M14 14h.01" /><path d="M10 17a3.5 3.5 0 0 0 4 0" /><path d="M4 6c0 1.657 3.582 3 8 3s8 -1.343 8 -3s-3.582 -3 -8 -3s-8 1.343 -8 3" /><path d="M4 6v12c0 1.657 3.582 3 8 3s8 -1.343 8 -3v-12" />
<symbol id="outline-database-smile" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M10 14h.01" /> <path d="M14 14h.01" /> <path d="M10 17a3.5 3.5 0 0 0 4 0" /> <path d="M4 6c0 1.657 3.582 3 8 3s8 -1.343 8 -3s-3.582 -3 -8 -3s-8 1.343 -8 3" /> <path d="M4 6v12c0 1.657 3.582 3 8 3s8 -1.343 8 -3v-12" />
</symbol>
<symbol id="glass-champagne" class="icon icon-tabler icon-tabler-glass-champagne" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 21h6" /><path d="M12 16v5" /><path d="M12 5m-4 0a4 2 0 1 0 8 0a4 2 0 1 0 -8 0" /><path d="M8 5c0 6.075 1.79 11 4 11s4 -4.925 4 -11" />
<symbol id="outline-glass-champagne" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M9 21h6" /> <path d="M12 16v5" /> <path d="M12 5m-4 0a4 2 0 1 0 8 0a4 2 0 1 0 -8 0" /> <path d="M8 5c0 6.075 1.79 11 4 11s4 -4.925 4 -11" />
</symbol>
<symbol id="glass-cocktail" class="icon icon-tabler icon-tabler-glass-cocktail" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M8 21h8" /><path d="M12 15v6" /><path d="M12 5m-7 0a7 2 0 1 0 14 0a7 2 0 1 0 -14 0" /><path d="M5 5v.388c0 .432 .126 .853 .362 1.206l5 7.509c.633 .951 1.88 1.183 2.785 .517c.191 -.141 .358 -.316 .491 -.517l5 -7.509c.236 -.353 .362 -.774 .362 -1.206v-.388" />
<symbol id="outline-glass-cocktail" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M8 21h8" /> <path d="M12 15v6" /> <path d="M12 5m-7 0a7 2 0 1 0 14 0a7 2 0 1 0 -14 0" /> <path d="M5 5v.388c0 .432 .126 .853 .362 1.206l5 7.509c.633 .951 1.88 1.183 2.785 .517c.191 -.141 .358 -.316 .491 -.517l5 -7.509c.236 -.353 .362 -.774 .362 -1.206v-.388" />
</symbol>
<symbol id="glass-gin" class="icon icon-tabler icon-tabler-glass-gin" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M8 21h8" /><path d="M12 15v6" /><path d="M12 5m-6.5 0a6.5 2 0 1 0 13 0a6.5 2 0 1 0 -13 0" /><path d="M5.75 4.5c-.612 .75 -.75 2 -.75 3.5a7 7 0 0 0 14 0c0 -1.5 -.094 -2.75 -.75 -3.5" />
<symbol id="outline-glass-gin" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M8 21h8" /> <path d="M12 15v6" /> <path d="M12 5m-6.5 0a6.5 2 0 1 0 13 0a6.5 2 0 1 0 -13 0" /> <path d="M5.75 4.5c-.612 .75 -.75 2 -.75 3.5a7 7 0 0 0 14 0c0 -1.5 -.094 -2.75 -.75 -3.5" />
</symbol>
<symbol id="image-in-picture" class="icon icon-tabler icon-tabler-image-in-picture" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M13 15c-2 0 -5 1 -5 5" /><path d="M4 11m0 2a2 2 0 0 1 2 -2h5a2 2 0 0 1 2 2v5a2 2 0 0 1 -2 2h-5a2 2 0 0 1 -2 -2z" /><path d="M4 7v-2a1 1 0 0 1 1 -1h2" /><path d="M11 4h2" /><path d="M17 4h2a1 1 0 0 1 1 1v2" /><path d="M20 11v2" /><path d="M20 17v2a1 1 0 0 1 -1 1h-2" />
<symbol id="outline-image-in-picture" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M13 15c-2 0 -5 1 -5 5" /> <path d="M4 11m0 2a2 2 0 0 1 2 -2h5a2 2 0 0 1 2 2v5a2 2 0 0 1 -2 2h-5a2 2 0 0 1 -2 -2z" /> <path d="M4 7v-2a1 1 0 0 1 1 -1h2" /> <path d="M11 4h2" /> <path d="M17 4h2a1 1 0 0 1 1 1v2" /> <path d="M20 11v2" /> <path d="M20 17v2a1 1 0 0 1 -1 1h-2" />
</symbol>
<symbol id="math-max-min" class="icon icon-tabler icon-tabler-math-max-min" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M15 19a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M5 5a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M3 14s.605 -5.44 2.284 -7.862m3.395 .026c2.137 2.652 4.547 9.113 6.68 11.719" /><path d="M18.748 18.038c.702 -.88 1.452 -3.56 2.252 -8.038" />
<symbol id="outline-math-max-min" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M15 19a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /> <path d="M5 5a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /> <path d="M3 14s.605 -5.44 2.284 -7.862m3.395 .026c2.137 2.652 4.547 9.113 6.68 11.719" /> <path d="M18.748 18.038c.702 -.88 1.452 -3.56 2.252 -8.038" />
</symbol>
<symbol id="prong" class="icon icon-tabler icon-tabler-prong" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.2 10.2l6.3 6.3" /><path d="M19.347 16.575l1.08 1.079a1.96 1.96 0 0 1 -2.773 2.772l-1.08 -1.079a1.96 1.96 0 0 1 2.773 -2.772z" /><path d="M3 7l3.05 3.15a2.9 2.9 0 0 0 4.1 -4.1l-3.15 -3.05" />
<symbol id="outline-prong" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M10.2 10.2l6.3 6.3" /> <path d="M19.347 16.575l1.08 1.079a1.96 1.96 0 0 1 -2.773 2.772l-1.08 -1.079a1.96 1.96 0 0 1 2.773 -2.772z" /> <path d="M3 7l3.05 3.15a2.9 2.9 0 0 0 4.1 -4.1l-3.15 -3.05" />
</symbol>
<symbol id="shopping-bag-heart" class="icon icon-tabler icon-tabler-shopping-bag-heart" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M11.5 21h-2.926a3 3 0 0 1 -2.965 -2.544l-1.255 -8.152a2 2 0 0 1 1.977 -2.304h11.339a2 2 0 0 1 1.977 2.304c-.057 .368 -.1 .644 -.127 .828" /><path d="M9 11v-5a3 3 0 0 1 6 0v5" /><path d="M18 22l3.35 -3.284a2.143 2.143 0 0 0 .005 -3.071a2.242 2.242 0 0 0 -3.129 -.006l-.224 .22l-.223 -.22a2.242 2.242 0 0 0 -3.128 -.006a2.143 2.143 0 0 0 -.006 3.071l3.355 3.296z" />
<symbol id="outline-shopping-bag-heart" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M11.5 21h-2.926a3 3 0 0 1 -2.965 -2.544l-1.255 -8.152a2 2 0 0 1 1.977 -2.304h11.339a2 2 0 0 1 1.977 2.304c-.057 .368 -.1 .644 -.127 .828" /> <path d="M9 11v-5a3 3 0 0 1 6 0v5" /> <path d="M18 22l3.35 -3.284a2.143 2.143 0 0 0 .005 -3.071a2.242 2.242 0 0 0 -3.129 -.006l-.224 .22l-.223 -.22a2.242 2.242 0 0 0 -3.128 -.006a2.143 2.143 0 0 0 -.006 3.071l3.355 3.296z" />
</symbol>
<symbol id="temperature-snow" class="icon icon-tabler icon-tabler-temperature-snow" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 13.5a4 4 0 1 0 4 0v-8.5a2 2 0 1 0 -4 0v8.5" /><path d="M4 9h4" /><path d="M14.75 4l1 2h2.25" /><path d="M17 4l-3 5l2 3" /><path d="M20.25 10l-1.25 2l1.25 2" /><path d="M22 12h-6l-2 3" /><path d="M18 18h-2.25l-1 2" /><path d="M17 20l-3 -5h-1" /><path d="M12 9l2.088 .008" />
<symbol id="outline-temperature-snow" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M4 13.5a4 4 0 1 0 4 0v-8.5a2 2 0 1 0 -4 0v8.5" /> <path d="M4 9h4" /> <path d="M14.75 4l1 2h2.25" /> <path d="M17 4l-3 5l2 3" /> <path d="M20.25 10l-1.25 2l1.25 2" /> <path d="M22 12h-6l-2 3" /> <path d="M18 18h-2.25l-1 2" /> <path d="M17 20l-3 -5h-1" /> <path d="M12 9l2.088 .008" />
</symbol>
<symbol id="temperature-sun" class="icon icon-tabler icon-tabler-temperature-sun" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 13.5a4 4 0 1 0 4 0v-8.5a2 2 0 1 0 -4 0v8.5" /><path d="M4 9h4" /><path d="M13 16a4 4 0 1 0 0 -8a4.07 4.07 0 0 0 -1 .124" /><path d="M13 3v1" /><path d="M21 12h1" /><path d="M13 20v1" /><path d="M19.4 5.6l-.7 .7" /><path d="M18.7 17.7l.7 .7" />
<symbol id="outline-temperature-sun" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M4 13.5a4 4 0 1 0 4 0v-8.5a2 2 0 1 0 -4 0v8.5" /> <path d="M4 9h4" /> <path d="M13 16a4 4 0 1 0 0 -8a4.07 4.07 0 0 0 -1 .124" /> <path d="M13 3v1" /> <path d="M21 12h1" /> <path d="M13 20v1" /> <path d="M19.4 5.6l-.7 .7" /> <path d="M18.7 17.7l.7 .7" />
</symbol>
<symbol id="transform-point-bottom-left" class="icon icon-tabler icon-tabler-transform-point-bottom-left" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M3 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" fill="currentColor" /><path d="M17 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M17 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M11 5h2" /><path d="M5 11v2" /><path d="M19 11v2" /><path d="M11 19h2" />
<symbol id="outline-transform-point-bottom-left" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M3 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M3 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" fill="currentColor" /> <path d="M17 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M17 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M11 5h2" /> <path d="M5 11v2" /> <path d="M19 11v2" /> <path d="M11 19h2" />
</symbol>
<symbol id="transform-point-bottom-right" class="icon icon-tabler icon-tabler-transform-point-bottom-right" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M3 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M17 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M17 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" fill="currentColor" /><path d="M11 5h2" /><path d="M5 11v2" /><path d="M19 11v2" /><path d="M11 19h2" />
<symbol id="outline-transform-point-bottom-right" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M3 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M3 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M17 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M17 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" fill="currentColor" /> <path d="M11 5h2" /> <path d="M5 11v2" /> <path d="M19 11v2" /> <path d="M11 19h2" />
</symbol>
<symbol id="transform-point-top-left" class="icon icon-tabler icon-tabler-transform-point-top-left" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" fill="currentColor" /><path d="M3 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M17 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M17 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M11 5h2" /><path d="M5 11v2" /><path d="M19 11v2" /><path d="M11 19h2" />
<symbol id="outline-transform-point-top-left" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M3 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" fill="currentColor" /> <path d="M3 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M17 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M17 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M11 5h2" /> <path d="M5 11v2" /> <path d="M19 11v2" /> <path d="M11 19h2" />
</symbol>
<symbol id="transform-point-top-right" class="icon icon-tabler icon-tabler-transform-point-top-right" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M3 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M17 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" fill="currentColor" /><path d="M17 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M11 5h2" /><path d="M5 11v2" /><path d="M19 11v2" /><path d="M11 19h2" />
<symbol id="outline-transform-point-top-right" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M3 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M3 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M17 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" fill="currentColor" /> <path d="M17 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M11 5h2" /> <path d="M5 11v2" /> <path d="M19 11v2" /> <path d="M11 19h2" />
</symbol>
<symbol id="transform-point" class="icon icon-tabler icon-tabler-transform-point" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M3 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M17 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M17 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M11 5h2" /><path d="M5 11v2" /><path d="M19 11v2" /><path d="M11 19h2" />
<symbol id="outline-transform-point" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
> <path d="M3 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M3 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M17 3m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M17 17m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /> <path d="M11 5h2" /> <path d="M5 11v2" /> <path d="M19 11v2" /> <path d="M11 19h2" />
</symbol>
<use xlink:href="#border-corner-ios" x="24" y="24" width="24" height="24" />
<use xlink:href="#brightness-auto" x="68" y="24" width="24" height="24" />
<use xlink:href="#clipboard-smile" x="112" y="24" width="24" height="24" />
<use xlink:href="#database-smile" x="156" y="24" width="24" height="24" />
<use xlink:href="#glass-champagne" x="200" y="24" width="24" height="24" />
<use xlink:href="#glass-cocktail" x="244" y="24" width="24" height="24" />
<use xlink:href="#glass-gin" x="24" y="68" width="24" height="24" />
<use xlink:href="#image-in-picture" x="68" y="68" width="24" height="24" />
<use xlink:href="#math-max-min" x="112" y="68" width="24" height="24" />
<use xlink:href="#prong" x="156" y="68" width="24" height="24" />
<use xlink:href="#shopping-bag-heart" x="200" y="68" width="24" height="24" />
<use xlink:href="#temperature-snow" x="244" y="68" width="24" height="24" />
<use xlink:href="#temperature-sun" x="24" y="112" width="24" height="24" />
<use xlink:href="#transform-point-bottom-left" x="68" y="112" width="24" height="24" />
<use xlink:href="#transform-point-bottom-right" x="112" y="112" width="24" height="24" />
<use xlink:href="#transform-point-top-left" x="156" y="112" width="24" height="24" />
<use xlink:href="#transform-point-top-right" x="200" y="112" width="24" height="24" />
<use xlink:href="#transform-point" x="244" y="112" width="24" height="24" />
<use xlink:href="#outline-border-corner-ios" x="24" y="24" width="24" height="24" />
<use xlink:href="#outline-brightness-auto" x="68" y="24" width="24" height="24" />
<use xlink:href="#outline-clipboard-smile" x="112" y="24" width="24" height="24" />
<use xlink:href="#outline-database-smile" x="156" y="24" width="24" height="24" />
<use xlink:href="#outline-glass-champagne" x="200" y="24" width="24" height="24" />
<use xlink:href="#outline-glass-cocktail" x="244" y="24" width="24" height="24" />
<use xlink:href="#outline-glass-gin" x="24" y="68" width="24" height="24" />
<use xlink:href="#outline-image-in-picture" x="68" y="68" width="24" height="24" />
<use xlink:href="#outline-math-max-min" x="112" y="68" width="24" height="24" />
<use xlink:href="#outline-prong" x="156" y="68" width="24" height="24" />
<use xlink:href="#outline-shopping-bag-heart" x="200" y="68" width="24" height="24" />
<use xlink:href="#outline-temperature-snow" x="244" y="68" width="24" height="24" />
<use xlink:href="#outline-temperature-sun" x="24" y="112" width="24" height="24" />
<use xlink:href="#outline-transform-point-bottom-left" x="68" y="112" width="24" height="24" />
<use xlink:href="#outline-transform-point-bottom-right" x="112" y="112" width="24" height="24" />
<use xlink:href="#outline-transform-point-top-left" x="156" y="112" width="24" height="24" />
<use xlink:href="#outline-transform-point-top-right" x="200" y="112" width="24" height="24" />
<use xlink:href="#outline-transform-point" x="244" y="112" width="24" height="24" />
</svg>

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 11 KiB

4
.gitignore vendored
View File

@ -20,7 +20,6 @@ yarn.lock
dist/
_import.csv
_import.tsv
random-icons.svg
.yarn
.yarnrc.yml
@ -28,9 +27,12 @@ random-icons.svg
packages/icons*/icons/*
packages/icons*/src/icons/*
packages/icons*/src/icons.js
packages/icons*/src/icons.ts
packages/icons*/LICENSE
packages/icons*/stats/*
packages/icons*/icons/*
.turbo
.sass-cache
!/**/.gitkeep

19
.vscode/settings.json vendored
View File

@ -1,13 +1,12 @@
{
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": true,
"**/Thumbs.db": true,
"**/.idea/": true,
"icons": true
},
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": true,
"**/Thumbs.db": true,
"**/.idea/": true
},
"explorerExclude.backup": {}
}
}

View File

@ -1,7 +0,0 @@
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem "jekyll", "~> 4.2"
gem "jekyll-include-cache", "~> 0.2.1"

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2020-2023 Paweł Kuna
Copyright (c) 2020-2024 Paweł Kuna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -3,7 +3,7 @@
</p>
<p align="center">
A set of <!--icons-count-->4962<!--/icons-count--> free MIT-licensed high-quality SVG icons for you to use in your web projects. Each icon is designed on a 24x24 grid and a 2px stroke.
A set of <!--icons-count-->5201<!--/icons-count--> free MIT-licensed high-quality SVG icons for you to use in your web projects. Each icon is designed on a 24x24 grid and a 2px stroke.
<p>
<p align="center">

View File

@ -1,16 +0,0 @@
defaults:
- scope:
type: "icons"
values:
layout: icon
in-bg: true
tags: []
permalink: 'icons/:slug'
collections:
icons:
output: true
exclude:
- .idea
- package.json

View File

@ -1,18 +0,0 @@
source: src
host: 0.0.0.0
port: 4001
plugins:
- jekyll-include-cache
exclude:
- .idea
- package.json
- index.html
- tags.json
- tags.html
collections:
icons:
output: false

46
aliases.json Normal file
View File

@ -0,0 +1,46 @@
{
"outline": {
"code-asterix": "code-asterisk",
"discount-2": "rosette-discount",
"discount-2-off": "rosette-discount-off",
"discount-check": "rosette-discount-check",
"hand-rock": "hand-love-you",
"sort-deacending-small-big": "sort-descending-small-big",
"circle-0": "circle-number-0",
"circle-1": "circle-number-1",
"circle-2": "circle-number-2",
"circle-3": "circle-number-3",
"circle-4": "circle-number-4",
"circle-5": "circle-number-5",
"circle-6": "circle-number-6",
"circle-7": "circle-number-7",
"circle-8": "circle-number-8",
"circle-9": "circle-number-9",
"hexagon-0": "hexagon-number-0",
"hexagon-1": "hexagon-number-1",
"hexagon-2": "hexagon-number-2",
"hexagon-3": "hexagon-number-3",
"hexagon-4": "hexagon-number-4",
"hexagon-5": "hexagon-number-5",
"hexagon-6": "hexagon-number-6",
"hexagon-7": "hexagon-number-7",
"hexagon-8": "hexagon-number-8",
"hexagon-9": "hexagon-number-9",
"square-0": "square-number-0",
"square-1": "square-number-1",
"square-2": "square-number-2",
"square-3": "square-number-3",
"square-4": "square-number-4",
"square-5": "square-number-5",
"square-6": "square-number-6",
"square-7": "square-number-7",
"square-8": "square-number-8",
"square-9": "square-number-9"
},
"filled": {
"discount-check": "rosette-discount-check"
}
}

View File

@ -1,10 +0,0 @@
version: '2'
services:
jekyll:
image: jekyll/jekyll:latest
command: npm run start
ports:
- 4001:4001
volumes:
- .:/srv/jekyll

View File

@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-12-hours" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4" />
<path d="M4 13c.468 3.6 3.384 6.546 7 7" />
<path d="M18 15h2a1 1 0 0 1 1 1v1a1 1 0 0 1 -1 1h-1a1 1 0 0 0 -1 1v1a1 1 0 0 0 1 1h2" />
<path d="M15 21v-6" />
</svg>

Before

Width:  |  Height:  |  Size: 509 B

View File

@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-123" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M3 10l2 -2v8" />
<path d="M9 8h3a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 0 -1 1v2a1 1 0 0 0 1 1h3" />
<path d="M17 8h2.5a1.5 1.5 0 0 1 1.5 1.5v1a1.5 1.5 0 0 1 -1.5 1.5h-1.5h1.5a1.5 1.5 0 0 1 1.5 1.5v1a1.5 1.5 0 0 1 -1.5 1.5h-2.5" />
</svg>

Before

Width:  |  Height:  |  Size: 536 B

View File

@ -1,11 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-24-hours" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 13c.325 2.532 1.881 4.781 4 6" />
<path d="M20 11a8.1 8.1 0 0 0 -15.5 -2" />
<path d="M4 5v4h4" />
<path d="M12 15h2a1 1 0 0 1 1 1v1a1 1 0 0 1 -1 1h-1a1 1 0 0 0 -1 1v1a1 1 0 0 0 1 1h2" />
<path d="M18 15v2a1 1 0 0 0 1 1h1" />
<path d="M21 15v6" />
</svg>

Before

Width:  |  Height:  |  Size: 563 B

View File

@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-2fa" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M7 16h-4l3.47 -4.66a2 2 0 1 0 -3.47 -1.54" />
<path d="M10 16v-8h4" />
<path d="M10 12l3 0" />
<path d="M17 16v-6a2 2 0 0 1 4 0v6" />
<path d="M17 13l4 0" />
</svg>

Before

Width:  |  Height:  |  Size: 463 B

View File

@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-360-view" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M14 6a1 1 0 0 0 -1 -1h-2a1 1 0 0 0 -1 1v6a1 1 0 0 0 1 1h2a1 1 0 0 0 1 -1v-2a1 1 0 0 0 -1 -1h-3" />
<path d="M3 5h2.5a1.5 1.5 0 0 1 1.5 1.5v1a1.5 1.5 0 0 1 -1.5 1.5h-1.5h1.5a1.5 1.5 0 0 1 1.5 1.5v1a1.5 1.5 0 0 1 -1.5 1.5h-2.5" />
<path d="M17 7v4a2 2 0 1 0 4 0v-4a2 2 0 1 0 -4 0z" />
<path d="M3 16c0 1.657 4.03 3 9 3s9 -1.343 9 -3" />
</svg>

Before

Width:  |  Height:  |  Size: 643 B

View File

@ -1,7 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-360" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M17 15.328c2.414 -.718 4 -1.94 4 -3.328c0 -2.21 -4.03 -4 -9 -4s-9 1.79 -9 4s4.03 4 9 4" />
<path d="M9 13l3 3l-3 3" />
</svg>

Before

Width:  |  Height:  |  Size: 418 B

View File

@ -1,17 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-3d-cube-sphere-off" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M6 17.6l-2 -1.1v-2.5" />
<path d="M4 10v-2.5l2 -1.1" />
<path d="M10 4.1l2 -1.1l2 1.1" />
<path d="M18 6.4l2 1.1v2.5" />
<path d="M20 14v2" />
<path d="M14 19.9l-2 1.1l-2 -1.1" />
<path d="M18 8.6l2 -1.1" />
<path d="M12 12v2.5" />
<path d="M12 18.5v2.5" />
<path d="M12 12l-2 -1.12" />
<path d="M6 8.6l-2 -1.1" />
<path d="M3 3l18 18" />
</svg>

Before

Width:  |  Height:  |  Size: 673 B

View File

@ -1,17 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-3d-cube-sphere" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M6 17.6l-2 -1.1v-2.5" />
<path d="M4 10v-2.5l2 -1.1" />
<path d="M10 4.1l2 -1.1l2 1.1" />
<path d="M18 6.4l2 1.1v2.5" />
<path d="M20 14v2.5l-2 1.12" />
<path d="M14 19.9l-2 1.1l-2 -1.1" />
<path d="M12 12l2 -1.1" />
<path d="M18 8.6l2 -1.1" />
<path d="M12 12l0 2.5" />
<path d="M12 18.5l0 2.5" />
<path d="M12 12l-2 -1.12" />
<path d="M6 8.6l-2 -1.1" />
</svg>

Before

Width:  |  Height:  |  Size: 686 B

View File

@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-3d-rotate" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M12 3a7 7 0 0 1 7 7v4l-3 -3" />
<path d="M22 11l-3 3" />
<path d="M8 15.5l-5 -3l5 -3l5 3v5.5l-5 3z" />
<path d="M3 12.5v5.5l5 3" />
<path d="M8 15.545l5 -3.03" />
</svg>

Before

Width:  |  Height:  |  Size: 474 B

View File

@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-a-b-2" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M16 21h3c.81 0 1.48 -.67 1.48 -1.48l.02 -.02c0 -.82 -.69 -1.5 -1.5 -1.5h-3v3z" />
<path d="M16 15h2.5c.84 -.01 1.5 .66 1.5 1.5s-.66 1.5 -1.5 1.5h-2.5v-3z" />
<path d="M4 9v-4c0 -1.036 .895 -2 2 -2s2 .964 2 2v4" />
<path d="M2.99 11.98a9 9 0 0 0 9 9m9 -9a9 9 0 0 0 -9 -9" />
<path d="M8 7h-4" />
</svg>

Before

Width:  |  Height:  |  Size: 602 B

View File

@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-a-b-off" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M3 16v-5.5a2.5 2.5 0 0 1 5 0v5.5m0 -4h-5" />
<path d="M12 12v6" />
<path d="M12 6v2" />
<path d="M16 8h3a2 2 0 1 1 0 4h-3m3 0a2 2 0 0 1 .83 3.82m-3.83 -3.82v-4" />
<path d="M3 3l18 18" />
</svg>

Before

Width:  |  Height:  |  Size: 497 B

View File

@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-a-b" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M3 16v-5.5a2.5 2.5 0 0 1 5 0v5.5m0 -4h-5" />
<path d="M12 6l0 12" />
<path d="M16 16v-8h3a2 2 0 0 1 0 4h-3m3 0a2 2 0 0 1 0 4h-3" />
</svg>

Before

Width:  |  Height:  |  Size: 433 B

View File

@ -1,17 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-abacus-off" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M5 5v16" />
<path d="M19 21v-2m0 -4v-12" />
<path d="M5 7h2m4 0h8" />
<path d="M5 15h10" />
<path d="M8 13v4" />
<path d="M11 13v4" />
<path d="M16 16v1" />
<path d="M14 5v4" />
<path d="M11 5v2" />
<path d="M8 8v1" />
<path d="M3 21h18" />
<path d="M3 3l18 18" />
</svg>

Before

Width:  |  Height:  |  Size: 591 B

View File

@ -1,16 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-abacus" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M5 3v18" />
<path d="M19 21v-18" />
<path d="M5 7h14" />
<path d="M5 15h14" />
<path d="M8 13v4" />
<path d="M11 13v4" />
<path d="M16 13v4" />
<path d="M14 5v4" />
<path d="M11 5v4" />
<path d="M8 5v4" />
<path d="M3 21h18" />
</svg>

Before

Width:  |  Height:  |  Size: 548 B

View File

@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-abc" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M3 16v-6a2 2 0 1 1 4 0v6" />
<path d="M3 13h4" />
<path d="M10 8v6a2 2 0 1 0 4 0v-1a2 2 0 1 0 -4 0v1" />
<path d="M20.732 12a2 2 0 0 0 -3.732 1v1a2 2 0 0 0 3.726 1.01" />
</svg>

Before

Width:  |  Height:  |  Size: 474 B

View File

@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-access-point-off" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M3 3l18 18" />
<path d="M14.828 9.172a4 4 0 0 1 1.172 2.828" />
<path d="M17.657 6.343a8 8 0 0 1 1.635 8.952" />
<path d="M9.168 14.828a4 4 0 0 1 0 -5.656" />
<path d="M6.337 17.657a8 8 0 0 1 0 -11.314" />
</svg>

Before

Width:  |  Height:  |  Size: 524 B

View File

@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-access-point" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M12 12l0 .01" />
<path d="M14.828 9.172a4 4 0 0 1 0 5.656" />
<path d="M17.657 6.343a8 8 0 0 1 0 11.314" />
<path d="M9.168 14.828a4 4 0 0 1 0 -5.656" />
<path d="M6.337 17.657a8 8 0 0 1 0 -11.314" />
</svg>

Before

Width:  |  Height:  |  Size: 515 B

View File

@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-accessible-off-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M17 3.34a10 10 0 1 1 -14.995 8.984l-.005 -.324l.005 -.324a10 10 0 0 1 14.995 -8.336zm-1.051 6.844a1 1 0 0 0 -1.152 -.663l-.113 .03l-2.684 .895l-2.684 -.895l-.113 -.03a1 1 0 0 0 -.628 1.884l.109 .044l2.316 .771v.976l-1.832 2.75l-.06 .1a1 1 0 0 0 .237 1.21l.1 .076l.101 .06a1 1 0 0 0 1.21 -.237l.076 -.1l1.168 -1.752l1.168 1.752l.07 .093a1 1 0 0 0 1.653 -1.102l-.059 -.1l-1.832 -2.75v-.977l2.316 -.771l.109 -.044a1 1 0 0 0 .524 -1.221zm-3.949 -4.184a1.5 1.5 0 1 0 0 3a1.5 1.5 0 0 0 0 -3z" stroke-width="0" fill="currentColor" />
</svg>

Before

Width:  |  Height:  |  Size: 842 B

View File

@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-accessible-off" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M10 16.5l2 -3l2 3m-2 -3v-1.5m2.627 -1.376l.373 -.124m-6 0l2.231 .744" />
<path d="M20.042 16.045a9 9 0 0 0 -12.087 -12.087m-2.318 1.677a9 9 0 1 0 12.725 12.73" />
<path d="M12 8a.5 .5 0 1 0 -.5 -.5" />
<path d="M3 3l18 18" />
</svg>

Before

Width:  |  Height:  |  Size: 540 B

View File

@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-accessible" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" />
<path d="M10 16.5l2 -3l2 3m-2 -3v-2l3 -1m-6 0l3 1" />
<circle cx="12" cy="7.5" r=".5" fill="currentColor" />
</svg>

Before

Width:  |  Height:  |  Size: 464 B

View File

@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-activity-heartbeat" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M3 12h4.5l1.5 -6l4 12l2 -9l1.5 3h4.5" />
</svg>

Before

Width:  |  Height:  |  Size: 353 B

View File

@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-activity" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M3 12h4l3 8l4 -16l3 8h4" />
</svg>

Before

Width:  |  Height:  |  Size: 330 B

View File

@ -1,11 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-ad-2" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M11.933 5h-6.933v16h13v-8" />
<path d="M14 17h-5" />
<path d="M9 13h5v-4h-5z" />
<path d="M15 5v-2" />
<path d="M18 6l2 -2" />
<path d="M19 9h2" />
</svg>

Before

Width:  |  Height:  |  Size: 456 B

View File

@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-ad-circle-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M12 2c5.523 0 10 4.477 10 10s-4.477 10 -10 10c-5.43 0 -9.848 -4.327 -9.996 -9.72l-.004 -.28l.004 -.28c.148 -5.393 4.566 -9.72 9.996 -9.72zm-3.5 6a2.5 2.5 0 0 0 -2.495 2.336l-.005 .164v4.5l.007 .117a1 1 0 0 0 1.986 0l.007 -.117v-1h1v1l.007 .117a1 1 0 0 0 1.986 0l.007 -.117v-4.5l-.005 -.164a2.5 2.5 0 0 0 -2.495 -2.336zm6.5 0h-1a1 1 0 0 0 -1 1v6a1 1 0 0 0 1 1h1a3 3 0 0 0 3 -3v-2a3 3 0 0 0 -3 -3zm0 2a1 1 0 0 1 1 1v2a1 1 0 0 1 -.883 .993l-.117 .007v-4zm-6.5 0a.5 .5 0 0 1 .492 .41l.008 .09v1.5h-1v-1.5l.008 -.09a.5 .5 0 0 1 .492 -.41z" stroke-width="0" fill="currentColor" />
</svg>

Before

Width:  |  Height:  |  Size: 885 B

View File

@ -1,13 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-ad-circle-off" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4.91 4.949a9.968 9.968 0 0 0 -2.91 7.051c0 5.523 4.477 10 10 10a9.968 9.968 0 0 0 7.05 -2.909" />
<path d="M20.778 16.793a9.955 9.955 0 0 0 1.222 -4.793c0 -5.523 -4.477 -10 -10 -10c-1.74 0 -3.376 .444 -4.8 1.225" />
<path d="M7 15v-4.5a1.5 1.5 0 0 1 2.138 -1.358" />
<path d="M9.854 9.853c.094 .196 .146 .415 .146 .647v4.5" />
<path d="M7 13h3" />
<path d="M14 14v1h1" />
<path d="M17 13v-2a2 2 0 0 0 -2 -2h-1v1" />
<path d="M3 3l18 18" />
</svg>

Before

Width:  |  Height:  |  Size: 762 B

View File

@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-ad-circle" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M12 12m-10 0a10 10 0 1 0 20 0a10 10 0 1 0 -20 0" />
<path d="M7 15v-4.5a1.5 1.5 0 0 1 3 0v4.5" />
<path d="M7 13h3" />
<path d="M14 9v6h1a2 2 0 0 0 2 -2v-2a2 2 0 0 0 -2 -2h-1z" />
</svg>

Before

Width:  |  Height:  |  Size: 489 B

View File

@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-ad-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M19 4h-14a3 3 0 0 0 -3 3v10a3 3 0 0 0 3 3h14a3 3 0 0 0 3 -3v-10a3 3 0 0 0 -3 -3zm-10 4a3 3 0 0 1 2.995 2.824l.005 .176v4a1 1 0 0 1 -1.993 .117l-.007 -.117v-1h-2v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-4a3 3 0 0 1 3 -3zm0 2a1 1 0 0 0 -.993 .883l-.007 .117v1h2v-1a1 1 0 0 0 -1 -1zm8 -2a1 1 0 0 1 .993 .883l.007 .117v6a1 1 0 0 1 -.883 .993l-.117 .007h-1.5a2.5 2.5 0 1 1 .326 -4.979l.174 .029v-2.05a1 1 0 0 1 .883 -.993l.117 -.007zm-1.41 5.008l-.09 -.008a.5 .5 0 0 0 -.09 .992l.09 .008h.5v-.5l-.008 -.09a.5 .5 0 0 0 -.318 -.379l-.084 -.023z" stroke-width="0" fill="currentColor" />
</svg>

Before

Width:  |  Height:  |  Size: 878 B

View File

@ -1,11 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-ad-off" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M9 5h10a2 2 0 0 1 2 2v10m-2 2h-14a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2" />
<path d="M7 15v-4a2 2 0 0 1 2 -2m2 2v4" />
<path d="M7 13h4" />
<path d="M17 9v4" />
<path d="M16.115 12.131c.33 .149 .595 .412 .747 .74" />
<path d="M3 3l18 18" />
</svg>

Before

Width:  |  Height:  |  Size: 548 B

View File

@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-ad" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M3 5m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z" />
<path d="M7 15v-4a2 2 0 0 1 4 0v4" />
<path d="M7 13l4 0" />
<path d="M17 9v6h-1.5a1.5 1.5 0 1 1 1.5 -1.5" />
</svg>

Before

Width:  |  Height:  |  Size: 496 B

View File

@ -1,12 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-address-book-off" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M8 4h10a2 2 0 0 1 2 2v10m-.57 3.399c-.363 .37 -.87 .601 -1.43 .601h-10a2 2 0 0 1 -2 -2v-12" />
<path d="M10 16h6" />
<path d="M11 11a2 2 0 0 0 2 2m2 -2a2 2 0 0 0 -2 -2" />
<path d="M4 8h3" />
<path d="M4 12h3" />
<path d="M4 16h3" />
<path d="M3 3l18 18" />
</svg>

Before

Width:  |  Height:  |  Size: 580 B

View File

@ -1,11 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-address-book" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M20 6v12a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2z" />
<path d="M10 16h6" />
<path d="M13 11m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
<path d="M4 8h3" />
<path d="M4 12h3" />
<path d="M4 16h3" />
</svg>

Before

Width:  |  Height:  |  Size: 539 B

View File

@ -1,14 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-adjustments-alt" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 8h4v4h-4z" />
<path d="M6 4l0 4" />
<path d="M6 12l0 8" />
<path d="M10 14h4v4h-4z" />
<path d="M12 4l0 10" />
<path d="M12 18l0 2" />
<path d="M16 5h4v4h-4z" />
<path d="M18 4l0 1" />
<path d="M18 9l0 11" />
</svg>

Before

Width:  |  Height:  |  Size: 537 B

View File

@ -1,15 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-adjustments-bolt" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M6 4v4" />
<path d="M6 12v8" />
<path d="M10 16a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M12 4v10" />
<path d="M19 16l-2 3h4l-2 3" />
<path d="M12 18v2" />
<path d="M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M18 4v1" />
<path d="M18 9v3" />
</svg>

Before

Width:  |  Height:  |  Size: 623 B

View File

@ -1,16 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-adjustments-cancel" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M6 4v4" />
<path d="M6 12v8" />
<path d="M13.499 14.675a2 2 0 1 0 -1.499 3.325" />
<path d="M12 4v10" />
<path d="M12 18v2" />
<path d="M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M18 4v1" />
<path d="M18 9v3" />
<path d="M19 19m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0" />
<path d="M17 21l4 -4" />
</svg>

Before

Width:  |  Height:  |  Size: 676 B

View File

@ -1,14 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-adjustments-check" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M6 4v4" />
<path d="M6 12v8" />
<path d="M13.823 15.176a2 2 0 1 0 -2.638 2.651" />
<path d="M12 4v10" />
<path d="M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M18 4v1" />
<path d="M18 9v5" />
<path d="M15 19l2 2l4 -4" />
</svg>

Before

Width:  |  Height:  |  Size: 599 B

View File

@ -1,16 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-adjustments-code" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M6 4v4" />
<path d="M6 12v8" />
<path d="M13.557 14.745a2 2 0 1 0 -1.557 3.255" />
<path d="M12 4v10" />
<path d="M12 18v2" />
<path d="M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M18 4v1" />
<path d="M18 9v4" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>

Before

Width:  |  Height:  |  Size: 655 B

View File

@ -1,21 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-adjustments-cog" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M6 4v4" />
<path d="M6 12v8" />
<path d="M13.199 14.399a2 2 0 1 0 -1.199 3.601" />
<path d="M12 4v10" />
<path d="M12 18v2" />
<path d="M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M18 4v1" />
<path d="M18 9v2.5" />
<path d="M19.001 19m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
<path d="M19.001 15.5v1.5" />
<path d="M19.001 21v1.5" />
<path d="M22.032 17.25l-1.299 .75" />
<path d="M17.27 20l-1.3 .75" />
<path d="M15.97 17.25l1.3 .75" />
<path d="M20.733 20l1.3 .75" />
</svg>

Before

Width:  |  Height:  |  Size: 858 B

View File

@ -1,16 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-adjustments-dollar" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M6 4v4" />
<path d="M6 12v8" />
<path d="M13.366 14.54a2 2 0 1 0 -.216 3.097" />
<path d="M12 4v10" />
<path d="M12 18v2" />
<path d="M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M18 4v1" />
<path d="M18 9v1" />
<path d="M21 15h-2.5a1.5 1.5 0 0 0 0 3h1a1.5 1.5 0 0 1 0 3h-2.5" />
<path d="M19 21v1m0 -8v1" />
</svg>

Before

Width:  |  Height:  |  Size: 692 B

View File

@ -1,16 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-adjustments-down" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M6 4v4" />
<path d="M6 12v8" />
<path d="M13.945 15.53a2 2 0 1 0 -1.945 2.47" />
<path d="M12 4v10" />
<path d="M12 18v2" />
<path d="M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M18 4v1" />
<path d="M18 9v3" />
<path d="M19 16v6" />
<path d="M22 19l-3 3l-3 -3" />
</svg>

Before

Width:  |  Height:  |  Size: 646 B

View File

@ -1,16 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-adjustments-exclamation" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M6 4v4" />
<path d="M6 12v8" />
<path d="M10 16a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M12 4v10" />
<path d="M12 18v2" />
<path d="M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M18 4v1" />
<path d="M18 9v3" />
<path d="M19 16v3" />
<path d="M19 22v.01" />
</svg>

Before

Width:  |  Height:  |  Size: 646 B

View File

@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-adjustments-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M6 3a1 1 0 0 1 .993 .883l.007 .117v3.171a3.001 3.001 0 0 1 0 5.658v7.171a1 1 0 0 1 -1.993 .117l-.007 -.117v-7.17a3.002 3.002 0 0 1 -1.995 -2.654l-.005 -.176l.005 -.176a3.002 3.002 0 0 1 1.995 -2.654v-3.17a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" />
<path d="M12 3a1 1 0 0 1 .993 .883l.007 .117v9.171a3.001 3.001 0 0 1 0 5.658v1.171a1 1 0 0 1 -1.993 .117l-.007 -.117v-1.17a3.002 3.002 0 0 1 -1.995 -2.654l-.005 -.176l.005 -.176a3.002 3.002 0 0 1 1.995 -2.654v-9.17a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" />
<path d="M18 3a1 1 0 0 1 .993 .883l.007 .117v.171a3.001 3.001 0 0 1 0 5.658v10.171a1 1 0 0 1 -1.993 .117l-.007 -.117v-10.17a3.002 3.002 0 0 1 -1.995 -2.654l-.005 -.176l.005 -.176a3.002 3.002 0 0 1 1.995 -2.654v-.17a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" />
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,13 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-adjustments-heart" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 10a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M6 4v4" />
<path d="M6 12v8" />
<path d="M12 4v8.5" />
<path d="M16 7a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M18 4v1" />
<path d="M18 9v2.5" />
<path d="M18 22l3.35 -3.284a2.143 2.143 0 0 0 .005 -3.071a2.242 2.242 0 0 0 -3.129 -.006l-.224 .22l-.223 -.22a2.242 2.242 0 0 0 -3.128 -.006a2.143 2.143 0 0 0 -.006 3.071l3.355 3.296z" />
</svg>

Before

Width:  |  Height:  |  Size: 708 B

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