Skip to content

internal: css guide#2255

Merged
ArthurStam merged 8 commits intomasterfrom
css-guideline
Feb 25, 2022
Merged

internal: css guide#2255
ArthurStam merged 8 commits intomasterfrom
css-guideline

Conversation

@ArthurStam
Copy link
Copy Markdown
Contributor

No description provided.

@ArthurStam ArthurStam requested a review from a team as a code owner February 16, 2022 14:47
@codesandbox-ci
Copy link
Copy Markdown

codesandbox-ci bot commented Feb 16, 2022

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

Latest deployment of this branch, based on commit f8ddb75:

Sandbox Source
VKUI - default example Configuration

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Feb 16, 2022

size-limit report 📦

Path Size
JS 63.45 KB (0%)
JS, unstable 25.11 KB (0%)
CSS 40.2 KB (0%)
CSS, unstable 1003 B (0%)

@github-actions
Copy link
Copy Markdown
Contributor

👀 Styleguide deployed

See the styleguide for this PR at https://vkcom.github.io/VKUI/pull/2255/

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Feb 16, 2022

Code coverage

lines3214 / 402579.85%
statements3271 / 409779.83%
functions728 / 88582.25%
branches2697 / 377471.46%
branchesTrue0 / 0100.00%

Generated by 🚫 dangerJS against f8ddb75

Copy link
Copy Markdown
Contributor

@eugpoloz eugpoloz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Этот гайд планируется отдельным файлом? Он выглядит как штука, которой место в CONTRIBUTING.md. Как минимум в части соглашений и связности стилей.

А если нет, то гайдов чот много становится (тестирование, токены, вот этот), я бы их сложила уже в одну папку какую-нибудь. Для порядка!

margin-right: 10px;
}

.Cell .Avatar {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вот такого вида стили надо перекидывать в файл компонента, к которому они применяются (Avatar.css). Мы не знаем, в каком порядке стили подключаются, и не можем его гарантировать — следовательно, не можем контролировать каскад. Эта проблема уходит, если мы положим все стили про Avatar в Avatar.css.

.Icon — единственное исключение, потому что для .Icon у нас нет своего файла стилей (и вообще они тащатся из другой репы).

Copy link
Copy Markdown
Contributor

@inomdzhon inomdzhon Feb 16, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А это реальный пример, кстати?...

Для Avatar мы выставляем 10px отступ, а для Icon 8px

Такая тема затрудняет, конечно, реализацию решений, которые я в рабочем чате предложил

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, у нас есть такие компоненты. Counter сам по себе и Counter внутри Button можно чекнуть, например.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Глянул
Хм, а что если через реактовский контекст рулить такие вещи?
У меня сейчас есть такая идея для ButtonGroup

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вот такого вида стили надо перекидывать в файл компонента, к которому они применяются (Avatar.css). Мы не знаем, в каком порядке стили подключаются, и не можем его гарантировать — следовательно, не можем контролировать каскад. Эта проблема уходит, если мы положим все стили про Avatar в Avatar.css.

.Icon — единственное исключение, потому что для .Icon у нас нет своего файла стилей (и вообще они тащатся из другой репы).

Если на .Avatar в Avatar.css не будет собственного margin, то по сути неважно, где размещать эти стили.

CSS_GUIDE.md Outdated

Не обращаться к элементам другого блока

## Куда мы движемся
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нужен ли здесь этот раздел? Кажется, что сейчас это просто гайд для разработчиков, а тут как будто описаны планы на будущее, которые мы стопудово будем забывать подправлять. 😏

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

С учетом что мы пока не движемся туда, куда там написано, то этот раздел правда не нужен.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Окей, согласен, унесу в другое место.

CSS_GUIDE.md Outdated
конечный пользователь грузил стили только используемых компонент
- Переезд на css-modules и отказ от БЭМ-нотации
- Отказ от обращений из одного блока к другому
- Хэширование классов
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно еще выше накинуть как рекомендацию, мол, делайте названия классов понятными, но не слишком длинными, потому что пока мы живем без хэширования классов, они влияют на вес css бандла.)))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут тоже нужно понять влияет ли это вообще на что-то. Гзип нормально должен справиться с обычными классами. Нужно понять, какие конкретно эффекты получим

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@NekR про размер, возможно, это экономия на спичках, тут нужны цифры до и после, а вот то, что это исключит манию завязаться на тот или иной класс, хорошо

Каждый раз, когда кто-то завязывается на класс с префиксом .vkui с целью манипуляций, увеличивает риск потенциальных багов

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сейчас кастомизация таким образом специально сделана. Вряд ли оно поддаётся однозначному хорошо или плохо

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

По поводу кастомизации нужно придти к тому, чтобы оперировать токенами
Напрямую изменять нежелательно

