unified-video-framework 1.4.439 → 1.4.441

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;
@@ -116,6 +118,15 @@ export interface FlashNewsTickerConfig {
116
118
  gap?: number;
117
119
  loop?: boolean;
118
120
  separator?: string;
121
+ variant?: 'standard' | 'breaking' | 'live' | 'broadcast1' | 'broadcast2' | 'broadcast3' | 'broadcast4' | 'custom';
122
+ badgeText?: string;
123
+ badgeColor?: string;
124
+ badgeTextColor?: string;
125
+ accentColor?: string;
126
+ pulseBadge?: boolean;
127
+ iconUrl?: string;
128
+ headline?: string;
129
+ secondaryItems?: FlashNewsTickerItem[];
119
130
  topOffset?: number;
120
131
  bottomOffset?: number;
121
132
  }
@@ -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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"}
@@ -2573,10 +2573,17 @@ export class WebPlayer extends BasePlayer {
2573
2573
  }
2574
2574
 
2575
2575
  private createTickerElement(config: FlashNewsTickerConfig, position: 'top' | 'bottom'): HTMLDivElement {
2576
- // Route to broadcast style if configured
2577
- if (config.styleVariant === 'broadcast') {
2576
+ const variant = config.variant || 'standard';
2577
+
2578
+ // Route to specific broadcast layouts
2579
+ if (variant === 'broadcast1') return this.createBroadcast1Element(config, position);
2580
+ if (variant === 'broadcast2') return this.createBroadcast2Element(config, position);
2581
+ if (variant === 'broadcast3') return this.createBroadcast3Element(config, position);
2582
+ if (variant === 'broadcast4') return this.createBroadcast4Element(config, position);
2583
+
2584
+ // Route to specific broadcast style if configured (older style)
2585
+ if (config.styleVariant === 'broadcast' || variant === 'breaking' || variant === 'live') {
2578
2586
  const layoutStyle = config.broadcastStyle?.layoutStyle || 'broadcast';
2579
- // Route to professional ticker for two-line or professional layouts
2580
2587
  if (layoutStyle === 'two-line' || layoutStyle === 'professional') {
2581
2588
  return this.createProfessionalTickerElement(config, position);
2582
2589
  }
@@ -2877,6 +2884,449 @@ export class WebPlayer extends BasePlayer {
2877
2884
  }
2878
2885
  }
2879
2886
 
2887
+ private createBroadcast1Element(config: FlashNewsTickerConfig, position: 'top' | 'bottom'): HTMLDivElement {
2888
+ const ticker = document.createElement('div');
2889
+ ticker.className = `uvf-ticker-broadcast1 ticker-${position}`;
2890
+
2891
+ const height = config.height || 70;
2892
+ const bottomOffset = config.bottomOffset || 0;
2893
+ const topOffset = config.topOffset || 10;
2894
+
2895
+ ticker.style.cssText = `
2896
+ position: absolute;
2897
+ left: 10%;
2898
+ right: 10%;
2899
+ height: ${height}px;
2900
+ ${position === 'top' ? `top: ${topOffset}px;` : `bottom: ${bottomOffset}px;`}
2901
+ display: flex;
2902
+ font-family: 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
2903
+ z-index: 100;
2904
+ pointer-events: none;
2905
+ `;
2906
+
2907
+ // 1. Globe Block (Left)
2908
+ const globeBlock = document.createElement('div');
2909
+ globeBlock.style.cssText = `
2910
+ width: ${height}px;
2911
+ height: ${height}px;
2912
+ background: linear-gradient(135deg, #cc0000 0%, #880000 100%);
2913
+ display: flex;
2914
+ align-items: center;
2915
+ justify-content: center;
2916
+ flex-shrink: 0;
2917
+ clip-path: polygon(0 0, 85% 0, 100% 100%, 0 100%);
2918
+ z-index: 10;
2919
+ box-shadow: 5px 0 15px rgba(0,0,0,0.5);
2920
+ `;
2921
+ const globe = this.createGlobeElement(true);
2922
+ globe.style.width = '60%';
2923
+ globe.style.height = '60%';
2924
+ globeBlock.appendChild(globe);
2925
+ ticker.appendChild(globeBlock);
2926
+
2927
+ // 2. Right Content (Dual Bars)
2928
+ const content = document.createElement('div');
2929
+ content.style.cssText = `
2930
+ flex-grow: 1;
2931
+ display: flex;
2932
+ flex-direction: column;
2933
+ margin-left: -${height * 0.15}px;
2934
+ `;
2935
+
2936
+ // Row 1: Top Blue Bar (Headline)
2937
+ const topBar = document.createElement('div');
2938
+ topBar.style.cssText = `
2939
+ height: 60%;
2940
+ background: linear-gradient(90deg, #1e3c72 0%, #2a5298 100%);
2941
+ clip-path: polygon(5% 0, 100% 0, 98% 100%, 0% 100%);
2942
+ display: flex;
2943
+ align-items: center;
2944
+ padding: 0 40px;
2945
+ color: white;
2946
+ `;
2947
+
2948
+ const breakingText = document.createElement('span');
2949
+ breakingText.textContent = 'BREAKING NEWS';
2950
+ breakingText.style.cssText = `
2951
+ font-weight: 900;
2952
+ font-style: italic;
2953
+ font-size: ${height * 0.22}px;
2954
+ margin-right: 20px;
2955
+ border-bottom: 2px solid white;
2956
+ `;
2957
+ topBar.appendChild(breakingText);
2958
+
2959
+ const headlineText = document.createElement('span');
2960
+ headlineText.textContent = config.headline || 'LOREM IPSUM DOLOR SIT AMET, CONSECTETUER';
2961
+ headlineText.style.cssText = `
2962
+ font-weight: 700;
2963
+ font-size: ${height * 0.25}px;
2964
+ white-space: nowrap;
2965
+ overflow: hidden;
2966
+ text-overflow: ellipsis;
2967
+ `;
2968
+ topBar.appendChild(headlineText);
2969
+ content.appendChild(topBar);
2970
+
2971
+ // Row 2: Bottom Black Bar (Scrolling Items)
2972
+ const bottomBar = document.createElement('div');
2973
+ bottomBar.style.cssText = `
2974
+ height: 40%;
2975
+ background: #000;
2976
+ display: flex;
2977
+ align-items: center;
2978
+ clip-path: polygon(1% 0, 100% 0, 100% 100%, 0% 100%);
2979
+ `;
2980
+
2981
+ // LIVE badge
2982
+ const liveBadge = document.createElement('div');
2983
+ liveBadge.textContent = 'LIVE';
2984
+ liveBadge.style.cssText = `
2985
+ background: #f1c40f;
2986
+ color: black;
2987
+ font-weight: 900;
2988
+ font-size: ${height * 0.15}px;
2989
+ padding: 2px 10px;
2990
+ margin-left: 20px;
2991
+ clip-path: polygon(0 0, 90% 0, 100% 100%, 0 100%);
2992
+ `;
2993
+ bottomBar.appendChild(liveBadge);
2994
+
2995
+ // Scrolling track
2996
+ const trackContainer = document.createElement('div');
2997
+ trackContainer.style.cssText = `flex-grow: 1; overflow: hidden; height: 100%; display: flex; align-items: center;`;
2998
+
2999
+ const track = this.createSeamlessScrollingTrack(config.items || [], config);
3000
+ track.style.fontSize = `${height * 0.18}px`;
3001
+ trackContainer.appendChild(track);
3002
+ bottomBar.appendChild(trackContainer);
3003
+
3004
+ content.appendChild(bottomBar);
3005
+ ticker.appendChild(content);
3006
+
3007
+ this.ensureTickerAnimations();
3008
+ return ticker;
3009
+ }
3010
+
3011
+ private createBroadcast2Element(config: FlashNewsTickerConfig, position: 'top' | 'bottom'): HTMLDivElement {
3012
+ const ticker = document.createElement('div');
3013
+ ticker.className = `uvf-ticker-broadcast2 ticker-${position}`;
3014
+
3015
+ const height = config.height || 75;
3016
+ const bottomOffset = config.bottomOffset || 0;
3017
+ const topOffset = config.topOffset || 10;
3018
+
3019
+ ticker.style.cssText = `
3020
+ position: absolute;
3021
+ left: 5%;
3022
+ right: 5%;
3023
+ height: ${height}px;
3024
+ ${position === 'top' ? `top: ${topOffset}px;` : `bottom: ${bottomOffset}px;`}
3025
+ display: flex;
3026
+ align-items: flex-end;
3027
+ font-family: 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
3028
+ z-index: 100;
3029
+ pointer-events: none;
3030
+ `;
3031
+
3032
+ // Globe icon (floating on left)
3033
+ const globeContainer = document.createElement('div');
3034
+ globeContainer.style.cssText = `
3035
+ width: ${height * 0.8}px;
3036
+ height: ${height * 0.8}px;
3037
+ background: rgba(255,255,255,0.1);
3038
+ border-radius: 50%;
3039
+ display: flex;
3040
+ align-items: center;
3041
+ justify-content: center;
3042
+ margin-right: 15px;
3043
+ box-shadow: 0 0 20px rgba(0,0,0,0.5);
3044
+ border: 2px solid rgba(255,255,255,0.2);
3045
+ `;
3046
+ const globe = this.createGlobeElement(true);
3047
+ globe.style.width = '70%';
3048
+ globe.style.height = '70%';
3049
+ globeContainer.appendChild(globe);
3050
+ ticker.appendChild(globeContainer);
3051
+
3052
+ const content = document.createElement('div');
3053
+ content.style.cssText = `flex-grow: 1; display: flex; flex-direction: column;`;
3054
+
3055
+ // Row 1: Yellow/Red Header
3056
+ const row1 = document.createElement('div');
3057
+ row1.style.cssText = `display: flex; height: 50%;`;
3058
+
3059
+ const badge = document.createElement('div');
3060
+ badge.textContent = 'BREAKING NEWS';
3061
+ badge.style.cssText = `
3062
+ background: #f1c40f;
3063
+ color: black;
3064
+ font-weight: 900;
3065
+ padding: 0 20px;
3066
+ display: flex;
3067
+ align-items: center;
3068
+ clip-path: polygon(0 0, 90% 0, 100% 100%, 0 100%);
3069
+ font-size: ${height * 0.18}px;
3070
+ `;
3071
+ row1.appendChild(badge);
3072
+
3073
+ const headline = document.createElement('div');
3074
+ headline.textContent = config.headline || 'LOREM IPSUM DOLOR SIT AMET, CONSECTETUER';
3075
+ headline.style.cssText = `
3076
+ background: #e74c3c;
3077
+ color: white;
3078
+ font-weight: 700;
3079
+ padding: 0 30px;
3080
+ display: flex;
3081
+ align-items: center;
3082
+ flex-grow: 1;
3083
+ margin-left: -10px;
3084
+ clip-path: polygon(2% 0, 100% 0, 98% 100%, 0 100%);
3085
+ font-size: ${height * 0.22}px;
3086
+ `;
3087
+ row1.appendChild(headline);
3088
+ content.appendChild(row1);
3089
+
3090
+ // Row 2: Blue Ticker
3091
+ const row2 = document.createElement('div');
3092
+ row2.style.cssText = `
3093
+ height: 40%;
3094
+ background: #2980b9;
3095
+ display: flex;
3096
+ align-items: center;
3097
+ margin-top: 2px;
3098
+ clip-path: polygon(0 0, 100% 0, 100% 100%, 1% 100%);
3099
+ `;
3100
+
3101
+ const live = document.createElement('div');
3102
+ live.textContent = 'LIVE';
3103
+ live.style.cssText = `
3104
+ background: white;
3105
+ color: #2980b9;
3106
+ font-weight: 900;
3107
+ padding: 0 15px;
3108
+ margin: 0 10px;
3109
+ font-size: ${height * 0.15}px;
3110
+ `;
3111
+ row2.appendChild(live);
3112
+
3113
+ const trackCont = document.createElement('div');
3114
+ trackCont.style.cssText = `flex-grow: 1; overflow: hidden; height: 100%; display: flex; align-items: center; color: white;`;
3115
+ const track = this.createSeamlessScrollingTrack(config.items || [], config);
3116
+ track.style.fontSize = `${height * 0.16}px`;
3117
+ trackCont.appendChild(track);
3118
+ row2.appendChild(trackCont);
3119
+ content.appendChild(row2);
3120
+
3121
+ ticker.appendChild(content);
3122
+ this.ensureTickerAnimations();
3123
+ return ticker;
3124
+ }
3125
+
3126
+ private createBroadcast3Element(config: FlashNewsTickerConfig, position: 'top' | 'bottom'): HTMLDivElement {
3127
+ const ticker = document.createElement('div');
3128
+ ticker.className = `uvf-ticker-broadcast3 ticker-${position}`;
3129
+
3130
+ const height = config.height || 60;
3131
+ const bottomOffset = config.bottomOffset || 0;
3132
+ const topOffset = config.topOffset || 10;
3133
+
3134
+ ticker.style.cssText = `
3135
+ position: absolute;
3136
+ left: 10%;
3137
+ right: 10%;
3138
+ height: ${height}px;
3139
+ ${position === 'top' ? `top: ${topOffset}px;` : `bottom: ${bottomOffset}px;`}
3140
+ display: flex;
3141
+ flex-direction: column;
3142
+ font-family: 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
3143
+ z-index: 100;
3144
+ pointer-events: none;
3145
+ `;
3146
+
3147
+ // Row 1: Split Red/Blue
3148
+ const row1 = document.createElement('div');
3149
+ row1.style.cssText = `display: flex; height: 55%;`;
3150
+
3151
+ const b1 = document.createElement('div');
3152
+ b1.textContent = 'BREAKING NEWS';
3153
+ b1.style.cssText = `
3154
+ background: #c0392b;
3155
+ color: white;
3156
+ font-weight: 900;
3157
+ padding: 0 20px;
3158
+ display: flex;
3159
+ align-items: center;
3160
+ clip-path: polygon(0 0, 95% 0, 100% 100%, 0 100%);
3161
+ font-size: ${height * 0.22}px;
3162
+ `;
3163
+ row1.appendChild(b1);
3164
+
3165
+ const b2 = document.createElement('div');
3166
+ b2.textContent = config.headline || 'LOREM IPSUM DOLOR SIT AMET, CONS';
3167
+ b2.style.cssText = `
3168
+ background: #2980b9;
3169
+ color: white;
3170
+ font-weight: 700;
3171
+ padding: 0 30px;
3172
+ display: flex;
3173
+ align-items: center;
3174
+ flex-grow: 1;
3175
+ margin-left: -10px;
3176
+ clip-path: polygon(2% 0, 100% 0, 98% 100%, 0 100%);
3177
+ font-size: ${height * 0.25}px;
3178
+ `;
3179
+ row1.appendChild(b2);
3180
+ ticker.appendChild(row1);
3181
+
3182
+ // Row 2: Black scrolling
3183
+ const row2 = document.createElement('div');
3184
+ row2.style.cssText = `
3185
+ height: 35%;
3186
+ background: #111;
3187
+ display: flex;
3188
+ align-items: center;
3189
+ margin-top: 2px;
3190
+ clip-path: polygon(1% 0, 99% 0, 100% 100%, 0 100%);
3191
+ `;
3192
+
3193
+ const lbadge = document.createElement('div');
3194
+ lbadge.textContent = 'LIVE';
3195
+ lbadge.style.cssText = `
3196
+ background: #f1c40f;
3197
+ color: black;
3198
+ font-weight: 900;
3199
+ padding: 0 10px;
3200
+ margin: 0 15px;
3201
+ font-size: ${height * 0.15}px;
3202
+ clip-path: polygon(0 0, 90% 0, 100% 100%, 0 100%);
3203
+ `;
3204
+ row2.appendChild(lbadge);
3205
+
3206
+ const tCont = document.createElement('div');
3207
+ tCont.style.cssText = `flex-grow: 1; overflow: hidden; height: 100%; display: flex; align-items: center; color: white;`;
3208
+ const track = this.createSeamlessScrollingTrack(config.items || [], config);
3209
+ track.style.fontSize = `${height * 0.16}px`;
3210
+ tCont.appendChild(track);
3211
+ row2.appendChild(tCont);
3212
+ ticker.appendChild(row2);
3213
+
3214
+ this.ensureTickerAnimations();
3215
+ return ticker;
3216
+ }
3217
+
3218
+ private createBroadcast4Element(config: FlashNewsTickerConfig, position: 'top' | 'bottom'): HTMLDivElement {
3219
+ const ticker = document.createElement('div');
3220
+ ticker.className = `uvf-ticker-broadcast4 ticker-${position}`;
3221
+
3222
+ const height = config.height || 65;
3223
+ const bottomOffset = config.bottomOffset || 0;
3224
+ const topOffset = config.topOffset || 10;
3225
+
3226
+ ticker.style.cssText = `
3227
+ position: absolute;
3228
+ left: 15%;
3229
+ right: 15%;
3230
+ height: ${height}px;
3231
+ ${position === 'top' ? `top: ${topOffset}px;` : `bottom: ${bottomOffset}px;`}
3232
+ display: flex;
3233
+ align-items: flex-end;
3234
+ font-family: 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
3235
+ z-index: 100;
3236
+ pointer-events: none;
3237
+ `;
3238
+
3239
+ // Large Blue Box
3240
+ const newsBox = document.createElement('div');
3241
+ newsBox.style.cssText = `
3242
+ width: ${height * 1.5}px;
3243
+ height: 100%;
3244
+ background: #1e3c72;
3245
+ display: flex;
3246
+ flex-direction: column;
3247
+ justify-content: center;
3248
+ padding-left: 15px;
3249
+ position: relative;
3250
+ clip-path: polygon(0 0, 100% 0, 95% 100%, 0 100%);
3251
+ flex-shrink: 0;
3252
+ `;
3253
+
3254
+ const bt = document.createElement('div');
3255
+ bt.style.cssText = `display: flex; gap: 5px; margin-bottom: 5px;`;
3256
+
3257
+ const b1 = document.createElement('span');
3258
+ b1.textContent = 'BREAKING';
3259
+ b1.style.cssText = `background: #c0392b; font-size: 10px; font-weight: 800; padding: 2px 5px; border-radius: 2px; color: white;`;
3260
+ bt.appendChild(b1);
3261
+
3262
+ const b2 = document.createElement('span');
3263
+ b2.textContent = 'LIVE';
3264
+ b2.style.cssText = `background: #f1c40f; font-size: 10px; font-weight: 800; padding: 2px 5px; border-radius: 2px; color: black;`;
3265
+ bt.appendChild(b2);
3266
+ newsBox.appendChild(bt);
3267
+
3268
+ const nt = document.createElement('div');
3269
+ nt.textContent = 'NEWS';
3270
+ nt.style.cssText = `font-size: ${height * 0.4}px; font-weight: 900; color: white; letter-spacing: 2px;`;
3271
+ newsBox.appendChild(nt);
3272
+ ticker.appendChild(newsBox);
3273
+
3274
+ // Red Scrolling Bar
3275
+ const redBar = document.createElement('div');
3276
+ redBar.style.cssText = `
3277
+ flex-grow: 1;
3278
+ height: 50%;
3279
+ background: #c0392b;
3280
+ margin-left: -${height * 0.1}px;
3281
+ display: flex;
3282
+ align-items: center;
3283
+ padding-left: 20px;
3284
+ clip-path: polygon(2% 0, 100% 0, 100% 100%, 0 100%);
3285
+ `;
3286
+
3287
+ const tCont = document.createElement('div');
3288
+ tCont.style.cssText = `flex-grow: 1; overflow: hidden; height: 100%; display: flex; align-items: center; color: white;`;
3289
+ const track = this.createSeamlessScrollingTrack(config.items || [], config);
3290
+ track.style.fontSize = `${height * 0.25}px`;
3291
+ track.style.fontWeight = '700';
3292
+ tCont.appendChild(track);
3293
+ redBar.appendChild(tCont);
3294
+ ticker.appendChild(redBar);
3295
+
3296
+ this.ensureTickerAnimations();
3297
+ return ticker;
3298
+ }
3299
+
3300
+ private createSeamlessScrollingTrack(items: FlashNewsTickerItem[], config: FlashNewsTickerConfig): HTMLDivElement {
3301
+ const track = document.createElement('div');
3302
+ track.className = 'uvf-ticker-track-seamless';
3303
+
3304
+ const duration = this.calculateTickerDuration(config);
3305
+ track.style.cssText = `
3306
+ display: flex;
3307
+ white-space: nowrap;
3308
+ animation: ticker-scroll ${duration}s linear infinite;
3309
+ will-change: transform;
3310
+ padding-left: 50%;
3311
+ `;
3312
+
3313
+ const content = items.map(item => item.html || item.text).join(config.separator || ' • ');
3314
+
3315
+ // Duplicate content for horizontal seamless loop
3316
+ const span1 = document.createElement('span');
3317
+ span1.innerHTML = content;
3318
+ span1.style.paddingRight = `${config.gap || 100}px`;
3319
+
3320
+ const span2 = document.createElement('span');
3321
+ span2.innerHTML = content;
3322
+ span2.style.paddingRight = `${config.gap || 100}px`;
3323
+
3324
+ track.appendChild(span1);
3325
+ track.appendChild(span2);
3326
+
3327
+ return track;
3328
+ }
3329
+
2880
3330
  private createGlobeElement(animate: boolean): HTMLDivElement {
2881
3331
  const globeContainer = document.createElement('div');
2882
3332
  globeContainer.className = 'uvf-ticker-globe';
@@ -3321,11 +3771,12 @@ export class WebPlayer extends BasePlayer {
3321
3771
  headlineLine.style.cssText = `
3322
3772
  display: flex;
3323
3773
  align-items: center;
3774
+ justify-content: center;
3324
3775
  min-height: ${topLineHeight}px;
3325
3776
  padding: ${topLineConfig.padding || 8}px 12px;
3326
3777
  background: ${topLineConfig.backgroundColor || 'transparent'};
3327
3778
  overflow: hidden;
3328
- ${topLineMultiLine ? '' : 'white-space: nowrap;'}
3779
+ text-align: center;
3329
3780
  `;
3330
3781
 
3331
3782
  const headlineText = document.createElement('span');
@@ -3337,6 +3788,8 @@ export class WebPlayer extends BasePlayer {
3337
3788
  font-size: ${topLineFontSize}px;
3338
3789
  font-weight: 700;
3339
3790
  line-height: ${topLineLineHeight};
3791
+ text-align: center;
3792
+ width: 100%;
3340
3793
  ${topLineMultiLine ? `
3341
3794
  display: -webkit-box;
3342
3795
  -webkit-line-clamp: ${topLineMaxLines};
@@ -3354,13 +3807,11 @@ export class WebPlayer extends BasePlayer {
3354
3807
 
3355
3808
  // Set initial headline content
3356
3809
  if (firstItem) {
3810
+ const headlineContent = firstItem.headline || firstItem.text;
3357
3811
  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;
3812
+ headlineText.innerHTML = this.formatHeadlineText(firstItem.headlineHtml, topLineConfig, true);
3813
+ } else if (headlineContent) {
3814
+ headlineText.innerHTML = this.formatHeadlineText(headlineContent, topLineConfig, false);
3364
3815
  }
3365
3816
  }
3366
3817
 
@@ -3721,6 +4172,64 @@ export class WebPlayer extends BasePlayer {
3721
4172
  });
3722
4173
  }
3723
4174
 
4175
+ /**
4176
+ * Format headline text with optional forced line breaks
4177
+ */
4178
+ private formatHeadlineText(text: string, topLineConfig: { forceMultiLine?: boolean; breakAt?: number | string }, isHtml: boolean = false): string {
4179
+ if (!topLineConfig.forceMultiLine) {
4180
+ // If it's HTML, return as-is; otherwise escape for safety
4181
+ return isHtml ? text : this.escapeHtml(text);
4182
+ }
4183
+
4184
+ // Calculate break position
4185
+ let breakPosition: number;
4186
+ const breakAt = topLineConfig.breakAt || '50%';
4187
+
4188
+ if (typeof breakAt === 'string' && breakAt.endsWith('%')) {
4189
+ const percentage = parseFloat(breakAt) / 100;
4190
+ breakPosition = Math.floor(text.length * percentage);
4191
+ } else {
4192
+ breakPosition = typeof breakAt === 'number' ? breakAt : Math.floor(text.length / 2);
4193
+ }
4194
+
4195
+ // Find the nearest space to break at (for better readability)
4196
+ let actualBreakPos = breakPosition;
4197
+
4198
+ // Look for a space near the break position
4199
+ const searchRange = Math.min(15, Math.floor(text.length / 4)); // Search within ~15 chars or 25% of text
4200
+ for (let i = 0; i <= searchRange; i++) {
4201
+ // Check forward first, then backward
4202
+ if (breakPosition + i < text.length && text[breakPosition + i] === ' ') {
4203
+ actualBreakPos = breakPosition + i;
4204
+ break;
4205
+ }
4206
+ if (breakPosition - i >= 0 && text[breakPosition - i] === ' ') {
4207
+ actualBreakPos = breakPosition - i;
4208
+ break;
4209
+ }
4210
+ }
4211
+
4212
+ // Split and join with <br>
4213
+ const line1 = text.substring(0, actualBreakPos).trim();
4214
+ const line2 = text.substring(actualBreakPos).trim();
4215
+
4216
+ if (isHtml) {
4217
+ // For HTML content, try to insert <br> at a reasonable position
4218
+ return `${line1}<br>${line2}`;
4219
+ }
4220
+
4221
+ return `${this.escapeHtml(line1)}<br>${this.escapeHtml(line2)}`;
4222
+ }
4223
+
4224
+ /**
4225
+ * Escape HTML special characters
4226
+ */
4227
+ private escapeHtml(text: string): string {
4228
+ const div = document.createElement('div');
4229
+ div.textContent = text;
4230
+ return div.innerHTML;
4231
+ }
4232
+
3724
4233
  /**
3725
4234
  * Update headline and detail content for current item
3726
4235
  */
@@ -3728,12 +4237,13 @@ export class WebPlayer extends BasePlayer {
3728
4237
  // Update headline
3729
4238
  const headline = this.tickerHeadlineElement?.querySelector('.uvf-ticker-headline-text') as HTMLSpanElement;
3730
4239
  if (headline) {
4240
+ const topLineConfig = this.tickerConfig?.broadcastStyle?.twoLineDisplay?.topLine || {};
4241
+ const headlineContent = item.headline || item.text;
4242
+
3731
4243
  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;
4244
+ headline.innerHTML = this.formatHeadlineText(item.headlineHtml, topLineConfig, true);
4245
+ } else if (headlineContent) {
4246
+ headline.innerHTML = this.formatHeadlineText(headlineContent, topLineConfig, false);
3737
4247
  }
3738
4248
  }
3739
4249