unified-video-framework 1.4.440 → 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.
@@ -118,6 +118,15 @@ export interface FlashNewsTickerConfig {
118
118
  gap?: number;
119
119
  loop?: boolean;
120
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[];
121
130
  topOffset?: number;
122
131
  bottomOffset?: number;
123
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';
@@ -429,7 +429,44 @@ export interface FlashNewsTickerConfig {
429
429
  /** Separator text between items. Default: ' • ' */
430
430
  separator?: string;
431
431
 
432
- // Safe areas
432
+ /**
433
+ * Ticker variant/layout style. Options:
434
+ * - 'standard': Original simple scrolling ticker
435
+ * - 'breaking': Red badge + gradient (TV style)
436
+ * - 'live': Yellow/Black badge + gradient (TV style)
437
+ * - 'broadcast1': Blue/Red/Black dual-bar layout with globe
438
+ * - 'broadcast2': Yellow/Red/Blue dual-bar layout with globe
439
+ * - 'broadcast3': Triple-segment single bar (Red/Blue/Black)
440
+ * - 'broadcast4': Blue box "NEWS" + Red scrolling bar
441
+ * - 'custom': User-defined colors and badges
442
+ */
443
+ variant?: 'standard' | 'breaking' | 'live' | 'broadcast1' | 'broadcast2' | 'broadcast3' | 'broadcast4' | 'custom';
444
+
445
+ /** Fixed badge text (e.g. "BREAKING NEWS") */
446
+ badgeText?: string;
447
+
448
+ /** Badge background color (e.g. "#e74c3c") */
449
+ badgeColor?: string;
450
+
451
+ /** Badge text color (e.g. "#ffffff") */
452
+ badgeTextColor?: string;
453
+
454
+ /** Accent/gradient color for the ticker (e.g. "#c0392b") */
455
+ accentColor?: string;
456
+
457
+ /** Enable pulse animation for the badge. Default: true for breaking/live */
458
+ pulseBadge?: boolean;
459
+
460
+ /** URL for the left-side icon (e.g. globe graphic) */
461
+ iconUrl?: string;
462
+
463
+ /** Static headline text for multi-bar layouts */
464
+ headline?: string;
465
+
466
+ /** Items for the second scrolling track (if applicable to layout) */
467
+ secondaryItems?: FlashNewsTickerItem[];
468
+
469
+ /** Safe areas */
433
470
 
434
471
  /** Top offset in pixels for safe area. Default: 10 */
435
472
  topOffset?: number;