TRUST ROOFING TV
TRUST ROOFING TV ORIGINAL
Trust Roofing Academy
Original series · Behind the scenes · Trust Roofing
Episodes coming soon.
THE SERIES
Every roof has a story.
Season All seasons
Episode previews · details coming soon
RAISING THE ROOF
01
THUMBNAIL PLACEHOLDER
Preview
Season 1 · Episode 1
Episode 1 · title to be confirmed
Episode description coming soon.
RAISING THE ROOF
02
THUMBNAIL PLACEHOLDER
Preview
Season 1 · Episode 2
Episode 2 · title to be confirmed
Episode description coming soon.
RAISING THE ROOF
03
THUMBNAIL PLACEHOLDER
Preview
Season 1 · Episode 3
Episode 3 · title to be confirmed
Episode description coming soon.
PEOPLE. CRAFT. COMMUNITY.
More than what meets the roof.
About the series
Raising the Roof takes you closer to the people and craftsmanship behind Trust Roofing. From the first conversation to the finishing details, discover what it means to build with care.
Real work. Shared stories. A closer look at the team behind the roof.
Our name is our promise.
KEEP EXPLORING
More from Trust Roofing TV
TRUST ROOFING TV
Property Owner’s Playbook
SHOW ARTWORK PLACEHOLDER
Property Owner’s Playbook
Series details coming soon.
TRUST ROOFING TV
Your next perspective.
SHOW ARTWORK PLACEHOLDER
Third show · title to be confirmed
Series details coming soon.
.trust-tv [hidden]{display:none!important}.trust-tv a:focus-visible,.trust-tv select:focus-visible{outline:3px solid #6fabdd;outline-offset:5px}.trust-tv select{font:inherit;background:#152136;color:#fff;border:1px solid #65748a;padding:12px 32px 12px 14px;border-radius:4px;min-height:46px;max-width:100%}.trust-tv .trust-tv__filter{display:flex;align-items:center;gap:12px;font-size:13px;flex-shrink:0}@media(max-width:600px){.trust-tv .trust-tv__filter{width:100%;justify-content:space-between}}
/* Progressive enhancement; all editorial content remains readable without JS. */
(() => {
‘use strict’;
function init() {
document.querySelectorAll(‘[data-trust-tv]’).forEach(root => {
if (root.dataset.tvReady) return;
const cards = […root.querySelectorAll(‘[data-season][data-episode]’)];
const select = root.querySelector(‘[data-season-select]’);
const status = root.querySelector(‘[data-status]’);
const filter = root.querySelector(‘[data-filter]’);
if (!select || !status || !filter) return;
root.dataset.tvReady = ‘true’;
const seasons = […new Set(cards.map(card => card.dataset.season))].sort((a, b) => Number(a) – Number(b));
seasons.forEach(season => {
const option = document.createElement(‘option’);
option.value = season;
option.textContent = `Season ${season}`;
select.append(option);
});
// Start with all seasons; no card is hidden unless the viewer chooses a filter.
filter.hidden = seasons.length === 0;
select.addEventListener(‘change’, () => {
let visible = 0;
cards.forEach(card => {
card.hidden = select.value !== ‘all’ && card.dataset.season !== select.value;
if (!card.hidden) visible++;
});
status.textContent = `${visible} episode${visible === 1 ? ” : ‘s’} · ${select.value === ‘all’ ? ‘All seasons’ : `Season ${select.value}`}`;
});
const available = cards.map(card => {
const link = card.querySelector(‘a[data-video][href]’);
if (!link) return null;
try {
const url = new URL(link.getAttribute(‘href’));
if (url.protocol !== ‘https:’ || /YOUR_REAL|REPLACE|example\.(com|org|net)/i.test(url.href)) return null;
return { card, url };
} catch { return null; }
}).filter(Boolean).sort((a, b) => Number(b.card.dataset.season) – Number(a.card.dataset.season) || Number(b.card.dataset.episode) – Number(a.card.dataset.episode));
const latest = root.querySelector(‘[data-latest]’);
if (available.length && latest) {
latest.href = available[0].url.href;
latest.removeAttribute(‘aria-disabled’);
latest.removeAttribute(‘role’);
const notice = root.querySelector(‘[data-availability]’);
if (notice) notice.textContent = `Latest: Season ${available[0].card.dataset.season}, Episode ${available[0].card.dataset.episode}`;
}
});
}
if (document.readyState === ‘loading’) document.addEventListener(‘DOMContentLoaded’, init, { once: true });
else init();
})();