ngx-tethys 20.0.2 → 20.0.3

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/CHANGELOG.md CHANGED
@@ -2,6 +2,24 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4
4
 
5
+ ## [20.0.3](https://github.com/atinc/ngx-tethys/compare/20.0.2...20.0.3) (2025-12-24)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * **input-group:** update inputDirective usage to ensure proper type handling ([#3653](https://github.com/atinc/ngx-tethys/issues/3653)) ([48e3813](https://github.com/atinc/ngx-tethys/commit/48e3813fefde755c65e648362c836eb6bb18b576))
11
+ * **property:** 修复hover状态下编辑下拉选择后,左上角会闪烁 #TINFR-3246 ([48df583](https://github.com/atinc/ngx-tethys/commit/48df5836d66795dfda573d4848fd28b8ff5643ca)), closes [#TINFR-3246](https://github.com/atinc/ngx-tethys/issues/TINFR-3246)
12
+ * **select:** should call onChangeFn before close panel #TINFR-3248 ([#3645](https://github.com/atinc/ngx-tethys/issues/3645)) ([8627151](https://github.com/atinc/ngx-tethys/commit/8627151a796c5cc2fc79ec489f840ee0723e18b9)), closes [#TINFR-3248](https://github.com/atinc/ngx-tethys/issues/TINFR-3248)
13
+
14
+
15
+ ### Features
16
+
17
+ * **anchor:** add thyDisabledContainerScroll to support disabling the scrolling container jump, and keep the link activation within the visible range #TINFR-3243 ([#3643](https://github.com/atinc/ngx-tethys/issues/3643)) ([ea62f9f](https://github.com/atinc/ngx-tethys/commit/ea62f9f3b6b7039dd09efe5702c6593cec5ee556)), closes [#TINFR-3243](https://github.com/atinc/ngx-tethys/issues/TINFR-3243)
18
+ * **select:** add thyVirtualScroll parameter #TINFR-3232 ([#3651](https://github.com/atinc/ngx-tethys/issues/3651)) ([b37b73b](https://github.com/atinc/ngx-tethys/commit/b37b73b6057af624ea78a65e8c85a9307d287a3a)), closes [#TINFR-3232](https://github.com/atinc/ngx-tethys/issues/TINFR-3232)
19
+ * **select:** support suffixTemplate for thy-option ([#3652](https://github.com/atinc/ngx-tethys/issues/3652)) ([70487b0](https://github.com/atinc/ngx-tethys/commit/70487b0373567b3e7b130573fb045d45325f85d4))
20
+
21
+
22
+
5
23
  ## [20.0.2](https://github.com/atinc/ngx-tethys/compare/20.0.1...20.0.2) (2025-12-17)
6
24
 
7
25
 
package/anchor/index.d.ts CHANGED
@@ -76,6 +76,10 @@ declare class ThyAnchor implements IThyAnchorComponent, OnDestroy, AfterViewInit
76
76
  * 设置导航方向
77
77
  */
78
78
  readonly thyDirection: _angular_core.InputSignal<"horizontal" | "vertical">;
79
+ /**
80
+ * 是否禁用容器滚动
81
+ */
82
+ readonly thyDisabledContainerScroll: _angular_core.InputSignalWithTransform<boolean, unknown>;
79
83
  /**
80
84
  * 点击项触发
81
85
  */
@@ -89,10 +93,11 @@ declare class ThyAnchor implements IThyAnchorComponent, OnDestroy, AfterViewInit
89
93
  'max-height': string;
90
94
  }>;
91
95
  readonly container: Signal<HTMLElement | Window>;
92
- private links;
96
+ links: ThyAnchorLink[];
93
97
  private animating;
94
98
  private destroy$;
95
99
  private handleScrollTimeoutID;
100
+ private wrapper;
96
101
  registerLink(link: ThyAnchorLink): void;
97
102
  unregisterLink(link: ThyAnchorLink): void;
98
103
  constructor();
@@ -102,11 +107,12 @@ declare class ThyAnchor implements IThyAnchorComponent, OnDestroy, AfterViewInit
102
107
  private registerScrollEvent;
103
108
  handleScroll(): void;
104
109
  private clearActive;
105
- private handleActive;
110
+ handleActive(linkComponent: ThyAnchorLink): void;
111
+ private linkVisible;
106
112
  private setVisible;
107
113
  handleScrollTo(linkComponent: ThyAnchorLink): void;
108
114
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ThyAnchor, never>;
109
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ThyAnchor, "thy-anchor", ["thyAnchor"], { "thyAffix": { "alias": "thyAffix"; "required": false; "isSignal": true; }; "thyBounds": { "alias": "thyBounds"; "required": false; "isSignal": true; }; "thyOffsetTop": { "alias": "thyOffsetTop"; "required": false; "isSignal": true; }; "thyContainer": { "alias": "thyContainer"; "required": false; "isSignal": true; }; "thyDirection": { "alias": "thyDirection"; "required": false; "isSignal": true; }; }, { "thyClick": "thyClick"; "thyScroll": "thyScroll"; }, never, ["*"], true, never>;
115
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ThyAnchor, "thy-anchor", ["thyAnchor"], { "thyAffix": { "alias": "thyAffix"; "required": false; "isSignal": true; }; "thyBounds": { "alias": "thyBounds"; "required": false; "isSignal": true; }; "thyOffsetTop": { "alias": "thyOffsetTop"; "required": false; "isSignal": true; }; "thyContainer": { "alias": "thyContainer"; "required": false; "isSignal": true; }; "thyDirection": { "alias": "thyDirection"; "required": false; "isSignal": true; }; "thyDisabledContainerScroll": { "alias": "thyDisabledContainerScroll"; "required": false; "isSignal": true; }; }, { "thyClick": "thyClick"; "thyScroll": "thyScroll"; }, never, ["*"], true, never>;
110
116
  }
111
117
 
