@sd-angular/core 19.0.0-beta.88 → 19.0.0-beta.90

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 (41) hide show
  1. package/components/anchor/index.d.ts +1 -2
  2. package/components/anchor/src/components/anchor-vertical/{anchor-list/anchor-list.component.d.ts → anchor-vertical-list.component.d.ts} +4 -4
  3. package/components/anchor/src/components/index.d.ts +1 -1
  4. package/components/anchor/src/index.d.ts +2 -0
  5. package/components/anchor/src/models/index.d.ts +1 -1
  6. package/components/anchor/src/models/{anchor.model.d.ts → sd-anchor.model.d.ts} +0 -5
  7. package/components/document-builder/src/plugins/variable/variable.plugin.d.ts +6 -0
  8. package/components/table/src/models/table-option-selector.model.d.ts +48 -0
  9. package/components/table/src/models/table-option.model.d.ts +102 -0
  10. package/fesm2022/sd-angular-core-components-anchor.mjs +9 -9
  11. package/fesm2022/sd-angular-core-components-anchor.mjs.map +1 -1
  12. package/fesm2022/sd-angular-core-components-document-builder.mjs +84 -18
  13. package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
  14. package/fesm2022/sd-angular-core-components-table.mjs +2 -2
  15. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  16. package/fesm2022/sd-angular-core-components-workflow.mjs +5 -5
  17. package/fesm2022/sd-angular-core-components-workflow.mjs.map +1 -1
  18. package/fesm2022/sd-angular-core-forms-input-number.mjs +13 -5
  19. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  20. package/fesm2022/sd-angular-core-forms-input.mjs +9 -2
  21. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  22. package/fesm2022/sd-angular-core-forms-textarea.mjs +9 -2
  23. package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
  24. package/fesm2022/sd-angular-core-modules-layout.mjs +1 -1
  25. package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
  26. package/fesm2022/sd-angular-core-pipes.mjs +3 -4
  27. package/fesm2022/sd-angular-core-pipes.mjs.map +1 -1
  28. package/fesm2022/sd-angular-core-services-api.mjs +20 -35
  29. package/fesm2022/sd-angular-core-services-api.mjs.map +1 -1
  30. package/forms/input/src/input.component.d.ts +2 -0
  31. package/forms/input-number/src/input-number.component.d.ts +2 -1
  32. package/forms/select/src/select.component.d.ts +1 -1
  33. package/forms/textarea/src/textarea.component.d.ts +2 -0
  34. package/package.json +43 -43
  35. package/pipes/src/format-number.pipe.d.ts +1 -1
  36. package/sd-angular-core-19.0.0-beta.90.tgz +0 -0
  37. package/services/api/src/api.model.d.ts +1 -0
  38. package/services/api/src/api.service.d.ts +3 -7
  39. package/services/api/src/interceptors/api.interceptor.d.ts +2 -4
  40. package/sd-angular-core-19.0.0-beta.88.tgz +0 -0
  41. /package/components/anchor/src/components/{main/main.component.d.ts → anchor/anchor.component.d.ts} +0 -0
@@ -1,2 +1 @@
1
- export * from './src/components';
2
- export * from './src/models';
1
+ export * from './src';
@@ -1,7 +1,7 @@
1
1
  import { OnDestroy } from '@angular/core';
2
- import { SdAnchorItem } from '../../anchor-item/anchor-item.component';
2
+ import { SdAnchorItem } from '../anchor-item/anchor-item.component';
3
3
  import * as i0 from "@angular/core";
