Skip to content

docs: "Руководство по созданию core компонентов"#2486

Merged
Yakutoc merged 1 commit intodevfrom
docs-how-to-create-core-component
Apr 6, 2026
Merged

docs: "Руководство по созданию core компонентов"#2486
Yakutoc merged 1 commit intodevfrom
docs-how-to-create-core-component

Conversation

@Yakutoc
Copy link
Copy Markdown
Collaborator

@Yakutoc Yakutoc commented Feb 10, 2026

What/why changed

📦 Published PR as canary version: Canary Versions

✨ Test out this PR locally via:

npm install @salutejs/plasma-asdk@0.371.1-canary.2486.24026967213.0
npm install @salutejs/plasma-b2c@1.613.1-canary.2486.24026967213.0
npm install @salutejs/plasma-core@1.222.1-canary.2486.24026967213.0
npm install @salutejs/plasma-giga@0.340.1-canary.2486.24026967213.0
npm install @salutejs/plasma-homeds@0.340.1-canary.2486.24026967213.0
npm install @salutejs/plasma-hope@1.368.1-canary.2486.24026967213.0
npm install @salutejs/plasma-icons@1.234.1-canary.2486.24026967213.0
npm install @salutejs/plasma-new-hope@0.357.1-canary.2486.24026967213.0
npm install @salutejs/plasma-tokens@1.134.1-canary.2486.24026967213.0
npm install @salutejs/plasma-ui@1.344.1-canary.2486.24026967213.0
npm install @salutejs/plasma-web@1.615.1-canary.2486.24026967213.0
npm install @salutejs/sdds-bizcom@0.345.1-canary.2486.24026967213.0
npm install @salutejs/sdds-cs@0.349.1-canary.2486.24026967213.0
npm install @salutejs/sdds-dfa@0.343.1-canary.2486.24026967213.0
npm install @salutejs/sdds-finai@0.336.1-canary.2486.24026967213.0
npm install @salutejs/sdds-insol@0.340.1-canary.2486.24026967213.0
npm install @salutejs/sdds-netology@0.344.1-canary.2486.24026967213.0
npm install @salutejs/sdds-os@0.15.1-canary.2486.24026967213.0
npm install @salutejs/sdds-platform-ai@0.344.1-canary.2486.24026967213.0
npm install @salutejs/sdds-sbcom@0.344.1-canary.2486.24026967213.0
npm install @salutejs/sdds-scan@0.343.1-canary.2486.24026967213.0
npm install @salutejs/sdds-serv@0.344.1-canary.2486.24026967213.0
npm install @salutejs/plasma-themes@0.46.1-canary.2486.24026967213.0
npm install @salutejs/sdds-themes@0.61.1-canary.2486.24026967213.0
npm install @salutejs/sdds-api-tests@0.2.1-canary.2486.24026967213.0
npm install @salutejs/plasma-cy-utils@0.152.1-canary.2486.24026967213.0
npm install @salutejs/plasma-sb-utils@0.222.1-canary.2486.24026967213.0
# or 
yarn add @salutejs/plasma-asdk@0.371.1-canary.2486.24026967213.0
yarn add @salutejs/plasma-b2c@1.613.1-canary.2486.24026967213.0
yarn add @salutejs/plasma-core@1.222.1-canary.2486.24026967213.0
yarn add @salutejs/plasma-giga@0.340.1-canary.2486.24026967213.0
yarn add @salutejs/plasma-homeds@0.340.1-canary.2486.24026967213.0
yarn add @salutejs/plasma-hope@1.368.1-canary.2486.24026967213.0
yarn add @salutejs/plasma-icons@1.234.1-canary.2486.24026967213.0
yarn add @salutejs/plasma-new-hope@0.357.1-canary.2486.24026967213.0
yarn add @salutejs/plasma-tokens@1.134.1-canary.2486.24026967213.0
yarn add @salutejs/plasma-ui@1.344.1-canary.2486.24026967213.0
yarn add @salutejs/plasma-web@1.615.1-canary.2486.24026967213.0
yarn add @salutejs/sdds-bizcom@0.345.1-canary.2486.24026967213.0
yarn add @salutejs/sdds-cs@0.349.1-canary.2486.24026967213.0
yarn add @salutejs/sdds-dfa@0.343.1-canary.2486.24026967213.0
yarn add @salutejs/sdds-finai@0.336.1-canary.2486.24026967213.0
yarn add @salutejs/sdds-insol@0.340.1-canary.2486.24026967213.0
yarn add @salutejs/sdds-netology@0.344.1-canary.2486.24026967213.0
yarn add @salutejs/sdds-os@0.15.1-canary.2486.24026967213.0
yarn add @salutejs/sdds-platform-ai@0.344.1-canary.2486.24026967213.0
yarn add @salutejs/sdds-sbcom@0.344.1-canary.2486.24026967213.0
yarn add @salutejs/sdds-scan@0.343.1-canary.2486.24026967213.0
yarn add @salutejs/sdds-serv@0.344.1-canary.2486.24026967213.0
yarn add @salutejs/plasma-themes@0.46.1-canary.2486.24026967213.0
yarn add @salutejs/sdds-themes@0.61.1-canary.2486.24026967213.0
yarn add @salutejs/sdds-api-tests@0.2.1-canary.2486.24026967213.0
yarn add @salutejs/plasma-cy-utils@0.152.1-canary.2486.24026967213.0
yarn add @salutejs/plasma-sb-utils@0.222.1-canary.2486.24026967213.0

@Yakutoc Yakutoc self-assigned this Feb 10, 2026
@Yakutoc Yakutoc added plasma-docs Improvements or additions to documentation changelog-skip Exclude pull request changes from changelog labels Feb 10, 2026
Comment thread docs/how-to-create-core-component.md Outdated
└── base.ts
```

> **Примечание:** В вариациях могут присутствовать файлы `tokens.json` — они опциональны и используются для документирования, не влияют на работу компонента.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[note]: Вот тут не смог для себя вывести правило.

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.

@neretin-trike подскажи, будет ли это использоваться для билдера? Если нет, то такие файлы - рудемент

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

можно удалять, да

@github-actions
Copy link
Copy Markdown
Contributor

Theme Builder app deployed!

https://plasma.sberdevices.ru/pr/plasma-theme-builder-pr-2486/

Comment thread docs/how-to-create-core-component.md Outdated

Файл `MyComponent.tsx` — содержит layout-функцию (JSX-структуру) и конфигурацию компонента.

- **`RootProps<RefElement, Props>`** — тип из `../../engines`, описывающий корневой React-компонент, который engine создаёт на основе конфигурации. Первый параметр — тип HTML-элемента (должен соответствовать `tag` в конфигурации), второй — тип пропсов компонента.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[Note]: для RootProps тоже кажется можно лучше написать.

};
```

Приватные токены:
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[Note]: на сколько это "наш" путь, мы действительно так пишем и хотим продолжать?

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.

Да, это удобнее, чем по нескольким файлам строки со значениями токенов сверять

@Yakutoc Yakutoc marked this pull request as ready for review February 10, 2026 05:12
@Yakutoc Yakutoc removed the request for review from Yeti-or February 10, 2026 05:12
Comment thread docs/how-to-create-core-component.md Outdated
Файл `MyComponent.tsx` — содержит layout-функцию (JSX-структуру) и конфигурацию компонента.

- **`RootProps<RefElement, Props>`** — тип из `../../engines`, описывающий корневой React-компонент, который engine создаёт на основе конфигурации. Первый параметр — тип HTML-элемента (должен соответствовать `tag` в конфигурации), второй — тип пропсов компонента.
- **`cx(...classes)`** — утилита из `../../utils`, аналог `classnames`/`clsx`. Объединяет строки и условные классы: `cx('a', false && 'b', 'c')` → `'a c'`.
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.

Лишнее, надо убрать. Мы используем classnames


---

### 8. Соберите компонент в вертикали
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.

Кажется нужно описать еще компонент, у которого есть несколько конфигов и как через createConditionalComponent делать

Comment thread docs/how-to-create-core-component.md Outdated

```
┌─────────────────────────────────────────────────────────────┐
│ Вертикали (15 брендов) │
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.

Может просто вертикали? Зачем тут динамическое количество брендов?

Comment thread docs/how-to-create-core-component.md Outdated
│ sdds-serv, plasma-web, plasma-b2c, ... │
│ ───────────────────────────────────────────────────────── │
│ • Токены (цвета, размеры, отступы) │
│ • Вариации view/size с конкретными значениями │
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
│ • Вариации view/size с конкретными значениями │
│ • Вариации (view, size, ...) с конкретными значениями │

Comment thread docs/how-to-create-core-component.md Outdated
Comment on lines +49 to +57
│ component()
┌─────────────────────────────────────────────────────────────┐
│ Engines (движки) │
│ ───────────────────────────────────────────────────────── │
│ • Linaria (по умолчанию) │
│ • Emotion │
│ • styled-components │
└─────────────────────────────────────────────────────────────┘
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.

Меня этот бы сбил с толку, т.к. это точно не отдельная сущность, от которой зависит new-hope. Лучше вообще убрать и в ядре добавить пункт про различные поставки.

Comment thread docs/how-to-create-core-component.md Outdated

```
MyComponent/
├── index.ts # Публичный API компонента
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
├── index.ts # Публичный API компонента
├── index.ts # Экспорт компонента из ядра

Comment thread docs/how-to-create-core-component.md Outdated
Comment thread docs/how-to-create-core-component.md Outdated
Comment on lines +630 to +645
// variations/_size/base.ts
import { ContentBefore, Title } from '../../MyComponent.styles';

export const base = css`
padding: var(${tokens.padding});

/* Стилизация styled-компонентов */
${ContentBefore} {
color: var(${tokens.contentBeforeColor});
}

${Title} {
font-size: var(${tokens.titleFontSize});
}
`;
```
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.

А хотя лучше вообще удалить, не думаю что стоит описывать настолько тонкие моменты стилизации

negative: css`...`,
},
},
intersections: [
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
Collaborator

@neretin-trike neretin-trike Feb 12, 2026

Choose a reason for hiding this comment

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

довольно давно, и это уже работает

Comment thread docs/how-to-create-core-component.md Outdated

Для компонентов с под-компонентами используйте:

- `components/` — составные части, которые экспортируются наружу
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.

снова может сбить с толку, components внутри components. Я например не юзаю components внутри, у меня везде ui

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.

Я еще видимо не понял что такое под-компоненты? Если речь про заимствование других комп из ядра, то это в разделе ниже про композицию.


---

## Checklist перед PR
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.

МОжно еще куда то впихнуть ссылку на кодгайд #1215

Comment thread docs/how-to-create-core-component.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.

Suggested change
## Частые вопросы и проблемы
## FAQ

- **Ядро (`plasma-new-hope`)** — содержит логику, структуру и CSS-переменные компонентов
- **Вертикаль** — библиотека/пакет для конкретного бренда/продукта (sdds-serv, plasma-giga и т.д.)
- **Токены** — CSS-переменные, которые определяют внешний вид
- **Variations** — набор стилей для разных значений пропсов (view, size, disabled)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

disabled убрать бы

- **Variations** — набор стилей для разных значений пропсов (view, size, disabled)
- **mergeConfig** — функция слияния конфигурации ядра с конфигурацией вертикали
- **component** — фабрика, создающая React-компонент из конфигурации

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

добавить пример со "Стилями" (primary, secondary, s, xl и т.д.)

| `size` | Размер (xs, s, m, l, xl) |
| `disabled` | Неактивное состояние |
| `focused` | Состояние фокуса |

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

тут тоже убрать disabled / focus

- [Button (простой)](../../packages/plasma-new-hope/src/components/Button/) — базовый пример
- [Note (средний)](../../packages/plasma-new-hope/src/components/Note/) — с ContentBefore и hasClose
- [Attach (сложный)](../../packages/plasma-new-hope/src/components/Attach/) — с подкомпонентами и ui/
- [Button в вертикали](../../packages/sdds-serv/src/components/Button/)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Это в отдельных будет md файлах лежать. А тут будут ссылки на них

@Yakutoc Yakutoc force-pushed the docs-how-to-create-core-component branch from 32a3017 to a5a26fd Compare April 6, 2026 09:40
@Yakutoc Yakutoc merged commit 81e4c7e into dev Apr 6, 2026
10 checks passed
@Yakutoc Yakutoc deleted the docs-how-to-create-core-component branch April 6, 2026 10:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

changelog-skip Exclude pull request changes from changelog plasma-docs Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants