@snabcentr/client-ui 4.16.0 → 4.18.0

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 (74) hide show
  1. package/auth/sign-up-form/sc-sign-up-form.component.d.ts +6 -0
  2. package/contragents/new-contragent-form/sc-new-contragent-form.component.d.ts +4 -0
  3. package/contragents/sc-contragents.module.d.ts +4 -3
  4. package/delivery-address/add-delivery-address-dialog/sc-add-delivery-address-dialog.component.d.ts +13 -0
  5. package/directives/address-quality/sc-address-quality.directive.d.ts +23 -0
  6. package/directives/address-quality/sc-address-quality.service.d.ts +122 -0
  7. package/directives/address-quality/sc-i-address-quality-state.d.ts +14 -0
  8. package/directives/index.d.ts +2 -0
  9. package/esm2022/auth/sc-simple-sign-up-form/sc-simple-sign-up-form.component.mjs +1 -1
  10. package/esm2022/auth/sign-up-form/sc-sign-up-form.component.mjs +14 -4
  11. package/esm2022/catalog/notify-when-in-stock-dialog/sc-notify-when-in-stock-dialog.component.mjs +2 -2
  12. package/esm2022/contacts/new-contact-form/sc-new-contact-form.component.mjs +1 -1
  13. package/esm2022/contragents/new-contragent-bank-account-form/sc-new-contragent-bank-account-form.component.mjs +1 -1
  14. package/esm2022/contragents/new-contragent-form/sc-new-contragent-form.component.mjs +26 -20
  15. package/esm2022/contragents/sc-contragents.module.mjs +4 -1
  16. package/esm2022/delivery-address/add-delivery-address-dialog/sc-add-delivery-address-dialog.component.mjs +25 -4
  17. package/esm2022/directives/address-quality/sc-address-quality.directive.mjs +40 -0
  18. package/esm2022/directives/address-quality/sc-address-quality.service.mjs +214 -0
  19. package/esm2022/directives/address-quality/sc-i-address-quality-state.mjs +2 -0
  20. package/esm2022/directives/index.mjs +3 -1
  21. package/esm2022/feedback/feedback-form/sc-feedback-form.component.mjs +11 -21
  22. package/esm2022/form-fields/addresses-selection-field/sc-addresses-selection-field.component.mjs +4 -5
  23. package/esm2022/form-fields/suggestion-field/sc-suggestion-field.component.mjs +76 -16
  24. package/esm2022/providers/index.mjs +2 -2
  25. package/esm2022/providers/sc-block-incomplete-address.mjs +8 -0
  26. package/esm2022/public-api.mjs +2 -1
  27. package/esm2022/samples/sc-sample.module.mjs +3 -10
  28. package/esm2022/services/index.mjs +2 -1
  29. package/esm2022/services/sc-scripts.service.mjs +106 -0
  30. package/esm2022/smart-captcha/index.mjs +5 -0
  31. package/esm2022/smart-captcha/interfaces/index.mjs +6 -0
  32. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-api.mjs +2 -0
  33. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-event.mjs +2 -0
  34. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-language.mjs +2 -0
  35. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-render-params.mjs +2 -0
  36. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-settings.mjs +2 -0
  37. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-window.mjs +2 -0
  38. package/esm2022/smart-captcha/sc-smart-captcha.component.mjs +167 -0
  39. package/esm2022/smart-captcha/services/index.mjs +2 -0
  40. package/esm2022/smart-captcha/services/sc-smart-captcha-loader.service.mjs +87 -0
  41. package/esm2022/smart-captcha/tokens/index.mjs +3 -0
  42. package/esm2022/smart-captcha/tokens/sc-smart-captcha-load-timeout.token.mjs +8 -0
  43. package/esm2022/smart-captcha/tokens/sc-smart-captcha-settings.token.mjs +6 -0
  44. package/esm2022/user/update-user-info-dialog/sc-update-user-info-dialog.component.mjs +3 -3
  45. package/feedback/feedback-form/sc-feedback-form.component.d.ts +1 -1
  46. package/fesm2022/snabcentr-client-ui.mjs +758 -111
  47. package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
  48. package/form-fields/addresses-selection-field/sc-addresses-selection-field.component.d.ts +2 -0
  49. package/form-fields/suggestion-field/sc-suggestion-field.component.d.ts +36 -2
  50. package/package.json +2 -3
  51. package/providers/index.d.ts +1 -1
  52. package/providers/sc-block-incomplete-address.d.ts +5 -0
  53. package/public-api.d.ts +1 -0
  54. package/release_notes.tmp +3 -3
  55. package/samples/sc-sample.module.d.ts +1 -2
  56. package/services/index.d.ts +1 -0
  57. package/services/sc-scripts.service.d.ts +51 -0
  58. package/smart-captcha/index.d.ts +4 -0
  59. package/smart-captcha/interfaces/index.d.ts +5 -0
  60. package/smart-captcha/interfaces/sc-smart-captcha-api.d.ts +36 -0
  61. package/smart-captcha/interfaces/sc-smart-captcha-event.d.ts +4 -0
  62. package/smart-captcha/interfaces/sc-smart-captcha-language.d.ts +4 -0
  63. package/smart-captcha/interfaces/sc-smart-captcha-render-params.d.ts +16 -0
  64. package/smart-captcha/interfaces/sc-smart-captcha-settings.d.ts +16 -0
  65. package/smart-captcha/interfaces/sc-smart-captcha-window.d.ts +14 -0
  66. package/smart-captcha/sc-smart-captcha.component.d.ts +92 -0
  67. package/smart-captcha/services/index.d.ts +1 -0
  68. package/smart-captcha/services/sc-smart-captcha-loader.service.d.ts +50 -0
  69. package/smart-captcha/tokens/index.d.ts +2 -0
  70. package/smart-captcha/tokens/sc-smart-captcha-load-timeout.token.d.ts +5 -0
  71. package/smart-captcha/tokens/sc-smart-captcha-settings.token.d.ts +6 -0
  72. package/styles/tailwind/tailwind.scss +44 -2
  73. package/esm2022/providers/cleanup-recaptcha-artifacts.mjs +0 -30
  74. package/providers/cleanup-recaptcha-artifacts.d.ts +0 -7