112
118
  declare class ThyAnchorModule {
@@ -51,6 +51,10 @@ class ThyAnchor {
51
51
  * 设置导航方向
52
52
  */
53
53
  this.thyDirection = input('vertical', ...(ngDevMode ? [{ debugName: "thyDirection" }] : []));
54
+ /**
55
+ * 是否禁用容器滚动
56
+ */
57
+ this.thyDisabledContainerScroll = input(false, ...(ngDevMode ? [{ debugName: "thyDisabledContainerScroll", transform: coerceBooleanProperty }] : [{ transform: coerceBooleanProperty }]));
54
58
  /**
55
59
  * 点击项触发
56
60
  */
@@ -74,6 +78,7 @@ class ThyAnchor {
74
78
  this.animating = false;
75
79
  this.destroy$ = new Subject();
76
80
  this.handleScrollTimeoutID = -1;
81
+ this.wrapper = viewChild.required('wrapper');
77
82
  effect(() => {
78
83
  if (this.thyContainer()) {
79
84
  this.registerScrollEvent();
@@ -101,6 +106,9 @@ class ThyAnchor {
101
106
  if (!this.platform.isBrowser) {
102
107
  return;
103
108
  }
109
+ if (this.thyDisabledContainerScroll()) {
110
+ return;
111
+ }
104
112
  this.destroy$.next();
105
113
  this.zone.runOutsideAngular(() => {
106
114
  fromEvent(this.container(), 'scroll', { passive: true })
@@ -156,14 +164,39 @@ class ThyAnchor {
156
164
  const linkNode = linkComponent.getLinkTitleElement();
157
165
  const horizontalAnchor = this.thyDirection() === 'horizontal';
158
166
  const ink = this.ink();
159
- ink.nativeElement.style.top = horizontalAnchor ? '' : `${linkNode.offsetTop}px`;
160
- ink.nativeElement.style.height = horizontalAnchor ? '' : `${linkNode.clientHeight}px`;
161
- ink.nativeElement.style.left = horizontalAnchor ? `${linkNode.offsetLeft}px` : '';
162
- ink.nativeElement.style.width = horizontalAnchor ? `${linkNode.clientWidth}px` : '';
167
+ const linkOffset = {
168
+ top: linkNode.offsetTop,
169
+ left: linkNode.offsetLeft,
170
+ height: linkNode.clientHeight,
171
+ width: linkNode.clientWidth
172
+ };
173
+ ink.nativeElement.style.top = horizontalAnchor ? '' : `${linkOffset.top}px`;
174
+ ink.nativeElement.style.height = horizontalAnchor ? '' : `${linkOffset.height}px`;
175
+ ink.nativeElement.style.left = horizontalAnchor ? `${linkOffset.left}px` : '';
176
+ ink.nativeElement.style.width = horizontalAnchor ? `${linkOffset.width}px` : '';
163
177
  this.visible = true;
164
178
  this.setVisible();
179
+ this.linkVisible(linkOffset, horizontalAnchor);
165
180
  this.thyScroll.emit(linkComponent);
166
181
  }
182
+ linkVisible(linkOffset, horizontalAnchor) {
183
+ const wrapper = this.wrapper()?.nativeElement;
184
+ if (!wrapper) {
185
+ return;
186
+ }
187
+ const scrollTo = horizontalAnchor ? linkOffset.left : linkOffset.top;
188
+ const scrollPos = horizontalAnchor ? wrapper.scrollLeft : wrapper.scrollTop;
189
+ const wrapperSize = horizontalAnchor ? wrapper.offsetWidth : wrapper.offsetHeight;
190
+ const linkSize = horizontalAnchor ? linkOffset.width : linkOffset.height;
191
+ if (scrollTo < scrollPos || scrollTo + linkSize > scrollPos + wrapperSize) {
192
+ if (horizontalAnchor) {
193
+ wrapper.scrollLeft = scrollTo;
194
+ }
195
+ else {
196
+ wrapper.scrollTop = scrollTo;
197
+ }
198
+ }
199
+ }
167
200
  setVisible() {
168
201
  const visible = this.visible;
169
202
  const visibleClassname = 'visible';
@@ -178,28 +211,30 @@ class ThyAnchor {
178
211
  }
179
212
  }
180
213
  handleScrollTo(linkComponent) {
181
- const container = this.container() instanceof HTMLElement ? this.container() : this.document;
182
- const linkElement = container.querySelector(linkComponent.thyHref());
183
- if (!linkElement) {
184
- return;
214
+ if (!this.thyDisabledContainerScroll()) {
215
+ const container = this.container() instanceof HTMLElement ? this.container() : this.document;
216
+ const linkElement = container.querySelector(linkComponent.thyHref());
217
+ if (!linkElement) {
218
+ return;
219
+ }
220
+ this.animating = true;
221
+ const containerScrollTop = this.scrollService.getScroll(this.container());
222
+ const elementOffsetTop = getOffset(linkElement, this.container()).top;
223
+ const targetScrollTop = containerScrollTop + elementOffsetTop - (this.thyOffsetTop() || 0);
224
+ this.scrollService.scrollTo(this.container(), targetScrollTop, undefined, () => {
225
+ this.animating = false;
226
+ });
185
227
  }
186
- this.animating = true;
187
- const containerScrollTop = this.scrollService.getScroll(this.container());
188
- const elementOffsetTop = getOffset(linkElement, this.container()).top;
189
- const targetScrollTop = containerScrollTop + elementOffsetTop - (this.thyOffsetTop() || 0);
190
- this.scrollService.scrollTo(this.container(), targetScrollTop, undefined, () => {
191
- this.animating = false;
192
- });
193
228
  this.handleActive(linkComponent);
194
229
  this.thyClick.emit(linkComponent);
195
230
  }
196
231
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ThyAnchor, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
197
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ThyAnchor, isStandalone: true, selector: "thy-anchor", inputs: { thyAffix: { classPropertyName: "thyAffix", publicName: "thyAffix", isSignal: true, isRequired: false, transformFunction: null }, thyBounds: { classPropertyName: "thyBounds", publicName: "thyBounds", isSignal: true, isRequired: false, transformFunction: null }, thyOffsetTop: { classPropertyName: "thyOffsetTop", publicName: "thyOffsetTop", isSignal: true, isRequired: false, transformFunction: null }, thyContainer: { classPropertyName: "thyContainer", publicName: "thyContainer", isSignal: true, isRequired: false, transformFunction: null }, thyDirection: { classPropertyName: "thyDirection", publicName: "thyDirection", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { thyClick: "thyClick", thyScroll: "thyScroll" }, providers: [
232
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ThyAnchor, isStandalone: true, selector: "thy-anchor", inputs: { thyAffix: { classPropertyName: "thyAffix", publicName: "thyAffix", isSignal: true, isRequired: false, transformFunction: null }, thyBounds: { classPropertyName: "thyBounds", publicName: "thyBounds", isSignal: true, isRequired: false, transformFunction: null }, thyOffsetTop: { classPropertyName: "thyOffsetTop", publicName: "thyOffsetTop", isSignal: true, isRequired: false, transformFunction: null }, thyContainer: { classPropertyName: "thyContainer", publicName: "thyContainer", isSignal: true, isRequired: false, transformFunction: null }, thyDirection: { classPropertyName: "thyDirection", publicName: "thyDirection", isSignal: true, isRequired: false, transformFunction: null }, thyDisabledContainerScroll: { classPropertyName: "thyDisabledContainerScroll", publicName: "thyDisabledContainerScroll", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { thyClick: "thyClick", thyScroll: "thyScroll" }, providers: [
198
233
  {
199
234
  provide: THY_ANCHOR_COMPONENT,
200
235
  useExisting: ThyAnchor
201
236
  }
202
- ], viewQueries: [{ propertyName: "ink", first: true, predicate: ["ink"], descendants: true, isSignal: true }], exportAs: ["thyAnchor"], ngImport: i0, template: `
237
+ ], viewQueries: [{ propertyName: "ink", first: true, predicate: ["ink"], descendants: true, isSignal: true }, { propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true, isSignal: true }], exportAs: ["thyAnchor"], ngImport: i0, template: `
203
238
  @if (thyAffix()) {
204
239
  <thy-affix [thyOffsetTop]="thyOffsetTop()" [thyContainer]="container()">
205
240
  <ng-template [ngTemplateOutlet]="content"></ng-template>
@@ -209,6 +244,7 @@ class ThyAnchor {
209
244
  }
210
245
  <ng-template #content>
211
246
  <div
247
+ #wrapper
212
248
  class="thy-anchor-wrapper"
213
249
  [ngClass]="{ 'thy-anchor-wrapper-horizontal': thyDirection() === 'horizontal' }"
214
250
  [ngStyle]="wrapperStyle()">
@@ -238,6 +274,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
238
274
  }
239
275
  <ng-template #content>
240
276
  <div
277
+ #wrapper
241
278
  class="thy-anchor-wrapper"
242
279
  [ngClass]="{ 'thy-anchor-wrapper-horizontal': thyDirection() === 'horizontal' }"
243
280
  [ngStyle]="wrapperStyle()">
@@ -260,7 +297,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
260
297
  }
261
298
  ]
262
299
  }]
263
- }], ctorParameters: () => [], propDecorators: { ink: [{ type: i0.ViewChild, args: ['ink', { isSignal: true }] }], thyAffix: [{ type: i0.Input, args: [{ isSignal: true, alias: "thyAffix", required: false }] }], thyBounds: [{ type: i0.Input, args: [{ isSignal: true, alias: "thyBounds", required: false }] }], thyOffsetTop: [{ type: i0.Input, args: [{ isSignal: true, alias: "thyOffsetTop", required: false }] }], thyContainer: [{ type: i0.Input, args: [{ isSignal: true, alias: "thyContainer", required: false }] }], thyDirection: [{ type: i0.Input, args: [{ isSignal: true, alias: "thyDirection", required: false }] }], thyClick: [{ type: i0.Output, args: ["thyClick"] }], thyScroll: [{ type: i0.Output, args: ["thyScroll"] }] } });
300
+ }], ctorParameters: () => [], propDecorators: { ink: [{ type: i0.ViewChild, args: ['ink', { isSignal: true }] }], thyAffix: [{ type: i0.Input, args: [{ isSignal: true, alias: "thyAffix", required: false }] }], thyBounds: [{ type: i0.Input, args: [{ isSignal: true, alias: "thyBounds", required: false }] }], thyOffsetTop: [{ type: i0.Input, args: [{ isSignal: true, alias: "thyOffsetTop", required: false }] }], thyContainer: [{ type: i0.Input, args: [{ isSignal: true, alias: "thyContainer", required: false }] }], thyDirection: [{ type: i0.Input, args: [{ isSignal: true, alias: "thyDirection", required: false }] }], thyDisabledContainerScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "thyDisabledContainerScroll", required: false }] }], thyClick: [{ type: i0.Output, args: ["thyClick"] }], thyScroll: [{ type: i0.Output, args: ["thyScroll"] }], wrapper: [{ type: i0.ViewChild, args: ['wrapper', { isSignal: true }] }] } });
264
301
 
