Style Customizer Prototype


by Jeremy Caudle
code

A while back I saw Jason Pamental show off a style customizer or accessibility panel during one of his presentations. I really liked the idea and today I gave it shot. It's not nearly complete or in its ideal form, but I'm glad I was able to get it working to some extent.

This is a header

This is a paragraph of text containing some words that I need to make it look like this paragraph has content. I can't fill this in with Lorem Ipsum at the moment because my computer is not connected to the internet.

Best Pringles Available in Japan

  1. Karaage
  2. Fish and Chips
  3. Thai Chili

View the code:

HTML and JS
<section class="code-block">

            <h1>This is a header</h1>
            <p>This is a paragraph of text containing some words that I need to make it look like this paragraph has content. I can't fill this in with Lorem Ipsum at the moment because my computer is not connected to the internet.</p>
            <h2>Best Pringles Available in Japan</h2>
            <ol>
                <li>Karaage</li>
                <li>Fish and Chips</li>
                <li>Thai Chili</li>
            </ol>
            
            <aside class="style-customizer">
                <h5>Customize the look of this page:</h5>
                <h6>Text Size:</h6>
                <div>
                    <ul class="text-size-scale-labels">
                        <li><label for="radioTextSizeSmallest" title="Smallest">aA</label></li><li><label for="radioTextSizeSmaller" title="Smaller">aA</label></li><li><label for="radioTextSizeDefault" title="Default">aA</label></li><li><label for="radioTextSizeLarger" title="Larger">aA</label></li><li><label for="radioTextSizeLargest" title="Largest">aA</label></li>
                    </ul>
                    <ul class="text-size-scale">
                        <li><input type="radio" name="textSizes" id="radioTextSizeSmallest" title="Smallest"></li><li><input type="radio" name="textSizes" id="radioTextSizeSmaller" title="Smaller"></li><li><input type="radio" name="textSizes" id="radioTextSizeDefault" title="Default"></li><li><input type="radio" name="textSizes" id="radioTextSizeLarger" title="Larger"></li><li><input type="radio" name="textSizes" id="radioTextSizeLargest" title="Largest"></li>
                    </ul>
                </div>
                <h6>Color Mode:</h6>
                <input type="radio" name="radioColorMode" value="light" id="radioLightMode"><label for="radioLightMode">Light</label>
                <input type="radio" name="radioColorMode" id="radioDarkMode"><label for="radioDarkMode">Dark</label>

            </aside>
        </section>
				<script>

            // Define variables
            const rdoTextSmallest = document.querySelector('#radioTextSizeSmallest');
            const rdoTextSmaller = document.querySelector('#radioTextSizeSmaller');
            const rdoTextDefault = document.querySelector('#radioTextSizeDefault');
            const rdoTextLarger = document.querySelector('#radioTextSizeLarger');
            const rdoTextLargest = document.querySelector('#radioTextSizeLargest');

            const rdoLightMode = document.querySelector('#radioLightMode');
            const rdoDarkMode = document.querySelector('#radioDarkMode');

            let root = document.documentElement; //Thanks Chris Coyier! - https://css-tricks.com/updating-a-css-variable-with-javascript/ 

            // Functions



            // Events

            rdoTextSmallest.addEventListener('click', () => {
                console.log('Text set to smallest size.');
                root.style.setProperty('--base-text-size', '12pt');
            });
            rdoTextSmaller.addEventListener('click', () => {
                console.log('Text set to smaller size.');
                root.style.setProperty('--base-text-size', '14pt');
            });
            rdoTextDefault.addEventListener('click', () => {
                console.log('Text set to default size.');
                root.style.setProperty('--base-text-size', '16pt');
            });
            rdoTextLarger.addEventListener('click', () => {
                console.log('Text set to larger size.');
                root.style.setProperty('--base-text-size', '18pt');
            });
            rdoTextLargest.addEventListener('click', () => {
                console.log('Text set to largest size.');
                root.style.setProperty('--base-text-size', '20pt');
            });

            rdoLightMode.addEventListener('click', () => {
                console.log('Switched to Light Mode');
                root.style.setProperty('--bg-color', 'rgba(0,0,0,0.1)');
                root.style.setProperty('--text-color', '#222');
                root.style.setProperty('--accent-color', 'rgb(201, 64, 0)');
            });

            rdoDarkMode.addEventListener('click', () => {
                console.log('Switched to Dark Mode');
                root.style.setProperty('--bg-color', 'rgba(0,0,0,0.9)');
                root.style.setProperty('--text-color', '#dedede');
                root.style.setProperty('--accent-color', 'rgb(120, 217, 100)');
            });

        </script>
CSS
/* Variables */
            :root {
                --base-text-size: 16pt;
                --bg-color: rgba(0,0,0,0.1);
                --text-color: #222;
                --accent-color: rgb(201, 64, 0);
            }
            
            section.code-block {
                width: clamp(16em, 90vw, 60em);
                margin: 3rem auto;
                background-color: var(--bg-color, rgba(0,0,0,0.1));
                padding: 1rem;
                color: var(--text-color, #222);
                font-size: var(--base-text-size, 18pt);
            }

            section.code-block ol {
                color: var(--accent-color, rgb(255,217,0));
            }

            section.code-block * {
                font-size: inherit;
            }

            aside.style-customizer {
                padding: 1rem;
                border: solid 1px rgb(250, 250, 250);
                background-color: white;
                margin: auto;
                max-width: 14em;
                border: double #afafaf 3px;
                color: black;
            }

            aside.style-customizer input[type=radio]:hover {
                background-color: blue;
            }

            
            aside.style-customizer h5 {
                font-size: 1rem;
                margin: 0 0 1rem 0;
            } 

            aside.style-customizer h6 {
                font-size: 1rem;
                margin: 1rem 0 1rem 0;
            }

            /* Text Size Scale */

            .text-size-scale, .text-size-scale-labels {
                margin: 0;
                padding: 0;
                list-style-type: none;
            }

            .text-size-scale-labels li {
                display: inline-block;
                margin: 0;
                padding: 0;
                text-align: center;
                width: 20%;
                vertical-align: bottom;
            }

            .text-size-scale-labels li {
                display: inline-block;
                margin: 0;
                padding: 0;
                text-align: center;
                width: 20%;
                vertical-align: bottom;
            }

            .text-size-scale-labels li label {
                display: inline;
            }

            .text-size-scale li {
                display: inline-block;
                margin: 0;
                padding: 0;
                text-align: center;
                width: 20%;
                vertical-align: bottom;
            }

            .text-size-scale-labels li:first-of-type  {font-size: .75rem;}
            .text-size-scale-labels li:nth-of-type(2) {font-size: .9rem;}
            .text-size-scale-labels li:nth-of-type(3) {font-size: 1rem;}
            .text-size-scale-labels li:nth-of-type(4) {font-size: 1.25rem;}           
            .text-size-scale-labels li:last-of-type {font-size: 1.5rem;}