@@ -56,6 +56,8 @@ export declare class ScAddressesSelectionFieldComponent implements OnInit {
56
56
  }) => string;
57
57
  /**
58
58
  * Инициализирует экземпляр класса {@link ScAddressesSelectionFieldComponent}.
59
+ * Включение выбора страны сохраняет выбранные страну, регион и город. При выключении выбора страна
60
+ * фиксируется на текущей стране системы, поэтому регион и город сбрасываются, только если была выбрана другая страна.
59
61
  *
60
62
  * @param formGroupDirective Директива c `FormGroup` из DOM.
61
63
  * @param locationsService Сервис для получения списков стран, регионов, городов.
@@ -1,6 +1,6 @@
1
1
  import { EventEmitter, OnInit } from '@angular/core';
2
2
  import { NgControl } from '@angular/forms';
3
- import { ScISuggestionOrganization, ScISuggestionType, ScSuggestion, ScSuggestionService } from '@snabcentr/client-core';
3
+ import { ScISuggestionOrganization, ScISuggestionType, ScSuggestion, ScSuggestionAddressQuality, ScSuggestionService } from '@snabcentr/client-core';
4
4
  import { Observable } from 'rxjs';
5
5
  import * as i0 from "@angular/core";
6
6
  /**
@@ -13,6 +13,11 @@ export declare class ScSuggestionFieldComponent implements OnInit {
13
13
  * Тип подсказок.
14
14
  */
15
15
  type: ScISuggestionType;
16
+ /**
17
+ * Признак, что элементы подсказок показывают пометку о полноте адреса.
18
+ * Отключается там, где адреса из подсказки по организации не применяются.
19
+ */
20
+ showAddressQuality: boolean;
16
21
  /**
17
22
  * Событие выбора результата подсказки.
18
23
  */
