Eduard Kuzmenko
3 years ago
12 changed files with 3667 additions and 1133 deletions
@ -0,0 +1,3 @@ |
|||||||
|
node_modules |
||||||
|
out |
||||||
|
selection.json |
@ -0,0 +1,292 @@ |
|||||||
|
// Thanks to https://github.com/Yuyz0112/icomoon-cli
|
||||||
|
|
||||||
|
const fs = require('fs-extra'); |
||||||
|
const path = require('path'); |
||||||
|
const extract = require('extract-zip'); |
||||||
|
const puppeteer = require('puppeteer'); |
||||||
|
|
||||||
|
const DEFAULT_TIMEOUT = 60000; |
||||||
|
|
||||||
|
const PAGE = { |
||||||
|
IMPORT_CONFIG_BUTTON: '.file.unit', |
||||||
|
IMPORT_SELECTION_INPUT: '.file.unit input[type="file"]', |
||||||
|
OVERLAY_CONFIRM: '.overlay button.mrl', |
||||||
|
NEW_SET_BUTTON: '.menuList1 button', |
||||||
|
MAIN_MENU_BUTTON: '.bar-top button .icon-menu', |
||||||
|
MENU_BUTTON: 'h1 button .icon-menu', |
||||||
|
MENU: '.menuList2.menuList3', |
||||||
|
ICON_INPUT: '.menuList2.menuList3 .file input[type="file"]', |
||||||
|
FIRST_ICON_BOX: '#set0 .miBox:not(.mi-selected)', |
||||||
|
REMOVE_SET_BUTTON: '.menuList2.menuList3 li:last-child button', |
||||||
|
SELECT_ALL_BUTTON: 'button[ng-click="selectAllNone($index, true)"]', |
||||||
|
GENERATE_LINK: 'a[href="#/select/font"]', |
||||||
|
GLYPH_SET: '#glyphSet0', |
||||||
|
GLYPH_NAME: '.glyphName', |
||||||
|
DOWNLOAD_BUTTON: '.btn4', |
||||||
|
PREFERENCES: '#pref', |
||||||
|
SHOW_METRICS: '[ng-class*="showMetricsFocused"] label', |
||||||
|
CLOSE_OVERLAY: 'button[ng-click*="visiblePanels.fontPref = false"]', |
||||||
|
|
||||||
|
IE8_SUPPORTED: '[ng-class*="noie8Focused"] .icon-checked', |
||||||
|
IE8_DISABLE: 'label[ng-class*="noie8Focused"]', |
||||||
|
|
||||||
|
FONT_NAME_INPUT: '[ng-model="fontPref.metadata.fontFamily"]', |
||||||
|
CLASS_PREFIX_INPUT: '[ng-model="fontPref.prefix"]', |
||||||
|
CSS_VARS_LABEL: '[ng-class*="fontPref.cssVars"]', |
||||||
|
EM_HEIGHT_INPUT: '[model="fontPref.metrics.emSize"] input', |
||||||
|
BASELINE_HEIGHT_INPUT: '[model="fontPref.metrics.baseline"] input', |
||||||
|
WHITESPACE_WIDTH_INPUT: '[model="fontPref.metrics.whitespace"] input', |
||||||
|
}; |
||||||
|
const DEFAULT_OPTIONS = { |
||||||
|
outputDir: path.join(__dirname, 'output'), |
||||||
|
}; |
||||||
|
|
||||||
|
const logger = (...args) => { |
||||||
|
console.log('[icomoon-cli]', ...args); |
||||||
|
}; |
||||||
|
|
||||||
|
const sleep = time => new Promise(resolve => setTimeout(resolve, time)); |
||||||
|
|
||||||
|
const getAbsolutePath = inputPath => { |
||||||
|
let absoluteSelectionPath = inputPath; |
||||||
|
if (!path.isAbsolute(inputPath)) { |
||||||
|
if (!process.env.PWD) { |
||||||
|
process.env.PWD = process.cwd(); |
||||||
|
} |
||||||
|
absoluteSelectionPath = path.resolve(process.env.PWD, inputPath); |
||||||
|
} |
||||||
|
return absoluteSelectionPath; |
||||||
|
}; |
||||||
|
|
||||||
|
const checkDownload = dest => new Promise((resolve, reject) => { |
||||||
|
const interval = 1000; |
||||||
|
let downloadSize = 0; |
||||||
|
let timeCount = 0; |
||||||
|
const timer = setInterval(async () => { |
||||||
|
timeCount += interval; |
||||||
|
/* const exist = await fs.exists(dest); |
||||||
|
if (!exist) { |
||||||
|
return; |
||||||
|
} */ |
||||||
|
const stats = fs.statSync(dest); |
||||||
|
if (stats.size > 0 && stats.size === downloadSize) { |
||||||
|
clearInterval(timer); |
||||||
|
resolve(); |
||||||
|
} else { |
||||||
|
downloadSize = stats.size; |
||||||
|
} |
||||||
|
if (timeCount > DEFAULT_TIMEOUT) { |
||||||
|
reject('Timeout when download file, please check your network.'); |
||||||
|
} |
||||||
|
}, interval); |
||||||
|
}); |
||||||
|
|
||||||
|
const checkDuplicateName = ({ selectionPath, icons, names }, forceOverride) => { |
||||||
|
const iconNames = icons.map((icon, index) => { |
||||||
|
if (names[index]) { |
||||||
|
return names[index]; |
||||||
|
} |
||||||
|
return path.basename(icon).replace(path.extname(icon), ''); |
||||||
|
}); |
||||||
|
const duplicates = []; |
||||||
|
const selection = fs.readJSONSync(selectionPath); |
||||||
|
selection.icons.forEach((icon, index) => { |
||||||
|
const name = icon.tags[0]; |
||||||
|
if (iconNames.includes(name)) { |
||||||
|
duplicates.push({ name, index }); |
||||||
|
} |
||||||
|
}); |
||||||
|
if (!duplicates.length) { |
||||||
|
return; |
||||||
|
} |
||||||
|
if (forceOverride) { |
||||||
|
selection.icons = selection.icons.filter((icon, index) => !duplicates.some(d => d.index === index)); |
||||||
|
fs.writeJSONSync(selectionPath, selection, { spaces: 2 }); |
||||||
|
} else { |
||||||
|
throw new Error(`Found duplicate icon names: ${duplicates.map(d => d.name).join(',')}`); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
async function pipeline(options = {}) { |
||||||
|
try { |
||||||
|
const { |
||||||
|
icons, |
||||||
|
names = [], |
||||||
|
selectionPath, |
||||||
|
forceOverride = false, |
||||||
|
whenFinished, |
||||||
|
visible = false |
||||||
|
} = options; |
||||||
|
const outputDir = options.outputDir ? getAbsolutePath(options.outputDir) : DEFAULT_OPTIONS.outputDir; |
||||||
|
// prepare stage
|
||||||
|
logger('Preparing...'); |
||||||
|
if(!icons || !icons.length) { |
||||||
|
if(whenFinished) { |
||||||
|
whenFinished({ outputDir }); |
||||||
|
} |
||||||
|
return logger('No new icons found.'); |
||||||
|
} |
||||||
|
if(!selectionPath) { |
||||||
|
throw new Error('Please config a valid selection file path.'); |
||||||
|
} |
||||||
|
let absoluteSelectionPath = getAbsolutePath(selectionPath); |
||||||
|
// checkDuplicateName({
|
||||||
|
// selectionPath: absoluteSelectionPath,
|
||||||
|
// icons,
|
||||||
|
// names,
|
||||||
|
// }, forceOverride);
|
||||||
|
await fs.remove(outputDir); |
||||||
|
await fs.ensureDir(outputDir); |
||||||
|
|
||||||
|
const browser = await puppeteer.launch({headless: !visible}); |
||||||
|
logger('Started a new chrome instance, going to load icomoon.io.'); |
||||||
|
const page = await (await browser).newPage(); |
||||||
|
await page._client.send('Page.setDownloadBehavior', { |
||||||
|
behavior: 'allow', |
||||||
|
downloadPath: outputDir |
||||||
|
}); |
||||||
|
await page.goto('https://icomoon.io/app/#/select'); |
||||||
|
await page.waitForSelector(PAGE.IMPORT_CONFIG_BUTTON); |
||||||
|
logger('Dashboard is visible, going to upload config file'); |
||||||
|
// remove init set
|
||||||
|
await page.click(PAGE.MENU_BUTTON); |
||||||
|
await page.click(PAGE.REMOVE_SET_BUTTON); |
||||||
|
|
||||||
|
const importInput = await page.waitForSelector(PAGE.IMPORT_SELECTION_INPUT); |
||||||
|
await importInput.uploadFile(absoluteSelectionPath); |
||||||
|
logger('Uploaded config, going to upload new icon files'); |
||||||
|
try { |
||||||
|
await Promise.race([ |
||||||
|
sleep(1000).then(() => { |
||||||
|
throw 0; |
||||||
|
}), |
||||||
|
page.waitForSelector(PAGE.OVERLAY_CONFIRM, { visible: true }) |
||||||
|
]); |
||||||
|
await page.click(PAGE.OVERLAY_CONFIRM); |
||||||
|
} catch(err) { |
||||||
|
logger('Overlay is missed?'); |
||||||
|
} |
||||||
|
|
||||||
|
const selection = fs.readJSONSync(selectionPath); |
||||||
|
/* if (selection.icons.length === 0) { |
||||||
|
logger('Selection icons is empty, going to create an empty set'); |
||||||
|
await page.click(PAGE.MAIN_MENU_BUTTON); |
||||||
|
await page.waitForSelector(PAGE.NEW_SET_BUTTON, { visible: true }); |
||||||
|
await page.click(PAGE.NEW_SET_BUTTON); |
||||||
|
} */ |
||||||
|
|
||||||
|
await page.click(PAGE.MENU_BUTTON); |
||||||
|
const iconInput = await page.waitForSelector(PAGE.ICON_INPUT); |
||||||
|
const iconPaths = icons.map(getAbsolutePath); |
||||||
|
await iconInput.uploadFile(...iconPaths); |
||||||
|
await page.waitForSelector(PAGE.FIRST_ICON_BOX); |
||||||
|
await page.click(PAGE.SELECT_ALL_BUTTON); |
||||||
|
logger('Uploaded and selected all new icons'); |
||||||
|
await page.click(PAGE.GENERATE_LINK); |
||||||
|
await page.waitForSelector(PAGE.GLYPH_SET); |
||||||
|
|
||||||
|
await page.click(PAGE.PREFERENCES); |
||||||
|
|
||||||
|
try { |
||||||
|
await Promise.race([ |
||||||
|
sleep(1000).then(() => { |
||||||
|
throw 0; |
||||||
|
}), |
||||||
|
page.waitForSelector(PAGE.IE8_SUPPORTED) |
||||||
|
]); |
||||||
|
await page.click(PAGE.IE8_DISABLE); |
||||||
|
} catch(err) { |
||||||
|
logger('IE8 is already disabled'); |
||||||
|
} |
||||||
|
|
||||||
|
async function fillInput(selector, value) { |
||||||
|
if(typeof(value) !== 'string') { |
||||||
|
value = '' + value; |
||||||
|
} |
||||||
|
|
||||||
|
await page.focus(selector); |
||||||
|
for(let i = 0; i < 100; ++i) { |
||||||
|
await page.keyboard.press('Backspace'); |
||||||
|
} |
||||||
|
await page.keyboard.type(value); |
||||||
|
} |
||||||
|
|
||||||
|
await fillInput(PAGE.FONT_NAME_INPUT, selection.preferences.fontPref.metadata.fontFamily); |
||||||
|
await fillInput(PAGE.CLASS_PREFIX_INPUT, selection.preferences.fontPref.prefix); |
||||||
|
await page.click(PAGE.CSS_VARS_LABEL); |
||||||
|
|
||||||
|
await page.click(PAGE.SHOW_METRICS); |
||||||
|
await fillInput(PAGE.EM_HEIGHT_INPUT, selection.preferences.fontPref.metrics.emSize); |
||||||
|
await fillInput(PAGE.BASELINE_HEIGHT_INPUT, selection.preferences.fontPref.metrics.baseline); |
||||||
|
await fillInput(PAGE.WHITESPACE_WIDTH_INPUT, selection.preferences.fontPref.metrics.whitespace); |
||||||
|
|
||||||
|
// await sleep(100000);
|
||||||
|
await page.click(PAGE.CLOSE_OVERLAY); |
||||||
|
// (await page.waitForSelector(PAGE.FONT_NAME_INPUT)).;
|
||||||
|
|
||||||
|
// if(names.length) {
|
||||||
|
// logger('Changed names of icons');
|
||||||
|
// // sleep to ensure indexedDB is ready
|
||||||
|
// await sleep(1000);
|
||||||
|
// await page.evaluate(names => {
|
||||||
|
// const request = indexedDB.open('IDBWrapper-storage', 1);
|
||||||
|
// request.onsuccess = function() {
|
||||||
|
// const db = request.result;
|
||||||
|
// const tx = db.transaction('storage', 'readwrite');
|
||||||
|
// const store = tx.objectStore('storage');
|
||||||
|
// const keys = store.getAllKeys();
|
||||||
|
// keys.onsuccess = function() {
|
||||||
|
// let timestamp;
|
||||||
|
// keys.result.forEach(function(key) {
|
||||||
|
// if (typeof key === 'number') {
|
||||||
|
// timestamp = key;
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// const main = store.get(timestamp);
|
||||||
|
// main.onsuccess = function() {
|
||||||
|
// const data = main.result;
|
||||||
|
// for (let i = 0; i < names.length; i++) {
|
||||||
|
// data.obj.iconSets[0].selection[i].name = names[i];
|
||||||
|
// }
|
||||||
|
// store.put(data);
|
||||||
|
// };
|
||||||
|
// };
|
||||||
|
// };
|
||||||
|
// }, names);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // sleep to ensure the code was executed
|
||||||
|
// await sleep(1000);
|
||||||
|
// // reload the page let icomoon read latest indexedDB data
|
||||||
|
// await page.reload();
|
||||||
|
await sleep(2000); |
||||||
|
|
||||||
|
await page.waitForSelector(PAGE.DOWNLOAD_BUTTON); |
||||||
|
await page.click(PAGE.DOWNLOAD_BUTTON); |
||||||
|
const meta = selection.preferences.fontPref.metadata; |
||||||
|
const zipName = meta.majorVersion |
||||||
|
? `${meta.fontFamily}-v${meta.majorVersion}.${meta.minorVersion || 0}.zip` |
||||||
|
: `${meta.fontFamily}.zip`; |
||||||
|
logger(`Started to download ${zipName}`); |
||||||
|
const zipPath = path.join(outputDir, zipName); |
||||||
|
await checkDownload(zipPath); |
||||||
|
logger('Successfully downloaded, going to unzip it.'); |
||||||
|
await page.close(); |
||||||
|
await browser.close(); |
||||||
|
// unzip stage
|
||||||
|
extract(zipPath, {dir: outputDir}, async(err) => { |
||||||
|
if(err) { |
||||||
|
throw err; |
||||||
|
} |
||||||
|
await fs.remove(zipPath); |
||||||
|
logger(`Finished. The output directory is ${outputDir}.`); |
||||||
|
if(whenFinished) { |
||||||
|
whenFinished({outputDir}); |
||||||
|
} |
||||||
|
}); |
||||||
|
} catch(error) { |
||||||
|
console.error(error); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = pipeline; |
@ -0,0 +1,52 @@ |
|||||||
|
// @ts-check
|
||||||
|
|
||||||
|
const pipeline = require('./icomoon'); |
||||||
|
const fs = require('fs'); |
||||||
|
const path = require('path'); |
||||||
|
|
||||||
|
const iconsPath = path.join(__dirname, '../../../tweb-design/JS_3/Icons/'); |
||||||
|
const files = fs.readdirSync(iconsPath); |
||||||
|
const icons = files.filter(file => file.endsWith('.svg')).map(file => iconsPath + file); |
||||||
|
|
||||||
|
function moveFiles(outPath) { |
||||||
|
// const path = './out/';
|
||||||
|
|
||||||
|
const stylesOutPath = path.join(__dirname, '../../scss/tgico/_'); |
||||||
|
|
||||||
|
let styleText = fs.readFileSync(outPath + 'style.scss').toString(); |
||||||
|
styleText = styleText |
||||||
|
.replace(/icomoon/g, 'tgico') |
||||||
|
.replace('[class^="tgico-"], [class*=" tgico-"]', `/* [class^="tgico-"]:before,
|
||||||
|
[class^="tgico-"]:after, */ |
||||||
|
[class^="tgico-"], |
||||||
|
.tgico:before, |
||||||
|
.tgico:after, |
||||||
|
[class*=" tgico-"]:before, |
||||||
|
[class*=" tgico-"]:after`);
|
||||||
|
fs.writeFileSync(stylesOutPath + 'style.scss', styleText); |
||||||
|
|
||||||
|
let variablesText = fs.readFileSync(outPath + 'variables.scss').toString(); |
||||||
|
variablesText = variablesText.slice(variablesText.indexOf('\n\n') + 2); |
||||||
|
fs.writeFileSync(stylesOutPath + 'variables.scss', variablesText); |
||||||
|
|
||||||
|
const fontsPath = outPath + 'fonts/'; |
||||||
|
const files = fs.readdirSync(fontsPath); |
||||||
|
files.forEach(fileName => { |
||||||
|
fs.cpSync(fontsPath + fileName, path.join(__dirname, '../../../public/assets/fonts/' + fileName)); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
// moveFiles();
|
||||||
|
// process.exit(0);
|
||||||
|
|
||||||
|
pipeline({ |
||||||
|
icons, |
||||||
|
// names: ['new1', 'new2'],
|
||||||
|
selectionPath: path.join(__dirname, './selection.json'), |
||||||
|
outputDir: path.join(__dirname, './out'), |
||||||
|
forceOverride: true, |
||||||
|
visible: false, |
||||||
|
whenFinished: (result) => { |
||||||
|
moveFiles(result.outputDir + '/'); |
||||||
|
} |
||||||
|
}); |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,17 @@ |
|||||||
|
{ |
||||||
|
"name": "icomoon", |
||||||
|
"version": "1.0.0", |
||||||
|
"description": "", |
||||||
|
"main": "icomoon_generate.js", |
||||||
|
"scripts": { |
||||||
|
"start": "node icomoon_generate.js" |
||||||
|
}, |
||||||
|
"author": "", |
||||||
|
"license": "ISC", |
||||||
|
"dependencies": { |
||||||
|
"extract-zip": "^1.6.6", |
||||||
|
"fs-extra": "^4.0.2", |
||||||
|
"puppeteer": "^13.5.2", |
||||||
|
"yargs": "^10.0.3" |
||||||
|
} |
||||||
|
} |
@ -1,198 +0,0 @@ |
|||||||
/* |
|
||||||
* https://github.com/morethanwords/tweb |
|
||||||
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
||||||
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
||||||
*/ |
|
||||||
|
|
||||||
// ! https://icomoon.io/app/#/select |
|
||||||
|
|
||||||
$tgico-font-family: "tgico" !default; |
|
||||||
$tgico-font-path: "assets/fonts" !default; |
|
||||||
|
|
||||||
/* |
|
||||||
! CAN RUN IN DEVELOPER TOOLS TO CONVERT FONT TO VARIABLES: |
|
||||||
`.tgico-select:before { |
|
||||||
content: "\e900"; |
|
||||||
}` |
|
||||||
.toLowerCase() |
|
||||||
.replace(/([\s])|(_svg)|(1x)/g, '') |
|
||||||
.replace(/\.(.+?):before\{content:"(.+?);\}/g, `$$$1: "\\$2;\n`); |
|
||||||
*/ |
|
||||||
|
|
||||||
$tgico-check: "\e900"; |
|
||||||
$tgico-checks: "\e901"; |
|
||||||
$tgico-activesessions: "\e902"; |
|
||||||
$tgico-add_reaction: "\e903"; |
|
||||||
$tgico-add: "\e904"; |
|
||||||
$tgico-addmember_filled: "\e905"; |
|
||||||
$tgico-adduser: "\e906"; |
|
||||||
$tgico-admin: "\e907"; |
|
||||||
$tgico-animals: "\e908"; |
|
||||||
$tgico-animations: "\e909"; |
|
||||||
$tgico-archive: "\e90a"; |
|
||||||
$tgico-arrow_down: "\e90b"; |
|
||||||
$tgico-arrow_next: "\e90c"; |
|
||||||
$tgico-attach: "\e90d"; |
|
||||||
$tgico-avatarnext: "\e90e"; |
|
||||||
$tgico-avatarprevious: "\e90f"; |
|
||||||
$tgico-bold: "\e910"; |
|
||||||
$tgico-botcom: "\e911"; |
|
||||||
$tgico-bots: "\e912"; |
|
||||||
$tgico-bug: "\e913"; |
|
||||||
$tgico-calendar: "\e914"; |
|
||||||
$tgico-calendarfilter: "\e915"; |
|
||||||
$tgico-camera: "\e916"; |
|
||||||
$tgico-cameraadd: "\e917"; |
|
||||||
$tgico-car: "\e918"; |
|
||||||
$tgico-channel: "\e919"; |
|
||||||
$tgico-channelviews: "\e91a"; |
|
||||||
$tgico-chatspinned: "\e91b"; |
|
||||||
$tgico-chatsplaceholder: "\e91c"; |
|
||||||
$tgico-check1: "\e91d"; |
|
||||||
$tgico-checkbox: "\e91e"; |
|
||||||
$tgico-checkboxblock: "\e91f"; |
|
||||||
$tgico-checkboxempty: "\e920"; |
|
||||||
$tgico-checkboxon: "\e921"; |
|
||||||
$tgico-checkretract: "\e922"; |
|
||||||
$tgico-checkround: "\e923"; |
|
||||||
$tgico-close: "\e924"; |
|
||||||
$tgico-clouddownload: "\e925"; |
|
||||||
$tgico-colorize: "\e926"; |
|
||||||
$tgico-comments: "\e927"; |
|
||||||
$tgico-commentssticker: "\e928"; |
|
||||||
$tgico-copy: "\e929"; |
|
||||||
$tgico-darkmode: "\e92a"; |
|
||||||
$tgico-data: "\e92b"; |
|
||||||
$tgico-delete_filled: "\e92c"; |
|
||||||
$tgico-delete: "\e92d"; |
|
||||||
$tgico-deletedaccount: "\e92e"; |
|
||||||
$tgico-deleteleft: "\e92f"; |
|
||||||
$tgico-deleteuser: "\e930"; |
|
||||||
$tgico-devices: "\e931"; |
|
||||||
$tgico-document: "\e932"; |
|
||||||
$tgico-down: "\e933"; |
|
||||||
$tgico-download: "\e934"; |
|
||||||
$tgico-dragfiles: "\e935"; |
|
||||||
$tgico-dragmedia: "\e936"; |
|
||||||
$tgico-eats: "\e937"; |
|
||||||
$tgico-edit: "\e938"; |
|
||||||
$tgico-email: "\e939"; |
|
||||||
$tgico-endcall_filled: "\e93a"; |
|
||||||
$tgico-enter: "\e93b"; |
|
||||||
$tgico-eye1: "\e93c"; |
|
||||||
$tgico-eye2: "\e93d"; |
|
||||||
$tgico-fast_forward: "\e93e"; |
|
||||||
$tgico-fast_rewind: "\e93f"; |
|
||||||
$tgico-favourites: "\e940"; |
|
||||||
$tgico-flag: "\e941"; |
|
||||||
$tgico-folder: "\e942"; |
|
||||||
$tgico-fontsize: "\e943"; |
|
||||||
$tgico-forward_filled: "\e944"; |
|
||||||
$tgico-forward: "\e945"; |
|
||||||
$tgico-fullscreen: "\e946"; |
|
||||||
$tgico-gc_microphone: "\e947"; |
|
||||||
$tgico-gc_microphoneoff: "\e948"; |
|
||||||
$tgico-gifs: "\e949"; |
|
||||||
$tgico-group: "\e94a"; |
|
||||||
$tgico-help: "\e94b"; |
|
||||||
$tgico-image: "\e94c"; |
|
||||||
$tgico-info: "\e94d"; |
|
||||||
$tgico-info2: "\e94e"; |
|
||||||
$tgico-italic: "\e94f"; |
|
||||||
$tgico-keyboard: "\e950"; |
|
||||||
$tgico-lamp: "\e951"; |
|
||||||
$tgico-language: "\e952"; |
|
||||||
$tgico-largepause: "\e953"; |
|
||||||
$tgico-largeplay: "\e954"; |
|
||||||
$tgico-left: "\e955"; |
|
||||||
$tgico-link: "\e956"; |
|
||||||
$tgico-listscreenshare: "\e957"; |
|
||||||
$tgico-livelocation: "\e958"; |
|
||||||
$tgico-location: "\e959"; |
|
||||||
$tgico-lock: "\e95a"; |
|
||||||
$tgico-lockoff: "\e95b"; |
|
||||||
$tgico-loginlogodesktop: "\e95c"; |
|
||||||
$tgico-loginlogomobile: "\e95d"; |
|
||||||
$tgico-logout: "\e95e"; |
|
||||||
$tgico-mention: "\e95f"; |
|
||||||
$tgico-menu: "\e960"; |
|
||||||
$tgico-message: "\e961"; |
|
||||||
$tgico-messageunread: "\e962"; |
|
||||||
$tgico-microphone: "\e963"; |
|
||||||
$tgico-minus: "\e964"; |
|
||||||
$tgico-monospace: "\e965"; |
|
||||||
$tgico-more: "\e966"; |
|
||||||
$tgico-mute: "\e967"; |
|
||||||
$tgico-muted: "\e968"; |
|
||||||
$tgico-newchannel: "\e969"; |
|
||||||
$tgico-newchat_filled: "\e96a"; |
|
||||||
$tgico-newgroup: "\e96b"; |
|
||||||
$tgico-newprivate: "\e96c"; |
|
||||||
$tgico-next: "\e96d"; |
|
||||||
$tgico-noncontacts: "\e96e"; |
|
||||||
$tgico-nosound: "\e96f"; |
|
||||||
$tgico-passwordoff: "\e970"; |
|
||||||
$tgico-pause: "\e971"; |
|
||||||
$tgico-permissions: "\e972"; |
|
||||||
$tgico-phone: "\e973"; |
|
||||||
$tgico-pin: "\e974"; |
|
||||||
$tgico-pinlist: "\e975"; |
|
||||||
$tgico-pinned_filled: "\e976"; |
|
||||||
$tgico-pinnedchat: "\e977"; |
|
||||||
$tgico-play: "\e978"; |
|
||||||
$tgico-playback_1x: "\e979"; |
|
||||||
$tgico-playback_2x: "\e97a"; |
|
||||||
$tgico-playback_05: "\e97b"; |
|
||||||
$tgico-playback_15: "\e97c"; |
|
||||||
$tgico-plus: "\e97d"; |
|
||||||
$tgico-poll: "\e97e"; |
|
||||||
$tgico-previous: "\e97f"; |
|
||||||
$tgico-radiooff: "\e980"; |
|
||||||
$tgico-radioon: "\e981"; |
|
||||||
$tgico-reactions: "\e982"; |
|
||||||
$tgico-readchats: "\e983"; |
|
||||||
$tgico-recent: "\e984"; |
|
||||||
$tgico-replace: "\e985"; |
|
||||||
$tgico-reply_filled: "\e986"; |
|
||||||
$tgico-reply: "\e987"; |
|
||||||
$tgico-rightpanel: "\e988"; |
|
||||||
$tgico-saved: "\e989"; |
|
||||||
$tgico-savedmessages: "\e98a"; |
|
||||||
$tgico-schedule: "\e98b"; |
|
||||||
$tgico-scheduled: "\e98c"; |
|
||||||
$tgico-search: "\e98d"; |
|
||||||
$tgico-select: "\e98e"; |
|
||||||
$tgico-send: "\e98f"; |
|
||||||
$tgico-send2: "\e990"; |
|
||||||
$tgico-sending: "\e991"; |
|
||||||
$tgico-sendingerror: "\e992"; |
|
||||||
$tgico-settings_filled: "\e993"; |
|
||||||
$tgico-settings: "\e994"; |
|
||||||
$tgico-sharescreen_filled: "\e995"; |
|
||||||
$tgico-smallscreen: "\e996"; |
|
||||||
$tgico-smile: "\e997"; |
|
||||||
$tgico-spoiler: "\e998"; |
|
||||||
$tgico-sport: "\e999"; |
|
||||||
$tgico-stickers: "\e99a"; |
|
||||||
$tgico-stop: "\e99b"; |
|
||||||
$tgico-strikethrough: "\e99c"; |
|
||||||
$tgico-textedit: "\e99d"; |
|
||||||
$tgico-tip: "\e99e"; |
|
||||||
$tgico-tools: "\e99f"; |
|
||||||
$tgico-unarchive: "\e9a0"; |
|
||||||
$tgico-underline: "\e9a1"; |
|
||||||
$tgico-unmute: "\e9a2"; |
|
||||||
$tgico-unpin: "\e9a3"; |
|
||||||
$tgico-unread: "\e9a4"; |
|
||||||
$tgico-up: "\e9a5"; |
|
||||||
$tgico-user: "\e9a6"; |
|
||||||
$tgico-username: "\e9a7"; |
|
||||||
$tgico-videocamera_filled: "\e9a8"; |
|
||||||
$tgico-videocamera: "\e9a9"; |
|
||||||
$tgico-videochat: "\e9aa"; |
|
||||||
$tgico-volume_down: "\e9ab"; |
|
||||||
$tgico-volume_mute: "\e9ac"; |
|
||||||
$tgico-volume_off: "\e9ad"; |
|
||||||
$tgico-volume_up: "\e9ae"; |
|
||||||
$tgico-zoomin: "\e9af"; |
|
||||||
$tgico-zoomout: "\e9b0"; |
|
@ -0,0 +1,182 @@ |
|||||||
|
$tgico-check: "\e900"; |
||||||
|
$tgico-checks: "\e901"; |
||||||
|
$tgico-activesessions: "\e902"; |
||||||
|
$tgico-add: "\e903"; |
||||||
|
$tgico-add_reaction: "\e904"; |
||||||
|
$tgico-addmember_filled: "\e905"; |
||||||
|
$tgico-adduser: "\e906"; |
||||||
|
$tgico-admin: "\e907"; |
||||||
|
$tgico-animals: "\e908"; |
||||||
|
$tgico-animations: "\e909"; |
||||||
|
$tgico-archive: "\e90a"; |
||||||
|
$tgico-arrow_down: "\e90b"; |
||||||
|
$tgico-arrow_next: "\e90c"; |
||||||
|
$tgico-attach: "\e90d"; |
||||||
|
$tgico-audio_repeat: "\e90e"; |
||||||
|
$tgico-audio_repeat_single: "\e90f"; |
||||||
|
$tgico-avatarnext: "\e910"; |
||||||
|
$tgico-avatarprevious: "\e911"; |
||||||
|
$tgico-bold: "\e912"; |
||||||
|
$tgico-botcom: "\e913"; |
||||||
|
$tgico-bots: "\e914"; |
||||||
|
$tgico-bug: "\e915"; |
||||||
|
$tgico-calendar: "\e916"; |
||||||
|
$tgico-calendarfilter: "\e917"; |
||||||
|
$tgico-camera: "\e918"; |
||||||
|
$tgico-cameraadd: "\e919"; |
||||||
|
$tgico-car: "\e91a"; |
||||||
|
$tgico-channel: "\e91b"; |
||||||
|
$tgico-channelviews: "\e91c"; |
||||||
|
$tgico-chatspinned: "\e91d"; |
||||||
|
$tgico-chatsplaceholder: "\e91e"; |
||||||
|
$tgico-check1: "\e91f"; |
||||||
|
$tgico-checkbox: "\e920"; |
||||||
|
$tgico-checkboxblock: "\e921"; |
||||||
|
$tgico-checkboxempty: "\e922"; |
||||||
|
$tgico-checkboxon: "\e923"; |
||||||
|
$tgico-checkretract: "\e924"; |
||||||
|
$tgico-checkround: "\e925"; |
||||||
|
$tgico-close: "\e926"; |
||||||
|
$tgico-clouddownload: "\e927"; |
||||||
|
$tgico-colorize: "\e928"; |
||||||
|
$tgico-comments: "\e929"; |
||||||
|
$tgico-commentssticker: "\e92a"; |
||||||
|
$tgico-copy: "\e92b"; |
||||||
|
$tgico-darkmode: "\e92c"; |
||||||
|
$tgico-data: "\e92d"; |
||||||
|
$tgico-delete: "\e92e"; |
||||||
|
$tgico-delete_filled: "\e92f"; |
||||||
|
$tgico-deletedaccount: "\e930"; |
||||||
|
$tgico-deleteleft: "\e931"; |
||||||
|
$tgico-deleteuser: "\e932"; |
||||||
|
$tgico-devices: "\e933"; |
||||||
|
$tgico-document: "\e934"; |
||||||
|
$tgico-down: "\e935"; |
||||||
|
$tgico-download: "\e936"; |
||||||
|
$tgico-dragfiles: "\e937"; |
||||||
|
$tgico-dragmedia: "\e938"; |
||||||
|
$tgico-eats: "\e939"; |
||||||
|
$tgico-edit: "\e93a"; |
||||||
|
$tgico-email: "\e93b"; |
||||||
|
$tgico-endcall: "\e93c"; |
||||||
|
$tgico-endcall_filled: "\e93d"; |
||||||
|
$tgico-enter: "\e93e"; |
||||||
|
$tgico-eye1: "\e93f"; |
||||||
|
$tgico-eye2: "\e940"; |
||||||
|
$tgico-fast_forward: "\e941"; |
||||||
|
$tgico-fast_rewind: "\e942"; |
||||||
|
$tgico-favourites: "\e943"; |
||||||
|
$tgico-flag: "\e944"; |
||||||
|
$tgico-folder: "\e945"; |
||||||
|
$tgico-fontsize: "\e946"; |
||||||
|
$tgico-forward: "\e947"; |
||||||
|
$tgico-forward_filled: "\e948"; |
||||||
|
$tgico-fullscreen: "\e949"; |
||||||
|
$tgico-gc_microphone: "\e94a"; |
||||||
|
$tgico-gc_microphoneoff: "\e94b"; |
||||||
|
$tgico-gifs: "\e94c"; |
||||||
|
$tgico-group: "\e94d"; |
||||||
|
$tgico-help: "\e94e"; |
||||||
|
$tgico-image: "\e94f"; |
||||||
|
$tgico-info: "\e950"; |
||||||
|
$tgico-info2: "\e951"; |
||||||
|
$tgico-italic: "\e952"; |
||||||
|
$tgico-keyboard: "\e953"; |
||||||
|
$tgico-lamp: "\e954"; |
||||||
|
$tgico-language: "\e955"; |
||||||
|
$tgico-largepause: "\e956"; |
||||||
|
$tgico-largeplay: "\e957"; |
||||||
|
$tgico-left: "\e958"; |
||||||
|
$tgico-link: "\e959"; |
||||||
|
$tgico-listscreenshare: "\e95a"; |
||||||
|
$tgico-livelocation: "\e95b"; |
||||||
|
$tgico-location: "\e95c"; |
||||||
|
$tgico-lock: "\e95d"; |
||||||
|
$tgico-lockoff: "\e95e"; |
||||||
|
$tgico-loginlogodesktop: "\e95f"; |
||||||
|
$tgico-loginlogomobile: "\e960"; |
||||||
|
$tgico-logout: "\e961"; |
||||||
|
$tgico-mention: "\e962"; |
||||||
|
$tgico-menu: "\e963"; |
||||||
|
$tgico-message: "\e964"; |
||||||
|
$tgico-messageunread: "\e965"; |
||||||
|
$tgico-microphone: "\e966"; |
||||||
|
$tgico-minus: "\e967"; |
||||||
|
$tgico-monospace: "\e968"; |
||||||
|
$tgico-more: "\e969"; |
||||||
|
$tgico-mute: "\e96a"; |
||||||
|
$tgico-muted: "\e96b"; |
||||||
|
$tgico-newchannel: "\e96c"; |
||||||
|
$tgico-newchat_filled: "\e96d"; |
||||||
|
$tgico-newgroup: "\e96e"; |
||||||
|
$tgico-newprivate: "\e96f"; |
||||||
|
$tgico-next: "\e970"; |
||||||
|
$tgico-noncontacts: "\e971"; |
||||||
|
$tgico-nosound: "\e972"; |
||||||
|
$tgico-passwordoff: "\e973"; |
||||||
|
$tgico-pause: "\e974"; |
||||||
|
$tgico-permissions: "\e975"; |
||||||
|
$tgico-phone: "\e976"; |
||||||
|
$tgico-pin: "\e977"; |
||||||
|
$tgico-pinlist: "\e978"; |
||||||
|
$tgico-pinned_filled: "\e979"; |
||||||
|
$tgico-pinnedchat: "\e97a"; |
||||||
|
$tgico-pip: "\e97b"; |
||||||
|
$tgico-play: "\e97c"; |
||||||
|
$tgico-playback_05: "\e97d"; |
||||||
|
$tgico-playback_15: "\e97e"; |
||||||
|
$tgico-playback_1x: "\e97f"; |
||||||
|
$tgico-playback_2x: "\e980"; |
||||||
|
$tgico-plus: "\e981"; |
||||||
|
$tgico-poll: "\e982"; |
||||||
|
$tgico-previous: "\e983"; |
||||||
|
$tgico-radiooff: "\e984"; |
||||||
|
$tgico-radioon: "\e985"; |
||||||
|
$tgico-reactions: "\e986"; |
||||||
|
$tgico-readchats: "\e987"; |
||||||
|
$tgico-recent: "\e988"; |
||||||
|
$tgico-replace: "\e989"; |
||||||
|
$tgico-reply: "\e98a"; |
||||||
|
$tgico-reply_filled: "\e98b"; |
||||||
|
$tgico-rightpanel: "\e98c"; |
||||||
|
$tgico-saved: "\e98d"; |
||||||
|
$tgico-savedmessages: "\e98e"; |
||||||
|
$tgico-schedule: "\e98f"; |
||||||
|
$tgico-scheduled: "\e990"; |
||||||
|
$tgico-search: "\e991"; |
||||||
|
$tgico-select: "\e992"; |
||||||
|
$tgico-send: "\e993"; |
||||||
|
$tgico-send2: "\e994"; |
||||||
|
$tgico-sending: "\e995"; |
||||||
|
$tgico-sendingerror: "\e996"; |
||||||
|
$tgico-settings: "\e997"; |
||||||
|
$tgico-settings_filled: "\e998"; |
||||||
|
$tgico-sharescreen_filled: "\e999"; |
||||||
|
$tgico-smallscreen: "\e99a"; |
||||||
|
$tgico-smile: "\e99b"; |
||||||
|
$tgico-spoiler: "\e99c"; |
||||||
|
$tgico-sport: "\e99d"; |
||||||
|
$tgico-stickers: "\e99e"; |
||||||
|
$tgico-stop: "\e99f"; |
||||||
|
$tgico-strikethrough: "\e9a0"; |
||||||
|
$tgico-textedit: "\e9a1"; |
||||||
|
$tgico-tip: "\e9a2"; |
||||||
|
$tgico-tools: "\e9a3"; |
||||||
|
$tgico-unarchive: "\e9a4"; |
||||||
|
$tgico-underline: "\e9a5"; |
||||||
|
$tgico-unmute: "\e9a6"; |
||||||
|
$tgico-unpin: "\e9a7"; |
||||||
|
$tgico-unread: "\e9a8"; |
||||||
|
$tgico-up: "\e9a9"; |
||||||
|
$tgico-user: "\e9aa"; |
||||||
|
$tgico-username: "\e9ab"; |
||||||
|
$tgico-videocamera: "\e9ac"; |
||||||
|
$tgico-videocamera_filled: "\e9ad"; |
||||||
|
$tgico-videochat: "\e9ae"; |
||||||
|
$tgico-volume_down: "\e9af"; |
||||||
|
$tgico-volume_mute: "\e9b0"; |
||||||
|
$tgico-volume_off: "\e9b1"; |
||||||
|
$tgico-volume_up: "\e9b2"; |
||||||
|
$tgico-zoomin: "\e9b3"; |
||||||
|
$tgico-zoomout: "\e9b4"; |
||||||
|
|
Loading…
Reference in new issue