There are plenty of examples in the wiki of showing and hiding areas. You generally want a hidden input immediately before the thing you want to show or hide (there are other ways to do it, but this is simple). The general sibling selector ~ doesn't require the input to be immediately before the element you're selecting with CSS, but it's generally easier to understand the HTML when you group them. Just don't put it after the element you're trying to select, or it won't work. Without JS might look like this (it could be a lot of CSS depending on how high Vitality can go): // HTML <input class="checkbox_1_toggle" type="hidden" name="attr_vitality"/> <div class="checkbox_1"> {/* checkbox html */} </div> // CSS .checkbox_1 { display:none; } .checkbox_1_toggle[value=-4] ~ .checkbox_1, .checkbox_1_toggle[value=-3] ~ .checkbox_1, .checkbox_1_toggle[value=-2] ~ .checkbox_1, .checkbox_1_toggle[value=-1] ~ .checkbox_1, .checkbox_1_toggle[value=0] ~ .checkbox_1, .checkbox_1_toggle[value=1] ~ .checkbox_1, ...all other possible values .checkbox_1_toggle[value=20] ~ .checkbox_1 { display: block } With sheetworker (preferred method): // HTML <input class="checkbox_1_toggle" type="hidden" name="attr_checkbox_1_toggle"/> <div class="checkbox_1"> {/* checkbox html */} </div> // JS on('change:vitality', (ev) => { const vitality = parseInt(ev.newValue); if (newValue > -4) setAttrs({ checkbox_1_toggle: 1 }); else setAttrs({ checkbox_1_toggle: 0 }); } // CSS .checkbox_1 { display:none; } .checkbox_1_toggle[value=1] ~ .checkbox_1 { display: block } The second method, using a sheetworker to set a separate toggle attribute, is much cleaner. The first method, keying the CSS straight off the stat, is fine if you've only got a few values the stat can take, but horrible when there are many possible values. You may also want a 'sheet:opened' sheetworker to make sure the initial value has the correct checkboxes visible.