265
302
  /**
266
303
  * 锚点链接组件,可供锚点跳转
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-tethys-anchor.mjs","sources":["../../../src/anchor/anchor.token.ts","../../../src/anchor/anchor.component.ts","../../../src/anchor/anchor-link.component.ts","../../../src/anchor/anchor.module.ts","../../../src/anchor/ngx-tethys-anchor.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface IThyAnchorLinkComponent {}\n\nexport interface IThyAnchorComponent {\n registerLink(link: IThyAnchorLinkComponent): void;\n unregisterLink(link: IThyAnchorLinkComponent): void;\n handleScrollTo(linkComponent: IThyAnchorLinkComponent): void;\n}\n\nexport const THY_ANCHOR_COMPONENT = new InjectionToken<IThyAnchorComponent>('THY_ANCHOR_COMPONENT');\n","import { Platform } from '@angular/cdk/platform';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n NgZone,\n OnDestroy,\n Renderer2,\n ViewEncapsulation,\n numberAttribute,\n inject,\n input,\n viewChild,\n output,\n effect,\n computed,\n Signal,\n DOCUMENT\n} from '@angular/core';\nimport { Subject, fromEvent } from 'rxjs';\nimport { takeUntil, throttleTime } from 'rxjs/operators';\n\nimport { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';\nimport { ThyAffix } from 'ngx-tethys/affix';\nimport { ThyScrollService } from 'ngx-tethys/core';\nimport { coerceBooleanProperty, getOffset } from 'ngx-tethys/util';\nimport { ThyAnchorLink } from './anchor-link.component';\nimport { IThyAnchorComponent, THY_ANCHOR_COMPONENT } from './anchor.token';\n\ninterface Section {\n linkComponent: ThyAnchorLink;\n top: number;\n}\n\nconst sharpMatcherRegx = /#([^#]+)$/;\n\n/**\n * 锚点组件\n * @name thy-anchor\n */\n@Component({\n selector: 'thy-anchor',\n exportAs: 'thyAnchor',\n preserveWhitespaces: false,\n template: `\n @if (thyAffix()) {\n <thy-affix [thyOffsetTop]=\"thyOffsetTop()\" [thyContainer]=\"container()\">\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n </thy-affix>\n } @else {\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n }\n <ng-template #content>\n <div\n class=\"thy-anchor-wrapper\"\n [ngClass]=\"{ 'thy-anchor-wrapper-horizontal': thyDirection() === 'horizontal' }\"\n [ngStyle]=\"wrapperStyle()\">\n <div class=\"thy-anchor\">\n <div class=\"thy-anchor-ink\">\n <div class=\"thy-anchor-ink-full\" #ink></div>\n </div>\n <ng-content></ng-content>\n </div>\n </div>\n </ng-template>\n `,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ThyAffix, NgTemplateOutlet, NgStyle, NgClass],\n providers: [\n {\n provide: THY_ANCHOR_COMPONENT,\n useExisting: ThyAnchor\n }\n ]\n})\nexport class ThyAnchor implements IThyAnchorComponent, OnDestroy, AfterViewInit {\n private document = inject(DOCUMENT);\n private cdr = inject(ChangeDetectorRef);\n private platform = inject(Platform);\n private zone = inject(NgZone);\n private renderer = inject(Renderer2);\n private scrollService = inject(ThyScrollService);\n\n readonly ink = viewChild.required<ElementRef>('ink');\n\n /**\n * 固定模式\n */\n readonly thyAffix = input(true, { transform: coerceBooleanProperty });\n\n /**\n * 锚点区域边界,单位:px\n */\n readonly thyBounds = input(5, { transform: numberAttribute });\n\n /**\n * 缓冲的偏移量阈值\n */\n readonly thyOffsetTop = input<number, unknown>(undefined, { transform: numberAttribute });\n\n /**\n * 指定滚动的容器\n */\n readonly thyContainer = input<string | HTMLElement>();\n\n /**\n * 设置导航方向\n */\n readonly thyDirection = input<'vertical' | 'horizontal'>('vertical');\n\n /**\n * 点击项触发\n */\n readonly thyClick = output<ThyAnchorLink>();\n\n /**\n * 滚动到某锚点时触发\n */\n readonly thyScroll = output<ThyAnchorLink>();\n\n visible = false;\n\n readonly wrapperStyle = computed(() => {\n return {\n 'max-height': this.thyOffsetTop() ? `calc(100vh - ${this.thyOffsetTop()}px)` : '100vh'\n };\n });\n\n readonly container: Signal<HTMLElement | Window> = computed(() => {\n return (\n (typeof this.thyContainer() === 'string'\n ? (this.document.querySelector(this.thyContainer() as string) as HTMLElement)\n : (this.thyContainer() as HTMLElement)) || window\n );\n });\n\n private links: ThyAnchorLink[] = [];\n\n private animating = false;\n\n private destroy$ = new Subject<void>();\n\n private handleScrollTimeoutID: any = -1;\n\n registerLink(link: ThyAnchorLink): void {\n this.links.push(link);\n }\n\n unregisterLink(link: ThyAnchorLink): void {\n this.links.splice(this.links.indexOf(link), 1);\n }\n\n constructor() {\n effect(() => {\n if (this.thyContainer()) {\n this.registerScrollEvent();\n }\n });\n }\n\n ngAfterViewInit(): void {\n this.warningPrompt();\n this.registerScrollEvent();\n }\n\n ngOnDestroy(): void {\n clearTimeout(this.handleScrollTimeoutID);\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private warningPrompt() {\n if (this.thyDirection() === 'horizontal') {\n const hasChildren = this.links.some(link =>\n Array.from(link?.elementRef?.nativeElement?.childNodes as HTMLElement[])?.some(\n (item: HTMLElement) => item?.nodeName === 'THY-ANCHOR-LINK'\n )\n );\n if (hasChildren) {\n console.warn(\"Anchor link nesting is not supported when 'Anchor' direction is horizontal.\");\n }\n }\n }\n\n private registerScrollEvent(): void {\n if (!this.platform.isBrowser) {\n return;\n }\n this.destroy$.next();\n this.zone.runOutsideAngular(() => {\n fromEvent(this.container(), 'scroll', { passive: true })\n .pipe(throttleTime(50), takeUntil(this.destroy$))\n .subscribe(() => this.handleScroll());\n });\n // Browser would maintain the scrolling position when refreshing.\n // So we have to delay calculation in avoid of getting a incorrect result.\n this.handleScrollTimeoutID = setTimeout(() => this.handleScroll());\n }\n\n handleScroll(): void {\n if (typeof document === 'undefined' || this.animating) {\n return;\n }\n const container: HTMLElement =\n this.container() instanceof HTMLElement ? (this.container() as HTMLElement) : (this.document as unknown as HTMLElement);\n\n const sections: Section[] = [];\n const scope = (this.thyOffsetTop() || 0) + this.thyBounds();\n this.links.forEach(linkComponent => {\n const sharpLinkMatch = sharpMatcherRegx.exec(linkComponent.thyHref().toString());\n if (!sharpLinkMatch) {\n return;\n }\n const target = container.querySelector(`#${sharpLinkMatch[1]}`) as HTMLElement;\n if (target) {\n const top = getOffset(target, this.container())!.top;\n if (top < scope) {\n sections.push({\n top,\n linkComponent\n });\n }\n }\n });\n\n this.visible = !!sections.length;\n if (!this.visible) {\n this.clearActive();\n this.cdr.detectChanges();\n } else {\n const maxSection = sections.reduce((prev, curr) => (curr.top > prev.top ? curr : prev));\n this.handleActive(maxSection.linkComponent);\n }\n this.setVisible();\n }\n\n private clearActive(): void {\n this.links.forEach(i => {\n i.unsetActive();\n });\n }\n\n private handleActive(linkComponent: ThyAnchorLink): void {\n this.clearActive();\n linkComponent.setActive();\n const linkNode = linkComponent.getLinkTitleElement();\n const horizontalAnchor = this.thyDirection() === 'horizontal';\n\n const ink = this.ink();\n ink.nativeElement.style.top = horizontalAnchor ? '' : `${linkNode.offsetTop}px`;\n ink.nativeElement.style.height = horizontalAnchor ? '' : `${linkNode.clientHeight}px`;\n ink.nativeElement.style.left = horizontalAnchor ? `${linkNode.offsetLeft}px` : '';\n ink.nativeElement.style.width = horizontalAnchor ? `${linkNode.clientWidth}px` : '';\n this.visible = true;\n this.setVisible();\n this.thyScroll.emit(linkComponent);\n }\n\n private setVisible(): void {\n const visible = this.visible;\n const visibleClassname = 'visible';\n const ink = this.ink();\n if (ink) {\n if (visible) {\n this.renderer.addClass(ink.nativeElement, visibleClassname);\n } else {\n this.renderer.removeClass(ink.nativeElement, visibleClassname);\n }\n }\n }\n\n handleScrollTo(linkComponent: ThyAnchorLink): void {\n const container: HTMLElement =\n this.container() instanceof HTMLElement ? (this.container() as HTMLElement) : (this.document as unknown as HTMLElement);\n const linkElement: HTMLElement | null = container.querySelector(linkComponent.thyHref());\n if (!linkElement) {\n return;\n }\n\n this.animating = true;\n const containerScrollTop = this.scrollService.getScroll(this.container());\n const elementOffsetTop = getOffset(linkElement, this.container())!.top;\n const targetScrollTop = containerScrollTop + elementOffsetTop - (this.thyOffsetTop() || 0);\n this.scrollService.scrollTo(this.container(), targetScrollTop, undefined, () => {\n this.animating = false;\n });\n this.handleActive(linkComponent);\n this.thyClick.emit(linkComponent);\n }\n}\n","import { Platform } from '@angular/cdk/platform';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n OnInit,\n TemplateRef,\n ViewEncapsulation,\n inject,\n input,\n contentChild,\n viewChild,\n Signal,\n computed\n} from '@angular/core';\nimport { useHostRenderer } from '@tethys/cdk/dom';\n\nimport { IThyAnchorLinkComponent, THY_ANCHOR_COMPONENT } from './anchor.token';\nimport { NgTemplateOutlet } from '@angular/common';\n\n/**\n * 锚点链接组件,可供锚点跳转\n * @name thy-anchor-link,thyAnchorLink\n */\n@Component({\n selector: 'thy-link,thy-anchor-link',\n exportAs: 'thyLink,thyAnchorLink',\n preserveWhitespaces: false,\n template: `\n <a #linkTitle (click)=\"goToClick($event)\" href=\"{{ thyHref() }}\" class=\"thy-anchor-link-title\" title=\"{{ title() }}\">\n @if (title()) {\n <span>{{ title() }}</span>\n } @else {\n <ng-template [ngTemplateOutlet]=\"titleTemplate() || thyTemplate()\"></ng-template>\n }\n </a>\n <ng-content></ng-content>\n `,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet]\n})\nexport class ThyAnchorLink implements IThyAnchorLinkComponent, OnInit, OnDestroy {\n elementRef = inject(ElementRef);\n private anchorComponent = inject(THY_ANCHOR_COMPONENT, { optional: true })!;\n private platform = inject(Platform);\n\n readonly title: Signal<string | null> = computed(() => {\n return this.thyTitle() instanceof TemplateRef ? null : (this.thyTitle() as string);\n });\n\n readonly titleTemplate: Signal<TemplateRef<any> | null> = computed(() => {\n return this.thyTitle() instanceof TemplateRef ? (this.thyTitle() as TemplateRef<any>) : null;\n });\n\n private hostRenderer = useHostRenderer();\n\n /**\n * 锚点链接\n */\n readonly thyHref = input('#');\n\n /**\n * 文字内容\n */\n readonly thyTitle = input<string | TemplateRef<void>>('');\n\n readonly thyTemplate = contentChild.required<TemplateRef<void>>('thyTemplate');\n\n readonly linkTitle = viewChild.required<ElementRef<HTMLAnchorElement>>('linkTitle');\n\n constructor() {\n const elementRef = this.elementRef;\n\n this.hostRenderer.addClass('thy-anchor-link');\n if (elementRef.nativeElement.tagName.toLowerCase() === 'thy-link') {\n console.warn(`'thy-link' and 'thyLink' are deprecated, please use 'thy-anchor-link' and 'thyAnchorLink' instead.`);\n }\n }\n\n ngOnInit(): void {\n this.anchorComponent.registerLink(this);\n }\n\n getLinkTitleElement(): HTMLAnchorElement {\n return this.linkTitle().nativeElement;\n }\n\n setActive(): void {\n this.hostRenderer.addClass('thy-anchor-link-active');\n }\n\n unsetActive(): void {\n this.hostRenderer.removeClass('thy-anchor-link-active');\n }\n\n goToClick(e: Event): void {\n e.preventDefault();\n e.stopPropagation();\n if (this.platform.isBrowser) {\n this.anchorComponent.handleScrollTo(this);\n }\n }\n\n ngOnDestroy(): void {\n this.anchorComponent.unregisterLink(this);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PlatformModule } from '@angular/cdk/platform';\nimport { ThyAnchor } from './anchor.component';\nimport { ThyAnchorLink } from './anchor-link.component';\nimport { ThyAffixModule } from 'ngx-tethys/affix';\n\n@NgModule({\n exports: [ThyAnchor, ThyAnchorLink],\n imports: [CommonModule, PlatformModule, ThyAffixModule, ThyAnchor, ThyAnchorLink]\n})\nexport class ThyAnchorModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;AAUO,MAAM,oBAAoB,GAAG,IAAI,cAAc,CAAsB,sBAAsB,CAAC;;AC0BnG,MAAM,gBAAgB,GAAG,WAAW;AAEpC;;;AAGG;MAqCU,SAAS,CAAA;AAqElB,IAAA,YAAY,CAAC,IAAmB,EAAA;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IACzB;AAEA,IAAA,cAAc,CAAC,IAAmB,EAAA;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClD;AAEA,IAAA,WAAA,GAAA;AA5EQ,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAC5B,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAEvC,QAAA,IAAA,CAAA,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAa,KAAK,CAAC;AAEpD;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,4CAAI,SAAS,EAAE,qBAAqB,EAAA,CAAA,GAAA,CAAlC,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAC;AAErE;;AAEG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,CAAC,6CAAI,SAAS,EAAE,eAAe,EAAA,CAAA,GAAA,CAA5B,EAAE,SAAS,EAAE,eAAe,EAAE,GAAC;AAE7D;;AAEG;AACM,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAkB,SAAS,gDAAI,SAAS,EAAE,eAAe,EAAA,CAAA,GAAA,CAA5B,EAAE,SAAS,EAAE,eAAe,EAAE,GAAC;AAEzF;;AAEG;QACM,IAAA,CAAA,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAwB;AAErD;;AAEG;AACM,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAA4B,UAAU,wDAAC;AAEpE;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,MAAM,EAAiB;AAE3C;;AAEG;QACM,IAAA,CAAA,SAAS,GAAG,MAAM,EAAiB;QAE5C,IAAA,CAAA,OAAO,GAAG,KAAK;AAEN,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;YAClC,OAAO;AACH,gBAAA,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,CAAA,aAAA,EAAgB,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG;aAClF;AACL,QAAA,CAAC,wDAAC;AAEO,QAAA,IAAA,CAAA,SAAS,GAAiC,QAAQ,CAAC,MAAK;YAC7D,QACI,CAAC,OAAO,IAAI,CAAC,YAAY,EAAE,KAAK;kBACzB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAY;kBACzD,IAAI,CAAC,YAAY,EAAkB,KAAK,MAAM;AAE7D,QAAA,CAAC,qDAAC;QAEM,IAAA,CAAA,KAAK,GAAoB,EAAE;QAE3B,IAAA,CAAA,SAAS,GAAG,KAAK;AAEjB,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;QAE9B,IAAA,CAAA,qBAAqB,GAAQ,CAAC,CAAC;QAWnC,MAAM,CAAC,MAAK;AACR,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;gBACrB,IAAI,CAAC,mBAAmB,EAAE;YAC9B;AACJ,QAAA,CAAC,CAAC;IACN;IAEA,eAAe,GAAA;QACX,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,mBAAmB,EAAE;IAC9B;IAEA,WAAW,GAAA;AACP,QAAA,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC5B;IAEQ,aAAa,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,YAAY,EAAE;AACtC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IACpC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,UAA2B,CAAC,EAAE,IAAI,CAC1E,CAAC,IAAiB,KAAK,IAAI,EAAE,QAAQ,KAAK,iBAAiB,CAC9D,CACJ;YACD,IAAI,WAAW,EAAE;AACb,gBAAA,OAAO,CAAC,IAAI,CAAC,6EAA6E,CAAC;YAC/F;QACJ;IACJ;IAEQ,mBAAmB,GAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;YAC1B;QACJ;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;AAC7B,YAAA,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AAClD,iBAAA,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;iBAC/C,SAAS,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;AAC7C,QAAA,CAAC,CAAC;;;AAGF,QAAA,IAAI,CAAC,qBAAqB,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IACtE;IAEA,YAAY,GAAA;QACR,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE;YACnD;QACJ;QACA,MAAM,SAAS,GACX,IAAI,CAAC,SAAS,EAAE,YAAY,WAAW,GAAI,IAAI,CAAC,SAAS,EAAkB,GAAI,IAAI,CAAC,QAAmC;QAE3H,MAAM,QAAQ,GAAc,EAAE;AAC9B,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE;AAC3D,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,IAAG;AAC/B,YAAA,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;YAChF,IAAI,CAAC,cAAc,EAAE;gBACjB;YACJ;AACA,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC,CAAA,CAAA,EAAI,cAAc,CAAC,CAAC,CAAC,CAAA,CAAE,CAAgB;YAC9E,IAAI,MAAM,EAAE;AACR,gBAAA,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,CAAE,CAAC,GAAG;AACpD,gBAAA,IAAI,GAAG,GAAG,KAAK,EAAE;oBACb,QAAQ,CAAC,IAAI,CAAC;wBACV,GAAG;wBACH;AACH,qBAAA,CAAC;gBACN;YACJ;AACJ,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACf,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC5B;aAAO;AACH,YAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,MAAM,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACvF,YAAA,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,aAAa,CAAC;QAC/C;QACA,IAAI,CAAC,UAAU,EAAE;IACrB;IAEQ,WAAW,GAAA;AACf,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAG;YACnB,CAAC,CAAC,WAAW,EAAE;AACnB,QAAA,CAAC,CAAC;IACN;AAEQ,IAAA,YAAY,CAAC,aAA4B,EAAA;QAC7C,IAAI,CAAC,WAAW,EAAE;QAClB,aAAa,CAAC,SAAS,EAAE;AACzB,QAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,mBAAmB,EAAE;QACpD,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,YAAY;AAE7D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACtB,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,gBAAgB,GAAG,EAAE,GAAG,CAAA,EAAG,QAAQ,CAAC,SAAS,IAAI;QAC/E,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,gBAAgB,GAAG,EAAE,GAAG,CAAA,EAAG,QAAQ,CAAC,YAAY,IAAI;QACrF,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,GAAG,gBAAgB,GAAG,CAAA,EAAG,QAAQ,CAAC,UAAU,CAAA,EAAA,CAAI,GAAG,EAAE;QACjF,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,gBAAgB,GAAG,CAAA,EAAG,QAAQ,CAAC,WAAW,CAAA,EAAA,CAAI,GAAG,EAAE;AACnF,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC;IACtC;IAEQ,UAAU,GAAA;AACd,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;QAC5B,MAAM,gBAAgB,GAAG,SAAS;AAClC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACtB,IAAI,GAAG,EAAE;YACL,IAAI,OAAO,EAAE;gBACT,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,gBAAgB,CAAC;YAC/D;iBAAO;gBACH,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,EAAE,gBAAgB,CAAC;YAClE;QACJ;IACJ;AAEA,IAAA,cAAc,CAAC,aAA4B,EAAA;QACvC,MAAM,SAAS,GACX,IAAI,CAAC,SAAS,EAAE,YAAY,WAAW,GAAI,IAAI,CAAC,SAAS,EAAkB,GAAI,IAAI,CAAC,QAAmC;QAC3H,MAAM,WAAW,GAAuB,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QACxF,IAAI,CAAC,WAAW,EAAE;YACd;QACJ;AAEA,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;AACzE,QAAA,MAAM,gBAAgB,GAAG,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,CAAE,CAAC,GAAG;AACtE,QAAA,MAAM,eAAe,GAAG,kBAAkB,GAAG,gBAAgB,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;AAC1F,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,MAAK;AAC3E,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AAC1B,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;IACrC;+GArNS,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAT,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,SAAA,EAPP;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,oBAAoB;AAC7B,gBAAA,WAAW,EAAE;AAChB;SACJ,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,KAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,KAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9BS;;;;;;;;;;;;;;;;;;;;;AAqBT,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAGS,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,2EAAE,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAQ7C,SAAS,EAAA,UAAA,EAAA,CAAA;kBApCrB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,mBAAmB,EAAE,KAAK;AAC1B,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;AAqBT,IAAA,CAAA;oBACD,aAAa,EAAE,iBAAiB,CAAC,IAAI;oBACrC,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,OAAO,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,CAAC;AACvD,oBAAA,SAAS,EAAE;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,oBAAoB;AAC7B,4BAAA,WAAW,EAAA;AACd;AACJ;AACJ,iBAAA;2FASiD,KAAK,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACjEvD;;;AAGG;MAmBU,aAAa,CAAA;AA6BtB,IAAA,WAAA,GAAA;AA5BA,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACvB,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAE;AACnE,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAE1B,QAAA,IAAA,CAAA,KAAK,GAA0B,QAAQ,CAAC,MAAK;AAClD,YAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,YAAY,WAAW,GAAG,IAAI,GAAI,IAAI,CAAC,QAAQ,EAAa;AACtF,QAAA,CAAC,iDAAC;AAEO,QAAA,IAAA,CAAA,aAAa,GAAoC,QAAQ,CAAC,MAAK;AACpE,YAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,YAAY,WAAW,GAAI,IAAI,CAAC,QAAQ,EAAuB,GAAG,IAAI;AAChG,QAAA,CAAC,yDAAC;QAEM,IAAA,CAAA,YAAY,GAAG,eAAe,EAAE;AAExC;;AAEG;AACM,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,GAAG,mDAAC;AAE7B;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAA6B,EAAE,oDAAC;AAEhD,QAAA,IAAA,CAAA,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAoB,aAAa,CAAC;AAErE,QAAA,IAAA,CAAA,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAgC,WAAW,CAAC;AAG/E,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU;AAElC,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC7C,IAAI,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,UAAU,EAAE;AAC/D,YAAA,OAAO,CAAC,IAAI,CAAC,CAAA,kGAAA,CAAoG,CAAC;QACtH;IACJ;IAEA,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC;IAC3C;IAEA,mBAAmB,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa;IACzC;IAEA,SAAS,GAAA;AACL,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IACxD;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,wBAAwB,CAAC;IAC3D;AAEA,IAAA,SAAS,CAAC,CAAQ,EAAA;QACd,CAAC,CAAC,cAAc,EAAE;QAClB,CAAC,CAAC,eAAe,EAAE;AACnB,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;AACzB,YAAA,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC;QAC7C;IACJ;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC;IAC7C;+GAhES,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAdZ;;;;;;;;;AAST,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAGS,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAEjB,aAAa,EAAA,UAAA,EAAA,CAAA;kBAlBzB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,0BAA0B;AACpC,oBAAA,QAAQ,EAAE,uBAAuB;AACjC,oBAAA,mBAAmB,EAAE,KAAK;AAC1B,oBAAA,QAAQ,EAAE;;;;;;;;;AAST,IAAA,CAAA;oBACD,aAAa,EAAE,iBAAiB,CAAC,IAAI;oBACrC,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,OAAO,EAAE,CAAC,gBAAgB;AAC7B,iBAAA;AA0BmE,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,aAAa,mEAEN,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MC3DzE,eAAe,CAAA;+GAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,EAAA,OAAA,EAAA,CAFd,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,CAAA,EAAA,OAAA,EAAA,CADtE,SAAS,EAAE,aAAa,CAAA,EAAA,CAAA,CAAA;AAGzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,YAFd,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,CAAA,EAAA,CAAA,CAAA;;4FAExD,eAAe,EAAA,UAAA,EAAA,CAAA;kBAJ3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,OAAO,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC;oBACnC,OAAO,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa;AACnF,iBAAA;;;ACVD;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-tethys-anchor.mjs","sources":["../../../src/anchor/anchor.token.ts","../../../src/anchor/anchor.component.ts","../../../src/anchor/anchor-link.component.ts","../../../src/anchor/anchor.module.ts","../../../src/anchor/ngx-tethys-anchor.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface IThyAnchorLinkComponent {}\n\nexport interface IThyAnchorComponent {\n registerLink(link: IThyAnchorLinkComponent): void;\n unregisterLink(link: IThyAnchorLinkComponent): void;\n handleScrollTo(linkComponent: IThyAnchorLinkComponent): void;\n}\n\nexport const THY_ANCHOR_COMPONENT = new InjectionToken<IThyAnchorComponent>('THY_ANCHOR_COMPONENT');\n","import { Platform } from '@angular/cdk/platform';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n NgZone,\n OnDestroy,\n Renderer2,\n ViewEncapsulation,\n numberAttribute,\n inject,\n input,\n viewChild,\n output,\n effect,\n computed,\n Signal,\n DOCUMENT\n} from '@angular/core';\nimport { Subject, fromEvent } from 'rxjs';\nimport { takeUntil, throttleTime } from 'rxjs/operators';\n\nimport { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';\nimport { ThyAffix } from 'ngx-tethys/affix';\nimport { ThyScrollService } from 'ngx-tethys/core';\nimport { coerceBooleanProperty, getOffset } from 'ngx-tethys/util';\nimport { ThyAnchorLink } from './anchor-link.component';\nimport { IThyAnchorComponent, THY_ANCHOR_COMPONENT } from './anchor.token';\n\ninterface Section {\n linkComponent: ThyAnchorLink;\n top: number;\n}\n\nconst sharpMatcherRegx = /#([^#]+)$/;\n\n/**\n * 锚点组件\n * @name thy-anchor\n */\n@Component({\n selector: 'thy-anchor',\n exportAs: 'thyAnchor',\n preserveWhitespaces: false,\n template: `\n @if (thyAffix()) {\n <thy-affix [thyOffsetTop]=\"thyOffsetTop()\" [thyContainer]=\"container()\">\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n </thy-affix>\n } @else {\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n }\n <ng-template #content>\n <div\n #wrapper\n class=\"thy-anchor-wrapper\"\n [ngClass]=\"{ 'thy-anchor-wrapper-horizontal': thyDirection() === 'horizontal' }\"\n [ngStyle]=\"wrapperStyle()\">\n <div class=\"thy-anchor\">\n <div class=\"thy-anchor-ink\">\n <div class=\"thy-anchor-ink-full\" #ink></div>\n </div>\n <ng-content></ng-content>\n </div>\n </div>\n </ng-template>\n `,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ThyAffix, NgTemplateOutlet, NgStyle, NgClass],\n providers: [\n {\n provide: THY_ANCHOR_COMPONENT,\n useExisting: ThyAnchor\n }\n ]\n})\nexport class ThyAnchor implements IThyAnchorComponent, OnDestroy, AfterViewInit {\n private document = inject(DOCUMENT);\n private cdr = inject(ChangeDetectorRef);\n private platform = inject(Platform);\n private zone = inject(NgZone);\n private renderer = inject(Renderer2);\n private scrollService = inject(ThyScrollService);\n\n readonly ink = viewChild.required<ElementRef>('ink');\n\n /**\n * 固定模式\n */\n readonly thyAffix = input(true, { transform: coerceBooleanProperty });\n\n /**\n * 锚点区域边界,单位:px\n */\n readonly thyBounds = input(5, { transform: numberAttribute });\n\n /**\n * 缓冲的偏移量阈值\n */\n readonly thyOffsetTop = input<number, unknown>(undefined, { transform: numberAttribute });\n\n /**\n * 指定滚动的容器\n */\n readonly thyContainer = input<string | HTMLElement>();\n\n /**\n * 设置导航方向\n */\n readonly thyDirection = input<'vertical' | 'horizontal'>('vertical');\n\n /**\n * 是否禁用容器滚动\n */\n readonly thyDisabledContainerScroll = input(false, { transform: coerceBooleanProperty });\n\n /**\n * 点击项触发\n */\n readonly thyClick = output<ThyAnchorLink>();\n\n /**\n * 滚动到某锚点时触发\n */\n readonly thyScroll = output<ThyAnchorLink>();\n\n visible = false;\n\n readonly wrapperStyle = computed(() => {\n return {\n 'max-height': this.thyOffsetTop() ? `calc(100vh - ${this.thyOffsetTop()}px)` : '100vh'\n };\n });\n\n readonly container: Signal<HTMLElement | Window> = computed(() => {\n return (\n (typeof this.thyContainer() === 'string'\n ? (this.document.querySelector(this.thyContainer() as string) as HTMLElement)\n : (this.thyContainer() as HTMLElement)) || window\n );\n });\n\n public links: ThyAnchorLink[] = [];\n\n private animating = false;\n\n private destroy$ = new Subject<void>();\n\n private handleScrollTimeoutID: any = -1;\n\n private wrapper = viewChild.required<ElementRef<HTMLDivElement>>('wrapper');\n\n registerLink(link: ThyAnchorLink): void {\n this.links.push(link);\n }\n\n unregisterLink(link: ThyAnchorLink): void {\n this.links.splice(this.links.indexOf(link), 1);\n }\n\n constructor() {\n effect(() => {\n if (this.thyContainer()) {\n this.registerScrollEvent();\n }\n });\n }\n\n ngAfterViewInit(): void {\n this.warningPrompt();\n this.registerScrollEvent();\n }\n\n ngOnDestroy(): void {\n clearTimeout(this.handleScrollTimeoutID);\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private warningPrompt() {\n if (this.thyDirection() === 'horizontal') {\n const hasChildren = this.links.some(link =>\n Array.from(link?.elementRef?.nativeElement?.childNodes as HTMLElement[])?.some(\n (item: HTMLElement) => item?.nodeName === 'THY-ANCHOR-LINK'\n )\n );\n if (hasChildren) {\n console.warn(\"Anchor link nesting is not supported when 'Anchor' direction is horizontal.\");\n }\n }\n }\n\n private registerScrollEvent(): void {\n if (!this.platform.isBrowser) {\n return;\n }\n if (this.thyDisabledContainerScroll()) {\n return;\n }\n this.destroy$.next();\n this.zone.runOutsideAngular(() => {\n fromEvent(this.container(), 'scroll', { passive: true })\n .pipe(throttleTime(50), takeUntil(this.destroy$))\n .subscribe(() => this.handleScroll());\n });\n // Browser would maintain the scrolling position when refreshing.\n // So we have to delay calculation in avoid of getting a incorrect result.\n this.handleScrollTimeoutID = setTimeout(() => this.handleScroll());\n }\n\n handleScroll(): void {\n if (typeof document === 'undefined' || this.animating) {\n return;\n }\n const container: HTMLElement =\n this.container() instanceof HTMLElement ? (this.container() as HTMLElement) : (this.document as unknown as HTMLElement);\n\n const sections: Section[] = [];\n const scope = (this.thyOffsetTop() || 0) + this.thyBounds();\n this.links.forEach(linkComponent => {\n const sharpLinkMatch = sharpMatcherRegx.exec(linkComponent.thyHref().toString());\n if (!sharpLinkMatch) {\n return;\n }\n const target = container.querySelector(`#${sharpLinkMatch[1]}`) as HTMLElement;\n if (target) {\n const top = getOffset(target, this.container())!.top;\n if (top < scope) {\n sections.push({\n top,\n linkComponent\n });\n }\n }\n });\n\n this.visible = !!sections.length;\n if (!this.visible) {\n this.clearActive();\n this.cdr.detectChanges();\n } else {\n const maxSection = sections.reduce((prev, curr) => (curr.top > prev.top ? curr : prev));\n this.handleActive(maxSection.linkComponent);\n }\n this.setVisible();\n }\n\n private clearActive(): void {\n this.links.forEach(i => {\n i.unsetActive();\n });\n }\n\n public handleActive(linkComponent: ThyAnchorLink): void {\n this.clearActive();\n linkComponent.setActive();\n const linkNode = linkComponent.getLinkTitleElement();\n const horizontalAnchor = this.thyDirection() === 'horizontal';\n\n const ink = this.ink();\n const linkOffset = {\n top: linkNode.offsetTop,\n left: linkNode.offsetLeft,\n height: linkNode.clientHeight,\n width: linkNode.clientWidth\n };\n ink.nativeElement.style.top = horizontalAnchor ? '' : `${linkOffset.top}px`;\n ink.nativeElement.style.height = horizontalAnchor ? '' : `${linkOffset.height}px`;\n ink.nativeElement.style.left = horizontalAnchor ? `${linkOffset.left}px` : '';\n ink.nativeElement.style.width = horizontalAnchor ? `${linkOffset.width}px` : '';\n this.visible = true;\n this.setVisible();\n this.linkVisible(linkOffset, horizontalAnchor);\n this.thyScroll.emit(linkComponent);\n }\n\n private linkVisible(linkOffset: { top: number; left: number; height: number; width: number }, horizontalAnchor: boolean): void {\n const wrapper = this.wrapper()?.nativeElement;\n if (!wrapper) {\n return;\n }\n const scrollTo = horizontalAnchor ? linkOffset.left : linkOffset.top;\n const scrollPos = horizontalAnchor ? wrapper.scrollLeft : wrapper.scrollTop;\n const wrapperSize = horizontalAnchor ? wrapper.offsetWidth : wrapper.offsetHeight;\n const linkSize = horizontalAnchor ? linkOffset.width : linkOffset.height;\n if (scrollTo < scrollPos || scrollTo + linkSize > scrollPos + wrapperSize) {\n if (horizontalAnchor) {\n wrapper.scrollLeft = scrollTo;\n } else {\n wrapper.scrollTop = scrollTo;\n }\n }\n }\n\n private setVisible(): void {\n const visible = this.visible;\n const visibleClassname = 'visible';\n const ink = this.ink();\n if (ink) {\n if (visible) {\n this.renderer.addClass(ink.nativeElement, visibleClassname);\n } else {\n this.renderer.removeClass(ink.nativeElement, visibleClassname);\n }\n }\n }\n\n handleScrollTo(linkComponent: ThyAnchorLink): void {\n if (!this.thyDisabledContainerScroll()) {\n const container: HTMLElement =\n this.container() instanceof HTMLElement ? (this.container() as HTMLElement) : (this.document as unknown as HTMLElement);\n const linkElement: HTMLElement | null = container.querySelector(linkComponent.thyHref());\n if (!linkElement) {\n return;\n }\n\n this.animating = true;\n const containerScrollTop = this.scrollService.getScroll(this.container());\n const elementOffsetTop = getOffset(linkElement, this.container())!.top;\n const targetScrollTop = containerScrollTop + elementOffsetTop - (this.thyOffsetTop() || 0);\n this.scrollService.scrollTo(this.container(), targetScrollTop, undefined, () => {\n this.animating = false;\n });\n }\n this.handleActive(linkComponent);\n this.thyClick.emit(linkComponent);\n }\n}\n","import { Platform } from '@angular/cdk/platform';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n OnInit,\n TemplateRef,\n ViewEncapsulation,\n inject,\n input,\n contentChild,\n viewChild,\n Signal,\n computed\n} from '@angular/core';\nimport { useHostRenderer } from '@tethys/cdk/dom';\n\nimport { IThyAnchorLinkComponent, THY_ANCHOR_COMPONENT } from './anchor.token';\nimport { NgTemplateOutlet } from '@angular/common';\n\n/**\n * 锚点链接组件,可供锚点跳转\n * @name thy-anchor-link,thyAnchorLink\n */\n@Component({\n selector: 'thy-link,thy-anchor-link',\n exportAs: 'thyLink,thyAnchorLink',\n preserveWhitespaces: false,\n template: `\n <a #linkTitle (click)=\"goToClick($event)\" href=\"{{ thyHref() }}\" class=\"thy-anchor-link-title\" title=\"{{ title() }}\">\n @if (title()) {\n <span>{{ title() }}</span>\n } @else {\n <ng-template [ngTemplateOutlet]=\"titleTemplate() || thyTemplate()\"></ng-template>\n }\n </a>\n <ng-content></ng-content>\n `,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet]\n})\nexport class ThyAnchorLink implements IThyAnchorLinkComponent, OnInit, OnDestroy {\n elementRef = inject(ElementRef);\n private anchorComponent = inject(THY_ANCHOR_COMPONENT, { optional: true })!;\n private platform = inject(Platform);\n\n readonly title: Signal<string | null> = computed(() => {\n return this.thyTitle() instanceof TemplateRef ? null : (this.thyTitle() as string);\n });\n\n readonly titleTemplate: Signal<TemplateRef<any> | null> = computed(() => {\n return this.thyTitle() instanceof TemplateRef ? (this.thyTitle() as TemplateRef<any>) : null;\n });\n\n private hostRenderer = useHostRenderer();\n\n /**\n * 锚点链接\n */\n readonly thyHref = input('#');\n\n /**\n * 文字内容\n */\n readonly thyTitle = input<string | TemplateRef<void>>('');\n\n readonly thyTemplate = contentChild.required<TemplateRef<void>>('thyTemplate');\n\n readonly linkTitle = viewChild.required<ElementRef<HTMLAnchorElement>>('linkTitle');\n\n constructor() {\n const elementRef = this.elementRef;\n\n this.hostRenderer.addClass('thy-anchor-link');\n if (elementRef.nativeElement.tagName.toLowerCase() === 'thy-link') {\n console.warn(`'thy-link' and 'thyLink' are deprecated, please use 'thy-anchor-link' and 'thyAnchorLink' instead.`);\n }\n }\n\n ngOnInit(): void {\n this.anchorComponent.registerLink(this);\n }\n\n getLinkTitleElement(): HTMLAnchorElement {\n return this.linkTitle().nativeElement;\n }\n\n setActive(): void {\n this.hostRenderer.addClass('thy-anchor-link-active');\n }\n\n unsetActive(): void {\n this.hostRenderer.removeClass('thy-anchor-link-active');\n }\n\n goToClick(e: Event): void {\n e.preventDefault();\n e.stopPropagation();\n if (this.platform.isBrowser) {\n this.anchorComponent.handleScrollTo(this);\n }\n }\n\n ngOnDestroy(): void {\n this.anchorComponent.unregisterLink(this);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PlatformModule } from '@angular/cdk/platform';\nimport { ThyAnchor } from './anchor.component';\nimport { ThyAnchorLink } from './anchor-link.component';\nimport { ThyAffixModule } from 'ngx-tethys/affix';\n\n@NgModule({\n exports: [ThyAnchor, ThyAnchorLink],\n imports: [CommonModule, PlatformModule, ThyAffixModule, ThyAnchor, ThyAnchorLink]\n})\nexport class ThyAnchorModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -270,7 +270,7 @@ class ThyInputGroup {
270
270
  /**
271
271
  * @private
272
272
  */
273
- this.inputDirective = contentChild.required(ThyInputDirective);
273
+ this.inputDirective = contentChild(ThyInputDirective, ...(ngDevMode ? [{ debugName: "inputDirective" }] : []));
274
274
  this.disabledObservable = null;
275
275
  effect(() => {
276
276
  const size = this.thySize();