@sumaris-net/ngx-components 18.23.32 → 18.23.34

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 (35) hide show
  1. package/doc/changelog.md +5 -1
  2. package/esm2022/public_api.mjs +4 -1
  3. package/esm2022/src/app/core/form/list/list.form.mjs +8 -3
  4. package/esm2022/src/app/core/table/column/actions-column.component.mjs +1 -1
  5. package/esm2022/src/app/core/table/column/row-field.component.mjs +1 -1
  6. package/esm2022/src/app/core/table/table.class.mjs +3 -3
  7. package/esm2022/src/app/core/table/table.pipes.mjs +6 -7
  8. package/esm2022/src/app/core/table/testing/table.testing.mjs +1 -1
  9. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +25 -4
  10. package/esm2022/src/app/core/table/testing/table2.testing.mjs +63 -15
  11. package/esm2022/src/app/shared/directives/cell-selection/cell-identifier.directive.mjs +41 -0
  12. package/esm2022/src/app/shared/directives/cell-selection/cell-selection.directive.mjs +201 -0
  13. package/esm2022/src/app/shared/directives/cell-selection/cell-selection.service.mjs +186 -0
  14. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +2 -2
  15. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +64 -13
  16. package/esm2022/src/app/shared/functions.mjs +1 -1
  17. package/esm2022/src/app/social/feed/feed.component.mjs +3 -3
  18. package/fesm2022/sumaris-net.ngx-components.mjs +570 -38
  19. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  20. package/package.json +1 -1
  21. package/public_api.d.ts +3 -0
  22. package/src/app/core/form/list/list.form.d.ts +2 -1
  23. package/src/app/core/table/column/actions-column.component.d.ts +1 -1
  24. package/src/app/core/table/table.class.d.ts +2 -2
  25. package/src/app/core/table/table.pipes.d.ts +2 -1
  26. package/src/app/core/table/testing/table.testing.module.d.ts +3 -1
  27. package/src/app/core/table/testing/table2.testing.d.ts +7 -3
  28. package/src/app/shared/directives/cell-selection/cell-identifier.directive.d.ts +15 -0
  29. package/src/app/shared/directives/cell-selection/cell-selection.directive.d.ts +28 -0
  30. package/src/app/shared/directives/cell-selection/cell-selection.service.d.ts +64 -0
  31. package/src/app/shared/directives/resizable/resizable.directive.d.ts +15 -3
  32. package/src/app/shared/functions.d.ts +1 -1
  33. package/src/app/shared/inputs.d.ts +1 -1
  34. package/src/assets/manifest.json +1 -1
  35. package/src/theme/_ngx-components.table.scss +48 -2
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sumaris-net/ngx-components",
3
3
  "description": "SUMARiS Angular components",
4
- "version": "18.23.32",
4
+ "version": "18.23.34",
5
5
  "author": "contact@e-is.pro",
6
6
  "license": "AGPL-3.0",
7
7
  "readmeFilename": "README.md",
package/public_api.d.ts CHANGED
@@ -68,6 +68,9 @@ export * from './src/app/shared/directives/resizable/resizable.directive';
68
68
  export * from './src/app/shared/directives/resizable/resizable.component';
69
69
  export * from './src/app/shared/directives/resizable/resizable.module';
70
70
  export * from './src/app/shared/directives/autoresize.directive';
71
+ export * from './src/app/shared/directives/cell-selection/cell-selection.service';
72
+ export * from './src/app/shared/directives/cell-selection/cell-selection.directive';
73
+ export * from './src/app/shared/directives/cell-selection/cell-identifier.directive';
71
74
  export * from './src/app/shared/pipes/pipes.module';
72
75
  export * from './src/app/shared/pipes/date-format.pipe';
73
76
  export * from './src/app/shared/pipes/date-from.pipe';
@@ -34,6 +34,7 @@ export declare class AppListForm<T = any> extends AppForm<T[]> implements OnInit
34
34
  options: AppListFormOptions<T>;
35
35
  displayWithFn: (item: any) => string;
36
36
  equalsFn: (v1: T, v2: T) => boolean;
37
+ isEmptyFn: (item: T) => boolean;
37
38
  onNewItem: EventEmitter<Event>;
