Skip to content

Commit 82ebbb8

Browse files
committed
v0.1.42: new-tab bittorrented — all media types + in-modal player
- show Live TV, Podcasts, Radio, Movies favorites; playable items (TV, latest podcast episode) open bittorrented.com/api/player in a themed modal iframe (autoplay/fullscreen), passing TronBrowser's dark+cyan theme - radio/movies link out (gated streams)
1 parent 5bc814c commit 82ebbb8

27 files changed

Lines changed: 68 additions & 32 deletions

File tree

apps/desktop/extensions/ai-sidebar/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"manifest_version": 3,
33
"name": "TronBrowser",
4-
"version": "0.1.41",
4+
"version": "0.1.42",
55
"description": "TronBrowser — privacy-first, AI-native. Branded new tab, private search, CoinPay login, and a bring-your-own-keys AI sidebar.",
66
"icons": {
77
"16": "icons/icon-16.png",

apps/desktop/extensions/ai-sidebar/newtab.css

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,17 @@ body {
3737
border-radius: 10px; padding: 14px 16px; white-space: pre-wrap; font-size: 13px; color: var(--fg); }
3838
.motd-body a { color: var(--cyan); text-decoration: none; }
3939

40+
/* Embeddable player modal */
41+
.modal { position: fixed; inset: 0; z-index: 100; background: rgba(0,0,0,.82); display: grid; place-items: center; }
42+
.modal[hidden] { display: none; }
43+
.modal-box { position: relative; width: min(92vw, 1040px); height: min(82vh, 660px);
44+
background: #000; border: 1px solid var(--line); border-radius: 12px; overflow: hidden;
45+
box-shadow: 0 20px 80px rgba(0,0,0,.6); }
46+
.modal-box iframe { width: 100%; height: 100%; border: 0; display: block; }
47+
.modal-close { position: absolute; top: 8px; right: 8px; z-index: 2; width: 32px; height: 32px;
48+
background: rgba(0,0,0,.6); color: #fff; border: 1px solid var(--line); border-radius: 8px;
49+
cursor: pointer; font: inherit; }
50+
4051
.btrgrid { margin-top: 12px; display: flex; flex-direction: column; gap: 14px; }
4152
.btr-group h3 { margin: 0 0 8px; font-size: 12px; letter-spacing: 1px; color: var(--cyan); }
4253
.btr-items { display: flex; flex-wrap: wrap; gap: 10px; }

apps/desktop/extensions/ai-sidebar/newtab.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@
4040
<div id="motd" class="motd-body"></div>
4141
</section>
4242

43+
<div id="player-modal" class="modal" hidden>
44+
<div class="modal-box">
45+
<button id="player-close" class="modal-close" title="Close"></button>
46+
<iframe id="player-frame" allow="autoplay; fullscreen; encrypted-media" allowfullscreen></iframe>
47+
</div>
48+
</div>
49+
4350
<section class="strip" id="btr-sec" hidden>
4451
<div class="strip-head"><h2>bittorrented</h2><a class="edit" href="https://bittorrented.com" target="_blank">open</a></div>
4552
<div id="btr" class="btrgrid"></div>

apps/desktop/extensions/ai-sidebar/newtab.js

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -246,24 +246,42 @@ async function renderBtr() {
246246
data = await r.json();
247247
} catch { sec.hidden = true; return; }
248248

249-
const tv = data.tv || [];
250-
const pods = data.podcasts || [];
249+
const tv = data.tv || [], radio = data.radio || [], pods = data.podcasts || [], movies = data.movies || [];
251250
sec.hidden = false;
252-
const item = (href, img, ph, label) =>
253-
`<a class="btr-item" href="${escAttr(href)}" target="_blank">` +
251+
252+
// Playable tiles carry data-player (open in a modal); the rest link out.
253+
const tile = (player, url, img, ph, label) =>
254+
`<a class="btr-item" ${player ? `href="#" data-player="${escAttr(player)}"` : `href="${escAttr(url)}" target="_blank"`}>` +
254255
(img ? `<img src="${escAttr(img)}" alt="" loading="lazy" referrerpolicy="no-referrer" />` : `<span class="btr-ph">${ph}</span>`) +
255256
`<span class="btr-label">${escapeHtml(label)}</span></a>`;
256257
const group = (title, items) => items.length
257258
? `<div class="btr-group"><h3>${title}</h3><div class="btr-items">${items.join('')}</div></div>` : '';
258259

259-
if (!tv.length && !pods.length) {
260-
el('btr').innerHTML = '<p class="muted">Connected — add Live TV or podcast favorites on bittorrented.com and they’ll show up here.</p>';
260+
if (!tv.length && !radio.length && !pods.length && !movies.length) {
261+
el('btr').innerHTML = '<p class="muted">Connected — add Live TV, radio, podcast or movie favorites on bittorrented.com and they’ll show up here.</p>';
261262
return;
262263
}
263264
el('btr').innerHTML =
264-
group('Live TV', tv.slice(0, 12).map((c) => item(c.url, c.logo, '📺', c.name))) +
265-
group('Podcasts', pods.slice(0, 12).map((p) => item(p.url, p.image, '🎙', p.title)));
265+
group('Live TV', tv.slice(0, 12).map((c) => tile(c.player, c.url, c.logo, '📺', c.name))) +
266+
group('Podcasts', pods.slice(0, 12).map((p) => tile((p.episodes || [])[0]?.player, p.url, p.image, '🎙', p.title))) +
267+
group('Radio', radio.slice(0, 12).map((s) => tile(null, s.url, s.logo, '📻', s.name))) +
268+
group('Movies', movies.slice(0, 12).map((m) => tile(null, m.url, m.poster, '🎬', m.title)));
269+
}
270+
271+
// Open a bittorrented /api/player URL in a themed modal iframe.
272+
function openPlayer(url) {
273+
const sep = url.includes('?') ? '&' : '?';
274+
el('player-frame').src = `${url}${sep}theme=dark&bg=${encodeURIComponent('#05070d')}&accent=${encodeURIComponent('#34e7ff')}`;
275+
el('player-modal').hidden = false;
266276
}
277+
function closePlayer() { el('player-modal').hidden = true; el('player-frame').src = 'about:blank'; }
278+
el('btr').addEventListener('click', (e) => {
279+
const a = e.target.closest('[data-player]');
280+
if (a) { e.preventDefault(); openPlayer(a.getAttribute('data-player')); }
281+
});
282+
el('player-close').addEventListener('click', closePlayer);
283+
el('player-modal').addEventListener('click', (e) => { if (e.target === el('player-modal')) closePlayer(); });
284+
document.addEventListener('keydown', (e) => { if (e.key === 'Escape') closePlayer(); });
267285

268286
renderMotd();
269287
renderBtr();

apps/desktop/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@tronbrowser/desktop",
3-
"version": "0.1.41",
3+
"version": "0.1.42",
44
"private": true,
55
"description": "Desktop shell for the TronBrowser Chromium fork",
66
"type": "module",

apps/docs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@tronbrowser/docs",
3-
"version": "0.1.41",
3+
"version": "0.1.42",
44
"private": true,
55
"description": "Documentation site",
66
"type": "module",

apps/mobile/app.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"slug": "tronbrowserdev",
55
"owner": "profullstack",
66
"scheme": "tronbrowser",
7-
"version": "0.1.41",
7+
"version": "0.1.42",
88
"orientation": "portrait",
99
"userInterfaceStyle": "dark",
1010
"platforms": [

apps/mobile/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@tronbrowser/mobile",
3-
"version": "0.1.41",
3+
"version": "0.1.42",
44
"private": true,
55
"description": "TronBrowser mobile (Expo / React Native) — Phase 2",
66
"type": "module",

apps/web/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@tronbrowser/web",
3-
"version": "0.1.41",
3+
"version": "0.1.42",
44
"private": true,
55
"description": "TronBrowser marketing site + web dashboard",
66
"type": "module",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "tronbrowser",
3-
"version": "0.1.41",
3+
"version": "0.1.42",
44
"private": true,
55
"description": "TronBrowser.dev — open-source, privacy-first, AI-native browser",
66
"packageManager": "pnpm@9.12.0",

0 commit comments

Comments
 (0)