I just realized there's a drawback with the approach I previously pushed for conditional styling using a hidden attr and buttons to update the attr . Perhaps more accurately, a specific benefit that I didn't realize the script-free option had. Because the approach with buttons uses "attr_*"-named inputs, it becomes a Character Attribute. This has two notable consequences, and one minor consequence: The value is retained after the sheet is closed and re-opened. The value is immediately propagated to all players currently viewing the sheet. The attribute is included in the list of all attributes. For many things, these consequences are exactly what we want. If there is a "Role" attribute that we want to switch between options "Tank", "Damage", and "Healing" with buttons or radios, then we want that retained and propagated as a Character Attribute. For sheet navigation - e.g. a  tab control  - this seems like it may be problematic. If the sheet can be viewed (and therefore edited) by multiple players, then when one player views a different tab, then  it switches to that tab for all players . This is not an issue when using a script-free option because the checkbox or radio input can simply not have a "attr_*" binding. That means the values of those inputs are local on each player's device, and are not retained nor propagated through the Roll20 VTT. The attr+button approach is still my preferred method for even for transient values. The other issues with invisible checkboxes or radios are much more notable, especially given that read-only access to character sheets isn't currently a thing anyway. I created a suggestion for  Transient Attributes  to resolve this drawback.