PluginProbe
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor / 2.0.7
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor v2.0.7
2.0.13 2.0.12 2.0.11 2.0.10 2.0.9 trunk 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8
blockenberg / blocks / content-ticker / frontend.js

frontend.js in Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor 2.0.7, at blocks/content-ticker/frontend.js

175 lines 8.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function () {
2 'use strict';
3
4 function typoCssVarsForEl(typo, prefix, el) {
5 if (!typo) return;
6 if (typo.family) el.style.setProperty(prefix + 'font-family', "'" + typo.family + "', sans-serif");
7 if (typo.weight) el.style.setProperty(prefix + 'font-weight', typo.weight);
8 if (typo.transform) el.style.setProperty(prefix + 'text-transform', typo.transform);
9 if (typo.style) el.style.setProperty(prefix + 'font-style', typo.style);
10 if (typo.decoration) el.style.setProperty(prefix + 'text-decoration', typo.decoration);
11 var su = typo.sizeUnit || 'px';
12 if (typo.sizeDesktop !== '' && typo.sizeDesktop != null) el.style.setProperty(prefix + 'font-size-d', typo.sizeDesktop + su);
13 if (typo.sizeTablet !== '' && typo.sizeTablet != null) el.style.setProperty(prefix + 'font-size-t', typo.sizeTablet + su);
14 if (typo.sizeMobile !== '' && typo.sizeMobile != null) el.style.setProperty(prefix + 'font-size-m', typo.sizeMobile + su);
15 var lhu = typo.lineHeightUnit || 'px';
16 if (typo.lineHeightDesktop !== '' && typo.lineHeightDesktop != null) el.style.setProperty(prefix + 'line-height-d', typo.lineHeightDesktop + lhu);
17 if (typo.lineHeightTablet !== '' && typo.lineHeightTablet != null) el.style.setProperty(prefix + 'line-height-t', typo.lineHeightTablet + lhu);
18 if (typo.lineHeightMobile !== '' && typo.lineHeightMobile != null) el.style.setProperty(prefix + 'line-height-m', typo.lineHeightMobile + lhu);
19 var lsu = typo.letterSpacingUnit || 'px';
20 if (typo.letterSpacingDesktop !== '' && typo.letterSpacingDesktop != null) {
21 el.style.setProperty(prefix + 'letter-spacing-d', typo.letterSpacingDesktop + lsu);
22 el.style.setProperty(prefix + 'letter-spacing', typo.letterSpacingDesktop + lsu);
23 }
24 if (typo.letterSpacingTablet !== '' && typo.letterSpacingTablet != null) el.style.setProperty(prefix + 'letter-spacing-t', typo.letterSpacingTablet + lsu);
25 if (typo.letterSpacingMobile !== '' && typo.letterSpacingMobile != null) el.style.setProperty(prefix + 'letter-spacing-m', typo.letterSpacingMobile + lsu);
26 var wsu = typo.wordSpacingUnit || 'px';
27 if (typo.wordSpacingDesktop !== '' && typo.wordSpacingDesktop != null) {
28 el.style.setProperty(prefix + 'word-spacing-d', typo.wordSpacingDesktop + wsu);
29 el.style.setProperty(prefix + 'word-spacing', typo.wordSpacingDesktop + wsu);
30 }
31 if (typo.wordSpacingTablet !== '' && typo.wordSpacingTablet != null) el.style.setProperty(prefix + 'word-spacing-t', typo.wordSpacingTablet + wsu);
32 if (typo.wordSpacingMobile !== '' && typo.wordSpacingMobile != null) el.style.setProperty(prefix + 'word-spacing-m', typo.wordSpacingMobile + wsu);
33 }
34
35 function initBlock(root) {
36 var appEl = root.querySelector('.bkbg-ctk-app');
37 if (!appEl) return;
38
39 var raw = appEl.getAttribute('data-opts') || '{}';
40 var o;
41 try { o = JSON.parse(raw); } catch (e) { o = {}; }
42
43 var items = Array.isArray(o.items) ? o.items : [];
44 var prefix = o.prefix !== undefined ? o.prefix : '📢 Breaking';
45 var showPrefix = o.showPrefix !== false;
46 var speed = Number(o.speed) || 60; // px/s
47 var pauseOnHover = o.pauseOnHover !== false;
48 var separator = o.separator !== undefined ? o.separator : '';
49 var direction = o.direction || 'left';
50 var height = Number(o.height) || 44;
51 var fontSize = Number(o.fontSize) || 14;
52 var fontWeight = Number(o.fontWeight) || 400;
53 var borderRadius = Number(o.borderRadius) || 6;
54 var prefixPadding = Number(o.prefixPadding) || 20;
55 var prefixBg = o.prefixBg || '#ef4444';
56 var prefixColor = o.prefixColor || '#ffffff';
57 var tickerBg = o.tickerBg || '#1e1b4b';
58 var tickerColor = o.tickerColor || '#e2e8f0';
59 var linkColor = o.linkColor || '#a5b4fc';
60 var separatorColor = o.separatorColor || '#475569';
61
62 if (items.length === 0) return;
63
64 appEl.innerHTML = '';
65
66 // ── Outer wrapper ──────────────────────────────────────────────────
67 var wrap = document.createElement('div');
68 wrap.className = 'bkbg-ctk-wrap' +
69 (pauseOnHover ? ' bkbg-ctk-pauseable' : '') +
70 (direction === 'right' ? ' bkbg-ctk-rtl' : '');
71 wrap.style.cssText = [
72 'height:' + height + 'px',
73 'border-radius:' + borderRadius + 'px',
74 'background:' + tickerBg,
75 'color:' + tickerColor
76 ].join(';');
77
78 typoCssVarsForEl(o.typoText, '--bkctk-text-', wrap);
79
80 // ── Prefix ─────────────────────────────────────────────────────────
81 if (showPrefix && prefix) {
82 var pre = document.createElement('div');
83 pre.className = 'bkbg-ctk-prefix';
84 pre.textContent = prefix;
85 pre.style.cssText = [
86 'background:' + prefixBg,
87 'color:' + prefixColor,
88 'padding:0 ' + prefixPadding + 'px'
89 ].join(';');
90 wrap.appendChild(pre);
91 }
92
93 // ── Track ──────────────────────────────────────────────────────────
94 var track = document.createElement('div');
95 track.className = 'bkbg-ctk-track';
96 wrap.appendChild(track);
97
98 // ── Inner (items × 2 for seamless loop) ───────────────────────────
99 var inner = document.createElement('div');
100 inner.className = 'bkbg-ctk-inner';
101 track.appendChild(inner);
102
103 function buildItems() {
104 var frag = document.createDocumentFragment();
105 items.forEach(function (item) {
106 var sep = document.createElement('span');
107 sep.className = 'bkbg-ctk-sep';
108 sep.style.color = separatorColor;
109 sep.textContent = separator;
110 frag.appendChild(sep);
111
112 var itemEl = document.createElement('span');
113 itemEl.className = 'bkbg-ctk-item';
114
115 if (item.url) {
116 var a = document.createElement('a');
117 a.href = item.url;
118 a.target = '_blank';
119 a.rel = 'noopener noreferrer';
120 a.textContent = item.text || '';
121 a.style.color = linkColor;
122 itemEl.appendChild(a);
123 } else {
124 itemEl.textContent = item.text || '';
125 }
126 frag.appendChild(itemEl);
127 });
128 return frag;
129 }
130
131 inner.appendChild(buildItems());
132 inner.appendChild(buildItems()); // second copy for seamless loop
133
134 // ── Direction arrow ────────────────────────────────────────────────
135 var arrow = document.createElement('div');
136 arrow.className = 'bkbg-ctk-arrow';
137 arrow.style.cssText = 'background:' + prefixBg + ';color:' + prefixColor;
138 arrow.textContent = direction === 'right' ? '' : '';
139 wrap.appendChild(arrow);
140
141 appEl.appendChild(wrap);
142
143 // ── Calculate animation duration from content width ────────────────
144 function setDuration() {
145 var halfW = inner.scrollWidth / 2; // width of one copy
146 if (halfW < 1) return;
147 var dur = halfW / speed; // seconds
148 inner.style.animationDuration = dur + 's';
149 }
150
151 // Run once after paint so scrollWidth is available
152 requestAnimationFrame(function () {
153 setDuration();
154 });
155
156 // Recalculate on resize
157 if (typeof ResizeObserver !== 'undefined') {
158 var ro = new ResizeObserver(function () {
159 setDuration();
160 });
161 ro.observe(track);
162 }
163 }
164
165 function init() {
166 document.querySelectorAll('.wp-block-blockenberg-content-ticker').forEach(initBlock);
167 }
168
169 if (document.readyState === 'loading') {
170 document.addEventListener('DOMContentLoaded', init);
171 } else {
172 init();
173 }
174 })();
175