Iwara: Theater Mode, Video Description & Comment Toggles

Big video player for Iwara. Fills the screen. Adds button toggles for video descriptions and comments. Removes Liked By Users, Footer, and Announcement. Moves More From User/More Like This to bottom of page.

// ==UserScript==
// @name         Iwara: Theater Mode, Video Description & Comment Toggles
// @namespace    https://www.iwara.tv/
// @version      2.0
// @description  Big video player for Iwara. Fills the screen. Adds button toggles for video descriptions and comments. Removes Liked By Users, Footer, and Announcement. Moves More From User/More Like This to bottom of page.
// @author       sonikkuso
// @match        *://iwara.tv/*
// @match        *://www.iwara.tv/*
// @license MIT
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    function addToggleButton() {
        const container = document.querySelector('.page-video .page-video__details');
        if (!container || container.dataset.toggleReady === 'true') return;

        container.dataset.toggleReady = 'true';

        const titleBlock = container.querySelector('.text');
        if (!titleBlock) return;

        // Hide all other elements except the title
        [...container.children].forEach(child => {
            if (child !== titleBlock) {
                child.style.display = 'none';
            }
        });

        // Create the toggle button
        const button = document.createElement('button');
        button.textContent = 'Show Description';
        button.style.marginLeft = '10px';
        button.style.cursor = 'pointer';

        let isVisible = false;

        button.addEventListener('click', () => {
            isVisible = !isVisible;
            button.textContent = isVisible ? 'Hide Description' : 'Show Description';

            [...container.children].forEach(child => {
                if (child !== titleBlock) {
                    child.style.display = isVisible ? '' : 'none';
                }
            });
        });

        titleBlock.appendChild(button);
    }

    // Initial run
    addToggleButton();

    // Observe for dynamic navigation
    const observer = new MutationObserver(addToggleButton);
    observer.observe(document.body, { childList: true, subtree: true });


    function addToggleButton2() {
        const comments = document.querySelector('.comments');
        if (!comments || comments.dataset.toggleReady === 'true') return;

        comments.dataset.toggleReady = 'true';

        // Elements to toggle
        const targets = [];

        const row = comments.querySelector('.row');
        if (row) targets.push(row);

        const text4 = comments.querySelector('.text');
        if (text4) targets.push(text4);

        const form = comments.querySelector('form');
        if (form) targets.push(form);

        const pagination = comments.querySelector('.pagination');
        if (pagination) targets.push(pagination);

        // Hide all targets by default
        targets.forEach(el => el.style.display = 'none');

        let visible = false;

        const button = document.createElement('button');
        button.textContent = 'Show Comments';
        button.style.marginBottom = '10px';
        button.style.cursor = 'pointer';

        button.addEventListener('click', () => {
            visible = !visible;
            button.textContent = visible ? 'Hide Comments' : 'Show Comments';
            targets.forEach(el => {
                el.style.display = visible ? '' : 'none';
            });
        });

        // Insert button at the top of .comments
        comments.insertBefore(button, comments.firstChild);
    }

    // Run on load
    addToggleButton2();

    // Observe DOM changes for SPA navigation
    const observer2 = new MutationObserver(addToggleButton2);
    observer2.observe(document.body, { childList: true, subtree: true });


    function appendStylesheet(cssText) {
        const style = document.createElement('style');
        style.textContent = cssText;
        document.head.appendChild(style);
    }

    appendStylesheet(`
/* remove font weight */
.text--bold {
  font-weight: unset
}

/* widen homepage */
.page-home .container-fluid {
    max-width: 80%
}

/* removed footer and permanent news announcement */
.footer, div.row.justify-content-center {
    display:none
}

/* watch page .page-video */
.page-video .container-fluid {
    max-width: 97%;
    display: unset
}

/* remove padding under search bar */
.page-video .content {
    padding-top: 64px !important;
}

/* liked by, more from user, get pushed to end (removes flex-boxes) */
.container-fluid {
    display: unset
}

/* big video player */
@media (min-width: 768px) {
  .page-video .col-md-9 {
    flex: unset;
    max-width: 100%;
  }
}

/* liked by more from user, make as wide as video player (redundant as it is hidden) */
@media (min-width: 768px) {
  .page-video .col-md-3 {
    flex: unset;
    max-width: 100%;
  }
}

@media (min-width: 768px) {
  .page-video .col-md-6 {
    flex: unset;
    max-width: 6%;
    width: 76%;
  }
}

/* more from user , more like this smaller thumbs */
@media (min-width: 300px) and (min-width: 768px) {
  .page-video .moreFromUser__item,.page-video .moreLikeThis__item {
    width: calc(15% - 3.75px);
  }
}

/* remove liked by user */
.page-video__sidebar > div:first-child {
    display: none
}
/* remove Comments header label */
.comments.mt-4.mb-4 > div:first-of-type{
    display: none
}
`);

})();