@kksdev/ds-angular 1.7.2 → 1.8.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.
package/index.d.ts CHANGED
@@ -7640,6 +7640,215 @@ declare class DsListGroup {
7640
7640
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsListGroup, "ds-list-group", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "count": { "alias": "count"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, { "expandedChange": "expandedChange"; }, never, ["*"], true, never>;
7641
7641
  }
7642
7642
 
7643
+ /**
7644
+ * Option pour le ds-entity-picker
7645
+ * Supporte les entités riches avec icône, couleur, emoji
7646
+ */
7647
+ interface DsEntityOption {
7648
+ /** Identifiant unique de l'option */
7649
+ value: string;
7650
+ /** Texte affiché */
7651
+ label: string;
7652
+ /** Description secondaire (optionnel) */
7653
+ description?: string;
7654
+ /** Icône FontAwesome (optionnel) */
7655
+ icon?: IconDefinition$2;
7656
+ /** Emoji affiché à gauche (optionnel) */
7657
+ emoji?: string;
7658
+ /** Couleur hex ou CSS (optionnel) */
7659
+ color?: string;
7660
+ /** Option désactivée */
7661
+ disabled?: boolean;
7662
+ /** Données custom attachées */
7663
+ data?: unknown;
7664
+ }
7665
+ /** Tailles disponibles */
7666
+ type DsEntityPickerSize = 'sm' | 'md' | 'lg';
7667
+ /** Mode d'affichage des sélections multiples */
7668
+ type DsEntityPickerDisplayMode = 'chip' | 'count';
7669
+
7670
+ /**
7671
+ * Entity Picker - Sélecteur d'entités riches
7672
+ *
7673
+ * Permet la sélection d'entités avec icônes, couleurs, emojis.
7674
+ * Supporte la sélection simple et multiple avec affichage en chips colorés.
7675
+ *
7676
+ * @example
7677
+ * ```html
7678
+ * <!-- Sélection simple -->
7679
+ * <ds-entity-picker
7680
+ * [options]="tags"
7681
+ * [(ngModel)]="selectedTag"
7682
+ * placeholder="Choisir un tag"
7683
+ * />
7684
+ *
7685
+ * <!-- Sélection multiple -->
7686
+ * <ds-entity-picker
7687
+ * [options]="categories"
7688
+ * [multiple]="true"
7689
+ * [(ngModel)]="selectedCategories"
7690
+ * [allowCreate]="true"
7691
+ * (createRequested)="onCreateCategory($event)"
7692
+ * />
7693
+ * ```
7694
+ */
7695
+ declare class DsEntityPicker implements ControlValueAccessor {
7696
+ /** Liste des options disponibles */
7697
+ readonly options: _angular_core.InputSignal<DsEntityOption[]>;
7698
+ /** Active la sélection multiple */
7699
+ readonly multiple: _angular_core.InputSignal<boolean>;
7700
+ /** Permet la création d'options à la volée */
7701
+ readonly allowCreate: _angular_core.InputSignal<boolean>;
7702
+ /** Placeholder du champ de recherche */
7703
+ readonly placeholder: _angular_core.InputSignal<string>;
7704
+ /** Taille du composant */
7705
+ readonly size: _angular_core.InputSignal<DsEntityPickerSize>;
7706
+ /** Mode d'affichage des sélections multiples */
7707
+ readonly displayMode: _angular_core.InputSignal<DsEntityPickerDisplayMode>;
7708
+ /** Afficher le bouton clear */
7709
+ readonly clearable: _angular_core.InputSignal<boolean>;
7710
+ /** Nombre maximum de sélections (multi-select) */
7711
+ readonly maxSelections: _angular_core.InputSignal<number | undefined>;
7712
+ /** Label du champ */
7713
+ readonly label: _angular_core.InputSignal<string>;
7714
+ /** Message d'erreur */
7715
+ readonly error: _angular_core.InputSignal<string>;
7716
+ /** Texte d'aide */
7717
+ readonly helper: _angular_core.InputSignal<string>;
7718
+ /** Champ désactivé */
7719
+ readonly disabled: _angular_core.InputSignal<boolean>;
7720
+ /** Champ obligatoire */
7721
+ readonly required: _angular_core.InputSignal<boolean>;
7722
+ /** Caractères minimum avant filtrage */
7723
+ readonly minChars: _angular_core.InputSignal<number>;
7724
+ /** Texte si aucun résultat */
7725
+ readonly noResultsText: _angular_core.InputSignal<string>;
7726
+ /** Template du texte de création (utiliser {query} comme placeholder) */
7727
+ readonly createText: _angular_core.InputSignal<string>;
7728
+ /** Nom du champ (pour formulaires) */
7729
+ readonly name: _angular_core.InputSignal<string>;
7730
+ /** Émis lors d'un changement de sélection */
7731
+ readonly selectionChange: _angular_core.OutputEmitterRef<DsEntityOption | DsEntityOption[] | null>;
7732
+ /** Émis lors d'une demande de création */
7733
+ readonly createRequested: _angular_core.OutputEmitterRef<string>;
7734
+ /** Émis lors d'un changement de recherche */
7735
+ readonly searchChange: _angular_core.OutputEmitterRef<string>;
7736
+ /** Émis à l'ouverture du panel */
7737
+ readonly opened: _angular_core.OutputEmitterRef<void>;
7738
+ /** Émis à la fermeture du panel */
7739
+ readonly closed: _angular_core.OutputEmitterRef<void>;
7740
+ protected readonly isOpen: _angular_core.WritableSignal<boolean>;
7741
+ protected readonly searchQuery: _angular_core.WritableSignal<string>;
7742
+ protected readonly focusedIndex: _angular_core.WritableSignal<number>;
7743
+ private readonly internalValue;
7744
+ private readonly cvaDisabled;
7745
+ inputElement: ElementRef<HTMLInputElement>;
7746
+ listbox: ElementRef<HTMLUListElement>;
7747
+ private onChange;
7748
+ private onTouched;
7749
+ readonly iconPlus: _fortawesome_fontawesome_common_types.IconDefinition;
7750
+ readonly iconChevron: _fortawesome_fontawesome_common_types.IconDefinition;
7751
+ readonly iconClear: _fortawesome_fontawesome_common_types.IconDefinition;
7752
+ readonly iconSearch: _fortawesome_fontawesome_common_types.IconDefinition;
7753
+ readonly overlayPositions: _angular_cdk_overlay.ConnectedPosition[];
7754
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
7755
+ /** Options sélectionnées (objets complets) */
7756
+ protected readonly selectedOptions: _angular_core.Signal<DsEntityOption[]>;
7757
+ /** Texte affiché dans l'input (mode single) */
7758
+ protected readonly displayValue: _angular_core.Signal<string>;
7759
+ /** Options filtrées selon la recherche */
7760
+ protected readonly filteredOptions: _angular_core.Signal<DsEntityOption[]>;
7761
+ /** Peut créer une nouvelle option */
7762
+ protected readonly canCreate: _angular_core.Signal<boolean>;
7763
+ /** Afficher le dropdown */
7764
+ protected readonly shouldShowDropdown: _angular_core.Signal<boolean>;
7765
+ /** Classes du container */
7766
+ protected readonly containerClasses: _angular_core.Signal<{
7767
+ [x: string]: boolean;
7768
+ 'ds-entity-picker': boolean;
7769
+ 'ds-entity-picker--open': boolean;
7770
+ 'ds-entity-picker--disabled': boolean;
7771
+ 'ds-entity-picker--error': boolean;
7772
+ 'ds-entity-picker--multiple': boolean;
7773
+ }>;
7774
+ /** Classes de l'input */
7775
+ protected readonly inputClasses: _angular_core.Signal<{
7776
+ 'ds-entity-picker__input': boolean;
7777
+ 'ds-entity-picker__input--has-value': boolean;
7778
+ }>;
7779
+ /** ID unique pour le listbox */
7780
+ protected readonly listboxId: _angular_core.Signal<string>;
7781
+ /** ID unique pour l'input */
7782
+ protected readonly inputId: _angular_core.Signal<string>;
7783
+ /** Texte du compteur (mode count) */
7784
+ protected readonly countText: _angular_core.Signal<string>;
7785
+ /** Limite de sélection atteinte */
7786
+ protected readonly maxReached: _angular_core.Signal<boolean>;
7787
+ /** Texte formaté pour l'option de création */
7788
+ protected readonly formattedCreateText: _angular_core.Signal<string>;
7789
+ writeValue(value: string | string[] | null): void;
7790
+ registerOnChange(fn: (value: string | string[] | null) => void): void;
7791
+ registerOnTouched(fn: () => void): void;
7792
+ setDisabledState(isDisabled: boolean): void;
7793
+ onInputFocus(): void;
7794
+ onInputBlur(): void;
7795
+ onSearchInput(event: Event): void;
7796
+ open(): void;
7797
+ close(): void;
7798
+ selectOption(option: DsEntityOption): void;
7799
+ removeOption(option: DsEntityOption): void;
7800
+ clear(event?: Event): void;
7801
+ requestCreate(): void;
7802
+ onKeyDown(event: KeyboardEvent): void;
7803
+ onDocumentClick(event: Event): void;
7804
+ private moveFocus;
7805
+ private scrollFocusedOptionIntoView;
7806
+ protected isOptionFocused(index: number): boolean;
7807
+ protected isOptionSelected(option: DsEntityOption): boolean;
7808
+ protected getOptionId(index: number): string;
7809
+ protected isCreateFocused(): boolean;
7810
+ protected trackOption(_: number, option: DsEntityOption): string;
7811
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsEntityPicker, never>;
7812
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsEntityPicker, "ds-entity-picker", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "allowCreate": { "alias": "allowCreate"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "displayMode": { "alias": "displayMode"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "maxSelections": { "alias": "maxSelections"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "helper": { "alias": "helper"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "minChars": { "alias": "minChars"; "required": false; "isSignal": true; }; "noResultsText": { "alias": "noResultsText"; "required": false; "isSignal": true; }; "createText": { "alias": "createText"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "createRequested": "createRequested"; "searchChange": "searchChange"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
7813
+ }
7814
+
7815
+ /**
7816
+ * Chip coloré pour afficher une entité sélectionnée dans ds-entity-picker
7817
+ *
7818
+ * @example
7819
+ * ```html
7820
+ * <ds-entity-chip
7821
+ * [option]="{ value: '1', label: 'Important', color: '#ef4444', emoji: '🏷️' }"
7822
+ * [removable]="true"
7823
+ * (removed)="onRemove()"
7824
+ * />
7825
+ * ```
7826
+ */
7827
+ declare class DsEntityChip {
7828
+ /** Option à afficher */
7829
+ readonly option: _angular_core.InputSignal<DsEntityOption>;
7830
+ /** Taille du chip */
7831
+ readonly size: _angular_core.InputSignal<DsEntityPickerSize>;
7832
+ /** Afficher le bouton de suppression */
7833
+ readonly removable: _angular_core.InputSignal<boolean>;
7834
+ /** Chip désactivé */
7835
+ readonly disabled: _angular_core.InputSignal<boolean>;
7836
+ /** Événement de suppression */
7837
+ readonly removed: _angular_core.OutputEmitterRef<DsEntityOption>;
7838
+ /** Icône de fermeture */
7839
+ readonly closeIcon: IconDefinition;
7840
+ /** Couleur du chip (depuis l'option ou fallback) */
7841
+ readonly chipColor: _angular_core.Signal<string>;
7842
+ /** Couleur de fond (10% opacity) */
7843
+ readonly backgroundColor: _angular_core.Signal<string>;
7844
+ /** Gestion du clic sur le bouton supprimer */
7845
+ handleRemove(event: Event): void;
7846
+ /** Gestion du clavier */
7847
+ handleKeyDown(event: KeyboardEvent): void;
7848
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsEntityChip, never>;
7849
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsEntityChip, "ds-entity-chip", never, { "option": { "alias": "option"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "removed": "removed"; }, never, never, true, never>;
7850
+ }
7851
+
7643
7852
  /**
7644
7853
  * Positions standard pour dropdowns (menus déroulants, select, etc.)
7645
7854
  *
@@ -8011,5 +8220,5 @@ declare function generateId(): string;
8011
8220
  */
8012
8221
  declare function generateShortId(prefix?: string): string;
8013
8222
 
8014
- export { AUTOCOMPLETE_POSITIONS, DROPDOWN_POSITIONS, DROPDOWN_POSITIONS_RIGHT, DROPDOWN_POSITIONS_TOP, DsAccordion, DsAlert, DsAvatar, DsBadge, DsBreadcrumb, DsButton, DsCalendar, DsCard, DsCarousel, DsCheckbox, DsCheckboxList, DsChip, DsColorPicker, DsCombobox, DsContainer, DsDatePicker, DsDivider, DsDrawer, DsDropdown, DsEmpty, DsFileUpload, DsI18nService, DsInputField, DsInputNumber, DsInputTextarea, DsList, DsListGroup, DsListItem, DsMenu, DsModalComponent, DsNavList, DsNotificationContainerComponent, DsNotificationItemComponent, DsNotificationService, DsPagination, DsPasswordStrength, DsPopover, DsPopoverComponent, DsProgressBar, DsRadioGroup, DsRating, DsSearchInput, DsSegmentedControl, DsSelect, DsSidebar, DsSidebarFooterItemComponent, DsSidebarItemComponent, DsSkeleton, DsSlider, DsStepper, DsTable, DsTabs, DsTimePicker, DsTimeline, DsToastComponent, DsToastContainerComponent, DsToastService, DsToggle, DsTooltip, DsTooltipComponent, DsTransfer, DsTree, IconRegistryService, POPOVER_POSITIONS, PrimitiveBadge, PrimitiveButton, PrimitiveCheckbox, PrimitiveInput, PrimitiveRadio, PrimitiveTextarea, PrimitiveToggle, SIDEBAR_POPOVER_POSITIONS_LEFT, SIDEBAR_POPOVER_POSITIONS_RIGHT, TOOLTIP_POSITIONS, generateId, generateShortId };
8015
- export type { AccordionChangeEvent, AccordionItem, AccordionSize, AccordionVariant, AlertSize, AlertType, AvatarShape, AvatarSize, BadgeAppearance, BadgeShape, BadgeSize, BadgeType, BadgeVariant, BreadcrumbItem, ButtonAppearance, ButtonSize, ButtonType, ButtonVariant, CalendarEvent, CalendarMode, CalendarSize, CardSize, CardVariant, CarouselDotsPosition, CarouselEffect, CarouselSlide, CheckboxListChangeEvent, CheckboxListItem, CheckboxListItemChangeEvent, CheckboxListSize, CheckboxSize, CheckboxState, ChipColor, ChipSize, ChipVariant, ColorFormat, ColorPickerSize, ContainerGutter, ContainerMaxWidth, DatePickerMode, DatePickerSize, DateRange, DividerLabelPosition, DividerOrientation, DividerSize, DividerVariant, DrawerPosition, DrawerSize, DropdownItem, DropdownItemDTO, DropdownPosition, DsComboboxOption, DsComboboxSize, DsSelectOption, DsSelectSize, DsTableColumn, DsTableSize, DsTableVariant, EmptySize, FileUploadSize, FlattenedSidebarItem, HSLColor, I18nLabels, InputAppearance, InputNumberControlsPosition, InputNumberSize, InputSize, InputState, InputType, ListDragEvent, ListEmptyConfig, ListGroupToggleEvent, ListGroupVariant, ListItemCheckEvent, ListItemClickEvent, ListItemIndicator, ListItemIndicatorColor, ListItemSize, ListSelectionChangeEvent, ListSize, ListVariant, MenuItem, MenuSize, MenuTrigger, NavListBadgeVariant, NavListGroup, NavListGroupToggleEvent, NavListItem, NavListItemClickEvent, NavListSize, NotificationAction, NotificationConfig, NotificationItem, NotificationPlacement, PageChangeEvent, PageSizeOption, PaginationSize, PasswordCriterion, PasswordStrength, PasswordStrengthSize, PopoverTrigger, ProgressBarMode, ProgressBarSize, ProgressBarVariant, RGBColor, RadioGroupLayout, RadioOption, RadioSize, RatingSize, SearchInputSize, SegmentOption, SegmentedControlColor, SegmentedControlOrientation, SegmentedControlSize, SidebarBadgeVariant, SidebarCollapsedTrigger, SidebarItem, SidebarItemClickEvent, SidebarItemExpandEvent, SidebarMode, SidebarPosition, SidebarSize, SkeletonSize, SkeletonVariant, SliderOrientation, SliderSize, SliderValue, SortDirection, SortEvent, Step, StepChangeEvent, StepState, StepperOrientation, StepperSize, SupportedLocale, TabItem, TableState, TextareaAppearance, TextareaResize, TextareaSize, TextareaState, TimeFormat, TimePickerSize, TimeValue, TimelineColor, TimelineItem, TimelineItemClickEvent, TimelineMode, TimelineSize, ToastInstance, ToastOptions, ToastPosition, ToastType, ToggleSize, TransferChangeEvent, TransferDirection, TransferItem, TransferSize, TreeNode, TreeNodeCheckEvent, TreeNodeExpandEvent, TreeNodeSelectEvent, TreeSize, UploadFile };
8223
+ export { AUTOCOMPLETE_POSITIONS, DROPDOWN_POSITIONS, DROPDOWN_POSITIONS_RIGHT, DROPDOWN_POSITIONS_TOP, DsAccordion, DsAlert, DsAvatar, DsBadge, DsBreadcrumb, DsButton, DsCalendar, DsCard, DsCarousel, DsCheckbox, DsCheckboxList, DsChip, DsColorPicker, DsCombobox, DsContainer, DsDatePicker, DsDivider, DsDrawer, DsDropdown, DsEmpty, DsEntityChip, DsEntityPicker, DsFileUpload, DsI18nService, DsInputField, DsInputNumber, DsInputTextarea, DsList, DsListGroup, DsListItem, DsMenu, DsModalComponent, DsNavList, DsNotificationContainerComponent, DsNotificationItemComponent, DsNotificationService, DsPagination, DsPasswordStrength, DsPopover, DsPopoverComponent, DsProgressBar, DsRadioGroup, DsRating, DsSearchInput, DsSegmentedControl, DsSelect, DsSidebar, DsSidebarFooterItemComponent, DsSidebarItemComponent, DsSkeleton, DsSlider, DsStepper, DsTable, DsTabs, DsTimePicker, DsTimeline, DsToastComponent, DsToastContainerComponent, DsToastService, DsToggle, DsTooltip, DsTooltipComponent, DsTransfer, DsTree, IconRegistryService, POPOVER_POSITIONS, PrimitiveBadge, PrimitiveButton, PrimitiveCheckbox, PrimitiveInput, PrimitiveRadio, PrimitiveTextarea, PrimitiveToggle, SIDEBAR_POPOVER_POSITIONS_LEFT, SIDEBAR_POPOVER_POSITIONS_RIGHT, TOOLTIP_POSITIONS, generateId, generateShortId };
8224
+ export type { AccordionChangeEvent, AccordionItem, AccordionSize, AccordionVariant, AlertSize, AlertType, AvatarShape, AvatarSize, BadgeAppearance, BadgeShape, BadgeSize, BadgeType, BadgeVariant, BreadcrumbItem, ButtonAppearance, ButtonSize, ButtonType, ButtonVariant, CalendarEvent, CalendarMode, CalendarSize, CardSize, CardVariant, CarouselDotsPosition, CarouselEffect, CarouselSlide, CheckboxListChangeEvent, CheckboxListItem, CheckboxListItemChangeEvent, CheckboxListSize, CheckboxSize, CheckboxState, ChipColor, ChipSize, ChipVariant, ColorFormat, ColorPickerSize, ContainerGutter, ContainerMaxWidth, DatePickerMode, DatePickerSize, DateRange, DividerLabelPosition, DividerOrientation, DividerSize, DividerVariant, DrawerPosition, DrawerSize, DropdownItem, DropdownItemDTO, DropdownPosition, DsComboboxOption, DsComboboxSize, DsEntityOption, DsEntityPickerDisplayMode, DsEntityPickerSize, DsSelectOption, DsSelectSize, DsTableColumn, DsTableSize, DsTableVariant, EmptySize, FileUploadSize, FlattenedSidebarItem, HSLColor, I18nLabels, InputAppearance, InputNumberControlsPosition, InputNumberSize, InputSize, InputState, InputType, ListDragEvent, ListEmptyConfig, ListGroupToggleEvent, ListGroupVariant, ListItemCheckEvent, ListItemClickEvent, ListItemIndicator, ListItemIndicatorColor, ListItemSize, ListSelectionChangeEvent, ListSize, ListVariant, MenuItem, MenuSize, MenuTrigger, NavListBadgeVariant, NavListGroup, NavListGroupToggleEvent, NavListItem, NavListItemClickEvent, NavListSize, NotificationAction, NotificationConfig, NotificationItem, NotificationPlacement, PageChangeEvent, PageSizeOption, PaginationSize, PasswordCriterion, PasswordStrength, PasswordStrengthSize, PopoverTrigger, ProgressBarMode, ProgressBarSize, ProgressBarVariant, RGBColor, RadioGroupLayout, RadioOption, RadioSize, RatingSize, SearchInputSize, SegmentOption, SegmentedControlColor, SegmentedControlOrientation, SegmentedControlSize, SidebarBadgeVariant, SidebarCollapsedTrigger, SidebarItem, SidebarItemClickEvent, SidebarItemExpandEvent, SidebarMode, SidebarPosition, SidebarSize, SkeletonSize, SkeletonVariant, SliderOrientation, SliderSize, SliderValue, SortDirection, SortEvent, Step, StepChangeEvent, StepState, StepperOrientation, StepperSize, SupportedLocale, TabItem, TableState, TextareaAppearance, TextareaResize, TextareaSize, TextareaState, TimeFormat, TimePickerSize, TimeValue, TimelineColor, TimelineItem, TimelineItemClickEvent, TimelineMode, TimelineSize, ToastInstance, ToastOptions, ToastPosition, ToastType, ToggleSize, TransferChangeEvent, TransferDirection, TransferItem, TransferSize, TreeNode, TreeNodeCheckEvent, TreeNodeExpandEvent, TreeNodeSelectEvent, TreeSize, UploadFile };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kksdev/ds-angular",
3
- "version": "1.7.2",
4
- "description": "Angular 20 standalone component library - Design System with 53 components, 7 primitives, 3 themes, i18n support",
3
+ "version": "1.8.0",
4
+ "description": "Angular 20 standalone component library - Design System with 55 components, 7 primitives, 3 themes, i18n support",
5
5
  "keywords": [
6
6
  "angular",
7
7
  "angular20",