38
39
  selectionChanges: EventEmitter<T[]>;
39
40
  set value(data: T[]);
@@ -77,5 +78,5 @@ export declare class AppListForm<T = any> extends AppForm<T[]> implements OnInit
77
78
  protected createControl(data?: any): AbstractControl;
78
79
  protected markForCheck(): void;
79
80
  static ɵfac: i0.ɵɵFactoryDeclaration<AppListForm<any>, [null, null, null, null, null, { optional: true; }]>;
80
- static ɵcmp: i0.ɵɵComponentDeclaration<AppListForm<any>, "app-list-form", never, { "formArrayName": { "alias": "formArrayName"; "required": false; }; "formArray": { "alias": "formArray"; "required": false; }; "options": { "alias": "options"; "required": false; }; "displayWithFn": { "alias": "displayWith"; "required": false; }; "equalsFn": { "alias": "equals"; "required": false; }; }, { "onNewItem": "onNewItem"; "selectionChanges": "selectionChanges"; }, never, never, false, never>;
81
+ static ɵcmp: i0.ɵɵComponentDeclaration<AppListForm<any>, "app-list-form", never, { "formArrayName": { "alias": "formArrayName"; "required": false; }; "formArray": { "alias": "formArray"; "required": false; }; "options": { "alias": "options"; "required": false; }; "displayWithFn": { "alias": "displayWith"; "required": false; }; "equalsFn": { "alias": "equals"; "required": false; }; "isEmptyFn": { "alias": "isEmpty"; "required": false; }; }, { "onNewItem": "onNewItem"; "selectionChanges": "selectionChanges"; }, never, never, false, never>;
81
82
  }
@@ -3,7 +3,7 @@ import { AsyncTableElement, TableElement } from '@e-is/ngx-material-table';
3
3
  import { MatColumnDef, MatTable } from '@angular/material/table';
4
4
  import { MatMenuTrigger } from '@angular/material/menu';
5
5
  import * as i0 from "@angular/core";
