{"id":29,"date":"2023-07-04T22:43:36","date_gmt":"2023-07-05T02:43:36","guid":{"rendered":"https:\/\/realrockrevival.com\/?page_id=29"},"modified":"2026-08-15T13:30:51","modified_gmt":"2026-08-15T17:30:51","slug":"our-djs","status":"publish","type":"page","link":"https:\/\/realrockrevival.com\/index.php\/our-djs\/","title":{"rendered":"Our DJs"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"29\" class=\"elementor elementor-29\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-75eb370 e-flex e-con-boxed e-con e-parent\" data-id=\"75eb370\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-24d1b85 elementor-widget elementor-widget-html\" data-id=\"24d1b85\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\/* ==========================================================\n   REAL ROCK REVIVAL \u2014 OUR DJS\n   ========================================================== *\/\n\n#rrr-djs-page {\n    width: 100%;\n    box-sizing: border-box;\n    padding: 18px 0 70px;\n    background: #0b0b0b;\n    color: #ffffff;\n}\n\n.rrr-djs-inner {\n    width: calc(100% - 56px);\n    max-width: 1400px;\n    margin: 0 auto;\n}\n\n\/* ==========================================================\n   PAGE HEADER\n   ========================================================== *\/\n\n.rrr-djs-heading {\n    text-align: center;\n    margin-bottom: 42px;\n}\n\n.rrr-djs-kicker {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 14px;\n    margin-bottom: 9px;\n\n    color: #ef2428;\n\n    font-size: 13px;\n    font-weight: 900;\n    letter-spacing: 3px;\n    text-transform: uppercase;\n}\n\n.rrr-djs-kicker::before,\n.rrr-djs-kicker::after {\n    content: \"\";\n    width: 55px;\n    height: 2px;\n\n    background:\n        linear-gradient(\n            90deg,\n            transparent,\n            #ef2428,\n            #ff8a00\n        );\n}\n\n.rrr-djs-kicker::after {\n    background:\n        linear-gradient(\n            90deg,\n            #ff8a00,\n            #ef2428,\n            transparent\n        );\n}\n\n.rrr-djs-title {\n    display: inline-block;\n    margin: 0;\n\n    color: #ffffff;\n\n    font-size: 46px;\n    line-height: 1;\n    font-weight: 900;\n\n    letter-spacing: 1px;\n    text-transform: uppercase;\n}\n\n.rrr-djs-title::after {\n    content: \"\";\n\n    display: block;\n\n    width: 115px;\n    height: 3px;\n\n    margin: 15px auto 0;\n\n    border-radius: 10px;\n\n    background:\n        linear-gradient(\n            90deg,\n            #ef2428 0%,\n            #ff4a00 48%,\n            #ffc20e 100%\n        );\n}\n\n.rrr-djs-intro {\n    max-width: 760px;\n    margin: 24px auto 0;\n\n    color: #aaa;\n\n    font-size: 17px;\n    line-height: 1.55;\n}\n\n\/* ==========================================================\n   DJ GRID\n   ========================================================== *\/\n\n.rrr-djs-grid {\n    display: grid;\n\n    grid-template-columns:\n        repeat(2, minmax(0, 1fr));\n\n    gap: 24px;\n\n    width: 100%;\n}\n\n\/* If there is only one DJ, center the card *\/\n\n.rrr-dj-card:only-child {\n    grid-column: 1 \/ -1;\n    width: calc(50% - 12px);\n    justify-self: center;\n    box-sizing: border-box;\n}\n\n\/* ==========================================================\n   DJ CARD\n   ========================================================== *\/\n\n.rrr-dj-card {\n    display: flex;\n    align-items: flex-start;\n\n    gap: 24px;\n\n    min-width: 0;\n    padding: 24px;\n\n    border-radius: 15px;\n\n    background:\n        linear-gradient(\n            145deg,\n            rgba(255,255,255,.055),\n            rgba(255,255,255,.018)\n        );\n\n    border:\n        1px solid rgba(255,255,255,.08);\n\n    border-left:\n        5px solid #ef2428;\n\n    box-shadow:\n        0 14px 34px rgba(0,0,0,.32);\n\n    transition:\n        transform .18s ease,\n        border-color .18s ease,\n        box-shadow .18s ease;\n}\n\n.rrr-dj-card:hover {\n    transform: translateY(-4px);\n\n    border-color:\n        rgba(239,36,40,.42);\n\n    box-shadow:\n        0 20px 42px rgba(0,0,0,.40),\n        0 0 18px rgba(239,36,40,.08);\n}\n\n\/* ==========================================================\n   DJ PHOTO\n   ========================================================== *\/\n\n.rrr-dj-photo-wrap {\n    width: 175px;\n    height: 175px;\n\n    flex: 0 0 175px;\n\n    padding: 3px;\n\n    box-sizing: border-box;\n\n    border-radius: 13px;\n\n    background:\n        linear-gradient(\n            135deg,\n            #ef2428,\n            #ff7200 55%,\n            #ffc20e\n        );\n}\n\n.rrr-dj-photo {\n    display: block;\n\n    width: 100%;\n    height: 100%;\n\n    object-fit: cover;\n\n    border-radius: 10px;\n\n    background: #080808;\n}\n\n\/* ==========================================================\n   DJ INFO\n   ========================================================== *\/\n\n.rrr-dj-info {\n    flex: 1;\n    min-width: 0;\n}\n\n.rrr-dj-name {\n    margin-bottom: 15px;\n\n    color: #ffffff;\n\n    font-size: 27px;\n    line-height: 1.05;\n\n    font-weight: 900;\n\n    text-transform: uppercase;\n}\n\n\/* ==========================================================\n   SHOW LIST\n   ========================================================== *\/\n\n.rrr-dj-shows {\n    display: flex;\n    flex-direction: column;\n    gap: 13px;\n}\n\n.rrr-dj-show {\n    padding-top: 12px;\n\n    border-top:\n        1px solid rgba(255,255,255,.08);\n}\n\n.rrr-dj-show:first-child {\n    padding-top: 0;\n    border-top: 0;\n}\n\n.rrr-dj-show-name {\n    margin-bottom: 5px;\n\n    color: #ef2428;\n\n    font-size: 14px;\n    font-weight: 900;\n\n    letter-spacing: .8px;\n    text-transform: uppercase;\n}\n\n.rrr-dj-show-time {\n    color: #ffc20e;\n\n    font-size: 14px;\n    font-weight: 800;\n}\n\n.rrr-dj-description {\n    margin-top: 6px;\n\n    color: #999;\n\n    font-size: 13px;\n    line-height: 1.45;\n}\n\n\/* ==========================================================\n   BOTTOM BUTTON\n   ========================================================== *\/\n\n.rrr-djs-bottom {\n    text-align: center;\n    margin-top: 38px;\n}\n\n.rrr-djs-button {\n    display: inline-block;\n\n    padding: 13px 23px;\n\n    border-radius: 7px;\n\n    background: #ef2428;\n\n    color: #ffffff;\n\n    font-size: 13px;\n    font-weight: 900;\n\n    letter-spacing: 1px;\n\n    text-decoration: none;\n    text-transform: uppercase;\n\n    transition:\n        transform .18s ease,\n        background .18s ease;\n}\n\n.rrr-djs-button:hover {\n    background: #ff3138;\n    transform: translateY(-2px);\n}\n\n\/* ==========================================================\n   LOADING\n   ========================================================== *\/\n\n.rrr-djs-loading {\n    grid-column: 1 \/ -1;\n\n    padding: 40px;\n\n    text-align: center;\n\n    color: #777;\n\n    font-size: 13px;\n    font-weight: 800;\n\n    letter-spacing: 1px;\n    text-transform: uppercase;\n}\n\n\/* ==========================================================\n   RESPONSIVE\n   ========================================================== *\/\n\n@media (max-width: 1000px) {\n\n    .rrr-djs-grid {\n        grid-template-columns: 1fr;\n    }\n\n    .rrr-dj-card:only-child {\n        grid-column: auto;\n        width: 100%;\n    }\n}\n\n@media (max-width: 600px) {\n\n    #rrr-djs-page {\n        padding: 18px 0 50px;\n    }\n\n    .rrr-djs-inner {\n        width: calc(100% - 30px);\n    }\n\n    .rrr-djs-title {\n        font-size: 35px;\n    }\n\n    .rrr-djs-intro {\n        font-size: 15px;\n    }\n\n    .rrr-djs-kicker::before,\n    .rrr-djs-kicker::after {\n        width: 30px;\n    }\n\n    .rrr-dj-card {\n        gap: 16px;\n        padding: 18px;\n    }\n\n    .rrr-dj-photo-wrap {\n        width: 110px;\n        height: 110px;\n        flex-basis: 110px;\n    }\n\n    .rrr-dj-name {\n        font-size: 21px;\n    }\n\n    .rrr-dj-show-name,\n    .rrr-dj-show-time {\n        font-size: 12px;\n    }\n}\n<\/style>\n\n\n<section id=\"rrr-djs-page\">\n\n    <div class=\"rrr-djs-inner\">\n\n        <div class=\"rrr-djs-heading\">\n\n            <div class=\"rrr-djs-kicker\">\n                Real Rock Revival\n            <\/div>\n\n            <h1 class=\"rrr-djs-title\">\n                Meet The Voices\n            <\/h1>\n\n            <div class=\"rrr-djs-intro\">\n                The personalities behind Triple R.\n                Real people, real rock, and shows built by people\n                who still believe radio should have a personality.\n            <\/div>\n\n        <\/div>\n\n\n        <div\n            id=\"rrr-djs-grid\"\n            class=\"rrr-djs-grid\"\n        >\n\n            <div class=\"rrr-djs-loading\">\n                Loading the voices of Triple R...\n            <\/div>\n\n        <\/div>\n\n\n        <div class=\"rrr-djs-bottom\">\n\n          <a\n    href=\"\/index.php\/show-times\/\"\n    class=\"rrr-djs-button\"\n>\n    View Full Show Schedule \u2192\n<\/a>\n\n        <\/div>\n\n    <\/div>\n\n<\/section>\n\n\n<script>\n(function () {\n\n    const SHEET_URL =\n        'https:\/\/docs.google.com\/spreadsheets\/d\/e\/2PACX-1vS41T_J8DZ368smfRp__6Qcn25x7AdwouY_YH8lnjJvShPdD3t9uSLL8SFaqcMNHgdYFiFpwzZGgTqo\/pub?output=csv';\n\n    const TRIPLE_R_LOGO =\n        'https:\/\/realrockrevival.com\/wp-content\/uploads\/2026\/08\/c8eb6030-cd3f-4b78-ac61-8a1c9b2f6da7.png';\n\n    const grid =\n        document.getElementById(\n            'rrr-djs-grid'\n        );\n\n    if (!grid) return;\n\n\n    function parseCSV(text) {\n\n        const rows = [];\n\n        let row = [];\n        let field = '';\n        let quoted = false;\n\n        for (let i = 0; i < text.length; i++) {\n\n            const char = text[i];\n\n            if (char === '\"') {\n\n                if (\n                    quoted &&\n                    text[i + 1] === '\"'\n                ) {\n\n                    field += '\"';\n                    i++;\n\n                } else {\n\n                    quoted = !quoted;\n\n                }\n\n            }\n\n            else if (\n                char === ',' &&\n                !quoted\n            ) {\n\n                row.push(field);\n                field = '';\n\n            }\n\n            else if (\n                (\n                    char === '\\n' ||\n                    char === '\\r'\n                ) &&\n                !quoted\n            ) {\n\n                if (\n                    char === '\\r' &&\n                    text[i + 1] === '\\n'\n                ) {\n                    i++;\n                }\n\n                row.push(field);\n                rows.push(row);\n\n                row = [];\n                field = '';\n\n            }\n\n            else {\n\n                field += char;\n\n            }\n        }\n\n        if (\n            field.length ||\n            row.length\n        ) {\n\n            row.push(field);\n            rows.push(row);\n\n        }\n\n        return rows;\n    }\n\n\n    function createDJCard(dj) {\n\n        const card =\n            document.createElement(\n                'article'\n            );\n\n        card.className =\n            'rrr-dj-card';\n\n\n        \/* PHOTO *\/\n\n        const photoWrap =\n            document.createElement(\n                'div'\n            );\n\n        photoWrap.className =\n            'rrr-dj-photo-wrap';\n\n\n        const photo =\n            document.createElement(\n                'img'\n            );\n\n        photo.className =\n            'rrr-dj-photo';\n\n        photo.src =\n            dj.image ||\n            TRIPLE_R_LOGO;\n\n        photo.alt =\n            dj.name;\n\n\n        photoWrap.appendChild(\n            photo\n        );\n\n\n        \/* INFO *\/\n\n        const info =\n            document.createElement(\n                'div'\n            );\n\n        info.className =\n            'rrr-dj-info';\n\n\n        const name =\n            document.createElement(\n                'div'\n            );\n\n        name.className =\n            'rrr-dj-name';\n\n        name.textContent =\n            dj.name;\n\n\n        info.appendChild(\n            name\n        );\n\n\n        \/* SHOWS *\/\n\n        const shows =\n            document.createElement(\n                'div'\n            );\n\n        shows.className =\n            'rrr-dj-shows';\n\n\n        dj.shows.forEach(\n            function(show) {\n\n                const showBox =\n                    document.createElement(\n                        'div'\n                    );\n\n                showBox.className =\n                    'rrr-dj-show';\n\n\n                const showName =\n                    document.createElement(\n                        'div'\n                    );\n\n                showName.className =\n                    'rrr-dj-show-name';\n\n                showName.textContent =\n                    show.name;\n\n\n                const showTime =\n                    document.createElement(\n                        'div'\n                    );\n\n                showTime.className =\n                    'rrr-dj-show-time';\n\n                showTime.textContent =\n                    show.day +\n                    ' \u2022 ' +\n                    show.start +\n                    ' \u2013 ' +\n                    show.end +\n                    ' ET';\n\n\n                showBox.appendChild(\n                    showName\n                );\n\n                showBox.appendChild(\n                    showTime\n                );\n\n\n                if (show.description) {\n\n                    const description =\n                        document.createElement(\n                            'div'\n                        );\n\n                    description.className =\n                        'rrr-dj-description';\n\n                    description.textContent =\n                        show.description;\n\n                    showBox.appendChild(\n                        description\n                    );\n                }\n\n\n                shows.appendChild(\n                    showBox\n                );\n\n            }\n        );\n\n\n        info.appendChild(\n            shows\n        );\n\n\n        card.appendChild(\n            photoWrap\n        );\n\n        card.appendChild(\n            info\n        );\n\n\n        return card;\n    }\n\n\n    function processSchedule(rows) {\n\n        if (!rows.length) return;\n\n        rows.shift();\n\n\n        const DJs =\n            new Map();\n\n\n        rows.forEach(\n            function(row) {\n\n                \/*\n                 * SHEET\n                 *\n                 * A = Day\n                 * B = Start\n                 * C = End\n                 * D = Show\n                 * E = DJ\n                 * F = Show Image\n                 * G = DJ Image\n                 * H = Description\n                 * I = Active\n                 *\/\n\n                if (\n                    row.length < 9\n                ) {\n                    return;\n                }\n\n\n                const day =\n                    (row[0] || '')\n                        .trim();\n\n                const start =\n                    (row[1] || '')\n                        .trim();\n\n                const end =\n                    (row[2] || '')\n                        .trim();\n\n                const show =\n                    (row[3] || '')\n                        .trim();\n\n                const djName =\n                    (row[4] || '')\n                        .trim();\n\n                const djImage =\n                    (row[6] || '')\n                        .trim();\n\n                const description =\n                    (row[7] || '')\n                        .trim();\n\n                const active =\n                    (row[8] || '')\n                        .trim()\n                        .toLowerCase();\n\n\n                if (\n                    active !== 'yes' ||\n                    !djName\n                ) {\n                    return;\n                }\n\n\n                if (\n                    !DJs.has(djName)\n                ) {\n\n                    DJs.set(\n                        djName,\n                        {\n                            name: djName,\n                            image: djImage,\n                            shows: []\n                        }\n                    );\n\n                }\n\n\n                const dj =\n                    DJs.get(\n                        djName\n                    );\n\n\n                if (\n                    !dj.image &&\n                    djImage\n                ) {\n\n                    dj.image =\n                        djImage;\n                }\n\n\n                dj.shows.push(\n                    {\n                        name: show,\n                        day: day,\n                        start: start,\n                        end: end,\n                        description: description\n                    }\n                );\n\n            }\n        );\n\n\n        grid.innerHTML = '';\n\n\n        const list =\n            Array.from(\n                DJs.values()\n            );\n\n\n        if (!list.length) {\n\n            grid.innerHTML =\n                '<div class=\"rrr-djs-loading\">' +\n                'More voices are coming to Triple R.' +\n                '<\/div>';\n\n            return;\n        }\n\n\n        list.forEach(\n            function(dj) {\n\n                grid.appendChild(\n                    createDJCard(\n                        dj\n                    )\n                );\n\n            }\n        );\n    }\n\n\n    fetch(\n        SHEET_URL +\n        '&cache=' +\n        Date.now()\n    )\n\n    .then(\n        response =>\n            response.text()\n    )\n\n    .then(\n        text =>\n            processSchedule(\n                parseCSV(text)\n            )\n    )\n\n    .catch(\n        function () {\n\n            grid.innerHTML =\n                '<div class=\"rrr-djs-loading\">' +\n                'Unable to load the Triple R DJ lineup.' +\n                '<\/div>';\n\n        }\n    );\n\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Real Rock Revival Meet The Voices The personalities behind Triple R. Real people, real rock, and shows built by people who still believe radio should have a personality. Loading the voices of Triple R&#8230; View Full Show Schedule \u2192<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-29","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/pages\/29","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/comments?post=29"}],"version-history":[{"count":13,"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/pages\/29\/revisions"}],"predecessor-version":[{"id":364,"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/pages\/29\/revisions\/364"}],"wp:attachment":[{"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/media?parent=29"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}