4
- export declare class SdVerticalAnchorList implements OnDestroy {
4
+ export declare class SdAnchorVerticalList implements OnDestroy {
5
5
  #private;
6
6
  sections: import("@angular/core").InputSignal<readonly SdAnchorItem[]>;
7
7
  activeSectionId: import("@angular/core").InputSignal<string>;
@@ -11,6 +11,6 @@ export declare class SdVerticalAnchorList implements OnDestroy {
11
11
  constructor();
12
12
  onClickSection: (id: string) => void;
13
13
  ngOnDestroy(): void;
14
- static ɵfac: i0.ɵɵFactoryDeclaration<SdVerticalAnchorList, never>;
15
- static ɵcmp: i0.ɵɵComponentDeclaration<SdVerticalAnchorList, "sd-vertical-anchor-list", never, { "sections": { "alias": "sections"; "required": true; "isSignal": true; }; "activeSectionId": { "alias": "activeSectionId"; "required": false; "isSignal": true; }; "ellipsis": { "alias": "ellipsis"; "required": false; "isSignal": true; }; "sidebarWidth": { "alias": "sidebarWidth"; "required": false; "isSignal": true; }; }, { "sdClickSection": "sdClickSection"; }, never, never, true, never>;
14
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdAnchorVerticalList, never>;
15
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdAnchorVerticalList, "sd-anchor-vertical-list", never, { "sections": { "alias": "sections"; "required": true; "isSignal": true; }; "activeSectionId": { "alias": "activeSectionId"; "required": false; "isSignal": true; }; "ellipsis": { "alias": "ellipsis"; "required": false; "isSignal": true; }; "sidebarWidth": { "alias": "sidebarWidth"; "required": false; "isSignal": true; }; }, { "sdClickSection": "sdClickSection"; }, never, never, true, never>;
16
16
  }
@@ -1,2 +1,2 @@
1
1
  export * from './anchor-item/anchor-item.component';
2
- export * from './main/main.component';
2
+ export * from './anchor/anchor.component';
@@ -0,0 +1,2 @@
1
+ export * from './components';
2
+ export * from './models';
@@ -1 +1 @@
1
- export * from './anchor.model';
1
+ export * from './sd-anchor.model';
@@ -1,8 +1,3 @@
1
- export interface AnchorSection {
2
- id: string;
3
- element: HTMLElement;
4
- title: string;
5
- }
6
1
  import { ElementRef, InputSignal } from "@angular/core";
7
2
  export interface IAnchorItem {
8
3
  id: string;
@@ -43,3 +43,9 @@ export declare class VariablePlugin extends Plugin {
43
43
  /** Xóa toàn bộ binding values trong document. Shorthand của clearValues(). */
44
44
  clearAllValues(): void;
45
45
  }
46
+ /**
47
+ * HTML từ getData() phiên bản cũ có thể chứa block (vd. table) bên trong `span.variable-widget[data-binding="html"]`,
48
+ * khiến setData/upcast CKEditor lỗi (unexpected-error, null.start). Gọi trước `setData` để giữ chỉ
49
+ * `data-binding-value` và bỏ các node con.
50
+ */
51
+ export declare function sanitizeVariableHtmlBoundSerializedHtml(html: string): string;
@@ -1,12 +1,19 @@
1
1
  import { SdButton } from '@sd-angular/core/components/button';
2
2
  import { SdUnwrapSignal } from '@sd-angular/core/utilities/models';
3
3
  export interface SdTableOptionSelector<T = any> {
4
+ /** Bật/tắt cột checkbox selector. Mặc định: true. */
4
5
  visible?: boolean;
6
+ /** Chỉ cho chọn 1 dòng tại một thời điểm. */
5
7
  single?: boolean;
8
+ /** Danh sách action hiển thị khi có item được chọn. */
6
9
  actions?: SdTableAction<T>[];
10
+ /** Nội dung hiển thị bên cạnh selector/action bar. */
7
11
  message?: string | ((selectedItems?: T[]) => string);
12
+ /** Callback khi user chọn/bỏ chọn một dòng. */
8
13
  onSelect?: (rowData?: T, selectedItems?: T[]) => void;
14
+ /** Callback khi user chọn tất cả hoặc bỏ chọn tất cả. */
9
15
  onSelectAll?: (selectedItems: T[]) => void;
16
+ /** Disable checkbox của từng dòng theo điều kiện. */
10
17
  disabled?: (rowData?: T, selectedItems?: T[]) => boolean;
11
18
  /**
12
19
  * Predicate để tự động pre-select item sau mỗi lần load.
@@ -17,25 +24,66 @@ export interface SdTableOptionSelector<T = any> {
17
24
  }
18
25
  export type SdTableAction<T = any> = SdTableActionNormal<T> | SdTableActionChildren<T>;
19
26
  export interface SdTableActionNormal<T = any> {
27
+ /**
28
+ * Tên icon hiển thị trên action button.
29
+ * Giá trị này được render qua `mat-icon`, vì vậy nên dùng đúng tên glyph của Material Icons.
30
+ * Tra cứu icon tại: https://fonts.google.com/icons
31
+ */
20
32
  icon?: string;
33
+ /**
34
+ * Font set của Material icon.
35
+ * Kiểu thực tế lấy từ `SdButton['fontSet']` và chỉ hỗ trợ các giá trị thuộc `MaterialIconFontSet`,
36
+ * ví dụ: `material-icons`, `material-icons-outlined`, `material-icons-round`,
37
+ * `material-icons-sharp`, `material-symbols-outlined`.
38
+ * Nếu không truyền, `SdButton` sẽ dùng font set mặc định của nó.
39
+ */
21
40
  fontSet?: SdUnwrapSignal<SdButton['fontSet']>;
41
+ /** Tooltip hiển thị khi hover action button. */
22
42
  tooltip?: SdUnwrapSignal<SdButton['tooltip']>;
43
+ /** Text label hiển thị trên button action. */
23
44
  title?: SdUnwrapSignal<SdButton['title']>;
45
+ /**
46
+ * Màu của `SdButton`.
47
+ * Kiểu thực tế map theo `SdButton['color']`, hiện dùng các token như
48
+ * `primary`, `secondary`, `info`, `success`, `warning`, `error`.
49
+ */
24
50
  color?: SdUnwrapSignal<SdButton['color']>;
51
+ /**
52
+ * Variant hiển thị của `SdButton`.
53
+ * Kiểu thực tế là `fill | light | outline | link`.
54
+ */
25
55
  type?: SdUnwrapSignal<SdButton['type']>;
56
+ /** Ẩn action theo cờ tĩnh hoặc theo điều kiện của dữ liệu dòng. */
26
57
  hidden?: boolean | ((rowData?: T) => boolean);
58
+ /** Gom action vào nhóm hiển thị compact nếu table hỗ trợ grouped actions. */
27
59
  isGrouped?: boolean;
60
+ /** Hàm xử lý khi click action, nhận toàn bộ item đang được chọn. */
28
61
  click: (selectedItems?: T[]) => void;
29
62
  }
30
63
  interface SdTableActionChildren<T = any> {
64
+ /**
65
+ * Tên icon của action cha (group action).
66
+ * Giá trị nên là tên glyph Material Icons: https://fonts.google.com/icons
67
+ */
31
68
  icon?: string;
69
+ /**
70
+ * Font set của Material icon cho action cha.
71
+ * Dùng cùng kiểu dữ liệu với `SdButton['fontSet']`.
72
+ */
32
73
  fontSet?: SdUnwrapSignal<SdButton['fontSet']>;
74
+ /** Tooltip của action cha. */
33
75
  tooltip?: SdUnwrapSignal<SdButton['tooltip']>;
76
+ /** Label của action cha. */
34
77
  title?: SdUnwrapSignal<SdButton['title']>;
78
+ /** Màu của action cha theo kiểu `SdButton['color']`. */
35
79
  color?: SdUnwrapSignal<SdButton['color']>;
80
+ /** Variant hiển thị của action cha theo kiểu `SdButton['type']`. */
36
81
  type?: SdUnwrapSignal<SdButton['type']>;
82
+ /** Ẩn action cha theo cờ tĩnh hoặc theo điều kiện của dữ liệu dòng. */
37
83
  hidden?: boolean | ((rowData?: T) => boolean);
84
+ /** Gom action cha vào nhóm hiển thị compact nếu table hỗ trợ grouped actions. */
38
85
  isGrouped?: boolean;
86
+ /** Danh sách action con hiển thị bên trong group action này. */
39
87
  children: SdTableActionNormal<T>[];
40
88
  }
41
89
  export {};
@@ -13,38 +13,140 @@ import { SdTableOptionSort } from './table-option-sort.model';
13
13
  import { SdTableOptionStyle } from './table-option-style.model';
14
14
  export type SdTableOption<T = any> = SdTableLocalOption<T> | SdTableServerOption<T>;
15
15
  interface SdTableBaseOption<T = any> {
16
+ /**
17
+ * Key định danh của table option.
18
+ * Thường dùng khi một số tính năng con cần lưu trạng thái riêng theo table,
19
+ * ví dụ các option có hỗ trợ cache/config theo key.
20
+ */
16
21
  key?: string;
22
+ /**
23
+ * Cấu hình hiển thị/phục hồi config của table.
24
+ * Xem thêm kiểu chi tiết tại `TableOptionConfig`.
25
+ */
17
26
  config?: TableOptionConfig;
27
+ /**
28
+ * Cấu hình chọn dòng (checkbox selector, action theo selection, pre-select...).
29
+ * Xem thêm tại `SdTableOptionSelector`.
30
+ */
18
31
  selector?: SdTableOptionSelector<T>;
32
+ /**
33
+ * Cấu hình expand row.
34
+ * Xem thêm tại `SdTableOptionExpand` để biết cách disable, expand nhiều dòng,
35
+ * hoặc luôn hiển thị vùng expand.
36
+ */
19
37
  expand?: SdTableOptionExpand<T>;
38
+ /**
39
+ * Bật/tắt sorting ở cấp table.
40
+ * Xem thêm tại `SdTableOptionSort`.
41
+ */
20
42
  sort?: SdTableOptionSort;
43
+ /**
44
+ * Cấu hình phân trang.
45
+ * Xem thêm tại `SdTableOptionPaginate`.
46
+ */
21
47
  paginate?: SdTableOptionPaginate;
48
+ /**
49
+ * Cấu hình hành vi reload dữ liệu.
50
+ * Xem thêm tại `SdTableOptionReload`.
51
+ */
22
52
  reload?: SdTableOptionReload<T>;
53
+ /**
54
+ * Cấu hình export dữ liệu.
55
+ * Xem thêm tại `SdTableOptionExport` để biết mode `default`/`custom`, mapping,
56
+ * sheet export và giới hạn số dòng.
57
+ */
23
58
  export?: SdTableOptionExport<T>;
59
+ /**
60
+ * Cấu hình group dữ liệu theo nhiều field.
61
+ * Xem thêm tại `SdTableOptionGroup`.
62
+ */
24
63
  group?: SdTableOptionGroup<T>;
64
+ /**
65
+ * Cấu hình filter của table.
66
+ * Xem thêm tại `SdTableOptionFilter` để biết filter inline, external filter,
67
+ * manual filter, cacheable và callback clear filter.
68
+ */
25
69
  filter?: SdTableOptionFilter;
70
+ /**
71
+ * Cấu hình kéo-thả đổi thứ tự dòng.
72
+ * Chỉ bật khi table cho phép reorder dữ liệu phía client.
73
+ */
26
74
  rowReorder?: {
75
+ /** Bật/tắt tính năng reorder row. */
27
76
  enabled?: boolean;
77
+ /**
78
+ * Callback sau khi reorder xong.
79
+ * `newRows` là mảng sau khi đã đổi vị trí ở UI,
80
+ * `movedItem` là item vừa được kéo,
81
+ * `fromIndex` và `toIndex` là vị trí cũ/mới.
82
+ */
28
83
  onChange?: (newRows: T[], movedItem: T, fromIndex: number, toIndex: number) => void;
84
+ /**
85
+ * Tên icon hiển thị cho drag handle.
86
+ * Nếu không truyền thì table dùng icon reorder mặc định của Material.
87
+ * Nếu truyền custom icon, nên dùng tên glyph của Material Icons:
88
+ * https://fonts.google.com/icons
89
+ */
29
90
  icon?: string;
91
+ /**
92
+ * Disable khả năng reorder theo từng dòng.
93
+ * Trả về `true` để chặn kéo-thả dòng tương ứng.
94
+ */
30
95
  disabled?: (row: T, index: number) => boolean;
31
96
  };
97
+ /**
98
+ * Danh sách command thao tác theo từng dòng.
99
+ * Xem thêm tại `SdTableCommand`.
100
+ */
32
101
  commands?: SdTableCommand<T>[];
102
+ /**
103
+ * Cấu hình vùng command tập trung.
104
+ * Dùng khi cần set thêm alignment hoặc bọc danh sách command trong object option.
105
+ * Xem thêm tại `SdTableCommandOption`.
106
+ */
33
107
  command?: SdTableCommandOption<T>;
108
+ /**
109
+ * Danh sách cột hiển thị của table.
110
+ * Đây là phần bắt buộc. Xem thêm tại `SdTableColumn` để cấu hình field, filter,
111
+ * sort, transform, template và export của từng cột.
112
+ */
34
113
  columns: SdTableColumn<T>[];
114
+ /**
115
+ * Cấu hình style/layout chung của table.
116
+ * Xem thêm tại `SdTableOptionStyle`.
117
+ */
35
118
  style?: SdTableOptionStyle<T>;
36
119
  }
37
120
  interface SdTableLocalOption<T = any> extends SdTableBaseOption<T> {
121
+ /** Dùng dữ liệu local tại client. */
38
122
  type: 'local';
123
+ /**
124
+ * Hàm trả dữ liệu local cho table.
125
+ * Table sẽ tự gọi hàm này để lấy mảng item nguồn.
126
+ * Có thể trả về đồng bộ hoặc `Promise<T[]>`.
127
+ */
39
128
  items: () => T[] | Promise<T[]>;
40
129
  }
41
130
  interface SdTableServerOption<T = any> extends SdTableBaseOption<T> {
131
+ /** Dùng dữ liệu từ server, có paging/filter/sort theo request của table. */
42
132
  type: 'server';
133
+ /**
134
+ * Hàm lấy dữ liệu từ server.
135
+ * `filterRequest` chứa trạng thái filter/sort/visible columns ở dạng của table.
136
+ * `pagingReq` là dữ liệu paging đã được chuẩn hóa để dễ map sang API backend.
137
+ * Hàm cần trả về `{ items, total }` để table render và tính phân trang.
138
+ */
43
139
  items: (filterRequest: SdTableFilterRequest<T>, pagingReq: SdPagingReq<T>) => Promise<{
44
140
  items: T[];
45
141
  total: number;
46
142
  }>;
143
+ /**
144
+ * Hook chạy khi table phát sinh filter request.
145
+ * Dùng để can thiệp thêm trước/sau khi gọi API, ví dụ sync external state,
146
+ * theo dõi trạng thái valid của external filter, hoặc ghi log request filter hiện tại.
147
+ */
47
148
  onFilter?: (filterRequest: SdTableFilterRequest<T>, args: {
149
+ /** Cho biết toàn bộ external filter hiện tại có hợp lệ để trigger filter hay không. */
48
150
  externalFilterValid: boolean;
49
151
  }) => void;
50
152
  }
@@ -20,14 +20,14 @@ class SdAnchorItem {
20
20
  });
21
21
  }
22
22
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAnchorItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
23
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.21", type: SdAnchorItem, isStandalone: true, selector: "sd-anchor-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<section [attr.data-sd-anchor-section-id]=\"id\">\r\n <ng-content [attr.data-sd-anchor-section-id]=\"id\"></ng-content>\r\n</section>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
23
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.21", type: SdAnchorItem, isStandalone: true, selector: "sd-anchor-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<section>\r\n <ng-content></ng-content>\r\n</section>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
24
24
  }