6
- export declare class ActionsColumnComponent<T extends TableElement<any> | AsyncTableElement<any> = TableElement<any>> implements OnInit, OnDestroy {
6
+ export declare class ActionsColumnComponent<T extends TableElement<any> | AsyncTableElement<any>> implements OnInit, OnDestroy {
7
7
  private table;
8
8
  private cd;
9
9
  columnDef: MatColumnDef;
@@ -31,10 +31,10 @@ export declare abstract class AppTable<T extends IEntity<T, ID>, F = any, ID = n
31
31
  private _openingRow;
32
32
  private _subscription;
33
33
  private _dataSourceLoadingSubscription;
34
- private _totalRowCount;
35
- private _visibleRowCount;
36
34
  private _cellValueChangesDefs;
37
35
  protected _enabled: boolean;
36
+ protected _totalRowCount: number | null;
37
+ protected _visibleRowCount: number | null;
38
38
  protected _autocompleteConfigHolder: MatAutocompleteConfigHolder;
39
39
  protected allowRowDetail: boolean;
40
40
  protected readonly cd: ChangeDetectorRef;
@@ -6,10 +6,11 @@ import { Subscription } from 'rxjs';
6
6
  import { AppAsyncTable } from './async-table.class';
7
7
  import * as i0 from "@angular/core";
8
8
  export type AppTableRowCountProperty = 'visibleRowCount' | 'totalRowCount';
9
- export declare abstract class AbstractTableSelectionPipe<R, O, T extends AppTable<any> | AppAsyncTable<any> = AppTable<any> | AppAsyncTable<any>> extends AbstractSelectionModelPipe<any, R, O> {
9
+ export declare abstract class AbstractTableSelectionPipe<R, O, T extends AppTable<any> | AppAsyncTable<any> = AppTable<any> | AppAsyncTable<any>> extends AbstractSelectionModelPipe<any, R, O> implements PipeTransform, OnDestroy {
10
10
  private _onRowsChanges;
11
11
  protected constructor(_ref: ChangeDetectorRef);
12
12
  transform(selectionOrTable: SelectionModel<any> | T, tableOrOpts?: T | O, opts?: O): R;
13
+ private isTable;
13
14
  protected _subscribe(selection: SelectionModel<any>, table?: T, opts?: O): Subscription;
14
15
  protected _dispose(): void;
15
16
  static ɵfac: i0.ɵɵFactoryDeclaration<AbstractTableSelectionPipe<any, any, any>, never>;
@@ -7,8 +7,10 @@ import * as i5 from "../../core.module";
7
7
  import * as i6 from "@ngx-translate/core";
8
8
  import * as i7 from "@angular/forms";
9
9
  import * as i8 from "../../../shared/directives/resizable/resizable.module";
10
+ import * as i9 from "../../../shared/directives/cell-selection/cell-identifier.directive";
11
+ import * as i10 from "../../../shared/directives/cell-selection/cell-selection.directive";
10
12
  export declare class TableTestingModule {
11
13
  static ɵfac: i0.ɵɵFactoryDeclaration<TableTestingModule, never>;
12
- static ɵmod: i0.ɵɵNgModuleDeclaration<TableTestingModule, [typeof i1.TableTestPage, typeof i2.Table2TestPage], [typeof i3.CommonModule, typeof i4.SharedModule, typeof i5.CoreModule, typeof i6.TranslateModule, typeof i7.FormsModule, typeof i8.ResizableModule], [typeof i1.TableTestPage, typeof i2.Table2TestPage, typeof i6.TranslateModule]>;
14
+ static ɵmod: i0.ɵɵNgModuleDeclaration<TableTestingModule, [typeof i1.TableTestPage, typeof i2.Table2TestPage], [typeof i3.CommonModule, typeof i4.SharedModule, typeof i5.CoreModule, typeof i6.TranslateModule, typeof i7.FormsModule, typeof i8.ResizableModule, typeof i9.CellIdentifierDirective, typeof i10.CellSelectionDirective], [typeof i1.TableTestPage, typeof i2.Table2TestPage, typeof i6.TranslateModule]>;
13
15
  static ɵinj: i0.ɵɵInjectorDeclaration<TableTestingModule>;
14
16
  }
@@ -1,5 +1,4 @@
1
1
  import { AfterViewInit, Injector, OnDestroy, OnInit } from '@angular/core';
2
- import { AppTable } from '../table.class';
3
2
  import { Referential } from '../../services/model/referential.model';
4
3
  import { IonInfiniteScroll } from '@ionic/angular';
5
4
  import { InMemoryEntitiesService } from '../../../shared/services/memory-entity-service.class';
@@ -7,8 +6,10 @@ import { AppValidatorService } from '../../services/validator/base.validator.cla
7
6
  import { AbstractControl, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
8
7
  import { ReferentialFilter } from '../../services/testing/referential-filter.model';
9
8
  import { MatExpansionPanel } from '@angular/material/expansion';
9
+ import { AppAsyncTable } from '../async-table.class';
10
+ import { CellSelectionEvent, ICellId } from '../../../shared/directives/cell-selection/cell-selection.service';
10
11
  import * as i0 from "@angular/core";
11
- export declare class Table2TestPage extends AppTable<Referential, ReferentialFilter> implements OnInit, OnDestroy, AfterViewInit {
12
+ export declare class Table2TestPage extends AppAsyncTable<Referential, ReferentialFilter> implements OnInit, OnDestroy, AfterViewInit {
12
13
  protected validatorService: AppValidatorService;
13
14
  protected formBuilder: UntypedFormBuilder;
14
15
  static readonly maxRowCount = 100;
@@ -26,6 +27,7 @@ export declare class Table2TestPage extends AppTable<Referential, ReferentialFil
26
27
  get hasMoreData(): boolean;
27
28
  filterExpansionPanel: MatExpansionPanel;
28
29
  infiniteScroll: IonInfiniteScroll;
30
+ protected readonly selectableColumns: string[];
29
31
  get dataService(): InMemoryEntitiesService<Referential>;
30
32
  constructor(injector: Injector, validatorService: AppValidatorService, formBuilder: UntypedFormBuilder);
31
33
  ngOnInit(): void;
@@ -41,8 +43,10 @@ export declare class Table2TestPage extends AppTable<Referential, ReferentialFil
41
43
  toggleFilterPanelFloating(): void;
42
44
  applyFilterAndClosePanel(event?: Event): void;
43
45
  closeFilterPanel(): void;
44
- resetFilter(_?: Event): void;
46
+ resetFilter(event?: Event): Promise<void>;
45
47
  protected generateData(offset?: number, size?: number): Referential[];
48
+ protected onCellSelectionChange(event: CellSelectionEvent<ICellId>): void;
49
+ protected onCellRightClick(event: MouseEvent): void;
46
50
  static ɵfac: i0.ɵɵFactoryDeclaration<Table2TestPage, never>;
47
51
  static ɵcmp: i0.ɵɵComponentDeclaration<Table2TestPage, "app-table2-testing", never, { "filterPanelFloating": { "alias": "filterPanelFloating"; "required": false; }; "sticky": { "alias": "sticky"; "required": false; }; "stickyEnd": { "alias": "stickyEnd"; "required": false; }; }, {}, never, ["[suffix]"], false, never>;
48
52
  }
@@ -0,0 +1,15 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { ICellId } from './cell-selection.service';
3
+ import * as i0 from "@angular/core";
4
+ export declare class CellIdentifierDirective<C extends ICellId = ICellId> implements OnInit {
5
+ cellId: import("@angular/core").InputSignal<C>;
6
+ protected isCellSelected: boolean;
7
+ protected isDragging: boolean;
8
+ private readonly service;
9
+ private readonly destroyRef;
10
+ ngOnInit(): void;
11
+ protected handleMouseDown(event: MouseEvent): Promise<void>;
12
+ protected handleMouseEnter(event: MouseEvent): Promise<void>;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<CellIdentifierDirective<any>, never>;
14
+ static ɵdir: i0.ɵɵDirectiveDeclaration<CellIdentifierDirective<any>, "[appCellId]", never, { "cellId": { "alias": "appCellId"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
15
+ }
@@ -0,0 +1,28 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { CellSelectionEvent, ICellId } from './cell-selection.service';
3
+ import * as i0 from "@angular/core";
4
+ export declare class CellSelectionDirective<C extends ICellId = ICellId> implements OnInit {
5
+ selectableColumns: import("@angular/core").InputSignal<string[]>;
6
+ selectionChange: import("@angular/core").OutputEmitterRef<CellSelectionEvent<C>>;
7
+ rightClick: import("@angular/core").OutputEmitterRef<MouseEvent>;
8
+ protected service: import("./cell-selection.service").CellSelectionService<ICellId>;
9
+ private readonly elementRef;
10
+ private readonly renderer;
11
+ private readonly destroyRef;
12
+ private overlayElements;
13
+ constructor();
14
+ ngOnInit(): void;
15
+ private setupServiceConfiguration;
16
+ private setupGlobalMouseEvents;
17
+ private setupCopyListener;
18
+ addCellsOverlay(cells: C[]): void;
19
+ removeCellsOverlay(): void;
20
+ private groupContiguousCells;
21
+ private getAdjacentCells;
22
+ private getNextColumnName;
23
+ private getCellKey;
24
+ private calculateSelectionBounds;
25
+ private createOverlayElement;
26
+ static ɵfac: i0.ɵɵFactoryDeclaration<CellSelectionDirective<any>, never>;
27
+ static ɵdir: i0.ɵɵDirectiveDeclaration<CellSelectionDirective<any>, "[appCellSelection]", never, { "selectableColumns": { "alias": "appSelectableColumns"; "required": false; "isSignal": true; }; }, { "selectionChange": "appCellSelectionChange"; "rightClick": "appCellRightClick"; }, never, never, true, never>;
28
+ }
@@ -0,0 +1,64 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { EqualsFn } from '../../types';
4
+ import * as i0 from "@angular/core";
5
+ export declare const APP_CELL_SELECTION_SERVICE_TOKEN: InjectionToken<CellSelectionService<ICellId>>;
6
+ export declare const APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN: InjectionToken<CellSelectionServiceConfig<any>>;
7
+ export interface ICellId {
8
+ rowId: number;
9
+ columnName: string;
10
+ }
11
+ export interface CellSelectionEvent<C extends ICellId> {
12
+ selectedCells: C[];
13
+ isRangeSelection: boolean;
14
+ isToggleSelection: boolean;
15
+ }
16
+ export interface CellSelectionServiceConfig<C extends ICellId> {
17
+ equals: EqualsFn<C>;
18
+ new: (cellId: ICellId) => C;
19
+ }
20
+ /**
21
+ * Service to manage cell selection state across multiple directive instances.
22
+ * This service should be provided at the component level (not root) to ensure
23
+ * proper isolation between different table instances.
24
+ */
25
+ export declare class CellSelectionService<C extends ICellId = ICellId> {
26
+ config: CellSelectionServiceConfig<any>;
27
+ selectableColumns: string[];
28
+ private _selectedCells;
29
+ private selectionStartCell;
30
+ private isSelecting;
31
+ draggedCells: C[];
32
+ private dragStartCell;
33
+ private isDragging;
34
+ readonly selectionChangeSubject: Subject<CellSelectionEvent<C>>;
35
+ readonly selectionRightClickSubject: Subject<MouseEvent>;
36
+ private readonly _equals;
37
+ private readonly _new;
38
+ constructor();
39
+ equals(cell1: C, cell2: C): boolean;
40
+ new(cellId: ICellId): C;
41
+ get selectedCells(): C[];
42
+ set selectedCells(value: C[]);
43
+ isCellSelected(cellId: C): boolean;
44
+ isCellDragged(cellId: C): boolean;
45
+ handleCellMouseDown(event: MouseEvent, cellId: C): Promise<void>;
46
+ handleCellMouseEnter(event: MouseEvent, cellId: C): Promise<void>;
47
+ endMouseMove(): void;
48
+ private startSelection;
49
+ private startDragSelection;
50
+ private toggleCellSelection;
51
+ private selectRange;
52
+ private updateSelection;
53
+ private updateDraggedCells;
54
+ private emitSelection;
55
+ calculateRangeCells(endCell: C): C[];
56
+ calculateRangeBetweenCells(startCell: C, endCell: C): C[];
57
+ resetSelectionState(): void;
58
+ resetDragState(): void;
59
+ private findFirstSelectedCell;
60
+ private findLastSelectedCell;
61
+ private findSelectedCell;
62
+ static ɵfac: i0.ɵɵFactoryDeclaration<CellSelectionService<any>, never>;
63
+ static ɵprov: i0.ɵɵInjectableDeclaration<CellSelectionService<any>>;
64
+ }
@@ -4,9 +4,21 @@ import * as i0 from "@angular/core";
4
4
  export declare class ResizableDirective {
5
5
  private readonly document;
6
6
  private readonly elementRef;
7
+ private readonly destroyRef;
8
+ /** Largeur minimale absolue de la colonne en pixels */
9
+ minWidth: number;
7
10
  readonly resizable: Observable<number>;
8
- readonly fit: Observable<MouseEvent[]>;
9
- constructor(document: any, elementRef: ElementRef<HTMLElement>);
11
+ readonly fit: Observable<MouseEvent>;
12
+ constructor(document: Document, elementRef: ElementRef<HTMLElement>);
13
+ /**
14
+ * Calcule la largeur minimale autorisée pour la colonne courante.
15
+ * La largeur minimale est calculée pour que la somme des largeurs de toutes les colonnes
16
+ * ne dépasse pas la largeur du conteneur du tableau.
17
+ *
18
+ * @param currentTh L'élément th de la colonne en cours de redimensionnement
19
+ * @returns La largeur minimale en pixels
20
+ */
21
+ private calculateMinWidth;
10
22
  static ɵfac: i0.ɵɵFactoryDeclaration<ResizableDirective, never>;
11
- static ɵdir: i0.ɵɵDirectiveDeclaration<ResizableDirective, "[resizable]", never, {}, { "resizable": "resizable"; "fit": "fit"; }, never, never, false, never>;
23
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ResizableDirective, "[resizable]", never, { "minWidth": { "alias": "minWidth"; "required": false; }; }, { "resizable": "resizable"; "fit": "fit"; }, never, never, false, never>;
12
24
  }
@@ -6,7 +6,7 @@ export declare function isNotNil<T>(obj: T | null | undefined): boolean;
6
6
  export declare function isNotNilOrBlank<T>(obj: T | null | undefined): boolean;
7
7
  export declare function isNotNilOrNaN<T>(obj: T | null | undefined): boolean;
8
8
  export declare function isNilOrNaN<T>(obj: T | null | undefined): boolean;
9
- export declare function isNotEmptyArray<T>(obj: T[] | null | undefined): boolean;
9
+ export declare function isNotEmptyArray<T>(obj: T[] | readonly T[] | null | undefined): boolean;
10
10
  export declare function firstArrayValue<T>(obj: T[] | null | undefined): T | undefined;
11
11
  export declare function lastArrayValue<T>(obj: T[] | null | undefined): T | undefined;
12
12
  export declare function isEmptyArray<T>(obj: T[] | null | undefined): boolean;
@@ -18,7 +18,7 @@ export interface InputElement extends FocusableElement {
18
18
  }
19
19
  export declare function isInputElement(object: any): object is InputElement;
20
20
  export declare function asInputElement<T = any>(object: ElementRef<T>): InputElement | undefined;
21
- export declare function tabindexComparator(a: InputElement, b: InputElement): 1 | 0 | -1;
21
+ export declare function tabindexComparator(a: InputElement, b: InputElement): 0 | 1 | -1;
22
22
  export interface CanGainFocusOptions {
23
23
  minTabindex?: number;
24
24
  maxTabindex?: number;
@@ -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.23.32",
5
+ "version": "18.23.34",
6
6
  "default_locale": "fr",
7
7
  "description": "Angular components for building beautiful and responsive Apps",
8
8
  "icons": [{
@@ -251,7 +251,6 @@
251
251
 
252
252
  .mat-mdc-row,
253
253
  .mat-mdc-footer-row {
254
-
255
254
  // Disabled row
256
255
  &.mat-mdc-row-disabled *,
257
256
  &.mat-row-disabled * {
@@ -552,8 +551,55 @@
552
551
  border-bottom-width: var(--mat-table-row-item-outline-width, 1px) !important;
553
552
  border-bottom-style: solid !important;
554
553
  }
555
- }
556
554
 
555
+ // Cell selection
556
+ --app-cell-selected-color: var(--ion-color-secondary50);
557
+ --app-cell-dragging-color: var(--ion-color-secondary50-shade);
558
+ --app-cell-selection-border-color: var(--ion-color-accent, gray);
559
+
560
+ td.cell-selected {
561
+ background-color: var(--app-cell-selected-color) !important;
562
+ }
563
+
564
+ td.cell-dragging {
565
+ background-color: var(--app-cell-dragging-color) !important;
566
+ }
567
+
568
+ div.cell-selection-overlay {
569
+ position: absolute;
570
+ z-index: 5;
571
+ animation: linearGradientMove 0.3s infinite linear;
572
+ background:
573
+ linear-gradient(90deg, var(--app-cell-selection-border-color) 50%, transparent 0) repeat-x,
574
+ linear-gradient(90deg, var(--app-cell-selection-border-color) 50%, transparent 0) repeat-x,
575
+ linear-gradient(0deg, var(--app-cell-selection-border-color) 50%, transparent 0) repeat-y,
576
+ linear-gradient(0deg, var(--app-cell-selection-border-color) 50%, transparent 0) repeat-y;
577
+ background-size:
578
+ 4px 2px,
579
+ 4px 2px,
580
+ 2px 4px,
581
+ 2px 4px;
582
+ background-position:
583
+ 0 0,
584
+ 0 100%,
585
+ 0 0,
586
+ 100% 0;
587
+ background-color: unset;
588
+ box-sizing: border-box;
589
+ pointer-events: none;
590
+ }
591
+
592
+ // Animated dashed border keyframes
593
+ @keyframes linearGradientMove {
594
+ 100% {
595
+ background-position:
596
+ 4px 0,
597
+ -4px 100%,
598
+ 0 -4px,
599
+ 100% 4px;
600
+ }
601
+ }
602
+ }
557
603
 
558
604
  // Paginator
559
605
  .mat-mdc-paginator {