ng-cw-v12
Version:
Angular UI component library
164 lines • 18.8 kB
JavaScript
import { Component, Input } from '@angular/core';
import { animate, style, transition, trigger, state } from '@angular/animations';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class FlipTextComponent {
constructor(elementRef) {
this.elementRef = elementRef;
/** 展示的文本内容 */
this._text = '';
/** 每个字符动画持续时间 */
this.ncDuration = 500;
/** 每个字符之间的延迟 */
this.ncDelayMultiple = 80;
/** 每个字符之间的间距 */
this.ncGap = 0;
/** 延迟 */
this.ncDelay = 0;
/** 是否在视图可见时才开始动画 */
this._startOnView = false;
/** 是否只执行一次动画 */
this._once = false;
this.characters = [];
this.observer = null;
this.timeout = null;
}
set ncText(value) {
this._text = value;
setTimeout(() => {
this.start();
});
}
get ncText() {
return this._text;
}
set ncStartOnView(val) {
this._startOnView = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncStartOnView() {
return this._startOnView;
}
set ncOnce(val) {
this._once = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncOnce() {
return this._once;
}
ngOnInit() { }
ngOnDestroy() {
this.clear();
}
start() {
this.clear();
if (!this.ncStartOnView) {
this.processText();
this.timeout = setTimeout(() => {
this.startAnimation();
}, this.ncDelay);
}
else {
this.setupIntersectionObserver();
}
}
clear() {
if (this.observer) {
this.observer.disconnect();
}
if (this.timeout) {
clearTimeout(this.timeout);
}
}
setupIntersectionObserver() {
this.observer = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting) {
this.processText();
this.timeout = setTimeout(() => {
this.startAnimation();
}, this.ncDelay);
if (this.ncOnce) {
if (this.observer) {
this.observer.disconnect();
}
}
}
else if (!this.ncOnce) {
this.endAnimation();
}
}, { threshold: 0.1 });
this.observer.observe(this.elementRef.nativeElement);
}
processText() {
this.characters = this.ncText.split('').map((char, i) => ({
char,
state: 'hidden',
delay: i * this.ncDelayMultiple
}));
}
startAnimation() {
this.characters.forEach(char => {
char.state = 'visible';
});
}
endAnimation() {
//若存在ncDelay,离开视图后,startAnimation可能还未执行,则需要清除timeout
if (this.timeout) {
clearTimeout(this.timeout);
}
//隐藏显示的文本
this.characters.forEach(char => {
char.state = 'hidden';
});
}
}
FlipTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: FlipTextComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
FlipTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: FlipTextComponent, selector: "nc-flip-text", inputs: { ncText: "ncText", ncDuration: "ncDuration", ncDelayMultiple: "ncDelayMultiple", ncGap: "ncGap", ncDelay: "ncDelay", ncStartOnView: "ncStartOnView", ncOnce: "ncOnce" }, ngImport: i0, template: "<div class=\"flip-text-container gap-x\" style=\"--gap: {{ncGap}}px;\">\r\n <ng-container *ngFor=\"let char of characters; let i = index\">\r\n <span [@flipState]=\"{value: char.state, params: {duration: ncDuration, delay: char.delay}}\"\r\n class=\"origin-center drop-shadow-sm flip-span\" [innerHTML]=\"char.char === ' ' ? ' ' : char.char\"></span>\r\n </ng-container>\r\n</div>", styles: [":host{display:block}.flip-text-container{width:-moz-fit-content;width:fit-content}.gap-x>*+*{margin-left:var(--gap)}.origin-center{transform-origin:center}.drop-shadow-sm{filter:drop-shadow(0 1px 1px rgba(0,0,0,.05))}.flip-span{display:inline-block;transform-origin:center center;perspective:1000px}\n"], directives: [{ type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [
trigger('flipState', [
state('hidden', style({
transform: 'rotateX(-90deg) scaleY(0)',
opacity: 0
})),
state('visible', style({
transform: 'rotateX(0) scaleY(1)',
opacity: 1
})),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms cubic-bezier(0.33, 1, 0.68, 1)')),
transition('visible => hidden', animate('{{duration}}ms'))
])
] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: FlipTextComponent, decorators: [{
type: Component,
args: [{
selector: 'nc-flip-text',
templateUrl: './flip-text.component.html',
styleUrls: ['./flip-text.component.less'],
animations: [
trigger('flipState', [
state('hidden', style({
transform: 'rotateX(-90deg) scaleY(0)',
opacity: 0
})),
state('visible', style({
transform: 'rotateX(0) scaleY(1)',
opacity: 1
})),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms cubic-bezier(0.33, 1, 0.68, 1)')),
transition('visible => hidden', animate('{{duration}}ms'))
])
]
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { ncText: [{
type: Input
}], ncDuration: [{
type: Input
}], ncDelayMultiple: [{
type: Input
}], ncGap: [{
type: Input
}], ncDelay: [{
type: Input
}], ncStartOnView: [{
type: Input
}], ncOnce: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxpcC10ZXh0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvZmxpcC10ZXh0L2ZsaXAtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2ZsaXAtdGV4dC9mbGlwLXRleHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQXlCLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQXFCakYsTUFBTSxPQUFPLGlCQUFpQjtJQTRDNUIsWUFBb0IsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQTNDMUMsY0FBYztRQUNOLFVBQUssR0FBVyxFQUFFLENBQUM7UUFXM0IsaUJBQWlCO1FBQ1IsZUFBVSxHQUFXLEdBQUcsQ0FBQztRQUNsQyxnQkFBZ0I7UUFDUCxvQkFBZSxHQUFXLEVBQUUsQ0FBQztRQUN0QyxnQkFBZ0I7UUFDUCxVQUFLLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLFNBQVM7UUFDQSxZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQzdCLG9CQUFvQjtRQUNaLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBUXRDLGdCQUFnQjtRQUNSLFVBQUssR0FBWSxLQUFLLENBQUM7UUFTL0IsZUFBVSxHQUFxRCxFQUFFLENBQUM7UUFDMUQsYUFBUSxHQUFnQyxJQUFJLENBQUM7UUFDN0MsWUFBTyxHQUFRLElBQUksQ0FBQztJQUVrQixDQUFDO0lBekMvQyxJQUNJLE1BQU0sQ0FBQyxLQUFhO1FBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsS0FB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QUUsQ0FBQyw0QkFBNEIsQ0FBQztvQkFDekMsVUFBVSxFQUFFO3dCQUNWLE9BQU8sQ0FBQyxXQUFXLEVBQUU7NEJBQ25CLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDO2dDQUNwQixTQUFTLEVBQUUsMkJBQTJCO2dDQUN0QyxPQUFPLEVBQUUsQ0FBQzs2QkFDWCxDQUFDLENBQUM7NEJBQ0gsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7Z0NBQ3JCLFNBQVMsRUFBRSxzQkFBc0I7Z0NBQ2pDLE9BQU8sRUFBRSxDQUFDOzZCQUNYLENBQUMsQ0FBQzs0QkFDSCxVQUFVLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7NEJBQ3JHLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzt5QkFDM0QsQ0FBQztxQkFDSDtpQkFDRjtpR0FLSyxNQUFNO3NCQURULEtBQUs7Z0JBV0csVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBSUYsYUFBYTtzQkFEaEIsS0FBSztnQkFVRixNQUFNO3NCQURULEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uRGVzdHJveSwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBhbmltYXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciwgc3RhdGUgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmMtZmxpcC10ZXh0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZmxpcC10ZXh0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9mbGlwLXRleHQuY29tcG9uZW50Lmxlc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdmbGlwU3RhdGUnLCBbXHJcbiAgICAgIHN0YXRlKCdoaWRkZW4nLCBzdHlsZSh7XHJcbiAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlWCgtOTBkZWcpIHNjYWxlWSgwKScsXHJcbiAgICAgICAgb3BhY2l0eTogMFxyXG4gICAgICB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoe1xyXG4gICAgICAgIHRyYW5zZm9ybTogJ3JvdGF0ZVgoMCkgc2NhbGVZKDEpJyxcclxuICAgICAgICBvcGFjaXR5OiAxXHJcbiAgICAgIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcyBjdWJpYy1iZXppZXIoMC4zMywgMSwgMC42OCwgMSknKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGUgPT4gaGlkZGVuJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMnKSlcclxuICAgIF0pXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRmxpcFRleHRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLyoqIOWxleekuueahOaWh+acrOWGheWuuSAqL1xyXG4gIHByaXZhdGUgX3RleHQ6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jVGV4dCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl90ZXh0ID0gdmFsdWU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zdGFydCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGdldCBuY1RleHQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl90ZXh0O1xyXG4gIH1cclxuICAvKiog5q+P5Liq5a2X56ym5Yqo55S75oyB57ut5pe26Ze0ICovXHJcbiAgQElucHV0KCkgbmNEdXJhdGlvbjogbnVtYmVyID0gNTAwO1xyXG4gIC8qKiDmr4/kuKrlrZfnrKbkuYvpl7TnmoTlu7bov58gKi9cclxuICBASW5wdXQoKSBuY0RlbGF5TXVsdGlwbGU6IG51bWJlciA9IDgwO1xyXG4gIC8qKiDmr4/kuKrlrZfnrKbkuYvpl7TnmoTpl7Tot50gKi9cclxuICBASW5wdXQoKSBuY0dhcDogbnVtYmVyID0gMDtcclxuICAvKiog5bu26L+fICovXHJcbiAgQElucHV0KCkgbmNEZWxheTogbnVtYmVyID0gMDtcclxuICAvKiog5piv5ZCm5Zyo6KeG5Zu+5Y+v6KeB5pe25omN5byA5aeL5Yqo55S7ICovXHJcbiAgcHJpdmF0ZSBfc3RhcnRPblZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY1N0YXJ0T25WaWV3KHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fc3RhcnRPblZpZXcgPSB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBmYWxzZSAmJiB2YWwgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY1N0YXJ0T25WaWV3KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0T25WaWV3O1xyXG4gIH1cclxuICAvKiog5piv5ZCm5Y+q5omn6KGM5LiA5qyh5Yqo55S7ICovXHJcbiAgcHJpdmF0ZSBfb25jZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jT25jZSh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX29uY2UgPSB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBmYWxzZSAmJiB2YWwgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY09uY2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fb25jZTtcclxuICB9XHJcbiAgXHJcbiAgY2hhcmFjdGVyczogeyBjaGFyOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcsIGRlbGF5OiBudW1iZXIgfVtdID0gW107XHJcbiAgcHJpdmF0ZSBvYnNlcnZlcjogSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHRpbWVvdXQ6IGFueSA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQgeyB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYXIoKTtcclxuICAgIGlmICghdGhpcy5uY1N0YXJ0T25WaWV3KSB7XHJcbiAgICAgIHRoaXMucHJvY2Vzc1RleHQoKTtcclxuICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xyXG4gICAgICB9LCB0aGlzLm5jRGVsYXkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXR1cEludGVyc2VjdGlvbk9ic2VydmVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEludGVyc2VjdGlvbk9ic2VydmVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4ge1xyXG4gICAgICBpZiAoZW50cmllc1swXS5pc0ludGVyc2VjdGluZykge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc1RleHQoKTtcclxuICAgICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcclxuICAgICAgICB9LCB0aGlzLm5jRGVsYXkpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5uY09uY2UpIHtcclxuICAgICAgICAgIGlmICh0aGlzLm9ic2VydmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICghdGhpcy5uY09uY2UpIHtcclxuICAgICAgICB0aGlzLmVuZEFuaW1hdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgICB7IHRocmVzaG9sZDogMC4xIH1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJvY2Vzc1RleHQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoYXJhY3RlcnMgPSB0aGlzLm5jVGV4dC5zcGxpdCgnJykubWFwKChjaGFyOiBzdHJpbmcsIGk6IG51bWJlcikgPT4gKHtcclxuICAgICAgY2hhcixcclxuICAgICAgc3RhdGU6ICdoaWRkZW4nLFxyXG4gICAgICBkZWxheTogaSAqIHRoaXMubmNEZWxheU11bHRpcGxlXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0QW5pbWF0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaGFyYWN0ZXJzLmZvckVhY2goY2hhciA9PiB7XHJcbiAgICAgIGNoYXIuc3RhdGUgPSAndmlzaWJsZSc7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW5kQW5pbWF0aW9uKCk6IHZvaWQge1xyXG4gICAgLy/oi6XlrZjlnKhuY0RlbGF577yM56a75byA6KeG5Zu+5ZCO77yMc3RhcnRBbmltYXRpb27lj6/og73ov5jmnKrmiafooYzvvIzliJnpnIDopoHmuIXpmaR0aW1lb3V0XHJcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xyXG4gICAgfVxyXG4gICAgLy/pmpDol4/mmL7npLrnmoTmlofmnKxcclxuICAgIHRoaXMuY2hhcmFjdGVycy5mb3JFYWNoKGNoYXIgPT4ge1xyXG4gICAgICBjaGFyLnN0YXRlID0gJ2hpZGRlbic7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZsaXAtdGV4dC1jb250YWluZXIgZ2FwLXhcIiBzdHlsZT1cIi0tZ2FwOiB7e25jR2FwfX1weDtcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNoYXIgb2YgY2hhcmFjdGVyczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgIDxzcGFuIFtAZmxpcFN0YXRlXT1cInt2YWx1ZTogY2hhci5zdGF0ZSwgcGFyYW1zOiB7ZHVyYXRpb246IG5jRHVyYXRpb24sIGRlbGF5OiBjaGFyLmRlbGF5fX1cIlxyXG4gICAgICAgICAgICBjbGFzcz1cIm9yaWdpbi1jZW50ZXIgZHJvcC1zaGFkb3ctc20gZmxpcC1zcGFuXCIgW2lubmVySFRNTF09XCJjaGFyLmNoYXIgPT09ICcgJyA/ICcmbmJzcDsnIDogY2hhci5jaGFyXCI+PC9zcGFuPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PiJdfQ==