25
25
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAnchorItem, decorators: [{
26
26
  type: Component,
27
- args: [{ selector: 'sd-anchor-item', imports: [CommonModule], standalone: true, template: "<section [attr.data-sd-anchor-section-id]=\"id\">\r\n <ng-content [attr.data-sd-anchor-section-id]=\"id\"></ng-content>\r\n</section>\r\n" }]
27
+ args: [{ selector: 'sd-anchor-item', imports: [CommonModule], standalone: true, template: "<section>\r\n <ng-content></ng-content>\r\n</section>\r\n" }]
28
28
  }], ctorParameters: () => [] });
29
29
 
30
- class SdVerticalAnchorList {
30
+ class SdAnchorVerticalList {
31
31
  sections = input.required();
32
32
  activeSectionId = input('');
33
33
  ellipsis = input(false);
@@ -47,12 +47,12 @@ class SdVerticalAnchorList {
47
47
  ngOnDestroy() {
48
48
  this.#subscription.unsubscribe();
49
49
  }
50
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdVerticalAnchorList, deps: [], target: i0.ɵɵFactoryTarget.Component });
51
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdVerticalAnchorList, isStandalone: true, selector: "sd-vertical-anchor-list", inputs: { sections: { classPropertyName: "sections", publicName: "sections", isSignal: true, isRequired: true, transformFunction: null }, activeSectionId: { classPropertyName: "activeSectionId", publicName: "activeSectionId", isSignal: true, isRequired: false, transformFunction: null }, ellipsis: { classPropertyName: "ellipsis", publicName: "ellipsis", isSignal: true, isRequired: false, transformFunction: null }, sidebarWidth: { classPropertyName: "sidebarWidth", publicName: "sidebarWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sdClickSection: "sdClickSection" }, ngImport: i0, template: "<div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\r\n @for (section of sections(); track section.id) {\r\n <div\r\n class=\"c-anchor-list-item\"\r\n [class.active]=\"section.id === activeSectionId()\"\r\n (click)=\"onClickSection(section.id)\"\r\n (keydown.enter)=\"onClickSection(section.id)\"\r\n tabindex=\"0\">\r\n @if (section.icon()) {\r\n <mat-icon class=\"c-anchor-list-item-icon\">{{ section.icon() }}</mat-icon>\r\n }\r\n <div class=\"c-anchor-list-item-text\" [class.ellipsis]=\"ellipsis()\">\r\n {{ section.title() }}\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-light{color:var(--sd-light)!important}.bg-light{background:var(--sd-light)!important}.border-light{border-color:var(--sd-light)!important}.text-dark{color:var(--sd-dark)!important}.bg-dark{background:var(--sd-dark)!important}.border-dark{border-color:var(--sd-dark)!important}.text-black500{color:var(--sd-black500)!important}.bg-black500{background:var(--sd-black500)!important}.border-black500{border-color:var(--sd-black500)!important}.text-black400{color:var(--sd-black400)!important}.bg-black400{background:var(--sd-black400)!important}.border-black400{border-color:var(--sd-black400)!important}.text-black300{color:var(--sd-black300)!important}.bg-black300{background:var(--sd-black300)!important}.border-black300{border-color:var(--sd-black300)!important}.text-black200{color:var(--sd-black200)!important}.bg-black200{background:var(--sd-black200)!important}.border-black200{border-color:var(--sd-black200)!important}.text-black100{color:var(--sd-black100)!important}.bg-black100{background:var(--sd-black100)!important}.border-black100{border-color:var(--sd-black100)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.c-anchor-list{height:100%;display:flex;flex-direction:column}.c-anchor-list .c-anchor-list-item{border-left:2px solid var(--sd-secondary-light);color:var(--sd-black500);padding:.5rem 1.5rem;cursor:pointer;display:flex;align-items:center;gap:.5rem}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text.ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-anchor-list .c-anchor-list-item.active{border-left:2px solid var(--sd-primary);font-weight:700}.c-anchor-list .c-anchor-list-item:not(.active){border-left:2px solid var(--sd-secondary-light);font-weight:400}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
50
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAnchorVerticalList, deps: [], target: i0.ɵɵFactoryTarget.Component });
51
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdAnchorVerticalList, isStandalone: true, selector: "sd-anchor-vertical-list", inputs: { sections: { classPropertyName: "sections", publicName: "sections", isSignal: true, isRequired: true, transformFunction: null }, activeSectionId: { classPropertyName: "activeSectionId", publicName: "activeSectionId", isSignal: true, isRequired: false, transformFunction: null }, ellipsis: { classPropertyName: "ellipsis", publicName: "ellipsis", isSignal: true, isRequired: false, transformFunction: null }, sidebarWidth: { classPropertyName: "sidebarWidth", publicName: "sidebarWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sdClickSection: "sdClickSection" }, ngImport: i0, template: "<div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\n @for (section of sections(); track section.id) {\n <div\n class=\"c-anchor-list-item\"\n [class.active]=\"section.id === activeSectionId()\"\n (click)=\"onClickSection(section.id)\"\n (keydown.enter)=\"onClickSection(section.id)\"\n tabindex=\"0\">\n @if (section.icon()) {\n <mat-icon class=\"c-anchor-list-item-icon\">{{ section.icon() }}</mat-icon>\n }\n <div class=\"c-anchor-list-item-text\" [class.ellipsis]=\"ellipsis()\">\n {{ section.title() }}\n </div>\n </div>\n }\n</div>\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-light{color:var(--sd-light)!important}.bg-light{background:var(--sd-light)!important}.border-light{border-color:var(--sd-light)!important}.text-dark{color:var(--sd-dark)!important}.bg-dark{background:var(--sd-dark)!important}.border-dark{border-color:var(--sd-dark)!important}.text-black500{color:var(--sd-black500)!important}.bg-black500{background:var(--sd-black500)!important}.border-black500{border-color:var(--sd-black500)!important}.text-black400{color:var(--sd-black400)!important}.bg-black400{background:var(--sd-black400)!important}.border-black400{border-color:var(--sd-black400)!important}.text-black300{color:var(--sd-black300)!important}.bg-black300{background:var(--sd-black300)!important}.border-black300{border-color:var(--sd-black300)!important}.text-black200{color:var(--sd-black200)!important}.bg-black200{background:var(--sd-black200)!important}.border-black200{border-color:var(--sd-black200)!important}.text-black100{color:var(--sd-black100)!important}.bg-black100{background:var(--sd-black100)!important}.border-black100{border-color:var(--sd-black100)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.c-anchor-list{height:100%;display:flex;flex-direction:column}.c-anchor-list .c-anchor-list-item{border-left:2px solid var(--sd-secondary-light);color:var(--sd-black500);padding:.5rem 1.5rem;cursor:pointer;display:flex;align-items:center;gap:.5rem}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text.ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-anchor-list .c-anchor-list-item.active{border-left:2px solid var(--sd-primary);font-weight:700}.c-anchor-list .c-anchor-list-item:not(.active){border-left:2px solid var(--sd-secondary-light);font-weight:400}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
52
52
  }
53
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdVerticalAnchorList, decorators: [{
53
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAnchorVerticalList, decorators: [{
54
54
  type: Component,
55
- args: [{ selector: 'sd-vertical-anchor-list', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, MatIconModule], standalone: true, template: "<div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\r\n @for (section of sections(); track section.id) {\r\n <div\r\n class=\"c-anchor-list-item\"\r\n [class.active]=\"section.id === activeSectionId()\"\r\n (click)=\"onClickSection(section.id)\"\r\n (keydown.enter)=\"onClickSection(section.id)\"\r\n tabindex=\"0\">\r\n @if (section.icon()) {\r\n <mat-icon class=\"c-anchor-list-item-icon\">{{ section.icon() }}</mat-icon>\r\n }\r\n <div class=\"c-anchor-list-item-text\" [class.ellipsis]=\"ellipsis()\">\r\n {{ section.title() }}\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-light{color:var(--sd-light)!important}.bg-light{background:var(--sd-light)!important}.border-light{border-color:var(--sd-light)!important}.text-dark{color:var(--sd-dark)!important}.bg-dark{background:var(--sd-dark)!important}.border-dark{border-color:var(--sd-dark)!important}.text-black500{color:var(--sd-black500)!important}.bg-black500{background:var(--sd-black500)!important}.border-black500{border-color:var(--sd-black500)!important}.text-black400{color:var(--sd-black400)!important}.bg-black400{background:var(--sd-black400)!important}.border-black400{border-color:var(--sd-black400)!important}.text-black300{color:var(--sd-black300)!important}.bg-black300{background:var(--sd-black300)!important}.border-black300{border-color:var(--sd-black300)!important}.text-black200{color:var(--sd-black200)!important}.bg-black200{background:var(--sd-black200)!important}.border-black200{border-color:var(--sd-black200)!important}.text-black100{color:var(--sd-black100)!important}.bg-black100{background:var(--sd-black100)!important}.border-black100{border-color:var(--sd-black100)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.c-anchor-list{height:100%;display:flex;flex-direction:column}.c-anchor-list .c-anchor-list-item{border-left:2px solid var(--sd-secondary-light);color:var(--sd-black500);padding:.5rem 1.5rem;cursor:pointer;display:flex;align-items:center;gap:.5rem}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text.ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-anchor-list .c-anchor-list-item.active{border-left:2px solid var(--sd-primary);font-weight:700}.c-anchor-list .c-anchor-list-item:not(.active){border-left:2px solid var(--sd-secondary-light);font-weight:400}\n"] }]
55
+ args: [{ selector: 'sd-anchor-vertical-list', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, MatIconModule], standalone: true, template: "<div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\n @for (section of sections(); track section.id) {\n <div\n class=\"c-anchor-list-item\"\n [class.active]=\"section.id === activeSectionId()\"\n (click)=\"onClickSection(section.id)\"\n (keydown.enter)=\"onClickSection(section.id)\"\n tabindex=\"0\">\n @if (section.icon()) {\n <mat-icon class=\"c-anchor-list-item-icon\">{{ section.icon() }}</mat-icon>\n }\n <div class=\"c-anchor-list-item-text\" [class.ellipsis]=\"ellipsis()\">\n {{ section.title() }}\n </div>\n </div>\n }\n</div>\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-light{color:var(--sd-light)!important}.bg-light{background:var(--sd-light)!important}.border-light{border-color:var(--sd-light)!important}.text-dark{color:var(--sd-dark)!important}.bg-dark{background:var(--sd-dark)!important}.border-dark{border-color:var(--sd-dark)!important}.text-black500{color:var(--sd-black500)!important}.bg-black500{background:var(--sd-black500)!important}.border-black500{border-color:var(--sd-black500)!important}.text-black400{color:var(--sd-black400)!important}.bg-black400{background:var(--sd-black400)!important}.border-black400{border-color:var(--sd-black400)!important}.text-black300{color:var(--sd-black300)!important}.bg-black300{background:var(--sd-black300)!important}.border-black300{border-color:var(--sd-black300)!important}.text-black200{color:var(--sd-black200)!important}.bg-black200{background:var(--sd-black200)!important}.border-black200{border-color:var(--sd-black200)!important}.text-black100{color:var(--sd-black100)!important}.bg-black100{background:var(--sd-black100)!important}.border-black100{border-color:var(--sd-black100)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.c-anchor-list{height:100%;display:flex;flex-direction:column}.c-anchor-list .c-anchor-list-item{border-left:2px solid var(--sd-secondary-light);color:var(--sd-black500);padding:.5rem 1.5rem;cursor:pointer;display:flex;align-items:center;gap:.5rem}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.c-anchor-list .c-anchor-list-item .c-anchor-list-item-text.ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-anchor-list .c-anchor-list-item.active{border-left:2px solid var(--sd-primary);font-weight:700}.c-anchor-list .c-anchor-list-item:not(.active){border-left:2px solid var(--sd-secondary-light);font-weight:400}\n"] }]
56
56
  }], ctorParameters: () => [] });
