@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.
- package/README.md +794 -13
- package/editor/editor.component.d.ts +1 -0
- package/editor/tools/combined-text-block.tool.d.ts +0 -1
- package/esm2022/components/card-wrapper/card-wrapper.component.mjs +2 -2
- package/esm2022/components/content-header/content-header.component.mjs +3 -3
- package/esm2022/components/dropdown/dropdown-wrapper.component.mjs +3 -3
- package/esm2022/components/sidebar/sidebar-header/sidebar-header.component.mjs +3 -3
- package/esm2022/components/tabs/components/abstract-tabs/abstract-tabs.component.mjs +3 -3
- package/esm2022/editor/components/editor-attaches-tool/editor-attaches-tool.component.mjs +3 -3
- package/esm2022/editor/editor.component.mjs +9 -1
- package/esm2022/editor/tools/combined-text-block.tool.mjs +9 -26
- package/esm2022/editor/widgets/editor-block/editor-block.component.mjs +3 -3
- package/esm2022/editor/widgets/editor-modal/editor-modal.component.mjs +3 -3
- package/esm2022/widgets/ui/assignee-role-item/assignee-role-item.component.mjs +3 -3
- package/esm2022/widgets/ui/assignee-roles-tabs/assignee-roles-tabs.component.mjs +3 -3
- package/esm2022/widgets/ui/button-change-theme/button-change-theme.component.mjs +3 -3
- package/esm2022/widgets/ui/categories/components/category-form/category-form.component.mjs +3 -3
- package/esm2022/widgets/ui/categories/components/category-item/category-item.component.mjs +3 -3
- package/esm2022/widgets/ui/checklist-block/checklist-block.component.mjs +3 -3
- package/esm2022/widgets/ui/checklist-block/components/checklist-block-list-item-evaluation-criteria/checklist-block-list-item-evaluation-criteria.component.mjs +3 -3
- package/esm2022/widgets/ui/circle-loader/circle-loader.component.mjs +3 -3
- package/esm2022/widgets/ui/consumable-form/components/consumable-form-item/consumable-form-item.component.mjs +3 -3
- package/esm2022/widgets/ui/consumable-form/components/consumable-form-item-readonly/consumable-form-item-readonly.component.mjs +3 -3
- package/esm2022/widgets/ui/consumable-form/consumable-form.component.mjs +3 -3
- package/esm2022/widgets/ui/delete-modal/delete-modal.component.mjs +3 -3
- package/esm2022/widgets/ui/framer-preview/framer-preview.component.mjs +3 -3
- package/esm2022/widgets/ui/inserted/inserted.component.mjs +3 -3
- package/esm2022/widgets/ui/modal-header-inserted-buttons/modal-header-inserted-buttons.component.mjs +3 -3
- package/esm2022/widgets/ui/modal-header-tabs/modal-header-tabs.component.mjs +3 -3
- package/esm2022/widgets/ui/resources-block/components/resources-block-content/resources-block-content.component.mjs +3 -3
- package/esm2022/widgets/ui/resources-block/components/resources-options/resources-options.component.mjs +3 -3
- package/esm2022/widgets/ui/resources-block/resources-block.component.mjs +3 -3
- package/esm2022/widgets/ui/toolbox-form/components/tool-form-readonly/tool-form-readonly.component.mjs +3 -3
- package/esm2022/widgets/ui/toolbox-form/tool-form.component.mjs +3 -3
- package/esm2022/widgets/ui/user-action-context-menu/activity-item/activity-item.component.mjs +3 -3
- package/esm2022/widgets/ui/user-action-context-menu/company-item/company-item.component.mjs +3 -3
- package/esm2022/widgets/ui/user-action-context-menu/user-action-context-menu.component.mjs +3 -3
- package/esm2022/widgets/ui/utility-modal/components/readonly-utility-modal/readonly-utility-modal.component.mjs +3 -3
- package/esm2022/widgets/ui/utility-modal/components/utility-modal-create/utility-modal-create.component.mjs +3 -3
- package/esm2022/widgets/ui/utility-thumbnail/utility-thumbnail.component.mjs +3 -3
- package/fesm2022/cuby-ui-core.mjs +85 -94
- package/fesm2022/cuby-ui-core.mjs.map +1 -1
- package/package.json +4 -4
- package/styles/mixins/flex.scss +5 -15
package/README.md
CHANGED
|
@@ -1,25 +1,806 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Cuby UI - агентская документация (RU)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Документ для кодовых агентов. Описывает публичный API пакета `@cuby-ui/core`, а также примеры использования.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Критически важно:
|
|
6
|
+
- Оверлеи (`cui-dialogs`, `cui-alerts`, `cui-select`, `cui-context-menu`) требуют наличия `cui-root` в DOM.
|
|
7
|
+
- `open()` у `CuiAlertService` и `CuiDialogService` выполняется только после подписки на Observable.
|
|
6
8
|
|
|
7
|
-
|
|
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
|
-
|
|
23
|
+
## Компоненты (Core)
|
|
10
24
|
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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`)
|