@sumaris-net/ngx-components 18.2.20 → 18.2.21
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/doc/changelog.md +5 -0
- package/esm2022/src/app/core/form/form.utils.mjs +3 -2
- package/esm2022/src/app/core/form/properties/properties.form.mjs +1 -1
- package/esm2022/src/app/core/table/testing/table.testing.mjs +1 -1
- package/esm2022/src/app/core/table/testing/table2.testing.mjs +1 -1
- package/esm2022/src/app/shared/form/field.component.mjs +5 -5
- package/esm2022/src/app/shared/graph/graph-colors.mjs +3 -2
- package/esm2022/src/app/shared/inputs.mjs +19 -11
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +1 -1
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +145 -46
- package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +4 -4
- package/esm2022/src/app/shared/material/chips/material.chips.mjs +3 -3
- package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +24 -21
- package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +1 -1
- package/esm2022/src/app/shared/regexps.mjs +3 -3
- package/fesm2022/sumaris-net.ngx-components.mjs +200 -87
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/app/core/form/form.utils.d.ts +2 -1
- package/src/app/shared/form/field.component.d.ts +2 -2
- package/src/app/shared/graph/graph-colors.d.ts +1 -1
- package/src/app/shared/inputs.d.ts +3 -2
- package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +6 -0
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +8 -1
- package/src/app/shared/material/swipe/material.swipe.d.ts +2 -4
- package/src/assets/manifest.json +1 -1
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AbstractControl } from '@angular/forms';
|
|
2
|
-
import { filterNumberInput, selectInputContent } from '../../shared/inputs';
|
|
2
|
+
import { filterNumberInput, selectInputContent, selectInputContentFromEvent } from '../../shared/inputs';
|
|
3
3
|
import { WaitForOptions } from '../../shared/observables';
|
|
4
4
|
import { addValueInArray, clearValueInArray, copyEntity2Form, disableControl, disableControls, enableControl, enableControls, filterFormErrors, filterFormErrorsByPath, filterFormErrorsByPrefix, getControlFromPath, getFormErrors, getFormValueFromEntity, logFormErrors, markAllAsTouched, markAsUntouched, removeValueInArray, resizeArray, setControlEnabled, setControlsEnabled, updateValueAndValidity, waitIdle, waitWhilePending } from '../../shared/forms';
|
|
5
5
|
export declare type IAppFormGetter = () => IAppForm;
|
|
@@ -215,6 +215,7 @@ export declare class AppFormUtils {
|
|
|
215
215
|
static disableControls: typeof disableControls;
|
|
216
216
|
static setControlEnabled: typeof setControlEnabled;
|
|
217
217
|
static setControlsEnabled: typeof setControlsEnabled;
|
|
218
|
+
static selectInputContentFromEvent: typeof selectInputContentFromEvent;
|
|
218
219
|
static selectInputContent: typeof selectInputContent;
|
|
219
220
|
/**
|
|
220
221
|
* @deprecated use markAllAsTouched() instead (naming was wrong)
|
|
@@ -2,7 +2,7 @@ import { ChangeDetectorRef, ElementRef, EventEmitter, Injector, OnInit } from '@
|
|
|
2
2
|
import { ControlValueAccessor, FormGroupDirective, UntypedFormControl } from '@angular/forms';
|
|
3
3
|
import { AppFloatLabelType, DisplayFn, FormFieldDefinition, FormFieldType } from './field.model';
|
|
4
4
|
import { TranslateService } from '@ngx-translate/core';
|
|
5
|
-
import { filterNumberInput,
|
|
5
|
+
import { filterNumberInput, selectInputContentFromEvent } from '../inputs';
|
|
6
6
|
import { Property } from '../types';
|
|
7
7
|
import { ThemePalette } from '@angular/material/core';
|
|
8
8
|
import { PredefinedColors } from '@ionic/core';
|
|
@@ -54,7 +54,7 @@ export declare class AppFormField implements OnInit, ControlValueAccessor {
|
|
|
54
54
|
filterAlphanumericalInput(event: KeyboardEvent): void;
|
|
55
55
|
focus(): void;
|
|
56
56
|
filterNumberInput: typeof filterNumberInput;
|
|
57
|
-
|
|
57
|
+
selectInputContentFromEvent: typeof selectInputContentFromEvent;
|
|
58
58
|
getDisplayValueFn(definition: FormFieldDefinition): DisplayFn;
|
|
59
59
|
getColorContrast(color: string): string | undefined;
|
|
60
60
|
/**
|
|
@@ -47,7 +47,7 @@ export declare class ColorScale {
|
|
|
47
47
|
/**
|
|
48
48
|
* Create an array with the given color
|
|
49
49
|
**/
|
|
50
|
-
static fix(length?: number, colorName?: ColorName):
|
|
50
|
+
static fix(length?: number, colorName?: ColorName): string[];
|
|
51
51
|
private _min;
|
|
52
52
|
private _max;
|
|
53
53
|
private _rangeSize;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { ElementRef, QueryList } from '@angular/core';
|
|
2
2
|
import { FocusableElement } from './focusable';
|
|
3
|
-
export declare function
|
|
4
|
-
export declare function
|
|
3
|
+
export declare function selectInputContentFromEvent(event: Event): boolean;
|
|
4
|
+
export declare function selectInputContent(input: HTMLInputElement | HTMLTextAreaElement | any): boolean;
|
|
5
|
+
export declare function selectInputRange(input: HTMLInputElement | HTMLTextAreaElement, startIndex: number, endIndex?: number, direction?: 'backward' | 'forward' | 'none'): boolean;
|
|
5
6
|
export declare function getCaretPosition(input: any): number;
|
|
6
7
|
export declare function moveInputCaretToSeparator(event: KeyboardEvent, separator: string, forward?: boolean): boolean;
|
|
7
8
|
export declare function filterNumberInput(event: KeyboardEvent, allowDecimals: boolean, decimalSeparator?: string): void;
|
|
@@ -13,6 +13,7 @@ export declare interface MatAutocompleteFieldConfig<T = any, F = any> {
|
|
|
13
13
|
displayWithSeparator?: string;
|
|
14
14
|
splitSearchText?: boolean;
|
|
15
15
|
trimSearchText?: boolean;
|
|
16
|
+
clearInvalidSearchTextOnBlur?: boolean;
|
|
16
17
|
equals?: EqualsFn;
|
|
17
18
|
showAllOnFocus?: boolean;
|
|
18
19
|
showPanelOnFocus?: boolean;
|
|
@@ -30,6 +31,11 @@ export declare interface MatAutocompleteFieldConfig<T = any, F = any> {
|
|
|
30
31
|
* Add a delay (ms) before trying to select input content (desktop only)
|
|
31
32
|
*/
|
|
32
33
|
selectInputContentOnFocusDelay?: number;
|
|
34
|
+
/**
|
|
35
|
+
* If true, any invalid value entered in the input field will be cleared when the input loses focus.
|
|
36
|
+
* This helps in preventing invalid data to be displayed on the field
|
|
37
|
+
*/
|
|
38
|
+
clearInvalidValueOnBlur?: boolean;
|
|
33
39
|
/**
|
|
34
40
|
* Class to apply to the `div.mat-mdc-select-panel`
|
|
35
41
|
*/
|
|
@@ -35,6 +35,7 @@ export declare class MatAutocompleteField implements OnInit, AfterViewInit, OnDe
|
|
|
35
35
|
protected _tabindex: number;
|
|
36
36
|
protected _$inputItems: BehaviorSubject<any[]>;
|
|
37
37
|
protected _$filteredItems: BehaviorSubject<any[]>;
|
|
38
|
+
protected _selectedItem: any;
|
|
38
39
|
protected _displayValue: string;
|
|
39
40
|
protected _moreItemsCount: number;
|
|
40
41
|
protected _fetchMore$: EventEmitter<Event>;
|
|
@@ -63,6 +64,7 @@ export declare class MatAutocompleteField implements OnInit, AfterViewInit, OnDe
|
|
|
63
64
|
showAllOnFocus: boolean;
|
|
64
65
|
showPanelOnFocus: boolean;
|
|
65
66
|
reloadItemsOnFocus: boolean;
|
|
67
|
+
clearInvalidValueOnBlur: boolean;
|
|
66
68
|
autofocus: boolean;
|
|
67
69
|
config: MatAutocompleteFieldConfig;
|
|
68
70
|
i18nPrefix: string;
|
|
@@ -95,6 +97,7 @@ export declare class MatAutocompleteField implements OnInit, AfterViewInit, OnDe
|
|
|
95
97
|
focused: EventEmitter<FocusEvent>;
|
|
96
98
|
dropButtonClick: EventEmitter<Event>;
|
|
97
99
|
keydownEscape: EventEmitter<Event>;
|
|
100
|
+
keydownBackspace: EventEmitter<Event>;
|
|
98
101
|
keyupEnter: EventEmitter<Event>;
|
|
99
102
|
selectionChange: EventEmitter<MatAutocompleteFieldSelectChange>;
|
|
100
103
|
matSelect: MatSelect;
|
|
@@ -142,6 +145,7 @@ export declare class MatAutocompleteField implements OnInit, AfterViewInit, OnDe
|
|
|
142
145
|
protected markAsLoading(): void;
|
|
143
146
|
protected onSelectionChange(event: MatSelectChange): void;
|
|
144
147
|
protected onOptionSelected(event: MatAutocompleteSelectedEvent): void;
|
|
148
|
+
protected toggleShowPanel(event: Event): void;
|
|
145
149
|
private suggest;
|
|
146
150
|
private fetchMore;
|
|
147
151
|
private updateImplicitValue;
|
|
@@ -160,8 +164,10 @@ export declare class MatAutocompleteField implements OnInit, AfterViewInit, OnDe
|
|
|
160
164
|
* @private
|
|
161
165
|
*/
|
|
162
166
|
private _fixSearchbarOverlay;
|
|
167
|
+
private setInputTextValue;
|
|
168
|
+
protected onBackspace(event: Event): void;
|
|
163
169
|
static ɵfac: i0.ɵɵFactoryDeclaration<MatAutocompleteField, [null, null, null, null, null, { optional: true; }]>;
|
|
164
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<MatAutocompleteField, "mat-autocomplete-field", never, { "equals": { "alias": "equals"; "required": false; }; "logPrefix": { "alias": "logPrefix"; "required": false; }; "formControl": { "alias": "formControl"; "required": false; }; "formControlName": { "alias": "formControlName"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; "label": { "alias": "label"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; "subscriptSizing": { "alias": "subscriptSizing"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "suggestFn": { "alias": "suggestFn"; "required": false; }; "required": { "alias": "required"; "required": false; }; "hideRequiredMarker": { "alias": "hideRequiredMarker"; "required": false; }; "mobile": { "alias": "mobile"; "required": false; }; "clearable": { "alias": "clearable"; "required": false; }; "debounceTime": { "alias": "debounceTime"; "required": false; }; "displaySeparator": { "alias": "displaySeparator"; "required": false; }; "displayWith": { "alias": "displayWith"; "required": false; }; "displayAttributes": { "alias": "displayAttributes"; "required": false; }; "displayColumnSizes": { "alias": "displayColumnSizes"; "required": false; }; "displayColumnNames": { "alias": "displayColumnNames"; "required": false; }; "highlightAccent": { "alias": "highlightAccent"; "required": false; }; "showAllOnFocus": { "alias": "showAllOnFocus"; "required": false; }; "showPanelOnFocus": { "alias": "showPanelOnFocus"; "required": false; }; "reloadItemsOnFocus": { "alias": "reloadItemsOnFocus"; "required": false; }; "autofocus": { "alias": "autofocus"; "required": false; }; "config": { "alias": "config"; "required": false; }; "i18nPrefix": { "alias": "i18nPrefix"; "required": false; }; "noResultMessage": { "alias": "noResultMessage"; "required": false; }; "panelClass": { "alias": "panelClass"; "required": false; }; "panelWidth": { "alias": "panelWidth"; "required": false; }; "disableRipple": { "alias": "disableRipple"; "required": false; }; "matAutocompletePosition": { "alias": "matAutocompletePosition"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "fetchMoreThreshold": { "alias": "fetchMoreThreshold"; "required": false; }; "suggestLengthThreshold": { "alias": "suggestLengthThreshold"; "required": false; }; "showLoadingSpinner": { "alias": "showLoadingSpinner"; "required": false; }; "debug": { "alias": "debug"; "required": false; }; "showSearchBar": { "alias": "showSearchBar"; "required": false; }; "stickySearchBar": { "alias": "stickySearchBar"; "required": false; }; "applyImplicitValue": { "alias": "applyImplicitValue"; "required": false; }; "dropButtonTitle": { "alias": "dropButtonTitle"; "required": false; }; "clearButtonTitle": { "alias": "clearButtonTitle"; "required": false; }; "trimSearchText": { "alias": "trimSearchText"; "required": false; }; "splitSearchText": { "alias": "splitSearchText"; "required": false; }; "selectInputContentOnFocus": { "alias": "selectInputContentOnFocus"; "required": false; }; "selectInputContentOnFocusDelay": { "alias": "selectInputContentOnFocusDelay"; "required": false; }; "classList": { "alias": "class"; "required": false; }; "filter": { "alias": "filter"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "tabindex": { "alias": "tabindex"; "required": false; }; "items": { "alias": "items"; "required": false; }; }, { "clicked": "click"; "blurred": "blur"; "focused": "focus"; "dropButtonClick": "dropButtonClick"; "keydownEscape": "keydown.escape"; "keyupEnter": "keyup.enter"; "selectionChange": "selectionChange"; }, never, ["[matAfter]", "[matPrefix]", "[matSuffix]", "mat-error,[matError]", "mat-hint:not([align='end']),[matHint]", "mat-hint[align='end']"], false, never>;
|
|
170
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<MatAutocompleteField, "mat-autocomplete-field", never, { "equals": { "alias": "equals"; "required": false; }; "logPrefix": { "alias": "logPrefix"; "required": false; }; "formControl": { "alias": "formControl"; "required": false; }; "formControlName": { "alias": "formControlName"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; "label": { "alias": "label"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; "subscriptSizing": { "alias": "subscriptSizing"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "suggestFn": { "alias": "suggestFn"; "required": false; }; "required": { "alias": "required"; "required": false; }; "hideRequiredMarker": { "alias": "hideRequiredMarker"; "required": false; }; "mobile": { "alias": "mobile"; "required": false; }; "clearable": { "alias": "clearable"; "required": false; }; "debounceTime": { "alias": "debounceTime"; "required": false; }; "displaySeparator": { "alias": "displaySeparator"; "required": false; }; "displayWith": { "alias": "displayWith"; "required": false; }; "displayAttributes": { "alias": "displayAttributes"; "required": false; }; "displayColumnSizes": { "alias": "displayColumnSizes"; "required": false; }; "displayColumnNames": { "alias": "displayColumnNames"; "required": false; }; "highlightAccent": { "alias": "highlightAccent"; "required": false; }; "showAllOnFocus": { "alias": "showAllOnFocus"; "required": false; }; "showPanelOnFocus": { "alias": "showPanelOnFocus"; "required": false; }; "reloadItemsOnFocus": { "alias": "reloadItemsOnFocus"; "required": false; }; "clearInvalidValueOnBlur": { "alias": "clearInvalidValueOnBlur"; "required": false; }; "autofocus": { "alias": "autofocus"; "required": false; }; "config": { "alias": "config"; "required": false; }; "i18nPrefix": { "alias": "i18nPrefix"; "required": false; }; "noResultMessage": { "alias": "noResultMessage"; "required": false; }; "panelClass": { "alias": "panelClass"; "required": false; }; "panelWidth": { "alias": "panelWidth"; "required": false; }; "disableRipple": { "alias": "disableRipple"; "required": false; }; "matAutocompletePosition": { "alias": "matAutocompletePosition"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "fetchMoreThreshold": { "alias": "fetchMoreThreshold"; "required": false; }; "suggestLengthThreshold": { "alias": "suggestLengthThreshold"; "required": false; }; "showLoadingSpinner": { "alias": "showLoadingSpinner"; "required": false; }; "debug": { "alias": "debug"; "required": false; }; "showSearchBar": { "alias": "showSearchBar"; "required": false; }; "stickySearchBar": { "alias": "stickySearchBar"; "required": false; }; "applyImplicitValue": { "alias": "applyImplicitValue"; "required": false; }; "dropButtonTitle": { "alias": "dropButtonTitle"; "required": false; }; "clearButtonTitle": { "alias": "clearButtonTitle"; "required": false; }; "trimSearchText": { "alias": "trimSearchText"; "required": false; }; "splitSearchText": { "alias": "splitSearchText"; "required": false; }; "selectInputContentOnFocus": { "alias": "selectInputContentOnFocus"; "required": false; }; "selectInputContentOnFocusDelay": { "alias": "selectInputContentOnFocusDelay"; "required": false; }; "classList": { "alias": "class"; "required": false; }; "filter": { "alias": "filter"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "tabindex": { "alias": "tabindex"; "required": false; }; "items": { "alias": "items"; "required": false; }; }, { "clicked": "click"; "blurred": "blur"; "focused": "focus"; "dropButtonClick": "dropButtonClick"; "keydownEscape": "keydown.escape"; "keydownBackspace": "keydown.backspace"; "keyupEnter": "keyup.enter"; "selectionChange": "selectionChange"; }, never, ["[matAfter]", "[matPrefix]", "[matSuffix]", "mat-error,[matError]", "mat-hint:not([align='end']),[matHint]", "mat-hint[align='end']"], false, never>;
|
|
165
171
|
static ngAcceptInputType_required: unknown;
|
|
166
172
|
static ngAcceptInputType_hideRequiredMarker: unknown;
|
|
167
173
|
static ngAcceptInputType_mobile: unknown;
|
|
@@ -171,6 +177,7 @@ export declare class MatAutocompleteField implements OnInit, AfterViewInit, OnDe
|
|
|
171
177
|
static ngAcceptInputType_showAllOnFocus: unknown;
|
|
172
178
|
static ngAcceptInputType_showPanelOnFocus: unknown;
|
|
173
179
|
static ngAcceptInputType_reloadItemsOnFocus: unknown;
|
|
180
|
+
static ngAcceptInputType_clearInvalidValueOnBlur: unknown;
|
|
174
181
|
static ngAcceptInputType_autofocus: unknown;
|
|
175
182
|
static ngAcceptInputType_disableRipple: unknown;
|
|
176
183
|
static ngAcceptInputType_multiple: unknown;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ChangeDetectorRef, ElementRef, EventEmitter, OnDestroy, OnInit } from '@angular/core';
|
|
2
2
|
import { ControlValueAccessor, FormGroupDirective, UntypedFormControl } from '@angular/forms';
|
|
3
3
|
import { BehaviorSubject, Observable } from 'rxjs';
|
|
4
|
-
import { InputElement
|
|
4
|
+
import { InputElement } from '../../inputs';
|
|
5
5
|
import { AppFloatLabelType, DisplayFn, EqualsFn } from '../../form/field.model';
|
|
6
6
|
import { Swiper } from 'swiper/types';
|
|
7
7
|
import { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form-field';
|
|
@@ -23,7 +23,6 @@ export declare class MatSwipeField implements OnInit, InputElement, OnDestroy, C
|
|
|
23
23
|
protected showSlides: boolean;
|
|
24
24
|
protected $items: BehaviorSubject<any[]>;
|
|
25
25
|
protected $loaded: BehaviorSubject<boolean>;
|
|
26
|
-
protected swiperModules: ((opts: any) => void)[];
|
|
27
26
|
logPrefix: string;
|
|
28
27
|
formControl: UntypedFormControl;
|
|
29
28
|
formControlName: string;
|
|
@@ -55,6 +54,7 @@ export declare class MatSwipeField implements OnInit, InputElement, OnDestroy, C
|
|
|
55
54
|
get value(): any;
|
|
56
55
|
get disabled(): any;
|
|
57
56
|
get enabled(): any;
|
|
57
|
+
protected getSwiper(): Swiper;
|
|
58
58
|
constructor(cd: ChangeDetectorRef, formGroupDir: FormGroupDirective);
|
|
59
59
|
ngOnInit(): void;
|
|
60
60
|
ngOnDestroy(): void;
|
|
@@ -69,7 +69,6 @@ export declare class MatSwipeField implements OnInit, InputElement, OnDestroy, C
|
|
|
69
69
|
registerOnChange(fn: any): void;
|
|
70
70
|
registerOnTouched(fn: any): void;
|
|
71
71
|
setDisabledState(isDisabled: boolean): void;
|
|
72
|
-
selectInputContent: typeof selectInputContent;
|
|
73
72
|
previous(): void;
|
|
74
73
|
next(): void;
|
|
75
74
|
reachStart(reached: boolean): void;
|
|
@@ -83,7 +82,6 @@ export declare class MatSwipeField implements OnInit, InputElement, OnDestroy, C
|
|
|
83
82
|
private updateSlides;
|
|
84
83
|
private slideTo;
|
|
85
84
|
private updateButtons;
|
|
86
|
-
getSwiper(): Promise<Swiper>;
|
|
87
85
|
ready(): Promise<void>;
|
|
88
86
|
static ɵfac: i0.ɵɵFactoryDeclaration<MatSwipeField, [null, { optional: true; }]>;
|
|
89
87
|
static ɵcmp: i0.ɵɵComponentDeclaration<MatSwipeField, "mat-swipe-field", never, { "logPrefix": { "alias": "logPrefix"; "required": false; }; "formControl": { "alias": "formControl"; "required": false; }; "formControlName": { "alias": "formControlName"; "required": false; }; "floatLabel": { "alias": "floatLabel"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; "subscriptSizing": { "alias": "subscriptSizing"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "debug": { "alias": "debug"; "required": false; }; "required": { "alias": "required"; "required": false; }; "mobile": { "alias": "mobile"; "required": false; }; "clearable": { "alias": "clearable"; "required": false; }; "equals": { "alias": "equals"; "required": false; }; "displayWith": { "alias": "displayWith"; "required": false; }; "displayAttributes": { "alias": "displayAttributes"; "required": false; }; "appAutofocus": { "alias": "appAutofocus"; "required": false; }; "classList": { "alias": "class"; "required": false; }; "tabindex": { "alias": "tabindex"; "required": false; }; "items": { "alias": "items"; "required": false; }; }, { "onClick": "click"; "blurred": "blur"; "focused": "focus"; }, never, never, false, never>;
|
package/src/assets/manifest.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "ngx-sumaris-components",
|
|
3
3
|
"short_name": "ngx-sumaris-components",
|
|
4
4
|
"manifest_version": 1,
|
|
5
|
-
"version": "18.2.
|
|
5
|
+
"version": "18.2.21",
|
|
6
6
|
"default_locale": "fr",
|
|
7
7
|
"description": "Angular components for building beautiful and responsive Apps",
|
|
8
8
|
"icons": [{
|