57
57
 
58
58
  class SdAnchor {
@@ -136,11 +136,11 @@ class SdAnchor {
136
136
  this.#disposeResources();
137
137
  }
138
138
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAnchor, deps: [], target: i0.ɵɵFactoryTarget.Component });
139
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdAnchor, isStandalone: true, selector: "sd-anchor", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, sidebarWidth: { classPropertyName: "sidebarWidth", publicName: "sidebarWidth", isSignal: true, isRequired: false, transformFunction: null }, ellipsis: { classPropertyName: "ellipsis", publicName: "ellipsis", isSignal: true, isRequired: false, transformFunction: null }, isOverscroll: { classPropertyName: "isOverscroll", publicName: "isOverscroll", isSignal: true, isRequired: false, transformFunction: null }, isHiddenAnchorList: { classPropertyName: "isHiddenAnchorList", publicName: "isHiddenAnchorList", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "sections", predicate: SdAnchorItem, isSignal: true }], viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"c-anchor-vertical\" [ngClass]=\"{ 'c-stop-scroll-propagation': !isOverscroll() }\" #wrapper>\r\n <div class=\"c-anchor-content\" [style.width]=\"'calc(100% - ' + sidebarWidth() + ' - 16px)'\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n @if (!isHiddenAnchorList()) {\r\n <div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\r\n <sd-vertical-anchor-list\r\n [sections]=\"sections()\"\r\n [ellipsis]=\"ellipsis()\"\r\n [sidebarWidth]=\"sidebarWidth()\"\r\n [activeSectionId]=\"activeSectionId()\"\r\n (sdClickSection)=\"scrollSectionByClick($event)\">\r\n </sd-vertical-anchor-list>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".c-anchor-vertical{position:relative;display:flex;height:100%;width:100%;gap:16px;overflow-y:auto}.c-anchor-vertical.c-stop-scroll-propagation{overscroll-behavior:contain}.c-anchor-vertical .c-anchor-content{width:100%}.c-anchor-vertical .c-anchor-list{position:sticky;top:0;right:6px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SdVerticalAnchorList, selector: "sd-vertical-anchor-list", inputs: ["sections", "activeSectionId", "ellipsis", "sidebarWidth"], outputs: ["sdClickSection"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
139
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdAnchor, isStandalone: true, selector: "sd-anchor", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, sidebarWidth: { classPropertyName: "sidebarWidth", publicName: "sidebarWidth", isSignal: true, isRequired: false, transformFunction: null }, ellipsis: { classPropertyName: "ellipsis", publicName: "ellipsis", isSignal: true, isRequired: false, transformFunction: null }, isOverscroll: { classPropertyName: "isOverscroll", publicName: "isOverscroll", isSignal: true, isRequired: false, transformFunction: null }, isHiddenAnchorList: { classPropertyName: "isHiddenAnchorList", publicName: "isHiddenAnchorList", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "sections", predicate: SdAnchorItem, isSignal: true }], viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"c-anchor-vertical\" [ngClass]=\"{ 'c-stop-scroll-propagation': !isOverscroll() }\" #wrapper>\n <div class=\"c-anchor-content\" [style.width]=\"'calc(100% - ' + sidebarWidth() + ' - 16px)'\">\n <ng-content></ng-content>\n </div>\n\n @if (!isHiddenAnchorList()) {\n <div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\n <sd-anchor-vertical-list\n [sections]=\"sections()\"\n [ellipsis]=\"ellipsis()\"\n [sidebarWidth]=\"sidebarWidth()\"\n [activeSectionId]=\"activeSectionId()\"\n (sdClickSection)=\"scrollSectionByClick($event)\">\n </sd-anchor-vertical-list>\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.c-anchor-vertical{position:relative;display:flex;height:100%;width:100%;gap:16px;overflow-y:auto}.c-anchor-vertical.c-stop-scroll-propagation{overscroll-behavior:contain}.c-anchor-vertical .c-anchor-content{width:100%}.c-anchor-vertical .c-anchor-list{position:sticky;top:0;right:6px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SdAnchorVerticalList, selector: "sd-anchor-vertical-list", inputs: ["sections", "activeSectionId", "ellipsis", "sidebarWidth"], outputs: ["sdClickSection"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
140
140
  }
