unified-video-framework 1.4.439 → 1.4.440

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.
@@ -7,6 +7,8 @@ export interface TopLineConfig {
7
7
  mode?: 'static' | 'scroll';
8
8
  multiLine?: boolean;
9
9
  maxLines?: number;
10
+ forceMultiLine?: boolean;
11
+ breakAt?: number | string;
10
12
  minHeight?: number;
11
13
  fontSize?: number;
12
14
  lineHeight?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"FlashNewsTickerTypes.d.ts","sourceRoot":"","sources":["../../../src/react/types/FlashNewsTickerTypes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FlashNewsTickerTypes.d.ts","sourceRoot":"","sources":["../../../src/react/types/FlashNewsTickerTypes.ts"],"names":[],"mappings":"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"}
@@ -3321,11 +3321,12 @@ export class WebPlayer extends BasePlayer {
3321
3321
  headlineLine.style.cssText = `
3322
3322
  display: flex;
3323
3323
  align-items: center;
3324
+ justify-content: center;
3324
3325
  min-height: ${topLineHeight}px;
3325
3326
  padding: ${topLineConfig.padding || 8}px 12px;
3326
3327
  background: ${topLineConfig.backgroundColor || 'transparent'};
3327
3328
  overflow: hidden;
3328
- ${topLineMultiLine ? '' : 'white-space: nowrap;'}
3329
+ text-align: center;
3329
3330
  `;
3330
3331
 
3331
3332
  const headlineText = document.createElement('span');
@@ -3337,6 +3338,8 @@ export class WebPlayer extends BasePlayer {
3337
3338
  font-size: ${topLineFontSize}px;
3338
3339
  font-weight: 700;
3339
3340
  line-height: ${topLineLineHeight};
3341
+ text-align: center;
3342
+ width: 100%;
3340
3343
  ${topLineMultiLine ? `
3341
3344
  display: -webkit-box;
3342
3345
  -webkit-line-clamp: ${topLineMaxLines};
@@ -3354,13 +3357,11 @@ export class WebPlayer extends BasePlayer {
3354
3357
 
3355
3358
  // Set initial headline content
3356
3359
  if (firstItem) {
3360
+ const headlineContent = firstItem.headline || firstItem.text;
3357
3361
  if (firstItem.headlineHtml) {
3358
- headlineText.innerHTML = firstItem.headlineHtml;
3359
- } else if (firstItem.headline) {
3360
- headlineText.textContent = firstItem.headline;
3361
- } else {
3362
- // Fallback to text if no headline
3363
- headlineText.textContent = firstItem.text;
3362
+ headlineText.innerHTML = this.formatHeadlineText(firstItem.headlineHtml, topLineConfig, true);
3363
+ } else if (headlineContent) {
3364
+ headlineText.innerHTML = this.formatHeadlineText(headlineContent, topLineConfig, false);
3364
3365
  }
3365
3366
  }
3366
3367
 
@@ -3721,6 +3722,64 @@ export class WebPlayer extends BasePlayer {
3721
3722
  });
3722
3723
  }
3723
3724
 
3725
+ /**
3726
+ * Format headline text with optional forced line breaks
3727
+ */
3728
+ private formatHeadlineText(text: string, topLineConfig: { forceMultiLine?: boolean; breakAt?: number | string }, isHtml: boolean = false): string {
3729
+ if (!topLineConfig.forceMultiLine) {
3730
+ // If it's HTML, return as-is; otherwise escape for safety
3731
+ return isHtml ? text : this.escapeHtml(text);
3732
+ }
3733
+
3734
+ // Calculate break position
3735
+ let breakPosition: number;
3736
+ const breakAt = topLineConfig.breakAt || '50%';
3737
+
3738
+ if (typeof breakAt === 'string' && breakAt.endsWith('%')) {
3739
+ const percentage = parseFloat(breakAt) / 100;
3740
+ breakPosition = Math.floor(text.length * percentage);
3741
+ } else {
3742
+ breakPosition = typeof breakAt === 'number' ? breakAt : Math.floor(text.length / 2);
3743
+ }
3744
+
3745
+ // Find the nearest space to break at (for better readability)
3746
+ let actualBreakPos = breakPosition;
3747
+
3748
+ // Look for a space near the break position
3749
+ const searchRange = Math.min(15, Math.floor(text.length / 4)); // Search within ~15 chars or 25% of text
3750
+ for (let i = 0; i <= searchRange; i++) {
3751
+ // Check forward first, then backward
3752
+ if (breakPosition + i < text.length && text[breakPosition + i] === ' ') {
3753
+ actualBreakPos = breakPosition + i;
3754
+ break;
3755
+ }
3756
+ if (breakPosition - i >= 0 && text[breakPosition - i] === ' ') {
3757
+ actualBreakPos = breakPosition - i;
3758
+ break;
3759
+ }
3760
+ }
3761
+
3762
+ // Split and join with <br>
3763
+ const line1 = text.substring(0, actualBreakPos).trim();
3764
+ const line2 = text.substring(actualBreakPos).trim();
3765
+
3766
+ if (isHtml) {
3767
+ // For HTML content, try to insert <br> at a reasonable position
3768
+ return `${line1}<br>${line2}`;
3769
+ }
3770
+
3771
+ return `${this.escapeHtml(line1)}<br>${this.escapeHtml(line2)}`;
3772
+ }
3773
+
3774
+ /**
3775
+ * Escape HTML special characters
3776
+ */
3777
+ private escapeHtml(text: string): string {
3778
+ const div = document.createElement('div');
3779
+ div.textContent = text;
3780
+ return div.innerHTML;
3781
+ }
3782
+
3724
3783
  /**
3725
3784
  * Update headline and detail content for current item
3726
3785
  */
@@ -3728,12 +3787,13 @@ export class WebPlayer extends BasePlayer {
3728
3787
  // Update headline
3729
3788
  const headline = this.tickerHeadlineElement?.querySelector('.uvf-ticker-headline-text') as HTMLSpanElement;
3730
3789
  if (headline) {
3790
+ const topLineConfig = this.tickerConfig?.broadcastStyle?.twoLineDisplay?.topLine || {};
3791
+ const headlineContent = item.headline || item.text;
3792
+
3731
3793
  if (item.headlineHtml) {
3732
- headline.innerHTML = item.headlineHtml;
3733
- } else if (item.headline) {
3734
- headline.textContent = item.headline;
3735
- } else {
3736
- headline.textContent = item.text;
3794
+ headline.innerHTML = this.formatHeadlineText(item.headlineHtml, topLineConfig, true);
3795
+ } else if (headlineContent) {
3796
+ headline.innerHTML = this.formatHeadlineText(headlineContent, topLineConfig, false);
3737
3797
  }
3738
3798
  }
3739
3799
 
@@ -64,6 +64,20 @@ export interface TopLineConfig {
64
64
  /** Maximum lines before truncation with ellipsis. Default: 2 */
65
65
  maxLines?: number;
66
66
 
67
+ /**
68
+ * Force text to split into multiple lines even if short.
69
+ * When true, text will be split at approximately the midpoint.
70
+ * Default: false
71
+ */
72
+ forceMultiLine?: boolean;
73
+
74
+ /**
75
+ * Custom line break position (character index or percentage like '50%').
76
+ * Only used when forceMultiLine is true.
77
+ * Default: '50%' (midpoint)
78
+ */
79
+ breakAt?: number | string;
80
+
67
81
  /** Minimum height in pixels. Default: 32 */
68
82
  minHeight?: number;
69
83