@@ -41,6 +46,10 @@ export declare class ScSuggestionFieldComponent implements OnInit {
41
46
  * Признак, что разрешено выбирать записи ликвидированных организаций.
42
47
  */
43
48
  private readonly allowSelectTerminated;
49
+ /**
50
+ * Сервис-реестр качества адресов, выбранных из подсказок.
51
+ */
52
+ private readonly addressQualityService;
44
53
  /**
45
54
  * Инициализирует экземпляр класса {@link ScSuggestionFieldComponent}.
46
55
  *
@@ -62,12 +71,37 @@ export declare class ScSuggestionFieldComponent implements OnInit {
62
71
  * @param suggestion Объект подсказки.
63
72
  */
64
73
  isDisabledSuggestion(suggestion: ScSuggestion): boolean;
74
+ /**
75
+ * Возвращает текст пометки о качестве адреса для элемента выпадающего списка подсказок либо null, когда пометка не требуется.
76
+ *
77
+ * @param quality Качество (полнота) адреса.
78
+ */
79
+ getAddressQualityWarning(quality: ScSuggestionAddressQuality | null | undefined): string | null;
80
+ /**
81
+ * Возвращает текст пометки о качестве юридического адреса для подсказки по организации либо null,
82
+ * когда пометка не требуется, в том числе когда у организации нет юридического адреса.
83
+ *
84
+ * @param suggestion Объект подсказки по организации.
85
+ */
86
+ getOrganizationAddressQualityWarning(suggestion: ScISuggestionOrganization): string | null;
65
87
  /**
66
88
  * Проверяет прекращена ли деятельность указанной организации.
67
89
  *
68
90
  * @param suggestion Объект подсказки по организации.
69
91
  */
70
92
  isOrgTerminated(suggestion: ScISuggestionOrganization): boolean;
93
+ /**
94
+ * Заполняет контрол строкой выбранного адреса и регистрирует качество адреса.
95
+ *
96
+ * @param suggestion Объект подсказки по адресу.
97
+ */
98
+ private applyAddressSuggestion;
99
+ /**
100
+ * Заполняет поля родительской группы данными выбранной организации и регистрирует качество её адресов.
101
+ *
102
+ * @param suggestion Объект подсказки по организации.
103
+ */
104
+ private applyOrganizationSuggestion;
71
105
  static ɵfac: i0.ɵɵFactoryDeclaration<ScSuggestionFieldComponent, [{ skipSelf: true; }, null]>;
72
- static ɵcmp: i0.ɵɵComponentDeclaration<ScSuggestionFieldComponent, "sc-suggestion-field", never, { "type": { "alias": "type"; "required": false; }; }, { "selectedClick": "selectedClick"; }, never, never, false, never>;
106
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScSuggestionFieldComponent, "sc-suggestion-field", never, { "type": { "alias": "type"; "required": false; }; "showAddressQuality": { "alias": "showAddressQuality"; "required": false; }; }, { "selectedClick": "selectedClick"; }, never, never, false, never>;
73
107
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snabcentr/client-ui",
3
- "version": "4.16.0",
3
+ "version": "4.18.0",
4
4
  "author": "Snabcentr Ltd.",
5
5
  "repository": "https://gitlab.snabcentr.met/web/angular/snabcentr-client-ui-lib",
6
6
  "license": "Commercial",
@@ -16,7 +16,7 @@
16
16
  "@maskito/core": "^3.11.1",
17
17
  "@ng-web-apis/intersection-observer": "^4.14.0",
18
18
  "@ng-web-apis/common": "^4.14.0",
19
- "@snabcentr/client-core": "^3.23.3",
19
+ "@snabcentr/client-core": "^3.23.4",
20
20
  "@taiga-ui/addon-charts": "^4.66.0",
21
21
  "@taiga-ui/addon-commerce": "^4.66.0",
22
22
  "@taiga-ui/cdk": "^4.66.0",
@@ -31,7 +31,6 @@
31
31
  "@taiga-ui/experimental": "^4.66.0",
32
32
  "@taiga-ui/styles": "^4.66.0",
33
33
  "@tailwindcss/container-queries": "^0.1.1",
34
- "ng-recaptcha-2": "^14.0.0",
35
34
  "angular8-yandex-maps": "^18.2.0",
36
35
  "date-fns": "^4.1.0",
37
36
  "libphonenumber-js": "^1.12.7",
@@ -1,6 +1,7 @@
1
1
  export * from './sc-verification-code-timeout';
2
2
  export * from './sc-dialog-service.providers';
3
3
  export * from './sc-allow-select-terminated';
4
+ export * from './sc-block-incomplete-address';
4
5
  export * from './sc-help-notification-limit';
5
6
  export * from './sc-help-notification-close';
6
7
  export * from './sc-max-files-in-form-input';
@@ -13,4 +14,3 @@ export * from './sc-notify-when-in-stock-required-fields';
13
14
  export * from './sc-banner-duration';
14
15
  export * from './sc-debounce-time-default';
15
16
  export * from './sc-hidden-print-elements.token';
16
- export * from './cleanup-recaptcha-artifacts';
@@ -0,0 +1,5 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ /**
3
+ * Токен признака, что отправка форм с неполным (по данным подсказок) адресом заблокирована.
4
+ */
5
+ export declare const SC_BLOCK_INCOMPLETE_ADDRESS: InjectionToken<boolean>;
package/public-api.d.ts CHANGED
@@ -29,6 +29,7 @@ export * from './providers';
29
29
  export * from './feedback';
30
30
  export * from './qrcode';
31
31
  export * from './share';
32
+ export * from './smart-captcha';
32
33
  export * from './user';
33
34
  export * from './validators';
34
35
  export * from './verification';
package/release_notes.tmp CHANGED
@@ -1,6 +1,6 @@
1
- ## 4.16.0 (2026-10-05)
1
+ ## 4.18.0 (2026-10-09)
2
2
 
3
- ### added (1 change)
3
+ ### added, (1 change)
4
4
 
5
- - [#14012: Подключена client-core 3.23.3 с помощником для работы с дробными числами](web_soft/libs/angular/snabcentr-client-ui-lib@16c38063ab06ff242bfa6c8207f4b0670bf1a9f7) ([merge request](web_soft/libs/angular/snabcentr-client-ui-lib!456))
5
+ - [#14054: Добавлена проверка полноты адреса в подсказках адресов и организаций](web_soft/libs/angular/snabcentr-client-ui-lib@acc6663f5787a3c5d65877216aef0d5d5a14b914) ([merge request](web_soft/libs/angular/snabcentr-client-ui-lib!459))
6
6
 
@@ -8,12 +8,11 @@ import * as i6 from "../form-fields/form-fields.module";
8
8
  import * as i7 from "@taiga-ui/legacy";
9
9
  import * as i8 from "@taiga-ui/cdk/directives/item";
10
10
  import * as i9 from "@taiga-ui/cdk";
11
- import * as i10 from "ng-recaptcha-2";
12
11
  /**
13
12
  * Модуль представления образцов товара.
14
13
  */
15
14
  export declare class ScPreviewSampleModule {
16
15
  static ɵfac: i0.ɵɵFactoryDeclaration<ScPreviewSampleModule, never>;
17
- static ɵmod: i0.ɵɵNgModuleDeclaration<ScPreviewSampleModule, [typeof i1.ScPreviewSampleComponent], [typeof i2.CommonModule, typeof i3.ReactiveFormsModule, typeof i4.TuiError, typeof i5.TuiFieldErrorPipe, typeof i6.ScFormFieldsModule, typeof i7.TuiInputModule, typeof i7.TuiInputPhoneModule, typeof i8.TuiItem, typeof i5.TuiCarouselComponent, typeof i5.TuiCarouselDirective, typeof i5.TuiCarouselAutoscroll, typeof i5.TuiCarouselButtons, typeof i5.TuiCarouselScroll, typeof i5.TuiAvatar, typeof i9.TuiHovered, typeof i4.TuiButton, typeof i5.TuiButtonLoading, typeof i4.TuiLabel, typeof i10.RecaptchaFormsModule, typeof i10.RecaptchaModule], [typeof i1.ScPreviewSampleComponent]>;
16
+ static ɵmod: i0.ɵɵNgModuleDeclaration<ScPreviewSampleModule, [typeof i1.ScPreviewSampleComponent], [typeof i2.CommonModule, typeof i3.ReactiveFormsModule, typeof i4.TuiError, typeof i5.TuiFieldErrorPipe, typeof i6.ScFormFieldsModule, typeof i7.TuiInputModule, typeof i7.TuiInputPhoneModule, typeof i8.TuiItem, typeof i5.TuiCarouselComponent, typeof i5.TuiCarouselDirective, typeof i5.TuiCarouselAutoscroll, typeof i5.TuiCarouselButtons, typeof i5.TuiCarouselScroll, typeof i5.TuiAvatar, typeof i9.TuiHovered, typeof i4.TuiButton, typeof i5.TuiButtonLoading, typeof i4.TuiLabel], [typeof i1.ScPreviewSampleComponent]>;
18
17
  static ɵinj: i0.ɵɵInjectorDeclaration<ScPreviewSampleModule>;
19
18
  }
@@ -1,2 +1,3 @@
1
1
  export * from './sc-help-notification.service';
2
2
  export * from './print.service';
3
+ export * from './sc-scripts.service';
@@ -0,0 +1,51 @@
1
+ import { Observable } from 'rxjs';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Сервис для вставки в {@link Document} внешних и дополнительных скриптов.
5
+ */
6
+ export declare class ScScriptsService {
7
+ /**
8
+ * Объект {@link Document}, предоставляющий доступ к DOM страницы.
9
+ */
10
+ private readonly document;
11
+ /**
12
+ * Объект {@link Renderer2}, предоставляющий доступ к DOM страницы.
13
+ */
14
+ private readonly renderer;
15
+ /**
16
+ * Признак того, что скрипт выполняется в браузере.
17
+ */
18
+ private readonly isBrowser;
19
+ /**
20
+ * {@link NgZone} для вставки скриптов вне зоны Angular.
21
+ */
22
+ private readonly ngZone;
23
+ /**
24
+ * Вставляет в конец {@link Document.body} скрипты, заданные строками HTML, вне зоны Angular. Из каждой строки берётся первый `<script>`. На сервере ничего не делает.
25
+ * Принимает только доверенные строки из конфигурации приложения: строка разбирается как HTML и может выполнить код.
26
+ *
27
+ * @param scriptStrings Строки HTML скриптов.
28
+ */
29
+ appendScripts(scriptStrings: readonly string[]): void;
30
+ /**
31
+ * Загружает внешний скрипт: при подписке добавляет его в {@link Document.head}, после загрузки выдаёт элемент скрипта и завершается.
32
+ * Если скрипт не загрузился или подписка отменена раньше, удаляет его со страницы; удаление не отменяет загрузку и выполнение уже вставленного скрипта. На сервере завершается без загрузки.
33
+ *
34
+ * @param url Адрес скрипта.
35
+ */
36
+ loadScript$(url: string): Observable<HTMLScriptElement>;
37
+ /**
38
+ * Удаляет скрипт со страницы. При подключённых анимациях Angular узел удаляется при ближайшей проверке изменений.
39
+ *
40
+ * @param script Элемент скрипта.
41
+ */
42
+ removeScript(script: HTMLScriptElement): void;
43
+ /**
44
+ * Создаёт {@link HTMLScriptElement} из строки HTML скрипта.
45
+ *
46
+ * @param scriptString Строка HTML скрипта.
47
+ */
48
+ private createScript;
49
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScScriptsService, never>;
50
+ static ɵprov: i0.ɵɵInjectableDeclaration<ScScriptsService>;
51
+ }
@@ -0,0 +1,4 @@
1
+ export * from './interfaces';
2
+ export * from './sc-smart-captcha.component';
3
+ export * from './services';
4
+ export * from './tokens';
@@ -0,0 +1,5 @@
1
+ export * from './sc-smart-captcha-api';
2
+ export * from './sc-smart-captcha-event';
3
+ export * from './sc-smart-captcha-language';
4
+ export * from './sc-smart-captcha-render-params';
5
+ export * from './sc-smart-captcha-settings';
@@ -0,0 +1,36 @@
1
+ import { ScSmartCaptchaEvent } from './sc-smart-captcha-event';
2
+ import { ScSmartCaptchaRenderParams } from './sc-smart-captcha-render-params';
3
+ /**
4
+ * API Yandex SmartCaptcha, доступное в `window.smartCaptcha` после загрузки скрипта.
5
+ *
6
+ * @see [Методы window.smartCaptcha](https://yandex.cloud/ru/docs/smartcaptcha/concepts/widget-methods#methods)
7
+ */
8
+ export interface ScSmartCaptchaApi {
9
+ /**
10
+ * Отрисовывает виджет в контейнере и возвращает идентификатор виджета (может быть равен `0`).
11
+ *
12
+ * @param container Контейнер для виджета.
13
+ * @param params Параметры отрисовки.
14
+ */
15
+ render: (container: HTMLElement, params: ScSmartCaptchaRenderParams) => number;
16
+ /**
17
+ * Сбрасывает виджет в начальное состояние.
18
+ *
19
+ * @param widgetId Идентификатор виджета.
20
+ */
21
+ reset: (widgetId: number) => void;
22
+ /**
23
+ * Удаляет виджет и созданные им элементы и обработчики.
24
+ *
25
+ * @param widgetId Идентификатор виджета.
26
+ */
27
+ destroy: (widgetId: number) => void;
28
+ /**
29
+ * Подписывает обработчик на событие виджета и возвращает функцию отписки.
30
+ *
31
+ * @param widgetId Идентификатор виджета.
32
+ * @param event Событие виджета.
33
+ * @param callback Обработчик события, для события `success` получает токен.
34
+ */
35
+ subscribe: (widgetId: number, event: ScSmartCaptchaEvent, callback: (payload?: unknown) => void) => () => void;
36
+ }
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Событие виджета Yandex SmartCaptcha, на которое можно подписаться.
3
+ */
4
+ export type ScSmartCaptchaEvent = 'challenge-visible' | 'challenge-hidden' | 'network-error' | 'javascript-error' | 'success' | 'token-expired';
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Язык виджета Yandex SmartCaptcha.
3
+ */
4
+ export type ScSmartCaptchaLanguage = 'ru' | 'en' | 'be' | 'kk' | 'tt' | 'uk' | 'uz' | 'tr';
@@ -0,0 +1,16 @@
1
+ import { ScSmartCaptchaLanguage } from './sc-smart-captcha-language';
2
+ /**
3
+ * Параметры отрисовки виджета Yandex SmartCaptcha.
4
+ *
5
+ * @see [Метод render](https://yandex.cloud/ru/docs/smartcaptcha/concepts/widget-methods#render)
6
+ */
7
+ export interface ScSmartCaptchaRenderParams {
8
+ /**
9
+ * Ключ клиентской части.
10
+ */
11
+ sitekey: string;
12
+ /**
13
+ * Язык виджета.
14
+ */
15
+ hl?: ScSmartCaptchaLanguage;
16
+ }
@@ -0,0 +1,16 @@
1
+ import { ScSmartCaptchaLanguage } from './sc-smart-captcha-language';
2
+ /**
3
+ * Настройки Yandex SmartCaptcha.
4
+ */
5
+ export interface ScSmartCaptchaSettings {
6
+ /**
7
+ * Ключ клиентской части.
8
+ *
9
+ * @see [Ключи капчи](https://yandex.cloud/ru/docs/smartcaptcha/concepts/keys)
10
+ */
11
+ sitekey: string;
12
+ /**
13
+ * Язык виджета.
14
+ */
15
+ language: ScSmartCaptchaLanguage;
16
+ }
@@ -0,0 +1,14 @@
1
+ import { ScSmartCaptchaApi } from './sc-smart-captcha-api';
2
+ /**
3
+ * Окно браузера с API Yandex SmartCaptcha.
4
+ */
5
+ export interface ScSmartCaptchaWindow extends Window {
6
+ /**
7
+ * API Yandex SmartCaptcha, появляется после загрузки скрипта.
8
+ */
9
+ smartCaptcha?: ScSmartCaptchaApi;
10
+ /**
11
+ * Обработчик загрузки скрипта, имя которого передаётся в параметре `onload` адреса скрипта.
12
+ */
13
+ scSmartCaptchaOnload?: () => void;
14
+ }
@@ -0,0 +1,92 @@
1
+ import { WritableSignal } from '@angular/core';
2
+ import { ControlValueAccessor } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Виджет Yandex SmartCaptcha. Значение поля ввода - токен прохождения проверки, `null` пока проверка не пройдена или токен истёк.
6
+ */
7
+ export declare class ScSmartCaptchaComponent implements ControlValueAccessor {
8
+ /**
9
+ * Контейнер, в котором отрисовывается виджет.
10
+ */
11
+ private readonly container;
12
+ /**
13
+ * Настройки Yandex SmartCaptcha.
14
+ */
15
+ private readonly settings;
16
+ /**
17
+ * Сервис загрузки скрипта Yandex SmartCaptcha.
18
+ */
19
+ private readonly loader;
20
+ /**
21
+ * {@link NgZone} для отрисовки виджета вне зоны Angular и возврата его событий в зону.
22
+ */
23
+ private readonly ngZone;
24
+ /**
25
+ * Ссылка для автоматического управления уничтожением зависимостей.
26
+ */
27
+ private readonly destroyRef;
28
+ /**
29
+ * Признак того, что капчу не удалось загрузить.
30
+ */
31
+ protected readonly hasError: WritableSignal<boolean>;
32
+ /**
33
+ * API Yandex SmartCaptcha, в котором отрисован виджет.
34
+ */
35
+ private api?;
36
+ /**
37
+ * Идентификатор отрисованного виджета.
38
+ */
39
+ private widgetId?;
40
+ /**
41
+ * Функции отписки от событий виджета.
42
+ */
43
+ private unsubscribers;
44
+ /**
45
+ * Обработчик изменения значения поля ввода.
46
+ */
47
+ private onChange;
48
+ /**
49
+ * Обработчик касания поля ввода.
50
+ */
51
+ private onTouched;
52
+ /**
53
+ * Инициализирует экземпляр класса {@link ScSmartCaptchaComponent}.
54
+ */
55
+ constructor();
56
+ /** @inheritDoc */
57
+ writeValue(token: string | null): void;
58
+ /** @inheritDoc */
59
+ registerOnChange(onChange: (token: string | null) => void): void;
60
+ /** @inheritDoc */
61
+ registerOnTouched(onTouched: () => void): void;
62
+ /**
63
+ * Повторяет загрузку капчи после ошибки.
64
+ */
65
+ protected retry(): void;
66
+ /**
67
+ * Загружает API Yandex SmartCaptcha и отрисовывает виджет (API приходит вне зоны Angular). При ошибке загрузки или отрисовки показывает сообщение.
68
+ */
69
+ private load;
70
+ /**
71
+ * Отрисовывает виджет и подписывается на его события.
72
+ *
73
+ * @param api API Yandex SmartCaptcha.
74
+ */
75
+ private render;
76
+ /**
77
+ * Передаёт форме новое значение токена.
78
+ *
79
+ * @param token Токен прохождения проверки.
80
+ */
81
+ private updateValue;
82
+ /**
83
+ * Удаляет виджет, очищает токен и показывает сообщение об ошибке.
84
+ */
85
+ private showError;
86
+ /**
87
+ * Удаляет виджет вместе с созданными им элементами и обработчиками.
88
+ */
89
+ private destroyWidget;
90
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScSmartCaptchaComponent, never>;
91
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScSmartCaptchaComponent, "sc-smart-captcha", never, {}, {}, never, never, true, never>;
92
+ }
@@ -0,0 +1 @@
1
+ export * from './sc-smart-captcha-loader.service';
@@ -0,0 +1,50 @@
1
+ import { Observable } from 'rxjs';
2
+ import { ScSmartCaptchaApi } from '../interfaces/sc-smart-captcha-api';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Сервис загрузки скрипта Yandex SmartCaptcha.
6
+ */
7
+ export declare class ScSmartCaptchaLoaderService {
8
+ /**
9
+ * Сервис для вставки внешних скриптов.
10
+ */
11
+ private readonly scriptsService;
12
+ /**
13
+ * Окно браузера с API Yandex SmartCaptcha.
14
+ */
15
+ private readonly window;
16
+ /**
17
+ * Признак того, что приложение запущено в браузере.
18
+ */
19
+ private readonly isBrowser;
20
+ /**
21
+ * Время ожидания загрузки скрипта в миллисекундах.
22
+ */
23
+ private readonly loadTimeout;
24
+ /**
25
+ * Имя функции окна, которую скрипт вызывает после загрузки.
26
+ */
27
+ private readonly onloadCallbackName;
28
+ /**
29
+ * Адрес скрипта.
30
+ */
31
+ private readonly scriptUrl;
32
+ /**
33
+ * Загрузка API, общая для всех виджетов. Скрипт загружается один раз; отписка и истечение ожидания у подписчика загрузку не прерывают, после ошибки следующая подписка загружает скрипт заново.
34
+ */
35
+ private readonly loading$;
36
+ /**
37
+ * {@link Observable} API Yandex SmartCaptcha. Значения и ошибки приходят вне зоны Angular, ожидание первого значения ограничено {@link SC_SMART_CAPTCHA_LOAD_TIMEOUT}.
38
+ */
39
+ readonly api$: Observable<ScSmartCaptchaApi>;
40
+ /**
41
+ * Возвращает API Yandex SmartCaptcha, при необходимости загружая скрипт. На сервере ничего не возвращает.
42
+ */
43
+ private load$;
44
+ /**
45
+ * Ждёт вызова функции из параметра `onload` адреса скрипта и возвращает API, которое скрипт к этому моменту создал.
46
+ */
47
+ private onload$;
48
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScSmartCaptchaLoaderService, never>;
49
+ static ɵprov: i0.ɵɵInjectableDeclaration<ScSmartCaptchaLoaderService>;
50
+ }
@@ -0,0 +1,2 @@
1
+ export * from './sc-smart-captcha-load-timeout.token';
2
+ export * from './sc-smart-captcha-settings.token';
@@ -0,0 +1,5 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ /**
3
+ * Токен времени ожидания загрузки скрипта Yandex SmartCaptcha в миллисекундах.
4
+ */
5
+ export declare const SC_SMART_CAPTCHA_LOAD_TIMEOUT: InjectionToken<number>;
@@ -0,0 +1,6 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { ScSmartCaptchaSettings } from '../interfaces/sc-smart-captcha-settings';
3
+ /**
4
+ * Токен настроек Yandex SmartCaptcha. Задаётся приложением.
5
+ */
6
+ export declare const SC_SMART_CAPTCHA_SETTINGS: InjectionToken<ScSmartCaptchaSettings>;
@@ -554,6 +554,40 @@ video {
554
554
  display: none;
555
555
  }
556
556
 
557
+ .container {
558
+ width: 100%;
559
+ }
560
+
561
+ @media (min-width: 640px) {
562
+ .container {
563
+ max-width: 640px;
564
+ }
565
+ }
566
+
567
+ @media (min-width: 768px) {
568
+ .container {
569
+ max-width: 768px;
570
+ }
571
+ }
572
+
573
+ @media (min-width: 1024px) {
574
+ .container {
575
+ max-width: 1024px;
576
+ }
577
+ }
578
+
579
+ @media (min-width: 1280px) {
580
+ .container {
581
+ max-width: 1280px;
582
+ }
583
+ }
584
+
585
+ @media (min-width: 1536px) {
586
+ .container {
587
+ max-width: 1536px;
588
+ }
589
+ }
590
+
557
591
  .pointer-events-none {
558
592
  pointer-events: none;
559
593
  }
@@ -925,14 +959,18 @@ video {
925
959
  max-height: 0px !important;
926
960
  }
927
961
 
928
- .max-h-20 {
929
- max-height: 5rem;
962
+ .max-h-\[7\.5rem\] {
963
+ max-height: 7.5rem;
930
964
  }
931
965
 
932
966
  .min-h-8 {
933
967
  min-height: 2rem;
934
968
  }
935
969
 
970
+ .min-h-\[7\.375rem\] {
971
+ min-height: 7.375rem;
972
+ }
973
+
936
974
  .\!w-auto {
937
975
  width: auto !important;
938
976
  }
@@ -1747,6 +1785,10 @@ video {
1747
1785
  color: var(--tui-status-positive);
1748
1786
  }
1749
1787
 
1788
+ .text-tui-status-warning {
1789
+ color: var(--tui-status-warning);
1790
+ }
1791
+
1750
1792
  .text-tui-success-fill {
1751
1793
  color: var(--tui-status-positive);
1752
1794
  }
@@ -1,30 +0,0 @@
1
- /**
2
- * Селектор iframe reCAPTCHA.
3
- */
4
- const RECAPTCHA_IFRAME_SELECTOR = 'iframe[src*="recaptcha"]';
5
- /**
6
- * Селектор хоста reCAPTCHA.
7
- */
8
- const RECAPTCHA_HOST_SELECTOR = 're-captcha';
9
- /**
10
- * Освобождает ресурсы reCAPTCHA и удаляет осиротевшие iframe после смены маршрута.
11
- *
12
- * @param documentReference Объект документа.
13
- * @param windowReference Объект окна браузера.
14
- */
15
- export function cleanupRecaptchaArtifacts(documentReference, windowReference) {
16
- const windowWithRecaptcha = windowReference;
17
- try {
18
- windowWithRecaptcha.grecaptcha?.reset();
19
- }
20
- catch {
21
- // Ошибки reCAPTCHA не должны блокировать навигацию.
22
- }
23
- documentReference.querySelectorAll(RECAPTCHA_IFRAME_SELECTOR).forEach((iframe) => {
24
- if (iframe.closest(RECAPTCHA_HOST_SELECTOR)) {
25
- return;
26
- }
27
- iframe.remove();
28
- });
29
- }
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYW51cC1yZWNhcHRjaGEtYXJ0aWZhY3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL3Byb3ZpZGVycy9jbGVhbnVwLXJlY2FwdGNoYS1hcnRpZmFjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBc0JBOztHQUVHO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRywwQkFBMEIsQ0FBQztBQUU3RDs7R0FFRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsWUFBWSxDQUFDO0FBRTdDOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLGlCQUEyQixFQUFFLGVBQXVCO0lBQzFGLE1BQU0sbUJBQW1CLEdBQUcsZUFBc0MsQ0FBQztJQUVuRSxJQUFJLENBQUM7UUFDRCxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNMLG9EQUFvRDtJQUN4RCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsZ0JBQWdCLENBQW9CLHlCQUF5QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDaEcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztZQUMxQyxPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNwQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqINCY0L3RgtC10YDRhNC10LnRgSBBUEkgcmVDQVBUQ0hBLlxuICovXG5pbnRlcmZhY2UgUmVjYXB0Y2hhQXBpIHtcbiAgICAvKipcbiAgICAgKiDQodCx0YDQsNGB0YvQstCw0LXRgiByZUNBUFRDSEEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0V2lkZ2V0SWQg0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LLQuNC00LbQtdGC0LAuXG4gICAgICovXG4gICAgcmVzZXQ6IChvcHRXaWRnZXRJZD86IG51bWJlcikgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiDQmNC90YLQtdGA0YTQtdC50YEg0L7QutC90LAg0LHRgNCw0YPQt9C10YDQsCDRgSBBUEkgcmVDQVBUQ0hBLlxuICovXG5pbnRlcmZhY2UgV2luZG93V2l0aFJlY2FwdGNoYSBleHRlbmRzIFdpbmRvdyB7XG4gICAgLyoqXG4gICAgICogQVBJIHJlQ0FQVENIQS5cbiAgICAgKi9cbiAgICBncmVjYXB0Y2hhPzogUmVjYXB0Y2hhQXBpO1xufVxuXG4vKipcbiAqINCh0LXQu9C10LrRgtC+0YAgaWZyYW1lIHJlQ0FQVENIQS5cbiAqL1xuY29uc3QgUkVDQVBUQ0hBX0lGUkFNRV9TRUxFQ1RPUiA9ICdpZnJhbWVbc3JjKj1cInJlY2FwdGNoYVwiXSc7XG5cbi8qKlxuICog0KHQtdC70LXQutGC0L7RgCDRhdC+0YHRgtCwIHJlQ0FQVENIQS5cbiAqL1xuY29uc3QgUkVDQVBUQ0hBX0hPU1RfU0VMRUNUT1IgPSAncmUtY2FwdGNoYSc7XG5cbi8qKlxuICog0J7RgdCy0L7QsdC+0LbQtNCw0LXRgiDRgNC10YHRg9GA0YHRiyByZUNBUFRDSEEg0Lgg0YPQtNCw0LvRj9C10YIg0L7RgdC40YDQvtGC0LXQstGI0LjQtSBpZnJhbWUg0L/QvtGB0LvQtSDRgdC80LXQvdGLINC80LDRgNGI0YDRg9GC0LAuXG4gKlxuICogQHBhcmFtIGRvY3VtZW50UmVmZXJlbmNlINCe0LHRitC10LrRgiDQtNC+0LrRg9C80LXQvdGC0LAuXG4gKiBAcGFyYW0gd2luZG93UmVmZXJlbmNlINCe0LHRitC10LrRgiDQvtC60L3QsCDQsdGA0LDRg9C30LXRgNCwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW51cFJlY2FwdGNoYUFydGlmYWN0cyhkb2N1bWVudFJlZmVyZW5jZTogRG9jdW1lbnQsIHdpbmRvd1JlZmVyZW5jZTogV2luZG93KTogdm9pZCB7XG4gICAgY29uc3Qgd2luZG93V2l0aFJlY2FwdGNoYSA9IHdpbmRvd1JlZmVyZW5jZSBhcyBXaW5kb3dXaXRoUmVjYXB0Y2hhO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgd2luZG93V2l0aFJlY2FwdGNoYS5ncmVjYXB0Y2hhPy5yZXNldCgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyDQntGI0LjQsdC60LggcmVDQVBUQ0hBINC90LUg0LTQvtC70LbQvdGLINCx0LvQvtC60LjRgNC+0LLQsNGC0Ywg0L3QsNCy0LjQs9Cw0YbQuNGOLlxuICAgIH1cblxuICAgIGRvY3VtZW50UmVmZXJlbmNlLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTElGcmFtZUVsZW1lbnQ+KFJFQ0FQVENIQV9JRlJBTUVfU0VMRUNUT1IpLmZvckVhY2goKGlmcmFtZSkgPT4ge1xuICAgICAgICBpZiAoaWZyYW1lLmNsb3Nlc3QoUkVDQVBUQ0hBX0hPU1RfU0VMRUNUT1IpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZnJhbWUucmVtb3ZlKCk7XG4gICAgfSk7XG59XG4iXX0=
@@ -1,7 +0,0 @@
1
- /**
2
- * Освобождает ресурсы reCAPTCHA и удаляет осиротевшие iframe после смены маршрута.
3
- *
4
- * @param documentReference Объект документа.
5
- * @param windowReference Объект окна браузера.
6
- */
7
- export declare function cleanupRecaptchaArtifacts(documentReference: Document, windowReference: Window): void;