ngx-tethys 19.1.0-next.0 → 19.1.0-next.1

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 (105) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +0 -1
  3. package/action/action.component.d.ts +7 -8
  4. package/affix/affix.component.d.ts +3 -4
  5. package/button/button-group.component.d.ts +5 -12
  6. package/button/button-icon.component.d.ts +14 -28
  7. package/button/button.component.d.ts +17 -27
  8. package/date-picker/styles/calendar.scss +1 -1
  9. package/date-picker/styles/week-picker.scss +1 -0
  10. package/dropdown/dropdown-active.directive.d.ts +4 -5
  11. package/dropdown/dropdown-menu-item.directive.d.ts +7 -15
  12. package/dropdown/dropdown-menu.component.d.ts +6 -13
  13. package/dropdown/dropdown-submenu.component.d.ts +2 -4
  14. package/dropdown/dropdown.directive.d.ts +14 -25
  15. package/fesm2022/ngx-tethys-action.mjs +15 -16
  16. package/fesm2022/ngx-tethys-action.mjs.map +1 -1
  17. package/fesm2022/ngx-tethys-affix.mjs +14 -18
  18. package/fesm2022/ngx-tethys-affix.mjs.map +1 -1
  19. package/fesm2022/ngx-tethys-button.mjs +225 -322
  20. package/fesm2022/ngx-tethys-button.mjs.map +1 -1
  21. package/fesm2022/ngx-tethys-carousel.mjs +1 -0
  22. package/fesm2022/ngx-tethys-carousel.mjs.map +1 -1
  23. package/fesm2022/ngx-tethys-collapse.mjs +2 -2
  24. package/fesm2022/ngx-tethys-collapse.mjs.map +1 -1
  25. package/fesm2022/ngx-tethys-date-picker.mjs +6 -6
  26. package/fesm2022/ngx-tethys-date-picker.mjs.map +1 -1
  27. package/fesm2022/ngx-tethys-dropdown.mjs +155 -203
  28. package/fesm2022/ngx-tethys-dropdown.mjs.map +1 -1
  29. package/fesm2022/ngx-tethys-flexible-text.mjs +67 -86
  30. package/fesm2022/ngx-tethys-flexible-text.mjs.map +1 -1
  31. package/fesm2022/ngx-tethys-grid.mjs +10 -15
  32. package/fesm2022/ngx-tethys-grid.mjs.map +1 -1
  33. package/fesm2022/ngx-tethys-icon.mjs +44 -59
  34. package/fesm2022/ngx-tethys-icon.mjs.map +1 -1
  35. package/fesm2022/ngx-tethys-image.mjs +40 -36
  36. package/fesm2022/ngx-tethys-image.mjs.map +1 -1
  37. package/fesm2022/ngx-tethys-input-number.mjs.map +1 -1
  38. package/fesm2022/ngx-tethys-progress.mjs +7 -11
  39. package/fesm2022/ngx-tethys-progress.mjs.map +1 -1
  40. package/fesm2022/ngx-tethys-property.mjs +8 -19
  41. package/fesm2022/ngx-tethys-property.mjs.map +1 -1
  42. package/fesm2022/ngx-tethys-radio.mjs +42 -54
  43. package/fesm2022/ngx-tethys-radio.mjs.map +1 -1
  44. package/fesm2022/ngx-tethys-rate.mjs +115 -157
  45. package/fesm2022/ngx-tethys-rate.mjs.map +1 -1
  46. package/fesm2022/ngx-tethys-resizable.mjs +111 -157
  47. package/fesm2022/ngx-tethys-resizable.mjs.map +1 -1
  48. package/fesm2022/ngx-tethys-segment.mjs +84 -103
  49. package/fesm2022/ngx-tethys-segment.mjs.map +1 -1
  50. package/fesm2022/ngx-tethys-shared.mjs +2 -1
  51. package/fesm2022/ngx-tethys-shared.mjs.map +1 -1
  52. package/fesm2022/ngx-tethys-slide.mjs +37 -56
  53. package/fesm2022/ngx-tethys-slide.mjs.map +1 -1
  54. package/fesm2022/ngx-tethys-slider.mjs.map +1 -1
  55. package/fesm2022/ngx-tethys-space.mjs +2 -8
  56. package/fesm2022/ngx-tethys-space.mjs.map +1 -1
  57. package/fesm2022/ngx-tethys-strength.mjs +52 -66
  58. package/fesm2022/ngx-tethys-strength.mjs.map +1 -1
  59. package/fesm2022/ngx-tethys-transfer.mjs +98 -119
  60. package/fesm2022/ngx-tethys-transfer.mjs.map +1 -1
  61. package/fesm2022/ngx-tethys-tree-select.mjs +2 -4
  62. package/fesm2022/ngx-tethys-tree-select.mjs.map +1 -1
  63. package/fesm2022/ngx-tethys-tree.mjs +281 -401
  64. package/fesm2022/ngx-tethys-tree.mjs.map +1 -1
  65. package/fesm2022/ngx-tethys-upload.mjs.map +1 -1
  66. package/fesm2022/ngx-tethys-vote.mjs +53 -99
  67. package/fesm2022/ngx-tethys-vote.mjs.map +1 -1
  68. package/fesm2022/ngx-tethys.mjs +1 -1
  69. package/fesm2022/ngx-tethys.mjs.map +1 -1
  70. package/flexible-text/flexible-text.component.d.ts +9 -15
  71. package/grid/flex.d.ts +1 -3
  72. package/grid/thy-row.directive.d.ts +1 -4
  73. package/icon/icon.component.d.ts +10 -18
  74. package/image/image.directive.d.ts +10 -13
  75. package/image/image.token.d.ts +5 -5
  76. package/input-number/input-number.component.d.ts +1 -1
  77. package/package.json +1 -1
  78. package/progress/progress-circle.component.d.ts +3 -5
  79. package/progress/progress.component.d.ts +2 -4
  80. package/property/properties.component.d.ts +0 -2
  81. package/property/property-item.component.d.ts +3 -10
  82. package/radio/group/radio-group.component.d.ts +5 -9
  83. package/rate/rate-item.component.d.ts +8 -11
  84. package/rate/rate.component.d.ts +18 -29
  85. package/resizable/resizable.directive.d.ts +18 -31
  86. package/resizable/resize-handle.component.d.ts +6 -7
  87. package/resizable/resize-handles.component.d.ts +5 -9
  88. package/schematics/version.d.ts +1 -1
  89. package/schematics/version.js +1 -1
  90. package/segment/segment-item.component.d.ts +9 -15
  91. package/segment/segment.component.d.ts +11 -15
  92. package/segment/segment.token.d.ts +4 -3
  93. package/slide/slide-body/slide-body-section.component.d.ts +2 -6
  94. package/slide/slide-header/slide-header.component.d.ts +6 -9
  95. package/space/space.component.d.ts +5 -11
  96. package/strength/strength.component.d.ts +8 -13
  97. package/transfer/transfer-list.component.d.ts +15 -15
  98. package/transfer/transfer.component.d.ts +20 -23
  99. package/tree/tree-abstract.d.ts +5 -5
  100. package/tree/tree-node.component.d.ts +24 -37
  101. package/tree/tree.class.d.ts +4 -4
  102. package/tree/tree.component.d.ts +47 -75
  103. package/tree/tree.service.d.ts +3 -4
  104. package/tree-select/tree-select.component.d.ts +2 -2
  105. package/vote/vote.component.d.ts +13 -33
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, Renderer2, ChangeDetectorRef, computed, input, ChangeDetectionStrategy, Component, contentChildren, effect, NgModule } from '@angular/core';
2
+ import { inject, ElementRef, Renderer2, ChangeDetectorRef, computed, input, effect, ChangeDetectionStrategy, Component, contentChildren, NgModule } from '@angular/core';
3
3
  import { useHostRenderer } from '@tethys/cdk/dom';