141
141
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAnchor, decorators: [{
142
142
  type: Component,
143
- args: [{ selector: 'sd-anchor', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, SdVerticalAnchorList], standalone: true, template: "<div class=\"c-anchor-vertical\" [ngClass]=\"{ 'c-stop-scroll-propagation': !isOverscroll() }\" #wrapper>\r\n <div class=\"c-anchor-content\" [style.width]=\"'calc(100% - ' + sidebarWidth() + ' - 16px)'\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n @if (!isHiddenAnchorList()) {\r\n <div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\r\n <sd-vertical-anchor-list\r\n [sections]=\"sections()\"\r\n [ellipsis]=\"ellipsis()\"\r\n [sidebarWidth]=\"sidebarWidth()\"\r\n [activeSectionId]=\"activeSectionId()\"\r\n (sdClickSection)=\"scrollSectionByClick($event)\">\r\n </sd-vertical-anchor-list>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".c-anchor-vertical{position:relative;display:flex;height:100%;width:100%;gap:16px;overflow-y:auto}.c-anchor-vertical.c-stop-scroll-propagation{overscroll-behavior:contain}.c-anchor-vertical .c-anchor-content{width:100%}.c-anchor-vertical .c-anchor-list{position:sticky;top:0;right:6px}\n"] }]
143
+ args: [{ selector: 'sd-anchor', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, SdAnchorVerticalList], standalone: true, template: "<div class=\"c-anchor-vertical\" [ngClass]=\"{ 'c-stop-scroll-propagation': !isOverscroll() }\" #wrapper>\n <div class=\"c-anchor-content\" [style.width]=\"'calc(100% - ' + sidebarWidth() + ' - 16px)'\">\n <ng-content></ng-content>\n </div>\n\n @if (!isHiddenAnchorList()) {\n <div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\n <sd-anchor-vertical-list\n [sections]=\"sections()\"\n [ellipsis]=\"ellipsis()\"\n [sidebarWidth]=\"sidebarWidth()\"\n [activeSectionId]=\"activeSectionId()\"\n (sdClickSection)=\"scrollSectionByClick($event)\">\n </sd-anchor-vertical-list>\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.c-anchor-vertical{position:relative;display:flex;height:100%;width:100%;gap:16px;overflow-y:auto}.c-anchor-vertical.c-stop-scroll-propagation{overscroll-behavior:contain}.c-anchor-vertical .c-anchor-content{width:100%}.c-anchor-vertical .c-anchor-list{position:sticky;top:0;right:6px}\n"] }]
144
144
  }], ctorParameters: () => [] });
