ng-cw-v12
Version:
Angular UI component library
99 lines • 15.3 kB
JavaScript
import { Component, Input, ViewChild } from '@angular/core';
import * as i0 from "@angular/core";
export class VideoTextComponent {
constructor() {
/** 展示的文本内容 */
this._text = '';
this.ncSrc = '';
this.dimensions = { width: 0, height: 0 };
this.isReady = false;
this.textStyle = {};
this.maskId = `aurora-mask-${Math.random().toString(36).substring(2, 11)}`;
}
set ncText(value) {
this._text = value;
setTimeout(() => {
this.start();
});
}
get ncText() {
return this._text;
}
ngOnInit() { }
start() {
this.computeTextStyles();
this.updateDimensions();
}
computeTextStyles() {
var _a;
if ((_a = this.textContentRef) === null || _a === void 0 ? void 0 : _a.nativeElement) {
const computedStyle = window.getComputedStyle(this.textContentRef.nativeElement);
this.textStyle = this.extractTextStyles(computedStyle);
}
}
updateDimensions() {
var _a;
if ((_a = this.svgTextRef) === null || _a === void 0 ? void 0 : _a.nativeElement) {
try {
const bbox = this.svgTextRef.nativeElement.getBBox();
this.dimensions = {
width: Math.max(1, bbox.width),
height: Math.max(1, bbox.height)
};
this.isReady = true;
}
catch (e) {
console.error('获取 SVG 元素尺寸时出错:', e);
}
}
}
getStyleString() {
let styleStr = '';
for (const [key, value] of Object.entries(this.textStyle)) {
if (value) {
// 将驼峰命名转换为连字符命名
const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();
styleStr += `${cssKey}:${value};`;
}
}
return styleStr;
}
// 提取文本相关样式的辅助方法
extractTextStyles(computedStyle) {
return {
fontSize: computedStyle.fontSize,
fontFamily: computedStyle.fontFamily,
fontWeight: computedStyle.fontWeight,
fontStyle: computedStyle.fontStyle,
letterSpacing: computedStyle.letterSpacing,
lineHeight: computedStyle.lineHeight,
textTransform: computedStyle.textTransform,
fontVariant: computedStyle.fontVariant,
fontStretch: computedStyle.fontStretch,
fontFeatureSettings: computedStyle.fontFeatureSettings,
textDecoration: computedStyle.textDecoration,
textShadow: computedStyle.textShadow,
};
}
}
VideoTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: VideoTextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
VideoTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: VideoTextComponent, selector: "nc-video-text", inputs: { ncText: "ncText", ncSrc: "ncSrc" }, viewQueries: [{ propertyName: "textContentRef", first: true, predicate: ["textContent"], descendants: true }, { propertyName: "svgTextRef", first: true, predicate: ["svgText"], descendants: true }], ngImport: i0, template: "<span class=\"video-text relative inline-block align-middle\"\n [style.width]=\"dimensions.width ? dimensions.width + 'px' : 'auto'\"\n [style.height]=\"dimensions.height ? dimensions.height + 'px' : 'auto'\">\n\n <!-- \u9690\u85CF\u7684\u6587\u672C\u7528\u4E8ESEO -->\n <span class=\"sr-only\">\n {{ncText}}\n </span>\n\n <!-- \u89C6\u89C9\u5360\u4F4D\u7B26 -->\n <span #textContent style=\"opacity: 0;display: inline-block; white-space: nowrap;\"\n [style.position]=\"isReady ? 'absolute' : 'relative'\" aria-hidden=\"true\">\n {{ncText}}\n </span>\n\n <div class=\"absolute inset-0\" [style.opacity]=\"isReady ? 1 : 0\" style=\"transition: opacity 0.2s ease-in;\"\n aria-hidden=\"true\">\n\n <svg [attr.width]=\"dimensions.width\" [attr.height]=\"dimensions.height\" class=\"absolute inset-0\">\n <defs>\n <clipPath [attr.id]=\"maskId\">\n <text #svgText x=\"50%\" y=\"50%\" dominant-baseline=\"middle\" text-anchor=\"middle\"\n [attr.style]=\"getStyleString()\">{{ncText}}</text>\n </clipPath>\n </defs>\n </svg>\n\n <video class=\"w-full h-full object-cover\" preload=\"auto\" autoPlay muted loop [style.clip-path]=\"'url(#' + maskId + ')'\"\n [style.-webkit-clip-path]=\"'url(#' + maskId + ')'\">\n <source [src]=\"ncSrc\">\n \u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u6301\u89C6\u9891\u6807\u7B7E\u3002\n </video>\n </div>\n</span>", styles: [":host{display:inline-block}.relative{position:relative}.absolute{position:absolute}.inset-0{top:0;right:0;bottom:0;left:0}.inline-block{display:inline-block}.align-middle{vertical-align:middle}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.h-full{height:100%}.w-full{width:100%}.object-cover{object-fit:cover}\n"] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: VideoTextComponent, decorators: [{
type: Component,
args: [{
selector: 'nc-video-text',
templateUrl: './video-text.component.html',
styleUrls: ['./video-text.component.less']
}]
}], ctorParameters: function () { return []; }, propDecorators: { ncText: [{
type: Input
}], ncSrc: [{
type: Input
}], textContentRef: [{
type: ViewChild,
args: ['textContent']
}], svgTextRef: [{
type: ViewChild,
args: ['svgText']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tdGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3ZpZGVvLXRleHQvdmlkZW8tdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3ZpZGVvLXRleHQvdmlkZW8tdGV4dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBT2hGLE1BQU0sT0FBTyxrQkFBa0I7SUF1QjdCO1FBdEJBLGNBQWM7UUFDTixVQUFLLEdBQVcsRUFBRSxDQUFDO1FBV2xCLFVBQUssR0FBVyxFQUFFLENBQUM7UUFLNUIsZUFBVSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckMsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixjQUFTLEdBQWlDLEVBQUUsQ0FBQztRQUM3QyxXQUFNLEdBQVcsZUFBZSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUU5RCxDQUFDO0lBcEJqQixJQUNJLE1BQU0sQ0FBQyxLQUFhO1FBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQWFELFFBQVEsS0FBVyxDQUFDO0lBR1osS0FBSztRQUNYLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FB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SW5pdCwgSW5wdXQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduYy12aWRlby10ZXh0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZpZGVvLXRleHQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi92aWRlby10ZXh0LmNvbXBvbmVudC5sZXNzJ11cbn0pXG5leHBvcnQgY2xhc3MgVmlkZW9UZXh0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqIOWxleekuueahOaWh+acrOWGheWuuSAqL1xuICBwcml2YXRlIF90ZXh0OiBzdHJpbmcgPSAnJztcbiAgQElucHV0KClcbiAgc2V0IG5jVGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGV4dCA9IHZhbHVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zdGFydCgpO1xuICAgIH0pO1xuICB9XG4gIGdldCBuY1RleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGV4dDtcbiAgfVxuICBASW5wdXQoKSBuY1NyYzogc3RyaW5nID0gJyc7XG5cbiAgQFZpZXdDaGlsZCgndGV4dENvbnRlbnQnKSB0ZXh0Q29udGVudFJlZiE6IEVsZW1lbnRSZWY8SFRNTFNwYW5FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnc3ZnVGV4dCcpIHN2Z1RleHRSZWYhOiBFbGVtZW50UmVmPFNWR1RleHRFbGVtZW50PjtcblxuICBkaW1lbnNpb25zID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG4gIGlzUmVhZHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdGV4dFN0eWxlOiBQYXJ0aWFsPENTU1N0eWxlRGVjbGFyYXRpb24+ID0ge307XG4gIG1hc2tJZDogc3RyaW5nID0gYGF1cm9yYS1tYXNrLSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDExKX1gO1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7IH1cblxuXG4gIHByaXZhdGUgc3RhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jb21wdXRlVGV4dFN0eWxlcygpO1xuICAgIHRoaXMudXBkYXRlRGltZW5zaW9ucygpO1xuICB9XG5cblxuICBwcml2YXRlIGNvbXB1dGVUZXh0U3R5bGVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRleHRDb250ZW50UmVmPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy50ZXh0Q29udGVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICAgIHRoaXMudGV4dFN0eWxlID0gdGhpcy5leHRyYWN0VGV4dFN0eWxlcyhjb21wdXRlZFN0eWxlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURpbWVuc2lvbnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3ZnVGV4dFJlZj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYmJveCA9IHRoaXMuc3ZnVGV4dFJlZi5uYXRpdmVFbGVtZW50LmdldEJCb3goKTtcbiAgICAgICAgdGhpcy5kaW1lbnNpb25zID0ge1xuICAgICAgICAgIHdpZHRoOiBNYXRoLm1heCgxLCBiYm94LndpZHRoKSxcbiAgICAgICAgICBoZWlnaHQ6IE1hdGgubWF4KDEsIGJib3guaGVpZ2h0KVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmlzUmVhZHkgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCfojrflj5YgU1ZHIOWFg+e0oOWwuuWvuOaXtuWHuumUmTonLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRTdHlsZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGxldCBzdHlsZVN0ciA9ICcnO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMudGV4dFN0eWxlKSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIC8vIOWwhumpvOWzsOWRveWQjei9rOaNouS4uui/nuWtl+espuWRveWQjVxuICAgICAgICBjb25zdCBjc3NLZXkgPSBrZXkucmVwbGFjZSgvKFtBLVpdKS9nLCAnLSQxJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3R5bGVTdHIgKz0gYCR7Y3NzS2V5fToke3ZhbHVlfTtgO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3R5bGVTdHI7XG4gIH1cblxuICAvLyDmj5Dlj5bmlofmnKznm7jlhbPmoLflvI/nmoTovoXliqnmlrnms5VcbiAgcHJpdmF0ZSBleHRyYWN0VGV4dFN0eWxlcyhjb21wdXRlZFN0eWxlOiBDU1NTdHlsZURlY2xhcmF0aW9uKTogUGFydGlhbDxDU1NTdHlsZURlY2xhcmF0aW9uPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvbnRTaXplOiBjb21wdXRlZFN0eWxlLmZvbnRTaXplLFxuICAgICAgZm9udEZhbWlseTogY29tcHV0ZWRTdHlsZS5mb250RmFtaWx5LFxuICAgICAgZm9udFdlaWdodDogY29tcHV0ZWRTdHlsZS5mb250V2VpZ2h0LFxuICAgICAgZm9udFN0eWxlOiBjb21wdXRlZFN0eWxlLmZvbnRTdHlsZSxcbiAgICAgIGxldHRlclNwYWNpbmc6IGNvbXB1dGVkU3R5bGUubGV0dGVyU3BhY2luZyxcbiAgICAgIGxpbmVIZWlnaHQ6IGNvbXB1dGVkU3R5bGUubGluZUhlaWdodCxcbiAgICAgIHRleHRUcmFuc2Zvcm06IGNvbXB1dGVkU3R5bGUudGV4dFRyYW5zZm9ybSxcbiAgICAgIGZvbnRWYXJpYW50OiBjb21wdXRlZFN0eWxlLmZvbnRWYXJpYW50LFxuICAgICAgZm9udFN0cmV0Y2g6IGNvbXB1dGVkU3R5bGUuZm9udFN0cmV0Y2gsXG4gICAgICBmb250RmVhdHVyZVNldHRpbmdzOiBjb21wdXRlZFN0eWxlLmZvbnRGZWF0dXJlU2V0dGluZ3MsXG4gICAgICB0ZXh0RGVjb3JhdGlvbjogY29tcHV0ZWRTdHlsZS50ZXh0RGVjb3JhdGlvbixcbiAgICAgIHRleHRTaGFkb3c6IGNvbXB1dGVkU3R5bGUudGV4dFNoYWRvdyxcbiAgICB9O1xuICB9XG59XG4iLCI8c3BhbiBjbGFzcz1cInZpZGVvLXRleHQgcmVsYXRpdmUgaW5saW5lLWJsb2NrIGFsaWduLW1pZGRsZVwiXG4gIFtzdHlsZS53aWR0aF09XCJkaW1lbnNpb25zLndpZHRoID8gZGltZW5zaW9ucy53aWR0aCArICdweCcgOiAnYXV0bydcIlxuICBbc3R5bGUuaGVpZ2h0XT1cImRpbWVuc2lvbnMuaGVpZ2h0ID8gZGltZW5zaW9ucy5oZWlnaHQgKyAncHgnIDogJ2F1dG8nXCI+XG5cbiAgPCEtLSDpmpDol4/nmoTmlofmnKznlKjkuo5TRU8gLS0+XG4gIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPlxuICAgIHt7bmNUZXh0fX1cbiAgPC9zcGFuPlxuXG4gIDwhLS0g6KeG6KeJ5Y2g5L2N56ymIC0tPlxuICA8c3BhbiAjdGV4dENvbnRlbnQgc3R5bGU9XCJvcGFjaXR5OiAwO2Rpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIlxuICAgIFtzdHlsZS5wb3NpdGlvbl09XCJpc1JlYWR5ID8gJ2Fic29sdXRlJyA6ICdyZWxhdGl2ZSdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICB7e25jVGV4dH19XG4gIDwvc3Bhbj5cblxuICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQtMFwiIFtzdHlsZS5vcGFjaXR5XT1cImlzUmVhZHkgPyAxIDogMFwiIHN0eWxlPVwidHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UtaW47XCJcbiAgICBhcmlhLWhpZGRlbj1cInRydWVcIj5cblxuICAgIDxzdmcgW2F0dHIud2lkdGhdPVwiZGltZW5zaW9ucy53aWR0aFwiIFthdHRyLmhlaWdodF09XCJkaW1lbnNpb25zLmhlaWdodFwiIGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQtMFwiPlxuICAgICAgPGRlZnM+XG4gICAgICAgIDxjbGlwUGF0aCBbYXR0ci5pZF09XCJtYXNrSWRcIj5cbiAgICAgICAgICA8dGV4dCAjc3ZnVGV4dCB4PVwiNTAlXCIgeT1cIjUwJVwiIGRvbWluYW50LWJhc2VsaW5lPVwibWlkZGxlXCIgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiZ2V0U3R5bGVTdHJpbmcoKVwiPnt7bmNUZXh0fX08L3RleHQ+XG4gICAgICAgIDwvY2xpcFBhdGg+XG4gICAgICA8L2RlZnM+XG4gICAgPC9zdmc+XG5cbiAgICA8dmlkZW8gY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlclwiIHByZWxvYWQ9XCJhdXRvXCIgYXV0b1BsYXkgbXV0ZWQgbG9vcCBbc3R5bGUuY2xpcC1wYXRoXT1cIid1cmwoIycgKyBtYXNrSWQgKyAnKSdcIlxuICAgICAgW3N0eWxlLi13ZWJraXQtY2xpcC1wYXRoXT1cIid1cmwoIycgKyBtYXNrSWQgKyAnKSdcIj5cbiAgICAgIDxzb3VyY2UgW3NyY109XCJuY1NyY1wiPlxuICAgICAg5oKo55qE5rWP6KeI5Zmo5LiN5pSv5oyB6KeG6aKR5qCH562+44CCXG4gICAgPC92aWRlbz5cbiAgPC9kaXY+XG48L3NwYW4+Il19