Усложнится миграция из одной версии на другую, т.к. вероятность изменения стилей выше, чем токена

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это нормально что юзерам нужно будет подправлять компоненты, так как библиотека никогда не угонится за дизайном и точно не покроет все продуктовые кейсы. Соответственно, когда разработчик в продукте пытается кастомизировать, он не должен бороться с библиотекой, а уметь максимально гибко поправить всё что ему нужно. Если это будет "полностью на токенах", то нужен будет токен на всё, даже на те css-свойсва которые мы не используем.

VKUI про стандартную сборку компонентов по дефолту и про гибкую кастомизацию когда это нужно, что бы удовлетворить всем потребностям продуктов.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ты предложил собрать варианты кастомизации в доке, вижу у документа уже есть зачатки. Но там пока про токены только говорится. Надо добавить информации про кастомизацию без токенов 🤔

CSS_GUIDE.md Outdated

```tsx
// Cell.tsx
<div className="Cell">
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<div className="Cell">
<div vkuiClass="Cell">

CSS_GUIDE.md Outdated

```tsx
// Button.tsx
<button vkuiclass="Button">
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<button vkuiclass="Button">
<button vkuiClass="Button">

CSS_GUIDE.md Outdated
```tsx
// Button.tsx
<button vkuiclass="Button">
<Text vkuiclass="Button__text">{children}</Text>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<Text vkuiclass="Button__text">{children}</Text>
<Text vkuiClass="Button__text">{children}</Text>

@stoope
Copy link
Copy Markdown
Contributor

stoope commented Feb 16, 2022

Нужно упомянуть что для разделения слов используем kebab case

CSS_GUIDE.md Outdated
конечный пользователь грузил стили только используемых компонент
- Переезд на css-modules и отказ от БЭМ-нотации
- Отказ от обращений из одного блока к другому
- Хэширование классов
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Переезд на css-modules и отказ от БЭМ-нотации уже включает в себя пункт Хэширование

CSS_GUIDE.md Outdated

- Предлагаем помимо `vkui.css` и `components.css` альтернативу, в которой стили компонента подключаются в `.js`, чтобы
конечный пользователь грузил стили только используемых компонент
- Переезд на css-modules и отказ от БЭМ-нотации
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Подумала и поняла, что мне не нравится пункт про отказ от БЭМ-нотации. Мы, по идее, будем продолжать писать внятные классы (если не уйдем на некий css-in-js, видимо), хотелось бы текущую нотацию оставить.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем писать тяжеловесный .ModalCard__long-inner-element, если пропадает риск коллизиий? Можно просто оставить .long-inner-element и мы вроде ничего не потеряем и нигде не огребем.

Copy link
Copy Markdown
Contributor

@inomdzhon inomdzhon Feb 21, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ArthurStam формулировка "отказ от БЭМ-нотаций" звучит радикально
Так или иначе даже при подходе CSS Modules или CSS-in-JS, для DX, надо будет придерживаться соглашения по именования

Например, БЭМ нормально дружит в CSS Modules, просто исчезнет необходимость писать название компонента ручками

Я вот так делал

/* Корневой элемент */
.host { }

.host_color_accent { }

/* Потомки */
.someItem { } /* camelCase для составных имен */

.someItem_fullWidth { }

.someItem_disabled { }

.icon { }

.icon_size_small { }

.host_color_accent .icon { }
import classes from './Example.module.pcss';

const hostColorClasses = {
  accent: classes.host_color_accent,
};

const iconSizeClasses = {
  small: classes.icons_size_small,
};

const Example = ({ className, color = 'accent', iconSize = 'small', disabled, ...restProps }) => {
  return (
    <div className={className(classes.host, hostColorClasses[color], className)} {...restProps}>
     <div className={classNames(classes.someItem, disabled && classes.someItem_disabled)}></div>
     <img src="" className={className(classes.icon, iconSizeClasses[iconSize])} />
   </div>
  );
};

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я не предлагал сеять хаос в именах классов. Речь шла только об отказе от необходимости дописывать всем селекторам имена блоков и элементов.

@ArthurStam ArthurStam merged commit a5262c4 into master Feb 25, 2022
@ArthurStam ArthurStam deleted the css-guideline branch February 25, 2022 11:03
- Элемент от блока отделяется двумя подчеркиваниями: `.Checkbox__in`
- Многословные элементы разделяются через kebab-case: `.Banner__before-title`
- Модификатор отделяется двумя дефисами: `.Input--plain`
- Многословные модификаторы разделяются через kebab-case или camelCase: `.Checkbox--sizeX-regular`
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Может для составных имён всегда использовать camelCase, а kebab-case использовать для <key>-<value> модификаторов?

Вот так описать

Suggested change
- Многословные модификаторы разделяются через kebab-case или camelCase: `.Checkbox--sizeX-regular`
- Модификаторы отделяется двумя дефисами и бывают двух типов:
- `<key>-<value>`, например, `Comp--sizeX-regular`
- `boolean`, например, `Comp--disabled`

@inomdzhon inomdzhon mentioned this pull request Jun 3, 2022
5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants