@cuby-ui/core 0.0.485 → 0.0.488

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +794 -13
  2. package/editor/editor.component.d.ts +1 -0
  3. package/editor/tools/combined-text-block.tool.d.ts +0 -1
  4. package/esm2022/components/card-wrapper/card-wrapper.component.mjs +2 -2
  5. package/esm2022/components/content-header/content-header.component.mjs +3 -3
  6. package/esm2022/components/dropdown/dropdown-wrapper.component.mjs +3 -3
  7. package/esm2022/components/sidebar/sidebar-header/sidebar-header.component.mjs +3 -3
  8. package/esm2022/components/tabs/components/abstract-tabs/abstract-tabs.component.mjs +3 -3
  9. package/esm2022/editor/components/editor-attaches-tool/editor-attaches-tool.component.mjs +3 -3
  10. package/esm2022/editor/editor.component.mjs +9 -1
  11. package/esm2022/editor/tools/combined-text-block.tool.mjs +9 -26
  12. package/esm2022/editor/widgets/editor-block/editor-block.component.mjs +3 -3
  13. package/esm2022/editor/widgets/editor-modal/editor-modal.component.mjs +3 -3
  14. package/esm2022/widgets/ui/assignee-role-item/assignee-role-item.component.mjs +3 -3
  15. package/esm2022/widgets/ui/assignee-roles-tabs/assignee-roles-tabs.component.mjs +3 -3
  16. package/esm2022/widgets/ui/button-change-theme/button-change-theme.component.mjs +3 -3
  17. package/esm2022/widgets/ui/categories/components/category-form/category-form.component.mjs +3 -3
  18. package/esm2022/widgets/ui/categories/components/category-item/category-item.component.mjs +3 -3
  19. package/esm2022/widgets/ui/checklist-block/checklist-block.component.mjs +3 -3
  20. package/esm2022/widgets/ui/checklist-block/components/checklist-block-list-item-evaluation-criteria/checklist-block-list-item-evaluation-criteria.component.mjs +3 -3
  21. package/esm2022/widgets/ui/circle-loader/circle-loader.component.mjs +3 -3
  22. package/esm2022/widgets/ui/consumable-form/components/consumable-form-item/consumable-form-item.component.mjs +3 -3
  23. package/esm2022/widgets/ui/consumable-form/components/consumable-form-item-readonly/consumable-form-item-readonly.component.mjs +3 -3
  24. package/esm2022/widgets/ui/consumable-form/consumable-form.component.mjs +3 -3
  25. package/esm2022/widgets/ui/delete-modal/delete-modal.component.mjs +3 -3
  26. package/esm2022/widgets/ui/framer-preview/framer-preview.component.mjs +3 -3
  27. package/esm2022/widgets/ui/inserted/inserted.component.mjs +3 -3
  28. package/esm2022/widgets/ui/modal-header-inserted-buttons/modal-header-inserted-buttons.component.mjs +3 -3
  29. package/esm2022/widgets/ui/modal-header-tabs/modal-header-tabs.component.mjs +3 -3
  30. package/esm2022/widgets/ui/resources-block/components/resources-block-content/resources-block-content.component.mjs +3 -3
  31. package/esm2022/widgets/ui/resources-block/components/resources-options/resources-options.component.mjs +3 -3
  32. package/esm2022/widgets/ui/resources-block/resources-block.component.mjs +3 -3
  33. package/esm2022/widgets/ui/toolbox-form/components/tool-form-readonly/tool-form-readonly.component.mjs +3 -3
  34. package/esm2022/widgets/ui/toolbox-form/tool-form.component.mjs +3 -3
  35. package/esm2022/widgets/ui/user-action-context-menu/activity-item/activity-item.component.mjs +3 -3
  36. package/esm2022/widgets/ui/user-action-context-menu/company-item/company-item.component.mjs +3 -3
  37. package/esm2022/widgets/ui/user-action-context-menu/user-action-context-menu.component.mjs +3 -3
  38. package/esm2022/widgets/ui/utility-modal/components/readonly-utility-modal/readonly-utility-modal.component.mjs +3 -3
  39. package/esm2022/widgets/ui/utility-modal/components/utility-modal-create/utility-modal-create.component.mjs +3 -3
  40. package/esm2022/widgets/ui/utility-thumbnail/utility-thumbnail.component.mjs +3 -3
  41. package/fesm2022/cuby-ui-core.mjs +85 -94
  42. package/fesm2022/cuby-ui-core.mjs.map +1 -1
  43. package/package.json +4 -4
  44. package/styles/mixins/flex.scss +5 -15
package/README.md CHANGED
@@ -1,25 +1,806 @@
1
- # Core
1
+ # Cuby UI - агентская документация (RU)
2
2
 
3
- This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 15.2.0.
3
+ Документ для кодовых агентов. Описывает публичный API пакета `@cuby-ui/core`, а также примеры использования.
4
4
 
5
- ## Code scaffolding
5
+ Критически важно:
6
+ - Оверлеи (`cui-dialogs`, `cui-alerts`, `cui-select`, `cui-context-menu`) требуют наличия `cui-root` в DOM.
7
+ - `open()` у `CuiAlertService` и `CuiDialogService` выполняется только после подписки на Observable.
6
8
 
7
- Run `ng generate component component-name --project core` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project core`.
9
+ ## Оглавление
10
+ - [Компоненты (Core)](#компоненты-core)
11
+ - [Директивы (Core)](#директивы-core)
12
+ - [Сервисы (Core)](#сервисы-core)
13
+ - [Интерфейсы и типы (Core)](#интерфейсы-и-типы-core)
14
+ - [Утилиты (Core)](#утилиты-core)
15
+ - [Темы и стили](#темы-и-стили)
16
+ - [Рецепты (How-to)](#рецепты-how-to)
17
+ - [Анти-паттерны](#анти-паттерны)
18
+ - [FAQ / типовые ошибки](#faq--типовые-ошибки)
19
+ - [Структура репозитория](#структура-репозитория)
20
+ - [Линт и форматирование](#линт-и-форматирование)
21
+ - [Версии и совместимость](#версии-и-совместимость)
8
22
 
9
- > Note: Don't forget to add `--project core` or else it will be added to the default project in your `angular.json` file.
23
+ ## Компоненты (Core)
10
24
 
11
- ## Build
25
+ ### Feature: CuiAccordionComponent (`cui-accordion`)
26
+ Описание: контейнер для набора `cui-accordion-item`, управляет только разметкой.
27
+ Публичный API:
28
+ - Модуль: `CuiAccordionModule`
29
+ - Inputs: нет
30
+ - Outputs: нет
31
+ Пример:
32
+ ```html
33
+ <cui-accordion>
34
+ <cui-accordion-item>Заголовок
35
+ <ng-container cuiAccordionItemContent>Контент</ng-container>
36
+ </cui-accordion-item>
37
+ </cui-accordion>
38
+ ```
12
39
 
13
- Run `ng build core` to build the project. The build artifacts will be stored in the `dist/` directory.
40
+ ### Feature: CuiAccordionItemComponent (`cui-accordion-item`)
41
+ Описание: элемент аккордеона с кнопкой переключения и скрываемым контентом.
42
+ Публичный API:
43
+ - Модуль: `CuiAccordionModule`
44
+ - Inputs: `isOpen: boolean` (по умолчанию `true`)
45
+ - Outputs: `isOpenChange: EventEmitter<boolean>`
46
+ - Контент: тело передается через `cuiAccordionItemContent`
47
+ Пример:
48
+ ```html
49
+ <cui-accordion-item [(isOpen)]="isOpen">
50
+ Заголовок
51
+ <ng-container cuiAccordionItemContent>Тело</ng-container>
52
+ </cui-accordion-item>
53
+ ```
14
54
 
15
- ## Publishing
55
+ ### Feature: CuiAlertService
56
+ Описание: сервис для показа алертов поверх UI, построен на `CuiPopoverService`.
57
+ Публичный API:
58
+ - Методы: `open(content: string, options?: Partial<CuiAlertOptions>)`, `closeAll()`
59
+ - Опции: `label`, `needAutoClose`, `isCloseable`, `position`, `resizing`, `status`, `mode`
60
+ - Типы: `CuiAlertOptions`, `CuiAlertPosition`, `CuiAlertResizing`
61
+ - Константы/токены: `CUI_ALERT_DEFAULT_OPTIONS`, `CUI_ALERT_OPTIONS`, `CUI_ALERTS`, `CUI_ALERT_CONTEXT`
62
+ Пример:
63
+ ```ts
64
+ const alerts = inject(CuiAlertService);
16
65
 
17
- After building your library with `ng build core`, go to the dist folder `cd dist/core` and run `npm publish`.
66
+ alerts.open('Задача создана', {
67
+ status: 'success',
68
+ label: 'Готово',
69
+ position: 'right',
70
+ }).subscribe();
71
+ ```
72
+ Пример (переопределение дефолтов):
73
+ ```ts
74
+ providers: [
75
+ { provide: CUI_ALERT_OPTIONS, useValue: { position: 'center', needAutoClose: false } }
76
+ ]
77
+ ```
18
78
 
19
- ## Running unit tests
79
+ ### Feature: CuiAlertsComponent (`cui-alerts`)
80
+ Описание: контейнер для отрисовки списка алертов. Обычно не нужен напрямую, используется в `cui-root`.
81
+ Публичный API:
82
+ - Модуль: `CuiAlertModule`
83
+ - Inputs/Outputs: нет
84
+ Пример:
85
+ ```html
86
+ <cui-alerts></cui-alerts>
87
+ ```
20
88
 
21
- Run `ng test core` to execute the unit tests via [Karma](https://karma-runner.github.io).
89
+ ### Feature: CuiAlertComponent (`cui-alert`)
90
+ Описание: рендер одного алерта, требует `CUI_ALERT_CONTEXT`. Обычно используется только контейнером.
91
+ Публичный API:
92
+ - Модуль: `CuiAlertModule`
93
+ - Inputs/Outputs: нет
94
+ Пример:
95
+ ```ts
96
+ providers: [{ provide: CUI_ALERT_CONTEXT, useValue: alertContext }]
97
+ ```
22
98
 
23
- ## Further help
99
+ ### Feature: CuiBadgeComponent (`cui-badge`)
100
+ Описание: бейдж с цветом, размером и опциональной точкой.
101
+ Публичный API:
102
+ - Модуль: `CuiBadgeModule`
103
+ - Inputs: `color`, `size`, `isWithDot`
104
+ - `color`: `light-blue | yellow | green | gray | dark-gray | red | violet`
105
+ - `size`: `sm | md`
106
+ Пример:
107
+ ```html
108
+ <cui-badge color="green" size="md" [isWithDot]="true">Online</cui-badge>
109
+ ```
24
110
 
25
- To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
111
+ ### Feature: CuiBannerComponent (`cui-banner`)
112
+ Описание: баннер для статуса/уведомлений с действием и закрытием.
113
+ Публичный API:
114
+ - Модуль: `CuiBannerModule`
115
+ - Inputs: `status`, `isCloseable`, `label`, `actionButtonText`
116
+ - Outputs: `actionButtonClicked`, `closed`
117
+ - Типы: `CuiBannerOptions`, `CuiBannerIconOptions`
118
+ - Константы/токены: `CUI_BANNER_DEFAULT_OPTIONS`, `CUI_BANNER_OPTIONS`
119
+ Пример:
120
+ ```html
121
+ <cui-banner
122
+ label="Сохранено"
123
+ status="success"
124
+ actionButtonText="Отменить"
125
+ (actionButtonClicked)="onUndo()"
126
+ (closed)="onDismiss()"
127
+ >
128
+ Запись обновлена
129
+ </cui-banner>
130
+ ```
131
+
132
+ ### Feature: CuiBreadcrumbsComponent (`cui-breadcrumbs`)
133
+ Описание: контейнер хлебных крошек, использует `*cuiItem`.
134
+ Публичный API:
135
+ - Модуль: `CuiBreadcrumbsModule`
136
+ - Inputs/Outputs: нет
137
+ Пример:
138
+ ```html
139
+ <cui-breadcrumbs>
140
+ <a cuiBreadcrumb *cuiItem>Главная</a>
141
+ <a cuiBreadcrumb *cuiItem>Каталог</a>
142
+ <a cuiBreadcrumb *cuiItem>Товар</a>
143
+ </cui-breadcrumbs>
144
+ ```
145
+
146
+ ### Feature: CuiBreadcrumbComponent (`[cuiBreadcrumb]`)
147
+ Описание: элемент хлебных крошек (обычно `a`), стиль задается директивой.
148
+ Публичный API:
149
+ - Модуль: `CuiBreadcrumbsModule`
150
+ - Inputs: `isLast: boolean` (если нужно вручную пометить последний)
151
+ Пример:
152
+ ```html
153
+ <a cuiBreadcrumb *cuiItem [isLast]="true">Текущая</a>
154
+ ```
155
+
156
+ ### Feature: CuiButtonComponent (`button[cuiButton], a[cuiButton]`)
157
+ Описание: кнопка с набором appearance/size/shape и иконками.
158
+ Публичный API:
159
+ - Модуль: `CuiButtonModule`
160
+ - Inputs: `appearance`, `size`, `shape`, `disabled`, `isLoaderShown`, `icon`, `iconRight`
161
+ - `appearance`: `action | secondary | outlined | outlined-gray | ghost | flat | destructive | link`
162
+ - `size`: `xxs | xs | sm | md`
163
+ - Типы: `CuiButtonOptions`
164
+ - Константы/токены: `CUI_BUTTON_DEFAULT_OPTIONS`, `CUI_BUTTON_OPTIONS`
165
+ Пример:
166
+ ```html
167
+ <button
168
+ cuiButton
169
+ appearance="secondary"
170
+ size="sm"
171
+ icon="cuiIconPlus"
172
+ [isLoaderShown]="isSaving"
173
+ >
174
+ Создать
175
+ </button>
176
+ ```
177
+
178
+ ### Feature: CuiButtonGroupComponent (`cui-button-group`)
179
+ Описание: группировка кнопок `cuiButton` в одну линию.
180
+ Публичный API:
181
+ - Модуль: `CuiButtonGroupModule`
182
+ - Inputs/Outputs: нет
183
+ Пример:
184
+ ```html
185
+ <cui-button-group>
186
+ <button cuiButton icon="cuiIconPlus"></button>
187
+ <button cuiButton icon="cuiIconCheck"></button>
188
+ </cui-button-group>
189
+ ```
190
+
191
+ ### Feature: CuiCheckboxComponent (`input[type="checkbox"][cuiCheckbox]`)
192
+ Описание: стилизованный checkbox, логика остается нативной.
193
+ Публичный API:
194
+ - Модуль: `CuiCheckboxModule`
195
+ - Inputs/Outputs: нет
196
+ Пример:
197
+ ```html
198
+ <input cuiCheckbox type="checkbox" [formControl]="flagControl">
199
+ ```
200
+
201
+ ### Feature: CuiContextMenuComponent (`cui-context-menu[items][target]`)
202
+ Описание: контекстное меню, привязанное к `target`, рендерится в `cui-root`.
203
+ Публичный API:
204
+ - Модуль: `CuiContextMenuModule`
205
+ - Inputs: `items: CuiContextMenuItem[]`, `target: HTMLElement`
206
+ Пример:
207
+ ```html
208
+ <button cuiButton cuiElement #btn="elementRef">...</button>
209
+ <cui-context-menu [target]="btn.nativeElement" [items]="menuItems"></cui-context-menu>
210
+ ```
211
+
212
+ ### Feature: CuiDialogService
213
+ Описание: сервис модальных диалогов. Контент может быть компонентом, шаблоном или строкой.
214
+ Публичный API:
215
+ - Методы: `open(content, options?)`, `closeAll()`
216
+ - Опции: `size: 'xl' | 'auto'`, `data`, `dismissible`, `injector`
217
+ - Типы: `CuiDialogOptions`, `CuiDialogContext`, `CuiDialogSize`
218
+ - Константы/токены: `CUI_DIALOG_DEFAULT_OPTIONS`, `CUI_DIALOG_OPTIONS`, `CUI_DIALOGS`, `CUI_DIALOG_CONTEXT`
219
+ Пример:
220
+ ```ts
221
+ const dialogs = inject(CuiDialogService);
222
+
223
+ dialogs.open(ModalComponent, { size: 'xl', data: { id: 123 } })
224
+ .subscribe(result => console.log(result));
225
+ ```
226
+
227
+ ### Feature: CuiDialogsComponent (`cui-dialogs`)
228
+ Описание: контейнер для всех открытых диалогов. Обычно используется через `cui-root`.
229
+ Публичный API:
230
+ - Модуль: `CuiDialogModule`
231
+ - Inputs/Outputs: нет
232
+ Пример:
233
+ ```html
234
+ <cui-dialogs></cui-dialogs>
235
+ ```
236
+
237
+ ### Feature: CuiDialogComponent (`cui-dialog`)
238
+ Описание: базовый компонент диалога, получает контекст из `CUI_DIALOG_CONTEXT`.
239
+ Публичный API:
240
+ - Модуль: `CuiDialogModule`
241
+ - Inputs/Outputs: нет
242
+ Пример:
243
+ ```ts
244
+ const context = inject<CuiDialogContext<MyData>>(CUI_DIALOG_CONTEXT);
245
+ context.completeWith({ ok: true });
246
+ ```
247
+
248
+ ### Feature: CuiDialogHeaderComponent (`header[cuiDialogHeader][heading]`)
249
+ Описание: шапка диалога с заголовком (Polymorpheus) и кнопкой закрытия.
250
+ Публичный API:
251
+ - Модуль: `CuiDialogModule`
252
+ - Inputs: `heading`, `headingContext`, `subheading`
253
+ - Outputs: `closed`
254
+ Пример:
255
+ ```html
256
+ <header
257
+ cuiDialogHeader
258
+ [heading]="'Редактирование'"
259
+ [subheading]="'Поля обязательны'"
260
+ (closed)="context.completeWith()"
261
+ ></header>
262
+ ```
263
+
264
+ ### Feature: CuiDialogActionsComponent (`cui-dialog-actions`)
265
+ Описание: контейнер для футера/кнопок диалога.
266
+ Публичный API:
267
+ - Модуль: `CuiDialogModule`
268
+ - Inputs/Outputs: нет
269
+ Пример:
270
+ ```html
271
+ <cui-dialog-actions>
272
+ <button cuiButton>Сохранить</button>
273
+ <button cuiButton appearance="secondary">Отмена</button>
274
+ </cui-dialog-actions>
275
+ ```
276
+
277
+ ### Feature: CuiFormFieldComponent (`cui-form-field`)
278
+ Описание: обертка для поля формы, собирает `cuiLabel`, поле и `cui-hint`.
279
+ Публичный API:
280
+ - Модуль: `CuiFormFieldModule`
281
+ - Inputs/Outputs: нет
282
+ Пример:
283
+ ```html
284
+ <cui-form-field>
285
+ <label cuiLabel for="name">Имя</label>
286
+ <cui-input-text cuiTextFieldId="name"></cui-input-text>
287
+ <cui-hint>Введите полное имя</cui-hint>
288
+ </cui-form-field>
289
+ ```
290
+
291
+ ### Feature: CuiHintComponent (`cui-hint`)
292
+ Описание: текстовая подсказка под полем.
293
+ Публичный API:
294
+ - Модуль: `CuiHintModule`
295
+ - Inputs: `hintType: 'info' | 'error'`
296
+ Пример:
297
+ ```html
298
+ <cui-hint hintType="error">Поле обязательно</cui-hint>
299
+ ```
300
+
301
+ ### Feature: CuiIconButtonComponent (`button[cuiIconButton][icon], a[cuiIconButton][icon]`)
302
+ Описание: иконка-кнопка с цветом и hover цветом.
303
+ Публичный API:
304
+ - Модуль: `CuiIconButtonModule`
305
+ - Inputs: `icon`, `color`, `hoverColor`
306
+ Пример:
307
+ ```html
308
+ <button
309
+ cuiIconButton
310
+ icon="cuiIconTrash"
311
+ color="var(--cui-danger)"
312
+ hoverColor="var(--cui-red-600)"
313
+ ></button>
314
+ ```
315
+
316
+ ### Feature: CuiInputNumberComponent (`cui-input-number`)
317
+ Описание: числовой инпут с маской (maskito), поддерживает min/max/precision.
318
+ Публичный API:
319
+ - Модуль: `CuiInputNumberModule`
320
+ - Inputs: `precision`, `min`, `max`
321
+ - Значение: `number | null` через ControlValueAccessor
322
+ Пример:
323
+ ```html
324
+ <cui-input-number
325
+ [formControl]="priceControl"
326
+ [precision]="2"
327
+ [min]="0"
328
+ [max]="9999"
329
+ cuiTextFieldPlaceholder="Цена"
330
+ cuiTextFieldIconLeft="cuiIconSearch"
331
+ ></cui-input-number>
332
+ ```
333
+
334
+ ### Feature: CuiInputPasswordComponent (`cui-input-password`)
335
+ Описание: парольный инпут с кнопкой показать/скрыть.
336
+ Публичный API:
337
+ - Модуль: `CuiInputPasswordModule`
338
+ - Inputs: нет (используются `cuiTextField*` директивы)
339
+ Пример:
340
+ ```html
341
+ <cui-input-password
342
+ [formControl]="passwordControl"
343
+ cuiTextFieldId="password"
344
+ cuiTextFieldPlaceholder="Пароль"
345
+ ></cui-input-password>
346
+ ```
347
+
348
+ ### Feature: CuiInputTextComponent (`cui-input-text`)
349
+ Описание: текстовый инпут с кнопкой очистки.
350
+ Публичный API:
351
+ - Модуль: `CuiInputModule` (важно: имя модуля именно такое)
352
+ - Inputs: нет (используются `cuiTextField*` директивы)
353
+ Пример:
354
+ ```html
355
+ <cui-input-text
356
+ [formControl]="searchControl"
357
+ cuiTextFieldId="search"
358
+ cuiTextFieldPlaceholder="Поиск"
359
+ cuiTextFieldIconLeft="cuiIconSearch"
360
+ ></cui-input-text>
361
+ ```
362
+
363
+ ### Feature: CuiInputTimeComponent (`cui-input-time`)
364
+ Описание: ввод времени с маской, значение - `CuiTime`.
365
+ Публичный API:
366
+ - Модуль: `CuiInputTimeModule`
367
+ - Inputs: `mode: CuiTimeMode` (по умолчанию `HH:MM`)
368
+ - Типы: `CuiInputTimeOptions`
369
+ - Константы/токены: `CUI_INPUT_TIME_DEFAULT_OPTIONS`, `CUI_INPUT_TIME_OPTIONS`
370
+ Пример:
371
+ ```html
372
+ <cui-input-time
373
+ [formControl]="timeControl"
374
+ mode="HH:MM:SS"
375
+ cuiTextFieldPlaceholder="Время"
376
+ ></cui-input-time>
377
+ ```
378
+
379
+ ### Feature: CuiLabelComponent (`label[cuiLabel]`)
380
+ Описание: стилизованный label с возможностью показать звездочку.
381
+ Публичный API:
382
+ - Модуль: `CuiLabelModule`
383
+ - Inputs: `isRequired: boolean`
384
+ Пример:
385
+ ```html
386
+ <label cuiLabel [isRequired]="true" for="email">Email</label>
387
+ ```
388
+
389
+ ### Feature: CuiNotificationComponent (`cui-notification`)
390
+ Описание: уведомление со статусом и иконкой, опционально с кнопкой закрытия.
391
+ Публичный API:
392
+ - Модуль: `CuiNotificationModule`
393
+ - Inputs: `status`, `mode`, `isCloseable`
394
+ - Outputs: `closed`
395
+ - Типы: `CuiNotificationOptions`, `CuiNotificationIcons`, `CuiNotificationIconOptions`
396
+ - Константы/токены: `CUI_NOTIFICATION_DEFAULT_OPTIONS`, `CUI_NOTIFICATION_OPTIONS`, `CUI_NOTIFICATION_ICONS`, `CUI_NOTIFICATION_ICON_OPTIONS`, `CUI_NOTIFICATION_ICON_OPTIONS_DEFAULT_MODE`, `CUI_NOTIFICATION_ICON_OPTIONS_LIGHT_MODE`
397
+ Пример:
398
+ ```html
399
+ <cui-notification status="success" mode="light" [isCloseable]="true" (closed)="onClosed()">
400
+ Успешно сохранено
401
+ </cui-notification>
402
+ ```
403
+
404
+ ### Feature: CuiRadioComponent (`input[type="radio"][cuiRadio]`)
405
+ Описание: стилизованный radio, логика остается нативной.
406
+ Публичный API:
407
+ - Модуль: `CuiRadioModule`
408
+ - Inputs/Outputs: нет
409
+ Пример:
410
+ ```html
411
+ <input cuiRadio type="radio" [formControl]="choiceControl" value="a">
412
+ ```
413
+
414
+ ### Feature: CuiRootComponent (`cui-root`)
415
+ Описание: корневой контейнер UI, включает `cui-dialogs` и `cui-alerts`, устанавливает атрибут `cuiTheme`.
416
+ Публичный API:
417
+ - Модуль: `CuiRootModule`
418
+ - Inputs/Outputs: нет
419
+ - Константа: `CUI_ROOT_SELECTOR`
420
+ Пример:
421
+ ```html
422
+ <cui-root>
423
+ <app-root-content></app-root-content>
424
+ </cui-root>
425
+ ```
426
+
427
+ ### Feature: CuiSelectComponent (`cui-select[options]`)
428
+ Описание: селект с выпадающим списком, использует `cui-root` для оверлея.
429
+ Публичный API:
430
+ - Модуль: `CuiSelectModule`
431
+ - Inputs: `options: CuiOption[]`, `defaultOptionText?: string`
432
+ - Значение: `unknown` через ControlValueAccessor
433
+ Пример:
434
+ ```html
435
+ <cui-select
436
+ [options]="statusOptions"
437
+ [formControl]="statusControl"
438
+ cuiTextFieldId="status"
439
+ cuiTextFieldPlaceholder="Статус"
440
+ ></cui-select>
441
+ ```
442
+
443
+ ### Feature: CuiSvgComponent (`cui-svg[icon]`)
444
+ Описание: рендер SVG по имени иконки или по сырому SVG string.
445
+ Публичный API:
446
+ - Модуль: `CuiSvgModule`
447
+ - Inputs: `icon`, `width`, `height`, `strokeWidth`, `color`
448
+ Пример:
449
+ ```html
450
+ <cui-svg icon="cuiIconCheck" [width]="16" [height]="16" color="var(--cui-success)"></cui-svg>
451
+ ```
452
+
453
+ ### Feature: CuiTabsComponent (`cui-tabs`)
454
+ Описание: контейнер табов, управляет активным индексом.
455
+ Публичный API:
456
+ - Модуль: `CuiTabsModule`
457
+ - Inputs: `activeItemIndex: number`
458
+ - Outputs: `activeItemIndexChange`
459
+ Пример:
460
+ ```html
461
+ <cui-tabs [(activeItemIndex)]="tabIndex">
462
+ <button cuiTab>Общее</button>
463
+ <button cuiTab>Настройки</button>
464
+ </cui-tabs>
465
+ ```
466
+
467
+ ### Feature: CuiTabComponent (`button[cuiTab]`)
468
+ Описание: кнопка таба, эмитит событие активации.
469
+ Публичный API:
470
+ - Модуль: `CuiTabsModule`
471
+ - Inputs/Outputs: нет
472
+ Пример:
473
+ ```html
474
+ <button cuiTab>Таб</button>
475
+ ```
476
+
477
+ ### Feature: CuiTextareaComponent (`textarea[cuiTextarea]`)
478
+ Описание: стилизованный textarea с авто-ресайзом.
479
+ Публичный API:
480
+ - Модуль: `CuiTextareaModule`
481
+ - Inputs: `rows`, `noBordersAndPaddings`
482
+ Пример:
483
+ ```html
484
+ <textarea
485
+ cuiTextarea
486
+ [rows]="3"
487
+ [noBordersAndPaddings]="false"
488
+ [cuiTextFieldIsError]="true"
489
+ ></textarea>
490
+ ```
491
+
492
+ ### Feature: CuiToggleComponent (`input[type="checkbox"][cuiToggle]`)
493
+ Описание: стилизованный toggle на базе checkbox.
494
+ Публичный API:
495
+ - Модуль: `CuiToggleModule`
496
+ - Inputs/Outputs: нет
497
+ Пример:
498
+ ```html
499
+ <input cuiToggle type="checkbox" [formControl]="toggleControl">
500
+ ```
501
+
502
+ ## Директивы (Core)
503
+
504
+ ### Feature: CuiTextFieldControllerModule
505
+ Описание: модуль с директивами управления полями (`cuiTextField*`). Экспортируется входными компонентами.
506
+ Публичный API:
507
+ - Экспортирует: `CuiTextFieldIconLeftDirective`, `CuiTextFieldIdDirective`, `CuiTextFieldIsErrorDirective`, `CuiTextFieldPlaceholderDirective`, `CuiTextFieldSizeDirective`
508
+ Пример:
509
+ ```ts
510
+ imports: [CuiTextFieldControllerModule]
511
+ ```
512
+
513
+ ### Feature: CuiTextFieldIconLeftDirective (`[cuiTextFieldIconLeft]`)
514
+ Описание: задает иконку слева для текстовых полей.
515
+ Публичный API:
516
+ - Input: `cuiTextFieldIconLeft: CuiIcon | string`
517
+ Пример:
518
+ ```html
519
+ <cui-input-text cuiTextFieldIconLeft="cuiIconSearch"></cui-input-text>
520
+ ```
521
+
522
+ ### Feature: CuiTextFieldIdDirective (`[cuiTextFieldId]`)
523
+ Описание: прокидывает `id` внутрь поля.
524
+ Публичный API:
525
+ - Input: `cuiTextFieldId: string`
526
+ Пример:
527
+ ```html
528
+ <cui-input-text cuiTextFieldId="search"></cui-input-text>
529
+ ```
530
+
531
+ ### Feature: CuiTextFieldIsErrorDirective (`[cuiTextFieldIsError]`)
532
+ Описание: задает состояние ошибки для поля.
533
+ Публичный API:
534
+ - Input: `cuiTextFieldIsError: boolean`
535
+ Пример:
536
+ ```html
537
+ <cui-input-text [cuiTextFieldIsError]="hasError"></cui-input-text>
538
+ ```
539
+
540
+ ### Feature: CuiTextFieldPlaceholderDirective (`[cuiTextFieldPlaceholder]`)
541
+ Описание: задает placeholder для поля.
542
+ Публичный API:
543
+ - Input: `cuiTextFieldPlaceholder: string`
544
+ Пример:
545
+ ```html
546
+ <cui-input-text cuiTextFieldPlaceholder="Введите текст"></cui-input-text>
547
+ ```
548
+
549
+ ### Feature: CuiTextFieldSizeDirective (`[cuiTextFieldSize]`)
550
+ Описание: задает размер поля.
551
+ Публичный API:
552
+ - Input: `cuiTextFieldSize: 'sm' | 'md'`
553
+ Пример:
554
+ ```html
555
+ <cui-input-text cuiTextFieldSize="md"></cui-input-text>
556
+ ```
557
+
558
+ ### Feature: CuiTextFieldController
559
+ Описание: класс, агрегирующий параметры из `cuiTextField*` директив.
560
+ Пример:
561
+ ```ts
562
+ const controller = inject(CUI_TEXT_FIELD_CONTROLLER);
563
+ console.log(controller.size);
564
+ ```
565
+
566
+ ### Feature: CUI_TEXT_FIELD_CONTROLLER и CUI_TEXT_FILED_CONTROLLER_PROVIDER
567
+ Описание: DI токен и провайдер, собирающие параметры из `cuiTextField*` директив в единый контроллер.
568
+ Публичный API:
569
+ - Токен: `CUI_TEXT_FIELD_CONTROLLER`
570
+ - Провайдер: `CUI_TEXT_FILED_CONTROLLER_PROVIDER`
571
+ - Токены директив: `CUI_TEXT_FIELD_ICON_LEFT`, `CUI_TEXT_FIELD_ID`, `CUI_TEXT_FIELD_IS_ERROR`, `CUI_TEXT_FIELD_PLACEHOLDER`, `CUI_TEXT_FIELD_SIZE`
572
+ Пример:
573
+ ```ts
574
+ const controller = inject(CUI_TEXT_FIELD_CONTROLLER);
575
+ console.log(controller.placeholder);
576
+ ```
577
+
578
+ ## Сервисы (Core)
579
+
580
+ ### Feature: CuiThemeService
581
+ Описание: сервис темы, хранит состояние в localStorage и выставляет `cuiTheme` через `CuiRootComponent`.
582
+ Публичный API:
583
+ - Методы: `next(theme: 'light' | 'dark')`, `switch()`
584
+ - Токены/константы: `CUI_THEME`, `CUI_THEME_STORAGE_KEY`, `CUI_THEME_STORAGE_DEFAULT_KEY`, `CUI_DEFAULT_THEME`
585
+ Пример:
586
+ ```ts
587
+ const theme = inject(CuiThemeService);
588
+ theme.switch();
589
+ ```
590
+ Пример (дефолтная тема и ключ хранения):
591
+ ```ts
592
+ providers: [
593
+ { provide: CUI_THEME, useValue: 'dark' },
594
+ { provide: CUI_THEME_STORAGE_KEY, useValue: 'myThemeKey' }
595
+ ]
596
+ ```
597
+
598
+ ## Интерфейсы и типы (Core)
599
+
600
+ ### Feature: CuiOption
601
+ Описание: модель опции для `cui-select`.
602
+ Публичный API:
603
+ - Поля: `label: string`, `value: unknown`, `isDisabled?: boolean`
604
+ Пример:
605
+ ```ts
606
+ const options: CuiOption[] = [
607
+ { label: 'Active', value: 'active' },
608
+ { label: 'Archived', value: 'archived', isDisabled: true }
609
+ ];
610
+ ```
611
+
612
+ ### Feature: CuiContextMenuItem
613
+ Описание: модель элемента контекстного меню.
614
+ Публичный API:
615
+ - Поля: `label`, `icon?`, `color?`, `command?`
616
+ Пример:
617
+ ```ts
618
+ const items: CuiContextMenuItem[] = [
619
+ { label: 'Edit', icon: 'cuiIconEdit', command: () => onEdit() },
620
+ { label: 'Delete', icon: 'cuiIconTrash', color: 'var(--cui-danger)' }
621
+ ];
622
+ ```
623
+
624
+ ### Feature: CuiAppearance* types
625
+ Описание: набор типов appearance для кнопок.
626
+ Публичный API:
627
+ - Значения: `action | secondary | outlined | outlined-gray | ghost | flat | destructive | link`
628
+ Пример:
629
+ ```ts
630
+ const appearance: CuiAppearanceAction = 'action';
631
+ ```
632
+
633
+ ### Feature: CuiHintType
634
+ Описание: тип подсказки `cui-hint`.
635
+ Публичный API:
636
+ - Значения: `info | error`
637
+ Пример:
638
+ ```ts
639
+ const hintType: CuiHintType = 'error';
640
+ ```
641
+
642
+ ### Feature: CuiPosition* types
643
+ Описание: позиции для алертов.
644
+ Публичный API:
645
+ - Значения: `center | right`
646
+ Пример:
647
+ ```ts
648
+ const position: CuiPositionCenter = 'center';
649
+ ```
650
+
651
+ ### Feature: CuiResizing* types
652
+ Описание: режимы ресайза для алертов.
653
+ Публичный API:
654
+ - Значения: `hug | fixed`
655
+ Пример:
656
+ ```ts
657
+ const resizing: CuiResizingFixed = 'fixed';
658
+ ```
659
+
660
+ ### Feature: CuiShapeRounded
661
+ Описание: shape тип для кнопок.
662
+ Публичный API:
663
+ - Значение: `rounded`
664
+ Пример:
665
+ ```ts
666
+ const shape: CuiShapeRounded = 'rounded';
667
+ ```
668
+
669
+ ### Feature: CuiSize* types
670
+ Описание: типы размеров.
671
+ Публичный API:
672
+ - Значения: `xxs | xs | sm | md`
673
+ Пример:
674
+ ```ts
675
+ const size: CuiSizeSm = 'sm';
676
+ ```
677
+
678
+ ### Feature: CuiStatus
679
+ Описание: статусы для уведомлений/баннеров.
680
+ Публичный API:
681
+ - Значения: `success | info | alert | error`
682
+ Пример:
683
+ ```ts
684
+ const status: CuiStatus = 'success';
685
+ ```
686
+
687
+ ## Утилиты (Core)
688
+
689
+ ### Feature: cuiRemoveSpaces
690
+ Описание: удаляет все пробелы из строки.
691
+ Публичный API:
692
+ - Сигнатура: `(value: string) => string`
693
+ Пример:
694
+ ```ts
695
+ cuiRemoveSpaces('a b c'); // "abc"
696
+ ```
697
+
698
+ ### Feature: cuiReplace
699
+ Описание: безопасная замена всех вхождений подстроки.
700
+ Публичный API:
701
+ - Сигнатура: `(value: string, search: string, replace: string) => string`
702
+ Пример:
703
+ ```ts
704
+ cuiReplace('a.b.c', '.', '-'); // "a-b-c"
705
+ ```
706
+
707
+ ## Темы и стили
708
+
709
+ ### Feature: CSS переменные темы
710
+ Описание: базовые и темные токены описаны в `projects/core/styles/theme.scss`. Темная тема задается через атрибут `cuiTheme="dark"`.
711
+ Пример:
712
+ ```scss
713
+ :root {
714
+ --cui-main-font: 'Inter', sans-serif;
715
+ }
716
+ [cuiTheme='dark'] {
717
+ --cui-base-0: var(--cui-slate-900);
718
+ }
719
+ ```
720
+
721
+ ### Feature: SCSS переменные и миксины
722
+ Описание: `projects/core/styles/global.scss` форвардит миксины и переменные (`mixins/*`, `variables/*`).
723
+ Пример:
724
+ ```scss
725
+ @use '@cuby-ui/core/styles/global' as cui;
726
+
727
+ .btn-reset {
728
+ @include cui.cui-clear-button();
729
+ }
730
+ ```
731
+
732
+ ## Рецепты (How-to)
733
+
734
+ ### Feature: Рецепт - показать alert
735
+ Описание: использовать `CuiAlertService` и убедиться, что есть `cui-root`.
736
+ Пример:
737
+ ```ts
738
+ const alerts = inject(CuiAlertService);
739
+ alerts.open('Все ок', { status: 'success', label: 'Готово' }).subscribe();
740
+ ```
741
+
742
+ ### Feature: Рецепт - открыть диалог с данными
743
+ Описание: открыть компонент и прочитать `data` через `CUI_DIALOG_CONTEXT`.
744
+ Пример:
745
+ ```ts
746
+ dialogs.open(EditDialogComponent, { size: 'xl', data: { id: 42 } }).subscribe();
747
+ ```
748
+ ```ts
749
+ const context = inject<CuiDialogContext<{ id: number }>>(CUI_DIALOG_CONTEXT);
750
+ console.log(context.data.id);
751
+ ```
752
+
753
+ ### Feature: Рецепт - использовать `cui-select` с ошибкой
754
+ Описание: задать опции и состояние ошибки через `cuiTextFieldIsError`.
755
+ Пример:
756
+ ```html
757
+ <cui-select
758
+ [options]="options"
759
+ [formControl]="control"
760
+ [cuiTextFieldIsError]="hasError"
761
+ ></cui-select>
762
+ ```
763
+
764
+ ### Feature: Рецепт - переопределить дефолтные опции кнопки
765
+ Описание: использовать `CUI_BUTTON_OPTIONS` в провайдерах.
766
+ Пример:
767
+ ```ts
768
+ providers: [
769
+ { provide: CUI_BUTTON_OPTIONS, useValue: { appearance: 'secondary', size: 'md', shape: 'rounded' } }
770
+ ]
771
+ ```
772
+
773
+ ### Feature: Рецепт - переключение темы
774
+ Описание: вызвать `switch()` у `CuiThemeService`.
775
+ Пример:
776
+ ```ts
777
+ inject(CuiThemeService).switch();
778
+ ```
779
+
780
+ ## Анти-паттерны
781
+ - Анти-паттерн: использовать `CuiAlertService.open()` без подписки. Описание: Observable ленивый, без `subscribe()` алерт не создается.
782
+ - Анти-паттерн: использовать `cui-select` или `cui-context-menu` без `cui-root`. Описание: оверлей некуда монтировать.
783
+ - Анти-паттерн: передавать `ElementRef` вместо `HTMLElement` в `target`. Описание: компонент ожидает `HTMLElement`.
784
+ - Анти-паттерн: передавать строку вместо `CuiTime` в `cui-input-time`. Описание: компонент ожидает `CuiTime`.
785
+
786
+ ## FAQ / типовые ошибки
787
+ - Вопрос: почему не открывается диалог? Ответ: проверьте, что вы подписались на `open()` и в DOM есть `cui-root`.
788
+ - Вопрос: почему не видно placeholder в `cui-input-text`? Ответ: используйте `cuiTextFieldPlaceholder`, а не нативный `placeholder`.
789
+ - Вопрос: почему select не закрывается? Ответ: убедитесь, что есть `cui-root` и не блокируется событие клика снаружи.
790
+
791
+ ## Структура репозитория
792
+ - `projects/core` - UI компоненты, стили, темы.
793
+ - `projects/cdk` - утилиты, директивы, сервисы.
794
+ - `projects/icons` - SVG иконки и типы.
795
+ - `projects/test` - sandbox приложение с примерами.
796
+ - `angular.json` - конфигурация Angular workspace.
797
+
798
+ ## Линт и форматирование
799
+ - Явных конфигураций ESLint/Prettier в репозитории нет. Ориентируйтесь на текущий стиль файлов и типичные правила Angular/TypeScript.
800
+
801
+ ## Версии и совместимость
802
+ - Angular: `>=15.0.0`
803
+ - RxJS: `>=7.0.0`
804
+ - `@maskito/*`: `^2.5.0` (input number/time)
805
+ - `@tinkoff/ng-polymorpheus`: `^4.3.0` (dialog header)
806
+ - Пакеты `@cuby-ui/*`: версия `0.0.177` (см. `projects/*/package.json`)