145
145
 
146
146
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-components-anchor.mjs","sources":["../../../projects/sd-angular/components/anchor/src/components/anchor-item/anchor-item.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor-item/anchor-item.component.html","../../../projects/sd-angular/components/anchor/src/components/anchor-vertical/anchor-list/anchor-list.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor-vertical/anchor-list/anchor-list.component.html","../../../projects/sd-angular/components/anchor/src/components/main/main.component.ts","../../../projects/sd-angular/components/anchor/src/components/main/main.component.html","../../../projects/sd-angular/components/anchor/sd-angular-core-components-anchor.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, effect, inject, input } from '@angular/core';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { IAnchorItem } from '../../models';\r\n\r\n@Component({\r\n selector: 'sd-anchor-item',\r\n templateUrl: './anchor-item.component.html',\r\n styleUrls: ['./anchor-item.component.scss'],\r\n imports: [CommonModule],\r\n standalone: true,\r\n})\r\nexport class SdAnchorItem implements IAnchorItem {\r\n title = input.required<string>();\r\n icon = input<string | undefined>();\r\n id: string = uuidv4();\r\n elementRef = inject(ElementRef);\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.title()) {\r\n this.elementRef.nativeElement.removeAttribute('title');\r\n }\r\n });\r\n }\r\n}\r\n","<section [attr.data-sd-anchor-section-id]=\"id\">\r\n <ng-content [attr.data-sd-anchor-section-id]=\"id\"></ng-content>\r\n</section>\r\n","import { ChangeDetectionStrategy, Component, OnDestroy, input, output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { Subject, Subscription, debounceTime } from 'rxjs';\r\nimport { SdAnchorItem } from '../../anchor-item/anchor-item.component';\r\n\r\n@Component({\r\n selector: 'sd-vertical-anchor-list',\r\n templateUrl: './anchor-list.component.html',\r\n styleUrls: ['./anchor-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [CommonModule, MatIconModule],\r\n standalone: true,\r\n})\r\nexport class SdVerticalAnchorList implements OnDestroy {\r\n sections = input.required<readonly SdAnchorItem[]>();\r\n activeSectionId = input<string>('');\r\n ellipsis = input<boolean>(false);\r\n sidebarWidth = input<string>('');\r\n\r\n sdClickSection = output<string>();\r\n\r\n #delay = 200;\r\n #clickSectionSubject = new Subject<string>();\r\n #subscription = new Subscription();\r\n\r\n constructor() {\r\n this.#subscription.add(\r\n this.#clickSectionSubject\r\n .pipe(debounceTime(this.#delay))\r\n .subscribe((id: string) => this.sdClickSection.emit(id))\r\n );\r\n }\r\n\r\n onClickSection = (id: string): void => {\r\n this.#clickSectionSubject.next(id);\r\n };\r\n\r\n ngOnDestroy(): void {\r\n this.#subscription.unsubscribe();\r\n }\r\n}\r\n","<div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\r\n @for (section of sections(); track section.id) {\r\n <div\r\n class=\"c-anchor-list-item\"\r\n [class.active]=\"section.id === activeSectionId()\"\r\n (click)=\"onClickSection(section.id)\"\r\n (keydown.enter)=\"onClickSection(section.id)\"\r\n tabindex=\"0\">\r\n @if (section.icon()) {\r\n <mat-icon class=\"c-anchor-list-item-icon\">{{ section.icon() }}</mat-icon>\r\n }\r\n <div class=\"c-anchor-list-item-text\" [class.ellipsis]=\"ellipsis()\">\r\n {{ section.title() }}\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n OnDestroy,\r\n afterNextRender,\r\n booleanAttribute,\r\n contentChildren,\r\n input,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { Subscription, auditTime, debounceTime, filter, fromEvent, map, take } from 'rxjs';\r\nimport { SdVerticalAnchorList } from '../anchor-vertical/anchor-list/anchor-list.component';\r\nimport { SdAnchorItem } from '../anchor-item/anchor-item.component';\r\n\r\n@Component({\r\n selector: 'sd-anchor',\r\n templateUrl: './main.component.html',\r\n styleUrls: ['./main.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [CommonModule, SdVerticalAnchorList],\r\n standalone: true,\r\n})\r\nexport class SdAnchor implements OnDestroy {\r\n wrapper = viewChild.required<ElementRef>('wrapper');\r\n sections = contentChildren(SdAnchorItem);\r\n\r\n type = input<'vertical' | 'horizontal'>('vertical');\r\n sidebarWidth = input<string>('200px');\r\n ellipsis = input(false, { transform: booleanAttribute });\r\n isOverscroll = input(false, { transform: booleanAttribute });\r\n isHiddenAnchorList = input(false, { transform: booleanAttribute });\r\n\r\n activeSectionId = signal<string>('');\r\n\r\n #scrollSubscription = new Subscription();\r\n #clickScrollSubscription = new Subscription();\r\n #delay = 100;\r\n #currentScrollTop = 0;\r\n #timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n if (!this.isHiddenAnchorList()) {\r\n this.activeSectionId.set(this.sections()[0]?.id ?? '');\r\n this.#registerScrollSubscription();\r\n }\r\n });\r\n }\r\n\r\n #registerScrollSubscription = (): void => {\r\n this.#disposeResources();\r\n const wrapperEl = this.wrapper().nativeElement;\r\n this.#scrollSubscription = fromEvent<UIEvent>(wrapperEl, 'scroll')\r\n .pipe(auditTime(50))\r\n .subscribe((event: UIEvent) => {\r\n const el = event.target as HTMLElement;\r\n this.#currentScrollTop = this.#updateCurrentScroll(el);\r\n for (const section of this.sections()) {\r\n const rect = section.elementRef.nativeElement;\r\n const rectTop = rect.offsetTop;\r\n const rectBottom = rectTop + rect.offsetHeight;\r\n if (this.#currentScrollTop >= rectTop && this.#currentScrollTop < rectBottom) {\r\n this.activeSectionId.set(section.id);\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n scrollSectionByClick(idSectionTarget: string): void {\r\n this.activeSectionId.set(idSectionTarget);\r\n const targetSection = this.sections().find(s => s.id === idSectionTarget)?.elementRef;\r\n if (!targetSection) return;\r\n\r\n this.#disposeResources();\r\n const wrapperEl = this.wrapper().nativeElement;\r\n const targetElement = targetSection.nativeElement;\r\n const prevScrollTop = this.#currentScrollTop;\r\n\r\n this.#clickScrollSubscription = fromEvent<UIEvent>(wrapperEl, 'scroll')\r\n .pipe(\r\n auditTime(this.#delay),\r\n map((event: UIEvent) => {\r\n const el = event.target as HTMLElement;\r\n this.#currentScrollTop = this.#updateCurrentScroll(el);\r\n const wrapperTop = wrapperEl.getBoundingClientRect().top;\r\n const targetRect = targetElement.getBoundingClientRect();\r\n const isVisible = targetRect.top >= 0 && targetRect.bottom <= window.innerHeight;\r\n return Math.abs(targetRect.top - wrapperTop) < 1 || isVisible;\r\n }),\r\n filter(Boolean),\r\n debounceTime(this.#delay + 100),\r\n take(1)\r\n )\r\n .subscribe(() => this.#registerScrollSubscription());\r\n\r\n this.#timeoutId = setTimeout(() => {\r\n if (prevScrollTop === this.#currentScrollTop) {\r\n this.#registerScrollSubscription();\r\n }\r\n }, this.#delay + 100);\r\n\r\n wrapperEl.scrollTo({ top: targetElement.offsetTop, behavior: 'smooth' });\r\n }\r\n\r\n #updateCurrentScroll(el: HTMLElement): number {\r\n const style = getComputedStyle(el);\r\n return el.scrollTop + parseFloat(style.paddingTop) + parseFloat(style.borderTopWidth);\r\n }\r\n\r\n #disposeResources = (): void => {\r\n if (this.#timeoutId) clearTimeout(this.#timeoutId);\r\n this.#scrollSubscription?.unsubscribe();\r\n this.#clickScrollSubscription?.unsubscribe();\r\n };\r\n\r\n ngOnDestroy(): void {\r\n this.#disposeResources();\r\n }\r\n}\r\n","<div class=\"c-anchor-vertical\" [ngClass]=\"{ 'c-stop-scroll-propagation': !isOverscroll() }\" #wrapper>\r\n <div class=\"c-anchor-content\" [style.width]=\"'calc(100% - ' + sidebarWidth() + ' - 16px)'\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n @if (!isHiddenAnchorList()) {\r\n <div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\r\n <sd-vertical-anchor-list\r\n [sections]=\"sections()\"\r\n [ellipsis]=\"ellipsis()\"\r\n [sidebarWidth]=\"sidebarWidth()\"\r\n [activeSectionId]=\"activeSectionId()\"\r\n (sdClickSection)=\"scrollSectionByClick($event)\">\r\n </sd-vertical-anchor-list>\r\n </div>\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["uuidv4"],"mappings":"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"}
1
+ {"version":3,"file":"sd-angular-core-components-anchor.mjs","sources":["../../../projects/sd-angular/components/anchor/src/components/anchor-item/anchor-item.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor-item/anchor-item.component.html","../../../projects/sd-angular/components/anchor/src/components/anchor-vertical/anchor-vertical-list.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor-vertical/anchor-vertical-list.component.html","../../../projects/sd-angular/components/anchor/src/components/anchor/anchor.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor/anchor.component.html","../../../projects/sd-angular/components/anchor/sd-angular-core-components-anchor.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, effect, inject, input } from '@angular/core';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { IAnchorItem } from '../../models';\r\n\r\n@Component({\r\n selector: 'sd-anchor-item',\r\n templateUrl: './anchor-item.component.html',\r\n styleUrls: ['./anchor-item.component.scss'],\r\n imports: [CommonModule],\r\n standalone: true,\r\n})\r\nexport class SdAnchorItem implements IAnchorItem {\r\n title = input.required<string>();\r\n icon = input<string | undefined>();\r\n id: string = uuidv4();\r\n elementRef = inject(ElementRef);\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.title()) {\r\n this.elementRef.nativeElement.removeAttribute('title');\r\n }\r\n });\r\n }\r\n}\r\n","<section>\r\n <ng-content></ng-content>\r\n</section>\r\n","import { ChangeDetectionStrategy, Component, OnDestroy, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { Subject, Subscription, debounceTime } from 'rxjs';\n\nimport { SdAnchorItem } from '../anchor-item/anchor-item.component';\n\n@Component({\n selector: 'sd-anchor-vertical-list',\n templateUrl: './anchor-vertical-list.component.html',\n styleUrl: './anchor-vertical-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, MatIconModule],\n standalone: true,\n})\nexport class SdAnchorVerticalList implements OnDestroy {\n sections = input.required<readonly SdAnchorItem[]>();\n activeSectionId = input<string>('');\n ellipsis = input<boolean>(false);\n sidebarWidth = input<string>('');\n\n sdClickSection = output<string>();\n\n #delay = 200;\n #clickSectionSubject = new Subject<string>();\n #subscription = new Subscription();\n\n constructor() {\n this.#subscription.add(\n this.#clickSectionSubject\n .pipe(debounceTime(this.#delay))\n .subscribe((id: string) => this.sdClickSection.emit(id))\n );\n }\n\n onClickSection = (id: string): void => {\n this.#clickSectionSubject.next(id);\n };\n\n ngOnDestroy(): void {\n this.#subscription.unsubscribe();\n }\n}\n","<div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\n @for (section of sections(); track section.id) {\n <div\n class=\"c-anchor-list-item\"\n [class.active]=\"section.id === activeSectionId()\"\n (click)=\"onClickSection(section.id)\"\n (keydown.enter)=\"onClickSection(section.id)\"\n tabindex=\"0\">\n @if (section.icon()) {\n <mat-icon class=\"c-anchor-list-item-icon\">{{ section.icon() }}</mat-icon>\n }\n <div class=\"c-anchor-list-item-text\" [class.ellipsis]=\"ellipsis()\">\n {{ section.title() }}\n </div>\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n afterNextRender,\n booleanAttribute,\n contentChildren,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription, auditTime, debounceTime, filter, fromEvent, map, take } from 'rxjs';\n\nimport { SdAnchorVerticalList } from '../anchor-vertical/anchor-vertical-list.component';\nimport { SdAnchorItem } from '../anchor-item/anchor-item.component';\n\n@Component({\n selector: 'sd-anchor',\n templateUrl: './anchor.component.html',\n styleUrls: ['./anchor.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, SdAnchorVerticalList],\n standalone: true,\n})\nexport class SdAnchor implements OnDestroy {\n wrapper = viewChild.required<ElementRef>('wrapper');\n sections = contentChildren(SdAnchorItem);\n\n type = input<'vertical' | 'horizontal'>('vertical');\n sidebarWidth = input<string>('200px');\n ellipsis = input(false, { transform: booleanAttribute });\n isOverscroll = input(false, { transform: booleanAttribute });\n isHiddenAnchorList = input(false, { transform: booleanAttribute });\n\n activeSectionId = signal<string>('');\n\n #scrollSubscription = new Subscription();\n #clickScrollSubscription = new Subscription();\n #delay = 100;\n #currentScrollTop = 0;\n #timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n afterNextRender(() => {\n if (!this.isHiddenAnchorList()) {\n this.activeSectionId.set(this.sections()[0]?.id ?? '');\n this.#registerScrollSubscription();\n }\n });\n }\n\n #registerScrollSubscription = (): void => {\n this.#disposeResources();\n const wrapperEl = this.wrapper().nativeElement;\n this.#scrollSubscription = fromEvent<UIEvent>(wrapperEl, 'scroll')\n .pipe(auditTime(50))\n .subscribe((event: UIEvent) => {\n const el = event.target as HTMLElement;\n this.#currentScrollTop = this.#updateCurrentScroll(el);\n for (const section of this.sections()) {\n const rect = section.elementRef.nativeElement;\n const rectTop = rect.offsetTop;\n const rectBottom = rectTop + rect.offsetHeight;\n if (this.#currentScrollTop >= rectTop && this.#currentScrollTop < rectBottom) {\n this.activeSectionId.set(section.id);\n break;\n }\n }\n });\n };\n\n scrollSectionByClick(idSectionTarget: string): void {\n this.activeSectionId.set(idSectionTarget);\n const targetSection = this.sections().find(s => s.id === idSectionTarget)?.elementRef;\n if (!targetSection) return;\n\n this.#disposeResources();\n const wrapperEl = this.wrapper().nativeElement;\n const targetElement = targetSection.nativeElement;\n const prevScrollTop = this.#currentScrollTop;\n\n this.#clickScrollSubscription = fromEvent<UIEvent>(wrapperEl, 'scroll')\n .pipe(\n auditTime(this.#delay),\n map((event: UIEvent) => {\n const el = event.target as HTMLElement;\n this.#currentScrollTop = this.#updateCurrentScroll(el);\n const wrapperTop = wrapperEl.getBoundingClientRect().top;\n const targetRect = targetElement.getBoundingClientRect();\n const isVisible = targetRect.top >= 0 && targetRect.bottom <= window.innerHeight;\n return Math.abs(targetRect.top - wrapperTop) < 1 || isVisible;\n }),\n filter(Boolean),\n debounceTime(this.#delay + 100),\n take(1)\n )\n .subscribe(() => this.#registerScrollSubscription());\n\n this.#timeoutId = setTimeout(() => {\n if (prevScrollTop === this.#currentScrollTop) {\n this.#registerScrollSubscription();\n }\n }, this.#delay + 100);\n\n wrapperEl.scrollTo({ top: targetElement.offsetTop, behavior: 'smooth' });\n }\n\n #updateCurrentScroll(el: HTMLElement): number {\n const style = getComputedStyle(el);\n return el.scrollTop + parseFloat(style.paddingTop) + parseFloat(style.borderTopWidth);\n }\n\n #disposeResources = (): void => {\n if (this.#timeoutId) clearTimeout(this.#timeoutId);\n this.#scrollSubscription?.unsubscribe();\n this.#clickScrollSubscription?.unsubscribe();\n };\n\n ngOnDestroy(): void {\n this.#disposeResources();\n }\n}\n","<div class=\"c-anchor-vertical\" [ngClass]=\"{ 'c-stop-scroll-propagation': !isOverscroll() }\" #wrapper>\n <div class=\"c-anchor-content\" [style.width]=\"'calc(100% - ' + sidebarWidth() + ' - 16px)'\">\n <ng-content></ng-content>\n </div>\n\n @if (!isHiddenAnchorList()) {\n <div class=\"c-anchor-list\" [style.width]=\"sidebarWidth()\">\n <sd-anchor-vertical-list\n [sections]=\"sections()\"\n [ellipsis]=\"ellipsis()\"\n [sidebarWidth]=\"sidebarWidth()\"\n [activeSectionId]=\"activeSectionId()\"\n (sdClickSection)=\"scrollSectionByClick($event)\">\n </sd-anchor-vertical-list>\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["uuidv4"],"mappings":"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"}