vkcom / icons Goto Github PK
View Code? Open in Web Editor NEWНабор SVG иконок, представленный в виде React компонентов.
Home Page: https://vkcom.github.io/icons/
License: MIT License
Набор SVG иконок, представленный в виде React компонентов.
Home Page: https://vkcom.github.io/icons/
License: MIT License
Сейчас копируется import { Icon16Add } from '@vkontakte/icons';
, хочется уметь копировать только Icon16Add
.
Предлагаю сделать возможным импортировать xml для корректной работы, например, в React Native предпочтительны такие типы. С Гита устаешь копировать код
Товарищи, это же SVG иконки. Было бы круто, если бы можно было передать также размер иконки и она автоматически меняла бы свой размер. В векторной графике это не должно быть сложно, зато можно отказаться от этих странных импортов по размерам.
Собираю набор иконок под свой сервис (чтоб не нарушать принцип использования иконок решил под основу взять этот проект). Проблема в том что dist остается пустым после билда на windows а на linux выдает ошибку при билде.
yarn build
yarn run v1.22.5
$ yarn icons-build && yarn docs
$ node scripts/icons.js && yarn icons-build-cjs && yarn icons-build-es6 && rm -rf tmp
generating icons...
icons successfully generated in dist!
$ yarn icons-tsc && yarn icons-babel
$ NODE_ENV=production tsc --emitDeclarationOnly --declaration --project tsconfig-icons.json --outDir dist/
Killed
error Command failed with exit code 137.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
error Command failed with exit code 137.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
error Command failed with exit code 137.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
error Command failed with exit code 137.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Зависимости установил.
Нода 14.11.0
yarn 1.22.5
(ничего не менял и не добавлял... как скопировал с гита так и пытаюсь билдить)
Возможно, что-то не то делаю. Буду благодарен за помощь!
Проблема
Исторически, svg-иконка обернута в div
. Из-за этого, когда иконка попадает в инлайновый элемент (a
, button
, span
, etc.), нарушается семантика дерева.
Решения
div
с помощью свойства Component
. Плюсы: простое решение. Минусы: ухудшается DX.div
на span
и динамически генерировать тег style
с .Icon { display: 'block' }
(div
по умолчанию блочный и мы должны сохранить эту блочность). Плюсы: DX остаётся на прежнем уровне. Минусы: технически сложное решение.svg
. Плюсы: DX остаётся на прежнем уровне, компонент становится проще. Минусы: что-то может пойти не так.Опечатка в названии иконки ghost_simle_outline_28.
Скорее всего, вместо simle должно быть написано simple
Коротко, одна и та же иконка в разных размерах имеет внушительно отличимый размер на выходе.
Взять к примеру иконки key_outline_20 и key_outline_24, весовой размер первой иконки в 2.32 раза больше второй, хотя по визуальному размеру это должно быть наоборот.
key_outline_20 = 1268 символов для элемента symbol
key_outline_24 = 545 символов для элемента symbol
favorite: { '12': 909, '16': 982, '20': 984, '24': 420, '28': 314, '36': 323 }
flash: { '12': 538, '16': 328, '20': 393, '24': 418, '28': 347 },
gift: { '12': 782, '16': 726, '24': 371, '28': 664, '32': 511, '36': 413 },
market: { '12': 1077, '16': 1096, '24': 1066, '36': 289 },
mention: { '12': 854, '16': 845, '24': 1762, '28': 1740 },
money_circle: { '12': 817, '16': 761, '24': 576 },
services: { '12': 1384, '16': 1382, '24': 560, '28': 1502, '48': 453 },
story: { '12': 469, '16': 726, '20': 769, '24': 603, '28': 429, '36': 630, '48': 1058 },
archive_outline: { '16': 1145, '20': 1526, '24': 591, '28': 1498, '56': 526 },
building_outline: { '16': 2534, '24': 3967, '28': 4026, '36': 4439, '56': 4396 },
check_square_outline: { '16': 1321, '20': 1056, '24': 1323, '28': 1093 },
comment_outline: { '16': 1111, '20': 1200, '24': 1056, '28': 608, '56': 1361 },
copy_outline: { '16': 1369, '20': 1583, '24': 1692, '28': 439 },
crop: { '16': 261, '24': 787, '28': 506, '32': 772 },
crop_outline: { '16': 882, '20': 385 },
error_circle_outline: { '16': 278, '20': 252, '24': 611, '28': 553, '32': 858 },
euro_outline: { '16': 432, '20': 354, '24': 474, '28': 653 },
favorite_outline: { '16': 2194, '20': 2211, '24': 671, '28': 642, '36': 757, '56': 1996 },
game: { '16': 418, '24': 838, '28': 988, '48': 698 },
gift_outline: { '16': 1830, '20': 1499, '24': 1121, '28': 1654, '32': 1660, '36': 1877, '44': 1695, '56': 1571 },
hand_heart_filled: { '16': 994, '24': 2156, '28': 1181 },
hand_outline: { '16': 748, '24': 1202 },
headphones_outline: { '16': 346, '28': 566, '56': 372 },
help_outline: { '16': 548, '20': 489, '24': 885, '28': 888, '36': 711, '56': 665 },
hide_outline: { '16': 814, '20': 843, '24': 1009, '28': 668, '48': 1298, '56': 989 },
image_filter: { '16': 373, '32': 784 },
info_outline: { '16': 255, '28': 647, '56': 412 },
key_outline: { '16': 1125, '20': 1268, '24': 545, '28': 446, '56': 1789 },
list_letter_outline: { '16': 762, '20': 1171, '24': 1157, '28': 1191 },
list_number_outline: { '16': 692, '20': 1307, '24': 1250, '28': 1289 },
list_play_outline: { '16': 396, '20': 506, '28': 267, '36': 432, '56': 590 },
lock_outline: { '16': 946, '20': 1150, '24': 1430, '28': 1002, '36': 1400, '56': 1431 },
mail_outline: { '16': 1233, '20': 1072, '24': 1507, '28': 997, '36': 1325, '56': 1283 },
market_outline: { '16': 369, '20': 1147, '24': 1447, '28': 971, '36': 1062, '56': 1633 },
menu_outline: { '16': 265, '20': 315, '24': 155, '28': 134 },
money_circle_outline: { '16': 670, '20': 385, '24': 810, '28': 637, '36': 803 },
more_vertical: { '16': 274, '20': 165, '24': 254, '28': 189 },
music: { '16': 858, '24': 603, '28': 648, '32': 634, '36': 543 },
newsfeed_outline: { '16': 1210, '20': 1235, '24': 837, '28': 884, '48': 261, '56': 1215 },
notification: { '16': 606, '24': 421, '28': 338 },
palette_outline: { '16': 672, '24': 1020, '28': 817, '56': 727 },
pause_circle: { '16': 185, '20': 681, '24': 810, '28': 321, '32': 748, '40': 805 },
pen_outline: { '16': 1201, '24': 448 },
qr_code: { '16': 4609 }, qr: { '24': 1392 },
Полный файл со всеми размерами:
sizes.json
Ребята, серьезно? Вы предлагаете тянуть всю эту шапку webpack для каждой иконки? Намного логичнее было бы использовать что-то типа rollup для каждой иконки, тогда оверхед будет минимальным.
Иконка называется
import Icon28Notifications from '@vkontakte/icons/dist/28/notifications';
а должна
import Icon28NotificationOutline from '@vkontakte/icons/dist/28/notification_outline';
I don't understand why the heck there's different sets of icons by size.
Why not make all icons with size of 24dp? It'll be easier to maintain and use.
Будет гораздо удобней, если иконки будут импортироваться таким образом.
import { Icon24Like } from '@vkontakte/icons';
У иконок размеры width
и height
зашиты в пикселях. Если нам необходимо изменить масштаб, то нам нужно прибегать к передаче width
и height
- <Icon24ExternalLinkOutline />
+ <Icon24ExternalLinkOutline width={16} height={16} />
Это не слишком удобно. К тому же некоторые иконки имеют разную пропорцию, например у https://vkcom.github.io/icons/#16/more_vertical width={8}
и height={16}
, что добавляет дополнительные сложности.
Бывает есть иконка в тексте (см. Рис. 1)
Рис. 1. Пример иконки в предложении
в нашем случае мы должны узнать размер шрифта и задать его иконке через параметры в JS. А если текст меняет свой размер при определенном параметре, то нам ещё потребуется и в JS слушать изменение ширины окна.
В принципе в VKUI уже есть кейсы, где мы завязываемся на изменение ширины в JS для изменения размера иконки, пример по ссылке.
Чтобы можно было переопределять размеры иконок со следующими преимуществами:
во-первых, предлагаю заменить в width
и height
единицы px
на em
, а размер задавать через font-size
.
<Icon24ExternalLinkOutline />
это будет выглядеть так
<div style="width: 1em; height: 1em; font-size: 24px;">
<svg width="1em" height="1em" viewBox="0 0 24 24">...</svg>
</div>
<Icon16MoreVertical />
это будет
<div style="width: 0.5em; height: 1em; font-size: 16px;">
<svg width="0.5em" height="1em" viewBox="0 0 8 16">...</svg>
</div>
это будет обратно совместимые изменение.
Во-вторых, добавить параметр fontSize
, который принимает все валидные для font-size
значения. Это для того, чтобы можно было писать
<Icon24ExternalLinkOutline fontSize="inherit" />
=>
<div style="width: 1em; height: 1em">
<svg width="1em" height="1em" viewBox="0 0 24 24">...</svg>
</div>
и тогда иконка впишется по размерам в текст, а в компонентах можно будет менять её размер через font-size
в CSS.
em
для размеров SVG.Icons
)Title says everything. We need typings for typescripts. Otherwise, we are unable to use this repo in TypeScript projects.
Почему она вообще называется Circle если её братья просто Info.
Сейчас есть только dropdown_20.
В фигме присутствует: https://www.figma.com/file/sVARvsqs7Npc84xaHlniX7/VKUI-Base-Library?node-id=8974%3A421
Точнее, с иконкой аж две проблемы.
Первая - опечатка в названии иконки - Icon16ClockOurline (очевидно, должно быть Icon16ClockOutline)
Вторая - эта иконка должна быть квадратной (16х16 пикс.), но она почему-то по ширине на один пиксель больше, чем требуется. Пофиксил проблему с помощью margin-right:-1px , но это конечно такое себе решение.
Использую следующие версии библиотек:
@vkontakte/icons - 1.49.0
@vkontakte/vkui - 4.0.8
На данный момент у иконки используется класс Icon. Он может перебиваться стилями со страницы. Если уж используется css-modules, то можно использовать какой-то генерированный класс для иконок.
Было бы удобно дать возможность добавлять и использовать в библиотеке иконки под отдельные платформы, как сейчас, это сделано в VKUI.
К сожалению, на данный момент, для отдельных платформ/сервисов иконки приходится хранить либо в самом проекте, либо устанавливать отдельные дополнительные репозитории с ними. Это ухудшает общую архитектуру проектов, приводит к разным подходам подключения и хранения иконок в них.
https://github.com/VKCOM/icons/blob/master/src/svg/24/chevron_16.svg
предлагаю удалить данный файл с папки svg/24
Добавить информацию про новую опцию deprecatedIcons
в generateIcons
Перехожу в директорию https://github.com/VKCOM/icons/tree/master/src/svg/28, нахожу incognito_outline_28.svg, при импорте в photoshop, пустая картинка, однако при импорте других иконок таким способом, проблем не обнаружено.
Are you planning to bump supported React to v18? Right now you have 16 || 17
in your package.json
(package works as expected if I install with --legacy-peer-deps
flag)
Иногда необходимо перебирать названия чтобы найти нужную иконку.
Необходимо добавить алиасы для названий иконок и Левенштейна
Вчера эту иконку убрали и заменили на новую галочку верификации. Новую убирать не нужно, можно, например, вернуть старую иконку галочки VK и назвать, например, old_verified.
import React from 'react';
import Icon from '@vkontakte/icons/dist/36/like';
...
render() {
...
<Icon />
...
}
will throw
ReferenceError: document is not defined
at BrowserSprite._autoConfigure (/Users/markel/Desktop/react-starter-kit/node_modules/svg-baker-runtime/browser-sprite.js:761:43)
at new BrowserSprite (/Users/markel/Desktop/react-starter-kit/node_modules/svg-baker-runtime/browser-sprite.js:695:12)
....
I haven't got much experience svg-baker-runtime, but I suppose 'svg-baker-runtime/browser-sprite' should be replaced.
For now I can use it like this:
import React from 'react';
import Icon from '@vkontakte/icons/dist/36/like';
...
render() {
...
{typeof window !== 'undefined' && <Icon />}
...
}
Что мозолит глаза.
Добрый день, все было нормально, пока не установил новую версию vk icon
node_modules/@vkontakte/icons/dist/es6/12/add_12.js (1:0) Module level directives cause errors when bundled, "use-client" in "node_modules/@vkontakte/icons/dist/es6/12/add_12.js" was ignored.
node_modules/@vkontakte/icons/dist/es6/12/album_filled_12.js (1:0) Module level directives cause errors when bundled, "use-client" in "node_modules/@vkontakte/icons/dist/es6/12/album_filled_12.js" was ignored.
node_modules/@vkontakte/icons/dist/es6/12/arrow_down_12.js (1:0) Module level directives cause errors when bundled, "use-client" in "node_modules/@vkontakte/icons/dist/es6/12/arrow_down_12.js" was ignored.
node_modules/@vkontakte/icons/dist/es6/12/arrow_up_12.js (1:0) Module level directives cause errors when bundled, "use-client" in "node_modules/@vkontakte/icons/dist/es6/12/arrow_up_12.js" was ignored.
node_modules/@vkontakte/icons/dist/es6/12/arrow_down_circle_12.js (1:0) Module level directives cause errors when bundled, "use-client" in "node_modules/@vkontakte/icons/dist/es6/12/arrow_down_circle_12.js" was ignored.
node_modules/@vkontakte/icons/dist/es6/12/arrow_right_12.js (1:0) Module level directives cause errors when bundled, "use-client" in "node_modules/@vkontakte/icons/dist/es6/12/arrow_right_12.js" was ignored. .... и т д
Я так понял, что в новой версии вы добавили 'use client' для корректного рендера иконок в Next.js 13 React Server Components, это как то влияет на биллинг там где нет Next.js?
Иконка mention_24 имеет высоту 34px и отцентрирована относительно этой высоты, что вызывает проблемы и жжение в определённых местах.
Иконка crown_28.svg имеет ширину 29
, вместо 28
Проблема:
Сейчас скрипты публикации пакетов в пре-релизы не умеют. 😉
Решение:
Пофиксить скрипты.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.