4
4
  import { ThyIcon, ThyIconModule } from 'ngx-tethys/icon';
5
5
  import { coerceBooleanProperty } from 'ngx-tethys/util';
@@ -24,6 +24,12 @@ const defaultFeedbackOptions = {
24
24
  * @name thy-action,[thyAction]
25
25
  */
26
26
  class ThyAction {
27
+ ngOnInit() {
28
+ this.updateClasses();
29
+ }
30
+ ngAfterViewInit() {
31
+ this.wrapSpanForText(this.elementRef.nativeElement.childNodes);
32
+ }
27
33
  constructor() {
28
34
  this.elementRef = inject(ElementRef);
29
35
  this.renderer = inject(Renderer2);
@@ -31,13 +37,14 @@ class ThyAction {
31
37
  this.icon = computed(() => this.thyActionIcon() || this.thyIcon());
32
38
  this.feedback = null;
33
39
  this.active = computed(() => this.thyActionActive() || this.thyActive());
34
- this.type = computed(() => this.thyType() || 'primary');
35
40
  this.hostRenderer = useHostRenderer();
36
41
  /**
37
42
  * 操作图标的类型
38
43
  * @type primary | success | danger | warning
39
44
  */
40
- this.thyType = input('primary');
45
+ this.thyType = input('primary', {
46
+ transform: (value) => value || 'primary'
47
+ });
41
48
  /**
42
49
  * 操作图标,支持传参同时也支持在投影中写 thy-icon 组件
43
50
  */
@@ -67,17 +74,9 @@ class ThyAction {
67
74
  * 是否处于禁用状态
68
75
  */
69
76
  this.thyDisabled = input(false, { transform: coerceBooleanProperty });
70
- }
71
- ngOnInit() {
72
- this.updateClasses();
73
- }
74
- ngAfterViewInit() {
75
- this.wrapSpanForText(this.elementRef.nativeElement.childNodes);
76
- }
77
- ngOnChanges(changes) {
78
- if ((changes.thyType && !changes.thyType.firstChange) || (changes.thyTheme && !changes.thyTheme.firstChange)) {
77
+ effect(() => {
79
78
  this.updateClasses();
80
- }
79
+ });
81
80
  }
82
81
  setMarginRight(marginRight) {
83
82
  this.elementRef.nativeElement.style.marginRight = marginRight;
@@ -126,7 +125,7 @@ class ThyAction {
126
125
  }
127
126
  updateClasses() {
128
127
  let classNames = [];
129
- classNames.push(`action-${this.type()}`);
128
+ classNames.push(`action-${this.thyType()}`);
130
129
  if (this.thyTheme() === 'lite') {
131
130
  classNames.push('thy-action-lite');
132
131
  }
@@ -136,7 +135,7 @@ class ThyAction {
136
135
  this.feedbackTimer?.unsubscribe();
137
136
  }
138
137
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: ThyAction, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
139
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.8", type: ThyAction, isStandalone: true, selector: "thy-action, [thyAction]", inputs: { thyType: { classPropertyName: "thyType", publicName: "thyType", isSignal: true, isRequired: false, transformFunction: null }, thyIcon: { classPropertyName: "thyIcon", publicName: "thyIcon", isSignal: true, isRequired: false, transformFunction: null }, thyActionIcon: { classPropertyName: "thyActionIcon", publicName: "thyActionIcon", isSignal: true, isRequired: false, transformFunction: null }, thyActive: { classPropertyName: "thyActive", publicName: "thyActive", isSignal: true, isRequired: false, transformFunction: null }, thyActionActive: { classPropertyName: "thyActionActive", publicName: "thyActionActive", isSignal: true, isRequired: false, transformFunction: null }, thyTheme: { classPropertyName: "thyTheme", publicName: "thyTheme", isSignal: true, isRequired: false, transformFunction: null }, thyHoverIcon: { classPropertyName: "thyHoverIcon", publicName: "thyHoverIcon", isSignal: true, isRequired: false, transformFunction: null }, thyDisabled: { classPropertyName: "thyDisabled", publicName: "thyDisabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.active": "active()", "class.thy-action-hover-icon": "thyHoverIcon()", "class.thy-action-has-feedback": "!!feedback", "class.disabled": "thyDisabled()" }, classAttribute: "thy-action" }, usesOnChanges: true, ngImport: i0, template: "@if (icon() && !feedback) {\n <thy-icon [thyIconName]=\"icon()\"></thy-icon>\n}\n@if (feedbackOptions?.icon) {\n <thy-icon [class]=\"feedbackOptions.class\" [thyIconName]=\"feedbackOptions.icon\"></thy-icon>\n}\n@if (thyHoverIcon()) {\n <thy-icon class=\"hover-icon\" [thyIconName]=\"thyHoverIcon()\"></thy-icon>\n}\n<ng-content></ng-content>\n", dependencies: [{ kind: "component", type: ThyIcon, selector: "thy-icon, [thy-icon]", inputs: ["thyIconType", "thyTwotoneColor", "thyIconName", "thyIconRotate", "thyIconSet", "thyIconLegging", "thyIconLinearGradient"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
138
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.8", type: ThyAction, isStandalone: true, selector: "thy-action, [thyAction]", inputs: { thyType: { classPropertyName: "thyType", publicName: "thyType", isSignal: true, isRequired: false, transformFunction: null }, thyIcon: { classPropertyName: "thyIcon", publicName: "thyIcon", isSignal: true, isRequired: false, transformFunction: null }, thyActionIcon: { classPropertyName: "thyActionIcon", publicName: "thyActionIcon", isSignal: true, isRequired: false, transformFunction: null }, thyActive: { classPropertyName: "thyActive", publicName: "thyActive", isSignal: true, isRequired: false, transformFunction: null }, thyActionActive: { classPropertyName: "thyActionActive", publicName: "thyActionActive", isSignal: true, isRequired: false, transformFunction: null }, thyTheme: { classPropertyName: "thyTheme", publicName: "thyTheme", isSignal: true, isRequired: false, transformFunction: null }, thyHoverIcon: { classPropertyName: "thyHoverIcon", publicName: "thyHoverIcon", isSignal: true, isRequired: false, transformFunction: null }, thyDisabled: { classPropertyName: "thyDisabled", publicName: "thyDisabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.active": "active()", "class.thy-action-hover-icon": "thyHoverIcon()", "class.thy-action-has-feedback": "!!feedback", "class.disabled": "thyDisabled()" }, classAttribute: "thy-action" }, ngImport: i0, template: "@if (icon() && !feedback) {\n <thy-icon [thyIconName]=\"icon()\"></thy-icon>\n}\n@if (feedbackOptions?.icon) {\n <thy-icon [class]=\"feedbackOptions.class\" [thyIconName]=\"feedbackOptions.icon\"></thy-icon>\n}\n@if (thyHoverIcon()) {\n <thy-icon class=\"hover-icon\" [thyIconName]=\"thyHoverIcon()\"></thy-icon>\n}\n<ng-content></ng-content>\n", dependencies: [{ kind: "component", type: ThyIcon, selector: "thy-icon, [thy-icon]", inputs: ["thyIconType", "thyTwotoneColor", "thyIconName", "thyIconRotate", "thyIconSet", "thyIconLegging", "thyIconLinearGradient"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
140
139
  }
141
140
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: ThyAction, decorators: [{
142
141
  type: Component,
@@ -147,7 +146,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
147
146
  '[class.thy-action-has-feedback]': '!!feedback',
148
147
  '[class.disabled]': 'thyDisabled()'
149
148
  }, imports: [ThyIcon], template: "@if (icon() && !feedback) {\n <thy-icon [thyIconName]=\"icon()\"></thy-icon>\n}\n@if (feedbackOptions?.icon) {\n <thy-icon [class]=\"feedbackOptions.class\" [thyIconName]=\"feedbackOptions.icon\"></thy-icon>\n}\n@if (thyHoverIcon()) {\n <thy-icon class=\"hover-icon\" [thyIconName]=\"thyHoverIcon()\"></thy-icon>\n}\n<ng-content></ng-content>\n" }]
150
- }] });
149
+ }], ctorParameters: () => [] });
151
150
 
152
151
  /**
153
152
  * Actions 组件
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-tethys-action.mjs","sources":["../../../src/action/action.component.ts","../../../src/action/action.component.html","../../../src/action/actions.component.ts","../../../src/action/action.module.ts","../../../src/action/ngx-tethys-action.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n OnChanges,\n OnDestroy,\n OnInit,\n Renderer2,\n Signal,\n SimpleChanges,\n computed,\n inject,\n input\n} from '@angular/core';\nimport { useHostRenderer } from '@tethys/cdk/dom';\nimport { ThyIcon } from 'ngx-tethys/icon';\n\nimport { coerceBooleanProperty } from 'ngx-tethys/util';\nimport { Subscription, timer } from 'rxjs';\n\nexport type ThyActionType = 'primary' | 'success' | 'danger' | 'warning';\n\nexport type ThyActionFeedback = 'success' | 'error';\n\nexport interface ThyActionFeedbackOptions {\n icon?: string;\n class?: string;\n duration?: number;\n}\n\nconst defaultFeedbackOptions: Record<ThyActionFeedback, ThyActionFeedbackOptions> = {\n success: {\n icon: 'check-circle-fill',\n class: 'text-success',\n duration: 3000\n },\n error: {\n icon: 'close-circle-fill',\n class: 'text-danger',\n duration: 3000\n }\n};\n/**\n * 立即操作组件\n * @name thy-action,[thyAction]\n */\n@Component({\n selector: 'thy-action, [thyAction]',\n templateUrl: './action.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'thy-action',\n '[class.active]': 'active()',\n '[class.thy-action-hover-icon]': 'thyHoverIcon()',\n '[class.thy-action-has-feedback]': '!!feedback',\n '[class.disabled]': 'thyDisabled()'\n },\n imports: [ThyIcon]\n})\nexport class ThyAction implements OnInit, AfterViewInit, OnChanges, OnDestroy {\n private elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private renderer = inject(Renderer2);\n private cdr = inject(ChangeDetectorRef);\n\n public icon: Signal<string> = computed(() => this.thyActionIcon() || this.thyIcon());\n\n feedback: ThyActionFeedback = null;\n\n feedbackOptions: ThyActionFeedbackOptions;\n\n active: Signal<boolean> = computed(() => this.thyActionActive() || this.thyActive());\n\n private type: Signal<string> = computed(() => this.thyType() || 'primary');\n\n private hostRenderer = useHostRenderer();\n\n private feedbackTimer: Subscription;\n\n /**\n * 操作图标的类型\n * @type primary | success | danger | warning\n */\n readonly thyType = input<ThyActionType>('primary');\n\n /**\n * 操作图标,支持传参同时也支持在投影中写 thy-icon 组件\n */\n readonly thyIcon = input<string>('');\n\n /**\n * 操作图标,当 thyIcon 和其他指令参数名有冲突时使用 thyActionIcon\n */\n readonly thyActionIcon = input<string>('');\n\n /**\n * 操作的图标 Active 状态,设置为 true 时会在 Item 上添加 active class\n */\n readonly thyActive = input(false, { transform: coerceBooleanProperty });\n\n /**\n * 操作的图标 Active 状态,当 thyActive 和其他指令参数名有冲突时使用 thyActionActive\n */\n readonly thyActionActive = input(false, { transform: coerceBooleanProperty });\n\n /**\n * 操作图标的主题\n * @type fill(背景色填充) | lite(简单文本颜色变化)\n */\n readonly thyTheme = input<'fill' | 'lite'>('fill');\n\n /**\n * Hover 展示的图标\n */\n readonly thyHoverIcon = input<string>();\n\n /**\n * 是否处于禁用状态\n */\n readonly thyDisabled = input<boolean, boolean | string | number>(false, { transform: coerceBooleanProperty });\n\n ngOnInit(): void {\n this.updateClasses();\n }\n\n ngAfterViewInit() {\n this.wrapSpanForText(this.elementRef.nativeElement.childNodes);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes.thyType && !changes.thyType.firstChange) || (changes.thyTheme && !changes.thyTheme.firstChange)) {\n this.updateClasses();\n }\n }\n\n setMarginRight(marginRight: string) {\n this.elementRef.nativeElement.style.marginRight = marginRight;\n }\n\n /**\n * 触发成功反馈操作\n */\n success(options?: ThyActionFeedbackOptions) {\n this.setFeedback('success', options);\n }\n\n /**\n * 触发失败反馈操作\n */\n error(options?: ThyActionFeedbackOptions) {\n this.setFeedback('error', options);\n }\n\n private setFeedback(feedback: ThyActionFeedback, options: ThyActionFeedbackOptions) {\n if (this.thyDisabled()) {\n return;\n }\n options = Object.assign({}, defaultFeedbackOptions[feedback], options);\n this.feedback = feedback;\n this.feedbackOptions = options;\n this.cdr.markForCheck();\n if (options.duration) {\n if (this.feedbackTimer) {\n this.feedbackTimer.unsubscribe();\n }\n this.feedbackTimer = timer(options.duration).subscribe(() => {\n this.feedback = null;\n this.feedbackOptions = null;\n this.cdr.markForCheck();\n });\n }\n }\n\n private wrapSpanForText(nodes: NodeList): void {\n nodes.forEach(node => {\n if (node.nodeName === '#text') {\n const span = this.renderer.createElement('span');\n const parent = this.renderer.parentNode(node);\n // this.renderer.addClass(span, 'thy-action-wrap-span');\n this.renderer.insertBefore(parent, span, node);\n this.renderer.appendChild(span, node);\n }\n });\n }\n\n private updateClasses() {\n let classNames: string[] = [];\n classNames.push(`action-${this.type()}`);\n if (this.thyTheme() === 'lite') {\n classNames.push('thy-action-lite');\n }\n this.hostRenderer.updateClass(classNames);\n }\n\n ngOnDestroy(): void {\n this.feedbackTimer?.unsubscribe();\n }\n}\n","@if (icon() && !feedback) {\n <thy-icon [thyIconName]=\"icon()\"></thy-icon>\n}\n@if (feedbackOptions?.icon) {\n <thy-icon [class]=\"feedbackOptions.class\" [thyIconName]=\"feedbackOptions.icon\"></thy-icon>\n}\n@if (thyHoverIcon()) {\n <thy-icon class=\"hover-icon\" [thyIconName]=\"thyHoverIcon()\"></thy-icon>\n}\n<ng-content></ng-content>\n","import { ChangeDetectionStrategy, Component, OnInit, contentChildren, effect, input } from '@angular/core';\nimport { ThySpacingSize, getNumericSize } from 'ngx-tethys/core';\nimport { ThyAction } from './action.component';\n\n/**\n * Actions 组件\n * @name thy-actions\n */\n@Component({\n selector: 'thy-actions',\n template: ` <ng-content></ng-content> `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'thy-actions'\n }\n})\nexport class ThyActions implements OnInit {\n readonly actions = contentChildren<ThyAction>(ThyAction);\n\n /**\n * 大小,支持 `zero` | `xxs` | `xs` | `sm` | `md` | `lg` | `xlg` 和自定义数字大小\n * @type string | number\n */\n readonly thySize = input<ThySpacingSize>('md');\n\n constructor() {\n effect(() => {\n this.setActionsSize();\n });\n }\n\n ngOnInit(): void {}\n\n private setActionsSize() {\n const actions: ThyAction[] = Array.from(this.actions());\n actions.forEach((action: ThyAction, index) => {\n // can't set marginRight value for last item\n if (index !== actions.length - 1) {\n action.setMarginRight(getNumericSize(this.thySize(), 'md') + 'px');\n }\n });\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { ThyIconModule } from 'ngx-tethys/icon';\nimport { ThyAction } from './action.component';\nimport { ThyActions } from './actions.component';\n\n@NgModule({\n imports: [CommonModule, ThyIconModule, ThyAction, ThyActions],\n exports: [ThyAction, ThyActions]\n})\nexport class ThyActionModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-tethys-action.mjs","sources":["../../../src/action/action.component.ts","../../../src/action/action.component.html","../../../src/action/actions.component.ts","../../../src/action/action.module.ts","../../../src/action/ngx-tethys-action.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n OnDestroy,\n OnInit,\n Renderer2,\n Signal,\n computed,\n effect,\n inject,\n input\n} from '@angular/core';\nimport { useHostRenderer } from '@tethys/cdk/dom';\nimport { ThyIcon } from 'ngx-tethys/icon';\n\nimport { coerceBooleanProperty } from 'ngx-tethys/util';\nimport { Subscription, timer } from 'rxjs';\n\nexport type ThyActionType = 'primary' | 'success' | 'danger' | 'warning';\n\nexport type ThyActionFeedback = 'success' | 'error';\n\nexport interface ThyActionFeedbackOptions {\n icon?: string;\n class?: string;\n duration?: number;\n}\n\nconst defaultFeedbackOptions: Record<ThyActionFeedback, ThyActionFeedbackOptions> = {\n success: {\n icon: 'check-circle-fill',\n class: 'text-success',\n duration: 3000\n },\n error: {\n icon: 'close-circle-fill',\n class: 'text-danger',\n duration: 3000\n }\n};\n/**\n * 立即操作组件\n * @name thy-action,[thyAction]\n */\n@Component({\n selector: 'thy-action, [thyAction]',\n templateUrl: './action.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'thy-action',\n '[class.active]': 'active()',\n '[class.thy-action-hover-icon]': 'thyHoverIcon()',\n '[class.thy-action-has-feedback]': '!!feedback',\n '[class.disabled]': 'thyDisabled()'\n },\n imports: [ThyIcon]\n})\nexport class ThyAction implements OnInit, AfterViewInit, OnDestroy {\n private elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private renderer = inject(Renderer2);\n private cdr = inject(ChangeDetectorRef);\n\n public readonly icon: Signal<string> = computed(() => this.thyActionIcon() || this.thyIcon());\n\n feedback: ThyActionFeedback = null;\n\n feedbackOptions: ThyActionFeedbackOptions;\n\n readonly active: Signal<boolean> = computed(() => this.thyActionActive() || this.thyActive());\n\n private hostRenderer = useHostRenderer();\n\n private feedbackTimer: Subscription;\n\n /**\n * 操作图标的类型\n * @type primary | success | danger | warning\n */\n readonly thyType = input<ThyActionType, ThyActionType>('primary', {\n transform: (value: ThyActionType) => value || 'primary'\n });\n\n /**\n * 操作图标,支持传参同时也支持在投影中写 thy-icon 组件\n */\n readonly thyIcon = input<string>('');\n\n /**\n * 操作图标,当 thyIcon 和其他指令参数名有冲突时使用 thyActionIcon\n */\n readonly thyActionIcon = input<string>('');\n\n /**\n * 操作的图标 Active 状态,设置为 true 时会在 Item 上添加 active class\n */\n readonly thyActive = input(false, { transform: coerceBooleanProperty });\n\n /**\n * 操作的图标 Active 状态,当 thyActive 和其他指令参数名有冲突时使用 thyActionActive\n */\n readonly thyActionActive = input(false, { transform: coerceBooleanProperty });\n\n /**\n * 操作图标的主题\n * @type fill(背景色填充) | lite(简单文本颜色变化)\n */\n readonly thyTheme = input<'fill' | 'lite'>('fill');\n\n /**\n * Hover 展示的图标\n */\n readonly thyHoverIcon = input<string>();\n\n /**\n * 是否处于禁用状态\n */\n readonly thyDisabled = input(false, { transform: coerceBooleanProperty });\n\n ngOnInit(): void {\n this.updateClasses();\n }\n\n ngAfterViewInit() {\n this.wrapSpanForText(this.elementRef.nativeElement.childNodes);\n }\n\n constructor() {\n effect(() => {\n this.updateClasses();\n });\n }\n\n setMarginRight(marginRight: string) {\n this.elementRef.nativeElement.style.marginRight = marginRight;\n }\n\n /**\n * 触发成功反馈操作\n */\n success(options?: ThyActionFeedbackOptions) {\n this.setFeedback('success', options);\n }\n\n /**\n * 触发失败反馈操作\n */\n error(options?: ThyActionFeedbackOptions) {\n this.setFeedback('error', options);\n }\n\n private setFeedback(feedback: ThyActionFeedback, options: ThyActionFeedbackOptions) {\n if (this.thyDisabled()) {\n return;\n }\n options = Object.assign({}, defaultFeedbackOptions[feedback], options);\n this.feedback = feedback;\n this.feedbackOptions = options;\n this.cdr.markForCheck();\n if (options.duration) {\n if (this.feedbackTimer) {\n this.feedbackTimer.unsubscribe();\n }\n this.feedbackTimer = timer(options.duration).subscribe(() => {\n this.feedback = null;\n this.feedbackOptions = null;\n this.cdr.markForCheck();\n });\n }\n }\n\n private wrapSpanForText(nodes: NodeList): void {\n nodes.forEach(node => {\n if (node.nodeName === '#text') {\n const span = this.renderer.createElement('span');\n const parent = this.renderer.parentNode(node);\n // this.renderer.addClass(span, 'thy-action-wrap-span');\n this.renderer.insertBefore(parent, span, node);\n this.renderer.appendChild(span, node);\n }\n });\n }\n\n private updateClasses() {\n let classNames: string[] = [];\n classNames.push(`action-${this.thyType()}`);\n if (this.thyTheme() === 'lite') {\n classNames.push('thy-action-lite');\n }\n this.hostRenderer.updateClass(classNames);\n }\n\n ngOnDestroy(): void {\n this.feedbackTimer?.unsubscribe();\n }\n}\n","@if (icon() && !feedback) {\n <thy-icon [thyIconName]=\"icon()\"></thy-icon>\n}\n@if (feedbackOptions?.icon) {\n <thy-icon [class]=\"feedbackOptions.class\" [thyIconName]=\"feedbackOptions.icon\"></thy-icon>\n}\n@if (thyHoverIcon()) {\n <thy-icon class=\"hover-icon\" [thyIconName]=\"thyHoverIcon()\"></thy-icon>\n}\n<ng-content></ng-content>\n","import { ChangeDetectionStrategy, Component, OnInit, contentChildren, effect, input } from '@angular/core';\nimport { ThySpacingSize, getNumericSize } from 'ngx-tethys/core';\nimport { ThyAction } from './action.component';\n\n/**\n * Actions 组件\n * @name thy-actions\n */\n@Component({\n selector: 'thy-actions',\n template: ` <ng-content></ng-content> `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'thy-actions'\n }\n})\nexport class ThyActions implements OnInit {\n readonly actions = contentChildren<ThyAction>(ThyAction);\n\n /**\n * 大小,支持 `zero` | `xxs` | `xs` | `sm` | `md` | `lg` | `xlg` 和自定义数字大小\n * @type string | number\n */\n readonly thySize = input<ThySpacingSize>('md');\n\n constructor() {\n effect(() => {\n this.setActionsSize();\n });\n }\n\n ngOnInit(): void {}\n\n private setActionsSize() {\n const actions: ThyAction[] = Array.from(this.actions());\n actions.forEach((action: ThyAction, index) => {\n // can't set marginRight value for last item\n if (index !== actions.length - 1) {\n action.setMarginRight(getNumericSize(this.thySize(), 'md') + 'px');\n }\n });\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { ThyIconModule } from 'ngx-tethys/icon';\nimport { ThyAction } from './action.component';\nimport { ThyActions } from './actions.component';\n\n@NgModule({\n imports: [CommonModule, ThyIconModule, ThyAction, ThyActions],\n exports: [ThyAction, ThyActions]\n})\nexport class ThyActionModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { Platform, PlatformModule } from '@angular/cdk/platform';
2
2
  import { DOCUMENT, CommonModule } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
- import { inject, NgZone, Renderer2, viewChild, input, numberAttribute, output, ElementRef, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
4
+ import { inject, NgZone, Renderer2, viewChild, input, numberAttribute, output, computed, ElementRef, effect, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
5
5
  import { ThyScrollService } from 'ngx-tethys/core';
6
6
  import { dom, shallowEqual } from 'ngx-tethys/util';
7
7
  import { Subscription, ReplaySubject, Subject, merge, fromEvent } from 'rxjs';
@@ -26,10 +26,6 @@ const THY_AFFIX_DEFAULT_SCROLL_TIME = 20;
26
26
  * @order 10
27
27
  */
28
28
  class ThyAffix {
29
- get container() {
30
- const el = this.thyContainer();
31
- return (typeof el === 'string' ? this.document.querySelector(el) : el) || window;
32
- }
33
29
  constructor() {
34
30
  this.scrollService = inject(ThyScrollService);
35
31
  this.ngZone = inject(NgZone);
@@ -57,20 +53,20 @@ class ThyAffix {
57
53
  this.positionChangeSubscription = Subscription.EMPTY;
58
54
  this.offsetChanged$ = new ReplaySubject(1);
59
55
  this.destroy$ = new Subject();
56
+ this.container = computed(() => {
57
+ const el = this.thyContainer();
58
+ return (typeof el === 'string' ? this.document.querySelector(el) : el) || window;
59
+ });
60
60
  const el = inject(ElementRef);
61
61
  const document = inject(DOCUMENT);
62
62
  // The wrapper would stay at the original position as a placeholder.
63
63
  this.placeholderNode = el.nativeElement;
64
64
  this.document = document;
65
- }
66
- ngOnChanges(changes) {
67
- const { thyOffsetBottom, thyOffsetTop, thyContainer } = changes;
68
- if (thyOffsetBottom || thyOffsetTop) {
69
- this.offsetChanged$.next(undefined);
70
- }
71
- if (thyContainer) {
72
- this.registerListeners();
73
- }
65
+ effect(() => {
66
+ if (this.thyOffsetBottom() || this.thyOffsetTop()) {
67
+ this.offsetChanged$.next(undefined);
68
+ }
69
+ });
74
70
  }
75
71
  ngAfterViewInit() {
76
72
  this.registerListeners();
@@ -81,7 +77,7 @@ class ThyAffix {
81
77
  registerListeners() {
82
78
  this.removeListeners();
83
79
  this.positionChangeSubscription = this.ngZone.runOutsideAngular(() => {
84
- return merge(...Object.keys(AffixRespondEvents).map(evName => fromEvent(this.container, evName)), this.offsetChanged$.pipe(takeUntil(this.destroy$), map(() => ({}))))
80
+ return merge(...Object.keys(AffixRespondEvents).map(evName => fromEvent(this.container(), evName)), this.offsetChanged$.pipe(takeUntil(this.destroy$), map(() => ({}))))
85
81
  .pipe(auditTime(THY_AFFIX_DEFAULT_SCROLL_TIME))
86
82
  .subscribe(e => this.updatePosition(e));
87
83
  });
@@ -110,7 +106,7 @@ class ThyAffix {
110
106
  }
111
107
  setAffixStyle(e, affixStyle) {
112
108
  const originalAffixStyle = this.affixStyle;
113
- const isWindow = this.container === window;
109
+ const isWindow = this.container() === window;
114
110
  if (e.type === 'scroll' && originalAffixStyle && affixStyle && isWindow) {
115
111
  return;
116
112
  }
@@ -159,7 +155,7 @@ class ThyAffix {
159
155
  if (!this.platform.isBrowser) {
160
156
  return;
161
157
  }
162
- const containerNode = this.container;
158
+ const containerNode = this.container();
163
159
  let offsetTop = this.thyOffsetTop();
164
160
  const scrollTop = this.scrollService.getScroll(containerNode, true);
165
161
  const elementOffset = this.getOffset(this.placeholderNode, containerNode);
@@ -233,7 +229,7 @@ class ThyAffix {
233
229
  }
234
230
  }
235
231
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: ThyAffix, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
236
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.2.8", type: ThyAffix, isStandalone: true, selector: "thy-affix", inputs: { thyContainer: { classPropertyName: "thyContainer", publicName: "thyContainer", isSignal: true, isRequired: false, transformFunction: null }, thyOffsetTop: { classPropertyName: "thyOffsetTop", publicName: "thyOffsetTop", isSignal: true, isRequired: false, transformFunction: null }, thyOffsetBottom: { classPropertyName: "thyOffsetBottom", publicName: "thyOffsetBottom", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { thyChange: "thyChange" }, viewQueries: [{ propertyName: "fixedElement", first: true, predicate: ["fixedElement"], descendants: true, isSignal: true }], exportAs: ["thyAffix"], usesOnChanges: true, ngImport: i0, template: `
232
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.2.8", type: ThyAffix, isStandalone: true, selector: "thy-affix", inputs: { thyContainer: { classPropertyName: "thyContainer", publicName: "thyContainer", isSignal: true, isRequired: false, transformFunction: null }, thyOffsetTop: { classPropertyName: "thyOffsetTop", publicName: "thyOffsetTop", isSignal: true, isRequired: false, transformFunction: null }, thyOffsetBottom: { classPropertyName: "thyOffsetBottom", publicName: "thyOffsetBottom", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { thyChange: "thyChange" }, viewQueries: [{ propertyName: "fixedElement", first: true, predicate: ["fixedElement"], descendants: true, isSignal: true }], exportAs: ["thyAffix"], ngImport: i0, template: `
237
233
  <div #fixedElement>
238
234
  <ng-content></ng-content>
239
235
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-tethys-affix.mjs","sources":["../../../src/affix/respond-events.ts","../../../src/affix/affix.component.ts","../../../src/affix/affix.module.ts","../../../src/affix/ngx-tethys-affix.ts"],"sourcesContent":["export enum AffixRespondEvents {\n resize = 'resize',\n scroll = 'scroll',\n touchstart = 'touchstart',\n touchmove = 'touchmove',\n touchend = 'touchend',\n pageshow = 'pageshow',\n load = 'LOAD'\n}\n","import { ThyScrollService } from 'ngx-tethys/core';\nimport { dom, shallowEqual, SimpleRect } from 'ngx-tethys/util';\nimport { fromEvent, merge, ReplaySubject, Subject, Subscription } from 'rxjs';\nimport { auditTime, map, takeUntil } from 'rxjs/operators';\n\nimport { Platform } from '@angular/cdk/platform';\nimport { DOCUMENT } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n input,\n NgZone,\n numberAttribute,\n OnChanges,\n OnDestroy,\n output,\n Renderer2,\n SimpleChanges,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { AffixRespondEvents } from './respond-events';\n\nconst THY_AFFIX_CLS_PREFIX = 'thy-affix';\nconst THY_AFFIX_DEFAULT_SCROLL_TIME = 20;\n\n/**\n * 固钉组件\n * @name thy-affix\n * @order 10\n */\n@Component({\n selector: 'thy-affix',\n exportAs: 'thyAffix',\n template: `\n <div #fixedElement>\n <ng-content></ng-content>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class ThyAffix implements AfterViewInit, OnChanges, OnDestroy {\n private scrollService = inject(ThyScrollService);\n private ngZone = inject(NgZone);\n private platform = inject(Platform);\n private renderer = inject(Renderer2);\n\n private readonly fixedElement = viewChild.required<ElementRef<HTMLDivElement>>('fixedElement');\n\n /**\n * 设置 thy-affix 需要监听其滚动事件的元素,值为一个返回对应 DOM 元素的函数\n * @default window\n * @type string | Element | Window\n */\n readonly thyContainer = input<string | Element | Window>();\n\n /**\n * 距离窗口顶部缓冲的偏移量阈值\n */\n readonly thyOffsetTop = input<null | number, unknown>(0, { transform: numberAttribute });\n\n /**\n * 距离窗口底部缓冲的偏移量阈值\n */\n readonly thyOffsetBottom = input<null | number, unknown>(0, { transform: numberAttribute });\n\n /**\n * 固定状态改变时触发的回调函数\n */\n readonly thyChange = output<boolean>();\n\n private readonly placeholderNode: HTMLElement;\n\n private affixStyle?: any;\n private placeholderStyle?: any;\n private positionChangeSubscription: Subscription = Subscription.EMPTY;\n private offsetChanged$ = new ReplaySubject(1);\n private destroy$ = new Subject<void>();\n private timeout?: any;\n private document: any;\n\n private get container(): Element | Window {\n const el = this.thyContainer();\n return (typeof el === 'string' ? this.document.querySelector(el) : el) || window;\n }\n\n constructor() {\n const el = inject(ElementRef);\n const document = inject(DOCUMENT);\n\n // The wrapper would stay at the original position as a placeholder.\n this.placeholderNode = el.nativeElement;\n this.document = document;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const { thyOffsetBottom, thyOffsetTop, thyContainer } = changes;\n\n if (thyOffsetBottom || thyOffsetTop) {\n this.offsetChanged$.next(undefined);\n }\n if (thyContainer) {\n this.registerListeners();\n }\n }\n\n ngAfterViewInit(): void {\n this.registerListeners();\n }\n\n ngOnDestroy(): void {\n this.removeListeners();\n }\n\n private registerListeners(): void {\n this.removeListeners();\n this.positionChangeSubscription = this.ngZone.runOutsideAngular(() => {\n return merge(\n ...Object.keys(AffixRespondEvents).map(evName => fromEvent(this.container, evName)),\n this.offsetChanged$.pipe(\n takeUntil(this.destroy$),\n map(() => ({}))\n )\n )\n .pipe(auditTime(THY_AFFIX_DEFAULT_SCROLL_TIME))\n .subscribe(e => this.updatePosition(e as Event));\n });\n this.timeout = setTimeout(() => this.updatePosition({} as Event));\n }\n\n private removeListeners(): void {\n clearTimeout(this.timeout);\n this.positionChangeSubscription.unsubscribe();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n getOffset(element: Element, target: Element | Window | undefined): SimpleRect {\n const elemRect = element.getBoundingClientRect();\n const containerRect = dom.getContainerRect(target);\n\n const scrollTop = this.scrollService.getScroll(target, true);\n const scrollLeft = this.scrollService.getScroll(target, false);\n\n const docElem = this.document.body;\n const clientTop = docElem.clientTop || 0;\n const clientLeft = docElem.clientLeft || 0;\n\n return {\n top: elemRect.top - containerRect.top + scrollTop - clientTop,\n left: elemRect.left - containerRect.left + scrollLeft - clientLeft,\n width: elemRect.width,\n height: elemRect.height\n };\n }\n\n private setAffixStyle(e: Event, affixStyle?: any): void {\n const originalAffixStyle = this.affixStyle;\n const isWindow = this.container === window;\n if (e.type === 'scroll' && originalAffixStyle && affixStyle && isWindow) {\n return;\n }\n if (shallowEqual(originalAffixStyle, affixStyle)) {\n return;\n }\n\n const fixed = !!affixStyle;\n const wrapElement = this.fixedElement().nativeElement;\n this.renderer.setStyle(wrapElement, 'cssText', dom.getStyleAsText(affixStyle));\n this.affixStyle = affixStyle;\n if (fixed) {\n wrapElement.classList.add(THY_AFFIX_CLS_PREFIX);\n } else {\n wrapElement.classList.remove(THY_AFFIX_CLS_PREFIX);\n }\n\n if ((affixStyle && !originalAffixStyle) || (!affixStyle && originalAffixStyle)) {\n this.thyChange.emit(fixed);\n }\n }\n\n private setPlaceholderStyle(placeholderStyle?: any): void {\n const originalPlaceholderStyle = this.placeholderStyle;\n if (shallowEqual(placeholderStyle, originalPlaceholderStyle)) {\n return;\n }\n this.renderer.setStyle(this.placeholderNode, 'cssText', dom.getStyleAsText(placeholderStyle));\n this.placeholderStyle = placeholderStyle;\n }\n\n private syncPlaceholderStyle(e: Event): void {\n if (!this.affixStyle) {\n return;\n }\n this.renderer.setStyle(this.placeholderNode, 'cssText', '');\n this.placeholderStyle = undefined;\n const styleObj = {\n width: this.placeholderNode.offsetWidth,\n height: this.fixedElement().nativeElement.offsetHeight\n };\n this.setAffixStyle(e, {\n ...this.affixStyle,\n ...styleObj\n });\n this.setPlaceholderStyle(styleObj);\n }\n\n updatePosition(e: Event): void {\n if (!this.platform.isBrowser) {\n return;\n }\n\n const containerNode = this.container;\n let offsetTop = this.thyOffsetTop();\n const scrollTop = this.scrollService.getScroll(containerNode, true);\n const elementOffset = this.getOffset(this.placeholderNode, containerNode);\n const fixedNode = this.fixedElement().nativeElement;\n const elemSize = {\n width: fixedNode.offsetWidth,\n height: fixedNode.offsetHeight\n };\n const offsetMode = {\n top: false,\n bottom: false\n };\n // Default to `offsetTop=0`.\n const thyOffsetBottom = this.thyOffsetBottom();\n if (typeof offsetTop !== 'number' && typeof thyOffsetBottom !== 'number') {\n offsetMode.top = true;\n offsetTop = 0;\n } else {\n offsetMode.top = typeof offsetTop === 'number';\n offsetMode.bottom = typeof thyOffsetBottom === 'number';\n }\n const containerRect = dom.getContainerRect(containerNode as Window);\n const targetInnerHeight = (containerNode as Window).innerHeight || (containerNode as HTMLElement).clientHeight;\n if (scrollTop >= elementOffset.top - (offsetTop as number) && offsetMode.top) {\n const width = elementOffset.width;\n const top = containerRect.top + (offsetTop as number);\n this.setAffixStyle(e, {\n position: 'fixed',\n top,\n left: containerRect.left + elementOffset.left,\n width\n });\n this.setPlaceholderStyle({\n width,\n height: elemSize.height\n });\n } else if (\n scrollTop <= elementOffset.top + elemSize.height + (thyOffsetBottom as number) - targetInnerHeight &&\n offsetMode.bottom\n ) {\n const targetBottomOffset = containerNode === window ? 0 : window.innerHeight - containerRect.bottom;\n const width = elementOffset.width;\n this.setAffixStyle(e, {\n position: 'fixed',\n bottom: targetBottomOffset + (thyOffsetBottom as number),\n left: containerRect.left + elementOffset.left,\n width\n });\n this.setPlaceholderStyle({\n width,\n height: elementOffset.height\n });\n } else {\n if (\n e.type === AffixRespondEvents.resize &&\n this.affixStyle &&\n this.affixStyle.position === 'fixed' &&\n this.placeholderNode.offsetWidth\n ) {\n this.setAffixStyle(e, {\n ...this.affixStyle,\n width: this.placeholderNode.offsetWidth\n });\n } else {\n this.setAffixStyle(e);\n }\n this.setPlaceholderStyle();\n }\n\n if (e.type === 'resize') {\n this.syncPlaceholderStyle(e);\n }\n }\n}\n","import { PlatformModule } from '@angular/cdk/platform';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { ThyAffix } from './affix.component';\n\n@NgModule({\n exports: [ThyAffix],\n imports: [CommonModule, PlatformModule, ThyAffix]\n})\nexport class ThyAffixModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-tethys-affix.mjs","sources":["../../../src/affix/respond-events.ts","../../../src/affix/affix.component.ts","../../../src/affix/affix.module.ts","../../../src/affix/ngx-tethys-affix.ts"],"sourcesContent":["export enum AffixRespondEvents {\n resize = 'resize',\n scroll = 'scroll',\n touchstart = 'touchstart',\n touchmove = 'touchmove',\n touchend = 'touchend',\n pageshow = 'pageshow',\n load = 'LOAD'\n}\n","import { ThyScrollService } from 'ngx-tethys/core';\nimport { dom, shallowEqual, SimpleRect } from 'ngx-tethys/util';\nimport { fromEvent, merge, ReplaySubject, Subject, Subscription } from 'rxjs';\nimport { auditTime, map, takeUntil } from 'rxjs/operators';\n\nimport { Platform } from '@angular/cdk/platform';\nimport { DOCUMENT } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n NgZone,\n numberAttribute,\n OnDestroy,\n output,\n Renderer2,\n Signal,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { AffixRespondEvents } from './respond-events';\n\nconst THY_AFFIX_CLS_PREFIX = 'thy-affix';\nconst THY_AFFIX_DEFAULT_SCROLL_TIME = 20;\n\n/**\n * 固钉组件\n * @name thy-affix\n * @order 10\n */\n@Component({\n selector: 'thy-affix',\n exportAs: 'thyAffix',\n template: `\n <div #fixedElement>\n <ng-content></ng-content>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class ThyAffix implements AfterViewInit, OnDestroy {\n private scrollService = inject(ThyScrollService);\n private ngZone = inject(NgZone);\n private platform = inject(Platform);\n private renderer = inject(Renderer2);\n\n private readonly fixedElement = viewChild.required<ElementRef<HTMLDivElement>>('fixedElement');\n\n /**\n * 设置 thy-affix 需要监听其滚动事件的元素,值为一个返回对应 DOM 元素的函数\n * @default window\n * @type string | Element | Window\n */\n readonly thyContainer = input<string | Element | Window>();\n\n /**\n * 距离窗口顶部缓冲的偏移量阈值\n */\n readonly thyOffsetTop = input<number, unknown>(0, { transform: numberAttribute });\n\n /**\n * 距离窗口底部缓冲的偏移量阈值\n */\n readonly thyOffsetBottom = input<number, unknown>(0, { transform: numberAttribute });\n\n /**\n * 固定状态改变时触发的回调函数\n */\n readonly thyChange = output<boolean>();\n\n private readonly placeholderNode: HTMLElement;\n\n private affixStyle?: any;\n private placeholderStyle?: any;\n private positionChangeSubscription: Subscription = Subscription.EMPTY;\n private offsetChanged$ = new ReplaySubject(1);\n private destroy$ = new Subject<void>();\n private timeout?: any;\n private document: any;\n\n private readonly container: Signal<Element | Window> = computed(() => {\n const el = this.thyContainer();\n return (typeof el === 'string' ? this.document.querySelector(el) : el) || window;\n });\n\n constructor() {\n const el = inject(ElementRef);\n const document = inject(DOCUMENT);\n\n // The wrapper would stay at the original position as a placeholder.\n this.placeholderNode = el.nativeElement;\n this.document = document;\n effect(() => {\n if (this.thyOffsetBottom() || this.thyOffsetTop()) {\n this.offsetChanged$.next(undefined);\n }\n });\n }\n\n ngAfterViewInit(): void {\n this.registerListeners();\n }\n\n ngOnDestroy(): void {\n this.removeListeners();\n }\n\n private registerListeners(): void {\n this.removeListeners();\n this.positionChangeSubscription = this.ngZone.runOutsideAngular(() => {\n return merge(\n ...Object.keys(AffixRespondEvents).map(evName => fromEvent(this.container(), evName)),\n this.offsetChanged$.pipe(\n takeUntil(this.destroy$),\n map(() => ({}))\n )\n )\n .pipe(auditTime(THY_AFFIX_DEFAULT_SCROLL_TIME))\n .subscribe(e => this.updatePosition(e as Event));\n });\n this.timeout = setTimeout(() => this.updatePosition({} as Event));\n }\n\n private removeListeners(): void {\n clearTimeout(this.timeout);\n this.positionChangeSubscription.unsubscribe();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n getOffset(element: Element, target: Element | Window | undefined): SimpleRect {\n const elemRect = element.getBoundingClientRect();\n const containerRect = dom.getContainerRect(target);\n\n const scrollTop = this.scrollService.getScroll(target, true);\n const scrollLeft = this.scrollService.getScroll(target, false);\n\n const docElem = this.document.body;\n const clientTop = docElem.clientTop || 0;\n const clientLeft = docElem.clientLeft || 0;\n\n return {\n top: elemRect.top - containerRect.top + scrollTop - clientTop,\n left: elemRect.left - containerRect.left + scrollLeft - clientLeft,\n width: elemRect.width,\n height: elemRect.height\n };\n }\n\n private setAffixStyle(e: Event, affixStyle?: any): void {\n const originalAffixStyle = this.affixStyle;\n const isWindow = this.container() === window;\n if (e.type === 'scroll' && originalAffixStyle && affixStyle && isWindow) {\n return;\n }\n if (shallowEqual(originalAffixStyle, affixStyle)) {\n return;\n }\n\n const fixed = !!affixStyle;\n const wrapElement = this.fixedElement().nativeElement;\n this.renderer.setStyle(wrapElement, 'cssText', dom.getStyleAsText(affixStyle));\n this.affixStyle = affixStyle;\n if (fixed) {\n wrapElement.classList.add(THY_AFFIX_CLS_PREFIX);\n } else {\n wrapElement.classList.remove(THY_AFFIX_CLS_PREFIX);\n }\n\n if ((affixStyle && !originalAffixStyle) || (!affixStyle && originalAffixStyle)) {\n this.thyChange.emit(fixed);\n }\n }\n\n private setPlaceholderStyle(placeholderStyle?: any): void {\n const originalPlaceholderStyle = this.placeholderStyle;\n if (shallowEqual(placeholderStyle, originalPlaceholderStyle)) {\n return;\n }\n this.renderer.setStyle(this.placeholderNode, 'cssText', dom.getStyleAsText(placeholderStyle));\n this.placeholderStyle = placeholderStyle;\n }\n\n private syncPlaceholderStyle(e: Event): void {\n if (!this.affixStyle) {\n return;\n }\n this.renderer.setStyle(this.placeholderNode, 'cssText', '');\n this.placeholderStyle = undefined;\n const styleObj = {\n width: this.placeholderNode.offsetWidth,\n height: this.fixedElement().nativeElement.offsetHeight\n };\n this.setAffixStyle(e, {\n ...this.affixStyle,\n ...styleObj\n });\n this.setPlaceholderStyle(styleObj);\n }\n\n updatePosition(e: Event): void {\n if (!this.platform.isBrowser) {\n return;\n }\n\n const containerNode = this.container();\n let offsetTop = this.thyOffsetTop();\n const scrollTop = this.scrollService.getScroll(containerNode, true);\n const elementOffset = this.getOffset(this.placeholderNode, containerNode);\n const fixedNode = this.fixedElement().nativeElement;\n const elemSize = {\n width: fixedNode.offsetWidth,\n height: fixedNode.offsetHeight\n };\n const offsetMode = {\n top: false,\n bottom: false\n };\n // Default to `offsetTop=0`.\n const thyOffsetBottom = this.thyOffsetBottom();\n if (typeof offsetTop !== 'number' && typeof thyOffsetBottom !== 'number') {\n offsetMode.top = true;\n offsetTop = 0;\n } else {\n offsetMode.top = typeof offsetTop === 'number';\n offsetMode.bottom = typeof thyOffsetBottom === 'number';\n }\n const containerRect = dom.getContainerRect(containerNode as Window);\n const targetInnerHeight = (containerNode as Window).innerHeight || (containerNode as HTMLElement).clientHeight;\n if (scrollTop >= elementOffset.top - (offsetTop as number) && offsetMode.top) {\n const width = elementOffset.width;\n const top = containerRect.top + (offsetTop as number);\n this.setAffixStyle(e, {\n position: 'fixed',\n top,\n left: containerRect.left + elementOffset.left,\n width\n });\n this.setPlaceholderStyle({\n width,\n height: elemSize.height\n });\n } else if (\n scrollTop <= elementOffset.top + elemSize.height + (thyOffsetBottom as number) - targetInnerHeight &&\n offsetMode.bottom\n ) {\n const targetBottomOffset = containerNode === window ? 0 : window.innerHeight - containerRect.bottom;\n const width = elementOffset.width;\n this.setAffixStyle(e, {\n position: 'fixed',\n bottom: targetBottomOffset + (thyOffsetBottom as number),\n left: containerRect.left + elementOffset.left,\n width\n });\n this.setPlaceholderStyle({\n width,\n height: elementOffset.height\n });\n } else {\n if (\n e.type === AffixRespondEvents.resize &&\n this.affixStyle &&\n this.affixStyle.position === 'fixed' &&\n this.placeholderNode.offsetWidth\n ) {\n this.setAffixStyle(e, {\n ...this.affixStyle,\n width: this.placeholderNode.offsetWidth\n });\n } else {\n this.setAffixStyle(e);\n }\n this.setPlaceholderStyle();\n }\n\n if (e.type === 'resize') {\n this.syncPlaceholderStyle(e);\n }\n }\n}\n","import { PlatformModule } from '@angular/cdk/platform';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { ThyAffix } from './affix.component';\n\n@NgModule({\n exports: [ThyAffix],\n imports: [CommonModule, PlatformModule, ThyAffix]\n})\nexport class ThyAffixModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}